RR报文解析(一)

来源:互联网 发布:购买域名后 备案 编辑:程序博客网 时间:2024/04/26 23:59

我们首先来看下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和RTCPPacketReportBlockItem ,

struct RTCPPacketRR {  uint32_t SenderSSRC;  //发送端的SSRC  uint8_t NumberOfReportBlocks;  //该RR报文有多少个block,对应RC(reception report count)字段};struct RTCPPacketReportBlockItem {  // report block  uint32_t SSRC;  uint8_t FractionLost;  uint32_t CumulativeNumOfPacketsLost;  uint32_t ExtendedHighestSequenceNumber;  uint32_t Jitter;  uint32_t LastSR;  uint32_t DelayLastSR;};

接着我们看下解析RTCPPacketRR 的代码,

boolRTCPUtility::RTCPParserV2::ParseRR(){    const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;    if (length < 8)    {        return false;    }    _ptrRTCPData += 4; // Skip header    _packetType = RTCPPacketTypes::kRr;    _packet.RR.SenderSSRC = *_ptrRTCPData++ << 24;    _packet.RR.SenderSSRC += *_ptrRTCPData++ << 16;    _packet.RR.SenderSSRC += *_ptrRTCPData++ << 8;    _packet.RR.SenderSSRC += *_ptrRTCPData++;    _packet.RR.NumberOfReportBlocks = _numberOfBlocks;    // State transition    _state = ParseState::State_ReportBlockItem;    return true;}

解析RTCPPacketReportBlockItem 的代码,

boolRTCPUtility::RTCPParserV2::ParseReportBlockItem(){    const ptrdiff_t length = _ptrRTCPBlockEnd - _ptrRTCPData;    if (length < 24 || _numberOfBlocks <= 0)    {      _state = ParseState::State_TopLevel;        EndCurrentBlock();        return false;    }    _packet.ReportBlockItem.SSRC = *_ptrRTCPData++ << 24;    _packet.ReportBlockItem.SSRC += *_ptrRTCPData++ << 16;    _packet.ReportBlockItem.SSRC += *_ptrRTCPData++ << 8;    _packet.ReportBlockItem.SSRC += *_ptrRTCPData++;    _packet.ReportBlockItem.FractionLost = *_ptrRTCPData++;    _packet.ReportBlockItem.CumulativeNumOfPacketsLost = *_ptrRTCPData++ << 16;    _packet.ReportBlockItem.CumulativeNumOfPacketsLost += *_ptrRTCPData++ << 8;    _packet.ReportBlockItem.CumulativeNumOfPacketsLost += *_ptrRTCPData++;    _packet.ReportBlockItem.ExtendedHighestSequenceNumber = *_ptrRTCPData++ << 24;    _packet.ReportBlockItem.ExtendedHighestSequenceNumber += *_ptrRTCPData++ << 16;    _packet.ReportBlockItem.ExtendedHighestSequenceNumber += *_ptrRTCPData++ << 8;    _packet.ReportBlockItem.ExtendedHighestSequenceNumber += *_ptrRTCPData++;    _packet.ReportBlockItem.Jitter = *_ptrRTCPData++ << 24;    _packet.ReportBlockItem.Jitter += *_ptrRTCPData++ << 16;    _packet.ReportBlockItem.Jitter += *_ptrRTCPData++ << 8;    _packet.ReportBlockItem.Jitter += *_ptrRTCPData++;    _packet.ReportBlockItem.LastSR = *_ptrRTCPData++ << 24;    _packet.ReportBlockItem.LastSR += *_ptrRTCPData++ << 16;    _packet.ReportBlockItem.LastSR += *_ptrRTCPData++ << 8;    _packet.ReportBlockItem.LastSR += *_ptrRTCPData++;    _packet.ReportBlockItem.DelayLastSR = *_ptrRTCPData++ << 24;    _packet.ReportBlockItem.DelayLastSR += *_ptrRTCPData++ << 16;    _packet.ReportBlockItem.DelayLastSR += *_ptrRTCPData++ << 8;    _packet.ReportBlockItem.DelayLastSR += *_ptrRTCPData++;    _numberOfBlocks--;    _packetType = RTCPPacketTypes::kReportBlockItem;    return true;}

最后我们看下RTCPPacketInformation的内容:
这里写图片描述

原创粉丝点击