一、当 sender / receiver 收到一个 RTCP 包时,会根据包类型调用分别调用不同的处理函数。对于 SR 和 RR 包,都会交由 HandleSenderReceiverReport() 处理:
int32_t ModuleRtpRtcpImpl::IncomingRtcpPacket(const uint8_t* rtcp_packet, const size_t length) --------- rtp_rtcp_impl.cc
int32_t RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation, RTCPUtility::RTCPParserV2* rtcpParser) --------- rtp_rtcp_impl.cc
int32_t
RTCPReceiver::IncomingRTCPPacket(RTCPPacketInformation& rtcpPacketInformation,
RTCPUtility::RTCPParserV2* rtcpParser)
{
...
...
...
while (pktType != RTCPPacketTypes::kInvalid)
{
// Each "case" is responsible for iterate the parser to the
// next top level packet.
switch (pktType)
{
case RTCPPacketTypes::kSr:
case RTCPPacketTypes::kRr:
HandleSenderReceiverReport(*rtcpParser, rtcpPacketInformation);
break;
...
...
...
}
pktType = rtcpParser->PacketType();
}
...
...
...
}
二、对于 SR 包,receiver 会保留包内所携带的 NTP 时间戳,并记录当前 NTP 时间戳:
void
RTCPReceiver::HandleSenderReceiverReport(RTCPUtility::RTCPParserV2& rtcpParser,
RTCPPacketInformation& rtcpPacketInformation)
{
RTCPUtility::RTCPPacketTypes rtcpPacketType = rtcpParser.PacketType(