RTPSession 实时通信 MSDN

来源:互联网 发布:网络主播怎么挣钱 编辑:程序博客网 时间:2024/04/29 09:29

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)

可以打印一些新离开者的信息。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjutyww/archive/2010/01/20/5216012.aspx

原创粉丝点击