gstreamer-rs/examples/src/bin/iterator.rs

52 lines
2 KiB
Rust

// This example demonstrates how to use GStreamer's iteration APIs.
// This is used at multiple occasions - for example to iterate an
// element's pads.
use gst::prelude::*;
#[path = "../examples-common.rs"]
mod examples_common;
fn example_main() {
gst::init().unwrap();
// Create and use an identity element here.
// This element does nothing, really. We also never add it to a pipeline.
// We just want to iterate the identity element's pads.
let identity = gst::ElementFactory::make("identity").build().unwrap();
// Get an iterator over all pads of the identity-element.
let mut iter = identity.iterate_pads();
loop {
// In an endless-loop, we use the iterator until we either reach the end
// or we hit an error.
match iter.next() {
Ok(Some(pad)) => println!("Pad: {}", pad.name()),
Ok(None) => {
// We reached the end of the iterator, there are no more pads
println!("Done");
break;
}
// It is very important to handle this resync error by calling resync
// on the iterator. This error happens, when the container that is iterated
// changed during iteration. (e.g. a pad was added while we used the
// iterator to iterate over all of an element's pads).
// After calling resync on the iterator, iteration will start from the beginning
// again. So the application should be able to handle that.
Err(gst::IteratorError::Resync) => {
println!("Iterator resync");
iter.resync();
}
Err(gst::IteratorError::Error) => {
println!("Error");
break;
}
}
}
}
fn main() {
// tutorials_common::run is only required to set up the application environment on macOS
// (but not necessary in normal Cocoa applications where this is set up automatically)
examples_common::run(example_main);
}