注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

Jrtplib源码分析(4)---源码文件功能(中)(一)  

2014-11-22 16:44:08|  分类: jrtplib |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天我们来分析下jrtplib工程中,每个cpp文件的作用。


首先补充一下,RTCP就是RTP控制协议的简称,与RTP协议时姐妹协议,如果RTP使用一个偶数UDP port,那么RTCP就使用奇数UDP port,也就是下一个port,协议结构由version(识别RTP的版本)、ppadding 间隙)、rc(接收方报告数)、packet(数据包)组成,它的定义在rtcppacket.h头文件中。另外,RTCP有五种组成类型:SR(发送端报告)、RR(接收端报告)、SDES(源点)、BYE(结束,关闭数据流)、APP(特定应用)。


这些类型的定义在rtcppacket.h头文件中,成员函数有判断包格式、获取包类型、获取包数据、获取包长度。这个源文件很容易理解。

rtcpapppacket.cpp:其中头文件中RTCPAPPPacket类是描述了RTCP APP包,并且这个类继承了RTCPPacket父类。紧接着下面就是rtcpbyepacket.cpp,是描述bye分组类型的(其实这两个文件针对两个分组,里面功能是一样的)。接着说rtcpapppacket.cpp,文件里定义里RTCPAPPPacket类的两个成员函数:一个是构造函数RTCPAPPPacket,这个构造函数传入的参数是数据和数据的长度,并严格控制此数据的长度,此外,还判断了data的第四个位段以及RTCPCommonHeader的长度,RTCPCommonHeader结构体在rtpstruct.h头文件中有定义,并且定义了协议结构的几个标志位段;另一个是DumpDump函数判断RTCP包是否符合标准的格式,如果符合,则输出SSRCname值以及APP长度。

下面还有rtcprrpacket.hrtcpsrpacket.hrtcpsdespacket.h以及rtcpunknownpacket.h这几个头文件都是对RTCP分组的详细分析。具体功能介绍结合RTCP协议的功能和相应的代码块看看就行了。


接下来是rtcpcompoundpacket.cpp,先说下compound packet吧,上面我们说了,RTCP5种分组,这5中分组从不单独发送,它们被打包成复合包compound packet发送,发送的时候有几个规则:


对活动的发送者,compound必须以SR开头,否则以RR开头,即使没有数据接收和发送,后面也跟着RR

SDES必须包含一个CNAME

如果有BYE的话,放到最后,其他包随意放。


有了这些,那么这个文件中的函数功能就不难理解了,首先,RTCPCompoundPacket类继承于RTPMemoryObject类,用代码构造了复合包的规则,构造函数用到了函数重载:

RTCPCompoundPacket::RTCPCompoundPacket(RTPRawPacket &rawpack, RTPMemoryManager *mgr) : RTPMemoryObject(mgr)/*初始化为RTPRawPacket类对象*/

RTCPCompoundPacket::RTCPCompoundPacket(uint8_t *packet, size_t packetlen, bool deletedata, RTPMemoryManager *mgr) : RTPMemoryObject(mgr)/*初始化为传入包的数据*/

RTCPCompoundPacket::RTCPCompoundPacket(RTPMemoryManager *mgr) : RTPMemoryObject(mgr)/*初始化为0*/

还有个ParseData函数,这个函数的功能是解析传进来的包数据,分别对5种分组的包进行分配内存,因为每种分组类型所用的内存空间是不一样的。在这里用到里<list>头文件,这个头文件是链表操作,系统定义了一些方便的链表操作函数。如果分配失败,对包链表进行释放空间操作。如分配成功,则在链表后面添加分配到的空间。

RTCPCompoundPacketBuilder.h头文件,则是根据上面的规则进行包复合动作,由于比较复杂,所以类RTCPCompoundPacketBuilder的成员函数比较多,用于构建复合包,继承于类RTCPCompoundPacket,如果构建成功,则访问包的信息。其中构造函数用于管理复合包的内存,InitBuild用于初始化包;要特别注意的是,在私有成员中,内嵌了几个RTCP分组类:BufferReportSDESourceSDES,用于分管每个分组类型的动作。RTCPCompoundPacketBuilder.cpp是对该头文件的使用,有一个成员函数clearBuildBuffer是对分组BYE包和APP包内存的释放管理,随后的成员函数代码很多,但是功能很简单,就是根据上面复合包的规则进程构建复合发送和接受的复合包,例如:AddReportBlock添加报告块、AddSDESSource添加源点资源、AddSDESNormalItem添加源点结点(以结点类型为变量来分辨的)、AddBYEPacket添加BYE包、AddAPPPacket添加APP包、EndBuild结束构建(结束构建要添加好多信息,先添加报告信息,再依次添加SDESAPPBYE包)。

  评论这张
 
阅读(375)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017