mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Add a task source for messages from GLPlayer thread
This commit is contained in:
parent
a9ad088e70
commit
95c3d52e7b
2 changed files with 35 additions and 4 deletions
|
@ -70,13 +70,21 @@ where
|
||||||
GLPlayerReceiver::Mpsc(ref receiver) => receiver.recv().map_err(|_| ()),
|
GLPlayerReceiver::Mpsc(ref receiver) => receiver.recv().map_err(|_| ()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn to_opaque(self) -> ipc_channel::ipc::OpaqueIpcReceiver {
|
||||||
|
match self {
|
||||||
|
GLPlayerReceiver::Ipc(receiver) => receiver.to_opaque(),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn glplayer_channel<T>() -> Result<(GLPlayerSender<T>, GLPlayerReceiver<T>), ()>
|
pub fn glplayer_channel<T>() -> Result<(GLPlayerSender<T>, GLPlayerReceiver<T>), ()>
|
||||||
where
|
where
|
||||||
T: for<'de> Deserialize<'de> + Serialize,
|
T: for<'de> Deserialize<'de> + Serialize,
|
||||||
{
|
{
|
||||||
if *IS_MULTIPROCESS {
|
// Let's use Ipc until we move the Player instance into GPlayerThread
|
||||||
|
if true {
|
||||||
ipc::glplayer_channel()
|
ipc::glplayer_channel()
|
||||||
.map(|(tx, rx)| (GLPlayerSender::Ipc(tx), GLPlayerReceiver::Ipc(rx)))
|
.map(|(tx, rx)| (GLPlayerSender::Ipc(tx), GLPlayerReceiver::Ipc(rx)))
|
||||||
.map_err(|_| ())
|
.map_err(|_| ())
|
||||||
|
|
|
@ -1297,7 +1297,7 @@ impl HTMLMediaElement {
|
||||||
);
|
);
|
||||||
|
|
||||||
// GLPlayer thread setup
|
// GLPlayer thread setup
|
||||||
let player_id = window
|
let (player_id, image_receiver) = window
|
||||||
.get_player_context()
|
.get_player_context()
|
||||||
.glplayer_chan
|
.glplayer_chan
|
||||||
.map(|pipeline| {
|
.map(|pipeline| {
|
||||||
|
@ -1308,14 +1308,37 @@ impl HTMLMediaElement {
|
||||||
.send(GLPlayerMsg::RegisterPlayer(image_sender))
|
.send(GLPlayerMsg::RegisterPlayer(image_sender))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
match image_receiver.recv().unwrap() {
|
match image_receiver.recv().unwrap() {
|
||||||
GLPlayerMsgForward::PlayerId(id) => id,
|
GLPlayerMsgForward::PlayerId(id) => (id, Some(image_receiver)),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.unwrap_or(0);
|
.unwrap_or((0, None));
|
||||||
|
|
||||||
self.id.set(player_id);
|
self.id.set(player_id);
|
||||||
self.frame_renderer.lock().unwrap().id = player_id;
|
self.frame_renderer.lock().unwrap().id = player_id;
|
||||||
|
|
||||||
|
if let Some(image_receiver) = image_receiver {
|
||||||
|
let trusted_node = Trusted::new(self);
|
||||||
|
let (task_source, canceller) = window
|
||||||
|
.task_manager()
|
||||||
|
.media_element_task_source_with_canceller();
|
||||||
|
ROUTER.add_route(
|
||||||
|
image_receiver.to_opaque(),
|
||||||
|
Box::new(move |message| {
|
||||||
|
let msg: GLPlayerMsgForward = message.to().unwrap();
|
||||||
|
let _this = trusted_node.clone();
|
||||||
|
if let Err(err) = task_source.queue_with_canceller(
|
||||||
|
task!(handle_glplayer_message: move || {
|
||||||
|
trace!("GLPlayer message {:?}", msg);
|
||||||
|
}),
|
||||||
|
&canceller,
|
||||||
|
) {
|
||||||
|
warn!("Could not queue GL player message handler task {:?}", err);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue