[vdr] Backport V4L2 patch from VDR 1.7.x to fix build with recent kernel headers.

Ville Skyttä scop at fedoraproject.org
Tue Feb 8 16:47:43 UTC 2011


commit 84d8db981f104df8134cb938f0860cba306235a1
Author: Ville Skyttä <ville.skytta at iki.fi>
Date:   Tue Feb 8 18:47:33 2011 +0200

    Backport V4L2 patch from VDR 1.7.x to fix build with recent kernel headers.

 vdr-1.6.0-v4l2.patch |  171 ++++++++++++++++++++++++++++++++++++++++++++++++++
 vdr.spec             |    8 ++-
 2 files changed, 178 insertions(+), 1 deletions(-)
---
diff --git a/vdr-1.6.0-v4l2.patch b/vdr-1.6.0-v4l2.patch
new file mode 100644
index 0000000..59a2952
--- /dev/null
+++ b/vdr-1.6.0-v4l2.patch
@@ -0,0 +1,171 @@
+diff -up vdr-1.6.0/dvbdevice.c~ vdr-1.6.0/dvbdevice.c
+--- vdr-1.6.0/dvbdevice.c~	2011-02-08 18:40:05.826829207 +0200
++++ vdr-1.6.0/dvbdevice.c	2011-02-08 18:42:04.930825356 +0200
+@@ -10,7 +10,7 @@
+ #include "dvbdevice.h"
+ #include <errno.h>
+ #include <limits.h>
+-#include <linux/videodev.h>
++#include <linux/videodev2.h>
+ #include <linux/dvb/audio.h>
+ #include <linux/dvb/dmx.h>
+ #include <linux/dvb/frontend.h>
+@@ -536,69 +536,103 @@ uchar *cDvbDevice::GrabImage(int &Size, 
+   int videoDev = open(buffer, O_RDWR);
+   if (videoDev >= 0) {
+      uchar *result = NULL;
+-     struct video_mbuf mbuf;
+-     if (ioctl(videoDev, VIDIOCGMBUF, &mbuf) == 0) {
+-        int msize = mbuf.size;
+-        unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
+-        if (mem && mem != (unsigned char *)-1) {
+-           // set up the size and RGB
+-           struct video_capability vc;
+-           if (ioctl(videoDev, VIDIOCGCAP, &vc) == 0) {
+-              struct video_mmap vm;
+-              vm.frame = 0;
+-              if ((SizeX > 0) && (SizeX <= vc.maxwidth) &&
+-                  (SizeY > 0) && (SizeY <= vc.maxheight)) {
+-                 vm.width = SizeX;
+-                 vm.height = SizeY;
+-                 }
+-              else {
+-                 vm.width = vc.maxwidth;
+-                 vm.height = vc.maxheight;
+-                 }
+-              vm.format = VIDEO_PALETTE_RGB24;
+-              if (ioctl(videoDev, VIDIOCMCAPTURE, &vm) == 0 && ioctl(videoDev, VIDIOCSYNC, &vm.frame) == 0) {
+-                 // make RGB out of BGR:
+-                 int memsize = vm.width * vm.height;
+-                 unsigned char *mem1 = mem;
+-                 for (int i = 0; i < memsize; i++) {
+-                     unsigned char tmp = mem1[2];
+-                     mem1[2] = mem1[0];
+-                     mem1[0] = tmp;
+-                     mem1 += 3;
+-                     }
+-
+-                 if (Quality < 0)
+-                    Quality = 100;
+-
+-                 dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, vm.width, vm.height);
+-                 if (Jpeg) {
+-                    // convert to JPEG:
+-                    result = RgbToJpeg(mem, vm.width, vm.height, Size, Quality);
+-                    if (!result)
+-                       esyslog("ERROR: failed to convert image to JPEG");
+-                    }
+-                 else {
+-                    // convert to PNM:
+-                    char buf[32];
+-                    snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", vm.width, vm.height);
+-                    int l = strlen(buf);
+-                    int bytes = memsize * 3;
+-                    Size = l + bytes;
+-                    result = MALLOC(uchar, Size);
+-                    if (result) {
+-                       memcpy(result, buf, l);
+-                       memcpy(result + l, mem, bytes);
++     // set up the size and RGB
++     v4l2_format fmt;
++     memset(&fmt, 0, sizeof(fmt));
++     fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++     fmt.fmt.pix.width = SizeX;
++     fmt.fmt.pix.height = SizeY;
++     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
++     fmt.fmt.pix.field = V4L2_FIELD_ANY;
++     if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) {
++        v4l2_requestbuffers reqBuf;
++        memset(&reqBuf, 0, sizeof(reqBuf));
++        reqBuf.count = 2;
++        reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++        reqBuf.memory = V4L2_MEMORY_MMAP;
++        if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) {
++           v4l2_buffer mbuf;
++           memset(&mbuf, 0, sizeof(mbuf));
++           mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++           mbuf.memory = V4L2_MEMORY_MMAP;
++           if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) {
++              int msize = mbuf.length;
++              unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
++              if (mem && mem != (unsigned char *)-1) {
++                 v4l2_buffer buf;
++                 memset(&buf, 0, sizeof(buf));
++                 buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++                 buf.memory = V4L2_MEMORY_MMAP;
++                 buf.index = 0;
++                 if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) {
++                    v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++                    if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) {
++                       memset(&buf, 0, sizeof(buf));
++                       buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++                       buf.memory = V4L2_MEMORY_MMAP;
++                       buf.index = 0;
++                       if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) {
++                          if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) {
++                             // make RGB out of BGR:
++                             int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height;
++                             unsigned char *mem1 = mem;
++                             for (int i = 0; i < memsize; i++) {
++                                 unsigned char tmp = mem1[2];
++                                 mem1[2] = mem1[0];
++                                 mem1[0] = tmp;
++                                 mem1 += 3;
++                                 }
++
++                             if (Quality < 0)
++                                Quality = 100;
++
++                             dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height);
++                             if (Jpeg) {
++                                // convert to JPEG:
++                                result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality);
++                                if (!result)
++                                   esyslog("ERROR: failed to convert image to JPEG");
++                                }
++                             else {
++                                // convert to PNM:
++                                char buf[32];
++                                snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
++                                int l = strlen(buf);
++                                int bytes = memsize * 3;
++                                Size = l + bytes;
++                                result = MALLOC(uchar, Size);
++                                if (result) {
++                                   memcpy(result, buf, l);
++                                   memcpy(result + l, mem, bytes);
++                                   }
++                                else
++                                   esyslog("ERROR: failed to convert image to PNM");
++                                }
++                             }
++                          else
++                             esyslog("ERROR: video device VIDIOC_STREAMOFF failed");
++                          }
++                       else
++                          esyslog("ERROR: video device VIDIOC_DQBUF failed");
+                        }
+                     else
+-                       esyslog("ERROR: failed to convert image to PNM");
++                       esyslog("ERROR: video device VIDIOC_STREAMON failed");
+                     }
++                 else
++                    esyslog("ERROR: video device VIDIOC_QBUF failed");
++                 munmap(mem, msize);
+                  }
++              else
++                 esyslog("ERROR: failed to memmap video device");
+               }
+-           munmap(mem, msize);
++           else
++              esyslog("ERROR: video device VIDIOC_QUERYBUF failed");
+            }
+         else
+-           esyslog("ERROR: failed to memmap video device");
++           esyslog("ERROR: video device VIDIOC_REQBUFS failed");
+         }
++     else
++        esyslog("ERROR: video device VIDIOC_S_FMT failed");
+      close(videoDev);
+      return result;
+      }
diff --git a/vdr.spec b/vdr.spec
index 352e9ee..19ee34e 100644
--- a/vdr.spec
+++ b/vdr.spec
@@ -33,7 +33,7 @@
 
 Name:           vdr
 Version:        1.6.0
