@@ -6,8 +6,6 @@ use std::{
66 sync:: { Arc , mpsc} ,
77} ;
88
9- use tracing:: debug;
10-
119use cidre:: {
1210 arc:: R ,
1311 cv:: { self , pixel_buffer:: LockFlags } ,
@@ -593,16 +591,20 @@ impl AVAssetReaderDecoder {
593591 * last_sent_frame. borrow_mut ( ) = Some ( data. clone ( ) ) ;
594592 let _ = req. sender . send ( data. to_decoded_frame ( ) ) ;
595593 } else {
596- let data = if is_scrubbing {
597- cache_frame. data ( ) . clone ( )
598- } else {
599- last_sent_frame
600- . borrow ( )
601- . clone ( )
602- . unwrap_or_else ( || cache_frame. data ( ) . clone ( ) )
603- } ;
604- * last_sent_frame. borrow_mut ( ) = Some ( data. clone ( ) ) ;
605- let _ = req. sender . send ( data. to_decoded_frame ( ) ) ;
594+ const MAX_FALLBACK_DISTANCE : u32 = 10 ;
595+
596+ let nearest = cache
597+ . range ( ..=req. frame )
598+ . next_back ( )
599+ . or_else ( || cache. range ( req. frame ..) . next ( ) ) ;
600+
601+ if let Some ( ( & frame_num, cached) ) = nearest {
602+ let distance = req. frame . abs_diff ( frame_num) ;
603+ if distance <= MAX_FALLBACK_DISTANCE {
604+ let _ =
605+ req. sender . send ( cached. data ( ) . to_decoded_frame ( ) ) ;
606+ }
607+ }
606608 }
607609 } else {
608610 remaining_requests. push ( req) ;
@@ -635,16 +637,20 @@ impl AVAssetReaderDecoder {
635637 if let Some ( cached) = cache. get ( & req. frame ) {
636638 let data = cached. data ( ) . clone ( ) ;
637639 let _ = req. sender . send ( data. to_decoded_frame ( ) ) ;
638- } else if let Some ( last) = last_sent_frame. borrow ( ) . clone ( ) {
639- if req. sender . send ( last. to_decoded_frame ( ) ) . is_err ( ) { }
640- } else if let Some ( first) = first_ever_frame. borrow ( ) . clone ( ) {
641- if req. sender . send ( first. to_decoded_frame ( ) ) . is_err ( ) { }
642640 } else {
643- debug ! (
644- decoder = _name,
645- requested_frame = req. frame,
646- "No frame available to send - request dropped"
647- ) ;
641+ const MAX_FALLBACK_DISTANCE : u32 = 10 ;
642+
643+ let nearest = cache
644+ . range ( ..=req. frame )
645+ . next_back ( )
646+ . or_else ( || cache. range ( req. frame ..) . next ( ) ) ;
647+
648+ if let Some ( ( & frame_num, cached) ) = nearest {
649+ let distance = req. frame . abs_diff ( frame_num) ;
650+ if distance <= MAX_FALLBACK_DISTANCE {
651+ let _ = req. sender . send ( cached. data ( ) . to_decoded_frame ( ) ) ;
652+ }
653+ }
648654 }
649655 }
650656 }
0 commit comments