@@ -56,6 +56,7 @@ var SubtitlesOctopus = function (options) {
56
56
iteration : 0 ,
57
57
renderRequested : false ,
58
58
requestNextTimestamp : - 1 ,
59
+ requestOffset : 0 ,
59
60
prevWidth : null ,
60
61
prevHeight : null
61
62
}
@@ -207,6 +208,7 @@ var SubtitlesOctopus = function (options) {
207
208
self . video . addEventListener ( "timeupdate" , timeupdate , false ) ;
208
209
self . setCurrentTime ( video . currentTime + self . timeOffset ) ;
209
210
if ( self . renderAhead > 0 ) {
211
+ self . oneshotState . requestOffset = 0 ;
210
212
_cleanPastRendered ( video . currentTime + self . timeOffset , true ) ;
211
213
}
212
214
} , false ) ;
@@ -380,13 +382,23 @@ var SubtitlesOctopus = function (options) {
380
382
if ( ! self . video ) return ;
381
383
382
384
var currentTime = self . video . currentTime + self . timeOffset ;
385
+ var nextTime = currentTime + self . oneshotState . requestOffset ;
386
+
387
+ // request the next event with some extra time, because we won't get it instantly
388
+ self . oneshotState . requestOffset = self . video . playbackRate / self . targetFps ;
389
+
383
390
var eventToShow = null ;
384
391
var finishTime = - 1 , animated = false ;
385
392
for ( var i = 0 , len = self . renderedItems . length ; i < len ; i ++ ) {
386
393
var item = self . renderedItems [ i ] ;
394
+
387
395
// we need the last started event
388
396
if ( item . eventStart <= currentTime ) {
389
397
eventToShow = item ;
398
+ }
399
+
400
+ // we need to find a series of events from the request time
401
+ if ( item . eventStart <= nextTime ) {
390
402
finishTime = item . emptyFinish ;
391
403
} else if ( finishTime >= 0 ) {
392
404
// we've already found a known event, now find
@@ -405,11 +417,13 @@ var SubtitlesOctopus = function (options) {
405
417
_renderSubtitleEvent ( eventToShow , currentTime ) ;
406
418
407
419
if ( _cleanPastRendered ( currentTime ) && finishTime >= 0 ) {
408
- tryRequestOneshot ( finishTime , animated ) ;
420
+ // request the next event from the most distant time (the next frame or the end of events in the series)
421
+ nextTime = Math . max ( finishTime , nextTime ) ;
422
+ tryRequestOneshot ( nextTime , nextTime === finishTime ? animated : true ) ;
409
423
}
410
- } else if ( Math . abs ( self . oneshotState . requestNextTimestamp - currentTime ) > EVENTTIME_ULP ) {
424
+ } else if ( Math . abs ( self . oneshotState . requestNextTimestamp - nextTime ) > EVENTTIME_ULP ) {
411
425
_cleanPastRendered ( currentTime ) ;
412
- tryRequestOneshot ( currentTime , true ) ;
426
+ tryRequestOneshot ( nextTime , true ) ;
413
427
}
414
428
}
415
429
@@ -831,6 +845,8 @@ var SubtitlesOctopus = function (options) {
831
845
self . render = self . setCurrentTime ;
832
846
833
847
self . setIsPaused = function ( isPaused , currentTime ) {
848
+ self . oneshotState . requestOffset = 0 ;
849
+
834
850
self . worker . postMessage ( {
835
851
target : 'video' ,
836
852
isPaused : isPaused ,
0 commit comments