diff --git a/components/canvas/media_thread.rs b/components/canvas/media_thread.rs index 7ab530adbd0..efcd6792d36 100644 --- a/components/canvas/media_thread.rs +++ b/components/canvas/media_thread.rs @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use canvas_traits::media::*; +use fnv::FnvHashMap; use std::thread; /// GL player threading API entry point that lives in the @@ -13,11 +14,19 @@ pub use crate::media_mode::GLPlayerThreads; /// A GLPlayerThrx1ead manages the life cycle and message multiplexign of /// a set of video players with GL render. -pub struct GLPlayerThread (); +pub struct GLPlayerThread { + // Map of live players. + players: FnvHashMap>, + /// Id generator for new WebGLContexts. + next_player_id: u64, +} impl GLPlayerThread { pub fn new() -> Self { - GLPlayerThread() + GLPlayerThread { + players: Default::default(), + next_player_id: 1, + } } pub fn start() -> GLPlayerSender { @@ -25,7 +34,7 @@ impl GLPlayerThread { thread::Builder::new() .name("GLPlayerThread".to_owned()) .spawn(move || { - let renderer = GLPlayerThread::new(); + let mut renderer = GLPlayerThread::new(); loop { let msg = receiver.recv().unwrap(); let exit = renderer.handle_msg(msg); @@ -41,11 +50,31 @@ impl GLPlayerThread { /// Handles a generic WebGLMsg message #[inline] - fn handle_msg(&self, msg: GLPlayerMsg) -> bool { + fn handle_msg(&mut self, msg: GLPlayerMsg) -> bool { trace!("processing {:?}", msg); match msg { + GLPlayerMsg::RegisterPlayer(sender) => { + let id = self.next_player_id; + self.players.insert(id, sender.clone()); + sender.send(GLPlayerMsgForward::PlayerId(id)).unwrap(); + self.next_player_id += 1; + }, + GLPlayerMsg::UnregisterPlayer(id) => { + if self.players.remove(&id).is_none() { + warn!("Tried to remove an unknown player"); + } + }, + GLPlayerMsg::Lock(id, handler_sender) => { + self.players.get(&id).map(|sender| { + sender.send(GLPlayerMsgForward::Lock(handler_sender)).ok(); + }); + }, + GLPlayerMsg::Unlock(id) => { + self.players.get(&id).map(|sender| { + sender.send(GLPlayerMsgForward::Unlock()).ok(); + }); + }, GLPlayerMsg::Exit => return true, - _ => (), } false