blob: 3e9b4645d50637599b9f996d270cd7ef67ca08d6 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
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/neteq4/interface/audio_decoder.h"
12
13#include <assert.h>
14
15#include "webrtc/modules/audio_coding/neteq4/audio_decoder_impl.h"
16
17namespace webrtc {
18
19bool AudioDecoder::CodecSupported(NetEqDecoder codec_type) {
20 switch (codec_type) {
21 case kDecoderPCMu:
22 case kDecoderPCMa:
23 case kDecoderPCMu_2ch:
24 case kDecoderPCMa_2ch:
25#ifdef WEBRTC_CODEC_ILBC
26 case kDecoderILBC:
27#endif
28#if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC)
29 case kDecoderISAC:
30#endif
31#ifdef WEBRTC_CODEC_ISAC
32 case kDecoderISACswb:
33#endif
34#ifdef WEBRTC_CODEC_PCM16
35 case kDecoderPCM16B:
36 case kDecoderPCM16Bwb:
37 case kDecoderPCM16Bswb32kHz:
38 case kDecoderPCM16Bswb48kHz:
39 case kDecoderPCM16B_2ch:
40 case kDecoderPCM16Bwb_2ch:
41 case kDecoderPCM16Bswb32kHz_2ch:
42 case kDecoderPCM16Bswb48kHz_2ch:
43 case kDecoderPCM16B_5ch:
44#endif
45#ifdef WEBRTC_CODEC_G722
46 case kDecoderG722:
47#endif
48#ifdef WEBRTC_CODEC_OPUS
49 case kDecoderOpus:
50 case kDecoderOpus_2ch:
51#endif
52 case kDecoderRED:
53 case kDecoderAVT:
54 case kDecoderCNGnb:
55 case kDecoderCNGwb:
56 case kDecoderCNGswb32kHz:
57 case kDecoderCNGswb48kHz:
58 case kDecoderArbitrary: {
59 return true;
60 }
61 default: {
62 return false;
63 }
64 }
65}
66
67int AudioDecoder::CodecSampleRateHz(NetEqDecoder codec_type) {
68 switch (codec_type) {
69 case kDecoderPCMu:
70 case kDecoderPCMa:
71 case kDecoderPCMu_2ch:
72 case kDecoderPCMa_2ch:
73#ifdef WEBRTC_CODEC_ILBC
74 case kDecoderILBC:
75#endif
76#ifdef WEBRTC_CODEC_PCM16
77 case kDecoderPCM16B:
78 case kDecoderPCM16B_2ch:
79 case kDecoderPCM16B_5ch:
80#endif
81 case kDecoderCNGnb: {
82 return 8000;
83 }
84#if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC)
85 case kDecoderISAC:
86#endif
87#ifdef WEBRTC_CODEC_PCM16
88 case kDecoderPCM16Bwb:
89 case kDecoderPCM16Bwb_2ch:
90#endif
91#ifdef WEBRTC_CODEC_G722
92 case kDecoderG722:
93#endif
94 case kDecoderCNGwb: {
95 return 16000;
96 }
97#ifdef WEBRTC_CODEC_ISAC
98 case kDecoderISACswb:
99#endif
100#ifdef WEBRTC_CODEC_PCM16
101 case kDecoderPCM16Bswb32kHz:
102 case kDecoderPCM16Bswb32kHz_2ch:
103#endif
104 case kDecoderCNGswb32kHz: {
105 return 32000;
106 }
107#ifdef WEBRTC_CODEC_PCM16
108 case kDecoderPCM16Bswb48kHz:
109 case kDecoderPCM16Bswb48kHz_2ch: {
110 return 48000;
111 }
112#endif
113#ifdef WEBRTC_CODEC_OPUS
114 case kDecoderOpus:
115 case kDecoderOpus_2ch: {
116 return 32000;
117 }
118#endif
119 case kDecoderCNGswb48kHz: {
120 // TODO(tlegrand): Remove limitation once ACM has full 48 kHz support.
121 return 32000;
122 }
123 default: {
124 return -1; // Undefined sample rate.
125 }
126 }
127}
128
129AudioDecoder* AudioDecoder::CreateAudioDecoder(NetEqDecoder codec_type) {
130 if (!CodecSupported(codec_type)) {
131 return NULL;
132 }
133 switch (codec_type) {
134 case kDecoderPCMu:
135 return new AudioDecoderPcmU;
136 case kDecoderPCMa:
137 return new AudioDecoderPcmA;
138 case kDecoderPCMu_2ch:
139 return new AudioDecoderPcmUMultiCh(2);
140 case kDecoderPCMa_2ch:
141 return new AudioDecoderPcmAMultiCh(2);
142#ifdef WEBRTC_CODEC_ILBC
143 case kDecoderILBC:
144 return new AudioDecoderIlbc;
145#endif
146#if defined(WEBRTC_CODEC_ISACFX)
147 case kDecoderISAC:
148 return new AudioDecoderIsacFix;
149#elif defined(WEBRTC_CODEC_ISAC)
150 case kDecoderISAC:
151 return new AudioDecoderIsac;
152#endif
153#ifdef WEBRTC_CODEC_ISAC
154 case kDecoderISACswb:
155 return new AudioDecoderIsacSwb;
156#endif
157#ifdef WEBRTC_CODEC_PCM16
158 case kDecoderPCM16B:
159 case kDecoderPCM16Bwb:
160 case kDecoderPCM16Bswb32kHz:
161 case kDecoderPCM16Bswb48kHz:
162 return new AudioDecoderPcm16B(codec_type);
163 case kDecoderPCM16B_2ch:
164 case kDecoderPCM16Bwb_2ch:
165 case kDecoderPCM16Bswb32kHz_2ch:
166 case kDecoderPCM16Bswb48kHz_2ch:
167 case kDecoderPCM16B_5ch:
168 return new AudioDecoderPcm16BMultiCh(codec_type);
169#endif
170#ifdef WEBRTC_CODEC_G722
171 case kDecoderG722:
172 return new AudioDecoderG722;
173#endif
174#ifdef WEBRTC_CODEC_OPUS
175 case kDecoderOpus:
176 case kDecoderOpus_2ch:
177 return new AudioDecoderOpus(codec_type);
178#endif
179 case kDecoderCNGnb:
180 case kDecoderCNGwb:
181 case kDecoderCNGswb32kHz:
182 case kDecoderCNGswb48kHz:
183 return new AudioDecoderCng(codec_type);
184 case kDecoderRED:
185 case kDecoderAVT:
186 case kDecoderArbitrary:
187 default: {
188 return NULL;
189 }
190 }
191}
192
193AudioDecoder::SpeechType AudioDecoder::ConvertSpeechType(int16_t type) {
194 switch (type) {
195 case 0: // TODO(hlundin): Both iSAC and Opus return 0 for speech.
196 case 1:
197 return kSpeech;
198 case 2:
199 return kComfortNoise;
200 default:
201 assert(false);
202 return kSpeech;
203 }
204}
205
206} // namespace webrtc