14
14
#include < mutex>
15
15
16
16
#include < system_wrappers/include/clock.h>
17
+ #include < system_wrappers/include/field_trial.h>
17
18
18
19
namespace rtc_adapter {
19
20
@@ -37,15 +38,26 @@ class RTCProcessThread {
37
38
std::unique_ptr<webrtc::ProcessThread> m_processThread;
38
39
};
39
40
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;
43
42
44
- static std::unique_ptr<RTCProcessThread> g_pacerThread
45
- = std::make_unique<RTCProcessThread>(" PacerThread" );
43
+ static std::unique_ptr<RTCProcessThread> g_pacerThread;
46
44
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));
49
61
50
62
class RtcAdapterImpl : public RtcAdapter ,
51
63
public CallOwner {
@@ -63,49 +75,65 @@ class RtcAdapterImpl : public RtcAdapter,
63
75
AudioSendAdapter* createAudioSender (const Config&) override ;
64
76
void destoryAudioSender (AudioSendAdapter*) override ;
65
77
78
+
79
+ typedef std::shared_ptr<webrtc::Call> CallPtr;
80
+
66
81
// 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
+ }
68
86
std::shared_ptr<webrtc::TaskQueueFactory> taskQueueFactory () override
69
87
{
70
- return m_taskQueueFactory ;
88
+ return g_taskQueueFactory ;
71
89
}
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 ; }
74
92
75
93
private:
76
94
void initCall ();
77
95
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;
82
97
};
83
98
84
99
RtcAdapterImpl::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>())
90
100
{
91
101
}
92
102
93
103
RtcAdapterImpl::~RtcAdapterImpl ()
94
104
{
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
+ }
95
114
}
96
115
97
116
void RtcAdapterImpl::initCall ()
98
117
{
99
- m_taskQueue->PostTask ([this ]() {
118
+ m_callPtr.reset (new CallPtr ());
119
+ std::shared_ptr<CallPtr> pCallPtr = m_callPtr;
120
+ g_taskQueue->PostTask ([pCallPtr]() {
100
121
// 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 ();
104
125
call_config.trials = g_fieldTrial.get ();
105
126
127
+ if (!g_moduleThread) {
128
+ g_moduleThread = webrtc::SharedModuleThread::Create (
129
+ webrtc::ProcessThread::Create (" ModuleProcessThread" ), nullptr );
130
+ }
131
+
132
+ // Empty thread for pacer
106
133
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 (
109
137
call_config, webrtc::Clock::GetRealTimeClock (),
110
138
g_moduleThread,
111
139
std::move (pacerThreadProxy)));
0 commit comments