struct video_frame * vidcap_aggregate_grab(void *state, struct audio_frame **audio) { struct vidcap_aggregate_state *s = (struct vidcap_aggregate_state *) state; struct audio_frame *audio_frame; struct video_frame *frame = NULL; int i; while(!frame) { frame = vidcap_grab(s->devices[0], &audio_frame); } s->frame->color_spec = frame->color_spec; s->frame->interlacing = frame->interlacing; s->frame->fps = frame->fps; vf_get_tile(s->frame, 0)->width = vf_get_tile(frame, 0)->width; vf_get_tile(s->frame, 0)->height = vf_get_tile(frame, 0)->height; vf_get_tile(s->frame, 0)->data_len = vf_get_tile(frame, 0)->data_len; vf_get_tile(s->frame, 0)->data = vf_get_tile(frame, 0)->data; if(audio_frame) { *audio = audio_frame; } else { *audio = NULL; } for(i = 1; i < s->devices_cnt; ++i) { while(!frame) { frame = vidcap_grab(s->devices[0], &audio_frame); } if(frame->color_spec != s->frame->color_spec || frame->fps != s->frame->fps || frame->interlacing != s->frame->interlacing) { fprintf(stderr, "[aggregate] Different format detected: "); if(frame->color_spec != s->frame->color_spec) fprintf(stderr, "codec"); if(frame->interlacing != s->frame->interlacing) fprintf(stderr, "interlacing"); if(frame->fps != s->frame->fps) fprintf(stderr, "FPS"); fprintf(stderr, "\n"); return NULL; } vf_get_tile(s->frame, i)->width = vf_get_tile(frame, 0)->width; vf_get_tile(s->frame, i)->height = vf_get_tile(frame, 0)->height; vf_get_tile(s->frame, i)->data_len = vf_get_tile(frame, 0)->data_len; vf_get_tile(s->frame, i)->data = vf_get_tile(frame, 0)->data; } s->frames++; gettimeofday(&s->t, NULL); double seconds = tv_diff(s->t, s->t0); if (seconds >= 5) { float fps = s->frames / seconds; fprintf(stderr, "[aggregate cap.] %d frames in %g seconds = %g FPS\n", s->frames, seconds, fps); s->t0 = s->t; s->frames = 0; } return s->frame; }
static struct video_frame * vidcap_aggregate_grab(void *state, struct audio_frame **audio) { struct vidcap_aggregate_state *s = (struct vidcap_aggregate_state *) state; struct audio_frame *audio_frame = NULL; struct video_frame *frame = NULL; for (int i = 0; i < s->devices_cnt; ++i) { VIDEO_FRAME_DISPOSE(s->captured_frames[i]); } *audio = NULL; for (int i = 0; i < s->devices_cnt; ++i) { frame = NULL; while(!frame) { frame = vidcap_grab(s->devices[i], &audio_frame); } if (i == 0) { s->frame->color_spec = frame->color_spec; s->frame->interlacing = frame->interlacing; s->frame->fps = frame->fps; } if (s->audio_source_index == -1 && audio_frame != NULL) { fprintf(stderr, "[aggregate] Locking device #%d as an audio source.\n", i); s->audio_source_index = i; } if (s->audio_source_index == i) { *audio = audio_frame; } if (frame->color_spec != s->frame->color_spec || frame->fps != s->frame->fps || frame->interlacing != s->frame->interlacing) { fprintf(stderr, "[aggregate] Different format detected: "); if(frame->color_spec != s->frame->color_spec) fprintf(stderr, "codec"); if(frame->interlacing != s->frame->interlacing) fprintf(stderr, "interlacing"); if(frame->fps != s->frame->fps) fprintf(stderr, "FPS (%.2f and %.2f)", frame->fps, s->frame->fps); fprintf(stderr, "\n"); return NULL; } vf_get_tile(s->frame, i)->width = vf_get_tile(frame, 0)->width; vf_get_tile(s->frame, i)->height = vf_get_tile(frame, 0)->height; vf_get_tile(s->frame, i)->data_len = vf_get_tile(frame, 0)->data_len; vf_get_tile(s->frame, i)->data = vf_get_tile(frame, 0)->data; s->captured_frames[i] = frame; } s->frames++; gettimeofday(&s->t, NULL); double seconds = tv_diff(s->t, s->t0); if (seconds >= 5) { float fps = s->frames / seconds; log_msg(LOG_LEVEL_INFO, "[aggregate cap.] %d frames in %g seconds = %g FPS\n", s->frames, seconds, fps); s->t0 = s->t; s->frames = 0; } return s->frame; }