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/interface/audio_decoder.h" 12 13 #include <assert.h> 14 15 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" 16 17 namespace webrtc { 18 19 int AudioDecoder::DecodeRedundant(const uint8_t* encoded, 20 size_t encoded_len, 21 int16_t* decoded, 22 SpeechType* speech_type) { 23 return Decode(encoded, encoded_len, decoded, speech_type); 24 } 25 26 bool AudioDecoder::HasDecodePlc() const { return false; } 27 28 int AudioDecoder::DecodePlc(int num_frames, int16_t* decoded) { return -1; } 29 30 int AudioDecoder::IncomingPacket(const uint8_t* payload, 31 size_t payload_len, 32 uint16_t rtp_sequence_number, 33 uint32_t rtp_timestamp, 34 uint32_t arrival_timestamp) { 35 return 0; 36 } 37 38 int AudioDecoder::ErrorCode() { return 0; } 39 40 int AudioDecoder::PacketDuration(const uint8_t* encoded, size_t encoded_len) { 41 return kNotImplemented; 42 } 43 44 int AudioDecoder::PacketDurationRedundant(const uint8_t* encoded, 45 size_t encoded_len) const { 46 return kNotImplemented; 47 } 48 49 bool AudioDecoder::PacketHasFec(const uint8_t* encoded, 50 size_t encoded_len) const { 51 return false; 52 } 53 54 NetEqDecoder AudioDecoder::codec_type() const { return codec_type_; } 55 56 bool AudioDecoder::CodecSupported(NetEqDecoder codec_type) { 57 switch (codec_type) { 58 case kDecoderPCMu: 59 case kDecoderPCMa: 60 case kDecoderPCMu_2ch: 61 case kDecoderPCMa_2ch: 62 #ifdef WEBRTC_CODEC_ILBC 63 case kDecoderILBC: 64 #endif 65 #if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC) 66 case kDecoderISAC: 67 #endif 68 #ifdef WEBRTC_CODEC_ISAC 69 case kDecoderISACswb: 70 case kDecoderISACfb: 71 #endif 72 #ifdef WEBRTC_CODEC_PCM16 73 case kDecoderPCM16B: 74 case kDecoderPCM16Bwb: 75 case kDecoderPCM16Bswb32kHz: 76 case kDecoderPCM16Bswb48kHz: 77 case kDecoderPCM16B_2ch: 78 case kDecoderPCM16Bwb_2ch: 79 case kDecoderPCM16Bswb32kHz_2ch: 80 case kDecoderPCM16Bswb48kHz_2ch: 81 case kDecoderPCM16B_5ch: 82 #endif 83 #ifdef WEBRTC_CODEC_G722 84 case kDecoderG722: 85 case kDecoderG722_2ch: 86 #endif 87 #ifdef WEBRTC_CODEC_CELT 88 case kDecoderCELT_32: 89 case kDecoderCELT_32_2ch: 90 #endif 91 #ifdef WEBRTC_CODEC_OPUS 92 case kDecoderOpus: 93 case kDecoderOpus_2ch: 94 #endif 95 case kDecoderRED: 96 case kDecoderAVT: 97 case kDecoderCNGnb: 98 case kDecoderCNGwb: 99 case kDecoderCNGswb32kHz: 100 case kDecoderCNGswb48kHz: 101 case kDecoderArbitrary: { 102 return true; 103 } 104 default: { 105 return false; 106 } 107 } 108 } 109 110 int AudioDecoder::CodecSampleRateHz(NetEqDecoder codec_type) { 111 switch (codec_type) { 112 case kDecoderPCMu: 113 case kDecoderPCMa: 114 case kDecoderPCMu_2ch: 115 case kDecoderPCMa_2ch: 116 #ifdef WEBRTC_CODEC_ILBC 117 case kDecoderILBC: 118 #endif 119 #ifdef WEBRTC_CODEC_PCM16 120 case kDecoderPCM16B: 121 case kDecoderPCM16B_2ch: 122 case kDecoderPCM16B_5ch: 123 #endif 124 case kDecoderCNGnb: { 125 return 8000; 126 } 127 #if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC) 128 case kDecoderISAC: 129 #endif 130 #ifdef WEBRTC_CODEC_PCM16 131 case kDecoderPCM16Bwb: 132 case kDecoderPCM16Bwb_2ch: 133 #endif 134 #ifdef WEBRTC_CODEC_G722 135 case kDecoderG722: 136 case kDecoderG722_2ch: 137 #endif 138 case kDecoderCNGwb: { 139 return 16000; 140 } 141 #ifdef WEBRTC_CODEC_ISAC 142 case kDecoderISACswb: 143 case kDecoderISACfb: 144 #endif 145 #ifdef WEBRTC_CODEC_PCM16 146 case kDecoderPCM16Bswb32kHz: 147 case kDecoderPCM16Bswb32kHz_2ch: 148 #endif 149 #ifdef WEBRTC_CODEC_CELT 150 case kDecoderCELT_32: 151 case kDecoderCELT_32_2ch: 152 #endif 153 case kDecoderCNGswb32kHz: { 154 return 32000; 155 } 156 #ifdef WEBRTC_CODEC_PCM16 157 case kDecoderPCM16Bswb48kHz: 158 case kDecoderPCM16Bswb48kHz_2ch: { 159 return 48000; 160 } 161 #endif 162 #ifdef WEBRTC_CODEC_OPUS 163 case kDecoderOpus: 164 case kDecoderOpus_2ch: { 165 return 32000; 166 } 167 #endif 168 case 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* AudioDecoder::CreateAudioDecoder(NetEqDecoder codec_type) { 179 if (!CodecSupported(codec_type)) { 180 return NULL; 181 } 182 switch (codec_type) { 183 case kDecoderPCMu: 184 return new AudioDecoderPcmU; 185 case kDecoderPCMa: 186 return new AudioDecoderPcmA; 187 case kDecoderPCMu_2ch: 188 return new AudioDecoderPcmUMultiCh(2); 189 case kDecoderPCMa_2ch: 190 return new AudioDecoderPcmAMultiCh(2); 191 #ifdef WEBRTC_CODEC_ILBC 192 case kDecoderILBC: 193 return new AudioDecoderIlbc; 194 #endif 195 #if defined(WEBRTC_CODEC_ISACFX) 196 case kDecoderISAC: 197 return new AudioDecoderIsacFix; 198 #elif defined(WEBRTC_CODEC_ISAC) 199 case kDecoderISAC: 200 return new AudioDecoderIsac; 201 #endif 202 #ifdef WEBRTC_CODEC_ISAC 203 case kDecoderISACswb: 204 return new AudioDecoderIsacSwb; 205 case kDecoderISACfb: 206 return new AudioDecoderIsacFb; 207 #endif 208 #ifdef WEBRTC_CODEC_PCM16 209 case kDecoderPCM16B: 210 case kDecoderPCM16Bwb: 211 case kDecoderPCM16Bswb32kHz: 212 case kDecoderPCM16Bswb48kHz: 213 return new AudioDecoderPcm16B(codec_type); 214 case kDecoderPCM16B_2ch: 215 case kDecoderPCM16Bwb_2ch: 216 case kDecoderPCM16Bswb32kHz_2ch: 217 case kDecoderPCM16Bswb48kHz_2ch: 218 case kDecoderPCM16B_5ch: 219 return new AudioDecoderPcm16BMultiCh(codec_type); 220 #endif 221 #ifdef WEBRTC_CODEC_G722 222 case kDecoderG722: 223 return new AudioDecoderG722; 224 case kDecoderG722_2ch: 225 return new AudioDecoderG722Stereo; 226 #endif 227 #ifdef WEBRTC_CODEC_CELT 228 case kDecoderCELT_32: 229 case kDecoderCELT_32_2ch: 230 return new AudioDecoderCelt(codec_type); 231 #endif 232 #ifdef WEBRTC_CODEC_OPUS 233 case kDecoderOpus: 234 case kDecoderOpus_2ch: 235 return new AudioDecoderOpus(codec_type); 236 #endif 237 case kDecoderCNGnb: 238 case kDecoderCNGwb: 239 case kDecoderCNGswb32kHz: 240 case kDecoderCNGswb48kHz: 241 return new AudioDecoderCng(codec_type); 242 case kDecoderRED: 243 case kDecoderAVT: 244 case kDecoderArbitrary: 245 default: { 246 return NULL; 247 } 248 } 249 } 250 251 AudioDecoder::SpeechType AudioDecoder::ConvertSpeechType(int16_t type) { 252 switch (type) { 253 case 0: // TODO(hlundin): Both iSAC and Opus return 0 for speech. 254 case 1: 255 return kSpeech; 256 case 2: 257 return kComfortNoise; 258 default: 259 assert(false); 260 return kSpeech; 261 } 262 } 263 264 } // namespace webrtc 265