diff --git a/libav/grab.c b/libav/grab.c index 00e268d6fd..6203d83849 100644 --- a/libav/grab.c +++ b/libav/grab.c @@ -42,7 +42,7 @@ static struct video_capability video_cap; static UINT8 *video_buf; static struct video_mbuf gb_buffers; static struct video_mmap gb_buf; -static struct video_audio audio; +static struct video_audio audio, audio_saved; static int gb_frame = 0; static int v4l_init(URLContext *h) @@ -73,6 +73,7 @@ static int v4l_init(URLContext *h) /* unmute audio */ ioctl(video_fd, VIDIOCGAUDIO, &audio); + memcpy(&audio_saved, &audio, sizeof(audio)); audio.flags &= ~VIDEO_AUDIO_MUTE; ioctl(video_fd, VIDIOCSAUDIO, &audio); @@ -132,7 +133,7 @@ static int v4l_init(URLContext *h) s->time_frame = gettime(); /* start to grab the first frame */ - gb_buf.frame = 1 - gb_frame; + gb_buf.frame = (gb_frame + 1) % gb_buffers.frames; gb_buf.height = height; gb_buf.width = width; gb_buf.format = VIDEO_PALETTE_YUV420P; @@ -196,7 +197,7 @@ static int v4l_mm_read_picture(URLContext *h, UINT8 *buf) perror("VIDIOCMCAPTURE"); return -EIO; } - gb_frame = 1 - gb_frame; + gb_frame = (gb_frame + 1) % gb_buffers.frames; while (ioctl(s->fd, VIDIOCSYNC, &gb_frame) < 0 && (errno == EAGAIN || errno == EINTR)); @@ -301,6 +302,9 @@ static int video_close(URLContext *h) { VideoData *s = h->priv_data; + /* restore audio settings */ + ioctl(s->fd, VIDIOCSAUDIO, &audio_saved); + close(s->fd); free(s); return 0;