diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2019-02-12 15:55:40 -0800 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2019-03-04 15:31:47 +0530 |
commit | dd7b69b6d8876ca3073c8ea6aeca007073ca3425 (patch) | |
tree | af2346da1490127651b7506b2e07482a18de580d | |
parent | 28c6dec62dc74893f44438fc010642c73c863a28 (diff) | |
download | servo-dd7b69b6d8876ca3073c8ea6aeca007073ca3425.tar.gz servo-dd7b69b6d8876ca3073c8ea6aeca007073ca3425.zip |
Add support for basic MediaTrackConstraints
-rw-r--r-- | components/script/dom/mediadevices.rs | 45 | ||||
-rw-r--r-- | components/script/dom/webidls/MediaDevices.webidl | 68 |
2 files changed, 75 insertions, 38 deletions
diff --git a/components/script/dom/mediadevices.rs b/components/script/dom/mediadevices.rs index 60b99c7fb23..313efa3b13d 100644 --- a/components/script/dom/mediadevices.rs +++ b/components/script/dom/mediadevices.rs @@ -4,6 +4,8 @@ use crate::dom::bindings::codegen::Bindings::MediaDevicesBinding::MediaStreamConstraints; use crate::dom::bindings::codegen::Bindings::MediaDevicesBinding::{self, MediaDevicesMethods}; +use crate::dom::bindings::codegen::UnionTypes::BooleanOrMediaTrackConstraints; +use crate::dom::bindings::codegen::UnionTypes::ClampedUnsignedLongOrConstrainULongRange as ConstrainULong; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::DomRoot; @@ -12,6 +14,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::mediastream::MediaStream; use crate::dom::promise::Promise; use dom_struct::dom_struct; +use servo_media::streams::capture::{Constrain, ConstrainRange, MediaTrackConstraintSet}; use servo_media::ServoMedia; use std::rc::Rc; @@ -42,13 +45,13 @@ impl MediaDevicesMethods for MediaDevices { let p = Promise::new(&self.global()); let media = ServoMedia::get().unwrap(); let mut tracks = vec![]; - if constraints.audio { - if let Some(audio) = media.create_audioinput_stream(Default::default()) { + if let Some(constraints) = convert_constraints(&constraints.audio) { + if let Some(audio) = media.create_audioinput_stream(constraints) { tracks.push(audio) } } - if constraints.video { - if let Some(video) = media.create_videoinput_stream(Default::default()) { + if let Some(constraints) = convert_constraints(&constraints.video) { + if let Some(video) = media.create_videoinput_stream(constraints) { tracks.push(video) } } @@ -57,3 +60,37 @@ impl MediaDevicesMethods for MediaDevices { p } } + +fn convert_constraints(js: &BooleanOrMediaTrackConstraints) -> Option<MediaTrackConstraintSet> { + match js { + BooleanOrMediaTrackConstraints::Boolean(false) => None, + BooleanOrMediaTrackConstraints::Boolean(true) => Some(Default::default()), + BooleanOrMediaTrackConstraints::MediaTrackConstraints(ref c) => { + Some(MediaTrackConstraintSet { + height: convert_culong(&c.parent.height), + width: convert_culong(&c.parent.width), + ..Default::default() + }) + }, + } +} + +fn convert_culong(js: &ConstrainULong) -> Option<Constrain<u32>> { + match js { + ConstrainULong::ClampedUnsignedLong(val) => Some(Constrain::Value(*val)), + ConstrainULong::ConstrainULongRange(ref range) => { + if range.parent.min.is_some() || range.parent.max.is_some() { + Some(Constrain::Range(ConstrainRange { + min: range.parent.min, + max: range.parent.max, + ideal: range.ideal, + })) + } else if let Some(exact) = range.exact { + Some(Constrain::Value(exact)) + } else { + // the unspecified case is treated as all three being none + None + } + }, + } +} diff --git a/components/script/dom/webidls/MediaDevices.webidl b/components/script/dom/webidls/MediaDevices.webidl index 7fa30e0b916..4c3a7dedbd2 100644 --- a/components/script/dom/webidls/MediaDevices.webidl +++ b/components/script/dom/webidls/MediaDevices.webidl @@ -23,10 +23,10 @@ partial interface MediaDevices { dictionary MediaStreamConstraints { - // (boolean or MediaTrackConstraints) video = false; - // (boolean or MediaTrackConstraints) audio = false; - boolean video = false; - boolean audio = false; + (boolean or MediaTrackConstraints) video; + // (boolean or MediaTrackConstraints) video = false; + (boolean or MediaTrackConstraints) audio; + // (boolean or MediaTrackConstraints) audio = false; }; // dictionary DoubleRange { @@ -39,15 +39,15 @@ dictionary MediaStreamConstraints { // double ideal; // }; -// dictionary ULongRange { -// [Clamp] unsigned long max; -// [Clamp] unsigned long min; -// }; +dictionary ULongRange { + [Clamp] unsigned long max; + [Clamp] unsigned long min; +}; -// dictionary ConstrainULongRange : ULongRange { -// [Clamp] unsigned long exact; -// [Clamp] unsigned long ideal; -// }; +dictionary ConstrainULongRange : ULongRange { + [Clamp] unsigned long exact; + [Clamp] unsigned long ideal; +}; // dictionary ConstrainBooleanParameters { // boolean exact; @@ -59,30 +59,30 @@ dictionary MediaStreamConstraints { // (DOMString or sequence<DOMString>) ideal; // }; -// dictionary MediaTrackConstraints : MediaTrackConstraintSet { -// sequence<MediaTrackConstraintSet> advanced; -// }; +dictionary MediaTrackConstraints : MediaTrackConstraintSet { + sequence<MediaTrackConstraintSet> advanced; +}; -// typedef ([Clamp] unsigned long or ConstrainULongRange) ConstrainULong; +typedef ([Clamp] unsigned long or ConstrainULongRange) ConstrainULong; // typedef (double or ConstrainDoubleRange) ConstrainDouble; // typedef (boolean or ConstrainBooleanParameters) ConstrainBoolean; // typedef (DOMString or sequence<DOMString> or ConstrainDOMStringParameters) ConstrainDOMString; -// dictionary MediaTrackConstraintSet { -// ConstrainULong width; -// ConstrainULong height; -// ConstrainDouble aspectRatio; -// ConstrainDouble frameRate; -// ConstrainDOMString facingMode; -// ConstrainDOMString resizeMode; -// ConstrainDouble volume; -// ConstrainULong sampleRate; -// ConstrainULong sampleSize; -// ConstrainBoolean echoCancellation; -// ConstrainBoolean autoGainControl; -// ConstrainBoolean noiseSuppression; -// ConstrainDouble latency; -// ConstrainULong channelCount; -// ConstrainDOMString deviceId; -// ConstrainDOMString groupId; -// }; +dictionary MediaTrackConstraintSet { + ConstrainULong width; + ConstrainULong height; + // ConstrainDouble aspectRatio; + // ConstrainDouble frameRate; + // ConstrainDOMString facingMode; + // ConstrainDOMString resizeMode; + // ConstrainDouble volume; + // ConstrainULong sampleRate; + // ConstrainULong sampleSize; + // ConstrainBoolean echoCancellation; + // ConstrainBoolean autoGainControl; + // ConstrainBoolean noiseSuppression; + // ConstrainDouble latency; + // ConstrainULong channelCount; + // ConstrainDOMString deviceId; + // ConstrainDOMString groupId; +}; |