Skip to content

Commit 345e7a2

Browse files
committed
Handle closed reply channels and shrink frame cache
1 parent b7d0efd commit 345e7a2

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

crates/rendering/src/decoder/ffmpeg.rs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
};

crates/rendering/src/decoder/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ pub fn pts_to_frame(pts: i64, time_base: Rational, fps: u32) -> u32 {
446446
.round() as u32
447447
}
448448

449-
pub const FRAME_CACHE_SIZE: usize = 180;
449+
pub const FRAME_CACHE_SIZE: usize = 90;
450450

451451
#[derive(Clone)]
452452
pub struct AsyncVideoDecoderHandle {

0 commit comments

Comments
 (0)