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 b3a671bdc8..38056b0314 100644 --- a/lib/media/streaming_engine.js +++ b/lib/media/streaming_engine.js @@ -2871,6 +2871,9 @@ shaka.media.StreamingEngine = class { this.forceClearBuffer_(audioMediaState); } this.abortOperations_(audioMediaState).catch(() => {}); + if (audioMediaState.segmentIterator) { + audioMediaState.segmentIterator.resetToLastIndependent(); + } } const videoMediaState = this.mediaStates_.get(ContentType.VIDEO); if (videoMediaState) { @@ -2879,6 +2882,9 @@ shaka.media.StreamingEngine = class { this.forceClearBuffer_(videoMediaState); } this.abortOperations_(videoMediaState).catch(() => {}); + if (videoMediaState.segmentIterator) { + videoMediaState.segmentIterator.resetToLastIndependent(); + } } /** * @type {!Map. {}, + + resetToLastIndependent: () => {}, }; }); }