[packages] Add the libv4l package which adds a generally uniform abstraction layer for webcams, particularly buggy ones.

git-svn-id: svn://svn.openwrt.org/openwrt/packages@17584 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
jow 2009-09-14 17:04:34 +00:00
parent b05f69a84e
commit 18358ce8a5
2 changed files with 118 additions and 0 deletions

75
libs/libv4l/Makefile Normal file
View File

@ -0,0 +1,75 @@
#
# Copyright (C) 2009 David Cooper <dave@kupesoft.com>
# Copyright (C) 2009 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=libv4l
PKG_VERSION:=0.6.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://people.atrpms.net/~hdegoede/
PKG_MD5SUM:=db389fdf02cabd57f289f0faa37f4060
include $(INCLUDE_DIR)/package.mk
define Package/libv4l
SECTION:=libs
CATEGORY:=Libraries
TITLE:=Video 4 Linux wrapper libraries
URL:=http://people.atrpms.net/~hdegoede/
DEPENDS:=+libpthread
endef
define Package/libv4l/description
libv4l is a collection of libraries which adds a thin abstraction layer on
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 separate code for different devices in the same class. libv4l
consists of 3 different libraries: libv4lconvert, libv4l1 and libv4l2.
libv4l1 offers the (deprecated) v4l1 API on top of v4l2 devices, independent
of the drivers for those devices supporting v4l1 compatibility (which many
v4l2 drivers do not).
libv4l2 offers the v4l2 API on top of v4l2 devices, while adding for the
application transparent libv4lconvert conversion where necessary.
endef
TARGET_CFLAGS += $(FPIC)
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
DESTDIR="$(PKG_INSTALL_DIR)" PREFIX="/usr" \
$(CONFIGURE_VARS) \
all install
$(MAKE) -C $(PKG_BUILD_DIR) \
DESTDIR="$(PKG_INSTALL_DIR)" PREFIX="/usr" \
$(CONFIGURE_VARS) \
LINKTYPE="static" \
all install
endef
define Build/InstallDev
mkdir -p $(1)/usr/include
$(CP) $(PKG_INSTALL_DIR)/usr/include/libv4l{1,2,convert}.h $(1)/usr/include/
mkdir -p $(1)/usr/lib
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libv4l{1,2,convert}.{a,so*} $(1)/usr/lib/
mkdir -p $(1)/usr/lib/pkgconfig
$(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libv4l{1,2,convert}.pc $(1)/usr/lib/pkgconfig/
endef
define Package/libv4l/install
$(INSTALL_DIR) $(1)/usr/lib
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libv4l{1,2,convert}.so* $(1)/usr/lib/
$(INSTALL_DIR) $(1)/usr/lib/libv4l
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libv4l/v4l{1compat,2convert}.so $(1)/usr/lib/libv4l
endef
$(eval $(call BuildPackage,libv4l))

View File

@ -0,0 +1,43 @@
diff -ruN libv4l-0.6.0.orig/libv4lconvert/control/libv4lcontrol.c libv4l-0.6.0/libv4lconvert/control/libv4lcontrol.c
--- libv4l-0.6.0.orig/libv4lconvert/control/libv4lcontrol.c 2009-07-09 04:59:01.000000000 -0400
+++ libv4l-0.6.0/libv4lconvert/control/libv4lcontrol.c 2009-08-29 03:23:06.000000000 -0400
@@ -265,7 +265,7 @@
struct v4lcontrol_data *v4lcontrol_create(int fd, int always_needs_conversion)
{
- int shm_fd;
+ int shm_fd, fdflags;
int i, rc, init = 0;
char *s, shm_name[256];
struct v4l2_capability cap;
@@ -311,19 +311,26 @@
return data; /* No need to create a shared memory segment */
SYS_IOCTL(fd, VIDIOC_QUERYCAP, &cap);
- snprintf(shm_name, 256, "/%s:%s", cap.bus_info, cap.card);
+ snprintf(shm_name, 256, "/dev/shm/%s:%s", cap.bus_info, cap.card);
/* / is not allowed inside shm names */
- for (i = 1; shm_name[i]; i++)
+ for (i = 9; shm_name[i]; i++) //start after "/dev/shm", i = 9
if (shm_name[i] == '/')
shm_name[i] = '-';
/* Open the shared memory object identified by shm_name */
- if ((shm_fd = shm_open(shm_name, (O_CREAT | O_EXCL | O_RDWR),
+ if ((shm_fd = open(shm_name, (O_CREAT | O_EXCL | O_RDWR),
(S_IREAD | S_IWRITE))) >= 0)
init = 1;
- else if ((shm_fd = shm_open(shm_name, O_RDWR, (S_IREAD | S_IWRITE))) < 0)
+ else if ((shm_fd = open(shm_name, O_RDWR, (S_IREAD | S_IWRITE))) < 0)
goto error;
+
+ /* This is all uClibc > 0.9.30 seems to do for shm_open() in librt/shm.c */
+ fdflags = fcntl(shm_fd, F_GETFD, 0);
+
+ if (fdflags >= 0) {
+ fdflags = fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
+ }
/* Set the shared memory size */
ftruncate(shm_fd, V4LCONTROL_SHM_SIZE);