前言

image.png

构造MediaEngineDependencies的作用,是将所有创建的参数打包到这里,方便参数的传递和管理。

代码分析

CreatePeerConnectionFactory

H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\api\create_peerconnection_factory.cc

  1. rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
  2. rtc::Thread* network_thread,
  3. rtc::Thread* worker_thread,
  4. rtc::Thread* signaling_thread,
  5. rtc::scoped_refptr<AudioDeviceModule> default_adm,
  6. rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
  7. rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
  8. std::unique_ptr<VideoEncoderFactory> video_encoder_factory,
  9. std::unique_ptr<VideoDecoderFactory> video_decoder_factory,
  10. rtc::scoped_refptr<AudioMixer> audio_mixer,
  11. rtc::scoped_refptr<AudioProcessing> audio_processing,
  12. AudioFrameProcessor* audio_frame_processor) {
  13. PeerConnectionFactoryDependencies dependencies;
  14. dependencies.network_thread = network_thread;
  15. dependencies.worker_thread = worker_thread;
  16. dependencies.signaling_thread = signaling_thread;
  17. dependencies.task_queue_factory = CreateDefaultTaskQueueFactory();
  18. dependencies.call_factory = CreateCallFactory();
  19. dependencies.event_log_factory = std::make_unique<RtcEventLogFactory>(
  20. dependencies.task_queue_factory.get());
  21. dependencies.trials = std::make_unique<webrtc::FieldTrialBasedConfig>();
  22. cricket::MediaEngineDependencies media_dependencies;
  23. media_dependencies.task_queue_factory = dependencies.task_queue_factory.get();
  24. media_dependencies.adm = std::move(default_adm);
  25. media_dependencies.audio_encoder_factory = std::move(audio_encoder_factory);
  26. media_dependencies.audio_decoder_factory = std::move(audio_decoder_factory);
  27. media_dependencies.audio_frame_processor = audio_frame_processor;
  28. if (audio_processing) {
  29. media_dependencies.audio_processing = std::move(audio_processing);
  30. } else {
  31. media_dependencies.audio_processing = AudioProcessingBuilder().Create();
  32. }
  33. media_dependencies.audio_mixer = std::move(audio_mixer);
  34. media_dependencies.video_encoder_factory = std::move(video_encoder_factory);
  35. media_dependencies.video_decoder_factory = std::move(video_decoder_factory);
  36. media_dependencies.trials = dependencies.trials.get();
  37. dependencies.media_engine =
  38. cricket::CreateMediaEngine(std::move(media_dependencies));
  39. return CreateModularPeerConnectionFactory(std::move(dependencies));
  40. }

—》1、dependencies.media_engine =
cricket::CreateMediaEngine(std::move(media_dependencies));

CreateMediaEngine

H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\media\engine\webrtc_media_engine.cc

  1. std::unique_ptr<MediaEngineInterface> CreateMediaEngine(
  2. MediaEngineDependencies dependencies) {
  3. // TODO(sprang): Make populating |dependencies.trials| mandatory and remove
  4. // these fallbacks.
  5. std::unique_ptr<webrtc::WebRtcKeyValueConfig> fallback_trials(
  6. dependencies.trials ? nullptr : new webrtc::FieldTrialBasedConfig());
  7. const webrtc::WebRtcKeyValueConfig& trials =
  8. dependencies.trials ? *dependencies.trials : *fallback_trials;
  9. // 创建音频引擎
  10. auto audio_engine = std::make_unique<WebRtcVoiceEngine>(
  11. dependencies.task_queue_factory, std::move(dependencies.adm),
  12. std::move(dependencies.audio_encoder_factory),
  13. std::move(dependencies.audio_decoder_factory),
  14. std::move(dependencies.audio_mixer),
  15. std::move(dependencies.audio_processing),
  16. dependencies.audio_frame_processor, trials);
  17. // 创建视频引擎
  18. #ifdef HAVE_WEBRTC_VIDEO
  19. auto video_engine = std::make_unique<WebRtcVideoEngine>(
  20. std::move(dependencies.video_encoder_factory),
  21. std::move(dependencies.video_decoder_factory), trials);
  22. #else
  23. auto video_engine = std::make_unique<NullWebRtcVideoEngine>();
  24. #endif
  25. // 创建音频和视频引擎后,保存到CompositeMediaEngine媒体引擎中
  26. return std::make_unique<CompositeMediaEngine>(std::move(fallback_trials),
  27. std::move(audio_engine),
  28. std::move(video_engine));
  29. }

image.png
—》2、 return CreateModularPeerConnectionFactory(std::move(dependencies));

