closedcaption: st2038ancdemux: Reset element correctly on state changes and flush-stop

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1777>
This commit is contained in:
Sebastian Dröge 2024-09-17 09:46:48 +03:00 committed by GStreamer Marge Bot
parent 623667af03
commit 0139a37014

View file

@ -18,6 +18,7 @@ use atomic_refcell::AtomicRefCell;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use std::collections::HashMap; use std::collections::HashMap;
use std::mem;
use crate::st2038anc_utils::AncDataHeader; use crate::st2038anc_utils::AncDataHeader;
@ -251,6 +252,12 @@ impl St2038AncDemux {
return ret; return ret;
} }
EventView::FlushStop(_) => {
let mut state = self.state.borrow_mut();
state.segment = gst::FormattedSegment::default();
state.last_inactivity_check = None;
state.flow_combiner.reset();
}
_ => {} _ => {}
} }
@ -315,6 +322,35 @@ impl ElementImpl for St2038AncDemux {
PAD_TEMPLATES.as_ref() PAD_TEMPLATES.as_ref()
} }
#[allow(clippy::single_match)]
fn change_state(
&self,
transition: gst::StateChange,
) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
match transition {
gst::StateChange::ReadyToPaused => {
let mut state = self.state.borrow_mut();
*state = State::default();
state.flow_combiner.add_pad(&self.srcpad);
}
_ => (),
}
let res = self.parent_change_state(transition)?;
match transition {
gst::StateChange::PausedToReady => {
let old_state = mem::take(&mut *self.state.borrow_mut());
for (_anc_id, stream) in old_state.streams {
let _ = self.obj().remove_pad(&stream.pad);
}
}
_ => (),
}
Ok(res)
}
} }
#[glib::object_subclass] #[glib::object_subclass]
@ -357,12 +393,8 @@ impl ObjectImpl for St2038AncDemux {
fn constructed(&self) { fn constructed(&self) {
self.parent_constructed(); self.parent_constructed();
let mut state = self.state.borrow_mut();
let obj = self.obj(); let obj = self.obj();
obj.add_pad(&self.sinkpad).unwrap(); obj.add_pad(&self.sinkpad).unwrap();
obj.add_pad(&self.srcpad).unwrap(); obj.add_pad(&self.srcpad).unwrap();
state.flow_combiner.add_pad(&self.srcpad);
} }
} }