aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml3
-rw-r--r--README.md7
-rw-r--r--appveyor.yml2
-rw-r--r--components/script/Cargo.toml3
-rw-r--r--components/script/dom/bindings/trace.rs3
-rw-r--r--components/script/dom/htmlmediaelement.rs53
-rw-r--r--components/script/lib.rs2
-rw-r--r--components/servo/Cargo.lock11
-rw-r--r--ports/cef/Cargo.lock11
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/error-codes/error.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata_noautoplay.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata_noautoplay.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_order_loadedmetadata_loadeddata.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadeddata.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadedmetadata.html.ini6
17 files changed, 129 insertions, 11 deletions
diff --git a/.travis.yml b/.travis.yml
index 44bb3c52ccb..7796d98cd23 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -36,6 +36,9 @@ matrix:
- xorg-dev
- ccache
- libdbus-glib-1-dev
+ - libavformat-dev
+ - libavcodec-dev
+ - libavutil-dev
branches:
only:
diff --git a/README.md b/README.md
index 0af2c5032a9..5164f01c958 100644
--- a/README.md
+++ b/README.md
@@ -43,7 +43,8 @@ sudo apt-get install git curl freeglut3-dev autoconf \
libfreetype6-dev libgl1-mesa-dri libglib2.0-dev xorg-dev \
gperf g++ build-essential cmake virtualenv python-pip \
libssl-dev libbz2-dev libosmesa6-dev libxmu6 libxmu-dev \
- libglu1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libdbus-1-dev
+ libglu1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libdbus-1-dev \
+ libavformat-dev
```
If you are on **Ubuntu 14.04** and encountered errors on installing these dependencies involving `libcheese`, see [#6158](https://github.com/servo/servo/issues/6158) for a workaround.
@@ -56,7 +57,7 @@ sudo dnf install curl freeglut-devel libtool gcc-c++ libXi-devel \
freetype-devel mesa-libGL-devel mesa-libEGL-devel glib2-devel libX11-devel libXrandr-devel gperf \
fontconfig-devel cabextract ttmkfdir python python-virtualenv python-pip expat-devel \
rpm-build openssl-devel cmake bzip2-devel libXcursor-devel libXmu-devel mesa-libOSMesa-devel \
- dbus-devel
+ dbus-devel ffmpeg-devel
```
On Arch Linux:
@@ -89,7 +90,7 @@ pacman -Su
pacman -Sy git mingw-w64-x86_64-toolchain mingw-w64-x86_64-freetype \
mingw-w64-x86_64-icu mingw-w64-x86_64-nspr mingw-w64-x86_64-ca-certificates \
mingw-w64-x86_64-expat mingw-w64-x86_64-cmake tar diffutils patch \
- patchutils make python2-setuptools
+ patchutils make python2-setuptools mingw-w64-x86_64-ffmpeg
export GCC_URL=http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-gcc
export GCC_EXT=5.4.0-1-any.pkg.tar.xz
pacman -U --noconfirm $GCC_URL-$GCC_EXT $GCC_URL-ada-$GCC_EXT \
diff --git a/appveyor.yml b/appveyor.yml
index c597890742a..148ee4fb5bf 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -19,7 +19,7 @@ cache:
install:
- bash -lc "echo $MSYSTEM; pacman --needed --noconfirm -Sy pacman-mirrors"
- bash -lc "pacman --noconfirm -Sy"
- - bash -lc "pacman -Sy --needed --noconfirm git mingw-w64-x86_64-toolchain mingw-w64-x86_64-freetype mingw-w64-x86_64-icu mingw-w64-x86_64-nspr mingw-w64-x86_64-ca-certificates mingw-w64-x86_64-expat mingw-w64-x86_64-cmake tar diffutils patch patchutils make python2-setuptools"
+ - bash -lc "pacman -Sy --needed --noconfirm git mingw-w64-x86_64-toolchain mingw-w64-x86_64-freetype mingw-w64-x86_64-icu mingw-w64-x86_64-nspr mingw-w64-x86_64-ca-certificates mingw-w64-x86_64-expat mingw-w64-x86_64-cmake tar diffutils patch patchutils make python2-setuptools mingw-w64-x86_64-ffmpeg"
- bash -lc "easy_install-2.7 pip virtualenv"
- bash -lc "mv /mingw64/bin/python2.exe /mingw64/bin/python2-mingw64.exe"
- bash -lc "mv /mingw64/bin/python2.7.exe /mingw64/bin/python2.7-mingw64.exe"
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml
index 72c436fce81..8842ba7a8a3 100644
--- a/components/script/Cargo.toml
+++ b/components/script/Cargo.toml
@@ -17,6 +17,9 @@ debugmozjs = ['js/debugmozjs']
[target.'cfg(any(target_os = "macos", target_os = "linux", target_os = "windows"))'.dependencies]
tinyfiledialogs = {git = "https://github.com/jdm/tinyfiledialogs"}
+[target.'cfg(not(any(target_os = "android", target_arch = "arm", target_arch = "aarch64")))'.dependencies]
+video-metadata = {git = "https://github.com/GuillaumeGomez/video-metadata-rs"}
+
[dependencies]
angle = {git = "https://github.com/servo/angle", branch = "servo"}
app_units = "0.2.5"
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 3c13572bf37..618061fe769 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -91,6 +91,7 @@ use style::element_state::*;
use style::properties::PropertyDeclarationBlock;
use style::selector_impl::{PseudoElement, ElementSnapshot};
use style::values::specified::Length;
+use time::Duration;
use url::Origin as UrlOrigin;
use url::Url;
use uuid::Uuid;
@@ -109,6 +110,8 @@ no_jsmanaged_fields!(EncodingRef);
no_jsmanaged_fields!(Reflector);
+no_jsmanaged_fields!(Duration);
+
/// Trace a `JSVal`.
pub fn trace_jsval(tracer: *mut JSTracer, description: &str, val: &Heap<JSVal>) {
unsafe {
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),
}
}
diff --git a/components/script/lib.rs b/components/script/lib.rs
index 20eb3336a38..2eecac4d1b5 100644
--- a/components/script/lib.rs
+++ b/components/script/lib.rs
@@ -87,6 +87,8 @@ extern crate url;
#[macro_use]
extern crate util;
extern crate uuid;
+#[cfg(not(any(target_os = "android", target_arch = "arm", target_arch = "aarch64")))]
+extern crate video_metadata;
extern crate webrender_traits;
extern crate websocket;
extern crate xml5ever;
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock
index 94675554e12..f73de787602 100644
--- a/components/servo/Cargo.lock
+++ b/components/servo/Cargo.lock
@@ -1904,6 +1904,7 @@ dependencies = [
"url 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"util 0.0.1",
"uuid 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "video-metadata 0.1.2 (git+https://github.com/GuillaumeGomez/video-metadata-rs)",
"webrender_traits 0.2.0 (git+https://github.com/servo/webrender_traits)",
"websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
"xml5ever 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2443,6 +2444,16 @@ dependencies = [
]
[[package]]
+name = "video-metadata"
+version = "0.1.2"
+source = "git+https://github.com/GuillaumeGomez/video-metadata-rs#bc7f45023765b0ff7a7235e02bac3bfe9f24acd7"
+dependencies = [
+ "gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "void"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock
index b914361f484..47806e2bf5e 100644
--- a/ports/cef/Cargo.lock
+++ b/ports/cef/Cargo.lock
@@ -1758,6 +1758,7 @@ dependencies = [
"url 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"util 0.0.1",
"uuid 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "video-metadata 0.1.2 (git+https://github.com/GuillaumeGomez/video-metadata-rs)",
"webrender_traits 0.2.0 (git+https://github.com/servo/webrender_traits)",
"websocket 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
"xml5ever 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2305,6 +2306,16 @@ dependencies = [
]
[[package]]
+name = "video-metadata"
+version = "0.1.2"
+source = "git+https://github.com/GuillaumeGomez/video-metadata-rs#bc7f45023765b0ff7a7235e02bac3bfe9f24acd7"
+dependencies = [
+ "gcc 0.3.28 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "void"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/error-codes/error.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/error-codes/error.html.ini
new file mode 100644
index 00000000000..7280d3b7e4f
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/error-codes/error.html.ini
@@ -0,0 +1,6 @@
+[error.html]
+ type: testharness
+ expected: TIMEOUT
+ [audio.error after successful load]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata.html.ini
index efd785bce04..249d3fa61f6 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata.html.ini
@@ -7,3 +7,6 @@
[setting src attribute on autoplay video should trigger loadeddata event]
expected: NOTRUN
+ [setting src attribute on autoplay audio should trigger loadeddata event]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata_noautoplay.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata_noautoplay.html.ini
new file mode 100644
index 00000000000..7c16b52bdbe
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadeddata_noautoplay.html.ini
@@ -0,0 +1,6 @@
+[event_loadeddata_noautoplay.html]
+ type: testharness
+ expected: TIMEOUT
+ [setting src attribute on non-autoplay audio should trigger loadeddata event]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata.html.ini
new file mode 100644
index 00000000000..90e0b6b2fad
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata.html.ini
@@ -0,0 +1,6 @@
+[event_loadedmetadata.html]
+ type: testharness
+ expected: TIMEOUT
+ [setting src attribute on autoplay audio should trigger loadedmetadata event]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata_noautoplay.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata_noautoplay.html.ini
new file mode 100644
index 00000000000..7d4abbe6b77
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_loadedmetadata_noautoplay.html.ini
@@ -0,0 +1,6 @@
+[event_loadedmetadata_noautoplay.html]
+ type: testharness
+ expected: TIMEOUT
+ [setting src attribute on non-autoplay audio should trigger loadedmetadata event]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_order_loadedmetadata_loadeddata.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_order_loadedmetadata_loadeddata.html.ini
new file mode 100644
index 00000000000..ef23353c3bc
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/event_order_loadedmetadata_loadeddata.html.ini
@@ -0,0 +1,6 @@
+[event_order_loadedmetadata_loadeddata.html]
+ type: testharness
+ expected: TIMEOUT
+ [setting src attribute on autoplay audio should trigger loadedmetadata then loadeddata event]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadeddata.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadeddata.html.ini
new file mode 100644
index 00000000000..f765e6bca1d
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadeddata.html.ini
@@ -0,0 +1,6 @@
+[readyState_during_loadeddata.html]
+ type: testharness
+ expected: TIMEOUT
+ [audio.readyState should be >= HAVE_CURRENT_DATA during loadeddata event]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadedmetadata.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadedmetadata.html.ini
new file mode 100644
index 00000000000..a3aaca7f389
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/readyState_during_loadedmetadata.html.ini
@@ -0,0 +1,6 @@
+[readyState_during_loadedmetadata.html]
+ type: testharness
+ expected: TIMEOUT
+ [audio.readyState should be >= HAVE_METADATA during loadedmetadata event]
+ expected: NOTRUN
+