CreateModularPeerConnectionFactory

  1. rtc::scoped_refptr<PeerConnectionFactoryInterface>
  2. CreateModularPeerConnectionFactory(
  3. PeerConnectionFactoryDependencies dependencies) {
  4. // The PeerConnectionFactory must be created on the signaling thread.
  5. if (dependencies.signaling_thread &&
  6. !dependencies.signaling_thread->IsCurrent()) {
  7. return dependencies.signaling_thread
  8. ->Invoke<rtc::scoped_refptr<PeerConnectionFactoryInterface>>(
  9. RTC_FROM_HERE, [&dependencies] {
  10. return CreateModularPeerConnectionFactory(
  11. std::move(dependencies));
  12. });
  13. }
  14. auto pc_factory = PeerConnectionFactory::Create(std::move(dependencies));
  15. if (!pc_factory) {
  16. return nullptr;
  17. }
  18. // Verify that the invocation and the initialization ended up agreeing on the
  19. // thread.
  20. RTC_DCHECK_RUN_ON(pc_factory->signaling_thread());
  21. return PeerConnectionFactoryProxy::Create(pc_factory->signaling_thread(),
  22. pc_factory);
  23. }

—》PeerConnectionFactory::Create(std::move(dependencies));

PeerConnectionFactory::Create

  1. rtc::scoped_refptr<PeerConnectionFactory> PeerConnectionFactory::Create(
  2. PeerConnectionFactoryDependencies dependencies) {
  3. auto context = ConnectionContext::Create(&dependencies);
  4. if (!context) {
  5. return nullptr;
  6. }
  7. return new rtc::RefCountedObject<PeerConnectionFactory>(context,
  8. &dependencies);
  9. }

—》ConnectionContext::Create(&dependencies);

ConnectionContext::Create

  1. rtc::scoped_refptr<ConnectionContext> ConnectionContext::Create(
  2. PeerConnectionFactoryDependencies* dependencies) {
  3. auto context = new rtc::RefCountedObject<ConnectionContext>(dependencies);
  4. if (!context->channel_manager_->Init()) {
  5. return nullptr;
  6. }
  7. return context;
  8. }

—》ConnectionContext::ConnectionContext
创建好该对象实例后,会调用 ChannelManager::Init, 主要是做了
bool ChannelManager::Init() {

if (mediaengine) {
initialized = worker_thread->Invoke(
RTCFROM_HERE, [&] { return media_engine->Init(); });
RTCDCHECK(initialized);

}
就是判断媒体引擎是否已经创建好,如果已经创建好了,则会调用CompositeMediaEngine::Init -》WebRtcVoiceEngine::Init。

ConnectionContext::ConnectionContext

  1. ConnectionContext::ConnectionContext(
  2. PeerConnectionFactoryDependencies* dependencies)
  3. : network_thread_(MaybeStartThread(dependencies->network_thread,
  4. "pc_network_thread",
  5. true,
  6. owned_network_thread_)),
  7. worker_thread_(MaybeStartThread(dependencies->worker_thread,
  8. "pc_worker_thread",
  9. false,
  10. owned_worker_thread_)),
  11. signaling_thread_(MaybeWrapThread(dependencies->signaling_thread,
  12. wraps_current_thread_)),
  13. network_monitor_factory_(
  14. std::move(dependencies->network_monitor_factory)),
  15. call_factory_(std::move(dependencies->call_factory)),
  16. media_engine_(std::move(dependencies->media_engine)),
  17. sctp_factory_(
  18. MaybeCreateSctpFactory(std::move(dependencies->sctp_factory),
  19. network_thread())),
  20. trials_(dependencies->trials
  21. ? std::move(dependencies->trials)
  22. : std::make_unique<FieldTrialBasedConfig>()) {
  23. signaling_thread_->AllowInvokesToThread(worker_thread_);
  24. signaling_thread_->AllowInvokesToThread(network_thread_);
  25. worker_thread_->AllowInvokesToThread(network_thread_);
  26. network_thread_->DisallowAllInvokes();
  27. RTC_DCHECK_RUN_ON(signaling_thread_);
  28. rtc::InitRandom(rtc::Time32());
  29. // If network_monitor_factory_ is non-null, it will be used to create a
  30. // network monitor while on the network thread.
  31. default_network_manager_ = std::make_unique<rtc::BasicNetworkManager>(
  32. network_monitor_factory_.get());
  33. default_socket_factory_ =
  34. std::make_unique<rtc::BasicPacketSocketFactory>(network_thread());
  35. channel_manager_ = std::make_unique<cricket::ChannelManager>(
  36. std::move(media_engine_), std::make_unique<cricket::RtpDataEngine>(),
  37. worker_thread(), network_thread());
  38. channel_manager_->SetVideoRtxEnabled(true);
  39. // Set warning levels on the threads, to give warnings when response
  40. // may be slower than is expected of the thread.
  41. // Since some of the threads may be the same, start with the least
  42. // restrictive limits and end with the least permissive ones.
  43. // This will give warnings for all cases.
  44. signaling_thread_->SetDispatchWarningMs(100);
  45. worker_thread_->SetDispatchWarningMs(30);
  46. network_thread_->SetDispatchWarningMs(10);
  47. }

image.png