[Ffmpeg-devel] [PATCH] grabbing with V4L

Flavio Pimentel Duarte flaviop
Tue Feb 21 12:24:05 CET 2006


Sorry Luca!
 	Although the last patch I sent works it was solving the problem 
in an ugly way. This one is more adequate.

Flavio P. Duarte

On Mon, 20 Feb 2006, Flavio Pimentel Duarte wrote:

>
>
> On Fri, 17 Feb 2006, Luca Abeni wrote:
>
>>  Hi Flavio,
>> 
>>  On Wed, 2006-02-15 at 14:34 +0100, Luca Abeni wrote:
>>  [...]
>> > >  The patch I've sent didn't create a single new line, it only moves 
>> > >  some
>> > >  image settings initialization to outside the if statement. It was also
>> > >  not my idea, I borrowed from mplayer ;)
>> >  Yes, looking at the patch I agree that it should not create problems.
>> >  I'll test it tomorrow, just as a confirmation.
>>  I tested your patch, and verified that it does not create any regression.
>>  Uhmm... I still do not understand why it is needed by your webcam driver
>>  but the "regular" bttv driver does not need it...
>> 
>>  Anyway, I think your patch is good because it permits to avoid some code
>>  duplication (in fact, after applying your patch all the code around line
>>  212 becomes useless). So, I went ahead and I removed some code that (I
>>  think) is obsoleted by your patch (since desired_palette is already set
>>  by previous code).
>> 
>>  Does the attached patch (your patch + some useless code removal) work
>>  for you?
> 	The patch you sent me did not work. It issues the following error:
> $ ./ffmpeg -s 320x240 -an -vd /dev/video0 output.mpg
> FFmpeg version CVS, Copyright (c) 2000-2004 Fabrice Bellard
>    configuration:  --disable-v4l2
>    libavutil version: 49.0.0
>    libavcodec version: 51.7.0
>    libavformat version: 50.3.0
>    built on Feb 20 2006 11:05:32, gcc: 3.4.3 (Mandrakelinux 10.2 
> 3.4.3-7mdk)
> File 'output.mpg' already exists. Overwrite ? [y/N] y
> [video4linux @ 0x82c8ef4]Fatal: grab device does not support suitable format
> Could not find video grab device
>
> 	I had to add just one line to make it work. The modified patch is 
> attached.
>
> 	I also have one question: how do I force ffmpeg to use v4l instead 
> v4l2 ? Is there an option for it ? In my tests I had to compile ffmpeg using 
> '--disable-v4l2' option, otherwise it uses v4l2.
>
>
> Flavio
>
-------------- next part --------------
--- ffmpeg/libavformat/grab.c	2006-02-01 09:31:33.000000000 -0200
+++ ffmpeg.new/libavformat/grab.c	2006-02-20 21:35:34.340312168 -0300
@@ -65,6 +65,7 @@ static int grab_read_header(AVFormatCont
     int desired_palette;
     struct video_tuner tuner;
     struct video_audio audio;
+    struct video_picture pict;
     const char *video_device;
     int j;
 
@@ -135,11 +136,36 @@ static int grab_read_header(AVFormatCont
     audio.flags &= ~VIDEO_AUDIO_MUTE;
     ioctl(video_fd, VIDIOCSAUDIO, &audio);
 
+    ioctl(video_fd, VIDIOCGPICT, &pict);
+#if 0
+    printf("v4l: colour=%d hue=%d brightness=%d constrast=%d whiteness=%d\n",
+           pict.colour,
+           pict.hue,
+           pict.brightness,
+           pict.contrast,
+           pict.whiteness);
+#endif
+    /* try to choose a suitable video format */
+    pict.palette = desired_palette;
+    if (desired_palette == -1 || (ret = ioctl(video_fd, VIDIOCSPICT, &pict)) < 0) {
+        pict.palette=VIDEO_PALETTE_YUV420P;
+        ret = ioctl(video_fd, VIDIOCSPICT, &pict);
+        if (ret < 0) {
+            pict.palette=VIDEO_PALETTE_YUV422;
+            ret = ioctl(video_fd, VIDIOCSPICT, &pict);
+            if (ret < 0) {
+                pict.palette=VIDEO_PALETTE_RGB24;
+                ret = ioctl(video_fd, VIDIOCSPICT, &pict);
+                if (ret < 0)
+                    goto fail1;
+            }
+        }
+    }
+
     ret = ioctl(video_fd,VIDIOCGMBUF,&s->gb_buffers);
     if (ret < 0) {
         /* try to use read based access */
         struct video_window win;
-        struct video_picture pict;
         int val;
 
         win.x = 0;
@@ -151,32 +177,6 @@ static int grab_read_header(AVFormatCont
 
         ioctl(video_fd, VIDIOCSWIN, &win);
 
-        ioctl(video_fd, VIDIOCGPICT, &pict);
-#if 0
-        printf("v4l: colour=%d hue=%d brightness=%d constrast=%d whiteness=%d\n",
-               pict.colour,
-               pict.hue,
-               pict.brightness,
-               pict.contrast,
-               pict.whiteness);
-#endif
-        /* try to choose a suitable video format */
-        pict.palette = desired_palette;
-        if (desired_palette == -1 || (ret = ioctl(video_fd, VIDIOCSPICT, &pict)) < 0) {
-            pict.palette=VIDEO_PALETTE_YUV420P;
-            ret = ioctl(video_fd, VIDIOCSPICT, &pict);
-            if (ret < 0) {
-                pict.palette=VIDEO_PALETTE_YUV422;
-                ret = ioctl(video_fd, VIDIOCSPICT, &pict);
-                if (ret < 0) {
-                    pict.palette=VIDEO_PALETTE_RGB24;
-                    ret = ioctl(video_fd, VIDIOCSPICT, &pict);
-                    if (ret < 0)
-                        goto fail1;
-                }
-            }
-        }
-
         s->frame_format = pict.palette;
 
         val = 1;
@@ -207,24 +207,9 @@ static int grab_read_header(AVFormatCont
         s->gb_buf.frame = s->gb_frame % s->gb_buffers.frames;
         s->gb_buf.height = height;
         s->gb_buf.width = width;
-        s->gb_buf.format = desired_palette;
-
-        if (desired_palette == -1 || (ret = ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf)) < 0) {
-            s->gb_buf.format = VIDEO_PALETTE_YUV420P;
+        s->gb_buf.format = pict.palette;
 
-            ret = ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf);
-            if (ret < 0 && errno != EAGAIN) {
-                /* try YUV422 */
-                s->gb_buf.format = VIDEO_PALETTE_YUV422;
-
-                ret = ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf);
-                if (ret < 0 && errno != EAGAIN) {
-                    /* try RGB24 */
-                    s->gb_buf.format = VIDEO_PALETTE_RGB24;
-                    ret = ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf);
-                }
-            }
-        }
+        ret = ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf);
         if (ret < 0) {
             if (errno != EAGAIN) {
             fail1:



More information about the ffmpeg-devel mailing list