gstreamer 0.5.0

Idiomatic bindings for GStreamer
Documentation
extern crate gst;

use std::thread;
use std::sync::{Condvar,Mutex};
use std::time::Duration;

fn main(){
    gst::init();
    let pipeline_str = "appsrc caps=\"video/x-raw,format=RGB,width=640,height=480,framerate=1/60\" name=appsrc0 ! videoconvert ! autovideosink";
    let mut pipeline = gst::Pipeline::new_from_str(pipeline_str).unwrap();
	let mut mainloop = gst::MainLoop::new();
	let mut bus = pipeline.bus().expect("Couldn't get bus from pipeline");
	let bus_receiver = bus.receiver();
	let appsrc = pipeline.get_by_name("appsrc0").expect("Couldn't get appsrc from pipeline");
	let mut appsrc = gst::AppSrc::new_from_element(appsrc);
	let bufferpool = gst::BufferPool::new().unwrap();
	let appsrc_caps = appsrc.caps().unwrap();
	bufferpool.set_params(&appsrc_caps,640*480*3,0,0);
	if bufferpool.set_active(true).is_err(){
	    panic!("Couldn't activate buffer pool");
	}
	mainloop.spawn();
	pipeline.play();

	thread::spawn(move||{
	    let condvar = Condvar::new();
	    let mutex = Mutex::new(());
	    let mut gray = 0;
		loop {
		    if let Some(mut buffer) = bufferpool.acquire_buffer(){
			    buffer.map_write(|mut mapping|{
			        for c in mapping.iter_mut::<u8>(){
			            *c = gray;
			        }
			    }).ok();
			    gray += 1;
			    gray %= 255;
				appsrc.push_buffer(buffer);
				let guard = mutex.lock().unwrap();
				condvar.wait_timeout(guard, Duration::from_millis((1000./60.) as u64)).ok();
			}else{
			    println!("Couldn't get buffer, sending EOS and finishing thread");
			    appsrc.end_of_stream();
			    break;
			}
		}
	});

	for message in bus_receiver.iter(){
		match message.parse(){
			gst::Message::StateChangedParsed{ref old, ref new, ..} => {
				println!("element `{}` changed from {:?} to {:?}", message.src_name(), old, new);
			}
            gst::Message::ErrorParsed{ref error, ref debug, ..} => {
				println!("error msg from element `{}`: {}, {}. Quitting", message.src_name(), error.message(), debug);
                break;
            }
			gst::Message::Eos(_) => {
				println!("eos received quiting");
				break;
			}
			_ => {
				println!("msg of type `{}` from element `{}`", message.type_name(), message.src_name());
			}
		}
	}

	mainloop.quit();
}