summaryrefslogtreecommitdiff
path: root/extra/xawtv/xawtv-3.95-libv4l2.patch
diff options
context:
space:
mode:
authorParabola <dev@list.parabolagnulinux.org>2011-04-05 14:26:38 +0000
committerParabola <dev@list.parabolagnulinux.org>2011-04-05 14:26:38 +0000
commit415856bdd4f48ab4f2732996f0bae58595092bbe (patch)
treeede2018b591f6dfb477fe9341ba17b9bc000fab9 /extra/xawtv/xawtv-3.95-libv4l2.patch
Tue Apr 5 14:26:38 UTC 2011
Diffstat (limited to 'extra/xawtv/xawtv-3.95-libv4l2.patch')
-rw-r--r--extra/xawtv/xawtv-3.95-libv4l2.patch176
1 files changed, 176 insertions, 0 deletions
diff --git a/extra/xawtv/xawtv-3.95-libv4l2.patch b/extra/xawtv/xawtv-3.95-libv4l2.patch
new file mode 100644
index 000000000..45a5e69cb
--- /dev/null
+++ b/extra/xawtv/xawtv-3.95-libv4l2.patch
@@ -0,0 +1,176 @@
+--- xawtv-3.95/libng/plugins/Subdir.mk~ 2008-07-30 09:51:01.000000000 +0200
++++ xawtv-3.95/libng/plugins/Subdir.mk 2008-07-30 09:51:01.000000000 +0200
+@@ -41,6 +41,7 @@ libng/plugins/read-qt.so : LDLIBS := $(
+ libng/plugins/write-qt.so : LDLIBS := $(QT_LIBS)
+ libng/plugins/read-dv.so : LDLIBS := $(DV_LIBS)
+ libng/plugins/write-dv.so : LDLIBS := $(DV_LIBS)
++libng/plugins/drv0-v4l2.so: LDLIBS := -lv4l2
+
+ # global targets
+ all:: $(TARGETS-plugins)
+diff -up xawtv-3.95/libng/plugins/drv0-v4l2.c.orig xawtv-3.95/libng/plugins/drv0-v4l2.c
+--- xawtv-3.95/libng/plugins/drv0-v4l2.c.orig 2008-08-03 21:26:13.000000000 +0200
++++ xawtv-3.95/libng/plugins/drv0-v4l2.c 2008-08-03 21:27:50.000000000 +0200
+@@ -29,11 +29,26 @@
+ #include "struct-dump.h"
+ #include "struct-v4l2.h"
+
++/* FIXME replace with autoconf detection */
++#define HAVE_LIBV4L
++
++#ifdef HAVE_LIBV4L
++#include <libv4l2.h>
++#else
++#define v4l2_fd_open(fd, flags) (fd)
++#define v4l2_close close
++#define v4l2_dup dup
++#define v4l2_ioctl ioctl
++#define v4l2_read read
++#define v4l2_mmap mmap
++#define v4l2_munmap munmap
++#endif
++
+ /* ---------------------------------------------------------------------- */
+
+ /* open+close */
+-static void* v4l2_open(char *device);
+-static int v4l2_close(void *handle);
++static void* v4l2_open_handle(char *device);
++static int v4l2_close_handle(void *handle);
+
+ /* attributes */
+ static char* v4l2_devname(void *handle);
+@@ -111,8 +126,8 @@ struct v4l2_handle {
+
+ struct ng_vid_driver v4l2_driver = {
+ name: "v4l2",
+- open: v4l2_open,
+- close: v4l2_close,
++ open: v4l2_open_handle,
++ close: v4l2_close_handle,
+
+ get_devname: v4l2_devname,
+ capabilities: v4l2_flags,
+@@ -166,7 +181,7 @@ xioctl(int fd, int cmd, void *arg, int m
+ {
+ int rc;
+
+- rc = ioctl(fd,cmd,arg);
++ rc = v4l2_ioctl(fd,cmd,arg);
+ if (rc >= 0 && ng_debug < 2)
+ return rc;
+ if (mayfail && errno == mayfail && ng_debug < 2)
+@@ -220,7 +235,7 @@ get_device_capabilities(struct v4l2_hand
+ }
+
+ h->streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+- ioctl(h->fd,VIDIOC_G_PARM,&h->streamparm);
++ v4l2_ioctl(h->fd,VIDIOC_G_PARM,&h->streamparm);
+
+ /* controls */
+ for (i = 0; i < MAX_CTRL; i++) {
+@@ -444,10 +459,10 @@ static void v4l2_write_attr(struct ng_at
+ /* ---------------------------------------------------------------------- */
+
+ static void*
+-v4l2_open(char *device)
++v4l2_open_handle(char *device)
+ {
+ struct v4l2_handle *h;
+- int i;
++ int i, libv4l2_fd;
+
+ h = malloc(sizeof(*h));
+ if (NULL == h)
+@@ -459,6 +474,16 @@ v4l2_open(char *device)
+ goto err;
+ }
+
++ /* Note the v4l2_xxx functions are designed so that if they get passed an
++ unknown fd, the will behave exactly as their regular xxx counterparts, so
++ if v4l2_fd_open fails, we continue as normal (missing the libv4l2 custom
++ cam format to normal formats conversion). Chances are big we will still
++ fail then though, as normally v4l2_fd_open only fails if the device is not
++ a v4l2 device. */
++ libv4l2_fd = v4l2_fd_open(h->fd, 0);
++ if (libv4l2_fd != -1)
++ h->fd = libv4l2_fd;
++
+ if (-1 == xioctl(h->fd,VIDIOC_QUERYCAP,&h->cap,EINVAL))
+ goto err;
+ if (ng_debug)
+@@ -495,21 +520,21 @@ v4l2_open(char *device)
+
+ err:
+ if (h->fd != -1)
+- close(h->fd);
++ v4l2_close(h->fd);
+ if (h)
+ free(h);
+ return NULL;
+ }
+
+ static int
+-v4l2_close(void *handle)
++v4l2_close_handle(void *handle)
+ {
+ struct v4l2_handle *h = handle;
+
+ if (ng_debug)
+ fprintf(stderr, "v4l2: close\n");
+
+- close(h->fd);
++ v4l2_close(h->fd);
+ free(h);
+ return 0;
+ }
+@@ -818,7 +843,7 @@ v4l2_start_streaming(struct v4l2_handle
+ 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;
+- h->buf_me[i].data = mmap(NULL, h->buf_v4l2[i].length,
++ h->buf_me[i].data = v4l2_mmap(NULL, h->buf_v4l2[i].length,
+ PROT_READ | PROT_WRITE, MAP_SHARED,
+ h->fd, h->buf_v4l2[i].m.offset);
+ if (MAP_FAILED == h->buf_me[i].data) {
+@@ -859,7 +884,7 @@ v4l2_stop_streaming(struct v4l2_handle *
+ unsigned int i;
+
+ /* stop capture */
+- if (-1 == ioctl(h->fd,VIDIOC_STREAMOFF,&h->fmt_v4l2.type))
++ if (-1 == v4l2_ioctl(h->fd,VIDIOC_STREAMOFF,&h->fmt_v4l2.type))
+ perror("ioctl VIDIOC_STREAMOFF");
+
+ /* free buffers */
+@@ -868,7 +893,7 @@ 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_v4l2_size[i]))
++ if (-1 == v4l2_munmap(h->buf_me[i].data, h->buf_v4l2_size[i]))
+ perror("munmap");
+ }
+ h->queue = 0;
+@@ -989,7 +1014,7 @@ v4l2_nextframe(void *handle)
+ } else {
+ size = h->fmt_me.bytesperline * h->fmt_me.height;
+ buf = ng_malloc_video_buf(&h->fmt_me,size);
+- rc = read(h->fd,buf->data,size);
++ rc = v4l2_read(h->fd,buf->data,size);
+ if (rc != size) {
+ if (-1 == rc) {
+ perror("v4l2: read");
+@@ -1023,11 +1048,11 @@ v4l2_getimage(void *handle)
+ size = h->fmt_me.bytesperline * h->fmt_me.height;
+ buf = ng_malloc_video_buf(&h->fmt_me,size);
+ if (h->cap.capabilities & V4L2_CAP_READWRITE) {
+- rc = read(h->fd,buf->data,size);
++ rc = v4l2_read(h->fd,buf->data,size);
+ if (-1 == rc && EBUSY == errno && h->ov_on) {
+ h->ov_on = 0;
+ xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0);
+- rc = read(h->fd,buf->data,size);
++ rc = v4l2_read(h->fd,buf->data,size);
+ h->ov_on = 1;
+ xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0);
+ }