diff --git a/src/dash-playlist-loader.js b/src/dash-playlist-loader.js index 325d75900..95338706c 100644 --- a/src/dash-playlist-loader.js +++ b/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); + } }); } diff --git a/test/dash-playlist-loader.test.js b/test/dash-playlist-loader.test.js index 5cdd067fe..03b948659 100644 --- a/test/dash-playlist-loader.test.js +++ b/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;