原文出处:初始化

new VoiceEngine/VoiceEngine_create
    new VoiceEngineData
        webrtc::VoiceEngine::Create
            GetVoiceEngine
                new VoiceEngineImpl
                    初始化SharedData
                        ProcessThread::CreateProcessThread
                        OutputMixer::Create
                            new OutputMixer
                                AudioConferenceMixer::Create
                                    new AudioConferenceMixerImpl
                                    AudioConferenceMixerImpl::Init
                        TransmitMixer::Create
                            new TransmitMixer
                    初始化VoEAudioProcessingImpl
                    初始化VoECodecImpl
                    初始化VoEDtmfImpl
                    初始化VoENetEqStatsImpl
                    初始化VoENetworkImpl
                    初始化VoERTP_RTCPImpl
                    初始化VoEVideoSyncImpl
                    初始化VoEVolumeControlImpl
                    初始化VoEBaseImpl
VoiceEngine_init
    VoEBaseImpl::Init
        WebRtcSpl_Init          
        ProcessThreadImpl::Start
        AudioDeviceModuleImpl::Create
            AudioDeviceModuleImpl::CreatePlatformSpecificObjects
                new AudioDeviceTemplate
                new AudioDeviceUtilityAndroid
        SharedData::set_audio_device            
        ProcessThreadImpl::RegisterModuleAudioDeviceModuleImpl    
        AudioDeviceModuleImpl::RegisterEventObserver
        AudioDeviceModuleImpl::RegisterAudioCallback
        AudioDeviceModuleImpl::init
        AudioDeviceModuleImpl::SetPlayoutDevice
        AudioDeviceModuleImpl::InitSpeaker
        AudioDeviceModuleImpl::SetRecordingDevice
        AudioDeviceModuleImpl::InitMicrophone
        AudioDeviceModuleImpl::StereoPlayoutIsAvailable
        AudioDeviceModuleImpl::SetStereoPlayout
        AudioDeviceModuleImpl::SetStereoRecording
        AudioProcessing::Create
            new AudioProcessingImpl
                new audioproc::Event
                new EchoCancellationImpl
                new EchoControlMobileImpl
                new GainControlImpl
                new HighPassFilterImpl
                new LevelEstimatorImpl
                new NoiseSuppressionImpl
                new VoiceDetectionImpl
                new GainControlForNewAgc
VoiceEngine_createChannel
    VoEBaseImpl::CreateChannel
        ChannelManager::CreateChannel
                ChannelManager::CreateChannelInternal
                Channel::CreateChannel
                    new Channel             
        VoEBaseImpl::InitializeChannel
            Channel::SetEngineInformation                   
