• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
12 
13 #include <assert.h>
14 #include <string.h>
15 
16 #include <algorithm>
17 
18 #include "webrtc/base/checks.h"
19 #include "webrtc/base/logging.h"
20 #include "webrtc/base/trace_event.h"
21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
23 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
24 
25 namespace webrtc {
26 using RTCPHelp::RTCPPacketInformation;
27 using RTCPHelp::RTCPReceiveInformation;
28 using RTCPHelp::RTCPReportBlockInformation;
29 using RTCPUtility::kBtVoipMetric;
30 using RTCPUtility::RTCPCnameInformation;
31 using RTCPUtility::RTCPPacketReportBlockItem;
32 using RTCPUtility::RTCPPacketTypes;
33 
34 // The number of RTCP time intervals needed to trigger a timeout.
35 const int kRrTimeoutIntervals = 3;
36 
37 const int64_t kMaxWarningLogIntervalMs = 10000;
38 
RTCPReceiver(Clock * clock,bool receiver_only,RtcpPacketTypeCounterObserver * packet_type_counter_observer,RtcpBandwidthObserver * rtcp_bandwidth_observer,RtcpIntraFrameObserver * rtcp_intra_frame_observer,TransportFeedbackObserver * transport_feedback_observer,ModuleRtpRtcpImpl * owner)39 RTCPReceiver::RTCPReceiver(
40     Clock* clock,
41     bool receiver_only,
42     RtcpPacketTypeCounterObserver* packet_type_counter_observer,
43     RtcpBandwidthObserver* rtcp_bandwidth_observer,
44     RtcpIntraFrameObserver* rtcp_intra_frame_observer,
45     TransportFeedbackObserver* transport_feedback_observer,
46     ModuleRtpRtcpImpl* owner)
47     : TMMBRHelp(),
48       _clock(clock),
49       receiver_only_(receiver_only),
50       _method(RtcpMode::kOff),
51       _lastReceived(0),
52       _rtpRtcp(*owner),
53       _criticalSectionFeedbacks(
54           CriticalSectionWrapper::CreateCriticalSection()),
55       _cbRtcpBandwidthObserver(rtcp_bandwidth_observer),
56       _cbRtcpIntraFrameObserver(rtcp_intra_frame_observer),
57       _cbTransportFeedbackObserver(transport_feedback_observer),
58       _criticalSectionRTCPReceiver(
59           CriticalSectionWrapper::CreateCriticalSection()),
60       main_ssrc_(0),
61       _remoteSSRC(0),
62       _remoteSenderInfo(),
63       _lastReceivedSRNTPsecs(0),
64       _lastReceivedSRNTPfrac(0),
65       _lastReceivedXRNTPsecs(0),
66       _lastReceivedXRNTPfrac(0),
67       xr_rr_rtt_ms_(0),
68       _receivedInfoMap(),
69       _packetTimeOutMS(0),
70       _lastReceivedRrMs(0),
71       _lastIncreasedSequenceNumberMs(0),
72       stats_callback_(NULL),
73       packet_type_counter_observer_(packet_type_counter_observer),
74       num_skipped_packets_(0),
75       last_skipped_packets_warning_(clock->TimeInMilliseconds()) {
76   memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo));
77 }
78 
~RTCPReceiver()79 RTCPReceiver::~RTCPReceiver() {
80   delete _criticalSectionRTCPReceiver;
81   delete _criticalSectionFeedbacks;
82 
83   ReportBlockMap::iterator it = _receivedReportBlockMap.begin();
84   for (; it != _receivedReportBlockMap.end(); ++it) {
85     ReportBlockInfoMap* info_map = &(it->second);
86     while (!info_map->empty()) {
87       ReportBlockInfoMap::iterator it_info = info_map->begin();
88       delete it_info->second;
89       info_map->erase(it_info);
90     }
91   }
92   while (!_receivedInfoMap.empty()) {
93     std::map<uint32_t, RTCPReceiveInformation*>::iterator first =
94         _receivedInfoMap.begin();
95     delete first->second;
96     _receivedInfoMap.erase(first);
97   }
98   while (!_receivedCnameMap.empty()) {
99     std::map<uint32_t, RTCPCnameInformation*>::iterator first =
100         _receivedCnameMap.begin();
101     delete first->second;
102     _receivedCnameMap.erase(first);
103   }
104 }
105 
Status() const106 RtcpMode RTCPReceiver::Status() const {
107   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
108   return _method;
109 }
110 
SetRTCPStatus(RtcpMode method)111 void RTCPReceiver::SetRTCPStatus(RtcpMode method) {
112   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
113   _method = method;
114 }
115 
LastReceived()116 int64_t RTCPReceiver::LastReceived() {
117   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
118   return _lastReceived;
119 }
120 
LastReceivedReceiverReport() const121 int64_t RTCPReceiver::LastReceivedReceiverReport() const {
122   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
123   int64_t last_received_rr = -1;
124   for (ReceivedInfoMap::const_iterator it = _receivedInfoMap.begin();
125        it != _receivedInfoMap.end(); ++it) {
126     if (it->second->lastTimeReceived > last_received_rr) {
127       last_received_rr = it->second->lastTimeReceived;
128     }
129   }
130   return last_received_rr;
131 }
132 
SetRemoteSSRC(uint32_t ssrc)133 void RTCPReceiver::SetRemoteSSRC(uint32_t ssrc) {
134   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
135 
136   // new SSRC reset old reports
137   memset(&_remoteSenderInfo, 0, sizeof(_remoteSenderInfo));
138   _lastReceivedSRNTPsecs = 0;
139   _lastReceivedSRNTPfrac = 0;
140 
141   _remoteSSRC = ssrc;
142 }
143 
RemoteSSRC() const144 uint32_t RTCPReceiver::RemoteSSRC() const {
145   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
146   return _remoteSSRC;
147 }
148 
SetSsrcs(uint32_t main_ssrc,const std::set<uint32_t> & registered_ssrcs)149 void RTCPReceiver::SetSsrcs(uint32_t main_ssrc,
150                             const std::set<uint32_t>& registered_ssrcs) {
151   uint32_t old_ssrc = 0;
152   {
153     CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
154     old_ssrc = main_ssrc_;
155     main_ssrc_ = main_ssrc;
156     registered_ssrcs_ = registered_ssrcs;
157   }
158   {
159     if (_cbRtcpIntraFrameObserver && old_ssrc != main_ssrc) {
160       _cbRtcpIntraFrameObserver->OnLocalSsrcChanged(old_ssrc, main_ssrc);
161     }
162   }
163 }
164 
RTT(uint32_t remoteSSRC,int64_t * RTT,int64_t * avgRTT,int64_t * minRTT,int64_t * maxRTT) const165 int32_t RTCPReceiver::RTT(uint32_t remoteSSRC,
166                           int64_t* RTT,
167                           int64_t* avgRTT,
168                           int64_t* minRTT,
169                           int64_t* maxRTT) const {
170   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
171 
172   RTCPReportBlockInformation* reportBlock =
173       GetReportBlockInformation(remoteSSRC, main_ssrc_);
174 
175   if (reportBlock == NULL) {
176     return -1;
177   }
178   if (RTT) {
179     *RTT = reportBlock->RTT;
180   }
181   if (avgRTT) {
182     *avgRTT = reportBlock->avgRTT;
183   }
184   if (minRTT) {
185     *minRTT = reportBlock->minRTT;
186   }
187   if (maxRTT) {
188     *maxRTT = reportBlock->maxRTT;
189   }
190   return 0;
191 }
192 
GetAndResetXrRrRtt(int64_t * rtt_ms)193 bool RTCPReceiver::GetAndResetXrRrRtt(int64_t* rtt_ms) {
194   assert(rtt_ms);
195   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
196   if (xr_rr_rtt_ms_ == 0) {
197     return false;
198   }
199   *rtt_ms = xr_rr_rtt_ms_;
200   xr_rr_rtt_ms_ = 0;
201   return true;
202 }
203 
204 // TODO(pbos): Make this fail when we haven't received NTP.
NTP(uint32_t * ReceivedNTPsecs,uint32_t * ReceivedNTPfrac,uint32_t * RTCPArrivalTimeSecs,uint32_t * RTCPArrivalTimeFrac,uint32_t * rtcp_timestamp) const205 bool RTCPReceiver::NTP(uint32_t* ReceivedNTPsecs,
206                        uint32_t* ReceivedNTPfrac,
207                        uint32_t* RTCPArrivalTimeSecs,
208                        uint32_t* RTCPArrivalTimeFrac,
209                        uint32_t* rtcp_timestamp) const
210 {
211     CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
212     if(ReceivedNTPsecs)
213     {
214         *ReceivedNTPsecs = _remoteSenderInfo.NTPseconds; // NTP from incoming SendReport
215     }
216     if(ReceivedNTPfrac)
217     {
218         *ReceivedNTPfrac = _remoteSenderInfo.NTPfraction;
219     }
220     if(RTCPArrivalTimeFrac)
221     {
222         *RTCPArrivalTimeFrac = _lastReceivedSRNTPfrac; // local NTP time when we received a RTCP packet with a send block
223     }
224     if(RTCPArrivalTimeSecs)
225     {
226         *RTCPArrivalTimeSecs = _lastReceivedSRNTPsecs;
227     }
228     if (rtcp_timestamp) {
229       *rtcp_timestamp = _remoteSenderInfo.RTPtimeStamp;
230     }
231     return true;
232 }
233 
LastReceivedXrReferenceTimeInfo(RtcpReceiveTimeInfo * info) const234 bool RTCPReceiver::LastReceivedXrReferenceTimeInfo(
235     RtcpReceiveTimeInfo* info) const {
236   assert(info);
237   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
238   if (_lastReceivedXRNTPsecs == 0 && _lastReceivedXRNTPfrac == 0) {
239     return false;
240   }
241 
242   info->sourceSSRC = _remoteXRReceiveTimeInfo.sourceSSRC;
243   info->lastRR = _remoteXRReceiveTimeInfo.lastRR;
244 
245   // Get the delay since last received report (RFC 3611).
246   uint32_t receive_time = RTCPUtility::MidNtp(_lastReceivedXRNTPsecs,
247                                               _lastReceivedXRNTPfrac);
248 
249   uint32_t ntp_sec = 0;
250   uint32_t ntp_frac = 0;
251   _clock->CurrentNtp(ntp_sec, ntp_frac);
252   uint32_t now = RTCPUtility::MidNtp(ntp_sec, ntp_frac);
253 
254   info->delaySinceLastRR = now - receive_time;
255   return true;
256 }
257 
SenderInfoReceived(RTCPSenderInfo * senderInfo) const258 int32_t RTCPReceiver::SenderInfoReceived(RTCPSenderInfo* senderInfo) const {
259   assert(senderInfo);
260   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
261   if (_lastReceivedSRNTPsecs == 0) {
262     return -1;
263   }
264   memcpy(senderInfo, &(_remoteSenderInfo), sizeof(RTCPSenderInfo));
265   return 0;
266 }
267 
268 // statistics
269 // we can get multiple receive reports when we receive the report from a CE
StatisticsReceived(std::vector<RTCPReportBlock> * receiveBlocks) const270 int32_t RTCPReceiver::StatisticsReceived(
271     std::vector<RTCPReportBlock>* receiveBlocks) const {
272   assert(receiveBlocks);
273   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
274   ReportBlockMap::const_iterator it = _receivedReportBlockMap.begin();
275   for (; it != _receivedReportBlockMap.end(); ++it) {
276     const ReportBlockInfoMap* info_map = &(it->second);
277     ReportBlockInfoMap::const_iterator it_info = info_map->begin();
278     for (; it_info != info_map->end(); ++it_info) {
279       receiveBlocks->push_back(it_info->second->remoteReceiveBlock);
280     }
281   }
282   return 0;
283 }
284 
285 int32_t
IncomingRTCPPacket(RTCPPacketInformation & rtcpPacketInformation,RTCPUtility::RTCPParserV2 * rtcpParser)286 RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation,
287                                  RTCPUtility::RTCPParserV2* rtcpParser)
288 {
289     CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
290 
291     _lastReceived = _clock->TimeInMilliseconds();
292 
293     if (packet_type_counter_.first_packet_time_ms == -1) {
294       packet_type_counter_.first_packet_time_ms = _lastReceived;
295     }
296 
297     RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin();
298     while (pktType != RTCPPacketTypes::kInvalid) {
299         // Each "case" is responsible for iterate the parser to the
300         // next top level packet.
301         switch (pktType)
302         {
303           case RTCPPacketTypes::kSr:
304           case RTCPPacketTypes::kRr:
305             HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation);
306             break;
307           case RTCPPacketTypes::kSdes:
308             HandleSDES(*rtcpParser, rtcpPacketInformation);
309             break;
310           case RTCPPacketTypes::kXrHeader:
311             HandleXrHeader(*rtcpParser, rtcpPacketInformation);
312             break;
313           case RTCPPacketTypes::kXrReceiverReferenceTime:
314             HandleXrReceiveReferenceTime(*rtcpParser, rtcpPacketInformation);
315             break;
316           case RTCPPacketTypes::kXrDlrrReportBlock:
317             HandleXrDlrrReportBlock(*rtcpParser, rtcpPacketInformation);
318             break;
319           case RTCPPacketTypes::kXrVoipMetric:
320             HandleXRVOIPMetric(*rtcpParser, rtcpPacketInformation);
321             break;
322           case RTCPPacketTypes::kBye:
323             HandleBYE(*rtcpParser);
324             break;
325           case RTCPPacketTypes::kRtpfbNack:
326             HandleNACK(*rtcpParser, rtcpPacketInformation);
327             break;
328           case RTCPPacketTypes::kRtpfbTmmbr:
329             HandleTMMBR(*rtcpParser, rtcpPacketInformation);
330             break;
331           case RTCPPacketTypes::kRtpfbTmmbn:
332             HandleTMMBN(*rtcpParser, rtcpPacketInformation);
333             break;
334           case RTCPPacketTypes::kRtpfbSrReq:
335             HandleSR_REQ(*rtcpParser, rtcpPacketInformation);
336             break;
337           case RTCPPacketTypes::kPsfbPli:
338             HandlePLI(*rtcpParser, rtcpPacketInformation);
339             break;
340           case RTCPPacketTypes::kPsfbSli:
341             HandleSLI(*rtcpParser, rtcpPacketInformation);
342             break;
343           case RTCPPacketTypes::kPsfbRpsi:
344             HandleRPSI(*rtcpParser, rtcpPacketInformation);
345             break;
346           case RTCPPacketTypes::kExtendedIj:
347             HandleIJ(*rtcpParser, rtcpPacketInformation);
348             break;
349           case RTCPPacketTypes::kPsfbFir:
350             HandleFIR(*rtcpParser, rtcpPacketInformation);
351             break;
352           case RTCPPacketTypes::kPsfbApp:
353             HandlePsfbApp(*rtcpParser, rtcpPacketInformation);
354             break;
355           case RTCPPacketTypes::kApp:
356             // generic application messages
357             HandleAPP(*rtcpParser, rtcpPacketInformation);
358             break;
359           case RTCPPacketTypes::kAppItem:
360             // generic application messages
361             HandleAPPItem(*rtcpParser, rtcpPacketInformation);
362             break;
363           case RTCPPacketTypes::kTransportFeedback:
364             HandleTransportFeedback(rtcpParser, &rtcpPacketInformation);
365             break;
366         default:
367             rtcpParser->Iterate();
368             break;
369         }
370         pktType = rtcpParser->PacketType();
371     }
372 
373     if (packet_type_counter_observer_ != NULL) {
374       packet_type_counter_observer_->RtcpPacketTypesCounterUpdated(
375           main_ssrc_, packet_type_counter_);
376     }
377 
378     num_skipped_packets_ += rtcpParser->NumSkippedBlocks();
379 
380     int64_t now = _clock->TimeInMilliseconds();
381     if (now - last_skipped_packets_warning_ >= kMaxWarningLogIntervalMs &&
382         num_skipped_packets_ > 0) {
383       last_skipped_packets_warning_ = now;
384       LOG(LS_WARNING)
385           << num_skipped_packets_
386           << " RTCP blocks were skipped due to being malformed or of "
387              "unrecognized/unsupported type, during the past "
388           << (kMaxWarningLogIntervalMs / 1000) << " second period.";
389     }
390 
391     return 0;
392 }
393 
394 void
HandleSenderReceiverReport(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)395 RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
396                                          RTCPPacketInformation& rtcpPacketInformation)
397 {
398     RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType();
399     const RTCPUtility::RTCPPacket& rtcpPacket   = rtcpParser.Packet();
400 
401     assert((rtcpPacketType == RTCPPacketTypes::kRr) ||
402            (rtcpPacketType == RTCPPacketTypes::kSr));
403 
404     // SR.SenderSSRC
405     // The synchronization source identifier for the originator of this SR packet
406 
407     // rtcpPacket.RR.SenderSSRC
408     // The source of the packet sender, same as of SR? or is this a CE?
409 
410     const uint32_t remoteSSRC = (rtcpPacketType == RTCPPacketTypes::kRr)
411                                     ? rtcpPacket.RR.SenderSSRC
412                                     : rtcpPacket.SR.SenderSSRC;
413 
414     rtcpPacketInformation.remoteSSRC = remoteSSRC;
415 
416     RTCPReceiveInformation* ptrReceiveInfo = CreateReceiveInformation(remoteSSRC);
417     if (!ptrReceiveInfo)
418     {
419         rtcpParser.Iterate();
420         return;
421     }
422 
423     if (rtcpPacketType == RTCPPacketTypes::kSr) {
424       TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR",
425                            "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_);
426 
427         if (_remoteSSRC == remoteSSRC) // have I received RTP packets from this party
428         {
429             // only signal that we have received a SR when we accept one
430             rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSr;
431 
432             rtcpPacketInformation.ntp_secs = rtcpPacket.SR.NTPMostSignificant;
433             rtcpPacketInformation.ntp_frac = rtcpPacket.SR.NTPLeastSignificant;
434             rtcpPacketInformation.rtp_timestamp = rtcpPacket.SR.RTPTimestamp;
435 
436             // We will only store the send report from one source, but
437             // we will store all the receive block
438 
439             // Save the NTP time of this report
440             _remoteSenderInfo.NTPseconds = rtcpPacket.SR.NTPMostSignificant;
441             _remoteSenderInfo.NTPfraction = rtcpPacket.SR.NTPLeastSignificant;
442             _remoteSenderInfo.RTPtimeStamp = rtcpPacket.SR.RTPTimestamp;
443             _remoteSenderInfo.sendPacketCount = rtcpPacket.SR.SenderPacketCount;
444             _remoteSenderInfo.sendOctetCount = rtcpPacket.SR.SenderOctetCount;
445 
446             _clock->CurrentNtp(_lastReceivedSRNTPsecs, _lastReceivedSRNTPfrac);
447         }
448         else
449         {
450             rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
451         }
452     } else
453     {
454       TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR",
455                            "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_);
456 
457         rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
458     }
459     UpdateReceiveInformation(*ptrReceiveInfo);
460 
461     rtcpPacketType = rtcpParser.Iterate();
462 
463     while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) {
464         HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC);
465         rtcpPacketType = rtcpParser.Iterate();
466     }
467 }
468 
HandleReportBlock(const RTCPUtility::RTCPPacket & rtcpPacket,RTCPPacketInformation & rtcpPacketInformation,uint32_t remoteSSRC)469 void RTCPReceiver::HandleReportBlock(
470     const RTCPUtility::RTCPPacket& rtcpPacket,
471     RTCPPacketInformation& rtcpPacketInformation,
472     uint32_t remoteSSRC)
473     EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) {
474   // This will be called once per report block in the RTCP packet.
475   // We filter out all report blocks that are not for us.
476   // Each packet has max 31 RR blocks.
477   //
478   // We can calc RTT if we send a send report and get a report block back.
479 
480   // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to
481   // which the information in this reception report block pertains.
482 
483   // Filter out all report blocks that are not for us.
484   if (registered_ssrcs_.find(rtcpPacket.ReportBlockItem.SSRC) ==
485       registered_ssrcs_.end()) {
486     // This block is not for us ignore it.
487     return;
488   }
489 
490   // To avoid problem with acquiring _criticalSectionRTCPSender while holding
491   // _criticalSectionRTCPReceiver.
492   _criticalSectionRTCPReceiver->Leave();
493   int64_t sendTimeMS =
494       _rtpRtcp.SendTimeOfSendReport(rtcpPacket.ReportBlockItem.LastSR);
495   _criticalSectionRTCPReceiver->Enter();
496 
497   RTCPReportBlockInformation* reportBlock =
498       CreateOrGetReportBlockInformation(remoteSSRC,
499                                         rtcpPacket.ReportBlockItem.SSRC);
500   if (reportBlock == NULL) {
501     LOG(LS_WARNING) << "Failed to CreateReportBlockInformation("
502                     << remoteSSRC << ")";
503     return;
504   }
505 
506   _lastReceivedRrMs = _clock->TimeInMilliseconds();
507   const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem;
508   reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC;
509   reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC;
510   reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost;
511   reportBlock->remoteReceiveBlock.cumulativeLost =
512       rb.CumulativeNumOfPacketsLost;
513   if (rb.ExtendedHighestSequenceNumber >
514       reportBlock->remoteReceiveBlock.extendedHighSeqNum) {
515     // We have successfully delivered new RTP packets to the remote side after
516     // the last RR was sent from the remote side.
517     _lastIncreasedSequenceNumberMs = _lastReceivedRrMs;
518   }
519   reportBlock->remoteReceiveBlock.extendedHighSeqNum =
520       rb.ExtendedHighestSequenceNumber;
521   reportBlock->remoteReceiveBlock.jitter = rb.Jitter;
522   reportBlock->remoteReceiveBlock.delaySinceLastSR = rb.DelayLastSR;
523   reportBlock->remoteReceiveBlock.lastSR = rb.LastSR;
524 
525   if (rtcpPacket.ReportBlockItem.Jitter > reportBlock->remoteMaxJitter) {
526     reportBlock->remoteMaxJitter = rtcpPacket.ReportBlockItem.Jitter;
527   }
528 
529   uint32_t delaySinceLastSendReport =
530       rtcpPacket.ReportBlockItem.DelayLastSR;
531 
532   // local NTP time when we received this
533   uint32_t lastReceivedRRNTPsecs = 0;
534   uint32_t lastReceivedRRNTPfrac = 0;
535 
536   _clock->CurrentNtp(lastReceivedRRNTPsecs, lastReceivedRRNTPfrac);
537 
538   // time when we received this in MS
539   int64_t receiveTimeMS = Clock::NtpToMs(lastReceivedRRNTPsecs,
540                                          lastReceivedRRNTPfrac);
541 
542   // Estimate RTT
543   uint32_t d = (delaySinceLastSendReport & 0x0000ffff) * 1000;
544   d /= 65536;
545   d += ((delaySinceLastSendReport & 0xffff0000) >> 16) * 1000;
546 
547   int64_t RTT = 0;
548 
549   if (sendTimeMS > 0) {
550     RTT = receiveTimeMS - d - sendTimeMS;
551     if (RTT <= 0) {
552       RTT = 1;
553     }
554     if (RTT > reportBlock->maxRTT) {
555       // store max RTT
556       reportBlock->maxRTT = RTT;
557     }
558     if (reportBlock->minRTT == 0) {
559       // first RTT
560       reportBlock->minRTT = RTT;
561     } else if (RTT < reportBlock->minRTT) {
562       // Store min RTT
563       reportBlock->minRTT = RTT;
564     }
565     // store last RTT
566     reportBlock->RTT = RTT;
567 
568     // store average RTT
569     if (reportBlock->numAverageCalcs != 0) {
570       float ac = static_cast<float>(reportBlock->numAverageCalcs);
571       float newAverage =
572           ((ac / (ac + 1)) * reportBlock->avgRTT) + ((1 / (ac + 1)) * RTT);
573       reportBlock->avgRTT = static_cast<int64_t>(newAverage + 0.5f);
574     } else {
575       // first RTT
576       reportBlock->avgRTT = RTT;
577     }
578     reportBlock->numAverageCalcs++;
579   }
580 
581   TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT", rb.SSRC,
582                     RTT);
583 
584   rtcpPacketInformation.AddReportInfo(*reportBlock);
585 }
586 
CreateOrGetReportBlockInformation(uint32_t remote_ssrc,uint32_t source_ssrc)587 RTCPReportBlockInformation* RTCPReceiver::CreateOrGetReportBlockInformation(
588     uint32_t remote_ssrc,
589     uint32_t source_ssrc) {
590   RTCPReportBlockInformation* info =
591       GetReportBlockInformation(remote_ssrc, source_ssrc);
592   if (info == NULL) {
593     info = new RTCPReportBlockInformation;
594     _receivedReportBlockMap[source_ssrc][remote_ssrc] = info;
595   }
596   return info;
597 }
598 
GetReportBlockInformation(uint32_t remote_ssrc,uint32_t source_ssrc) const599 RTCPReportBlockInformation* RTCPReceiver::GetReportBlockInformation(
600     uint32_t remote_ssrc,
601     uint32_t source_ssrc) const {
602   ReportBlockMap::const_iterator it = _receivedReportBlockMap.find(source_ssrc);
603   if (it == _receivedReportBlockMap.end()) {
604     return NULL;
605   }
606   const ReportBlockInfoMap* info_map = &(it->second);
607   ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc);
608   if (it_info == info_map->end()) {
609     return NULL;
610   }
611   return it_info->second;
612 }
613 
614 RTCPCnameInformation*
CreateCnameInformation(uint32_t remoteSSRC)615 RTCPReceiver::CreateCnameInformation(uint32_t remoteSSRC) {
616   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
617 
618   std::map<uint32_t, RTCPCnameInformation*>::iterator it =
619       _receivedCnameMap.find(remoteSSRC);
620 
621   if (it != _receivedCnameMap.end()) {
622     return it->second;
623   }
624   RTCPCnameInformation* cnameInfo = new RTCPCnameInformation;
625   memset(cnameInfo->name, 0, RTCP_CNAME_SIZE);
626   _receivedCnameMap[remoteSSRC] = cnameInfo;
627   return cnameInfo;
628 }
629 
630 RTCPCnameInformation*
GetCnameInformation(uint32_t remoteSSRC) const631 RTCPReceiver::GetCnameInformation(uint32_t remoteSSRC) const {
632   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
633 
634   std::map<uint32_t, RTCPCnameInformation*>::const_iterator it =
635       _receivedCnameMap.find(remoteSSRC);
636 
637   if (it == _receivedCnameMap.end()) {
638     return NULL;
639   }
640   return it->second;
641 }
642 
643 RTCPReceiveInformation*
CreateReceiveInformation(uint32_t remoteSSRC)644 RTCPReceiver::CreateReceiveInformation(uint32_t remoteSSRC) {
645   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
646 
647   std::map<uint32_t, RTCPReceiveInformation*>::iterator it =
648       _receivedInfoMap.find(remoteSSRC);
649 
650   if (it != _receivedInfoMap.end()) {
651     return it->second;
652   }
653   RTCPReceiveInformation* receiveInfo = new RTCPReceiveInformation;
654   _receivedInfoMap[remoteSSRC] = receiveInfo;
655   return receiveInfo;
656 }
657 
658 RTCPReceiveInformation*
GetReceiveInformation(uint32_t remoteSSRC)659 RTCPReceiver::GetReceiveInformation(uint32_t remoteSSRC) {
660   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
661 
662   std::map<uint32_t, RTCPReceiveInformation*>::iterator it =
663       _receivedInfoMap.find(remoteSSRC);
664   if (it == _receivedInfoMap.end()) {
665     return NULL;
666   }
667   return it->second;
668 }
669 
UpdateReceiveInformation(RTCPReceiveInformation & receiveInformation)670 void RTCPReceiver::UpdateReceiveInformation(
671     RTCPReceiveInformation& receiveInformation) {
672   // Update that this remote is alive
673   receiveInformation.lastTimeReceived = _clock->TimeInMilliseconds();
674 }
675 
RtcpRrTimeout(int64_t rtcp_interval_ms)676 bool RTCPReceiver::RtcpRrTimeout(int64_t rtcp_interval_ms) {
677   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
678   if (_lastReceivedRrMs == 0)
679     return false;
680 
681   int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms;
682   if (_clock->TimeInMilliseconds() > _lastReceivedRrMs + time_out_ms) {
683     // Reset the timer to only trigger one log.
684     _lastReceivedRrMs = 0;
685     return true;
686   }
687   return false;
688 }
689 
RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms)690 bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) {
691   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
692   if (_lastIncreasedSequenceNumberMs == 0)
693     return false;
694 
695   int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms;
696   if (_clock->TimeInMilliseconds() > _lastIncreasedSequenceNumberMs +
697       time_out_ms) {
698     // Reset the timer to only trigger one log.
699     _lastIncreasedSequenceNumberMs = 0;
700     return true;
701   }
702   return false;
703 }
704 
UpdateRTCPReceiveInformationTimers()705 bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() {
706   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
707 
708   bool updateBoundingSet = false;
709   int64_t timeNow = _clock->TimeInMilliseconds();
710 
711   std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt =
712       _receivedInfoMap.begin();
713 
714   while (receiveInfoIt != _receivedInfoMap.end()) {
715     RTCPReceiveInformation* receiveInfo = receiveInfoIt->second;
716     if (receiveInfo == NULL) {
717       return updateBoundingSet;
718     }
719     // time since last received rtcp packet
720     // when we dont have a lastTimeReceived and the object is marked
721     // readyForDelete it's removed from the map
722     if (receiveInfo->lastTimeReceived) {
723       /// use audio define since we don't know what interval the remote peer is
724       // using
725       if ((timeNow - receiveInfo->lastTimeReceived) >
726           5 * RTCP_INTERVAL_AUDIO_MS) {
727         // no rtcp packet for the last five regular intervals, reset limitations
728         receiveInfo->TmmbrSet.clearSet();
729         // prevent that we call this over and over again
730         receiveInfo->lastTimeReceived = 0;
731         // send new TMMBN to all channels using the default codec
732         updateBoundingSet = true;
733       }
734       receiveInfoIt++;
735     } else if (receiveInfo->readyForDelete) {
736       // store our current receiveInfoItem
737       std::map<uint32_t, RTCPReceiveInformation*>::iterator
738       receiveInfoItemToBeErased = receiveInfoIt;
739       receiveInfoIt++;
740       delete receiveInfoItemToBeErased->second;
741       _receivedInfoMap.erase(receiveInfoItemToBeErased);
742     } else {
743       receiveInfoIt++;
744     }
745   }
746   return updateBoundingSet;
747 }
748 
BoundingSet(bool * tmmbrOwner,TMMBRSet * boundingSetRec)749 int32_t RTCPReceiver::BoundingSet(bool* tmmbrOwner, TMMBRSet* boundingSetRec) {
750   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
751 
752   std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt =
753       _receivedInfoMap.find(_remoteSSRC);
754 
755   if (receiveInfoIt == _receivedInfoMap.end()) {
756     return -1;
757   }
758   RTCPReceiveInformation* receiveInfo = receiveInfoIt->second;
759   if (receiveInfo == NULL) {
760     return -1;
761   }
762   if (receiveInfo->TmmbnBoundingSet.lengthOfSet() > 0) {
763     boundingSetRec->VerifyAndAllocateSet(
764         receiveInfo->TmmbnBoundingSet.lengthOfSet() + 1);
765     for(uint32_t i=0; i< receiveInfo->TmmbnBoundingSet.lengthOfSet();
766         i++) {
767       if(receiveInfo->TmmbnBoundingSet.Ssrc(i) == main_ssrc_) {
768         // owner of bounding set
769         *tmmbrOwner = true;
770       }
771       boundingSetRec->SetEntry(i,
772                                receiveInfo->TmmbnBoundingSet.Tmmbr(i),
773                                receiveInfo->TmmbnBoundingSet.PacketOH(i),
774                                receiveInfo->TmmbnBoundingSet.Ssrc(i));
775     }
776   }
777   return receiveInfo->TmmbnBoundingSet.lengthOfSet();
778 }
779 
HandleSDES(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)780 void RTCPReceiver::HandleSDES(RTCPUtility::RTCPParserV2& rtcpParser,
781                               RTCPPacketInformation& rtcpPacketInformation) {
782   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
783   while (pktType == RTCPPacketTypes::kSdesChunk) {
784     HandleSDESChunk(rtcpParser);
785     pktType = rtcpParser.Iterate();
786   }
787   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSdes;
788 }
789 
HandleSDESChunk(RTCPUtility::RTCPParserV2 & rtcpParser)790 void RTCPReceiver::HandleSDESChunk(RTCPUtility::RTCPParserV2& rtcpParser) {
791   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
792   RTCPCnameInformation* cnameInfo =
793       CreateCnameInformation(rtcpPacket.CName.SenderSSRC);
794   assert(cnameInfo);
795 
796   cnameInfo->name[RTCP_CNAME_SIZE - 1] = 0;
797   strncpy(cnameInfo->name, rtcpPacket.CName.CName, RTCP_CNAME_SIZE - 1);
798   {
799     CriticalSectionScoped lock(_criticalSectionFeedbacks);
800     if (stats_callback_ != NULL) {
801       stats_callback_->CNameChanged(rtcpPacket.CName.CName,
802                                     rtcpPacket.CName.SenderSSRC);
803     }
804   }
805 }
806 
HandleNACK(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)807 void RTCPReceiver::HandleNACK(RTCPUtility::RTCPParserV2& rtcpParser,
808                               RTCPPacketInformation& rtcpPacketInformation) {
809   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
810   if (receiver_only_ || main_ssrc_ != rtcpPacket.NACK.MediaSSRC) {
811     // Not to us.
812     rtcpParser.Iterate();
813     return;
814   }
815   rtcpPacketInformation.ResetNACKPacketIdArray();
816 
817   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
818   while (pktType == RTCPPacketTypes::kRtpfbNackItem) {
819     HandleNACKItem(rtcpPacket, rtcpPacketInformation);
820     pktType = rtcpParser.Iterate();
821   }
822 
823   if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) {
824     ++packet_type_counter_.nack_packets;
825     packet_type_counter_.nack_requests = nack_stats_.requests();
826     packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests();
827   }
828 }
829 
830 void
HandleNACKItem(const RTCPUtility::RTCPPacket & rtcpPacket,RTCPPacketInformation & rtcpPacketInformation)831 RTCPReceiver::HandleNACKItem(const RTCPUtility::RTCPPacket& rtcpPacket,
832                              RTCPPacketInformation& rtcpPacketInformation) {
833   rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID);
834   nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID);
835 
836   uint16_t bitMask = rtcpPacket.NACKItem.BitMask;
837   if (bitMask) {
838     for (int i=1; i <= 16; ++i) {
839       if (bitMask & 0x01) {
840         rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID + i);
841         nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID + i);
842       }
843       bitMask = bitMask >>1;
844     }
845   }
846   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpNack;
847 }
848 
HandleBYE(RTCPUtility::RTCPParserV2 & rtcpParser)849 void RTCPReceiver::HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) {
850   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
851 
852   // clear our lists
853   ReportBlockMap::iterator it = _receivedReportBlockMap.begin();
854   for (; it != _receivedReportBlockMap.end(); ++it) {
855     ReportBlockInfoMap* info_map = &(it->second);
856     ReportBlockInfoMap::iterator it_info = info_map->find(
857         rtcpPacket.BYE.SenderSSRC);
858     if (it_info != info_map->end()) {
859       delete it_info->second;
860       info_map->erase(it_info);
861     }
862   }
863 
864   //  we can't delete it due to TMMBR
865   std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt =
866       _receivedInfoMap.find(rtcpPacket.BYE.SenderSSRC);
867 
868   if (receiveInfoIt != _receivedInfoMap.end()) {
869     receiveInfoIt->second->readyForDelete = true;
870   }
871 
872   std::map<uint32_t, RTCPCnameInformation*>::iterator cnameInfoIt =
873       _receivedCnameMap.find(rtcpPacket.BYE.SenderSSRC);
874 
875   if (cnameInfoIt != _receivedCnameMap.end()) {
876     delete cnameInfoIt->second;
877     _receivedCnameMap.erase(cnameInfoIt);
878   }
879   xr_rr_rtt_ms_ = 0;
880   rtcpParser.Iterate();
881 }
882 
HandleXrHeader(RTCPUtility::RTCPParserV2 & parser,RTCPPacketInformation & rtcpPacketInformation)883 void RTCPReceiver::HandleXrHeader(
884     RTCPUtility::RTCPParserV2& parser,
885     RTCPPacketInformation& rtcpPacketInformation) {
886   const RTCPUtility::RTCPPacket& packet = parser.Packet();
887 
888   rtcpPacketInformation.xr_originator_ssrc = packet.XR.OriginatorSSRC;
889 
890   parser.Iterate();
891 }
892 
HandleXrReceiveReferenceTime(RTCPUtility::RTCPParserV2 & parser,RTCPPacketInformation & rtcpPacketInformation)893 void RTCPReceiver::HandleXrReceiveReferenceTime(
894     RTCPUtility::RTCPParserV2& parser,
895     RTCPPacketInformation& rtcpPacketInformation) {
896   const RTCPUtility::RTCPPacket& packet = parser.Packet();
897 
898   _remoteXRReceiveTimeInfo.sourceSSRC =
899       rtcpPacketInformation.xr_originator_ssrc;
900 
901   _remoteXRReceiveTimeInfo.lastRR = RTCPUtility::MidNtp(
902       packet.XRReceiverReferenceTimeItem.NTPMostSignificant,
903       packet.XRReceiverReferenceTimeItem.NTPLeastSignificant);
904 
905   _clock->CurrentNtp(_lastReceivedXRNTPsecs, _lastReceivedXRNTPfrac);
906 
907   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrReceiverReferenceTime;
908 
909   parser.Iterate();
910 }
911 
HandleXrDlrrReportBlock(RTCPUtility::RTCPParserV2 & parser,RTCPPacketInformation & rtcpPacketInformation)912 void RTCPReceiver::HandleXrDlrrReportBlock(
913     RTCPUtility::RTCPParserV2& parser,
914     RTCPPacketInformation& rtcpPacketInformation) {
915   const RTCPUtility::RTCPPacket& packet = parser.Packet();
916   // Iterate through sub-block(s), if any.
917   RTCPUtility::RTCPPacketTypes packet_type = parser.Iterate();
918 
919   while (packet_type == RTCPPacketTypes::kXrDlrrReportBlockItem) {
920     HandleXrDlrrReportBlockItem(packet, rtcpPacketInformation);
921     packet_type = parser.Iterate();
922   }
923 }
924 
HandleXrDlrrReportBlockItem(const RTCPUtility::RTCPPacket & packet,RTCPPacketInformation & rtcpPacketInformation)925 void RTCPReceiver::HandleXrDlrrReportBlockItem(
926     const RTCPUtility::RTCPPacket& packet,
927     RTCPPacketInformation& rtcpPacketInformation)
928     EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) {
929   if (registered_ssrcs_.find(packet.XRDLRRReportBlockItem.SSRC) ==
930       registered_ssrcs_.end()) {
931     // Not to us.
932     return;
933   }
934 
935   rtcpPacketInformation.xr_dlrr_item = true;
936 
937   // To avoid problem with acquiring _criticalSectionRTCPSender while holding
938   // _criticalSectionRTCPReceiver.
939   _criticalSectionRTCPReceiver->Leave();
940 
941   int64_t send_time_ms;
942   bool found = _rtpRtcp.SendTimeOfXrRrReport(
943       packet.XRDLRRReportBlockItem.LastRR, &send_time_ms);
944 
945   _criticalSectionRTCPReceiver->Enter();
946 
947   if (!found) {
948     return;
949   }
950 
951   // The DelayLastRR field is in units of 1/65536 sec.
952   uint32_t delay_rr_ms =
953       (((packet.XRDLRRReportBlockItem.DelayLastRR & 0x0000ffff) * 1000) >> 16) +
954       (((packet.XRDLRRReportBlockItem.DelayLastRR & 0xffff0000) >> 16) * 1000);
955 
956   int64_t rtt = _clock->CurrentNtpInMilliseconds() - delay_rr_ms - send_time_ms;
957 
958   xr_rr_rtt_ms_ = std::max<int64_t>(rtt, 1);
959 
960   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock;
961 }
962 
963 void
HandleXRVOIPMetric(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)964 RTCPReceiver::HandleXRVOIPMetric(RTCPUtility::RTCPParserV2& rtcpParser,
965                                  RTCPPacketInformation& rtcpPacketInformation)
966 {
967     const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
968 
969     if(rtcpPacket.XRVOIPMetricItem.SSRC == main_ssrc_)
970     {
971         // Store VoIP metrics block if it's about me
972         // from OriginatorSSRC do we filter it?
973         // rtcpPacket.XR.OriginatorSSRC;
974 
975         RTCPVoIPMetric receivedVoIPMetrics;
976         receivedVoIPMetrics.burstDensity = rtcpPacket.XRVOIPMetricItem.burstDensity;
977         receivedVoIPMetrics.burstDuration = rtcpPacket.XRVOIPMetricItem.burstDuration;
978         receivedVoIPMetrics.discardRate = rtcpPacket.XRVOIPMetricItem.discardRate;
979         receivedVoIPMetrics.endSystemDelay = rtcpPacket.XRVOIPMetricItem.endSystemDelay;
980         receivedVoIPMetrics.extRfactor = rtcpPacket.XRVOIPMetricItem.extRfactor;
981         receivedVoIPMetrics.gapDensity = rtcpPacket.XRVOIPMetricItem.gapDensity;
982         receivedVoIPMetrics.gapDuration = rtcpPacket.XRVOIPMetricItem.gapDuration;
983         receivedVoIPMetrics.Gmin = rtcpPacket.XRVOIPMetricItem.Gmin;
984         receivedVoIPMetrics.JBabsMax = rtcpPacket.XRVOIPMetricItem.JBabsMax;
985         receivedVoIPMetrics.JBmax = rtcpPacket.XRVOIPMetricItem.JBmax;
986         receivedVoIPMetrics.JBnominal = rtcpPacket.XRVOIPMetricItem.JBnominal;
987         receivedVoIPMetrics.lossRate = rtcpPacket.XRVOIPMetricItem.lossRate;
988         receivedVoIPMetrics.MOSCQ = rtcpPacket.XRVOIPMetricItem.MOSCQ;
989         receivedVoIPMetrics.MOSLQ = rtcpPacket.XRVOIPMetricItem.MOSLQ;
990         receivedVoIPMetrics.noiseLevel = rtcpPacket.XRVOIPMetricItem.noiseLevel;
991         receivedVoIPMetrics.RERL = rtcpPacket.XRVOIPMetricItem.RERL;
992         receivedVoIPMetrics.Rfactor = rtcpPacket.XRVOIPMetricItem.Rfactor;
993         receivedVoIPMetrics.roundTripDelay = rtcpPacket.XRVOIPMetricItem.roundTripDelay;
994         receivedVoIPMetrics.RXconfig = rtcpPacket.XRVOIPMetricItem.RXconfig;
995         receivedVoIPMetrics.signalLevel = rtcpPacket.XRVOIPMetricItem.signalLevel;
996 
997         rtcpPacketInformation.AddVoIPMetric(&receivedVoIPMetrics);
998 
999         rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrVoipMetric; // received signal
1000     }
1001     rtcpParser.Iterate();
1002 }
1003 
HandlePLI(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1004 void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser,
1005                              RTCPPacketInformation& rtcpPacketInformation) {
1006   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1007   if (main_ssrc_ == rtcpPacket.PLI.MediaSSRC) {
1008     TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI");
1009 
1010     ++packet_type_counter_.pli_packets;
1011     // Received a signal that we need to send a new key frame.
1012     rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpPli;
1013   }
1014   rtcpParser.Iterate();
1015 }
1016 
HandleTMMBR(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1017 void RTCPReceiver::HandleTMMBR(RTCPUtility::RTCPParserV2& rtcpParser,
1018                                RTCPPacketInformation& rtcpPacketInformation) {
1019   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1020 
1021   uint32_t senderSSRC = rtcpPacket.TMMBR.SenderSSRC;
1022   RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(senderSSRC);
1023   if (ptrReceiveInfo == NULL) {
1024     // This remote SSRC must be saved before.
1025     rtcpParser.Iterate();
1026     return;
1027   }
1028   if (rtcpPacket.TMMBR.MediaSSRC) {
1029     // rtcpPacket.TMMBR.MediaSSRC SHOULD be 0 if same as SenderSSRC
1030     // in relay mode this is a valid number
1031     senderSSRC = rtcpPacket.TMMBR.MediaSSRC;
1032   }
1033 
1034   // Use packet length to calc max number of TMMBR blocks
1035   // each TMMBR block is 8 bytes
1036   ptrdiff_t maxNumOfTMMBRBlocks = rtcpParser.LengthLeft() / 8;
1037 
1038   // sanity, we can't have more than what's in one packet
1039   if (maxNumOfTMMBRBlocks > 200) {
1040     assert(false);
1041     rtcpParser.Iterate();
1042     return;
1043   }
1044   ptrReceiveInfo->VerifyAndAllocateTMMBRSet((uint32_t)maxNumOfTMMBRBlocks);
1045 
1046   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1047   while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) {
1048     HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, senderSSRC);
1049     pktType = rtcpParser.Iterate();
1050   }
1051 }
1052 
HandleTMMBRItem(RTCPReceiveInformation & receiveInfo,const RTCPUtility::RTCPPacket & rtcpPacket,RTCPPacketInformation & rtcpPacketInformation,uint32_t senderSSRC)1053 void RTCPReceiver::HandleTMMBRItem(RTCPReceiveInformation& receiveInfo,
1054                                    const RTCPUtility::RTCPPacket& rtcpPacket,
1055                                    RTCPPacketInformation& rtcpPacketInformation,
1056                                    uint32_t senderSSRC) {
1057   if (main_ssrc_ == rtcpPacket.TMMBRItem.SSRC &&
1058       rtcpPacket.TMMBRItem.MaxTotalMediaBitRate > 0) {
1059     receiveInfo.InsertTMMBRItem(senderSSRC, rtcpPacket.TMMBRItem,
1060                                 _clock->TimeInMilliseconds());
1061     rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbr;
1062   }
1063 }
1064 
HandleTMMBN(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1065 void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser,
1066                                RTCPPacketInformation& rtcpPacketInformation) {
1067   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1068   RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(
1069       rtcpPacket.TMMBN.SenderSSRC);
1070   if (ptrReceiveInfo == NULL) {
1071     // This remote SSRC must be saved before.
1072     rtcpParser.Iterate();
1073     return;
1074   }
1075   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbn;
1076   // Use packet length to calc max number of TMMBN blocks
1077   // each TMMBN block is 8 bytes
1078   ptrdiff_t maxNumOfTMMBNBlocks = rtcpParser.LengthLeft() / 8;
1079 
1080   // sanity, we cant have more than what's in one packet
1081   if (maxNumOfTMMBNBlocks > 200) {
1082     assert(false);
1083     rtcpParser.Iterate();
1084     return;
1085   }
1086 
1087   ptrReceiveInfo->VerifyAndAllocateBoundingSet((uint32_t)maxNumOfTMMBNBlocks);
1088 
1089   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1090   while (pktType == RTCPPacketTypes::kRtpfbTmmbnItem) {
1091     HandleTMMBNItem(*ptrReceiveInfo, rtcpPacket);
1092     pktType = rtcpParser.Iterate();
1093   }
1094 }
1095 
HandleSR_REQ(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1096 void RTCPReceiver::HandleSR_REQ(RTCPUtility::RTCPParserV2& rtcpParser,
1097                                 RTCPPacketInformation& rtcpPacketInformation) {
1098   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSrReq;
1099   rtcpParser.Iterate();
1100 }
1101 
HandleTMMBNItem(RTCPReceiveInformation & receiveInfo,const RTCPUtility::RTCPPacket & rtcpPacket)1102 void RTCPReceiver::HandleTMMBNItem(RTCPReceiveInformation& receiveInfo,
1103                                    const RTCPUtility::RTCPPacket& rtcpPacket) {
1104   receiveInfo.TmmbnBoundingSet.AddEntry(
1105       rtcpPacket.TMMBNItem.MaxTotalMediaBitRate,
1106       rtcpPacket.TMMBNItem.MeasuredOverhead,
1107       rtcpPacket.TMMBNItem.SSRC);
1108 }
1109 
HandleSLI(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1110 void RTCPReceiver::HandleSLI(RTCPUtility::RTCPParserV2& rtcpParser,
1111                              RTCPPacketInformation& rtcpPacketInformation) {
1112   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1113   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1114   while (pktType == RTCPPacketTypes::kPsfbSliItem) {
1115     HandleSLIItem(rtcpPacket, rtcpPacketInformation);
1116     pktType = rtcpParser.Iterate();
1117   }
1118 }
1119 
HandleSLIItem(const RTCPUtility::RTCPPacket & rtcpPacket,RTCPPacketInformation & rtcpPacketInformation)1120 void RTCPReceiver::HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket,
1121                                  RTCPPacketInformation& rtcpPacketInformation) {
1122   // in theory there could be multiple slices lost
1123   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSli; // received signal that we need to refresh a slice
1124   rtcpPacketInformation.sliPictureId = rtcpPacket.SLIItem.PictureId;
1125 }
1126 
1127 void
HandleRPSI(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPHelp::RTCPPacketInformation & rtcpPacketInformation)1128 RTCPReceiver::HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser,
1129                          RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
1130 {
1131     const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1132     RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1133     if (pktType == RTCPPacketTypes::kPsfbRpsi) {
1134         rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRpsi; // received signal that we have a confirmed reference picture
1135         if(rtcpPacket.RPSI.NumberOfValidBits%8 != 0)
1136         {
1137             // to us unknown
1138             // continue
1139             rtcpParser.Iterate();
1140             return;
1141         }
1142         rtcpPacketInformation.rpsiPictureId = 0;
1143 
1144         // convert NativeBitString to rpsiPictureId
1145         uint8_t numberOfBytes = rtcpPacket.RPSI.NumberOfValidBits /8;
1146         for(uint8_t n = 0; n < (numberOfBytes-1); n++)
1147         {
1148             rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitString[n] & 0x7f);
1149             rtcpPacketInformation.rpsiPictureId <<= 7; // prepare next
1150         }
1151         rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitString[numberOfBytes-1] & 0x7f);
1152     }
1153 }
1154 
HandlePsfbApp(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1155 void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser,
1156                                  RTCPPacketInformation& rtcpPacketInformation) {
1157   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1158   if (pktType == RTCPPacketTypes::kPsfbRemb) {
1159     pktType = rtcpParser.Iterate();
1160     if (pktType == RTCPPacketTypes::kPsfbRembItem) {
1161       HandleREMBItem(rtcpParser, rtcpPacketInformation);
1162       rtcpParser.Iterate();
1163     }
1164   }
1165 }
1166 
HandleIJ(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1167 void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser,
1168                             RTCPPacketInformation& rtcpPacketInformation) {
1169   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1170 
1171   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1172   while (pktType == RTCPPacketTypes::kExtendedIjItem) {
1173     HandleIJItem(rtcpPacket, rtcpPacketInformation);
1174     pktType = rtcpParser.Iterate();
1175   }
1176 }
1177 
HandleIJItem(const RTCPUtility::RTCPPacket & rtcpPacket,RTCPPacketInformation & rtcpPacketInformation)1178 void RTCPReceiver::HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket,
1179                                 RTCPPacketInformation& rtcpPacketInformation) {
1180   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset;
1181   rtcpPacketInformation.interArrivalJitter =
1182   rtcpPacket.ExtendedJitterReportItem.Jitter;
1183 }
1184 
HandleREMBItem(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1185 void RTCPReceiver::HandleREMBItem(
1186     RTCPUtility::RTCPParserV2& rtcpParser,
1187     RTCPPacketInformation& rtcpPacketInformation) {
1188   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1189   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb;
1190   rtcpPacketInformation.receiverEstimatedMaxBitrate =
1191       rtcpPacket.REMBItem.BitRate;
1192 }
1193 
HandleFIR(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1194 void RTCPReceiver::HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser,
1195                              RTCPPacketInformation& rtcpPacketInformation) {
1196   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1197   RTCPReceiveInformation* ptrReceiveInfo =
1198       GetReceiveInformation(rtcpPacket.FIR.SenderSSRC);
1199 
1200   RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1201   while (pktType == RTCPPacketTypes::kPsfbFirItem) {
1202     HandleFIRItem(ptrReceiveInfo, rtcpPacket, rtcpPacketInformation);
1203     pktType = rtcpParser.Iterate();
1204   }
1205 }
1206 
HandleFIRItem(RTCPReceiveInformation * receiveInfo,const RTCPUtility::RTCPPacket & rtcpPacket,RTCPPacketInformation & rtcpPacketInformation)1207 void RTCPReceiver::HandleFIRItem(RTCPReceiveInformation* receiveInfo,
1208                                  const RTCPUtility::RTCPPacket& rtcpPacket,
1209                                  RTCPPacketInformation& rtcpPacketInformation) {
1210   // Is it our sender that is requested to generate a new keyframe
1211   if (main_ssrc_ != rtcpPacket.FIRItem.SSRC) {
1212     return;
1213   }
1214 
1215   ++packet_type_counter_.fir_packets;
1216 
1217   // rtcpPacket.FIR.MediaSSRC SHOULD be 0 but we ignore to check it
1218   // we don't know who this originate from
1219   if (receiveInfo) {
1220     // check if we have reported this FIRSequenceNumber before
1221     if (rtcpPacket.FIRItem.CommandSequenceNumber !=
1222         receiveInfo->lastFIRSequenceNumber) {
1223       int64_t now = _clock->TimeInMilliseconds();
1224       // sanity; don't go crazy with the callbacks
1225       if ((now - receiveInfo->lastFIRRequest) > RTCP_MIN_FRAME_LENGTH_MS) {
1226         receiveInfo->lastFIRRequest = now;
1227         receiveInfo->lastFIRSequenceNumber =
1228             rtcpPacket.FIRItem.CommandSequenceNumber;
1229         // received signal that we need to send a new key frame
1230         rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpFir;
1231       }
1232     }
1233   } else {
1234     // received signal that we need to send a new key frame
1235     rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpFir;
1236   }
1237 }
1238 
HandleAPP(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1239 void RTCPReceiver::HandleAPP(RTCPUtility::RTCPParserV2& rtcpParser,
1240                              RTCPPacketInformation& rtcpPacketInformation) {
1241   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1242 
1243   rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpApp;
1244   rtcpPacketInformation.applicationSubType = rtcpPacket.APP.SubType;
1245   rtcpPacketInformation.applicationName = rtcpPacket.APP.Name;
1246 
1247   rtcpParser.Iterate();
1248 }
1249 
HandleAPPItem(RTCPUtility::RTCPParserV2 & rtcpParser,RTCPPacketInformation & rtcpPacketInformation)1250 void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser,
1251                                  RTCPPacketInformation& rtcpPacketInformation) {
1252   const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1253 
1254   rtcpPacketInformation.AddApplicationData(rtcpPacket.APP.Data, rtcpPacket.APP.Size);
1255 
1256   rtcpParser.Iterate();
1257 }
1258 
HandleTransportFeedback(RTCPUtility::RTCPParserV2 * rtcp_parser,RTCPHelp::RTCPPacketInformation * rtcp_packet_information)1259 void RTCPReceiver::HandleTransportFeedback(
1260     RTCPUtility::RTCPParserV2* rtcp_parser,
1261     RTCPHelp::RTCPPacketInformation* rtcp_packet_information) {
1262   rtcp::RtcpPacket* packet = rtcp_parser->ReleaseRtcpPacket();
1263   RTC_DCHECK(packet != nullptr);
1264   rtcp_packet_information->rtcpPacketTypeFlags |= kRtcpTransportFeedback;
1265   rtcp_packet_information->transport_feedback_.reset(
1266       static_cast<rtcp::TransportFeedback*>(packet));
1267 
1268   rtcp_parser->Iterate();
1269 }
UpdateTMMBR()1270 int32_t RTCPReceiver::UpdateTMMBR() {
1271   int32_t numBoundingSet = 0;
1272   uint32_t bitrate = 0;
1273   uint32_t accNumCandidates = 0;
1274 
1275   int32_t size = TMMBRReceived(0, 0, NULL);
1276   if (size > 0) {
1277     TMMBRSet* candidateSet = VerifyAndAllocateCandidateSet(size);
1278     // Get candidate set from receiver.
1279     accNumCandidates = TMMBRReceived(size, accNumCandidates, candidateSet);
1280   } else {
1281     // Candidate set empty.
1282     VerifyAndAllocateCandidateSet(0);  // resets candidate set
1283   }
1284   // Find bounding set
1285   TMMBRSet* boundingSet = NULL;
1286   numBoundingSet = FindTMMBRBoundingSet(boundingSet);
1287   if (numBoundingSet == -1) {
1288     LOG(LS_WARNING) << "Failed to find TMMBR bounding set.";
1289     return -1;
1290   }
1291   // Set bounding set
1292   // Inform remote clients about the new bandwidth
1293   // inform the remote client
1294   _rtpRtcp.SetTMMBN(boundingSet);
1295 
1296   // might trigger a TMMBN
1297   if (numBoundingSet == 0) {
1298     // owner of max bitrate request has timed out
1299     // empty bounding set has been sent
1300     return 0;
1301   }
1302   // Get net bitrate from bounding set depending on sent packet rate
1303   if (CalcMinBitRate(&bitrate)) {
1304     // we have a new bandwidth estimate on this channel
1305     if (_cbRtcpBandwidthObserver) {
1306         _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate(bitrate * 1000);
1307     }
1308   }
1309   return 0;
1310 }
1311 
RegisterRtcpStatisticsCallback(RtcpStatisticsCallback * callback)1312 void RTCPReceiver::RegisterRtcpStatisticsCallback(
1313     RtcpStatisticsCallback* callback) {
1314   CriticalSectionScoped cs(_criticalSectionFeedbacks);
1315   stats_callback_ = callback;
1316 }
1317 
GetRtcpStatisticsCallback()1318 RtcpStatisticsCallback* RTCPReceiver::GetRtcpStatisticsCallback() {
1319   CriticalSectionScoped cs(_criticalSectionFeedbacks);
1320   return stats_callback_;
1321 }
1322 
1323 // Holding no Critical section
TriggerCallbacksFromRTCPPacket(RTCPPacketInformation & rtcpPacketInformation)1324 void RTCPReceiver::TriggerCallbacksFromRTCPPacket(
1325     RTCPPacketInformation& rtcpPacketInformation) {
1326   // Process TMMBR and REMB first to avoid multiple callbacks
1327   // to OnNetworkChanged.
1328   if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTmmbr) {
1329     // Might trigger a OnReceivedBandwidthEstimateUpdate.
1330     UpdateTMMBR();
1331   }
1332   uint32_t local_ssrc;
1333   std::set<uint32_t> registered_ssrcs;
1334   {
1335     // We don't want to hold this critsect when triggering the callbacks below.
1336     CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
1337     local_ssrc = main_ssrc_;
1338     registered_ssrcs = registered_ssrcs_;
1339   }
1340   if (!receiver_only_ &&
1341       (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) {
1342     _rtpRtcp.OnRequestSendReport();
1343   }
1344   if (!receiver_only_ &&
1345       (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) {
1346     if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) {
1347       LOG(LS_VERBOSE) << "Incoming NACK length: "
1348                    << rtcpPacketInformation.nackSequenceNumbers.size();
1349       _rtpRtcp.OnReceivedNACK(rtcpPacketInformation.nackSequenceNumbers);
1350     }
1351   }
1352   {
1353     // We need feedback that we have received a report block(s) so that we
1354     // can generate a new packet in a conference relay scenario, one received
1355     // report can generate several RTCP packets, based on number relayed/mixed
1356     // a send report block should go out to all receivers.
1357     if (_cbRtcpIntraFrameObserver) {
1358       RTC_DCHECK(!receiver_only_);
1359       if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpPli) ||
1360           (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpFir)) {
1361         if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpPli) {
1362           LOG(LS_VERBOSE) << "Incoming PLI from SSRC "
1363                           << rtcpPacketInformation.remoteSSRC;
1364         } else {
1365           LOG(LS_VERBOSE) << "Incoming FIR from SSRC "
1366                           << rtcpPacketInformation.remoteSSRC;
1367         }
1368         _cbRtcpIntraFrameObserver->OnReceivedIntraFrameRequest(local_ssrc);
1369       }
1370       if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSli) {
1371         _cbRtcpIntraFrameObserver->OnReceivedSLI(
1372             local_ssrc, rtcpPacketInformation.sliPictureId);
1373       }
1374       if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRpsi) {
1375         _cbRtcpIntraFrameObserver->OnReceivedRPSI(
1376             local_ssrc, rtcpPacketInformation.rpsiPictureId);
1377       }
1378     }
1379     if (_cbRtcpBandwidthObserver) {
1380       RTC_DCHECK(!receiver_only_);
1381       if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRemb) {
1382         LOG(LS_VERBOSE) << "Incoming REMB: "
1383                         << rtcpPacketInformation.receiverEstimatedMaxBitrate;
1384         _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate(
1385             rtcpPacketInformation.receiverEstimatedMaxBitrate);
1386       }
1387       if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) ||
1388           (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) {
1389         int64_t now = _clock->TimeInMilliseconds();
1390         _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport(
1391             rtcpPacketInformation.report_blocks,
1392             rtcpPacketInformation.rtt,
1393             now);
1394       }
1395     }
1396     if (_cbTransportFeedbackObserver &&
1397         (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) {
1398       uint32_t media_source_ssrc =
1399           rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc();
1400       if (media_source_ssrc == local_ssrc ||
1401           registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) {
1402         _cbTransportFeedbackObserver->OnTransportFeedback(
1403             *rtcpPacketInformation.transport_feedback_.get());
1404       }
1405     }
1406   }
1407 
1408   if (!receiver_only_) {
1409     CriticalSectionScoped cs(_criticalSectionFeedbacks);
1410     if (stats_callback_) {
1411       for (ReportBlockList::const_iterator it =
1412           rtcpPacketInformation.report_blocks.begin();
1413           it != rtcpPacketInformation.report_blocks.end();
1414           ++it) {
1415         RtcpStatistics stats;
1416         stats.cumulative_lost = it->cumulativeLost;
1417         stats.extended_max_sequence_number = it->extendedHighSeqNum;
1418         stats.fraction_lost = it->fractionLost;
1419         stats.jitter = it->jitter;
1420 
1421         stats_callback_->StatisticsUpdated(stats, it->sourceSSRC);
1422       }
1423     }
1424   }
1425 }
1426 
CNAME(uint32_t remoteSSRC,char cName[RTCP_CNAME_SIZE]) const1427 int32_t RTCPReceiver::CNAME(uint32_t remoteSSRC,
1428                             char cName[RTCP_CNAME_SIZE]) const {
1429   assert(cName);
1430 
1431   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
1432   RTCPCnameInformation* cnameInfo = GetCnameInformation(remoteSSRC);
1433   if (cnameInfo == NULL) {
1434     return -1;
1435   }
1436   cName[RTCP_CNAME_SIZE - 1] = 0;
1437   strncpy(cName, cnameInfo->name, RTCP_CNAME_SIZE - 1);
1438   return 0;
1439 }
1440 
1441 // no callbacks allowed inside this function
TMMBRReceived(uint32_t size,uint32_t accNumCandidates,TMMBRSet * candidateSet) const1442 int32_t RTCPReceiver::TMMBRReceived(uint32_t size,
1443                                     uint32_t accNumCandidates,
1444                                     TMMBRSet* candidateSet) const {
1445   CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
1446 
1447   std::map<uint32_t, RTCPReceiveInformation*>::const_iterator
1448       receiveInfoIt = _receivedInfoMap.begin();
1449   if (receiveInfoIt == _receivedInfoMap.end()) {
1450     return -1;
1451   }
1452   uint32_t num = accNumCandidates;
1453   if (candidateSet) {
1454     while( num < size && receiveInfoIt != _receivedInfoMap.end()) {
1455       RTCPReceiveInformation* receiveInfo = receiveInfoIt->second;
1456       if (receiveInfo == NULL) {
1457         return 0;
1458       }
1459       for (uint32_t i = 0;
1460            (num < size) && (i < receiveInfo->TmmbrSet.lengthOfSet()); i++) {
1461         if (receiveInfo->GetTMMBRSet(i, num, candidateSet,
1462                                      _clock->TimeInMilliseconds()) == 0) {
1463           num++;
1464         }
1465       }
1466       receiveInfoIt++;
1467     }
1468   } else {
1469     while (receiveInfoIt != _receivedInfoMap.end()) {
1470       RTCPReceiveInformation* receiveInfo = receiveInfoIt->second;
1471       if(receiveInfo == NULL) {
1472         return -1;
1473       }
1474       num += receiveInfo->TmmbrSet.lengthOfSet();
1475       receiveInfoIt++;
1476     }
1477   }
1478   return num;
1479 }
1480 
1481 }  // namespace webrtc
1482