- From: Peter Thatcher <pthatcher@google.com>
- Date: Fri, 1 May 2015 16:24:51 -0700
- To: Jan-Ivar Bruaroey <jib@mozilla.com>
- Cc: "Cullen Jennings (fluffy)" <fluffy@cisco.com>, "public-webrtc@w3.org" <public-webrtc@w3.org>
- Message-ID: <CAJrXDUH8-BTw2s-S5QGoWjUe2QiD9TU-_xRoHKZx+WaowDHikg@mail.gmail.com>
On Fri, May 1, 2015 at 2:29 PM, Jan-Ivar Bruaroey <jib@mozilla.com> wrote:
> On 5/1/15 4:00 PM, Peter Thatcher wrote:
>
> I think making all the parameters of RtpParameters into attributes of
> RtpSender is a terrible idea. Every time a change to parameters is made,
> it's basically telling the RtpSender "stop what you're currently sending,
> and send something different",
>
>
> This wont happen in my model, if you follow what I wrote.
>
> For example, look at the RtpParameters in ORTC:
>
> dictionary RTCRtpParameters {
> DOMString muxId = "";
> sequence<
>
> RTCRtpCodecParameters> codecs;
> sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
> sequence<RTCRtpEncodingParameters> encodings;
> RTCRtcpParameters rtcp;
> };
>
> If the JS wants to change both the codecs and headerExtensions, it
> doesn't want to do:
>
> sender.parameters.codecs = newCodecs;
> sender.parameters.headerExtensions = newHeaderExtensions;
>
>
> First off, I'm proposing:
>
> sender.codecs = newCodecs;
> sender.headerExtensions = newHeaderExtensions;
>
> neater.
>
> Because in between those two lines, you'll end up in a weird state
> where you are sending the new codecs but the old header extensions.
>
>
> No, not in the model I'm proposing. Internally:
>
> RtpSender.codecsSetter would set this.codec = arg, and call
> this._updateNeeded().
> RtpSender.headxSetter would set this.headx = arg, and call
> this._updateNeeded().
>
> where this._updateNeeded = function() {
> this._uNRequested || Promise.resolve(() => (this._uNRequested = false,
> this._update()));
> this._uNRequested = true;
> };
>
> where this._update() = function() {
> this._actualCodec = this._codec;
> this._actualHeadx = this._headx;
> // etc.
> this._makeItSo(); // where this._actualCodec and this._actualHeadx
> matter.
> };
>
That all seems so much more complex than just one method that means
"change what I'm sending".
>
>
> And, worse, what if you setup something invalid on the header
> extensions, and it throws an exception? Now you're doing half old and half
> new. And as you expand it from 2 different settings like this to 5
> different things, it gets even more problematic.
>
>
> Provided the JS catches the exception then there is no problem, if it is
> uncaught then what you get need only be deterministic imho.
>
> But the problems don't end ther
> e, because the objects are more than one level deep. Imagine the JS does
> this:
>
> var first = sender.parameters.codecs.splice(0, 1);
> sender.parameters.codecs.push(first);
>
>
> Now there's an intermediate state where the codec is missing.
>
> And what if there were only one codec in the list to begin with? Does
> the sender stop sending in the intermediate state?
>
>
> Not a problem in the model above.
>
> And I could come up with a lot more examples. The point is that there
> will be intermediate sender states for every little operation the JS does,
> and reasoning about those states is too complex. It's much easier to have
> one atomic operation done via setParameters.
>
>
> Not a problem in the model above.
>
> This is deterministic, and attributes reflect what's been set in the
> current task for values set in the current task, and actual values for
> values not set in the current task.
>
> A little more work on the implementation, but simpler for the JS writer.
>
> .: Jan-Ivar :.
>
>
Received on Friday, 1 May 2015 23:25:59 UTC