# HG changeset patch # User lucabe # Date 1146745392 0 # Node ID b14b8b976bceb7e21a05da6ab2be6bb3c7d14997 # Parent 3d7fae1dfda4d0a3c8a1882d27ff7248f0b561a9 Fix v4l grabbing with some webcams, and simplify the code. Patch by Flavio Pimentel Duarte diff -r 3d7fae1dfda4 -r b14b8b976bce grab.c --- a/grab.c Mon May 01 15:52:57 2006 +0000 +++ b/grab.c Thu May 04 12:23:12 2006 +0000 @@ -65,6 +65,7 @@ int desired_palette; struct video_tuner tuner; struct video_audio audio; + struct video_picture pict; const char *video_device; int j; @@ -143,11 +144,36 @@ 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; @@ -159,32 +185,6 @@ 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; @@ -215,24 +215,9 @@ 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: