Hi,

First of all, thank you for providing such great Linux support for webcams.  I 
have encountered an issue in this area that I hope you experts can help with.

I am using UVC/V4L on an embedded system, and I am experiencing a problem with 
corrupted camera images.  The system consists of a custom ASIC with an 
ARM926EJ-S and OHCI USB host controller connected to a UVC camera which 
supports only MJPEG.

The problem I have is that buffers dequeued in user space occasionally contain 
corrupted JPEGs.  This corruption ranges from slight, with a row of macroblocks 
shifted, to severe, with the JPEG being totally undecompressible.

If I enable UVC_TRACE_FRAME, I see several instances of:
"uvcvideo: USB isochronous frame lost (-70)."
in dmesg.  I have noticed a correlation between the presence of this message 
and visual corruption in captured JPEGs.

I see that this error code corresponds to -ECOMM, which in turn corresponds to 
TD_BUFFEROVERRUN in the isochronous packet status.  I assume that this is 
caused by CPU starvation, which should just manifest as dropped frames.

However, I think these overrun frames are not being dropped, and instead are 
being passed to user space in an indeterminate state, leading to the visual 
corruption that I've witnessed.

The attached patch (against 2.6.31) is my naïve attempt at fixing the problem.  
It does appear to resolve the corruption, but I am not entirely sure it's the 
correct thing to do.  Does it look reasonable?  I would appreciate any feedback.

Thank you,
Filter


      
diff -ur linux-2.6/drivers/media/video/uvc/uvc_video.c linux-patch/drivers/media/video/uvc/uvc_video.c
--- linux-2.6/drivers/media/video/uvc/uvc_video.c	2010-06-08 14:05:19.000000000 -0700
+++ linux-patch/drivers/media/video/uvc/uvc_video.c	2010-06-08 14:05:06.000000000 -0700
@@ -536,6 +536,11 @@
 		if (urb->iso_frame_desc[i].status < 0) {
 			uvc_trace(UVC_TRACE_FRAME, "USB isochronous frame "
 				"lost (%d).\n", urb->iso_frame_desc[i].status);
+			if (buf) {
+				buf->state = UVC_BUF_STATE_QUEUED;
+				buf->buf.bytesused = 0;
+				i = urb->number_of_packets;
+			}
 			continue;
 		}
_______________________________________________
Linux-uvc-devel mailing list
Linux-uvc-devel@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/linux-uvc-devel

Reply via email to