Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(FEC-11473): start of dvr window is going back and forth while start over #165

Merged
merged 11 commits into from
Aug 23, 2021
2 changes: 1 addition & 1 deletion karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ module.exports = function (config) {
client: {
mocha: {
reporter: 'html',
timeout: 10000
timeout: 20000
}
}
};
Expand Down
18 changes: 17 additions & 1 deletion src/dash-adapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,9 @@ export default class DashAdapter extends BaseMediaSourceAdapter {
* @private
*/
_thumbnailController: ?DashThumbnailController;
_isStartOver: boolean = true;
_seekRangeStart: number = 0;
_startOverTimeout: TimeoutID;

/**
* Factory method to create media source adapter.
Expand Down Expand Up @@ -719,6 +722,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter {
this._eventManager.listen(this._shaka, ShakaEvent.DRM_SESSION_UPDATE, this._adapterEventsBindings.drmsessionupdate);
this._eventManager.listen(this._videoElement, EventType.WAITING, this._adapterEventsBindings.waiting);
this._eventManager.listen(this._videoElement, EventType.PLAYING, this._adapterEventsBindings.playing);
this._eventManager.listen(this._videoElement, EventType.LOADED_DATA, () => this._onLoadedData());
this._eventManager.listenOnce(this._videoElement, EventType.PLAYING, () => {
this._eventManager.listen(this._shaka, ShakaEvent.BUFFERING, this._adapterEventsBindings.buffering);
});
Expand All @@ -744,6 +748,17 @@ export default class DashAdapter extends BaseMediaSourceAdapter {
});
}

_onLoadedData(): void {
const segmentDuration = this.getSegmentDuration();
this._seekRangeStart = this._shaka.seekRange().start;
this._startOverTimeout = setTimeout(() => {
if (this._shaka.seekRange().start - this._seekRangeStart >= segmentDuration) {
// in start over the seekRange().start should be permanent
this._isStartOver = false;
}
}, (segmentDuration + 1) * 1000);
}

/**
* Custom parser to retrieve image adaptation sets.
* @param {ArrayBuffer} manifestBuffer - The array buffer manifest from the response.
Expand Down Expand Up @@ -846,6 +861,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter {
this._thumbnailController = null;
this._clearStallInterval();
this._clearVideoUpdateTimer();
clearTimeout(this._startOverTimeout);
if (this._eventManager) {
this._eventManager.removeAll();
}
Expand Down Expand Up @@ -1300,7 +1316,7 @@ export default class DashAdapter extends BaseMediaSourceAdapter {
*/
getStartTimeOfDvrWindow(): number {
if (this.isLive() && this._shaka) {
return this._shaka.seekRange().start + this._shaka.getConfiguration().streaming.safeSeekOffset;
return (this._isStartOver ? this._seekRangeStart : this._shaka.seekRange().start) + this._shaka.getConfiguration().streaming.safeSeekOffset;
}
return 0;
}
Expand Down
12 changes: 5 additions & 7 deletions test/src/dash-adapter.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1342,9 +1342,8 @@ describe('DashAdapter: getStartTimeOfDvrWindow', () => {

it('should return the start time of Dvr window for live', done => {
dashInstance = DashAdapter.createAdapter(video, liveSource, config);
dashInstance
.load()
.then(() => {
video.addEventListener(EventType.LOADED_DATA, () => {
setTimeout(() => {
try {
Math.floor(dashInstance.getStartTimeOfDvrWindow()).should.equal(
Math.floor(dashInstance._shaka.seekRange().start + dashInstance._shaka.getConfiguration().streaming.safeSeekOffset)
Expand All @@ -1353,10 +1352,9 @@ describe('DashAdapter: getStartTimeOfDvrWindow', () => {
} catch (e) {
done(e);
}
})
.catch(e => {
done(e);
});
}, (dashInstance.getSegmentDuration() + 2) * 1000);
});
dashInstance.load();
});
});

Expand Down