gstreamer 0.7.1

Idiomatic bindings for GStreamer
Documentation
extern crate gst;

use std::env;

fn main(){
    gst::init();
    let args: Vec<String> = env::args().collect();
    let uri = if args.len() == 2 {
        gst::filename_to_uri(args[1].as_ref()).unwrap()
    }else{
        panic!("Usage: playbin file_path");
    };
    let mut playbin = gst::PlayBin::new("video_player").expect("Couldn't create playbin");
    let mut appsink = gst::AppSink::new("video_sink").expect("Couldn't create appsink");
    playbin.set_uri(uri.as_ref());
    playbin.set_video_sink(&appsink);
    appsink.set("sync", false);
	let mut bus = playbin.bus().expect("Couldn't get bus from pipeline");
	let bus_receiver = bus.receiver();
    let mut mainloop = gst::MainLoop::new();
    mainloop.spawn();
    playbin.play();
	loop {
        let mut exit = false;
        while let Ok(msg) = bus_receiver.try_recv(){
            match msg.parse(){
                gst::Message::StateChangedParsed{ref old, ref new, ..} => {
                    println!("element `{}` changed from {:?} to {:?}", msg.src_name(), old, new);
                }
                gst::Message::ErrorParsed{ref error, ref debug, ..} => {
                    println!("error msg from element `{}`: {}, {}. Quitting", msg.src_name(), error.message(), debug);
                    exit = true;
                    break;
                }
                _ => {
                    println!("msg of type `{}` from element `{}`", msg.type_name(), msg.src_name());
                }
            }
        }
        if exit { break; }

		match appsink.recv(){
            Ok(gst::appsink::Message::NewSample(sample)) | Ok(gst::appsink::Message::NewPreroll(sample)) => {
                let videoframe = sample.video_frame().unwrap();
                println!("Received sample with w: {}, h: {}", videoframe.width(), videoframe.height());
            }
            Ok(gst::appsink::Message::Eos) => {
                println!("Got no sample when polling. EOS");
                break;
            }
            Err(_) => {
                println!("Error, exiting");
                break;
            }
        }
    }

    playbin.set_null_state();
    playbin.get_state(gst::ffi::GST_CLOCK_TIME_NONE);
	mainloop.quit();
}