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 #ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_DECODER_IMPL_H_ 12 #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_DECODER_IMPL_H_ 13 14 #include <assert.h> 15 16 #ifndef AUDIO_DECODER_UNITTEST 17 // If this is compiled as a part of the audio_deoder_unittest, the codec 18 // selection is made in the gypi file instead of in engine_configurations.h. 19 #include "webrtc/engine_configurations.h" 20 #endif 21 #include "webrtc/base/constructormagic.h" 22 #include "webrtc/modules/audio_coding/neteq/interface/audio_decoder.h" 23 #include "webrtc/typedefs.h" 24 25 namespace webrtc { 26 27 class AudioDecoderPcmU : public AudioDecoder { 28 public: 29 AudioDecoderPcmU() : AudioDecoder(kDecoderPCMu) {} 30 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 31 int16_t* decoded, SpeechType* speech_type); 32 virtual int Init() { return 0; } 33 virtual int PacketDuration(const uint8_t* encoded, size_t encoded_len); 34 35 private: 36 DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcmU); 37 }; 38 39 class AudioDecoderPcmA : public AudioDecoder { 40 public: 41 AudioDecoderPcmA() : AudioDecoder(kDecoderPCMa) {} 42 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 43 int16_t* decoded, SpeechType* speech_type); 44 virtual int Init() { return 0; } 45 virtual int PacketDuration(const uint8_t* encoded, size_t encoded_len); 46 47 private: 48 DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcmA); 49 }; 50 51 class AudioDecoderPcmUMultiCh : public AudioDecoderPcmU { 52 public: 53 explicit AudioDecoderPcmUMultiCh(size_t channels) : AudioDecoderPcmU() { 54 assert(channels > 0); 55 channels_ = channels; 56 } 57 58 private: 59 DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcmUMultiCh); 60 }; 61 62 class AudioDecoderPcmAMultiCh : public AudioDecoderPcmA { 63 public: 64 explicit AudioDecoderPcmAMultiCh(size_t channels) : AudioDecoderPcmA() { 65 assert(channels > 0); 66 channels_ = channels; 67 } 68 69 private: 70 DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcmAMultiCh); 71 }; 72 73 #ifdef WEBRTC_CODEC_PCM16 74 // This class handles all four types (i.e., sample rates) of PCM16B codecs. 75 // The type is specified in the constructor parameter |type|. 76 class AudioDecoderPcm16B : public AudioDecoder { 77 public: 78 explicit AudioDecoderPcm16B(enum NetEqDecoder type); 79 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 80 int16_t* decoded, SpeechType* speech_type); 81 virtual int Init() { return 0; } 82 virtual int PacketDuration(const uint8_t* encoded, size_t encoded_len); 83 84 private: 85 DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcm16B); 86 }; 87 88 // This class handles all four types (i.e., sample rates) of PCM16B codecs. 89 // The type is specified in the constructor parameter |type|, and the number 90 // of channels is derived from the type. 91 class AudioDecoderPcm16BMultiCh : public AudioDecoderPcm16B { 92 public: 93 explicit AudioDecoderPcm16BMultiCh(enum NetEqDecoder type); 94 95 private: 96 DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcm16BMultiCh); 97 }; 98 #endif 99 100 #ifdef WEBRTC_CODEC_ILBC 101 class AudioDecoderIlbc : public AudioDecoder { 102 public: 103 AudioDecoderIlbc(); 104 virtual ~AudioDecoderIlbc(); 105 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 106 int16_t* decoded, SpeechType* speech_type); 107 virtual bool HasDecodePlc() const { return true; } 108 virtual int DecodePlc(int num_frames, int16_t* decoded); 109 virtual int Init(); 110 111 private: 112 DISALLOW_COPY_AND_ASSIGN(AudioDecoderIlbc); 113 }; 114 #endif 115 116 #ifdef WEBRTC_CODEC_ISAC 117 class AudioDecoderIsac : public AudioDecoder { 118 public: 119 AudioDecoderIsac(); 120 virtual ~AudioDecoderIsac(); 121 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 122 int16_t* decoded, SpeechType* speech_type); 123 virtual int DecodeRedundant(const uint8_t* encoded, size_t encoded_len, 124 int16_t* decoded, SpeechType* speech_type); 125 virtual bool HasDecodePlc() const { return true; } 126 virtual int DecodePlc(int num_frames, int16_t* decoded); 127 virtual int Init(); 128 virtual int IncomingPacket(const uint8_t* payload, 129 size_t payload_len, 130 uint16_t rtp_sequence_number, 131 uint32_t rtp_timestamp, 132 uint32_t arrival_timestamp); 133 virtual int ErrorCode(); 134 135 private: 136 DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsac); 137 }; 138 139 class AudioDecoderIsacSwb : public AudioDecoderIsac { 140 public: 141 AudioDecoderIsacSwb(); 142 143 private: 144 DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacSwb); 145 }; 146 147 class AudioDecoderIsacFb : public AudioDecoderIsacSwb { 148 public: 149 AudioDecoderIsacFb(); 150 151 private: 152 DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacFb); 153 }; 154 #endif 155 156 #ifdef WEBRTC_CODEC_ISACFX 157 class AudioDecoderIsacFix : public AudioDecoder { 158 public: 159 AudioDecoderIsacFix(); 160 virtual ~AudioDecoderIsacFix(); 161 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 162 int16_t* decoded, SpeechType* speech_type); 163 virtual int Init(); 164 virtual int IncomingPacket(const uint8_t* payload, 165 size_t payload_len, 166 uint16_t rtp_sequence_number, 167 uint32_t rtp_timestamp, 168 uint32_t arrival_timestamp); 169 virtual int ErrorCode(); 170 171 private: 172 DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacFix); 173 }; 174 #endif 175 176 #ifdef WEBRTC_CODEC_G722 177 class AudioDecoderG722 : public AudioDecoder { 178 public: 179 AudioDecoderG722(); 180 virtual ~AudioDecoderG722(); 181 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 182 int16_t* decoded, SpeechType* speech_type); 183 virtual bool HasDecodePlc() const { return false; } 184 virtual int Init(); 185 virtual int PacketDuration(const uint8_t* encoded, size_t encoded_len); 186 187 private: 188 DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722); 189 }; 190 191 class AudioDecoderG722Stereo : public AudioDecoderG722 { 192 public: 193 AudioDecoderG722Stereo(); 194 virtual ~AudioDecoderG722Stereo(); 195 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 196 int16_t* decoded, SpeechType* speech_type); 197 virtual int Init(); 198 199 private: 200 // Splits the stereo-interleaved payload in |encoded| into separate payloads 201 // for left and right channels. The separated payloads are written to 202 // |encoded_deinterleaved|, which must hold at least |encoded_len| samples. 203 // The left channel starts at offset 0, while the right channel starts at 204 // offset encoded_len / 2 into |encoded_deinterleaved|. 205 void SplitStereoPacket(const uint8_t* encoded, size_t encoded_len, 206 uint8_t* encoded_deinterleaved); 207 208 void* const state_left_; 209 void* state_right_; 210 211 DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722Stereo); 212 }; 213 #endif 214 215 #ifdef WEBRTC_CODEC_CELT 216 class AudioDecoderCelt : public AudioDecoder { 217 public: 218 explicit AudioDecoderCelt(enum NetEqDecoder type); 219 virtual ~AudioDecoderCelt(); 220 221 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 222 int16_t* decoded, SpeechType* speech_type); 223 virtual int Init(); 224 virtual bool HasDecodePlc() const; 225 virtual int DecodePlc(int num_frames, int16_t* decoded); 226 227 private: 228 DISALLOW_COPY_AND_ASSIGN(AudioDecoderCelt); 229 }; 230 #endif 231 232 #ifdef WEBRTC_CODEC_OPUS 233 class AudioDecoderOpus : public AudioDecoder { 234 public: 235 explicit AudioDecoderOpus(enum NetEqDecoder type); 236 virtual ~AudioDecoderOpus(); 237 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 238 int16_t* decoded, SpeechType* speech_type); 239 virtual int DecodeRedundant(const uint8_t* encoded, size_t encoded_len, 240 int16_t* decoded, SpeechType* speech_type); 241 virtual int Init(); 242 virtual int PacketDuration(const uint8_t* encoded, size_t encoded_len); 243 virtual int PacketDurationRedundant(const uint8_t* encoded, 244 size_t encoded_len) const; 245 virtual bool PacketHasFec(const uint8_t* encoded, size_t encoded_len) const; 246 247 private: 248 DISALLOW_COPY_AND_ASSIGN(AudioDecoderOpus); 249 }; 250 #endif 251 252 // AudioDecoderCng is a special type of AudioDecoder. It inherits from 253 // AudioDecoder just to fit in the DecoderDatabase. None of the class methods 254 // should be used, except constructor, destructor, and accessors. 255 // TODO(hlundin): Consider the possibility to create a super-class to 256 // AudioDecoder that is stored in DecoderDatabase. Then AudioDecoder and a 257 // specific CngDecoder class could both inherit from that class. 258 class AudioDecoderCng : public AudioDecoder { 259 public: 260 explicit AudioDecoderCng(enum NetEqDecoder type); 261 virtual ~AudioDecoderCng(); 262 virtual int Decode(const uint8_t* encoded, size_t encoded_len, 263 int16_t* decoded, SpeechType* speech_type) { return -1; } 264 virtual int Init(); 265 virtual int IncomingPacket(const uint8_t* payload, 266 size_t payload_len, 267 uint16_t rtp_sequence_number, 268 uint32_t rtp_timestamp, 269 uint32_t arrival_timestamp) { return -1; } 270 271 private: 272 DISALLOW_COPY_AND_ASSIGN(AudioDecoderCng); 273 }; 274 275 } // namespace webrtc 276 #endif // WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_DECODER_IMPL_H_ 277