File xawtv-3.95-fixes.patch of Package xawtv
diff -Nrbu xawtv-3.95/libng/plugins/drv0-v4l2.c xawtv-3.95-OK/libng/plugins/drv0-v4l2.c
--- xawtv-3.95/libng/plugins/drv0-v4l2.c 2005-02-11 20:56:24.000000000 +0300
+++ xawtv-3.95-OK/libng/plugins/drv0-v4l2.c 2008-08-26 19:27:18.000000000 +0400
@@ -91,6 +91,7 @@
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;
@@ -768,6 +769,7 @@
/* 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 @@
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 @@
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 @@
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;