- From: Harald Alvestrand <harald@alvestrand.no>
- Date: Sat, 28 Jul 2012 16:07:41 -0700
- To: Travis Leithead <travis.leithead@microsoft.com>
- CC: "public-media-capture@w3.org" <public-media-capture@w3.org>
- Message-ID: <501470BD.4010309@alvestrand.no>
On 07/27/2012 04:18 PM, Travis Leithead wrote: > > I've been thinking a lot about Constraints and their current > integration into getUserMedia, and the points that Rich made in a > previous discussion: > http://lists.w3.org/Archives/Public/public-media-capture/2012May/0063.html. > This also came up again in a recent DAP teleconference. > > I like constraints. However, I'm starting to believe that putting them > front-and-center as parameters to getUserMedia is a bad idea. Rich > articulates this rather well in his last mail (referenced above), but > let me put forth my own view below and then offer an actionable > suggestion. > > Here's the goal with constraints (as I see it): > > ·Provide a set of optional constraints to help the UA (and ultimately > end-users) select the best device configuration for the scenario the > developer would like. > > ·Provide a set of mandatory constraints to restrict the ability to get > media (at all) if the web developer's scenario cannot be met. > > Here's the potential problem (as I see it): > > 1.UAs that run untrusted code (e.g., browsers) won't provide a > "getCapabilities" API, so that (at the outset) developers won't know > the capabilities that are available for the devices of any given UA. > This is good and I support that. > > 2.Without knowing the capabilities, developers may set a "quality bar" > (hopefully using optional constraints) to try and get the best results > for their experience. > > 3.Developer may get ornery and use mandatory constraints. > > 4.UAs come with all sorts of capabilities and form factors, from > mobile to desktop to home-security hardware. Mandatory constraints > /will /cut-off some set of these UAs that don't have capabilities that > meet the bar. > > 5.These devices/UAs will not like being excluded, and will implement a > variation of the official spec that makes mandatory constraints > optional (or some other workaround). > > Like I said before: I like constraints. But the above problem leads to > an exclusionary design, rather than a best-effort design, which has > always been a hallmark of the web. Also, constraints without > capabilities is generally problematic. > I don't see that logic as compelling. A competing logic is: - Deveopers use mandatory constraints exactly in order to exclude some devices, because they know that users on those devices will have a bad experience - Some UA implementors will design non-conformant UAs in order to run on those devices - Some users will have a bad experience Why should we make it hard to decide who to blame in this situation? > My proposal is simple (in principle): Move constraints from > getUserMedia to LocalMediaStream > This would mean that you can't apply constraints up front, you can only apply constraints after getting access to the device. Why is that an advantage? > and add a getCapabilities API to LocalMediaStream too. Revert > getUserMedia to its former best-effort approach (with respect to the > QoS of either the requested video or audio tracks) and use the fact > that permission will already have been granted to a particular > combination of tracks (by the time a LocalMediaStream is available) as > implicit permission to get the capabilities of the devices furnishing > the existing tracks. > You mean that you want the user to be asked for permission on devices that the application will then reject as useless. Why is that a good UI design? > > The previous problem steps now work out as follows: > > a.UAs that run untrusted code (e.g., browsers) will provide a > "getCapabilities" API, but only /after/ granting permission for those > capabilities to be released along with the media they are providing. > > b.Developers can negotiate a level of quality that is applicable and > relevant to the existing capabilities of the device to try and get the > best results for their experience. > > c.Developer may get ornery and reject the media stream if it doesn't > meet some quality bar (but this has always been possible with the > stop() API) and is less likely under these circumstances. > > Since operations that obtain the capabilities and assign the > constraints will be interacting with the local media resources that > are furnishing the initial MediaStreamTrack(s) of a LocalMediaStream, > and given that LocalMediaStream objects are strongly tied to local > media resources (even though their track lists are mutable over time), > I propose the following: > > interface LocalMediaStream : MediaStream { > > void stop (); > > // proposal ****************************** > > MediaStreamConstraints? getUserMediaCapabilities(); > > void applyConstraints(MediaStreamConstraints? constraints); > > }; > > "getUserMediaCapabilities" will, of course, /only/ report the > capabilities for all the local media resources that have been granted > permission previously by getUserMedia. > > "applyConstraints" would only work against the local media resources > that have been granted permission previously by getUserMedia. > Additionally, this API may have the side-effect of stopping any > affected existing MediaStreamTrack objects and creating new > MediaStreamTrack objects (if any) that now conform to the constraints. > The new tracks could be automatically added to the LocalMediaStream > (as if videoTracks/audioTracks.add had been called) or furnished in a > callback/eventhandler. > > We could also add events to help the developer understand what > happened when the constraints were applied (e.g., for error conditions). > I actually see this API as making a lot of sense for *changing* media capabilities on a stream (which may succeed or may fail, so you need a return value or callback from applyConstraint). But the only difference I see between getUserMedia(function(flow) { if (flow.applyConstraints(constraints)) { handleSuccess() } else handleFailure() } } and flow = getUserMedia(constraints, handleSuccess, handleFailure) is that you enforce that the user has to be prompted for permission to the device before rejecting it. I don't see the advantage in that. Harald
Received on Saturday, 28 July 2012 23:08:24 UTC