RTP TRCP API

1 主要介紹

簡介
RTP是實時傳輸協議的縮寫,用來定義在因特網上傳輸音頻和視頻的標準包格式,在RFC 1889中予以定義。它由音頻和視頻傳輸工作組制訂,並於1996年頒佈。
RTP和RTCP連接緊密,RTP實施實際數據的傳輸,RTCP則就服務質量做出反饋。

RTP定義
實時傳輸協議(RTP)爲數據提供了具有實時特徵的端對端傳送服務,如在組播或單播網絡服務下的交互式視頻音頻或模擬數據。應用程序通常在UDP上運行 RTP 以便使用其多路結點和校驗服務;這兩種協議都提供了傳輸層協議的功能。但是 RTP 可以與其它適合的底層網絡或傳輸協議一起使用。如果底層網絡提供組播方式,那麼 RTP 可以使用該組播表傳輸數據到多個目的地。
RTP 本身並沒有提供按時發送機制或其它服務質量(QoS)保證,它依賴於低層服務去實現這一過程。 RTP 並不保證傳送或防止無序傳送,也不確定底層網絡的可靠性。 RTP 實行有序傳送, RTP 中的序列號允許接收方重組發送方的包序列,同時序列號也能用於決定適當的包位置,例如:在視頻解碼中,就不需要順序解碼。

RTP組成
RTP 由兩個緊密鏈接部分組成:
RTP ― 傳送具有實時屬性的數據; RTP 控制協議(RTCP) ― 監控服務質量並傳送正在進行的會話參與者的相關信息。RTCP 第二方面的功能對於“鬆散受控”會話是足夠的,也就是說,在沒有明確的成員控制和組織的情況下,它並不非得用來支持一個應用程序的所有控制通信請求。

定義在RFC
使用RTP協議的應用程序運行在RTP之上,而執行RTP的程序運行在UDP的上層,目的是爲了使用UDP的端口號和檢查和。如圖1所示,RTP可以看成是傳輸層的子層。由多媒體應用程序生成的聲音和電視數據塊被封裝在RTP信息包中,每個RTP信息包被封裝在UDP消息段中,然後再封裝在IP數據包中。
信息包的結構包含廣泛用於多媒體的若干個域,包括聲音點播(audio-on-demand)、影視點播(video on demand)、因特網電話(Internet telephony)和電視會議(videoconferencing)。RTP的規格沒有對聲音和電視的壓縮格式制定標準,它可以被用來傳輸普通格式的文件。例如,WAV或者GSM(Global System for Mobile communications)格式的聲音、MPEG-1和MPEG-2的電視,也可以用來傳輸專有格式存儲的聲音和電視文件。
從應用開發人員的角度來看,可把RTP執行程序看成是應用程序的一部分,因爲開發人員必需把RTP集成到應用程序中。在發送端,開發人員必需把執行RTP協議的程序寫入到創建RTP信息包的應用程序中,然後應用程序把RTP信息包發送到UDP的套接接口(socket interface),如圖2所示;同樣,在接收端,RTP信息包通過UDP套接接口輸入到應用程序,因此開發人員必需把執行RTP協議的程序寫入到從RTP信息包中抽出媒體數據的應用程序。
現以用RTP傳輸聲音爲例來說明它的工作過程。假設音源的聲音是64 kb/s的PCM編碼聲音,並假設應用程序取20毫秒的編碼數據爲一個數據塊(chunk),即在一個數據塊中有160個字節的聲音數據。應用程序需要爲這塊聲音數據添加RTP標題生成RTP信息包,這個標題包括聲音數據的類型、順序號和時間戳。然後RTP信息包被送到UDP套接接口,在那裏再被封裝在UDP信息包中。在接收端,應用程序從套接接口處接收RTP信息包,並從RTP信息包中抽出聲音數據塊,然後使用RTP信息包的標題域中的信息正確地譯碼和播放聲音。
如果應用程序不使用專有的方案來提供有效載荷類型(payload type)、順序號或者時間戳,而是使用標準的RTP協議,應用程序就更容易與其他的網絡應用程序配合運行,這是大家都希望的事情。例如,如果有兩個不同的公司都在開發因特網電話軟件,他們都把RTP合併到他們的產品中,這樣就有希望:使用不同公司電話軟件的用戶之間能夠進行通信。
這裏需要強調的是,RTP本身不提供任何機制來確保把數據及時遞送到接收端或者確保其他的服務質量,它也不擔保在遞送過程中不丟失信息包或者防止信息包的次序不被打亂。的確,RTP的封裝只是在系統端才能看到,中間的路由器並不區分那個IP數據報是運載RTP信息包的。
RTP允許給每個媒體源分配一個單獨的RTP信息包流,例如,攝像機或者麥克風。例如,有兩個團體參與的電視會議,這就可能打開4個信息包流:兩臺攝像機傳送電視流和兩個麥克風傳送聲音流。然而,許多流行的編碼技術,包括MPEG-1和MPEG-2在編碼過程中都把聲音和電視圖像捆綁在一起以形成單一的數據流,一個方向就生成一個RTP信息包流。
RTP信息包沒有被限制只可應用於單目標廣播,它們也可以在一對多(one-to-many)的多目標廣播樹或者在多對多(many-to-many)的多目標廣播樹上傳送。例如,多對多的多目標廣播,在這種應用場合下,所有發送端通常都把他們的RTP信息包流發送到具有相同多目標廣播地址的多目標廣播樹上。

RTP信息包標題域
RTP標題由4個信息包標題域和其他域組成:有效載荷類型(payload type)域,順序號(sequence number)域,時間戳(timestamp)域和同步源標識符(Synchronization Source Identifier)域等[1]。
1)有效載荷類型,RTP信息包中的有效載荷域(Payload Type Field)的長度爲7位,因此RTP可支持128種不同的有效載荷類型。對於聲音流,這個域用來指示聲音使用的編碼類型,例如PCM、自適應增量調製或線性預測編碼等等。如果發送端在會話或者廣播的中途決定改變編碼方法,發送端可通過這個域來通知接收端。表1列出了目前RTP所能支持的聲音有效載荷類型。對電視流,有效載荷類型可以用來指示電視編碼的類型,例如motion JPEG, MPEG-1,MPEG-2或者H.231等等。發送端也可以在會話或者期間隨時改變電視的編碼方法。表16-02列出了目前RTP所能支持的某些電視有效載荷類型。
2)順序號,順序號(Sequence Number Field)域的長度爲16位。每發送一個RTP信息包順序號就加1,接收端可以用它來檢查信息包是否有丟失以及按順序號處理信息包。例如,接收端的應用程序接收到一個RTP信息包流,這個RTP信息包在順序號86和89之間有一個間隔,接收端就知道信息包87和88已經丟失,並且採取措施來處理丟失的數據。
3)時間戳,時間戳(Timestamp)域的長度爲32字節。它反映RTP數據信息包中第一個字節的採樣時刻(時間)。接收端可以利用這個時間戳來去除由網絡引起的信息包的抖動,並且在接收端爲播放提供同步功能。
4)s同步源標識符,同步源標識符(Synchronization Source Identifier,SSRC)域的長度爲32位。它用來標識RTP信息包流的起源,在RTP會話或者期間的每個信息包流都有一個清楚的SSRC。SSRC不是發送端的IP地址,而是在新的信息包流開始時源端隨機分配的一個號碼。


2 協議格式


RTP報文由兩部分組成:報頭和有效載荷。其中:
V:RTP協議的版本號,佔2位,當前協議版本號爲2。
P:填充標誌,佔1位,如果P=1,則在該報文的尾部填充一個或多個額外的八位組,它們不是有效載荷的一部分。
X:擴展標誌,佔1位,如果X=1,則在RTP報頭後跟有一個擴展報頭。
CC:CSRC計數器,佔4位,指示CSRC 標識符的個數。
M: 標記,佔1位,不同的有效載荷有不同的含義,對於視頻,標記一幀的結束;對於音頻,標記會話的開始。
同步信源(SSRC)標識符:佔32位,用於標識同步信源。該標識符是隨機選擇的,參加同一視頻會議的兩個同步信源不能有相同的SSRC。
特約信源(CSRC)標識符:每個CSRC標識符佔32位,可以有0~15個。每個CSRC標識了包含在該RTP報文有效載荷中的所有特約信源。
PT: 有效載荷類型,佔7位,用於說明RTP報文中有效載荷的類型,如GSM音頻、JPEM圖像等。
序列號:佔16位,用於標識發送者所發送的RTP報文的序列號,每發送一個報文,序列號增1。接收者通過序列號來檢測報文丟失情況,重新排序報文,恢復數據。

時戳(Timestamp):佔32位,時戳反映了該RTP報文的第一個八位組的採樣時刻。接收者使用時戳來計算延遲和延遲抖動,並進行同步控制。


3 JRTPLIB 主要類結構和API
3.1 類的主要結構
3.2 全部的API描述

3.2.1 庫版本,頭文件:rtplibraryversion.h
RTPLibraryVersion類有一個靜態成員創建了該類的一個對象。


static RTPLibraryVersion GetVersion()
使用者可以通過下面的函數獲取版本信息。

int GetMajorNumber() const
-----返回主版本號。

int GetMinorNumber() const
-----返回副版本號。

int GetDebugNumber() const
-----返回調試版本號。

std::string GetVersionString() const
-----返回版本描述字符串。


3.2.2 錯誤碼,頭文件:rtperrors.h
除非特別指出,否則返回int的函數如果返回值爲負則表明出現了一個錯誤,爲0或者正則標誌成功。一個關於錯誤碼的描述可以通過使用下面的函數獲取:

std::string RTPGetErrorString(int errcode)


3.2.3 實用時間工具,頭文件:rtptimeutilities.h
RTPNTPTime

這是NTP時間戳的MSW(最高有效字)和LSW(最低有效字)的一個簡單的包裝,該類有下列成員:

RTPNTPTime(uint32_t m, uint32_t l);
-----該構造函數創建一個MSW爲m,LSW爲l的類對象。

uint32_t GetMSW() const
-----返回最高有效字。

uint32_t GetLSW() const
-----返回最低有效字。

RTPTime
該類用於描述時鐘時間,延遲間隔等。其中保存一個以秒s數據和一個毫秒ms數據,接口如下:

RTPTime(uint32_t seconds, uint32_t microseconds)
-----創建一個對應s和ms分別爲seconds和microseconds的對象。

RTPTime(double t)
-----創建一個代表以秒爲單位的時間t的RTPTime實例。

RTPTime(RTPNTPTime ntptime)
-----創建一個對應時間爲ntptime的對象,如果無法完成轉換那麼,對象的秒和毫秒都將設爲0。

uint32_t GetSeconds() const
-----返回對象中保存的秒數值。

uint32_t GetMicroSeconds() const
----返回對象中保存的毫秒數值。

Double GetDouble() const
-----返回對象中存儲的以秒爲單位的時間。


