mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-17 20:17:55 +02:00
ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
Originally committed as revision 3067 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
92a69cf868
commit
7aae316869
@ -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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user