fix: Do not update the player position with negative playback rates if the video is paused (#9732)

This commit is contained in:
Álvaro Velad Galván
2026-02-20 10:01:37 +01:00
committed by GitHub
parent 992f2158e5
commit ab09d4dcd7
3 changed files with 28 additions and 13 deletions
+7 -1
View File
@@ -39,7 +39,9 @@ shaka.media.PlayRateController = class {
/** @private {shaka.util.Timer} */
this.timer_ = new shaka.util.Timer(() => {
this.harness_.movePlayhead(this.rate_ * this.pollRate_);
if (!this.harness_.isPaused()) {
this.harness_.movePlayhead(this.rate_ * this.pollRate_);
}
});
}
@@ -172,6 +174,7 @@ shaka.media.PlayRateController = class {
* getDefaultRate: function():number,
* setRate: function(number),
* movePlayhead: function(number),
* isPaused: function():boolean,
* }}
*
* @description
@@ -192,5 +195,8 @@ shaka.media.PlayRateController = class {
* Move the playhead N seconds. If N is positive, the playhead will move
* forward abs(N) seconds. If N is negative, the playhead will move backwards
* abs(N) seconds.
*
* @property {function():boolean} isPaused
* Get if the current playback is paused.
*/
shaka.media.PlayRateController.Harness;
+16 -12
View File
@@ -2725,6 +2725,20 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
this.mediaSourceEngine_ = mediaSourceEngine;
}
/**
* @param {HTMLMediaElement} mediaElement
* @private
*/
setupPlayRateController_(mediaElement) {
this.playRateController_ = new shaka.media.PlayRateController({
getRate: () => mediaElement.playbackRate,
getDefaultRate: () => mediaElement.defaultPlaybackRate,
setRate: (rate) => { mediaElement.playbackRate = rate; },
movePlayhead: (delta) => { mediaElement.currentTime += delta; },
isPaused: () => mediaElement.paused,
});
}
/**
* Adds the basic media listeners
*
@@ -2874,12 +2888,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
this.makeStateChangeEvent_('load');
const mediaElement = this.video_;
this.playRateController_ = new shaka.media.PlayRateController({
getRate: () => mediaElement.playbackRate,
getDefaultRate: () => mediaElement.defaultPlaybackRate,
setRate: (rate) => { mediaElement.playbackRate = rate; },
movePlayhead: (delta) => { mediaElement.currentTime += delta; },
});
this.setupPlayRateController_(mediaElement);
// Add all media element listeners.
this.addBasicMediaListeners_(mediaElement, startTimeOfLoad);
@@ -3253,12 +3262,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
this.playheadObservers_ =
this.createPlayheadObserversForSrcEquals_(this.startTime_ || 0);
this.playRateController_ = new shaka.media.PlayRateController({
getRate: () => mediaElement.playbackRate,
getDefaultRate: () => mediaElement.defaultPlaybackRate,
setRate: (rate) => { mediaElement.playbackRate = rate; },
movePlayhead: (delta) => { mediaElement.currentTime += delta; },
});
this.setupPlayRateController_(mediaElement);
this.startBufferManagement_(mediaElement, /* srcEquals= */ true);
+5
View File
@@ -13,6 +13,8 @@ describe('PlayRateController', () => {
let setPlayRateSpy;
/** @type {!jasmine.Spy} */
let movePlayheadSpy;
/** @type {!jasmine.Spy} */
let isPausedSpy;
/** @type {number} */
let playRate;
@@ -25,6 +27,7 @@ describe('PlayRateController', () => {
getDefaultPlayRateSpy = jasmine.createSpy('getDefaultPlaybackRate');
setPlayRateSpy = jasmine.createSpy('setPlaybackRate');
movePlayheadSpy = jasmine.createSpy('movePlayhead');
isPausedSpy = jasmine.createSpy('isPaused');
playRate = 1;
@@ -32,12 +35,14 @@ describe('PlayRateController', () => {
setPlayRateSpy.and.callFake((rate) => {
playRate = rate;
});
isPausedSpy.and.callFake(() => false);
const harness = {
getRate: shaka.test.Util.spyFunc(getPlayRateSpy),
getDefaultRate: shaka.test.Util.spyFunc(getDefaultPlayRateSpy),
setRate: shaka.test.Util.spyFunc(setPlayRateSpy),
movePlayhead: shaka.test.Util.spyFunc(movePlayheadSpy),
isPaused: shaka.test.Util.spyFunc(isPausedSpy),
};
controller = new shaka.media.PlayRateController(harness);