Skip to content

Commit ae96c4a

Browse files
committed
obs-ffmpeg: Add end playback UI property for local file source
For local file, replace UI properties : "Loop" and "Show nothing when playback ends" by a property list call End of Playback with three possible values : Show Nothing, Freeze on last frame, Loop Keep previous looping property for compatibility with previous version
1 parent bf98594 commit ae96c4a

File tree

2 files changed

+83
-5
lines changed

2 files changed

+83
-5
lines changed

plugins/obs-ffmpeg/data/locale/en-US.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ NVENC.TooManyBFrames="Max B-frames setting (%d) is more than encoder supports (%
3636
FFmpegSource="Media Source"
3737
LocalFile="Local File"
3838
Looping="Loop"
39+
EndPlayback="End of Playback"
40+
EndPlayback.ShowNothing="Show Nothing"
41+
EndPlayback.Freeze="Freeze on last frame"
42+
EndPlayback.Loop="Loop"
3943
Input="Input"
4044
InputFormat="Input Format"
4145
BufferingMB="Network Buffering"

plugins/obs-ffmpeg/obs-ffmpeg-source.c

Lines changed: 79 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,73 @@ static bool is_local_file_modified(obs_properties_t *props,
8787
obs_property_t *input_format =
8888
obs_properties_get(props, "input_format");
8989
obs_property_t *local_file = obs_properties_get(props, "local_file");
90-
obs_property_t *looping = obs_properties_get(props, "looping");
90+
obs_property_t *end_playback =
91+
obs_properties_get(props, "end_playback");
9192
obs_property_t *buffering = obs_properties_get(props, "buffering_mb");
9293
obs_property_t *seekable = obs_properties_get(props, "seekable");
9394
obs_property_t *speed = obs_properties_get(props, "speed_percent");
9495
obs_property_t *reconnect_delay_sec =
9596
obs_properties_get(props, "reconnect_delay_sec");
97+
obs_property_t *clear_on_media_end =
98+
obs_properties_get(props, "clear_on_media_end");
9699
obs_property_set_visible(input, !enabled);
97100
obs_property_set_visible(input_format, !enabled);
98101
obs_property_set_visible(buffering, !enabled);
99102
obs_property_set_visible(local_file, enabled);
100-
obs_property_set_visible(looping, enabled);
103+
obs_property_set_visible(end_playback, enabled);
101104
obs_property_set_visible(speed, enabled);
102105
obs_property_set_visible(seekable, !enabled);
103106
obs_property_set_visible(reconnect_delay_sec, !enabled);
107+
obs_property_set_visible(clear_on_media_end, !enabled);
108+
109+
return true;
110+
}
111+
112+
static bool is_end_playback_modified(obs_properties_t *props,
113+
obs_property_t *prop, obs_data_t *settings)
114+
{
115+
UNUSED_PARAMETER(prop);
116+
UNUSED_PARAMETER(props);
117+
int end_playback = obs_data_get_int(settings, "end_playback");
118+
bool looping = false;
119+
bool clear_on_media_end = true;
120+
121+
if (end_playback == 1) { // End action : Hide
122+
clear_on_media_end = false;
123+
} else if (end_playback == 2) { // End action : Loop
124+
clear_on_media_end = false;
125+
looping = true;
126+
}
127+
obs_data_set_bool(settings, "looping", looping);
128+
obs_data_set_bool(settings, "clear_on_media_end", clear_on_media_end);
129+
130+
return true;
131+
}
132+
133+
static void update_end_playback_property_list(obs_data_t *settings)
134+
{
135+
bool clear_on_media_end =
136+
obs_data_get_bool(settings, "clear_on_media_end");
137+
bool looping = obs_data_get_bool(settings, "looping");
138+
int end_playback = 0;
139+
140+
if (looping == true) {
141+
end_playback = 2;
142+
} else if (clear_on_media_end == false) {
143+
end_playback = 1;
144+
}
145+
146+
obs_data_set_int(settings, "end_playback", end_playback);
147+
}
148+
149+
static bool is_clear_on_media_end_modified(obs_properties_t *props,
150+
obs_property_t *prop,
151+
obs_data_t *settings)
152+
{
153+
UNUSED_PARAMETER(prop);
154+
UNUSED_PARAMETER(props);
155+
156+
update_end_playback_property_list(settings);
104157

105158
return true;
106159
}
@@ -109,6 +162,7 @@ static void ffmpeg_source_defaults(obs_data_t *settings)
109162
{
110163
obs_data_set_default_bool(settings, "is_local_file", true);
111164
obs_data_set_default_bool(settings, "looping", false);
165+
obs_data_set_default_int(settings, "end_playback", 0);
112166
obs_data_set_default_bool(settings, "clear_on_media_end", true);
113167
obs_data_set_default_bool(settings, "restart_on_activate", true);
114168
obs_data_set_default_bool(settings, "linear_alpha", false);
@@ -166,7 +220,23 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
166220
dstr_free(&filter);
167221
dstr_free(&path);
168222

169-
obs_properties_add_bool(props, "looping", obs_module_text("Looping"));
223+
prop = obs_properties_add_bool(props, "looping",
224+
obs_module_text("Looping"));
225+
obs_property_set_visible(prop, false);
226+
227+
prop = obs_properties_add_list(props, "end_playback",
228+
obs_module_text("EndPlayback"),
229+
OBS_COMBO_TYPE_LIST,
230+
OBS_COMBO_FORMAT_INT);
231+
obs_property_list_add_int(
232+
prop, obs_module_text("EndPlayback.ShowNothing"), 0);
233+
234+
obs_property_list_add_int(prop, obs_module_text("EndPlayback.Freeze"),
235+
1);
236+
237+
obs_property_list_add_int(prop, obs_module_text("EndPlayback.Loop"), 2);
238+
239+
obs_property_set_modified_callback(prop, is_end_playback_modified);
170240

171241
obs_properties_add_bool(props, "restart_on_activate",
172242
obs_module_text("RestartWhenActivated"));
@@ -191,8 +261,11 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
191261
obs_properties_add_bool(props, "hw_decode",
192262
obs_module_text("HardwareDecode"));
193263

194-
obs_properties_add_bool(props, "clear_on_media_end",
195-
obs_module_text("ClearOnMediaEnd"));
264+
prop = obs_properties_add_bool(props, "clear_on_media_end",
265+
obs_module_text("ClearOnMediaEnd"));
266+
267+
obs_property_set_modified_callback(prop,
268+
is_clear_on_media_end_modified);
196269

197270
prop = obs_properties_add_bool(
198271
props, "close_when_inactive",
@@ -422,6 +495,7 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings)
422495
input = obs_data_get_string(settings, "local_file");
423496
input_format = NULL;
424497
s->is_looping = obs_data_get_bool(settings, "looping");
498+
update_end_playback_property_list(settings);
425499
} else {
426500
input = obs_data_get_string(settings, "input");
427501
input_format = obs_data_get_string(settings, "input_format");

0 commit comments

Comments
 (0)