summaryrefslogtreecommitdiff
path: root/libavformat/grab.c
diff options
context:
space:
mode:
authorFlavio Pimentel Duarte <flaviop@land.ufrj.br>2006-05-04 12:23:12 +0000
committerLuca Abeni <lucabe72@email.it>2006-05-04 12:23:12 +0000
commitc787ba854e1f09f2932a8764f5f27ecf8f8165cb (patch)
tree719e75ce4cf2e987639bb140e9055366d7c961fa /libavformat/grab.c
parenta487e0f6544729b6c26115b15e2d7d45df0a99c8 (diff)
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
Diffstat (limited to 'libavformat/grab.c')
-rw-r--r--libavformat/grab.c73
1 files changed, 29 insertions, 44 deletions
diff --git a/libavformat/grab.c b/libavformat/grab.c
index e16ea7b875..79bdf9ddc7 100644
--- a/libavformat/grab.c
+++ b/libavformat/grab.c
@@ -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;
-
- 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;
+ s->gb_buf.format = pict.palette;
- 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: