updated on Wed Jan 25 16:08:47 UTC 2012
[aur-mirror.git] / vdr / vdr-1.6.0-use-v4l2.patch
blob9920db9275767501377502889cbd58e36bf9689f
1 --- vdr-1.6.0/dvbdevice.c.orig 2011-04-29 20:07:16.969990304 +0100
2 +++ vdr-1.6.0/dvbdevice.c 2011-04-29 20:09:25.022403935 +0100
3 @@ -11,7 +11,7 @@
4 #include <limits.h>
5 #include <stdint.h>
6 #include "dvbdevice.h"
7 -#include <linux/videodev.h>
8 +#include <linux/videodev2.h>
9 #include <linux/dvb/audio.h>
10 #include <linux/dvb/dmx.h>
11 #include <linux/dvb/frontend.h>
12 @@ -522,69 +522,103 @@
13 int videoDev = open(buffer, O_RDWR);
14 if (videoDev >= 0) {
15 uchar *result = NULL;
16 - struct video_mbuf mbuf;
17 - if (ioctl(videoDev, VIDIOCGMBUF, &mbuf) == 0) {
18 - int msize = mbuf.size;
19 - unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
20 - if (mem && mem != (unsigned char *)-1) {
21 - // set up the size and RGB
22 - struct video_capability vc;
23 - if (ioctl(videoDev, VIDIOCGCAP, &vc) == 0) {
24 - struct video_mmap vm;
25 - vm.frame = 0;
26 - if ((SizeX > 0) && (SizeX <= vc.maxwidth) &&
27 - (SizeY > 0) && (SizeY <= vc.maxheight)) {
28 - vm.width = SizeX;
29 - vm.height = SizeY;
30 - }
31 - else {
32 - vm.width = vc.maxwidth;
33 - vm.height = vc.maxheight;
34 - }
35 - vm.format = VIDEO_PALETTE_RGB24;
36 - if (ioctl(videoDev, VIDIOCMCAPTURE, &vm) == 0 && ioctl(videoDev, VIDIOCSYNC, &vm.frame) == 0) {
37 - // make RGB out of BGR:
38 - int memsize = vm.width * vm.height;
39 - unsigned char *mem1 = mem;
40 - for (int i = 0; i < memsize; i++) {
41 - unsigned char tmp = mem1[2];
42 - mem1[2] = mem1[0];
43 - mem1[0] = tmp;
44 - mem1 += 3;
45 - }
47 - if (Quality < 0)
48 - Quality = 100;
50 - dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, vm.width, vm.height);
51 - if (Jpeg) {
52 - // convert to JPEG:
53 - result = RgbToJpeg(mem, vm.width, vm.height, Size, Quality);
54 - if (!result)
55 - esyslog("ERROR: failed to convert image to JPEG");
56 - }
57 - else {
58 - // convert to PNM:
59 - char buf[32];
60 - snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", vm.width, vm.height);
61 - int l = strlen(buf);
62 - int bytes = memsize * 3;
63 - Size = l + bytes;
64 - result = MALLOC(uchar, Size);
65 - if (result) {
66 - memcpy(result, buf, l);
67 - memcpy(result + l, mem, bytes);
68 + // set up the size and RGB
69 + v4l2_format fmt;
70 + memset(&fmt, 0, sizeof(fmt));
71 + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
72 + fmt.fmt.pix.width = SizeX;
73 + fmt.fmt.pix.height = SizeY;
74 + fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_BGR24;
75 + fmt.fmt.pix.field = V4L2_FIELD_ANY;
76 + if (ioctl(videoDev, VIDIOC_S_FMT, &fmt) == 0) {
77 + v4l2_requestbuffers reqBuf;
78 + memset(&reqBuf, 0, sizeof(reqBuf));
79 + reqBuf.count = 2;
80 + reqBuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
81 + reqBuf.memory = V4L2_MEMORY_MMAP;
82 + if (ioctl(videoDev, VIDIOC_REQBUFS, &reqBuf) >= 0) {
83 + v4l2_buffer mbuf;
84 + memset(&mbuf, 0, sizeof(mbuf));
85 + mbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
86 + mbuf.memory = V4L2_MEMORY_MMAP;
87 + if (ioctl(videoDev, VIDIOC_QUERYBUF, &mbuf) == 0) {
88 + int msize = mbuf.length;
89 + unsigned char *mem = (unsigned char *)mmap(0, msize, PROT_READ | PROT_WRITE, MAP_SHARED, videoDev, 0);
90 + if (mem && mem != (unsigned char *)-1) {
91 + v4l2_buffer buf;
92 + memset(&buf, 0, sizeof(buf));
93 + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
94 + buf.memory = V4L2_MEMORY_MMAP;
95 + buf.index = 0;
96 + if (ioctl(videoDev, VIDIOC_QBUF, &buf) == 0) {
97 + v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
98 + if (ioctl (videoDev, VIDIOC_STREAMON, &type) == 0) {
99 + memset(&buf, 0, sizeof(buf));
100 + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
101 + buf.memory = V4L2_MEMORY_MMAP;
102 + buf.index = 0;
103 + if (ioctl(videoDev, VIDIOC_DQBUF, &buf) == 0) {
104 + if (ioctl(videoDev, VIDIOC_STREAMOFF, &type) == 0) {
105 + // make RGB out of BGR:
106 + int memsize = fmt.fmt.pix.width * fmt.fmt.pix.height;
107 + unsigned char *mem1 = mem;
108 + for (int i = 0; i < memsize; i++) {
109 + unsigned char tmp = mem1[2];
110 + mem1[2] = mem1[0];
111 + mem1[0] = tmp;
112 + mem1 += 3;
115 + if (Quality < 0)
116 + Quality = 100;
118 + dsyslog("grabbing to %s %d %d %d", Jpeg ? "JPEG" : "PNM", Quality, fmt.fmt.pix.width, fmt.fmt.pix.height);
119 + if (Jpeg) {
120 + // convert to JPEG:
121 + result = RgbToJpeg(mem, fmt.fmt.pix.width, fmt.fmt.pix.height, Size, Quality);
122 + if (!result)
123 + esyslog("ERROR: failed to convert image to JPEG");
125 + else {
126 + // convert to PNM:
127 + char buf[32];
128 + snprintf(buf, sizeof(buf), "P6\n%d\n%d\n255\n", fmt.fmt.pix.width, fmt.fmt.pix.height);
129 + int l = strlen(buf);
130 + int bytes = memsize * 3;
131 + Size = l + bytes;
132 + result = MALLOC(uchar, Size);
133 + if (result) {
134 + memcpy(result, buf, l);
135 + memcpy(result + l, mem, bytes);
137 + else
138 + esyslog("ERROR: failed to convert image to PNM");
141 + else
142 + esyslog("ERROR: video device VIDIOC_STREAMOFF failed");
144 + else
145 + esyslog("ERROR: video device VIDIOC_DQBUF failed");
147 else
148 - esyslog("ERROR: failed to convert image to PNM");
149 + esyslog("ERROR: video device VIDIOC_STREAMON failed");
151 + else
152 + esyslog("ERROR: video device VIDIOC_QBUF failed");
153 + munmap(mem, msize);
155 + else
156 + esyslog("ERROR: failed to memmap video device");
158 - munmap(mem, msize);
159 + else
160 + esyslog("ERROR: video device VIDIOC_QUERYBUF failed");
162 else
163 - esyslog("ERROR: failed to memmap video device");
164 + esyslog("ERROR: video device VIDIOC_REQBUFS failed");
166 + else
167 + esyslog("ERROR: video device VIDIOC_S_FMT failed");
168 close(videoDev);
169 return result;