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
This commit is contained in:
asapersson@webrtc.org
2012-04-19 07:01:29 +00:00
parent faa0ab85d7
commit a768970bac
6 changed files with 51 additions and 20 deletions

View File

@ -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

View File

@ -14,7 +14,6 @@
#include <cmath> // ceil
#include <cassert>
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;
}

View File

@ -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

View File

@ -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};

View File

@ -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),

View File

@ -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;