Browse Source

fix: Fixed issue with MPEG-Dash MPD Playlist Finalisation during Live Play. (#874)

pull/889/head
Rhys Williams 5 years ago
committed by GitHub
parent
commit
c80793075c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      src/dash-playlist-loader.js
  2. 38
      test/dash-playlist-loader.test.js

20
src/dash-playlist-loader.js

@ -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);
@ -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);
}
});
}

38
test/dash-playlist-loader.test.js

@ -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);
@ -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;

Loading…
Cancel
Save