[MPlayer-dev-eng] [PATCH] Fix V4L2 buffer operations and tunerhandling

Nico Sabbi nsabbi at email.it
Wed Dec 6 12:04:25 CET 2006


Laurent Pinchart wrote:

>Hi Benjamin,
>
>  
>
>>>this patch fixes problems with video acquisition through the V4L2 API.
>>>Two separate issues are addressed, which prevented MPlayer from working
>>>with UVC
>>>(USB Video Class) devices.
>>>
>>>- Many V4L2 devices (mostly webcams) have no tuner. For those devices the
>>>concept of norm just doesn't apply. VIDIOC_G_STD should not be called for
>>>those tuner-less devices.
>>>
>>>- The buffer management (using VIDIOC_QBUF, VIDIOC_DQBUF and
>>>VIDIOC_REQBUFS)
>>>code doesn't set the buffer memory type to V4L2_MEMORY_MMAP. While many
>>>drivers fails to check the parameter, it is nonetheless mandatory to set
>>>it
>>>to the correct value.
>>>      
>>>
>>The patch looks good to me but please resend without the cosmetic changes.
>>All of the patch isn't needed.
>>    
>>
>
>Cosmetic changes have been removed, as well as the VIDIOC_G_STD changes. I'm 
>working on a better fix for the last one (division by zero when VIDIOC_G_STD 
>fails come to mind).
>
>Please apply the buffer management patch. The VIDIOC_G_STD issue only affects 
>mencoder, so this patch is useful on its own for mplayer.
>
>Laurent Pinchart
>  
>
>------------------------------------------------------------------------
>
>--- stream/tvi_v4l2.c	2006-12-06 10:12:01.000000000 +0100
>+++ stream/tvi_v4l2.c	2006-12-06 10:13:30.000000000 +0100
>@@ -875,7 +875,8 @@
> 
> 	/* unqueue all remaining buffers */
> 	memset(&buf,0,sizeof(buf));
>-	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>+	buf.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>  
>
cosmetics

>+	buf.memory = V4L2_MEMORY_MMAP;
> 	while (!ioctl(priv->video_fd, VIDIOC_DQBUF, &buf));
>     }
> 
>@@ -1250,7 +1251,7 @@
> 	request.count = BUFFER_COUNT;
>     }
>     
>-    request.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>+    request.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>  
>
cosmetics

>     request.memory = V4L2_MEMORY_MMAP;
>     if (ioctl(priv->video_fd, VIDIOC_REQBUFS, &request) < 0) {
> 	mp_msg(MSGT_TV, MSGL_ERR, "%s: ioctl request buffers failed: %s\n",
>@@ -1290,6 +1291,7 @@
> 	/* count up to make sure this is correct everytime */
> 	priv->mapcount++;
> 
>+	priv->map[i].buf.memory = V4L2_MEMORY_MMAP;
> 	if (ioctl(priv->video_fd, VIDIOC_QBUF, &(priv->map[i].buf)) < 0) {
> 	    mp_msg(MSGT_TV, MSGL_ERR, "%s: ioctl queue buffer failed: %s\n",
> 		   info.short_name, strerror(errno));
>@@ -1394,7 +1396,8 @@
> 	}
> 
> 	memset(&buf,0,sizeof(buf));
>-	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>+	buf.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>  
>
cosmetics




More information about the MPlayer-dev-eng mailing list