常用類或模塊及重要子函數(shù)描述_第1頁
常用類或模塊及重要子函數(shù)描述_第2頁
常用類或模塊及重要子函數(shù)描述_第3頁
常用類或模塊及重要子函數(shù)描述_第4頁
常用類或模塊及重要子函數(shù)描述_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1 常用類或模塊及重要子函數(shù)描述1.1 反射模塊QTSSReflectorModule這個(gè)模塊包含反射用的各個(gè)角色,以支持反射的建立、設(shè)置、播放和中斷等操作。這個(gè)模塊不是類,只是一個(gè)概念,它的支撐體是一個(gè)文件。1.1.1 DoSetup響應(yīng)RTSP的Setup請求,添加一個(gè)RTPSessionOutput1.1.2 HaveStreamBuffers用來判斷ReflectorStream是否已經(jīng)向ReflectorSender里發(fā)送RTP/RTCP楨。1.2 ReflectorOutput這是一個(gè)類,其對象代表一個(gè)反射客戶端,不過這個(gè)是個(gè)虛基類,在系統(tǒng)中沒有實(shí)體對象,其派生類RTPSessio

2、nOutput實(shí)現(xiàn)了大部分功能。1.3 RTPSessionOutput這是一個(gè)類,其對象代表一個(gè)反射客戶端。它的數(shù)據(jù)來源于ReflectorSender,然后把數(shù)據(jù)發(fā)給兩個(gè)RTPStream。下面是重要成員描述。1.3.1 QTSS_Error RTPSessionOutput:WritePacket(StrPtrLen* inPacket, void* inStreamCookie, UInt32 inFlags, SInt64 packetLatenessInMSec, SInt64* timeToSendThisPacketAgain, UInt64* packetIDPtr, SIn

3、t64* arrivalTimeMSecPtr).1目的描述/ This writes the packet out to the proper QTSS_RTPStreamObject.這個(gè)write函數(shù)把楨寫入到合適的QTSS_RTPStreamObject/ If this function returns QTSS_WouldBlock, timeToSendThisPacketAgain will如果這個(gè)函數(shù)返回QTSS_WouldBlock,timeToSendThisPacketAgain會/ be set to # of msec in which the packet can

4、 be sent, or -1 if unknown設(shè)置為隨后應(yīng)該發(fā)送此楨的毫秒時(shí)間,或者不知道為-1.2流程描述獲取事務(wù)狀態(tài),如果不是播放狀態(tài),則返回得到事務(wù)內(nèi)的每個(gè)流,對于每個(gè)流:如果包是這個(gè)流匹配的:/如果序列號不對,則返回沒錯(cuò)誤,不發(fā)送/通過判斷流屬性里的楨ID大小來進(jìn)行是否已經(jīng)發(fā)送/如果現(xiàn)在沒有準(zhǔn)備好發(fā)楨,阻塞返回.面向RTCP,通過判斷間隔時(shí)間來實(shí)現(xiàn)生成流發(fā)送用的楨,并生成楨的發(fā)送時(shí)間。這時(shí)如果最老的楨和最新的楨是隨后整個(gè)緩沖時(shí)間(如同now=0情況)時(shí),添加緩沖時(shí)間調(diào)用發(fā)送函數(shù),發(fā)送。如果有阻塞錯(cuò)誤,則設(shè)置重發(fā)時(shí)間;如果發(fā)送成功,則設(shè)置最后兩次發(fā)送時(shí)間間隔,如果間隔大于1000,

5、則調(diào)整為5設(shè)置最后發(fā)送時(shí)間如果是RTP包,則設(shè)置流的最后發(fā)送楨ID屬性如果是RTCP包,則設(shè)置流的最后發(fā)送楨ID屬性和最后發(fā)送時(shí)間屬性如果有錯(cuò)誤,則跳出每個(gè)流循環(huán)返回發(fā)送函數(shù)返回的標(biāo)志。1.4 ReflectorStream這是一個(gè)類,代表一個(gè)SSRC源包括的RTP和RTCP結(jié)合的反射管理用的流。它有兩個(gè)ReflectorSender:fRTPSender,fRTCPSender。這兩個(gè)sender負(fù)責(zé)管理向RTPSessionOutput發(fā)送ReflectorSocket接收到的反射源數(shù)據(jù)。下面是重要成員:1.4.1 BindSockets把ReflectorSocket和Reflector

