• 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 /*
12  * This file generates databases with information about all supported audio
13  * codecs.
14  */
15 
16 #ifndef WEBRTC_MODULES_AUDIO_CODING_MAIN_ACM2_ACM_CODEC_DATABASE_H_
17 #define WEBRTC_MODULES_AUDIO_CODING_MAIN_ACM2_ACM_CODEC_DATABASE_H_
18 
19 #include "webrtc/common_types.h"
20 #include "webrtc/modules/audio_coding/main/acm2/acm_generic_codec.h"
21 #include "webrtc/modules/audio_coding/neteq/interface/neteq.h"
22 
23 namespace webrtc {
24 
25 namespace acm2 {
26 
27 // TODO(tlegrand): replace class ACMCodecDB with a namespace.
28 class ACMCodecDB {
29  public:
30   // Enum with array indexes for the supported codecs. NOTE! The order MUST
31   // be the same as when creating the database in acm_codec_database.cc.
32   enum {
33     kNone = -1
34 #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
35     , kISAC
36 # if (defined(WEBRTC_CODEC_ISAC))
37     , kISACSWB
38     , kISACFB
39 # endif
40 #endif
41 #ifdef WEBRTC_CODEC_PCM16
42     // Mono
43     , kPCM16B
44     , kPCM16Bwb
45     , kPCM16Bswb32kHz
46     // Stereo
47     , kPCM16B_2ch
48     , kPCM16Bwb_2ch
49     , kPCM16Bswb32kHz_2ch
50 #endif
51     // Mono
52     , kPCMU
53     , kPCMA
54     // Stereo
55     , kPCMU_2ch
56     , kPCMA_2ch
57 #ifdef WEBRTC_CODEC_ILBC
58     , kILBC
59 #endif
60 #ifdef WEBRTC_CODEC_AMR
61     , kGSMAMR
62 #endif
63 #ifdef WEBRTC_CODEC_AMRWB
64     , kGSMAMRWB
65 #endif
66 #ifdef WEBRTC_CODEC_CELT
67     // Mono
68     , kCELT32
69     // Stereo
70     , kCELT32_2ch
71 #endif
72 #ifdef WEBRTC_CODEC_G722
73     // Mono
74     , kG722
75     // Stereo
76     , kG722_2ch
77 #endif
78 #ifdef WEBRTC_CODEC_G722_1
79     , kG722_1_32
80     , kG722_1_24
81     , kG722_1_16
82 #endif
83 #ifdef WEBRTC_CODEC_G722_1C
84     , kG722_1C_48
85     , kG722_1C_32
86     , kG722_1C_24
87 #endif
88 #ifdef WEBRTC_CODEC_G729
89     , kG729
90 #endif
91 #ifdef WEBRTC_CODEC_G729_1
92     , kG729_1
93 #endif
94 #ifdef WEBRTC_CODEC_GSMFR
95     , kGSMFR
96 #endif
97 #ifdef WEBRTC_CODEC_OPUS
98     // Mono and stereo
99     , kOpus
100 #endif
101 #ifdef WEBRTC_CODEC_SPEEX
102     , kSPEEX8
103     , kSPEEX16
104 #endif
105     , kCNNB
106     , kCNWB
107     , kCNSWB
108 #ifdef ENABLE_48000_HZ
109     , kCNFB
110 #endif
111 #ifdef WEBRTC_CODEC_AVT
112     , kAVT
113 #endif
114 #ifdef WEBRTC_CODEC_RED
115     , kRED
116 #endif
117     , kNumCodecs
118   };
119 
120   // Set unsupported codecs to -1
121 #ifndef WEBRTC_CODEC_ISAC
122   enum {kISACSWB = -1};
123   enum {kISACFB = -1};
124 # ifndef WEBRTC_CODEC_ISACFX
125   enum {kISAC = -1};
126 # endif
127 #endif
128 #ifndef WEBRTC_CODEC_PCM16
129   // Mono
130   enum {kPCM16B = -1};
131   enum {kPCM16Bwb = -1};
132   enum {kPCM16Bswb32kHz = -1};
133   // Stereo
134   enum {kPCM16B_2ch = -1};
135   enum {kPCM16Bwb_2ch = -1};
136   enum {kPCM16Bswb32kHz_2ch = -1};
137 #endif
138   // 48 kHz not supported, always set to -1.
139   enum {kPCM16Bswb48kHz = -1};
140 #ifndef WEBRTC_CODEC_ILBC
141   enum {kILBC = -1};
142 #endif
143 #ifndef WEBRTC_CODEC_AMR
144   enum {kGSMAMR = -1};
145 #endif
146 #ifndef WEBRTC_CODEC_AMRWB
147   enum {kGSMAMRWB = -1};
148 #endif
149 #ifndef WEBRTC_CODEC_CELT
150   // Mono
151   enum {kCELT32 = -1};
152   // Stereo
153   enum {kCELT32_2ch = -1};
154 #endif
155 #ifndef WEBRTC_CODEC_G722
156   // Mono
157   enum {kG722 = -1};
158   // Stereo
159   enum {kG722_2ch = -1};
160 #endif
161 #ifndef WEBRTC_CODEC_G722_1
162   enum {kG722_1_32 = -1};
163   enum {kG722_1_24 = -1};
164   enum {kG722_1_16 = -1};
165 #endif
166 #ifndef WEBRTC_CODEC_G722_1C
167   enum {kG722_1C_48 = -1};
168   enum {kG722_1C_32 = -1};
169   enum {kG722_1C_24 = -1};
170 #endif
171 #ifndef WEBRTC_CODEC_G729
172   enum {kG729 = -1};
173 #endif
174 #ifndef WEBRTC_CODEC_G729_1
175   enum {kG729_1 = -1};
176 #endif
177 #ifndef WEBRTC_CODEC_GSMFR
178   enum {kGSMFR = -1};
179 #endif
180 #ifndef WEBRTC_CODEC_SPEEX
181   enum {kSPEEX8 = -1};
182   enum {kSPEEX16 = -1};
183 #endif
184 #ifndef WEBRTC_CODEC_OPUS
185   // Mono and stereo
186   enum {kOpus = -1};
187 #endif
188 #ifndef WEBRTC_CODEC_AVT
189   enum {kAVT = -1};
190 #endif
191 #ifndef WEBRTC_CODEC_RED
192   enum {kRED = -1};
193 #endif
194 #ifndef ENABLE_48000_HZ
195   enum { kCNFB = -1 };
196 #endif
197 
198   // kMaxNumCodecs - Maximum number of codecs that can be activated in one
199   //                 build.
200   // kMaxNumPacketSize - Maximum number of allowed packet sizes for one codec.
201   // These might need to be increased if adding a new codec to the database
202   static const int kMaxNumCodecs =  50;
203   static const int kMaxNumPacketSize = 6;
204 
205   // Codec specific settings
206   //
207   // num_packet_sizes     - number of allowed packet sizes.
208   // packet_sizes_samples - list of the allowed packet sizes.
209   // basic_block_samples  - assigned a value different from 0 if the codec
210   //                        requires to be fed with a specific number of samples
211   //                        that can be different from packet size.
212   // channel_support      - number of channels supported to encode;
213   //                        1 = mono, 2 = stereo, etc.
214   // owns_decoder         - if true, it means that the codec should own the
215   //                        decoder instance. In this case, the codec should
216   //                        implement ACMGenericCodec::Decoder(), which returns
217   //                        a pointer to AudioDecoder. This pointer is injected
218   //                        into NetEq when this codec is registered as receive
219   //                        codec.
220   struct CodecSettings {
221     int num_packet_sizes;
222     int packet_sizes_samples[kMaxNumPacketSize];
223     int basic_block_samples;
224     int channel_support;
225     bool owns_decoder;
226   };
227 
228   // Gets codec information from database at the position in database given by
229   // [codec_id].
230   // Input:
231   //   [codec_id] - number that specifies at what position in the database to
232   //                get the information.
233   // Output:
234   //   [codec_inst] - filled with information about the codec.
235   // Return:
236   //   0 if successful, otherwise -1.
237   static int Codec(int codec_id, CodecInst* codec_inst);
238 
239   // Returns codec id and mirror id from database, given the information
240   // received in the input [codec_inst]. Mirror id is a number that tells
241   // where to find the codec's memory (instance). The number is either the
242   // same as codec id (most common), or a number pointing at a different
243   // entry in the database, if the codec has several entries with different
244   // payload types. This is used for codecs that must share one struct even if
245   // the payload type differs.
246   // One example is the codec iSAC which has the same struct for both 16 and
247   // 32 khz, but they have different entries in the database. Let's say the
248   // function is called with iSAC 32kHz. The function will return 1 as that is
249   // the entry in the data base, and [mirror_id] = 0, as that is the entry for
250   // iSAC 16 kHz, which holds the shared memory.
251   // Input:
252   //   [codec_inst] - Information about the codec for which we require the
253   //                  database id.
254   // Output:
255   //   [mirror_id] - mirror id, which most often is the same as the return
256   //                 value, see above.
257   //   [err_message] - if present, in the event of a mismatch found between the
258   //                   input and the database, a descriptive error message is
259   //                   written here.
260   //   [err_message] - if present, the length of error message is returned here.
261   // Return:
262   //   codec id if successful, otherwise < 0.
263   static int CodecNumber(const CodecInst& codec_inst, int* mirror_id,
264                          char* err_message, int max_message_len_byte);
265   static int CodecNumber(const CodecInst& codec_inst, int* mirror_id);
266   static int CodecId(const CodecInst& codec_inst);
267   static int CodecId(const char* payload_name, int frequency, int channels);
268   static int ReceiverCodecNumber(const CodecInst& codec_inst, int* mirror_id);
269 
270   // Returns the codec sampling frequency for codec with id = "codec_id" in
271   // database.
272   // TODO(tlegrand): Check if function is needed, or if we can change
273   // to access database directly.
274   // Input:
275   //   [codec_id] - number that specifies at what position in the database to
276   //                get the information.
277   // Return:
278   //   codec sampling frequency if successful, otherwise -1.
279   static int CodecFreq(int codec_id);
280 
281   // Return the codec's basic coding block size in samples.
282   // TODO(tlegrand): Check if function is needed, or if we can change
283   // to access database directly.
284   // Input:
285   //   [codec_id] - number that specifies at what position in the database to
286   //                get the information.
287   // Return:
288   //   codec basic block size if successful, otherwise -1.
289   static int BasicCodingBlock(int codec_id);
290 
291   // Returns the NetEQ decoder database.
292   static const NetEqDecoder* NetEQDecoders();
293 
294   // Returns mirror id, which is a number that tells where to find the codec's
295   // memory (instance). It is either the same as codec id (most common), or a
296   // number pointing at a different entry in the database, if the codec have
297   // several entries with different payload types. This is used for codecs that
298   // must share struct even if the payload type differs.
299   // TODO(tlegrand): Check if function is needed, or if we can change
300   // to access database directly.
301   // Input:
302   //   [codec_id] - number that specifies codec's position in the database.
303   // Return:
304   //   Mirror id on success, otherwise -1.
305   static int MirrorID(int codec_id);
306 
307   // Create memory/instance for storing codec state.
308   // Input:
309   //   [codec_inst] - information about codec. Only name of codec, "plname", is
310   //                  used in this function.
311   static ACMGenericCodec* CreateCodecInstance(const CodecInst& codec_inst);
312 
313   // Specifies if the codec specified by |codec_id| MUST own its own decoder.
314   // This is the case for codecs which *should* share a single codec instance
315   // between encoder and decoder. Or for codecs which ACM should have control
316   // over the decoder. For instance iSAC is such a codec that encoder and
317   // decoder share the same codec instance.
318   static bool OwnsDecoder(int codec_id);
319 
320   // Checks if the bitrate is valid for the codec.
321   // Input:
322   //   [codec_id] - number that specifies codec's position in the database.
323   //   [rate] - bitrate to check.
324   //   [frame_size_samples] - (used for iLBC) specifies which frame size to go
325   //                          with the rate.
326   static bool IsRateValid(int codec_id, int rate);
327   static bool IsISACRateValid(int rate);
328   static bool IsILBCRateValid(int rate, int frame_size_samples);
329   static bool IsAMRRateValid(int rate);
330   static bool IsAMRwbRateValid(int rate);
331   static bool IsG7291RateValid(int rate);
332   static bool IsSpeexRateValid(int rate);
333   static bool IsOpusRateValid(int rate);
334   static bool IsCeltRateValid(int rate);
335 
336   // Check if the payload type is valid, meaning that it is in the valid range
337   // of 0 to 127.
338   // Input:
339   //   [payload_type] - payload type.
340   static bool ValidPayloadType(int payload_type);
341 
342   // Databases with information about the supported codecs
343   // database_ - stored information about all codecs: payload type, name,
344   //             sampling frequency, packet size in samples, default channel
345   //             support, and default rate.
346   // codec_settings_ - stored codec settings: number of allowed packet sizes,
347   //                   a vector with the allowed packet sizes, basic block
348   //                   samples, and max number of channels that are supported.
349   // neteq_decoders_ - list of supported decoders in NetEQ.
350   static const CodecInst database_[kMaxNumCodecs];
351   static const CodecSettings codec_settings_[kMaxNumCodecs];
352   static const NetEqDecoder neteq_decoders_[kMaxNumCodecs];
353 };
354 
355 }  // namespace acm2
356 
357 }  // namespace webrtc
358 
359 #endif  // WEBRTC_MODULES_AUDIO_CODING_MAIN_ACM2_ACM_CODEC_DATABASE_H_
360