• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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