static void ffmpeg_source_start(struct ffmpeg_source *s) { if (s->demuxer != NULL) ff_demuxer_free(s->demuxer); s->demuxer = ff_demuxer_init(); s->demuxer->options.is_hw_decoding = s->is_hw_decoding; s->demuxer->options.is_looping = s->is_looping; ff_demuxer_set_callbacks(&s->demuxer->video_callbacks, video_frame, NULL, NULL, NULL, NULL, s); ff_demuxer_set_callbacks(&s->demuxer->audio_callbacks, audio_frame, NULL, NULL, NULL, NULL, s); if (s->is_advanced) { s->demuxer->options.audio_frame_queue_size = s->audio_buffer_size; s->demuxer->options.video_frame_queue_size = s->video_buffer_size; s->demuxer->options.frame_drop = s->frame_drop; } ff_demuxer_open(s->demuxer, s->input, s->input_format); }
static void ffmpeg_source_update(void *data, obs_data_t *settings) { struct ffmpeg_source *s = data; bool is_local_file = obs_data_get_bool(settings, "is_local_file"); bool is_advanced = obs_data_get_bool(settings, "advanced"); bool is_looping; char *input; char *input_format; if (is_local_file) { input = (char *)obs_data_get_string(settings, "local_file"); input_format = NULL; is_looping = obs_data_get_bool(settings, "looping"); } else { input = (char *)obs_data_get_string(settings, "input"); input_format = (char *)obs_data_get_string(settings, "input_format"); is_looping = false; } s->is_forcing_scale = obs_data_get_bool(settings, "force_scale"); s->is_hw_decoding = obs_data_get_bool(settings, "hw_decode"); s->is_clear_on_media_end = obs_data_get_bool(settings, "clear_on_media_end"); if (s->demuxer != NULL) ff_demuxer_free(s->demuxer); s->demuxer = ff_demuxer_init(); s->demuxer->options.is_hw_decoding = s->is_hw_decoding; s->demuxer->options.is_looping = is_looping; if (is_advanced) { int audio_buffer_size = (int)obs_data_get_int(settings, "audio_buffer_size"); int video_buffer_size = (int)obs_data_get_int(settings, "video_buffer_size"); enum AVDiscard frame_drop = (enum AVDiscard)obs_data_get_int(settings, "frame_drop"); if (audio_buffer_size < 1) { audio_buffer_size = 1; FF_BLOG(LOG_WARNING, "invalid audio_buffer_size %d", audio_buffer_size); } if (video_buffer_size < 1) { video_buffer_size = 1; FF_BLOG(LOG_WARNING, "invalid audio_buffer_size %d", audio_buffer_size); } s->demuxer->options.audio_frame_queue_size = audio_buffer_size; s->demuxer->options.video_frame_queue_size = video_buffer_size; if (frame_drop < AVDISCARD_NONE || frame_drop > AVDISCARD_ALL) { frame_drop = AVDISCARD_NONE; FF_BLOG(LOG_WARNING, "invalid frame_drop %d", frame_drop); } s->demuxer->options.frame_drop = frame_drop; } ff_demuxer_set_callbacks(&s->demuxer->video_callbacks, video_frame, NULL, NULL, NULL, NULL, s); ff_demuxer_set_callbacks(&s->demuxer->audio_callbacks, audio_frame, NULL, NULL, NULL, NULL, s); dump_source_info(s, input, input_format, is_advanced); ff_demuxer_open(s->demuxer, input, input_format); }