Mercurial > libavformat.hg
comparison grab.c @ 451:31784bdb76ee libavformat
ring buffer fix by (Luca Abeni <lucabe72 at email dot it>)
author | michael |
---|---|
date | Sun, 25 Apr 2004 13:30:21 +0000 |
parents | 845f9de2c883 |
children | e5174af0f52f |
comparison
equal
deleted
inserted
replaced
450:85439137fc30 | 451:31784bdb76ee |
---|---|
64 int ret, frame_rate, frame_rate_base; | 64 int ret, frame_rate, frame_rate_base; |
65 int desired_palette; | 65 int desired_palette; |
66 struct video_tuner tuner; | 66 struct video_tuner tuner; |
67 struct video_audio audio; | 67 struct video_audio audio; |
68 const char *video_device; | 68 const char *video_device; |
69 int j; | |
69 | 70 |
70 if (!ap || ap->width <= 0 || ap->height <= 0 || ap->frame_rate <= 0) | 71 if (!ap || ap->width <= 0 || ap->height <= 0 || ap->frame_rate <= 0) |
71 return -1; | 72 return -1; |
72 | 73 |
73 width = ap->width; | 74 width = ap->width; |
227 } else { | 228 } else { |
228 av_log(s1, AV_LOG_ERROR,"Fatal: grab device does not receive any video signal\n"); | 229 av_log(s1, AV_LOG_ERROR,"Fatal: grab device does not receive any video signal\n"); |
229 } | 230 } |
230 goto fail; | 231 goto fail; |
231 } | 232 } |
233 for (j = 1; j < s->gb_buffers.frames; j++) { | |
234 s->gb_buf.frame = j; | |
235 ioctl(video_fd, VIDIOCMCAPTURE, &s->gb_buf); | |
236 } | |
232 s->frame_format = s->gb_buf.format; | 237 s->frame_format = s->gb_buf.format; |
233 s->use_mmap = 1; | 238 s->use_mmap = 1; |
234 } | 239 } |
235 | 240 |
236 switch(s->frame_format) { | 241 switch(s->frame_format) { |
271 | 276 |
272 static int v4l_mm_read_picture(VideoData *s, uint8_t *buf) | 277 static int v4l_mm_read_picture(VideoData *s, uint8_t *buf) |
273 { | 278 { |
274 uint8_t *ptr; | 279 uint8_t *ptr; |
275 | 280 |
281 while (ioctl(s->fd, VIDIOCSYNC, &s->gb_frame) < 0 && | |
282 (errno == EAGAIN || errno == EINTR)); | |
283 | |
284 ptr = s->video_buf + s->gb_buffers.offsets[s->gb_frame]; | |
285 memcpy(buf, ptr, s->frame_size); | |
286 | |
276 /* Setup to capture the next frame */ | 287 /* Setup to capture the next frame */ |
277 s->gb_buf.frame = (s->gb_frame + 1) % s->gb_buffers.frames; | 288 s->gb_buf.frame = s->gb_frame; |
278 if (ioctl(s->fd, VIDIOCMCAPTURE, &s->gb_buf) < 0) { | 289 if (ioctl(s->fd, VIDIOCMCAPTURE, &s->gb_buf) < 0) { |
279 if (errno == EAGAIN) | 290 if (errno == EAGAIN) |
280 av_log(NULL, AV_LOG_ERROR, "Cannot Sync\n"); | 291 av_log(NULL, AV_LOG_ERROR, "Cannot Sync\n"); |
281 else | 292 else |
282 perror("VIDIOCMCAPTURE"); | 293 perror("VIDIOCMCAPTURE"); |
283 return -EIO; | 294 return -EIO; |
284 } | 295 } |
285 | 296 |
286 while (ioctl(s->fd, VIDIOCSYNC, &s->gb_frame) < 0 && | |
287 (errno == EAGAIN || errno == EINTR)); | |
288 | |
289 ptr = s->video_buf + s->gb_buffers.offsets[s->gb_frame]; | |
290 memcpy(buf, ptr, s->frame_size); | |
291 | |
292 /* This is now the grabbing frame */ | 297 /* This is now the grabbing frame */ |
293 s->gb_frame = s->gb_buf.frame; | 298 s->gb_frame = (s->gb_frame + 1) % s->gb_buffers.frames; |
294 | 299 |
295 return s->frame_size; | 300 return s->frame_size; |
296 } | 301 } |
297 | 302 |
298 static int grab_read_packet(AVFormatContext *s1, AVPacket *pkt) | 303 static int grab_read_packet(AVFormatContext *s1, AVPacket *pkt) |