3.2.21 RTPSession
---------------------------------------------------------------------------头文件:rtpsession.h
对于大多数的基于RTP的应用来说,RTPSession类可能是唯一需要使用的。它完全在内部自动处理RTCP部分,所以使用者可以把精力集中在处理发送和接收实际数据上。
注意:类RTPSession并不意味着是线程安全的,使用者需要使用锁机制来阻止不同线程使用同一个RTPSession对象。
RTPSession类的接口如下:
RTPSession(RTPTransmitter::TransmissionProtocol proto = RTPTransmitter::IPv4UDPProto)
-----使用由proto给出的传输组件创建一个RTPSession对象。如果proto指出了是使用的用户自定义的传输器则NewUserDefinedTransmitter()成员函数需要给出实现。
int Create(const RTPSessionParams &sessparams, const RTPTransmissionParams *transparams = 0)
-----以会话参数sessparams和传输参数transparams创建一个会话实例,如果transparams为NULL,则将使用传输器需要的默认值。
void Destroy()
-----离开会话但是不发送BYE包。
void BYEDestroy(const RTPTime &maxwaittime, const void *reason, size_t reasonlength)
-----发送一个BYE包并且离开会话,最多等待maxwaittime时间来发送BYE包,如果时间到了,将直接离开会话而不发送BYE包。BYE包中包含长度为reasonlength的离开原因。
bool IsActive()
-----返回会话是否创建。
uint32 t GetLocalSSRC()
-----返回自己的SSRC。
int AddDestination(const RTPAddress &addr)
-----把地址addr加入到目的地址列表中。
int DeleteDestination(const RTPAddress &addr)
-----从目的地址列表中删除addr地址。
void ClearDestinations()
-----清空目的地址列表。
bool SupportsMulticasting()
-----如果支持组播则返回true。
int JoinMulticastGroup(const RTPAddress &addr)
-----加入由addr指出的组播组。
int LeaveMulticastGroup(const RTPAddress &addr)
-----离开由addr指出的组播组。
void LeaveAllMulticastGroups()
-----离开所有的组播组。
int SendPacket(const void *data, size_t len)
-----发送一个含有长度为len的负载数据data的RTP数据包。负载类型,标记位,时间戳增量将使用由成员函数SetDefault给出的值。
int SendPacket(const void *data, size_t len, uint8_t pt, bool mark, uint32_t timestampinc)
-----发送一个含有长度为len的负载数据data的RTP数据包。负载类型为pt,标记位为mark,时间戳增量为timestampinc。
int SendPacketEx(const void *data, size_t len, uint16_t hdrextID, const void *hdrextdata, size_t numhdrextwords)
-----发送一个含有长度为len的负载数据data的RTP数据包。包中将包含一个以hdrextID为标识符,数据为hdrextdata的扩展头。数据的长度由一个32位的字numhdrextwords给出。负载类型t,标记位,时间戳增量将使用由成员函数SetDefault给出的值。
int SendPacketEx(const void *data, size_t len, uint8_t pt, bool mark, uint32_t timestampinc, uint16_t hdrextID, const void *hdrextdata, size_t numhdrextwords)
-----发送一个含有长度为len的负载数据data的RTP数据包。负载类型为pt,标记位为mark,时间戳增量为timestampinc。包中将包含一个以hdrextID为标识符,数据为hdrextdata的扩展头。数据的长度由一个32位的字numhdrextwords给出。
int SetDefaultPayloadType(uint8_t pt)
-----设置RTP包的默认负载类型为pt。
int SetDefaultMark(bool m)
-----设置RTP包的默认标记位为mark。
int SetDefaultTimestampIncrement(uint32_t timestampinc)
-----设置RTP包的默认时间戳增量为timestampinc。
int IncrementTimestamp(uint32_t inc)
-----函数使用inc来增加时间戳,这有时是很有用的。例如:当包只有静默数据则不发送时,该函数应该被调用来增加一个合适的时间戳增量以使得下一个数据包可以在其他主机上载正确的时间被播放。
int IncrementTimestampDefault()
-----该函数使用由SetDefaultTimestampIncrement函数给出的时间戳增量来增加时间戳。这有时是很有用的,例如:当包只有静默数据则不发送时,该函数应该被调用来增加一个合适的时间戳增量以使得下一个数据包可以在其他主机上载正确的时间被播放。
int SetPreTransmissionDelay(const RTPTime &delay)
-----函数允许你通知(RTP)库采集第一个数据包和发送数据包之间的时间延迟。该延迟将在计算用于多媒体同步的RTP时间戳和时钟时间关系时计入考虑。
RTPTransmissionInfo *GetTransmissionInfo()
-----函数将返回一个RTPTransmissionInfo的分类,该类将给出关于传输器的更多附加信息(例如一个本地IP地址的列表等)。当不再需要时使用者需要手动清除该类的实例。
int Poll()
-----如果没有使用线程池,则该函数应该定期调用,以处理到达的数据和在需要时发送RTCP数据包。
int WaitForIncomingData(const RTPTime &delay,bool *dataavailable= 0)
-----等待最多delay时间知道检测到收到了数据。仅仅在没有使用线程池时有效。如果dataavailable非NULL则当数据确实读到了时应该设为true,否则设为false。
int AbortWait()
-----如果上一个函数调用了,则该函数将跳出等待。也是仅仅在没有使用线程池时有效。
RTPTime GetRTCPDelay()
-----返回一个RTCP复合数据包可能需要发送的时间间隔,仅仅在没有使用线程池时有效。
int BeginDataAccess()
-----下面的成员函数(直到EndDataAccess)需要在调用BeginDataAccess和EndDataAccess之间调用,BeginDataAccess保证线程池没有同时访问源表,当调用EndDataAccess之后源表的锁重新释放。
bool GotoFirstSource()
-----从源表中第一个成员开始遍历参与者,如果有成员找到,则返回true,否则返回false。
bool GotoNextSource()
-----将源表中下一个源设置为当前源。如果已经是最后一个源则返回false,否则返回true。
bool GotoPreviousSource()
-----将源表中上一个源设置为当前源。如果已经是第一个源则返回false,否则返回true。
bool GotoFirstSourceWithData()
-----将源表中第一个还没有提取的含有RTPPacket对象的源设置为当前源,如果没有成员找到则返回false,否则返回true。
bool GotoNextSourceWithData()
-----将源表中下一个还没有提取的含有RTPPacket对象的源设置为当前源,如果没有成员找到则返回false,否则返回true。
bool GotoPreviousSourceWithData()
-----将源表中上一个还没有提取的含有RTPPacket对象的源设置为当前源,如果没有成员找到则返回false,否则返回true。
【to be contined!】