- From: Stefan Håkansson LK <stefan.lk.hakansson@ericsson.com>
- Date: Wed, 2 Apr 2014 06:06:06 +0000
- To: Dan Burnett <dburnett@voxeo.com>, "public-media-capture@w3.org" <public-media-capture@w3.org>
Thanks a lot for working out this proposal! I like it. Just for confirmation: getCapabilities, getConstraints and getSettings would work as today (no changes compared to the Ed's draft)? Another thing, the sourceId "constraint" for use with getUserMedia was discussed a bit the last week. But it can be used with this structure, right? A couple of comments inline. Stefan On 2014-04-02 03:19, Dan Burnett wrote: > At the teleconference last week we were tasked with finding a way to > adjust the current constraint syntax in the specification, without loss > of expressivity, into a syntax that was WebIDL-compatible. We may have > done one better. > > We have found a workable compromise. It can be expressed with > dictionariesin WebIDL, retains the full expressive power of the current > proposal, and offers simpler default operation to users. Here's > a rich example of the syntax to study (full WebIDL below): > > var constraints = > { > require: ["width", "height"], > width: {min: 640}, > height: {min: 480}, > frameRate: 40, > facingMode: "user", > advanced: [{width: 1920, height: 1280}, > {aspectRatio: 1.3333333333}] > }; > > In this dictionary, there are three types of constraints: required, > non-required and advanced (you wouldn't use all three typically): > > 1. Required. > > Members of the top-level dictionary whose names are in the 'require' > list (the first 'width' and 'height' members in the example.) > Collectively, these correspond to the mandatory ConstraintSet in the > existing spec. The UA must fail if any top-level members named in > the require list are missing or unsupported by the UA. Given how > dictionaries work, this means that required constraints unknown > to the UA fail. > > 2. Non-required. > > Remaining members of the top-level dictionary whose names are NOT in > the 'require' list (the top-level 'frameRate' and 'facingMode' > entries in the example.) These do not correspond to anything in the > existing spec. This would basically be "hints"? I think that in the spec, the first example should only use non-required (as a simple start where the app hints > > 3. Advanced. > > Dictionaries sequenced in 'advanced'. These correspond to the > optional sequence of ConstraintSets in the existing spec. And, I take it, you can repeat an entry several times here (as in the current optional sequence? > > > Any of these three types of constraints may be absent from a call to > getUserMedia or track.applyConstraints. If all three are missing, then > the call is unconstrained, which in the case of gUM means the UA can > pick any device it wants, and in the case of applyConstraints means all > currently applied constraints must be removed. > > gUM works substantially as it does now, with the addition that the new > non-required constraints must be applied as a final step. Specifically, > when gUM is called, the UA must first remove from consideration all > devices that do not meet all of the required constraints. If there are > no devices left, the UA must call the error callback. Otherwise, the > next step is as defined in the current spec, that it must iterate over > the optional (now advanced) ConstraintSets to perform a ranking, at each > round removing from a so-called "winners' pool" all devices that do not > satisfy the current ConstraintSet. If in any round there are no devices > left, the UA must back up to the set from the previous round and skip to > the next round. When the UA ends this process, it must finally rank > just the winners by how many individual non-required constraints they > satisfy. Non-required constraints are to be considered individually and > order must not matter. If this still does not produce a winner, the UA > must decide using any tie-breaker it wants. > > When applyConstraints is called, if the Track in question cannot satisfy > all the required constraints, the UA must call the failure callback. > Otherwise, it must apply the required constraints, then apply the > 'advanced' ConstraintSets in order, skipping any ConstraintSet that > cannot be satisfied. When it finishes, the UA must attempt to apply, > individually, each non-required constraint. It must satisfy the largest > number of non-required constraints it can, in any order. Then the UA > must call the success callback. And overconstrained would fire if any of the required constraints can no longer be satisfied? > > WebIDL (tentative): > dictionary MediaStreamConstraints { > (boolean or MediaTrackConstraints) video = false; > (boolean or MediaTrackConstraints) audio = false; > DOMString peerIdentity; > }; > > dictionary MediaTrackConstraints : MediaTrackConstraintSet { > sequence<DOMString> require; > sequence<MediaTrackConstraintSet> advanced; > }; > > dictionary MediaTrackConstraintSet { > ConstrainLong width; > ConstrainLong height; > ConstrainDouble aspectRatio; > ConstrainDouble frameRate; > ConstrainVideoFacingMode facingMode; > ConstrainDouble volume; > ConstrainLong sampleRate; > ConstrainLong sampleSize; > boolean echoCancelation; > ConstrainDOMString sourceId; > > // Extended through gUM-specific IANA registry. > }; > > typedef (long or ConstrainLongRange) ConstrainLong; > typedef (double or ConstrainDoubleRange) ConstrainDouble; > typedef (VideoFacingModeEnum or sequence<VideoFacingModeEnum>) > ConstrainVideoFacingMode; > typedef (DOMString or sequence<DOMString>) ConstrainDOMString; > > > > Thanks, > > Dan Burnett, Jan-Ivar Bruaroey, and Jim Barnett >
Received on Wednesday, 2 April 2014 06:06:31 UTC