diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-07-05 11:01:19 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2019-07-05 11:01:19 +0200 |
commit | 8e0160fa717e6f052c4bb6097147f10105e70448 (patch) | |
tree | fa1479ce9010282fd456c1b5af9607dfff008b89 /components/script/dom/htmlmediaelement.rs | |
parent | 0dc17af7f0dab01f673894b6ac7c84cb50d03603 (diff) | |
download | servo-8e0160fa717e6f052c4bb6097147f10105e70448.tar.gz servo-8e0160fa717e6f052c4bb6097147f10105e70448.zip |
Update servo media to include global mute support
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 690692a2481..9ba07fe0c09 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -75,7 +75,7 @@ use script_layout_interface::HTMLMediaData; use servo_config::pref; use servo_media::player::frame::{Frame, FrameRenderer}; use servo_media::player::{PlaybackState, Player, PlayerError, PlayerEvent, StreamType}; -use servo_media::{ServoMedia, SupportsMediaType}; +use servo_media::{ClientContextId, ServoMedia, SupportsMediaType}; use servo_url::ServoUrl; use std::cell::Cell; use std::collections::VecDeque; @@ -297,7 +297,7 @@ pub struct HTMLMediaElement { #[ignore_malloc_size_of = "promises are hard"] in_flight_play_promises_queue: DomRefCell<VecDeque<(Box<[Rc<Promise>]>, ErrorResult)>>, #[ignore_malloc_size_of = "servo_media"] - player: DomRefCell<Option<Box<dyn Player>>>, + player: DomRefCell<Option<Arc<Mutex<dyn Player>>>>, #[ignore_malloc_size_of = "Arc"] frame_renderer: Arc<Mutex<MediaFrameRenderer>>, /// https://html.spec.whatwg.org/multipage/#show-poster-flag @@ -415,10 +415,10 @@ impl HTMLMediaElement { fn play_media(&self) { if let Some(ref player) = *self.player.borrow() { - if let Err(e) = player.set_rate(self.playbackRate.get()) { + if let Err(e) = player.lock().unwrap().set_rate(self.playbackRate.get()) { warn!("Could not set the playback rate {:?}", e); } - if let Err(e) = player.play() { + if let Err(e) = player.lock().unwrap().play() { warn!("Could not play media {:?}", e); } } @@ -485,7 +485,7 @@ impl HTMLMediaElement { this.upcast::<EventTarget>().fire_event(atom!("pause")); if let Some(ref player) = *this.player.borrow() { - if let Err(e) = player.pause() { + if let Err(e) = player.lock().unwrap().pause() { eprintln!("Could not pause player {:?}", e); } } @@ -925,6 +925,8 @@ impl HTMLMediaElement { .borrow() .as_ref() .unwrap() + .lock() + .unwrap() .set_stream(&track.id(), pos == tracks.len() - 1) { self.queue_dedicated_media_source_failure_steps(); @@ -974,7 +976,7 @@ impl HTMLMediaElement { this.upcast::<EventTarget>().fire_event(atom!("error")); if let Some(ref player) = *this.player.borrow() { - if let Err(e) = player.stop() { + if let Err(e) = player.lock().unwrap().stop() { eprintln!("Could not stop player {:?}", e); } } @@ -1230,7 +1232,7 @@ impl HTMLMediaElement { // Step 11. if let Some(ref player) = *self.player.borrow() { - if let Err(e) = player.seek(time) { + if let Err(e) = player.lock().unwrap().seek(time) { eprintln!("Seek error {:?}", e); } } @@ -1302,7 +1304,13 @@ impl HTMLMediaElement { HTMLMediaElementTypeId::HTMLVideoElement => Some(self.frame_renderer.clone()), }; + let browsing_context_id = window.window_proxy().top_level_browsing_context_id().0; + let client_context_id = ClientContextId::build( + browsing_context_id.namespace_id.0, + browsing_context_id.index.0.get(), + ); let player = ServoMedia::get().unwrap().create_player( + &client_context_id, stream_type, action_sender, renderer, @@ -1737,9 +1745,14 @@ impl Drop for HTMLMediaElement { }); if let Some(ref player) = *self.player.borrow() { - if let Err(err) = player.shutdown() { - warn!("Error shutting down player {:?}", err); - } + let browsing_context_id = window.window_proxy().top_level_browsing_context_id().0; + let client_context_id = ClientContextId::build( + browsing_context_id.namespace_id.0, + browsing_context_id.index.0.get(), + ); + ServoMedia::get() + .unwrap() + .shutdown_player(&client_context_id, player.clone()); } } } @@ -1797,7 +1810,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement { } if let Some(ref player) = *self.player.borrow() { - let _ = player.set_mute(value); + let _ = player.lock().unwrap().set_mute(value); } self.muted.set(value); @@ -2005,7 +2018,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement { self.queue_ratechange_event(); if self.is_potentially_playing() { if let Some(ref player) = *self.player.borrow() { - if let Err(e) = player.set_rate(*value) { + if let Err(e) = player.lock().unwrap().set_rate(*value) { warn!("Could not set the playback rate {:?}", e); } } @@ -2072,7 +2085,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement { fn Buffered(&self) -> DomRoot<TimeRanges> { let mut buffered = TimeRangesContainer::new(); if let Some(ref player) = *self.player.borrow() { - if let Ok(ranges) = player.buffered() { + if let Ok(ranges) = player.lock().unwrap().buffered() { for range in ranges { let _ = buffered.add(range.start as f64, range.end as f64); } @@ -2378,6 +2391,8 @@ impl FetchResponseListener for HTMLMediaElementFetchListener { .borrow() .as_ref() .unwrap() + .lock() + .unwrap() .set_input_size(content_length) { warn!("Could not set player input size {:?}", e); @@ -2431,7 +2446,15 @@ impl FetchResponseListener for HTMLMediaElementFetchListener { let payload_len = payload.len() as u64; // Push input data into the player. - if let Err(e) = elem.player.borrow().as_ref().unwrap().push_data(payload) { + if let Err(e) = elem + .player + .borrow() + .as_ref() + .unwrap() + .lock() + .unwrap() + .push_data(payload) + { // If we are pushing too much data and we know that we can // restart the download later from where we left, we cancel // the current request. Otherwise, we continue the request @@ -2478,7 +2501,15 @@ impl FetchResponseListener for HTMLMediaElementFetchListener { if elem.generation_id.get() == self.generation_id { if let Some(ref current_fetch_context) = *elem.current_fetch_context.borrow() { if let Some(CancelReason::Error) = current_fetch_context.cancel_reason() { - if let Err(e) = elem.player.borrow().as_ref().unwrap().end_of_stream() { + if let Err(e) = elem + .player + .borrow() + .as_ref() + .unwrap() + .lock() + .unwrap() + .end_of_stream() + { warn!("Could not signal EOS to player {:?}", e); } return; |