Handle Player errors

This commit is contained in:
Fernando Jiménez Moreno 2018-10-03 14:01:58 +02:00
parent 0db628028a
commit 6b0acc9cd8
3 changed files with 33 additions and 20 deletions

10
Cargo.lock generated
View file

@ -3224,7 +3224,7 @@ dependencies = [
[[package]] [[package]]
name = "servo-media" name = "servo-media"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/media#d1524d451cb0493f40000daf4f2a58f59b535ffa" source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
dependencies = [ dependencies = [
"servo-media-audio 0.1.0 (git+https://github.com/servo/media)", "servo-media-audio 0.1.0 (git+https://github.com/servo/media)",
"servo-media-gstreamer 0.1.0 (git+https://github.com/servo/media)", "servo-media-gstreamer 0.1.0 (git+https://github.com/servo/media)",
@ -3234,7 +3234,7 @@ dependencies = [
[[package]] [[package]]
name = "servo-media-audio" name = "servo-media-audio"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/media#d1524d451cb0493f40000daf4f2a58f59b535ffa" source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
dependencies = [ dependencies = [
"boxfnonce 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "boxfnonce 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byte-slice-cast 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byte-slice-cast 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -3251,7 +3251,7 @@ dependencies = [
[[package]] [[package]]
name = "servo-media-gstreamer" name = "servo-media-gstreamer"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/media#d1524d451cb0493f40000daf4f2a58f59b535ffa" source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
dependencies = [ dependencies = [
"byte-slice-cast 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byte-slice-cast 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"glib 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "glib 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -3269,7 +3269,7 @@ dependencies = [
[[package]] [[package]]
name = "servo-media-player" name = "servo-media-player"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/media#d1524d451cb0493f40000daf4f2a58f59b535ffa" source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
dependencies = [ dependencies = [
"ipc-channel 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
@ -3365,7 +3365,7 @@ dependencies = [
[[package]] [[package]]
name = "servo_media_derive" name = "servo_media_derive"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/media#d1524d451cb0493f40000daf4f2a58f59b535ffa" source = "git+https://github.com/servo/media#ce50f1332cc2b70e859b793425c9ec7086137303"
dependencies = [ dependencies = [
"quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",

View file

@ -91,6 +91,7 @@ use servo_arc::Arc as ServoArc;
use servo_atoms::Atom; use servo_atoms::Atom;
use servo_channel::{Receiver, Sender}; use servo_channel::{Receiver, Sender};
use servo_media::Backend; use servo_media::Backend;
use servo_media::Error as ServoMediaError;
use servo_media::audio::analyser_node::AnalysisEngine; use servo_media::audio::analyser_node::AnalysisEngine;
use servo_media::audio::buffer_source_node::AudioBuffer; use servo_media::audio::buffer_source_node::AudioBuffer;
use servo_media::audio::context::AudioContext; use servo_media::audio::context::AudioContext;
@ -456,7 +457,7 @@ unsafe_no_jsmanaged_fields!(AudioBuffer);
unsafe_no_jsmanaged_fields!(AudioContext<Backend>); unsafe_no_jsmanaged_fields!(AudioContext<Backend>);
unsafe_no_jsmanaged_fields!(NodeId); unsafe_no_jsmanaged_fields!(NodeId);
unsafe_no_jsmanaged_fields!(AnalysisEngine, DistanceModel, PanningModel, ParamType); unsafe_no_jsmanaged_fields!(AnalysisEngine, DistanceModel, PanningModel, ParamType);
unsafe_no_jsmanaged_fields!(Player); unsafe_no_jsmanaged_fields!(Player<Error=ServoMediaError>);
unsafe_no_jsmanaged_fields!(Mutex<MediaFrameRenderer>); unsafe_no_jsmanaged_fields!(Mutex<MediaFrameRenderer>);
unsafe_no_jsmanaged_fields!(RenderApiSender); unsafe_no_jsmanaged_fields!(RenderApiSender);

View file

@ -44,6 +44,7 @@ use net_traits::request::{CredentialsMode, Destination, RequestInit};
use network_listener::{NetworkListener, PreInvoke}; use network_listener::{NetworkListener, PreInvoke};
use script_layout_interface::HTMLMediaData; use script_layout_interface::HTMLMediaData;
use script_thread::ScriptThread; use script_thread::ScriptThread;
use servo_media::Error as ServoMediaError;
use servo_media::ServoMedia; use servo_media::ServoMedia;
use servo_media::player::{PlaybackState, Player, PlayerEvent}; use servo_media::player::{PlaybackState, Player, PlayerEvent};
use servo_media::player::frame::{Frame, FrameRenderer}; use servo_media::player::frame::{Frame, FrameRenderer};
@ -159,7 +160,7 @@ pub struct HTMLMediaElement {
#[ignore_malloc_size_of = "promises are hard"] #[ignore_malloc_size_of = "promises are hard"]
in_flight_play_promises_queue: DomRefCell<VecDeque<(Box<[Rc<Promise>]>, ErrorResult)>>, in_flight_play_promises_queue: DomRefCell<VecDeque<(Box<[Rc<Promise>]>, ErrorResult)>>,
#[ignore_malloc_size_of = "servo_media"] #[ignore_malloc_size_of = "servo_media"]
player: Box<Player>, player: Box<Player<Error=ServoMediaError>>,
#[ignore_malloc_size_of = "Arc"] #[ignore_malloc_size_of = "Arc"]
frame_renderer: Arc<Mutex<MediaFrameRenderer>>, frame_renderer: Arc<Mutex<MediaFrameRenderer>>,
fetch_canceller: DomRefCell<FetchCanceller>, fetch_canceller: DomRefCell<FetchCanceller>,
@ -316,7 +317,9 @@ impl HTMLMediaElement {
} }
this.fulfill_in_flight_play_promises(|| { this.fulfill_in_flight_play_promises(|| {
this.player.play(); if let Err(e) = this.player.play() {
eprintln!("Could not play media {:?}", e);
}
}); });
}), }),
window.upcast(), window.upcast(),
@ -369,7 +372,9 @@ impl HTMLMediaElement {
// Step 2.3.2. // Step 2.3.2.
this.upcast::<EventTarget>().fire_event(atom!("pause")); this.upcast::<EventTarget>().fire_event(atom!("pause"));
this.player.pause(); if let Err(e) = this.player.pause() {
eprintln!("Could not pause player {:?}", e);
}
// Step 2.3.3. // Step 2.3.3.
// Done after running this closure in // Done after running this closure in
@ -406,7 +411,9 @@ impl HTMLMediaElement {
this.fulfill_in_flight_play_promises(|| { this.fulfill_in_flight_play_promises(|| {
// Step 2.1. // Step 2.1.
this.upcast::<EventTarget>().fire_event(atom!("playing")); this.upcast::<EventTarget>().fire_event(atom!("playing"));
this.player.play(); if let Err(e) = this.player.play() {
eprintln!("Could not play media {:?}", e);
}
// Step 2.2. // Step 2.2.
// Done after running this closure in // Done after running this closure in
@ -638,7 +645,8 @@ impl HTMLMediaElement {
// https://html.spec.whatwg.org/multipage/#concept-media-load-resource // https://html.spec.whatwg.org/multipage/#concept-media-load-resource
fn resource_fetch_algorithm(&self, resource: Resource) { fn resource_fetch_algorithm(&self, resource: Resource) {
if self.setup_media_player().is_err() { if let Err(e) = self.setup_media_player() {
eprintln!("Setup media player error {:?}", e);
self.queue_dedicated_media_source_failure_steps(); self.queue_dedicated_media_source_failure_steps();
return; return;
} }
@ -774,7 +782,9 @@ impl HTMLMediaElement {
// Step 5. // Step 5.
this.upcast::<EventTarget>().fire_event(atom!("error")); this.upcast::<EventTarget>().fire_event(atom!("error"));
this.player.stop(); if let Err(e) = this.player.stop() {
eprintln!("Could not stop player {:?}", e);
}
// Step 6. // Step 6.
// Done after running this closure in // Done after running this closure in
@ -936,12 +946,12 @@ impl HTMLMediaElement {
} }
// servo media player // servo media player
fn setup_media_player(&self) -> Result<(), ()>{ fn setup_media_player(&self) -> Result<(), ServoMediaError>{
let (action_sender, action_receiver) = ipc::channel().unwrap(); let (action_sender, action_receiver) = ipc::channel().unwrap();
self.player.register_event_handler(action_sender); self.player.register_event_handler(action_sender)?;
self.player self.player
.register_frame_renderer(self.frame_renderer.clone()); .register_frame_renderer(self.frame_renderer.clone())?;
let trusted_node = Trusted::new(self); let trusted_node = Trusted::new(self);
let window = window_from_node(self); let window = window_from_node(self);
@ -1239,7 +1249,9 @@ impl FetchResponseListener for HTMLMediaElementContext {
if let Some(metadata) = self.metadata.as_ref() { if let Some(metadata) = self.metadata.as_ref() {
if let Some(headers) = metadata.headers.as_ref() { if let Some(headers) = metadata.headers.as_ref() {
if let Some(content_length) = headers.get::<ContentLength>() { if let Some(content_length) = headers.get::<ContentLength>() {
self.elem.root().player.set_input_size(**content_length); if let Err(e) = self.elem.root().player.set_input_size(**content_length) {
eprintln!("Could not set player input size {:?}", e);
}
} }
} }
} }
@ -1270,8 +1282,8 @@ impl FetchResponseListener for HTMLMediaElementContext {
let elem = self.elem.root(); let elem = self.elem.root();
// Push input data into the player. // Push input data into the player.
if let Err(_) = elem.player.push_data(payload) { if let Err(e) = elem.player.push_data(payload) {
eprintln!("Couldn't push input data to player"); eprintln!("Could not push input data to player {:?}", e);
return; return;
} }
@ -1297,8 +1309,8 @@ impl FetchResponseListener for HTMLMediaElementContext {
let elem = self.elem.root(); let elem = self.elem.root();
// Signal the eos to player. // Signal the eos to player.
if let Err(_) = elem.player.end_of_stream() { if let Err(e) = elem.player.end_of_stream() {
eprintln!("Couldn't signal EOS to player"); eprintln!("Could not signal EOS to player {:?}", e);
} }
if status.is_ok() { if status.is_ok() {