new VideoEngine
    video_engine_jni.cc:VideoEngine_create
        new VideoEngineData 
            vie(vie_imple.cc:webrtc::VideoEngine::Create())
                new VideoEngineImpl
                    初始化ViEBaseImpl
                        new ViESharedData
                            初始化number_cores_CpuInfo::DetectNumberOfCores(
                            channel_manager_(new ViEChannelManager(0, number_cores_, config)),
                                input_manager_(new ViEInputManager(0, config)),
                                render_manager_(new ViERenderManager(0)),
                                module_process_thread_(ProcessThread::CreateProcessThread()),
                                    new ProcessThreadImpl
                                channel_manager_/input_manager_使用module_process_thread_
                                module_process_thread_启动
VideoEngine_init
    ViEBaseImpl::Init
VideoEngine_setVoiceEngine
    ViEBaseImpl::SetVoiceEngine
        ViEChannelManager::SetVoiceEngine   
            ViEChannel::SetVoiceChannel
                ViESyncModule::ConfigureSync
                    new StreamSynchronization
                        new ViESyncDelay
VideoEngine_createChannel       
    VideoEngineData::CreateChannel                      
        ViEBaseImpl::CreateChannel
            ViEChannelManager::CreateChannel
                new ChannelGroup
                    new VieRemb
                    BitrateController::CreateBitrateController
                        BitrateControllerImpl::BitrateControllerImpl
                    new CallStats
                    new EncoderStateFeedback
                    new WrappingBitrateEstimator                            
                    将主要Module注册到ProcessThread
                new ViEEncoder
                    vcm_(*webrtc::VideoCodingModule::Create())
                        new VideoCodingModuleImpl
                            sender_(new vcm::VideoSender(clock, &post_encode_callback_)),
                                new DebugRecorder(媒体写文件)
                            receiver_(new vcm::VideoReceiver(clock, event_factory))
                    vpm_(*webrtc::VideoProcessingModule::Create(channel_id))),
                        new VideoProcessingModuleImpl
                    RtpRtcp::CreateRtpRtcp                                     
                        new ModuleRtpRtcpImpl
                            RTPSender初始化
                                new RTPSenderVideo
                            RTCPSender初始化
                            RTCPReceiver初始化
                            RTCPReceiver::RegisterRtcpObservers
                    new ViEBitrateObserver
                    new ViEPacedSenderCallback
                BitrateControllerImpl::CreateRtcpBandwidthObserver
                ViEEncoder::Init
                    VideoCodingModuleImpl::InitializeSender 
                        VideoSender::InitializeSender
                            VCMCodecDataBase::ResetSender
                    VideoProcessingModuleImpl::EnableTemporalDecimation     
                        VPMFramePreprocessor::EnableTemporalDecimation
                            VPMVideoDecimator::EnableTemporalDecimation
                    VideoProcessingModuleImpl::EnableContentAnalysis        
                        VPMFramePreprocessor::EnableContentAnalysis
                    new QMVideoSettingsCallback
                    VideoCodingModule::Codec
                        VCMCodecDataBase::Codec
                    VideoCodingModuleImpl::RegisterSendCodec
                        VideoSender::RegisterSendCodec
                            VCMCodecDataBase::SetSendCodec
                                CreateEncoder
                                    VP8Encoder::Create
                                        new VP8EncoderImpl
                                    new VCMGenericEncoder
                                VCMGenericEncoder::InitEncode
                                    VP8EncoderImpl::InitEncode
                                VCMGenericEncoder::RegisterEncodeCallback   
                                    VP8EncoderImpl::RegisterEncodeCompleteCallback
                                VCMGenericEncoder::SetPeriodicKeyFrames 
                ViEChannelManager::CreateChannelObject          
                    new ViEChannel
                    ViEChannel::Init
VideoEngine_connectAudioChannel
    ViEBaseImpl::ConnectAudioChannel
        ViEChannelManager::ConnectVoiceChannel
            ViEChannel::SetVoiceChannel
                ProcessThreadImpl::RegisterModule(VoEVideoSync)
                ViESyncModule::ConfigureSync                                        
                    new StreamSynchronization

原文出处:发送Call

VoiceEngine_startListen
    VoEBaseImpl::StartReceive
        channelPtr->StartReceiving设置channel的receiving的状态
VoiceEngine_startPlayout
    VoEBaseImpl::StartPlayout
        VoEBaseImpl::StartPlayout--没有channelId涉及到硬件所以是唯一全局的
            AudioDeviceModuleImpl::InitPlayout      
                AudioDeviceTemplate::InitPlayout
                    OpenSlesOutput::InitPlayout,设置状态
            AudioDeviceModuleImpl::StartPlayout     
                AudioDeviceTemplate::StartPlayout
                    OpenSlesOutput::StartPlayout,创建硬件资源
        Channel::StartPlayout
            OutputMixer::SetMixabilityStatus                
                AudioConferenceMixerImpl::SetMixabilityStatus
                    AudioConferenceMixerImpl::AddParticipantToList加入到混音器中
