@@ -287,7 +287,6 @@ impl AVAssetReaderDecoder {
287287 let mut last_active_frame = None :: < u32 > ;
288288 let last_sent_frame = Rc :: new ( RefCell :: new ( None :: < ProcessedFrame > ) ) ;
289289 let first_ever_frame = Rc :: new ( RefCell :: new ( None :: < ProcessedFrame > ) ) ;
290- let mut backward_stale_count: u32 = 0 ;
291290
292291 let mut frames = this. inner . frames ( ) ;
293292 let processor = ImageBufProcessor :: new ( ) ;
@@ -347,28 +346,6 @@ impl AVAssetReaderDecoder {
347346 let requested_time = requested_frame as f32 / fps as f32 ;
348347
349348 const BACKWARD_SEEK_TOLERANCE : u32 = 120 ;
350- const MAX_STALE_FRAMES : u32 = 3 ;
351- let cache_frame_min_early = cache. keys ( ) . next ( ) . copied ( ) ;
352- let cache_frame_max_early = cache. keys ( ) . next_back ( ) . copied ( ) ;
353-
354- if let ( Some ( c_min) , Some ( _c_max) ) = ( cache_frame_min_early, cache_frame_max_early) {
355- let is_backward_within_tolerance =
356- requested_frame < c_min && requested_frame + BACKWARD_SEEK_TOLERANCE >= c_min;
357- if is_backward_within_tolerance
358- && backward_stale_count < MAX_STALE_FRAMES
359- && let Some ( closest_frame) = cache. get ( & c_min)
360- {
361- backward_stale_count += 1 ;
362- let data = closest_frame. data ( ) . clone ( ) ;
363- * last_sent_frame. borrow_mut ( ) = Some ( data. clone ( ) ) ;
364- for req in pending_requests. drain ( ..) {
365- if req. sender . send ( data. to_decoded_frame ( ) ) . is_err ( ) {
366- debug ! ( "frame receiver dropped before send" ) ;
367- }
368- }
369- continue ;
370- }
371- }
372349
373350 let cache_min = min_requested_frame. saturating_sub ( FRAME_CACHE_SIZE as u32 / 2 ) ;
374351 let cache_max = max_requested_frame + FRAME_CACHE_SIZE as u32 / 2 ;
@@ -382,11 +359,7 @@ impl AVAssetReaderDecoder {
382359 requested_frame + BACKWARD_SEEK_TOLERANCE < c_min;
383360 let is_forward_seek_beyond_cache =
384361 requested_frame > c_max + FRAME_CACHE_SIZE as u32 / 4 ;
385- let stale_limit_exceeded =
386- backward_stale_count >= MAX_STALE_FRAMES && requested_frame < c_min;
387- is_backward_seek_beyond_tolerance
388- || is_forward_seek_beyond_cache
389- || stale_limit_exceeded
362+ is_backward_seek_beyond_tolerance || is_forward_seek_beyond_cache
390363 } else {
391364 true
392365 } ;
@@ -395,7 +368,6 @@ impl AVAssetReaderDecoder {
395368 this. reset ( requested_time) ;
396369 frames = this. inner . frames ( ) ;
397370 * last_sent_frame. borrow_mut ( ) = None ;
398- backward_stale_count = 0 ;
399371 cache. retain ( |& f, _| f >= cache_min && f <= cache_max) ;
400372 }
401373
@@ -445,7 +417,6 @@ impl AVAssetReaderDecoder {
445417 }
446418
447419 cache. insert ( current_frame, cache_frame. clone ( ) ) ;
448- backward_stale_count = 0 ;
449420
450421 let mut remaining_requests = Vec :: with_capacity ( pending_requests. len ( ) ) ;
451422 for req in pending_requests. drain ( ..) {
@@ -456,13 +427,9 @@ impl AVAssetReaderDecoder {
456427 debug ! ( "frame receiver dropped before send" ) ;
457428 }
458429 } else if req. frame < current_frame {
459- let prev_frame_data = last_sent_frame. borrow ( ) . clone ( ) ;
460- if let Some ( data) = prev_frame_data {
461- if req. sender . send ( data. to_decoded_frame ( ) ) . is_err ( ) {
462- debug ! ( "frame receiver dropped before send" ) ;
463- }
464- } else {
465- let data = cache_frame. data ( ) . clone ( ) ;
430+ if let Some ( cached) = cache. get ( & req. frame ) {
431+ let data = cached. data ( ) . clone ( ) ;
432+ * last_sent_frame. borrow_mut ( ) = Some ( data. clone ( ) ) ;
466433 if req. sender . send ( data. to_decoded_frame ( ) ) . is_err ( ) {
467434 debug ! ( "frame receiver dropped before send" ) ;
468435 }
@@ -486,39 +453,11 @@ impl AVAssetReaderDecoder {
486453 this. is_done = true ;
487454
488455 for req in pending_requests. drain ( ..) {
489- let prev_data = last_sent_frame . borrow ( ) . clone ( ) ;
490- if let Some ( data) = prev_data {
456+ if let Some ( cached ) = cache . get ( & req . frame ) {
457+ let data = cached . data ( ) . clone ( ) ;
491458 if req. sender . send ( data. to_decoded_frame ( ) ) . is_err ( ) {
492459 debug ! ( "frame receiver dropped before send" ) ;
493460 }
494- } else if let Some ( first_frame) = first_ever_frame. borrow ( ) . clone ( ) {
495- debug ! (
496- "Returning first decoded frame as fallback for request {}" ,
497- req. frame
498- ) ;
499- if req. sender . send ( first_frame. to_decoded_frame ( ) ) . is_err ( ) {
500- debug ! ( "frame receiver dropped before send" ) ;
501- }
502- } else {
503- debug ! (
504- "No frames available for request {}, returning black frame" ,
505- req. frame
506- ) ;
507- let black_frame_data = vec ! [ 0u8 ; ( video_width * video_height * 4 ) as usize ] ;
508- let black_frame = ProcessedFrame {
509- _number : req. frame ,
510- width : video_width,
511- height : video_height,
512- format : PixelFormat :: Rgba ,
513- frame_data : FrameData {
514- data : Arc :: new ( black_frame_data) ,
515- y_stride : video_width * 4 ,
516- uv_stride : 0 ,
517- } ,
518- } ;
519- if req. sender . send ( black_frame. to_decoded_frame ( ) ) . is_err ( ) {
520- debug ! ( "frame receiver dropped before send" ) ;
521- }
522461 }
523462 }
524463 }
0 commit comments