Skip to content

Commit

Permalink
fix: Fixed issue with MPEG-Dash MPD Playlist Finalisation during Live…
Browse files Browse the repository at this point in the history
… Play. (#874)
  • Loading branch information
rhyswilliamsza authored Jun 29, 2020
1 parent 3ba85fd commit c807930
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 8 deletions.
20 changes: 14 additions & 6 deletions src/dash-playlist-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -744,9 +744,13 @@ export default class DashPlaylistLoader extends EventTarget {
// update loader's sidxMapping with parsed sidx box
this.sidxMapping_[sidxKey].sidx = sidx;

this.minimumUpdatePeriodTimeout_ = window.setTimeout(() => {
this.trigger('minimumUpdatePeriod');
}, this.master.minimumUpdatePeriod);
// Clear & reset timeout with new minimumUpdatePeriod
window.clearTimeout(this.minimumUpdatePeriodTimeout_);
if (this.master.minimumUpdatePeriod) {
this.minimumUpdatePeriodTimeout_ = window.setTimeout(() => {
this.trigger('minimumUpdatePeriod');
}, this.master.minimumUpdatePeriod);
}

// TODO: do we need to reload the current playlist?
this.refreshMedia_(this.media().id);
Expand All @@ -763,9 +767,13 @@ export default class DashPlaylistLoader extends EventTarget {
}
}

this.minimumUpdatePeriodTimeout_ = window.setTimeout(() => {
this.trigger('minimumUpdatePeriod');
}, this.master.minimumUpdatePeriod);
// Clear & reset timeout with new minimumUpdatePeriod
window.clearTimeout(this.minimumUpdatePeriodTimeout_);
if (this.master.minimumUpdatePeriod) {
this.minimumUpdatePeriodTimeout_ = window.setTimeout(() => {
this.trigger('minimumUpdatePeriod');
}, this.master.minimumUpdatePeriod);
}
});
}

Expand Down
38 changes: 36 additions & 2 deletions test/dash-playlist-loader.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2300,10 +2300,10 @@ QUnit.test('refreshes the xml if there is a minimumUpdatePeriod', function(asser
loader.on('minimumUpdatePeriod', () => minimumUpdatePeriods++);

loader.load();
assert.equal(minimumUpdatePeriods, 0, 'no refreshs to start');
assert.equal(minimumUpdatePeriods, 0, 'no refreshes to start');

this.standardXHRResponse(this.requests.shift());
assert.equal(minimumUpdatePeriods, 0, 'no refreshs immediately after response');
assert.equal(minimumUpdatePeriods, 0, 'no refreshes immediately after response');

this.clock.tick(4 * 1000);

Expand All @@ -2312,6 +2312,40 @@ QUnit.test('refreshes the xml if there is a minimumUpdatePeriod', function(asser
assert.equal(minimumUpdatePeriods, 1, 'refreshed manifest');
});

QUnit.test('stop xml refresh if minimumUpdatePeriod changes from `mUP > 0` to `mUP == 0`', function(assert) {
const loader = new DashPlaylistLoader('dash-live.mpd', this.fakeVhs);
let minimumUpdatePeriods = 0;

loader.on('minimumUpdatePeriod', () => minimumUpdatePeriods++);

loader.load();

// Start Request
assert.equal(minimumUpdatePeriods, 0, 'no refreshes to start');
this.standardXHRResponse(this.requests.shift());
assert.equal(minimumUpdatePeriods, 0, 'no refreshes immediately after response');

// First Refresh Tick
this.clock.tick(4 * 1000);
this.standardXHRResponse(this.requests[0], loader.masterXml_);
assert.equal(this.requests.length, 1, 'refreshed manifest');
assert.equal(this.requests[0].uri, 'dash-live.mpd', 'refreshed manifest');
assert.equal(minimumUpdatePeriods, 1, 'total minimumUpdatePeriods');

// Second Refresh Tick: MinimumUpdatePeriod Removed
this.clock.tick(4 * 1000);
this.standardXHRResponse(this.requests[1], loader.masterXml_.replace('minimumUpdatePeriod="PT4S"', ''));
this.clock.tick(4 * 1000);
this.standardXHRResponse(this.requests[2]);
assert.equal(this.requests.length, 3, 'final manifest refresh');
assert.equal(minimumUpdatePeriods, 3, 'final minimumUpdatePeriods');

// Third Refresh Tick: No Additional Requests Expected
this.clock.tick(4 * 1000);
assert.equal(this.requests.length, 3, 'final manifest refresh');
assert.equal(minimumUpdatePeriods, 3, 'final minimumUpdatePeriods');
});

QUnit.test('media playlists "refresh" by re-parsing master xml', function(assert) {
const loader = new DashPlaylistLoader('dash-live.mpd', this.fakeVhs);
let refreshes = 0;
Expand Down

0 comments on commit c807930

Please sign in to comment.