RTPNTPTime GetNTPTime() const
-----返回對象中保存時間的對應NTP時間。

Static RTPTime CurrentTime()
-----返回代表當前時鐘時間的RTPTime對象,該值是自從1970年1月1日00:00:00 UTC 以來的秒數。

Static void Wait(const RTPTime &delay)
-----該函數等待一段由delay指定的時間。

RTPTime類還定義了以下操作符:
operator-=
operator+=
operator<
operator>
operator<=
operator>=


3.2.4 RTPRandom,頭文件:rtprandom.h
RTPRandom類可用來產生隨機數,成員函數如下:

uint8_t GetRandom8()
-----返回隨機8比特值。

uint16_t GetRandom16()
-----返回隨機16比特值。

uint32_t GetRandom32()
-----返回隨機32比特值。

double GetRandomDouble()
-----返回0.0到1.0之間的隨機數。

3.2.5 RTPSDESInfo,頭文件:rtcpsdesinfo.h
類RTPSDESInfo是RTCP中SDES信息的一個容器,接口如下:

void Clear()
-----清除所有的SDES信息。

int SetCNAME(const uint8_t *s, size_t l)
-----設置SDES的CNAME項爲指向s的長度爲l一塊內存的值。

int SetName(const uint8_t *s, size_t l)
-----設置SDES的name項爲指向s的長度爲l一塊內存的值。

int SetEMail(const uint8_t *s, size_t l)
-----設置SDES的e-mail項爲指向s的長度爲l一塊內存的值。

int SetPhone(const uint8_t *s, size_t l)
-----設置SDES的phone項爲指向s的長度爲l一塊內存的值。

int SetLocation(const uint8_t *s, size_t l)
-----設置SDES的location項爲指向s的長度爲l一塊內存的值。

int SetTool(const uint8_t *s, size_t l)
-----設置SDES的tool項爲指向s的長度爲l一塊內存的值。

int SetNote(const uint8_t *s, size_t l)
-----設置SDES的note項爲指向s的長度爲l一塊內存的值。

uint8_t *GetCNAME(size_t *len) const
-----返回SDES的CNAME項的,並把長度存放到len中。

uint8_t *GetName(size_t *len) const
-----返回SDES的name項的,並把長度存放到len中。

uint8_t *GetEMail(size_t *len) const
-----返回SDES的e-mail項的,並把長度存放到len中。

uint8_t *GetPhone(size_t *len) const
-----返回SDES的phone項的,並把長度存放到len中。

uint8_t *GetLocation(size_t *len) const
-----返回SDES的location項的,並把長度存放到len中。

uint8_t *GetTool(size_t *len) const
-----返回SDES的tool項的,並把長度存放到len中。

uint8_t *GetNote(size_t *len) const
-----返回SDES的Note項的,並把長度存放到len中。

int SetPrivateValue(const uint8_t *prefix, size_t prefixlen, const uint8_t *value, size_t valuelen)
-----設置前綴串的輸入爲長度爲prefixlen的prefix指向的內容,用於包含長度爲valuelen的由value指向的值串,如果達到了前綴串的最大允許長度,則將返回錯誤碼ERR_RTP_SDES_MAXPRIVITEMS。

int DeletePrivatePrefix(const uint8_t *s, size_t len)
-----刪除由s指向的長度爲len的前綴串的輸入。

void GotoFirstPrivateValue()
-----開始遍歷SDES中存儲的前綴條目和它們相關聯的數據。

bool GetNextPrivateValue(uint8_t **prefix, size_t *prefixlen, uint8_t **value, size_t *valuelen)
-----如果可用將返回true,並且將下一個SDES私有前綴條目存入prefix,將長度存入prefixlen,將相關數據和長度存入value和valuelen。若不可用則返回false。

bool GetPrivateValue(const uint8_t *prefix, size_t prefixlen, uint8_t **value, size_t *valuelen) const
-----查找SDES中私有條目爲prefix長度爲prefixlen的輸入,如果找到返回true,並且將相關聯的值和長度分別存入value和valuelen中。


3.2.6 RTPTransmitter,頭文件:rtptransmitter.h
抽象類RTPTransmitter指出了實際用於傳輸的組件的接口。當前實現了三種,分別是:基於IPv4的UDP發送器;基於IPv6的UDP發送器【譯註:另一種??】。

TransmissionProtocol類型用於指出是哪種發送器:
enum TransmissionProtocol{IPv4UDPProto, IPv6UDPProto, UserDefinedProto };

當使用RTPSession類時,使用UserDefinedProto可用來選擇你自己的傳輸組件,這是你需要自己實現NewUserDefinedTransmitter()函數,這個函數應該返回一個你自己的RTPTransmitter的繼承類的指針。

可以使用ReceiveMode類型來指定3種接收模式:
Enum ReceiveMode{ AcceptAll, AcceptSome, IgnoreSome};
根據模式的設置,到達的數據將會進行不同的處理:
AcceptAll,-----不論從哪裏發送的,所有數據都將接收。
AcceptSome,-----只有指定源發送的數據纔會被接收。
IgnoreSome,-----除了指定源的不接收,其他的全部接收。

由RTPTransmission類定義的接口如下

int Init(bool threadsafe)
-----必須在使用transmission組件之調用該函數,組件是否是線程安全的將由參數threadsafe指定。

int Create(size_t maxpacketsize, const RTPTransmissionParams *transparams)
-----爲組件的使用做準備,參數maxpacketsize指出了一個包的最大值,如果包大小大於該值,則將不會發送。參數transparams是一個指向RTPTranmissionParams對象的指針。RTPTranmissionParams也是個抽象類,實際使用時根據不同組件,通過繼承RTPTranmissionParams類來定義自身的參數。如果參數爲null,那麼將使用該組件傳輸參數的默認值。

int Destroy()
-----調用該函數之後,將清理存儲區,並且該組件也不能再使用。只有當重新調用Create函數之後該組件纔可以繼續使用。

RTPTransmissionInfo *GetTransmissonInfo()
-----函數將返回一個指向RTPTransmissionInfo對象的指針,從該對象中可以獲得關於傳輸器的更多信息(例如:本地IP地址的列表)。當前(版本中)根據使用的傳輸器的種類既可以返回RTPUDPv4TransmissionInfo也可以返回RTPUDPv6TransmissionInfo。當對象不再使用時,使用者需要(手動)刪除該對象。

int GetLocalHostName(uint8_t *buffer, size_t *bufferlength)
-----基於本地主機地址的內部信息查詢主機名,該函數可能會花費比較長的時間用於DNS查詢。bufferlength應該被初始化爲buffer中可能會存儲的字節個數,如果函數函數成功,則bufferlength中就是buffer中存儲的字節數。需要注意的是在buffer中存儲的並非是以NULL結尾的數據。如果分配的存儲空間不夠的話,函數將失敗並且返回ERR_RTP_TRANS_BUFFERLENGTHTOOSMALL,並將需要的字節數存入bufferlength中。

bool ComesFromThisTransmitter(const RTPAddress *addr)
-----如果由addr指出的地址是傳輸器的一個地址則返回true。

size_t GetHeaderOverhead()
-----返回將要由網絡的底層(不包括鏈路層)加入到RTP包中的字節數。

int Poll()
-----檢查到達的數據並保存。

bool NewDataAvailable()
-----當可以使用函數GetNextPacket獲取數據包時返回true。

RTPRawPacket *GetNextPacket()
-----(在Poll函數中)返回在RTPRawPacket對象中收到的RTP數據包的原始數據。

int WaitForIncomingData(const RTPTime &dalay, bool *dataavailable =0)
-----等待最多由delay指出的時間直到接收到數據。如果dataavailable不是NULL,那麼如要要讀取數據的話應該設爲true,否則設爲false

int AbortWait()
-----如果上一個函數被調用了,本函數將中止等待。

int SendRTPData(const void *data, size_t len)
-----向所有當前目的地址列表中的RTP地址發送長度爲len的data數據。

int SendRTCPData(const void *data, size_t len)
-----向所有當前目的地址列表中的RTCP地址發送長度爲len的data數據。

void ResetPacketCount()
-----傳輸器會跟蹤所有發送的RTP和RTCP數據包的個數,該函數復位這些計數。

uint32_t GetNumRTPPacketsSent()
-----返回已發送的RTP包的個數。

uint32_t GetNumRTCPPacketsSent()
-----返回已發送的RTCP包的個數。

int AddDestination(const RTPAddress &addr)
-----將參數addr指定的地址加入到目的地址列表中。

int DeleteDestination(const RTPAddress &addr)
-----將參數addr指定的地址從目的地址列表中刪除。

void ClearDestination()
-----清空目的地址列表。

bool SupportMulticasting()
-----如果傳輸組件支持組播則返回true。

int JoinMulticastGroup(const RTPAddress &addr)
-----加入由參數addr指定的組播組。

int LeaveMulticastGroup(const RTPAddress &addr)
-----退出由參數addr指定的組播組。

void LeaveAllMulticastGroups()
-----退出所有的加入的組播組

int SetReceiveMode(RTPTransmitter::ReceiveMode m)
-----將接收模式設置爲m,m的取值可以是下列之一:RTPTransmitter::AcceptAll, RTPTransmitter::AcceptSome, RTPTransmitter::IgnoreSome。注意!如果模式改變了,則所有關於接收或者忽略地址的信息將全部丟失。

int AddToIgnoreList(const RTPAddress &addr)
-----將地址addr加入到忽略地址列表中。

int DeleteFromIgnoreList(const RTPAddress &addr)
-----將地址addr從忽略地址列表中刪除。

void ClearIgnoreList()
-----清除忽略地址列表。

int AddToAcceptList(const RTPAddress &addr)
-----將地址addr加入到接收地址列表中。

int DeleteFromAcceptList(const RTPAddress &addr)
-----將地址addr從接收地址列表中刪除。

void ClearAcceptList()
-----清除接收地址列表。

int SetMaximumPacketSize(sizt_t s)
-----將傳輸器允許的最大數據包大小設置爲s。

基於IPv4的UDP傳輸器,頭文件:rtpudpv4transmitter.h,繼承自:RTPTransmitter類
類RTPUDPv4Transmitter繼承了類RTPTransmitter的接口,成爲一個傳輸組件,使用基於IPv4的UDP協議來傳輸RTP和RTCP數據。
該組件的參數由類RTPUDPv4TransmissionParams來描述,關於該參數類的詳細參見3.2.7節。形參爲RTPAddress的函數需要傳遞一個類型爲RTPIPv4Address的參數,關於RTPIPv4Address由3.2.9節詳細描述。RTPUDPv4Transmitter類的成員函數GetTransmissionInfo返回一個RTPUDPv4TransmissionInfo對象,該類詳細參見3.2.8節。

