[Exposed=Window, Constructor, Constructor(MediaStream stream), Constructor(sequence tracks)] interface MediaStream : EventTarget { readonly attribute DOMString id; sequence getAudioTracks(); sequence getVideoTracks(); sequence getTracks(); MediaStreamTrack? getTrackById(DOMString trackId); void addTrack(MediaStreamTrack track); void removeTrack(MediaStreamTrack track); MediaStream clone(); readonly attribute boolean active; attribute EventHandler onaddtrack; attribute EventHandler onremovetrack; }; [Exposed=Window] interface MediaStreamTrack : EventTarget { readonly attribute DOMString kind; readonly attribute DOMString id; readonly attribute DOMString label; attribute boolean enabled; readonly attribute boolean muted; attribute EventHandler onmute; attribute EventHandler onunmute; readonly attribute MediaStreamTrackState readyState; attribute EventHandler onended; MediaStreamTrack clone(); void stop(); MediaTrackCapabilities getCapabilities(); MediaTrackConstraints getConstraints(); MediaTrackSettings getSettings(); Promise applyConstraints(optional MediaTrackConstraints constraints); attribute EventHandler onoverconstrained; }; enum MediaStreamTrackState { "live", "ended" }; dictionary MediaTrackSupportedConstraints { boolean width = true; boolean height = true; boolean aspectRatio = true; boolean frameRate = true; boolean facingMode = true; boolean volume = true; boolean sampleRate = true; boolean sampleSize = true; boolean echoCancellation = true; boolean latency = true; boolean channelCount = true; boolean deviceId = true; boolean groupId = true; }; dictionary MediaTrackCapabilities { LongRange width; LongRange height; DoubleRange aspectRatio; DoubleRange frameRate; sequence facingMode; DoubleRange volume; LongRange sampleRate; LongRange sampleSize; sequence echoCancellation; DoubleRange latency; LongRange channelCount; DOMString deviceId; DOMString groupId; }; dictionary MediaTrackConstraints : MediaTrackConstraintSet { sequence advanced; }; dictionary MediaTrackConstraintSet { ConstrainLong width; ConstrainLong height; ConstrainDouble aspectRatio; ConstrainDouble frameRate; ConstrainDOMString facingMode; ConstrainDouble volume; ConstrainLong sampleRate; ConstrainLong sampleSize; ConstrainBoolean echoCancellation; ConstrainDouble latency; ConstrainLong channelCount; ConstrainDOMString deviceId; ConstrainDOMString groupId; }; dictionary MediaTrackSettings { long width; long height; double aspectRatio; double frameRate; DOMString facingMode; double volume; long sampleRate; long sampleSize; boolean echoCancellation; double latency; long channelCount; DOMString deviceId; DOMString groupId; }; enum VideoFacingModeEnum { "user", "environment", "left", "right" }; [Exposed=Window, Constructor(DOMString type, MediaStreamTrackEventInit eventInitDict)] interface MediaStreamTrackEvent : Event { [SameObject] readonly attribute MediaStreamTrack track; }; dictionary MediaStreamTrackEventInit : EventInit { required MediaStreamTrack track; }; [Exposed=Window, Constructor(DOMString type, OverconstrainedErrorEventInit eventInitDict)] interface OverconstrainedErrorEvent : Event { readonly attribute OverconstrainedError? error; }; dictionary OverconstrainedErrorEventInit : EventInit { OverconstrainedError? error = null; }; [Exposed=Window, NoInterfaceObject] interface NavigatorUserMedia { [SameObject] readonly attribute MediaDevices mediaDevices; }; Navigator implements NavigatorUserMedia; [Exposed=Window] interface MediaDevices : EventTarget { attribute EventHandler ondevicechange; Promise> enumerateDevices(); }; [Exposed=Window] interface MediaDeviceInfo { readonly attribute DOMString deviceId; readonly attribute MediaDeviceKind kind; readonly attribute DOMString label; readonly attribute DOMString groupId; [Default] object toJSON(); }; enum MediaDeviceKind { "audioinput", "audiooutput", "videoinput" }; [Exposed=Window] interface InputDeviceInfo : MediaDeviceInfo { MediaTrackCapabilities getCapabilities(); }; partial interface NavigatorUserMedia { void getUserMedia(MediaStreamConstraints constraints, NavigatorUserMediaSuccessCallback successCallback, NavigatorUserMediaErrorCallback errorCallback); }; partial interface MediaDevices { MediaTrackSupportedConstraints getSupportedConstraints(); Promise getUserMedia(optional MediaStreamConstraints constraints); }; dictionary MediaStreamConstraints { (boolean or MediaTrackConstraints) video = false; (boolean or MediaTrackConstraints) audio = false; }; callback NavigatorUserMediaSuccessCallback = void (MediaStream stream); callback NavigatorUserMediaErrorCallback = void (MediaStreamError error); typedef object MediaStreamError; [NoInterfaceObject] interface ConstrainablePattern { Capabilities getCapabilities(); Constraints getConstraints(); Settings getSettings(); Promise applyConstraints(optional Constraints constraints); attribute EventHandler onoverconstrained; }; dictionary DoubleRange { double max; double min; }; dictionary ConstrainDoubleRange : DoubleRange { double exact; double ideal; }; dictionary LongRange { long max; long min; }; dictionary ConstrainLongRange : LongRange { long exact; long ideal; }; dictionary ConstrainBooleanParameters { boolean exact; boolean ideal; }; dictionary ConstrainDOMStringParameters { (DOMString or sequence) exact; (DOMString or sequence) ideal; }; typedef (long or ConstrainLongRange) ConstrainLong; typedef (double or ConstrainDoubleRange) ConstrainDouble; typedef (boolean or ConstrainBooleanParameters) ConstrainBoolean; typedef (DOMString or sequence or ConstrainDOMStringParameters) ConstrainDOMString; dictionary Capabilities { }; dictionary Settings { }; dictionary ConstraintSet { }; dictionary Constraints : ConstraintSet { sequence advanced; };