use anyhow::Result;
use gst::prelude::*;
#[derive(Debug, Clone)]
pub struct DecodeBinBuilder {
element: gst::Element,
}
impl DecodeBinBuilder {
pub fn new() -> Self {
DecodeBinBuilder {
element: gst::ElementFactory::make_with_name("decodebin", Some("decodebin"))
.expect("Failed to create decodebin element"),
}
}
pub fn with_caps(mut self, caps: &str) -> Self {
self.element.set_property("caps", &gst::Caps::builder(caps).build());
self
}
pub fn with_buffering(mut self, enabled: bool) -> Self {
self.element.set_property("use-buffering", enabled);
self
}
pub fn with_expose_all_streams(mut self, expose_all: bool) -> Self {
self.element.set_property("expose-all-streams", expose_all);
self
}
pub fn with_sink_caps(mut self, caps: &str) -> Self {
self.element.set_property("sink-caps", &gst::Caps::builder(caps).build());
self
}
pub fn with_sink_properties(mut self, properties: Vec<(String, gst::glib::Value)>) -> Self {
for (name, value) in properties {
self.element.set_property_from_value(&name, &value);
}
self
}
pub fn build(self) -> Result<gst::Element, anyhow::Error> {
Ok(self.element)
}
}
#[cfg(test)]
mod tests {
use super::*;
use gst::init;
#[test]
fn test_builder_default() {
init().unwrap();
let decodebin = DecodeBinBuilder::new().build().unwrap();
assert_eq!(decodebin.property::<bool>("use-buffering"), false);
assert_eq!(decodebin.property::<bool>("expose-all-streams"), true);
}
#[test]
fn test_builder_with_custom_values() {
init().unwrap();
let decodebin = DecodeBinBuilder::new()
.with_caps("video/x-raw")
.with_buffering(true)
.with_expose_all_streams(false)
.with_sink_caps("audio/x-raw")
.build()
.unwrap();
assert_eq!(decodebin.property::<bool>("use-buffering"), true);
assert_eq!(decodebin.property::<bool>("expose-all-streams"), false);
assert_eq!(decodebin.property::<gst::Caps>("sink-caps").to_string(), "audio/x-raw");
}
}