-Release:        36%{?dist}
+Release:        37%{?dist}
 Summary:        Video Disk Recorder
 
 Group:          Applications/Multimedia
@@ -100,6 +100,8 @@ Patch27:        %{name}-1.6.0-epgsearch-exttimeredit-0.0.2.diff
 # https://bugzilla.redhat.com/show_bug.cgi?id=538604, upstreamed 2009-11-22
 Patch28:        %{name}-1.6.0-sky-lirc-device.patch
 Patch29:        %{name}-1.6.0-msgidbugs.patch
+# Backport from VDR 1.7.x
+Patch30:        %{name}-1.6.0-v4l2.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 BuildRequires:  libjpeg-devel
@@ -238,6 +240,7 @@ sed \
 %patch27 -p1
 %patch28 -p1
 %patch29 -p1
+%patch30 -p1
 
 for f in CONTRIBUTORS HISTORY* UPDATE-1.4.0 README.{jumpplay,timer-info} ; do
   iconv -f iso-8859-1 -t utf-8 -o $f.utf8 $f && mv $f.utf8 $f
@@ -537,6 +540,9 @@ fi
 %endif # plugins
 
 %changelog
+* Tue Feb  8 2011 Ville Skyttä <ville.skytta at iki.fi> - 1.6.0-37
+- Backport V4L2 patch from VDR 1.7.x to fix build with recent kernel headers.
+
 * Mon Feb 07 2011 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 1.6.0-36
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
 


More information about the scm-commits mailing list