webrtc收包流程源码分析
版本:
webrtc M59
收包流程:
AsyncUDPSocket::OnReadEvent
AllocationSequence::OnReadPacket
HandleIncomingPacket
UDPPort::OnReadPacket
Connection::OnReadPacket
P2PTransportChannel::OnReadPacke
SignalReadPacket
BaseChannel::OnPacketRead
BaseChannel::HandlePacket(該接口內(nèi)的WantsPacket會(huì)判斷rtp包的payload type是否在std::set<int> payload_types_集合內(nèi),不在的話不會(huì)處理)
BaseChannel::OnPacketReceived
WebRtcVoiceMediaChannel::OnPacketReceived
PacketReceiver::DeliveryStatus Call::DeliverRtp
AudioReceiveStream::OnRtpPacket(video通話為VideoReceiveStream::OnRtpPacket)
Channel::OnRtpPacket
Channel::ReceivePacket
RtpReceiverImpl::IncomingRtpPacket
?NetEqImpl::InsertPacket
NetEqImpl::InsertPacketInternal
語(yǔ)音流程:
WebRtcVoiceMediaChannel::OnPacketReceived
?AudioReceiveStream::OnRtpPacket
ChannelProxy::OnRtpPacket
?Channel::OnRtpPacket
Channel::ReceivePacket
RtpReceiverImpl::IncomingRtpPacket
RTPReceiverAudio::ParseAudioCodecSpecific
Channel::OnReceivedPayloadData
AudioCodingModuleImpl::IncomingPacket
AcmReceiver::InsertPacket
ps:可參考http://www.it610.com/article/5250159.htm
視頻收包流程:
WebRtcVideoChannel2::OnPacketReceived
PacketReceiver::DeliveryStatus Call::DeliverRtp
RtpStreamReceiver::ReceivePacket
RtpReceiverImpl::IncomingRtpPacket
RTPReceiverVideo::ParseRtpPacket
RtpStreamReceiver::OnReceivedPayloadData
PacketBuffer::InsertPacket(組幀)
?RtpStreamReceiver::OnReceivedFrame(檢查是否需要請(qǐng)求關(guān)鍵幀、再查找?guī)膮⒖缄P(guān)系是否滿足)
void RtpFrameReferenceFinder::ManageFrame
void RtpFrameReferenceFinder::ManageFrameGeneric
VideoReceiveStream::OnCompleteFrame
FrameBuffer::InsertFrame (將幀插入到j(luò)itter buffter至此數(shù)據(jù)包的接收和處理已經(jīng)完成)
?
視頻解碼流程:
VideoReceiveStream::VideoReceiveStream(創(chuàng)建解碼線程在該構(gòu)造函數(shù)里面,調(diào)用VideoReceiveStream::DecodeThreadFunction)
VideoReceiveStream::Decode( 如果有幀才會(huì)去解碼,最長(zhǎng)等待3秒,在VideoReceiveStream::Decode中有設(shè)置等待時(shí)間)
FrameBuffer::ReturnReason FrameBuffer::NextFrame (獲取幀)
VideoReceiver::Decode
VCMGenericDecoder* VCMCodecDataBase::GetDecoder(獲取解碼,如果沒(méi)有創(chuàng)建則調(diào)用)
CreateAndInitDecoder(硬解的話走的是External codec流程也就是new VCMGenericDecoder(external_dec_item->external_decoder_instance, true))
VCMGenericDecoder::InitDecode
MediaCodecVideoDecoder::InitDecode
MediaCodecVideoDecoder::InitDecodeOnCodecThread()
VCMDecodedFrameCallback::Decoded(解碼完成)
VideoStreamDecoder::FrameToRender(收到解碼后的數(shù)據(jù))
IncomingVideoStream::OnFrame? ?(將幀放入隊(duì)列VideoRenderFrames(incoming_video_stream_接收解碼對(duì)象通過(guò)VideoStreamDecoder::VideoStreamDecoder ->VideoReceiver::RegisterReceiveCallback(this)–>VCMDecodedFrameCallback::SetUserReceiveCallback)
IncomingVideoStream::Dequeue
?
?
ps: 這個(gè)只是一部分,其余的后續(xù)補(bǔ)充
?
轉(zhuǎn)載于:https://my.oschina.net/xgcode/blog/2120620
總結(jié)
以上是生活随笔為你收集整理的webrtc收包流程源码分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: javascript +new Date
- 下一篇: html 5 video audio