6、Sender綁定起來,并使ReflectorSocket開始讀取反射源數(shù)據(jù)。1.4.2 AddOutput把RTPSessionOutput加入到ReflectorStream的管理數(shù)組內(nèi),為隨后進(jìn)行發(fā)送做準(zhǔn)備。1.5 ReflectorSender這是一個(gè)類,其對象代表一個(gè)具體的反射RTP流或者RTCP流。它被ReflectorStream管理。它和一個(gè)具體的ReflectorSocket對應(yīng)。ReflectorSocket用來接收,ReflectorSender進(jìn)行發(fā)送。其重要成員有:1.5.1 ReflectPackets這個(gè)函數(shù)進(jìn)行反射楨工作,把ReflectorSender里緩存的楨

7、發(fā)送到各個(gè)RTPSessionOutput里。1.5.2 SendPacketsToOutput這個(gè)函數(shù)進(jìn)行具體的向RTPSessionOutput發(fā)送工作。1.6 ReflectorSocket這是一個(gè)類,其對象對應(yīng)一個(gè)具體反射源,比如RTP或者RTCP的接收Socket。它和ReflectorSender一一對應(yīng)。ReflectorSocket接收,ReflectorSender發(fā)送。另外這也是反射工作激發(fā)的載體,這個(gè)類帶有消息處理,可以根據(jù)消息運(yùn)行,并驅(qū)動(dòng)Sender進(jìn)行發(fā)送。其重要成員為:1.6.1 GetIncomingData具體的楨接收函數(shù)。1.6.2 ProcessPacket

8、楨處理函數(shù),把接收到的楨傳送給ReflectorSender,使楨數(shù)據(jù)保存到ReflectorSender的內(nèi)部隊(duì)列里。1.7 RTPStream這是一個(gè)類,其對象對應(yīng)一個(gè)具體的向播放客戶端發(fā)送數(shù)據(jù)的流。在反射機(jī)制里,它被RTPSessionOutput管理和驅(qū)動(dòng),在RTPSessionOutput調(diào)用了QTSS_Write以后,執(zhí)行流程進(jìn)入到這個(gè)類的代碼空間里。2 和反射發(fā)送有關(guān)系的時(shí)間參數(shù)理解2.1 OSQueueElem* ReflectorSender:SendPacketsToOutput(ReflectorOutput* theOutput, OSQueueElem* curren

9、tPacket, SInt64 currentTime, SInt64 bucketDelay)后兩個(gè)參數(shù)是當(dāng)前時(shí)間,成組的輸出形成的包延遲時(shí)間。這個(gè)延遲時(shí)間是這樣管理的:代表直播客戶端的輸出被一組一組地管理成二維形式,而不是線性的一維形式。根據(jù)這個(gè)二維形式,一個(gè)組對應(yīng)一個(gè)延遲時(shí)間,越在后面的組,延遲的時(shí)間越長。2.2 QTSS_Error RTPSessionOutput:WritePacket(StrPtrLen* inPacket, void* inStreamCookie, UInt32 inFlags, SInt64 packetLatenessInMSec, SInt64* tim

10、eToSendThisPacketAgain, UInt64* packetIDPtr, SInt64* arrivalTimeMSecPtr)packetLatenessInMSec是上個(gè)函數(shù)的bucketDelaytimeToSendThisPacketAgain,再次發(fā)送時(shí)間arrivalTimeMSecPtr到達(dá)時(shí)間指針,在WritePacket函數(shù)里沒有用。2.3 packetTransmitTime這個(gè)成員是QTSS_PacketStruct結(jié)構(gòu)的成員,這個(gè)結(jié)構(gòu)是RTPStream類里Write函數(shù)所需要的。而packetTransmitTime是楨的實(shí)際發(fā)送時(shí)間,其生成規(guī)則為:總

11、緩沖時(shí)間加上到達(dá)時(shí)間減去延遲時(shí)間。2.4 fLastIntervalMilliSec這個(gè)成員是ReflectorOutput的成員變量。表達(dá)意義為最后一次發(fā)送時(shí)當(dāng)前時(shí)間減去發(fā)送時(shí)間的差值,當(dāng)發(fā)送線程效率高時(shí),這個(gè)時(shí)間是ReflectorSocket的下次運(yùn)行時(shí)間,以使發(fā)送更快進(jìn)行。在形成新值時(shí),如果值大于1000,則修改為5。如果小于5也算52.5 fNextTimeToRun它是ReflectorSender類里的成員。用來安排調(diào)用ReflectPackets的時(shí)機(jī)。在ReflectPackets函數(shù)里初始化為10秒,如果是RTCP,則為1秒。隨后在SendPacketsToOutput里有

