mirror of https://gitee.com/openkylin/linux.git
V4L/DVB (6272): V4L: properly fix support for capturing interlaced video in saa7134
By "capturing interlaced video" I mean that card ensures that top field is really top and vice versa (I think it takes the filed ID from signal) Properly turn on/off that support depending on signal state Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
cb71201f20
commit
11f7078c10
|
@ -594,8 +594,10 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
|
|||
print_irqstatus(dev,loop,report,status);
|
||||
|
||||
|
||||
if (report & SAA7134_IRQ_REPORT_RDCAP /* _INTL */)
|
||||
saa7134_irq_video_intl(dev);
|
||||
if ((report & SAA7134_IRQ_REPORT_RDCAP) ||
|
||||
(report & SAA7134_IRQ_REPORT_INTL))
|
||||
saa7134_irq_video_signalchange(dev);
|
||||
|
||||
|
||||
if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
|
||||
(status & 0x60) == 0)
|
||||
|
@ -1081,7 +1083,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
|
|||
mutex_unlock(&devlist_lock);
|
||||
|
||||
/* check for signal */
|
||||
saa7134_irq_video_intl(dev);
|
||||
saa7134_irq_video_signalchange(dev);
|
||||
|
||||
if (saa7134_dmasound_init && !dev->dmasound.priv_data) {
|
||||
saa7134_dmasound_init(dev);
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
static unsigned int video_debug = 0;
|
||||
static unsigned int gbuffers = 8;
|
||||
static unsigned int noninterlaced = 1;
|
||||
static unsigned int noninterlaced = 0;
|
||||
static unsigned int gbufsize = 720*576*4;
|
||||
static unsigned int gbufsize_max = 720*576*4;
|
||||
static char secam[] = "--";
|
||||
|
@ -2454,7 +2454,7 @@ int saa7134_video_init2(struct saa7134_dev *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void saa7134_irq_video_intl(struct saa7134_dev *dev)
|
||||
void saa7134_irq_video_signalchange(struct saa7134_dev *dev)
|
||||
{
|
||||
static const char *st[] = {
|
||||
"(no signal)", "NTSC", "PAL", "SECAM" };
|
||||
|
@ -2466,24 +2466,28 @@ void saa7134_irq_video_intl(struct saa7134_dev *dev)
|
|||
(st1 & 0x40) ? "not locked" : "locked",
|
||||
(st2 & 0x40) ? "no" : "yes",
|
||||
st[st1 & 0x03]);
|
||||
dev->nosignal = (st1 & 0x40) || (st2 & 0x40);
|
||||
dev->nosignal = (st1 & 0x40) || (st2 & 0x40) || !(st2 & 0x1);
|
||||
|
||||
if (dev->nosignal) {
|
||||
/* no video signal -> mute audio */
|
||||
if (dev->ctl_automute)
|
||||
dev->automute = 1;
|
||||
saa7134_tvaudio_setmute(dev);
|
||||
saa_setb(SAA7134_SYNC_CTRL, 0x20);
|
||||
} else {
|
||||
/* wake up tvaudio audio carrier scan thread */
|
||||
saa7134_tvaudio_do_scan(dev);
|
||||
if (!noninterlaced)
|
||||
saa_clearb(SAA7134_SYNC_CTRL, 0x20);
|
||||
}
|
||||
|
||||
if ((st2 & 0x80) && !noninterlaced && !dev->nosignal)
|
||||
saa_clearb(SAA7134_SYNC_CTRL, 0x20);
|
||||
else
|
||||
saa_setb(SAA7134_SYNC_CTRL, 0x20);
|
||||
|
||||
if (dev->mops && dev->mops->signal_change)
|
||||
dev->mops->signal_change(dev);
|
||||
}
|
||||
|
||||
|
||||
void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status)
|
||||
{
|
||||
enum v4l2_field field;
|
||||
|
|
|
@ -639,7 +639,7 @@ int saa7134_common_ioctl(struct saa7134_dev *dev,
|
|||
|
||||
int saa7134_video_init1(struct saa7134_dev *dev);
|
||||
int saa7134_video_init2(struct saa7134_dev *dev);
|
||||
void saa7134_irq_video_intl(struct saa7134_dev *dev);
|
||||
void saa7134_irq_video_signalchange(struct saa7134_dev *dev);
|
||||
void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status);
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue