Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sdroege/gst-plugin-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2022-10-19 17:03:15 +0300
committerSeungha Yang <seungha@centricular.com>2022-10-19 19:56:36 +0300
commit1db66e5a3b7c54f015f61f4a8385a378d8d0dd36 (patch)
tree1651f85a0c42b6df2646158c426298fb157cc706
parent12400b6b87e75cfdfa7701b62cf8698c11e14a73 (diff)
fallbacksrc: Drop QoS event while pad is blocked
An element which creates QoS event might reference different GstSegment timeline (e.g., fallback testsrc's one). Then it can cause lots of buffers are being dropped in decoder, because of the QoS events. Drops the QoS event before we calculate appropriate pad offsets from blocking pad probe.
-rw-r--r--utils/fallbackswitch/src/fallbacksrc/imp.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/utils/fallbackswitch/src/fallbacksrc/imp.rs b/utils/fallbackswitch/src/fallbacksrc/imp.rs
index 3ec4f757..829d18f2 100644
--- a/utils/fallbackswitch/src/fallbacksrc/imp.rs
+++ b/utils/fallbackswitch/src/fallbacksrc/imp.rs
@@ -124,6 +124,7 @@ enum Source {
struct Block {
pad: gst::Pad,
probe_id: gst::PadProbeId,
+ qos_probe_id: gst::PadProbeId,
running_time: Option<gst::ClockTime>,
}
@@ -2003,9 +2004,22 @@ impl FallbackSrc {
)
.unwrap();
+ let qos_probe_id = block_pad
+ .add_probe(gst::PadProbeType::EVENT_UPSTREAM, |_pad, info| {
+ if let Some(gst::PadProbeData::Event(ref ev)) = info.data {
+ if let gst::EventView::Qos(_) = ev.view() {
+ return gst::PadProbeReturn::Drop;
+ }
+ }
+
+ gst::PadProbeReturn::Ok
+ })
+ .unwrap();
+
Block {
pad: block_pad.clone(),
probe_id,
+ qos_probe_id,
running_time: gst::ClockTime::NONE,
}
}
@@ -2120,6 +2134,7 @@ impl FallbackSrc {
fallback_source,
);
block.pad.remove_probe(block.probe_id);
+ block.pad.remove_probe(block.qos_probe_id);
}
gst::debug!(CAT, imp: self, "Live source, unblocking directly");
@@ -2337,6 +2352,7 @@ impl FallbackSrc {
block.pad.set_offset(offset);
}
block.pad.remove_probe(block.probe_id);
+ block.pad.remove_probe(block.qos_probe_id);
}
if let Some(block) = video_branch
@@ -2347,6 +2363,7 @@ impl FallbackSrc {
block.pad.set_offset(offset);
}
block.pad.remove_probe(block.probe_id);
+ block.pad.remove_probe(block.qos_probe_id);
}
} else if have_audio && want_audio {
let audio_running_time = match audio_running_time {
@@ -2381,6 +2398,7 @@ impl FallbackSrc {
block.pad.set_offset(offset);
}
block.pad.remove_probe(block.probe_id);
+ block.pad.remove_probe(block.qos_probe_id);
}
} else if have_video && want_video {
let video_running_time = match video_running_time {
@@ -2415,6 +2433,7 @@ impl FallbackSrc {
block.pad.set_offset(offset);
}
block.pad.remove_probe(block.probe_id);
+ block.pad.remove_probe(block.qos_probe_id);
}
}
}
@@ -2905,6 +2924,7 @@ impl FallbackSrc {
source_srcpad.name()
);
block.pad.remove_probe(block.probe_id);
+ block.pad.remove_probe(block.qos_probe_id);
}
let switch_sinkpads = [state.audio_stream.as_ref(), state.video_stream.as_ref()]
.into_iter()