基於IPv6的UDP傳輸器,頭文件:rtpudpv6transmitter.h,繼承自:RTPTransmitter類
類RTPUDPv6Transmitter繼承了類RTPTransmitter的接口,成爲一個傳輸組件,使用基於IPv6的UDP協議來傳輸RTP和RTCP數據。
該組件的參數由類RTPUDPv6TransmissionParams來描述,關於該參數類的詳細參見3.2.7節。形參爲RTPAddress的函數需要傳遞一個類型爲RTPIPv6Address的參數,關於RTPIPv6Address由3.2.9節詳細描述。RTPUDPv6Transmitter類的成員函數GetTransmissionInfo返回一個RTPUDPv6TransmissionInfo對象,該類詳細參見3.2.8節。


3.2.7 RTPTransmissionParams類,頭文件:rtptransmitter.h
RTPTransmissionParams類是一個抽象基類,特定的傳輸組件需要特定的繼承實現。所有的實現都繼承下面的函數,用來確定對這些參數來說哪個傳輸組件是有效的
RTPTransmitter::TransmissionProtocol GetTransmissionProtocol()

基於IPv4的UDP傳輸器的參數,頭文件:rtpudpv4transmitter.h,繼承自:RTPTransmissionParams
RTPUDPv4TransmissionParams
類代表基於IPv4的UDP傳輸組件使用的參數。默認的TTL設置爲1,端口號設爲5000,類的接口如下:

void SetBindIP(uint32_t ip)
-----將與套接字綁定的IP設置爲ip。

void SetPortbase(uint16_t  pbase)
-----將RTP的端口號設爲pbase,該數值必須是偶數!

void SetMulticastTTL(uint8_t mcastTTL)
-----設置組播的TTL爲mcastTTL。

void SetLocalIPList(std::list<uint32_t> &iplist)
-----傳遞一組將要作爲本地IP地址的IP地址列表。

void ClearLocalIPList()
-----清除本地IP地址列表,一個空的表將使得傳輸組件自己決定使用的本地IP地址。

uint32_t GetBindIP() const
-----返回套接字將綁定的IP地址。

uint16_t GetPortbase() const
-----返回RTP將要使用的端口號。

uint8_t GetMulticastTTL() const
-----返回要使用的組播TTL。

const std::list<uint32_t> &GetLocalIPList() const
-----返回本地IP地址列表。

基於IPv6的UDP傳輸器的參數,頭文件:rtpudpv6transmitter.h,繼承自:RTPTransmissionParams
RTPUDPv6TransmissionParams類代表基於IP64的UDP傳輸組件使用的參數。默認的TTL設置爲1,端口號設爲5000,類的接口如下:

void SetBindIP(in6_addr ip)
-----將與套接字綁定的IP設置爲ip。

void SetPortbase(uint16_t  pbase)
-----將RTP的端口號設爲pbase,該數值必須是偶數!

void SetMulticastTTL(uint8_t mcastTTL)
-----設置組播的TTL爲mcastTTL。

void SetLocalIPList(std::list<in6_addr> &iplist)
-----傳遞一組將要作爲本地IP地址的IP地址列表。

void ClearLocalIPList()
-----清除本地IP地址列表,一個空的表將使得傳輸組件自己決定使用的本地IP地址。

in6_addr GetBindIP() const
-----返回套接字將綁定的IP地址。

uint16_t GetPortbase() const
-----返回RTP將要使用的端口號。

uint8_t GetMulticastTTL() const
-----返回要使用的組播TTL。

const std::list<in6_addr> &GetLocalIPList() const
-----返回本地IP地址列表。


3.2.8 RTPTransmissionInfo,頭文件:rtptransmitter.h
類RTPTransmissionInfo
是一個抽象基類,根據特定的傳輸組件有特定的(繼承)實現。所有的具體實現都繼承下面的函數,用來確定對這些參數來說哪個傳輸組件是有效的(【譯註:就是說該函數是用來指出實際使用的傳輸組件類型的,原文:All actual implementations inherit the following function which identify the component type for which these parameters are valid】):
RTPTransmitter::TransmissionProtocol GetTransmissionProtocol()

關於基於IPv4的UDP傳輸器的信息,頭文件:rtpudpv4transmitter.h
類RTPUDPv4TransmissionInfo給出了關於基於IPv4的UDP傳輸組件的更多信息,可用的成員函數如下:

std::list<uint32_t> GetLocalIPList() const
-----返回傳輸器可選擇作爲本機IP地址的IPv4地址列表。

int GetRTPSocket() const
-----返回用於收發RTP數據包的套接字描述子。

int GetRTCPSocket() const
-----返回用於收發RTCP數據包的套接字描述子。

關於基於IPv6的UDP傳輸器的信息,頭文件:rtpudpv6transmitter.h
類RTPUDPv6TransmissionInfo給出了關於基於IPv6的UDP傳輸組件的更多信息,可用的成員函數如下:

std::list<in6_addr> GetLocalIPList() const
-----返回傳輸器可選擇作爲本機IP地址的IPv6地址列表。

int GetRTPSocket() const
-----返回用於收發RTP數據包的套接字描述子。

int GetRTCPSocket() const
-----返回用於收發RTCP數據包的套接字描述子。


 
3.2.9 RTPAddress,頭文件:rtpaddress.h
類RTPAddress
是一個用來指出單播目的地址或者組播組的抽象基類。該類定義了下面的參數用來確定具體實現所使用的(地址類型)。
enum AddressType {IPv4Address, IPv6Address, UserDefinedAddress};
基於IPv4的UDP傳輸器使用類型RTPAddress::IPv4Address,基於IPv6的UDP傳輸器使用類型RTPAddress::IPv6Address。當使用用戶自定義類型的傳輸組件時RTPAddress:: UserDefinedAddress會很有用。
類定義了以下接口:

AddressType GetAddressType() const
-----返回具體實現所代表的地址類型。

RTPAddress *CreateCopy() const
-----創建一個RTPAddress對象的拷貝。

bool IsSameAddress(const RTPAddress *addr) const
-----檢查對象使用的地址是否與地址addr相同,具體實現需要能夠處理參數爲NULL的情況。

bool IsFromSamHost(const RTPAddress *addr) const
-----檢查地址addr所代表的主機是否與對象是同一個,具體實現需要能夠處理參數爲NULL的情況。

RTPIPv4Address,頭文件:rtpipv4address.h
該類在基於IPv4的UDP傳輸組件中使用,類定義了下面的函數:

RTPIPv4Address(uint32_t ip=0, uint16_t port=0)
-----創建一個IP地址爲ip,端口號爲port的對象,兩個參數都是主機字節序表示。

RTPIPv4Address(const uint8_t ip[4], uint16_t port=0)
-----創建一個IP地址爲ip,端口號爲port的對象,兩個參數都是主機字節序表示。

void SetIP(uint32_t ip)
-----將對象的IP地址設爲ip,ip是用主機字節序表示。

void SetPort(uint16_t port)
-----將對象的端口號設爲port,port是用主機字節序表示。

uint32_t GetIP() const
-----返回以主機字節序表示的對象IP地址。

Uint16_t GetPort() const
-----返回以主機字節序表示的對象端口號。
當RTPIPv4Address地址用於傳輸器的組播函數的任意一個時,端口號將被忽略。當該類的對象用於傳輸器的接受或者拒絕函數中的一個時,0號端口將代表指定IP地址的所有端口。

RTPIPv6Address,頭文件:rtpipv6address.h
該類在基於IPv6的UDP傳輸組件中使用,類定義了下面的函數:

RTPIPv6Address()
-----創建一個IP地址和端口號都爲0的對象。

RTPIPv6Address(const uint8_t ip[16], uint16_t port=0)
-----創建一個IP地址爲ip,端口號爲port的對象,兩個參數都是主機字節序表示。

RTPIPv6Address(in6_addr ip, uint16_t port=0)
-----創建一個IP地址爲ip,端口號爲port的對象,兩個參數都是主機字節序表示。

void SetIP(in6_addr ip)
-----將對象的IP地址設爲ip。

void SetIP(const uint8_t ip[16])
-----將對象的IP地址設爲ip。  

void SetPort(uint16_t port)
-----將對象的端口號設爲port,port是用主機字節序表示。

void GetIP(uint8_t ip[16]) const
-----拷貝對象IP地址到ip。

in6_addr GetIP() const
-----返回對象IP地址。

Uint16_t GetPort() const
-----返回以主機字節序表示的對象端口號。
當RTPIPv6Address地址用於傳輸器的組播函數的任意一個時,端口號將被忽略。當該類的對象用於傳輸器的接受或者拒絕函數中的一個時,0號端口將代表指定IP地址的所有端口。

3.2.10 RTPRawPacket,頭文件:rtprawpacket.h
類RTPRawPacket
被傳輸組件用來保存收到的RTP和RTCP數據。接口如下:

RTPRawPacket(uint8_t *data, size_t datalen, RTPAddress *address, RTPTime &recvtime, bool rtp)
-----創建一個對象用來保存長度爲datalen的data中的數據,注意:只保存指向數據的指針而不會複製數據!數據包的發送地址和收到的時間將分別保存到address和recvtime中。rtp標誌用來區分收到的數據是RTP數據還是RTCP數據。

uint8_t *GetData()
-----返回指向數據包中數據的地址。

size_t GetDataLength() const
-----返回該對象所代表的數據包的長度。

RTPTime GetReceiveTime() const
-----返回收到數據包的時間。

const RTPAddress *GetSenderAddress() const
-----返回數據包中保存的(發送方)地址。

bool IsRTP() const
-----如果數據是RTP數據返回true,否則返回false代表是RTCP數據。

void ZeroData()
-----將指向數據包中保存的數據的指針設爲0,這將阻止在調用類的析構函數時對實際數據進行的delete調用。該函數在類RTPPacket和RTCPCompoundPacket用來獲取數據包數據而又不需要複製數據時使用,用來確保當RTPRawPacket的析構函數調用時不會刪除數據。

 
3.2.11 RTPPacket,頭文件:rtppacket.h
類RTPPacket用來在RTPRawPacket對象表示一個RTP數據時解析(數據包)。該類也可以用來根據用戶指定的參數生成一個RTP數據包,接口如下:

RTPPacket(RTPRawPacket &rawpacket)
-----基於rawpacket中的數據生成一個RTPPacket對象。

RTPPacket(uint8_t payloadtype, const void *payloaddata, size_t payloadlen, uint16_t seqnr, uint32_t timestamp, uint32_t ssrc, bool gotmaker, uint8_t numcsrcs, const uint32_t *csrcs, bool gotextension, uint16_t extionid, uint16_t extensionlen_numwords, const void *extensiondata, size_t maxpacksizt=0)
-----爲RTP數據包生成一個新的緩衝區,並根據給定的參數填充各個域。如果maxpacksize不等於0,則當總的數據包大小超過maxpacksize時將產生一個錯誤。該構造函數的參數都是自解釋的,需要注意的是擴展頭的大小由一個32位的字指定。

