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...