Skip to content

Commit

Permalink
fix: Fix playRangeEnd for certain content
Browse files Browse the repository at this point in the history
For content where the manifest parser uses the notifySegments API
(DASH SegmentBase/SegmentList/SegmentTimeline, or HLS, but not DASH
SegmentTemplate+duration), the Player seekRangeEnd configuration was
not being honored correctly.

This fixes the issue in PresentationTimeline and adds a regression
test to our playRangeStart/playRangeEnds tests.

Fixed #4026
  • Loading branch information
joeyparrish committed Mar 28, 2022
1 parent 2c5457b commit 21e7a26
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 1 deletion.
7 changes: 7 additions & 0 deletions lib/media/presentation_timeline.js
Expand Up @@ -361,6 +361,13 @@ shaka.media.PresentationTimeline = class {
getSegmentAvailabilityEnd() {
if (!this.isLive() && !this.isInProgress()) {
// It's a static manifest (can also be a dynamic->static conversion)
if (this.maxSegmentEndTime_ && this.duration_) {
// If we have both, use the min of the two.
// Note that the playRangeEnd configuration changes this.duration_.
// See https://github.com/shaka-project/shaka-player/issues/4026
return Math.min(this.maxSegmentEndTime_, this.duration_);
}
// If we don't have both, use whichever we do have.
return this.maxSegmentEndTime_ || this.duration_;
}
// Can be either live or "in-progress recording" (live with known duration)
Expand Down
31 changes: 31 additions & 0 deletions test/player_unit.js
Expand Up @@ -690,6 +690,7 @@ describe('Player', () => {
player.configure({playRangeStart: 5, playRangeEnd: 10});
const timeline = new shaka.media.PresentationTimeline(300, 0);
timeline.setStatic(true);
timeline.setDuration(300);
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
manifest.presentationTimeline = timeline;
manifest.addVariant(0, (variant) => {
Expand All @@ -703,6 +704,36 @@ describe('Player', () => {
expect(seekRange.end).toBe(10);
});

// Test for https://github.com/shaka-project/shaka-player/issues/4026
it('configures play and seek range with notifySegments', async () => {
player.configure({playRangeStart: 5, playRangeEnd: 10});
const timeline = new shaka.media.PresentationTimeline(300, 0);
timeline.setStatic(true);
timeline.setDuration(300);
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
manifest.presentationTimeline = timeline;
manifest.addVariant(0, (variant) => {
variant.addVideo(1, (stream) => {
stream.useSegmentTemplate(
'$Number$.mp4', /* segmentDuration= */ 10);
});
});
});
goog.asserts.assert(manifest, 'manifest must be non-null');

// Explicitly notify the timeline of the segment references.
const videoStream = manifest.variants[0].video;
await videoStream.createSegmentIndex();
goog.asserts.assert(videoStream.segmentIndex.references.length != 0,
'Must have references for this test!');
timeline.notifySegments(videoStream.segmentIndex.references);

await player.load(fakeManifestUri, 0, fakeMimeType);
const seekRange = player.seekRange();
expect(seekRange.start).toBe(5);
expect(seekRange.end).toBe(10);
});

it('configures play and seek range after playback starts', async () => {
const timeline = new shaka.media.PresentationTimeline(300, 0);
timeline.setStatic(true);
Expand Down
9 changes: 8 additions & 1 deletion test/test/util/manifest_generator.js
Expand Up @@ -608,9 +608,16 @@ shaka.test.ManifestGenerator.Stream = class {
segmentDuration, 'Must pass a non-zero segment duration');

const shaka_ = this.manifest_.shaka_;
const totalDuration = this.manifest_.presentationTimeline.getDuration();
let totalDuration = this.manifest_.presentationTimeline.getDuration();
goog.asserts.assert(
isFinite(totalDuration), 'Must specify a manifest duration');
if (!isFinite(totalDuration)) {
// Without this, a mistake of an infinite duration would result in an
// infinite loop and a crash, which would in turn prevent you from seeing
// the above assertion fail.
totalDuration = 0;
}

const segmentCount = totalDuration / segmentDuration;
const references = [];

Expand Down

0 comments on commit 21e7a26

Please sign in to comment.