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

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

Issue 1338203003: Wire up send-side bandwidth estimation. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 3 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 18 matching lines...) Expand all
29 // The number of RTCP time intervals needed to trigger a timeout. 29 // The number of RTCP time intervals needed to trigger a timeout.
30 const int kRrTimeoutIntervals = 3; 30 const int kRrTimeoutIntervals = 3;
31 31
32 RTCPReceiver::RTCPReceiver( 32 RTCPReceiver::RTCPReceiver(
33 int32_t id, 33 int32_t id,
34 Clock* clock, 34 Clock* clock,
35 bool receiver_only, 35 bool receiver_only,
36 RtcpPacketTypeCounterObserver* packet_type_counter_observer, 36 RtcpPacketTypeCounterObserver* packet_type_counter_observer,
37 RtcpBandwidthObserver* rtcp_bandwidth_observer, 37 RtcpBandwidthObserver* rtcp_bandwidth_observer,
38 RtcpIntraFrameObserver* rtcp_intra_frame_observer, 38 RtcpIntraFrameObserver* rtcp_intra_frame_observer,
39 TransportFeedbackObserver* transport_feedback_observer,
39 ModuleRtpRtcpImpl* owner) 40 ModuleRtpRtcpImpl* owner)
40 : TMMBRHelp(), 41 : TMMBRHelp(),
41 _clock(clock), 42 _clock(clock),
42 receiver_only_(receiver_only), 43 receiver_only_(receiver_only),
43 _method(kRtcpOff), 44 _method(kRtcpOff),
44 _lastReceived(0), 45 _lastReceived(0),
45 _rtpRtcp(*owner), 46 _rtpRtcp(*owner),
46 _criticalSectionFeedbacks( 47 _criticalSectionFeedbacks(
47 CriticalSectionWrapper::CreateCriticalSection()), 48 CriticalSectionWrapper::CreateCriticalSection()),
48 _cbRtcpBandwidthObserver(rtcp_bandwidth_observer), 49 _cbRtcpBandwidthObserver(rtcp_bandwidth_observer),
49 _cbRtcpIntraFrameObserver(rtcp_intra_frame_observer), 50 _cbRtcpIntraFrameObserver(rtcp_intra_frame_observer),
51 _cbTransportFeedbackObserver(transport_feedback_observer),
50 _criticalSectionRTCPReceiver( 52 _criticalSectionRTCPReceiver(
51 CriticalSectionWrapper::CreateCriticalSection()), 53 CriticalSectionWrapper::CreateCriticalSection()),
52 main_ssrc_(0), 54 main_ssrc_(0),
53 _remoteSSRC(0), 55 _remoteSSRC(0),
54 _remoteSenderInfo(), 56 _remoteSenderInfo(),
55 _lastReceivedSRNTPsecs(0), 57 _lastReceivedSRNTPsecs(0),
56 _lastReceivedSRNTPfrac(0), 58 _lastReceivedSRNTPfrac(0),
57 _lastReceivedXRNTPsecs(0), 59 _lastReceivedXRNTPsecs(0),
58 _lastReceivedXRNTPfrac(0), 60 _lastReceivedXRNTPfrac(0),
59 xr_rr_rtt_ms_(0), 61 xr_rr_rtt_ms_(0),
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 HandlePsfbApp(*rtcpParser, rtcpPacketInformation); 345 HandlePsfbApp(*rtcpParser, rtcpPacketInformation);
344 break; 346 break;
345 case RTCPPacketTypes::kApp: 347 case RTCPPacketTypes::kApp:
346 // generic application messages 348 // generic application messages
347 HandleAPP(*rtcpParser, rtcpPacketInformation); 349 HandleAPP(*rtcpParser, rtcpPacketInformation);
348 break; 350 break;
349 case RTCPPacketTypes::kAppItem: 351 case RTCPPacketTypes::kAppItem:
350 // generic application messages 352 // generic application messages
351 HandleAPPItem(*rtcpParser, rtcpPacketInformation); 353 HandleAPPItem(*rtcpParser, rtcpPacketInformation);
352 break; 354 break;
355 case RTCPPacketTypes::kTransportFeedback:
356 HandleTransportFeedback(rtcpParser, &rtcpPacketInformation);
357 break;
353 default: 358 default:
354 rtcpParser->Iterate(); 359 rtcpParser->Iterate();
355 break; 360 break;
356 } 361 }
357 pktType = rtcpParser->PacketType(); 362 pktType = rtcpParser->PacketType();
358 } 363 }
359 364
360 if (packet_type_counter_observer_ != NULL) { 365 if (packet_type_counter_observer_ != NULL) {
361 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated( 366 packet_type_counter_observer_->RtcpPacketTypesCounterUpdated(
362 main_ssrc_, packet_type_counter_); 367 main_ssrc_, packet_type_counter_);
(...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after
1246 1251
1247 void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser, 1252 void RTCPReceiver::HandleAPPItem(RTCPUtility::RTCPParserV2& rtcpParser,
1248 RTCPPacketInformation& rtcpPacketInformation) { 1253 RTCPPacketInformation& rtcpPacketInformation) {
1249 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); 1254 const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
1250 1255
1251 rtcpPacketInformation.AddApplicationData(rtcpPacket.APP.Data, rtcpPacket.APP.S ize); 1256 rtcpPacketInformation.AddApplicationData(rtcpPacket.APP.Data, rtcpPacket.APP.S ize);
1252 1257
1253 rtcpParser.Iterate(); 1258 rtcpParser.Iterate();
1254 } 1259 }
1255 1260
1261 void RTCPReceiver::HandleTransportFeedback(
1262 RTCPUtility::RTCPParserV2* rtcp_parser,
1263 RTCPHelp::RTCPPacketInformation* rtcp_packet_information) {
1264 rtcp::RtcpPacket* packet = rtcp_parser->ReleaseRtcpPacket();
1265 DCHECK(packet != nullptr);
1266 rtcp_packet_information->rtcpPacketTypeFlags |= kRtcpTransportFeedback;
stefan-webrtc 2015/09/17 10:33:19 I find it a bit strange that we use this flag when
sprang_webrtc 2015/09/17 15:08:28 Yeah. I'm just following suit. Definitely the whol
stefan-webrtc 2015/09/18 10:57:23 I think we have to outline how this is going to lo
sprang_webrtc 2015/09/21 10:44:10 Why would we want to end up somewhere suboptimal?
stefan-webrtc 2015/09/21 11:13:16 I mostly meant that we probably should have an ide
1267 rtcp_packet_information->transport_feedback_.reset(
1268 static_cast<rtcp::TransportFeedback*>(packet));
1269
1270 rtcp_parser->Iterate();
1271 }
1256 int32_t RTCPReceiver::UpdateTMMBR() { 1272 int32_t RTCPReceiver::UpdateTMMBR() {
1257 int32_t numBoundingSet = 0; 1273 int32_t numBoundingSet = 0;
1258 uint32_t bitrate = 0; 1274 uint32_t bitrate = 0;
1259 uint32_t accNumCandidates = 0; 1275 uint32_t accNumCandidates = 0;
1260 1276
1261 int32_t size = TMMBRReceived(0, 0, NULL); 1277 int32_t size = TMMBRReceived(0, 0, NULL);
1262 if (size > 0) { 1278 if (size > 0) {
1263 TMMBRSet* candidateSet = VerifyAndAllocateCandidateSet(size); 1279 TMMBRSet* candidateSet = VerifyAndAllocateCandidateSet(size);
1264 // Get candidate set from receiver. 1280 // Get candidate set from receiver.
1265 accNumCandidates = TMMBRReceived(size, accNumCandidates, candidateSet); 1281 accNumCandidates = TMMBRReceived(size, accNumCandidates, candidateSet);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1315 // Might trigger a OnReceivedBandwidthEstimateUpdate. 1331 // Might trigger a OnReceivedBandwidthEstimateUpdate.
1316 UpdateTMMBR(); 1332 UpdateTMMBR();
1317 } 1333 }
1318 unsigned int local_ssrc; 1334 unsigned int local_ssrc;
1319 { 1335 {
1320 // We don't want to hold this critsect when triggering the callbacks below. 1336 // We don't want to hold this critsect when triggering the callbacks below.
1321 CriticalSectionScoped lock(_criticalSectionRTCPReceiver); 1337 CriticalSectionScoped lock(_criticalSectionRTCPReceiver);
1322 local_ssrc = main_ssrc_; 1338 local_ssrc = main_ssrc_;
1323 } 1339 }
1324 if (!receiver_only_ && 1340 if (!receiver_only_ &&
1325 rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq) { 1341 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq)) {
1326 _rtpRtcp.OnRequestSendReport(); 1342 _rtpRtcp.OnRequestSendReport();
1327 } 1343 }
1328 if (!receiver_only_ && 1344 if (!receiver_only_ &&
1329 rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack) { 1345 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpNack)) {
1330 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) { 1346 if (rtcpPacketInformation.nackSequenceNumbers.size() > 0) {
1331 LOG(LS_VERBOSE) << "Incoming NACK length: " 1347 LOG(LS_VERBOSE) << "Incoming NACK length: "
1332 << rtcpPacketInformation.nackSequenceNumbers.size(); 1348 << rtcpPacketInformation.nackSequenceNumbers.size();
1333 _rtpRtcp.OnReceivedNACK(rtcpPacketInformation.nackSequenceNumbers); 1349 _rtpRtcp.OnReceivedNACK(rtcpPacketInformation.nackSequenceNumbers);
1334 } 1350 }
1335 } 1351 }
1336 { 1352 {
1337 // We need feedback that we have received a report block(s) so that we 1353 // We need feedback that we have received a report block(s) so that we
1338 // can generate a new packet in a conference relay scenario, one received 1354 // can generate a new packet in a conference relay scenario, one received
1339 // report can generate several RTCP packets, based on number relayed/mixed 1355 // report can generate several RTCP packets, based on number relayed/mixed
(...skipping 30 matching lines...) Expand all
1370 } 1386 }
1371 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) || 1387 if ((rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) ||
1372 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) { 1388 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpRr)) {
1373 int64_t now = _clock->TimeInMilliseconds(); 1389 int64_t now = _clock->TimeInMilliseconds();
1374 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport( 1390 _cbRtcpBandwidthObserver->OnReceivedRtcpReceiverReport(
1375 rtcpPacketInformation.report_blocks, 1391 rtcpPacketInformation.report_blocks,
1376 rtcpPacketInformation.rtt, 1392 rtcpPacketInformation.rtt,
1377 now); 1393 now);
1378 } 1394 }
1379 } 1395 }
1396 if (_cbTransportFeedbackObserver &&
1397 (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpTransportFeedback)) {
1398 uint32_t media_source_ssrc =
1399 rtcpPacketInformation.transport_feedback_->GetMediaSourceSsrc();
1400 if (media_source_ssrc == main_ssrc_ ||
1401 registered_ssrcs_.find(media_source_ssrc) !=
1402 registered_ssrcs_.end()) {
1403 _cbTransportFeedbackObserver->OnTransportFeedback(
1404 *rtcpPacketInformation.transport_feedback_.get());
1405 }
1406 }
1380 } 1407 }
1381 1408
1382 if (!receiver_only_) { 1409 if (!receiver_only_) {
1383 CriticalSectionScoped cs(_criticalSectionFeedbacks); 1410 CriticalSectionScoped cs(_criticalSectionFeedbacks);
1384 if (stats_callback_) { 1411 if (stats_callback_) {
1385 for (ReportBlockList::const_iterator it = 1412 for (ReportBlockList::const_iterator it =
1386 rtcpPacketInformation.report_blocks.begin(); 1413 rtcpPacketInformation.report_blocks.begin();
1387 it != rtcpPacketInformation.report_blocks.end(); 1414 it != rtcpPacketInformation.report_blocks.end();
1388 ++it) { 1415 ++it) {
1389 RtcpStatistics stats; 1416 RtcpStatistics stats;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1446 return -1; 1473 return -1;
1447 } 1474 }
1448 num += receiveInfo->TmmbrSet.lengthOfSet(); 1475 num += receiveInfo->TmmbrSet.lengthOfSet();
1449 receiveInfoIt++; 1476 receiveInfoIt++;
1450 } 1477 }
1451 } 1478 }
1452 return num; 1479 return num;
1453 } 1480 }
1454 1481
1455 } // namespace webrtc 1482 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698