Maarten Lankhorst : qcap: Add optional dependency on libv4l.

Alexandre Julliard julliard at winehq.org
Fri Jan 29 10:56:36 CST 2010


Module: wine
Branch: master
Commit: bf6f0750cdc3695576a0f486ca322ade78aabf57
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bf6f0750cdc3695576a0f486ca322ade78aabf57

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Thu Jan 28 23:27:12 2010 +0100

qcap: Add optional dependency on libv4l.

---

 configure           |   70 +++++++++++++++++++++++++++++++++++++++++++++++++++
 configure.ac        |    9 ++++++
 dlls/qcap/v4l.c     |   44 ++++++++++++++++++++++++++------
 include/config.h.in |    3 ++
 4 files changed, 118 insertions(+), 8 deletions(-)

diff --git a/configure b/configure
index 740e95e..2ae042f 100755
--- a/configure
+++ b/configure
@@ -803,6 +803,7 @@ with_oss
 with_png
 with_pthread
 with_sane
+with_v4l
 with_xcomposite
 with_xcursor
 with_xinerama
@@ -1488,6 +1489,7 @@ Optional Packages:
   --without-png           do not use PNG
   --without-pthread       do not use the pthread library
   --without-sane          do not use SANE (scanner support)
+  --without-v4l           do not use v4l1 (v4l support)
   --without-xcomposite    do not use the Xcomposite extension
   --without-xcursor       do not use the Xcursor extension
   --without-xinerama      do not use Xinerama (multi-monitor support)
@@ -2665,6 +2667,12 @@ if test "${with_sane+set}" = set; then :
 fi
 
 
+# Check whether --with-v4l was given.
+if test "${with_v4l+set}" = set; then :
+  withval=$with_v4l;
+fi
+
+
 # Check whether --with-xcomposite was given.
 if test "${with_xcomposite+set}" = set; then :
   withval=$with_xcomposite; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi
@@ -9615,6 +9623,68 @@ This is an error since --with-sane was requested." "$LINENO" 5 ;;
 esac
 fi
 
+if test "x$with_v4l" != "xno"
+then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lv4l1" >&5
+$as_echo_n "checking for -lv4l1... " >&6; }
+if test "${ac_cv_lib_soname_v4l1+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_soname_save_LIBS=$LIBS
+LIBS="-lv4l1  $LIBS"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char v4l1_open ();
+int
+main ()
+{
+return v4l1_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  case "$LIBEXT" in
+    dll) ;;
+    dylib) ac_cv_lib_soname_v4l1=`otool -L conftest$ac_exeext | grep "libv4l1\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libv4l1\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
+    *) ac_cv_lib_soname_v4l1=`$ac_cv_path_LDD conftest$ac_exeext | grep "libv4l1\\.$LIBEXT" | sed -e "s/^.*\(libv4l1\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'` ;;
+  esac
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  LIBS=$ac_check_soname_save_LIBS
+fi
+if test "x$ac_cv_lib_soname_v4l1" = "x"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_v4l1" >&5
+$as_echo "$ac_cv_lib_soname_v4l1" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SONAME_LIBV4L1 "$ac_cv_lib_soname_v4l1"
+_ACEOF
+
+
+fi
+fi
+if test "x$ac_cv_lib_soname_v4l1" = "x"; then :
+  case "x$with_v4l" in
+  x)   wine_notices="$wine_notices|libv4l ${notice_platform}development files not found." ;;
+  xno) ;;
+  *)   as_fn_error "libv4l ${notice_platform}development files not found.
+This is an error since --with-v4l was requested." "$LINENO" 5 ;;
+esac
+fi
+
 if test "x$with_gphoto" != "xno"
 then
     ac_save_CPPFLAGS="$CPPFLAGS"
