OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 GUARDED_BY(receive_crit_); | 119 GUARDED_BY(receive_crit_); |
120 | 120 |
121 rtc::scoped_ptr<RWLockWrapper> send_crit_; | 121 rtc::scoped_ptr<RWLockWrapper> send_crit_; |
122 // Audio and Video send streams are owned by the client that creates them. | 122 // Audio and Video send streams are owned by the client that creates them. |
123 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); | 123 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); |
124 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); | 124 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); |
125 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); | 125 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); |
126 | 126 |
127 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; | 127 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; |
128 | 128 |
129 RtcEventLog* event_log_; | 129 RtcEventLog* event_log_ = nullptr; |
| 130 VoECodec* voe_codec_ = nullptr; |
130 | 131 |
131 RTC_DISALLOW_COPY_AND_ASSIGN(Call); | 132 RTC_DISALLOW_COPY_AND_ASSIGN(Call); |
132 }; | 133 }; |
133 } // namespace internal | 134 } // namespace internal |
134 | 135 |
135 Call* Call::Create(const Call::Config& config) { | 136 Call* Call::Create(const Call::Config& config) { |
136 return new internal::Call(config); | 137 return new internal::Call(config); |
137 } | 138 } |
138 | 139 |
139 namespace internal { | 140 namespace internal { |
140 | 141 |
141 Call::Call(const Call::Config& config) | 142 Call::Call(const Call::Config& config) |
142 : num_cpu_cores_(CpuInfo::DetectNumberOfCores()), | 143 : num_cpu_cores_(CpuInfo::DetectNumberOfCores()), |
143 module_process_thread_(ProcessThread::Create("ModuleProcessThread")), | 144 module_process_thread_(ProcessThread::Create("ModuleProcessThread")), |
144 call_stats_(new CallStats()), | 145 call_stats_(new CallStats()), |
145 congestion_controller_(new CongestionController( | 146 congestion_controller_(new CongestionController( |
146 module_process_thread_.get(), call_stats_.get())), | 147 module_process_thread_.get(), call_stats_.get())), |
147 config_(config), | 148 config_(config), |
148 network_enabled_(true), | 149 network_enabled_(true), |
149 receive_crit_(RWLockWrapper::CreateRWLock()), | 150 receive_crit_(RWLockWrapper::CreateRWLock()), |
150 send_crit_(RWLockWrapper::CreateRWLock()), | 151 send_crit_(RWLockWrapper::CreateRWLock()) { |
151 event_log_(nullptr) { | |
152 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 152 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
153 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); | 153 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); |
154 RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps, | 154 RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps, |
155 config.bitrate_config.min_bitrate_bps); | 155 config.bitrate_config.min_bitrate_bps); |
156 if (config.bitrate_config.max_bitrate_bps != -1) { | 156 if (config.bitrate_config.max_bitrate_bps != -1) { |
157 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps, | 157 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps, |
158 config.bitrate_config.start_bitrate_bps); | 158 config.bitrate_config.start_bitrate_bps); |
159 } | 159 } |
160 if (config.voice_engine) { | 160 if (config.voice_engine) { |
161 VoECodec* voe_codec = VoECodec::GetInterface(config.voice_engine); | 161 // Keep a reference to VoECodec, so we're sure the VoiceEngine lives for the |
162 if (voe_codec) { | 162 // duration of the call. |
163 event_log_ = voe_codec->GetEventLog(); | 163 voe_codec_ = VoECodec::GetInterface(config.voice_engine); |
164 voe_codec->Release(); | 164 if (voe_codec_) |
165 } | 165 event_log_ = voe_codec_->GetEventLog(); |
166 } | 166 } |
167 | 167 |
168 Trace::CreateTrace(); | 168 Trace::CreateTrace(); |
169 module_process_thread_->Start(); | 169 module_process_thread_->Start(); |
170 module_process_thread_->RegisterModule(call_stats_.get()); | 170 module_process_thread_->RegisterModule(call_stats_.get()); |
171 | 171 |
172 congestion_controller_->SetBweBitrates( | 172 congestion_controller_->SetBweBitrates( |
173 config_.bitrate_config.min_bitrate_bps, | 173 config_.bitrate_config.min_bitrate_bps, |
174 config_.bitrate_config.start_bitrate_bps, | 174 config_.bitrate_config.start_bitrate_bps, |
175 config_.bitrate_config.max_bitrate_bps); | 175 config_.bitrate_config.max_bitrate_bps); |
176 } | 176 } |
177 | 177 |
178 Call::~Call() { | 178 Call::~Call() { |
179 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 179 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
180 RTC_CHECK(audio_send_ssrcs_.empty()); | 180 RTC_CHECK(audio_send_ssrcs_.empty()); |
181 RTC_CHECK(video_send_ssrcs_.empty()); | 181 RTC_CHECK(video_send_ssrcs_.empty()); |
182 RTC_CHECK(video_send_streams_.empty()); | 182 RTC_CHECK(video_send_streams_.empty()); |
183 RTC_CHECK(audio_receive_ssrcs_.empty()); | 183 RTC_CHECK(audio_receive_ssrcs_.empty()); |
184 RTC_CHECK(video_receive_ssrcs_.empty()); | 184 RTC_CHECK(video_receive_ssrcs_.empty()); |
185 RTC_CHECK(video_receive_streams_.empty()); | 185 RTC_CHECK(video_receive_streams_.empty()); |
186 | 186 |
187 module_process_thread_->DeRegisterModule(call_stats_.get()); | 187 module_process_thread_->DeRegisterModule(call_stats_.get()); |
188 module_process_thread_->Stop(); | 188 module_process_thread_->Stop(); |
189 Trace::ReturnTrace(); | 189 Trace::ReturnTrace(); |
| 190 |
| 191 if (voe_codec_) |
| 192 voe_codec_->Release(); |
190 } | 193 } |
191 | 194 |
192 PacketReceiver* Call::Receiver() { | 195 PacketReceiver* Call::Receiver() { |
193 // TODO(solenberg): Some test cases in EndToEndTest use this from a different | 196 // TODO(solenberg): Some test cases in EndToEndTest use this from a different |
194 // thread. Re-enable once that is fixed. | 197 // thread. Re-enable once that is fixed. |
195 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 198 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
196 return this; | 199 return this; |
197 } | 200 } |
198 | 201 |
199 webrtc::AudioSendStream* Call::CreateAudioSendStream( | 202 webrtc::AudioSendStream* Call::CreateAudioSendStream( |
(...skipping 30 matching lines...) Expand all Loading... |
230 RTC_DCHECK(num_deleted == 1); | 233 RTC_DCHECK(num_deleted == 1); |
231 } | 234 } |
232 delete audio_send_stream; | 235 delete audio_send_stream; |
233 } | 236 } |
234 | 237 |
235 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( | 238 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( |
236 const webrtc::AudioReceiveStream::Config& config) { | 239 const webrtc::AudioReceiveStream::Config& config) { |
237 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); | 240 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); |
238 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 241 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
239 AudioReceiveStream* receive_stream = new AudioReceiveStream( | 242 AudioReceiveStream* receive_stream = new AudioReceiveStream( |
240 congestion_controller_->GetRemoteBitrateEstimator(false), config); | 243 congestion_controller_->GetRemoteBitrateEstimator(false), config, |
| 244 config_.voice_engine); |
241 { | 245 { |
242 WriteLockScoped write_lock(*receive_crit_); | 246 WriteLockScoped write_lock(*receive_crit_); |
243 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 247 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
244 audio_receive_ssrcs_.end()); | 248 audio_receive_ssrcs_.end()); |
245 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 249 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
246 ConfigureSync(config.sync_group); | 250 ConfigureSync(config.sync_group); |
247 } | 251 } |
248 return receive_stream; | 252 return receive_stream; |
249 } | 253 } |
250 | 254 |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 // thread. Then this check can be enabled. | 606 // thread. Then this check can be enabled. |
603 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread()); | 607 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread()); |
604 if (RtpHeaderParser::IsRtcp(packet, length)) | 608 if (RtpHeaderParser::IsRtcp(packet, length)) |
605 return DeliverRtcp(media_type, packet, length); | 609 return DeliverRtcp(media_type, packet, length); |
606 | 610 |
607 return DeliverRtp(media_type, packet, length, packet_time); | 611 return DeliverRtp(media_type, packet, length, packet_time); |
608 } | 612 } |
609 | 613 |
610 } // namespace internal | 614 } // namespace internal |
611 } // namespace webrtc | 615 } // namespace webrtc |
OLD | NEW |