1414#include < mutex>
1515
1616#include < system_wrappers/include/clock.h>
17+ #include < system_wrappers/include/field_trial.h>
1718
1819namespace rtc_adapter {
1920
@@ -37,15 +38,26 @@ class RTCProcessThread {
3738 std::unique_ptr<webrtc::ProcessThread> m_processThread;
3839};
3940
40- static rtc::scoped_refptr<webrtc::SharedModuleThread> g_moduleThread =
41- webrtc::SharedModuleThread::Create (
42- webrtc::ProcessThread::Create (" ModuleProcessThread" ), nullptr);
41+ static rtc::scoped_refptr<webrtc::SharedModuleThread> g_moduleThread;
4342
44- static std::unique_ptr<RTCProcessThread> g_pacerThread
45- = std::make_unique<RTCProcessThread>(" PacerThread" );
43+ static std::unique_ptr<RTCProcessThread> g_pacerThread;
4644
47- static std::unique_ptr<webrtc::FieldTrialBasedConfig> g_fieldTrial=
48- std::make_unique<webrtc::FieldTrialBasedConfig>();
45+ static std::unique_ptr<webrtc::FieldTrialBasedConfig> g_fieldTrial= []()
46+ {
47+ auto config = std::make_unique<webrtc::FieldTrialBasedConfig>();
48+ // webrtc::field_trial::InitFieldTrialsFromString("WebRTC-TaskQueuePacer/Enabled/");
49+ return config;
50+ }();
51+
52+ static std::shared_ptr<webrtc::RtcEventLog> g_eventLog =
53+ std::make_shared<webrtc::RtcEventLogNull>();
54+
55+ static std::shared_ptr<webrtc::TaskQueueFactory> g_taskQueueFactory =
56+ createStaticTaskQueueFactory ();
57+ static std::shared_ptr<rtc::TaskQueue> g_taskQueue =
58+ std::make_shared<rtc::TaskQueue>(g_taskQueueFactory->CreateTaskQueue (
59+ " CallTaskQueue" ,
60+ webrtc::TaskQueueFactory::Priority::NORMAL));
4961
5062class RtcAdapterImpl : public RtcAdapter ,
5163 public CallOwner {
@@ -63,49 +75,65 @@ class RtcAdapterImpl : public RtcAdapter,
6375 AudioSendAdapter* createAudioSender (const Config&) override ;
6476 void destoryAudioSender (AudioSendAdapter*) override ;
6577
78+
79+ typedef std::shared_ptr<webrtc::Call> CallPtr;
80+
6681 // Implement CallOwner
67- std::shared_ptr<webrtc::Call> call () override { return m_call; }
82+ std::shared_ptr<webrtc::Call> call () override
83+ {
84+ return m_callPtr ? (*m_callPtr) : nullptr ;
85+ }
6886 std::shared_ptr<webrtc::TaskQueueFactory> taskQueueFactory () override
6987 {
70- return m_taskQueueFactory ;
88+ return g_taskQueueFactory ;
7189 }
72- std::shared_ptr<rtc::TaskQueue> taskQueue () override { return m_taskQueue ; }
73- std::shared_ptr<webrtc::RtcEventLog> eventLog () override { return m_eventLog ; }
90+ std::shared_ptr<rtc::TaskQueue> taskQueue () override { return g_taskQueue ; }
91+ std::shared_ptr<webrtc::RtcEventLog> eventLog () override { return g_eventLog ; }
7492
7593private:
7694 void initCall ();
7795
78- std::shared_ptr<webrtc::TaskQueueFactory> m_taskQueueFactory;
79- std::shared_ptr<rtc::TaskQueue> m_taskQueue;
80- std::shared_ptr<webrtc::RtcEventLog> m_eventLog;
81- std::shared_ptr<webrtc::Call> m_call;
96+ std::shared_ptr<CallPtr> m_callPtr;
8297};
8398
8499RtcAdapterImpl::RtcAdapterImpl ()
85- : m_taskQueueFactory(createStaticTaskQueueFactory())
86- , m_taskQueue(std::make_shared<rtc::TaskQueue>(m_taskQueueFactory->CreateTaskQueue (
87- " CallTaskQueue" ,
88- webrtc::TaskQueueFactory::Priority::NORMAL)))
89- , m_eventLog(std::make_shared<webrtc::RtcEventLogNull>())
90100{
91101}
92102
93103RtcAdapterImpl::~RtcAdapterImpl ()
94104{
105+ if (m_callPtr) {
106+ std::shared_ptr<CallPtr> pCallPtr = m_callPtr;
107+ m_callPtr.reset ();
108+ g_taskQueue->PostTask ([pCallPtr]() {
109+ if (*pCallPtr) {
110+ (*pCallPtr).reset ();
111+ }
112+ });
113+ }
95114}
96115
97116void RtcAdapterImpl::initCall ()
98117{
99- m_taskQueue->PostTask ([this ]() {
118+ m_callPtr.reset (new CallPtr ());
119+ std::shared_ptr<CallPtr> pCallPtr = m_callPtr;
120+ g_taskQueue->PostTask ([pCallPtr]() {
100121 // Initialize call
101- if (!m_call ) {
102- webrtc::Call::Config call_config (m_eventLog .get ());
103- call_config.task_queue_factory = m_taskQueueFactory .get ();
122+ if (!(*pCallPtr) ) {
123+ webrtc::Call::Config call_config (g_eventLog .get ());
124+ call_config.task_queue_factory = g_taskQueueFactory .get ();
104125 call_config.trials = g_fieldTrial.get ();
105126
127+ if (!g_moduleThread) {
128+ g_moduleThread = webrtc::SharedModuleThread::Create (
129+ webrtc::ProcessThread::Create (" ModuleProcessThread" ), nullptr );
130+ }
131+
132+ // Empty thread for pacer
106133 std::unique_ptr<webrtc::ProcessThread> pacerThreadProxy =
107- std::make_unique<ProcessThreadProxy>(g_pacerThread->unwrap ());
108- m_call.reset (webrtc::Call::Create (
134+ std::make_unique<ProcessThreadProxy>(nullptr );
135+
136+ (*pCallPtr).reset (webrtc::Call::Create (
109137 call_config, webrtc::Clock::GetRealTimeClock (),
110138 g_moduleThread,
111139 std::move (pacerThreadProxy)));
0 commit comments