Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(34)

Side by Side Diff: webrtc/call/call.cc

Issue 1403363003: Move VoiceEngineObserver into AudioSendStream so that we detect typing noises and return properly i… (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: missing file Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
11 #include <string.h> 11 #include <string.h>
12 12
13 #include <map> 13 #include <map>
14 #include <vector> 14 #include <vector>
15 15
16 #include "webrtc/audio/audio_receive_stream.h" 16 #include "webrtc/audio/audio_receive_stream.h"
17 #include "webrtc/audio/audio_send_stream.h" 17 #include "webrtc/audio/audio_send_stream.h"
18 #include "webrtc/audio/audio_state.h"
19 #include "webrtc/audio/scoped_voe_interface.h"
18 #include "webrtc/base/checks.h" 20 #include "webrtc/base/checks.h"
19 #include "webrtc/base/scoped_ptr.h" 21 #include "webrtc/base/scoped_ptr.h"
20 #include "webrtc/base/thread_annotations.h" 22 #include "webrtc/base/thread_annotations.h"
21 #include "webrtc/base/thread_checker.h" 23 #include "webrtc/base/thread_checker.h"
22 #include "webrtc/base/trace_event.h" 24 #include "webrtc/base/trace_event.h"
23 #include "webrtc/call.h" 25 #include "webrtc/call.h"
24 #include "webrtc/call/congestion_controller.h" 26 #include "webrtc/call/congestion_controller.h"
25 #include "webrtc/call/rtc_event_log.h" 27 #include "webrtc/call/rtc_event_log.h"
26 #include "webrtc/common.h" 28 #include "webrtc/common.h"
27 #include "webrtc/config.h" 29 #include "webrtc/config.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet, 89 DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet,
88 size_t length); 90 size_t length);
89 DeliveryStatus DeliverRtp(MediaType media_type, 91 DeliveryStatus DeliverRtp(MediaType media_type,
90 const uint8_t* packet, 92 const uint8_t* packet,
91 size_t length, 93 size_t length,
92 const PacketTime& packet_time); 94 const PacketTime& packet_time);
93 95
94 void ConfigureSync(const std::string& sync_group) 96 void ConfigureSync(const std::string& sync_group)
95 EXCLUSIVE_LOCKS_REQUIRED(receive_crit_); 97 EXCLUSIVE_LOCKS_REQUIRED(receive_crit_);
96 98
99 webrtc::internal::AudioState* audio_state() {
100 return static_cast<webrtc::internal::AudioState*>(
101 config_.audio_state.get());
102 }
103 VoiceEngine* voice_engine() {
104 if (!config_.audio_state.get())
105 return nullptr;
106 return audio_state()->voice_engine();
107 }
108
97 const int num_cpu_cores_; 109 const int num_cpu_cores_;
98 const rtc::scoped_ptr<ProcessThread> module_process_thread_; 110 const rtc::scoped_ptr<ProcessThread> module_process_thread_;
99 const rtc::scoped_ptr<CallStats> call_stats_; 111 const rtc::scoped_ptr<CallStats> call_stats_;
100 const rtc::scoped_ptr<CongestionController> congestion_controller_; 112 const rtc::scoped_ptr<CongestionController> congestion_controller_;
101 Call::Config config_; 113 Call::Config config_;
102 rtc::ThreadChecker configuration_thread_checker_; 114 rtc::ThreadChecker configuration_thread_checker_;
103 115
104 bool network_enabled_; 116 bool network_enabled_;
105 117
106 rtc::scoped_ptr<RWLockWrapper> receive_crit_; 118 rtc::scoped_ptr<RWLockWrapper> receive_crit_;
107 // Audio and Video receive streams are owned by the client that creates them. 119 // Audio and Video receive streams are owned by the client that creates them.
108 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ 120 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_
109 GUARDED_BY(receive_crit_); 121 GUARDED_BY(receive_crit_);
110 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ 122 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_
111 GUARDED_BY(receive_crit_); 123 GUARDED_BY(receive_crit_);
112 std::set<VideoReceiveStream*> video_receive_streams_ 124 std::set<VideoReceiveStream*> video_receive_streams_
113 GUARDED_BY(receive_crit_); 125 GUARDED_BY(receive_crit_);
114 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ 126 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_
115 GUARDED_BY(receive_crit_); 127 GUARDED_BY(receive_crit_);
116 128
117 rtc::scoped_ptr<RWLockWrapper> send_crit_; 129 rtc::scoped_ptr<RWLockWrapper> send_crit_;
118 // Audio and Video send streams are owned by the client that creates them. 130 // Audio and Video send streams are owned by the client that creates them.
119 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); 131 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_);
120 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); 132 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_);
121 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); 133 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_);
122 134
123 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; 135 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_;
124 136
125 RtcEventLog* event_log_ = nullptr; 137 RtcEventLog* event_log_ = nullptr;
126 VoECodec* voe_codec_ = nullptr;
127 138
128 RTC_DISALLOW_COPY_AND_ASSIGN(Call); 139 RTC_DISALLOW_COPY_AND_ASSIGN(Call);
129 }; 140 };
130 } // namespace internal 141 } // namespace internal
131 142
132 Call* Call::Create(const Call::Config& config) { 143 Call* Call::Create(const Call::Config& config) {
133 return new internal::Call(config); 144 return new internal::Call(config);
134 } 145 }
135 146
136 namespace internal { 147 namespace internal {
137 148
138 Call::Call(const Call::Config& config) 149 Call::Call(const Call::Config& config)
139 : num_cpu_cores_(CpuInfo::DetectNumberOfCores()), 150 : num_cpu_cores_(CpuInfo::DetectNumberOfCores()),
140 module_process_thread_(ProcessThread::Create("ModuleProcessThread")), 151 module_process_thread_(ProcessThread::Create("ModuleProcessThread")),
141 call_stats_(new CallStats()), 152 call_stats_(new CallStats()),
142 congestion_controller_(new CongestionController( 153 congestion_controller_(new CongestionController(
143 module_process_thread_.get(), call_stats_.get())), 154 module_process_thread_.get(), call_stats_.get())),
144 config_(config), 155 config_(config),
145 network_enabled_(true), 156 network_enabled_(true),
146 receive_crit_(RWLockWrapper::CreateRWLock()), 157 receive_crit_(RWLockWrapper::CreateRWLock()),
147 send_crit_(RWLockWrapper::CreateRWLock()) { 158 send_crit_(RWLockWrapper::CreateRWLock()) {
148 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0); 159 RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0);
149 RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps, 160 RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps,
150 config.bitrate_config.min_bitrate_bps); 161 config.bitrate_config.min_bitrate_bps);
151 if (config.bitrate_config.max_bitrate_bps != -1) { 162 if (config.bitrate_config.max_bitrate_bps != -1) {
152 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps, 163 RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps,
153 config.bitrate_config.start_bitrate_bps); 164 config.bitrate_config.start_bitrate_bps);
154 } 165 }
155 if (config.voice_engine) { 166 if (config.audio_state.get()) {
156 // Keep a reference to VoECodec, so we're sure the VoiceEngine lives for the 167 ScopedVoEInterface<VoECodec> voe_codec(voice_engine());
157 // duration of the call. 168 event_log_ = voe_codec->GetEventLog();
158 voe_codec_ = VoECodec::GetInterface(config.voice_engine);
159 if (voe_codec_)
160 event_log_ = voe_codec_->GetEventLog();
161 } 169 }
162 170
163 Trace::CreateTrace(); 171 Trace::CreateTrace();
164 module_process_thread_->Start(); 172 module_process_thread_->Start();
165 module_process_thread_->RegisterModule(call_stats_.get()); 173 module_process_thread_->RegisterModule(call_stats_.get());
166 174
167 congestion_controller_->SetBweBitrates( 175 congestion_controller_->SetBweBitrates(
168 config_.bitrate_config.min_bitrate_bps, 176 config_.bitrate_config.min_bitrate_bps,
169 config_.bitrate_config.start_bitrate_bps, 177 config_.bitrate_config.start_bitrate_bps,
170 config_.bitrate_config.max_bitrate_bps); 178 config_.bitrate_config.max_bitrate_bps);
171 } 179 }
172 180
173 Call::~Call() { 181 Call::~Call() {
174 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 182 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
175 RTC_CHECK(audio_send_ssrcs_.empty()); 183 RTC_CHECK(audio_send_ssrcs_.empty());
176 RTC_CHECK(video_send_ssrcs_.empty()); 184 RTC_CHECK(video_send_ssrcs_.empty());
177 RTC_CHECK(video_send_streams_.empty()); 185 RTC_CHECK(video_send_streams_.empty());
178 RTC_CHECK(audio_receive_ssrcs_.empty()); 186 RTC_CHECK(audio_receive_ssrcs_.empty());
179 RTC_CHECK(video_receive_ssrcs_.empty()); 187 RTC_CHECK(video_receive_ssrcs_.empty());
180 RTC_CHECK(video_receive_streams_.empty()); 188 RTC_CHECK(video_receive_streams_.empty());
181 189
182 module_process_thread_->DeRegisterModule(call_stats_.get()); 190 module_process_thread_->DeRegisterModule(call_stats_.get());
183 module_process_thread_->Stop(); 191 module_process_thread_->Stop();
184 Trace::ReturnTrace(); 192 Trace::ReturnTrace();
185
186 if (voe_codec_)
187 voe_codec_->Release();
188 } 193 }
189 194
190 PacketReceiver* Call::Receiver() { 195 PacketReceiver* Call::Receiver() {
191 // 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
192 // thread. Re-enable once that is fixed. 197 // thread. Re-enable once that is fixed.
193 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 198 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
194 return this; 199 return this;
195 } 200 }
196 201
197 webrtc::AudioSendStream* Call::CreateAudioSendStream( 202 webrtc::AudioSendStream* Call::CreateAudioSendStream(
198 const webrtc::AudioSendStream::Config& config) { 203 const webrtc::AudioSendStream::Config& config) {
199 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); 204 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream");
200 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 205 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
201 AudioSendStream* send_stream = 206 AudioSendStream* send_stream = new AudioSendStream(config, audio_state());
202 new AudioSendStream(config, config_.voice_engine);
203 if (!network_enabled_) 207 if (!network_enabled_)
204 send_stream->SignalNetworkState(kNetworkDown); 208 send_stream->SignalNetworkState(kNetworkDown);
205 { 209 {
206 WriteLockScoped write_lock(*send_crit_); 210 WriteLockScoped write_lock(*send_crit_);
207 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == 211 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) ==
208 audio_send_ssrcs_.end()); 212 audio_send_ssrcs_.end());
209 audio_send_ssrcs_[config.rtp.ssrc] = send_stream; 213 audio_send_ssrcs_[config.rtp.ssrc] = send_stream;
210 } 214 }
211 return send_stream; 215 return send_stream;
212 } 216 }
(...skipping 15 matching lines...) Expand all
228 } 232 }
229 delete audio_send_stream; 233 delete audio_send_stream;
230 } 234 }
231 235
232 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( 236 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream(
233 const webrtc::AudioReceiveStream::Config& config) { 237 const webrtc::AudioReceiveStream::Config& config) {
234 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); 238 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream");
235 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 239 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
236 AudioReceiveStream* receive_stream = new AudioReceiveStream( 240 AudioReceiveStream* receive_stream = new AudioReceiveStream(
237 congestion_controller_->GetRemoteBitrateEstimator(false), config, 241 congestion_controller_->GetRemoteBitrateEstimator(false), config,
238 config_.voice_engine); 242 audio_state());
239 { 243 {
240 WriteLockScoped write_lock(*receive_crit_); 244 WriteLockScoped write_lock(*receive_crit_);
241 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == 245 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) ==
242 audio_receive_ssrcs_.end()); 246 audio_receive_ssrcs_.end());
243 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; 247 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream;
244 ConfigureSync(config.sync_group); 248 ConfigureSync(config.sync_group);
245 } 249 }
246 return receive_stream; 250 return receive_stream;
247 } 251 }
248 252
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 335
332 delete send_stream_impl; 336 delete send_stream_impl;
333 } 337 }
334 338
335 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream( 339 webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream(
336 const webrtc::VideoReceiveStream::Config& config) { 340 const webrtc::VideoReceiveStream::Config& config) {
337 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream"); 341 TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream");
338 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 342 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
339 VideoReceiveStream* receive_stream = new VideoReceiveStream( 343 VideoReceiveStream* receive_stream = new VideoReceiveStream(
340 num_cpu_cores_, congestion_controller_.get(), config, 344 num_cpu_cores_, congestion_controller_.get(), config,
341 config_.voice_engine, module_process_thread_.get(), call_stats_.get()); 345 voice_engine(), module_process_thread_.get(), call_stats_.get());
342 346
343 WriteLockScoped write_lock(*receive_crit_); 347 WriteLockScoped write_lock(*receive_crit_);
344 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == 348 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) ==
345 video_receive_ssrcs_.end()); 349 video_receive_ssrcs_.end());
346 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; 350 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream;
347 // TODO(pbos): Configure different RTX payloads per receive payload. 351 // TODO(pbos): Configure different RTX payloads per receive payload.
348 VideoReceiveStream::Config::Rtp::RtxMap::const_iterator it = 352 VideoReceiveStream::Config::Rtp::RtxMap::const_iterator it =
349 config.rtp.rtx.begin(); 353 config.rtp.rtx.begin();
350 if (it != config.rtp.rtx.end()) 354 if (it != config.rtp.rtx.end())
351 video_receive_ssrcs_[it->second.ssrc] = receive_stream; 355 video_receive_ssrcs_[it->second.ssrc] = receive_stream;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 } 465 }
462 } 466 }
463 } 467 }
464 468
465 void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { 469 void Call::OnSentPacket(const rtc::SentPacket& sent_packet) {
466 congestion_controller_->OnSentPacket(sent_packet); 470 congestion_controller_->OnSentPacket(sent_packet);
467 } 471 }
468 472
469 void Call::ConfigureSync(const std::string& sync_group) { 473 void Call::ConfigureSync(const std::string& sync_group) {
470 // Set sync only if there was no previous one. 474 // Set sync only if there was no previous one.
471 if (config_.voice_engine == nullptr || sync_group.empty()) 475 if (voice_engine() == nullptr || sync_group.empty())
472 return; 476 return;
473 477
474 AudioReceiveStream* sync_audio_stream = nullptr; 478 AudioReceiveStream* sync_audio_stream = nullptr;
475 // Find existing audio stream. 479 // Find existing audio stream.
476 const auto it = sync_stream_mapping_.find(sync_group); 480 const auto it = sync_stream_mapping_.find(sync_group);
477 if (it != sync_stream_mapping_.end()) { 481 if (it != sync_stream_mapping_.end()) {
478 sync_audio_stream = it->second; 482 sync_audio_stream = it->second;
479 } else { 483 } else {
480 // No configured audio stream, see if we can find one. 484 // No configured audio stream, see if we can find one.
481 for (const auto& kv : audio_receive_ssrcs_) { 485 for (const auto& kv : audio_receive_ssrcs_) {
(...skipping 17 matching lines...) Expand all
499 ++num_synced_streams; 503 ++num_synced_streams;
500 if (num_synced_streams > 1) { 504 if (num_synced_streams > 1) {
501 // TODO(pbos): Support synchronizing more than one A/V pair. 505 // TODO(pbos): Support synchronizing more than one A/V pair.
502 // https://code.google.com/p/webrtc/issues/detail?id=4762 506 // https://code.google.com/p/webrtc/issues/detail?id=4762
503 LOG(LS_WARNING) << "Attempting to sync more than one audio/video pair " 507 LOG(LS_WARNING) << "Attempting to sync more than one audio/video pair "
504 "within the same sync group. This is not supported in " 508 "within the same sync group. This is not supported in "
505 "the current implementation."; 509 "the current implementation.";
506 } 510 }
507 // Only sync the first A/V pair within this sync group. 511 // Only sync the first A/V pair within this sync group.
508 if (sync_audio_stream != nullptr && num_synced_streams == 1) { 512 if (sync_audio_stream != nullptr && num_synced_streams == 1) {
509 video_stream->SetSyncChannel(config_.voice_engine, 513 video_stream->SetSyncChannel(voice_engine(),
510 sync_audio_stream->config().voe_channel_id); 514 sync_audio_stream->config().voe_channel_id);
511 } else { 515 } else {
512 video_stream->SetSyncChannel(config_.voice_engine, -1); 516 video_stream->SetSyncChannel(voice_engine(), -1);
513 } 517 }
514 } 518 }
515 } 519 }
516 520
517 PacketReceiver::DeliveryStatus Call::DeliverRtcp(MediaType media_type, 521 PacketReceiver::DeliveryStatus Call::DeliverRtcp(MediaType media_type,
518 const uint8_t* packet, 522 const uint8_t* packet,
519 size_t length) { 523 size_t length) {
520 // TODO(pbos): Figure out what channel needs it actually. 524 // TODO(pbos): Figure out what channel needs it actually.
521 // Do NOT broadcast! Also make sure it's a valid packet. 525 // Do NOT broadcast! Also make sure it's a valid packet.
522 // Return DELIVERY_UNKNOWN_SSRC if it can be determined that 526 // Return DELIVERY_UNKNOWN_SSRC if it can be determined that
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 // thread. Then this check can be enabled. 595 // thread. Then this check can be enabled.
592 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread()); 596 // RTC_DCHECK(!configuration_thread_checker_.CalledOnValidThread());
593 if (RtpHeaderParser::IsRtcp(packet, length)) 597 if (RtpHeaderParser::IsRtcp(packet, length))
594 return DeliverRtcp(media_type, packet, length); 598 return DeliverRtcp(media_type, packet, length);
595 599
596 return DeliverRtp(media_type, packet, length, packet_time); 600 return DeliverRtp(media_type, packet, length, packet_time);
597 } 601 }
598 602
599 } // namespace internal 603 } // namespace internal
600 } // namespace webrtc 604 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698