@@ -339,6 +339,10 @@ impl FfmpegDecoder {
339339 reply,
340340 } in pending_requests
341341 {
342+ if reply. is_closed ( ) {
343+ continue ;
344+ }
345+
342346 let last_sent_number =
343347 sw_last_sent_frame. borrow ( ) . as_ref ( ) . map ( |f| f. number ) ;
344348 let is_backward_seek = last_sent_number
@@ -388,12 +392,21 @@ impl FfmpegDecoder {
388392 sw_cache. clear ( ) ;
389393 }
390394
395+ if reply. is_closed ( ) {
396+ continue ;
397+ }
398+
399+ let reply_cell = Rc :: new ( RefCell :: new ( Some ( reply) ) ) ;
400+ let reply_for_respond = reply_cell. clone ( ) ;
401+
391402 let mut respond = {
392403 let last_sent_frame = sw_last_sent_frame. clone ( ) ;
393404 Some ( move |data : OutputFrame | {
394405 let frame_number = data. number ;
395406 * last_sent_frame. borrow_mut ( ) = Some ( data. clone ( ) ) ;
396- if reply. send ( data. frame ) . is_err ( ) {
407+ if let Some ( reply) = reply_for_respond. borrow_mut ( ) . take ( )
408+ && reply. send ( data. frame ) . is_err ( )
409+ {
397410 log:: warn!(
398411 "Failed to send decoded frame {frame_number}: receiver dropped"
399412 ) ;
@@ -434,6 +447,11 @@ impl FfmpegDecoder {
434447 let mut exit = false ;
435448
436449 for frame in & mut sw_frames {
450+ if reply_cell. borrow ( ) . as_ref ( ) . is_none_or ( |r| r. is_closed ( ) ) {
451+ respond. take ( ) ;
452+ break ;
453+ }
454+
437455 let Ok ( frame) = frame. map_err ( |e| format ! ( "read frame / {e}" ) ) else {
438456 continue ;
439457 } ;
@@ -644,6 +662,10 @@ impl FfmpegDecoder {
644662 reply,
645663 } in pending_requests
646664 {
665+ if reply. is_closed ( ) {
666+ continue ;
667+ }
668+
647669 let last_sent_number = last_sent_frame. borrow ( ) . as_ref ( ) . map ( |f| f. number ) ;
648670 let is_backward_seek = last_sent_number
649671 . map ( |last| requested_frame < last)
@@ -693,12 +715,21 @@ impl FfmpegDecoder {
693715 cache. clear ( ) ;
694716 }
695717
718+ if reply. is_closed ( ) {
719+ continue ;
720+ }
721+
722+ let reply_cell = Rc :: new ( RefCell :: new ( Some ( reply) ) ) ;
723+ let reply_for_respond = reply_cell. clone ( ) ;
724+
696725 let mut respond = {
697726 let last_sent_frame = last_sent_frame. clone ( ) ;
698727 Some ( move |data : OutputFrame | {
699728 let frame_number = data. number ;
700729 * last_sent_frame. borrow_mut ( ) = Some ( data. clone ( ) ) ;
701- if reply. send ( data. frame ) . is_err ( ) {
730+ if let Some ( reply) = reply_for_respond. borrow_mut ( ) . take ( )
731+ && reply. send ( data. frame ) . is_err ( )
732+ {
702733 log:: warn!(
703734 "Failed to send decoded frame {frame_number}: receiver dropped"
704735 ) ;
@@ -738,6 +769,11 @@ impl FfmpegDecoder {
738769 let mut exit = false ;
739770
740771 for frame in & mut frames {
772+ if reply_cell. borrow ( ) . as_ref ( ) . is_none_or ( |r| r. is_closed ( ) ) {
773+ respond. take ( ) ;
774+ break ;
775+ }
776+
741777 let Ok ( frame) = frame. map_err ( |e| format ! ( "read frame / {e}" ) ) else {
742778 continue ;
743779 } ;
0 commit comments