End ffmpeg progress always with at least 100%

This commit is contained in:
bytedream 2024-04-08 00:37:19 +02:00
parent 25cde6163c
commit fe49161e93

View file

@ -1285,21 +1285,11 @@ async fn ffmpeg_progress<R: AsyncReadExt + Unpin>(
let reader = BufReader::new(stats); let reader = BufReader::new(stats);
let mut lines = reader.lines(); let mut lines = reader.lines();
let mut frame = 0;
loop { loop {
select! { select! {
// when gracefully canceling this future, set the progress to 100% (finished). sometimes
// ffmpeg is too fast or already finished when the reading process of 'stats' starts
// which causes the progress to be stuck at 0%
_ = cancellation_token.cancelled() => { _ = cancellation_token.cancelled() => {
if let Some(p) = &progress { break
p.set_position(total_frames)
}
debug!(
"Processed frame [{}/{} 100%]",
total_frames,
total_frames
);
return Ok(())
} }
line = lines.next_line() => { line = lines.next_line() => {
let Some(line) = line? else { let Some(line) = line? else {
@ -1314,7 +1304,7 @@ async fn ffmpeg_progress<R: AsyncReadExt + Unpin>(
let Some(frame_str) = frame_cap.name("frame") else { let Some(frame_str) = frame_cap.name("frame") else {
break break
}; };
let frame: u64 = frame_str.as_str().parse()?; frame = frame_str.as_str().parse()?;
if let Some(p) = &progress { if let Some(p) = &progress {
p.set_position(frame) p.set_position(frame)
@ -1330,5 +1320,15 @@ async fn ffmpeg_progress<R: AsyncReadExt + Unpin>(
} }
} }
// when this future is gracefully cancelled or if ffmpeg is too fast or already finished when
// reading process of 'stats' starts (which causes the progress to be stuck at 0%), the progress
// is manually set to 100% here
if frame < total_frames {
if let Some(p) = &progress {
p.set_position(frame)
}
debug!("Processed frame [{}/{} 100%]", total_frames, total_frames);
}
Ok(()) Ok(())
} }