主要api分析
CreatePeerConnectFactory and Media Engine
-
webrtc::CreatePeerConnectionFactory
- 接口中需要传入一些线程对象和aodio以及video codec。
- 其中线程对象会直接存放到PeerConnectionFactoryContext中。
- codec、mixer、process会组装成mediaEngine待创建ChannelManager的时候交给其管理。
- 通过CreateCallFactory会创建call_factory
- 通过CreateModularPeerConnectionFactory创建最终的PeerConnectionFactory
-
CreateCallFactory
- 创建CallFactory,只有一个接口,createCall。用于创建call,需要传入callConfig
-
call
- //TODO
-
CreateMediaEngine
- 创建WebRtcVoiceEngine,传入aduio codecs process mixer
- 创建WebRtcVideoEngine,传入video codecs
- 将创建的voiceEngine和VideoEngine交给CompositeMediaEngine,这个类没什么特别的。专门用来存放voice和video Engine的。
-
CreateModularPeerConnectionFactory
- 如果执行create操作的不是signal线程,则交给signal线程执行。
- 通过PeerConnectionFactory::Create()创建peecConnectionFactory
- 将signal_thread、worker_thread、pc_factory交给PeerConnectionFactoryProxy管理。
-
PeerConnectionFactory::Create
- 通过ConnectionContext::Create创建ConnectionContext。将CreatePeerConnectionFactory的所有参数交给ConnectionContext管理。
- 将刚刚创建的context和CreatePeerConnectionFactory的参数交给PeerConnectionFactory实例。
- 如果没有创建work_thread、network_thread、signaling_thread则在初始化ConnectionContex的时候创建,类型为thread。
-
ConnectionContext::Create
- 启动network_thread_、worker_thread_、signaling_thread_
- 通过cricket::ChannelManager::Create创建channel_manager_,传入webrtc::CreatePeerConnectionFactory步骤中创建的media_engine和worker_thread等。
-
cricket::ChannelManager::Create
- 构造ChannelManager
- 调用mediaEngine实例的init
-
CompositeMediaEngine::Init()
- voiceEngine的init
- 目前没有调用videoEngine的init
-
WebRtcVoiceEngine::Init()
- 收集音频相关的编码器和解码器
- 根据CreatePeerConnectionFactory步骤是否创建了audio_Mixer、process、Device决定创建。
- 调用ApplyOptions,配置音频相关降噪回音消除等
- 会根据配置和硬件是否支持决定是否硬件支持的回音消除、降噪等功能
- 将最终决定的配置交给audio_process
CreatePeerConnection
-
PeerConnectionFactoryInterface::CreatePeerConnection
- 有两个重载的版本,四个参数的版本会创建dependence并调用两个参数的版本。
- 调用PeerConnectionFactory::CreatePeerConnectionOrError
-
PeerConnectionFactory::CreatePeerConnectionOrError
- 创建cert_generator
- 创建allocator,端口选择器,类型为BasicPortAllocator
- 创建async_resolver_factory,//TODO
- 创建ice_transport_factory,//TODO
- 创建call,//TODO
- 通过PeerConnection::Create创建peerConnection,接受五步创建的实例作为构造参数。config主要就是turn和stun服务器的地址。
-
BasicPortAllocator::BasicPortAllocator
- 设置session_pool_size=0
- 调用PortAllocator::SetConfiguration,除了构造会调用,AddTurnServer和Connection的Initialize也会调用
-
PortAllocator::SetConfiguration
- 详情见下文
-
PeerConnection::Create
- 创建dns解析模块
- 检测ice相关的配置参数
- 构造peerconnection并且调用Initialize。构造中的context就是peecConnectionFactary中的Context
-
PeerConnection::Initialize
- 解析iceconfig也就是turn和sturn服务器
- 调用InitializePortAllocator_n初始化PortAllocator
- 记录configuration_
- 构造StatsCollector,保存为成员。
- 构造RTCStatsCollector,保存为成员。
- 构造SdpOfferAnswerHandler,保存为成员。
- 构造RtpTransmissionManager,保存为成员。
-
PeerConnection::InitializePortAllocator_n
- 调用PortAllocator::Initialize,内部没什么逻辑,就是设置了一个初始化状态
- 检查配置信息是否有效
- 调用PortAllocator::SetConfiguration重设PortAllocator
-
PortAllocator::SetConfiguration
- 记录stun_server到stun_servers_成员
- 记录turn_server到turn_servers_成员
- 设置turn server筛选偏好turn_port_prune_policy_
- 设置condidata_pool_size,对应的是PortAllocatorSession的个数
- 如果当前的PortAllocatorSession个数少于condidata_pool_size则通过CreateSessionInternal创建新的session对象加入到pooled_sessions_成员,如果多余则从末尾删除多的
- 调用BasicPortAllocatorSession::StartGettingPorts开始收集port
-
BasicPortAllocatorSession::StartGettingPorts
- 创建socket_factory,类型为BasicPacketSocketFactory,BasicPacketSocketFactory需要一个SocketServer来自于networkthread。networkthread维护epoll,出发socket事件。
- 调用BasicPortAllocatorSession::GetPortConfigurations,异步调用
-
BasicPortAllocatorSession::GetPortConfigurations
- 根据strun和turn服务器地址创建PortConfiguration对象
- 调用BasicPortAllocatorSession::ConfigRea