- From: Peter Thatcher <pthatcher@google.com>
- Date: Fri, 9 Oct 2015 08:30:34 -0700
- To: Harald Alvestrand <harald@alvestrand.no>
- Cc: "public-webrtc@w3.org" <public-webrtc@w3.org>
- Message-ID: <CAJrXDUGkCg=mJXDYhZ25AkrJkMiLxaf4=ZrHKyVAPoC7obychw@mail.gmail.com>
On Fri, Oct 9, 2015 at 5:25 AM, Harald Alvestrand <harald@alvestrand.no> wrote: > Some comments on proposal; I'm not sure I would advocate adding it yet. > > > Den 09. okt. 2015 04:06, skrev Peter Thatcher: > > Heading into the MMUSIC interim, I think it would be wise to have some > > idea of what SDP we would want to use (what subset of what MMUSIC > > decides on would WebRTC support?). Having spoken to several people in > > the MMUSIC WG working on the draft for simulcast and several people in > > the WebRTC WG, I've come up with the following proposal for what subset > > we could use, and what the API around it would look like. I hope this > > proposal and ensuing discussion help us prepare for the interim. > > > > > > At the f2f, we had several ideas with different qualities which I > > describe her in JSON form. > > I'm hesitant to call these "plans", they're not fleshed out enough, but > I think I can map your points to some of the things I remember... > You are right. At the f2f, they were called "Option A", "Option B", etc, not "Plan A", etc. > > > > > Plan A: {api: little, sdp:big} > > This would be the "just set the number of layers and let SDP do the > rest" plan? > Yes, that was Option A. > > > Plan B: {api: big, sdp: none} > > This would be the "drop multicast from WebRTC-1.0 API, leave it to > lower-layer APIs in NV" plan? > > No, Option B was "call RtpSender.setParameters with multiple encodings regardless of the SDP". > > Plan C: {api: none, sdp:none} > > This would be the "just say no" plan? Yes, Option C (or maybe it was D) was "not in 1.0". > > > > This proposal (let it be Plan X) tries to combine the best of both and > > have the qualities {api: moderate, sdp: moderate}. > > > > > > Here is a graphical representation of the qualities: > > > > + > > API Big | B > > | > > | > > | > > | > > | > > | > > | > > | > > | X > > | > > | > > | > > | > > | > > | > > API Small | A > > | C > > +------------------------------------+ > > > > SDP Small SDP Big > > > > > > > > > > Here's how it would work with an example: > > > > var video = pc.addTransceiver(track, > > {send: {encodings: [{scale: 1.0}, {scale: 2.0}, {scale: 4.0}]}}); > > > > // This now has a *subset* of the SDP from MMUSIC > > pc.createOffer().then(signalOffer) > > var answer = ... ; // wait for the answer > > > > // This accepts a *subset* of the SDP from MMUSIC > > pc.setRemoteDescription(answer); > > > > // The app can later decide to change parameters, such as > > // stop sending the top layer > > var params = video.sender.getParameters(); > > params.encodings[0].active = false; > > video.sender.setParameters(params); > > > > > > The key parts are: > > 1. It builds on top of addTransceiver, expanding {send: true} to {send: > > ...} where the ... can express the desire for simulcast. > > Actually this is the API part I like the least. While we did this for > constraints, the result is not so pretty. I'd prefer to just add a > dictionary member called "sendLayers". > > If "send" is modifiable in the transceiver (as I think it should be), this also allows us to prepare a > transceiver for simulcast without turning on the spigot at first > negotiation. > That's a good idea. Let's change it to: dictionary RTCRtpTransceiverInit { // .... the rest as-is sequence<RTCRtpEncodingParameters> sendEncodings; } > Syntax seems fine, except that I don't know what it means; it is > strictly spatial resolution differences, or is it a bandwidth target > that can be hit by any combination of spatial and temporal shenanigans? > > At the f2f we were calling this "resolutionScale". Let's change it to that to be more clear: dictionary RTCRtpEncodingParameters { // ... the rest as-is double resolutionScale; unsigned long rsid; // RTP Source Stream ID } Now are example would be: pc.addTransceiver("video", {send: true, sendEncodings: [{resolutionScale: 1.0}, {resolutionScale: 2.0}, {resolutionScale: 4.0}]}); > > > 2. It uses a subset of the SDP from MMUSIC in the offer and answer. > > 3. It gives JS some control over each layer: .active, .maxBandwidth, > > .scale. > > 4. The additions to the API and to the SDP are simple. > > > > > > > > Here's the WebIDL: > > > > dictionary RTCRtpTransceiverInit { > > (boolean or RTCRtpParameters) send; > > // .. the rest as-is > > } > > > > dictionary RTCRtpEncodingParameters { > > double scale; // Resolution scale > > unsigned long rsid; // RTP Source Stream ID > > // ... the rest as-is > > } > > > > And here's the *subset* of the SDP from MMUSIC we could use in the offer > > (obviously subject to change based on the results of the interim): > > > > m=video ... > > ... > > a=rsid send 1 > > a=rsid send 2 > > a=rsid send 3 > > a=simulcast rsids=1,2,3 > > > > > > And here's the *subset* of the SDP from MMUSIC we could use in the > answer: > > m=video ... > > ... > > a=rsid recv 1 > > a=rsid recv 2 > > a=rsid recv 3 > > a=simulcast rsids=1,2,3 > > > > > > That's it. That's all I think we need: a simple addition to > > addTransceiver plus a simple subset of the SDP from MMUSIC. > > > > > > The last thing I would note is that I propose we *do not* use the > > entirety of the MMUSIC draft in WebRTC. In particular, not the PT > > overloading or the more extensive attributes that don't map well to > > RTCRtpEncodingParameters (max-width, max-height, max-fps, max-fs, > max-pps). > > > > > > > > > > >
Received on Friday, 9 October 2015 15:31:42 UTC