Skip to content

Commit

Permalink
fix: throttle final playlist reloads when using DASH (#277)
Browse files Browse the repository at this point in the history
  • Loading branch information
gesinger authored Nov 7, 2018
1 parent de5aacb commit 1c2887a
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
14 changes: 13 additions & 1 deletion src/dash-playlist-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,14 +162,26 @@ export default class DashPlaylistLoader extends EventTarget {

pause() {
this.stopRequest();
window.clearTimeout(this.mediaUpdateTimeout);
if (this.state === 'HAVE_NOTHING') {
// If we pause the loader before any data has been retrieved, its as if we never
// started, so reset to an unstarted state.
this.started = false;
}
}

load() {
load(isFinalRendition) {
window.clearTimeout(this.mediaUpdateTimeout);

const media = this.media();

if (isFinalRendition) {
const delay = media ? (media.targetDuration / 2) * 1000 : 5 * 1000;

this.mediaUpdateTimeout = window.setTimeout(() => this.load(), delay);
return;
}

// because the playlists are internal to the manifest, load should either load the
// main manifest, or do nothing but trigger an event
if (!this.started) {
Expand Down
39 changes: 39 additions & 0 deletions test/dash-playlist-loader.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -397,3 +397,42 @@ QUnit.test('media playlists "refresh" by re-parsing master xml', function(assert

assert.equal(refreshes, 1, 'refreshed playlist after last segment duration');
});

QUnit.test('delays load when on final rendition', function(assert) {
let loader = new DashPlaylistLoader('dash.mpd', this.fakeHls);
let loadedplaylistEvents = 0;

loader.on('loadedplaylist', () => loadedplaylistEvents++);

// do an initial load to start the loader
loader.load();
standardXHRResponse(this.requests.shift());

// one for master, one for media on first selection
assert.equal(loadedplaylistEvents, 2, 'two loadedplaylist events after first load');

loader.load();

assert.equal(loadedplaylistEvents, 3, 'one more loadedplaylist event after load');

loader.load(false);

assert.equal(
loadedplaylistEvents,
4,
'one more loadedplaylist event after load with isFinalRendition false');

loader.load(true);

assert.equal(
loadedplaylistEvents,
4,
'no loadedplaylist event after load with isFinalRendition false');

this.clock.tick(loader.media().targetDuration / 2 * 1000);

assert.equal(
loadedplaylistEvents,
5,
'one more loadedplaylist event after final rendition delay');
});

0 comments on commit 1c2887a

Please sign in to comment.