Skip to content

Commit

Permalink
Merge pull request #2907 from video-dev/bugfix/ie11-live-start-position
Browse files Browse the repository at this point in the history
Seek once into buffer start when starting live
  • Loading branch information
robwalch committed Jul 20, 2020
2 parents cba2bab + 26da49d commit 489fbe3
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
4 changes: 1 addition & 3 deletions src/controller/base-stream-controller.js
Expand Up @@ -63,9 +63,7 @@ export default class BaseStreamController extends TaskLoop {
const currentTime = media ? media.currentTime : null;
const bufferInfo = BufferHelper.bufferInfo(mediaBuffer || media, currentTime, this.config.maxBufferHole);

if (Number.isFinite(currentTime)) {
logger.log(`media seeking to ${currentTime.toFixed(3)}`);
}
logger.log(`media seeking to ${Number.isFinite(currentTime) ? currentTime.toFixed(3) : currentTime}`);

if (state === State.FRAG_LOADING) {
let fragCurrent = this.fragCurrent;
Expand Down
10 changes: 9 additions & 1 deletion src/controller/stream-controller.js
Expand Up @@ -1336,15 +1336,23 @@ class StreamController extends BaseStreamController {
* @private
*/
_seekToStartPos () {
const { media, startPosition } = this;
const { media } = this;
const currentTime = media.currentTime;
let startPosition = this.startPosition;
// only adjust currentTime if different from startPosition or if startPosition not buffered
// at that stage, there should be only one buffered range, as we reach that code after first fragment has been buffered
if (currentTime !== startPosition && startPosition >= 0) {
if (media.seeking) {
logger.log(`could not seek to ${startPosition}, already seeking at ${currentTime}`);
return;
}
const bufferStart = media.buffered.length ? media.buffered.start(0) : 0;
const delta = bufferStart - startPosition;
if (delta > 0 && delta < this.config.maxBufferHole) {
logger.log(`adjusting start position by ${delta} to match buffer start`);
startPosition += delta;
this.startPosition = startPosition;
}
logger.log(`seek to target start position ${startPosition} from current time ${currentTime}. ready state ${media.readyState}`);
media.currentTime = startPosition;
}
Expand Down
4 changes: 4 additions & 0 deletions tests/unit/controller/stream-controller.js
Expand Up @@ -198,13 +198,17 @@ describe('StreamController', function () {

describe('checkBuffer', function () {
const sandbox = sinon.createSandbox();
let bufStart = 5;

beforeEach(function () {
streamController.gapController = {
poll: function () {}
};
streamController.media = {
buffered: {
start () {
return bufStart;
},
length: 1
}
};
Expand Down

0 comments on commit 489fbe3

Please sign in to comment.