mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-15 14:52:04 +00:00
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:
parent
72506b94e3
commit
8114f94f73
1 changed files with 37 additions and 24 deletions
|
@ -1322,36 +1322,49 @@ impl LiveSync {
|
|||
let buffer = out_buffer.make_mut();
|
||||
|
||||
if !duplicate {
|
||||
let duration = state.out_duration.map_or(DEFAULT_DURATION, |dur| {
|
||||
dur.clamp(MINIMUM_DURATION, MAXIMUM_DURATION)
|
||||
});
|
||||
let duration_is_valid =
|
||||
(MINIMUM_DURATION..=MAXIMUM_DURATION).contains(&buffer.duration().unwrap());
|
||||
|
||||
if let Some(audio_info) = &state.out_audio_info {
|
||||
let Some(size) = audio_info
|
||||
.convert::<Option<gst::format::Bytes>>(duration)
|
||||
.flatten()
|
||||
.and_then(|bytes| usize::try_from(bytes).ok())
|
||||
else {
|
||||
gst::error!(CAT, imp: self, "Failed to calculate size of repeat buffer");
|
||||
return Err(gst::FlowError::Error);
|
||||
};
|
||||
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 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
|
||||
})?;
|
||||
let duration = state.out_duration.map_or(DEFAULT_DURATION, |dur| {
|
||||
dur.clamp(MINIMUM_DURATION, MAXIMUM_DURATION)
|
||||
});
|
||||
|
||||
audio_info
|
||||
.format_info()
|
||||
.fill_silence(mapped_memory.as_mut_slice());
|
||||
if let Some(audio_info) = &state.out_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())
|
||||
{
|
||||
size
|
||||
} else {
|
||||
gst::error!(CAT, imp: self, "Failed to calculate size of repeat buffer");
|
||||
return Err(gst::FlowError::Error);
|
||||
};
|
||||
|
||||
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}"
|
||||
);
|
||||
}
|
||||
|
||||
buffer.set_duration(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);
|
||||
|
|
Loading…
Reference in a new issue