From 4dfce290f2ef5fbbdd2e02c163a288ad79d2576d Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Fri, 5 Jul 2024 11:35:12 +0530 Subject: [PATCH] aws/s3hlssink: Do not call abort before finishing uploads Part-of: --- net/aws/src/s3hlssink/imp.rs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/net/aws/src/s3hlssink/imp.rs b/net/aws/src/s3hlssink/imp.rs index 825920d1..9303750d 100644 --- a/net/aws/src/s3hlssink/imp.rs +++ b/net/aws/src/s3hlssink/imp.rs @@ -413,7 +413,11 @@ impl S3HlsSink { }; let mut state = self.state.lock().unwrap(); - *state = State::Stopped + *state = State::Stopped; + + let mut canceller = self.canceller.lock().unwrap(); + canceller.abort(); + *canceller = s3utils::Canceller::None; } fn create_stats(&self) -> gst::Structure { @@ -802,19 +806,10 @@ impl ElementImpl for S3HlsSink { PAD_TEMPLATES.as_ref() } - #[allow(clippy::single_match)] fn change_state( &self, transition: gst::StateChange, ) -> Result { - match transition { - gst::StateChange::PausedToReady => { - let mut canceller = self.canceller.lock().unwrap(); - canceller.abort(); - } - _ => (), - } - let ret = self.parent_change_state(transition)?; /* * The settings lock must not be taken before the parent state change. @@ -823,6 +818,13 @@ impl ElementImpl for S3HlsSink { */ let settings = self.settings.lock().unwrap(); + /* + * We do not call abort on the canceller in change_state here as + * that results in the final playlist and media segment uploads + * being aborted leaving the media segments and playlist in an + * unplayable state. All finalisation is carried out in `stop` + * which is called for ReadyToNull transition. + */ match transition { gst::StateChange::ReadyToPaused => { let mut state = self.state.lock().unwrap(); @@ -858,11 +860,6 @@ impl ElementImpl for S3HlsSink { } } - gst::StateChange::PausedToReady => { - let mut canceller = self.canceller.lock().unwrap(); - *canceller = s3utils::Canceller::None; - } - gst::StateChange::ReadyToNull => { drop(settings); /*