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
DecodeRedundant(const uint8_t * encoded,size_t encoded_len,int16_t * decoded,SpeechType * speech_type)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
HasDecodePlc() const26 bool AudioDecoder::HasDecodePlc() const { return false; }
27
DecodePlc(int num_frames,int16_t * decoded)28 int AudioDecoder::DecodePlc(int num_frames, int16_t* decoded) { return -1; }
29
IncomingPacket(const uint8_t * payload,size_t payload_len,uint16_t rtp_sequence_number,uint32_t rtp_timestamp,uint32_t arrival_timestamp)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
ErrorCode()38 int AudioDecoder::ErrorCode() { return 0; }
39
PacketDuration(const uint8_t * encoded,size_t encoded_len)40 int AudioDecoder::PacketDuration(const uint8_t* encoded, size_t encoded_len) {
41 return kNotImplemented;
42 }
43
PacketDurationRedundant(const uint8_t * encoded,size_t encoded_len) const44 int AudioDecoder::PacketDurationRedundant(const uint8_t* encoded,
45 size_t encoded_len) const {
46 return kNotImplemented;
47 }
48
PacketHasFec(const uint8_t * encoded,size_t encoded_len) const49 bool AudioDecoder::PacketHasFec(const uint8_t* encoded,
50 size_t encoded_len) const {
51 return false;
52 }
53
codec_type() const54 NetEqDecoder AudioDecoder::codec_type() const { return codec_type_; }
55
CodecSupported(NetEqDecoder codec_type)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
CodecSampleRateHz(NetEqDecoder codec_type)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
CreateAudioDecoder(NetEqDecoder codec_type)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
ConvertSpeechType(int16_t type)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