diff -up DirectFB-1.4.11/configure.in.libv4l DirectFB-1.4.11/configure.in --- DirectFB-1.4.11/configure.in.libv4l 2010-11-27 19:39:47.688514115 +0100 +++ DirectFB-1.4.11/configure.in 2010-11-27 19:39:47.717518354 +0100 @@ -897,6 +895,22 @@ if test "$V4L" = "yes"; then fi + +dnl +dnl libv4l2 support for video4linux. +dnl +AC_ARG_ENABLE( libv4l2, + [ --enable-libv4l2 Libv4l2 Video4Linux2 support (default enabled)]) +if test "${enable_libv4l2}" = "yes" -a "${enable_v4l2}" != "no" +then + PKG_CHECK_MODULES( LIBV4L2, libv4l2, [ + AC_DEFINE(HAVE_LIBV4L2, 1, Define if libv4l2 is available)], + AC_MSG_WARN([LibV4L2 support disabled because libv4l2 development headers were not found]) + ) +fi + + + dnl check which gfxdrivers to build ati128=no cle266=no @@ -1849,7 +1863,7 @@ Building Image Provider Modules: Building Video Provider Modules: GIF $enable_gif - Video4Linux $V4L (v2: $V4L2) + Video4Linux $V4L (v2: $V4L2) libv4l2: $LIBV4L2_CFLAGS $LIBV4L2_LIBS Building Font Modules: FreeType2 $FREETYPE $FREETYPE_CFLAGS $FREETYPE_LIBS diff -up DirectFB-1.4.11/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c.libv4l DirectFB-1.4.11/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c --- DirectFB-1.4.11/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c.libv4l 2010-11-27 19:39:47.690514408 +0100 +++ DirectFB-1.4.11/interfaces/IDirectFBVideoProvider/idirectfbvideoprovider_v4l.c 2010-11-27 19:41:42.517294474 +0100 @@ -87,6 +87,18 @@ #include "videodev2.h" #endif + +#ifdef HAVE_LIBV4L2 +# include <libv4l2.h> +#else +# define v4l2_fd_open(fd, flags) (fd) +# define v4l2_close close +# define v4l2_ioctl ioctl +# define v4l2_mmap mmap +# define v4l2_munmap munmap +#endif + + static DFBResult Probe( IDirectFBVideoProvider_ProbeContext *ctx ); @@ -217,28 +229,28 @@ IDirectFBVideoProvider_V4L_GetCapabiliti *caps = 0; data->saturation.id = V4L2_CID_SATURATION; - if (ioctl( data->fd, VIDIOC_G_CTRL, &data->saturation )) { + if (v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->saturation )) { *caps |= DVCAPS_SATURATION; } else { data->saturation.id = 0; } data->brightness.id = V4L2_CID_BRIGHTNESS; - if (ioctl( data->fd, VIDIOC_G_CTRL, &data->brightness )) { + if (v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->brightness )) { *caps |= DVCAPS_BRIGHTNESS; } else { data->brightness.id = 0; } data->contrast.id = V4L2_CID_CONTRAST; - if (ioctl( data->fd, VIDIOC_G_CTRL, &data->contrast )) { + if (v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->contrast )) { *caps |= DVCAPS_CONTRAST; } else { data->contrast.id = 0; } data->hue.id = V4L2_CID_HUE; - if (ioctl( data->fd, VIDIOC_G_CTRL, &data->hue )) { + if (v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->hue )) { *caps |= DVCAPS_HUE; } else { @@ -478,28 +490,28 @@ IDirectFBVideoProvider_V4L_GetColorAdjus if (data->brightness.id) { ctrl.id = data->brightness.id; - if (!ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { + if (!v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { adj->flags |= DCAF_BRIGHTNESS; adj->brightness = 0xffff * ctrl.value / (data->brightness.maximum - data->brightness.minimum); } } if (data->contrast.id) { ctrl.id = data->contrast.id; - if (!ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { + if (!v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { adj->flags |= DCAF_CONTRAST; adj->contrast = 0xffff * ctrl.value / (data->contrast.maximum - data->contrast.minimum); } } if (data->hue.id) { ctrl.id = data->hue.id; - if (!ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { + if (!v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { adj->flags |= DCAF_HUE; adj->hue = 0xffff * ctrl.value / (data->hue.maximum - data->hue.minimum); } } if (data->saturation.id) { ctrl.id = data->saturation.id; - if (!ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { + if (!v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &ctrl )) { adj->flags |= DCAF_SATURATION; adj->saturation = 0xffff * ctrl.value / (data->saturation.maximum - data->saturation.minimum); } @@ -508,7 +520,7 @@ IDirectFBVideoProvider_V4L_GetColorAdjus else #endif { - ioctl( data->fd, VIDIOCGPICT, &pic ); + v4l2_ioctl( data->fd, VIDIOCGPICT, &pic ); adj->flags = DCAF_BRIGHTNESS | DCAF_CONTRAST | DCAF_HUE | DCAF_SATURATION; @@ -540,28 +552,28 @@ IDirectFBVideoProvider_V4L_SetColorAdjus if ((adj->flags & DCAF_BRIGHTNESS) && data->brightness.id) { ctrl.id = data->brightness.id; ctrl.value = (adj->brightness * (data->brightness.maximum - data->brightness.minimum)) / 0xfff; - ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); + v4l2_ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); } if ((adj->flags & DCAF_CONTRAST) && data->contrast.id) { ctrl.id = data->contrast.id; ctrl.value = (adj->contrast * (data->contrast.maximum - data->contrast.minimum)) / 0xfff; - ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); + v4l2_ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); } if ((adj->flags & DCAF_HUE) && data->hue.id) { ctrl.id = data->hue.id; ctrl.value = (adj->hue * (data->hue.maximum - data->hue.minimum)) / 0xfff; - ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); + v4l2_ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); } if ((adj->flags & DCAF_SATURATION) && data->saturation.id) { ctrl.id = data->saturation.id; ctrl.value = (adj->saturation * (data->saturation.maximum - data->saturation.minimum)) / 0xfff; - ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); + v4l2_ioctl( data->fd, VIDIOC_S_CTRL, &ctrl ); } } else #endif { - if (ioctl( data->fd, VIDIOCGPICT, &pic ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCGPICT, &pic ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: VIDIOCGPICT failed!\n" ); @@ -574,7 +586,7 @@ IDirectFBVideoProvider_V4L_SetColorAdjus if (adj->flags & DCAF_HUE) pic.hue = adj->hue; if (adj->flags & DCAF_SATURATION) pic.colour = adj->saturation; - if (ioctl( data->fd, VIDIOCSPICT, &pic ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCSPICT, &pic ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: VIDIOCSPICT failed!\n" ); @@ -634,11 +646,11 @@ Construct( IDirectFBVideoProvider *thiz, buffer_data = (IDirectFBDataBuffer_data*) buffer->priv; - fd = open( buffer_data->filename, O_RDWR ); + fd = v4l2_open( buffer_data->filename, O_RDWR ); if (fd < 0) { DFBResult ret = errno2result( errno ); - D_PERROR( "DirectFB/Video4Linux: Cannot open `%s'!\n", + D_PERROR( "DirectFB/Video4Linux: Cannot v4l2_open `%s'!\n", buffer_data->filename ); DIRECT_DEALLOCATE_INTERFACE( thiz ); @@ -651,7 +663,7 @@ Construct( IDirectFBVideoProvider *thiz, data->is_v4l2 = 0; /* look if the device is a v4l2 device */ - if (!ioctl( fd, VIDIOC_QUERYCAP, &data->caps )) { + if (!v4l2_ioctl( fd, VIDIOC_QUERYCAP, &data->caps )) { D_INFO( "DirectFB/Video4Linux: This is a Video4Linux-2 device.\n" ); data->is_v4l2 = 1; } @@ -664,12 +676,12 @@ Construct( IDirectFBVideoProvider *thiz, { D_INFO( "DirectFB/Video4Linux: This is a Video4Linux-1 device.\n" ); - ioctl( fd, VIDIOCGCAP, &data->vcap ); - ioctl( fd, VIDIOCCAPTURE, &zero ); + v4l2_ioctl( fd, VIDIOCGCAP, &data->vcap ); + v4l2_ioctl( fd, VIDIOCCAPTURE, &zero ); - ioctl( fd, VIDIOCGMBUF, &data->vmbuf ); + v4l2_ioctl( fd, VIDIOCGMBUF, &data->vmbuf ); - data->buffer = mmap( NULL, data->vmbuf.size, + data->buffer = v4l2_mmap( NULL, data->vmbuf.size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); } @@ -752,7 +764,7 @@ GrabThread( DirectThread *thread, void * while (frame < data->vmbuf.frames) { data->vmmap.frame = frame; - ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap ); + v4l2_ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap ); frame++; } @@ -763,7 +775,7 @@ GrabThread( DirectThread *thread, void * frame = 0; while (data->running) { - ioctl( data->fd, VIDIOCSYNC, &frame ); + v4l2_ioctl( data->fd, VIDIOCSYNC, &frame ); if (!data->running) break; @@ -808,7 +820,7 @@ GrabThread( DirectThread *thread, void * dfb_surface_unlock_buffer( surface, &data->destinationlock ); data->vmmap.frame = frame; - ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap ); + v4l2_ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap ); if (!data->running) break; @@ -952,7 +964,7 @@ v4l_to_surface_overlay( CoreSurface *sur b.depth = bpp; b.bytesperline = lock->pitch; - if (ioctl( data->fd, VIDIOCSFBUF, &b ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCSFBUF, &b ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: VIDIOCSFBUF failed, must run being root!\n" ); @@ -963,7 +975,7 @@ v4l_to_surface_overlay( CoreSurface *sur { struct video_picture p; - if (ioctl( data->fd, VIDIOCGPICT, &p ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCGPICT, &p ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: VIDIOCGPICT failed!\n" ); @@ -974,7 +986,7 @@ v4l_to_surface_overlay( CoreSurface *sur p.depth = bpp; p.palette = palette; - if (ioctl( data->fd, VIDIOCSPICT, &p ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCSPICT, &p ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: VIDIOCSPICT failed!\n" ); @@ -994,7 +1006,7 @@ v4l_to_surface_overlay( CoreSurface *sur win.clipcount = 0; win.chromakey = 0; - if (ioctl( data->fd, VIDIOCSWIN, &win ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCSWIN, &win ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: VIDIOCSWIN failed!\n" ); @@ -1006,7 +1018,7 @@ v4l_to_surface_overlay( CoreSurface *sur if (!data->cleanup) data->cleanup = dfb_core_cleanup_add( NULL, v4l_cleanup, data, true ); - if (ioctl( data->fd, VIDIOCCAPTURE, &one ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCCAPTURE, &one ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: Could not start capturing (VIDIOCCAPTURE failed)!\n" ); @@ -1072,7 +1084,7 @@ v4l_to_surface_grab( CoreSurface *surfac data->vmmap.height = surface->config.size.h; data->vmmap.format = palette; data->vmmap.frame = 0; - if (ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOCMCAPTURE, &data->vmmap ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux: Could not start capturing (VIDIOCMCAPTURE failed)!\n" ); @@ -1120,7 +1132,7 @@ v4l_stop( IDirectFBVideoProvider_V4L_dat if (data->is_v4l2) { /* turn off streaming */ int type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - int err = ioctl( data->fd, VIDIOC_STREAMOFF, &type ); + int err = v4l2_ioctl( data->fd, VIDIOC_STREAMOFF, &type ); if (err) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_STREAMOFF.\n" ); /* don't quit here */ @@ -1130,7 +1142,7 @@ v4l_stop( IDirectFBVideoProvider_V4L_dat #endif { if (!data->grab_mode) { - if (ioctl( data->fd, VIDIOCCAPTURE, &zero ) < 0) + if (v4l2_ioctl( data->fd, VIDIOCCAPTURE, &zero ) < 0) D_PERROR( "DirectFB/Video4Linux: " "Could not stop capturing (VIDIOCCAPTURE failed)!\n" ); } @@ -1151,8 +1163,8 @@ v4l_stop( IDirectFBVideoProvider_V4L_dat for (i = 0; i < data->req.count; i++) { struct v4l2_buffer *vidbuf = &data->vidbuf[i]; D_DEBUG( "DirectFB/Video4Linux2: %d => 0x%08x, len:%d\n", i, (u32) data->ptr[i], vidbuf->length ); - if (munmap( data->ptr[i], vidbuf->length )) { - D_PERROR( "DirectFB/Video4Linux2: munmap().\n" ); + if (v4l2_munmap( data->ptr[i], vidbuf->length )) { + D_PERROR( "DirectFB/Video4Linux2: v4l2_munmap().\n" ); } } } @@ -1187,8 +1199,8 @@ v4l_deinit( IDirectFBVideoProvider_V4L_d v4l_stop( data, true ); - munmap( data->buffer, data->vmbuf.size ); - close( data->fd ); + v4l2_munmap( data->buffer, data->vmbuf.size ); + v4l2_close( data->fd ); data->fd = -1; } @@ -1233,7 +1245,7 @@ wait_for_buffer( int vid, struct v4l2_bu return -1; /* fixme */ } else if (FD_ISSET( vid, &rdset )) { - err = ioctl( vid, VIDIOC_DQBUF, cur ); + err = v4l2_ioctl( vid, VIDIOC_DQBUF, cur ); if (err) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_DQBUF.\n" ); return -1; /* fixme */ @@ -1265,7 +1277,7 @@ V4L2_Thread( DirectThread *thread, void vidbuf->m.offset = data->destinationlock.offset; } - err = ioctl( data->fd, VIDIOC_QBUF, vidbuf ); + err = v4l2_ioctl( data->fd, VIDIOC_QBUF, vidbuf ); if (err) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_QBUF.\n" ); return NULL; @@ -1273,7 +1285,7 @@ V4L2_Thread( DirectThread *thread, void } /* start streaming */ - if (ioctl( data->fd, VIDIOC_STREAMON, &type )) { + if (v4l2_ioctl( data->fd, VIDIOC_STREAMON, &type )) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_STREAMON.\n" ); return NULL; /* fixme */ } @@ -1344,7 +1356,7 @@ V4L2_Thread( DirectThread *thread, void if (data->callback) data->callback( data->ctx ); - if (ioctl( data->fd, VIDIOC_QBUF, &cur )) { + if (v4l2_ioctl( data->fd, VIDIOC_QBUF, &cur )) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_QBUF.\n" ); return NULL; } @@ -1417,7 +1429,7 @@ v4l2_playto( CoreSurface *surface, DFBRe D_DEBUG( "DirectFB/Video4Linux2: surface->config.size.w:%d, surface->config.size.h:%d.\n", surface->config.size.w, surface->config.size.h ); - err = ioctl( data->fd, VIDIOC_S_FMT, &data->fmt ); + err = v4l2_ioctl( data->fd, VIDIOC_S_FMT, &data->fmt ); if (err) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_S_FMT.\n" ); dfb_surface_unlock_buffer( surface, &data->destinationlock ); @@ -1431,16 +1443,16 @@ v4l2_playto( CoreSurface *surface, DFBRe } if (data->brightness.id) { - ioctl( data->fd, VIDIOC_G_CTRL, &data->brightness ); + v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->brightness ); } if (data->contrast.id) { - ioctl( data->fd, VIDIOC_G_CTRL, &data->contrast ); + v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->contrast ); } if (data->saturation.id) { - ioctl( data->fd, VIDIOC_G_CTRL, &data->saturation ); + v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->saturation ); } if (data->hue.id) { - ioctl( data->fd, VIDIOC_G_CTRL, &data->hue ); + v4l2_ioctl( data->fd, VIDIOC_G_CTRL, &data->hue ); } if (surface->config.caps & DSCAPS_SYSTEMONLY) { @@ -1462,7 +1474,7 @@ v4l2_playto( CoreSurface *surface, DFBRe D_DEBUG( "w:%d, h:%d, bpl:%d, base:0x%08lx\n", fb.fmt.width, fb.fmt.height, fb.fmt.bytesperline, (unsigned long)fb.base ); - if (ioctl( data->fd, VIDIOC_S_FBUF, &fb ) < 0) { + if (v4l2_ioctl( data->fd, VIDIOC_S_FBUF, &fb ) < 0) { DFBResult ret = errno2result( errno ); D_PERROR( "DirectFB/Video4Linux2: VIDIOC_S_FBUF failed, must run being root!\n" ); @@ -1475,7 +1487,7 @@ v4l2_playto( CoreSurface *surface, DFBRe /* Ask Video Device for Buffers */ data->req.count = NUMBER_OF_BUFFERS; data->req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - err = ioctl( data->fd, VIDIOC_REQBUFS, &data->req ); + err = v4l2_ioctl( data->fd, VIDIOC_REQBUFS, &data->req ); if (err < 0 || data->req.count < NUMBER_OF_BUFFERS) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_REQBUFS: %d, %d.\n", err, data->req.count ); if (!data->framebuffer_or_system) @@ -1490,7 +1502,7 @@ v4l2_playto( CoreSurface *surface, DFBRe vidbuf->index = i; vidbuf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - err = ioctl( data->fd, VIDIOC_QUERYBUF, vidbuf ); + err = v4l2_ioctl( data->fd, VIDIOC_QUERYBUF, vidbuf ); if (err < 0) { D_PERROR( "DirectFB/Video4Linux2: VIDIOC_QUERYBUF.\n" ); if (!data->framebuffer_or_system) @@ -1505,9 +1517,9 @@ v4l2_playto( CoreSurface *surface, DFBRe } */ if (data->framebuffer_or_system) { - data->ptr[i] = mmap( 0, vidbuf->length, PROT_READ | PROT_WRITE, MAP_SHARED, data->fd, vidbuf->m.offset ); + data->ptr[i] = v4l2_mmap( 0, vidbuf->length, PROT_READ | PROT_WRITE, MAP_SHARED, data->fd, vidbuf->m.offset ); if (data->ptr[i] == MAP_FAILED) { - D_PERROR( "DirectFB/Video4Linux2: mmap().\n" ); + D_PERROR( "DirectFB/Video4Linux2: v4l2_mmap().\n" ); if (!data->framebuffer_or_system) dfb_surface_unlock_buffer( surface, &data->destinationlock ); return err;