From 627bf756b160989fea22b6625be9fc9dfd97d57b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 27 Oct 2022 12:52:20 +0300 Subject: [PATCH] fmp4mux: Send force-keyunit events for now if the ideal position has already passed --- mux/fmp4/src/fmp4mux/imp.rs | 68 +++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/mux/fmp4/src/fmp4mux/imp.rs b/mux/fmp4/src/fmp4mux/imp.rs index f87f4e0f..5414649d 100644 --- a/mux/fmp4/src/fmp4mux/imp.rs +++ b/mux/fmp4/src/fmp4mux/imp.rs @@ -1388,15 +1388,35 @@ impl FMP4Mux { ); state.fragment_start_pts = Some(fragment_end_pts); - gst::debug!( - CAT, - imp: self, - "Sending force-keyunit events for running time {}", - fragment_end_pts + settings.fragment_duration, - ); + let fku_time = fragment_end_pts + settings.fragment_duration; + let max_position = state + .streams + .iter() + .map(|s| s.current_position) + .max() + .unwrap(); + + let fku_time = if max_position > fku_time { + gst::warning!( + CAT, + imp: self, + "Sending force-keyunit event late for running time {} at {}", + fku_time, + max_position, + ); + None + } else { + gst::debug!( + CAT, + imp: self, + "Sending force-keyunit event for running time {}", + fku_time, + ); + Some(fku_time) + }; let fku = gst_video::UpstreamForceKeyUnitEvent::builder() - .running_time(fragment_end_pts + settings.fragment_duration) + .running_time(fku_time) .all_headers(true) .build(); @@ -2063,15 +2083,35 @@ impl AggregatorImpl for FMP4Mux { state.earliest_pts = Some(earliest_pts); state.fragment_start_pts = Some(earliest_pts); - gst::debug!( - CAT, - imp: self, - "Sending first force-keyunit event for running time {}", - earliest_pts + settings.fragment_duration, - ); + let fku_time = earliest_pts + settings.fragment_duration; + let max_position = state + .streams + .iter() + .map(|s| s.current_position) + .max() + .unwrap(); + + let fku_time = if max_position > fku_time { + gst::warning!( + CAT, + imp: self, + "Sending first force-keyunit event late for running time {} at {}", + fku_time, + max_position, + ); + None + } else { + gst::debug!( + CAT, + imp: self, + "Sending first force-keyunit event for running time {}", + fku_time, + ); + Some(fku_time) + }; let fku = gst_video::UpstreamForceKeyUnitEvent::builder() - .running_time(earliest_pts + settings.fragment_duration) + .running_time(fku_time) .all_headers(true) .build();