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