Bugfix issue 533. Client does not handle NACK or PLI requests received from far end if a RTCP report from it has not been processed when RFC 5506 is enabled.
Review URL: https://webrtc-codereview.appspot.com/569020
git-svn-id: http://webrtc.googlecode.com/svn/trunk@2263 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver.cc b/src/modules/rtp_rtcp/source/rtcp_receiver.cc
index d9365e9..7d80d18 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -721,14 +721,6 @@
RTCPPacketInformation& rtcpPacketInformation)
{
const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
-
- RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(rtcpPacket.NACK.SenderSSRC);
- if (ptrReceiveInfo == NULL)
- {
- // This remote SSRC must be saved before.
- rtcpParser.Iterate();
- return;
- }
if (_SSRC != rtcpPacket.NACK.MediaSSRC)
{
// Not to us.
@@ -846,27 +838,14 @@
}
// no need for critsect we have _criticalSectionRTCPReceiver
-void
-RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser,
- RTCPPacketInformation& rtcpPacketInformation)
-{
- const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
-
- RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(rtcpPacket.PLI.SenderSSRC);
- if (ptrReceiveInfo == NULL)
- {
- // This remote SSRC must be saved before.
- rtcpParser.Iterate();
- return;
- }
- if (_SSRC != rtcpPacket.PLI.MediaSSRC)
- {
- // Not to us.
- rtcpParser.Iterate();
- return;
- }
- rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpPli; // received signal that we need to send a new key frame
- rtcpParser.Iterate();
+void RTCPReceiver::HandlePLI(RTCPUtility::RTCPParserV2& rtcpParser,
+ RTCPPacketInformation& rtcpPacketInformation) {
+ const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
+ if (_SSRC == rtcpPacket.PLI.MediaSSRC) {
+ // Received a signal that we need to send a new key frame.
+ rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpPli;
+ }
+ rtcpParser.Iterate();
}
// no need for critsect we have _criticalSectionRTCPReceiver
@@ -990,15 +969,6 @@
RTCPPacketInformation& rtcpPacketInformation)
{
const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
-
- RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(rtcpPacket.SLI.SenderSSRC);
- if (ptrReceiveInfo == NULL)
- {
- // This remote SSRC must be saved before.
- rtcpParser.Iterate();
- return;
- }
-
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
while (pktType == RTCPUtility::kRtcpPsfbSliItemCode)
{
@@ -1022,14 +992,6 @@
RTCPHelp::RTCPPacketInformation& rtcpPacketInformation)
{
const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
-
- RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(rtcpPacket.RPSI.SenderSSRC);
- if (ptrReceiveInfo == NULL)
- {
- // This remote SSRC must be saved before.
- rtcpParser.Iterate();
- return;
- }
RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
if(pktType == RTCPUtility::kRtcpPsfbRpsiCode)
{
@@ -1101,55 +1063,47 @@
}
// no need for critsect we have _criticalSectionRTCPReceiver
-void
-RTCPReceiver::HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser,
- RTCPPacketInformation& rtcpPacketInformation)
-{
- const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
+void RTCPReceiver::HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser,
+ RTCPPacketInformation& rtcpPacketInformation) {
+ const RTCPUtility::RTCPPacket& rtcpPacket = rtcpParser.Packet();
+ RTCPReceiveInformation* ptrReceiveInfo =
+ GetReceiveInformation(rtcpPacket.FIR.SenderSSRC);
- RTCPReceiveInformation* ptrReceiveInfo = GetReceiveInformation(rtcpPacket.FIR.SenderSSRC);
- if (ptrReceiveInfo == NULL)
- {
- // This remote SSRC must be saved before.
- rtcpParser.Iterate();
- return;
- }
-
- RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
- while (pktType == RTCPUtility::kRtcpPsfbFirItemCode)
- {
- HandleFIRItem(*ptrReceiveInfo, rtcpPacket, rtcpPacketInformation);
- pktType = rtcpParser.Iterate();
- }
+ RTCPUtility::RTCPPacketTypes pktType = rtcpParser.Iterate();
+ while (pktType == RTCPUtility::kRtcpPsfbFirItemCode) {
+ HandleFIRItem(ptrReceiveInfo, rtcpPacket, rtcpPacketInformation);
+ pktType = rtcpParser.Iterate();
+ }
}
// no need for critsect we have _criticalSectionRTCPReceiver
-void
-RTCPReceiver::HandleFIRItem(RTCPReceiveInformation& receiveInfo,
- const RTCPUtility::RTCPPacket& rtcpPacket,
- RTCPPacketInformation& rtcpPacketInformation)
-{
- if (_SSRC == rtcpPacket.FIRItem.SSRC) // is it our sender that is requested to generate a new keyframe
- {
- // rtcpPacket.FIR.MediaSSRC SHOULD be 0 but we ignore to check it
- // we don't know who this originate from
-
- // check if we have reported this FIRSequenceNumber before
- if (rtcpPacket.FIRItem.CommandSequenceNumber != receiveInfo.lastFIRSequenceNumber)
- {
- //
- WebRtc_UWord32 now = _clock.GetTimeInMS();
-
- // extra sanity don't go crazy with the callbacks
- if( (now - receiveInfo.lastFIRRequest) > RTCP_MIN_FRAME_LENGTH_MS)
- {
- receiveInfo.lastFIRRequest = now;
- receiveInfo.lastFIRSequenceNumber = rtcpPacket.FIRItem.CommandSequenceNumber;
-
- rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpFir; // received signal that we need to send a new key frame
- }
- }
+void RTCPReceiver::HandleFIRItem(RTCPReceiveInformation* receiveInfo,
+ const RTCPUtility::RTCPPacket& rtcpPacket,
+ RTCPPacketInformation& rtcpPacketInformation) {
+ // Is it our sender that is requested to generate a new keyframe
+ if (_SSRC != rtcpPacket.FIRItem.SSRC) {
+ return;
+ }
+ // rtcpPacket.FIR.MediaSSRC SHOULD be 0 but we ignore to check it
+ // we don't know who this originate from
+ if (receiveInfo) {
+ // check if we have reported this FIRSequenceNumber before
+ if (rtcpPacket.FIRItem.CommandSequenceNumber !=
+ receiveInfo->lastFIRSequenceNumber) {
+ WebRtc_UWord32 now = _clock.GetTimeInMS();
+ // sanity; don't go crazy with the callbacks
+ if ((now - receiveInfo->lastFIRRequest) > RTCP_MIN_FRAME_LENGTH_MS) {
+ receiveInfo->lastFIRRequest = now;
+ receiveInfo->lastFIRSequenceNumber =
+ rtcpPacket.FIRItem.CommandSequenceNumber;
+ // received signal that we need to send a new key frame
+ rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpFir;
+ }
}
+ } else {
+ // received signal that we need to send a new key frame
+ rtcpPacketInformation.rtcpPacketTypeFlags |= kRtcpFir;
+ }
}
void
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver.h b/src/modules/rtp_rtcp/source/rtcp_receiver.h
index df2d18b..ff6f19a 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -175,7 +175,7 @@
void HandleFIR(RTCPUtility::RTCPParserV2& rtcpParser,
RTCPHelp::RTCPPacketInformation& rtcpPacketInformation);
- void HandleFIRItem(RTCPHelp::RTCPReceiveInformation& receiveInfo,
+ void HandleFIRItem(RTCPHelp::RTCPReceiveInformation* receiveInfo,
const RTCPUtility::RTCPPacket& rtcpPacket,
RTCPHelp::RTCPPacketInformation& rtcpPacketInformation);