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/include/webrtc_cng.h"
17 #include "webrtc/modules/audio_coding/codecs/g711/include/audio_decoder_pcm.h"
18 #ifdef WEBRTC_CODEC_G722
19 #include "webrtc/modules/audio_coding/codecs/g722/include/audio_decoder_g722.h"
20 #endif
21 #ifdef WEBRTC_CODEC_ILBC
22 #include "webrtc/modules/audio_coding/codecs/ilbc/include/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/include/audio_decoder_opus.h"
34 #endif
35 #include "webrtc/modules/audio_coding/codecs/pcm16b/include/audio_decoder_pcm16b.h"
36 
37 namespace webrtc {
38 
AudioDecoderCng()39 AudioDecoderCng::AudioDecoderCng() {
40   RTC_CHECK_EQ(0, WebRtcCng_CreateDec(&dec_state_));
41   WebRtcCng_InitDec(dec_state_);
42 }
43 
~AudioDecoderCng()44 AudioDecoderCng::~AudioDecoderCng() {
45   WebRtcCng_FreeDec(dec_state_);
46 }
47 
Reset()48 void AudioDecoderCng::Reset() {
49   WebRtcCng_InitDec(dec_state_);
50 }
51 
IncomingPacket(const uint8_t * payload,size_t payload_len,uint16_t rtp_sequence_number,uint32_t rtp_timestamp,uint32_t arrival_timestamp)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 
CngDecoderInstance()60 CNG_dec_inst* AudioDecoderCng::CngDecoderInstance() {
61   return dec_state_;
62 }
63 
Channels() const64 size_t AudioDecoderCng::Channels() const {
65   return 1;
66 }
67 
DecodeInternal(const uint8_t * encoded,size_t encoded_len,int sample_rate_hz,int16_t * decoded,SpeechType * speech_type)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 
CodecSupported(NetEqDecoder codec_type)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 
CodecSampleRateHz(NetEqDecoder codec_type)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 
CreateAudioDecoder(NetEqDecoder codec_type)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