热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ZLMedia中RTCP协议的处理简要分析(2)–SenderReport

  classRtcpHeader{public:#if__BYTE_ORDER__BIG_ENDIAN版本号,固定为2uint32_tversion:2;padding,固定为0

 

 

class RtcpHeader {
public:
#if __BYTE_ORDER == __BIG_ENDIAN
//版本号,固定为2
uint32_t version: 2;
//padding,固定为0
uint32_t padding: 1;
//reception report count
uint32_t report_count: 5;
#else
//reception report count
uint32_t report_count: 5;
//padding,末尾是否有追加填充
uint32_t padding: 1;
//版本号,固定为2
uint32_t version: 2;
#endif
//rtcp类型,RtcpType
uint32_t pt: 8;
private:
//长度
uint32_t length: 16;
public:
/**
* 解析rtcp并转换网络字节序为主机字节序,返回RtcpHeader派生类列表
* @param data 数据指针
* @param size 数据总长度
* @return rtcp对象列表,无需free
*/
static std::vector loadFromBytes(char *data, size_t size);
/**
* rtcp包转Buffer对象
* @param rtcp rtcp包对象智能指针
* @return Buffer对象
*/
static toolkit::Buffer::Ptr toBuffer(std::shared_ptr rtcp);
/**
* 打印rtcp相关字段详情(调用派生类的dumpString函数)
* 内部会判断是什么类型的派生类
* 使用net2Host转换成主机字节序后才可使用此函数
*/
std::
string dumpString() const;
/**
* 根据length字段获取rtcp总长度
*/
size_t getSize()
const;
/**
* 后面追加padding数据长度
*/
size_t getPaddingSize()
const;
/**
* 设置rtcp length字段
* @param size rtcp总长度,单位字节
*/
void setSize(size_t size);
protected:
/**
* 打印字段详情
* 使用net2Host转换成主机字节序后才可使用此函数
*/
std::
string dumpHeader() const;
private:
/**
* 调用派生类的net2Host函数
* @param size rtcp字符长度
*/
void net2Host(size_t size);
} PACKED;

RtcpHeader

class ReportItem {
public:
friend
class RtcpSR;
friend
class RtcpRR;
uint32_t ssrc;
//Fraction lost
uint32_t fraction: 8;
//Cumulative number of packets lost
uint32_t cumulative: 24;
//Sequence number cycles count
uint16_t seq_cycles;
//Highest sequence number received
uint16_t seq_max;
//Interarrival jitter
uint32_t jitter;
//Last SR timestamp, NTP timestamp,(ntpmsw & 0xFFFF) <<16 | (ntplsw >> 16) & 0xFFFF)
uint32_t last_sr_stamp;
//Delay since last SR timestamp,expressed in units of 1/65536 seconds
uint32_t delay_since_last_sr;
private:
/**
* 打印字段详情
* 使用net2Host转换成主机字节序后才可使用此函数
*/
std::
string dumpString() const;
/**
* 网络字节序转换为主机字节序
*/
void net2Host();
}PACKED;

ReportItem

class RtcpSR : public RtcpHeader {
public:
friend
class RtcpHeader;
uint32_t ssrc;
// ntp timestamp MSW(in second)
uint32_t ntpmsw;
// ntp timestamp LSW(in picosecond)
uint32_t ntplsw;
// rtp timestamp
uint32_t rtpts;
// sender packet count
uint32_t packet_count;
// sender octet count
uint32_t octet_count;
//可能有很多个
ReportItem items;
public:
/**
* 创建SR包,只赋值了RtcpHeader部分(网络字节序)
* @param item_count ReportItem对象个数
* @return SR包
*/
static std::shared_ptr create(size_t item_count);
/**
* 设置ntpmsw与ntplsw字段为网络字节序
* @param tv 时间
*/
void setNtpStamp(struct timeval tv);
void setNtpStamp(uint64_t unix_stamp_ms);
/**
* 返回ntp时间的字符串
* 使用net2Host转换成主机字节序后才可使用此函数
*/
std::
string getNtpStamp() const;
uint64_t getNtpUnixStampMS()
const;
/**
* 获取ReportItem对象指针列表
* 使用net2Host转换成主机字节序后才可使用此函数
*/
std::vector
getItemList();
private:
/**
* 打印字段详情
* 使用net2Host转换成主机字节序后才可使用此函数
*/
std::
string dumpString() const;
/**
* 网络字节序转换为主机字节序
* @param size 字节长度,防止内存越界
*/
void net2Host(size_t size);
} PACKED;

RtcpSR

 

 


V(2bit)

Version,表示RTCP版本号,当前规范定义的版本号为2,需要注意的是RTP数据包中的版本号与RTCP数据包的中的版本号是一致的。


P(1bit)

填充位,表示是否需要填充,0表示不填充,其不属于控制信息。在某些情况下(如加密)需要进行填充,在填充的情况下,Padding的最后一个字节用于计算应该忽略多少个字节!


RC(5bit) 

    接收方报告计数,表示在该数据包中的接收方报告块的数量,该字段0值是有效的,但没有实际意义!


PT(8bit)

 RTCP的数据包的分组类型,RTCP包含的分组类型如下:

 

 

 

BYE分组为结束分组,表示关闭一个数据流;

APP分组为特定应用分组,使应用程序能够自定义新的分组类型;

SDES分组为源描述分组,其作用是给出参加会话者的描述;

SR分组为发送端报告分组:发送端每发送一个RTP数据包,就要发送个一个发送端报告分组SR;

RR为接收端分组报告,接收端分组报告 ,每收到一个RTP流,就产生一个RR分组。


length(16bit)

RTCP数据包的大小。该字段中大小的表示比较有意思,使用4个字节为1组,长度共有几个4个字节的组,然后用该长度减去1,即为RTCP包中的长度!举个例子:假设RTCP数据包的长度为32个字节,32/4=8,总共有8组4个字节,8-1=7,此时RTCP数据包中length的值为7。


SSRC(32bit)

  同步源标识


NTP时标

NTP时间戳


RTP时标

RTP时间戳


发送者包计数

从开始传输到当前SR包生成的时间段内,发送端发送的RTP数据包的总个数!如果发送者更改其SSRC,则该计数要被重置


发送者数据8位组计数

从开始传输到当前SR包生成的时间段内,发送端发送的总的数据的大小的八位组计数,不包含头信息以及填充信息!如果发送者更改可SSRC,需要重置该值!该字段可以用来估计平均码率!

 

report   block  使用的较少,只对一些英文单词做简单的介绍:

fraction lost:丢包率

cumulative number of packets lost   :累计丢失的数据包数

extended highest sequence number received:接收到的扩展最高序列号

interarrival jitter:到达间隔抖动

profile-specific extensions   :特定于配置文件的扩展



推荐阅读
author-avatar
优优绿园之时尚饰品_834
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有