Commit 7aae3168 authored by Michael Niedermayer's avatar Michael Niedermayer

ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)

Originally committed as revision 3067 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 92a69cf8
...@@ -66,6 +66,7 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap) ...@@ -66,6 +66,7 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
struct video_tuner tuner; struct video_tuner tuner;
struct video_audio audio; struct video_audio audio;
const char *video_device; const char *video_device;
int j;
if (!ap || ap->width <= 0 || ap->height <= 0 || ap->frame_rate <= 0) if (!ap || ap->width <= 0 || ap->height <= 0 || ap->frame_rate <= 0)
return -1; return -1;
...@@ -229,6 +230,10 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap) ...@@ -229,6 +230,10 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
} }
goto fail; goto fail;
} }
for (j = 1; j < s->gb_buffers.frames; j++) {
s->gb_buf.frame = j;
ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf);
}
s->frame_format = s->gb_buf.format; s->frame_format = s->gb_buf.format;
s->use_mmap = 1; s->use_mmap = 1;
} }
...@@ -273,8 +278,14 @@ static int v4l_mm_read_picture(VideoData *s, uint8_t *buf) ...@@ -273,8 +278,14 @@ static int v4l_mm_read_picture(VideoData *s, uint8_t *buf)
{ {
uint8_t *ptr; uint8_t *ptr;
while (ioctl(s->fd, VIDIOCSYNC, &s->gb_frame) < 0 &&
(errno == EAGAIN || errno == EINTR));
ptr = s->video_buf + s->gb_buffers.offsets[s->gb_frame];
memcpy(buf, ptr, s->frame_size);
/* Setup to capture the next frame */ /* Setup to capture the next frame */
s->gb_buf.frame = (s->gb_frame + 1) % s->gb_buffers.frames; s->gb_buf.frame = s->gb_frame;
if (ioctl(s->fd, VIDIOCMCAPTURE, &s->gb_buf) < 0) { if (ioctl(s->fd, VIDIOCMCAPTURE, &s->gb_buf) < 0) {
if (errno == EAGAIN) if (errno == EAGAIN)
av_log(NULL, AV_LOG_ERROR, "Cannot Sync\n"); av_log(NULL, AV_LOG_ERROR, "Cannot Sync\n");
...@@ -283,14 +294,8 @@ static int v4l_mm_read_picture(VideoData *s, uint8_t *buf) ...@@ -283,14 +294,8 @@ static int v4l_mm_read_picture(VideoData *s, uint8_t *buf)
return -EIO; return -EIO;
} }
while (ioctl(s->fd, VIDIOCSYNC, &s->gb_frame) < 0 &&
(errno == EAGAIN || errno == EINTR));
ptr = s->video_buf + s->gb_buffers.offsets[s->gb_frame];
memcpy(buf, ptr, s->frame_size);
/* This is now the grabbing frame */ /* This is now the grabbing frame */
s->gb_frame = s->gb_buf.frame; s->gb_frame = (s->gb_frame + 1) % s->gb_buffers.frames;
return s->frame_size; return s->frame_size;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment