Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc

Issue 2259213002: Reformat rtcp_receiver (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 *rtt_ms = xr_rr_rtt_ms_; 188 *rtt_ms = xr_rr_rtt_ms_;
189 xr_rr_rtt_ms_ = 0; 189 xr_rr_rtt_ms_ = 0;
190 return true; 190 return true;
191 } 191 }
192 192
193 // TODO(pbos): Make this fail when we haven't received NTP. 193 // TODO(pbos): Make this fail when we haven't received NTP.
194 bool RTCPReceiver::NTP(uint32_t* ReceivedNTPsecs, 194 bool RTCPReceiver::NTP(uint32_t* ReceivedNTPsecs,
195 uint32_t* ReceivedNTPfrac, 195 uint32_t* ReceivedNTPfrac,
196 uint32_t* RTCPArrivalTimeSecs, 196 uint32_t* RTCPArrivalTimeSecs,
197 uint32_t* RTCPArrivalTimeFrac, 197 uint32_t* RTCPArrivalTimeFrac,
198 uint32_t* rtcp_timestamp) const 198 uint32_t* rtcp_timestamp) const {
199 { 199 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
200 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 200 if (ReceivedNTPsecs) {
201 if(ReceivedNTPsecs) 201 *ReceivedNTPsecs =
202 { 202 _remoteSenderInfo.NTPseconds; // NTP from incoming SendReport
203 *ReceivedNTPsecs = _remoteSenderInfo.NTPseconds; // NTP from incoming Se ndReport 203 }
204 } 204 if (ReceivedNTPfrac) {
205 if(ReceivedNTPfrac) 205 *ReceivedNTPfrac = _remoteSenderInfo.NTPfraction;
206 { 206 }
207 *ReceivedNTPfrac = _remoteSenderInfo.NTPfraction; 207 if (RTCPArrivalTimeFrac) {
208 } 208 *RTCPArrivalTimeFrac = _lastReceivedSRNTPfrac; // local NTP time when we
209 if(RTCPArrivalTimeFrac) 209 // received a RTCP packet
210 { 210 // with a send block
211 *RTCPArrivalTimeFrac = _lastReceivedSRNTPfrac; // local NTP time when we received a RTCP packet with a send block 211 }
212 } 212 if (RTCPArrivalTimeSecs) {
213 if(RTCPArrivalTimeSecs) 213 *RTCPArrivalTimeSecs = _lastReceivedSRNTPsecs;
214 { 214 }
215 *RTCPArrivalTimeSecs = _lastReceivedSRNTPsecs; 215 if (rtcp_timestamp) {
216 } 216 *rtcp_timestamp = _remoteSenderInfo.RTPtimeStamp;
217 if (rtcp_timestamp) { 217 }
218 *rtcp_timestamp = _remoteSenderInfo.RTPtimeStamp; 218 return true;
219 }
220 return true;
221 } 219 }
222 220
223 bool RTCPReceiver::LastReceivedXrReferenceTimeInfo( 221 bool RTCPReceiver::LastReceivedXrReferenceTimeInfo(
224 RtcpReceiveTimeInfo* info) const { 222 RtcpReceiveTimeInfo* info) const {
225 assert(info); 223 assert(info);
226 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 224 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
227 if (_lastReceivedXRNTPsecs == 0 && _lastReceivedXRNTPfrac == 0) { 225 if (_lastReceivedXRNTPsecs == 0 && _lastReceivedXRNTPfrac == 0) {
228 return false; 226 return false;
229 } 227 }
230 228
231 info->sourceSSRC = _remoteXRReceiveTimeInfo.sourceSSRC; 229 info->sourceSSRC = _remoteXRReceiveTimeInfo.sourceSSRC;
232 info->lastRR = _remoteXRReceiveTimeInfo.lastRR; 230 info->lastRR = _remoteXRReceiveTimeInfo.lastRR;
233 231
234 // Get the delay since last received report (RFC 3611). 232 // Get the delay since last received report (RFC 3611).
235 uint32_t receive_time = RTCPUtility::MidNtp(_lastReceivedXRNTPsecs, 233 uint32_t receive_time =
236 _lastReceivedXRNTPfrac); 234 RTCPUtility::MidNtp(_lastReceivedXRNTPsecs, _lastReceivedXRNTPfrac);
237 235
238 uint32_t ntp_sec = 0; 236 uint32_t ntp_sec = 0;
239 uint32_t ntp_frac = 0; 237 uint32_t ntp_frac = 0;
240 _clock->CurrentNtp(ntp_sec, ntp_frac); 238 _clock->CurrentNtp(ntp_sec, ntp_frac);
241 uint32_t now = RTCPUtility::MidNtp(ntp_sec, ntp_frac); 239 uint32_t now = RTCPUtility::MidNtp(ntp_sec, ntp_frac);
242 240
243 info->delaySinceLastRR = now - receive_time; 241 info->delaySinceLastRR = now - receive_time;
244 return true; 242 return true;
245 } 243 }
246 244
(...skipping 17 matching lines...) Expand all
264 for (; it != _receivedReportBlockMap.end(); ++it) { 262 for (; it != _receivedReportBlockMap.end(); ++it) {
265 const ReportBlockInfoMap* info_map = &(it->second); 263 const ReportBlockInfoMap* info_map = &(it->second);
266 ReportBlockInfoMap::const_iterator it_info = info_map->begin(); 264 ReportBlockInfoMap::const_iterator it_info = info_map->begin();
267 for (; it_info != info_map->end(); ++it_info) { 265 for (; it_info != info_map->end(); ++it_info) {
268 receiveBlocks->push_back(it_info->second->remoteReceiveBlock); 266 receiveBlocks->push_back(it_info->second->remoteReceiveBlock);
269 } 267 }
270 } 268 }
271 return 0; 269 return 0;
272 } 270 }
273 271
274 int32_t 272 int32_t RTCPReceiver::IncomingRTCPPacket(
275 RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation, 273 RTCPPacketInformation& rtcpPacketInformation,
276 RTCPUtility::RTCPParserV2* rtcpParser) 274 RTCPUtility::RTCPParserV2* rtcpParser) {
277 { 275 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
278 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
279 276
280 _lastReceived = _clock->TimeInMilliseconds(); 277 _lastReceived = _clock->TimeInMilliseconds();
281 278
282 if (packet_type_counter_.first_packet_time_ms == -1) { 279 if (packet_type_counter_.first_packet_time_ms == -1) {
283 packet_type_counter_.first_packet_time_ms = _lastReceived; 280 packet_type_counter_.first_packet_time_ms = _lastReceived;
281 }
282
283 RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin();
284 while (pktType != RTCPPacketTypes::kInvalid) {
285 // Each "case" is responsible for iterate the parser to the
286 // next top level packet.
287 switch (pktType) {
288 case RTCPPacketTypes::kSr:
289 case RTCPPacketTypes::kRr:
290 HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation);
291 break;
292 case RTCPPacketTypes::kSdes:
293 HandleSDES(*rtcpParser, rtcpPacketInformation);
294 break;
295 case RTCPPacketTypes::kXrHeader:
296 HandleXrHeader(*rtcpParser, rtcpPacketInformation);
297 break;
298 case RTCPPacketTypes::kXrReceiverReferenceTime:
299 HandleXrReceiveReferenceTime(*rtcpParser, rtcpPacketInformation);
300 break;
301 case RTCPPacketTypes::kXrDlrrReportBlock:
302 HandleXrDlrrReportBlock(*rtcpParser, rtcpPacketInformation);
303 break;
304 case RTCPPacketTypes::kXrVoipMetric:
305 HandleXRVOIPMetric(*rtcpParser, rtcpPacketInformation);
306 break;
307 case RTCPPacketTypes::kBye:
308 HandleBYE(*rtcpParser);
309 break;
310 case RTCPPacketTypes::kRtpfbNack:
311 HandleNACK(*rtcpParser, rtcpPacketInformation);
312 break;
313 case RTCPPacketTypes::kRtpfbTmmbr:
314 HandleTMMBR(*rtcpParser, rtcpPacketInformation);
315 break;
316 case RTCPPacketTypes::kRtpfbTmmbn:
317 HandleTMMBN(*rtcpParser, rtcpPacketInformation);
318 break;
319 case RTCPPacketTypes::kRtpfbSrReq:
320 HandleSR_REQ(*rtcpParser, rtcpPacketInformation);
321 break;
322 case RTCPPacketTypes::kPsfbPli:
323 HandlePLI(*rtcpParser, rtcpPacketInformation);
324 break;
325 case RTCPPacketTypes::kPsfbSli:
326 HandleSLI(*rtcpParser, rtcpPacketInformation);
327 break;
328 case RTCPPacketTypes::kPsfbRpsi:
329 HandleRPSI(*rtcpParser, rtcpPacketInformation);
330 break;
331 case RTCPPacketTypes::kExtendedIj:
332 HandleIJ(*rtcpParser, rtcpPacketInformation);
333 break;
334 case RTCPPacketTypes::kPsfbFir:
335 HandleFIR(*rtcpParser, rtcpPacketInformation);
336 break;
337 case RTCPPacketTypes::kPsfbApp:
338 HandlePsfbApp(*rtcpParser, rtcpPacketInformation);
339 break;
340 case RTCPPacketTypes::kApp:
341 // generic application messages
342 HandleAPP(*rtcpParser, rtcpPacketInformation);
343 break;
344 case RTCPPacketTypes::kAppItem:
345 // generic application messages
346 HandleAPPItem(*rtcpParser, rtcpPacketInformation);
347 break;
348 case RTCPPacketTypes::kTransportFeedback:
349 HandleTransportFeedback(rtcpParser, &rtcpPacketInformation);
350 break;
351 default:
352 rtcpParser->Iterate();
353 break;
284 } 354 }
355 pktType = rtcpParser->PacketType();
356 }
285 357
286 RTCPUtility::RTCPPacketTypes pktType = rtcpParser->Begin(); 358 if (packet_type_counter_observer_ != NULL) {
287 while (pktType != RTCPPacketTypes::kInvalid) { 359 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated(
288 // Each "case" is responsible for iterate the parser to the 360 main_ssrc_, packet_type_counter_);
289 // next top level packet. 361 }
290 switch (pktType)
291 {
292 case RTCPPacketTypes::kSr:
293 case RTCPPacketTypes::kRr:
294 HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation);
295 break;
296 case RTCPPacketTypes::kSdes:
297 HandleSDES(*rtcpParser, rtcpPacketInformation);
298 break;
299 case RTCPPacketTypes::kXrHeader:
300 HandleXrHeader(*rtcpParser, rtcpPacketInformation);
301 break;
302 case RTCPPacketTypes::kXrReceiverReferenceTime:
303 HandleXrReceiveReferenceTime(*rtcpParser, rtcpPacketInformation);
304 break;
305 case RTCPPacketTypes::kXrDlrrReportBlock:
306 HandleXrDlrrReportBlock(*rtcpParser, rtcpPacketInformation);
307 break;
308 case RTCPPacketTypes::kXrVoipMetric:
309 HandleXRVOIPMetric(*rtcpParser, rtcpPacketInformation);
310 break;
311 case RTCPPacketTypes::kBye:
312 HandleBYE(*rtcpParser);
313 break;
314 case RTCPPacketTypes::kRtpfbNack:
315 HandleNACK(*rtcpParser, rtcpPacketInformation);
316 break;
317 case RTCPPacketTypes::kRtpfbTmmbr:
318 HandleTMMBR(*rtcpParser, rtcpPacketInformation);
319 break;
320 case RTCPPacketTypes::kRtpfbTmmbn:
321 HandleTMMBN(*rtcpParser, rtcpPacketInformation);
322 break;
323 case RTCPPacketTypes::kRtpfbSrReq:
324 HandleSR_REQ(*rtcpParser, rtcpPacketInformation);
325 break;
326 case RTCPPacketTypes::kPsfbPli:
327 HandlePLI(*rtcpParser, rtcpPacketInformation);
328 break;
329 case RTCPPacketTypes::kPsfbSli:
330 HandleSLI(*rtcpParser, rtcpPacketInformation);
331 break;
332 case RTCPPacketTypes::kPsfbRpsi:
333 HandleRPSI(*rtcpParser, rtcpPacketInformation);
334 break;
335 case RTCPPacketTypes::kExtendedIj:
336 HandleIJ(*rtcpParser, rtcpPacketInformation);
337 break;
338 case RTCPPacketTypes::kPsfbFir:
339 HandleFIR(*rtcpParser, rtcpPacketInformation);
340 break;
341 case RTCPPacketTypes::kPsfbApp:
342 HandlePsfbApp(*rtcpParser, rtcpPacketInformation);
343 break;
344 case RTCPPacketTypes::kApp:
345 // generic application messages
346 HandleAPP(*rtcpParser, rtcpPacketInformation);
347 break;
348 case RTCPPacketTypes::kAppItem:
349 // generic application messages
350 HandleAPPItem(*rtcpParser, rtcpPacketInformation);
351 break;
352 case RTCPPacketTypes::kTransportFeedback:
353 HandleTransportFeedback(rtcpParser, &rtcpPacketInformation);
354 break;
355 default:
356 rtcpParser->Iterate();
357 break;
358 }
359 pktType = rtcpParser->PacketType();
360 }
361 362
362 if (packet_type_counter_observer_ != NULL) { 363 num_skipped_packets_ += rtcpParser->NumSkippedBlocks();
363 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated(
364 main_ssrc_, packet_type_counter_);
365 }
366 364
367 num_skipped_packets_ += rtcpParser->NumSkippedBlocks(); 365 int64_t now = _clock->TimeInMilliseconds();
366 if (now - last_skipped_packets_warning_ >= kMaxWarningLogIntervalMs &&
367 num_skipped_packets_ > 0) {
368 last_skipped_packets_warning_ = now;
369 LOG(LS_WARNING) << num_skipped_packets_
370 << " RTCP blocks were skipped due to being malformed or of "
371 "unrecognized/unsupported type, during the past "
372 << (kMaxWarningLogIntervalMs / 1000) << " second period.";
373 }
368 374
369 int64_t now = _clock->TimeInMilliseconds(); 375 return 0;
370 if (now - last_skipped_packets_warning_ >= kMaxWarningLogIntervalMs &&
371 num_skipped_packets_ > 0) {
372 last_skipped_packets_warning_ = now;
373 LOG(LS_WARNING)
374 << num_skipped_packets_
375 << " RTCP blocks were skipped due to being malformed or of "
376 "unrecognized/unsupported type, during the past "
377 << (kMaxWarningLogIntervalMs / 1000) << " second period.";
378 }
379
380 return 0;
381 } 376 }
382 377
383 void 378 void RTCPReceiver::HandleSenderReceiverReport(
384 RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser, 379 RTCPUtility::RTCPParserV2& rtcpParser,
385 RTCPPacketInformation& rtcpPacketInform ation) 380 RTCPPacketInformation& rtcpPacketInformation) {
386 { 381 RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType();
387 RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType(); 382 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
388 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
389 383
390 assert((rtcpPacketType == RTCPPacketTypes::kRr) || 384 assert((rtcpPacketType == RTCPPacketTypes::kRr) ||
391 (rtcpPacketType == RTCPPacketTypes::kSr)); 385 (rtcpPacketType == RTCPPacketTypes::kSr));
392 386
393 // SR.SenderSSRC 387 // SR.SenderSSRC
394 // The synchronization source identifier for the originator of this SR packe t 388 // The synchronization source identifier for the originator of this SR packet
395 389
396 // rtcpPacket.RR.SenderSSRC 390 // rtcpPacket.RR.SenderSSRC
397 // The source of the packet sender, same as of SR? or is this a CE? 391 // The source of the packet sender, same as of SR? or is this a CE?
398 392
399 const uint32_t remoteSSRC = (rtcpPacketType == RTCPPacketTypes::kRr) 393 const uint32_t remoteSSRC = (rtcpPacketType == RTCPPacketTypes::kRr)
400 ? rtcpPacket.RR.SenderSSRC 394 ? rtcpPacket.RR.SenderSSRC
401 : rtcpPacket.SR.SenderSSRC; 395 : rtcpPacket.SR.SenderSSRC;
402 396
403 rtcpPacketInformation.remoteSSRC = remoteSSRC; 397 rtcpPacketInformation.remoteSSRC = remoteSSRC;
404 398
405 RTCPReceiveInformation* ptrReceiveInfo = CreateReceiveInformation(remoteSSRC ); 399 RTCPReceiveInformation* ptrReceiveInfo = CreateReceiveInformation(remoteSSRC);
406 if (!ptrReceiveInfo) 400 if (!ptrReceiveInfo) {
401 rtcpParser.Iterate();
402 return;
403 }
404
405 if (rtcpPacketType == RTCPPacketTypes::kSr) {
406 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR",
407 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_);
408
409 if (_remoteSSRC ==
410 remoteSSRC) // have I received RTP packets from this party
407 { 411 {
408 rtcpParser.Iterate(); 412 // only signal that we have received a SR when we accept one
409 return; 413 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSr;
414
415 rtcpPacketInformation.ntp_secs = rtcpPacket.SR.NTPMostSignificant;
416 rtcpPacketInformation.ntp_frac = rtcpPacket.SR.NTPLeastSignificant;
417 rtcpPacketInformation.rtp_timestamp = rtcpPacket.SR.RTPTimestamp;
418
419 // We will only store the send report from one source, but
420 // we will store all the receive block
421
422 // Save the NTP time of this report
423 _remoteSenderInfo.NTPseconds = rtcpPacket.SR.NTPMostSignificant;
424 _remoteSenderInfo.NTPfraction = rtcpPacket.SR.NTPLeastSignificant;
425 _remoteSenderInfo.RTPtimeStamp = rtcpPacket.SR.RTPTimestamp;
426 _remoteSenderInfo.sendPacketCount = rtcpPacket.SR.SenderPacketCount;
427 _remoteSenderInfo.sendOctetCount = rtcpPacket.SR.SenderOctetCount;
428
429 _clock->CurrentNtp(_lastReceivedSRNTPsecs, _lastReceivedSRNTPfrac);
430 } else {
431 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
410 } 432 }
433 } else {
434 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR",
435 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_);
411 436
412 if (rtcpPacketType == RTCPPacketTypes::kSr) { 437 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
413 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR", 438 }
414 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_); 439 // Update that this remote is alive.
440 ptrReceiveInfo->last_time_received_ms = _clock->TimeInMilliseconds();
415 441
416 if (_remoteSSRC == remoteSSRC) // have I received RTP packets from this party 442 rtcpPacketType = rtcpParser.Iterate();
417 {
418 // only signal that we have received a SR when we accept one
419 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSr;
420 443
421 rtcpPacketInformation.ntp_secs = rtcpPacket.SR.NTPMostSignificant; 444 while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) {
422 rtcpPacketInformation.ntp_frac = rtcpPacket.SR.NTPLeastSignificant; 445 HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC);
423 rtcpPacketInformation.rtp_timestamp = rtcpPacket.SR.RTPTimestamp;
424
425 // We will only store the send report from one source, but
426 // we will store all the receive block
427
428 // Save the NTP time of this report
429 _remoteSenderInfo.NTPseconds = rtcpPacket.SR.NTPMostSignificant;
430 _remoteSenderInfo.NTPfraction = rtcpPacket.SR.NTPLeastSignificant;
431 _remoteSenderInfo.RTPtimeStamp = rtcpPacket.SR.RTPTimestamp;
432 _remoteSenderInfo.sendPacketCount = rtcpPacket.SR.SenderPacketCount;
433 _remoteSenderInfo.sendOctetCount = rtcpPacket.SR.SenderOctetCount;
434
435 _clock->CurrentNtp(_lastReceivedSRNTPsecs, _lastReceivedSRNTPfrac);
436 }
437 else
438 {
439 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
440 }
441 } else
442 {
443 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR",
444 "remote_ssrc", remoteSSRC, "ssrc", main_ssrc_);
445
446 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRr;
447 }
448 // Update that this remote is alive.
449 ptrReceiveInfo->last_time_received_ms = _clock->TimeInMilliseconds();
450
451 rtcpPacketType = rtcpParser.Iterate(); 446 rtcpPacketType = rtcpParser.Iterate();
452 447 }
453 while (rtcpPacketType == RTCPPacketTypes::kReportBlockItem) {
454 HandleReportBlock(rtcpPacket, rtcpPacketInformation, remoteSSRC);
455 rtcpPacketType = rtcpParser.Iterate();
456 }
457 } 448 }
458 449
459 void RTCPReceiver::HandleReportBlock( 450 void RTCPReceiver::HandleReportBlock(
460 const RTCPUtility::RTCPPacket& rtcpPacket, 451 const RTCPUtility::RTCPPacket& rtcpPacket,
461 RTCPPacketInformation& rtcpPacketInformation, 452 RTCPPacketInformation& rtcpPacketInformation,
462 uint32_t remoteSSRC) 453 uint32_t remoteSSRC)
463 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) { 454 EXCLUSIVE_LOCKS_REQUIRED(_criticalSectionRTCPReceiver) {
464 // This will be called once per report block in the RTCP packet. 455 // This will be called once per report block in the RTCP packet.
465 // We filter out all report blocks that are not for us. 456 // We filter out all report blocks that are not for us.
466 // Each packet has max 31 RR blocks. 457 // Each packet has max 31 RR blocks.
467 // 458 //
468 // We can calc RTT if we send a send report and get a report block back. 459 // We can calc RTT if we send a send report and get a report block back.
469 460
470 // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to 461 // |rtcpPacket.ReportBlockItem.SSRC| is the SSRC identifier of the source to
471 // which the information in this reception report block pertains. 462 // which the information in this reception report block pertains.
472 463
473 // Filter out all report blocks that are not for us. 464 // Filter out all report blocks that are not for us.
474 if (registered_ssrcs_.find(rtcpPacket.ReportBlockItem.SSRC) == 465 if (registered_ssrcs_.find(rtcpPacket.ReportBlockItem.SSRC) ==
475 registered_ssrcs_.end()) { 466 registered_ssrcs_.end()) {
476 // This block is not for us ignore it. 467 // This block is not for us ignore it.
477 return; 468 return;
478 } 469 }
479 470
480 RTCPReportBlockInformation* reportBlock = 471 RTCPReportBlockInformation* reportBlock = CreateOrGetReportBlockInformation(
481 CreateOrGetReportBlockInformation(remoteSSRC, 472 remoteSSRC, rtcpPacket.ReportBlockItem.SSRC);
482 rtcpPacket.ReportBlockItem.SSRC);
483 if (reportBlock == NULL) { 473 if (reportBlock == NULL) {
484 LOG(LS_WARNING) << "Failed to CreateReportBlockInformation(" 474 LOG(LS_WARNING) << "Failed to CreateReportBlockInformation(" << remoteSSRC
485 << remoteSSRC << ")"; 475 << ")";
486 return; 476 return;
487 } 477 }
488 478
489 _lastReceivedRrMs = _clock->TimeInMilliseconds(); 479 _lastReceivedRrMs = _clock->TimeInMilliseconds();
490 const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem; 480 const RTCPPacketReportBlockItem& rb = rtcpPacket.ReportBlockItem;
491 reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC; 481 reportBlock->remoteReceiveBlock.remoteSSRC = remoteSSRC;
492 reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC; 482 reportBlock->remoteReceiveBlock.sourceSSRC = rb.SSRC;
493 reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost; 483 reportBlock->remoteReceiveBlock.fractionLost = rb.FractionLost;
494 reportBlock->remoteReceiveBlock.cumulativeLost = 484 reportBlock->remoteReceiveBlock.cumulativeLost =
495 rb.CumulativeNumOfPacketsLost; 485 rb.CumulativeNumOfPacketsLost;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 return NULL; 567 return NULL;
578 } 568 }
579 const ReportBlockInfoMap* info_map = &(it->second); 569 const ReportBlockInfoMap* info_map = &(it->second);
580 ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc); 570 ReportBlockInfoMap::const_iterator it_info = info_map->find(remote_ssrc);
581 if (it_info == info_map->end()) { 571 if (it_info == info_map->end()) {
582 return NULL; 572 return NULL;
583 } 573 }
584 return it_info->second; 574 return it_info->second;
585 } 575 }
586 576
587 RTCPCnameInformation* 577 RTCPCnameInformation* RTCPReceiver::CreateCnameInformation(
588 RTCPReceiver::CreateCnameInformation(uint32_t remoteSSRC) { 578 uint32_t remoteSSRC) {
589 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 579 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
590 580
591 std::map<uint32_t, RTCPCnameInformation*>::iterator it = 581 std::map<uint32_t, RTCPCnameInformation*>::iterator it =
592 _receivedCnameMap.find(remoteSSRC); 582 _receivedCnameMap.find(remoteSSRC);
593 583
594 if (it != _receivedCnameMap.end()) { 584 if (it != _receivedCnameMap.end()) {
595 return it->second; 585 return it->second;
596 } 586 }
597 RTCPCnameInformation* cnameInfo = new RTCPCnameInformation; 587 RTCPCnameInformation* cnameInfo = new RTCPCnameInformation;
598 memset(cnameInfo->name, 0, RTCP_CNAME_SIZE); 588 memset(cnameInfo->name, 0, RTCP_CNAME_SIZE);
599 _receivedCnameMap[remoteSSRC] = cnameInfo; 589 _receivedCnameMap[remoteSSRC] = cnameInfo;
600 return cnameInfo; 590 return cnameInfo;
601 } 591 }
602 592
603 RTCPCnameInformation* 593 RTCPCnameInformation* RTCPReceiver::GetCnameInformation(
604 RTCPReceiver::GetCnameInformation(uint32_t remoteSSRC) const { 594 uint32_t remoteSSRC) const {
605 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 595 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
606 596
607 std::map<uint32_t, RTCPCnameInformation*>::const_iterator it = 597 std::map<uint32_t, RTCPCnameInformation*>::const_iterator it =
608 _receivedCnameMap.find(remoteSSRC); 598 _receivedCnameMap.find(remoteSSRC);
609 599
610 if (it == _receivedCnameMap.end()) { 600 if (it == _receivedCnameMap.end()) {
611 return NULL; 601 return NULL;
612 } 602 }
613 return it->second; 603 return it->second;
614 } 604 }
615 605
616 RTCPReceiveInformation* 606 RTCPReceiveInformation* RTCPReceiver::CreateReceiveInformation(
617 RTCPReceiver::CreateReceiveInformation(uint32_t remoteSSRC) { 607 uint32_t remoteSSRC) {
618 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 608 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
619 609
620 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = 610 std::map<uint32_t, RTCPReceiveInformation*>::iterator it =
621 _receivedInfoMap.find(remoteSSRC); 611 _receivedInfoMap.find(remoteSSRC);
622 612
623 if (it != _receivedInfoMap.end()) { 613 if (it != _receivedInfoMap.end()) {
624 return it->second; 614 return it->second;
625 } 615 }
626 RTCPReceiveInformation* receiveInfo = new RTCPReceiveInformation; 616 RTCPReceiveInformation* receiveInfo = new RTCPReceiveInformation;
627 _receivedInfoMap[remoteSSRC] = receiveInfo; 617 _receivedInfoMap[remoteSSRC] = receiveInfo;
628 return receiveInfo; 618 return receiveInfo;
629 } 619 }
630 620
631 RTCPReceiveInformation* 621 RTCPReceiveInformation* RTCPReceiver::GetReceiveInformation(
632 RTCPReceiver::GetReceiveInformation(uint32_t remoteSSRC) { 622 uint32_t remoteSSRC) {
633 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 623 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
634 624
635 std::map<uint32_t, RTCPReceiveInformation*>::iterator it = 625 std::map<uint32_t, RTCPReceiveInformation*>::iterator it =
636 _receivedInfoMap.find(remoteSSRC); 626 _receivedInfoMap.find(remoteSSRC);
637 if (it == _receivedInfoMap.end()) { 627 if (it == _receivedInfoMap.end()) {
638 return NULL; 628 return NULL;
639 } 629 }
640 return it->second; 630 return it->second;
641 } 631 }
642 632
(...skipping 10 matching lines...) Expand all
653 } 643 }
654 return false; 644 return false;
655 } 645 }
656 646
657 bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) { 647 bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) {
658 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 648 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
659 if (_lastIncreasedSequenceNumberMs == 0) 649 if (_lastIncreasedSequenceNumberMs == 0)
660 return false; 650 return false;
661 651
662 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms; 652 int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms;
663 if (_clock->TimeInMilliseconds() > _lastIncreasedSequenceNumberMs + 653 if (_clock->TimeInMilliseconds() >
664 time_out_ms) { 654 _lastIncreasedSequenceNumberMs + time_out_ms) {
665 // Reset the timer to only trigger one log. 655 // Reset the timer to only trigger one log.
666 _lastIncreasedSequenceNumberMs = 0; 656 _lastIncreasedSequenceNumberMs = 0;
667 return true; 657 return true;
668 } 658 }
669 return false; 659 return false;
670 } 660 }
671 661
672 bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() { 662 bool RTCPReceiver::UpdateRTCPReceiveInformationTimers() {
673 rtc::CritScope lock(&_criticalSectionRTCPReceiver); 663 rtc::CritScope lock(&_criticalSectionRTCPReceiver);
674 664
(...skipping 20 matching lines...) Expand all
695 receiveInfo->ClearTmmbr(); 685 receiveInfo->ClearTmmbr();
696 // prevent that we call this over and over again 686 // prevent that we call this over and over again
697 receiveInfo->last_time_received_ms = 0; 687 receiveInfo->last_time_received_ms = 0;
698 // send new TMMBN to all channels using the default codec 688 // send new TMMBN to all channels using the default codec
699 updateBoundingSet = true; 689 updateBoundingSet = true;
700 } 690 }
701 receiveInfoIt++; 691 receiveInfoIt++;
702 } else if (receiveInfo->ready_for_delete) { 692 } else if (receiveInfo->ready_for_delete) {
703 // store our current receiveInfoItem 693 // store our current receiveInfoItem
704 std::map<uint32_t, RTCPReceiveInformation*>::iterator 694 std::map<uint32_t, RTCPReceiveInformation*>::iterator
705 receiveInfoItemToBeErased = receiveInfoIt; 695 receiveInfoItemToBeErased = receiveInfoIt;
706 receiveInfoIt++; 696 receiveInfoIt++;
707 delete receiveInfoItemToBeErased->second; 697 delete receiveInfoItemToBeErased->second;
708 _receivedInfoMap.erase(receiveInfoItemToBeErased); 698 _receivedInfoMap.erase(receiveInfoItemToBeErased);
709 } else { 699 } else {
710 receiveInfoIt++; 700 receiveInfoIt++;
711 } 701 }
712 } 702 }
713 return updateBoundingSet; 703 return updateBoundingSet;
714 } 704 }
715 705
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 pktType = rtcpParser.Iterate(); 762 pktType = rtcpParser.Iterate();
773 } 763 }
774 764
775 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) { 765 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) {
776 ++packet_type_counter_.nack_packets; 766 ++packet_type_counter_.nack_packets;
777 packet_type_counter_.nack_requests = nack_stats_.requests(); 767 packet_type_counter_.nack_requests = nack_stats_.requests();
778 packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests(); 768 packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests();
779 } 769 }
780 } 770 }
781 771
782 void 772 void RTCPReceiver::HandleNACKItem(
783 RTCPReceiver::HandleNACKItem(const RTCPUtility::RTCPPacket& rtcpPacket, 773 const RTCPUtility::RTCPPacket& rtcpPacket,
784 RTCPPacketInformation& rtcpPacketInformation) { 774 RTCPPacketInformation& rtcpPacketInformation) {
785 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID); 775 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID);
786 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID); 776 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID);
787 777
788 uint16_t bitMask = rtcpPacket.NACKItem.BitMask; 778 uint16_t bitMask = rtcpPacket.NACKItem.BitMask;
789 if (bitMask) { 779 if (bitMask) {
790 for (int i=1; i <= 16; ++i) { 780 for (int i = 1; i <= 16; ++i) {
791 if (bitMask & 0x01) { 781 if (bitMask & 0x01) {
792 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID + i); 782 rtcpPacketInformation.AddNACKPacket(rtcpPacket.NACKItem.PacketID + i);
793 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID + i); 783 nack_stats_.ReportRequest(rtcpPacket.NACKItem.PacketID + i);
794 } 784 }
795 bitMask = bitMask >>1; 785 bitMask = bitMask >> 1;
796 } 786 }
797 } 787 }
798 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpNack; 788 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpNack;
799 } 789 }
800 790
801 void RTCPReceiver::HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) { 791 void RTCPReceiver::HandleBYE(RTCPUtility::RTCPParserV2& rtcpParser) {
802 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 792 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
803 793
804 // clear our lists 794 // clear our lists
805 ReportBlockMap::iterator it = _receivedReportBlockMap.begin(); 795 ReportBlockMap::iterator it = _receivedReportBlockMap.begin();
806 for (; it != _receivedReportBlockMap.end(); ++it) { 796 for (; it != _receivedReportBlockMap.end(); ++it) {
807 ReportBlockInfoMap* info_map = &(it->second); 797 ReportBlockInfoMap* info_map = &(it->second);
808 ReportBlockInfoMap::iterator it_info = info_map->find( 798 ReportBlockInfoMap::iterator it_info =
809 rtcpPacket.BYE.SenderSSRC); 799 info_map->find(rtcpPacket.BYE.SenderSSRC);
810 if (it_info != info_map->end()) { 800 if (it_info != info_map->end()) {
811 delete it_info->second; 801 delete it_info->second;
812 info_map->erase(it_info); 802 info_map->erase(it_info);
813 } 803 }
814 } 804 }
815 805
816 // we can't delete it due to TMMBR 806 // we can't delete it due to TMMBR
817 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt = 807 std::map<uint32_t, RTCPReceiveInformation*>::iterator receiveInfoIt =
818 _receivedInfoMap.find(rtcpPacket.BYE.SenderSSRC); 808 _receivedInfoMap.find(rtcpPacket.BYE.SenderSSRC);
819 809
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 889
900 uint32_t delay_rr = packet.XRDLRRReportBlockItem.DelayLastRR; 890 uint32_t delay_rr = packet.XRDLRRReportBlockItem.DelayLastRR;
901 uint32_t now = CompactNtp(NtpTime(*_clock)); 891 uint32_t now = CompactNtp(NtpTime(*_clock));
902 892
903 uint32_t rtt_ntp = now - delay_rr - send_time; 893 uint32_t rtt_ntp = now - delay_rr - send_time;
904 xr_rr_rtt_ms_ = CompactNtpRttToMs(rtt_ntp); 894 xr_rr_rtt_ms_ = CompactNtpRttToMs(rtt_ntp);
905 895
906 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock; 896 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrDlrrReportBlock;
907 } 897 }
908 898
909 void 899 void RTCPReceiver::HandleXRVOIPMetric(
910 RTCPReceiver::HandleXRVOIPMetric(RTCPUtility::RTCPParserV2& rtcpParser, 900 RTCPUtility::RTCPParserV2& rtcpParser,
911 RTCPPacketInformation& rtcpPacketInformation) 901 RTCPPacketInformation& rtcpPacketInformation) {
912 { 902 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
913 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
914 903
915 if(rtcpPacket.XRVOIPMetricItem.SSRC == main_ssrc_) 904 if (rtcpPacket.XRVOIPMetricItem.SSRC == main_ssrc_) {
916 { 905 // Store VoIP metrics block if it's about me
917 // Store VoIP metrics block if it's about me 906 // from OriginatorSSRC do we filter it?
918 // from OriginatorSSRC do we filter it? 907 // rtcpPacket.XR.OriginatorSSRC;
919 // rtcpPacket.XR.OriginatorSSRC;
920 908
921 RTCPVoIPMetric receivedVoIPMetrics; 909 RTCPVoIPMetric receivedVoIPMetrics;
922 receivedVoIPMetrics.burstDensity = rtcpPacket.XRVOIPMetricItem.burstDens ity; 910 receivedVoIPMetrics.burstDensity = rtcpPacket.XRVOIPMetricItem.burstDensity;
923 receivedVoIPMetrics.burstDuration = rtcpPacket.XRVOIPMetricItem.burstDur ation; 911 receivedVoIPMetrics.burstDuration =
924 receivedVoIPMetrics.discardRate = rtcpPacket.XRVOIPMetricItem.discardRat e; 912 rtcpPacket.XRVOIPMetricItem.burstDuration;
925 receivedVoIPMetrics.endSystemDelay = rtcpPacket.XRVOIPMetricItem.endSyst emDelay; 913 receivedVoIPMetrics.discardRate = rtcpPacket.XRVOIPMetricItem.discardRate;
926 receivedVoIPMetrics.extRfactor = rtcpPacket.XRVOIPMetricItem.extRfactor; 914 receivedVoIPMetrics.endSystemDelay =
927 receivedVoIPMetrics.gapDensity = rtcpPacket.XRVOIPMetricItem.gapDensity; 915 rtcpPacket.XRVOIPMetricItem.endSystemDelay;
928 receivedVoIPMetrics.gapDuration = rtcpPacket.XRVOIPMetricItem.gapDuratio n; 916 receivedVoIPMetrics.extRfactor = rtcpPacket.XRVOIPMetricItem.extRfactor;
929 receivedVoIPMetrics.Gmin = rtcpPacket.XRVOIPMetricItem.Gmin; 917 receivedVoIPMetrics.gapDensity = rtcpPacket.XRVOIPMetricItem.gapDensity;
930 receivedVoIPMetrics.JBabsMax = rtcpPacket.XRVOIPMetricItem.JBabsMax; 918 receivedVoIPMetrics.gapDuration = rtcpPacket.XRVOIPMetricItem.gapDuration;
931 receivedVoIPMetrics.JBmax = rtcpPacket.XRVOIPMetricItem.JBmax; 919 receivedVoIPMetrics.Gmin = rtcpPacket.XRVOIPMetricItem.Gmin;
932 receivedVoIPMetrics.JBnominal = rtcpPacket.XRVOIPMetricItem.JBnominal; 920 receivedVoIPMetrics.JBabsMax = rtcpPacket.XRVOIPMetricItem.JBabsMax;
933 receivedVoIPMetrics.lossRate = rtcpPacket.XRVOIPMetricItem.lossRate; 921 receivedVoIPMetrics.JBmax = rtcpPacket.XRVOIPMetricItem.JBmax;
934 receivedVoIPMetrics.MOSCQ = rtcpPacket.XRVOIPMetricItem.MOSCQ; 922 receivedVoIPMetrics.JBnominal = rtcpPacket.XRVOIPMetricItem.JBnominal;
935 receivedVoIPMetrics.MOSLQ = rtcpPacket.XRVOIPMetricItem.MOSLQ; 923 receivedVoIPMetrics.lossRate = rtcpPacket.XRVOIPMetricItem.lossRate;
936 receivedVoIPMetrics.noiseLevel = rtcpPacket.XRVOIPMetricItem.noiseLevel; 924 receivedVoIPMetrics.MOSCQ = rtcpPacket.XRVOIPMetricItem.MOSCQ;
937 receivedVoIPMetrics.RERL = rtcpPacket.XRVOIPMetricItem.RERL; 925 receivedVoIPMetrics.MOSLQ = rtcpPacket.XRVOIPMetricItem.MOSLQ;
938 receivedVoIPMetrics.Rfactor = rtcpPacket.XRVOIPMetricItem.Rfactor; 926 receivedVoIPMetrics.noiseLevel = rtcpPacket.XRVOIPMetricItem.noiseLevel;
939 receivedVoIPMetrics.roundTripDelay = rtcpPacket.XRVOIPMetricItem.roundTr ipDelay; 927 receivedVoIPMetrics.RERL = rtcpPacket.XRVOIPMetricItem.RERL;
940 receivedVoIPMetrics.RXconfig = rtcpPacket.XRVOIPMetricItem.RXconfig; 928 receivedVoIPMetrics.Rfactor = rtcpPacket.XRVOIPMetricItem.Rfactor;
941 receivedVoIPMetrics.signalLevel = rtcpPacket.XRVOIPMetricItem.signalLeve l; 929 receivedVoIPMetrics.roundTripDelay =
930 rtcpPacket.XRVOIPMetricItem.roundTripDelay;
931 receivedVoIPMetrics.RXconfig = rtcpPacket.XRVOIPMetricItem.RXconfig;
932 receivedVoIPMetrics.signalLevel = rtcpPacket.XRVOIPMetricItem.signalLevel;
942 933
943 rtcpPacketInformation.AddVoIPMetric(&receivedVoIPMetrics); 934 rtcpPacketInformation.AddVoIPMetric(&receivedVoIPMetrics);
944 935
945 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpXrVoipMetric; // recei ved signal 936 rtcpPacketInformation.rtcpPacketTypeFlags |=
946 } 937 kRtcpXrVoipMetric; // received signal
947 rtcpParser.Iterate(); 938 }
939 rtcpParser.Iterate();
948 } 940 }
949 941
950 void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser, 942 void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser,
951 RTCPPacketInformation& rtcpPacketInformation) { 943 RTCPPacketInformation& rtcpPacketInformation) {
952 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 944 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
953 if (main_ssrc_ == rtcpPacket.PLI.MediaSSRC) { 945 if (main_ssrc_ == rtcpPacket.PLI.MediaSSRC) {
954 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI"); 946 TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI");
955 947
956 ++packet_type_counter_.pli_packets; 948 ++packet_type_counter_.pli_packets;
957 // Received a signal that we need to send a new key frame. 949 // Received a signal that we need to send a new key frame.
(...skipping 25 matching lines...) Expand all
983 975
984 // sanity, we can't have more than what's in one packet 976 // sanity, we can't have more than what's in one packet
985 if (maxNumOfTMMBRBlocks > 200) { 977 if (maxNumOfTMMBRBlocks > 200) {
986 assert(false); 978 assert(false);
987 rtcpParser.Iterate(); 979 rtcpParser.Iterate();
988 return; 980 return;
989 } 981 }
990 982
991 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); 983 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
992 while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) { 984 while (pktType == RTCPPacketTypes::kRtpfbTmmbrItem) {
993 HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation, senderSS RC); 985 HandleTMMBRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation,
986 senderSSRC);
994 pktType = rtcpParser.Iterate(); 987 pktType = rtcpParser.Iterate();
995 } 988 }
996 } 989 }
997 990
998 void RTCPReceiver::HandleTMMBRItem(RTCPReceiveInformation& receiveInfo, 991 void RTCPReceiver::HandleTMMBRItem(RTCPReceiveInformation& receiveInfo,
999 const RTCPUtility::RTCPPacket& rtcpPacket, 992 const RTCPUtility::RTCPPacket& rtcpPacket,
1000 RTCPPacketInformation& rtcpPacketInformation, 993 RTCPPacketInformation& rtcpPacketInformation,
1001 uint32_t senderSSRC) { 994 uint32_t senderSSRC) {
1002 if (main_ssrc_ == rtcpPacket.TMMBRItem.SSRC && 995 if (main_ssrc_ == rtcpPacket.TMMBRItem.SSRC &&
1003 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate > 0) { 996 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate > 0) {
1004 receiveInfo.InsertTmmbrItem( 997 receiveInfo.InsertTmmbrItem(
1005 senderSSRC, 998 senderSSRC,
1006 rtcp::TmmbItem(rtcpPacket.TMMBRItem.SSRC, 999 rtcp::TmmbItem(rtcpPacket.TMMBRItem.SSRC,
1007 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate * 1000, 1000 rtcpPacket.TMMBRItem.MaxTotalMediaBitRate * 1000,
1008 rtcpPacket.TMMBRItem.MeasuredOverhead), 1001 rtcpPacket.TMMBRItem.MeasuredOverhead),
1009 _clock->TimeInMilliseconds()); 1002 _clock->TimeInMilliseconds());
1010 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbr; 1003 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbr;
1011 } 1004 }
1012 } 1005 }
1013 1006
1014 void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser, 1007 void RTCPReceiver::HandleTMMBN(RTCPUtility::RTCPParserV2& rtcpParser,
1015 RTCPPacketInformation& rtcpPacketInformation) { 1008 RTCPPacketInformation& rtcpPacketInformation) {
1016 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 1009 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1017 RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation( 1010 RTCPReceiveInformation* ptrReceiveInfo =
1018 rtcpPacket.TMMBN.SenderSSRC); 1011 GetReceiveInformation(rtcpPacket.TMMBN.SenderSSRC);
1019 if (ptrReceiveInfo == NULL) { 1012 if (ptrReceiveInfo == NULL) {
1020 // This remote SSRC must be saved before. 1013 // This remote SSRC must be saved before.
1021 rtcpParser.Iterate(); 1014 rtcpParser.Iterate();
1022 return; 1015 return;
1023 } 1016 }
1024 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbn; 1017 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTmmbn;
1025 // Use packet length to calc max number of TMMBN blocks 1018 // Use packet length to calc max number of TMMBN blocks
1026 // each TMMBN block is 8 bytes 1019 // each TMMBN block is 8 bytes
1027 ptrdiff_t maxNumOfTMMBNBlocks = rtcpParser.LengthLeft() / 8; 1020 ptrdiff_t maxNumOfTMMBNBlocks = rtcpParser.LengthLeft() / 8;
1028 1021
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1060 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); 1053 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1061 while (pktType == RTCPPacketTypes::kPsfbSliItem) { 1054 while (pktType == RTCPPacketTypes::kPsfbSliItem) {
1062 HandleSLIItem(rtcpPacket, rtcpPacketInformation); 1055 HandleSLIItem(rtcpPacket, rtcpPacketInformation);
1063 pktType = rtcpParser.Iterate(); 1056 pktType = rtcpParser.Iterate();
1064 } 1057 }
1065 } 1058 }
1066 1059
1067 void RTCPReceiver::HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket, 1060 void RTCPReceiver::HandleSLIItem(const RTCPUtility::RTCPPacket& rtcpPacket,
1068 RTCPPacketInformation& rtcpPacketInformation) { 1061 RTCPPacketInformation& rtcpPacketInformation) {
1069 // in theory there could be multiple slices lost 1062 // in theory there could be multiple slices lost
1070 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpSli; // received signal that we need to refresh a slice 1063 rtcpPacketInformation.rtcpPacketTypeFlags |=
1064 kRtcpSli; // received signal that we need to refresh a slice
1071 rtcpPacketInformation.sliPictureId = rtcpPacket.SLIItem.PictureId; 1065 rtcpPacketInformation.sliPictureId = rtcpPacket.SLIItem.PictureId;
1072 } 1066 }
1073 1067
1074 void 1068 void RTCPReceiver::HandleRPSI(
1075 RTCPReceiver::HandleRPSI(RTCPUtility::RTCPParserV2& rtcpParser, 1069 RTCPUtility::RTCPParserV2& rtcpParser,
1076 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) 1070 RTCPHelp::RTCPPacketInformation& rtcpPacketInformation) {
1077 { 1071 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1078 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 1072 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1079 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); 1073 if (pktType == RTCPPacketTypes::kPsfbRpsiItem) {
1080 if (pktType == RTCPPacketTypes::kPsfbRpsiItem) { 1074 if (rtcpPacket.RPSI.NumberOfValidBits % 8 != 0) {
1081 if(rtcpPacket.RPSI.NumberOfValidBits%8 != 0) 1075 // to us unknown
1082 { 1076 // continue
1083 // to us unknown 1077 rtcpParser.Iterate();
1084 // continue 1078 return;
1085 rtcpParser.Iterate(); 1079 }
1086 return; 1080 // Received signal that we have a confirmed reference picture.
1087 } 1081 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRpsi;
1088 // Received signal that we have a confirmed reference picture. 1082 rtcpPacketInformation.rpsiPictureId = 0;
1089 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRpsi;
1090 rtcpPacketInformation.rpsiPictureId = 0;
1091 1083
1092 // convert NativeBitString to rpsiPictureId 1084 // convert NativeBitString to rpsiPictureId
1093 uint8_t numberOfBytes = rtcpPacket.RPSI.NumberOfValidBits /8; 1085 uint8_t numberOfBytes = rtcpPacket.RPSI.NumberOfValidBits / 8;
1094 for(uint8_t n = 0; n < (numberOfBytes-1); n++) 1086 for (uint8_t n = 0; n < (numberOfBytes - 1); n++) {
1095 { 1087 rtcpPacketInformation.rpsiPictureId +=
1096 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitStr ing[n] & 0x7f); 1088 (rtcpPacket.RPSI.NativeBitString[n] & 0x7f);
1097 rtcpPacketInformation.rpsiPictureId <<= 7; // prepare next 1089 rtcpPacketInformation.rpsiPictureId <<= 7; // prepare next
1098 }
1099 rtcpPacketInformation.rpsiPictureId += (rtcpPacket.RPSI.NativeBitString[ numberOfBytes-1] & 0x7f);
1100 } 1090 }
1091 rtcpPacketInformation.rpsiPictureId +=
1092 (rtcpPacket.RPSI.NativeBitString[numberOfBytes - 1] & 0x7f);
1093 }
1101 } 1094 }
1102 1095
1103 void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, 1096 void RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser,
1104 RTCPPacketInformation& rtcpPacketInformation) { 1097 RTCPPacketInformation& rtcpPacketInformation) {
1105 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); 1098 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1106 if (pktType == RTCPPacketTypes::kPsfbRemb) { 1099 if (pktType == RTCPPacketTypes::kPsfbRemb) {
1107 pktType = rtcpParser.Iterate(); 1100 pktType = rtcpParser.Iterate();
1108 if (pktType == RTCPPacketTypes::kPsfbRembItem) { 1101 if (pktType == RTCPPacketTypes::kPsfbRembItem) {
1109 HandleREMBItem(rtcpParser, rtcpPacketInformation); 1102 HandleREMBItem(rtcpParser, rtcpPacketInformation);
1110 rtcpParser.Iterate(); 1103 rtcpParser.Iterate();
1111 } 1104 }
1112 } 1105 }
1113 } 1106 }
1114 1107
1115 void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser, 1108 void RTCPReceiver::HandleIJ(RTCPUtility::RTCPParserV2& rtcpParser,
1116 RTCPPacketInformation& rtcpPacketInformation) { 1109 RTCPPacketInformation& rtcpPacketInformation) {
1117 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 1110 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1118 1111
1119 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); 1112 RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
1120 while (pktType == RTCPPacketTypes::kExtendedIjItem) { 1113 while (pktType == RTCPPacketTypes::kExtendedIjItem) {
1121 HandleIJItem(rtcpPacket, rtcpPacketInformation); 1114 HandleIJItem(rtcpPacket, rtcpPacketInformation);
1122 pktType = rtcpParser.Iterate(); 1115 pktType = rtcpParser.Iterate();
1123 } 1116 }
1124 } 1117 }
1125 1118
1126 void RTCPReceiver::HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket, 1119 void RTCPReceiver::HandleIJItem(const RTCPUtility::RTCPPacket& rtcpPacket,
1127 RTCPPacketInformation& rtcpPacketInformation) { 1120 RTCPPacketInformation& rtcpPacketInformation) {
1128 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset; 1121 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpTransmissionTimeOffset;
1129 rtcpPacketInformation.interArrivalJitter = 1122 rtcpPacketInformation.interArrivalJitter =
1130 rtcpPacket.ExtendedJitterReportItem.Jitter; 1123 rtcpPacket.ExtendedJitterReportItem.Jitter;
1131 } 1124 }
1132 1125
1133 void RTCPReceiver::HandleREMBItem( 1126 void RTCPReceiver::HandleREMBItem(
1134 RTCPUtility::RTCPParserV2& rtcpParser, 1127 RTCPUtility::RTCPParserV2& rtcpParser,
1135 RTCPPacketInformation& rtcpPacketInformation) { 1128 RTCPPacketInformation& rtcpPacketInformation) {
1136 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 1129 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1137 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb; 1130 rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb;
1138 rtcpPacketInformation.receiverEstimatedMaxBitrate = 1131 rtcpPacketInformation.receiverEstimatedMaxBitrate =
1139 rtcpPacket.REMBItem.BitRate; 1132 rtcpPacket.REMBItem.BitRate;
1140 } 1133 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 rtcpPacketInformation.applicationSubType = rtcpPacket.APP.SubType; 1185 rtcpPacketInformation.applicationSubType = rtcpPacket.APP.SubType;
1193 rtcpPacketInformation.applicationName = rtcpPacket.APP.Name; 1186 rtcpPacketInformation.applicationName = rtcpPacket.APP.Name;
1194 1187
1195 rtcpParser.Iterate(); 1188 rtcpParser.Iterate();
1196 } 1189 }
1197 1190
1198 void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser, 1191 void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser,
1199 RTCPPacketInformation& rtcpPacketInformation) { 1192 RTCPPacketInformation& rtcpPacketInformation) {
1200 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 1193 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1201 1194
1202 rtcpPacketInformation.AddApplicationData(rtcpPacket.APP.Data, rtcpPacket.APP.S ize); 1195 rtcpPacketInformation.AddApplicationData(rtcpPacket.APP.Data,
1196 rtcpPacket.APP.Size);
1203 1197
1204 rtcpParser.Iterate(); 1198 rtcpParser.Iterate();
1205 } 1199 }
1206 1200
1207 void RTCPReceiver::HandleTransportFeedback( 1201 void RTCPReceiver::HandleTransportFeedback(
1208 RTCPUtility::RTCPParserV2* rtcp_parser, 1202 RTCPUtility::RTCPParserV2* rtcp_parser,
1209 RTCPHelp::RTCPPacketInformation* rtcp_packet_information) { 1203 RTCPHelp::RTCPPacketInformation* rtcp_packet_information) {
1210 rtcp::RtcpPacket* packet = rtcp_parser->ReleaseRtcpPacket(); 1204 rtcp::RtcpPacket* packet = rtcp_parser->ReleaseRtcpPacket();
1211 RTC_DCHECK(packet != nullptr); 1205 RTC_DCHECK(packet != nullptr);
1212 rtcp_packet_information->rtcpPacketTypeFlags |= kRtcpTransportFeedback; 1206 rtcp_packet_information->rtcpPacketTypeFlags |= kRtcpTransportFeedback;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1269 registered_ssrcs = registered_ssrcs_; 1263 registered_ssrcs = registered_ssrcs_;
1270 } 1264 }
1271 if (!receiver_only_ && 1265 if (!receiver_only_ &&
1272 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) { 1266 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) {
1273 _rtpRtcp.OnRequestSendReport(); 1267 _rtpRtcp.OnRequestSendReport();
1274 } 1268 }
1275 if (!receiver_only_ && 1269 if (!receiver_only_ &&
1276 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) { 1270 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) {
1277 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { 1271 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) {
1278 LOG(LS_VERBOSE) << "Incoming NACK length: " 1272 LOG(LS_VERBOSE) << "Incoming NACK length: "
1279 << rtcpPacketInformation.nackSequenceNumbers.size(); 1273 << rtcpPacketInformation.nackSequenceNumbers.size();
1280 _rtpRtcp.OnReceivedNACK(rtcpPacketInformation.nackSequenceNumbers); 1274 _rtpRtcp.OnReceivedNACK(rtcpPacketInformation.nackSequenceNumbers);
1281 } 1275 }
1282 } 1276 }
1283 { 1277 {
1284 // We need feedback that we have received a report block(s) so that we 1278 // We need feedback that we have received a report block(s) so that we
1285 // can generate a new packet in a conference relay scenario, one received 1279 // can generate a new packet in a conference relay scenario, one received
1286 // report can generate several RTCP packets, based on number relayed/mixed 1280 // report can generate several RTCP packets, based on number relayed/mixed
1287 // a send report block should go out to all receivers. 1281 // a send report block should go out to all receivers.
1288 if (_cbRtcpIntraFrameObserver) { 1282 if (_cbRtcpIntraFrameObserver) {
1289 RTC_DCHECK(!receiver_only_); 1283 RTC_DCHECK(!receiver_only_);
(...skipping 22 matching lines...) Expand all
1312 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRemb) { 1306 if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRemb) {
1313 LOG(LS_VERBOSE) << "Incoming REMB: " 1307 LOG(LS_VERBOSE) << "Incoming REMB: "
1314 << rtcpPacketInformation.receiverEstimatedMaxBitrate; 1308 << rtcpPacketInformation.receiverEstimatedMaxBitrate;
1315 _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate( 1309 _cbRtcpBandwidthObserver->OnReceivedEstimatedBitrate(
1316 rtcpPacketInformation.receiverEstimatedMaxBitrate); 1310 rtcpPacketInformation.receiverEstimatedMaxBitrate);
1317 } 1311 }
1318 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) || 1312 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) ||
1319 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) { 1313 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) {
1320 int64_t now = _clock->TimeInMilliseconds(); 1314 int64_t now = _clock->TimeInMilliseconds();
1321 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport( 1315 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport(
1322 rtcpPacketInformation.report_blocks, 1316 rtcpPacketInformation.report_blocks, rtcpPacketInformation.rtt,
1323 rtcpPacketInformation.rtt,
1324 now); 1317 now);
1325 } 1318 }
1326 } 1319 }
1327 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) || 1320 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) ||
1328 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) { 1321 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) {
1329 _rtpRtcp.OnReceivedRtcpReportBlocks(rtcpPacketInformation.report_blocks); 1322 _rtpRtcp.OnReceivedRtcpReportBlocks(rtcpPacketInformation.report_blocks);
1330 } 1323 }
1331 1324
1332 if (_cbTransportFeedbackObserver && 1325 if (_cbTransportFeedbackObserver &&
1333 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) { 1326 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) {
1334 uint32_t media_source_ssrc = 1327 uint32_t media_source_ssrc =
1335 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc(); 1328 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc();
1336 if (media_source_ssrc == local_ssrc || 1329 if (media_source_ssrc == local_ssrc ||
1337 registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) { 1330 registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) {
1338 _cbTransportFeedbackObserver->OnTransportFeedback( 1331 _cbTransportFeedbackObserver->OnTransportFeedback(
1339 *rtcpPacketInformation.transport_feedback_.get()); 1332 *rtcpPacketInformation.transport_feedback_.get());
1340 } 1333 }
1341 } 1334 }
1342 } 1335 }
1343 1336
1344 if (!receiver_only_) { 1337 if (!receiver_only_) {
1345 rtc::CritScope cs(&_criticalSectionFeedbacks); 1338 rtc::CritScope cs(&_criticalSectionFeedbacks);
1346 if (stats_callback_) { 1339 if (stats_callback_) {
1347 for (ReportBlockList::const_iterator it = 1340 for (ReportBlockList::const_iterator it =
1348 rtcpPacketInformation.report_blocks.begin(); 1341 rtcpPacketInformation.report_blocks.begin();
1349 it != rtcpPacketInformation.report_blocks.end(); 1342 it != rtcpPacketInformation.report_blocks.end(); ++it) {
1350 ++it) {
1351 RtcpStatistics stats; 1343 RtcpStatistics stats;
1352 stats.cumulative_lost = it->cumulativeLost; 1344 stats.cumulative_lost = it->cumulativeLost;
1353 stats.extended_max_sequence_number = it->extendedHighSeqNum; 1345 stats.extended_max_sequence_number = it->extendedHighSeqNum;
1354 stats.fraction_lost = it->fractionLost; 1346 stats.fraction_lost = it->fractionLost;
1355 stats.jitter = it->jitter; 1347 stats.jitter = it->jitter;
1356 1348
1357 stats_callback_->StatisticsUpdated(stats, it->sourceSSRC); 1349 stats_callback_->StatisticsUpdated(stats, it->sourceSSRC);
1358 } 1350 }
1359 } 1351 }
1360 } 1352 }
(...skipping 21 matching lines...) Expand all
1382 1374
1383 for (const auto& kv : _receivedInfoMap) { 1375 for (const auto& kv : _receivedInfoMap) {
1384 RTCPReceiveInformation* receive_info = kv.second; 1376 RTCPReceiveInformation* receive_info = kv.second;
1385 RTC_DCHECK(receive_info); 1377 RTC_DCHECK(receive_info);
1386 receive_info->GetTmmbrSet(now_ms, &candidates); 1378 receive_info->GetTmmbrSet(now_ms, &candidates);
1387 } 1379 }
1388 return candidates; 1380 return candidates;
1389 } 1381 }
1390 1382
1391 } // namespace webrtc 1383 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtcp_receiver.h ('k') | webrtc/modules/rtp_rtcp/source/rtcp_receiver_help.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698