aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlmediaelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r--components/script/dom/htmlmediaelement.rs53
1 files changed, 46 insertions, 7 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 7a94768c13a..119139ae6d8 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -35,6 +35,8 @@ use string_cache::Atom;
use task_source::TaskSource;
use time::{self, Timespec, Duration};
use url::Url;
+#[cfg(not(any(target_os = "android", target_arch = "arm", target_arch = "aarch64")))]
+use video_metadata;
struct HTMLMediaElementContext {
/// The element that initiated the request.
@@ -75,12 +77,11 @@ impl AsyncResponseListener for HTMLMediaElementContext {
}
}
- fn data_available(&mut self, payload: Vec<u8>) {
+ fn data_available(&mut self, mut payload: Vec<u8>) {
if self.ignore_response {
return;
}
- let mut payload = payload;
self.data.append(&mut payload);
let elem = self.elem.root();
@@ -88,11 +89,7 @@ impl AsyncResponseListener for HTMLMediaElementContext {
// https://html.spec.whatwg.org/multipage/#media-data-processing-steps-list
// => "Once enough of the media data has been fetched to determine the duration..."
if !self.have_metadata {
- //TODO: actually check if the payload contains the full metadata
-
- // Step 6
- elem.change_ready_state(HAVE_METADATA);
- self.have_metadata = true;
+ self.check_metadata(&elem);
} else {
elem.change_ready_state(HAVE_CURRENT_DATA);
}
@@ -162,6 +159,46 @@ impl HTMLMediaElementContext {
ignore_response: false,
}
}
+
+ #[cfg(not(any(target_os = "android", target_arch = "arm", target_arch = "aarch64")))]
+ fn check_metadata(&mut self, elem: &HTMLMediaElement) {
+ match video_metadata::get_format_from_slice(&self.data) {
+ Ok(meta) => {
+ let dur = meta.duration.unwrap_or(::std::time::Duration::new(0, 0));
+ *elem.video.borrow_mut() = Some(VideoMedia {
+ format: format!("{:?}", meta.format),
+ duration: Duration::seconds(dur.as_secs() as i64) +
+ Duration::nanoseconds(dur.subsec_nanos() as i64),
+ width: meta.size.width,
+ height: meta.size.height,
+ video: meta.video,
+ audio: meta.audio,
+ });
+ // Step 6
+ elem.change_ready_state(HAVE_METADATA);
+ self.have_metadata = true;
+ }
+ _ => {}
+ }
+ }
+
+ #[cfg(any(target_os = "android", target_arch = "arm", target_arch = "aarch64"))]
+ fn check_metadata(&mut self, elem: &HTMLMediaElement) {
+ // Step 6.
+ elem.change_ready_state(HAVE_METADATA);
+ self.have_metadata = true;
+ }
+}
+
+#[derive(JSTraceable, HeapSizeOf)]
+pub struct VideoMedia {
+ format: String,
+ #[ignore_heap_size_of = "defined in time"]
+ duration: Duration,
+ width: u32,
+ height: u32,
+ video: String,
+ audio: Option<String>,
}
#[dom_struct]
@@ -175,6 +212,7 @@ pub struct HTMLMediaElement {
error: MutNullableHeap<JS<MediaError>>,
paused: Cell<bool>,
autoplaying: Cell<bool>,
+ video: DOMRefCell<Option<VideoMedia>>,
}
impl HTMLMediaElement {
@@ -192,6 +230,7 @@ impl HTMLMediaElement {
error: Default::default(),
paused: Cell::new(true),
autoplaying: Cell::new(true),
+ video: DOMRefCell::new(None),
}
}