RTPPacket(uint8_t payloadtype, const void *payloaddata, size_t payloadlen, uint16_t seqnr, uint32_t timestamp, uint32_t ssrc, bool gotmaker, uint8_t numcsrcs, const uint32_t *csrcs, bool gotextension, uint16_t extionid, uint16_t extensionlen_numwords, const void *extensiondata, void *buffer, size_t buffersize)
-----與上一個函數基本一樣的函數,不同點在於數據是存儲在一個由buffer指定的大小爲buffersize的緩衝區中。

int GetCreationError() const
-----如果構造函數發生錯誤,該函數返回錯誤碼。

bool HasExtension() const
-----如果RTP數據包有擴展頭則返回true,否則返回false。

bool HasMarker() const
-----如果marker標誌位被置位,返回true,否則返回false。

int GetCSRCCount() const
-----返回數據包中的CSRC數。

uint32_t GetCSRC(int num) const
-----返回指定的CSRC標識符,參數num可以從0到GetCSRCCount()-1。

uint8_t GetPayloadType() const
-----返回數據包的負載類型。

uint32_t GetExtendedSequenceNumber() const
-----返回數據包的擴展序列號。當數據包剛剛收到時,只有底16位被設置,高16位隨後填充。

uint16_t GetSequenceNumber() const
-----返回數據包的序列號。

void SetExtendedSequenceNumber(uint32_t seq)
-----將數據包的擴展序列號設置爲seq。

void GetTimestamp() const
-----返回數據包的時間戳。

uint32_t GetSSRC() const
-----返回數據包中的SSRC標識符。

uint8_t *GetPacketData() const
-----返回指向整個數據包的指針。

uint8_t *GetPayloadData() const
-----返回指向實際負載數據的指針。

size_t GetPacketLength() const
-----返回整個數據包的大小。

size_t GetPayloadLength() const
-----返回整個負載數據的大小。

uint16_t GetExtensionID() const
-----如果有擴展頭,則該函數將返回擴展標識符。

uint8_t *GetExtensionData() const
-----返回指向擴展頭數據的指針。

size_t GetExtensionLength() const
-----返回擴展頭數據的大小。

RTPTime GetReceiveTime() const
-----當一個RTPPacket對象從RTPRawPacket對象中創建時,原始數據的接收時間將保存到RTPPacket對象中,該函數用來獲取這個時間。


 
3.2.12 RTPCompoundPacket,頭文件:rtpcompoundpacket.h
該類描述RTCP複合數據包,接口如下:

RTCPCompoundPacket(RTPRawPacket &rawpack)
-----根據rawpack的數據生成一個RTCPCompoundPacket對象。

int GetCreationError()
-----如果在構造函數中的原始數據包無法解析,則該函數將返回出錯原因的錯誤碼。如果包的格式不合法則將返回ERR_RTP_RCTPCOMPOUND_INVALIDPACKET。

uint8_t *GetCompoundPacketData()
-----返回指向整個RTCP複合數據包數據的指針。

size_t GetCompoundPacketLength()
-----返回整個RTCP複合數據包的長度。

void GotoFirstPacket()
-----開始遍歷整個RTCP複合數據包中的單個RTCP數據包。

RTCPPacket *GetNextPacket()
-----返回指向下一個獨立RTCP數據包的指針。注意:返回的RTCPPacket對象可能不調用delete。RTCPPacket類的介紹如下:

RTCPPacket,頭文件:rtppacket.h
類RTCPPacket是具體類型的RTCP數據包的基類。在類中定義的下面的類型指出了不同的具體數據包類型:
enum PacketType{ SR, RR, SDES, BYE, APP, Unknown };
類定義的成員函數有:

bool IsKnownFormat() const
-----如果子類可以解析數據則返回true,否則返回false。

PacketType GetPacketType() const
-----返回子類實現的具體的包類型:
--RTCPPacket::SR:表明是一個RTCPSRPacket對象。
--RTCPPacket::RR:表明是一個RTCPRRPacket對象。
--RTCPPacket::SDES:表明是一個RTCPSDESPacket對象。
--RTCPPacket::BYE:表明是一個RTCPBYEPacket對象。
--RTCPPacket::APP:表明是一個RTCPAPPPacket對象。
--RTCPPacket::Unkown:表明是一個RTCPUnknownPacket對象。

uint8_t *GetPacketData()
-----返回指向RTCP數據包中的數據的指針。

size_t GetPacketLength() const
-----返回RTCP數據包的長度。

RTCPSRPacket,頭文件:rtcpsrpacket.h,繼承自:RTCPPacket
類描述了一個RTCP發送方報告數據包,接口如下:

RTCPSRPacket(uint8_t *data, size_t datalen)
-----基於長度爲datalen的數據data創建一個RTCPSRPacket數據包對象。因爲data指向的數據在類內部被引用(即不復制數據),所以必須確保在該對象存在期間data指針指向的內存是有效合法的。

uint32_t GetSenderSSRC() const
-----返回發送該數據包的(會話)參與者的SSRC。

RTPNTPTime GetNTPTimestamp() const
-----返回發送發報告中的NTP時間戳。

uint32_t GetRTPTimestamp() const
-----返回發送方報告中的RTP時間戳。

uint32_t GetSenderPacketCount() const
-----返回在發送方報告中的發送方數據包計數。

uint32_t GetSenderOctetCount() const
-----返回在發送方報告中的發送方字節計數。

int GetReceptionReportCount() const
-----返回數據包中的接收報告塊的個數。

uint32_t GetSSRC(int index) const
-----返回由index指定的接收報告塊的SSRC,index的取值範圍從0到GetReceptionReportCount()-1。注意:(函數)並不檢查index範圍的合法性。

uint8_t GetFractionLost(int index) const
-----返回index指定的接收報告中的丟包率屬性(or字段?)。index的取值範圍與上面一樣,同樣不檢查index的範圍的合法性。

int32_t GetLostPacketCount(int index) const
-----返回由index指出的接受報告中的丟失的數據包的個數。關於index的描述與上面相同。

uint32_t GetExtendedHighestSequenceNumber(int index) const
-----返回由index指出的接收報告中的擴展的最高序列號(??),index同上。

uint32_t GetJitter(int index) const
-----返回index指出的接收報告中的抖動屬性,index同上。

uint32_t GetLSR(int index) const
-----返回index指出的接受報告中的LSR屬性,index同上。

uint32_t GetDLSR(int index) const
-----返回index指出的接受報告中的DLSR屬性,index同上。

RTCPRRPacket,頭文件:rtcprrpacket.h,繼承自:RTCPPacket
類描述了一個RTCP接收方報告數據包,接口如下:

RTCPRRPacket(uint8_t *data, size_t datalen)
-----基於長度爲datalen的數據data創建一個RTCPRRPacket數據包對象。因爲data指向的數據在類內部被引用(即不復制數據),所以必須確保在該對象存在期間data指針指向的內存是有效合法的。

uint32_t GetSenderSSRC() const
-----返回發送該數據包的(會話)參與者的SSRC。

int GetReceptionReportCount() const
-----返回數據包中的接收報告塊的個數。

uint32_t GetSSRC(int index) const
-----返回由index指定的接收報告塊的SSRC,index的取值範圍從0到GetReceptionReportCount()-1。注意:(函數)並不檢查index範圍的合法性。

uint8_t GetFractionLost(int index) const
-----返回index指定的接收報告中的丟包率屬性。index的取值範圍與上面一樣,同樣不檢查index的範圍的合法性。

int32_t GetLostPacketCount(int index) const
-----返回由index指出的接受報告中的丟失的數據包的個數。關於index的描述與上面相同。

uint32_t GetExtendedHighestSequenceNumber(int index) const
-----返回由index指出的接收報告中的擴展的最高序列號(??),index同上。

uint32_t GetJitter(int index) const
-----返回index指出的接收報告中的抖動屬性,index同上。

uint32_t GetLSR(int index) const
-----返回index指出的接受報告中的LSR屬性,index同上。

uint32_t GetDLSR(int index) const
-----返回index指出的接受報告中的DLSR屬性,index同上。

RTCPSDESPacket,頭文件:rtcpsdespacket.h,繼承自:RTCPPacket
該類描述了RTCP 的SDES數據包,類中定義瞭如下的類型:
enum ItemType{ None, CNAME, NAME, EMAIL, PHONE, LOC, TOOL, NOTE, PRIV, Unknown};
這些類型用來確定SDES每一個項的類型,None用來指出遍歷所有項的結束,Unknown用來指出確實有一項存在,但是該項不是標準類型。
類的接口如下:

RTCPSDESPacket(uint8_t *data, size_t datalen)
-----基於長度爲datalen的數據data創建一個RTCPSDESPacket數據包對象。因爲data指向的數據在類內部被引用(即不復制數據),所以必須確保在該對象存在期間data指針指向的內存是有效合法的。

int GetChunkCount() const
-----返回SDES數據包中SDES數據塊的個數,每個數據塊都有自己的標識符。

bool GotoFirstChunk()
-----開始遍歷,如果沒有SDES數據塊存在,函數返回false,否則返回true並將當前數據塊設置爲第一個數據塊。

bool GotoNextChunk()
-----將當前數據塊設置爲下一個有效的數據塊,如果沒有數據塊可用了,則返回false,否則返回true。

uint32_t GetChunkSSRC() const
-----返回當前數據塊的SSRC標識符。

bool GotoFirstItem()
-----在當前數據塊上開始遍歷SDES的各項,如果沒有SDES項存在,則返回false,否則返回true並將第一項設爲當前項。

bool GotoNextItem()
-----如果當前數據塊中還存在項(條目?),將當前項設置爲下一項,並返回true,否則返回false。

ItemType GetItemType() const
-----返回當前數據塊的當前數據項的類型。

size_t GetItemLength() const
-----返回當前數據塊的當前數據項的長度。

uint8_t *GetItemData()
-----返回當前數據塊的當前數據項的數據。如果在編譯庫的時候選擇了支持SDES私有項,那麼在當前項SDES是私有項時下列函數也可用。

size_t GetPRIVPrifixLength()
-----返回私有項的前綴字符串長度。

uint8_t *GetPRIVPrefixData()
-----返回私有項中前綴字符串的實際數據。

size_t GetPRIVValueLength()
-----返回私有項的值字符串的長度。

uint8_t *GetPRIVValueData()
-----返回私有項中值字符串的實際數據。

RTCPAPPPacket,頭文件:rtcpapppacket.h,繼承自:RTCPPacket
類RTCPAPPPacket描述了RTCP 的APP包,接口如下:

RTCPAPPPacket(uint8_t *data, size_t datalen)
-----基於長度爲datalen的數據data創建一個RTCPAPPPacket數據包對象。因爲data指向的數據在類內部被引用(即不復制數據),所以必須確保在該對象存在期間data指針指向的內存是有效合法的。

