[Opalvoip-user] Issues with RTCP XR (RFC 3611 Extended Report)?
Brought to you by:
csoutheren,
rjongbloed
From: Greg S. <opa...@st...> - 2014-02-19 15:19:43
|
<html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> </head> <body bgcolor="#FFFFFF" text="#000000"> I've been experimenting with the RFC 3611 RTCP XR (Extended Report) in the opal library, module metrics.h/cxx<br> <br> It doesn't seem to produce correct results for me, so just checking if anyone else has had any experiences positive or negative with this bit of code. I'm concerned about a couple of things:<br> <br> 1) The equipment/codec degradation method does not appear to actually do a proper calculation on sumIe. The calculation below does not aggregate across all the periods -- it only uses the last period in the iePeriods list, while sumDuration does aggregate all the durations of the periods. Thus, the Ie degradation factor will tend to 0, which is what I see in the RTCP reports, despite the fact I'm applying a constant 10% packet loss -- the rFactor starts off low, as it should, then it climbs up to 94, which means perfect audio, which it is NOT with 10% packet loss.<br> <br> <font face="Courier New, Courier, monospace">float RTCP_XR_Metrics::GetPonderateIe()<br> {<br> float ponderateIe = 0;<br> float sumIe = 0;<br> PUInt64 sumDuration = 0;<br> DWORD count = 0;<br> <br> /* Account for the current time and Ie value */<br> PTime now;<br> ponderateIe = Ieff(m_currentPeriodType) * (now - m_periodBeginTimestamp).GetMilliSeconds();<br> sumDuration = sumDuration + (now - m_periodBeginTimestamp).GetMilliSeconds();<br> count++;<br> <br> /* Iterate over the list of periods to calculate an average Ie */<br> for (list<IePeriod>::iterator period = m_iePeriods.begin(); period != m_iePeriods.end(); period++) {<br> sumIe = (*period).Ieff * (*period).duration.GetMilliSeconds();<br> sumDuration = sumDuration + (*period).duration.GetMilliSeconds();<br> count++;<br> }<br> <br> if (count != 0 && sumDuration != 0) {<br> ponderateIe = sumIe/sumDuration;<br> }<br> return ponderateIe;<br> }</font><br> <br> 2) Unbounded collection of periods over time. Method RTCP_XR_Metrics::createIePeriod() always performs an m_iePeriods.push_back() operation on each new Ie period. Thus, the std::list of Ie periods grows without bound, resulting in an ever increasing amount of CPU spent on each RTCP message processing these growing lists of periods...memory also grows. Seems like this should be doing pop_front() operations after reaching a certain number of intervals, so that the rFactor calculation stays relevant to recent history of the session, not trying to calculate an rFactor over the entire life of the session, which would not be useful.<br> <br> Am I just missing something? I know that Ekiga uses the Opal libraries, but I've observed that Ekiga does not do XR blocks in its RTCP packets.<br> <br> Thanks!<br> </body> </html> |