diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-06-28 18:08:08 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-07-04 10:26:48 +0200 |
commit | 0da87ad169ca33c8d2bce7a49de77d8821d5cac5 (patch) | |
tree | a66478bd948a693dbba187a27f7b713513bb6086 /components/media/media_thread.rs | |
parent | ba9cf85fb3c1697998abab92488a0ab7ecdf431d (diff) | |
download | servo-0da87ad169ca33c8d2bce7a49de77d8821d5cac5.tar.gz servo-0da87ad169ca33c8d2bce7a49de77d8821d5cac5.zip |
Introduce WebrenderExternalImageRegistry
Diffstat (limited to 'components/media/media_thread.rs')
-rw-r--r-- | components/media/media_thread.rs | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/components/media/media_thread.rs b/components/media/media_thread.rs index 09d5a00b69b..2d6e85573eb 100644 --- a/components/media/media_thread.rs +++ b/components/media/media_thread.rs @@ -7,31 +7,36 @@ use crate::media_channel::{glplayer_channel, GLPlayerSender}; /// constellation. use crate::{GLPlayerMsg, GLPlayerMsgForward}; use fnv::FnvHashMap; +use std::sync::{Arc, Mutex}; use std::thread; +use webrender_traits::{WebrenderExternalImageRegistry, WebrenderImageHandlerType}; /// A GLPlayerThrx1ead manages the life cycle and message multiplexign of /// a set of video players with GL render. pub struct GLPlayerThread { // Map of live players. players: FnvHashMap<u64, GLPlayerSender<GLPlayerMsgForward>>, - /// Id generator for new WebGLContexts. - next_player_id: u64, + /// List of registered webrender external images. + /// We use it to get an unique ID for new players. + external_images: Arc<Mutex<WebrenderExternalImageRegistry>>, } impl GLPlayerThread { - pub fn new() -> Self { + pub fn new(external_images: Arc<Mutex<WebrenderExternalImageRegistry>>) -> Self { GLPlayerThread { players: Default::default(), - next_player_id: 1, + external_images, } } - pub fn start() -> GLPlayerSender<GLPlayerMsg> { + pub fn start( + external_images: Arc<Mutex<WebrenderExternalImageRegistry>>, + ) -> GLPlayerSender<GLPlayerMsg> { let (sender, receiver) = glplayer_channel::<GLPlayerMsg>().unwrap(); thread::Builder::new() .name("GLPlayerThread".to_owned()) .spawn(move || { - let mut renderer = GLPlayerThread::new(); + let mut renderer = GLPlayerThread::new(external_images); loop { let msg = receiver.recv().unwrap(); let exit = renderer.handle_msg(msg); @@ -51,12 +56,20 @@ impl GLPlayerThread { trace!("processing {:?}", msg); match msg { GLPlayerMsg::RegisterPlayer(sender) => { - let id = self.next_player_id; + let id = self + .external_images + .lock() + .unwrap() + .next_id(WebrenderImageHandlerType::Media) + .0; self.players.insert(id, sender.clone()); sender.send(GLPlayerMsgForward::PlayerId(id)).unwrap(); - self.next_player_id += 1; }, GLPlayerMsg::UnregisterPlayer(id) => { + self.external_images + .lock() + .unwrap() + .remove(&webrender_api::ExternalImageId(id)); if self.players.remove(&id).is_none() { warn!("Tried to remove an unknown player"); } |