1 /* 2 * Copyright (c) 2012 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 11 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" 12 13 #include <assert.h> 14 15 #include "webrtc/base/checks.h" 16 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h" 17 #include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h" 18 #ifdef WEBRTC_CODEC_G722 19 #include "webrtc/modules/audio_coding/codecs/g722/audio_decoder_g722.h" 20 #endif 21 #ifdef WEBRTC_CODEC_ILBC 22 #include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h" 23 #endif 24 #ifdef WEBRTC_CODEC_ISACFX 25 #include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h" 26 #include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h" 27 #endif 28 #ifdef WEBRTC_CODEC_ISAC 29 #include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h" 30 #include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h" 31 #endif 32 #ifdef WEBRTC_CODEC_OPUS 33 #include "webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.h" 34 #endif 35 #include "webrtc/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h" 36 37 namespace webrtc { 38 39 AudioDecoderCng::AudioDecoderCng() { 40 RTC_CHECK_EQ(0, WebRtcCng_CreateDec(&dec_state_)); 41 WebRtcCng_InitDec(dec_state_); 42 } 43 44 AudioDecoderCng::~AudioDecoderCng() { 45 WebRtcCng_FreeDec(dec_state_); 46 } 47 48 void AudioDecoderCng::Reset() { 49 WebRtcCng_InitDec(dec_state_); 50 } 51 52 int AudioDecoderCng::IncomingPacket(const uint8_t* payload, 53 size_t payload_len, 54 uint16_t rtp_sequence_number, 55 uint32_t rtp_timestamp, 56 uint32_t arrival_timestamp) { 57 return -1; 58 } 59 60 CNG_dec_inst* AudioDecoderCng::CngDecoderInstance() { 61 return dec_state_; 62 } 63 64 size_t AudioDecoderCng::Channels() const { 65 return 1; 66 } 67 68 int AudioDecoderCng::DecodeInternal(const uint8_t* encoded, 69 size_t encoded_len, 70 int sample_rate_hz, 71 int16_t* decoded, 72 SpeechType* speech_type) { 73 return -1; 74 } 75 76 bool CodecSupported(NetEqDecoder codec_type) { 77 switch (codec_type) { 78 case NetEqDecoder::kDecoderPCMu: 79 case NetEqDecoder::kDecoderPCMa: 80 case NetEqDecoder::kDecoderPCMu_2ch: 81 case NetEqDecoder::kDecoderPCMa_2ch: 82 #ifdef WEBRTC_CODEC_ILBC 83 case NetEqDecoder::kDecoderILBC: 84 #endif 85 #if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC) 86 case NetEqDecoder::kDecoderISAC: 87 #endif 88 #ifdef WEBRTC_CODEC_ISAC 89 case NetEqDecoder::kDecoderISACswb: 90 #endif 91 case NetEqDecoder::kDecoderPCM16B: 92 case NetEqDecoder::kDecoderPCM16Bwb: 93 case NetEqDecoder::kDecoderPCM16Bswb32kHz: 94 case NetEqDecoder::kDecoderPCM16Bswb48kHz: 95 case NetEqDecoder::kDecoderPCM16B_2ch: 96 case NetEqDecoder::kDecoderPCM16Bwb_2ch: 97 case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch: 98 case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch: 99 case NetEqDecoder::kDecoderPCM16B_5ch: 100 #ifdef WEBRTC_CODEC_G722 101 case NetEqDecoder::kDecoderG722: 102 case NetEqDecoder::kDecoderG722_2ch: 103 #endif 104 #ifdef WEBRTC_CODEC_OPUS 105 case NetEqDecoder::kDecoderOpus: 106 case NetEqDecoder::kDecoderOpus_2ch: 107 #endif 108 case NetEqDecoder::kDecoderRED: 109 case NetEqDecoder::kDecoderAVT: 110 case NetEqDecoder::kDecoderCNGnb: 111 case NetEqDecoder::kDecoderCNGwb: 112 case NetEqDecoder::kDecoderCNGswb32kHz: 113 case NetEqDecoder::kDecoderCNGswb48kHz: 114 case NetEqDecoder::kDecoderArbitrary: { 115 return true; 116 } 117 default: { 118 return false; 119 } 120 } 121 } 122 123 int CodecSampleRateHz(NetEqDecoder codec_type) { 124 switch (codec_type) { 125 case NetEqDecoder::kDecoderPCMu: 126 case NetEqDecoder::kDecoderPCMa: 127 case NetEqDecoder::kDecoderPCMu_2ch: 128 case NetEqDecoder::kDecoderPCMa_2ch: 129 #ifdef WEBRTC_CODEC_ILBC 130 case NetEqDecoder::kDecoderILBC: 131 #endif 132 case NetEqDecoder::kDecoderPCM16B: 133 case NetEqDecoder::kDecoderPCM16B_2ch: 134 case NetEqDecoder::kDecoderPCM16B_5ch: 135 case NetEqDecoder::kDecoderCNGnb: { 136 return 8000; 137 } 138 #if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC) 139 case NetEqDecoder::kDecoderISAC: 140 #endif 141 case NetEqDecoder::kDecoderPCM16Bwb: 142 case NetEqDecoder::kDecoderPCM16Bwb_2ch: 143 #ifdef WEBRTC_CODEC_G722 144 case NetEqDecoder::kDecoderG722: 145 case NetEqDecoder::kDecoderG722_2ch: 146 #endif 147 case NetEqDecoder::kDecoderCNGwb: { 148 return 16000; 149 } 150 #ifdef WEBRTC_CODEC_ISAC 151 case NetEqDecoder::kDecoderISACswb: 152 #endif 153 case NetEqDecoder::kDecoderPCM16Bswb32kHz: 154 case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch: 155 case NetEqDecoder::kDecoderCNGswb32kHz: { 156 return 32000; 157 } 158 case NetEqDecoder::kDecoderPCM16Bswb48kHz: 159 case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch: { 160 return 48000; 161 } 162 #ifdef WEBRTC_CODEC_OPUS 163 case NetEqDecoder::kDecoderOpus: 164 case NetEqDecoder::kDecoderOpus_2ch: { 165 return 48000; 166 } 167 #endif 168 case NetEqDecoder::kDecoderCNGswb48kHz: { 169 // TODO(tlegrand): Remove limitation once ACM has full 48 kHz support. 170 return 32000; 171 } 172 default: { 173 return -1; // Undefined sample rate. 174 } 175 } 176 } 177 178 AudioDecoder* CreateAudioDecoder(NetEqDecoder codec_type) { 179 if (!CodecSupported(codec_type)) { 180 return NULL; 181 } 182 switch (codec_type) { 183 case NetEqDecoder::kDecoderPCMu: 184 return new AudioDecoderPcmU(1); 185 case NetEqDecoder::kDecoderPCMa: 186 return new AudioDecoderPcmA(1); 187 case NetEqDecoder::kDecoderPCMu_2ch: 188 return new AudioDecoderPcmU(2); 189 case NetEqDecoder::kDecoderPCMa_2ch: 190 return new AudioDecoderPcmA(2); 191 #ifdef WEBRTC_CODEC_ILBC 192 case NetEqDecoder::kDecoderILBC: 193 return new AudioDecoderIlbc; 194 #endif 195 #if defined(WEBRTC_CODEC_ISACFX) 196 case NetEqDecoder::kDecoderISAC: 197 return new AudioDecoderIsacFix(); 198 #elif defined(WEBRTC_CODEC_ISAC) 199 case NetEqDecoder::kDecoderISAC: 200 case NetEqDecoder::kDecoderISACswb: 201 return new AudioDecoderIsac(); 202 #endif 203 case NetEqDecoder::kDecoderPCM16B: 204 case NetEqDecoder::kDecoderPCM16Bwb: 205 case NetEqDecoder::kDecoderPCM16Bswb32kHz: 206 case NetEqDecoder::kDecoderPCM16Bswb48kHz: 207 return new AudioDecoderPcm16B(1); 208 case NetEqDecoder::kDecoderPCM16B_2ch: 209 case NetEqDecoder::kDecoderPCM16Bwb_2ch: 210 case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch: 211 case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch: 212 return new AudioDecoderPcm16B(2); 213 case NetEqDecoder::kDecoderPCM16B_5ch: 214 return new AudioDecoderPcm16B(5); 215 #ifdef WEBRTC_CODEC_G722 216 case NetEqDecoder::kDecoderG722: 217 return new AudioDecoderG722; 218 case NetEqDecoder::kDecoderG722_2ch: 219 return new AudioDecoderG722Stereo; 220 #endif 221 #ifdef WEBRTC_CODEC_OPUS 222 case NetEqDecoder::kDecoderOpus: 223 return new AudioDecoderOpus(1); 224 case NetEqDecoder::kDecoderOpus_2ch: 225 return new AudioDecoderOpus(2); 226 #endif 227 case NetEqDecoder::kDecoderCNGnb: 228 case NetEqDecoder::kDecoderCNGwb: 229 case NetEqDecoder::kDecoderCNGswb32kHz: 230 case NetEqDecoder::kDecoderCNGswb48kHz: 231 return new AudioDecoderCng; 232 case NetEqDecoder::kDecoderRED: 233 case NetEqDecoder::kDecoderAVT: 234 case NetEqDecoder::kDecoderArbitrary: 235 default: { 236 return NULL; 237 } 238 } 239 } 240 241 } // namespace webrtc 242