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