diff --git a/lib/player.js b/lib/player.js index 88436f03a1..2cb6d363b1 100644 --- a/lib/player.js +++ b/lib/player.js @@ -550,6 +550,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget { */ this.loadEventManager_ = new shaka.util.EventManager(); + /** + * For listeners scoped to the lifetime of the loaded content. + * @private {shaka.util.EventManager} + */ + this.trickPlayEventManager_ = new shaka.util.EventManager(); + /** @private {shaka.net.NetworkingEngine} */ this.networkingEngine_ = null; @@ -848,6 +854,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.loadEventManager_.release(); this.loadEventManager_ = null; } + if (this.trickPlayEventManager_) { + this.trickPlayEventManager_.release(); + this.trickPlayEventManager_ = null; + } this.abrManagerFactory_ = null; this.config_ = null; @@ -1166,6 +1176,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget { // element. if (this.video_) { this.loadEventManager_.removeAll(); + this.trickPlayEventManager_.removeAll(); } // Stop the variant checker timer @@ -3569,6 +3580,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget { shaka.log.alwaysWarn('A trick play rate of 0 is unsupported!'); return; } + this.trickPlayEventManager_.removeAll(); if (this.video_.paused) { // Our fast forward is implemented with playbackRate and needs the video @@ -3582,6 +3594,22 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.abrManager_.playbackRateChanged(rate); this.streamingEngine_.setTrickPlay(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; + if (rate > 0) { + if (currentTime >= seekRange.end) { + this.cancelTrickPlay(); + } + } else { + if (currentTime <= (seekRange.start + safeSeekOffset)) { + this.cancelTrickPlay(); + } + } + }); + } } /** @@ -3601,6 +3629,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.abrManager_.playbackRateChanged(defaultPlaybackRate); this.streamingEngine_.setTrickPlay(false); } + this.trickPlayEventManager_.removeAll(); } /**