Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 | * |
| 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 |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
| 10 | |
kjellander | 3e6db23 | 2015-11-26 04:44:54 -0800 | [diff] [blame] | 11 | #include "webrtc/modules/audio_coding/acm2/codec_manager.h" |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 12 | |
| 13 | #include "webrtc/base/checks.h" |
Karl Wiberg | bd1bc47 | 2015-05-18 12:18:54 +0200 | [diff] [blame] | 14 | #include "webrtc/engine_configurations.h" |
kjellander | 3e6db23 | 2015-11-26 04:44:54 -0800 | [diff] [blame] | 15 | #include "webrtc/modules/audio_coding/acm2/rent_a_codec.h" |
Henrik Kjellander | 98f5351 | 2015-10-28 18:17:40 +0100 | [diff] [blame] | 16 | #include "webrtc/system_wrappers/include/trace.h" |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 17 | |
| 18 | namespace webrtc { |
| 19 | namespace acm2 { |
| 20 | |
| 21 | namespace { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 22 | |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 23 | // Check if the given codec is a valid to be registered as send codec. |
kwiberg | 223692a | 2015-11-18 08:27:51 -0800 | [diff] [blame] | 24 | int IsValidSendCodec(const CodecInst& send_codec) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 25 | int dummy_id = 0; |
| 26 | if ((send_codec.channels != 1) && (send_codec.channels != 2)) { |
| 27 | WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, |
| 28 | "Wrong number of channels (%d, only mono and stereo are " |
kwiberg | 223692a | 2015-11-18 08:27:51 -0800 | [diff] [blame] | 29 | "supported)", |
| 30 | send_codec.channels); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 31 | return -1; |
| 32 | } |
| 33 | |
kwiberg | d6c0f8c | 2015-11-06 14:28:00 -0800 | [diff] [blame] | 34 | auto maybe_codec_id = RentACodec::CodecIdByInst(send_codec); |
| 35 | if (!maybe_codec_id) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 36 | WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, |
| 37 | "Invalid codec setting for the send codec."); |
| 38 | return -1; |
| 39 | } |
| 40 | |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 41 | // Telephone-event cannot be a send codec. |
| 42 | if (!STR_CASE_CMP(send_codec.plname, "telephone-event")) { |
| 43 | WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, |
| 44 | "telephone-event cannot be a send codec"); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 45 | return -1; |
| 46 | } |
| 47 | |
kwiberg | d6c0f8c | 2015-11-06 14:28:00 -0800 | [diff] [blame] | 48 | if (!RentACodec::IsSupportedNumChannels(*maybe_codec_id, send_codec.channels) |
| 49 | .value_or(false)) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 50 | WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, |
| 51 | "%d number of channels not supportedn for %s.", |
| 52 | send_codec.channels, send_codec.plname); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 53 | return -1; |
| 54 | } |
kwiberg | d6c0f8c | 2015-11-06 14:28:00 -0800 | [diff] [blame] | 55 | return RentACodec::CodecIndexFromId(*maybe_codec_id).value_or(-1); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 56 | } |
| 57 | |
Henrik Lundin | 93ef1d8 | 2015-04-13 09:31:16 +0200 | [diff] [blame] | 58 | bool IsIsac(const CodecInst& codec) { |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 59 | return |
| 60 | #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) |
| 61 | !STR_CASE_CMP(codec.plname, "isac") || |
| 62 | #endif |
| 63 | false; |
| 64 | } |
| 65 | |
| 66 | bool IsOpus(const CodecInst& codec) { |
| 67 | return |
| 68 | #ifdef WEBRTC_CODEC_OPUS |
| 69 | !STR_CASE_CMP(codec.plname, "opus") || |
| 70 | #endif |
| 71 | false; |
| 72 | } |
| 73 | |
| 74 | bool IsPcmU(const CodecInst& codec) { |
| 75 | return !STR_CASE_CMP(codec.plname, "pcmu"); |
| 76 | } |
| 77 | |
| 78 | bool IsPcmA(const CodecInst& codec) { |
| 79 | return !STR_CASE_CMP(codec.plname, "pcma"); |
| 80 | } |
| 81 | |
| 82 | bool IsPcm16B(const CodecInst& codec) { |
kwiberg | 844a910 | 2015-09-16 09:42:18 -0700 | [diff] [blame] | 83 | return !STR_CASE_CMP(codec.plname, "l16"); |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 84 | } |
| 85 | |
| 86 | bool IsIlbc(const CodecInst& codec) { |
| 87 | return |
| 88 | #ifdef WEBRTC_CODEC_ILBC |
| 89 | !STR_CASE_CMP(codec.plname, "ilbc") || |
| 90 | #endif |
| 91 | false; |
| 92 | } |
| 93 | |
| 94 | bool IsG722(const CodecInst& codec) { |
| 95 | return |
| 96 | #ifdef WEBRTC_CODEC_G722 |
| 97 | !STR_CASE_CMP(codec.plname, "g722") || |
| 98 | #endif |
| 99 | false; |
| 100 | } |
| 101 | |
| 102 | bool CodecSupported(const CodecInst& codec) { |
| 103 | return IsOpus(codec) || IsPcmU(codec) || IsPcmA(codec) || IsPcm16B(codec) || |
| 104 | IsIlbc(codec) || IsG722(codec) || IsIsac(codec); |
Henrik Lundin | 93ef1d8 | 2015-04-13 09:31:16 +0200 | [diff] [blame] | 105 | } |
| 106 | |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 107 | const CodecInst kEmptyCodecInst = {-1, "noCodecRegistered", 0, 0, 0, 0}; |
| 108 | } // namespace |
| 109 | |
Karl Wiberg | bd1bc47 | 2015-05-18 12:18:54 +0200 | [diff] [blame] | 110 | CodecManager::CodecManager() |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 111 | : send_codec_inst_(kEmptyCodecInst), encoder_is_opus_(false) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 112 | thread_checker_.DetachFromThread(); |
| 113 | } |
| 114 | |
Henrik Lundin | 93ef1d8 | 2015-04-13 09:31:16 +0200 | [diff] [blame] | 115 | CodecManager::~CodecManager() = default; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 116 | |
Karl Wiberg | 7e0c7d4 | 2015-05-18 14:52:29 +0200 | [diff] [blame] | 117 | int CodecManager::RegisterEncoder(const CodecInst& send_codec) { |
henrikg | 91d6ede | 2015-09-17 00:24:34 -0700 | [diff] [blame] | 118 | RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
kwiberg | 223692a | 2015-11-18 08:27:51 -0800 | [diff] [blame] | 119 | int codec_id = IsValidSendCodec(send_codec); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 120 | |
| 121 | // Check for reported errors from function IsValidSendCodec(). |
| 122 | if (codec_id < 0) { |
| 123 | return -1; |
| 124 | } |
| 125 | |
| 126 | int dummy_id = 0; |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 127 | switch (RentACodec::RegisterRedPayloadType( |
| 128 | &codec_stack_params_.red_payload_types, send_codec)) { |
kwiberg | e1a27d4 | 2015-11-18 07:32:49 -0800 | [diff] [blame] | 129 | case RentACodec::RegistrationResult::kOk: |
| 130 | return 0; |
| 131 | case RentACodec::RegistrationResult::kBadFreq: |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 132 | WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, |
kwiberg | e1a27d4 | 2015-11-18 07:32:49 -0800 | [diff] [blame] | 133 | "RegisterSendCodec() failed, invalid frequency for RED" |
| 134 | " registration"); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 135 | return -1; |
kwiberg | e1a27d4 | 2015-11-18 07:32:49 -0800 | [diff] [blame] | 136 | case RentACodec::RegistrationResult::kSkip: |
| 137 | break; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 138 | } |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 139 | switch (RentACodec::RegisterCngPayloadType( |
| 140 | &codec_stack_params_.cng_payload_types, send_codec)) { |
kwiberg | e1a27d4 | 2015-11-18 07:32:49 -0800 | [diff] [blame] | 141 | case RentACodec::RegistrationResult::kOk: |
| 142 | return 0; |
| 143 | case RentACodec::RegistrationResult::kBadFreq: |
| 144 | WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, dummy_id, |
| 145 | "RegisterSendCodec() failed, invalid frequency for CNG" |
| 146 | " registration"); |
| 147 | return -1; |
| 148 | case RentACodec::RegistrationResult::kSkip: |
| 149 | break; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 150 | } |
| 151 | |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 152 | // Check if the codec is already registered as send codec. |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 153 | bool new_codec = true; |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 154 | if (CurrentEncoder()) { |
kwiberg | d6c0f8c | 2015-11-06 14:28:00 -0800 | [diff] [blame] | 155 | auto new_codec_id = RentACodec::CodecIdByInst(send_codec_inst_); |
| 156 | RTC_DCHECK(new_codec_id); |
| 157 | auto old_codec_id = RentACodec::CodecIdFromIndex(codec_id); |
| 158 | new_codec = !old_codec_id || *new_codec_id != *old_codec_id; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 159 | } |
| 160 | |
kwiberg | 12cfc9b | 2015-09-08 05:57:53 -0700 | [diff] [blame] | 161 | encoder_is_opus_ = IsOpus(send_codec); |
| 162 | |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 163 | if (new_codec) { |
| 164 | // This is a new codec. Register it and return. |
henrikg | 91d6ede | 2015-09-17 00:24:34 -0700 | [diff] [blame] | 165 | RTC_DCHECK(CodecSupported(send_codec)); |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 166 | if (IsOpus(send_codec)) { |
| 167 | // VAD/DTX not supported. |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 168 | codec_stack_params_.use_cng = false; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 169 | } |
kwiberg | c95c366 | 2015-11-10 06:35:21 -0800 | [diff] [blame] | 170 | AudioEncoder* enc = rent_a_codec_.RentEncoder(send_codec); |
| 171 | if (!enc) |
kwiberg | 574d5da | 2015-09-24 22:53:55 -0700 | [diff] [blame] | 172 | return -1; |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 173 | rent_a_codec_.RentEncoderStack(enc, &codec_stack_params_); |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 174 | RTC_DCHECK(CurrentEncoder()); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 175 | |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 176 | send_codec_inst_ = send_codec; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 177 | return 0; |
| 178 | } |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 179 | |
| 180 | // This is an existing codec; re-create it if any parameters have changed. |
| 181 | if (send_codec_inst_.plfreq != send_codec.plfreq || |
| 182 | send_codec_inst_.pacsize != send_codec.pacsize || |
| 183 | send_codec_inst_.channels != send_codec.channels) { |
kwiberg | c95c366 | 2015-11-10 06:35:21 -0800 | [diff] [blame] | 184 | AudioEncoder* enc = rent_a_codec_.RentEncoder(send_codec); |
| 185 | if (!enc) |
kwiberg | 574d5da | 2015-09-24 22:53:55 -0700 | [diff] [blame] | 186 | return -1; |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 187 | rent_a_codec_.RentEncoderStack(enc, &codec_stack_params_); |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 188 | RTC_DCHECK(CurrentEncoder()); |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 189 | } |
| 190 | send_codec_inst_.plfreq = send_codec.plfreq; |
| 191 | send_codec_inst_.pacsize = send_codec.pacsize; |
| 192 | send_codec_inst_.channels = send_codec.channels; |
| 193 | send_codec_inst_.pltype = send_codec.pltype; |
| 194 | |
| 195 | // Check if a change in Rate is required. |
| 196 | if (send_codec.rate != send_codec_inst_.rate) { |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 197 | CurrentEncoder()->SetTargetBitrate(send_codec.rate); |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 198 | send_codec_inst_.rate = send_codec.rate; |
| 199 | } |
| 200 | |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 201 | return 0; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 202 | } |
| 203 | |
kwiberg | 12cfc9b | 2015-09-08 05:57:53 -0700 | [diff] [blame] | 204 | void CodecManager::RegisterEncoder(AudioEncoder* external_speech_encoder) { |
Karl Wiberg | 7e0c7d4 | 2015-05-18 14:52:29 +0200 | [diff] [blame] | 205 | // Make up a CodecInst. |
| 206 | send_codec_inst_.channels = external_speech_encoder->NumChannels(); |
| 207 | send_codec_inst_.plfreq = external_speech_encoder->SampleRateHz(); |
Peter Kasting | dce40cf | 2015-08-24 14:52:23 -0700 | [diff] [blame] | 208 | send_codec_inst_.pacsize = rtc::CheckedDivExact( |
| 209 | static_cast<int>(external_speech_encoder->Max10MsFramesInAPacket() * |
| 210 | send_codec_inst_.plfreq), |
| 211 | 100); |
Karl Wiberg | 7e0c7d4 | 2015-05-18 14:52:29 +0200 | [diff] [blame] | 212 | send_codec_inst_.pltype = -1; // Not valid. |
| 213 | send_codec_inst_.rate = -1; // Not valid. |
| 214 | static const char kName[] = "external"; |
| 215 | memcpy(send_codec_inst_.plname, kName, sizeof(kName)); |
| 216 | |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 217 | rent_a_codec_.RentEncoderStack(external_speech_encoder, &codec_stack_params_); |
Karl Wiberg | 7e0c7d4 | 2015-05-18 14:52:29 +0200 | [diff] [blame] | 218 | } |
| 219 | |
Karl Wiberg | be57983 | 2015-11-10 22:34:18 +0100 | [diff] [blame] | 220 | rtc::Optional<CodecInst> CodecManager::GetCodecInst() const { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 221 | int dummy_id = 0; |
| 222 | WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceAudioCoding, dummy_id, |
| 223 | "SendCodec()"); |
| 224 | |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 225 | if (!CurrentEncoder()) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 226 | WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceAudioCoding, dummy_id, |
| 227 | "SendCodec Failed, no codec is registered"); |
Karl Wiberg | be57983 | 2015-11-10 22:34:18 +0100 | [diff] [blame] | 228 | return rtc::Optional<CodecInst>(); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 229 | } |
Karl Wiberg | be57983 | 2015-11-10 22:34:18 +0100 | [diff] [blame] | 230 | return rtc::Optional<CodecInst>(send_codec_inst_); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 231 | } |
| 232 | |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 233 | bool CodecManager::SetCopyRed(bool enable) { |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 234 | if (enable && codec_stack_params_.use_codec_fec) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 235 | WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, 0, |
| 236 | "Codec internal FEC and RED cannot be co-enabled."); |
| 237 | return false; |
| 238 | } |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 239 | if (enable && |
| 240 | codec_stack_params_.red_payload_types.count(send_codec_inst_.plfreq) < |
| 241 | 1) { |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 242 | WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, 0, |
| 243 | "Cannot enable RED at %i Hz.", send_codec_inst_.plfreq); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 244 | return false; |
| 245 | } |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 246 | if (codec_stack_params_.use_red != enable) { |
| 247 | codec_stack_params_.use_red = enable; |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 248 | if (CurrentEncoder()) |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 249 | rent_a_codec_.RentEncoderStack(rent_a_codec_.GetEncoder(), |
| 250 | &codec_stack_params_); |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 251 | } |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 252 | return true; |
| 253 | } |
| 254 | |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 255 | int CodecManager::SetVAD(bool enable, ACMVADMode mode) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 256 | // Sanity check of the mode. |
henrikg | 91d6ede | 2015-09-17 00:24:34 -0700 | [diff] [blame] | 257 | RTC_DCHECK(mode == VADNormal || mode == VADLowBitrate || mode == VADAggr || |
| 258 | mode == VADVeryAggr); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 259 | |
| 260 | // Check that the send codec is mono. We don't support VAD/DTX for stereo |
| 261 | // sending. |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 262 | auto* enc = rent_a_codec_.GetEncoder(); |
kwiberg | ed8275a | 2015-11-10 09:47:36 -0800 | [diff] [blame] | 263 | const bool stereo_send = enc ? (enc->NumChannels() != 1) : false; |
| 264 | if (enable && stereo_send) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 265 | WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceAudioCoding, 0, |
| 266 | "VAD/DTX not supported for stereo sending"); |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 267 | codec_stack_params_.use_cng = false; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 268 | return -1; |
| 269 | } |
| 270 | |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 271 | // If a send codec is registered, set VAD/DTX for the codec. |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 272 | if (IsOpus(send_codec_inst_)) { |
| 273 | // VAD/DTX not supported. |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 274 | codec_stack_params_.use_cng = false; |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 275 | return 0; |
| 276 | } |
| 277 | |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 278 | if (codec_stack_params_.use_cng != enable || |
| 279 | codec_stack_params_.vad_mode != mode) { |
| 280 | codec_stack_params_.use_cng = enable; |
| 281 | codec_stack_params_.vad_mode = mode; |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 282 | if (enc) |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 283 | rent_a_codec_.RentEncoderStack(enc, &codec_stack_params_); |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 284 | } |
| 285 | return 0; |
| 286 | } |
| 287 | |
| 288 | void CodecManager::VAD(bool* dtx_enabled, |
| 289 | bool* vad_enabled, |
| 290 | ACMVADMode* mode) const { |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 291 | *dtx_enabled = *vad_enabled = codec_stack_params_.use_cng; |
| 292 | *mode = codec_stack_params_.vad_mode; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 293 | } |
| 294 | |
| 295 | int CodecManager::SetCodecFEC(bool enable_codec_fec) { |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 296 | if (enable_codec_fec && codec_stack_params_.use_red) { |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 297 | WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, 0, |
| 298 | "Codec internal FEC and RED cannot be co-enabled."); |
| 299 | return -1; |
| 300 | } |
| 301 | |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 302 | RTC_CHECK(CurrentEncoder()); |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 303 | codec_stack_params_.use_codec_fec = |
kwiberg | e155ae6 | 2015-11-16 04:49:54 -0800 | [diff] [blame] | 304 | CurrentEncoder()->SetFec(enable_codec_fec) && enable_codec_fec; |
kwiberg | 1379f1f | 2015-11-23 04:30:52 -0800 | [diff] [blame] | 305 | return codec_stack_params_.use_codec_fec == enable_codec_fec ? 0 : -1; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 306 | } |
| 307 | |
Karl Wiberg | 2ea71c3 | 2015-05-07 15:49:23 +0200 | [diff] [blame] | 308 | AudioDecoder* CodecManager::GetAudioDecoder(const CodecInst& codec) { |
kwiberg | c95c366 | 2015-11-10 06:35:21 -0800 | [diff] [blame] | 309 | return IsIsac(codec) ? rent_a_codec_.RentIsacDecoder() : nullptr; |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 310 | } |
| 311 | |
Henrik Lundin | 45c6449 | 2015-03-30 19:00:44 +0200 | [diff] [blame] | 312 | } // namespace acm2 |
| 313 | } // namespace webrtc |