Set priority and change pad request after fixes

This commit is contained in:
Sanchayan Maity 2024-06-26 18:07:50 +05:30
parent de707f1c07
commit 64a5417c67

View file

@ -236,7 +236,7 @@ fn receive_pipeline(pipeline: &gst::Pipeline) {
pipeline.debug_to_dot_file_with_ts(
gst::DebugGraphDetails::all(),
format!("Removed bin downstream to {pad_name}"),
format!("removed-bin-downstream-to-{pad_name}"),
);
}
@ -273,6 +273,84 @@ fn send_pipeline(pipeline: &gst::Pipeline) {
pipeline.add_many([&mux, &sink]).unwrap();
mux.link(&sink).unwrap();
let video1_mux_pad = mux.request_pad_simple("stream_uni_%u").unwrap();
let video2_mux_pad = mux.request_pad_simple("stream_uni_%u").unwrap();
let video3_mux_pad = mux.request_pad_simple("stream_uni_%u").unwrap();
let video4_mux_pad = mux.request_pad_simple("datagram").unwrap();
video1_mux_pad.set_property("priority", 1);
video2_mux_pad.set_property("priority", 2);
video3_mux_pad.set_property("priority", 3);
let video1_pad = video1.static_pad("src").unwrap();
let video2_pad = video2.static_pad("src").unwrap();
let video3_pad = video3.static_pad("src").unwrap();
let video4_pad = video4.static_pad("src").unwrap();
video1_pad.link(&video1_mux_pad).unwrap();
video2_pad.link(&video2_mux_pad).unwrap();
video3_pad.link(&video3_mux_pad).unwrap();
video4_pad.link(&video4_mux_pad).unwrap();
// Test releasing stream/request pad from muxer
let weak_pipeline = pipeline.downgrade();
glib::timeout_add_seconds_once(15, move || {
let pipeline = match weak_pipeline.upgrade() {
Some(pipeline) => pipeline,
None => return,
};
gst::info!(CAT, "Adding probe to remove Stream 3....");
video3_pad.add_probe(gst::PadProbeType::IDLE, move |pad, _probe_info| {
if let Some(peer) = pad.peer() {
gst::info!(CAT, "Removing Stream 3....");
pad.unlink(&peer).unwrap();
if let Some(parent) = peer
.parent()
.and_then(|p| p.downcast::<gst::Element>().ok())
{
gst::log!(
CAT,
"Releasing request pad {} from parent {}",
peer.name(),
parent.name()
);
parent.release_request_pad(&peer);
gst::log!(
CAT,
"Released request pad {} from parent {}",
peer.name(),
parent.name()
);
}
if let Some(parent) = pad.parent().and_then(|p| p.downcast::<gst::Element>().ok()) {
pipeline.remove(&parent).unwrap();
let weak_pipeline = pipeline.downgrade();
glib::idle_add_once(move || {
let _ = match weak_pipeline.upgrade() {
Some(self_) => self_,
None => return,
};
let _ = parent.set_state(gst::State::Null);
});
}
}
gst::info!(CAT, "Removed Stream 3");
pipeline.debug_to_dot_file_with_ts(gst::DebugGraphDetails::all(), "removed-stream-3");
gst::PadProbeReturn::Drop
});
});
pipeline.debug_to_dot_file_with_ts(gst::DebugGraphDetails::all(), "setup-quic-mux");
}
fn main() {
@ -331,97 +409,6 @@ fn main() {
})
.unwrap();
if !cli.receiver {
let mux = pipeline.by_name("quic-mux").unwrap();
let video1 = pipeline.by_name("Stream 1").unwrap();
let video2 = pipeline.by_name("Stream 2").unwrap();
let video3 = pipeline.by_name("Stream 3").unwrap();
let video4 = pipeline.by_name("Datagram").unwrap();
let video1_mux_pad = mux.request_pad_simple("stream_uni_%u").unwrap();
let video2_mux_pad = mux.request_pad_simple("stream_uni_%u").unwrap();
let video3_mux_pad = mux.request_pad_simple("stream_uni_%u").unwrap();
let video4_mux_pad = mux.request_pad_simple("datagram").unwrap();
let video1_pad = video1.static_pad("src").unwrap();
let video2_pad = video2.static_pad("src").unwrap();
let video3_pad = video3.static_pad("src").unwrap();
let video4_pad = video4.static_pad("src").unwrap();
video1_pad.link(&video1_mux_pad).unwrap();
video2_pad.link(&video2_mux_pad).unwrap();
video3_pad.link(&video3_mux_pad).unwrap();
video4_pad.link(&video4_mux_pad).unwrap();
mux.sync_state_with_parent().unwrap();
video1.sync_state_with_parent().unwrap();
video2.sync_state_with_parent().unwrap();
video3.sync_state_with_parent().unwrap();
pipeline.debug_to_dot_file_with_ts(gst::DebugGraphDetails::all(), "setup-quic-mux");
// Test releasing stream/request pad from muxer
let weak_pipeline = pipeline.downgrade();
glib::timeout_add_seconds_once(15, move || {
let pipeline = match weak_pipeline.upgrade() {
Some(pipeline) => pipeline,
None => return,
};
gst::info!(CAT, "Adding probe to remove Stream 3....");
video3_pad.add_probe(gst::PadProbeType::IDLE, move |pad, _probe_info| {
if let Some(peer) = pad.peer() {
gst::info!(CAT, "Removing Stream 3....");
pad.unlink(&peer).unwrap();
if let Some(parent) = peer
.parent()
.and_then(|p| p.downcast::<gst::Element>().ok())
{
gst::log!(
CAT,
"Releasing request pad {} from parent {}",
peer.name(),
parent.name()
);
parent.release_request_pad(&peer);
gst::log!(
CAT,
"Released request pad {} from parent {}",
peer.name(),
parent.name()
);
}
if let Some(parent) =
pad.parent().and_then(|p| p.downcast::<gst::Element>().ok())
{
pipeline.remove(&parent).unwrap();
let weak_pipeline = pipeline.downgrade();
glib::idle_add_once(move || {
let _ = match weak_pipeline.upgrade() {
Some(self_) => self_,
None => return,
};
let _ = parent.set_state(gst::State::Null);
});
}
}
gst::info!(CAT, "Removed Stream 3");
pipeline
.debug_to_dot_file_with_ts(gst::DebugGraphDetails::all(), "removed-Stream-3");
gst::PadProbeReturn::Drop
});
});
}
let weak_pipeline = pipeline.downgrade();
// Capture pipeline graph 5 secs later to correctly capture STATE changes.
glib::timeout_add_seconds_once(10, move || {