From a005cf8e05aaff916e72e9df7aaafa46a7f996af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 18 Aug 2025 13:08:07 +0300 Subject: [PATCH] fallbacksrc: Don't keep CustomSource state locked while adding/removing pads Part-of: --- .../src/fallbacksrc/custom_source/imp.rs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/utils/fallbackswitch/src/fallbacksrc/custom_source/imp.rs b/utils/fallbackswitch/src/fallbacksrc/custom_source/imp.rs index d906eb8cd..437153358 100644 --- a/utils/fallbackswitch/src/fallbacksrc/custom_source/imp.rs +++ b/utils/fallbackswitch/src/fallbacksrc/custom_source/imp.rs @@ -608,23 +608,35 @@ impl CustomSource { .src(&*self.obj()) .build(); - self.expose_only_selected_streams(state); + self.expose_only_selected_streams(state_guard); Some(message) } - fn expose_only_selected_streams(&self, state: &mut State) { + fn expose_only_selected_streams(&self, state: MutexGuard) { + let mut to_add = vec![]; + let mut to_remove = vec![]; + for stream in state.pads.iter() { if stream.is_selected && !stream.is_exposed() { let event = gst::event::StreamStart::builder(&stream.stream.stream_id().unwrap()) .stream(stream.stream.clone()) .build(); stream.ghost_pad.store_sticky_event(&event).unwrap(); - self.obj().add_pad(&stream.ghost_pad).unwrap(); + to_add.push(stream.ghost_pad.clone()); } else if !stream.is_selected && stream.is_exposed() { let _ = stream.ghost_pad.set_target(None::<&gst::Pad>); - let _ = self.obj().remove_pad(&stream.ghost_pad); + to_remove.push(stream.ghost_pad.clone()); } } + drop(state); + + for pad in to_add { + self.obj().add_pad(&pad).unwrap(); + } + + for pad in to_remove { + let _ = self.obj().remove_pad(&pad); + } } fn stop(&self) {