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,10 +38,26 @@ class RTCProcessThread {
3738 std::unique_ptr<webrtc::ProcessThread> m_processThread;
3839};
3940
40- static std::unique_ptr<RTCProcessThread> g_moduleThread
41- = std::make_unique<RTCProcessThread>(" ModuleProcessThread" );
42- static std::unique_ptr<RTCProcessThread> g_pacerThread
43- = std::make_unique<RTCProcessThread>(" PacerThread" );
41+ static rtc::scoped_refptr<webrtc::SharedModuleThread> g_moduleThread;
42+
43+ static std::unique_ptr<RTCProcessThread> g_pacerThread;
44+
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));
4461
4562class RtcAdapterImpl : public RtcAdapter ,
4663 public CallOwner {
@@ -58,52 +75,67 @@ class RtcAdapterImpl : public RtcAdapter,
5875 AudioSendAdapter* createAudioSender (const Config&) override ;
5976 void destoryAudioSender (AudioSendAdapter*) override ;
6077
78+
79+ typedef std::shared_ptr<webrtc::Call> CallPtr;
80+
6181 // Implement CallOwner
62- 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+ }
6386 std::shared_ptr<webrtc::TaskQueueFactory> taskQueueFactory () override
6487 {
65- return m_taskQueueFactory ;
88+ return g_taskQueueFactory ;
6689 }
67- std::shared_ptr<rtc::TaskQueue> taskQueue () override { return m_taskQueue ; }
68- 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 ; }
6992
7093private:
7194 void initCall ();
7295
73- std::shared_ptr<webrtc::TaskQueueFactory> m_taskQueueFactory;
74- std::shared_ptr<rtc::TaskQueue> m_taskQueue;
75- std::shared_ptr<webrtc::RtcEventLog> m_eventLog;
76- std::shared_ptr<webrtc::Call> m_call;
96+ std::shared_ptr<CallPtr> m_callPtr;
7797};
7898
7999RtcAdapterImpl::RtcAdapterImpl ()
80- : m_taskQueueFactory(createStaticTaskQueueFactory())
81- , m_taskQueue(std::make_shared<rtc::TaskQueue>(m_taskQueueFactory->CreateTaskQueue (
82- " CallTaskQueue" ,
83- webrtc::TaskQueueFactory::Priority::NORMAL)))
84- , m_eventLog(std::make_shared<webrtc::RtcEventLogNull>())
85100{
86101}
87102
88103RtcAdapterImpl::~RtcAdapterImpl ()
89104{
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+ }
90114}
91115
92116void RtcAdapterImpl::initCall ()
93117{
94- m_taskQueue->PostTask ([this ]() {
118+ m_callPtr.reset (new CallPtr ());
119+ std::shared_ptr<CallPtr> pCallPtr = m_callPtr;
120+ g_taskQueue->PostTask ([pCallPtr]() {
95121 // Initialize call
96- if (!m_call) {
97- webrtc::Call::Config call_config (m_eventLog.get ());
98- 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 ();
125+ call_config.trials = g_fieldTrial.get ();
126+
127+ if (!g_moduleThread) {
128+ g_moduleThread = webrtc::SharedModuleThread::Create (
129+ webrtc::ProcessThread::Create (" ModuleProcessThread" ), nullptr );
130+ }
99131
100- std::unique_ptr<webrtc::ProcessThread> moduleThreadProxy =
101- std::make_unique<ProcessThreadProxy>(g_moduleThread->unwrap ());
132+ // Empty thread for pacer
102133 std::unique_ptr<webrtc::ProcessThread> pacerThreadProxy =
103- std::make_unique<ProcessThreadProxy>(g_pacerThread->unwrap ());
104- m_call.reset (webrtc::Call::Create (
134+ std::make_unique<ProcessThreadProxy>(nullptr );
135+
136+ (*pCallPtr).reset (webrtc::Call::Create (
105137 call_config, webrtc::Clock::GetRealTimeClock (),
106- std::move (moduleThreadProxy) ,
138+ g_moduleThread ,
107139 std::move (pacerThreadProxy)));
108140 }
109141 });
0 commit comments