2012年6月11日 星期一

live555 程式碼分析 -- RTSP Server on demand


分析 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()