From 410d2e6d5523c6692f963fc266e9aae046dad8d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Thu, 30 Jan 2025 15:14:16 +0100 Subject: [PATCH] fix: Allow change the native playbackRate with the same functionality as trickPlay (#7993) --- lib/player.js | 57 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/lib/player.js b/lib/player.js index d07fd8e5f9..4965070c5a 100644 --- a/lib/player.js +++ b/lib/player.js @@ -4777,7 +4777,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget { shaka.log.alwaysWarn('A trick play rate of 0 is unsupported!'); return; } - this.trickPlayEventManager_.removeAll(); this.playRateController_.set(rate); @@ -4786,26 +4785,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.streamingEngine_.setTrickPlay( useTrickPlayTrack && Math.abs(rate) > 1); } - if (this.isLive()) { - this.trickPlayEventManager_.listen(this.video_, 'timeupdate', () => { - const currentTime = this.video_.currentTime; - const seekRange = this.seekRange(); - const safeSeekOffset = this.config_.streaming.safeSeekOffset; - - // Cancel trick play if we hit the beginning or end of the seekable - // (Sub-second accuracy not required here) - if (rate > 0) { - if (Math.floor(currentTime) >= Math.floor(seekRange.end)) { - this.cancelTrickPlay(); - } - } else { - if (Math.floor(currentTime) <= - Math.floor(seekRange.start + safeSeekOffset)) { - this.cancelTrickPlay(); - } - } - }); - } + this.setupTrickPlayEventListeners_(rate); } /** @@ -6921,6 +6901,11 @@ shaka.Player = class extends shaka.util.FakeEventTarget { // The playback rate has changed. This could be us or someone else. // If this was us, setting the rate again will be a no-op. this.playRateController_.set(newRate); + + if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) { + this.abrManager_.playbackRateChanged(newRate); + } + this.setupTrickPlayEventListeners_(newRate); } const event = shaka.Player.makeEvent_( @@ -6928,6 +6913,36 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.dispatchEvent(event); } + /** + * Configures all the necessary listeners when trick play is being performed. + * + * @param {number} rate + * @private + */ + setupTrickPlayEventListeners_(rate) { + this.trickPlayEventManager_.removeAll(); + if (this.isLive()) { + this.trickPlayEventManager_.listen(this.video_, 'timeupdate', () => { + const currentTime = this.video_.currentTime; + const seekRange = this.seekRange(); + const safeSeekOffset = this.config_.streaming.safeSeekOffset; + + // Cancel trick play if we hit the beginning or end of the seekable + // (Sub-second accuracy not required here) + if (rate > 0) { + if (Math.floor(currentTime) >= Math.floor(seekRange.end)) { + this.cancelTrickPlay(); + } + } else { + if (Math.floor(currentTime) <= + Math.floor(seekRange.start + safeSeekOffset)) { + this.cancelTrickPlay(); + } + } + }); + } + } + /** * Try updating the state history. If the player has not finished * initializing, this will be a no-op.