VoiceEngine_startSend
    VoEBaseImpl::StartSend                      
        VoEBaseImpl::StartSend() --没有channelId涉及到硬件所以是唯一全局的
            AudioDeviceModuleImpl::StartRecording
                AudioDeviceTemplate::StartRecording
                    OpenSlesInput::StartRecording创建硬件资源
            AudioDeviceModuleImpl::InitRecording
                AudioDeviceTemplate::InitRecording
                    OpenSlesInput::InitRecording配置状态
        Channel::StartSend设置状态
VideoEngine_addRenderer
    ViERenderImpl::AddRenderer
        ViERenderManager::AddRenderStream
            VideoRender::CreateVideoRender VideoRender和上层的window一一对应
                new ModuleVideoRenderImpl       
                    new AndroidNativeOpenGl2Renderer
                    AndroidNativeOpenGl2Renderer::Init和JNI环境关联起来
            加入到render_list,??可以有多个Render吗
            ViERenderer::CreateViERenderer
                new ViERenderer
                    new ViEExternalRendererImpl,用于回调
                        new VideoFrame
                ViERenderer::Init       
                    ModuleVideoRenderImpl::AddIncomingRenderStream
                        VideoRenderAndroid::AddIncomingRenderStream
                            AndroidNativeOpenGl2Renderer::CreateAndroidRenderChannel
                                new AndroidNativeOpenGl2Channel
                                AndroidNativeOpenGl2Channel::Init 
                                    和JINI环境关联起来
                                    注册两个Native函数AndroidNativeOpenGl2Channel::DrawNativeStaticAndroidNativeOpenGl2Channel::CreateOpenGLNativeStatic
                        streamId和AndroidStreamAndroidNativeOpenGl2Channel一一对应可以保存多个                          
                    new IncomingVideoStream
                        new VideoRenderFrames
                    IncomingVideoStream::SetRenderCallback初始化回调函数AndroidNativeOpenGl2Channel
                    IncomingVideoStream加入map中??可以有多个
VideoEngine_startRender
    ViERenderer::StartRender
        ModuleVideoRenderImpl::StartRender                          
            IncomingVideoStream::Start
                ThreadWrapper::CreateThread回调是IncomingVideoStream::IncomingVideoStreamProcess
                Thread启动
                EventPosix::StartTimer
            VideoRenderAndroid::StartRender
                ThreadWrapper::CreateThread回调是VideoRenderAndroid::JavaRenderThreadProcess
                启动线程
VideoEngine_startReceive
    ViEBaseImpl::StartReceive
        ViEChannel::StartReceive
            ViEReceiver::StartReceive,设置状态
VideoEngine_getCaptureDevice
    ViECaptureImpl::GetCaptureDevice
        ViEInputManager::GetDeviceName
            VideoCaptureFactory::CreateDeviceInfo
                new videocapturemodule::DeviceInfoAndroid
                DeviceInfoAndroid::GetDeviceName
VideoEngine_allocateCaptureDevice
    ViECaptureImpl::AllocateCaptureDevice
        ViEInputManager::CreateCaptureDevice
            ViECapturer::CreateViECapture
                new ViECapturer
                    ThreadWrapper::CreateThread,回调函数ViECapturer::ViECaptureProcess
                    new OveruseFrameDetector
                ViECapturer::Init
                    VideoCaptureFactory::Create
                        VideoCaptureImpl::Create
                            new videocapturemodule::VideoCaptureAndroid
                    VideoCaptureAndroid::RegisterCaptureDataCallback注册回调函数ViECapturer
                    在线程中注册Modulevideocapturemodule::VideoCaptureAndroid
            保存ID可以有多个ViECapturer
VideoEngine_connectCaptureDevice
    ViECaptureImpl::ConnectCaptureDevice,链接摄像头和channle
        ViEFrameProviderBase::RegisterFrameCallback可以有多个callback           
        ViECapturer::FrameCallbackChanged将ViEEncoder作为回调类放到VieCapturer的回调list中
            VideoCaptureAndroid::CaptureSettings
            VideoCaptureAndroid::StopCapture
            VideoCaptureAndroid::StartCapture配置JNI环境获取摄像头参数   
