fallbacksrc: Don't keep CustomSource state locked while adding/removing pads

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2474>
This commit is contained in:
Sebastian Dröge 2025-08-18 13:08:07 +03:00
parent 6fb729d771
commit a005cf8e05

View file

@ -608,23 +608,35 @@ impl CustomSource {
.src(&*self.obj()) .src(&*self.obj())
.build(); .build();
self.expose_only_selected_streams(state); self.expose_only_selected_streams(state_guard);
Some(message) Some(message)
} }
fn expose_only_selected_streams(&self, state: &mut State) { fn expose_only_selected_streams(&self, state: MutexGuard<State>) {
let mut to_add = vec![];
let mut to_remove = vec![];
for stream in state.pads.iter() { for stream in state.pads.iter() {
if stream.is_selected && !stream.is_exposed() { if stream.is_selected && !stream.is_exposed() {
let event = gst::event::StreamStart::builder(&stream.stream.stream_id().unwrap()) let event = gst::event::StreamStart::builder(&stream.stream.stream_id().unwrap())
.stream(stream.stream.clone()) .stream(stream.stream.clone())
.build(); .build();
stream.ghost_pad.store_sticky_event(&event).unwrap(); 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() { } else if !stream.is_selected && stream.is_exposed() {
let _ = stream.ghost_pad.set_target(None::<&gst::Pad>); 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) { fn stop(&self) {