diff --git a/configure b/configure index 740e95e2cb7..2ae042fb128 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 453ba7a6919..f823045c9c4 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 054679702ec..85d4d4d1325 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 0d5ce6098eb..4e8fcd11c49 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