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