diff --git a/configure.ac b/configure.ac
index 453ba7a..f823045 100644
--- a/configure.ac
+++ b/configure.ac
@@ -65,6 +65,7 @@ AC_ARG_WITH(png,       AS_HELP_STRING([--without-png],[do not use PNG]),
 AC_ARG_WITH(pthread,   AS_HELP_STRING([--without-pthread],[do not use the pthread library]),
             [if test "x$withval" = "xno"; then ac_cv_header_pthread_h=no; fi])
 AC_ARG_WITH(sane,      AS_HELP_STRING([--without-sane],[do not use SANE (scanner support)]))
+AC_ARG_WITH(v4l,       AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)]))
 AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]),
             [if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi])
 AC_ARG_WITH(xcursor,   AS_HELP_STRING([--without-xcursor],[do not use the Xcursor extension]),
@@ -1138,6 +1139,14 @@ fi
 WINE_NOTICE_WITH(sane,[test "x$ac_cv_lib_soname_sane" = "x"],
                  [libsane ${notice_platform}development files not found, scanners won't be supported.])
 
+dnl **** Check for libv4l1 ****
+if test "x$with_v4l" != "xno"
+then
+    WINE_CHECK_SONAME(v4l1,v4l1_open,,,)
+fi
+WINE_NOTICE_WITH(v4l,[test "x$ac_cv_lib_soname_v4l1" = "x"],
+                 [libv4l ${notice_platform}development files not found.])
+
 dnl **** Check for libgphoto2 ****
 if test "x$with_gphoto" != "xno"
 then
diff --git a/dlls/qcap/v4l.c b/dlls/qcap/v4l.c
index 0546797..85d4d4d 100644
--- a/dlls/qcap/v4l.c
+++ b/dlls/qcap/v4l.c
@@ -24,6 +24,7 @@
 
 #include "config.h"
 #include "wine/port.h"
+#include "wine/library.h"
 
 #define NONAMELESSSTRUCT
 #define NONAMELESSUNION
@@ -73,6 +74,32 @@ WINE_DEFAULT_DEBUG_CHANNEL(qcap_v4l);
 
 #ifdef HAVE_LINUX_VIDEODEV_H
 
+static typeof(open) *video_open = open;
+static typeof(close) *video_close = close;
+static typeof(ioctl) *video_ioctl = ioctl;
+static typeof(read) *video_read = read;
+static typeof(mmap) *video_mmap = mmap;
+static typeof(munmap) *video_munmap = munmap;
+
+static void video_init(void)
+{
+#ifdef SONAME_LIBV4L1
+    static void *video_lib;
+
+    if (video_lib)
+        return;
+    video_lib = wine_dlopen(SONAME_LIBV4L1, RTLD_NOW, NULL, 0);
+    if (!video_lib)
+        return;
+    video_open = wine_dlsym(video_lib, "v4l1_open", NULL, 0);
+    video_close = wine_dlsym(video_lib, "v4l1_close", NULL, 0);
+    video_ioctl = wine_dlsym(video_lib, "v4l1_ioctl", NULL, 0);
+    video_read = wine_dlsym(video_lib, "v4l1_read", NULL, 0);
+    video_mmap = wine_dlsym(video_lib, "v4l1_mmap", NULL, 0);
+    video_munmap = wine_dlsym(video_lib, "v4l1_munmap", NULL, 0);
+#endif
+}
+
 typedef void (* Renderer)(const Capture *, LPBYTE bufferin, const BYTE *stream);
 
 struct _Capture
@@ -146,7 +173,7 @@ static int xioctl(int fd, int request, void * arg)
     int r;
 
     do {
-        r = ioctl (fd, request, arg);
+        r = video_ioctl (fd, request, arg);
     } while (-1 == r && EINTR == errno);
 
     return r;
@@ -168,8 +195,8 @@ static HRESULT V4l_Prepare(Capture *capBox)
         TRACE("%p: Using %d/%d buffers\n", capBox,
               capBox->buffers, capBox->gb_buffers.frames);
 
-        capBox->pmap = mmap( 0, capBox->gb_buffers.size, PROT_READ|PROT_WRITE,
-                             MAP_SHARED, capBox->fd, 0 );
+        capBox->pmap = video_mmap( 0, capBox->gb_buffers.size, PROT_READ|PROT_WRITE,
+                                   MAP_SHARED, capBox->fd, 0 );
         if (capBox->pmap != MAP_FAILED)
         {
             int i;
@@ -177,7 +204,7 @@ static HRESULT V4l_Prepare(Capture *capBox)
             capBox->grab_buf = CoTaskMemAlloc(sizeof(struct video_mmap) * capBox->buffers);
             if (!capBox->grab_buf)
             {
-                munmap(capBox->pmap, capBox->gb_buffers.size);
+                video_munmap(capBox->pmap, capBox->gb_buffers.size);
                 return E_OUTOFMEMORY;
             }
 
@@ -211,7 +238,7 @@ static void V4l_Unprepare(Capture *capBox)
     {
         for (capBox->curframe = 0; capBox->curframe < capBox->buffers; capBox->curframe++) 
             xioctl(capBox->fd, VIDIOCSYNC, &capBox->grab_buf[capBox->curframe]);
-        munmap(capBox->pmap, capBox->gb_buffers.size);
+        video_munmap(capBox->pmap, capBox->gb_buffers.size);
         CoTaskMemFree(capBox->grab_buf);
     }
     else
@@ -223,7 +250,7 @@ HRESULT qcap_driver_destroy(Capture *capBox)
     TRACE("%p\n", capBox);
 
     if( capBox->fd != -1 )
-        close(capBox->fd);
+        video_close(capBox->fd);
     capBox->CritSect.DebugInfo->Spare[0] = 0;
     DeleteCriticalSection(&capBox->CritSect);
     CoTaskMemFree(capBox);
@@ -546,7 +573,7 @@ static void V4l_GetFrame(Capture * capBox, unsigned char ** pInput)
     else
     {
         int retval;
-        while ((retval = read(capBox->fd, capBox->grab_data, capBox->imagesize)) == -1)
+        while ((retval = video_read(capBox->fd, capBox->grab_data, capBox->imagesize)) == -1)
             if (errno != EAGAIN) break;
         if (retval == -1)
             WARN("Error occurred while reading from device: %s\n", strerror(errno));
@@ -782,6 +809,7 @@ Capture * qcap_driver_init( IPin *pOut, USHORT card )
     struct video_window window;
 
     YUV_Init();
+    video_init();
 
     capBox = CoTaskMemAlloc(sizeof(Capture));
     if (!capBox)
@@ -794,7 +822,7 @@ Capture * qcap_driver_init( IPin *pOut, USHORT card )
 
     sprintf(device, "/dev/video%i", card);
     TRACE("opening %s\n", device);
-    capBox->fd = open(device, O_RDWR | O_NONBLOCK);
+    capBox->fd = video_open(device, O_RDWR | O_NONBLOCK);
     if (capBox->fd == -1)
     {
         WARN("open failed (%d)\n", errno);
diff --git a/include/config.h.in b/include/config.h.in
index 0d5ce60..4e8fcd1 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -1194,6 +1194,9 @@
 /* Define to the soname of the libssl library. */
 #undef SONAME_LIBSSL
 
+/* Define to the soname of the libv4l1 library. */
+#undef SONAME_LIBV4L1
+
 /* Define to the soname of the libX11 library. */
 #undef SONAME_LIBX11
 




More information about the wine-cvs mailing list