mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-02-21 07:06:19 +00:00
fmp4mux: Fix state cleanup on flush
State cleanup was incomplete. If a flush happens we do not have any buffers anymore so all buffer queue related settings must be cleared on the state. Flush action has been moved into state impl. The GstAggregatorPad flush() was implemented as well as the pad flush handler - with different implementations. Unify it. Fixes #636 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1968>
This commit is contained in:
parent
dec6cb5c3a
commit
207196a033
1 changed files with 33 additions and 26 deletions
|
@ -230,6 +230,17 @@ struct Stream {
|
|||
extra_header_data: Option<Vec<u8>>,
|
||||
}
|
||||
|
||||
impl Stream {
|
||||
fn flush(&mut self) {
|
||||
self.queued_gops.clear();
|
||||
self.dts_offset = None;
|
||||
self.current_position = gst::ClockTime::ZERO;
|
||||
self.fragment_filled = false;
|
||||
self.pre_queue.clear();
|
||||
self.running_time_utc_time_mapping = None;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct State {
|
||||
/// Currently configured streams.
|
||||
|
@ -273,6 +284,20 @@ struct State {
|
|||
sent_headers: bool,
|
||||
}
|
||||
|
||||
impl State {
|
||||
fn flush(&mut self) {
|
||||
for stream in &mut self.streams {
|
||||
stream.flush();
|
||||
}
|
||||
|
||||
self.current_offset = 0;
|
||||
self.fragment_offsets.clear();
|
||||
self.end_pts = None;
|
||||
self.fragment_start_pts = None;
|
||||
self.chunk_start_pts = None;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub(crate) struct FMP4Mux {
|
||||
state: Mutex<State>,
|
||||
|
@ -3302,22 +3327,8 @@ impl AggregatorImpl for FMP4Mux {
|
|||
}
|
||||
|
||||
fn flush(&self) -> Result<gst::FlowSuccess, gst::FlowError> {
|
||||
let mut state = self.state.lock().unwrap();
|
||||
|
||||
for stream in &mut state.streams {
|
||||
stream.queued_gops.clear();
|
||||
stream.dts_offset = None;
|
||||
stream.current_position = gst::ClockTime::ZERO;
|
||||
stream.fragment_filled = false;
|
||||
stream.pre_queue.clear();
|
||||
stream.running_time_utc_time_mapping = None;
|
||||
}
|
||||
|
||||
state.current_offset = 0;
|
||||
state.fragment_offsets.clear();
|
||||
|
||||
drop(state);
|
||||
|
||||
gst::trace!(CAT, imp = self, "Flush");
|
||||
self.state.lock().unwrap().flush();
|
||||
self.parent_flush()
|
||||
}
|
||||
|
||||
|
@ -4011,16 +4022,12 @@ impl AggregatorPadImpl for FMP4MuxPad {
|
|||
let mux = aggregator.downcast_ref::<super::FMP4Mux>().unwrap();
|
||||
let mut mux_state = mux.imp().state.lock().unwrap();
|
||||
|
||||
for stream in &mut mux_state.streams {
|
||||
if stream.sinkpad == *self.obj() {
|
||||
stream.queued_gops.clear();
|
||||
stream.dts_offset = None;
|
||||
stream.current_position = gst::ClockTime::ZERO;
|
||||
stream.fragment_filled = false;
|
||||
stream.pre_queue.clear();
|
||||
stream.running_time_utc_time_mapping = None;
|
||||
break;
|
||||
}
|
||||
if let Some(stream) = mux_state
|
||||
.streams
|
||||
.iter_mut()
|
||||
.find(|s| s.sinkpad == *self.obj())
|
||||
{
|
||||
stream.flush();
|
||||
}
|
||||
|
||||
drop(mux_state);
|
||||
|
|
Loading…
Reference in a new issue