From 998bb4ef3a3e014a1596d64cc31cc75dcfc8dd19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Mon, 16 Jul 2018 17:52:48 +0200 Subject: [PATCH 1/3] move dummy audio backend --- audio/Cargo.toml | 2 -- audio/src/lib.rs | 15 --------------- servo-media/src/lib.rs | 22 +++++++++++++++++++--- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/audio/Cargo.toml b/audio/Cargo.toml index bd82c711..f9c7488c 100644 --- a/audio/Cargo.toml +++ b/audio/Cargo.toml @@ -4,7 +4,6 @@ license = "MPL-2.0" name = "servo-media-audio" version = "0.1.0" - [lib] name = "servo_media_audio" @@ -19,6 +18,5 @@ features = ["stable_graph"] [dependencies.byte-slice-cast] version = "0.1" - [dependencies.num-traits] version = "0.1" diff --git a/audio/src/lib.rs b/audio/src/lib.rs index 0d3cfb65..1ab27f08 100644 --- a/audio/src/lib.rs +++ b/audio/src/lib.rs @@ -33,18 +33,3 @@ pub trait AudioBackend { fn make_sink() -> Result; fn init(); } - -pub struct DummyBackend {} - -impl AudioBackend for DummyBackend { - type Decoder = decoder::DummyAudioDecoder; - type Sink = sink::DummyAudioSink; - fn make_decoder() -> Self::Decoder { - decoder::DummyAudioDecoder - } - - fn make_sink() -> Result { - Ok(sink::DummyAudioSink) - } - fn init() {} -} diff --git a/servo-media/src/lib.rs b/servo-media/src/lib.rs index bc682cd0..7737d16d 100644 --- a/servo-media/src/lib.rs +++ b/servo-media/src/lib.rs @@ -1,10 +1,11 @@ pub extern crate servo_media_audio as audio; #[cfg(not(target_os = "android"))] extern crate servo_media_gstreamer; -use std::sync::{self, Once}; -use std::sync::{Arc, Mutex}; +use std::sync::{self, Arc, Mutex, Once}; use audio::context::{AudioContext, AudioContextOptions}; +use audio::decoder::DummyAudioDecoder; +use audio::sink::DummyAudioSink; use audio::AudioBackend; pub struct ServoMedia; @@ -12,10 +13,25 @@ pub struct ServoMedia; static INITIALIZER: Once = sync::ONCE_INIT; static mut INSTANCE: *mut Mutex>> = 0 as *mut _; +pub struct DummyBackend {} + +impl AudioBackend for DummyBackend { + type Decoder = DummyAudioDecoder; + type Sink = DummyAudioSink; + fn make_decoder() -> Self::Decoder { + DummyAudioDecoder + } + + fn make_sink() -> Result { + Ok(DummyAudioSink) + } + fn init() {} +} + #[cfg(not(target_os = "android"))] pub type Backend = servo_media_gstreamer::GStreamerBackend; #[cfg(target_os = "android")] -pub type Backend = audio::DummyBackend; +pub type Backend = DummyBackend; impl ServoMedia { pub fn new() -> Self { From 84a4fe957b20fd6a97c23e4f7fc56762a407dce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Mon, 9 Jul 2018 16:54:55 +0200 Subject: [PATCH 2/3] Add video player crate with an example. Orignal-code-by: Philippe Normand Fixes #73 --- Cargo.toml | 9 +- backends/gstreamer/Cargo.toml | 12 + backends/gstreamer/src/lib.rs | 19 +- backends/gstreamer/src/player.rs | 384 +++++++++++++++++++++++++++++++ examples/Cargo.toml | 4 + examples/player.rs | 108 +++++++++ player/Cargo.toml | 9 + player/src/frame.rs | 34 +++ player/src/lib.rs | 60 +++++ player/src/metadata.rs | 12 + servo-media/Cargo.toml | 2 + servo-media/src/lib.rs | 16 ++ 12 files changed, 666 insertions(+), 3 deletions(-) create mode 100644 backends/gstreamer/src/player.rs create mode 100644 examples/player.rs create mode 100644 player/Cargo.toml create mode 100644 player/src/frame.rs create mode 100644 player/src/lib.rs create mode 100644 player/src/metadata.rs diff --git a/Cargo.toml b/Cargo.toml index c267ce76..7069f21d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,10 @@ [workspace] -members = ["servo-media", "servo-media-derive", "audio", "backends/gstreamer", "examples"] +members = [ + "audio", + "backends/gstreamer", + "examples", + "player", + "servo-media", + "servo-media-derive" +] license = "MPL-2.0" diff --git a/backends/gstreamer/Cargo.toml b/backends/gstreamer/Cargo.toml index 3c3914ca..641f3775 100644 --- a/backends/gstreamer/Cargo.toml +++ b/backends/gstreamer/Cargo.toml @@ -10,6 +10,12 @@ zip = "0.3.1" [dependencies.byte-slice-cast] version = "0.1" +[dependencies.num-traits] +version = "0.1" + +[dependencies.glib] +version = "0.5" + [dependencies.gstreamer] version = "0.11" @@ -19,5 +25,11 @@ version = "0.11.2" [dependencies.gstreamer-audio] version = "0.11" +[dependencies.gstreamer-player] +version = "0.11" + [dependencies.servo-media-audio] path = "../../audio" + +[dependencies.servo-media-player] +path = "../../player" diff --git a/backends/gstreamer/src/lib.rs b/backends/gstreamer/src/lib.rs index f2e7d947..ad662741 100644 --- a/backends/gstreamer/src/lib.rs +++ b/backends/gstreamer/src/lib.rs @@ -1,15 +1,23 @@ +#![feature(extern_prelude)] + +extern crate byte_slice_cast; +extern crate num_traits; + +extern crate glib; extern crate gstreamer as gst; extern crate gstreamer_app as gst_app; extern crate gstreamer_audio as gst_audio; +extern crate gstreamer_player as gst_player; extern crate servo_media_audio; - -extern crate byte_slice_cast; +extern crate servo_media_player; use servo_media_audio::AudioBackend; +use servo_media_player::PlayerBackend; pub mod audio_decoder; pub mod audio_sink; +pub mod player; pub struct GStreamerBackend; @@ -26,3 +34,10 @@ impl AudioBackend for GStreamerBackend { gst::init().unwrap(); } } + +impl PlayerBackend for GStreamerBackend { + type Player = player::GStreamerPlayer; + fn make_player() -> Result { + player::GStreamerPlayer::new() + } +} diff --git a/backends/gstreamer/src/player.rs b/backends/gstreamer/src/player.rs new file mode 100644 index 00000000..4557ea59 --- /dev/null +++ b/backends/gstreamer/src/player.rs @@ -0,0 +1,384 @@ +use glib::*; +use gst; +use gst_app; +use gst_player; +use gst_player::{PlayerMediaInfo, PlayerStreamInfoExt}; +use servo_media_player::frame::{Frame, FrameRenderer}; +use servo_media_player::metadata::Metadata; +use servo_media_player::{PlaybackState, Player, PlayerEvent}; +use std::sync::mpsc::{self, Sender}; +use std::sync::{Arc, Mutex}; +use std::time; +use std::u64; + +fn frame_from_sample(sample: &gst::Sample) -> Result { + let caps = sample.get_caps().ok_or_else(|| ())?; + let s = caps.get_structure(0).ok_or_else(|| ())?; + let width = s.get("width").ok_or_else(|| ())?; + let height = s.get("height").ok_or_else(|| ())?; + + let buffer = sample.get_buffer().ok_or_else(|| ())?; + let map = buffer.map_readable().ok_or_else(|| ())?; + let data = Vec::from(map.as_slice()); + + Ok(Frame::new(width, height, Arc::new(data))) +} + +fn metadata_from_media_info(media_info: &PlayerMediaInfo) -> Result { + let dur = media_info.get_duration(); + let duration = if dur != gst::ClockTime::none() { + let mut nanos = dur.nanoseconds().ok_or_else(|| ())?; + nanos = nanos % 1_000_000_000; + let seconds = dur.seconds().ok_or_else(|| ())?; + Some(time::Duration::new(seconds, nanos as u32)) + } else { + None + }; + + let mut audio_tracks = Vec::new(); + let mut video_tracks = Vec::new(); + + let format = media_info + .get_container_format() + .unwrap_or_else(|| "".to_owned()); + + for stream_info in media_info.get_stream_list() { + let stream_type = stream_info.get_stream_type(); + match stream_type.as_str() { + "audio" => { + let codec = stream_info.get_codec().unwrap_or_else(|| "".to_owned()); + audio_tracks.push(codec); + } + "video" => { + let codec = stream_info.get_codec().unwrap_or_else(|| "".to_owned()); + video_tracks.push(codec); + } + _ => {} + } + } + + let mut width: u32 = 0; + let height: u32 = if media_info.get_number_of_video_streams() > 0 { + let first_video_stream = &media_info.get_video_streams()[0]; + width = first_video_stream.get_width() as u32; + first_video_stream.get_height() as u32 + } else { + 0 + }; + + Ok(Metadata { + duration, + width, + height, + format, + audio_tracks, + video_tracks, + }) +} + +struct PlayerInner { + player: gst_player::Player, + appsrc: Option, + appsink: gst_app::AppSink, + input_size: u64, + subscribers: Vec>, + renderers: Vec>, + last_metadata: Option, +} + +impl PlayerInner { + pub fn register_event_handler(&mut self, sender: Sender) { + self.subscribers.push(sender); + } + + pub fn register_frame_renderer(&mut self, renderer: Box) { + self.renderers.push(renderer); + } + + pub fn notify(&self, event: PlayerEvent) { + for sender in &self.subscribers { + sender.send(event.clone()).unwrap(); + } + } + + pub fn render(&self, sample: &gst::Sample) -> Result<(), ()> { + let frame = frame_from_sample(&sample)?; + + for renderer in &self.renderers { + renderer.render(frame.clone()); + } + self.notify(PlayerEvent::FrameUpdated); + Ok(()) + } + + pub fn set_input_size(&mut self, size: u64) { + self.input_size = size; + } + + pub fn play(&mut self) { + self.player.play(); + } + + pub fn stop(&mut self) { + self.player.stop(); + self.last_metadata = None; + self.appsrc = None; + } + + pub fn pause(&mut self) { + self.player.pause(); + } + + pub fn set_app_src(&mut self, appsrc: gst_app::AppSrc) { + self.appsrc = Some(appsrc); + } +} + +pub struct GStreamerPlayer { + inner: Arc>, +} + +impl GStreamerPlayer { + pub fn new() -> Result { + let player = gst_player::Player::new( + /* video renderer */ None, /* signal dispatcher */ None, + ); + player + .set_property("uri", &Value::from("appsrc://")) + .or_else(|_| Err(()))?; + + // Disable periodic position updates for now. + let mut config = player.get_config(); + config.set_position_update_interval(0u32); + player.set_config(config).or_else(|_| Err(()))?; + + let video_sink = gst::ElementFactory::make("appsink", None).ok_or_else(|| ())?; + let pipeline = player.get_pipeline(); + pipeline + .set_property("video-sink", &video_sink.to_value()) + .or_else(|_| Err(()))?; + let video_sink = video_sink + .dynamic_cast::() + .or_else(|_| Err(()))?; + video_sink.set_caps(&gst::Caps::new_simple( + "video/x-raw", + &[ + ("format", &"BGRA"), + ("pixel-aspect-ratio", &gst::Fraction::from((1, 1))), + ], + )); + + Ok(GStreamerPlayer { + inner: Arc::new(Mutex::new(PlayerInner { + player: player, + appsrc: None, + appsink: video_sink, + input_size: 0, + subscribers: Vec::new(), + renderers: Vec::new(), + last_metadata: None, + })), + }) + } +} + +impl Player for GStreamerPlayer { + fn register_event_handler(&self, sender: Sender) { + self.inner.lock().unwrap().register_event_handler(sender); + } + + fn register_frame_renderer(&self, renderer: Box) { + self.inner.lock().unwrap().register_frame_renderer(renderer); + } + + fn set_input_size(&self, size: u64) { + self.inner.lock().unwrap().set_input_size(size); + } + + fn setup(&self) -> Result<(), ()> { + let inner_clone = self.inner.clone(); + self.inner + .lock() + .unwrap() + .player + .connect_end_of_stream(move |_| { + let inner = &inner_clone; + let guard = inner.lock().unwrap(); + + guard.notify(PlayerEvent::EndOfStream); + }); + + let inner_clone = self.inner.clone(); + self.inner + .lock() + .unwrap() + .player + .connect_error(move |_, _| { + let inner = &inner_clone; + let guard = inner.lock().unwrap(); + + guard.notify(PlayerEvent::Error); + }); + + let inner_clone = self.inner.clone(); + self.inner + .lock() + .unwrap() + .player + .connect_state_changed(move |_, player_state| { + let state = match player_state { + gst_player::PlayerState::Stopped => Some(PlaybackState::Stopped), + gst_player::PlayerState::Paused => Some(PlaybackState::Paused), + gst_player::PlayerState::Playing => Some(PlaybackState::Playing), + _ => None, + }; + if let Some(v) = state { + let inner = &inner_clone; + let guard = inner.lock().unwrap(); + + guard.notify(PlayerEvent::StateChanged(v)); + } + }); + + let inner_clone = self.inner.clone(); + self.inner + .lock() + .unwrap() + .player + .connect_media_info_updated(move |_, info| { + let inner = &inner_clone; + let mut guard = inner.lock().unwrap(); + + if let Ok(metadata) = metadata_from_media_info(info) { + if guard.last_metadata.as_ref() != Some(&metadata) { + guard.last_metadata = Some(metadata.clone()); + guard.notify(PlayerEvent::MetadataUpdated(metadata)); + } + } + }); + + self.inner + .lock() + .unwrap() + .player + .connect_duration_changed(move |_, duration| { + let mut seconds = duration / 1_000_000_000; + let mut minutes = seconds / 60; + seconds %= 60; + minutes %= 60; + }); + + let inner_clone = self.inner.clone(); + self.inner.lock().unwrap().appsink.set_callbacks( + gst_app::AppSinkCallbacks::new() + .new_preroll(|_| gst::FlowReturn::Ok) + .new_sample(move |appsink| { + let sample = match appsink.pull_sample() { + None => return gst::FlowReturn::Eos, + Some(sample) => sample, + }; + + match inner_clone.lock().unwrap().render(&sample) { + Ok(_) => return gst::FlowReturn::Ok, + Err(_) => return gst::FlowReturn::Error, + }; + }) + .build(), + ); + + let inner_clone = self.inner.clone(); + let (receiver, error_id) = { + let mut inner = self.inner.lock().unwrap(); + let pipeline = inner.player.get_pipeline(); + + let (sender, receiver) = mpsc::channel(); + + let sender = Arc::new(Mutex::new(sender)); + let sender_clone = sender.clone(); + pipeline + .connect("source-setup", false, move |args| { + let mut inner = inner_clone.lock().unwrap(); + + if let Some(source) = args[1].get::() { + let appsrc = source + .clone() + .dynamic_cast::() + .expect("Source element is expected to be an appsrc!"); + + appsrc.set_property_format(gst::Format::Bytes); + if inner.input_size > 0 { + appsrc.set_size(inner.input_size as i64); + } + + let sender_clone = sender.clone(); + + let need_data_id = Arc::new(Mutex::new(None)); + let need_data_id_clone = need_data_id.clone(); + *need_data_id.lock().unwrap() = Some( + appsrc + .connect("need-data", false, move |args| { + let _ = sender_clone.lock().unwrap().send(Ok(())); + if let Some(id) = need_data_id_clone.lock().unwrap().take() { + glib::signal::signal_handler_disconnect( + &args[0].get::().unwrap(), + id, + ); + } + None + }) + .unwrap(), + ); + + inner.set_app_src(appsrc); + } else { + let _ = sender.lock().unwrap().send(Err(())); + } + + None + }) + .unwrap(); + + let error_id = inner.player.connect_error(move |_, _| { + let _ = sender_clone.lock().unwrap().send(Err(())); + }); + + inner.pause(); + + (receiver, error_id) + }; + + glib::signal::signal_handler_disconnect(&self.inner.lock().unwrap().player, error_id); + + match receiver.recv().unwrap() { + Ok(_) => return Ok(()), + Err(_) => return Err(()), + }; + } + + fn play(&self) { + self.inner.lock().unwrap().play(); + } + + fn stop(&self) { + self.inner.lock().unwrap().stop(); + } + + fn push_data(&self, data: Vec) -> Result<(), ()> { + if let Some(ref mut appsrc) = self.inner.lock().unwrap().appsrc { + let buffer = gst::Buffer::from_slice(data).expect("Unable to create a buffer"); + if appsrc.push_buffer(buffer) == gst::FlowReturn::Ok { + return Ok(()); + } + } + Err(()) + } + + fn end_of_stream(&self) -> Result<(), ()> { + if let Some(ref mut appsrc) = self.inner.lock().unwrap().appsrc { + if appsrc.end_of_stream() == gst::FlowReturn::Ok { + return Ok(()); + } + } + Err(()) + } +} diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 16fd6556..41da6bda 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -42,3 +42,7 @@ path = "play.rs" [[bin]] name = "play_noise" path = "play_noise.rs" + +[[bin]] +name = "player" +path = "player.rs" diff --git a/examples/player.rs b/examples/player.rs new file mode 100644 index 00000000..f0b2bfdd --- /dev/null +++ b/examples/player.rs @@ -0,0 +1,108 @@ +extern crate servo_media; + +use servo_media::player::PlayerEvent; +use servo_media::ServoMedia; +use std::env; +use std::error::Error; +use std::fs::File; +use std::io::BufReader; +use std::io::Read; +use std::path::Path; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc; +use std::sync::{Arc, Mutex}; +use std::thread; + +fn run_example(servo_media: Arc) { + let player = Arc::new(Mutex::new(servo_media.create_player().unwrap())); + let args: Vec<_> = env::args().collect(); + let filename: &str = if args.len() == 2 { + args[1].as_ref() + } else { + panic!("Usage: cargo run --bin player ") + }; + + let (sender, receiver) = mpsc::channel(); + player.lock().unwrap().register_event_handler(sender); + + let path = Path::new(filename); + let display = path.display(); + + let file = match File::open(&path) { + Err(why) => panic!("couldn't open {}: {}", display, why.description()), + Ok(file) => file, + }; + + if let Ok(metadata) = file.metadata() { + player.lock().unwrap().set_input_size(metadata.len()); + } + + player + .lock() + .unwrap() + .setup() + .expect("couldn't setup player"); + + let player_clone = Arc::clone(&player); + let shutdown = Arc::new(AtomicBool::new(false)); + let shutdown_clone = shutdown.clone(); + let t = thread::spawn(move || { + let player = &player_clone; + let mut buf_reader = BufReader::new(file); + let mut buffer = [0; 8192]; + while !shutdown_clone.load(Ordering::Relaxed) { + match buf_reader.read(&mut buffer[..]) { + Ok(0) => { + println!("finished pushing data"); + break; + } + Ok(size) => { + if let Err(_) = player + .lock() + .unwrap() + .push_data(Vec::from(&buffer[0..size])) + { + break; + } + } + Err(e) => { + eprintln!("Error: {}", e); + break; + } + } + } + }); + + player.lock().unwrap().play(); + + while let Ok(event) = receiver.recv() { + match event { + PlayerEvent::EndOfStream => { + println!("EOF"); + break; + } + PlayerEvent::Error => { + println!("Error"); + break; + } + PlayerEvent::MetadataUpdated(ref m) => { + println!("Metadata updated! {:?}", m); + } + PlayerEvent::StateChanged(ref s) => { + println!("Player state changed to {:?}", s); + } + PlayerEvent::FrameUpdated => eprint!("."), + } + } + + shutdown.store(true, Ordering::Relaxed); + let _ = t.join(); + + player.lock().unwrap().stop(); +} + +fn main() { + if let Ok(servo_media) = ServoMedia::get() { + run_example(servo_media); + } +} diff --git a/player/Cargo.toml b/player/Cargo.toml new file mode 100644 index 00000000..346c9ace --- /dev/null +++ b/player/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "servo-media-player" +version = "0.1.0" +authors = ["Fernando Jiménez Moreno ", + "Víctor Manuel Jáquez Leal "] +license = "MPL-2.0" + +[lib] +name = "servo_media_player" diff --git a/player/src/frame.rs b/player/src/frame.rs new file mode 100644 index 00000000..72a2cbdc --- /dev/null +++ b/player/src/frame.rs @@ -0,0 +1,34 @@ +use std::sync::Arc; + +#[derive(Clone)] +pub struct Frame { + width: i32, + height: i32, + data: Arc>, +} + +impl Frame { + pub fn new(width: i32, height: i32, data: Arc>) -> Frame { + Frame { + width, + height, + data, + } + } + + pub fn get_width(&self) -> i32 { + self.width + } + + pub fn get_height(&self) -> i32 { + self.height + } + + pub fn get_data(&self) -> &Arc> { + &self.data + } +} + +pub trait FrameRenderer: Send + Sync + 'static { + fn render(&self, frame: Frame); +} diff --git a/player/src/lib.rs b/player/src/lib.rs new file mode 100644 index 00000000..cef15b70 --- /dev/null +++ b/player/src/lib.rs @@ -0,0 +1,60 @@ +pub mod frame; +pub mod metadata; + +use std::sync::mpsc::Sender; + +#[derive(Clone, Debug)] +pub enum PlaybackState { + Stopped, + // Buffering, + Paused, + Playing, +} + +#[derive(Clone, Debug)] +pub enum PlayerEvent { + EndOfStream, + MetadataUpdated(metadata::Metadata), + StateChanged(PlaybackState), + FrameUpdated, + Error, +} + +pub trait Player: Send { + fn register_event_handler(&self, sender: Sender); + fn register_frame_renderer(&self, renderer: Box); + + fn setup(&self) -> Result<(), ()>; + fn play(&self); + fn stop(&self); + + fn set_input_size(&self, size: u64); + fn push_data(&self, data: Vec) -> Result<(), ()>; + fn end_of_stream(&self) -> Result<(), ()>; +} + +pub struct DummyPlayer {} + +impl Player for DummyPlayer { + fn register_event_handler(&self, _: Sender) {} + fn register_frame_renderer(&self, _: Box) {} + + fn setup(&self) -> Result<(), ()> { + Err(()) + } + fn play(&self) {} + fn stop(&self) {} + + fn set_input_size(&self, _: u64) {} + fn push_data(&self, _: Vec) -> Result<(), ()> { + Err(()) + } + fn end_of_stream(&self) -> Result<(), ()> { + Err(()) + } +} + +pub trait PlayerBackend { + type Player: Player; + fn make_player() -> Result; +} diff --git a/player/src/metadata.rs b/player/src/metadata.rs new file mode 100644 index 00000000..9a0ce527 --- /dev/null +++ b/player/src/metadata.rs @@ -0,0 +1,12 @@ +use std::{string, time}; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Metadata { + pub duration: Option, + pub width: u32, + pub height: u32, + pub format: string::String, + // TODO: Might be nice to move width and height along with each video track. + pub video_tracks: Vec, + pub audio_tracks: Vec, +} diff --git a/servo-media/Cargo.toml b/servo-media/Cargo.toml index 7b916c92..b5547806 100644 --- a/servo-media/Cargo.toml +++ b/servo-media/Cargo.toml @@ -9,6 +9,8 @@ name = "servo_media" [dependencies.servo-media-audio] path = "../audio" +[dependencies.servo-media-player] +path = "../player" [target.'cfg(not(target_os = "android"))'.dependencies.servo-media-gstreamer] path = "../backends/gstreamer" diff --git a/servo-media/src/lib.rs b/servo-media/src/lib.rs index 7737d16d..756f3808 100644 --- a/servo-media/src/lib.rs +++ b/servo-media/src/lib.rs @@ -1,12 +1,14 @@ pub extern crate servo_media_audio as audio; #[cfg(not(target_os = "android"))] extern crate servo_media_gstreamer; +pub extern crate servo_media_player as player; use std::sync::{self, Arc, Mutex, Once}; use audio::context::{AudioContext, AudioContextOptions}; use audio::decoder::DummyAudioDecoder; use audio::sink::DummyAudioSink; use audio::AudioBackend; +use player::{DummyPlayer, Player, PlayerBackend}; pub struct ServoMedia; @@ -28,6 +30,13 @@ impl AudioBackend for DummyBackend { fn init() {} } +impl PlayerBackend for DummyBackend { + type Player = DummyPlayer; + fn make_player() -> Result { + Ok(DummyPlayer {}) + } +} + #[cfg(not(target_os = "android"))] pub type Backend = servo_media_gstreamer::GStreamerBackend; #[cfg(target_os = "android")] @@ -54,4 +63,11 @@ impl ServoMedia { pub fn create_audio_context(&self, options: AudioContextOptions) -> AudioContext { AudioContext::new(options) } + + pub fn create_player(&self) -> Result, ()> { + match Backend::make_player() { + Ok(player) => return Ok(Box::new(player)), + Err(_) => return Err(()), + } + } } From fbf6111ab3ffa7512714f4dcf3865d65bf3c1413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Mon, 16 Jul 2018 18:42:23 +0200 Subject: [PATCH 3/3] Update Cargo.lock --- Cargo.lock | 204 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 140 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 239e2b81..b05d1012 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,11 +1,11 @@ [[package]] name = "adler32" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -48,18 +48,18 @@ name = "bzip2-sys" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -82,7 +82,7 @@ dependencies = [ name = "examples" version = "0.1.0" dependencies = [ - "rand 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "servo-media 0.1.0", ] @@ -97,7 +97,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide_c_api 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -122,7 +122,7 @@ dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -133,7 +133,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -144,21 +144,21 @@ dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "gstreamer" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "muldiv 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -173,7 +173,7 @@ dependencies = [ "glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-app-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-base 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-base-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -190,12 +190,12 @@ dependencies = [ "gstreamer-base-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "gstreamer-audio" -version = "0.11.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "array-init 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -203,7 +203,7 @@ dependencies = [ "glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-audio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -219,7 +219,7 @@ dependencies = [ "gstreamer-base-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -231,7 +231,7 @@ dependencies = [ "glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-base-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -246,7 +246,36 @@ dependencies = [ "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gstreamer-player" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-player-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-video 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gstreamer-player-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-video-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -258,12 +287,43 @@ dependencies = [ "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gstreamer-video" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-base 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-base-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-video-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gstreamer-video-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-base-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "lazy_static" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -281,22 +341,22 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "miniz_oxide_c_api" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -320,10 +380,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num-integer" -version = "0.1.38" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -331,8 +391,8 @@ name = "num-rational" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -340,12 +400,12 @@ name = "num-traits" version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -364,7 +424,7 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -390,19 +450,19 @@ dependencies = [ [[package]] name = "rand" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_core" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -412,19 +472,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -436,6 +496,7 @@ version = "0.1.0" dependencies = [ "servo-media-audio 0.1.0", "servo-media-gstreamer 0.1.0", + "servo-media-player 0.1.0", ] [[package]] @@ -446,7 +507,7 @@ dependencies = [ "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", "petgraph 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "servo_media_derive 0.1.0", - "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -454,14 +515,22 @@ name = "servo-media-gstreamer" version = "0.1.0" dependencies = [ "byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", "gstreamer-app 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", - "gstreamer-audio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-audio 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "gstreamer-player 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "servo-media-audio 0.1.0", + "servo-media-player 0.1.0", "zip 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "servo-media-player" +version = "0.1.0" + [[package]] name = "servo_media_derive" version = "0.1.0" @@ -472,8 +541,11 @@ dependencies = [ [[package]] name = "smallvec" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "syn" @@ -490,7 +562,7 @@ name = "thread_local" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -564,16 +636,16 @@ dependencies = [ ] [metadata] -"checksum adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6cbd0b9af8587c72beadc9f72d35b9fbb070982c9e6203e46e93f10df25f8f45" -"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" +"checksum aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c6d463cbe7ed28720b5b489e7c083eeb8f90d08be2a0d6bb9e1ffea9ce1afa" "checksum array-init 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c3cc8456d0ae81a8c76f59e384683a601548c38949a4bfcb65dd31ded5c75ff3" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum byte-slice-cast 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a865e7bfa6c3b79216ccba767d4dc66e4f9f65f1ed4639e73faff3c4a2485d7" "checksum bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42b7c3cbf0fa9c1b82308d57191728ca0256cb821220f4e2fd410a72ade26e3b" "checksum bzip2-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2c5162604199bbb17690ede847eaa6120a3f33d5ab4dcc8e7c25b16d849ae79b" -"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" -"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" +"checksum cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "2119ea4867bd2b8ed3aecab467709720b2d55b1bcfe09f772fd68066eaf15275" +"checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" "checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" @@ -583,38 +655,42 @@ dependencies = [ "checksum glib 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e0be1b1432e227bcd1a9b28db9dc1474a7e7fd4227e08e16f35304f32d09b61" "checksum glib-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "615bef979b5838526aee99241afc80cfb2e34a8735d4bcb8ec6072598c18a408" "checksum gobject-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70409d6405db8b1591602fcd0cbe8af52cd9976dd39194442b4c149ba343f86d" -"checksum gstreamer 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "90d7cde9eae8f6bf4d41c254915976b236143935ec2c0b027636274e998e54b4" +"checksum gstreamer 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)" = "da8f1ba2cc0370cbb8cf2e9ff38989f54560f312347657859117e4480c777c48" "checksum gstreamer-app 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4e68d96a6a86fe4e4796d7ecb5a3cacd6b4680277da6daea7934612fa8c5c2bf" "checksum gstreamer-app-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a224d33c7780957c30f9280b1256b3882792dda6916f75b54bb30b5b71ed505a" -"checksum gstreamer-audio 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "625797fade206bda7dcc0049e2a36564477239e7b858c645c09e28bd26a8ad48" +"checksum gstreamer-audio 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "73a7b9c097e8d6fc1967137b574e2d4c646220bcfdd00ba681822e297cb06cb8" "checksum gstreamer-audio-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd60631f2dd055f0aae2831e86bd6c1d45e24528d4c478002cc07490dd84b56e" "checksum gstreamer-base 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05ec7a84b4160b61c72ea27ccf3f46eb9c8f996c5991746623e69e3e532e3cb5" "checksum gstreamer-base-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "501a7add44f256aab6cb5b65ef121c449197cf55087d6a7586846c8d1e42e88b" +"checksum gstreamer-player 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "63e81d78e9e7ee5d448ba50c52722005bbbf1bfe606767c4c407f45e8996f050" +"checksum gstreamer-player-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3b9476078cc76164446e88b2c4331e81e24a07f7b7c3a8b4bf8975a47998ebd4" "checksum gstreamer-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b2f51e25a6f97dd4bfd640cba96f192f8759b8766afd66d6d9ea0f82ca14a37" -"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum gstreamer-video 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75300cf1ed8d8d65811349fc755fac22be05ea55df551ab29e43664d4a575c92" +"checksum gstreamer-video-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ed798787e78a0f1c8be06bd3adcab03f962f049a820743aae9f690f56a0d538" +"checksum lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fb497c35d362b6a331cfd94956a07fc2c78a4604cdbee844a81170386b996dd3" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" -"checksum miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aaa2d3ad070f428fffbd7d3ca2ea20bb0d8cffe9024405c44e1840bc1418b398" -"checksum miniz_oxide_c_api 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "92d98fdbd6145645828069b37ea92ca3de225e000d80702da25c20d3584b38a5" +"checksum miniz_oxide 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9ba430291c9d6cedae28bcd2d49d1c32fc57d60cd49086646c5dd5673a870eb5" +"checksum miniz_oxide_c_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5a5b8234d6103ebfba71e29786da4608540f862de5ce980a1c94f86a40ca0d51" "checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729" "checksum muldiv 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1cbef5aa2e8cd82a18cc20e26434cc9843e1ef46e55bfabe5bddb022236c5b3e" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" -"checksum num-integer 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "6ac0ea58d64a89d9d6b7688031b3be9358d6c919badcf7fbb0527ccfd891ee45" +"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e" "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" -"checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" +"checksum num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe" "checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" "checksum petgraph 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "8b30dc85588cd02b9b76f5e386535db546d21dc68506cff2abebee0b6445e8e4" -"checksum pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "110d5ee3593dbb73f56294327fe5668bcc997897097cbc76b51e7aed3f52452f" +"checksum pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "6a52e4dbc8354505ee07e484ab07127e06d87ca6fa7f0a516a2b294e5ad5ad16" "checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" -"checksum rand 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a89abf8d34faf9783692392dca7bcdc6e82fa84eca86ccb6301ec87f3497185" -"checksum rand_core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7a5f27547c49e5ccf8a586db3f3782fd93cf849780b21853b9d981db203302" +"checksum rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "12397506224b2f93e6664ffc4f664b29be8208e5157d3d90b44f09b5fae470ea" +"checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" -"checksum regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13c93d55961981ba9226a213b385216f83ab43bd6ac53ab16b2eeb47e337cf4e" -"checksum regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05b06a75f5217880fc5e905952a42750bf44787e56a6c6d6852ed0992f5e1d54" -"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" +"checksum regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5bbbea44c5490a1e84357ff28b7d518b4619a159fed5d25f6c1de2d19cc42814" +"checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" +"checksum smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "26df3bb03ca5eac2e64192b723d51f56c1b1e0860e7c766281f4598f181acdc8" "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" "checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b"