| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 | 130 |
| 131 const CodecInst kEmptyCodecInst = {-1, "noCodecRegistered", 0, 0, 0, 0}; | 131 const CodecInst kEmptyCodecInst = {-1, "noCodecRegistered", 0, 0, 0, 0}; |
| 132 } // namespace | 132 } // namespace |
| 133 | 133 |
| 134 CodecManager::CodecManager() | 134 CodecManager::CodecManager() |
| 135 : cng_nb_pltype_(255), | 135 : cng_nb_pltype_(255), |
| 136 cng_wb_pltype_(255), | 136 cng_wb_pltype_(255), |
| 137 cng_swb_pltype_(255), | 137 cng_swb_pltype_(255), |
| 138 cng_fb_pltype_(255), | 138 cng_fb_pltype_(255), |
| 139 red_nb_pltype_(255), | 139 red_nb_pltype_(255), |
| 140 stereo_send_(false), | |
| 141 dtx_enabled_(false), | 140 dtx_enabled_(false), |
| 142 vad_mode_(VADNormal), | 141 vad_mode_(VADNormal), |
| 143 send_codec_inst_(kEmptyCodecInst), | 142 send_codec_inst_(kEmptyCodecInst), |
| 144 red_enabled_(false), | 143 red_enabled_(false), |
| 145 codec_fec_enabled_(false), | 144 codec_fec_enabled_(false), |
| 146 encoder_is_opus_(false) { | 145 encoder_is_opus_(false) { |
| 147 // Register the default payload type for RED and for CNG at sampling rates of | 146 // Register the default payload type for RED and for CNG at sampling rates of |
| 148 // 8, 16, 32 and 48 kHz. | 147 // 8, 16, 32 and 48 kHz. |
| 149 for (const CodecInst& ci : RentACodec::Database()) { | 148 for (const CodecInst& ci : RentACodec::Database()) { |
| 150 if (IsCodecRED(ci) && ci.plfreq == 8000) { | 149 if (IsCodecRED(ci) && ci.plfreq == 8000) { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 default: { | 223 default: { |
| 225 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, | 224 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, |
| 226 "RegisterSendCodec() failed, invalid frequency for CNG " | 225 "RegisterSendCodec() failed, invalid frequency for CNG " |
| 227 "registration"); | 226 "registration"); |
| 228 return -1; | 227 return -1; |
| 229 } | 228 } |
| 230 } | 229 } |
| 231 } | 230 } |
| 232 | 231 |
| 233 // Set Stereo, and make sure VAD and DTX is turned off. | 232 // Set Stereo, and make sure VAD and DTX is turned off. |
| 234 if (send_codec.channels == 2) { | 233 if (send_codec.channels != 1) { |
| 235 stereo_send_ = true; | |
| 236 if (dtx_enabled_) { | 234 if (dtx_enabled_) { |
| 237 WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, dummy_id, | 235 WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, dummy_id, |
| 238 "VAD/DTX is turned off, not supported when sending stereo."); | 236 "VAD/DTX is turned off, not supported when sending stereo."); |
| 239 } | 237 } |
| 240 dtx_enabled_ = false; | 238 dtx_enabled_ = false; |
| 241 } else { | |
| 242 stereo_send_ = false; | |
| 243 } | 239 } |
| 244 | 240 |
| 245 // Check if the codec is already registered as send codec. | 241 // Check if the codec is already registered as send codec. |
| 246 bool new_codec = true; | 242 bool new_codec = true; |
| 247 if (codec_owner_.Encoder()) { | 243 if (codec_owner_.Encoder()) { |
| 248 auto new_codec_id = RentACodec::CodecIdByInst(send_codec_inst_); | 244 auto new_codec_id = RentACodec::CodecIdByInst(send_codec_inst_); |
| 249 RTC_DCHECK(new_codec_id); | 245 RTC_DCHECK(new_codec_id); |
| 250 auto old_codec_id = RentACodec::CodecIdFromIndex(codec_id); | 246 auto old_codec_id = RentACodec::CodecIdFromIndex(codec_id); |
| 251 new_codec = !old_codec_id || *new_codec_id != *old_codec_id; | 247 new_codec = !old_codec_id || *new_codec_id != *old_codec_id; |
| 252 } | 248 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 send_codec_inst_.plfreq = external_speech_encoder->SampleRateHz(); | 310 send_codec_inst_.plfreq = external_speech_encoder->SampleRateHz(); |
| 315 send_codec_inst_.pacsize = rtc::CheckedDivExact( | 311 send_codec_inst_.pacsize = rtc::CheckedDivExact( |
| 316 static_cast<int>(external_speech_encoder->Max10MsFramesInAPacket() * | 312 static_cast<int>(external_speech_encoder->Max10MsFramesInAPacket() * |
| 317 send_codec_inst_.plfreq), | 313 send_codec_inst_.plfreq), |
| 318 100); | 314 100); |
| 319 send_codec_inst_.pltype = -1; // Not valid. | 315 send_codec_inst_.pltype = -1; // Not valid. |
| 320 send_codec_inst_.rate = -1; // Not valid. | 316 send_codec_inst_.rate = -1; // Not valid. |
| 321 static const char kName[] = "external"; | 317 static const char kName[] = "external"; |
| 322 memcpy(send_codec_inst_.plname, kName, sizeof(kName)); | 318 memcpy(send_codec_inst_.plname, kName, sizeof(kName)); |
| 323 | 319 |
| 324 if (stereo_send_) | 320 if (send_codec_inst_.channels != 1) |
| 325 dtx_enabled_ = false; | 321 dtx_enabled_ = false; |
| 326 codec_fec_enabled_ = | 322 codec_fec_enabled_ = |
| 327 codec_fec_enabled_ && codec_owner_.Encoder()->SetFec(codec_fec_enabled_); | 323 codec_fec_enabled_ && codec_owner_.Encoder()->SetFec(codec_fec_enabled_); |
| 328 int cng_pt = dtx_enabled_ | 324 int cng_pt = dtx_enabled_ |
| 329 ? CngPayloadType(external_speech_encoder->SampleRateHz()) | 325 ? CngPayloadType(external_speech_encoder->SampleRateHz()) |
| 330 : -1; | 326 : -1; |
| 331 int red_pt = red_enabled_ ? RedPayloadType(send_codec_inst_.plfreq) : -1; | 327 int red_pt = red_enabled_ ? RedPayloadType(send_codec_inst_.plfreq) : -1; |
| 332 codec_owner_.SetEncoders(external_speech_encoder, cng_pt, vad_mode_, red_pt); | 328 codec_owner_.SetEncoders(external_speech_encoder, cng_pt, vad_mode_, red_pt); |
| 333 } | 329 } |
| 334 | 330 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 return true; | 363 return true; |
| 368 } | 364 } |
| 369 | 365 |
| 370 int CodecManager::SetVAD(bool enable, ACMVADMode mode) { | 366 int CodecManager::SetVAD(bool enable, ACMVADMode mode) { |
| 371 // Sanity check of the mode. | 367 // Sanity check of the mode. |
| 372 RTC_DCHECK(mode == VADNormal || mode == VADLowBitrate || mode == VADAggr || | 368 RTC_DCHECK(mode == VADNormal || mode == VADLowBitrate || mode == VADAggr || |
| 373 mode == VADVeryAggr); | 369 mode == VADVeryAggr); |
| 374 | 370 |
| 375 // Check that the send codec is mono. We don't support VAD/DTX for stereo | 371 // Check that the send codec is mono. We don't support VAD/DTX for stereo |
| 376 // sending. | 372 // sending. |
| 377 if (enable && stereo_send_) { | 373 const auto* enc = codec_owner_.Encoder(); |
| 374 const bool stereo_send = enc ? (enc->NumChannels() != 1) : false; |
| 375 if (enable && stereo_send) { |
| 378 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, 0, | 376 WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, 0, |
| 379 "VAD/DTX not supported for stereo sending"); | 377 "VAD/DTX not supported for stereo sending"); |
| 380 dtx_enabled_ = false; | 378 dtx_enabled_ = false; |
| 381 return -1; | 379 return -1; |
| 382 } | 380 } |
| 383 | 381 |
| 384 // If a send codec is registered, set VAD/DTX for the codec. | 382 // If a send codec is registered, set VAD/DTX for the codec. |
| 385 if (IsOpus(send_codec_inst_)) { | 383 if (IsOpus(send_codec_inst_)) { |
| 386 // VAD/DTX not supported. | 384 // VAD/DTX not supported. |
| 387 dtx_enabled_ = false; | 385 dtx_enabled_ = false; |
| 388 return 0; | 386 return 0; |
| 389 } | 387 } |
| 390 | 388 |
| 391 if (dtx_enabled_ != enable || vad_mode_ != mode) { | 389 if (dtx_enabled_ != enable || vad_mode_ != mode) { |
| 392 dtx_enabled_ = enable; | 390 dtx_enabled_ = enable; |
| 393 vad_mode_ = mode; | 391 vad_mode_ = mode; |
| 394 if (codec_owner_.Encoder()) { | 392 if (enc) { |
| 395 int cng_pt = dtx_enabled_ ? CngPayloadType(send_codec_inst_.plfreq) : -1; | 393 int cng_pt = dtx_enabled_ ? CngPayloadType(send_codec_inst_.plfreq) : -1; |
| 396 int red_pt = red_enabled_ ? RedPayloadType(send_codec_inst_.plfreq) : -1; | 394 int red_pt = red_enabled_ ? RedPayloadType(send_codec_inst_.plfreq) : -1; |
| 397 codec_owner_.ChangeCngAndRed(cng_pt, vad_mode_, red_pt); | 395 codec_owner_.ChangeCngAndRed(cng_pt, vad_mode_, red_pt); |
| 398 } | 396 } |
| 399 } | 397 } |
| 400 return 0; | 398 return 0; |
| 401 } | 399 } |
| 402 | 400 |
| 403 void CodecManager::VAD(bool* dtx_enabled, | 401 void CodecManager::VAD(bool* dtx_enabled, |
| 404 bool* vad_enabled, | 402 bool* vad_enabled, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 case 48000: | 448 case 48000: |
| 451 return -1; | 449 return -1; |
| 452 default: | 450 default: |
| 453 FATAL() << sample_rate_hz << " Hz is not supported"; | 451 FATAL() << sample_rate_hz << " Hz is not supported"; |
| 454 return -1; | 452 return -1; |
| 455 } | 453 } |
| 456 } | 454 } |
| 457 | 455 |
| 458 } // namespace acm2 | 456 } // namespace acm2 |
| 459 } // namespace webrtc | 457 } // namespace webrtc |
| OLD | NEW |