- From: Matthew Kaufman <matthew.kaufman@skype.net>
- Date: Mon, 05 Sep 2011 21:19:15 -0700
- To: Eric Rescorla <ekr@rtfm.com>
- CC: Harald Alvestrand <harald@alvestrand.no>, Stefan Håkansson LK <stefan.lk.hakansson@ericsson.com>, "public-webrtc@w3.org" <public-webrtc@w3.org>
On 8/25/2011 9:02 AM, Eric Rescorla wrote: > Matthew, > > Do you think you could sketch out (or point to) what a sample app > would look like using > this API style? > > Sorry for the delay on this one... I'm basing these comments on the W3C webrtc draft spec. 1. There must be a way to get the capabilities without committing to use (and thus prompting the user for permission to use) resources. We need something like: getUserMediaCapabilities(options, successCallback); Example: A web site that wished to prompt the user to start a call with a customer service representative *if* the user is equipped to do so might call the API as follows: navigator.getUserMediaCapabilities('audio', gotAudioCapabilities); // does NOT cause the user to be prompted for microphone permission function gotAudioCapabilities(capabilities) { // user has an audio capture device // ...now check 'capabilities' object to see if G.729 or G.711 is supported for calling our call center directly... if yes, prompt user, otherwise ignore that they have audio capture } 2. Encoding choices should be exposed by allowing encoder media streams to exist, rather than putting the encoding in the PeerConnection (and controlling the encoding using SDP to/from that PeerConnection object) Example: navigator.getUserMedia('video user', gotStream); // DOES cause the user to be prompted for camera permission function gotStream(camera) { encodedStream = new CompressedMediaStream(camera, 'H.264'); // or alternatively, encodedStream = new CompressedMediaStreamH264(camera); -- different subclasses for each encoder. makes it harder to combine with a sensible capabilities system however, as you really want strings saying what you have and then a single constructor that works with any in that list encodedStream.frameRate = 12; // whatever else, possibly including encodedStream.codecSpecificParams(stringBlobOfSettings); // note that setting this here right after construction works particularly well because we can ensure that the encoder doesn't start until control leaves this function // example continues below Note that I'm not yet decided on how exactly we should do audio + video... I think the answer is that they should stay separate all the way to the addStream on the PeerConnection, but there's other alternatives available where we have the audio encoder do audio compression but pass video untouched, and the video encoder do video compression but pass audio untouched so we can treat the stream as a single object with both. 3. RTP choices should be exposed by allowing RTP media streams to exist, rather than putting the RTP parameter setting in the PeerConnection (and controlling the encoding using SDP to/from that PeerConnection object) Example from above continues: rtpStream = new RTPMediaStream(encodedStream); rtpStream.payloadType = 131; rtpStream.ssrc = 15; // note that if we tried to combine A+V into a single stream, we need a more expressive (and yet uglier) way to set the PT and SSRC for each // and we created our peerConnection earlier... peerConnection.addStream(rtpStream); // the only other alternative to this part of my proposal is to change addStream to take the PT and SSRC as parameters, but that's not nearly as clean 4. PeerConnection object should still have processSignalingMessage and onmessage callback, but the data sent via this channel should be restricted to ONLY the information necessary to successfully bring up the session using ICE. --- Note that all of this still allows for passing SDP around if you want. You simply need to write Javascript to convert the capabilities into an offer and the answer back into explicit settings for the encoder(s) as well as the RTP bits. But more likely, you'd pass SDP around *only* for federation, and use something else (like just passing a JSON blob that came out of the configuration check right up to the web server to be handled there). Matthew Kaufman
Received on Tuesday, 6 September 2011 04:20:20 UTC