uint8_t GetSubType() const
-----返回APP數據包的子類型。

uint32_t GetSSRC() const
-----返回發送數據包的源的SSRC。

uint8_t *GetName()
-----返回在APP包中包含的名字,由四個不是以null結尾的字節組成。

uint8_t *GetAPPData()
-----返回指向實際數據的指針。

size_t GetAPPDataLength() const
-----返回實際數據的長度。

RTCPBYEPacket,頭文件:rtcpbyepacket.h,繼承自:RTCPPacket
類RTCPBYEPacket描述了RTCP 的BYE包,接口如下:

RTCPBYEPacket(uint8_t *data, size_t datalen)
-----基於長度爲datalen的數據data創建一個RTCPBYEPacket數據包對象。因爲data指向的數據在類內部被引用(即不復制數據),所以必須確保在該對象存在期間data指針指向的內存是有效合法的。

int GetSSRCCount() const
-----返回BYE數據包中存在的SSRC標識符的個數。

uint32_t GetSSRC(int index) const
-----返回由index指出的SSRC,index的範圍可以是0到GetSSRCCount()-1,注意index沒有範圍的有效性檢查。

bool HasReasonLength() const
------如果BYE包中包含離開原因則返回true。

size_t GetReasonLent() const
-----返回源離開的原因字符串長度。

uint8_t *GetReasonData()
-----返回實際的原因數據。

RTCPUnknownPacket,頭文件:rtcpunknownpacket.h,繼承自:RTCPPacket  
這個類除了繼承的函數外,沒有其他的成員函數,注意:因爲未知的數據包格式沒有什麼可檢查的,所以IsKnownFormat函數只是單純的返回一個true。只有構造函數是可用的。

RTCPUnKnownPacket(uint8_t *data, size_t datalen)
-----基於長度爲datalen的數據data創建一個RTCPBYEPacket數據包對象。因爲data指向的數據在類內部被引用(即不復制數據),所以必須確保在該對象存在期間data指針指向的內存是有效合法的。


3.2.13 RTCPCompoundPacketBuilder,頭文件:rtpcompoundpacketbuilder.h繼承自:RTCPCompoundPacket
類RTCPCompoundPacketBuilder可用來構造一個RTCP複合數據包,一旦成功構建就可以繼承RTCPCompoundPacket類的成員函數來獲取複合數據包的信息。下列函數如果超出了最大允許(包)的大小將返回ERR_RTP_RTCPCOMPPACKBUILDER_NOTEN-OUGHBYTESLEFT。
接口如下:

int InitBuild(size_t maxpacketsize)
-----開始構建一個最大大小爲maxpacksize的RTCP複合數據包,將分配新的內存來存儲數據包。

int InitBuild(void *externalbuffer, size_t buffersize)
-----開始構建數據包,數據將被存儲在外部由externalbuffer指定的最大存儲量爲buffersize個字節的地方。

int StartSenderReport(uint32_t senderssrc, const RTPNTPTime, &ntptimestamp, uint32_t rtptimestamp, uint32_t packcount, uint32_t octetcount)
-----告知數據包構建器需要以一個包含有函數參數指定的發送者信息的發送者報告爲開頭構建數據包。一旦發送者報告開始了,可以使用函數AddReportBlock來加入發送數據塊。

int StartReceiverReport(uint32_t senderssrc)
-----告知數據包構建器數據包應該以一個包含由senderssrc指定的發送者SSRC的接受者報告開頭。一旦發送者報告開始了,可以使用函數AddReportBlock來加入發送數據塊。

int AddReportBlock(uit32_t ssrc, uint8_t fractionlost, int32_t packetslost, uint32_t exthighestseq, uint32_t jitter, uint32_t lsr, uint32_t dlsr)
-----加入由函數參數指定的報告塊信息,如果加入的報告塊個數大於31個,則構建器將自動使用新的RTCP接受者報告數據包。

int AddSDESSource(uint32_t ssrc)
-----爲參與者ssrc開始構建SDES數據塊(譯註:Starts an SDES chunk for participant ssrc)。

int AddSDESNormalItem(RTCPSDESPacket::ItemType t, const void *itemdata, uint8_t itemlength)
-----將一個類型爲t的常規(非私有)SDES項加入到SDES數據塊中。項值是長度爲itemlength的itemdata數據。

int AddBYEPacket(uint32_t *ssrc, uint8_t numssrcs, const void *reasondata, uint8_t reasonlength)
-----在複合數據包中加入一個BYE包。包中將包含由ssrcs指定的numssrcs源標識符,並且由長度爲reasonlength的reasondata字符串指出離開原因。(譯註:It will contain numssrcs source identifiers specified in ssrcs)

int AddAPPPacket(uint8_t subtype, uint32_t ssrc, const uint8_t name[4], const void *appdata, size_t appdatalen)
-----在複合數據包中加入由參數指定的APP數據包,注意:appdatalen必須是4的倍數。

int EndBuild()
-----結束構建複合數據包。如果成功RTCPCompoundPacket的成員函數就可以用來獲取RTCP數據包的數據。

int AddSDESPrivateItem(const void *prefixdata, uint8_t prefixlength, const void *valuedata, uint8_t valuelength)
-----在當前SDES數據塊中加入由函數參數描述的SDES PRIV項。


3.2.14 RTPSources,頭文件:rtpsources.h
類RTPSources代表一張保存參與會話的源的信息的表。類有成員函數來迭代遍歷參與者,處理RTP和RTCP數據。注意:地址NULL用於標識從我們自己的會話發出的包,類提供了許多可重載的函數用來獲取特定的事件(新的SSRC, SSRC衝突等)。
如果開啓了試用支持,則你可以選擇下面三種試用類型之一:
enum ProbationType { NoProbation, ProbationDiscard, ProbationStore};
當選擇了NoProbation,則試用算法將不會用來驗證新的源;當使用了ProbationDiscard,試用算法將會激活但是收到的數據包都會丟棄直到(數據)源得到驗證。要激活試用路由並且在(數據)源驗證前保存收到的數據包,應該選擇ProbationStore模式。
類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 &notetimeout)
-----上面的四個函數的組合,該函數比調用上面的四個函數(每個一遍)更有效率,因爲該函數僅需遍歷一遍。

int GetSenderCount() const
-----返回標記爲發送者的參與者的個數。

int GetTotalCount() const
-----返回源表中的所有的項【參與者】的個數。

int GetActiveMemberCount() const
-----返回確認的而且還沒有發送BYE數據包的成員個數。

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項超時時調用。


3.2.15 RTPSourceData,頭文件:rtpsourcedata.h
類RTPSourceData包含會話成員的所有信息,類接口如下:

uint32_t GetSSRC() const
-----返回該成員的SSRC標識符。

bool HasData() const
-----如果RTP數據包可以提取,則返回true。

RTPPacket *GetNextPacket()
-----提取參與者RTP數據包隊列的第一個數據包。

void FlushPackets()
-----清除參與者RTP包列表。

bool IsOwnSSRC() const
-----如果參與者是通過RTPSources的成員函數CreateOwnSSRC加入的,則返回true,否則返回false。

bool IsCSRC() const
-----如果源標識符實際是來自RTP數據包的CSRC則返回true。

bool IsSender() const
-----如果該成員被標記爲發送者,則返回true,否則返回false。

bool IsValidated() const
-----如果參與者是有效的則返回true,即連續收到了該參與者的一定數量的RTP包或者收到了該參與者的CNAME項。

bool IsActive() const
-----如果源是有效的並且沒有發送BYE包則返回true。

void SetProcessedInRTCP(bool v)
-----函數在RTCPPacketBuilder類中被調用來標記參與者信息是否已經在報告數據塊中處理過了。

bool IsProcessedInRTCP() const
-----函數在RTCPPacketBuilder類中被調用來標記參與者是否已經在報告數據塊中處理過了。

bool IsRTPAddressSet() const
-----如果該參與者的RTP數據包發送源地址已經設定好了則返回true。

bool IsRTCPAddressSet() const
-----如果該參與者的RTCP數據包發送源地址已經設定好了則返回true。

const RTPAddress *GetRTPDataAddress() const
-----返回發送該參與者RTP包的源地址。如果該地址已經設定了返回值爲NULL,這表示數據包時來自本地參與者。

const RTPAddress *GetRTCPDataAddress() const
------返回發送該參與者RTCP包的源地址。如果該地址已經設定了返回值爲NULL,這表示數據包時來自本地參與者。

bool ReceivedBYE() const
-----如果收到了該參與者的BYE信息則返回true,否則返回false。

uint8_t *GetBYEReason(size t *len) const
-----返回在BYE包中的參與者的離開原因,原因字符串的長度由len指出。

RTPTime GetBYETime() const
-----返回發送BYE包的時間。

void SetTimestampUnit(double tsu)
-----設置收到該參與者數據時用於抖動計算的時間戳單位數值。如果沒有設置,庫計算兩個連續的RTCP發送者報告(中的信息)來估計時間戳單位。時間戳定義爲:一段時間的採樣數除以這段時間間隔,對於8000Hz的音頻來說是1.0/8000.0。

double GetTimestampUnit() const
-----返回該參與者的時間戳單位。

bool SR_HasInfo() const
-----如果收到了該參與者的發送者報告則返回true。

RTPNTPTime SR_GetNTPTimestamp() const
-----返回在上一個發送者報告中的NTP時間戳。

uint32_t SR_GetRTPTimestamp() const
-----返回在上一個發送者報告中的RTP時間戳。

uint32_t SR_GetPacketCount() const
-----返回上一個發送者報告中的包個數。

uint32_t SR_GetByteCount() const
-----返回上一個發送者報告中的字節個數。

RTPTime SR_GetReceiveTime() const
-----返回上個發送者報告的收到時間。

bool SR_Prev HasInfo() const
-----如果收到了不止一個RTCP發送者報告則返回true。

RTPNTPTime SR_Prev_GetNTPTimestamp() const
-----返回收到的倒數第二個發送者報告中的NTP時間戳。

uint32_t SR_Prev_GetRTPTimestamp() const
-----返回倒數第二個發送者報告中的RTP時間戳。

uint32_t SR_Prev_GetPacketCount() const
-----返回倒數第二個發送者報告中數據包個數。

uint32_t SR_Prev_GetByteCount() const
-----返回倒數第二個發送者報告中字節數。

RTPTime SR_Prev_GetReceiveTime() const
-----返回倒數第二個發送者報告的接收時間。

bool RR_HasInfo() const
-----如果參與者發送了一個關於我們接收數據的信息的接受者報告則返回true。

double RR_GetFractionLost() const
-----返回上一個報告中的丟包率。

int32_t RR_GetPacketsLost() const
-----返回上一個報告中的丟包數。

uint32_t RR_GetExtendedHighestSequenceNumber() const
-----返回上個報告中的擴展最高序列號。

uint32_t RR_GetJitter() const
-----返回上個報告中的抖動值。

