diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 4ac6f59cb..fd9da7fc5 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -30,6 +30,7 @@ gtkvideooverlay = ["gtk", "gdk", "gio"] gtkvideooverlay-x11 = ["gtkvideooverlay"] gtkvideooverlay-quartz = ["gtkvideooverlay"] generic-futures = ["gstreamer/futures", "futures"] +glib-futures = ["generic-futures", "glib/futures"] gst-rtsp-server = ["gstreamer-rtsp-server"] gst-rtsp-server-record = ["gstreamer-rtsp-server", "gstreamer-rtsp", "gio"] default-features = [] @@ -100,6 +101,11 @@ name = "toc" name = "futures" required-features = ["generic-futures"] +[[bin]] +name = "glib-futures" +required-features = ["glib-futures"] + + [[bin]] name = "rtsp-server-record" required-features = ["gst-rtsp-server-record"] diff --git a/examples/src/bin/glib-futures.rs b/examples/src/bin/glib-futures.rs new file mode 100644 index 000000000..94ebef574 --- /dev/null +++ b/examples/src/bin/glib-futures.rs @@ -0,0 +1,63 @@ +extern crate gstreamer as gst; +use gst::prelude::*; + +extern crate glib; + +extern crate futures; +use futures::prelude::*; + +use std::env; + +#[path = "../examples-common.rs"] +mod examples_common; + +fn example_main() { + let ctx = glib::MainContext::default(); + + let pipeline_str = env::args().collect::>()[1..].join(" "); + + gst::init().unwrap(); + + let pipeline = gst::parse_launch(&pipeline_str).unwrap(); + let bus = pipeline.get_bus().unwrap(); + + let ret = pipeline.set_state(gst::State::Playing); + assert_ne!(ret, gst::StateChangeReturn::Failure); + + let messages = gst::BusStream::new(&bus) + .for_each(|msg| { + use gst::MessageView; + + let quit = match msg.view() { + MessageView::Eos(..) => true, + MessageView::Error(err) => { + println!( + "Error from {:?}: {} ({:?})", + err.get_src().map(|s| s.get_path_string()), + err.get_error(), + err.get_debug() + ); + true + } + _ => false, + }; + + if quit { + Err(()) + } else { + Ok(()) + } + }) + .and_then(|_| Ok(())); + + let _ = ctx.block_on(messages); + + let ret = pipeline.set_state(gst::State::Null); + assert_ne!(ret, gst::StateChangeReturn::Failure); +} + +fn main() { + // tutorials_common::run is only required to set up the application environent on macOS + // (but not necessary in normal Cocoa applications where this is set up autmatically) + examples_common::run(example_main); +}