VideoEngine_startCapture
    ViECaptureImpl::StartCapture
        ViECapturer::Start
            ViEFrameProviderBase::GetBestFormat获取最好的尺寸
                ViEEncoder::GetPreferedFrameSettings
            VideoCaptureAndroid::StartCapture配置JNI环境获取摄像头参数
VideoEngine_startSend
    ViEBaseImpl::StartSend
        ViEEncoder::Pause设置状态
        ViEChannel::StartSend
            ModuleRtpRtcpImpl::SetSendingMediaStatus
                RTPSender::SetSendingMediaStatus设置状态为true
            ModuleRtpRtcpImpl::SetSendingStatus
                RTPSender::SetSendingStatus初始化状态和RTP头
            还能有多个ModuleRtpRtcpImpl???
        ViEEncoder::SendKeyFrame
            VideoCodingModuleImpl::IntraFrameRequest
                VideoSender::IntraFrameRequest
                    VCMGenericEncoder::RequestFrame
                        VP8EncoderImpl::Encode

原文出处:音频接收流程

收到音频包
UdpSocketManagerPosixImpl::Run
    UdpSocketManagerPosixImpl::Process
        UdpSocketPosix::HasIncomingrecvfrom
            UdpTransportImpl::IncomingRTPCallback
                UdpTransportImpl::IncomingRTPFunction
                    VoiceChannelTransport::IncomingRTPPacket
                        VoENetworkImpl::ReceivedRTPPacket
                            Channel::ReceivedRTPPacket
                                UpdatePlayoutTimestamp
                                    AudioCodingModuleImpl::PlayoutTimestamp
                                        AcmReceiver::GetPlayoutTimestamp
                                            InitialDelayManager::GetPlayoutTimestamp
                                    AudioDeviceModuleImpl::PlayoutDelay
                                        AudioDeviceTemplate::PlayoutDelay
                                            OpenSlesOutput::PlayoutDelay
                                Channel::IsPacketInOrder
                                    ReceiveStatisticsImpl::GetStatistician (这个类应该管理所有的流)
                                    StreamStatisticianImpl::IsPacketInOrder
                                        StreamStatisticianImpl::InOrderPacketInternal 可以学习一下这个判断乱序代码
                                Channel::IsPacketRetransmitted
                                    StreamStatisticianImpl::IsRetransmitOfOldPacket 可以学习一下这个判断重传代码
                                ReceiveStatisticsImpl::IncomingPacket       
                                    如果是第一次收到创建StreamStatisticianImpl                                   
                                    StreamStatisticianImpl::IncomingPacket
                                        StreamStatisticianImpl::UpdateCounters  记录必要的信息 用于统计如乱序重传jitbuff计算bitrate
                                        StreamStatisticianImpl::NotifyRtpCallback
                                            ReceiveStatisticsImpl::DataCountersUpdated没做处理
                                Channel::ReceivePacket
                                    RtpReceiverImpl::IncomingRtpPacket
                                        check ssrc/play/timestamp
                                        RtpReceiverImpl::CheckSSRCChanged
                                            如果是第一次则Channel::OnInitializeDecoder
                                                AudioCodingModule::Codec 选择具体的Codec Inst数组一开始已经初始化好所有的
                                                AudioCodingModuleImpl::RegisterReceiveCodec
                                                    AudioCodingModuleImpl::GetAudioDecoder
                                                        AudioCodingModuleImpl::CreateCodec
                                                            ACMCodecDB::CreateCodecInstance
                                                                new ACMISAC
                                                    AcmReceiver::AddCodec
                                                        NetEq初始化
                                                        NetEqImpl::RegisterExternalDecoder
                                        RTPReceiverAudio::ParseRtpPacket
                                            RTPReceiverAudio::ParseAudioCodecSpecific
                                                判断是不是dtmfcgn2833
                                                Channel::OnReceivedPayloadData
                                                    AudioCodingModuleImpl::IncomingPacket
                                                        AcmReceiver::InsertPacket
                                                            ack
                                                            唇音同步
                                                            NetEqImpl::InsertPacket
                                                                NetEqImpl::InsertPacketInternal
                                                                    ACMISAC::IncomingPacket
                                                        ACMISAC::UpdateDecoderSampFreq
                                                            WebRtcIsac_SetDecSampRate
                                                                DecoderInitUb
                                                    Channel::UpdatePacketDelay
                                                        Channel::GetPlayoutFrequency(
                                                            AudioCodingModuleImpl::PlayoutFrequency()
AudioTrackJni::PlayThreadProcess
    AudioDeviceBuffer::RequestPlayoutData
        VoEBaseImpl::NeedMorePlayData
            VoEBaseImpl::GetPlayoutData
                AudioConferenceMixerImpl::Process
                    AudioConferenceMixerImpl::UpdateToMix
                        所有的与会者Channel::GetAudioFrame
                            AudioCodingModuleImpl::PlayoutData10Ms
                                AcmReceiver::GetAudio
                                    时间判断
                                    可能产生静音包
                                    NetEqImpl::GetAudio
                                        NetEqImpl::GetAudioInternal
                                            NetEqImpl::Decode
                                                ACMISAC::DecodePlc
                                                NetEqImpl::DecodeLoop
                                                    ACMISAC::Decode
                                    NetEqImpl::DecodedRtpInfo
                                    ack的处理
                                    重采样
                            Channel::UpdateRxVadDetection
                                Channel::OnRxVadDetected
                             AudioProcessingImpl::ProcessStream
                                 AudioBuffer::DeinterleaveFrom
                                 AudioBuffer::InterleaveTo
                             必要的音频处理scale之类的
                        音量判断
                    合成声音                
                OutputMixer::GetMixedAudio  获取合成完的数据
    AudioDeviceBuffer::GetPlayoutData
    复制到java内存
    调用Java程序CallIntMethod(_javaScObj, _javaMidPlayAudio,

原文出处:音频发送流程

发送音频
OpenSlesInput::RecorderSimpleBufferQueueCallback
    OpenSlesInput::RecorderSimpleBufferQueueCallbackHandler保存数据
OpenSlesInput::CbThreadImpl
    AudioDeviceBuffer::SetRecordedBuffer 复制数据
    AudioDeviceBuffer::SetVQEData
    AudioDeviceBuffer::DeliverRecordedData
        VoEBaseImpl::RecordedDataIsAvailable
            VoEBaseImpl::ProcessRecordedDataWithAPM
                AudioDeviceModuleImpl::MaxMicrophoneVolume
                    AudioDeviceTemplate::MaxMicrophoneVolume
                TransmitMixer::PrepareDemux
                    TransmitMixer::GenerateAudioFrame
                        DownConvertToCodecFormat, 单双转换重采样
                            PushResampler<T>::Resample
                    TransmitMixer::ProcessAudioagcaecanc
                        AudioProcessingImpl::ProcessStream
                            AudioBuffer::DeinterleaveFrom
                            AudioProcessingImpl::ProcessStreamLocked
                            AudioBuffer::InterleaveTo
                TransmitMixer::DemuxAndMix
                    Channel::Demultiplex 复制数据
                    Channel::PrepareEncodeAndSend 一些处理比如添加dtmf
                TransmitMixer::EncodeAndSend()
                    Channel::EncodeAndSend
                        AudioCodingModuleImpl::Add10MsData
                            AudioCodingModuleImpl::PreprocessToAddData 存储数据
                        AudioCodingModuleImpl::Process
                            AudioCodingModuleImpl::ProcessSingleStream
                                ACMGenericCodec::Encode
                                    ACMISAC::InternalEncode
                                Channel::SendData
                                    ModuleRtpRtcpImpl::SendOutgoingData
                                        RTPSender::SendOutgoingData
                                            RTPSenderAudio::SendAudio
                                                RTPSender::BuildRTPheader
                                                    RTPSender::CreateRtpHeader
                                                RTPSender::SendToNetwork
                                                    统计
                                                    RTPSender::SendPacketToNetwork
                                                        Channel::SendPacket
                                                            UdpTransportImpl::SendPacket

原文出处:视频接受流程

收到视频包
UdpSocketManagerPosixImpl::Run
    UdpSocketManagerPosixImpl::Process
        UdpSocketPosix::HasIncomingrecvfrom
            UdpTransportImpl::IncomingRTPCallback
                UdpTransportImpl::IncomingRTPFunction       
                    VideoChannelTransport::IncomingRTPPacket
                        ViENetworkImpl::ReceivedRTPPacket
                            ViEChannel::ReceivedRTPPacket
                                ViEReceiver::ReceivedRTPPacket
                                    ViEReceiver::InsertRTPPacket
                                        如果配置了抓包 可以RtpDumpImpl::DumpPacket
                                        RtpHeaderParserImpl::Parse
                                            RtpHeaderParser::Parse
                                        ViEReceiver::ReceivePacket
                                            RtpReceiverImpl::IncomingRtpPacket
                                                ssrcpayroad等检查
                                                RTPReceiverVideo::ParseRtpPacket
                                                    ViEReceiver::OnReceivedPayloadData
                                                        VideoCodingModuleImpl::IncomingPacket
                                                            VideoReceiver::IncomingPacket
                                                                VCMReceiver::InsertPacket
                                                                    VCMJitterBuffer::InsertPacket
                                                                        VCMJitterBuffer::GetFrame, 完整frame/未完整frame/空frame
                                                                    VCMFrameBuffer::InsertPacket 组桢
                                                                    如果完成 插入可解码桢队列decodable_frames_
ViEChannel::ChannelDecodeProcess
    VideoCodingModuleImpl::Decode                               
        VideoReceiver::Decode
            VCMReceiver::FrameForDecoding
                VCMJitterBuffer::NextCompleteTimestamp还未到render时间 则等待
                VCMJitterBuffer::ExtractAndSetDecode 取frame
            如果需要抓图片?()
            VideoReceiver::Decode
                VCMGenericDecoder::Decode
                    VP8DecoderImpl::Decode
decode完成VP8是同步的 直接在Decode中调用
    VCMDecodedFrameCallback::Decoded            
        ViEChannel::FrameToRender
            图片预处理
            ViEFrameProviderBase::DeliverFrame
                ViERenderer::DeliverFrame
                    IncomingVideoStream::RenderFrame, 复制frame放入队列
IncomingVideoStream::IncomingVideoStreamThreadFun
    IncomingVideoStream::IncomingVideoStreamProcess                 
        AndroidNativeOpenGl2Channel::RenderFrame 复制frame
VideoRenderAndroid::JavaRenderThreadProcess     
    AndroidNativeOpenGl2Channel::DeliverFrame       
        调用JAVA层函数
            AndroidNativeOpenGl2Channel::DrawNativeStatic
                VideoRenderOpenGles20::Render

原文出处:视频发送流程

JNI调用
ProvideCameraFrame
    VideoCaptureAndroid::OnIncomingFrame
        VideoCaptureImpl::IncomingFrame
            申请内存转换层I420
            VideoCaptureImpl::DeliverCapturedFrame
                计算时间戳
                ViECapturer::OnIncomingCapturedFrame
                    OveruseFrameDetector::FrameCaptured
                    复制frame为什么???
ViECapturer::ViECaptureProcess
    ViECapturer::DeliverI420Frame
        ViEFrameProviderBase::DeliverFrame
            遍历所有注册的观察着
            ViEEncoder::DeliverFrame            
                encode之前的预处理回调处理      
                VideoCodingModuleImpl::AddVideoFrame
                    VideoSender::AddVideoFrame
                        VCMGenericEncoder::Encode
                            VP8EncoderImpl::Encode
                                编码
                                VP8EncoderImpl::GetEncodedPartitions
                                    EncodedImageCallbackWrapper::Encoded
                                        VCMEncodedFrameCallback::Encoded
                                            ViEEncoder::SendData
                                                ModuleRtpRtcpImpl::SendOutgoingData
                                                    RTPSender::SendOutgoingData
                                                        RTPSenderVideo::SendVideo
                                                            RTPSenderVideo::Send
                                                                拆包RTP组包
                                                                RTPSenderVideo::SendVideoPacket
                                                                    RTPSender::SendToNetwork
                                                                    FEC

原文出处:发送端Webrtc视频Pipeline

从摄像头捕获特定帧率和分辨率的原始[YUV/RGB or MGPEG==>YUV/RGB]视频帧

拥塞控制

Local Video Rtp

发送端基于”Loss-based Controller”估算发送端带宽 As,接收端基于”Delay-based controller”估算发送端带宽 Ar,发送端取两者的最小值作为当前发送端目标带宽,作用于编码器、Pacer以及Padder/FEC。

SendSideCongestionController

1、OnTransportFeedback 2、Process 3、MaybeTriggerOnNetworkChanged

BitrateController

1、OnDelayBasedBweResult 2、OnReceivedEstimatedBitrate 3、GetNetworkParameters

SendSideBandwidthEstimation

综合发送端带宽估计和接收端带宽估计,得出当前发送端目标带宽。

1、UpdateDelayBasedEstimate 2、UpdateReceiverEstimate 3、UpdateEstimate 4、CapBitrateToThresholds

BitrateAllocator

OnNetworkChanged

接收SendSideCongestionController::MaybeTriggerOnNetworkChanged回调过来的带宽变化通知。

SendSideCongestionController::MaybeTriggerOnNetworkChanged 
==> Call::OnNetworkChanged 
==> Call::OnNetworkChanged 
==> BitrateAllocator::OnNetworkChanged 
==> VideoSendStreamImpl::OnBitrateUpdated 
==> FecController::UpdateFecRates and CalculateOverheadRateBps and ==> VideoStreamEncoder::OnBitrateUpdated 
==> VideoSender::SetChannelParameters 
==> VCMGenericEncoder::SetEncoderParameters 
==> VideoEncoder::SetRateAllocation of different video encoder implementation.

编码

Rtp打包过程,图片来源:WebRTC中RTP/RTCP协议实现分析

VideoStreamEncoder

1、SetSource 2、SetSink 3、ConfigureEncoder 4、OnFrame

接收采集端过来的视频帧。

5、EncodeVideoFrame 6、CropAndScaleFrom 7、OnBitrateUpdated

调用vcm::VideoSender::SetChannelParameters,将新的带宽码率设置给编码器实例。

EncodedImageCallback

编码器编码数据回调接口。

VCMEncodedFrameCallback

EncodedImageCallback的wrapper。

vcm::VideoSender

VideoStreamEncoder实现EncodedImageCallback接口,将raw video frame交给vcm::VideoSender去编码,然后从EncodedImageCallback回调接口接收视频编码器编码之后的压缩数据。

1、RegisterExternalEncoder

注册发送端编码器实例。

2、RegisterSendCodec

VideoCodec,用来选择发送端将要使用的视频编码器,参数包括:编码器类型[VP8,VP9,H264…]、rtp payload type、宽、高、起始码率、最大码率、最小码率、目标码率、最大帧率、最大量化参数、不同分辨率的码率个数等。

3、AddVideoFrame

4、SetChannelParameters

Update the channel parameters based on new rates and rtt. This will also cause an immediate call to VideoEncoder::SetRateAllocation.

VideoEncoder

视频编码器接口

1、InitEncode

2、RegisterEncodeCompleteCallback

3、Release

4、Encode

5、SetRateAllocation

VCMGenericEncoder

VideoEncoder的wrapper,确保对VideoEncoder各个api的调用是序列化的。

SetEncoderParameters

设置参数: target_bitrate,loss_rate,rtt,input_frame_rate。

VCMEncoderDataBase

视频编码器数据库,因为同一时刻只有一个编码器会被一个VideoSender使用,所以这个数据库其实只有一个视频编码器,使用RegisterExternalEncoder注册。

1、RegisterExternalEncoder 2、SetSendCodec 3、GetEncoder 4、MatchesCurrentResolution 5、DeregisterExternalEncoder

EncoderSink

继承EncodedImageCallback接口,接收编码后的压缩数据。

VideoSendStreamImpl

VideoSendStreamImpl实现EncoderSink接口,接收VideoStreamEncoder回调过来的编码器编码之后的压缩数据。

1、OnEncodedImage 2、OnBitrateUpdated

Implements BitrateAllocatorObserver,接收带宽变化通知,并设置到编码器VideoStreamEncoder。

PayloadRouter

PayloadRouter routes outgoing data to the correct sending RTP module, based on the simulcast layer in RTPVideoHeader.

1、OnEncodedImage

封包 + FEC + 丢包重传

RtpRtcp

1、SendOutgoingData 2、TimeToSendPacket 3、TimeToSendPadding 4、SendRTCP

ModuleRtpRtcpImpl

实现RtpRtcp接口。

1、SendOutgoingData

接收PayloadRouter过来的压缩数据,通过SendOutgoingData继续传递给RTPSender封包。

2、TimeToSendPacket

接收从PacedSender回调过来的数据包,通过TimeToSendPacket传递给RTPSender。

RTPSender

1、SendOutgoingData

处理ModuleRtpRtcpImpl传递过来的压缩数据。

2、TimeToSendPacket

3、SelectiveRetransmissions

4、OnReceivedNack

接收到接收端rtcp返回的Nack,调用ReSendPacket进行丢包重传。

5、ReSendPacket

在RtpPacketHistory中回溯rtt,查找丢掉的包是否落在这段时间范围内,否则放弃重传;然后检查重传是否会导致“overusing retransmission bitrate”,如果是,则放弃重传。

6、SendToNetwork

把报文存储到RTPPacketHistory结构中进行缓存。接下来如果开启PacedSending,则构造Packe发送到PacedSender进行排队,否则直接发送到网络层。

7、SendPacketToNetwork

将PaceSender回调过来的数据包,通过SendRtp传递给Transport。

RTPSenderVideo

1、SetFecParameters

2、SetSelectiveRetransmissions

3、SendVideo

RTPSenderVideo处理后,通过SendToNetwork回调给RTPSender,然后,RTPSender将包保存在RtpPacketHistory 中等待RtpPacketSender派发。

4、SendVideoPacketWithFlexfec

FEC protection.

PacedSender

继承RtpPacketSender,平滑数据包的发送,通过TimeToSendPacket回调将数据包传递给PacketSender。

1、SetEstimatedBitrate

接收SendSideCongestionController::MaybeTriggerOnNetworkChanged回调过来的带宽变化通知。

2、SetSendBitrateLimits

3、SendPacket

由于视频帧数据量大,且在I帧出现时存在非常大的波动梯度,如果大量的数据在瞬间全部发送到网络中,很容易导致网络的拥塞和抖动,造成延迟和丢包。PacedSender的目的就是平滑数据包的发送,使得发送端能够按照估算的发送端带宽码率平缓的发送媒体数据。

BitrateProber

根据发送码率和发送的数据量估算从当前发送结束到下一次开始发送PacedSender需要等待的时间

IntervalBudget

根据发送码率和等待间隔计算PacedSender本次剩余可发送的数据量,只有bytesremaining 大于0才允许发送。

PacketRouter

继承PacketSender,通过TimeToSendPacket回调将PacedSender回调过来的数据包传递给相应的ModuleRtpRtcpImpl。

发送

Transport

1、SendRtp

2、SendRtcp

reference