diff --git a/plugins/obs-ffmpeg/data/locale/en-US.ini b/plugins/obs-ffmpeg/data/locale/en-US.ini index 7bc04a86b8b843..96463c0f25d72f 100644 --- a/plugins/obs-ffmpeg/data/locale/en-US.ini +++ b/plugins/obs-ffmpeg/data/locale/en-US.ini @@ -104,3 +104,5 @@ NVENC.CheckDrivers="Please check your video drivers are up to date." AV1.8bitUnsupportedHdr="OBS does not support 8-bit output of Rec. 2100." ReconnectDelayTime="Reconnect Delay" + +MediaSource.FFmpeg.PauseResume="Pause on deactivate, resume on activate" diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-source.c b/plugins/obs-ffmpeg/obs-ffmpeg-source.c index 2a1156f9762ce7..13829935df7edb 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-source.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-source.c @@ -58,6 +58,7 @@ struct ffmpeg_source { bool is_clear_on_media_end; bool restart_on_activate; bool close_when_inactive; + bool pause_and_resume; bool seekable; pthread_t reconnect_thread; @@ -115,6 +116,7 @@ static void ffmpeg_source_defaults(obs_data_t *settings) obs_data_set_default_int(settings, "reconnect_delay_sec", 10); obs_data_set_default_int(settings, "buffering_mb", 2); obs_data_set_default_int(settings, "speed_percent", 100); + obs_data_set_default_bool(settings, "pause_and_resume", false); } static const char *media_filter = @@ -200,6 +202,9 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data) obs_property_set_long_description( prop, obs_module_text("CloseFileWhenInactive.ToolTip")); + prop = obs_properties_add_bool(props, "pause_and_resume", + obs_module_text("MediaSource.FFmpeg.PauseResume")); + prop = obs_properties_add_int_slider(props, "speed_percent", obs_module_text("SpeedPercentage"), 1, 200, 1); @@ -465,6 +470,7 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings) s->is_local_file = is_local_file; s->seekable = obs_data_get_bool(settings, "seekable"); s->ffmpeg_options = ffmpeg_options ? bstrdup(ffmpeg_options) : NULL; + s->pause_and_resume = obs_data_get_bool(settings, "pause_and_resume"); if (s->speed_percent < 1 || s->speed_percent > 200) s->speed_percent = 100; @@ -666,6 +672,11 @@ static void ffmpeg_source_activate(void *data) { struct ffmpeg_source *s = data; + if (s->pause_and_resume && s->state == OBS_MEDIA_STATE_PAUSED) { + // resume on re-activate + obs_source_media_play_pause(s->source, false); + return; + } if (s->restart_on_activate) obs_source_media_restart(s->source); } @@ -674,6 +685,12 @@ static void ffmpeg_source_deactivate(void *data) { struct ffmpeg_source *s = data; + if (s->pause_and_resume && s->state == OBS_MEDIA_STATE_PLAYING) { + // pause on deactivate, leave it loaded + obs_source_media_play_pause(s->source, true); + return; + } + if (s->restart_on_activate) { if (s->media_valid) { mp_media_stop(&s->media);