diff --git a/lib/abr/simple_abr_manager.js b/lib/abr/simple_abr_manager.js index 586b437cb..fa9ca845e 100644 --- a/lib/abr/simple_abr_manager.js +++ b/lib/abr/simple_abr_manager.js @@ -692,7 +692,9 @@ shaka.abr.SimpleAbrManager = class { // Skip ban logic when playback rate is greater than 1x // because frame drops are expected or when the total frames are 0. - if (this.mediaElement_.playbackRate > 1 || !currentTotal) { + const playbackRate = + !isNaN(this.playbackRate_) ? Math.abs(this.playbackRate_) : 1; + if (playbackRate > 1 || !currentTotal) { this.lastDroppedFrames_ = currentDropped; this.lastTotalFrames_ = currentTotal; return; diff --git a/test/abr/simple_abr_manager_unit.js b/test/abr/simple_abr_manager_unit.js index c34dce7bc..979dcf356 100644 --- a/test/abr/simple_abr_manager_unit.js +++ b/test/abr/simple_abr_manager_unit.js @@ -474,7 +474,7 @@ describe('SimpleAbrManager', () => { abrManager.checkDroppedFrames_(); // High drop ratio at 2x speed — ban logic should be skipped. - mockVideo.playbackRate = 2; + abrManager.playbackRateChanged(2); mockVideo.getVideoPlaybackQuality = () => makeQuality(50, 200); abrManager.checkDroppedFrames_(); @@ -486,12 +486,12 @@ describe('SimpleAbrManager', () => { abrManager.checkDroppedFrames_(); // 2x speed: counters are reset to current values (50, 200). - mockVideo.playbackRate = 2; + abrManager.playbackRateChanged(2); mockVideo.getVideoPlaybackQuality = () => makeQuality(50, 200); abrManager.checkDroppedFrames_(); // Back to 1x: 5/100 new drops = 5% < 15% threshold. - mockVideo.playbackRate = 1; + abrManager.playbackRateChanged(1); mockVideo.getVideoPlaybackQuality = () => makeQuality(55, 300); abrManager.checkDroppedFrames_();