分析 testOnDemandRTSPServer.cpp 運作流程
1. 建立一個新的 RTSPServer 實體,向 taskScheduler 註冊 incomingConnectionHandlerRTSP()。當收到 RTSP Request 時,便會建立 RTSPClientSession。
2. 對於此伺服器可以接收的各種媒體,都先建立對應的 session以及subsession,等待 client 建立連線。
3. 針對 RTSP-over-HTTP tunneling,向 taskScheduler 註冊 incomingConnectionHandlerHTTP(),當收到 HTTP Request 時,便會建立 RTSPClientSession,然後註冊 incomingRequestHandler()。
4. BasicTaskScheduler.cpp 的 SingleStep() 會 select socket,當收到 RTSP或 HTTP的封包後,會呼叫上述 step1,3 所註冊的函數 incomingConnection(),accept socket並且準備接收封包。
5. accept之後,接收封包的流程如下:
- incomingRequestHandler()
- incomingRequestHandler1()
- recvfrom(),
- handleRequestBytes()
6. handleRequestBytes()針對各種RSTP指令回應資料,例如:
- handleCmd_OPTIONS()
- handleCmd_DESCRIBE()
- handleCmd_SETUP()
- handleCmd_withinSession()
7. 那麼 RTP session 在何時開始傳送呢?
- handleCmd_withinSession()
- handleCmd_PLAY()
- subsession->startStream()
- streamState->startPlaying()
- fRTPSink->startPlaying() 或 fUDPSink->startPlaying()
- continuePlaying()
UDP (BasicUDPSink.cpp)
- continuePlaying()
- continuePlaying1()
- afterGettingFrame()
- afterGettingFrame1()
- output()
- write()
- writeSocket()
- sendto()
-
RTP (MultiFramedRTPSink.cpp)
- continuePlaying()
- buildAndSendPacket()
- sendPacket()
- output()
- write()
- writeSocket()
- sendto()