* PATCH: libv4l: update mercurial tree to latest 0.3.1 release
@ 2008-07-03 11:33 Hans de Goede
2008-07-03 18:43 ` Thierry Merle
0 siblings, 1 reply; 2+ messages in thread
From: Hans de Goede @ 2008-07-03 11:33 UTC (permalink / raw)
To: Thierry Merle; +Cc: video4linux-list
[-- Attachment #1: Type: text/plain, Size: 161 bytes --]
Hi,
This patch syncs (updates) the libv4l in mercurial with (to) the latest 0.3.1
release.
Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
Regards,
Hans
[-- Attachment #2: libv4l-mecurial-0.3.1.patch --]
[-- Type: text/plain, Size: 26039 bytes --]
This patch syncs (updates) the libv4l in mercurial with (to) the latest 0.3.1
release.
Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
diff -r 6169e79de2d2 v4l2-apps/lib/libv4l/ChangeLog
--- a/v4l2-apps/lib/libv4l/ChangeLog Tue Jul 01 21:18:23 2008 +0200
+++ b/v4l2-apps/lib/libv4l/ChangeLog Thu Jul 03 13:29:13 2008 +0200
@@ -1,3 +1,20 @@
+libv4l-0.3.1
+------------
+* Only serialize V4L2_BUF_TYPE_VIDEO_CAPTURE type ioctls
+* Do not return an uninitialized variable as result code for GPICT
+ (fixes vlc, but see below)
+* Add an apps-patches directory which includes:
+ * vlc-0.8.6-libv4l1.patch, modify vlc's v4l1 plugin to directly call into
+ libv4l1, in the end we want all apps todo this as its better then
+ LD_PRELOAD tricks, but for vlc this is needed as vlc's plugin system
+ causes LD_PRELOAD to not work on symbols in the plugins
+ * camorama-0.19-fixes.patch, small bugfixes to camorama's v4l1 support,
+ this patch only fixes _real_ bugs in camorama and does not change it to
+ work with v4l1compat. Although it does work better with these bugs fixed
+ :) With this patch and LD_PRELOAD=<path>/v4l1compat.so it works
+ flawless.
+
+
libv4l-0.3
----------
* add extern "C" magic to public header files for c++ usage (Gregor Jasny)
diff -r 6169e79de2d2 v4l2-apps/lib/libv4l/apps-patches/camorama-0.19-fixes.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/v4l2-apps/lib/libv4l/apps-patches/camorama-0.19-fixes.patch Thu Jul 03 13:29:13 2008 +0200
@@ -0,0 +1,90 @@
+--- 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 -r 6169e79de2d2 v4l2-apps/lib/libv4l/apps-patches/vlc-0.8.6-libv4l1.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/v4l2-apps/lib/libv4l/apps-patches/vlc-0.8.6-libv4l1.patch Thu Jul 03 13:29:13 2008 +0200
@@ -0,0 +1,319 @@
+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 <sys/soundcard.h>
+
++#include <libv4l1.h>
++
++
+ /*****************************************************************************
+ * 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 -r 6169e79de2d2 v4l2-apps/lib/libv4l/libv4l1/libv4l1.c
--- a/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c Tue Jul 01 21:18:23 2008 +0200
+++ b/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c Thu Jul 03 13:29:13 2008 +0200
@@ -532,6 +532,8 @@
V4L2_CID_WHITENESS);
pic->brightness = v4l2_get_control(devices[index].fd,
V4L2_CID_BRIGHTNESS);
+
+ result = 0;
}
break;
diff -r 6169e79de2d2 v4l2-apps/lib/libv4l/libv4l2/libv4l2.c
--- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c Tue Jul 01 21:18:23 2008 +0200
+++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c Thu Jul 03 13:29:13 2008 +0200
@@ -527,31 +527,13 @@
return fd;
}
-static int v4l2_buf_ioctl_pre_check(int index, unsigned long int request,
- struct v4l2_buffer *buf, int *result)
-{
- if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
- *result = syscall(SYS_ioctl, devices[index].fd, request, buf);
- return 1;
- }
-
- /* IMPROVEME (maybe?) add support for userptr's? */
- if (devices[index].io != v4l2_io_mmap ||
- buf->memory != V4L2_MEMORY_MMAP ||
- buf->index >= devices[index].no_frames) {
- errno = EINVAL;
- *result = -1;
- return 1;
- }
-
- return 0;
-}
int v4l2_ioctl (int fd, unsigned long int request, ...)
{
void *arg;
va_list ap;
- int result, converting, index, saved_err, stream_locked = 0;
+ int result, converting, index, saved_err;
+ int is_capture_request = 0, stream_needs_locking = 0;
va_start (ap, request);
arg = va_arg (ap, void *);
@@ -560,19 +542,52 @@
if ((index = v4l2_get_index(fd)) == -1)
return syscall(SYS_ioctl, fd, request, arg);
- /* do we need to take the stream lock for this ioctl? */
+ /* Is this a capture request and do we need to take the stream lock? */
switch (request) {
+ case VIDIOC_ENUM_FMT:
+ if (((struct v4l2_fmtdesc *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ is_capture_request = 1;
+ break;
+ case VIDIOC_TRY_FMT:
+ if (((struct v4l2_format *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ is_capture_request = 1;
+ break;
case VIDIOC_S_FMT:
case VIDIOC_G_FMT:
- case VIDIOC_REQBUFS:
+ if (((struct v4l2_format *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+ is_capture_request = 1;
+ stream_needs_locking = 1;
+ }
+ break;
+ case VIDIOC_REQBUFS:
+ if (((struct v4l2_requestbuffers *)arg)->type ==
+ V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+ is_capture_request = 1;
+ stream_needs_locking = 1;
+ }
+ break;
case VIDIOC_QUERYBUF:
case VIDIOC_QBUF:
case VIDIOC_DQBUF:
+ if (((struct v4l2_buffer *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+ is_capture_request = 1;
+ stream_needs_locking = 1;
+ }
+ break;
case VIDIOC_STREAMON:
case VIDIOC_STREAMOFF:
- pthread_mutex_lock(&devices[index].stream_lock);
- stream_locked = 1;
+ if (*((enum v4l2_buf_type *)arg) == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+ is_capture_request = 1;
+ stream_needs_locking = 1;
+ }
}
+
+ if (!is_capture_request)
+ return syscall(SYS_ioctl, fd, request, arg);
+
+
+ if (stream_needs_locking)
+ pthread_mutex_lock(&devices[index].stream_lock);
converting = devices[index].src_fmt.fmt.pix.pixelformat !=
devices[index].dest_fmt.fmt.pix.pixelformat;
@@ -580,40 +595,16 @@
switch (request) {
case VIDIOC_ENUM_FMT:
- {
- struct v4l2_fmtdesc *fmtdesc = arg;
-
- if (fmtdesc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
- !(devices[index].flags & V4L2_ENABLE_ENUM_FMT_EMULATION))
- result = syscall(SYS_ioctl, devices[index].fd, request, arg);
- else
- result = v4lconvert_enum_fmt(devices[index].convert, fmtdesc);
- }
+ result = v4lconvert_enum_fmt(devices[index].convert, arg);
break;
case VIDIOC_TRY_FMT:
- {
- struct v4l2_format *fmt = arg;
-
- if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
- (devices[index].flags & V4L2_DISABLE_CONVERSION)) {
- result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_TRY_FMT, fmt);
- break;
- }
-
- result = v4lconvert_try_format(devices[index].convert, fmt, NULL);
- }
+ result = v4lconvert_try_format(devices[index].convert, arg, NULL);
break;
case VIDIOC_S_FMT:
{
struct v4l2_format src_fmt, *dest_fmt = arg;
-
- if (dest_fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
- result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_S_FMT,
- dest_fmt);
- break;
- }
if (!memcmp(&devices[index].dest_fmt, dest_fmt, sizeof(*dest_fmt))) {
result = 0;
@@ -658,7 +649,7 @@
if (v4l2_activate_read_stream(index))
V4L2_LOG_ERR(
"reactivating stream after deactivate failure (AAIIEEEE)\n");
- return result;
+ break;
}
}
@@ -681,11 +672,6 @@
{
struct v4l2_format* fmt = arg;
- if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
- result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_G_FMT, fmt);
- break;
- }
-
*fmt = devices[index].dest_fmt;
result = 0;
}
@@ -694,11 +680,6 @@
case VIDIOC_REQBUFS:
{
struct v4l2_requestbuffers *req = arg;
-
- if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
- result = syscall(SYS_ioctl, devices[index].fd, request, arg);
- return 1;
- }
/* Don't allow mixing read / mmap io, either we control the buffers
(read based io), or the app does */
@@ -753,9 +734,6 @@
{
struct v4l2_buffer *buf = arg;
- if (v4l2_buf_ioctl_pre_check(index, request, buf, &result))
- 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);
@@ -768,22 +746,12 @@
break;
case VIDIOC_QBUF:
- {
- struct v4l2_buffer *buf = arg;
-
- if (v4l2_buf_ioctl_pre_check(index, request, buf, &result))
- break;
-
- result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QBUF, buf);
- }
+ result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QBUF, arg);
break;
case VIDIOC_DQBUF:
{
struct v4l2_buffer *buf = arg;
-
- if (v4l2_buf_ioctl_pre_check(index, request, buf, &result))
- break;
result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_DQBUF, buf);
if (result || !converting)
@@ -832,32 +800,23 @@
case VIDIOC_STREAMON:
case VIDIOC_STREAMOFF:
- {
- enum v4l2_buf_type *type = arg;
+ if (devices[index].io != v4l2_io_mmap) {
+ errno = EINVAL;
+ result = -1;
+ break;
+ }
- if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
- result = syscall(SYS_ioctl, devices[index].fd, request, type);
- break;
- }
-
- if (devices[index].io != v4l2_io_mmap) {
- errno = EINVAL;
- result = -1;
- break;
- }
-
- if (request == VIDIOC_STREAMON)
- result = v4l2_streamon(index);
- else
- result = v4l2_streamoff(index);
- }
+ if (request == VIDIOC_STREAMON)
+ result = v4l2_streamon(index);
+ else
+ result = v4l2_streamoff(index);
break;
default:
result = syscall(SYS_ioctl, fd, request, arg);
}
- if (stream_locked)
+ if (stream_needs_locking)
pthread_mutex_unlock(&devices[index].stream_lock);
saved_err = errno;
[-- Attachment #3: Type: text/plain, Size: 164 bytes --]
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: PATCH: libv4l: update mercurial tree to latest 0.3.1 release
2008-07-03 11:33 PATCH: libv4l: update mercurial tree to latest 0.3.1 release Hans de Goede
@ 2008-07-03 18:43 ` Thierry Merle
0 siblings, 0 replies; 2+ messages in thread
From: Thierry Merle @ 2008-07-03 18:43 UTC (permalink / raw)
To: Hans de Goede; +Cc: video4linux-list, v4l2 library
Hans de Goede a écrit :
> Hi,
>
> This patch syncs (updates) the libv4l in mercurial with (to) the
> latest 0.3.1
> release.
>
> Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
>
> Regards,
>
> Hans
> This patch syncs (updates) the libv4l in mercurial with (to) the latest 0.3.1
> release.
>
> Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
>
> diff -r 6169e79de2d2 v4l2-apps/lib/libv4l/ChangeLog
> --- a/v4l2-apps/lib/libv4l/ChangeLog Tue Jul 01 21:18:23 2008 +0200
> +++ b/v4l2-apps/lib/libv4l/ChangeLog Thu Jul 03 13:29:13 2008 +0200
> @@ -1,3 +1,20 @@
> +libv4l-0.3.1
> +------------
> +* Only serialize V4L2_BUF_TYPE_VIDEO_CAPTURE type ioctls
> +* Do not return an uninitialized variable as result code for GPICT
> + (fixes vlc, but see below)
> +* Add an apps-patches directory which includes:
> + * vlc-0.8.6-libv4l1.patch, modify vlc's v4l1 plugin to directly call into
> + libv4l1, in the end we want all apps todo this as its better then
> + LD_PRELOAD tricks, but for vlc this is needed as vlc's plugin system
> + causes LD_PRELOAD to not work on symbols in the plugins
> + * camorama-0.19-fixes.patch, small bugfixes to camorama's v4l1 support,
> + this patch only fixes _real_ bugs in camorama and does not change it to
> + work with v4l1compat. Although it does work better with these bugs fixed
> + :) With this patch and LD_PRELOAD=<path>/v4l1compat.so it works
> + flawless.
> +
> +
> libv4l-0.3
> ----------
> * add extern "C" magic to public header files for c++ usage (Gregor Jasny)
> diff -r 6169e79de2d2 v4l2-apps/lib/libv4l/apps-patches/camorama-0.19-fixes.patch
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/v4l2-apps/lib/libv4l/apps-patches/camorama-0.19-fixes.patch Thu Jul 03 13:29:13 2008 +0200
> @@ -0,0 +1,90 @@
> +--- 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 -r 6169e79de2d2 v4l2-apps/lib/libv4l/apps-patches/vlc-0.8.6-libv4l1.patch
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/v4l2-apps/lib/libv4l/apps-patches/vlc-0.8.6-libv4l1.patch Thu Jul 03 13:29:13 2008 +0200
> @@ -0,0 +1,319 @@
> +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 <sys/soundcard.h>
> +
> ++#include <libv4l1.h>
> ++
> ++
> + /*****************************************************************************
> + * 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 -r 6169e79de2d2 v4l2-apps/lib/libv4l/libv4l1/libv4l1.c
> --- a/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c Tue Jul 01 21:18:23 2008 +0200
> +++ b/v4l2-apps/lib/libv4l/libv4l1/libv4l1.c Thu Jul 03 13:29:13 2008 +0200
> @@ -532,6 +532,8 @@
> V4L2_CID_WHITENESS);
> pic->brightness = v4l2_get_control(devices[index].fd,
> V4L2_CID_BRIGHTNESS);
> +
> + result = 0;
> }
> break;
>
> diff -r 6169e79de2d2 v4l2-apps/lib/libv4l/libv4l2/libv4l2.c
> --- a/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c Tue Jul 01 21:18:23 2008 +0200
> +++ b/v4l2-apps/lib/libv4l/libv4l2/libv4l2.c Thu Jul 03 13:29:13 2008 +0200
> @@ -527,31 +527,13 @@
> return fd;
> }
>
> -static int v4l2_buf_ioctl_pre_check(int index, unsigned long int request,
> - struct v4l2_buffer *buf, int *result)
> -{
> - if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> - *result = syscall(SYS_ioctl, devices[index].fd, request, buf);
> - return 1;
> - }
> -
> - /* IMPROVEME (maybe?) add support for userptr's? */
> - if (devices[index].io != v4l2_io_mmap ||
> - buf->memory != V4L2_MEMORY_MMAP ||
> - buf->index >= devices[index].no_frames) {
> - errno = EINVAL;
> - *result = -1;
> - return 1;
> - }
> -
> - return 0;
> -}
>
> int v4l2_ioctl (int fd, unsigned long int request, ...)
> {
> void *arg;
> va_list ap;
> - int result, converting, index, saved_err, stream_locked = 0;
> + int result, converting, index, saved_err;
> + int is_capture_request = 0, stream_needs_locking = 0;
>
> va_start (ap, request);
> arg = va_arg (ap, void *);
> @@ -560,19 +542,52 @@
> if ((index = v4l2_get_index(fd)) == -1)
> return syscall(SYS_ioctl, fd, request, arg);
>
> - /* do we need to take the stream lock for this ioctl? */
> + /* Is this a capture request and do we need to take the stream lock? */
> switch (request) {
> + case VIDIOC_ENUM_FMT:
> + if (((struct v4l2_fmtdesc *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
> + is_capture_request = 1;
> + break;
> + case VIDIOC_TRY_FMT:
> + if (((struct v4l2_format *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
> + is_capture_request = 1;
> + break;
> case VIDIOC_S_FMT:
> case VIDIOC_G_FMT:
> - case VIDIOC_REQBUFS:
> + if (((struct v4l2_format *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> + is_capture_request = 1;
> + stream_needs_locking = 1;
> + }
> + break;
> + case VIDIOC_REQBUFS:
> + if (((struct v4l2_requestbuffers *)arg)->type ==
> + V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> + is_capture_request = 1;
> + stream_needs_locking = 1;
> + }
> + break;
> case VIDIOC_QUERYBUF:
> case VIDIOC_QBUF:
> case VIDIOC_DQBUF:
> + if (((struct v4l2_buffer *)arg)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> + is_capture_request = 1;
> + stream_needs_locking = 1;
> + }
> + break;
> case VIDIOC_STREAMON:
> case VIDIOC_STREAMOFF:
> - pthread_mutex_lock(&devices[index].stream_lock);
> - stream_locked = 1;
> + if (*((enum v4l2_buf_type *)arg) == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> + is_capture_request = 1;
> + stream_needs_locking = 1;
> + }
> }
> +
> + if (!is_capture_request)
> + return syscall(SYS_ioctl, fd, request, arg);
> +
> +
> + if (stream_needs_locking)
> + pthread_mutex_lock(&devices[index].stream_lock);
>
> converting = devices[index].src_fmt.fmt.pix.pixelformat !=
> devices[index].dest_fmt.fmt.pix.pixelformat;
> @@ -580,40 +595,16 @@
>
> switch (request) {
> case VIDIOC_ENUM_FMT:
> - {
> - struct v4l2_fmtdesc *fmtdesc = arg;
> -
> - if (fmtdesc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
> - !(devices[index].flags & V4L2_ENABLE_ENUM_FMT_EMULATION))
> - result = syscall(SYS_ioctl, devices[index].fd, request, arg);
> - else
> - result = v4lconvert_enum_fmt(devices[index].convert, fmtdesc);
> - }
> + result = v4lconvert_enum_fmt(devices[index].convert, arg);
> break;
>
> case VIDIOC_TRY_FMT:
> - {
> - struct v4l2_format *fmt = arg;
> -
> - if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
> - (devices[index].flags & V4L2_DISABLE_CONVERSION)) {
> - result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_TRY_FMT, fmt);
> - break;
> - }
> -
> - result = v4lconvert_try_format(devices[index].convert, fmt, NULL);
> - }
> + result = v4lconvert_try_format(devices[index].convert, arg, NULL);
> break;
>
> case VIDIOC_S_FMT:
> {
> struct v4l2_format src_fmt, *dest_fmt = arg;
> -
> - if (dest_fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> - result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_S_FMT,
> - dest_fmt);
> - break;
> - }
>
> if (!memcmp(&devices[index].dest_fmt, dest_fmt, sizeof(*dest_fmt))) {
> result = 0;
> @@ -658,7 +649,7 @@
> if (v4l2_activate_read_stream(index))
> V4L2_LOG_ERR(
> "reactivating stream after deactivate failure (AAIIEEEE)\n");
> - return result;
> + break;
> }
> }
>
> @@ -681,11 +672,6 @@
> {
> struct v4l2_format* fmt = arg;
>
> - if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> - result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_G_FMT, fmt);
> - break;
> - }
> -
> *fmt = devices[index].dest_fmt;
> result = 0;
> }
> @@ -694,11 +680,6 @@
> case VIDIOC_REQBUFS:
> {
> struct v4l2_requestbuffers *req = arg;
> -
> - if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> - result = syscall(SYS_ioctl, devices[index].fd, request, arg);
> - return 1;
> - }
>
> /* Don't allow mixing read / mmap io, either we control the buffers
> (read based io), or the app does */
> @@ -753,9 +734,6 @@
> {
> struct v4l2_buffer *buf = arg;
>
> - if (v4l2_buf_ioctl_pre_check(index, request, buf, &result))
> - 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);
> @@ -768,22 +746,12 @@
> break;
>
> case VIDIOC_QBUF:
> - {
> - struct v4l2_buffer *buf = arg;
> -
> - if (v4l2_buf_ioctl_pre_check(index, request, buf, &result))
> - break;
> -
> - result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QBUF, buf);
> - }
> + result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_QBUF, arg);
> break;
>
> case VIDIOC_DQBUF:
> {
> struct v4l2_buffer *buf = arg;
> -
> - if (v4l2_buf_ioctl_pre_check(index, request, buf, &result))
> - break;
>
> result = syscall(SYS_ioctl, devices[index].fd, VIDIOC_DQBUF, buf);
> if (result || !converting)
> @@ -832,32 +800,23 @@
>
> case VIDIOC_STREAMON:
> case VIDIOC_STREAMOFF:
> - {
> - enum v4l2_buf_type *type = arg;
> + if (devices[index].io != v4l2_io_mmap) {
> + errno = EINVAL;
> + result = -1;
> + break;
> + }
>
> - if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
> - result = syscall(SYS_ioctl, devices[index].fd, request, type);
> - break;
> - }
> -
> - if (devices[index].io != v4l2_io_mmap) {
> - errno = EINVAL;
> - result = -1;
> - break;
> - }
> -
> - if (request == VIDIOC_STREAMON)
> - result = v4l2_streamon(index);
> - else
> - result = v4l2_streamoff(index);
> - }
> + if (request == VIDIOC_STREAMON)
> + result = v4l2_streamon(index);
> + else
> + result = v4l2_streamoff(index);
> break;
>
> default:
> result = syscall(SYS_ioctl, fd, request, arg);
> }
>
> - if (stream_locked)
> + if (stream_needs_locking)
> pthread_mutex_unlock(&devices[index].stream_lock);
>
> saved_err = errno;
>
Applied on http://www.linuxtv.org/hg/~tmerle/v4l2-library
Thierry
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-07-03 18:41 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-03 11:33 PATCH: libv4l: update mercurial tree to latest 0.3.1 release Hans de Goede
2008-07-03 18:43 ` Thierry Merle
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox