Skip to content

Commit

Permalink
fix(ui): Play video with the previous speed after pause
Browse files Browse the repository at this point in the history
When we change the video play rate via UI, and pause and play the
video, it resumes playing at 1. That's caused by 'cancelTrickPlay'.

We can set the defaultPlaybackRate when changing the play rate, and
use that value when we resume playing.

Closes shaka-project#3261

Change-Id: Ifc200697ea956e3257ae3371886bbb5c9c03338f
  • Loading branch information
michellezhuogg committed Apr 2, 2021
1 parent 4574a5d commit 9e2a585
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 3 deletions.
13 changes: 13 additions & 0 deletions lib/media/play_rate_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,15 @@ shaka.media.PlayRateController = class {
return this.rate_;
}

/**
* Get the default play rate of the playback.
*
* @return {number}
*/
getDefaultRate() {
return this.harness_.getDefaultRate();
}

/**
* Reapply the effects of |this.rate_| and |this.active_| to the media
* element. This will only update the rate via the harness if the desired rate
Expand Down Expand Up @@ -161,6 +170,7 @@ shaka.media.PlayRateController = class {
/**
* @typedef {{
* getRate: function():number,
* getDefaultRate: function():number,
* setRate: function(number),
* movePlayhead: function(number)
* }}
Expand All @@ -173,6 +183,9 @@ shaka.media.PlayRateController = class {
* @property {function():number} getRate
* Get the current playback rate being seen by the user.
*
* @property {function():number} getDefaultRate
* Get the default playback rate that the user should see.
*
* @property {function(number)} setRate
* Set the playback rate that the user should see.
*
Expand Down
9 changes: 6 additions & 3 deletions lib/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -1802,6 +1802,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {

this.playRateController_ = new shaka.media.PlayRateController({
getRate: () => has.mediaElement.playbackRate,
getDefaultRate: () => has.mediaElement.defaultPlaybackRate,
setRate: (rate) => { has.mediaElement.playbackRate = rate; },
movePlayhead: (delta) => { has.mediaElement.currentTime += delta; },
});
Expand Down Expand Up @@ -2084,6 +2085,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {

this.playRateController_ = new shaka.media.PlayRateController({
getRate: () => has.mediaElement.playbackRate,
getDefaultRate: () => has.mediaElement.defaultPlaybackRate,
setRate: (rate) => { has.mediaElement.playbackRate = rate; },
movePlayhead: (delta) => { has.mediaElement.currentTime += delta; },
});
Expand Down Expand Up @@ -3173,13 +3175,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
* @export
*/
cancelTrickPlay() {
const defaultPlaybackRate = this.playRateController_.getDefaultRate();
if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {
this.playRateController_.set(1);
this.playRateController_.set(defaultPlaybackRate);
}

if (this.loadMode_ == shaka.Player.LoadMode.MEDIA_SOURCE) {
this.playRateController_.set(1);
this.abrManager_.playbackRateChanged(1);
this.playRateController_.set(defaultPlaybackRate);
this.abrManager_.playbackRateChanged(defaultPlaybackRate);
this.streamingEngine_.setTrickPlay(false);
}
}
Expand Down
4 changes: 4 additions & 0 deletions test/media/play_rate_controller_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ describe('PlayRateController', () => {
/** @type {!jasmine.Spy} */
let getPlayRateSpy;
/** @type {!jasmine.Spy} */
let getDefaultPlayRateSpy;
/** @type {!jasmine.Spy} */
let setPlayRateSpy;
/** @type {!jasmine.Spy} */
let movePlayheadSpy;
Expand All @@ -24,6 +26,7 @@ describe('PlayRateController', () => {

beforeEach(() => {
getPlayRateSpy = jasmine.createSpy('getPlaybackRate');
getDefaultPlayRateSpy = jasmine.createSpy('getDefaultPlaybackRate');
setPlayRateSpy = jasmine.createSpy('setPlaybackRate');
movePlayheadSpy = jasmine.createSpy('movePlayhead');

Expand All @@ -36,6 +39,7 @@ describe('PlayRateController', () => {

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),
};
Expand Down
1 change: 1 addition & 0 deletions ui/playback_rate_selection.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ shaka.ui.PlaybackRateSelection = class extends shaka.ui.SettingsMenu {

this.eventManager.listen(button, 'click', () => {
this.video.playbackRate = this.playbackRates_.get(rateStr);
this.video.defaultPlaybackRate = this.playbackRates_.get(rateStr);
});

this.menu.appendChild(button);
Expand Down

0 comments on commit 9e2a585

Please sign in to comment.