我们首先来看下RTCP的RR报文的格式:
接着上一篇,我们来到ModuleRtpRtcpImpl的IncomingRtcpPacket函数中,如下:
int32_t ModuleRtpRtcpImpl::IncomingRtcpPacket(
const uint8_t* rtcp_packet,
const size_t length) {
RTCPUtility::RTCPParserV2 rtcp_parser(rtcp_packet, length, true); //创建RTCPParserV2
const bool valid_rtcpheader = rtcp_parser.IsValid(); //判断头是否有效
if (!valid_rtcpheader) {
return -1;
}
RTCPHelp::RTCPPacketInformation rtcp_packet_information;
int32_t ret_val = rtcp_receiver_.IncomingRTCPPacket(
rtcp_packet_information, &rtcp_parser); //将rtcp_parser解析出来的内容赋给rtcp_packet_information
if (ret_val == 0) {
rtcp_receiver_.TriggerCallbacksFromRTCPPacket(rtcp_packet_information);
}
return ret_val;
}
RTCPParserV2 的解析过程比较绕,这里不打算详解,先看下RTCPParserV2 内的一个成员:
class RTCPParserV2 {
private:
RTCPPacket _packet;
}
union RTCPPacket {
RTCPPacketRR RR; //
RTCPPacketSR SR;
RTCPPacketReportBlockItem ReportBlockItem;
RTCPPacketSDESCName CName;
RTCPPacketBYE BYE;
//...
};
RTCPPacket 是一个联合体,我们主要看下RR报文有关的RTCPPacketRR和RTCPPacketReportBlo