From cd08c543a47b5494604ba3e5a9f690a8dccac79c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Tue, 16 Oct 2018 16:51:35 +0200 Subject: [PATCH 1/4] Send MetadataUpdated event when media duration changes --- backends/gstreamer/src/player.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/backends/gstreamer/src/player.rs b/backends/gstreamer/src/player.rs index 7f7b6967..29114d53 100644 --- a/backends/gstreamer/src/player.rs +++ b/backends/gstreamer/src/player.rs @@ -239,15 +239,29 @@ impl GStreamerPlayer { } }); + let inner_clone = inner.clone(); inner .lock() .unwrap() .player .connect_duration_changed(move |_, duration| { - let mut seconds = duration / 1_000_000_000; - let mut minutes = seconds / 60; - seconds %= 60; - minutes %= 60; + let duration = if duration != gst::ClockTime::none() { + let mut nanos = duration.nanoseconds().unwrap(); + nanos = nanos % 1_000_000_000; + let seconds = duration.seconds().unwrap(); + Some(time::Duration::new(seconds, nanos as u32)) + } else { + None + }; + let mut inner = inner_clone.lock().unwrap(); + let mut updated_metadata = None; + if let Some(ref mut metadata) = inner.last_metadata { + metadata.duration = duration; + updated_metadata = Some(metadata.clone()); + } + if updated_metadata.is_some() { + inner.notify(PlayerEvent::MetadataUpdated(updated_metadata.unwrap())); + } }); let inner_clone = inner.clone(); From a7a6a4605be38f65ebc65a624f72649f8db1debf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Tue, 16 Oct 2018 17:14:11 +0200 Subject: [PATCH 2/4] Player PositionChanged event --- backends/gstreamer/src/player.rs | 12 ++++++++++++ examples/player/main.rs | 1 + examples/simple_player.rs | 1 + player/src/lib.rs | 5 +++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/backends/gstreamer/src/player.rs b/backends/gstreamer/src/player.rs index 29114d53..5d7145c6 100644 --- a/backends/gstreamer/src/player.rs +++ b/backends/gstreamer/src/player.rs @@ -224,6 +224,18 @@ impl GStreamerPlayer { } }); + let inner_clone = inner.clone(); + inner + .lock() + .unwrap() + .player + .connect_position_updated(move |_, position| { + if let Some(seconds) = position.seconds() { + let inner = inner_clone.lock().unwrap(); + inner.notify(PlayerEvent::PositionChanged(seconds)); + } + }); + let inner_clone = inner.clone(); inner .lock() diff --git a/examples/player/main.rs b/examples/player/main.rs index 06808e1f..f07fc1bf 100644 --- a/examples/player/main.rs +++ b/examples/player/main.rs @@ -117,6 +117,7 @@ impl PlayerWrapper { println!("Player state changed to {:?}", s); } PlayerEvent::FrameUpdated => eprint!("."), + PlayerEvent::PositionChanged(_) => (), } } player.lock().unwrap().stop().unwrap(); diff --git a/examples/simple_player.rs b/examples/simple_player.rs index 8f5e6c80..64ed53bc 100644 --- a/examples/simple_player.rs +++ b/examples/simple_player.rs @@ -94,6 +94,7 @@ fn run_example(servo_media: Arc) { println!("Player state changed to {:?}", s); } PlayerEvent::FrameUpdated => eprint!("."), + PlayerEvent::PositionChanged(p) => println!("{:?}", p), } } diff --git a/player/src/lib.rs b/player/src/lib.rs index 944dc613..1b933c62 100644 --- a/player/src/lib.rs +++ b/player/src/lib.rs @@ -20,10 +20,11 @@ pub enum PlaybackState { #[derive(Clone, Debug, Deserialize, Serialize)] pub enum PlayerEvent { EndOfStream, + Error, + FrameUpdated, MetadataUpdated(metadata::Metadata), + PositionChanged(u64), StateChanged(PlaybackState), - FrameUpdated, - Error, } pub trait Player: Send { From b1ec3a58e4ba86ea3544a267ffca58c121fd04c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Tue, 16 Oct 2018 18:01:40 +0200 Subject: [PATCH 3/4] Remove unwraps when dealing with duration changes --- backends/gstreamer/src/player.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/backends/gstreamer/src/player.rs b/backends/gstreamer/src/player.rs index 5d7145c6..251fe16c 100644 --- a/backends/gstreamer/src/player.rs +++ b/backends/gstreamer/src/player.rs @@ -258,10 +258,17 @@ impl GStreamerPlayer { .player .connect_duration_changed(move |_, duration| { let duration = if duration != gst::ClockTime::none() { - let mut nanos = duration.nanoseconds().unwrap(); - nanos = nanos % 1_000_000_000; - let seconds = duration.seconds().unwrap(); - Some(time::Duration::new(seconds, nanos as u32)) + let nanos = duration.nanoseconds(); + if nanos.is_none() { + eprintln!("Could not get duration nanoseconds"); + return; + } + let seconds = duration.seconds(); + if seconds.is_none() { + eprintln!("Could not get duration seconds"); + return; + } + Some(time::Duration::new(seconds.unwrap(), (nanos.unwrap() % 1_000_000_000) as u32)) } else { None }; From 287ec7d376e30f00acb3b789bbfec897d61363e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Wed, 17 Oct 2018 09:37:34 +0200 Subject: [PATCH 4/4] Update position interval from 0.1 to 0.5 seconds --- backends/gstreamer/src/player.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backends/gstreamer/src/player.rs b/backends/gstreamer/src/player.rs index 251fe16c..9f65f1aa 100644 --- a/backends/gstreamer/src/player.rs +++ b/backends/gstreamer/src/player.rs @@ -163,6 +163,13 @@ impl GStreamerPlayer { .set_property("uri", &Value::from("appsrc://")) .map_err(|e| BackendError::SetPropertyFailed(e.0))?; + // Set position interval update to 0.5 seconds. + let mut config = player.get_config(); + config.set_position_update_interval(500u32); + player + .set_config(config) + .map_err(|e| BackendError::SetPropertyFailed(e.0))?; + let video_sink = gst::ElementFactory::make("appsink", None) .ok_or(BackendError::ElementCreationFailed("appsink"))?; let pipeline = player.get_pipeline();