V4L/DVB (6049): ivtv: fix VBI reinsertion decoding
- Invalid VBI packets should result in an empty VBI frame, not in an zero-sized frame that causes the reader to incorrectly return a 0 (EOF) value. - PIO completion should not reset the sg_pending_size field. - The DMA offset detection code should be ignored for PIO transfers: it somehow messes up the data on the card and is not needed anyway for PIO. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
de870b52be
commit
51a99c0428
|
@ -165,7 +165,7 @@ static int stream_enc_dma_append(struct ivtv_stream *s, u32 data[CX2341X_MBOX_MA
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if this is the start of the DMA then fill in the magic cookie */
|
/* if this is the start of the DMA then fill in the magic cookie */
|
||||||
if (s->sg_pending_size == 0) {
|
if (s->sg_pending_size == 0 && ivtv_use_dma(s)) {
|
||||||
if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
|
if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
|
||||||
s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
|
s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
|
||||||
s->pending_backup = read_dec(offset - IVTV_DECODER_OFFSET);
|
s->pending_backup = read_dec(offset - IVTV_DECODER_OFFSET);
|
||||||
|
@ -252,7 +252,7 @@ static void dma_post(struct ivtv_stream *s)
|
||||||
/* Sync Buffer */
|
/* Sync Buffer */
|
||||||
ivtv_buf_sync_for_cpu(s, buf);
|
ivtv_buf_sync_for_cpu(s, buf);
|
||||||
|
|
||||||
if (x == 0) {
|
if (x == 0 && ivtv_use_dma(s)) {
|
||||||
offset = s->dma_last_offset;
|
offset = s->dma_last_offset;
|
||||||
if (u32buf[offset / 4] != DMA_MAGIC_COOKIE)
|
if (u32buf[offset / 4] != DMA_MAGIC_COOKIE)
|
||||||
{
|
{
|
||||||
|
@ -591,7 +591,6 @@ static void ivtv_irq_enc_pio_complete(struct ivtv *itv)
|
||||||
}
|
}
|
||||||
s = &itv->streams[itv->cur_pio_stream];
|
s = &itv->streams[itv->cur_pio_stream];
|
||||||
IVTV_DEBUG_HI_IRQ("ENC PIO COMPLETE %s\n", s->name);
|
IVTV_DEBUG_HI_IRQ("ENC PIO COMPLETE %s\n", s->name);
|
||||||
s->sg_pending_size = 0;
|
|
||||||
clear_bit(IVTV_F_I_PIO, &itv->i_flags);
|
clear_bit(IVTV_F_I_PIO, &itv->i_flags);
|
||||||
itv->cur_pio_stream = -1;
|
itv->cur_pio_stream = -1;
|
||||||
dma_post(s);
|
dma_post(s);
|
||||||
|
|
|
@ -163,8 +163,8 @@ static int ivtv_convert_ivtv_vbi(struct ivtv *itv, u8 *p)
|
||||||
linemask[1] = 0xf;
|
linemask[1] = 0xf;
|
||||||
p += 4;
|
p += 4;
|
||||||
} else {
|
} else {
|
||||||
/* unknown VBI data stream */
|
/* unknown VBI data, convert to empty VBI frame */
|
||||||
return 0;
|
linemask[0] = linemask[1] = 0;
|
||||||
}
|
}
|
||||||
for (i = 0; i < 36; i++) {
|
for (i = 0; i < 36; i++) {
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
Loading…
Reference in New Issue