From ed2cf6821b6ef99ae7a66981c133eea6df6b7b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Fri, 31 Aug 2018 15:32:13 +0200 Subject: [PATCH 1/2] Do not require FrameRenderer to be Sync --- backends/gstreamer/src/player.rs | 8 ++++---- examples/player/main.rs | 4 ++-- examples/player/ui.rs | 18 +++++++++--------- player/src/frame.rs | 2 +- player/src/lib.rs | 6 +++--- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/backends/gstreamer/src/player.rs b/backends/gstreamer/src/player.rs index 43655e22..ffcf6143 100644 --- a/backends/gstreamer/src/player.rs +++ b/backends/gstreamer/src/player.rs @@ -83,7 +83,7 @@ struct PlayerInner { appsink: gst_app::AppSink, input_size: u64, subscribers: Vec>, - renderers: Vec>, + renderers: Vec>>, last_metadata: Option, } @@ -92,7 +92,7 @@ impl PlayerInner { self.subscribers.push(sender); } - pub fn register_frame_renderer(&mut self, renderer: Arc) { + pub fn register_frame_renderer(&mut self, renderer: Arc>) { self.renderers.push(renderer); } @@ -106,7 +106,7 @@ impl PlayerInner { let frame = frame_from_sample(&sample)?; for renderer in &self.renderers { - renderer.render(frame.clone()); + renderer.lock().unwrap().render(frame.clone()); } self.notify(PlayerEvent::FrameUpdated); Ok(()) @@ -188,7 +188,7 @@ impl Player for GStreamerPlayer { self.inner.lock().unwrap().register_event_handler(sender); } - fn register_frame_renderer(&self, renderer: Arc) { + fn register_frame_renderer(&self, renderer: Arc>) { self.inner.lock().unwrap().register_frame_renderer(renderer); } diff --git a/examples/player/main.rs b/examples/player/main.rs index 39cd2ddb..b4c69127 100644 --- a/examples/player/main.rs +++ b/examples/player/main.rs @@ -125,7 +125,7 @@ impl PlayerWrapper { self.shutdown.store(true, Ordering::Relaxed); } - fn register_frame_renderer(&self, renderer: Arc) { + fn register_frame_renderer(&self, renderer: Arc>) { self.player .lock() .unwrap() @@ -234,7 +234,7 @@ fn main() { let path = Path::new(filename); let player_wrapper = PlayerWrapper::new(&path); - let app = Arc::new(App::new()); + let app = Arc::new(Mutex::new(App::new())); player_wrapper.register_frame_renderer(app.clone()); ui::main_wrapper(app, None); player_wrapper.shutdown(); diff --git a/examples/player/ui.rs b/examples/player/ui.rs index d9265800..db05eb08 100644 --- a/examples/player/ui.rs +++ b/examples/player/ui.rs @@ -11,7 +11,7 @@ use gleam::gl; use glutin::{self, GlContext}; use std::env; use std::path::PathBuf; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use webrender; use winit; use webrender::api::*; @@ -107,7 +107,7 @@ pub trait Example { } pub fn main_wrapper( - example: Arc, + example: Arc>, options: Option, ) { env_logger::init(); @@ -174,7 +174,7 @@ pub fn main_wrapper( let api = sender.create_api(); let document_id = api.add_document(framebuffer_size, 0); - let (external, output) = example.get_image_handlers(&*gl); + let (external, output) = example.lock().unwrap().get_image_handlers(&*gl); if let Some(output_image_handler) = output { renderer.set_output_image_handler(output_image_handler); @@ -190,7 +190,7 @@ pub fn main_wrapper( let mut builder = DisplayListBuilder::new(pipeline_id, layout_size); let mut txn = Transaction::new(); - example.render( + example.lock().unwrap().render( &api, &mut builder, &mut txn, @@ -262,14 +262,14 @@ pub fn main_wrapper( winit::Event::WindowEvent { event, .. } => event, _ => unreachable!() }; - custom_event = example.on_event( + custom_event = example.lock().unwrap().on_event( win_event, &api, document_id, ) }, }, - winit::Event::WindowEvent { event, .. } => custom_event = example.on_event( + winit::Event::WindowEvent { event, .. } => custom_event = example.lock().unwrap().on_event( event, &api, document_id, @@ -277,10 +277,10 @@ pub fn main_wrapper( _ => (), }; - if custom_event || example.needs_repaint() { + if custom_event || example.lock().unwrap().needs_repaint() { let mut builder = DisplayListBuilder::new(pipeline_id, layout_size); - example.render( + example.lock().unwrap().render( &api, &mut builder, &mut txn, @@ -302,7 +302,7 @@ pub fn main_wrapper( renderer.update(); renderer.render(framebuffer_size).unwrap(); let _ = renderer.flush_pipeline_info(); - example.draw_custom(&*gl); + example.lock().unwrap().draw_custom(&*gl); window.swap_buffers().ok(); winit::ControlFlow::Continue diff --git a/player/src/frame.rs b/player/src/frame.rs index 72a2cbdc..6112e04e 100644 --- a/player/src/frame.rs +++ b/player/src/frame.rs @@ -29,6 +29,6 @@ impl Frame { } } -pub trait FrameRenderer: Send + Sync + 'static { +pub trait FrameRenderer: Send + 'static { fn render(&self, frame: Frame); } diff --git a/player/src/lib.rs b/player/src/lib.rs index 2e8b0e7f..b9df8e8f 100644 --- a/player/src/lib.rs +++ b/player/src/lib.rs @@ -6,7 +6,7 @@ pub mod frame; pub mod metadata; use ipc_channel::ipc::IpcSender; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; #[derive(Clone, Debug, Deserialize, Serialize)] pub enum PlaybackState { @@ -27,7 +27,7 @@ pub enum PlayerEvent { pub trait Player: Send { fn register_event_handler(&self, sender: IpcSender); - fn register_frame_renderer(&self, renderer: Arc); + fn register_frame_renderer(&self, renderer: Arc>); fn setup(&self) -> Result<(), ()>; fn play(&self); @@ -42,7 +42,7 @@ pub struct DummyPlayer {} impl Player for DummyPlayer { fn register_event_handler(&self, _: IpcSender) {} - fn register_frame_renderer(&self, _: Arc) {} + fn register_frame_renderer(&self, _: Arc>) {} fn setup(&self) -> Result<(), ()> { println!("You are using the DummyPlayer"); From 92cf9ac6ec2b9ea1ef99c38aa2ba61f9107b309f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Fri, 31 Aug 2018 17:20:53 +0200 Subject: [PATCH 2/2] Allow self mutability during FrameRenderer.render --- examples/player/main.rs | 27 +++++++++++++-------------- examples/player/ui.rs | 2 +- player/src/frame.rs | 2 +- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/examples/player/main.rs b/examples/player/main.rs index b4c69127..08b9543d 100644 --- a/examples/player/main.rs +++ b/examples/player/main.rs @@ -134,22 +134,22 @@ impl PlayerWrapper { } struct App { - frame_queue: Mutex>, - current_frame: Mutex>, + frame_queue: Vec, + current_frame: Option, } impl App { fn new() -> Self { Self { - frame_queue: Mutex::new(Vec::new()), - current_frame: Mutex::new(None), + frame_queue: Vec::new(), + current_frame: None, } } } impl ui::Example for App { fn render( - &self, + &mut self, api: &RenderApi, builder: &mut DisplayListBuilder, txn: &mut Transaction, @@ -157,21 +157,20 @@ impl ui::Example for App { _pipeline_id: PipelineId, _document_id: DocumentId, ) { - let frame = if self.frame_queue.lock().unwrap().is_empty() { - let mut frame = self.current_frame.lock().unwrap(); - if frame.is_none() { + let frame = if self.frame_queue.is_empty() { + if self.current_frame.is_none() { return; } - frame.take().unwrap() + self.current_frame.take().unwrap() } else { - self.frame_queue.lock().unwrap().pop().unwrap() + self.frame_queue.pop().unwrap() }; let width = frame.get_width() as u32; let height = frame.get_height() as u32; let image_descriptor = ImageDescriptor::new(width, height, ImageFormat::BGRA8, false, false); let image_data = ImageData::new_shared(frame.get_data().clone()); - *self.current_frame.lock().unwrap() = Some(frame); + self.current_frame = Some(frame); let image_key = api.generate_image_key(); txn.add_image(image_key, image_descriptor, image_data, None); let bounds = (0, 0).to(width as i32, height as i32); @@ -202,7 +201,7 @@ impl ui::Example for App { } fn needs_repaint(&self) -> bool { - !self.frame_queue.lock().unwrap().is_empty() + !self.frame_queue.is_empty() } fn get_image_handlers( @@ -219,8 +218,8 @@ impl ui::Example for App { } impl FrameRenderer for App { - fn render(&self, frame: Frame) { - self.frame_queue.lock().unwrap().push(frame); + fn render(&mut self, frame: Frame) { + self.frame_queue.push(frame); } } diff --git a/examples/player/ui.rs b/examples/player/ui.rs index db05eb08..fa89cf14 100644 --- a/examples/player/ui.rs +++ b/examples/player/ui.rs @@ -76,7 +76,7 @@ pub trait Example { const HEIGHT: u32 = 1080; fn render( - &self, + &mut self, api: &RenderApi, builder: &mut DisplayListBuilder, txn: &mut Transaction, diff --git a/player/src/frame.rs b/player/src/frame.rs index 6112e04e..ad776cc7 100644 --- a/player/src/frame.rs +++ b/player/src/frame.rs @@ -30,5 +30,5 @@ impl Frame { } pub trait FrameRenderer: Send + 'static { - fn render(&self, frame: Frame); + fn render(&mut self, frame: Frame); }