Skip to content

Commit 90910bd

Browse files
committed
Trying to handle seek better
1 parent 4e42502 commit 90910bd

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

src/post-worker.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ self.oneshotRender = function (lastRenderedTime, renderNow, iteration) {
262262
target: 'canvas',
263263
op: 'oneshot-result',
264264
iteration: iteration,
265+
lastRenderedTime: lastRenderedTime,
265266
eventStart: eventStart,
266267
eventFinish: eventFinish,
267268
emptyFinish: emptyFinish,

src/subtitles-octopus.js

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ var SubtitlesOctopus = function (options) {
197197
self.video.addEventListener("seeked", function () {
198198
self.video.addEventListener("timeupdate", timeupdate, false);
199199
self.setCurrentTime(video.currentTime + self.timeOffset);
200+
if (self.renderAhead > 0) {
201+
_cleanPastRendered(video.currentTime + self.timeOffset, true);
202+
}
200203
}, false);
201204
self.video.addEventListener("ratechange", function () {
202205
self.setRate(video.playbackRate);
@@ -254,8 +257,8 @@ var SubtitlesOctopus = function (options) {
254257
self.setSubUrl = function (subUrl) {
255258
self.subUrl = subUrl;
256259
};
257-
258-
function _cleanPastRendered(currentTime) {
260+
261+
function _cleanPastRendered(currentTime, seekClean) {
259262
var retainedItems = [];
260263
for (var i = 0, len = self.renderedItems.length; i < len; i++) {
261264
var item = self.renderedItems[i];
@@ -264,6 +267,29 @@ var SubtitlesOctopus = function (options) {
264267
retainedItems.push(item);
265268
}
266269
}
270+
if (seekClean && retainedItems.length > 0) {
271+
// order items by event start time
272+
retainedItems.sort(function (a, b) {
273+
return a.eventStart - b.eventStart;
274+
});
275+
if (currentTime < retainedItems[0].eventStart) {
276+
if (retainedItems[0].eventStart - currentTime > 60) {
277+
console.info("seeked back too far, cleaning prerender buffer");
278+
retainedItems = [];
279+
} else {
280+
console.info("seeked backwards, need to free up some buffer");
281+
var size = 0, limit = self.renderAhead * 0.3 /* try to take no more than 1/3 of buffer */;
282+
var retain = [];
283+
for (var i = 0, len = retainedItems.length; i < len; i++) {
284+
var item = retainedItems[i];
285+
size += item.size;
286+
if (size >= limit) break;
287+
retain.push(item);
288+
}
289+
retainedItems = retain;
290+
}
291+
}
292+
}
267293
var removed = retainedItems.length != self.renderedItems.length;
268294
self.renderedItems = retainedItems;
269295
return removed;
@@ -355,13 +381,13 @@ var SubtitlesOctopus = function (options) {
355381
}
356382
}
357383

358-
if (_cleanPastRendered(currentTime) && finishTime >= 0) {
359-
console.debug('some prerendered frame retired, requesting new');
360-
if (eventShown) {
361-
tryRequestOneshot(finishTime);
362-
} else {
384+
if (!eventShown) {
385+
if (Math.abs(self.oneshotState.requestNextTimestamp - currentTime) > 0.1) {
363386
tryRequestOneshot(currentTime, true);
364387
}
388+
} else if (_cleanPastRendered(currentTime) && finishTime >= 0) {
389+
console.debug('some prerendered frame retired, requesting new');
390+
tryRequestOneshot(finishTime);
365391
}
366392
}
367393

@@ -508,6 +534,10 @@ var SubtitlesOctopus = function (options) {
508534
data.eventStart + ', empty=' + data.emptyFinish +
509535
'), render: ' + Math.round(data.spentTime) + ' ms');
510536
self.oneshotState.renderRequested = false;
537+
if (data.lastRenderedTime == self.oneshotState.requestNextTimestamp) {
538+
self.oneshotState.requestNextTimestamp = -1;
539+
}
540+
511541
var items = [];
512542
var size = 0;
513543
for (var i = 0, len = data.canvases.length; i < len; i++) {
@@ -538,7 +568,6 @@ var SubtitlesOctopus = function (options) {
538568
if (self.oneshotState.requestNextTimestamp >= 0) {
539569
console.debug("requesting out of order event at " + self.oneshotState.requestNextTimestamp);
540570
tryRequestOneshot(self.oneshotState.requestNextTimestamp);
541-
self.oneshotState.requestNextTimestamp = -1;
542571
} else if (data.eventStart < 0) {
543572
console.info('oneshot received "end of frames" event');
544573
} else if (data.emptyFinish >= 0) {

0 commit comments

Comments
 (0)