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"); char *input; char *input_format; bfree(s->input); bfree(s->input_format); if (is_local_file) { input = (char *)obs_data_get_string(settings, "local_file"); input_format = NULL; s->is_looping = obs_data_get_bool(settings, "looping"); s->close_when_inactive = obs_data_get_bool(settings, "close_when_inactive"); obs_source_set_async_unbuffered(s->source, true); } else { input = (char *)obs_data_get_string(settings, "input"); input_format = (char *)obs_data_get_string(settings, "input_format"); s->is_looping = false; s->close_when_inactive = true; obs_source_set_async_unbuffered(s->source, false); } s->input = input ? bstrdup(input) : NULL; s->input_format = input_format ? bstrdup(input_format) : NULL; #ifndef __APPLE__ s->is_hw_decoding = obs_data_get_bool(settings, "hw_decode"); #endif s->is_clear_on_media_end = obs_data_get_bool(settings, "clear_on_media_end"); s->restart_on_activate = obs_data_get_bool(settings, "restart_on_activate"); s->range = (enum video_range_type)obs_data_get_int(settings, "color_range"); s->buffering_mb = (int)obs_data_get_int(settings, "buffering_mb"); s->is_local_file = is_local_file; if (s->media_valid) { mp_media_free(&s->media); s->media_valid = false; } bool active = obs_source_active(s->source); if (!s->close_when_inactive || active) ffmpeg_source_open(s); dump_source_info(s, input, input_format); if (!s->restart_on_activate || active) ffmpeg_source_start(s); }
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"); char *input; char *input_format; bfree(s->input); bfree(s->input_format); if (is_local_file) { input = (char *)obs_data_get_string(settings, "local_file"); input_format = NULL; s->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"); s->is_looping = false; } s->input = input ? bstrdup(input) : NULL; s->input_format = input_format ? bstrdup(input_format) : NULL; s->is_advanced = is_advanced; 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"); s->restart_on_activate = obs_data_get_bool(settings, "restart_on_activate"); s->is_forcing_scale = true; if (is_advanced) { s->audio_buffer_size = (int)obs_data_get_int(settings, "audio_buffer_size"); s->video_buffer_size = (int)obs_data_get_int(settings, "video_buffer_size"); s->frame_drop = (enum AVDiscard)obs_data_get_int(settings, "frame_drop"); s->is_forcing_scale = obs_data_get_bool(settings, "force_scale"); if (s->audio_buffer_size < 1) { s->audio_buffer_size = 1; FF_BLOG(LOG_WARNING, "invalid audio_buffer_size %d", s->audio_buffer_size); } if (s->video_buffer_size < 1) { s->video_buffer_size = 1; FF_BLOG(LOG_WARNING, "invalid audio_buffer_size %d", s->audio_buffer_size); } if (s->frame_drop < AVDISCARD_NONE || s->frame_drop > AVDISCARD_ALL) { s->frame_drop = AVDISCARD_DEFAULT; FF_BLOG(LOG_WARNING, "invalid frame_drop %d", s->frame_drop); } } dump_source_info(s, input, input_format, is_advanced); if (!s->restart_on_activate || obs_source_active(s->source)) ffmpeg_source_start(s); }
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); }