On Wednesday 18 July 2007 16:42:08 Dieter Tschanz wrote:
> Hi!
>
> I am running YUV together with VBI for more than one hour without any
> problem. I let it run for an additonal hour.
>
> The YUV with PCM combination is my ordinary watching TV
> configuration, which is used quite often and for several hours. This
> one never froze.
>
> I assume that having a simple main that opens the device and keeps
> reading from it should be able to reproduce it in other environments.
> Together with the capture application provided in zvbi/test.

Fixed! It's a driver bug. The VBI DMA is handled in a special way and is 
marked with a bit. However, that bit was set at the wrong time and 
could be cleared by mistake if a PCM DMA request would arrive before 
the VBI DMA was completed.

This bug is not specific to PCM, but the different timing of YUV+VBI or 
MPG+VBI probably prevents this bug from occuring.

Still, it is a rather serious bug and it warrants a ivtv-0.10.5 release. 
I'll see if I can get it queued for a 2.6.22 dot release as well.

Please report back if this solved your problem completely.

Thanks,

       Hans
diff -r ce6e2e8c859f linux/drivers/media/video/ivtv/ivtv-irq.c
--- a/linux/drivers/media/video/ivtv/ivtv-irq.c	Tue Jul 17 18:50:46 2007 +0200
+++ b/linux/drivers/media/video/ivtv/ivtv-irq.c	Wed Jul 18 18:02:56 2007 +0200
@@ -409,6 +409,11 @@ static void ivtv_dma_enc_start(struct iv
 	/* Mark last buffer size for Interrupt flag */
 	s->SGarray[s->SG_length - 1].size |= cpu_to_le32(0x80000000);
 
+	if (s->type == IVTV_ENC_STREAM_TYPE_VBI)
+		set_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
+	else
+		clear_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
+
 	if (ivtv_use_pio(s)) {
 		for (i = 0; i < s->SG_length; i++) {
 			s->PIOarray[i].src = le32_to_cpu(s->SGarray[i].src);
@@ -603,7 +608,6 @@ static void ivtv_irq_enc_start_cap(struc
 				data[0], data[1], data[2]);
 		return;
 	}
-	clear_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
 	s = &itv->streams[ivtv_stream_map[data[0]]];
 	if (!stream_enc_dma_append(s, data)) {
 		set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
@@ -640,7 +644,6 @@ static void ivtv_irq_enc_vbi_cap(struct 
 	   then start a DMA request for just the VBI data. */
 	if (!stream_enc_dma_append(s, data) &&
 			!test_bit(IVTV_F_S_STREAMING, &s_mpg->s_flags)) {
-		set_bit(IVTV_F_I_ENC_VBI, &itv->i_flags);
 		set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
 	}
 }
_______________________________________________
ivtv-users mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-users

Reply via email to