uint32_t RR_GetLastSRTimestamp() const
-----返回上個報告中的LSR值。

uint32_t RR_GetDelaySinceLastSR() const
-----返回上個報告中的DLSR值。

RTPTime RR_GetReceiveTime() const
-----返回上個報告的接收時間。

bool RR_Prev_HasInfo() const
-----如果參與者發送了不止一個關於我們接受數據信息的接受者報告則返回true。

double RR_Prev_GetFractionLost() const
-----返回倒數第二個(接收者)報告中的丟包率。

int32_t RR_Prev_GetPacketsLost() const
-----返回倒數第二個(接收者)報告中的丟包個數。

uint32_t RR_Prev_GetExtendedHighestSequenceNumber() const
-----返回倒數第二個(接收者)報告中的擴展最高序列號。

uint32_t RR_Prev_GetJitter() const
-----返回倒數第二個(接收者)報告中的抖動值。

uint32_t RR_Prev_GetLastSRTimestamp() const
-----返回倒數第二個(接收者)報告中的

uint32_t RR_Prev_GetDelaySinceLastSR() const
-----返回倒數第二個(接收者)報告中的LSR值。

RTPTime RR_Prev_GetReceiveTime() const
-----返回倒數第二個(接收者)報告中的DLSR。

bool INF_HasSentData() const
-----如果收到了該參與者的有效RTP數據包則返回true。

int32_t INF_GetNumPacketsReceived() const
-----返回從該參與者收到的所有的數據包數。

uint32_t INF_GetBaseSequenceNumber() const
-----返回該參與者的基數序列號。

uint32_t INF_GetExtendedHighestSequenceNumber() const
-----返回從該參與者收到的擴展最高序列號。

uint32_t INF_GetJitter() const
-----返回該參與者的當前抖動值。

RTPTime INF_GetLastMessageTime() const
-----返回上次從該成員聽到【收到?】任何消息的時間。

RTPTime INF_GetLastRTPPacketTime() const
-----返回上次收到RTP數據包的時間。

double INF_GetEstimatedTimestampUnit() const
-----返回估計的時間戳單位。該估計是基於兩個連續的發送者報告(來計算的)。

uint32_t INF_GetNumPacketsReceivedInInterval() const
-----返回由INF_StartNewInterval啓動的新的時間間隔期間收到的數據包數量。

uint32_t INF_GetSavedExtendedSequenceNumber() const
-----返回調用INF_StartNewInterval()保存的擴展序列號。

void INF_StartNewInterval()
-----開始一個新的用於計數接收到的數據包的時間間隔。同時還保存當前的擴展最高序列號以用於計算時間間隔內的丟包。

RTPTime INF_GetRoundtripTime() const
-----使用上一個接受者報告的LSR和DLSR估計往返時間。

RTPTime INF_GetLastSDESNoteTime() const
-----返回上次收到SDES NOTE項時的時間。

uint8_t *SDES_GetCNAME(size_t *len) const
-----返回一個指向該參與者的SDES CNAME項的指針,並將其長度存入len。

uint8_t *SDES_GetName(size_t *len) const
-----返回一個指向該參與者的SDES 名字項的指針,並將其長度存入len。

uint8_t *SDES_GetEMail(size_t *len) const
-----返回一個指向該參與者的SDES e-mail項的指針,並將其長度存入len。

uint8_t *SDES_GetPhone(size_t *len) const
-----返回一個指向該參與者的SDES phone項的指針,並將其長度存入len。

uint8_t *SDES_GetLocation(size_t *len) const
-----返回一個指向該參與者的SDES 位置項的指針,並將其長度存入len。

uint8_t *SDES_GetTool(size_t *len) const
-----返回一個指向該參與者的SDES 工具項的指針,並將其長度存入len。

uint8_t *SDES_GetNote(size_t *len) const
-----返回一個指向該參與者的SDES 通知項的指針,並將其長度存入len。

void SDES GotoFirstPrivat_Value()
-----開始遍歷保存的SDES私有項的前綴以及它們關聯的值。

bool SDES_GetNextPrivateValue(uint8 t **prefix, size_t *prefixlen, uint8_t **value, size_t *valuelen)
-----如果有效,則返回true,並且將SDES的私有項前綴存入prefix,長度存入prefixlen,關聯的值以及長度分別存入value和valuelen。否則返回false。

bool SDES_GetPrivateValue(uint8_t *prefix, size_t prefixlen, uint8_t **value, size_t *valuelen) const
-----查找與SDES的私有項前綴爲prefix長度爲prefixlen對應的項,如果找到則返回true並且將關聯的值和長度分別存入value和valuelen中。


3.2.16 RTPPacketBuilder,頭文件:rtppacketbuilder.h
該類可以用來構建RTP數據包,比RTPPacket類高級一點:可以產生SSRC標識符,跟蹤時間戳,序列號等。接口如下:

int Init(size_t maxpacksize)
-----初始化構建器使得允許的包大小小於maxpack。

void Destroy()
-----清理構建器。

uint32_t GetPacketCount()
-----返回與當前SSRC標識符一塊創建的包的數量。

uint32_t GetPayloadOctetCount()
-----返回由該SSRC標識符產生的負載字節數。

int SetMaximumPacketSize(size_t maxpacksize)
-----將最大允許包大小設置爲maxpacksize。

int AddCSRC(uint32_t csrc)
-----在RTP包要保存的CSRC鏈表中加入一個SSRC。

int DeleteCSRC(uint32_t csrc)
-----從要保存入RTP包的CSRC表中刪除一個SSRC。

void ClearCSRCList()
-----清除CSRC鏈表。

int BuildPacket(const void *data, size_t len)
-----構建一個負載爲data長度爲len的數據包,負載類型,標識,時間戳增量等使用後面的SetDefault函數設置的值。

int BuildPacket(const void *data, size_t len, uint8_t pt, bool mark, uint32_t timestampinc)
-----構建一個負載爲data長度爲len的數據包,負載類型爲pt,標識位爲mark,包構建成功之後時間戳增量爲temstamp。

int BuildPacketEx(const void *data, size_t len, uint16_t hdrextID, const void *hdrextdata, size_t numhdrextwords)
-----構建一個負載爲data長度爲len的數據包,負載類型,標識,時間戳增量等使用後面的SetDefault函數設置的值。該數據包還將包含一個標識符爲hdrextID數據爲hdrextdata的RTP擴展頭,擴展數據頭的長度由一個32位的字numhdrextwords給出。

int BuildPacketEx(const void *data, size_t len, uint8_t pt, bool mark, uint32_t timestampinc, uint16_t hdrextID, const void *hdrextdata, size_t numhdrextwords)
-----構建一個負載爲data長度爲len的數據包,負載類型爲pt,標識位爲mark,包構建成功之後時間戳增量爲temstamp。該數據包還將包含一個標識符爲hdrextID數據爲hdrextdata的RTP擴展頭,擴展數據頭的長度由一個32位的字numhdrextwords給出。

uint8_t *GetPacket()
-----返回指向上次構建的RTP數據包數據的指針。

size_t GetPacketLength()
-----返回上次構建的RTP數據包的長度。

int SetDefaultPayloadType(uint8_t pt)
-----設置默認負載類型爲pt。

int SetDefaultMark(bool m)
-----設置默認標誌位爲m。

int SetDefaultTimestampIncrement(uint32_t timestampinc)
-----設置默認時間戳增量爲timestampinc。

int IncrementTimestamp(uint32_t inc)
-----函數以給定的inc來增加時間戳。該函數有時候是有用的,例如:當數據包只包含靜默而不發送時,該函數應該被調用以按照合適的量來增加時間戳,這樣纔可以使得其他主機可以在正確的時間播放下一個數據包。

int IncrementTimestampDefault()
-----函數使用由SetDefaultTimestampIncrement指定的量來增加時間戳。該函數是有用的,例如:當數據包只包含靜默而不發送時,該函數應該被調用以按照合適的量來增加時間戳,這樣纔可以使得其他主機可以在正確的時間播放下一個數據包。

uint32_t CreateNewSSRC()
-----在產生的數據包中創建一個新的SSRC,這將產生一個新的時間戳以及序列號增量。

uint32_t CreateNewSSRC(RTPSources & sources)
-----產生的數據包中創建一個新的SSRC,這將產生一個新的時間戳以及序列號增量。源表sources用來確保選擇的SSRC不會被其他的參與者使用。

uint32_t GetSSRC()
-----返回當前的SSRC標識符。

uint32_t GetTimestamp()
-----返回當前的RTP時間戳。

uint16_t GetSequenceNumber()
-----返回當前的序列號。

RTPTime GetPacketTime()
-----返回數據包的生成時間。這不必是上一個RTP包生成的時間,如果時間戳增量爲0,則時間將不會更新。

uint32_t GetPacketTimestamp()
-----返回對應於上一個函數返回的時間的RTP時間戳。


3.2.17 RTCPPacketBuilder,頭文件:rtcppacketbuilder.h
類RTCPPacketBuilder可以用來構建RTCP複合數據包。該函數比類RTCPCompoundPacketBuilder高級一點:它使用RTPPacketBuilder對象和RTPSources對象的信息來自動產生下一個需要發送的複合數據包,而且類還提供函數用來決定是SDES項而不是CNAME項應該被髮送。類的接口如下:

RTCPPacketBuilder(RTPSources &sources,RTPPacketBuilder &rtppackbuilder)
-----創建一個RTCPPacketBuilder對象,使用源表sources和RTP數據包構建器rtppacketbuiler決定的下一個RTCP複合數據包中包含的信息。

int Init(size_t maxpacksize, double timestampunit, const void *cname, size_t cnamelen)
-----使用最大允許包大小maxpacksize,時間戳單位timestampunit以及由長度爲cnamelen的cname給出的SDES CNAME項來初始化構建器。時間戳單位定義爲:一段時間內採樣數除以該段時間長度,對於8000Hz的音頻來說就是1.0/8000.0。

void Destroy()
-----清除構建器。

int SetTimestampUnit(double tsunit)
-----設置時間戳單位爲tsunit,時間戳單位定義爲:一段時間內採樣數除以該段時間長度,對於8000Hz的音頻來說就是1.0/8000.0。

int SetMaximumPacketSize(size_t maxpacksize)
-----設置最大允許的RTCP複合數據包大小爲maxpacksize。

int SetPreTransmissionDelay(const RTPTime &delay)
-----函數允許你通知RTCP數據包構建器第一個採樣包到發送包之間的延遲時間,當用於交互式多媒體的同步時,將會考慮進延遲來計算RTP時間戳和時鐘時間之間的關係。

int BuildNextPacket(RTCPCompoundPacket **pack)
-----構建下一個保存在pack中的要發送的RTCP複合數據包。

