3.2.14 RTPSources
-------------------------------------------------------------------------头文件:rtpsources.h
类RTPSources代表一张保存参与会话的源的信息的表。类有成员函数来迭代遍历参与者,处理RTP和RTCP数据。注意:地址NULL用于标识从我们自己的会话发出的包(译注: Note that a NULL address is used to identify packets from our own session.)类提供了许多可重载的函数用来获取特定的事件(新的SSRC, SSRC冲突等)。
如果开启了试用支持,则你可以选择下面三种试用类型之一:【译注:Probation,不知译为什么好,暂时就当“试用”吧】
enum ProbationType { NoProbation, ProbationDiscard, ProbationStore};
当选择了NoProbation,则试用算法将不会用来验证新的源;当使用了ProbationDiscard,试用算法将会激活但是收到的数据包都会丢弃直到(数据)源得到验证。要激活试用路由并且在(数据)源验证前保存收到的数据包,应该选择ProbationStore模式。【To activate the probation routine and store the packets which are received before the source is validated, the mode ProbationStore can be selected.】
类RTPSources 接口如下所示:
RTPSources(ProbationType probationtype = ProbationStore)
------在构造函数中你可以选择任何你喜欢的试用类型,这仅仅在编译时选择了试用支持时才有区分。
void Clear()
-----清除源表。
int CreateOwnSSRC(uint32_t ssrc)
-----为自己的SSRC标识符创建一个条目。
int DeleteOwnaSSRC()
-----删除自己的SSRC标识符的条目。
void SentRTPPacket()
-----对于自己的SSRC条目来说,发送者标志是基于正在发送的数据包而不是正在接受的数据包来更新的。如果我们自己的会话发送了一个RTP数据包,这个函数应该被调用。
int ProcessRawPacket(RTPRawPacket *rawpack, RTPTransmitter *trans, bool acceptownpackets)
-----处理一个原始数据包rawpacket。对象trans将会用来检查该数据包是否是我们自己的包。标志acceptownpackets指出我们的包是应该接受还是忽略。
int ProcessRTPPacket(RTPPacket *rtppacket, const RTPTime &receivetime, const RTPAddress *senderaddress, bool *stored)
-----处理在receivetime时刻收到的发自senderaddress的RTPPacket对象数据包rtppacket。如果数据包是本机发送的则senderaddress必须是NULL。标志stored指出包是否存入表中,如果(设置为true)rtppacket对象可能不会被删除。
int ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcompack, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----处理在receivetime时刻收到的发自senderaddress地址的RTCP复合数据包rtcpcompack,如果数据包是发自本机的,则senderaddress必须是NULL。
int ProcessRTCPSenderInfo(uint32_t ssrc, const RTPNTPTime &ntptime, uint32_t rtptime, uint32_t packetcount, uint32_t octetcount, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----处理在receivetime时刻收到的发自senderaddress的发送者信息的SSRC信息ssrc,放入(数据)源表中。如果数据包是发自本机的,则senderaddress必须是NULL。
int ProcessRTCPReportBlock(uint32_t ssrc, uint8_t fractionlost, int32_t lostpackets, uint32_t exthightseqnr, uint32_t jitter, uint32_t lst, uint32_t dlsr, const RTPTime &receivetime, const RTPAddress *senderaddresss)
-----处理在receivetime时刻收到的发自senderaddress的参与者ssrc的报告数据块信息,放入(数据)源表中。如果数据包是发自本机的,则senderaddress必须是NULL。
int ProcessSDESNormalItem(uint32_t ssrc, RTCPSDESPacket::ItemType t, size_t itemlength, const void *itemdata, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----处理在receivetime时刻收到的发自senderaddress的参与者ssrc的非私有SDES项信息,放入(数据)源表中。如果数据包时发自本机的,则senderaddress必须是NULL。
int ProcessBYE(uint32_t ssrc, size_t reasonlength, const void *reasondata, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----处理在receivetime时刻收到的发自senderaddress的参与者ssrc的BYE信息。如果数据包是发自本机的,则senderaddress必须是NULL。
int UpdateReceiveTime(uint32_t ssrc, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----如果我们监听到了源ssrc,但是却没有实际的数据放入到源表中(例如:没有对我们有意义的报告数据块),该函数可以用来指出从源收到了一些信息。这将阻止该参与者过早的达到超时时间。【译注:This will prevent a premature timeout for this participant.】该信息是发自senderaddress的并且在receivetime时刻收到。如果数据包是发自本机的,则senderaddress必须是NULL。
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。
RTPSourceData *GetCurrentSourceInfo()
-----返回当前选择的参与者的RTPSourceData对象。
RTPSourceData *GetSourceInfo(uint32_t ssrc)
-----返回由参与者标志ssrc指出的RTPSourceData对象,如果没有这样的对象存在则返回NULL。
RTPPacket *GetNextPacket()
-----从当前参与者收到的数据包队列中提取下一个数据包。
bool GotEntry(uint32_t ssrc)
-----如果参与者ssrc的项存在,则返回true,否则返回false。
RTPSourceData *GetOwnSourceInfo()
-----如果出现,则将返回由CreateOwnSSRC创建的RTPSourceData对象的项。
void Timeout(const RTPTime &curtime, const RTPTime &timeoutdelay)
-----假设当前时间是curtime,暂停(超时?)在上一个时间间隔timeoutdelay没有监听到的对象【译注:tiem out the members from whom we haven’t heard during the previous time interval timeoutdelay】
void SenderTimeout(const RTPTime &curtime, const RTPTime &timeoutdelay)
-----假设当前时间是curtime,将发送者标记从在上一个时间间隔timeoutdelay就没有收到RTP数据包的对象中移除。
void BYETimeout(const RTPTime &curtime, const RTPTime &timeoutdelay)
-----假设当前时间是curtime,将在时间间隔timeoutdelay之前发送BYE数据包的对象移走。【remove the members who sent a BYE packet more than the time interval timeoutdelay.】
Void NoteTimeout(const RTPTime &curtime, const RTPTime &timeoutdelay)
-----假设当前时间是curtime,,将在时间间隔timeoutdelay期间没有更新的SDES NOTE项清除。
void MultipleTimeout(const RTPTime &curtime, const RTPTime &sendertimeout, const RTPTime &byetimeout, const RTPTime &generaltimeout, const RTPTime ¬etimeout)
-----上面的四个函数的组合,该函数比调用上面的四个函数(每个一遍)更有效率,因为该函数仅需遍历一遍。
int GetSenderCount() const
-----返回标记为发送者的参与者的个数。
int GetTotalCount() const
-----返回源表中的所有的项【参与者】的个数。
int GetActiveMemberCount() const
-----返回确认的而且还没有发送BYE数据包的成员个数。
如果编译时选择了SDES私有项支持,则下面的成员函数也可用。
int ProcessSDESPrivateItem(uint32_t ssrc, size_t prefixlen, const void *prefixdata, size_t valuelen, const void *valuedata, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----将在receivetime时刻收到的发自senderaddress的来自ssrc的SDES私有数据放入源表中。如果数据包是从本机发出则senderaddress必须设为NULL。
通过继承RTPSources类,并且重载下面的一个或多个函数,你的类可以收到特定的事件。
void OnRTPPacket(RTPPacket *pack, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----在一个RTP数据包将要处理时被调用。
void OnRTCPCompoundPacket(RTCPCompoundPacket *pack, const RTPTime receivetime, const RTPAddress *senderaddress)
-----在一个RTCP数据包将要处理时被调用。
void OnSSRCCollision(RTPSourceData *srcdat, const RTPAddress *senderaddrss, bool isrtp)
-----当检测到一个SSRC冲突是被调用。对象srcdat是源表中的当前项,。。。【译注:这句实在不会翻译,原文:The instance srcdat is the one present in the table, the address senderaddress is the one that collided with one of the addresses and isrtp indicates against which address of srcdat the check failed.】
void OnCNAMECollision(RTPSourceData *srcdat, const RTPAddress *senderaddress, const uint8_t *cname, size_t cnamelength)
-----【译注:怀疑原文是否错了,原文:Is called when another CNAME was received than the one already present for source srcdat.】
void OnNewSource(RTPSourceData *srcdat)
-----新的项srcdat加入源表中时被调用。
void OnRemoveSource(RTPSourceData *srcdat)
-----项srcdat要从源表中删除时被调用。
void OnTimeout(RTPSourceData *srcdat)
-----参与者srcdat超时时调用。
void OnBYETimeout(RTPSourceData *srcdat)
-----当参与者srcdat发送了BYE包之后调用。
void OnAPPPacket(RTCPPacket *apppacket, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----在receivetime时刻收到senderaddress发出的RTCP APP数据包apppacket时调用。
void OnUnknownPacketType(RTCPPacket *rtcppack, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----当收到一个未知类型的RTCP数据包时被调用。
void OnUnknownPacketFormat(RTCPPacket *rtcppak, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----当检测到已知包类型的未知包格式时被调用。
void OnNoteTimeout(RTPSourceData *srcdat)
-----当源srcdat的SDES NOTE项超时时调用。
【to be continued!】