diff --git a/lib/media/abr_manager.js b/lib/media/abr_manager.js index b1967b6453..b2b3ee964a 100644 --- a/lib/media/abr_manager.js +++ b/lib/media/abr_manager.js @@ -63,6 +63,8 @@ shaka.media.AbrManager = function(estimator, videoSource) { this.eventManager_.listen(this.estimator_, 'bandwidth', this.onBandwidth_.bind(this)); + this.eventManager_.listen(this.videoSource_, 'adaptation', + this.onAdaptation_.bind(this)); }; @@ -84,7 +86,7 @@ shaka.media.AbrManager.FIRST_SWITCH_INTERVAL_ = 4.0; * @private * @const {number} */ -shaka.media.AbrManager.MIN_SWITCH_INTERVAL_ = 8.0; +shaka.media.AbrManager.MIN_SWITCH_INTERVAL_ = 30.0; /** @@ -205,7 +207,26 @@ shaka.media.AbrManager.prototype.onBandwidth_ = function(event) { this.videoSource_.selectVideoTrack(chosen.id, false); } - this.nextAdaptationTime_ = now + AbrManager.MIN_SWITCH_INTERVAL_; + // Can't adapt again until we get confirmation of this one. + this.nextAdaptationTime_ = Number.POSITIVE_INFINITY; +}; + + +/** + * Handles adaptation events. + * + * @param {!Event} event + * @private + */ +shaka.media.AbrManager.prototype.onAdaptation_ = function(event) { + // This check allows us to ignore the initial adaptation events, which would + // otherwise cause us not to honor FIRST_SWITCH_INTERVAL_. + if (this.nextAdaptationTime_ == Number.POSITIVE_INFINITY) { + // Adaptation is complete, so schedule the next adaptation. + var now = Date.now() / 1000.0; + this.nextAdaptationTime_ = + now + shaka.media.AbrManager.MIN_SWITCH_INTERVAL_; + } }; diff --git a/lib/media/stream.js b/lib/media/stream.js index 052360346c..41e8847ec1 100644 --- a/lib/media/stream.js +++ b/lib/media/stream.js @@ -360,8 +360,6 @@ shaka.media.Stream.prototype.switch = function(streamInfo, immediate) { this.sbm_.reset(); - this.fireAdaptationEvent_(streamInfo); - // Stop updating and abort |sbm_|'s current operation. This will reject // |sbm_|'s current promise. this.cancelUpdateTimer_(); @@ -393,6 +391,7 @@ shaka.media.Stream.prototype.switch = function(streamInfo, immediate) { } } shaka.timer.end('switch logic'); + this.fireAdaptationEvent_(streamInfo); this.switchStreamOrUpdate_(); }) ).catch(shaka.util.TypedBind(this,