This is an automatic generated email to let you know that the following patch 
were queued at the 
http://git.linuxtv.org/xawtv3.git tree:

Subject: Some V4L2 protocol fixes
Author:  Mauro Carvalho Chehab <[email protected]>
Date:    Fri Jan 28 00:52:04 2011 -0200

This patch backports some V4L2 protocol fixes found on Fedora tree.

Signed-off-by: Mauro Carvalho Chehab <[email protected]>

 libng/plugins/drv0-v4l2.c |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)

---

http://git.linuxtv.org/xawtv3.git?a=commitdiff;h=533042cf04f7cb65befec4b45f4c6a49e0d9de17

diff --git a/libng/plugins/drv0-v4l2.c b/libng/plugins/drv0-v4l2.c
index 29ef804..cf71713 100644
--- a/libng/plugins/drv0-v4l2.c
+++ b/libng/plugins/drv0-v4l2.c
@@ -91,6 +91,7 @@ struct v4l2_handle {
     struct ng_video_fmt            fmt_me;
     struct v4l2_requestbuffers     reqbufs;
     struct v4l2_buffer             buf_v4l2[WANTED_BUFFERS];
+    int                            buf_v4l2_size[WANTED_BUFFERS];
     struct ng_video_buf            buf_me[WANTED_BUFFERS];
     unsigned int                   queue,waiton;
 
@@ -166,7 +167,7 @@ xioctl(int fd, int cmd, void *arg, int mayfail)
     int rc;
 
     rc = ioctl(fd,cmd,arg);
-    if (0 == rc && ng_debug < 2)
+    if (rc >= 0 && ng_debug < 2)
        return rc;
     if (mayfail && errno == mayfail && ng_debug < 2)
        return rc;
@@ -768,6 +769,7 @@ v4l2_waiton(struct v4l2_handle *h)
     /* get it */
     memset(&buf,0,sizeof(buf));
     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+    buf.memory = V4L2_MEMORY_MMAP;
     if (-1 == xioctl(h->fd,VIDIOC_DQBUF,&buf, 0))
        return -1;
     h->waiton++;
@@ -812,6 +814,7 @@ v4l2_start_streaming(struct v4l2_handle *h, int buffers)
        h->buf_v4l2[i].memory = V4L2_MEMORY_MMAP;
        if (-1 == xioctl(h->fd, VIDIOC_QUERYBUF, &h->buf_v4l2[i], 0))
            return -1;
+       h->buf_v4l2_size[i] = h->buf_v4l2[i].length;
        h->buf_me[i].fmt  = h->fmt_me;
        h->buf_me[i].size = h->buf_me[i].fmt.bytesperline *
            h->buf_me[i].fmt.height;
@@ -865,12 +868,16 @@ v4l2_stop_streaming(struct v4l2_handle *h)
            ng_waiton_video_buf(&h->buf_me[i]);
        if (ng_debug)
            print_bufinfo(&h->buf_v4l2[i]);
-       if (-1 == munmap(h->buf_me[i].data,h->buf_me[i].size))
+       if (-1 == munmap(h->buf_me[i].data, h->buf_v4l2_size[i]))
            perror("munmap");
     }
     h->queue = 0;
     h->waiton = 0;
 
+    /* unrequest buffers (only needed for some drivers) */
+    h->reqbufs.count = 0;
+    xioctl(h->fd, VIDIOC_REQBUFS, &h->reqbufs, EINVAL); 
+
     /* turn on preview (if needed) */
     if (h->ov_on != h->ov_enabled) {
        h->ov_on = h->ov_enabled;
@@ -907,6 +914,17 @@ v4l2_setformat(void *handle, struct ng_video_fmt *fmt)
     fmt->width        = h->fmt_v4l2.fmt.pix.width;
     fmt->height       = h->fmt_v4l2.fmt.pix.height;
     fmt->bytesperline = h->fmt_v4l2.fmt.pix.bytesperline;
+    /* struct v4l2_format.fmt.pix.bytesperline is bytesperline for the
+       main plane for planar formats, where as we want it to be the total 
+       bytesperline for all planes */
+    switch (fmt->fmtid) {
+        case VIDEO_YUV422P:
+          fmt->bytesperline *= 2;
+          break;
+        case VIDEO_YUV420P:
+          fmt->bytesperline = fmt->bytesperline * 3 / 2;
+          break;
+    }
     if (0 == fmt->bytesperline)
        fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8;
     h->fmt_me = *fmt;

_______________________________________________
linuxtv-commits mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to