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的内容:
阅读全文
0 0
- RR报文解析(一)
- RR报文解析(二) fraction lost
- RR报文解析(三)利用LSR, DLSR计算RTT
- RR报文解析(四)根据丢包率估计发送码率
- HTTP请求报文解析(一)
- ISO8583报文(一)
- rr
- rr
- rr
- rr
- rr
- rr
- rr
- 报文解析
- 报文解析
- 报文解析
- HTTP系列(一):报文
- RIP(一)【报文结构】
- intellij创建project时GroupID ArtifactID意思
- ThinkPHP excel导出
- SQL语句学习一
- jvm垃圾收集算法
- HIVE和HBASE区别
- RR报文解析(一)
- jdk-ArrayBlockingQueue
- PAT 1018 Public Bike Management(最短路径+DFS)
- 反汇编引擎Capstone
- 算法作业HW15:LeetCode187 Repeated DNA Sequences
- 深入C语言—前奏—控制访问内存的数据宽度
- EditText常见问题
- LeetCode-412. Fizz Buzz (Java)
- 笨小熊