12、協(xié)調(diào)。在 ReflectPackets函數(shù)結(jié)束時(shí),對這個(gè)值有調(diào)整,調(diào)整的邏輯如下:/不要忘記調(diào)用者想要知道下次運(yùn)行時(shí)間 if (*ioWakeupTime = 0)/如果休息時(shí)間為0 *ioWakeupTime = fNextTimeToRun;/則休息時(shí)間為下次運(yùn)行時(shí)間的間隔 else if (fNextTimeToRun 0) & (*ioWakeupTime fNextTimeToRun)/如果休息時(shí)間大于下次時(shí)間 *ioWakeupTime = fNextTimeToRun;/休息時(shí)間等于下次運(yùn)行時(shí)間 / exit with fNextTimeToRun in real time, n

13、ot relative time./fNextTimeToRun加上實(shí)際時(shí)間,不要用相對時(shí)間 fNextTimeToRun += currentTime;在ReflectorSender類的ShouldReflectNow函數(shù)里使用,用來決定是否使ReflectorSender調(diào)用ReflectPackets。在ShouldReflectNow里用當(dāng)前時(shí)間和下次運(yùn)行時(shí)間(fNextTimeToRun)來生成fSleepTime,在生成時(shí)對不合理值進(jìn)行了過濾。在ReflectSocket的Run函數(shù)里,以ShouldReflectNow來管理fSleepTime。err = theOutput-

14、WritePacket(&thePacket-fPacketPtr, fStream, fWriteFlag, packetLateness, &timeToSendPacket,&thePacket-fStreamCountID,&thePacket-fTimeArrived ); 這個(gè)里面的timeToSendPacket對fNextTimeToRun有影響。2.6 timeToSendPacketRTPSessionOutput類的WritePacket函數(shù)里用來保留下次發(fā)送時(shí)間。和suggestedWakeupTime一樣。2.7 suggestedWakeupTime這個(gè)變量是QTS

15、S_PacketStruct結(jié)構(gòu)的成員。這個(gè)變量是RTPStream類的Write函數(shù)在處理發(fā)送時(shí)對QTSS_PacketStruct結(jié)構(gòu)進(jìn)行處理時(shí)生成。通過fSession-GetOverbufferWindow()-CheckTransmitTime計(jì)算而來。3 時(shí)移實(shí)現(xiàn)3.1 原理描述通過RTSP協(xié)議的Play請求里的Range內(nèi)的信息,區(qū)分正常反射流和時(shí)移流,對于時(shí)移流,以時(shí)移數(shù)據(jù)源為數(shù)據(jù)來源;對于正常反射流,用達(dá)爾文的默認(rèn)緩沖數(shù)據(jù)源為數(shù)據(jù)來源。時(shí)移數(shù)據(jù)源管理要做到添加、刪除、定位、加載、保存、過渡和時(shí)移數(shù)據(jù)與達(dá)爾文默認(rèn)緩沖機(jī)制結(jié)合功能。添加指的是把達(dá)爾文默認(rèn)緩沖里刪除的數(shù)據(jù)包加入到時(shí)

16、移數(shù)據(jù)源內(nèi)。刪除指的是把超過時(shí)移時(shí)限的時(shí)移數(shù)據(jù)從管理范圍內(nèi)刪除。定位指的是把適合range信息時(shí)間的管理單元確定。加載指的是,由于內(nèi)存不可能緩沖過大數(shù)據(jù),時(shí)移數(shù)據(jù)不可能全部保存到內(nèi)存中,只能實(shí)現(xiàn)小部分在內(nèi)存,大部分在硬盤,在這種情況下,如果需要的時(shí)移數(shù)據(jù)不在內(nèi)存中,而是在硬盤上,對數(shù)據(jù)有一個(gè)從硬盤加載到內(nèi)存管理單元內(nèi)的一種情況。保存指的是把累積夠一個(gè)時(shí)移單元的時(shí)移數(shù)據(jù)寫入到硬盤的過程。過渡指的是在進(jìn)行時(shí)移時(shí),前一個(gè)時(shí)移單元已經(jīng)發(fā)送完了,需要發(fā)送下一個(gè)時(shí)移單元時(shí)的處理過程。時(shí)移數(shù)據(jù)與達(dá)爾文默認(rèn)緩沖機(jī)制結(jié)合指的是把時(shí)移數(shù)據(jù)放到達(dá)爾文默認(rèn)緩沖機(jī)制里,還會使這個(gè)機(jī)制正常工作,使時(shí)移的數(shù)據(jù)包能夠發(fā)給客戶

