Home | History | Annotate | Download | only in neteq
      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/audio_decoder_impl.h"
     12 
     13 #include <assert.h>
     14 
     15 #include "webrtc/base/checks.h"
     16 #include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h"
     17 #include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
     18 #ifdef WEBRTC_CODEC_G722
     19 #include "webrtc/modules/audio_coding/codecs/g722/audio_decoder_g722.h"
     20 #endif
     21 #ifdef WEBRTC_CODEC_ILBC
     22 #include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h"
     23 #endif
     24 #ifdef WEBRTC_CODEC_ISACFX
     25 #include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h"
     26 #include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"
     27 #endif
     28 #ifdef WEBRTC_CODEC_ISAC
     29 #include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"
     30 #include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
     31 #endif
     32 #ifdef WEBRTC_CODEC_OPUS
     33 #include "webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.h"
     34 #endif
     35 #include "webrtc/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h"
     36 
     37 namespace webrtc {
     38 
     39 AudioDecoderCng::AudioDecoderCng() {
     40   RTC_CHECK_EQ(0, WebRtcCng_CreateDec(&dec_state_));
     41   WebRtcCng_InitDec(dec_state_);
     42 }
     43 
     44 AudioDecoderCng::~AudioDecoderCng() {
     45   WebRtcCng_FreeDec(dec_state_);
     46 }
     47 
     48 void AudioDecoderCng::Reset() {
     49   WebRtcCng_InitDec(dec_state_);
     50 }
     51 
     52 int AudioDecoderCng::IncomingPacket(const uint8_t* payload,
     53                                     size_t payload_len,
     54                                     uint16_t rtp_sequence_number,
     55                                     uint32_t rtp_timestamp,
     56                                     uint32_t arrival_timestamp) {
     57   return -1;
     58 }
     59 
     60 CNG_dec_inst* AudioDecoderCng::CngDecoderInstance() {
     61   return dec_state_;
     62 }
     63 
     64 size_t AudioDecoderCng::Channels() const {
     65   return 1;
     66 }
     67 
     68 int AudioDecoderCng::DecodeInternal(const uint8_t* encoded,
     69                                     size_t encoded_len,
     70                                     int sample_rate_hz,
     71                                     int16_t* decoded,
     72                                     SpeechType* speech_type) {
     73   return -1;
     74 }
     75 
     76 bool CodecSupported(NetEqDecoder codec_type) {
     77   switch (codec_type) {
     78     case NetEqDecoder::kDecoderPCMu:
     79     case NetEqDecoder::kDecoderPCMa:
     80     case NetEqDecoder::kDecoderPCMu_2ch:
     81     case NetEqDecoder::kDecoderPCMa_2ch:
     82 #ifdef WEBRTC_CODEC_ILBC
     83     case NetEqDecoder::kDecoderILBC:
     84 #endif
     85 #if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC)
     86     case NetEqDecoder::kDecoderISAC:
     87 #endif
     88 #ifdef WEBRTC_CODEC_ISAC
     89     case NetEqDecoder::kDecoderISACswb:
     90 #endif
     91     case NetEqDecoder::kDecoderPCM16B:
     92     case NetEqDecoder::kDecoderPCM16Bwb:
     93     case NetEqDecoder::kDecoderPCM16Bswb32kHz:
     94     case NetEqDecoder::kDecoderPCM16Bswb48kHz:
     95     case NetEqDecoder::kDecoderPCM16B_2ch:
     96     case NetEqDecoder::kDecoderPCM16Bwb_2ch:
     97     case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch:
     98     case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch:
     99     case NetEqDecoder::kDecoderPCM16B_5ch:
    100 #ifdef WEBRTC_CODEC_G722
    101     case NetEqDecoder::kDecoderG722:
    102     case NetEqDecoder::kDecoderG722_2ch:
    103 #endif
    104 #ifdef WEBRTC_CODEC_OPUS
    105     case NetEqDecoder::kDecoderOpus:
    106     case NetEqDecoder::kDecoderOpus_2ch:
    107 #endif
    108     case NetEqDecoder::kDecoderRED:
    109     case NetEqDecoder::kDecoderAVT:
    110     case NetEqDecoder::kDecoderCNGnb:
    111     case NetEqDecoder::kDecoderCNGwb:
    112     case NetEqDecoder::kDecoderCNGswb32kHz:
    113     case NetEqDecoder::kDecoderCNGswb48kHz:
    114     case NetEqDecoder::kDecoderArbitrary: {
    115       return true;
    116     }
    117     default: {
    118       return false;
    119     }
    120   }
    121 }
    122 
    123 int CodecSampleRateHz(NetEqDecoder codec_type) {
    124   switch (codec_type) {
    125     case NetEqDecoder::kDecoderPCMu:
    126     case NetEqDecoder::kDecoderPCMa:
    127     case NetEqDecoder::kDecoderPCMu_2ch:
    128     case NetEqDecoder::kDecoderPCMa_2ch:
    129 #ifdef WEBRTC_CODEC_ILBC
    130     case NetEqDecoder::kDecoderILBC:
    131 #endif
    132     case NetEqDecoder::kDecoderPCM16B:
    133     case NetEqDecoder::kDecoderPCM16B_2ch:
    134     case NetEqDecoder::kDecoderPCM16B_5ch:
    135     case NetEqDecoder::kDecoderCNGnb: {
    136       return 8000;
    137     }
    138 #if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC)
    139     case NetEqDecoder::kDecoderISAC:
    140 #endif
    141     case NetEqDecoder::kDecoderPCM16Bwb:
    142     case NetEqDecoder::kDecoderPCM16Bwb_2ch:
    143 #ifdef WEBRTC_CODEC_G722
    144     case NetEqDecoder::kDecoderG722:
    145     case NetEqDecoder::kDecoderG722_2ch:
    146 #endif
    147     case NetEqDecoder::kDecoderCNGwb: {
    148       return 16000;
    149     }
    150 #ifdef WEBRTC_CODEC_ISAC
    151     case NetEqDecoder::kDecoderISACswb:
    152 #endif
    153     case NetEqDecoder::kDecoderPCM16Bswb32kHz:
    154     case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch:
    155     case NetEqDecoder::kDecoderCNGswb32kHz: {
    156       return 32000;
    157     }
    158     case NetEqDecoder::kDecoderPCM16Bswb48kHz:
    159     case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch: {
    160       return 48000;
    161     }
    162 #ifdef WEBRTC_CODEC_OPUS
    163     case NetEqDecoder::kDecoderOpus:
    164     case NetEqDecoder::kDecoderOpus_2ch: {
    165       return 48000;
    166     }
    167 #endif
    168     case NetEqDecoder::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 
    178 AudioDecoder* CreateAudioDecoder(NetEqDecoder codec_type) {
    179   if (!CodecSupported(codec_type)) {
    180     return NULL;
    181   }
    182   switch (codec_type) {
    183     case NetEqDecoder::kDecoderPCMu:
    184       return new AudioDecoderPcmU(1);
    185     case NetEqDecoder::kDecoderPCMa:
    186       return new AudioDecoderPcmA(1);
    187     case NetEqDecoder::kDecoderPCMu_2ch:
    188       return new AudioDecoderPcmU(2);
    189     case NetEqDecoder::kDecoderPCMa_2ch:
    190       return new AudioDecoderPcmA(2);
    191 #ifdef WEBRTC_CODEC_ILBC
    192     case NetEqDecoder::kDecoderILBC:
    193       return new AudioDecoderIlbc;
    194 #endif
    195 #if defined(WEBRTC_CODEC_ISACFX)
    196     case NetEqDecoder::kDecoderISAC:
    197       return new AudioDecoderIsacFix();
    198 #elif defined(WEBRTC_CODEC_ISAC)
    199     case NetEqDecoder::kDecoderISAC:
    200     case NetEqDecoder::kDecoderISACswb:
    201       return new AudioDecoderIsac();
    202 #endif
    203     case NetEqDecoder::kDecoderPCM16B:
    204     case NetEqDecoder::kDecoderPCM16Bwb:
    205     case NetEqDecoder::kDecoderPCM16Bswb32kHz:
    206     case NetEqDecoder::kDecoderPCM16Bswb48kHz:
    207       return new AudioDecoderPcm16B(1);
    208     case NetEqDecoder::kDecoderPCM16B_2ch:
    209     case NetEqDecoder::kDecoderPCM16Bwb_2ch:
    210     case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch:
    211     case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch:
    212       return new AudioDecoderPcm16B(2);
    213     case NetEqDecoder::kDecoderPCM16B_5ch:
    214       return new AudioDecoderPcm16B(5);
    215 #ifdef WEBRTC_CODEC_G722
    216     case NetEqDecoder::kDecoderG722:
    217       return new AudioDecoderG722;
    218     case NetEqDecoder::kDecoderG722_2ch:
    219       return new AudioDecoderG722Stereo;
    220 #endif
    221 #ifdef WEBRTC_CODEC_OPUS
    222     case NetEqDecoder::kDecoderOpus:
    223       return new AudioDecoderOpus(1);
    224     case NetEqDecoder::kDecoderOpus_2ch:
    225       return new AudioDecoderOpus(2);
    226 #endif
    227     case NetEqDecoder::kDecoderCNGnb:
    228     case NetEqDecoder::kDecoderCNGwb:
    229     case NetEqDecoder::kDecoderCNGswb32kHz:
    230     case NetEqDecoder::kDecoderCNGswb48kHz:
    231       return new AudioDecoderCng;
    232     case NetEqDecoder::kDecoderRED:
    233     case NetEqDecoder::kDecoderAVT:
    234     case NetEqDecoder::kDecoderArbitrary:
    235     default: {
    236       return NULL;
    237     }
    238   }
    239 }
    240 
    241 }  // namespace webrtc
    242