From e3041d959c2f24aed3a48b5088eea29aa34ca44d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Thu, 10 Jan 2019 13:57:13 +0100 Subject: [PATCH 1/3] Don't assign unused resource path --- examples/player/ui.rs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/examples/player/ui.rs b/examples/player/ui.rs index 20b241e8..7cab608f 100644 --- a/examples/player/ui.rs +++ b/examples/player/ui.rs @@ -10,7 +10,6 @@ extern crate euclid; use gleam::gl; use glutin::{self, GlContext}; use std::env; -use std::path::PathBuf; use std::sync::{Arc, Mutex}; use webrender; use webrender::api::*; @@ -110,13 +109,6 @@ pub fn main_wrapper( ) { env_logger::init(); - let args: Vec = env::args().collect(); - let res_path = if args.len() > 1 { - Some(PathBuf::from(&args[1])) - } else { - None - }; - let mut events_loop = winit::EventsLoop::new(); let context_builder = glutin::ContextBuilder::new().with_gl(glutin::GlRequest::GlThenGles { opengl_version: (3, 2), @@ -146,13 +138,12 @@ pub fn main_wrapper( }; println!("OpenGL version {}", gl.get_string(gl::VERSION)); - println!("Shader resource path: {:?}", res_path); let device_pixel_ratio = window.get_hidpi_factor() as f32; println!("Device pixel ratio: {}", device_pixel_ratio); println!("Loading shaders..."); let opts = webrender::RendererOptions { - resource_override_path: res_path, + resource_override_path: None, precache_shaders: E::PRECACHE_SHADERS, device_pixel_ratio, clear_color: Some(ColorF::new(0.3, 0.0, 0.0, 1.0)), From abe49e9b8482a1f7613e962384efd86522d7e11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Thu, 10 Jan 2019 14:02:39 +0100 Subject: [PATCH 2/3] Remove unused parameters for ui::Example::render() --- examples/player/main.rs | 10 +--------- examples/player/ui.rs | 28 +++------------------------- 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/examples/player/main.rs b/examples/player/main.rs index ce79f914..943e4ae6 100644 --- a/examples/player/main.rs +++ b/examples/player/main.rs @@ -158,15 +158,7 @@ impl App { #[cfg(not(target_os = "android"))] impl ui::Example for App { - fn render( - &mut self, - api: &RenderApi, - builder: &mut DisplayListBuilder, - txn: &mut Transaction, - _framebuffer_size: DeviceUintSize, - _pipeline_id: PipelineId, - _document_id: DocumentId, - ) { + fn render(&mut self, api: &RenderApi, builder: &mut DisplayListBuilder, txn: &mut Transaction) { let frame = if self.frame_queue.is_empty() { if self.current_frame.is_none() { return; diff --git a/examples/player/ui.rs b/examples/player/ui.rs index 7cab608f..5badeaf2 100644 --- a/examples/player/ui.rs +++ b/examples/player/ui.rs @@ -76,15 +76,7 @@ pub trait Example { const WIDTH: u32 = 1920; const HEIGHT: u32 = 1080; - fn render( - &mut self, - api: &RenderApi, - builder: &mut DisplayListBuilder, - txn: &mut Transaction, - framebuffer_size: DeviceUintSize, - pipeline_id: PipelineId, - document_id: DocumentId, - ); + fn render(&mut self, api: &RenderApi, builder: &mut DisplayListBuilder, txn: &mut Transaction); fn on_event(&self, winit::WindowEvent, &RenderApi, DocumentId) -> bool { false } @@ -180,14 +172,7 @@ pub fn main_wrapper( let mut builder = DisplayListBuilder::new(pipeline_id, layout_size); let mut txn = Transaction::new(); - example.lock().unwrap().render( - &api, - &mut builder, - &mut txn, - framebuffer_size, - pipeline_id, - document_id, - ); + example.lock().unwrap().render(&api, &mut builder, &mut txn); txn.set_display_list(epoch, None, layout_size, builder.finalize(), true); txn.set_root_pipeline(pipeline_id); txn.generate_frame(); @@ -272,14 +257,7 @@ pub fn main_wrapper( if custom_event || example.lock().unwrap().needs_repaint() { let mut builder = DisplayListBuilder::new(pipeline_id, layout_size); - example.lock().unwrap().render( - &api, - &mut builder, - &mut txn, - framebuffer_size, - pipeline_id, - document_id, - ); + example.lock().unwrap().render(&api, &mut builder, &mut txn); txn.set_display_list(epoch, None, layout_size, builder.finalize(), true); txn.generate_frame(); } From 41fd380cad923090aab9789a1e5441a1649fb29f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= Date: Thu, 10 Jan 2019 12:45:52 +0100 Subject: [PATCH 3/3] Decouple PlayerWrapper from main This it can be instantiated in ui --- examples/player/main.rs | 127 +++--------------------------- examples/player/player_wrapper.rs | 120 ++++++++++++++++++++++++++++ examples/player/ui.rs | 28 ++++++- 3 files changed, 153 insertions(+), 122 deletions(-) create mode 100644 examples/player/player_wrapper.rs diff --git a/examples/player/main.rs b/examples/player/main.rs index 943e4ae6..23864e87 100644 --- a/examples/player/main.rs +++ b/examples/player/main.rs @@ -16,18 +16,10 @@ extern crate webrender; extern crate winit; use gleam::gl; -use ipc_channel::ipc; use servo_media::player::frame::{Frame, FrameRenderer}; -use servo_media::player::{Player, PlayerEvent}; -use servo_media::ServoMedia; use std::env; -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::{Arc, Mutex}; -use std::thread::Builder; #[cfg(not(target_os = "android"))] use ui::HandyDandyRectBuilder; use webrender::api::*; @@ -36,111 +28,8 @@ use webrender::api::*; #[path = "ui.rs"] mod ui; -struct PlayerWrapper { - player: Arc>>, - shutdown: Arc, -} - -impl PlayerWrapper { - pub fn new(path: &Path) -> Self { - let servo_media = ServoMedia::get().unwrap(); - let player = Arc::new(Mutex::new(servo_media.create_player())); - let file = File::open(&path).unwrap(); - let metadata = file.metadata().unwrap(); - player - .lock() - .unwrap() - .set_input_size(metadata.len()) - .unwrap(); - let (sender, receiver) = ipc::channel().unwrap(); - player.lock().unwrap().register_event_handler(sender); - let player_ = player.clone(); - let player__ = player.clone(); - let shutdown = Arc::new(AtomicBool::new(false)); - let shutdown_ = shutdown.clone(); - let shutdown__ = shutdown.clone(); - Builder::new() - .name("File reader".to_owned()) - .spawn(move || { - let player = &player_; - let shutdown = &shutdown_; - let mut buf_reader = BufReader::new(file); - let mut buffer = [0; 8192]; - while !shutdown.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; - } - } - } - }) - .unwrap(); - - Builder::new() - .name("Player event loop".to_owned()) - .spawn(move || { - let player = &player__; - let shutdown = &shutdown__; - 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!("."), - PlayerEvent::PositionChanged(_) => (), - PlayerEvent::SeekData(_) => (), - PlayerEvent::SeekDone(_) => (), - PlayerEvent::NeedData => (), - PlayerEvent::EnoughData => (), - } - } - player.lock().unwrap().stop().unwrap(); - shutdown.store(true, Ordering::Relaxed); - }) - .unwrap(); - - player.lock().unwrap().play().unwrap(); - - PlayerWrapper { player, shutdown } - } - - fn shutdown(&self) { - self.player.lock().unwrap().stop().unwrap(); - self.shutdown.store(true, Ordering::Relaxed); - } - - fn register_frame_renderer(&self, renderer: Arc>) { - self.player - .lock() - .unwrap() - .register_frame_renderer(renderer); - } -} +#[path = "player_wrapper.rs"] +mod player_wrapper; struct App { frame_queue: Vec, @@ -158,7 +47,12 @@ impl App { #[cfg(not(target_os = "android"))] impl ui::Example for App { - fn render(&mut self, api: &RenderApi, builder: &mut DisplayListBuilder, txn: &mut Transaction) { + fn push_txn( + &mut self, + api: &RenderApi, + builder: &mut DisplayListBuilder, + txn: &mut Transaction, + ) { let frame = if self.frame_queue.is_empty() { if self.current_frame.is_none() { return; @@ -240,9 +134,6 @@ fn main() { }; let path = Path::new(filename); - let player_wrapper = PlayerWrapper::new(&path); let app = Arc::new(Mutex::new(App::new())); - player_wrapper.register_frame_renderer(app.clone()); - ui::main_wrapper(app, None); - player_wrapper.shutdown(); + ui::main_wrapper(app, &path, None); } diff --git a/examples/player/player_wrapper.rs b/examples/player/player_wrapper.rs new file mode 100644 index 00000000..996caf39 --- /dev/null +++ b/examples/player/player_wrapper.rs @@ -0,0 +1,120 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +use ipc_channel::ipc; +use servo_media::player::frame::{Frame, FrameRenderer}; +use servo_media::player::{Player, PlayerEvent}; +use servo_media::ServoMedia; +use std::fs::File; +use std::io::{BufReader, Read}; +use std::path::Path; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, Mutex}; +use std::thread::Builder; + +pub struct PlayerWrapper { + player: Arc>>, + shutdown: Arc, +} + +impl PlayerWrapper { + pub fn new(path: &Path) -> Self { + let servo_media = ServoMedia::get().unwrap(); + let player = Arc::new(Mutex::new(servo_media.create_player())); + let file = File::open(&path).unwrap(); + let metadata = file.metadata().unwrap(); + player + .lock() + .unwrap() + .set_input_size(metadata.len()) + .unwrap(); + let (sender, receiver) = ipc::channel().unwrap(); + player.lock().unwrap().register_event_handler(sender); + let player_ = player.clone(); + let player__ = player.clone(); + let shutdown = Arc::new(AtomicBool::new(false)); + let shutdown_ = shutdown.clone(); + let shutdown__ = shutdown.clone(); + Builder::new() + .name("File reader".to_owned()) + .spawn(move || { + let player = &player_; + let shutdown = &shutdown_; + let mut buf_reader = BufReader::new(file); + let mut buffer = [0; 8192]; + while !shutdown.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; + } + } + } + }) + .unwrap(); + + Builder::new() + .name("Player event loop".to_owned()) + .spawn(move || { + let player = &player__; + let shutdown = &shutdown__; + 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!("."), + PlayerEvent::PositionChanged(_) => (), + PlayerEvent::SeekData(_) => (), + PlayerEvent::SeekDone(_) => (), + PlayerEvent::NeedData => (), + PlayerEvent::EnoughData => (), + } + } + player.lock().unwrap().stop().unwrap(); + shutdown.store(true, Ordering::Relaxed); + }) + .unwrap(); + + player.lock().unwrap().play().unwrap(); + + PlayerWrapper { player, shutdown } + } + + pub fn shutdown(&self) { + self.player.lock().unwrap().stop().unwrap(); + self.shutdown.store(true, Ordering::Relaxed); + } + + pub fn register_frame_renderer(&self, renderer: Arc>) { + self.player + .lock() + .unwrap() + .register_frame_renderer(renderer); + } +} diff --git a/examples/player/ui.rs b/examples/player/ui.rs index 5badeaf2..3ab154cd 100644 --- a/examples/player/ui.rs +++ b/examples/player/ui.rs @@ -9,12 +9,16 @@ extern crate euclid; use gleam::gl; use glutin::{self, GlContext}; +use servo_media::player::frame::FrameRenderer; use std::env; +use std::path::Path; use std::sync::{Arc, Mutex}; use webrender; use webrender::api::*; use winit; +use player_wrapper::PlayerWrapper; + struct Notifier { events_proxy: winit::EventsLoopProxy, } @@ -76,7 +80,12 @@ pub trait Example { const WIDTH: u32 = 1920; const HEIGHT: u32 = 1080; - fn render(&mut self, api: &RenderApi, builder: &mut DisplayListBuilder, txn: &mut Transaction); + fn push_txn( + &mut self, + api: &RenderApi, + builder: &mut DisplayListBuilder, + txn: &mut Transaction, + ); fn on_event(&self, winit::WindowEvent, &RenderApi, DocumentId) -> bool { false } @@ -95,8 +104,9 @@ pub trait Example { fn draw_custom(&self, _gl: &gl::Gl) {} } -pub fn main_wrapper( +pub fn main_wrapper( example: Arc>, + path: &Path, options: Option, ) { env_logger::init(); @@ -172,12 +182,18 @@ pub fn main_wrapper( let mut builder = DisplayListBuilder::new(pipeline_id, layout_size); let mut txn = Transaction::new(); - example.lock().unwrap().render(&api, &mut builder, &mut txn); + example + .lock() + .unwrap() + .push_txn(&api, &mut builder, &mut txn); txn.set_display_list(epoch, None, layout_size, builder.finalize(), true); txn.set_root_pipeline(pipeline_id); txn.generate_frame(); api.send_transaction(document_id, txn); + let player_wrapper = PlayerWrapper::new(path); + player_wrapper.register_frame_renderer(example.clone()); + println!("Entering event loop"); events_loop.run_forever(|global_event| { let mut txn = Transaction::new(); @@ -257,7 +273,10 @@ pub fn main_wrapper( if custom_event || example.lock().unwrap().needs_repaint() { let mut builder = DisplayListBuilder::new(pipeline_id, layout_size); - example.lock().unwrap().render(&api, &mut builder, &mut txn); + example + .lock() + .unwrap() + .push_txn(&api, &mut builder, &mut txn); txn.set_display_list(epoch, None, layout_size, builder.finalize(), true); txn.generate_frame(); } @@ -272,5 +291,6 @@ pub fn main_wrapper( winit::ControlFlow::Continue }); + player_wrapper.shutdown(); renderer.deinit(); }