17、端。3.2 數(shù)據(jù)結(jié)構(gòu)及常量定義3.2.1 時(shí)移源組隊(duì)列這個(gè)隊(duì)列按照一個(gè)時(shí)移單元一組形式管理時(shí)移數(shù)據(jù),在有需要時(shí),這個(gè)隊(duì)列里才會有實(shí)際數(shù)據(jù),平常不占用內(nèi)存。這個(gè)隊(duì)列管理的單元叫時(shí)移源組,這個(gè)時(shí)移源組是一個(gè)類,定義如下:引用的ReflectorOutput源個(gè)數(shù)fRefOutputCount引用的ReflectorOutput源ID隊(duì)列,fRefOutputAry開始時(shí)間,絕對秒數(shù),fAbsoStartSeco結(jié)束時(shí)間,絕對秒數(shù),fAbsoEndSecoRTP/RTCP楨隊(duì)列,fTSPacketQueue是否已經(jīng)從硬盤上加載過了fIsLoadFromDisk是否是準(zhǔn)備單元fIsPreparUnit

18、,最后一個(gè)單元長度還不夠2分鐘,這個(gè)標(biāo)志為真楨隊(duì)列內(nèi)單元個(gè)數(shù)fCountOfPacketQueue這個(gè)隊(duì)列定義在ReflectorSender內(nèi)。3.2.2 時(shí)移發(fā)送引用隊(duì)列RTPSessionOutput的輸出的數(shù)據(jù)來源由四個(gè)ReflectorSender來提供,同時(shí)這四個(gè)ReflectorSender的數(shù)據(jù)又是要提供給多個(gè)RTPSessionOutput,為了使每個(gè)RTPSessionOutput都能夠知道在ReflectorSender里的時(shí)移數(shù)據(jù)情況,建立了這個(gè)隊(duì)列。這個(gè)隊(duì)列里的單元類定義如下:ReflectorSender指針,fpSender是否第一次處理過,fHaveFirstD

19、eal當(dāng)前時(shí)移源組單元指針,fpTimeShiftUnit隊(duì)列內(nèi)已經(jīng)發(fā)送楨個(gè)數(shù)fHaveSendCount這個(gè)隊(duì)列定義在RefletorOutput里(ReflectorOutput是RTPSessionOutput的基類)。3.2.3 時(shí)移源組單元長度2分鐘,120秒。#define TISH_PACKETQUEUEUNIT_TIMELEN 120/by shw 時(shí)移楨隊(duì)列單元時(shí)間長度2分鐘內(nèi)存占用上,大概大小為120*1.5=180M。3.2.4 時(shí)移源組總長度30分鐘,1800秒。3.2.5 是否時(shí)移標(biāo)志和時(shí)移開始時(shí)間這兩個(gè)變量添加到ReflectorOutput類里。Float64fR

20、angeStartTime;/時(shí)移開始時(shí)間by shw for timeshift 200611,默認(rèn)為0Bool16fIsTimeShfit;/是否時(shí)移,通過對range內(nèi)的時(shí)間進(jìn)行判斷來生成,默認(rèn)為假,by shw3.3 功能描述3.3.1 添加在ReflectorSender:RemoveOldPackets函數(shù)里進(jìn)行了把數(shù)據(jù)包從默認(rèn)緩沖區(qū)里刪除的操作。如果ReflectorPacket的fNeededByOutput為假,會讓RemoveOldPackets刪除ReflectorPacket對象。在刪除時(shí)把達(dá)爾文緩沖拷貝到時(shí)移緩沖。如果沒有時(shí)移源組隊(duì)列單元,則新建一個(gè)單元,進(jìn)行添加。新

