Fix v4l grabbing with some webcams, and simplify the code.

Patch by Flavio Pimentel Duarte

Originally committed as revision 5343 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Flavio Pimentel Duarte 2006-05-04 12:23:12 +00:00 committed by Luca Abeni
parent a487e0f654
commit c787ba854e
1 changed files with 29 additions and 44 deletions

View File

@ -65,6 +65,7 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
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 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
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 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
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 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
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;
s->gb_buf.format = pict.palette;
if (desired_palette == -1 || (ret = ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf)) < 0) {
s->gb_buf.format = VIDEO_PALETTE_YUV420P;
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: