From 1db5733ab4e4e48a9aca6ed26b2a45e287fb8c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Thu, 24 Oct 2024 20:32:42 +0200 Subject: [PATCH] fix: Fix reset MSE to last independent segment (#7494) --- lib/media/segment_index.js | 20 ++++++++++++++++++++ lib/media/streaming_engine.js | 6 ++++++ test/test/util/simple_fakes.js | 2 ++ 3 files changed, 28 insertions(+) diff --git a/lib/media/segment_index.js b/lib/media/segment_index.js index deec75a9ce..2142aeab28 100644 --- a/lib/media/segment_index.js +++ b/lib/media/segment_index.js @@ -679,6 +679,26 @@ shaka.media.SegmentIterator = class { 'done': !res, }; } + + /** + * @export + */ + resetToLastIndependent() { + const current = this.current(); + if (current.isPartial() && !current.isIndependent()) { + const ref = this.segmentIndex_.get(this.currentPosition_); + if (ref && ref.hasPartialSegments()) { + let partial = ref.partialReferences[this.currentPartialPosition_]; + while (partial.isIndependent()) { + if (this.currentPartialPosition_ <= 0) { + break; + } + this.currentPartialPosition_--; + partial = ref.partialReferences[this.currentPartialPosition_]; + } + } + } + } }; diff --git a/lib/media/streaming_engine.js b/lib/media/streaming_engine.js index c02f5a3d73..3859ac2ec1 100644 --- a/lib/media/streaming_engine.js +++ b/lib/media/streaming_engine.js @@ -2913,12 +2913,18 @@ shaka.media.StreamingEngine = class { audioMediaState.lastInitSegmentReference = null; this.forceClearBuffer_(audioMediaState); this.abortOperations_(audioMediaState).catch(() => {}); + if (audioMediaState.segmentIterator) { + audioMediaState.segmentIterator.resetToLastIndependent(); + } } const videoMediaState = this.mediaStates_.get(ContentType.VIDEO); if (videoMediaState) { videoMediaState.lastInitSegmentReference = null; this.forceClearBuffer_(videoMediaState); this.abortOperations_(videoMediaState).catch(() => {}); + if (videoMediaState.segmentIterator) { + videoMediaState.segmentIterator.resetToLastIndependent(); + } } /** * @type {!Map. {}, + + resetToLastIndependent: () => {}, }; }); }