21、建單元的fIsPreparUnit設(shè)置為真。如果有時(shí)移源組隊(duì)列單元,且最后一個(gè)單元的時(shí)間跨度沒有2分鐘,可以使用最后單元。如果有且最后單元超過2分鐘,則新建一個(gè),把上面單元進(jìn)行保存到硬盤處理,上面單元的fIsPreparUnit設(shè)置為假。3.3.2 刪除在ReflectorSender類的ReflectPackets成員函數(shù)里,當(dāng)執(zhí)行過RemoveOldPackets后,如果ReflectorOutput是時(shí)移的,則先根據(jù)ReflectorOutput里的時(shí)移發(fā)送引用隊(duì)列里和此ReflectorSender對應(yīng)的單元的fHaveSendCount和fpTimeShiftUnit里指向的隊(duì)列個(gè)數(shù)

22、比較(這個(gè)過程和過渡處理結(jié)合),如果相等,則表示這個(gè)時(shí)移源組隊(duì)列單元里的楨發(fā)完了,把fpTimeShiftUnit指向的引用的ReflectorOutput源個(gè)數(shù)fRefOutputCount減1引用的ReflectorOutput源ID隊(duì)列,fRefOutputAry里刪除使用的ReflectorOutput。上面處理完成后,把fRefOutputCount為0的單元里的楨隊(duì)列釋放掉,使其不占用資源。上面處理完成后,把開始時(shí)間和結(jié)束時(shí)間都超過緩沖長度時(shí)間的時(shí)移楨單元從時(shí)移源組隊(duì)列刪除,如果單元里楨隊(duì)列不為空,釋放掉。但是如果fRefOutputCount不為0,則不釋放。3.3.3 定位通過

23、判斷開始時(shí)間,絕對秒數(shù),fAbsoStartSeco結(jié)束時(shí)間,絕對秒數(shù),fAbsoEndSeco和時(shí)移開始時(shí)間的關(guān)系來進(jìn)行。當(dāng)根據(jù)當(dāng)前時(shí)間和range時(shí)間確定一個(gè)時(shí)移發(fā)送時(shí)間基點(diǎn)(timeshift_starttime)后,用這個(gè)timeshift_startime和時(shí)移源組隊(duì)列里單元里的開始時(shí)間和結(jié)束時(shí)間比較,找到一個(gè)單元,如果標(biāo)志fIsLoadFromDisk為真,則不進(jìn)行從硬盤加載,如果標(biāo)志fIsLoadFromDisk為假,則進(jìn)行從硬盤加載,并且把標(biāo)志fIsLoadFromDisk設(shè)置為真。3.3.4 加載時(shí)移源組隊(duì)列單元對應(yīng)的硬盤文件名生成規(guī)則為:生成的源信息_標(biāo)準(zhǔn)基時(shí)間到開始點(diǎn)時(shí)間

24、秒數(shù)-標(biāo)準(zhǔn)基時(shí)間結(jié)束點(diǎn)時(shí)間秒數(shù)。開始點(diǎn)到結(jié)束點(diǎn)跨度為2分鐘。生成的源信息是一個(gè)源IP地址加指定端口。由于是用ReflectorPacket里的fTimeArrived來生成開始時(shí)間和結(jié)束時(shí)間,所以文件名里表達(dá)的時(shí)間信息可能不是完全2分鐘間隔的,這一點(diǎn)要注意。加載時(shí)先把隊(duì)列長度加載,接著對此長度個(gè)ReflectorPacket對象進(jìn)行序列化加載。這需要擴(kuò)充ReflectorPacket類,增加讀寫函數(shù)。3.3.5 保存保存時(shí)把隊(duì)列個(gè)數(shù)先寫到文件里,接著是各個(gè)ReflectorPacket對象。3.3.6 過渡ReflectorSender類的SendPacketsToOutput函數(shù)里對某個(gè)隊(duì)列發(fā)送個(gè)數(shù)進(jìn)行累積,累積的個(gè)數(shù)可以通過ReflectorOutput里的時(shí)移發(fā)送引用隊(duì)列找到此ReflectorSender對應(yīng)的單元,進(jìn)行加到fHaveSendCount上。在ReflectorSender里執(zhí)行完SendPacketsToOutput循環(huán)后,進(jìn)行處理,如果fHaveSendCount和fpTimeShiftUnit指向的時(shí)移源組隊(duì)列單元里的個(gè)數(shù)相比較,如果占到3/4則對時(shí)移源組隊(duì)列的下一個(gè)單元進(jìn)行加載,從硬盤里讀取內(nèi)容。如果下一個(gè)單元已經(jīng)加載過了,則不進(jìn)行加載,如果單元的fIsPr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論