mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-14 15:56:38 +03:00
fix: Do not update the player position with negative playback rates if the video is paused (#9732)
This commit is contained in:
committed by
GitHub
parent
992f2158e5
commit
ab09d4dcd7
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user