@@ -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