use anyhow::Result;
use gst::prelude::*;
#[derive(Debug, Clone)]
pub struct FileSrcBuilder {
element: gst::Element,
}
impl FileSrcBuilder {
pub fn new(location: &str) -> Self {
let element = gst::ElementFactory::make_with_name("filesrc", Some("filesrc"))
.expect("Failed to create filesrc element");
element.set_property("blocksize", 65536u32);
element.set_property("location", location);
FileSrcBuilder { element }
}
pub fn with_blocksize(mut self, size: u32) -> Self {
self.element.set_property("blocksize", size);
self
}
pub fn with_timestamp(mut self, enabled: bool) -> Self {
self.element.set_property("do-timestamp", enabled);
self
}
pub fn with_num_buffers(mut self, num_buffers: i32) -> Self {
self.element.set_property("num-buffers", num_buffers);
self
}
pub fn build(self) -> Result<gst::Element> {
Ok(self.element)
}
}
#[cfg(test)]
mod tests {
use super::*;
use gst::init;
#[test]
fn test_builder_with_required_parameter() {
init().unwrap();
let filesrc = FileSrcBuilder::new("/path/to/video.mp4")
.with_blocksize(8192)
.with_timestamp(true)
.with_num_buffers(100)
.build()
.unwrap();
assert_eq!(
filesrc.property::<String>("location"),
"/path/to/video.mp4"
);
assert_eq!(filesrc.property::<u32>("blocksize"), 8192);
assert_eq!(filesrc.property::<bool>("do-timestamp"), true);
assert_eq!(filesrc.property::<i32>("num-buffers"), 100);
}
#[test]
fn test_builder_default_properties() {
init().unwrap();
let filesrc = FileSrcBuilder::new("/path/to/video.mp4").build().unwrap();
assert_eq!(filesrc.property::<String>("location"), "/path/to/video.mp4");
assert_eq!(filesrc.property::<u32>("blocksize"), 4096); assert_eq!(filesrc.property::<bool>("do-timestamp"), false); assert_eq!(filesrc.property::<i32>("num-buffers"), -1); }
}