livesync: Keep existing buffer duration in some cases

Resize a repeat buffer only if caps gave us a duration to use, or we
consider its current duration unreasonable.

In particular, for audio streams we should prefer reusing the buffer
size upstream gave us, as we did before 6633cc4046.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1387>
This commit is contained in:
Jan Alexander Steffens (heftig) 2023-10-25 18:48:50 +02:00 committed by Sebastian Dröge
parent 72506b94e3
commit 8114f94f73

View file

@ -1322,36 +1322,49 @@ impl LiveSync {
let buffer = out_buffer.make_mut();
if !duplicate {
let duration_is_valid =
(MINIMUM_DURATION..=MAXIMUM_DURATION).contains(&buffer.duration().unwrap());
if state.out_duration.is_some() || !duration_is_valid {
// Resize the buffer if caps gave us a duration
// or the current duration is unreasonable
let duration = state.out_duration.map_or(DEFAULT_DURATION, |dur| {
dur.clamp(MINIMUM_DURATION, MAXIMUM_DURATION)
});
if let Some(audio_info) = &state.out_audio_info {
let Some(size) = audio_info
let size = if let Some(size) = audio_info
.convert::<Option<gst::format::Bytes>>(duration)
.flatten()
.and_then(|bytes| usize::try_from(bytes).ok())
else {
.and_then(|bytes| usize::try_from(*bytes).ok())
{
size
} else {
gst::error!(CAT, imp: self, "Failed to calculate size of repeat buffer");
return Err(gst::FlowError::Error);
};
let mut mapped_memory = gst::Memory::with_size(size)
.into_mapped_memory_writable()
.map_err(|_| {
gst::error!(CAT, imp: self, "Failed to map memory");
gst::FlowError::Error
})?;
audio_info
.format_info()
.fill_silence(mapped_memory.as_mut_slice());
buffer.replace_all_memory(mapped_memory.into_memory());
buffer.replace_all_memory(gst::Memory::with_size(size));
}
buffer.set_duration(duration);
gst::debug!(CAT, imp: self, "Patched output buffer duration to {duration}");
gst::debug!(
CAT,
imp: self,
"Patched output buffer duration to {duration}"
);
}
if let Some(audio_info) = &state.out_audio_info {
let mut map_info = buffer.map_writable().map_err(|e| {
gst::error!(CAT, imp: self, "Failed to map buffer: {}", e);
gst::FlowError::Error
})?;
audio_info
.format_info()
.fill_silence(map_info.as_mut_slice());
}
}
buffer.set_dts(dts);