forked from mirrors/gstreamer-rs
utils/streamproducer: Add StreamProducer::configure_consumer()
This allows configuring an `appsrc` before actually adding it as consumer at a later time, and can be useful if the pipeline with the source should be started earlier than adding it to a consumer. Also use strongly-typed property API for the `appsrc` properties.
This commit is contained in:
parent
f3bba21faa
commit
a51235048d
2 changed files with 22 additions and 17 deletions
|
@ -16,18 +16,14 @@ rust-version = "1.57"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
gst = { package = "gstreamer", path = "../gstreamer" }
|
gst = { package = "gstreamer", path = "../gstreamer", features = ["v1_20"] }
|
||||||
gst_app = { package = "gstreamer-app", path = "../gstreamer-app" }
|
gst_app = { package = "gstreamer-app", path = "../gstreamer-app", features = ["v1_20"] }
|
||||||
gst_video = { package = "gstreamer-video", path = "../gstreamer-video" }
|
gst_video = { package = "gstreamer-video", path = "../gstreamer-video", features = ["v1_20"] }
|
||||||
once_cell = "1"
|
once_cell = "1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
futures = { version = "0.3", features = ["executor"] }
|
futures = { version = "0.3", features = ["executor"] }
|
||||||
gst_app = { package = "gstreamer-app", path = "../gstreamer-app" }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
v1_16 = []
|
v1_22 = []
|
||||||
v1_18 = ['v1_16']
|
|
||||||
v1_20 = ['v1_18']
|
|
||||||
v1_22 = ['v1_20']
|
|
||||||
|
|
|
@ -36,6 +36,23 @@ impl PartialEq for StreamProducer {
|
||||||
impl Eq for StreamProducer {}
|
impl Eq for StreamProducer {}
|
||||||
|
|
||||||
impl StreamProducer {
|
impl StreamProducer {
|
||||||
|
/// Configure a consumer `appsrc` for later use in a `StreamProducer`
|
||||||
|
///
|
||||||
|
/// This is automatically called when calling `add_consumer()`.
|
||||||
|
pub fn configure_consumer(consumer: &gst_app::AppSrc) {
|
||||||
|
// Latency on the appsrc is set by the publisher before the first buffer
|
||||||
|
// and whenever it changes
|
||||||
|
consumer.set_latency(gst::ClockTime::ZERO, gst::ClockTime::NONE);
|
||||||
|
consumer.set_format(gst::Format::Time);
|
||||||
|
consumer.set_is_live(true);
|
||||||
|
consumer.set_handle_segment_change(true);
|
||||||
|
consumer.set_max_buffers(0);
|
||||||
|
consumer.set_max_bytes(0);
|
||||||
|
consumer.set_max_time(500 * gst::ClockTime::MSECOND);
|
||||||
|
consumer.set_leaky_type(gst_app::AppLeakyType::Downstream);
|
||||||
|
consumer.set_automatic_eos(false);
|
||||||
|
}
|
||||||
|
|
||||||
/// Add an appsrc to dispatch data to
|
/// Add an appsrc to dispatch data to
|
||||||
pub fn add_consumer(&self, consumer: &gst_app::AppSrc) {
|
pub fn add_consumer(&self, consumer: &gst_app::AppSrc) {
|
||||||
let mut consumers = self.consumers.lock().unwrap();
|
let mut consumers = self.consumers.lock().unwrap();
|
||||||
|
@ -50,15 +67,7 @@ impl StreamProducer {
|
||||||
|
|
||||||
gst::debug!(CAT, obj: &self.appsink, "Adding consumer");
|
gst::debug!(CAT, obj: &self.appsink, "Adding consumer");
|
||||||
|
|
||||||
consumer.set_property("max-buffers", 0u64);
|
Self::configure_consumer(consumer);
|
||||||
consumer.set_property("max-bytes", 0u64);
|
|
||||||
consumer.set_property("max-time", gst::ClockTime::from_mseconds(500));
|
|
||||||
consumer.set_property("format", gst::Format::Time);
|
|
||||||
consumer.set_property_from_str("leaky-type", "downstream");
|
|
||||||
consumer
|
|
||||||
.try_set_property("handle-segment-change", true)
|
|
||||||
.ok();
|
|
||||||
consumer.set_automatic_eos(false);
|
|
||||||
|
|
||||||
// Forward force-keyunit events upstream to the appsink
|
// Forward force-keyunit events upstream to the appsink
|
||||||
let srcpad = consumer.static_pad("src").unwrap();
|
let srcpad = consumer.static_pad("src").unwrap();
|
||||||
|
|
Loading…
Reference in a new issue