Home | History | Annotate | Download | only in acm2
      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