Skip to content

Commit 4aaba5b

Browse files
committed
obs-ffmpeg: Add end action 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 Action with three possible values : Hide, Freeze, Loop Keep previous looping property for compatibility with previous version
1 parent a6532fc commit 4aaba5b

File tree

2 files changed

+78
-5
lines changed

2 files changed

+78
-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
@@ -33,6 +33,10 @@ NVENC.CQLevel="CQ Level"
3333
FFmpegSource="Media Source"
3434
LocalFile="Local File"
3535
Looping="Loop"
36+
EndAction="End Action"
37+
EndAction.Hide="Hide"
38+
EndAction.Freeze="Freeze"
39+
EndAction.Loop="Loop"
3640
Input="Input"
3741
InputFormat="Input Format"
3842
BufferingMB="Network Buffering"

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

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,72 @@ static bool is_local_file_modified(obs_properties_t *props,
8686
obs_property_t *input_format =
8787
obs_properties_get(props, "input_format");
8888
obs_property_t *local_file = obs_properties_get(props, "local_file");
89-
obs_property_t *looping = obs_properties_get(props, "looping");
89+
obs_property_t *end_action = obs_properties_get(props, "end_action");
9090
obs_property_t *buffering = obs_properties_get(props, "buffering_mb");
9191
obs_property_t *seekable = obs_properties_get(props, "seekable");
9292
obs_property_t *speed = obs_properties_get(props, "speed_percent");
9393
obs_property_t *reconnect_delay_sec =
9494
obs_properties_get(props, "reconnect_delay_sec");
95+
obs_property_t *clear_on_media_end =
96+
obs_properties_get(props, "clear_on_media_end");
9597
obs_property_set_visible(input, !enabled);
9698
obs_property_set_visible(input_format, !enabled);
9799
obs_property_set_visible(buffering, !enabled);
98100
obs_property_set_visible(local_file, enabled);
99-
obs_property_set_visible(looping, enabled);
101+
obs_property_set_visible(end_action, enabled);
100102
obs_property_set_visible(speed, enabled);
101103
obs_property_set_visible(seekable, !enabled);
102104
obs_property_set_visible(reconnect_delay_sec, !enabled);
105+
obs_property_set_visible(clear_on_media_end, !enabled);
106+
107+
return true;
108+
}
109+
110+
static bool is_end_action_modified(obs_properties_t *props,
111+
obs_property_t *prop, obs_data_t *settings)
112+
{
113+
UNUSED_PARAMETER(prop);
114+
UNUSED_PARAMETER(props);
115+
int end_action = obs_data_get_int(settings, "end_action");
116+
bool looping = false;
117+
bool clear_on_media_end = true;
118+
119+
if (end_action == 1) { // End action : Hide
120+
clear_on_media_end = false;
121+
} else if (end_action == 2) { // End action : Loop
122+
clear_on_media_end = false;
123+
looping = true;
124+
}
125+
obs_data_set_bool(settings, "looping", looping);
126+
obs_data_set_bool(settings, "clear_on_media_end", clear_on_media_end);
127+
128+
return true;
129+
}
130+
131+
static void update_end_action_property_list(obs_data_t *settings)
132+
{
133+
bool clear_on_media_end =
134+
obs_data_get_bool(settings, "clear_on_media_end");
135+
bool looping = obs_data_get_bool(settings, "looping");
136+
int end_action = 0;
137+
138+
if (looping == true) {
139+
end_action = 2;
140+
} else if (clear_on_media_end == false) {
141+
end_action = 1;
142+
}
143+
144+
obs_data_set_int(settings, "end_action", end_action);
145+
}
146+
147+
static bool is_clear_on_media_end_modified(obs_properties_t *props,
148+
obs_property_t *prop,
149+
obs_data_t *settings)
150+
{
151+
UNUSED_PARAMETER(prop);
152+
UNUSED_PARAMETER(props);
153+
154+
update_end_action_property_list(settings);
103155

104156
return true;
105157
}
@@ -108,6 +160,7 @@ static void ffmpeg_source_defaults(obs_data_t *settings)
108160
{
109161
obs_data_set_default_bool(settings, "is_local_file", true);
110162
obs_data_set_default_bool(settings, "looping", false);
163+
obs_data_set_default_int(settings, "end_action", 0);
111164
obs_data_set_default_bool(settings, "clear_on_media_end", true);
112165
obs_data_set_default_bool(settings, "restart_on_activate", true);
113166
obs_data_set_default_bool(settings, "linear_alpha", false);
@@ -165,7 +218,19 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
165218
dstr_free(&filter);
166219
dstr_free(&path);
167220

168-
obs_properties_add_bool(props, "looping", obs_module_text("Looping"));
221+
prop = obs_properties_add_bool(props, "looping",
222+
obs_module_text("Looping"));
223+
obs_property_set_visible(prop, false);
224+
225+
prop = obs_properties_add_list(props, "end_action",
226+
obs_module_text("EndAction"),
227+
OBS_COMBO_TYPE_LIST,
228+
OBS_COMBO_FORMAT_INT);
229+
obs_property_list_add_int(prop, obs_module_text("EndAction.Hide"), 0);
230+
obs_property_list_add_int(prop, obs_module_text("EndAction.Freeze"), 1);
231+
obs_property_list_add_int(prop, obs_module_text("EndAction.Loop"), 2);
232+
233+
obs_property_set_modified_callback(prop, is_end_action_modified);
169234

170235
obs_properties_add_bool(props, "restart_on_activate",
171236
obs_module_text("RestartWhenActivated"));
@@ -190,8 +255,11 @@ static obs_properties_t *ffmpeg_source_getproperties(void *data)
190255
obs_properties_add_bool(props, "hw_decode",
191256
obs_module_text("HardwareDecode"));
192257

193-
obs_properties_add_bool(props, "clear_on_media_end",
194-
obs_module_text("ClearOnMediaEnd"));
258+
prop = obs_properties_add_bool(props, "clear_on_media_end",
259+
obs_module_text("ClearOnMediaEnd"));
260+
261+
obs_property_set_modified_callback(prop,
262+
is_clear_on_media_end_modified);
195263

196264
prop = obs_properties_add_bool(
197265
props, "close_when_inactive",
@@ -411,6 +479,7 @@ static void ffmpeg_source_update(void *data, obs_data_t *settings)
411479
input = (char *)obs_data_get_string(settings, "local_file");
412480
input_format = NULL;
413481
s->is_looping = obs_data_get_bool(settings, "looping");
482+
update_end_action_property_list(settings);
414483
} else {
415484
input = (char *)obs_data_get_string(settings, "input");
416485
input_format =

0 commit comments

Comments
 (0)