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)