From a768970bac6f5d57a4f4ae5185315bf84d37798f Mon Sep 17 00:00:00 2001 From: "asapersson@webrtc.org" Date: Thu, 19 Apr 2012 07:01:29 +0000 Subject: [PATCH] Parse out ssrcs in REMB message (needed for ViCE) . Review URL: https://webrtc-codereview.appspot.com/486003 git-svn-id: http://webrtc.googlecode.com/svn/trunk@2061 4adac7df-926f-26a2-2b94-8c16560cd09d --- src/modules/rtp_rtcp/source/rtcp_receiver.cc | 15 +++++---- src/modules/rtp_rtcp/source/rtcp_utility.cc | 32 +++++++++++++++---- src/modules/rtp_rtcp/source/rtcp_utility.h | 13 ++++++-- src/modules/rtp_rtcp/source/rtp_rtcp_config.h | 3 +- src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc | 2 +- src/modules/rtp_rtcp/source/rtp_rtcp_impl.h | 6 ++-- 6 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver.cc b/src/modules/rtp_rtcp/source/rtcp_receiver.cc index d65afdff5a..f47691367d 100644 --- a/src/modules/rtp_rtcp/source/rtcp_receiver.cc +++ b/src/modules/rtp_rtcp/source/rtcp_receiver.cc @@ -1082,10 +1082,14 @@ RTCPReceiver::HandlePsfbApp(RTCPUtility::RTCPParserV2& rtcpParser, RTCPPacketInformation& rtcpPacketInformation) { RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate(); - if (pktType == RTCPUtility::kRtcpPsfbRembItemCode) + if (pktType == RTCPUtility::kRtcpPsfbRembCode) { - HandleREMBItem(rtcpParser, rtcpPacketInformation); - rtcpParser.Iterate(); + pktType = rtcpParser.Iterate(); + if (pktType == RTCPUtility::kRtcpPsfbRembItemCode) + { + HandleREMBItem(rtcpParser, rtcpPacketInformation); + rtcpParser.Iterate(); + } } } @@ -1117,12 +1121,11 @@ void RTCPReceiver::HandleREMBItem(RTCPUtility::RTCPParserV2& rtcpParser, RTCPPacketInformation& rtcpPacketInformation) { - rtcpParser.Iterate(); const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet(); rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpRemb; - rtcpPacketInformation.receiverEstimatedMaxBitrate = rtcpPacket.REMB.BitRate; - // TODO(pwestin) send up SSRCs and do a sanity check + rtcpPacketInformation.receiverEstimatedMaxBitrate = + rtcpPacket.REMBItem.BitRate; } // no need for critsect we have _criticalSectionRTCPReceiver diff --git a/src/modules/rtp_rtcp/source/rtcp_utility.cc b/src/modules/rtp_rtcp/source/rtcp_utility.cc index f421672146..8673e872cf 100644 --- a/src/modules/rtp_rtcp/source/rtcp_utility.cc +++ b/src/modules/rtp_rtcp/source/rtcp_utility.cc @@ -14,7 +14,6 @@ #include // ceil #include - namespace webrtc { // RTCPParserV2 : currently read only @@ -1095,7 +1094,9 @@ RTCPUtility::RTCPParserV2::ParseFBCommon(const RTCPCommonHeader& header) _state = State_PSFB_FIRItem; return true; case 15: - _packetType = kRtcpPsfbAppCode; + _packetType = kRtcpPsfbAppCode; + _packet.PSFBAPP.SenderSSRC = senderSSRC; + _packet.PSFBAPP.MediaSSRC = mediaSSRC; _state = State_PSFB_AppItem; return true; @@ -1223,11 +1224,11 @@ RTCPUtility::RTCPParserV2::ParsePsfbAppItem() EndCurrentBlock(); return false; } - _packetType = kRtcpPsfbRembItemCode; + _packetType = kRtcpPsfbRembCode; _state = State_PSFB_REMBItem; return true; } - + bool RTCPUtility::RTCPParserV2::ParsePsfbREMBItem() { @@ -1241,7 +1242,7 @@ RTCPUtility::RTCPParserV2::ParsePsfbREMBItem() return false; } - const WebRtc_UWord8 numSSRC = *_ptrRTCPData++; + _packet.REMBItem.NumberOfSSRCs = *_ptrRTCPData++; const WebRtc_UWord8 brExp = (_ptrRTCPData[0] >> 2) & 0x3F; WebRtc_UWord32 brMantissa = (_ptrRTCPData[0] & 0x03) << 16; @@ -1249,9 +1250,26 @@ RTCPUtility::RTCPParserV2::ParsePsfbREMBItem() brMantissa += (_ptrRTCPData[2]); _ptrRTCPData += 3; // Fwd read data - _packet.REMB.BitRate = (brMantissa << brExp); + _packet.REMBItem.BitRate = (brMantissa << brExp); - _ptrRTCPData += 4 * numSSRC; // Ignore the SSRCs for now + const ptrdiff_t length_ssrcs = _ptrRTCPBlockEnd - _ptrRTCPData; + if (length_ssrcs < 4 * _packet.REMBItem.NumberOfSSRCs) + { + _state = State_TopLevel; + + EndCurrentBlock(); + return false; + } + + _packetType = kRtcpPsfbRembItemCode; + + for (int i = 0; i < _packet.REMBItem.NumberOfSSRCs; i++) + { + _packet.REMBItem.SSRCs[i] = *_ptrRTCPData++ << 24; + _packet.REMBItem.SSRCs[i] += *_ptrRTCPData++ << 16; + _packet.REMBItem.SSRCs[i] += *_ptrRTCPData++ << 8; + _packet.REMBItem.SSRCs[i] += *_ptrRTCPData++; + } return true; } diff --git a/src/modules/rtp_rtcp/source/rtcp_utility.h b/src/modules/rtp_rtcp/source/rtcp_utility.h index faba2efe28..cce1f0b3ac 100644 --- a/src/modules/rtp_rtcp/source/rtcp_utility.h +++ b/src/modules/rtp_rtcp/source/rtcp_utility.h @@ -179,9 +179,16 @@ namespace RTCPUtility { WebRtc_UWord16 NumberOfValidBits; WebRtc_UWord8 NativeBitString[RTCP_RPSI_DATA_SIZE]; }; - struct RTCPPacketPSFBREMB + struct RTCPPacketPSFBAPP + { + WebRtc_UWord32 SenderSSRC; + WebRtc_UWord32 MediaSSRC; + }; + struct RTCPPacketPSFBREMBItem { WebRtc_UWord32 BitRate; + WebRtc_UWord8 NumberOfSSRCs; + WebRtc_UWord32 SSRCs[MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS]; }; // generic name APP struct RTCPPacketAPP @@ -210,7 +217,8 @@ namespace RTCPUtility { RTCPPacketPSFBSLI SLI; RTCPPacketPSFBSLIItem SLIItem; RTCPPacketPSFBRPSI RPSI; - RTCPPacketPSFBREMB REMB; + RTCPPacketPSFBAPP PSFBAPP; + RTCPPacketPSFBREMBItem REMBItem; RTCPPacketRTPFBTMMBR TMMBR; RTCPPacketRTPFBTMMBRItem TMMBRItem; @@ -251,6 +259,7 @@ namespace RTCPUtility { kRtcpPsfbSliCode, kRtcpPsfbSliItemCode, kRtcpPsfbAppCode, + kRtcpPsfbRembCode, kRtcpPsfbRembItemCode, // RFC5104 diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_config.h b/src/modules/rtp_rtcp/source/rtp_rtcp_config.h index a0eed88ed8..066b3c26d8 100644 --- a/src/modules/rtp_rtcp/source/rtp_rtcp_config.h +++ b/src/modules/rtp_rtcp/source/rtp_rtcp_config.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source @@ -31,6 +31,7 @@ enum { RTCP_NUMBER_OF_SR = 60 }; enum { MAX_NUMBER_OF_TEMPORAL_ID = 8 }; // RFC enum { MAX_NUMBER_OF_DEPENDENCY_QUALITY_ID = 128 };// RFC +enum { MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS = 255 }; enum { BW_HISTORY_SIZE = 35}; diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc index 84f3eefce3..f422d11277 100644 --- a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc +++ b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc @@ -86,6 +86,7 @@ ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const WebRtc_Word32 id, _rtpReceiver(id, audio, clock, this), _rtcpSender(id, audio, clock, this), _rtcpReceiver(id, clock, this), + _bandwidthManagement(id), _owns_clock(false), _clock(*clock), _id(id), @@ -104,7 +105,6 @@ ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const WebRtc_Word32 id, _deadOrAliveActive(false), _deadOrAliveTimeoutMS(0), _deadOrAliveLastTimer(0), - _bandwidthManagement(id), _receivedNTPsecsAudio(0), _receivedNTPfracAudio(0), _RTCPArrivalTimeSecsAudio(0), diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h index 0dca764651..1214160a38 100644 --- a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h +++ b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h @@ -480,7 +480,7 @@ public: WebRtc_UWord32* available_bandwidth) const; virtual void SetRemoteSSRC(const WebRtc_UWord32 SSRC); - + virtual WebRtc_UWord32 SendTimeOfSendReport(const WebRtc_UWord32 sendReport); virtual RateControlRegion OnOverUseStateUpdate(const RateControlInput& rateControlInput); @@ -546,6 +546,8 @@ protected: RTCPSender _rtcpSender; RTCPReceiver _rtcpReceiver; + BandwidthManagement _bandwidthManagement; + bool _owns_clock; RtpRtcpClock& _clock; private: @@ -573,8 +575,6 @@ private: WebRtc_UWord32 _deadOrAliveLastTimer; // receive side - BandwidthManagement _bandwidthManagement; - WebRtc_UWord32 _receivedNTPsecsAudio; WebRtc_UWord32 _receivedNTPfracAudio; WebRtc_UWord32 _RTCPArrivalTimeSecsAudio;