Please, see comments inline, labeled [HL].<div><br></div><div>Sincerely,</div><div>/Henrik</div><div><br><br><div class="gmail_quote">On Mon, Nov 7, 2011 at 2:58 AM, Wesley Eddy <span dir="ltr"><<a href="mailto:wes@mti-systems.com">wes@mti-systems.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">On 11/1/2011 10:34 AM, Lars Eggert wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This may be of interest to the RG:<br>
<a href="http://wiki.tools.ietf.org/html/draft-alvestrand-rtcweb-congestion-01" target="_blank">http://wiki.tools.ietf.org/<u></u>html/draft-alvestrand-rtcweb-<u></u>congestion-01</a><br>
<br>
</blockquote>
<br>
<br>
Here are my comments on this (also copied to the authors and the<br>
mailing list for RTCWEB congestion control):<br>
<br>
(1)<br>
I think the model tries to correct for some effects later, but this<br>
part only makes sense if all frames are the same size, and none of<br>
the timestamps are subject to jitter being introduced by OS scheduling,<br>
MAC layer (e.g. wireless) issues, etc:<br>
"""<br>
   We define the (relative) inter-arrival time, d(i) as<br>
<br>
     d(i) = t(i)-t(i-1)-(T(i)-T(i-1))<br>
"""<br></blockquote><div><span style="background-color: transparent; ">[HL] This is not a model, it's a definition of a measure at the receiver side. You can always calculate d(i) for each received frame, regardless of its size, or the sources of delay that it has seen along the way.</span></div>
<div><span style="background-color: transparent; "><br></span></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
(2)<br>
<br>
This part doesn't quite make sense to me, but I think it's just in<br>
the wording and not in the math:<br>
"""<br>
   Since the time ts to send a frame of size L over a path with a<br>
   capacity of C is<br>
<br>
     ts = L/C<br>
<br>
<br>
   we can model the inter-arrival time as<br>
<br>
              L(i)-L(i-1)<br>
     d(i) = -------------- + w(i) = dL(i)/C+w(i)<br>
                  C<br>
"""<br>
That's not a model of the inter-arrival time, it's a model of the<br>
difference between the delta timestamps and delta reception times<br>
based on difference in packet length.<br></blockquote><div><span style="background-color: transparent; ">[HL] That is true.</span></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
<br>
(3)<br>
In the definition of w(i), do you also intend to account for other<br>
sources of delays in the end systems' software?  Why do we think that<br>
white noise is the right model?  This seems like a big assumption,<br>
unless there's actually data that shows it holds under a very wide<br>
range of settings.<br></blockquote><div><span style="background-color: transparent; ">[HL] I'm quite sure that additive Gaussian white noise it *not* the right model.</span> However, as usual in signal processing, <span style="background-color: transparent; ">there are two reasons to make the AWGN assumption: (1) we do not know any better model, and (2) it results in </span><span style="background-color: transparent; ">tractable </span><span style="background-color: transparent; ">formulas</span><span style="background-color: transparent; ">. Formally, you would have to re-derive the Kalman filter equations based on a new noise assumption. </span><span style="background-color: transparent; ">If we are not in the business of re-deriving the Kalman filter, the assumption has no practical meaning, since we'll apply </span><span style="background-color: transparent; ">the same filter equations anyway.</span></div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
(4)<br>
It should probably be understood clearly that the i values are sample<br>
numbers, but that the generation of samples comes from the behavior of<br>
the plant, and they aren't taken at the filter/controller regularly.<br>
This seems to be quite different than when the document says:<br>
"""<br>
   In this document we make the assumption that the rate control<br>
   subsystem is executed periodically and that this period is constant.<br>
"""<br></blockquote><div><span style="background-color: transparent; ">[HL] </span>The filter is updated with each incoming sample (frame), and the timing is governed by the pace at which they arrive at the receiver. The quite refers to the rate control part of the receive-side algorithm, which makes use of the output from the filter and the over-use detector. This rate control can still be executed on a steady clock, in particular during the periods when "all is clear" and the rate control will slowly increase the rate.</div>
<div><span style="background-color: transparent; ">  </span></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
(5)<br>
The algorithm at the receiver side is clueless about packet losses,<br>
and seems like it would see them only when the loss period ends (when<br>
a packet survives) and then would see them as really long inter-arrival<br>
times rather than losses?  (or did I miss something really important?)<br></blockquote><div><span style="background-color: transparent; ">[HL] Yes, you cannot detect a packet loss until you see the gap in between two other packets. (Not even then you can be sure it's a loss; it may be a re-ordering.) If a frame is lost, the Kalman filter will be updated with the inter-arrival time and timestamp delta between the frames that actually did arrive. In that respect, the filter does not discriminate between losses and frames willfully dropped by the sender before encoding.</span></div>
<div><span style="background-color: transparent; "><br></span></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
<br>
(6)<br>
The rules about 2% and 10% in the sender-side algorithm seem ... odd.<br>
Unless the report interval is sufficiently long in relation to the frame<br>
rate, the percentages may not work well.  These parameters have to be<br>
balanced, or the algorithm will be fragile.<br></blockquote><div><span style="background-color: transparent; ">[HL] Quite likely, yes.</span> </div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
(7)<br>
Shouldn't the sender estimate of available bandwidth be able to go lower<br>
than the TFRC equation output if the delay has been increasing (though<br>
packets are not yet being lost)?<br></blockquote><div>[HL] "In words: The sender-side estimate will never be larger than the receiver-side estimate, and will never be lower than the estimate from the TFRC formula.<span style="background-color: transparent; ">" I see now that this wording is *wrong*. It should say something like:</span></div>
<div><span style="background-color: transparent; ">"</span><span style="background-color: transparent; ">The sender-side estimate will never be larger than the </span><span style="background-color: transparent; ">receiver-side estimate. A reduction of the sender-side estimate triggered by loss and RTT reports will never result in an estimate lower than that from the TFRC formula." We expect the receiver-side to be much faster in response time -- simply because it is delay sensing, and not loss sensing as the sender-side -- and therefore the receive-side estimate will limit the send-side estimate in most cases. The send-side can be seen as a slave in that case. The send-side estimate is mostly there to provide a fall-back option in the case of no feedback from the receiver.</span></div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
(8)<br>
Startup is a big topic that isn't yet addressed.</blockquote><div>[HL] Yes, it is, but I'm not sure it should be stipulated in this document. The application will probably have a lot to say about this. For instance, it can know something about previous calls, and it can also implement some kind of pre-probing algorithm.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
<br>
<br>
-- <br>
Wes Eddy<br>
MTI Systems<br>
______________________________<u></u>_________________<br>
Rtp-congestion mailing list<br>
<a href="mailto:Rtp-congestion@alvestrand.no" target="_blank">Rtp-congestion@alvestrand.no</a><br>
<a href="http://www.alvestrand.no/mailman/listinfo/rtp-congestion" target="_blank">http://www.alvestrand.no/<u></u>mailman/listinfo/rtp-<u></u>congestion</a><br>
</font></span></blockquote></div><br></div>