您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > darwin streaming server5.5.5源码分析
DarwinStreamingServer5.5.5源代码分析文档DarwinStreamServer是苹果公司开发的流媒体视频服务器。我们分析的代码基于版本5.5.5。一、DSS启动、初始化流程我们从Server.tproj/main.cpp入手,分析DSS加载module及和module交互的流程。(1)、DSS在fork子进程后调用StartServer启动服务调用OS、OSThread、Socket、SocketUtils、QTSSDictionaryMap、QTSServerInterface、QTSServer等类的Initialize函数进行初始化。(2)、select_startevents函数initializetheselect()implementationoftheeventqueue.(3)、QTSServer::Initialize函数继续调用QTSSModule、QTSServerPres、QTSSMessages、RTSPRequestInterface、RTSPSessionInterface、RTPSessionInterface、RTPStream、RTSPSession、QTSSFile、QTSSUserProfile等类的Initialize函数,进行dictionary的初始化。加载了第一个模块QTSSErrorLogModule。this-SetDefaultIPAddr()//setdefaultIPaddr&DNSname//beginlistening,注意这里传的是false参数。this-CreateListeners(false,fSrvrPrefs,inPortOverride)(4)、TaskThreadPool::AddThreads(numThreads)//numThreads为1到这里,第一个线程创建、运行、被添加到线程池里。在startBroadcastRTSPSession函数里,又调用AddThreads函数在线程池里添加了一个线程。(5)、TimeoutTask::Initialize()Startuptheserver'sglobaltasks,andstartlistening.ThetimeoutTaskmechanismistaskbased,wethereforemustdothisafteraddingtaskthreads.Thisbedonebeforestartingthesocketsandservertasks.sThread=NEWTimeoutTaskThread();sThread-signal(Task::kStartEvent);创建一个TimeoutTaskThread类对象,实际上这个类的名字容易产生混淆,它并不是一个线程类,而是一个基于Task类的任务类。因为前面已经在线程池里添加了一个任务线程,所以在这里调用signal的时候,就会找到这个线程,并把事件加入到这个线程的任务队列里,等待被处理。(这时,刚才创建的线程应该也在TaskThread::Entry函数里等待事件的发生)(6)、IdleTask::Initialize()//创建并启动空闲任务线程sIdleThread=NEWIdleTaskThread();sIdleThread-Start();(7)、Socket::StartThread()//启动Socket类的sEventThread类所对应的线程。sEventThread类在Socket::Initialize函数里创建//到目前为止,这已是第三个启动的线程,分别是任务线程、空闲任务线程、事务线程。(8)、OSThread::Sleep(1000)这里的Sleep是调用usleep来实现,为什么这里要睡眠1s???是为了等待线程的启动???(9)、sServer-InitModules(inInitialState)初始化并加载一些模块。共加载了QTSSHomeDirectoryModule、QTSSRefMovieModule、QTSSFileModule、QTSSReflectorModule、QTSSRelayModule、QTSSAccessLogModule、QTSSFlowControlModule、QTSSPosixFileSysModule、QTSSAdminModule、QTSSMP3StreamingModule、QTSSAccessModule这些模块。fSrvrPrefs=newQTSServerPrefs(sPrefsSource,true);......fSrvrM7essages=newQTSSMessages(sMessagesSource);QTSSModuleUtils::Initialize(fSrvrMessages,this,QTSServerInterface::GetErrorLogStream());......AddRereadPreferencesService.//对于那些支持initialrole的模块,通过它们的CallDispatch函数来调用具体的initial函数。this-DoInitRole();(10)、sServer-StartTasks()创建RTCPTask、RTPStatsUpdaterTaskStartlistening,因为TCPListenerSocket是EventContext的继承类,所以这里实际上调用的是EventContext::RequestEvent().(11)、sServer-SetupUDPSockets()udpsocketsaresetupafterthertcptaskisinstantiated。针对系统的每一个ip地址,都创建并绑定一个socket端口对(分别用于RTPdata发送和RTCPdata接收),并申请对这两个socket端口的监听。注意调用CreateUDPSocketPair函数传进去的Port参数为0,所以在通过Darwin播放静态多媒体文件时,不论是同一个媒体文件的音频、视频流还是同时播放的多个媒体文件,都是这两个socket端口来完成RTCP、RTP数据的处理。(12)、CleanPid(true);WritePid(!inDontFork);doneStartingUp=true;在/var/run下写pid文件(13)、sServer-SwitchPersonality()switchtorunuserandgroupID执行setgid、setuid函数(14)、RunServer()由一个大循环构成:while((theServerState!=qtssShuttingDownState)&&(theServerState!=qtssFatalErrorState)){OSThread::Sleep(1000);if(sStatusUpdateInterval)//周期性更新状态,当带有-D参数时,为3。{通过PrintHeader打印标题行RTP-ConnsRTSP-ConnsHTTP-ConnskBits/SecPkts/SecRTP-PlayingAvgDelayCurMaxDelayMaxDelayAvgQualityNumThinnedTimeRTP-ConnsRTSP-ConnsHTTP-ConnskBits/SecPkts/SecTotConnTotBytesTotPktsLostTime通过DebugLevel_1、PrintStatus打印每字段的值。每个字段对应的变量分别为:RTP-Conns:fNumRTPSessions;RTSP-Conns:fNumRTPSessions;HTTP-Conns:fNumRTSPHTTPSessions;kBits/Sec:fCurrentRTPBandwidthInBits;Pkts/Sec:fRTPPacketsPerSecond;RTP-Playing:fNumRTPPlayingSessions;//sLastDebugPacket即为上次的fTotalRTPPackets。AvgDelay:fTotalLate/(fTotalRTPPackets–sLastDebugPackets)CurMaxDelay:fCurrentMaxLate;MaxDelay:fMaxLate;//sLastDebugTotalQuality即为上次的fTotalQuality。AvgQuality:(fTotalQuality-sLastDebugTotalQuality)/(fTotalRTPPackets–sLastDebugPackets)NumThinned:fNumThinned;TotConn:fTotalRTPSessions;TotBytes:fTotalRTPBytes;TotPktsLost:fTotalRTPPacketsLost如果接收到SigInt或者SigTerm,则终止sServer。}二、几大部分(一)、模块DSS利用模块来响应请求和处理任务。DSS的模块分为三种类型:(1)、Content-ManagingModulesThecontent-managingmodulesmanageRTSPrequestsandresponsesrelatedtomediasources,suchasafileorabroadcast.Eachmoduleisresponsibleforinterpretingtheclient'srequest,readingandparsingtheirsupportedfilesornetworksource,andrespondingwithRTSPandRTP.Insomecases,suchasthemp3streamingmodule,themoduleusesHTTP.Thecontent-managingmodulesareQTSSFileModule,QTSSReflectorModule,QTSSRelayModule,andQTSSMP3StreamingModule.(2)、Server-SupportModulesTheserver-supportmodulesperformserverdatagatheringandloggingfunctions.Theserver-supportmodulesareQTSSErrorLogModule,QTSSAccessLogModule,QTSSWebStatsModule,QTSSWebDebugModule,QTSSAdminModule,andQTSSPOSIXFileSystemModule.(3)、AccessControlModulesTheaccesscontrolmodulesprovideauthenticationandauthorizationfunctionsaswellasURLpathmanipulation.TheaccesscontrolmodulesareQTSSAccessModule,QTSSHomeDirectoryModule,QTSSHttpFileModule,andQTSSSpamDefenseModule.几个相关类的定义一、QTSSModule类各个Module类均以QTSSModule类为基类。(1)、构建函数QTSSModule::QTSSModule(char*inName,char*inPath):QTSSDictionary(QTSSDictionaryMap::GetMap(QTSSDictionaryMap::kModuleDictIndex)),......{如果模块以库文件的形式保存在disk上,利用OSCodeFragment类来处理另外,QTSSModule本身是QTSS
本文标题:darwin streaming server5.5.5源码分析
链接地址:https://www.777doc.com/doc-3439628 .html