mpegtslivesrc: Make sure to use the object as context for all debug logs

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1767>
This commit is contained in:
Sebastian Dröge 2024-09-06 10:42:40 +03:00 committed by GStreamer Marge Bot
parent c32cb20906
commit 24003a79f6

View file

@ -71,7 +71,11 @@ impl MpegTsPcr {
// returned // returned
// //
// Note, this constructor will clamp value to be within MAX_PCR // Note, this constructor will clamp value to be within MAX_PCR
fn new_with_reference(value: u64, reference: &MpegTsPcr) -> Option<MpegTsPcr> { fn new_with_reference(
imp: &MpegTsLiveSource,
value: u64,
reference: &MpegTsPcr,
) -> Option<MpegTsPcr> {
// Clamp our value to maximum // Clamp our value to maximum
let value = value % (Self::MAX + 1); let value = value % (Self::MAX + 1);
let ref_value = reference.value; let ref_value = reference.value;
@ -86,7 +90,11 @@ impl MpegTsPcr {
// new value wrapped around // new value wrapped around
if (value + Self::MAX + 1).abs_diff(ref_value) <= 15 * Self::RATE { if (value + Self::MAX + 1).abs_diff(ref_value) <= 15 * Self::RATE {
gst::debug!(CAT, "Wraparound detected %{value} vs %{ref_value}"); gst::debug!(
CAT,
imp = imp,
"Wraparound detected %{value} vs %{ref_value}"
);
return Some(MpegTsPcr { return Some(MpegTsPcr {
value, value,
wraparound: reference.wraparound + 1, wraparound: reference.wraparound + 1,
@ -97,6 +105,7 @@ impl MpegTsPcr {
if value.abs_diff(ref_value + Self::MAX + 1) <= 15 * Self::RATE { if value.abs_diff(ref_value + Self::MAX + 1) <= 15 * Self::RATE {
gst::debug!( gst::debug!(
CAT, CAT,
imp = imp,
"Backward PCR within tolerance detected %{value} vs %{ref_value}" "Backward PCR within tolerance detected %{value} vs %{ref_value}"
); );
return Some(MpegTsPcr { return Some(MpegTsPcr {
@ -105,7 +114,7 @@ impl MpegTsPcr {
}); });
} }
gst::debug!(CAT, "Discont detected %{value} vs %{ref_value}"); gst::debug!(CAT, imp = imp, "Discont detected %{value} vs %{ref_value}");
None None
} }
@ -168,7 +177,12 @@ impl MpegTSLiveSourceState {
/// Grab time of our clock and controlled clock /// Grab time of our clock and controlled clock
/// ///
/// Returns `true` on PCR discontinuities. /// Returns `true` on PCR discontinuities.
fn store_observation(&mut self, pcr: u64, monotonic_time: gst::ClockTime) -> bool { fn store_observation(
&mut self,
imp: &MpegTsLiveSource,
pcr: u64,
monotonic_time: gst::ClockTime,
) -> bool {
// If this is the first PCR we observe: // If this is the first PCR we observe:
// * Remember the PCR *and* the associated monotonic clock value when capture // * Remember the PCR *and* the associated monotonic clock value when capture
// * `base_pcr` `base_monotonic` // * `base_pcr` `base_monotonic`
@ -184,9 +198,9 @@ impl MpegTSLiveSourceState {
if let (Some(base_pcr), Some(base_monotonic), Some(last_seen_pcr)) = if let (Some(base_pcr), Some(base_monotonic), Some(last_seen_pcr)) =
(self.base_pcr, self.base_monotonic, self.last_seen_pcr) (self.base_pcr, self.base_monotonic, self.last_seen_pcr)
{ {
gst::trace!(CAT, "pcr:{pcr}, monotonic_time:{monotonic_time}"); gst::trace!(CAT, imp = imp, "pcr:{pcr}, monotonic_time:{monotonic_time}");
let mut handled_pcr = MpegTsPcr::new_with_reference(pcr, &last_seen_pcr); let mut handled_pcr = MpegTsPcr::new_with_reference(imp, pcr, &last_seen_pcr);
if let Some(new_pcr) = handled_pcr { if let Some(new_pcr) = handled_pcr {
// First check if this is more than 1s off from the current clock calibration and // First check if this is more than 1s off from the current clock calibration and
// if so consider it a discontinuity too. // if so consider it a discontinuity too.
@ -204,6 +218,7 @@ impl MpegTSLiveSourceState {
if expected_external.absdiff(new_external) >= gst::ClockTime::SECOND { if expected_external.absdiff(new_external) >= gst::ClockTime::SECOND {
gst::warning!( gst::warning!(
CAT, CAT,
imp = imp,
"New PCR clock estimation {new_external} too far from old estimation {expected_external}: {}", "New PCR clock estimation {new_external} too far from old estimation {expected_external}: {}",
new_external.into_positive() - expected_external, new_external.into_positive() - expected_external,
); );
@ -215,6 +230,7 @@ impl MpegTSLiveSourceState {
new_pcr = handled_pcr; new_pcr = handled_pcr;
gst::trace!( gst::trace!(
CAT, CAT,
imp = imp,
"Adding new observation internal: {} -> external: {}", "Adding new observation internal: {} -> external: {}",
gst::ClockTime::from(new_pcr.saturating_sub(base_pcr)) + base_monotonic, gst::ClockTime::from(new_pcr.saturating_sub(base_pcr)) + base_monotonic,
monotonic_time, monotonic_time,
@ -232,7 +248,7 @@ impl MpegTSLiveSourceState {
num, num,
denom, denom,
); );
gst::warning!(CAT, "DISCONT detected, Picking new reference times (pcr:{pcr:#?}, monotonic:{monotonic_time}, scaled monotonic:{scaled_monotonic}"); gst::warning!(CAT, imp = imp, "DISCONT detected, Picking new reference times (pcr:{pcr:#?}, monotonic:{monotonic_time}, scaled monotonic:{scaled_monotonic}");
new_pcr = MpegTsPcr::new(pcr); new_pcr = MpegTsPcr::new(pcr);
self.base_pcr = Some(new_pcr); self.base_pcr = Some(new_pcr);
self.base_monotonic = Some(monotonic_time); self.base_monotonic = Some(monotonic_time);
@ -241,6 +257,7 @@ impl MpegTSLiveSourceState {
} else { } else {
gst::debug!( gst::debug!(
CAT, CAT,
imp = imp,
"Picking initial reference times (pcr:{pcr:#?}, monotonic:{monotonic_time}" "Picking initial reference times (pcr:{pcr:#?}, monotonic:{monotonic_time}"
); );
new_pcr = MpegTsPcr::new(pcr); new_pcr = MpegTsPcr::new(pcr);
@ -272,7 +289,7 @@ fn find_pcr(slice: &[u8], imp: &MpegTsLiveSource) -> Result<Option<u64>> {
for chunk in slice[pos..].chunks_exact(188) { for chunk in slice[pos..].chunks_exact(188) {
if chunk[0] != 0x47 { if chunk[0] != 0x47 {
gst::error!(CAT, "Lost sync"); gst::error!(CAT, imp = imp, "Lost sync");
break; break;
} }
let mut reader = BitReader::endian(chunk, BigEndian); let mut reader = BitReader::endian(chunk, BigEndian);
@ -352,7 +369,7 @@ impl MpegTsLiveSource {
if let (Some(monotonic_time), Some(raw_pcr)) = if let (Some(monotonic_time), Some(raw_pcr)) =
(monotonic_time, get_pcr_from_buffer(self, &buffer)) (monotonic_time, get_pcr_from_buffer(self, &buffer))
{ {
if state.store_observation(raw_pcr, monotonic_time) { if state.store_observation(self, raw_pcr, monotonic_time) {
let buffer = buffer.make_mut(); let buffer = buffer.make_mut();
buffer.set_flags(gst::BufferFlags::DISCONT); buffer.set_flags(gst::BufferFlags::DISCONT);
} }
@ -366,7 +383,12 @@ impl MpegTsLiveSource {
.adjust_unlocked(pts + base_time) .adjust_unlocked(pts + base_time)
.expect("Couldn't adjust {pts}") .expect("Couldn't adjust {pts}")
.saturating_sub(base_time); .saturating_sub(base_time);
gst::debug!(CAT, "Updating buffer pts from {pts} to {:?}", new_pts); gst::debug!(
CAT,
imp = self,
"Updating buffer pts from {pts} to {:?}",
new_pts
);
buffer.set_pts(new_pts); buffer.set_pts(new_pts);
buffer.set_dts(new_pts); buffer.set_dts(new_pts);
}; };
@ -399,7 +421,7 @@ impl MpegTsLiveSource {
if let (Some(monotonic_time), Some(raw_pcr)) = if let (Some(monotonic_time), Some(raw_pcr)) =
(monotonic_time, get_pcr_from_buffer(self, &buffer)) (monotonic_time, get_pcr_from_buffer(self, &buffer))
{ {
if state.store_observation(raw_pcr, monotonic_time) { if state.store_observation(self, raw_pcr, monotonic_time) {
let buffer = buffer.make_mut(); let buffer = buffer.make_mut();
buffer.set_flags(gst::BufferFlags::DISCONT); buffer.set_flags(gst::BufferFlags::DISCONT);
} }
@ -413,7 +435,12 @@ impl MpegTsLiveSource {
.adjust_unlocked(pts + base_time) .adjust_unlocked(pts + base_time)
.expect("Couldn't adjust {pts}") .expect("Couldn't adjust {pts}")
.saturating_sub(base_time); .saturating_sub(base_time);
gst::debug!(CAT, "Updating buffer pts from {pts} to {:?}", new_pts); gst::debug!(
CAT,
imp = self,
"Updating buffer pts from {pts} to {:?}",
new_pts
);
buffer.set_pts(new_pts); buffer.set_pts(new_pts);
buffer.set_dts(new_pts); buffer.set_dts(new_pts);
}; };
@ -703,12 +730,22 @@ mod tests {
#[test] #[test]
fn pcr_wraparound_test() { fn pcr_wraparound_test() {
gst::init().unwrap();
crate::plugin_register_static().expect("mpegtslivesrc test");
let element = gst::ElementFactory::make("mpegtslivesrc")
.build()
.unwrap()
.downcast::<super::super::MpegTsLiveSource>()
.unwrap();
let imp = element.imp();
// Basic test going forward within 15s // Basic test going forward within 15s
let ref_pcr = MpegTsPcr { let ref_pcr = MpegTsPcr {
value: 360 * MpegTsPcr::RATE, value: 360 * MpegTsPcr::RATE,
wraparound: 100, wraparound: 100,
}; };
let pcr = MpegTsPcr::new_with_reference(370 * MpegTsPcr::RATE, &ref_pcr); let pcr = MpegTsPcr::new_with_reference(imp, 370 * MpegTsPcr::RATE, &ref_pcr);
assert!(pcr.is_some()); assert!(pcr.is_some());
if let Some(pcr) = pcr { if let Some(pcr) = pcr {
assert_eq!(pcr.value, 370 * MpegTsPcr::RATE); assert_eq!(pcr.value, 370 * MpegTsPcr::RATE);
@ -716,10 +753,10 @@ mod tests {
}; };
// Discont // Discont
let pcr = MpegTsPcr::new_with_reference(344 * MpegTsPcr::RATE, &ref_pcr); let pcr = MpegTsPcr::new_with_reference(imp, 344 * MpegTsPcr::RATE, &ref_pcr);
assert!(pcr.is_none()); assert!(pcr.is_none());
let pcr = MpegTsPcr::new_with_reference(386 * MpegTsPcr::RATE, &ref_pcr); let pcr = MpegTsPcr::new_with_reference(imp, 386 * MpegTsPcr::RATE, &ref_pcr);
assert!(pcr.is_none()); assert!(pcr.is_none());
// Wraparound, ref is 10s before MAX // Wraparound, ref is 10s before MAX
@ -727,7 +764,7 @@ mod tests {
value: MpegTsPcr::MAX - 10 * MpegTsPcr::RATE, value: MpegTsPcr::MAX - 10 * MpegTsPcr::RATE,
wraparound: 600, wraparound: 600,
}; };
let pcr = MpegTsPcr::new_with_reference(0, &ref_pcr); let pcr = MpegTsPcr::new_with_reference(imp, 0, &ref_pcr);
assert!(pcr.is_some()); assert!(pcr.is_some());
if let Some(pcr) = pcr { if let Some(pcr) = pcr {
assert_eq!(pcr.value, 0); assert_eq!(pcr.value, 0);
@ -735,7 +772,7 @@ mod tests {
}; };
// Discont // Discont
let pcr = MpegTsPcr::new_with_reference(10 * MpegTsPcr::RATE, &ref_pcr); let pcr = MpegTsPcr::new_with_reference(imp, 10 * MpegTsPcr::RATE, &ref_pcr);
assert!(pcr.is_none()); assert!(pcr.is_none());
// reference is 5s after wraparound // reference is 5s after wraparound
@ -744,7 +781,8 @@ mod tests {
wraparound: 600, wraparound: 600,
}; };
// value is 5s before wraparound // value is 5s before wraparound
let pcr = MpegTsPcr::new_with_reference(MpegTsPcr::MAX + 1 - 5 * MpegTsPcr::RATE, &ref_pcr); let pcr =
MpegTsPcr::new_with_reference(imp, MpegTsPcr::MAX + 1 - 5 * MpegTsPcr::RATE, &ref_pcr);
assert!(pcr.is_some()); assert!(pcr.is_some());
if let Some(pcr) = pcr { if let Some(pcr) = pcr {
assert_eq!(pcr.value, MpegTsPcr::MAX + 1 - 5 * MpegTsPcr::RATE); assert_eq!(pcr.value, MpegTsPcr::MAX + 1 - 5 * MpegTsPcr::RATE);