int BuildBYEPacket(RTCPCompoundPacket **pack, const void *reason, size_t reasonlength, bool useSRifpossible = true)
-----構建一個由長度爲reasonlength的reason給出離開原因的BYE數據包。如果useSRifpossible設爲true,如果允許則RTCP複合數據包將以發送者報告開始,否則將以接受者報告開始。

void SetNameInterval(int count)
-----當源表中所有的源都已處理完之後,類會檢查是否需要發送其他的SDES項,如果count爲0或者負,則不會發生什麼,如果爲正,則在源表中的源被處理完count次之後將在後面加入一條SDES name項。

void SetEMailInterval(int count)
-----當源表中所有的源都已處理完之後,類會檢查是否需要發送其他的SDES項,如果count爲0或者負,則不會發生什麼,如果爲正,則在源表中的源被處理完count次之後將在後面加入一條SDES e-mail項。

void SetLocationInterval(int count)
-----當源表中所有的源都已處理完之後,類會檢查是否需要發送其他的SDES項,如果count爲0或者負,則不會發生什麼,如果爲正,則在源表中的源被處理完count次之後將在後面加入一條SDES location項。

void SetPhoneInterval(int count)
-----當源表中所有的源都已處理完之後,類會檢查是否需要發送其他的SDES項,如果count爲0或者負,則不會發生什麼,如果爲正,則在源表中的源被處理完count次之後將在後面加入一條SDES phone項。

void SetToolInterval(int count)
-----當源表中所有的源都已處理完之後,類會檢查是否需要發送其他的SDES項,如果count爲0或者負,則不會發生什麼,如果爲正,則在源表中的源被處理完count次之後將在後面加入一條SDES tool項。

void SetNoteInterval(int count)
-----當源表中所有的源都已處理完之後,類會檢查是否需要發送其他的SDES項,如果count爲0或者負,則不會發生什麼,如果爲正,則在源表中的源被處理完count次之後將在後面加入一條SDES note項。

int SetLocalName(const void *s, size t len)
-----將本地參與者的SDES name項設置爲長度爲len,值爲value。

int SetLocalEMail(const void *s, size t len)
-----將本地參與者的SDES E-mai項設置爲長度爲len,值爲value。

int SetLocalLocation(const void *s, size t len)
-----將本地參與者的SDES location項設置爲長度爲len,值爲value。

int SetLocalPhone(const void *s, size t len)
-----將本地參與者的SDES phone項設置爲長度爲len,值爲value。

int SetLocalTool(const void *s, size t len)
-----將本地參與者的SDES tool項設置爲長度爲len,值爲value。

int SetLocalNote(const void *s, size t len)
-----將本地參與者的SDES note項設置爲長度爲len,值爲value。


3.2.18 RTPCollisionList,頭文件:rtpcollisionlist.h
類代表一個SSRC衝突檢測到的一個地址列表。接口如下:

void Clear()
-----清除地址列表。

int UpdateAddress(const RTPAddress *addr, const RTPTime &receivetime, bool *created)
-----更新在receivetime時刻檢測到的由addr指出的一個衝突的(相關)項,如果沒有該項則created將被設爲true,否則設爲false。

bool HasAddress(const RTPAddress *addr) const
-----如果addr在地址列表中則返回true。

void Timeout(const RTPTime &currenttime, const RTPTime &timeoutdelay)
-----假設當前時間由currenttime給出,函數將timeoutdelay指定的上個時間間隔中沒有更新的項設爲超時。


3.2.19 RTCPScheduler,頭文件:rtcpscheduler.h
該類決定何時應該發送一個RTCP複合數據包,類接口如下:

RTCPScheduler(RTPSources &sources)
-----使用源表RTPSources創建一個(調度器)對象來決策什麼時候應該調度一個RTCP複合數據包。爲正確保證執行(創建)動作sources對象應該有關於自己的SSRC的信息(通過CreateOwnSSRC加入的)。

void Reset()
-----重置調度器。

void SetParameters(const RTCPSchedulerParams &params)
-----將調度參數設爲params,RTCPSchedulerParams類將在後面介紹。

RTCPSchedulerParams GetParameters() const
-----返回當前使用的調度參數。

void SetHeaderOverhead(size_t numbytes)
-----將底層協議頭開銷設爲numbytes(例如UDP 和IP)

size t GetHeaderOverhead() const
-----返回當前頭開銷。

void AnalyseIncoming(RTCPCompoundPacket &rtcpcomppack)
-----對於每一個接收到的RTCP複合數據包,爲使調度器正常工作都要調用該函數。

void AnalyseOutgoing(RTCPCompoundPacket &rtcpcomppack)
-----對於每一個發送的RTCP複合數據包,爲使調度器正常工作都要調用該函數。

void ActiveMemberDecrease()
-----每次有成員超時或者發送了BYE數據包都要調用該函數。

void ScheduleBYEPacket(size_t packetsize)
-----請求調度器調度一個包含BYE包的RTCP複合數據包,複合數據包長度爲packetsize。

RTPTime GetTransmissionDelay()
-----返回一個RTCP複合包應該被髮送後的延遲,IsTime成員函數需要隨後調用,以確保確實是發送一個RTCP複合包的時候到了。

bool IsTime()
-----當確實是應該發送一個RTCP複合包時函數返回true,否則返回false。如何返回true則下一次一個包應該發送的時間也已經計算好了,所以如果函數又被立刻調用則返回false。

RTPTime CalculateDeterministicInterval(bool sender = false)
-----計算此時決定性的時間間隔,這將和一個乘數一起被用來作爲成員,發送器等的超時(標準)。

RTCPSchedulerParams,頭文件:rtcpscheduler.h
類RTCPSchedulerParams描述了被調度器使用的參數,接口如下:

int SetRTCPBandwidth(double bw)
------將RTCP使用的帶寬設爲bw(單位爲比特每秒)。

double GetRTCPBandwidth() const
-----返回以比特每秒爲單位的RTCP當前使用的帶寬。

int SetSenderBandwidthFraction(double fraction)
-----將RTCP爲發送器保留的帶寬比率設爲fraction

double GetSenderBandwidthFraction() const
-----返回RTCP爲發送器保留的帶寬比率。

int SetMinimumTransmissionInterval(const RTPTime &t)
-----設置兩個RTCP複合包的最小(決定性的)時間間隔爲t。

RTPTime GetMinimumTransmissionInterval() const
-----返回兩個RTCP複合包的最小時間間隔。

void SetUseHalfAtStartup(bool usehalf)
-----如果usehalf爲true,則在發送第一個RTCP複合包之前只使用一半的最小間隔。

bool GetUseHalfAtStartup() const
-----返回在發送第一個RTCP複合包之前是否只使用一半的最小間隔。

void SetRequestImmediateBYE(bool v)
-----如果v爲true,則調度器將在允許時立刻調度一個BYE包發送。

bool GetRequestImmediateBYE()
-----如果調度器在允許時立刻調度一個BYE包發送則返回true。

參數的默認值爲:
RTCP帶寬:1000字節每秒。
發送器帶寬比率:25%。
最小時間間隔:5秒。
在開始時使用半個最小間隔:是。
允許時立刻發送BYE包:是。


3.2.20 RTPSessionParams,頭文件:rtpsessionparams.h
描述了要被一個RTPSession對象使用的參數。注意!自己的時間戳單位必須設爲一個有效的數值,否則會話將不會創建。類的接口如下:

int SetUsePollThread(bool usethread)
-----如果usethread設爲了true則會話將使用一個線程池自動的處理收到的數據以及在需要的時候發送RTCP數據包。

bool IsUsingPollThread() const
-----返回會話是否使用了線程池。

void SetMaximumPacketSize(size_t max)
-----設置會話允許的最大包大小。

size_t GetMaximumPacketSize() const
-----返回最大允許的包大小。

void SetAcceptOwnPackets(bool accept)
-----如果參數爲true則會話會接受自己的數據包並且放入對應的源表中。

bool AcceptOwnPackets() const
-----如果會話可以接受自己的數據包,則返回true。

void SetReceiveMode(RTPTransmitter::ReceiveMode recvmode)
-----設置會話將使用的接收模式。

RTPTransmitter::ReceiveMode GetReceiveMode() const
-----返回當前使用的接收模式。

void SetOwnTimestampUnit(double tsunit)
-----爲我們自己的數據設置時間戳單位。時間戳單位定義爲一段時間內的採樣數除以這段時間(以秒爲單位)。例如:對於80000Hz的音頻數據,時間戳單位就是1.0/8000.0.因爲這個值初始設置爲一個非法的值,所以使用者必須設置爲一個允許的值纔可以創建一個會話。

double GetOwnTimestampUnit() const
-----返回當前使用的時間戳單位。

void SetResolveLocalHostname(bool v)
-----如果v設置爲true,則會話將請求傳輸器在基於它的本地IP地址列表中的IP地址尋找一個主機名。如果設置爲false,將調用gethostname或者類似的函數來找出本地主機名。注意:方法一(即設爲true)將會花費一些時間。

bool GetResolveLocalHostname() const
-----返回本地主機名是否應該由傳輸器的本地IP地址列表決定。

void SetProbationType(RTPSources::ProbationType probtype)
-----如果使能了試用支持,則該函數將設置使用的試用類型。

RTPSources::ProbationType GetProbationType() const
-----返回使用的試用類型。

void SetSessionBandwidth(double sessbw)
-----設置會話帶寬(單位爲字節/秒)。

double GetSessionBandwidth() const
-----返回以字節/秒爲單位的會話帶寬。

void SetControlTrafficFraction(double frac)
-----設置控制傳輸將使用的會話帶寬百分比。

double GetControlTrafficFraction() const
-----返回控制傳輸使用的會話帶寬的百分比。

void SetSenderControlBandwidthFraction(double frac)
-----設置發送器將使用的最小控制傳輸百分比。

double GetSenderControlBandwidthFraction() const
-----返回發送器使用的最小控制傳輸百分比。

void SetMinimumRTCPTransmissionInterval(const RTPTime &t)
-----設置發送RTCP數據包的最小時間間隔。

RTPTime GetMinimumRTCPTransmissionInterval() const
-----返回發送RTCP數據包的最小時間間隔。

void SetUseHalfRTCPIntervalAtStartup(bool usehalf)
-----如果usehalf設置爲true,則會話將在發送第一個RTCP數據包之前只等待半個計算的RTCP間隔。

bool GetUseHalfRTCPIntervalAtStartup() const
-----返回會話是否將在發送第一個RTCP數據包之前只等待半個計算的RTCP間隔。

void SetRequestImmediateBYE(bool v)
-----如果v爲true,會話將在允許的時候立即發送一個BYE包。

bool GetRequestImmediateBYE() const
-----返回是否會話將在允許的時候立即發送一個BYE包。

void SetSenderReportForBYE(bool v)
-----當發送一個BYE包時,這指出了它是否是一個以發送者報告或接收者報告開頭的RTCP複合數據包的一部分。當然發送者報告僅僅在允許的時候纔會使用。

