webrtc(11) 數據接收——總流程

RTP數據接收模塊:Call

  • 1、我們不理會從網絡上接收數據的具體細節,只討論收到網絡數據包之後的處理

  • 2、入口函數:Call::DeliverPacket,收到網絡數據之後調用該函數進行處理:

    • 2.1、解析包頭
    • 2.2、如果是RTP數據,那麼調用Call::DeliverRtp
    • 2.3、如果是RTCP數據,那麼調用Call::DeliverRtcp
  • 3、Call模塊收到數據之後,自己並不直接處理這些數據,而是向下轉發,找到底層的模塊去處理,因此它會把數據一直往下傳:

    • 3.1、Call::DeliverPacket
    • 3.2、Call::DeliverRtp
    • 3.3、RtpStreamReceiverController::OnRtpPacket
    • 3.4、RtpDemuxer::OnRtpPacket
    • 3.5、RtpVideoStreamReceiver::OnRtpPacket,和上面能連接起來的關鍵是RtpStreamReceiverController::CreateReceiver,RtpVideoStreamReceiver繼承自RtpPacketSinkInterface
    • 3.6、RtpVideoStreamReceiver::OnRtpPacket、RtpVideoStreamReceiver::OnRecoveredPacket
    • 3.7、RtpVideoStreamReceiver::ReceivePacket
    • 3.8、RtpReceiverImpl::IncomingRtpPacket
    • 3.9、RTPReceiverVideo::ParseRtpPacket,——>到這裏纔算真正的處理數據
  • 4、可看到Call模塊收到數據之後並不直接處理,而是一直傳到最底層纔開始解析處理

  • 5、數據處理的流程如下:

    • 5.1、RTPReceiverVideo::ParseRtpPacket
    • 5.2、RtpVideoStreamReceiver::OnReceivedPayloadData,通過RtpReceiver::CreateVideoReceiver和上面結合起來
    • 5.3、PacketBuffer::InsertPacket
    • 5.4、RtpVideoStreamReceiver::OnReceivedFrame,通過video_coding::PacketBuffer::Create和上面結合起來
    • 5.5、RtpFrameReferenceFinder::ManageFrame
    • 5.6、RtpVideoStreamReceiver::OnCompleteFrame
    • 5.7、VideoReceiveStream::OnCompleteFrame
    • 5.8、FrameBuffer::InsertFrame,至此,幀已經插入JitterBuffer中
  • 6、RTP包解析:RTPReceiverVideo::ParseRtpPacket,這裏纔是真正處理數據的地方。它主要是進行一些簡單的參數設置和檢查,注意最外層的rtp頭部已經被分離,因此從該函數往後傳輸的數據都是載荷+頭部的形式,它通過RtpData(RtpVideoStreamReceiver)把數據和頭部往上層傳輸(RTPReceiverVideo位於最底層)

  • 7、RTP包解析完了之後,開始進行組幀:PacketBuffer::InsertPacket

  • 8、組幀完畢之後,會檢查是否需要請求關鍵幀、然後查找幀的參考關係是否滿足: RtpVideoStreamReceiver::OnReceivedFrame

  • 9、檢查幀的參考關係是否滿足: RtpFrameReferenceFinder::ManageFrame

  • 10、組幀完成、幀的參考關係也滿足了,那麼調用:RtpVideoStreamReceiver::OnCompleteFrame、VideoReceiveStream::OnCompleteFrame

  • 11、把幀插入jitter buffer:FrameBuffer::InsertFrame

  • 12、至此,媒體數據包解析基本就完成了,那麼就下來就是解碼並顯示了,調用流程如下:

    • 12.1、VideoReceiveStream::VideoReceiveStream、VideoReceiveStream::Start
    • 12.2、VideoReceiveStream::DecodeThreadFunction
    • 12.3、VideoReceiveStream::Decode
    • 12.4、FrameBuffer::NextFrame(還調用了另一個FrameBuffer::NextFrame)
    • 12.5、VideoReceiver::Decode
    • 12.6、VCMGenericDecoder::Decode
    • 12.7、H264DecoderImpl::Decode
    • 12.8、VCMDecodedFrameCallback::Decoded
    • 12.9、VideoStreamDecoder::FrameToRender
    • 12.10、VideoReceiveStream::OnFrame
    • 12.11、render,渲染播放

13、VideoReceiveStream::VideoReceiveStream,創建解碼線程

14、VideoReceiveStream::Start,啓動解碼線程

15、VideoReceiveStream::DecodeThreadFunction,解碼主線程,間接調用 VideoReceiveStream::Decode

16、解碼主流程, VideoReceiveStream::Decode:
- 16.1、從jitter buffer中讀取一幀數據: FrameBuffer::NextFrame
- 16.2、解碼: VideoReceiver::Decode,解碼完成會
- 16.3、解碼完成:VCMDecodedFrameCallback::Decoded
- 16.4、收到解碼後的數據:VideoStreamDecoder::FrameToRender
- 16.5、準備render:VideoReceiveStream::OnFrame

16、從jitter buffer中讀取數據,如果條件滿足了,那麼將從jitter buffer中讀取出一幀數據:FrameBuffer::NextFrame

17、解碼:
- 17.1、VideoReceiver::Decode
- 17.2、 VCMGenericDecoder::Decode
- 17.3、 VideoDecoder::Decode
- 17.4、H264Decoder::Decode

18、解碼完成,VCMDecodedFrameCallback::Decoded

19、收到解碼後的數據,VideoStreamDecoder::FrameToRender

20、準備render,VideoReceiveStream::OnFrame

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章