DSS原始碼分析之傳送RTP包過程

2021-07-29 06:51:14 字數 2659 閱讀 9257

rtp send packets角色呼叫

qtss_write

或者qtss_writev

函式,在

rtp會話的基礎上向客戶傳送資料。當

rtp send packets

角色傳送完成一些資料報之後,就會把控制權返回給伺服器,並指定伺服器下次呼叫模組的

rtp send packets

角色的間隔時間。這個週期會一直重複,直到所有的**資料報被傳送完成,或者由於客戶請求的原因需要暫停或中止客戶會話為止。

傳送資料報的函式在dss的qtssfilemodule.cpp的sendpackets函式中。

尋找每個包的主函式是prefetchnextpacket,填寫包的資料的函式在prefetchnextpacket的getpacket函式裡,該函式通過

hint track

所給的資訊填寫傳送的

rtp包,主要包括將

hint track 中引用的真正的多**樣本加入到

rtp包中。該

rtp包則包含了

hint track

中的rtp

頭部和普通

track

的多**樣本包,注意乙個樣本可以拆分成多個包。將該包傳送出去給客戶端接收。

rtpdataentry constructors[entrycount];

}constructors最主要的格式為:

aligned(8) class rtpsampleconstructor

extends rtpconstructor(2)

signed int(8) trackrefindex;

unsigned int(16) length;

unsigned int(32) samplenumber;

unsigned int(32) sampleoffset;

unsigned int(16) bytesperblock = 1;

unsigned int(16) samplesperblock = 1;

它在hintsample裡,所有的

constructor

都是16

個位元組大小,對應的程式為:

if ( *psamplebuffer == 0x02 )

// sample mode

move_word( tempint16, psamplebuffer + 2);

tempint16 = ntohs(tempint16);

deep_debug_print (( "qthinttrack::getpacket - ....sample entry found (size=%u)\n", tempint16 ) );

packetsize += tempint16;

if( *length < packetsize )

return errparamerror;

err = this->getsampledata( htcb, &psamplebuffer, &ppacketoutbuf, samplenumber, packetnumber, *length);

if ( err != errnoerror )

return err;

// getsampledata increments our out pointer

接下來看getsampledata這個函式,這個函式的作用是解析rtpconstructor這個結構,將該結構指向的多**資料放到psamplebuffer裡。

move_long_word( mediasamplenumber, pbuf + 4);

mediasamplenumber = ntohl(mediasamplenumber);        //samplenumber

move_long_word( readoffset, pbuf + 8);

readoffset = ntohl(readoffset);                               //sampleoffset

move_word( bytespercompressionblock, pbuf + 12);

bytespercompressionblock = ntohs(bytespercompressionblock);

if( bytespercompressionblock == 0 )

bytespercompressionblock = 1;                       //bytesperblock

move_word( samplespercompressionblock, pbuf + 14);

samplespercompressionblock = ntohs(samplespercompressionblock);

//samplesperblock

找到多**資料,新增到rtp包後面

if( !track->read(sampledescriptionindex, dataoffset, *pppacketbufout, readlength, htcb->ffcb) )

return (errinvalidquicktimefile);

*pppacketbufout += readlength;  // point to remainder of buffer;    

至此,乙個rtp包建立完成。

go gomemcache包原始碼分析

因為beego中的cache模組中的子模組memcached引用了這個包,所以也對這包的原始碼進行分析了下。花了一定的時間編寫整理這篇部落格,這個包一共兩個檔案,原始碼檔案。關於memcache學習,可以到這邊教程學習 1 func new server string client 用法 mc me...

從原始碼分析StringUtils包

今天用到stringutils.join方法,閒來無聊,看了下原始碼 當然不可能自己分析,你傻啊,在這裡推薦乙個別人分析的 首先導包 import org.apache.commons.lang3.stringutils 我在這裡呼叫的是stringutils.join方法 public stati...

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...