diff options
Diffstat (limited to 'extra/xawtv/xawtv-3.95-fixes.patch')
-rw-r--r-- | extra/xawtv/xawtv-3.95-fixes.patch | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/extra/xawtv/xawtv-3.95-fixes.patch b/extra/xawtv/xawtv-3.95-fixes.patch new file mode 100644 index 000000000..b6cdf8dec --- /dev/null +++ b/extra/xawtv/xawtv-3.95-fixes.patch @@ -0,0 +1,72 @@ +diff -up xawtv-3.95.new/libng/plugins/drv0-v4l2.c.fixes xawtv-3.95.new/libng/plugins/drv0-v4l2.c +--- xawtv-3.95.new/libng/plugins/drv0-v4l2.c.fixes 2005-02-11 18:56:24.000000000 +0100 ++++ xawtv-3.95.new/libng/plugins/drv0-v4l2.c 2008-08-03 20:46:32.000000000 +0200 +@@ -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 m + 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->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 * + 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_v + 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; |