bool GetSenderReportForBYE() const
-----如果在一個以發送者報告開頭的RTCP複合數據包中發送一個BYE包則返回true,如果使用了接收者報告,則函數將返回false。

void SetSenderTimeoutMultiplier(double m)
-----設置發送者超時將使用的乘數【譯註:Set the multiplier to be used when timing out senders.】

double GetSenderTimeoutMultiplier() const
-----返回發送者超時將使用的乘數。

void SetSourceTimeoutMultiplier(double m)
-----設置成員超時將使用的乘數。

double GetSourceTimeoutMultiplier() const
-----返回成員超時將使用的乘數。

void SetBYETimeoutMultiplier(double m)
-----設置成員發送完一個BYE包後超時將使用的乘數。

double GetBYETimeoutMultiplier() const
-----返回成員發送完一個BYE包後超時將使用的乘數。

void SetCollisionTimeoutMultiplier(double m)
-----設置衝突表中的項的超時乘數。

double GetCollisionTimeoutMultiplier() const
-----返回衝突表中的項的超時乘數。

void SetNoteTimeoutMultiplier(double m)
-----設置SDES NOTE信息的超時乘數。

double GetNoteTimeoutMultiplier() const
-----返回SDES NOTE信息的超時乘數。

參數的默認值如下:
。使用線程池:yes
。最大允許包大小:1400字節
。接受自己的數據包:no
。接收模式:接受所有的數據包
。解析本地主機名:no
。試用類型:ProbationStore
。會話帶寬:10000字節每秒
。控制傳輸百分比:5%。
。發送者佔的控制傳輸百分比:25%
。最小RTCP時間間隔:5秒
。在開始時使用半個最小時間間隔:yes
。允許時立即發送BYE包:yes
。爲BYE包使用發送者報告:yes
。發送者超時乘數:2
。成員超時乘數:5
。發送BYE包後的超時乘數:1
。衝突表中的項的超時乘數:10
。SDES NOTE項的超時乘數:25


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。

RTPSourceData *GetCurrentSourceInfo()
-----返回當前選定的參與者的RTPSourceData對象。

RTPSourceData *GetSourceInfo(uint32_t ssrc)
-----返回標識符爲ssrc的參與者的RTPSourceData對象,如果不存在該項則返回NULL。

RTPPacket *GetNextPacket()
-----從當前參與者的接收包隊列中提取下一個包。

int EndDataAccess()
-----見BeginDataAccess。

int SetReceiveMode(RTPTransmitter::ReceiveMode m)
將接收模式設爲m,m的取值可以如下:
–    RTPTransmitter::AcceptAll,所有的到達數據一律接收,無論來自哪裏。
–    RTPTransmitter::AcceptSome,僅僅接收來自特定源的數據。
–    RTPTransmitter::IgnoreSome,除了指定數據源集的外,其餘全部接收。

int AddToIgnoreList(const RTPAddress &addr)
-----將地址addr加入忽略地址列表。

int DeleteFromIgnoreList(const RTPAddress &addr)
-----從忽略地址列表中刪除addr。

void ClearIgnoreList()
-----清空忽略地址列表。

int AddToAcceptList(const RTPAddress &addr)
-----將地址addr加入接收地址列表。

int DeleteFromAcceptList(const RTPAddress &addr)
-----將addr從接收地址列表中刪除。

void ClearAcceptList()
-----清空接收地址列表。

int SetMaximumPacketSize(size t s)
-----將最大允許包大小設置爲s。

int SetSessionBandwidth(double bw)
-----將會話帶寬設置爲bw,單位爲字節/秒。

int SetTimestampUnit(double u)
-----將時間戳單位設置爲u。時間戳單位的定義

void SetNameInterval(int count)
-----源表中所有可能的源處理完之後,RTCP包構建器將檢查是否有其他的(非CNAME)SDES項需要發送。如果count爲0或者小於0,則無動作,如果爲正,一個SDES name項將在源表中的源處理完count次之後加入。

void SetEMailInterval(int count)
-----源表中所有可能的源處理完之後,RTCP包構建器將檢查是否有其他的(非CNAME)SDES項需要發送。如果count爲0或者小於0,則無動作,如果爲正,一個SDES e-mail項將在源表中的源處理完count次之後加入。

void SetLocationInterval(int count)
-----源表中所有可能的源處理完之後,RTCP包構建器將檢查是否有其他的(非CNAME)SDES項需要發送。如果count爲0或者小於0,則無動作,如果爲正,一個SDES location項將在源表中的源處理完count次之後加入。

void SetPhoneInterval(int count)
 -----源表中所有可能的源處理完之後,RTCP包構建器將檢查是否有其他的(非CNAME)SDES項需要發送。如果count爲0或者小於0,則無動作,如果爲正,一個SDES phone項將在源表中的源處理完count次之後加入。

void SetToolInterval(int count)
-----源表中所有可能的源處理完之後,RTCP包構建器將檢查是否有其他的(非CNAME)SDES項需要發送。如果count爲0或者小於0,則無動作,如果爲正,一個SDES tool項將在源表中的源處理完count次之後加入。

void SetNoteInterval(int count)
-----源表中所有可能的源處理完之後,RTCP包構建器將檢查是否有其他的(非CNAME)SDES項需要發送。如果count爲0或者小於0,則無動作,如果爲正,一個SDES note項將在源表中的源處理完count次之後加入。

int SetLocalName(const void *s, size_t len)
-----將本地參與者的SDES name項設置爲長度爲len的s值。

int SetLocalEMail(const void *s, size_t len)
-----將本地參與者的SDES e-mail項設置爲長度爲len的s值。

int SetLocalLocation(const void *s, size_t len)
-----將本地參與者的SDES location項設置爲長度爲len的s值。

int SetLocalPhone(const void *s, size_t len)
-----將本地參與者的SDES phone項設置爲長度爲len的s值。

int SetLocalTool(const void *s, size_t len)
-----將本地參與者的SDES tool項設置爲長度爲len的s值。

int SetLocalNote(const void *s, size_t len)
-----將本地參與者的SDES note項設置爲長度爲len的s值。

RTPTransmitter *NewUserDefinedTransmitter()
該函數返回的RTPTransmitter對象將用來發送和接收RTP和RTCP數據包。注意:當會話銷燬時,RTPTransmitter對象也將被delete調用銷燬。
通過從RTPSession類繼承自己的類,並且重載下面的函數,可用來檢測特定的事件。

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 *senderaddress, bool isrtp)
-----將在檢測到一個SSRC衝突時調用。srcdat對象是表中的當前值,senderaddress是與地址發生衝突的地址,【譯註:不會翻譯了⊙﹏⊙b汗。原文: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)
-----當接收到一個與當前源srcdat不同的CNAME時被調用。

void OnNewSource(RTPSourceData *srcdat)
-----當一個新的srcdat項加入到源表中時被調用。

void OnRemoveSource(RTPSourceData *srcdat)
-----當srcdat項要從源表中清除時被調用。

void OnTimeout(RTPSourceData *srcdat)
-----當參與者srcdat超時時被調用。

void OnBYETimeout(RTPSourceData *srcdat)
-----當參與者srcdat已經發送了一個BYE包之後調用。

void OnBYEPacket(RTPSourceData *srcdat)
-----當源srcdat的一個BYE包已經處理之後調用。

void OnAPPPacket(RTCPAPPPacket *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 *rtcppack, const RTPTime &receivetime, const RTPAddress *senderaddress)
-----當檢測到一個已知包類型的未知的包格式時調用。

void OnNoteTimeout(RTPSourceData *srcdat)
-----當srcdat的SDES NOTE項超時時調用。

void OnSendRTCPCompoundPacket(RTCPCompoundPacket *pack)
-----當一個RTCP複合數據包發送完時調用,檢查即將發送的RTCP數據時有用。

void OnPollThreadError(int errcode)
-----當在線程池中檢測到errcode時調用。

void OnPollThreadStep()
-----每次線程池循環時調用,這發生在每次檢測到有數據到達或者要發送RTCP複合數據包時。


4 示例代碼

#include "rtpsession.h"  
#include "rtpsessionparams.h"  
#include "rtpudpv4transmitter.h"   
#include "rtpipv4address.h"  
#include "rtptimeutilities.h"  
#include "rtppacket.h"  
#include <stdlib.h>  
#include <iostream>  
   
using namespace jrtplib;  
  
int main(void)   
{  
#ifdef WIN32  
       WSADATA dat;  
       WSAStartup(MAKEWORD(2,2),&dat);  
#endif // WIN32  
       RTPSession session;  
       RTPSessionParams sessionparams;  
       sessionparams.SetOwnTimestampUnit(1.0/8000.0);  
       RTPUDPv4TransmissionParams transparams;  
       transparams.SetPortbase(8000);  
       int status = session.Create(sessionparams,&transparams);  
  
       if (status < 0)  
       {  
              std::cerr << RTPGetErrorString(status) << std::endl;  
              exit(-1);  
       }  
  
       uint8_t localip[]={127,0,0,1};  
       RTPIPv4Address addr(localip,9000);  
       status = session.AddDestination(addr);  
  
       if (status < 0)  
       {  
              std::cerr << RTPGetErrorString(status) << std::endl;  
              exit(-1);  
       }  

       session.SetDefaultPayloadType(96);  
       session.SetDefaultMark(false);  
       session.SetDefaultTimestampIncrement(160);       
       uint8_t silencebuffer[160];  
  
       for (int i = 0 ; i < 160 ; i++)  
              silencebuffer[i] = 128;  
  
       RTPTime delay(0.020);  
       RTPTime starttime = RTPTime::CurrentTime();  
       bool done = false;  
  
       while (!done)  
       {  
              status = session.SendPacket(silencebuffer,160);  
  
              if (status < 0)  
              {  
                     std::cerr << RTPGetErrorString(status) << std::endl;  
                     exit(-1);  
              }  
  
              session.BeginDataAccess();  
  
              if (session.GotoFirstSource())  
              {  
                     do  
                     {  
                            RTPPacket *packet;  
  
                            while ((packet = session.GetNextPacket()) != 0)  
                            {  
                                   std::cout << "Got packet with "  
                                             << "extended sequence number "   
                                             << packet->GetExtendedSequenceNumber()   
                                             << " from SSRC " << packet->GetSSRC()   
                                             << std::endl;  
                                   session.DeletePacket(packet);//此處使用成員函數清理  
                             }  
                     } while (session.GotoNextSource());  
              }  
  
              session.EndDataAccess();  
              RTPTime::Wait(delay);  
              RTPTime t = RTPTime::CurrentTime();  
              t -= starttime;  
  
              if (t > RTPTime(60.0))  
                     done = true;  
       }  
 
       delay = RTPTime(10.0);  
       session.BYEDestroy(delay,"Time's up",9);  
  
#ifdef WIN32  
        WSACleanup();  
#endif // WIN32  
  
       return 0;  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章