From 8ee417ab6882e4c478e95c6f0198efe416ee5da8 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Wed, 23 Jul 2008 14:04:23 +0200 Subject: libv4l 0.3.7 release, add spca505/6 and spca508 format support From: Hans de Goede * Add spca505/6 and spca508 cam specific formats (YUYV per line variations) Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 5 ++ v4l2-apps/lib/libv4l/Makefile | 2 +- .../lib/libv4l/libv4lconvert/libv4lconvert-priv.h | 15 ++++- v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c | 35 +++++++++-- v4l2-apps/lib/libv4l/libv4lconvert/spca501.c | 73 +++++++++++++++++++--- 5 files changed, 115 insertions(+), 15 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 286963543..9d642da7c 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -1,3 +1,8 @@ +libv4l-0.3.7 +------------ +* Add spca505/6 and spca508 cam specific formats (YUYV per line variations) + + libv4l-0.3.6 ------------ * Add missing COPYING.LIB file diff --git a/v4l2-apps/lib/libv4l/Makefile b/v4l2-apps/lib/libv4l/Makefile index 0f4428eba..3497fdbf2 100644 --- a/v4l2-apps/lib/libv4l/Makefile +++ b/v4l2-apps/lib/libv4l/Makefile @@ -1,5 +1,5 @@ LIB_RELEASE=0 -V4L2_LIB_VERSION=$(LIB_RELEASE).3.6 +V4L2_LIB_VERSION=$(LIB_RELEASE).3.7 all clean install: $(MAKE) -C libv4lconvert $@ diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h index badb89d62..3148065f3 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h @@ -24,7 +24,15 @@ #include "tinyjpeg.h" #ifndef V4L2_PIX_FMT_SPCA501 -#define V4L2_PIX_FMT_SPCA501 v4l2_fourcc('S','5','0','1') +#define V4L2_PIX_FMT_SPCA501 v4l2_fourcc('S','5','0','1') /* YUYV per line */ +#endif + +#ifndef V4L2_PIX_FMT_SPCA505 +#define V4L2_PIX_FMT_SPCA505 v4l2_fourcc('S','5','0','5') /* YYUV per line */ +#endif + +#ifndef V4L2_PIX_FMT_SPCA508 +#define V4L2_PIX_FMT_SPCA508 v4l2_fourcc('S','5','0','8') /* YUVY per line */ #endif #ifndef V4L2_PIX_FMT_SPCA561 @@ -69,7 +77,10 @@ void v4lconvert_yuv420_to_bgr24(const unsigned char *src, unsigned char *dst, void v4lconvert_spca501_to_yuv420(const unsigned char *src, unsigned char *dst, int width, int height); -void v4lconvert_spca501_to_bgr24(const unsigned char *src, unsigned char *dst, +void v4lconvert_spca505_to_yuv420(const unsigned char *src, unsigned char *dst, + int width, int height); + +void v4lconvert_spca508_to_yuv420(const unsigned char *src, unsigned char *dst, int width, int height); void v4lconvert_decode_spca561(const unsigned char *src, unsigned char *dst, diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c index 6c6cb693d..3d61225b9 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c @@ -42,6 +42,8 @@ static const unsigned int supported_src_pixfmts[] = { V4L2_PIX_FMT_SGRBG8, V4L2_PIX_FMT_SRGGB8, V4L2_PIX_FMT_SPCA501, + V4L2_PIX_FMT_SPCA505, + V4L2_PIX_FMT_SPCA508, V4L2_PIX_FMT_SPCA561, V4L2_PIX_FMT_SN9C10X, V4L2_PIX_FMT_PAC207, @@ -310,14 +312,37 @@ int v4lconvert_convert(struct v4lconvert_data *data, dest_fmt->fmt.pix.height, src_fmt->fmt.pix.pixelformat); break; + /* YUYV line by line formats */ case V4L2_PIX_FMT_SPCA501: + case V4L2_PIX_FMT_SPCA505: + case V4L2_PIX_FMT_SPCA508: + { + unsigned char tmpbuf[dest_fmt->fmt.pix.width * dest_fmt->fmt.pix.height * + 3 / 2]; + unsigned char *my_dst = (dest_fmt->fmt.pix.pixelformat == + V4L2_PIX_FMT_BGR24) ? tmpbuf : dest; + + switch (src_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_SPCA501: + v4lconvert_spca501_to_yuv420(src, my_dst, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + case V4L2_PIX_FMT_SPCA505: + v4lconvert_spca505_to_yuv420(src, my_dst, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + case V4L2_PIX_FMT_SPCA508: + v4lconvert_spca508_to_yuv420(src, my_dst, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + } + if (dest_fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_BGR24) - v4lconvert_spca501_to_bgr24(src, dest, dest_fmt->fmt.pix.width, - dest_fmt->fmt.pix.height); - else - v4lconvert_spca501_to_yuv420(src, dest, dest_fmt->fmt.pix.width, - dest_fmt->fmt.pix.height); + v4lconvert_yuv420_to_bgr24(tmpbuf, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + } /* compressed bayer formats */ case V4L2_PIX_FMT_SPCA561: diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c b/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c index b0170e7cb..1e54cb7bb 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c @@ -18,14 +18,14 @@ #include "libv4lconvert-priv.h" +/* YUYV per line */ void v4lconvert_spca501_to_yuv420(const unsigned char *src, unsigned char *dst, int width, int height) { int i,j; + unsigned long *lsrc = (unsigned long *)src; for (i = 0; i < height; i += 2) { - unsigned long *lsrc = (unsigned long *)(src + (i / 2) * 3 * width); - /* -128 - 127 --> 0 - 255 and copy first line Y */ unsigned long *ldst = (unsigned long *)(dst + i * width); for (j = 0; j < width; j += sizeof(long)) { @@ -56,12 +56,71 @@ void v4lconvert_spca501_to_yuv420(const unsigned char *src, unsigned char *dst, } } -/* IMPROVEME (maybe?) make this convert in one go?? */ -void v4lconvert_spca501_to_bgr24(const unsigned char *src, unsigned char *dst, +/* YYUV per line */ +void v4lconvert_spca505_to_yuv420(const unsigned char *src, unsigned char *dst, int width, int height) { - unsigned char buf[(width * height * 6) / 4]; + int i,j; + unsigned long *lsrc = (unsigned long *)src; + + for (i = 0; i < height; i += 2) { + /* -128 - 127 --> 0 - 255 and copy 2 lines of Y */ + unsigned long *ldst = (unsigned long *)(dst + i * width); + for (j = 0; j < width*2; j += sizeof(long)) { + *ldst = *lsrc++; + *ldst++ ^= 0x8080808080808080ULL; + } + + /* -128 - 127 --> 0 - 255 and copy 1 line U */ + ldst = (unsigned long *)(dst + width * height + i * width / 4); + for (j = 0; j < width/2; j += sizeof(long)) { + *ldst = *lsrc++; + *ldst++ ^= 0x8080808080808080ULL; + } - v4lconvert_spca501_to_yuv420(src, buf, width, height); - v4lconvert_yuv420_to_bgr24(buf, dst, width, height); + /* -128 - 127 --> 0 - 255 and copy 1 line V */ + ldst = (unsigned long *)(dst + (width * height * 5) / 4 + i * width / 4); + for (j = 0; j < width/2; j += sizeof(long)) { + *ldst = *lsrc++; + *ldst++ ^= 0x8080808080808080ULL; + } + } +} + +/* YUVY per line */ +void v4lconvert_spca508_to_yuv420(const unsigned char *src, unsigned char *dst, + int width, int height) +{ + int i,j; + unsigned long *lsrc = (unsigned long *)src; + + for (i = 0; i < height; i += 2) { + /* -128 - 127 --> 0 - 255 and copy first line Y */ + unsigned long *ldst = (unsigned long *)(dst + i * width); + for (j = 0; j < width; j += sizeof(long)) { + *ldst = *lsrc++; + *ldst++ ^= 0x8080808080808080ULL; + } + + /* -128 - 127 --> 0 - 255 and copy 1 line U */ + ldst = (unsigned long *)(dst + width * height + i * width / 4); + for (j = 0; j < width/2; j += sizeof(long)) { + *ldst = *lsrc++; + *ldst++ ^= 0x8080808080808080ULL; + } + + /* -128 - 127 --> 0 - 255 and copy 1 line V */ + ldst = (unsigned long *)(dst + (width * height * 5) / 4 + i * width / 4); + for (j = 0; j < width/2; j += sizeof(long)) { + *ldst = *lsrc++; + *ldst++ ^= 0x8080808080808080ULL; + } + + /* -128 - 127 --> 0 - 255 and copy second line Y */ + ldst = (unsigned long *)(dst + i * width + width); + for (j = 0; j < width; j += sizeof(long)) { + *ldst = *lsrc++; + *ldst++ ^= 0x8080808080808080ULL; + } + } } -- cgit v1.2.3 From 46da27966fefda91510002ea939d6e901c86f1d7 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Tue, 29 Jul 2008 21:48:08 +0200 Subject: libv4l2: work around wrong REQUEST_BUFFERS ioctl return code From: Gregor Jasny libv4l2: work around wrong REQUEST_BUFFERS ioctl return code Signed-off-by: Gregor Jasny Signed-off-by: Hans de Goede Acked-by: Mauro Carvalho Chehab --- v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index 8dfcf9b71..b2ab4dede 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -97,7 +97,7 @@ static int v4l2_request_read_buffers(int index) req.count = devices[index].nreadbuffers; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; - if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req))){ + if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req)) < 0){ int saved_err = errno; V4L2_LOG_ERR("requesting buffers: %s\n", strerror(errno)); errno = saved_err; @@ -121,7 +121,7 @@ static int v4l2_unrequest_read_buffers(int index) req.count = 0; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; - if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req))) { + if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req)) < 0) { int saved_err = errno; V4L2_LOG_ERR("unrequesting buffers: %s\n", strerror(errno)); errno = saved_err; @@ -723,8 +723,9 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) v4l2_unmap_buffers(index); result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, req); - if (result) + if (result < 0) break; + result = 0; // some drivers return the number of buffers on success /* If we got more frames then we can handle lie to the app */ if (req->count > V4L2_MAX_NO_FRAMES) -- cgit v1.2.3 From 55b3e527968b0644e7eaf3aae2b873249400b614 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Tue, 29 Jul 2008 23:02:59 +0200 Subject: libv4l: add pkg-config (.pc) files for easier detection if libv4l is available From: Hans de Goede libv4l: add pkg-config (.pc) files for easier detection if libv4l is available Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 6 ++++++ v4l2-apps/lib/libv4l/Makefile | 8 ++++---- v4l2-apps/lib/libv4l/libv4l1/Makefile | 17 ++++++++++++++--- v4l2-apps/lib/libv4l/libv4l2/Makefile | 17 ++++++++++++++--- v4l2-apps/lib/libv4l/libv4lconvert/Makefile | 17 ++++++++++++++--- 5 files changed, 52 insertions(+), 13 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 9d642da7c..3cdabde0d 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -1,3 +1,9 @@ +libv4l-0.3.8 +------------ +* work around wrong REQUEST_BUFFERS ioctl return code from certain drivers +* add pkg-config (.pc) files for easier detection if libv4l is available + + libv4l-0.3.7 ------------ * Add spca505/6 and spca508 cam specific formats (YUYV per line variations) diff --git a/v4l2-apps/lib/libv4l/Makefile b/v4l2-apps/lib/libv4l/Makefile index 3497fdbf2..ee6d555c3 100644 --- a/v4l2-apps/lib/libv4l/Makefile +++ b/v4l2-apps/lib/libv4l/Makefile @@ -1,10 +1,10 @@ LIB_RELEASE=0 -V4L2_LIB_VERSION=$(LIB_RELEASE).3.7 +V4L2_LIB_VERSION=$(LIB_RELEASE).3.8 all clean install: - $(MAKE) -C libv4lconvert $@ - $(MAKE) -C libv4l2 $@ - $(MAKE) -C libv4l1 $@ + $(MAKE) -C libv4lconvert V4L2_LIB_VERSION=$(V4L2_LIB_VERSION) $@ + $(MAKE) -C libv4l2 V4L2_LIB_VERSION=$(V4L2_LIB_VERSION) $@ + $(MAKE) -C libv4l1 V4L2_LIB_VERSION=$(V4L2_LIB_VERSION) $@ export: clean mkdir /tmp/libv4l-$(V4L2_LIB_VERSION) diff --git a/v4l2-apps/lib/libv4l/libv4l1/Makefile b/v4l2-apps/lib/libv4l/libv4l1/Makefile index 8cb064cd4..4e9206bf6 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l1/Makefile @@ -12,7 +12,7 @@ V4L1_OBJS = libv4l1.o log.o ../libv4l2/libv4l2.so V4L1_LIB = libv4l1.so V4L1COMPAT = v4l1compat.so V4L1COMPAT_O = v4l1compat.o libv4l1.so -TARGETS = $(V4L1_LIB) $(V4L1COMPAT) +TARGETS = $(V4L1_LIB) $(V4L1COMPAT) libv4l1.pc INCLUDES = ../include/libv4l1.h ifeq ($(LIB_RELEASE),) @@ -34,6 +34,16 @@ $(V4L1_LIB): $(V4L1_OBJS) $(V4L1COMPAT): $(V4L1COMPAT_O) $(V4L1_LIB) +libv4l1.pc: + echo prefix=$(PREFIX) > libv4l1.pc + echo libdir=$(LIBDIR) >> libv4l1.pc + echo >> libv4l1.pc + echo 'Name: libv4l1' >> libv4l1.pc + echo 'Description: v4l1 compatibility library' >> libv4l1.pc + echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l1.pc + echo 'Libs: -L$${libdir} -lv4l1' >> libv4l1.pc + echo 'Cflags: -I$${prefix}/include' >> libv4l1.pc + install: all mkdir -p $(DESTDIR)$(PREFIX)/include install -p -m 644 $(INCLUDES) $(DESTDIR)$(PREFIX)/include @@ -43,10 +53,11 @@ install: all ln -f -s $(V4L1_LIB).$(LIB_RELEASE) $(V4L1_LIB) install -m 755 $(V4L1COMPAT).$(LIB_RELEASE) \ $(DESTDIR)$(LIBDIR)/libv4l/$(V4L1COMPAT) + mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig + install -m 644 libv4l1.pc $(DESTDIR)$(LIBDIR)/pkgconfig clean:: - rm -f *.so* *.o log *~ - rm -f *.d + rm -f *.so* *.o *.d libv4l1.pc log *~ %.o: %.c $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< diff --git a/v4l2-apps/lib/libv4l/libv4l2/Makefile b/v4l2-apps/lib/libv4l/libv4l2/Makefile index 1258e379b..0e63eae71 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l2/Makefile @@ -12,7 +12,7 @@ V4L2_OBJS = libv4l2.o log.o ../libv4lconvert/libv4lconvert.so V4L2_LIB = libv4l2.so V4L2CONVERT = v4l2convert.so V4L2CONVERT_O = v4l2convert.o libv4l2.so -TARGETS = $(V4L2_LIB) $(V4L2CONVERT) +TARGETS = $(V4L2_LIB) $(V4L2CONVERT) libv4l2.pc INCLUDES = ../include/libv4l2.h ifeq ($(LIB_RELEASE),) @@ -33,6 +33,16 @@ $(V4L2_LIB): $(V4L2_OBJS) $(V4L2CONVERT): $(V4L2CONVERT_O) $(V4L2_LIB) +libv4l2.pc: + echo prefix=$(PREFIX) > libv4l2.pc + echo libdir=$(LIBDIR) >> libv4l2.pc + echo >> libv4l2.pc + echo 'Name: libv4l2' >> libv4l2.pc + echo 'Description: v4l2 device access library' >> libv4l2.pc + echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l2.pc + echo 'Libs: -L$${libdir} -lv4l2' >> libv4l2.pc + echo 'Cflags: -I$${prefix}/include' >> libv4l2.pc + install: all mkdir -p $(DESTDIR)$(PREFIX)/include install -p -m 644 $(INCLUDES) $(DESTDIR)$(PREFIX)/include @@ -42,10 +52,11 @@ install: all ln -f -s $(V4L2_LIB).$(LIB_RELEASE) $(V4L2_LIB) install -m 755 $(V4L2CONVERT).$(LIB_RELEASE) \ $(DESTDIR)$(LIBDIR)/libv4l/$(V4L2CONVERT) + mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig + install -m 644 libv4l2.pc $(DESTDIR)$(LIBDIR)/pkgconfig clean:: - rm -f *.so* *.o log *~ - rm -f *.d + rm -f *.so* *.o *.d libv4l2.pc log *~ %.o: %.c $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/Makefile b/v4l2-apps/lib/libv4l/libv4lconvert/Makefile index 38071de94..3fd561f4e 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/Makefile +++ b/v4l2-apps/lib/libv4l/libv4lconvert/Makefile @@ -11,7 +11,7 @@ LDFLAGS = -shared CONVERT_LIB = libv4lconvert.so CONVERT_OBJS = libv4lconvert.o tinyjpeg.o sn9c10x.o pac207.o \ jidctflt.o spca561-decompress.o rgbyuv.o spca501.o bayer.o -TARGETS = $(CONVERT_LIB) +TARGETS = $(CONVERT_LIB) libv4lconvert.pc INCLUDES = ../include/libv4lconvert.h ifeq ($(LIB_RELEASE),) @@ -30,6 +30,16 @@ all: $(TARGETS) $(CONVERT_LIB): $(CONVERT_OBJS) +libv4lconvert.pc: + echo prefix=$(PREFIX) > libv4lconvert.pc + echo libdir=$(LIBDIR) >> libv4lconvert.pc + echo >> libv4lconvert.pc + echo 'Name: libv4lconvert' >> libv4lconvert.pc + echo 'Description: v4l format conversion library' >> libv4lconvert.pc + echo 'Version: '$(V4L2_LIB_VERSION) >> libv4lconvert.pc + echo 'Libs: -L$${libdir} -lv4lconvert' >> libv4lconvert.pc + echo 'Cflags: -I$${prefix}/include' >> libv4lconvert.pc + install: all mkdir -p $(DESTDIR)$(PREFIX)/include install -p -m 644 $(INCLUDES) $(DESTDIR)$(PREFIX)/include @@ -37,10 +47,11 @@ install: all install -m 755 $(CONVERT_LIB).$(LIB_RELEASE) $(DESTDIR)$(LIBDIR) cd $(DESTDIR)$(LIBDIR) && \ ln -f -s $(CONVERT_LIB).$(LIB_RELEASE) $(CONVERT_LIB) + mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig + install -m 644 libv4lconvert.pc $(DESTDIR)$(LIBDIR)/pkgconfig clean:: - rm -f *.so* *.o log *~ - rm -f *.d + rm -f *.so* *.o *.d libv4lconvert.pc log *~ %.o: %.c $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< -- cgit v1.2.3 From a94d7a5e69e739ce5afae5a7c8d02dcf68c04b91 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Tue, 29 Jul 2008 23:15:36 +0200 Subject: libv4l: check capabilities for streaming From: Hans de Goede libv4l: check capabilities for streaming Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 2 ++ v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 3cdabde0d..3fec060c3 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -2,6 +2,8 @@ libv4l-0.3.8 ------------ * work around wrong REQUEST_BUFFERS ioctl return code from certain drivers * add pkg-config (.pc) files for easier detection if libv4l is available +* check capabilities for streaming, if the driver cannot do streaming don't + insert ourselves between the application and the driver libv4l-0.3.7 diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index b2ab4dede..95c581079 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -386,8 +386,10 @@ int v4l2_fd_open(int fd, int v4l2_flags) return -1; } - /* we only add functionality for video capture devices */ - if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) + /* we only add functionality for video capture devices, and we do not + handle devices which don't do mmap */ + if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) || + !(cap.capabilities & V4L2_CAP_STREAMING)) return fd; /* Get current cam format */ -- cgit v1.2.3 From 5e786b0e454373ed7282b56cd43a13503d2d98c2 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Tue, 29 Jul 2008 23:26:45 +0200 Subject: libv4l: intercept get capabilites and report read capability From: Hans de Goede libv4l: intercept get capabilites and report read capability Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 1 + v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 3fec060c3..b54ab92f4 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -4,6 +4,7 @@ libv4l-0.3.8 * add pkg-config (.pc) files for easier detection if libv4l is available * check capabilities for streaming, if the driver cannot do streaming don't insert ourselves between the application and the driver +* intercept get capabilites and report read capability (which we always offer) libv4l-0.3.7 diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index 95c581079..930ef5f1e 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -550,6 +550,9 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) /* Is this a capture request and do we need to take the stream lock? */ switch (request) { + case VIDIOC_QUERYCAP: + is_capture_request = 1; + break; case VIDIOC_ENUM_FMT: if (((struct v4l2_fmtdesc *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) is_capture_request = 1; @@ -605,6 +608,17 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) switch (request) { + case VIDIOC_QUERYCAP: + { + struct v4l2_capability *cap = arg; + + result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QUERYCAP, cap); + if (result == 0) + /* We always support read() as we fake it using mmap mode */ + cap->capabilities |= V4L2_CAP_READWRITE; + } + break; + case VIDIOC_ENUM_FMT: result = v4lconvert_enum_fmt(devices[index].convert, arg); break; @@ -727,7 +741,7 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, req); if (result < 0) break; - result = 0; // some drivers return the number of buffers on success + result = 0; /* some drivers return the number of buffers on success */ /* If we got more frames then we can handle lie to the app */ if (req->count > V4L2_MAX_NO_FRAMES) -- cgit v1.2.3 From 6a8ad167499697788706490f42f2f192efb62718 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Tue, 29 Jul 2008 23:43:20 +0200 Subject: libv4l: proper accounting of mmap count of fake mmap buffers From: Hans de Goede libv4l: proper accounting of mmap count of fake mmap buffers Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h | 9 ++------- v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 31 ++++++++++++++++------------- 2 files changed, 19 insertions(+), 21 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h b/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h index 203dcffaf..fb6f9718e 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h @@ -88,13 +88,8 @@ struct v4l2_dev_info { unsigned char *frame_pointers[V4L2_MAX_NO_FRAMES]; int frame_sizes[V4L2_MAX_NO_FRAMES]; int frame_queued; /* 1 status bit per frame */ - /* mapping tracking of our fake (converting mmap) frame buffers, todo this - perfect we should use a map counter per frame, this is a good - approximation but there are scenarios thinkable where this doesn't work. - However no normal application not even a buggy one is likely to exhibit - the patterns needed to fail this somewhat simplified tracking */ - int frame_mapped; /* 1 status bit per frame */ - int frame_map_count; /* total number of maps of (fake) buffers combined */ + /* mapping tracking of our fake (converting mmap) frame buffers */ + unsigned char frame_map_count[V4L2_MAX_NO_FRAMES]; }; /* From log.c */ diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index 930ef5f1e..9754ea516 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -435,10 +435,9 @@ int v4l2_fd_open(int fd, int v4l2_flags) devices[index].convert_mmap_buf = MAP_FAILED; for (i = 0; i < V4L2_MAX_NO_FRAMES; i++) { devices[index].frame_pointers[i] = MAP_FAILED; + devices[index].frame_map_count[i] = 0; } devices[index].frame_queued = 0; - devices[index].frame_mapped = 0; - devices[index].frame_map_count = 0; if (index >= devices_used) devices_used = index + 1; @@ -470,7 +469,7 @@ static int v4l2_get_index(int fd) int v4l2_close(int fd) { - int index, result; + int index, result, i; if ((index = v4l2_get_index(fd)) == -1) return syscall(SYS_close, fd); @@ -489,11 +488,12 @@ int v4l2_close(int fd) v4l2_unmap_buffers(index); v4lconvert_destroy(devices[index].convert); if (devices[index].convert_mmap_buf != MAP_FAILED) { - if (devices[index].frame_mapped || devices[index].frame_map_count) - V4L2_LOG( - "v4l2 mmap buffers still mapped on close(), mask: %08x, count: %d\n", - (unsigned int)devices[index].frame_mapped, - devices[index].frame_map_count); + for (i = 0; i < V4L2_MAX_NO_FRAMES; i++) + if (devices[index].frame_map_count[i]) + break; + + if (i != V4L2_MAX_NO_FRAMES) + V4L2_LOG("v4l2 mmap buffers still mapped on close()\n"); else syscall(SYS_munmap, devices[index].convert_mmap_buf, devices[index].no_frames * V4L2_FRAME_BUF_SIZE); @@ -704,6 +704,7 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) case VIDIOC_REQBUFS: { + int i; struct v4l2_requestbuffers *req = arg; /* Don't allow mixing read / mmap io, either we control the buffers @@ -716,7 +717,11 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) } /* Are any of our fake (convert_mmap_buf) buffers still mapped ? */ - if (devices[index].frame_mapped || devices[index].frame_map_count) { + for (i = 0; i < V4L2_MAX_NO_FRAMES; i++) + if (devices[index].frame_map_count[i]) + break; + + if (i != V4L2_MAX_NO_FRAMES) { errno = EBUSY; result = -1; break; @@ -960,8 +965,7 @@ void *v4l2_mmap(void *start, size_t length, int prot, int flags, int fd, } } - devices[index].frame_mapped |= 1 << buffer_index; - devices[index].frame_map_count++; + devices[index].frame_map_count[buffer_index]++; result = devices[index].convert_mmap_buf + buffer_index * V4L2_FRAME_BUF_SIZE; @@ -1002,9 +1006,8 @@ int v4l2_munmap(void *_start, size_t length) start >= devices[index].convert_mmap_buf && (start - devices[index].convert_mmap_buf) % length == 0 && buffer_index < devices[index].no_frames) { - devices[index].frame_mapped &= ~(1 << buffer_index); - if (devices[index].frame_map_count > 0) - devices[index].frame_map_count--; + if (devices[index].frame_map_count[buffer_index] > 0) + devices[index].frame_map_count[buffer_index]--; unmapped = 1; } -- cgit v1.2.3 From 9370e86c842c65ba5d1508825a32cf192256bcb2 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Tue, 29 Jul 2008 23:56:08 +0200 Subject: libv4l: query buffer: indicate the mapping state of our (fake) buffer in the flags From: Hans de Goede libv4l: query buffer: indicate the mapping state of our (fake) buffer in the flags Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 1 + v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 9 +++++++++ 2 files changed, 10 insertions(+) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index b54ab92f4..8dabf5361 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -5,6 +5,7 @@ libv4l-0.3.8 * check capabilities for streaming, if the driver cannot do streaming don't insert ourselves between the application and the driver * intercept get capabilites and report read capability (which we always offer) +* query buffer: indicate the mapping state of our (fake) buffer in the flags libv4l-0.3.7 diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index 9754ea516..f71d176b5 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -773,6 +773,10 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) buf->m.offset = V4L2_MMAP_OFFSET_MAGIC | buf->index; buf->length = V4L2_FRAME_BUF_SIZE; + if (devices[index].frame_map_count[buf->index]) + buf->flags |= V4L2_BUF_FLAG_MAPPED; + else + buf->flags &= ~V4L2_BUF_FLAG_MAPPED; } break; @@ -832,7 +836,12 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) } buf->bytesused = result; + buf->m.offset = V4L2_MMAP_OFFSET_MAGIC | buf->index; buf->length = V4L2_FRAME_BUF_SIZE; + if (devices[index].frame_map_count[buf->index]) + buf->flags |= V4L2_BUF_FLAG_MAPPED; + else + buf->flags &= ~V4L2_BUF_FLAG_MAPPED; result = 0; } -- cgit v1.2.3 From feec7dd735a92d1d390cc0669f879e2b6d36389e Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Wed, 30 Jul 2008 20:05:21 -0700 Subject: libv4l: silence the creation of pkg-config files Signed-off-by: Brandon Philips --- v4l2-apps/lib/libv4l/libv4l1/Makefile | 16 ++++++++-------- v4l2-apps/lib/libv4l/libv4l2/Makefile | 16 ++++++++-------- v4l2-apps/lib/libv4l/libv4lconvert/Makefile | 16 ++++++++-------- 3 files changed, 24 insertions(+), 24 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4l1/Makefile b/v4l2-apps/lib/libv4l/libv4l1/Makefile index 4e9206bf6..1f82fef10 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l1/Makefile @@ -35,14 +35,14 @@ $(V4L1_LIB): $(V4L1_OBJS) $(V4L1COMPAT): $(V4L1COMPAT_O) $(V4L1_LIB) libv4l1.pc: - echo prefix=$(PREFIX) > libv4l1.pc - echo libdir=$(LIBDIR) >> libv4l1.pc - echo >> libv4l1.pc - echo 'Name: libv4l1' >> libv4l1.pc - echo 'Description: v4l1 compatibility library' >> libv4l1.pc - echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l1.pc - echo 'Libs: -L$${libdir} -lv4l1' >> libv4l1.pc - echo 'Cflags: -I$${prefix}/include' >> libv4l1.pc + @echo prefix=$(PREFIX) > libv4l1.pc + @echo libdir=$(LIBDIR) >> libv4l1.pc + @echo >> libv4l1.pc + @echo 'Name: libv4l1' >> libv4l1.pc + @echo 'Description: v4l1 compatibility library' >> libv4l1.pc + @echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l1.pc + @echo 'Libs: -L$${libdir} -lv4l1' >> libv4l1.pc + @echo 'Cflags: -I$${prefix}/include' >> libv4l1.pc install: all mkdir -p $(DESTDIR)$(PREFIX)/include diff --git a/v4l2-apps/lib/libv4l/libv4l2/Makefile b/v4l2-apps/lib/libv4l/libv4l2/Makefile index 0e63eae71..8e5ba1f82 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l2/Makefile @@ -34,14 +34,14 @@ $(V4L2_LIB): $(V4L2_OBJS) $(V4L2CONVERT): $(V4L2CONVERT_O) $(V4L2_LIB) libv4l2.pc: - echo prefix=$(PREFIX) > libv4l2.pc - echo libdir=$(LIBDIR) >> libv4l2.pc - echo >> libv4l2.pc - echo 'Name: libv4l2' >> libv4l2.pc - echo 'Description: v4l2 device access library' >> libv4l2.pc - echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l2.pc - echo 'Libs: -L$${libdir} -lv4l2' >> libv4l2.pc - echo 'Cflags: -I$${prefix}/include' >> libv4l2.pc + @echo prefix=$(PREFIX) > libv4l2.pc + @echo libdir=$(LIBDIR) >> libv4l2.pc + @echo >> libv4l2.pc + @echo 'Name: libv4l2' >> libv4l2.pc + @echo 'Description: v4l2 device access library' >> libv4l2.pc + @echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l2.pc + @echo 'Libs: -L$${libdir} -lv4l2' >> libv4l2.pc + @echo 'Cflags: -I$${prefix}/include' >> libv4l2.pc install: all mkdir -p $(DESTDIR)$(PREFIX)/include diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/Makefile b/v4l2-apps/lib/libv4l/libv4lconvert/Makefile index 3fd561f4e..014692ed6 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/Makefile +++ b/v4l2-apps/lib/libv4l/libv4lconvert/Makefile @@ -31,14 +31,14 @@ all: $(TARGETS) $(CONVERT_LIB): $(CONVERT_OBJS) libv4lconvert.pc: - echo prefix=$(PREFIX) > libv4lconvert.pc - echo libdir=$(LIBDIR) >> libv4lconvert.pc - echo >> libv4lconvert.pc - echo 'Name: libv4lconvert' >> libv4lconvert.pc - echo 'Description: v4l format conversion library' >> libv4lconvert.pc - echo 'Version: '$(V4L2_LIB_VERSION) >> libv4lconvert.pc - echo 'Libs: -L$${libdir} -lv4lconvert' >> libv4lconvert.pc - echo 'Cflags: -I$${prefix}/include' >> libv4lconvert.pc + @echo prefix=$(PREFIX) > libv4lconvert.pc + @echo libdir=$(LIBDIR) >> libv4lconvert.pc + @echo >> libv4lconvert.pc + @echo 'Name: libv4lconvert' >> libv4lconvert.pc + @echo 'Description: v4l format conversion library' >> libv4lconvert.pc + @echo 'Version: '$(V4L2_LIB_VERSION) >> libv4lconvert.pc + @echo 'Libs: -L$${libdir} -lv4lconvert' >> libv4lconvert.pc + @echo 'Cflags: -I$${prefix}/include' >> libv4lconvert.pc install: all mkdir -p $(DESTDIR)$(PREFIX)/include -- cgit v1.2.3 From a9cbfb5bdc82fdb04c1023f3a4bc1f5bd4a6a4a8 Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Wed, 30 Jul 2008 20:07:58 -0700 Subject: libv4l: add /dev/v4l/ to the paths supported by open() override Signed-off-by: Brandon Philips --- v4l2-apps/lib/libv4l/libv4l1/libv4l1.c | 14 +++++++------- v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 12 ++++++------ v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c b/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c index b80fcb56d..80d2fa09b 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c +++ b/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c @@ -28,12 +28,12 @@ capture only devices, or non v4l2 devices. 2) libv4l1 is the base of the v4l1compat.so wrapper lib, which is a .so which can be LD_PRELOAD-ed and the overrules the libc's open/close/etc, - and when opening /dev/videoX calls v4l1_open. Because we behave as the - regular counterpart when the fd is not known (instead of say throwing - an error), v4l1compat.so can simply call the v4l1_ prefixed function - for all wrapped functions. This way the wrapper does not have to keep - track of which fd's are being handled by libv4l1, as libv4l1 already - keeps track of this itself. + and when opening /dev/videoX or /dev/v4l/ calls v4l1_open. Because we + behave as the regular counterpart when the fd is not known (instead of + say throwing an error), v4l1compat.so can simply call the v4l1_ prefixed + function for all wrapped functions. This way the wrapper does not have + to keep track of which fd's are being handled by libv4l1, as libv4l1 + already keeps track of this itself. This also means that libv4l1 may not use any of the regular functions it mimics, as for example open could be a symbol in v4l1compat.so, which @@ -279,7 +279,7 @@ int v4l1_open (const char *file, int oflag, ...) return fd; /* check if we're opening a video4linux2 device */ - if (strncmp(file, "/dev/video", 10)) + if (strncmp(file, "/dev/video", 10) && strncmp(file, "/dev/v4l/", 9)) return fd; /* check that this is an v4l2 device, no need to emulate v4l1 on diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index f71d176b5..174c05b36 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -35,12 +35,12 @@ capture devices. 2) libv4l2 is the base of the v4l2convert.so wrapper lib, which is a .so which can be LD_PRELOAD-ed and the overrules the libc's open/close/etc, - and when opening /dev/videoX calls v4l2_open. Because we behave as the - regular counterpart when the fd is not known (instead of say throwing - an error), v4l2convert.so can simply call the v4l2_ prefixed function - for all wrapped functions (except for v4l2_open which will fail when not - called on a v4l2 device). This way the wrapper does not have to keep - track of which fd's are being handled by libv4l2, as libv4l2 already + and when opening /dev/videoX or /dev/v4l/ calls v4l2_open. Because we + behave as the regular counterpart when the fd is not known (instead of say + throwing an error), v4l2convert.so can simply call the v4l2_ prefixed + function for all wrapped functions (except for v4l2_open which will fail + when not called on a v4l2 device). This way the wrapper does not have to + keep track of which fd's are being handled by libv4l2, as libv4l2 already keeps track of this itself. This also means that libv4l2 may not use any of the regular functions diff --git a/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c b/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c index 7db1ca6d6..7b64bc018 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c +++ b/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c @@ -66,7 +66,7 @@ int open (const char *file, int oflag, ...) return fd; /* check if we're opening a video4linux2 device */ - if (strncmp(file, "/dev/video", 10)) + if (strncmp(file, "/dev/video", 10) && strncmp(file, "/dev/v4l/", 9)) return fd; /* check that this is an v4l2 device, libv4l2 only supports v4l2 devices */ -- cgit v1.2.3 From 474932fcb19fc298b8786e737bd1ae5115c9a6d2 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Thu, 31 Jul 2008 09:37:27 +0200 Subject: libv4l: fixup copyright headers From: Brandon Philips Part of the copyright headers refered GPL instead of LGPL due to a copy and paste error (Brandon Philips) Signed-off-by: Brandon Philips Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 9 +++++++++ v4l2-apps/lib/libv4l/Makefile | 2 +- v4l2-apps/lib/libv4l/README | 2 +- v4l2-apps/lib/libv4l/libv4l1/libv4l1-priv.h | 2 +- v4l2-apps/lib/libv4l/libv4l1/log.c | 2 +- v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c | 2 +- v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h | 4 ++-- v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 4 ++-- v4l2-apps/lib/libv4l/libv4l2/log.c | 4 ++-- v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c | 4 ++-- v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h | 2 +- v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c | 2 +- v4l2-apps/lib/libv4l/libv4lconvert/pac207.c | 2 +- v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c | 2 +- v4l2-apps/lib/libv4l/libv4lconvert/sn9c10x.c | 2 +- v4l2-apps/lib/libv4l/libv4lconvert/spca501.c | 2 +- v4l2-apps/lib/libv4l/libv4lconvert/spca561-decompress.c | 2 +- 17 files changed, 29 insertions(+), 20 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 8dabf5361..a405fc62b 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -1,3 +1,12 @@ +libv4l-0.3.9 +------------ +* Not only see /dev/video* but also /dev/v4l/* as video devices + (only affects libv4l1 and the wrappers) patch from Brandon Philips +* Silence the creation of the .pc files in the Makefiles (Brandon Philips) +* Part of the copyright headers refered GPL instead of LGPL due to a copy + and paste error (Brandon Philips) + + libv4l-0.3.8 ------------ * work around wrong REQUEST_BUFFERS ioctl return code from certain drivers diff --git a/v4l2-apps/lib/libv4l/Makefile b/v4l2-apps/lib/libv4l/Makefile index ee6d555c3..aabf67835 100644 --- a/v4l2-apps/lib/libv4l/Makefile +++ b/v4l2-apps/lib/libv4l/Makefile @@ -1,5 +1,5 @@ LIB_RELEASE=0 -V4L2_LIB_VERSION=$(LIB_RELEASE).3.8 +V4L2_LIB_VERSION=$(LIB_RELEASE).3.9 all clean install: $(MAKE) -C libv4lconvert V4L2_LIB_VERSION=$(V4L2_LIB_VERSION) $@ diff --git a/v4l2-apps/lib/libv4l/README b/v4l2-apps/lib/libv4l/README index b9b056f66..3a2059224 100644 --- a/v4l2-apps/lib/libv4l/README +++ b/v4l2-apps/lib/libv4l/README @@ -6,7 +6,7 @@ top of video4linux2 devices. The purpose of this (thin) layer is to make it easy for application writers to support a wide variety of devices without having to write seperate code for different devices in the same class. -All libv4l components are licensed under the GNU Library General Publishing +All libv4l components are licensed under the GNU Lesser General Public License version 2 or (at your option) any later version. libv4l consists of 3 different libraries: diff --git a/v4l2-apps/lib/libv4l/libv4l1/libv4l1-priv.h b/v4l2-apps/lib/libv4l/libv4l1/libv4l1-priv.h index e09041256..651599255 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/libv4l1-priv.h +++ b/v4l2-apps/lib/libv4l/libv4l1/libv4l1-priv.h @@ -9,7 +9,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4l1/log.c b/v4l2-apps/lib/libv4l/libv4l1/log.c index 178c6d23c..cccc3e6d0 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/log.c +++ b/v4l2-apps/lib/libv4l/libv4l1/log.c @@ -9,7 +9,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c b/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c index db3a0027b..5da13fcf5 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c +++ b/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c @@ -12,7 +12,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h b/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h index fb6f9718e..d9e73b612 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h @@ -8,8 +8,8 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index 174c05b36..a16e4801d 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -8,8 +8,8 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4l2/log.c b/v4l2-apps/lib/libv4l/libv4l2/log.c index 982a185c6..42051ea46 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/log.c +++ b/v4l2-apps/lib/libv4l/libv4l2/log.c @@ -8,8 +8,8 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c b/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c index 7b64bc018..e30fb307c 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c +++ b/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c @@ -12,8 +12,8 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h index 3148065f3..90d8f2bdb 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h @@ -9,7 +9,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c index 3d61225b9..2bbc44bd6 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c @@ -9,7 +9,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/pac207.c b/v4l2-apps/lib/libv4l/libv4lconvert/pac207.c index 085d7a772..4887c25ee 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/pac207.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/pac207.c @@ -12,7 +12,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c b/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c index 79c8ecb35..388e64111 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c @@ -12,7 +12,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/sn9c10x.c b/v4l2-apps/lib/libv4l/libv4lconvert/sn9c10x.c index b23ad4630..98a513378 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/sn9c10x.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/sn9c10x.c @@ -10,7 +10,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c b/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c index 1e54cb7bb..9157629e3 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/spca501.c @@ -9,7 +9,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/spca561-decompress.c b/v4l2-apps/lib/libv4l/libv4lconvert/spca561-decompress.c index 40b0f90db..802345af0 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/spca561-decompress.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/spca561-decompress.c @@ -10,7 +10,7 @@ # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software -- cgit v1.2.3 From f07be0b40ae3cbb2ae809d5f4151782f68eabb42 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 11:42:57 +0200 Subject: libv4l: make xawtv happy From: Hans de Goede Be more relaxed in our checks for mixing read and mmap access, we were being more strict in this then certain kernel drivers (bttv) making xawtv unhappy Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 6 + v4l2-apps/lib/libv4l/Makefile | 2 +- v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h | 3 - v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 237 +++++++++++++++------------- v4l2-apps/lib/libv4l/libv4l2/log.c | 8 + 5 files changed, 145 insertions(+), 111 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index a405fc62b..37620001a 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -1,3 +1,9 @@ +libv4l-0.4.0 +------------ +* Be more relaxed in our checks for mixing read and mmap access, we were + being more strict in this then certain kernel drivers (bttv) making xawtv + unhappy + libv4l-0.3.9 ------------ * Not only see /dev/video* but also /dev/v4l/* as video devices diff --git a/v4l2-apps/lib/libv4l/Makefile b/v4l2-apps/lib/libv4l/Makefile index aabf67835..7f8867cd9 100644 --- a/v4l2-apps/lib/libv4l/Makefile +++ b/v4l2-apps/lib/libv4l/Makefile @@ -1,5 +1,5 @@ LIB_RELEASE=0 -V4L2_LIB_VERSION=$(LIB_RELEASE).3.9 +V4L2_LIB_VERSION=$(LIB_RELEASE).4.0 all clean install: $(MAKE) -C libv4lconvert V4L2_LIB_VERSION=$(V4L2_LIB_VERSION) $@ diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h b/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h index d9e73b612..8724832e1 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2-priv.h @@ -68,8 +68,6 @@ #define MIN(a,b) (((a)<(b))?(a):(b)) -enum v4l2_io { v4l2_io_none, v4l2_io_read, v4l2_io_mmap }; - struct v4l2_dev_info { int fd; int flags; @@ -81,7 +79,6 @@ struct v4l2_dev_info { pthread_mutex_t stream_lock; unsigned int no_frames; unsigned int nreadbuffers; - enum v4l2_io io; struct v4lconvert_data *convert; unsigned char *convert_mmap_buf; /* Frame bookkeeping is only done when in read or mmap-conversion mode */ diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index a16e4801d..2a0dd4837 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -72,7 +72,9 @@ /* Note these flags are stored together with the flags passed to v4l2_fd_open() in v4l2_dev_info's flags member, so care should be taken that the do not use the same bits! */ -#define V4L2_STREAMON 0x0100 +#define V4L2_STREAMON 0x0100 +#define V4L2_BUFFERS_REQUESTED_BY_READ 0x0200 +#define V4L2_STREAM_CONTROLLED_BY_READ 0x0400 #define V4L2_MMAP_OFFSET_MAGIC 0xABCDEF00u @@ -89,52 +91,46 @@ static int v4l2_request_read_buffers(int index) int result; struct v4l2_requestbuffers req; - /* No-op if already done */ - if (devices[index].no_frames) - return 0; - - /* Request buffers */ - req.count = devices[index].nreadbuffers; + /* Note we re-request the buffers if they are already requested as the format + and thus the needed buffersize may have changed. */ + req.count = (devices[index].no_frames)? devices[index].no_frames: + devices[index].nreadbuffers; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req)) < 0){ int saved_err = errno; - V4L2_LOG_ERR("requesting buffers: %s\n", strerror(errno)); + V4L2_LOG_ERR("requesting %u buffers: %s\n", req.count, strerror(errno)); errno = saved_err; return result; } + if (!devices[index].no_frames && req.count) + devices[index].flags |= V4L2_BUFFERS_REQUESTED_BY_READ; + devices[index].no_frames = MIN(req.count, V4L2_MAX_NO_FRAMES); return 0; } -static int v4l2_unrequest_read_buffers(int index) +static void v4l2_unrequest_read_buffers(int index) { int result; struct v4l2_requestbuffers req; - /* No-op of already done */ - if (devices[index].no_frames == 0) - return 0; + if (!(devices[index].flags & V4L2_BUFFERS_REQUESTED_BY_READ) || + devices[index].no_frames == 0) + return; - /* (Un)Request buffers */ + /* (Un)Request buffers, note not all driver support this, and those + who do not support it don't need it. */ req.count = 0; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; - if ((result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req)) < 0) { - int saved_err = errno; - V4L2_LOG_ERR("unrequesting buffers: %s\n", strerror(errno)); - errno = saved_err; - return result; - } + if(syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, &req) < 0) + return; devices[index].no_frames = MIN(req.count, V4L2_MAX_NO_FRAMES); - if (devices[index].no_frames) { - V4L2_LOG_ERR("number of buffers > 0 after requesting 0 buffers\n"); - errno = EBUSY; - return -1; - } - return 0; + if (devices[index].no_frames == 0) + devices[index].flags &= ~V4L2_BUFFERS_REQUESTED_BY_READ; } static int v4l2_map_buffers(int index) @@ -159,7 +155,7 @@ static int v4l2_map_buffers(int index) } devices[index].frame_pointers[i] = (void *)syscall(SYS_mmap2, NULL, - (size_t)buf.length, PROT_READ, MAP_SHARED, devices[index].fd, + (size_t)buf.length, PROT_READ|PROT_WRITE, MAP_SHARED, devices[index].fd, (__off_t)(buf.m.offset >> MMAP2_PAGE_SHIFT)); if (devices[index].frame_pointers[i] == MAP_FAILED) { int saved_err = errno; @@ -241,6 +237,7 @@ static int v4l2_queue_read_buffer(int index, int buffer_index) if (devices[index].frame_queued & (1 << buffer_index)) return 0; + memset(&buf, 0, sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = buffer_index; @@ -310,6 +307,8 @@ static int v4l2_activate_read_stream(int index) if ((result = v4l2_queue_read_buffers(index))) return result; + devices[index].flags |= V4L2_STREAM_CONTROLLED_BY_READ; + return result = v4l2_streamon(index); } @@ -324,12 +323,48 @@ static int v4l2_deactivate_read_stream(int index) v4l2_unmap_buffers(index); - if ((result = v4l2_unrequest_read_buffers(index))) - return result; + v4l2_unrequest_read_buffers(index); + + devices[index].flags &= ~V4L2_STREAM_CONTROLLED_BY_READ; return 0; } +static int v4l2_buffers_mapped(int index) +{ + unsigned int i; + + if (devices[index].src_fmt.fmt.pix.pixelformat == + devices[index].dest_fmt.fmt.pix.pixelformat) { + /* Normal (no conversion) mode */ + struct v4l2_buffer buf; + + for (i = 0; i < devices[index].no_frames; i++) { + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + buf.index = i; + if (syscall(SYS_ioctl, devices[index].fd, VIDIOC_QUERYBUF, &buf)) { + int saved_err = errno; + V4L2_LOG_ERR("querying buffer %u: %s\n", i, strerror(errno)); + errno = saved_err; + break; + } + if (buf.flags & V4L2_BUF_FLAG_MAPPED) + break; + } + } else { + /* Conversion mode */ + for (i = 0; i < devices[index].no_frames; i++) + if (devices[index].frame_map_count[i]) + break; + } + + if (i != devices[index].no_frames) + V4L2_LOG("v4l2_buffers_mapped(): buffers still mapped\n"); + + return i != devices[index].no_frames; +} + int v4l2_open (const char *file, int oflag, ...) { @@ -430,7 +465,6 @@ int v4l2_fd_open(int fd, int v4l2_flags) devices[index].no_frames = 0; devices[index].nreadbuffers = V4L2_DEFAULT_NREADBUFFERS; - devices[index].io = v4l2_io_none; devices[index].convert = convert; devices[index].convert_mmap_buf = MAP_FAILED; for (i = 0; i < V4L2_MAX_NO_FRAMES; i++) { @@ -469,7 +503,7 @@ static int v4l2_get_index(int fd) int v4l2_close(int fd) { - int index, result, i; + int index, result; if ((index = v4l2_get_index(fd)) == -1) return syscall(SYS_close, fd); @@ -488,12 +522,8 @@ int v4l2_close(int fd) v4l2_unmap_buffers(index); v4lconvert_destroy(devices[index].convert); if (devices[index].convert_mmap_buf != MAP_FAILED) { - for (i = 0; i < V4L2_MAX_NO_FRAMES; i++) - if (devices[index].frame_map_count[i]) - break; - - if (i != V4L2_MAX_NO_FRAMES) - V4L2_LOG("v4l2 mmap buffers still mapped on close()\n"); + if (v4l2_buffers_mapped(index)) + V4L2_LOG_WARN("v4l2 mmap buffers still mapped on close()\n"); else syscall(SYS_munmap, devices[index].convert_mmap_buf, devices[index].no_frames * V4L2_FRAME_BUF_SIZE); @@ -528,6 +558,34 @@ int v4l2_dup(int fd) return fd; } +static int v4l2_check_buffer_change_ok(int index) +{ + v4l2_unmap_buffers(index); + + /* Check if the app itself still is using the stream */ + if (v4l2_buffers_mapped(index) || + (!(devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ) && + ((devices[index].flags & V4L2_STREAMON) || + devices[index].frame_queued))) { + V4L2_LOG("v4l2_check_buffer_change_ok(): stream busy\n"); + errno = EBUSY; + return -1; + } + + /* We may change from convert to non conversion mode and + v4l2_unrequest_read_buffers may change the no_frames, so free the + convert mmap buffer */ + syscall(SYS_munmap, devices[index].convert_mmap_buf, + devices[index].no_frames * V4L2_FRAME_BUF_SIZE); + devices[index].convert_mmap_buf = MAP_FAILED; + + if (devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ) { + V4L2_LOG("deactivating read-stream for settings change\n"); + return v4l2_deactivate_read_stream(index); + } + + return 0; +} int v4l2_ioctl (int fd, unsigned long int request, ...) { @@ -636,17 +694,6 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) break; } - /* Don't allow changing the format when mmap-ed IO is active, we could - allow this to happen in certain special circumstances, but it is - best to consistently deny this so that application developers do not - go expect this to work, because in their test setup it happens to - work. This also keeps the code much saner. */ - if (devices[index].io == v4l2_io_mmap) { - errno = EBUSY; - result = -1; - break; - } - if (devices[index].flags & V4L2_DISABLE_CONVERSION) { result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_TRY_FMT, dest_fmt); @@ -667,16 +714,8 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) break; } - if (devices[index].io == v4l2_io_read) { - V4L2_LOG("deactivating read-stream for format change\n"); - if ((result = v4l2_deactivate_read_stream(index))) { - /* Undo what we've done to leave things in a consisten state */ - if (v4l2_activate_read_stream(index)) - V4L2_LOG_ERR( - "reactivating stream after deactivate failure (AAIIEEEE)\n"); - break; - } - } + if ((result = v4l2_check_buffer_change_ok(index))) + break; result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_S_FMT, &src_fmt); if (result) { @@ -707,26 +746,6 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) int i; struct v4l2_requestbuffers *req = arg; - /* Don't allow mixing read / mmap io, either we control the buffers - (read based io), or the app does */ - if (devices[index].io == v4l2_io_read) { - V4L2_LOG_ERR("to change from read io to mmap io open and close the device first!\n"); - errno = EBUSY; - result = -1; - break; - } - - /* Are any of our fake (convert_mmap_buf) buffers still mapped ? */ - for (i = 0; i < V4L2_MAX_NO_FRAMES; i++) - if (devices[index].frame_map_count[i]) - break; - - if (i != V4L2_MAX_NO_FRAMES) { - errno = EBUSY; - result = -1; - break; - } - /* IMPROVEME (maybe?) add support for userptr's? */ if (req->memory != V4L2_MEMORY_MMAP) { errno = EINVAL; @@ -734,30 +753,20 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) break; } + if ((result = v4l2_check_buffer_change_ok(index))) + break; + /* No more buffers then we can manage please */ if (req->count > V4L2_MAX_NO_FRAMES) req->count = V4L2_MAX_NO_FRAMES; - /* Stop stream and unmap our real mapping of the buffers - (only relevant when we're converting, otherwise a no-op) */ - v4l2_streamoff(index); - v4l2_unmap_buffers(index); - result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_REQBUFS, req); if (result < 0) break; result = 0; /* some drivers return the number of buffers on success */ - /* If we got more frames then we can handle lie to the app */ - if (req->count > V4L2_MAX_NO_FRAMES) - req->count = V4L2_MAX_NO_FRAMES; - - /* Force reallocation of convert_mmap_buf to fit the new no_frames */ - syscall(SYS_munmap, devices[index].convert_mmap_buf, - devices[index].no_frames * V4L2_FRAME_BUF_SIZE); - devices[index].convert_mmap_buf = MAP_FAILED; - devices[index].no_frames = req->count; - devices[index].io = req->count? v4l2_io_mmap:v4l2_io_none; + devices[index].no_frames = MIN(req->count, V4L2_MAX_NO_FRAMES); + devices[index].flags &= ~V4L2_BUFFERS_REQUESTED_BY_READ; } break; @@ -765,6 +774,10 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) { struct v4l2_buffer *buf = arg; + if (devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ) + if ((result = v4l2_deactivate_read_stream(index))) + break; + /* Do a real query even when converting to let the driver fill in things like buf->field */ result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QUERYBUF, buf); @@ -781,6 +794,10 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) break; case VIDIOC_QBUF: + if (devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ) + if ((result = v4l2_deactivate_read_stream(index))) + break; + result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QBUF, arg); break; @@ -788,6 +805,10 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) { struct v4l2_buffer *buf = arg; + if (devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ) + if ((result = v4l2_deactivate_read_stream(index))) + break; + result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_DQBUF, buf); if (result) { V4L2_LOG_ERR("dequeing buffer: %s\n", strerror(errno)); @@ -849,11 +870,9 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) case VIDIOC_STREAMON: case VIDIOC_STREAMOFF: - if (devices[index].io != v4l2_io_mmap) { - errno = EINVAL; - result = -1; - break; - } + if (devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ) + if ((result = v4l2_deactivate_read_stream(index))) + break; if (request == VIDIOC_STREAMON) result = v4l2_streamon(index); @@ -886,22 +905,27 @@ ssize_t v4l2_read (int fd, void* buffer, size_t n) pthread_mutex_lock(&devices[index].stream_lock); - if (devices[index].io == v4l2_io_mmap) { - V4L2_LOG_ERR("to change from mmap io to read io first do request_buffers with a count of 0\n"); - errno = EBUSY; - result = -1; - goto leave; + if (!(devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ)) { + if ((devices[index].flags & V4L2_STREAMON) || + devices[index].frame_queued) { + errno = EBUSY; + result = -1; + goto leave; + } + if ((result = v4l2_activate_read_stream(index))) + goto leave; } - devices[index].io = v4l2_io_read; - - if ((result = v4l2_activate_read_stream(index))) - goto leave; if ((frame_index = v4l2_dequeue_read_buffer(index, &bytesused)) < 0) { result = -1; goto leave; } + /* ensure buffers are mapped before using them (they could have been + unmapped by a s_fmt ioctl) */ + if ((result = v4l2_map_buffers(index))) + goto leave; + result = v4lconvert_convert(devices[index].convert, &devices[index].src_fmt, &devices[index].dest_fmt, devices[index].frame_pointers[frame_index], bytesused, @@ -948,7 +972,6 @@ void *v4l2_mmap(void *start, size_t length, int prot, int flags, int fd, buffer_index = offset & 0xff; if (buffer_index >= devices[index].no_frames || - devices[index].io != v4l2_io_mmap || /* Got magic offset and not converting ?? */ devices[index].src_fmt.fmt.pix.pixelformat == devices[index].dest_fmt.fmt.pix.pixelformat) { diff --git a/v4l2-apps/lib/libv4l/libv4l2/log.c b/v4l2-apps/lib/libv4l/libv4l2/log.c index 42051ea46..05f6c46d7 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/log.c +++ b/v4l2-apps/lib/libv4l/libv4l2/log.c @@ -131,6 +131,14 @@ void v4l2_log_ioctl(unsigned long int request, void *arg, int result) } } break; + case VIDIOC_REQBUFS: + { + struct v4l2_requestbuffers *req = arg; + + fprintf(v4l2_log_file, " count: %u type: %d memory: %d\n", + req->count, req->type, req->memory); + } + break; } fprintf(v4l2_log_file, "result == %d\n", result); -- cgit v1.2.3 From d0280d4d77c5f7dd211cc827284347828e260ab9 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 12:43:49 +0200 Subject: libv4l: add support for converting to rgb24 From: Jean-Francois Moine Add support for conversion to RGB24 (before we only support BGR24) based on a patch by Jean-Francois Moine Signed-off-by: Jean-Francois Moine Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 2 + v4l2-apps/lib/libv4l/libv4lconvert/bayer.c | 30 +++++++--- .../lib/libv4l/libv4lconvert/libv4lconvert-priv.h | 6 ++ v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c | 69 +++++++++++++++++----- v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c | 47 +++++++++++++++ 5 files changed, 132 insertions(+), 22 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 37620001a..efa501f56 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -3,6 +3,8 @@ libv4l-0.4.0 * Be more relaxed in our checks for mixing read and mmap access, we were being more strict in this then certain kernel drivers (bttv) making xawtv unhappy +* Add support for conversion to RGB24 (before we only support BGR24) based + on a patch by Jean-Francois Moine libv4l-0.3.9 ------------ diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/bayer.c b/v4l2-apps/lib/libv4l/libv4lconvert/bayer.c index 166c13011..ca7bb486f 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/bayer.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/bayer.c @@ -163,14 +163,10 @@ static void v4lconvert_border_bayer_line_to_bgr24( } /* From libdc1394, which on turn was based on OpenCV's Bayer decoding */ -void v4lconvert_bayer_to_bgr24(const unsigned char *bayer, - unsigned char *bgr, int width, int height, unsigned int pixfmt) +static void bayer_to_rgbbgr24(const unsigned char *bayer, + unsigned char *bgr, int width, int height, unsigned int pixfmt, + int start_with_green, int blue_line) { - int blue_line = pixfmt == V4L2_PIX_FMT_SBGGR8 - || pixfmt == V4L2_PIX_FMT_SGBRG8; - int start_with_green = pixfmt == V4L2_PIX_FMT_SGBRG8 - || pixfmt == V4L2_PIX_FMT_SGRBG8; - /* render the first line */ v4lconvert_border_bayer_line_to_bgr24(bayer, bayer + width, bgr, width, start_with_green, blue_line); @@ -317,6 +313,26 @@ void v4lconvert_bayer_to_bgr24(const unsigned char *bayer, !start_with_green, !blue_line); } +void v4lconvert_bayer_to_rgb24(const unsigned char *bayer, + unsigned char *bgr, int width, int height, unsigned int pixfmt) +{ + bayer_to_rgbbgr24(bayer, bgr, width, height, pixfmt, + pixfmt == V4L2_PIX_FMT_SGBRG8 /* start with green */ + || pixfmt == V4L2_PIX_FMT_SGRBG8, + pixfmt != V4L2_PIX_FMT_SBGGR8 /* blue line */ + && pixfmt != V4L2_PIX_FMT_SGBRG8); +} + +void v4lconvert_bayer_to_bgr24(const unsigned char *bayer, + unsigned char *bgr, int width, int height, unsigned int pixfmt) +{ + bayer_to_rgbbgr24(bayer, bgr, width, height, pixfmt, + pixfmt == V4L2_PIX_FMT_SGBRG8 /* start with green */ + || pixfmt == V4L2_PIX_FMT_SGRBG8, + pixfmt == V4L2_PIX_FMT_SBGGR8 /* blue line */ + || pixfmt == V4L2_PIX_FMT_SGBRG8); +} + static void v4lconvert_border_bayer_line_to_y( const unsigned char* bayer, const unsigned char* adjacent_bayer, unsigned char *y, int width, int start_with_green, int blue_line) diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h index 90d8f2bdb..a85121cad 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h @@ -71,6 +71,9 @@ struct v4lconvert_data { }; +void v4lconvert_yuv420_to_rgb24(const unsigned char *src, unsigned char *dst, + int width, int height); + void v4lconvert_yuv420_to_bgr24(const unsigned char *src, unsigned char *dst, int width, int height); @@ -92,6 +95,9 @@ void v4lconvert_decode_sn9c10x(const unsigned char *src, unsigned char *dst, void v4lconvert_decode_pac207(const unsigned char *src, unsigned char *dst, int width, int height); +void v4lconvert_bayer_to_rgb24(const unsigned char *bayer, + unsigned char *rgb, int width, int height, unsigned int pixfmt); + void v4lconvert_bayer_to_bgr24(const unsigned char *bayer, unsigned char *rgb, int width, int height, unsigned int pixfmt); diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c index 2bbc44bd6..ffde7e1e8 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c @@ -30,6 +30,7 @@ /* Note for proper functioning of v4lconvert_enum_fmt the first entries in supported_src_pixfmts must match with the entries in supported_dst_pixfmts */ #define SUPPORTED_DST_PIXFMTS \ + V4L2_PIX_FMT_RGB24, \ V4L2_PIX_FMT_BGR24, \ V4L2_PIX_FMT_YUV420 @@ -191,6 +192,7 @@ int v4lconvert_try_format(struct v4lconvert_data *data, if (closest_fmt.fmt.pix.pixelformat != desired_pixfmt) { dest_fmt->fmt.pix.pixelformat = desired_pixfmt; switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24: dest_fmt->fmt.pix.bytesperline = dest_fmt->fmt.pix.width * 3; dest_fmt->fmt.pix.sizeimage = dest_fmt->fmt.pix.width * @@ -228,6 +230,7 @@ int v4lconvert_convert(struct v4lconvert_data *data, /* sanity check, is the dest buffer large enough? */ switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24: needed = dest_fmt->fmt.pix.width * dest_fmt->fmt.pix.height * 3; break; @@ -283,12 +286,19 @@ int v4lconvert_convert(struct v4lconvert_data *data, components[2] = components[1] + (dest_fmt->fmt.pix.width * dest_fmt->fmt.pix.height) / 4; - if (dest_fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_BGR24) { + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: + tinyjpeg_set_components(data->jdec, components, 1); + result = tinyjpeg_decode(data->jdec, TINYJPEG_FMT_RGB24); + break; + case V4L2_PIX_FMT_BGR24: tinyjpeg_set_components(data->jdec, components, 1); result = tinyjpeg_decode(data->jdec, TINYJPEG_FMT_BGR24); - } else { + break; + default: tinyjpeg_set_components(data->jdec, components, 3); result = tinyjpeg_decode(data->jdec, TINYJPEG_FMT_YUV420P); + break; } /* If the JPEG header checked out ok and we get an error during actual @@ -304,12 +314,20 @@ int v4lconvert_convert(struct v4lconvert_data *data, case V4L2_PIX_FMT_SGBRG8: case V4L2_PIX_FMT_SGRBG8: case V4L2_PIX_FMT_SRGGB8: - if (dest_fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_BGR24) + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: + v4lconvert_bayer_to_rgb24(src, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height, src_fmt->fmt.pix.pixelformat); + break; + case V4L2_PIX_FMT_BGR24: v4lconvert_bayer_to_bgr24(src, dest, dest_fmt->fmt.pix.width, dest_fmt->fmt.pix.height, src_fmt->fmt.pix.pixelformat); - else + break; + default: v4lconvert_bayer_to_yuv420(src, dest, dest_fmt->fmt.pix.width, dest_fmt->fmt.pix.height, src_fmt->fmt.pix.pixelformat); + break; + } break; /* YUYV line by line formats */ @@ -319,8 +337,8 @@ int v4lconvert_convert(struct v4lconvert_data *data, { unsigned char tmpbuf[dest_fmt->fmt.pix.width * dest_fmt->fmt.pix.height * 3 / 2]; - unsigned char *my_dst = (dest_fmt->fmt.pix.pixelformat == - V4L2_PIX_FMT_BGR24) ? tmpbuf : dest; + unsigned char *my_dst = (dest_fmt->fmt.pix.pixelformat != + V4L2_PIX_FMT_YUV420) ? tmpbuf : dest; switch (src_fmt->fmt.pix.pixelformat) { case V4L2_PIX_FMT_SPCA501: @@ -337,10 +355,16 @@ int v4lconvert_convert(struct v4lconvert_data *data, break; } - if (dest_fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_BGR24) + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: + v4lconvert_yuv420_to_rgb24(tmpbuf, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + case V4L2_PIX_FMT_BGR24: v4lconvert_yuv420_to_bgr24(tmpbuf, dest, dest_fmt->fmt.pix.width, dest_fmt->fmt.pix.height); - + break; + } break; } @@ -370,24 +394,39 @@ int v4lconvert_convert(struct v4lconvert_data *data, break; } - if (dest_fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_BGR24) + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: + v4lconvert_bayer_to_rgb24(tmpbuf, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height, bayer_fmt); + break; + case V4L2_PIX_FMT_BGR24: v4lconvert_bayer_to_bgr24(tmpbuf, dest, dest_fmt->fmt.pix.width, dest_fmt->fmt.pix.height, bayer_fmt); - else + break; + default: v4lconvert_bayer_to_yuv420(tmpbuf, dest, dest_fmt->fmt.pix.width, dest_fmt->fmt.pix.height, bayer_fmt); + break; + } break; } + case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24: - /* dest must be V4L2_PIX_FMT_YUV420 then */ - printf("FIXME add bgr24 -> yuv420 conversion\n"); + printf("FIXME add rgb24/bgr24 -> yuv420 conversion\n"); break; case V4L2_PIX_FMT_YUV420: - /* dest must be V4L2_PIX_FMT_BGR24 then */ - v4lconvert_yuv420_to_bgr24(src, dest, dest_fmt->fmt.pix.width, - dest_fmt->fmt.pix.height); + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: + v4lconvert_yuv420_to_rgb24(src, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + case V4L2_PIX_FMT_BGR24: + v4lconvert_yuv420_to_bgr24(src, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + } break; default: diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c b/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c index 388e64111..bda4cc342 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c @@ -80,3 +80,50 @@ void v4lconvert_yuv420_to_bgr24(const unsigned char *src, unsigned char *dest, } } } + +void v4lconvert_yuv420_to_rgb24(const unsigned char *src, unsigned char *dest, + int width, int height) +{ + int i,j; + + const unsigned char *ysrc = src; + const unsigned char *usrc = src + width * height; + const unsigned char *vsrc = usrc + (width * height) / 4; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j += 2) { +#if 1 /* fast slightly less accurate multiplication free code */ + int u1 = (((*usrc - 128) << 7) + (*usrc - 128)) >> 6; + int rg = (((*usrc - 128) << 1) + (*usrc - 128) + + ((*vsrc - 128) << 2) + ((*vsrc - 128) << 1)) >> 3; + int v1 = (((*vsrc - 128) << 1) + (*vsrc - 128)) >> 1; + + *dest++ = CLIP(*ysrc + v1); + *dest++ = CLIP(*ysrc - rg); + *dest++ = CLIP(*ysrc + u1); + ysrc++; + + *dest++ = CLIP(*ysrc + v1); + *dest++ = CLIP(*ysrc - rg); + *dest++ = CLIP(*ysrc + u1); +#else + *dest++ = YUV2R(*ysrc, *usrc, *vsrc); + *dest++ = YUV2G(*ysrc, *usrc, *vsrc); + *dest++ = YUV2B(*ysrc, *usrc, *vsrc); + ysrc++; + + *dest++ = YUV2R(*ysrc, *usrc, *vsrc); + *dest++ = YUV2G(*ysrc, *usrc, *vsrc); + *dest++ = YUV2B(*ysrc, *usrc, *vsrc); +#endif + ysrc++; + usrc++; + vsrc++; + } + /* Rewind u and v for next line */ + if (i&1) { + usrc -= width / 2; + vsrc -= width / 2; + } + } +} -- cgit v1.2.3 From 1d60339ee5ca9a861de510dc4c57576ec9f2e5be Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 13:15:46 +0200 Subject: libv4l: makefile and pkgconfig improvements From: Gregor Jasny Various Makefile and pkgconfig file improvements by Gregor Jasny (Debian) Signed-off-by: Gregor Jasny Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 4 +++- v4l2-apps/lib/libv4l/libv4l1/Makefile | 36 ++++++++++++++++++++--------- v4l2-apps/lib/libv4l/libv4l2/Makefile | 36 ++++++++++++++++++++--------- v4l2-apps/lib/libv4l/libv4lconvert/Makefile | 25 +++++++++++++------- 4 files changed, 70 insertions(+), 31 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index efa501f56..45c9cca63 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -3,8 +3,10 @@ libv4l-0.4.0 * Be more relaxed in our checks for mixing read and mmap access, we were being more strict in this then certain kernel drivers (bttv) making xawtv unhappy -* Add support for conversion to RGB24 (before we only support BGR24) based +* Add support for conversion to RGB24 (before we only supported BGR24) based on a patch by Jean-Francois Moine +* Various Makefile and pkgconfig file improvements by Gregor Jasny (Debian) + libv4l-0.3.9 ------------ diff --git a/v4l2-apps/lib/libv4l/libv4l1/Makefile b/v4l2-apps/lib/libv4l/libv4l1/Makefile index 1f82fef10..bedd4391f 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l1/Makefile @@ -1,20 +1,23 @@ -CC = gcc -LD = gcc - -CPPFLAGS = -fPIC -I../include -I../../../../linux/include +CPPFLAGS = -I../include -I../../../../linux/include CFLAGS := -g -O1 CFLAGS += -Wall -W -Wno-unused -Wpointer-arith -Wstrict-prototypes -LDFLAGS = -shared - -V4L1_OBJS = libv4l1.o log.o ../libv4l2/libv4l2.so -V4L1_LIB = libv4l1.so +V4L1_OBJS = libv4l1.o log.o V4L1COMPAT = v4l1compat.so V4L1COMPAT_O = v4l1compat.o libv4l1.so -TARGETS = $(V4L1_LIB) $(V4L1COMPAT) libv4l1.pc +TARGETS = $(V4L1_LIB) libv4l1.pc INCLUDES = ../include/libv4l1.h +ifeq ($(LINKTYPE),static) +V4L1_LIB = libv4l1.a +else +V4L1_LIB = libv4l1.so +V4L1_OBJS += ../libv4l2/libv4l2.so +TARGETS += $(V4L1COMPAT) +CPPFLAGS += -fPIC +endif + ifeq ($(LIB_RELEASE),) LIB_RELEASE = 0 endif @@ -41,27 +44,38 @@ libv4l1.pc: @echo 'Name: libv4l1' >> libv4l1.pc @echo 'Description: v4l1 compatibility library' >> libv4l1.pc @echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l1.pc + @echo 'Requires: libv4l2' >> libv4l1.pc @echo 'Libs: -L$${libdir} -lv4l1' >> libv4l1.pc + @echo 'Libs.private: -lpthread' >> libv4l1.pc @echo 'Cflags: -I$${prefix}/include' >> libv4l1.pc install: all mkdir -p $(DESTDIR)$(PREFIX)/include install -p -m 644 $(INCLUDES) $(DESTDIR)$(PREFIX)/include +ifeq ($(LINKTYPE),static) + mkdir -p $(DESTDIR)$(LIBDIR) + install -m 644 $(V4L1_LIB) $(DESTDIR)$(LIBDIR) +else mkdir -p $(DESTDIR)$(LIBDIR)/libv4l install -m 755 $(V4L1_LIB).$(LIB_RELEASE) $(DESTDIR)$(LIBDIR) cd $(DESTDIR)$(LIBDIR) && \ ln -f -s $(V4L1_LIB).$(LIB_RELEASE) $(V4L1_LIB) install -m 755 $(V4L1COMPAT).$(LIB_RELEASE) \ $(DESTDIR)$(LIBDIR)/libv4l/$(V4L1COMPAT) +endif mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig install -m 644 libv4l1.pc $(DESTDIR)$(LIBDIR)/pkgconfig clean:: - rm -f *.so* *.o *.d libv4l1.pc log *~ + rm -f *.a *.so* *.o *.d libv4l1.pc log *~ %.o: %.c $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< %.so: - $(CC) $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ + $(CC) -shared $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ ln -f -s $@.$(LIB_RELEASE) $@ + +%.a: + $(AR) cqs $@ $^ + diff --git a/v4l2-apps/lib/libv4l/libv4l2/Makefile b/v4l2-apps/lib/libv4l/libv4l2/Makefile index 8e5ba1f82..38449b44d 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l2/Makefile @@ -1,20 +1,23 @@ -CC = gcc -LD = gcc - -CPPFLAGS = -fPIC -I../include -I../../../../linux/include +CPPFLAGS = -I../include -I../../../../linux/include CFLAGS := -g -O1 CFLAGS += -Wall -W -Wno-unused -Wpointer-arith -Wstrict-prototypes -LDFLAGS = -shared - -V4L2_OBJS = libv4l2.o log.o ../libv4lconvert/libv4lconvert.so -V4L2_LIB = libv4l2.so +V4L2_OBJS = libv4l2.o log.o V4L2CONVERT = v4l2convert.so V4L2CONVERT_O = v4l2convert.o libv4l2.so -TARGETS = $(V4L2_LIB) $(V4L2CONVERT) libv4l2.pc +TARGETS = $(V4L2_LIB) libv4l2.pc INCLUDES = ../include/libv4l2.h +ifeq ($(LINKTYPE),static) +V4L2_LIB = libv4l2.a +else +V4L2_LIB = libv4l2.so +V4L2_OBJS += ../libv4lconvert/libv4lconvert.so +TARGETS += $(V4L2CONVERT) +CPPFLAGS += -fPIC +endif + ifeq ($(LIB_RELEASE),) LIB_RELEASE = 0 endif @@ -40,27 +43,38 @@ libv4l2.pc: @echo 'Name: libv4l2' >> libv4l2.pc @echo 'Description: v4l2 device access library' >> libv4l2.pc @echo 'Version: '$(V4L2_LIB_VERSION) >> libv4l2.pc + @echo 'Requires: libv4lconvert' >> libv4l2.pc @echo 'Libs: -L$${libdir} -lv4l2' >> libv4l2.pc + @echo 'Libs.private: -lpthread' >> libv4l2.pc @echo 'Cflags: -I$${prefix}/include' >> libv4l2.pc install: all mkdir -p $(DESTDIR)$(PREFIX)/include install -p -m 644 $(INCLUDES) $(DESTDIR)$(PREFIX)/include +ifeq ($(LINKTYPE),static) + mkdir -p $(DESTDIR)$(LIBDIR) + install -m 644 $(V4L2_LIB) $(DESTDIR)$(LIBDIR) +else mkdir -p $(DESTDIR)$(LIBDIR)/libv4l install -m 755 $(V4L2_LIB).$(LIB_RELEASE) $(DESTDIR)$(LIBDIR) cd $(DESTDIR)$(LIBDIR) && \ ln -f -s $(V4L2_LIB).$(LIB_RELEASE) $(V4L2_LIB) install -m 755 $(V4L2CONVERT).$(LIB_RELEASE) \ $(DESTDIR)$(LIBDIR)/libv4l/$(V4L2CONVERT) +endif mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig install -m 644 libv4l2.pc $(DESTDIR)$(LIBDIR)/pkgconfig clean:: - rm -f *.so* *.o *.d libv4l2.pc log *~ + rm -f *.a *.so* *.o *.d libv4l2.pc log *~ %.o: %.c $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< %.so: - $(CC) $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ + $(CC) -shared $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ ln -f -s $@.$(LIB_RELEASE) $@ + +%.a: + $(AR) cqs $@ $^ + diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/Makefile b/v4l2-apps/lib/libv4l/libv4lconvert/Makefile index 014692ed6..c2a5be942 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/Makefile +++ b/v4l2-apps/lib/libv4l/libv4lconvert/Makefile @@ -1,14 +1,15 @@ -CC = gcc -LD = gcc - -CPPFLAGS = -fPIC -I../include -I../../../../linux/include +CPPFLAGS = -I../include -I../../../../linux/include CFLAGS := -g -O1 CFLAGS += -Wall -W -Wno-unused -Wpointer-arith -Wstrict-prototypes -LDFLAGS = -shared - +ifeq ($(LINKTYPE),static) +CONVERT_LIB = libv4lconvert.a +else CONVERT_LIB = libv4lconvert.so +CPPFLAGS += -fPIC +endif + CONVERT_OBJS = libv4lconvert.o tinyjpeg.o sn9c10x.o pac207.o \ jidctflt.o spca561-decompress.o rgbyuv.o spca501.o bayer.o TARGETS = $(CONVERT_LIB) libv4lconvert.pc @@ -44,18 +45,26 @@ install: all mkdir -p $(DESTDIR)$(PREFIX)/include install -p -m 644 $(INCLUDES) $(DESTDIR)$(PREFIX)/include mkdir -p $(DESTDIR)$(LIBDIR) +ifeq ($(LINKTYPE),static) + mkdir -p $(DESTDIR)$(LIBDIR) + install -m 644 $(CONVERT_LIB) $(DESTDIR)$(LIBDIR) +else install -m 755 $(CONVERT_LIB).$(LIB_RELEASE) $(DESTDIR)$(LIBDIR) cd $(DESTDIR)$(LIBDIR) && \ ln -f -s $(CONVERT_LIB).$(LIB_RELEASE) $(CONVERT_LIB) +endif mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig install -m 644 libv4lconvert.pc $(DESTDIR)$(LIBDIR)/pkgconfig clean:: - rm -f *.so* *.o *.d libv4lconvert.pc log *~ + rm -f *.a *.so* *.o *.d libv4lconvert.pc log *~ %.o: %.c $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< %.so: - $(CC) $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ + $(CC) -shared $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ ln -f -s $@.$(LIB_RELEASE) $@ + +%.a: + $(AR) cqs $@ $^ -- cgit v1.2.3 From 3dbcf4e987933e8e41ff496e76223f457a7609e5 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 13:21:19 +0200 Subject: libv4l: link against pthread From: Hans de Goede libv4l: link against pthread Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/libv4l1/Makefile | 4 +++- v4l2-apps/lib/libv4l/libv4l2/Makefile | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4l1/Makefile b/v4l2-apps/lib/libv4l/libv4l1/Makefile index bedd4391f..c92731daa 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l1/Makefile @@ -3,6 +3,8 @@ CPPFLAGS = -I../include -I../../../../linux/include CFLAGS := -g -O1 CFLAGS += -Wall -W -Wno-unused -Wpointer-arith -Wstrict-prototypes +LIBS = -lpthread + V4L1_OBJS = libv4l1.o log.o V4L1COMPAT = v4l1compat.so V4L1COMPAT_O = v4l1compat.o libv4l1.so @@ -73,7 +75,7 @@ clean:: $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< %.so: - $(CC) -shared $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ + $(CC) -shared $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ $(LIBS) ln -f -s $@.$(LIB_RELEASE) $@ %.a: diff --git a/v4l2-apps/lib/libv4l/libv4l2/Makefile b/v4l2-apps/lib/libv4l/libv4l2/Makefile index 38449b44d..d8ac01c34 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/Makefile +++ b/v4l2-apps/lib/libv4l/libv4l2/Makefile @@ -3,6 +3,8 @@ CPPFLAGS = -I../include -I../../../../linux/include CFLAGS := -g -O1 CFLAGS += -Wall -W -Wno-unused -Wpointer-arith -Wstrict-prototypes +LIBS = -lpthread + V4L2_OBJS = libv4l2.o log.o V4L2CONVERT = v4l2convert.so V4L2CONVERT_O = v4l2convert.o libv4l2.so @@ -72,7 +74,7 @@ clean:: $(CC) -c -MMD $(CPPFLAGS) $(CFLAGS) -o $@ $< %.so: - $(CC) -shared $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ + $(CC) -shared $(LDFLAGS) -Wl,-soname,$@.$(LIB_RELEASE) -o $@.$(LIB_RELEASE) $^ $(LIBS) ln -f -s $@.$(LIB_RELEASE) $@ %.a: -- cgit v1.2.3 From bad01ca943742b5a2938b3718abc8590a0f3929d Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 14:35:38 +0200 Subject: libv4l: mpa buffers before queuing From: Hans de Goede With some drivers the buffers must be mapped before queuing, so when converting map the (real) buffers before calling the qbuf ioctl Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 2 ++ v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 5 +++++ 2 files changed, 7 insertions(+) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 45c9cca63..cdd29fac8 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -3,6 +3,8 @@ libv4l-0.4.0 * Be more relaxed in our checks for mixing read and mmap access, we were being more strict in this then certain kernel drivers (bttv) making xawtv unhappy +* With some drivers the buffers must be mapped before queuing, so when + converting map the (real) buffers before calling the qbuf ioctl * Add support for conversion to RGB24 (before we only supported BGR24) based on a patch by Jean-Francois Moine * Various Makefile and pkgconfig file improvements by Gregor Jasny (Debian) diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index 2a0dd4837..d6a8a6d2a 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -798,6 +798,11 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) if ((result = v4l2_deactivate_read_stream(index))) break; + /* With some drivers the buffers must be mapped before queuing */ + if (converting) + if ((result = v4l2_map_buffers(index))) + break; + result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QBUF, arg); break; -- cgit v1.2.3 From b373ec3cc6f05fec60f972d8b42ddcd0f2d1c29a Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 16:53:49 +0200 Subject: libv4l: prefer native formats From: Hans de Goede When the hardware supports a format natively prefer using the native version over converting from another supported format Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 2 ++ v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index cdd29fac8..498b816de 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -7,6 +7,8 @@ libv4l-0.4.0 converting map the (real) buffers before calling the qbuf ioctl * Add support for conversion to RGB24 (before we only supported BGR24) based on a patch by Jean-Francois Moine +* When the hardware supports a format natively prefer using the native + version over converting from another supported format * Various Makefile and pkgconfig file improvements by Gregor Jasny (Debian) diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c index ffde7e1e8..e19b2f05b 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c @@ -171,7 +171,9 @@ int v4lconvert_try_format(struct v4lconvert_data *data, (int)dest_fmt->fmt.pix.height); unsigned int size_diff = size_x_diff * size_x_diff + size_y_diff * size_y_diff; - if (size_diff < closest_fmt_size_diff) { + if (size_diff < closest_fmt_size_diff || + (size_diff == closest_fmt_size_diff && + try_fmt.fmt.pix.pixelformat == desired_pixfmt)) { closest_fmt_size_diff = size_diff; closest_fmt = try_fmt; } -- cgit v1.2.3 From 6d0c45027f9fe1891269de296adab0af9a21d214 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 17:15:12 +0200 Subject: libv4l: add rgb24 <-> bgr24 conversion From: Hans de Goede libv4l: add rgb24 <-> bgr24 conversion Signed-off-by: Hans de Goede --- .../lib/libv4l/libv4lconvert/libv4lconvert-priv.h | 3 +++ v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c | 20 +++++++++++++++++++- v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c | 15 +++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h index a85121cad..bdf847186 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert-priv.h @@ -77,6 +77,9 @@ void v4lconvert_yuv420_to_rgb24(const unsigned char *src, unsigned char *dst, void v4lconvert_yuv420_to_bgr24(const unsigned char *src, unsigned char *dst, int width, int height); +void v4lconvert_swap_rgb(const unsigned char *src, unsigned char *dst, + int width, int height); + void v4lconvert_spca501_to_yuv420(const unsigned char *src, unsigned char *dst, int width, int height); diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c index e19b2f05b..4c9e67d52 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/libv4lconvert.c @@ -414,8 +414,26 @@ int v4lconvert_convert(struct v4lconvert_data *data, } case V4L2_PIX_FMT_RGB24: + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_BGR24: + v4lconvert_swap_rgb(src, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + case V4L2_PIX_FMT_YUV420: + printf("FIXME add rgb24 -> yuv420 conversion\n"); + break; + } + break; case V4L2_PIX_FMT_BGR24: - printf("FIXME add rgb24/bgr24 -> yuv420 conversion\n"); + switch (dest_fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_RGB24: + v4lconvert_swap_rgb(src, dest, dest_fmt->fmt.pix.width, + dest_fmt->fmt.pix.height); + break; + case V4L2_PIX_FMT_YUV420: + printf("FIXME add bgr24 -> yuv420 conversion\n"); + break; + } break; case V4L2_PIX_FMT_YUV420: diff --git a/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c b/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c index bda4cc342..742dd06ce 100644 --- a/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c +++ b/v4l2-apps/lib/libv4l/libv4lconvert/rgbyuv.c @@ -127,3 +127,18 @@ void v4lconvert_yuv420_to_rgb24(const unsigned char *src, unsigned char *dest, } } } + +void v4lconvert_swap_rgb(const unsigned char *src, unsigned char *dst, + int width, int height) +{ + int i; + + for (i = 0; i < (width * height); i++) { + unsigned char tmp0, tmp1; + tmp0 = *src++; + tmp1 = *src++; + *dst++ = *src++; + *dst++ = tmp1; + *dst++ = tmp0; + } +} -- cgit v1.2.3 From df421cfab31f2e14c35ff11186ed75c32d01f575 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 18:36:50 +0200 Subject: libv4l: drop appl-patches From: Hans de Goede Drop the appl-patches dir, all application patches are now available and tracked here: http://linuxtv.org/v4lwiki/index.php/Libv4l_Progress Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 2 + .../libv4l/appl-patches/camorama-0.19-fixes.patch | 90 ------ .../appl-patches/kdenetwork-4.0.85-kopete.patch | 12 - .../libv4l/appl-patches/vlc-0.8.6-libv4l1.patch | 319 --------------------- .../lib/libv4l/appl-patches/xawtv-3.95-fixes.patch | 29 -- 5 files changed, 2 insertions(+), 450 deletions(-) delete mode 100644 v4l2-apps/lib/libv4l/appl-patches/camorama-0.19-fixes.patch delete mode 100644 v4l2-apps/lib/libv4l/appl-patches/kdenetwork-4.0.85-kopete.patch delete mode 100644 v4l2-apps/lib/libv4l/appl-patches/vlc-0.8.6-libv4l1.patch delete mode 100644 v4l2-apps/lib/libv4l/appl-patches/xawtv-3.95-fixes.patch (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 498b816de..675019bd2 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -10,6 +10,8 @@ libv4l-0.4.0 * When the hardware supports a format natively prefer using the native version over converting from another supported format * Various Makefile and pkgconfig file improvements by Gregor Jasny (Debian) +* Drop the appl-patches dir, all application patches are now available and + tracked here: http://linuxtv.org/v4lwiki/index.php/Libv4l_Progress libv4l-0.3.9 diff --git a/v4l2-apps/lib/libv4l/appl-patches/camorama-0.19-fixes.patch b/v4l2-apps/lib/libv4l/appl-patches/camorama-0.19-fixes.patch deleted file mode 100644 index 1e1333575..000000000 --- a/v4l2-apps/lib/libv4l/appl-patches/camorama-0.19-fixes.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- camorama-0.19/src/callbacks.c 2007-09-16 15:36:55.000000000 +0200 -+++ camorama-0.19.new/src/callbacks.c 2008-06-29 22:22:44.000000000 +0200 -@@ -387,9 +387,6 @@ - } - } - -- cam->pixmap = gdk_pixmap_new (NULL, cam->x, cam->y, cam->desk_depth); -- gtk_widget_set_size_request (glade_xml_get_widget (cam->xml, "da"), -- cam->x, cam->y); - - /* - * if(cam->read == FALSE) { -@@ -441,6 +438,11 @@ - * * } - */ - get_win_info (cam); -+ -+ cam->pixmap = gdk_pixmap_new (NULL, cam->x, cam->y, cam->desk_depth); -+ gtk_widget_set_size_request (glade_xml_get_widget (cam->xml, "da"), -+ cam->x, cam->y); -+ - frame = 0; - gtk_window_resize (GTK_WINDOW - (glade_xml_get_widget (cam->xml, "main_window")), 320, -@@ -520,8 +522,14 @@ - gtk_widget_show (about); - } - -+void -+camorama_filter_color_filter(void* filter, guchar *image, int x, int y, int depth); -+ - static void - apply_filters(cam* cam) { -+ /* v4l has reverse rgb order from what camora expect so call the color -+ filter to fix things up before running the user selected filters */ -+ camorama_filter_color_filter(NULL, cam->pic_buf, cam->x, cam->y, cam->depth); - camorama_filter_chain_apply(cam->filter_chain, cam->pic_buf, cam->x, cam->y, cam->depth); - #warning "FIXME: enable the threshold channel filter" - // if((effect_mask & CAMORAMA_FILTER_THRESHOLD_CHANNEL) != 0) ---- camorama-0.19/src/filter.c 2007-09-16 14:48:50.000000000 +0200 -+++ camorama-0.19.new/src/filter.c 2008-06-29 22:11:42.000000000 +0200 -@@ -151,12 +151,12 @@ - static void - camorama_filter_color_init(CamoramaFilterColor* self) {} - --static void -+void - camorama_filter_color_filter(CamoramaFilterColor* filter, guchar *image, int x, int y, int depth) { - int i; - char tmp; - i = x * y; -- while (--i) { -+ while (i--) { - tmp = image[0]; - image[0] = image[2]; - image[2] = tmp; ---- camorama-0.19/src/main.c 2007-09-16 15:36:55.000000000 +0200 -+++ camorama-0.19.new/src/main.c 2008-06-29 22:20:04.000000000 +0200 -@@ -224,8 +224,7 @@ - - /* get picture attributes */ - get_pic_info (cam); --// set_pic_info(cam); -- /* set_pic_info(cam); */ -+ set_pic_info (cam); - cam->contrast = cam->vid_pic.contrast; - cam->brightness = cam->vid_pic.brightness; - cam->colour = cam->vid_pic.colour; ---- camorama-0.19/src/v4l.c 2007-09-16 14:48:05.000000000 +0200 -+++ camorama-0.19.new/src/v4l.c 2008-06-29 22:20:23.000000000 +0200 -@@ -158,8 +158,8 @@ - if(cam->debug) { - g_message("SET PIC"); - } -- //cam->vid_pic.palette = VIDEO_PALETTE_RGB24; -- //cam->vid_pic.depth = 24; -+ cam->vid_pic.palette = VIDEO_PALETTE_RGB24; -+ cam->vid_pic.depth = 24; - //cam->vid_pic.palette = VIDEO_PALETTE_YUV420P; - if(ioctl(cam->dev, VIDIOCSPICT, &cam->vid_pic) == -1) { - if(cam->debug) { -@@ -232,6 +232,8 @@ - exit(0); - } - -+ cam->x = cam->vid_win.width; -+ cam->y = cam->vid_win.height; - } - - void set_buffer(cam * cam) diff --git a/v4l2-apps/lib/libv4l/appl-patches/kdenetwork-4.0.85-kopete.patch b/v4l2-apps/lib/libv4l/appl-patches/kdenetwork-4.0.85-kopete.patch deleted file mode 100644 index b187f05e4..000000000 --- a/v4l2-apps/lib/libv4l/appl-patches/kdenetwork-4.0.85-kopete.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up kdenetwork-4.0.85/kopete/libkopete/avdevice/videodevice.cpp~ kdenetwork-4.0.85/kopete/libkopete/avdevice/videodevice.cpp ---- kdenetwork-4.0.85/kopete/libkopete/avdevice/videodevice.cpp~ 2008-07-07 22:40:56.000000000 +0200 -+++ kdenetwork-4.0.85/kopete/libkopete/avdevice/videodevice.cpp 2008-07-07 22:40:56.000000000 +0200 -@@ -679,6 +679,8 @@ kDebug() << "VIDIOC_S_FMT worked (" << e - if (fmt.fmt.pix.sizeimage < min) - fmt.fmt.pix.sizeimage = min; - m_buffer_size=fmt.fmt.pix.sizeimage ; -+ currentwidth = fmt.fmt.pix.width; -+ currentheight = fmt.fmt.pix.height; - } - break; - #endif diff --git a/v4l2-apps/lib/libv4l/appl-patches/vlc-0.8.6-libv4l1.patch b/v4l2-apps/lib/libv4l/appl-patches/vlc-0.8.6-libv4l1.patch deleted file mode 100644 index 132549b55..000000000 --- a/v4l2-apps/lib/libv4l/appl-patches/vlc-0.8.6-libv4l1.patch +++ /dev/null @@ -1,319 +0,0 @@ -diff -up vlc-0.8.6f/modules/access/v4l/Makefile.am~ vlc-0.8.6f/modules/access/v4l/Makefile.am ---- vlc-0.8.6f/modules/access/v4l/Makefile.am~ 2008-06-29 17:14:11.000000000 +0200 -+++ vlc-0.8.6f/modules/access/v4l/Makefile.am 2008-06-29 17:16:39.000000000 +0200 -@@ -100,7 +100,7 @@ libv4l_plugin_la_CXXFLAGS = `$(VLC_CONFI - libv4l_plugin_la_OBJCFLAGS = `$(VLC_CONFIG) --objcflags plugin v4l` - libv4l_plugin_la_LDFLAGS = `$(VLC_CONFIG) --libs plugin v4l` \ - -rpath '$(libvlcdir)' -avoid-version -module -shrext $(LIBEXT) --libv4l_plugin_la_LIBADD = $(LTLIBVLC) -+libv4l_plugin_la_LIBADD = $(LTLIBVLC) -lv4l1 - - libv4l_a_SOURCES = $(SOURCES_v4l) - libv4l_builtin_la_SOURCES = $(SOURCES_v4l) -diff -up vlc-0.8.6f/modules/access/v4l/Makefile.in~ vlc-0.8.6f/modules/access/v4l/Makefile.in ---- vlc-0.8.6f/modules/access/v4l/Makefile.in~ 2008-06-29 17:16:22.000000000 +0200 -+++ vlc-0.8.6f/modules/access/v4l/Makefile.in 2008-06-29 17:16:42.000000000 +0200 -@@ -390,7 +390,7 @@ libv4l_plugin_la_OBJCFLAGS = `$(VLC_CONF - libv4l_plugin_la_LDFLAGS = `$(VLC_CONFIG) --libs plugin v4l` \ - -rpath '$(libvlcdir)' -avoid-version -module -shrext $(LIBEXT) - --libv4l_plugin_la_LIBADD = $(LTLIBVLC) -+libv4l_plugin_la_LIBADD = $(LTLIBVLC) -lv4l1 - libv4l_a_SOURCES = $(SOURCES_v4l) - libv4l_builtin_la_SOURCES = $(SOURCES_v4l) - libv4l_a_CFLAGS = `$(VLC_CONFIG) --cflags builtin pic v4l` -diff -up vlc-0.8.6f/modules/access/v4l/v4l.c~ vlc-0.8.6f/modules/access/v4l/v4l.c ---- vlc-0.8.6f/modules/access/v4l/v4l.c~ 2008-06-29 17:13:30.000000000 +0200 -+++ vlc-0.8.6f/modules/access/v4l/v4l.c 2008-06-29 17:13:30.000000000 +0200 -@@ -64,6 +64,9 @@ - - #include - -+#include -+ -+ - /***************************************************************************** - * Module descriptior - *****************************************************************************/ -@@ -546,23 +549,23 @@ static void Close( vlc_object_t *p_this - if( p_sys->psz_device ) free( p_sys->psz_device ); - if( p_sys->psz_vdev ) free( p_sys->psz_vdev ); - if( p_sys->psz_adev ) free( p_sys->psz_adev ); -- if( p_sys->fd_video >= 0 ) close( p_sys->fd_video ); -+ if( p_sys->fd_video >= 0 ) v4l1_close( p_sys->fd_video ); - if( p_sys->fd_audio >= 0 ) close( p_sys->fd_audio ); - if( p_sys->p_block_audio ) block_Release( p_sys->p_block_audio ); - - if( p_sys->b_mjpeg ) - { - int i_noframe = -1; -- ioctl( p_sys->fd_video, MJPIOC_QBUF_CAPT, &i_noframe ); -+ v4l1_ioctl( p_sys->fd_video, MJPIOC_QBUF_CAPT, &i_noframe ); - } - - if( p_sys->p_video_mmap && p_sys->p_video_mmap != MAP_FAILED ) - { - if( p_sys->b_mjpeg ) -- munmap( p_sys->p_video_mmap, p_sys->mjpeg_buffers.size * -+ v4l1_munmap( p_sys->p_video_mmap, p_sys->mjpeg_buffers.size * - p_sys->mjpeg_buffers.count ); - else -- munmap( p_sys->p_video_mmap, p_sys->vid_mbuf.size ); -+ v4l1_munmap( p_sys->p_video_mmap, p_sys->vid_mbuf.size ); - } - - free( p_sys ); -@@ -875,13 +878,13 @@ static int OpenVideoDev( demux_t *p_demu - struct mjpeg_params mjpeg; - int i; - -- if( ( i_fd = open( psz_device, O_RDWR ) ) < 0 ) -+ if( ( i_fd = v4l1_open( psz_device, O_RDWR ) ) < 0 ) - { - msg_Err( p_demux, "cannot open device (%s)", strerror( errno ) ); - goto vdev_failed; - } - -- if( ioctl( i_fd, VIDIOCGCAP, &p_sys->vid_cap ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGCAP, &p_sys->vid_cap ) < 0 ) - { - msg_Err( p_demux, "cannot get capabilities (%s)", strerror( errno ) ); - goto vdev_failed; -@@ -926,7 +929,7 @@ static int OpenVideoDev( demux_t *p_demu - } - - vid_channel.channel = p_sys->i_channel; -- if( ioctl( i_fd, VIDIOCGCHAN, &vid_channel ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGCHAN, &vid_channel ) < 0 ) - { - msg_Err( p_demux, "cannot get channel infos (%s)", - strerror( errno ) ); -@@ -944,7 +947,7 @@ static int OpenVideoDev( demux_t *p_demu - } - - vid_channel.norm = p_sys->i_norm; -- if( ioctl( i_fd, VIDIOCSCHAN, &vid_channel ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCSCHAN, &vid_channel ) < 0 ) - { - msg_Err( p_demux, "cannot set channel (%s)", strerror( errno ) ); - goto vdev_failed; -@@ -959,7 +962,7 @@ static int OpenVideoDev( demux_t *p_demu - if( p_sys->i_tuner >= 0 ) - { - vid_tuner.tuner = p_sys->i_tuner; -- if( ioctl( i_fd, VIDIOCGTUNER, &vid_tuner ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGTUNER, &vid_tuner ) < 0 ) - { - msg_Err( p_demux, "cannot get tuner (%s)", strerror( errno ) ); - goto vdev_failed; -@@ -974,7 +977,7 @@ static int OpenVideoDev( demux_t *p_demu - - /* FIXME FIXME to be checked FIXME FIXME */ - //vid_tuner.mode = p_sys->i_norm; -- if( ioctl( i_fd, VIDIOCSTUNER, &vid_tuner ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCSTUNER, &vid_tuner ) < 0 ) - { - msg_Err( p_demux, "cannot set tuner (%s)", strerror( errno ) ); - goto vdev_failed; -@@ -990,7 +993,7 @@ static int OpenVideoDev( demux_t *p_demu - if( p_sys->i_frequency >= 0 ) - { - int driver_frequency = p_sys->i_frequency * 16 /1000; -- if( ioctl( i_fd, VIDIOCSFREQ, &driver_frequency ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCSFREQ, &driver_frequency ) < 0 ) - { - msg_Err( p_demux, "cannot set frequency (%s)", - strerror( errno ) ); -@@ -1010,7 +1013,7 @@ static int OpenVideoDev( demux_t *p_demu - if( p_sys->i_audio >= 0 ) - { - vid_audio.audio = p_sys->i_audio; -- if( ioctl( i_fd, VIDIOCGAUDIO, &vid_audio ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGAUDIO, &vid_audio ) < 0 ) - { - msg_Err( p_demux, "cannot get audio (%s)", strerror( errno ) ); - goto vdev_failed; -@@ -1019,7 +1022,7 @@ static int OpenVideoDev( demux_t *p_demu - /* unmute audio */ - vid_audio.flags &= ~VIDEO_AUDIO_MUTE; - -- if( ioctl( i_fd, VIDIOCSAUDIO, &vid_audio ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCSAUDIO, &vid_audio ) < 0 ) - { - msg_Err( p_demux, "cannot set audio (%s)", strerror( errno ) ); - goto vdev_failed; -@@ -1035,7 +1038,7 @@ static int OpenVideoDev( demux_t *p_demu - struct quicktime_mjpeg_app1 *p_app1; - int32_t i_offset; - -- if( ioctl( i_fd, MJPIOC_G_PARAMS, &mjpeg ) < 0 ) -+ if( v4l1_ioctl( i_fd, MJPIOC_G_PARAMS, &mjpeg ) < 0 ) - { - msg_Err( p_demux, "cannot get mjpeg params (%s)", - strerror( errno ) ); -@@ -1086,7 +1089,7 @@ static int OpenVideoDev( demux_t *p_demu - * optional. They will be present in the output. */ - mjpeg.jpeg_markers = JPEG_MARKER_DHT | JPEG_MARKER_DQT; - -- if( ioctl( i_fd, MJPIOC_S_PARAMS, &mjpeg ) < 0 ) -+ if( v4l1_ioctl( i_fd, MJPIOC_S_PARAMS, &mjpeg ) < 0 ) - { - msg_Err( p_demux, "cannot set mjpeg params (%s)", - strerror( errno ) ); -@@ -1103,7 +1106,7 @@ static int OpenVideoDev( demux_t *p_demu - { - struct video_window vid_win; - -- if( ioctl( i_fd, VIDIOCGWIN, &vid_win ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGWIN, &vid_win ) < 0 ) - { - msg_Err( p_demux, "cannot get win (%s)", strerror( errno ) ); - goto vdev_failed; -@@ -1130,7 +1133,7 @@ static int OpenVideoDev( demux_t *p_demu - if( !p_sys->b_mjpeg ) - { - /* set hue/color/.. */ -- if( ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 ) - { - struct video_picture vid_picture = p_sys->vid_picture; - -@@ -1150,7 +1153,7 @@ static int OpenVideoDev( demux_t *p_demu - { - vid_picture.contrast = p_sys->i_contrast; - } -- if( ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 ) - { - msg_Dbg( p_demux, "v4l device uses brightness: %d", - vid_picture.brightness ); -@@ -1164,7 +1167,7 @@ static int OpenVideoDev( demux_t *p_demu - } - - /* Find out video format used by device */ -- if( ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 ) - { - struct video_picture vid_picture = p_sys->vid_picture; - char *psz; -@@ -1191,7 +1194,7 @@ static int OpenVideoDev( demux_t *p_demu - free( psz ); - - if( vid_picture.palette && -- !ioctl( i_fd, VIDIOCSPICT, &vid_picture ) ) -+ !v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) ) - { - p_sys->vid_picture = vid_picture; - } -@@ -1199,14 +1202,14 @@ static int OpenVideoDev( demux_t *p_demu - { - /* Try to set the format to something easy to encode */ - vid_picture.palette = VIDEO_PALETTE_YUV420P; -- if( ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 ) - { - p_sys->vid_picture = vid_picture; - } - else - { - vid_picture.palette = VIDEO_PALETTE_YUV422P; -- if( ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 ) - { - p_sys->vid_picture = vid_picture; - } -@@ -1237,13 +1240,13 @@ static int OpenVideoDev( demux_t *p_demu - p_sys->mjpeg_buffers.count = 8; - p_sys->mjpeg_buffers.size = MJPEG_BUFFER_SIZE; - -- if( ioctl( i_fd, MJPIOC_REQBUFS, &p_sys->mjpeg_buffers ) < 0 ) -+ if( v4l1_ioctl( i_fd, MJPIOC_REQBUFS, &p_sys->mjpeg_buffers ) < 0 ) - { - msg_Err( p_demux, "mmap unsupported" ); - goto vdev_failed; - } - -- p_sys->p_video_mmap = mmap( 0, -+ p_sys->p_video_mmap = v4l1_mmap( 0, - p_sys->mjpeg_buffers.size * p_sys->mjpeg_buffers.count, - PROT_READ | PROT_WRITE, MAP_SHARED, i_fd, 0 ); - if( p_sys->p_video_mmap == MAP_FAILED ) -@@ -1258,7 +1261,7 @@ static int OpenVideoDev( demux_t *p_demu - /* queue up all the frames */ - for( i = 0; i < (int)p_sys->mjpeg_buffers.count; i++ ) - { -- if( ioctl( i_fd, MJPIOC_QBUF_CAPT, &i ) < 0 ) -+ if( v4l1_ioctl( i_fd, MJPIOC_QBUF_CAPT, &i ) < 0 ) - { - msg_Err( p_demux, "unable to queue frame" ); - goto vdev_failed; -@@ -1289,13 +1292,13 @@ static int OpenVideoDev( demux_t *p_demu - (char*)&p_sys->i_fourcc ); - - /* Allocate mmap buffer */ -- if( ioctl( i_fd, VIDIOCGMBUF, &p_sys->vid_mbuf ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCGMBUF, &p_sys->vid_mbuf ) < 0 ) - { - msg_Err( p_demux, "mmap unsupported" ); - goto vdev_failed; - } - -- p_sys->p_video_mmap = mmap( 0, p_sys->vid_mbuf.size, -+ p_sys->p_video_mmap = v4l1_mmap( 0, p_sys->vid_mbuf.size, - PROT_READ|PROT_WRITE, MAP_SHARED, - i_fd, 0 ); - if( p_sys->p_video_mmap == MAP_FAILED ) -@@ -1310,7 +1313,7 @@ static int OpenVideoDev( demux_t *p_demu - p_sys->vid_mmap.width = p_sys->i_width; - p_sys->vid_mmap.height = p_sys->i_height; - p_sys->vid_mmap.format = p_sys->vid_picture.palette; -- if( ioctl( i_fd, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 ) -+ if( v4l1_ioctl( i_fd, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 ) - { - msg_Warn( p_demux, "%4.4s refused", (char*)&p_sys->i_fourcc ); - msg_Err( p_demux, "chroma selection failed" ); -@@ -1321,7 +1324,7 @@ static int OpenVideoDev( demux_t *p_demu - - vdev_failed: - -- if( i_fd >= 0 ) close( i_fd ); -+ if( i_fd >= 0 ) v4l1_close( i_fd ); - return -1; - } - -@@ -1431,7 +1434,7 @@ static uint8_t *GrabCapture( demux_t *p_ - - p_sys->vid_mmap.frame = (p_sys->i_frame_pos + 1) % p_sys->vid_mbuf.frames; - -- while( ioctl( p_sys->fd_video, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 ) -+ while( v4l1_ioctl( p_sys->fd_video, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 ) - { - if( errno != EAGAIN ) - { -@@ -1447,7 +1450,7 @@ static uint8_t *GrabCapture( demux_t *p_ - msg_Dbg( p_demux, "grab failed, trying again" ); - } - -- while( ioctl(p_sys->fd_video, VIDIOCSYNC, &p_sys->i_frame_pos) < 0 ) -+ while( v4l1_ioctl(p_sys->fd_video, VIDIOCSYNC, &p_sys->i_frame_pos) < 0 ) - { - if( errno != EAGAIN && errno != EINTR ) - { -@@ -1473,7 +1476,7 @@ static uint8_t *GrabMJPEG( demux_t *p_de - /* re-queue the last frame we sync'd */ - if( p_sys->i_frame_pos != -1 ) - { -- while( ioctl( p_sys->fd_video, MJPIOC_QBUF_CAPT, -+ while( v4l1_ioctl( p_sys->fd_video, MJPIOC_QBUF_CAPT, - &p_sys->i_frame_pos ) < 0 ) - { - if( errno != EAGAIN && errno != EINTR ) -@@ -1485,7 +1488,7 @@ static uint8_t *GrabMJPEG( demux_t *p_de - } - - /* sync on the next frame */ -- while( ioctl( p_sys->fd_video, MJPIOC_SYNC, &sync ) < 0 ) -+ while( v4l1_ioctl( p_sys->fd_video, MJPIOC_SYNC, &sync ) < 0 ) - { - if( errno != EAGAIN && errno != EINTR ) - { diff --git a/v4l2-apps/lib/libv4l/appl-patches/xawtv-3.95-fixes.patch b/v4l2-apps/lib/libv4l/appl-patches/xawtv-3.95-fixes.patch deleted file mode 100644 index ccb077be0..000000000 --- a/v4l2-apps/lib/libv4l/appl-patches/xawtv-3.95-fixes.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- xawtv-3.95/libng/plugins/drv0-v4l2.c 2005-02-11 18:56:24.000000000 +0100 -+++ xawtv-3.95.new/libng/plugins/drv0-v4l2.c 2008-07-05 21:12:37.000000000 +0200 -@@ -161,7 +161,7 @@ - #define PREFIX "ioctl: " - - static int --xioctl(int fd, int cmd, void *arg, int mayfail) -+xioctl(int fd, unsigned long int cmd, void *arg, int mayfail) - { - int rc; - -@@ -768,6 +768,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++; -@@ -813,8 +814,7 @@ - if (-1 == xioctl(h->fd, VIDIOC_QUERYBUF, &h->buf_v4l2[i], 0)) - return -1; - 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].size = h->buf_v4l2[i].length; - h->buf_me[i].data = mmap(NULL, h->buf_v4l2[i].length, - PROT_READ | PROT_WRITE, MAP_SHARED, - h->fd, h->buf_v4l2[i].m.offset); -- cgit v1.2.3 From a1c8635315d9fcc9768035549e3ff5ea61f1faf2 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 18:47:06 +0200 Subject: libv4l: remove 2 unused variable declarations From: Hans de Goede libv4l: remove 2 unused variable declarations Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index d6a8a6d2a..fc41c665d 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -113,7 +113,6 @@ static int v4l2_request_read_buffers(int index) static void v4l2_unrequest_read_buffers(int index) { - int result; struct v4l2_requestbuffers req; if (!(devices[index].flags & V4L2_BUFFERS_REQUESTED_BY_READ) || @@ -743,7 +742,6 @@ int v4l2_ioctl (int fd, unsigned long int request, ...) case VIDIOC_REQBUFS: { - int i; struct v4l2_requestbuffers *req = arg; /* IMPROVEME (maybe?) add support for userptr's? */ -- cgit v1.2.3 From 7ab958ab10b1a5c28dc0c0c798939c57e41e40a4 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 19:25:44 +0200 Subject: libv4l: use driver read() when possible From: Hans de Goede When the driver supports read() and we are not converting let the driver handle read() instead of emulating it with mmap mode Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/ChangeLog | 6 ++++++ v4l2-apps/lib/libv4l/Makefile | 2 +- v4l2-apps/lib/libv4l/libv4l2/libv4l2.c | 12 ++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/ChangeLog b/v4l2-apps/lib/libv4l/ChangeLog index 675019bd2..3d4e40ad2 100644 --- a/v4l2-apps/lib/libv4l/ChangeLog +++ b/v4l2-apps/lib/libv4l/ChangeLog @@ -1,3 +1,9 @@ +libv4l-0.4.1 +------------ +* When the driver supports read() and we are not converting let the driver + handle read() instead of emulating it with mmap mode + + libv4l-0.4.0 ------------ * Be more relaxed in our checks for mixing read and mmap access, we were diff --git a/v4l2-apps/lib/libv4l/Makefile b/v4l2-apps/lib/libv4l/Makefile index 7f8867cd9..31254a09e 100644 --- a/v4l2-apps/lib/libv4l/Makefile +++ b/v4l2-apps/lib/libv4l/Makefile @@ -1,5 +1,5 @@ LIB_RELEASE=0 -V4L2_LIB_VERSION=$(LIB_RELEASE).4.0 +V4L2_LIB_VERSION=$(LIB_RELEASE).4.1 all clean install: $(MAKE) -C libv4lconvert V4L2_LIB_VERSION=$(V4L2_LIB_VERSION) $@ diff --git a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c index fc41c665d..a40ab4ffe 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c @@ -75,6 +75,7 @@ #define V4L2_STREAMON 0x0100 #define V4L2_BUFFERS_REQUESTED_BY_READ 0x0200 #define V4L2_STREAM_CONTROLLED_BY_READ 0x0400 +#define V4L2_SUPPORTS_READ 0x0800 #define V4L2_MMAP_OFFSET_MAGIC 0xABCDEF00u @@ -456,6 +457,8 @@ int v4l2_fd_open(int fd, int v4l2_flags) } devices[index].flags = v4l2_flags; + if (cap.capabilities & V4L2_CAP_READWRITE) + devices[index].flags |= V4L2_SUPPORTS_READ; devices[index].open_count = 1; devices[index].src_fmt = fmt; devices[index].dest_fmt = fmt; @@ -908,6 +911,15 @@ ssize_t v4l2_read (int fd, void* buffer, size_t n) pthread_mutex_lock(&devices[index].stream_lock); + /* When not converting and the device supports read let the kernel handle + it */ + if ((devices[index].flags & V4L2_SUPPORTS_READ) && + devices[index].src_fmt.fmt.pix.pixelformat == + devices[index].dest_fmt.fmt.pix.pixelformat) { + result = syscall(SYS_read, fd, buffer, n); + goto leave; + } + if (!(devices[index].flags & V4L2_STREAM_CONTROLLED_BY_READ)) { if ((devices[index].flags & V4L2_STREAMON) || devices[index].frame_queued) { -- cgit v1.2.3 From e0e6d4a7982b61a901c49c1b099b067a0e613eb6 Mon Sep 17 00:00:00 2001 From: "hans@localhost.localdomain" Date: Sun, 3 Aug 2008 21:20:08 +0200 Subject: libv4l: mmap return value should be void * not void From: Hans de Goede libv4l: mmap return value should be void * not void Signed-off-by: Hans de Goede --- v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c | 4 ++-- v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'v4l2-apps/lib/libv4l') diff --git a/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c b/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c index 5da13fcf5..f1134fe3b 100644 --- a/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c +++ b/v4l2-apps/lib/libv4l/libv4l1/v4l1compat.c @@ -99,13 +99,13 @@ ssize_t read(int fd, void* buffer, size_t n) return v4l1_read (fd, buffer, n); } -void mmap(void *start, size_t length, int prot, int flags, int fd, +void *mmap(void *start, size_t length, int prot, int flags, int fd, __off_t offset) { return v4l1_mmap(start, length, prot, flags, fd, offset); } -void mmap64(void *start, size_t length, int prot, int flags, int fd, +void *mmap64(void *start, size_t length, int prot, int flags, int fd, __off64_t offset) { return v4l1_mmap(start, length, prot, flags, fd, offset); diff --git a/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c b/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c index e30fb307c..f312828c6 100644 --- a/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c +++ b/v4l2-apps/lib/libv4l/libv4l2/v4l2convert.c @@ -134,13 +134,13 @@ ssize_t read (int fd, void* buffer, size_t n) return v4l2_read (fd, buffer, n); } -void mmap(void *start, size_t length, int prot, int flags, int fd, +void *mmap(void *start, size_t length, int prot, int flags, int fd, __off_t offset) { return v4l2_mmap(start, length, prot, flags, fd, offset); } -void mmap64(void *start, size_t length, int prot, int flags, int fd, +void *mmap64(void *start, size_t length, int prot, int flags, int fd, __off64_t offset) { return v4l2_mmap(start, length, prot, flags, fd, offset); -- cgit v1.2.3