class RTPSession
该类属于RTP使用的高级层。客户最终通过该类或派生类使用RTP。该类完全把RTCP的实现细节封装内部,使用者只需关系实际数据的收发。要注意的是该层不提供线程安全机制,这意味如果在上层的多线程环境对同一个RTPSession类进行操作的话,需要提供互斥保护机制。
RTPSessionSources sources; 负责内部数据的管理
RTPPacketBuilder packetbuilder; 负责RTP包的创建
RTCPPacketBuilder rtcpbuilder; 负责RTCP包的创建
RTPPollThread *pollthread; 该线程类负责RTP、RTCP包的接收和处理以及包括RTCP的自动发送。
RTPTransmitter *rtptrans; 负责网络数据的发送和接收
以下是几个重要函数:
int Create(const RTPSessionParams &sessparams,const RTPTransmissionParams *transparams = 0, RTPTransmitter::TransmissionProtocol proto = RTPTransmitter::IPv4UDPProto)
首先new 一个传输层实例,如RTPUDPv4Transmitter;然后初始化并创建RTPUDPv4Transmitter;然后调用InternalCreate() 做内部数据的初始化。
int Create(const RTPSessionParams &sessparams,RTPTransmitter *transmitter)
创建RTP会话,与上面不同是,传输模块由外部传入,因此当原会话不不使用这个传输模块时,可在另一个会话中重用传输模块。其它跟上面相同。
int RTPSession::InternalCreate(const RTPSessionParams &sessparams)
RTP 创建会话内部的进一步处理:开启接收和发送数据的线程。
1 RTPPacketBuilder::Init. (size_t max)
分配RTP最大缓冲 ,创建随机的SSRC
2 RTPSources::CreateOwnSSRC(uint32_t ssrc)
添加 SSRC到 源列表
3 设置接收模式
4 初始化RTCP 包的创建
规范名的创建;RTCPPacketBuilder的初始化
5 设置RTCPSchedulerParams, RTCPScheduler
6 初始化 线程操作的临界信息,sourcesmutex,buildermutex,schedmutex,packsentmutex;
7 开启pollthread 线程。
RTPSession::ProcessPolledData()
1 从传输模块取出原始的RTPRawPacket *rawpack 包, 然后交给RTPSessionSources处理;
2 检测源是否有与自己冲突。
若数据源的地址已经存在,直接删除;若是第一次收到该地址的包,则准备离开包(压入离开包队列),并进行调度,然后并修改自身的SSRC值(删除旧的,新建个新的)
3 定时发送RTCP包。
如果离开包队列为空,则创建普通的RTCP包并发送
如果不为空,则先发送离开包。
int SendPacket(const void *data,size_t len,uint8_t pt,bool mark,uint32_t timestampinc);
根据指定参数设置发送数据。
1 通过RTPPacketBuilder 创建包。
2 通过RTPTransmitter 传输模块发送。
SendRTCPAPPPacket
发送RTCP应用描述功能包。
首先获得ssrc;
然后构造复合包:先初始化,加入接收者报告,源描述符报告,最后加入自己的应用功能描述。
通过传输模块发送RTCP包。
另外还定义了很多 回调接口,这些接口是提供给上层调用者使用的。
virtual RTPTransmitter *NewUserDefinedTransmitter()
用户自定义新的传输方式。
virtual void OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime,
const RTPAddress *senderaddress)
在收到的RTP包即将处理的时候供用户调用。
virtual void OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,const RTPAddress *senderaddress) { }
在收到的RTCP复合包即将处理的时候供用户调用。
virtual void OnSSRCCollision(RTPSourceData *srcdat,const RTPAddress *senderaddress,bool isrtp)
当检测到SSRC冲突时,供用户处理。
virtual void OnNewSource(RTPSourceData *srcdat)
每当有新的源加入时,供用户处理。
virtual void OnTimeout(RTPSourceData *srcdat)
当参与者源 超时时,供用户处理。
virtual void OnBYETimeout(RTPSourceData *srcdat)
当参与者发送的离开包 超时时,供用户处理
virtual void OnAPPPacket(RTCPAPPPacket *apppacket,const RTPTime &receivetime,
const RTPAddress *senderaddress) { }
当在时刻receivetime,从地址senderaddress 接收到APP包时,把包交给用户处理。
virtual void OnSendRTCPCompoundPacket(RTCPCompoundPacket *pack)
当一个RTCP复合包刚发送是,该函数被调用供用户处理。用于查看发出去的RTCP数据。
virtual void OnPollThreadStep() { }
每次循环处理数据时被调用,(收到数据或者发送RTCP包)
virtual void OnBYEPacket(RTPSourceData *srcdat)
可以打印一些新离开者的信息。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zjutyww/archive/2010/01/20/5216012.aspx