@@ -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