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 #include <stdlib.h>
     15 
     16 #include <string>
     17 
     18 #include "testing/gtest/include/gtest/gtest.h"
     19 #include "webrtc/common_audio/resampler/include/resampler.h"
     20 #ifdef WEBRTC_CODEC_CELT
     21 #include "webrtc/modules/audio_coding/codecs/celt/include/celt_interface.h"
     22 #endif
     23 #include "webrtc/modules/audio_coding/codecs/g711/include/g711_interface.h"
     24 #include "webrtc/modules/audio_coding/codecs/g722/include/g722_interface.h"
     25 #include "webrtc/modules/audio_coding/codecs/ilbc/interface/ilbc.h"
     26 #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h"
     27 #include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h"
     28 #include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h"
     29 #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h"
     30 #include "webrtc/system_wrappers/interface/data_log.h"
     31 #include "webrtc/test/testsupport/fileutils.h"
     32 
     33 namespace webrtc {
     34 
     35 class AudioDecoderTest : public ::testing::Test {
     36  protected:
     37   AudioDecoderTest()
     38     : input_fp_(NULL),
     39       input_(NULL),
     40       encoded_(NULL),
     41       decoded_(NULL),
     42       frame_size_(0),
     43       data_length_(0),
     44       encoded_bytes_(0),
     45       channels_(1),
     46       decoder_(NULL) {
     47     input_file_ = webrtc::test::ProjectRootPath() +
     48         "resources/audio_coding/testfile32kHz.pcm";
     49   }
     50 
     51   virtual ~AudioDecoderTest() {}
     52 
     53   virtual void SetUp() {
     54     // Create arrays.
     55     ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0";
     56     input_ = new int16_t[data_length_];
     57     // Longest encoded data is produced by PCM16b with 2 bytes per sample.
     58     encoded_ = new uint8_t[data_length_ * 2];
     59     decoded_ = new int16_t[data_length_ * channels_];
     60     // Open input file.
     61     input_fp_ = fopen(input_file_.c_str(), "rb");
     62     ASSERT_TRUE(input_fp_ != NULL) << "Failed to open file " << input_file_;
     63     // Read data to |input_|.
     64     ASSERT_EQ(data_length_,
     65               fread(input_, sizeof(int16_t), data_length_, input_fp_)) <<
     66                   "Could not read enough data from file";
     67     // Logging to view input and output in Matlab.
     68     // Use 'gyp -Denable_data_logging=1' to enable logging.
     69     DataLog::CreateLog();
     70     DataLog::AddTable("CodecTest");
     71     DataLog::AddColumn("CodecTest", "input", 1);
     72     DataLog::AddColumn("CodecTest", "output", 1);
     73   }
     74 
     75   virtual void TearDown() {
     76     delete decoder_;
     77     decoder_ = NULL;
     78     // Close input file.
     79     fclose(input_fp_);
     80     // Delete arrays.
     81     delete [] input_;
     82     input_ = NULL;
     83     delete [] encoded_;
     84     encoded_ = NULL;
     85     delete [] decoded_;
     86     decoded_ = NULL;
     87     // Close log.
     88     DataLog::ReturnLog();
     89   }
     90 
     91   virtual void InitEncoder() { }
     92 
     93   // This method must be implemented for all tests derived from this class.
     94   virtual int EncodeFrame(const int16_t* input, size_t input_len,
     95                           uint8_t* output) = 0;
     96 
     97   // Encodes and decodes audio. The absolute difference between the input and
     98   // output is compared vs |tolerance|, and the mean-squared error is compared
     99   // with |mse|. The encoded stream should contain |expected_bytes|. For stereo
    100   // audio, the absolute difference between the two channels is compared vs
    101   // |channel_diff_tolerance|.
    102   void EncodeDecodeTest(size_t expected_bytes, int tolerance, double mse,
    103                         int delay = 0, int channel_diff_tolerance = 0) {
    104     ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
    105     ASSERT_GE(channel_diff_tolerance, 0) <<
    106         "Test must define a channel_diff_tolerance >= 0";
    107     size_t processed_samples = 0u;
    108     encoded_bytes_ = 0u;
    109     InitEncoder();
    110     EXPECT_EQ(0, decoder_->Init());
    111     while (processed_samples + frame_size_ <= data_length_) {
    112       size_t enc_len = EncodeFrame(&input_[processed_samples], frame_size_,
    113                                    &encoded_[encoded_bytes_]);
    114       AudioDecoder::SpeechType speech_type;
    115       size_t dec_len = decoder_->Decode(&encoded_[encoded_bytes_], enc_len,
    116                                         &decoded_[processed_samples *
    117                                                   channels_],
    118                                         &speech_type);
    119       EXPECT_EQ(frame_size_ * channels_, dec_len);
    120       encoded_bytes_ += enc_len;
    121       processed_samples += frame_size_;
    122     }
    123     // For some codecs it doesn't make sense to check expected number of bytes,
    124     // since the number can vary for different platforms. Opus and iSAC are
    125     // such codecs. In this case expected_bytes is set to 0.
    126     if (expected_bytes) {
    127       EXPECT_EQ(expected_bytes, encoded_bytes_);
    128     }
    129     CompareInputOutput(processed_samples, tolerance, delay);
    130     if (channels_ == 2)
    131       CompareTwoChannels(processed_samples, channel_diff_tolerance);
    132     EXPECT_LE(MseInputOutput(processed_samples, delay), mse);
    133   }
    134 
    135   // The absolute difference between the input and output (the first channel) is
    136   // compared vs |tolerance|. The parameter |delay| is used to correct for codec
    137   // delays.
    138   virtual void CompareInputOutput(size_t num_samples, int tolerance,
    139                                   int delay) const {
    140     assert(num_samples <= data_length_);
    141     for (unsigned int n = 0; n < num_samples - delay; ++n) {
    142       ASSERT_NEAR(input_[n], decoded_[channels_ * n + delay], tolerance) <<
    143           "Exit test on first diff; n = " << n;
    144       DataLog::InsertCell("CodecTest", "input", input_[n]);
    145       DataLog::InsertCell("CodecTest", "output", decoded_[channels_ * n]);
    146       DataLog::NextRow("CodecTest");
    147     }
    148   }
    149 
    150   // The absolute difference between the two channels in a stereo is compared vs
    151   // |tolerance|.
    152   virtual void CompareTwoChannels(size_t samples_per_channel,
    153                                   int tolerance) const {
    154     assert(samples_per_channel <= data_length_);
    155     for (unsigned int n = 0; n < samples_per_channel; ++n)
    156       ASSERT_NEAR(decoded_[channels_ * n], decoded_[channels_ * n + 1],
    157                   tolerance) << "Stereo samples differ.";
    158   }
    159 
    160   // Calculates mean-squared error between input and output (the first channel).
    161   // The parameter |delay| is used to correct for codec delays.
    162   virtual double MseInputOutput(size_t num_samples, int delay) const {
    163     assert(num_samples <= data_length_);
    164     if (num_samples == 0) return 0.0;
    165     double squared_sum = 0.0;
    166     for (unsigned int n = 0; n < num_samples - delay; ++n) {
    167       squared_sum += (input_[n] - decoded_[channels_ * n + delay]) *
    168           (input_[n] - decoded_[channels_ * n + delay]);
    169     }
    170     return squared_sum / (num_samples - delay);
    171   }
    172 
    173   // Encodes a payload and decodes it twice with decoder re-init before each
    174   // decode. Verifies that the decoded result is the same.
    175   void ReInitTest() {
    176     int16_t* output1 = decoded_;
    177     int16_t* output2 = decoded_ + frame_size_;
    178     InitEncoder();
    179     size_t enc_len = EncodeFrame(input_, frame_size_, encoded_);
    180     size_t dec_len;
    181     AudioDecoder::SpeechType speech_type1, speech_type2;
    182     EXPECT_EQ(0, decoder_->Init());
    183     dec_len = decoder_->Decode(encoded_, enc_len, output1, &speech_type1);
    184     EXPECT_EQ(frame_size_ * channels_, dec_len);
    185     // Re-init decoder and decode again.
    186     EXPECT_EQ(0, decoder_->Init());
    187     dec_len = decoder_->Decode(encoded_, enc_len, output2, &speech_type2);
    188     EXPECT_EQ(frame_size_ * channels_, dec_len);
    189     for (unsigned int n = 0; n < frame_size_; ++n) {
    190       ASSERT_EQ(output1[n], output2[n]) << "Exit test on first diff; n = " << n;
    191     }
    192     EXPECT_EQ(speech_type1, speech_type2);
    193   }
    194 
    195   // Call DecodePlc and verify that the correct number of samples is produced.
    196   void DecodePlcTest() {
    197     InitEncoder();
    198     size_t enc_len = EncodeFrame(input_, frame_size_, encoded_);
    199     AudioDecoder::SpeechType speech_type;
    200     EXPECT_EQ(0, decoder_->Init());
    201     size_t dec_len =
    202         decoder_->Decode(encoded_, enc_len, decoded_, &speech_type);
    203     EXPECT_EQ(frame_size_ * channels_, dec_len);
    204     // Call DecodePlc and verify that we get one frame of data.
    205     // (Overwrite the output from the above Decode call, but that does not
    206     // matter.)
    207     dec_len = decoder_->DecodePlc(1, decoded_);
    208     EXPECT_EQ(frame_size_ * channels_, dec_len);
    209   }
    210 
    211   std::string input_file_;
    212   FILE* input_fp_;
    213   int16_t* input_;
    214   uint8_t* encoded_;
    215   int16_t* decoded_;
    216   size_t frame_size_;
    217   size_t data_length_;
    218   size_t encoded_bytes_;
    219   size_t channels_;
    220   AudioDecoder* decoder_;
    221 };
    222 
    223 class AudioDecoderPcmUTest : public AudioDecoderTest {
    224  protected:
    225   AudioDecoderPcmUTest() : AudioDecoderTest() {
    226     frame_size_ = 160;
    227     data_length_ = 10 * frame_size_;
    228     decoder_ = new AudioDecoderPcmU;
    229     assert(decoder_);
    230   }
    231 
    232   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    233                           uint8_t* output) {
    234     int enc_len_bytes =
    235         WebRtcG711_EncodeU(NULL, const_cast<int16_t*>(input),
    236                            static_cast<int>(input_len_samples),
    237                            reinterpret_cast<int16_t*>(output));
    238     EXPECT_EQ(input_len_samples, static_cast<size_t>(enc_len_bytes));
    239     return enc_len_bytes;
    240   }
    241 };
    242 
    243 class AudioDecoderPcmATest : public AudioDecoderTest {
    244  protected:
    245   AudioDecoderPcmATest() : AudioDecoderTest() {
    246     frame_size_ = 160;
    247     data_length_ = 10 * frame_size_;
    248     decoder_ = new AudioDecoderPcmA;
    249     assert(decoder_);
    250   }
    251 
    252   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    253                           uint8_t* output) {
    254     int enc_len_bytes =
    255         WebRtcG711_EncodeA(NULL, const_cast<int16_t*>(input),
    256                            static_cast<int>(input_len_samples),
    257                            reinterpret_cast<int16_t*>(output));
    258     EXPECT_EQ(input_len_samples, static_cast<size_t>(enc_len_bytes));
    259     return enc_len_bytes;
    260   }
    261 };
    262 
    263 class AudioDecoderPcm16BTest : public AudioDecoderTest {
    264  protected:
    265   AudioDecoderPcm16BTest() : AudioDecoderTest() {
    266     frame_size_ = 160;
    267     data_length_ = 10 * frame_size_;
    268     decoder_ = new AudioDecoderPcm16B(kDecoderPCM16B);
    269     assert(decoder_);
    270   }
    271 
    272   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    273                           uint8_t* output) {
    274     int enc_len_bytes = WebRtcPcm16b_EncodeW16(
    275         const_cast<int16_t*>(input), static_cast<int>(input_len_samples),
    276         reinterpret_cast<int16_t*>(output));
    277     EXPECT_EQ(2 * input_len_samples, static_cast<size_t>(enc_len_bytes));
    278     return enc_len_bytes;
    279   }
    280 };
    281 
    282 class AudioDecoderIlbcTest : public AudioDecoderTest {
    283  protected:
    284   AudioDecoderIlbcTest() : AudioDecoderTest() {
    285     frame_size_ = 240;
    286     data_length_ = 10 * frame_size_;
    287     decoder_ = new AudioDecoderIlbc;
    288     assert(decoder_);
    289     WebRtcIlbcfix_EncoderCreate(&encoder_);
    290   }
    291 
    292   ~AudioDecoderIlbcTest() {
    293     WebRtcIlbcfix_EncoderFree(encoder_);
    294   }
    295 
    296   virtual void InitEncoder() {
    297     ASSERT_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, 30));  // 30 ms.
    298   }
    299 
    300   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    301                           uint8_t* output) {
    302     int enc_len_bytes =
    303         WebRtcIlbcfix_Encode(encoder_, input,
    304                              static_cast<int>(input_len_samples),
    305                              reinterpret_cast<int16_t*>(output));
    306     EXPECT_EQ(50, enc_len_bytes);
    307     return enc_len_bytes;
    308   }
    309 
    310   // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
    311   // not return any data. It simply resets a few states and returns 0.
    312   void DecodePlcTest() {
    313     InitEncoder();
    314     size_t enc_len = EncodeFrame(input_, frame_size_, encoded_);
    315     AudioDecoder::SpeechType speech_type;
    316     EXPECT_EQ(0, decoder_->Init());
    317     size_t dec_len =
    318         decoder_->Decode(encoded_, enc_len, decoded_, &speech_type);
    319     EXPECT_EQ(frame_size_, dec_len);
    320     // Simply call DecodePlc and verify that we get 0 as return value.
    321     EXPECT_EQ(0, decoder_->DecodePlc(1, decoded_));
    322   }
    323 
    324   iLBC_encinst_t* encoder_;
    325 };
    326 
    327 class AudioDecoderIsacFloatTest : public AudioDecoderTest {
    328  protected:
    329   AudioDecoderIsacFloatTest() : AudioDecoderTest() {
    330     input_size_ = 160;
    331     frame_size_ = 480;
    332     data_length_ = 10 * frame_size_;
    333     decoder_ = new AudioDecoderIsac;
    334     assert(decoder_);
    335     WebRtcIsac_Create(&encoder_);
    336     WebRtcIsac_SetEncSampRate(encoder_, 16000);
    337   }
    338 
    339   ~AudioDecoderIsacFloatTest() {
    340     WebRtcIsac_Free(encoder_);
    341   }
    342 
    343   virtual void InitEncoder() {
    344     ASSERT_EQ(0, WebRtcIsac_EncoderInit(encoder_, 1));  // Fixed mode.
    345     ASSERT_EQ(0, WebRtcIsac_Control(encoder_, 32000, 30));  // 32 kbps, 30 ms.
    346   }
    347 
    348   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    349                           uint8_t* output) {
    350     // Insert 3 * 10 ms. Expect non-zero output on third call.
    351     EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
    352     input += input_size_;
    353     EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
    354     input += input_size_;
    355     int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output);
    356     EXPECT_GT(enc_len_bytes, 0);
    357     return enc_len_bytes;
    358   }
    359 
    360   ISACStruct* encoder_;
    361   int input_size_;
    362 };
    363 
    364 class AudioDecoderIsacSwbTest : public AudioDecoderTest {
    365  protected:
    366   AudioDecoderIsacSwbTest() : AudioDecoderTest() {
    367     input_size_ = 320;
    368     frame_size_ = 960;
    369     data_length_ = 10 * frame_size_;
    370     decoder_ = new AudioDecoderIsacSwb;
    371     assert(decoder_);
    372     WebRtcIsac_Create(&encoder_);
    373     WebRtcIsac_SetEncSampRate(encoder_, 32000);
    374   }
    375 
    376   ~AudioDecoderIsacSwbTest() {
    377     WebRtcIsac_Free(encoder_);
    378   }
    379 
    380   virtual void InitEncoder() {
    381     ASSERT_EQ(0, WebRtcIsac_EncoderInit(encoder_, 1));  // Fixed mode.
    382     ASSERT_EQ(0, WebRtcIsac_Control(encoder_, 32000, 30));  // 32 kbps, 30 ms.
    383   }
    384 
    385   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    386                           uint8_t* output) {
    387     // Insert 3 * 10 ms. Expect non-zero output on third call.
    388     EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
    389     input += input_size_;
    390     EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
    391     input += input_size_;
    392     int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output);
    393     EXPECT_GT(enc_len_bytes, 0);
    394     return enc_len_bytes;
    395   }
    396 
    397   ISACStruct* encoder_;
    398   int input_size_;
    399 };
    400 
    401 // This test is identical to AudioDecoderIsacSwbTest, except that it creates
    402 // an AudioDecoderIsacFb decoder object.
    403 class AudioDecoderIsacFbTest : public AudioDecoderIsacSwbTest {
    404  protected:
    405   AudioDecoderIsacFbTest() : AudioDecoderIsacSwbTest() {
    406     // Delete the |decoder_| that was created by AudioDecoderIsacSwbTest and
    407     // create an AudioDecoderIsacFb object instead.
    408     delete decoder_;
    409     decoder_ = new AudioDecoderIsacFb;
    410     assert(decoder_);
    411   }
    412 };
    413 
    414 class AudioDecoderIsacFixTest : public AudioDecoderTest {
    415  protected:
    416   AudioDecoderIsacFixTest() : AudioDecoderTest() {
    417     input_size_ = 160;
    418     frame_size_ = 480;
    419     data_length_ = 10 * frame_size_;
    420     decoder_ = new AudioDecoderIsacFix;
    421     assert(decoder_);
    422     WebRtcIsacfix_Create(&encoder_);
    423   }
    424 
    425   ~AudioDecoderIsacFixTest() {
    426     WebRtcIsacfix_Free(encoder_);
    427   }
    428 
    429   virtual void InitEncoder() {
    430     ASSERT_EQ(0, WebRtcIsacfix_EncoderInit(encoder_, 1));  // Fixed mode.
    431     ASSERT_EQ(0,
    432               WebRtcIsacfix_Control(encoder_, 32000, 30));  // 32 kbps, 30 ms.
    433   }
    434 
    435   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    436                           uint8_t* output) {
    437     // Insert 3 * 10 ms. Expect non-zero output on third call.
    438     EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output));
    439     input += input_size_;
    440     EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output));
    441     input += input_size_;
    442     int enc_len_bytes = WebRtcIsacfix_Encode(encoder_, input, output);
    443     EXPECT_GT(enc_len_bytes, 0);
    444     return enc_len_bytes;
    445   }
    446 
    447   ISACFIX_MainStruct* encoder_;
    448   int input_size_;
    449 };
    450 
    451 class AudioDecoderG722Test : public AudioDecoderTest {
    452  protected:
    453   AudioDecoderG722Test() : AudioDecoderTest() {
    454     frame_size_ = 160;
    455     data_length_ = 10 * frame_size_;
    456     decoder_ = new AudioDecoderG722;
    457     assert(decoder_);
    458     WebRtcG722_CreateEncoder(&encoder_);
    459   }
    460 
    461   ~AudioDecoderG722Test() {
    462     WebRtcG722_FreeEncoder(encoder_);
    463   }
    464 
    465   virtual void InitEncoder() {
    466     ASSERT_EQ(0, WebRtcG722_EncoderInit(encoder_));
    467   }
    468 
    469   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    470                           uint8_t* output) {
    471     int enc_len_bytes =
    472         WebRtcG722_Encode(encoder_, const_cast<int16_t*>(input),
    473                           static_cast<int>(input_len_samples),
    474                           reinterpret_cast<int16_t*>(output));
    475     EXPECT_EQ(80, enc_len_bytes);
    476     return enc_len_bytes;
    477   }
    478 
    479   G722EncInst* encoder_;
    480 };
    481 
    482 class AudioDecoderG722StereoTest : public AudioDecoderG722Test {
    483  protected:
    484   AudioDecoderG722StereoTest() : AudioDecoderG722Test() {
    485     channels_ = 2;
    486     // Delete the |decoder_| that was created by AudioDecoderG722Test and
    487     // create an AudioDecoderG722Stereo object instead.
    488     delete decoder_;
    489     decoder_ = new AudioDecoderG722Stereo;
    490     assert(decoder_);
    491   }
    492 
    493   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    494                           uint8_t* output) {
    495     uint8_t* temp_output = new uint8_t[data_length_ * 2];
    496     // Encode a mono payload using the base test class.
    497     int mono_enc_len_bytes =
    498         AudioDecoderG722Test::EncodeFrame(input, input_len_samples,
    499                                           temp_output);
    500     // The bit-stream consists of 4-bit samples:
    501     // +--------+--------+--------+
    502     // | s0  s1 | s2  s3 | s4  s5 |
    503     // +--------+--------+--------+
    504     //
    505     // Duplicate them to the |output| such that the stereo stream becomes:
    506     // +--------+--------+--------+
    507     // | s0  s0 | s1  s1 | s2  s2 |
    508     // +--------+--------+--------+
    509     EXPECT_LE(mono_enc_len_bytes * 2, static_cast<int>(data_length_ * 2));
    510     uint8_t* output_ptr = output;
    511     for (int i = 0; i < mono_enc_len_bytes; ++i) {
    512       *output_ptr = (temp_output[i] & 0xF0) + (temp_output[i] >> 4);
    513       ++output_ptr;
    514       *output_ptr = (temp_output[i] << 4) + (temp_output[i] & 0x0F);
    515       ++output_ptr;
    516     }
    517     delete [] temp_output;
    518     return mono_enc_len_bytes * 2;
    519   }
    520 };
    521 
    522 #ifdef WEBRTC_CODEC_CELT
    523 class AudioDecoderCeltTest : public AudioDecoderTest {
    524  protected:
    525   static const int kEncodingRateBitsPerSecond = 64000;
    526   AudioDecoderCeltTest() : AudioDecoderTest(), encoder_(NULL) {
    527     frame_size_ = 640;
    528     data_length_ = 10 * frame_size_;
    529     decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32);
    530     assert(decoder_);
    531     WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_));
    532   }
    533 
    534   ~AudioDecoderCeltTest() {
    535     WebRtcCelt_FreeEnc(encoder_);
    536   }
    537 
    538   virtual void InitEncoder() {
    539     assert(encoder_);
    540     ASSERT_EQ(0, WebRtcCelt_EncoderInit(
    541         encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond));
    542   }
    543 
    544   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    545                           uint8_t* output) {
    546     assert(encoder_);
    547     return WebRtcCelt_Encode(encoder_, input, output);
    548   }
    549 
    550   CELT_encinst_t* encoder_;
    551 };
    552 
    553 class AudioDecoderCeltStereoTest : public AudioDecoderTest {
    554  protected:
    555   static const int kEncodingRateBitsPerSecond = 64000;
    556   AudioDecoderCeltStereoTest() : AudioDecoderTest(), encoder_(NULL) {
    557     channels_ = 2;
    558     frame_size_ = 640;
    559     data_length_ = 10 * frame_size_;
    560     decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32_2ch);
    561     assert(decoder_);
    562     stereo_input_ = new int16_t[frame_size_ * channels_];
    563     WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_));
    564   }
    565 
    566   ~AudioDecoderCeltStereoTest() {
    567     delete [] stereo_input_;
    568     WebRtcCelt_FreeEnc(encoder_);
    569   }
    570 
    571   virtual void InitEncoder() {
    572     assert(encoder_);
    573     ASSERT_EQ(0, WebRtcCelt_EncoderInit(
    574         encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond));
    575   }
    576 
    577   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    578                           uint8_t* output) {
    579     assert(encoder_);
    580     assert(stereo_input_);
    581     for (size_t n = 0; n < frame_size_; ++n) {
    582       stereo_input_[n * 2] = stereo_input_[n * 2 + 1] = input[n];
    583     }
    584     return WebRtcCelt_Encode(encoder_, stereo_input_, output);
    585   }
    586 
    587   int16_t* stereo_input_;
    588   CELT_encinst_t* encoder_;
    589 };
    590 
    591 #endif
    592 
    593 class AudioDecoderOpusTest : public AudioDecoderTest {
    594  protected:
    595   AudioDecoderOpusTest() : AudioDecoderTest() {
    596     frame_size_ = 480;
    597     data_length_ = 10 * frame_size_;
    598     decoder_ = new AudioDecoderOpus(kDecoderOpus);
    599     assert(decoder_);
    600     WebRtcOpus_EncoderCreate(&encoder_, 1);
    601   }
    602 
    603   ~AudioDecoderOpusTest() {
    604     WebRtcOpus_EncoderFree(encoder_);
    605   }
    606 
    607   virtual void SetUp() OVERRIDE {
    608     AudioDecoderTest::SetUp();
    609     // Upsample from 32 to 48 kHz.
    610     // Because Opus is 48 kHz codec but the input file is 32 kHz, so the data
    611     // read in |AudioDecoderTest::SetUp| has to be upsampled.
    612     // |AudioDecoderTest::SetUp| has read |data_length_| samples, which is more
    613     // than necessary after upsampling, so the end of audio that has been read
    614     // is unused and the end of the buffer is overwritten by the resampled data.
    615     Resampler rs;
    616     rs.Reset(32000, 48000, kResamplerSynchronous);
    617     const int before_resamp_len_samples = static_cast<int>(data_length_) * 2
    618         / 3;
    619     int16_t* before_resamp_input = new int16_t[before_resamp_len_samples];
    620     memcpy(before_resamp_input, input_,
    621            sizeof(int16_t) * before_resamp_len_samples);
    622     int resamp_len_samples;
    623     EXPECT_EQ(0, rs.Push(before_resamp_input, before_resamp_len_samples,
    624                          input_, static_cast<int>(data_length_),
    625                          resamp_len_samples));
    626     EXPECT_EQ(static_cast<int>(data_length_), resamp_len_samples);
    627     delete[] before_resamp_input;
    628   }
    629 
    630   virtual void InitEncoder() {}
    631 
    632   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    633                           uint8_t* output) OVERRIDE {
    634     int enc_len_bytes = WebRtcOpus_Encode(encoder_, const_cast<int16_t*>(input),
    635         static_cast<int16_t>(input_len_samples),
    636         static_cast<int16_t>(data_length_), output);
    637     EXPECT_GT(enc_len_bytes, 0);
    638     return enc_len_bytes;
    639   }
    640 
    641   OpusEncInst* encoder_;
    642 };
    643 
    644 class AudioDecoderOpusStereoTest : public AudioDecoderOpusTest {
    645  protected:
    646   AudioDecoderOpusStereoTest() : AudioDecoderOpusTest() {
    647     channels_ = 2;
    648     WebRtcOpus_EncoderFree(encoder_);
    649     delete decoder_;
    650     decoder_ = new AudioDecoderOpus(kDecoderOpus_2ch);
    651     assert(decoder_);
    652     WebRtcOpus_EncoderCreate(&encoder_, 2);
    653   }
    654 
    655   virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
    656                           uint8_t* output) OVERRIDE {
    657     // Create stereo by duplicating each sample in |input|.
    658     const int input_stereo_samples = static_cast<int>(input_len_samples) * 2;
    659     int16_t* input_stereo = new int16_t[input_stereo_samples];
    660     for (size_t i = 0; i < input_len_samples; i++)
    661       input_stereo[i * 2] = input_stereo[i * 2 + 1] = input[i];
    662 
    663     int enc_len_bytes = WebRtcOpus_Encode(
    664         encoder_, input_stereo, static_cast<int16_t>(input_len_samples),
    665         static_cast<int16_t>(data_length_), output);
    666     EXPECT_GT(enc_len_bytes, 0);
    667     delete[] input_stereo;
    668     return enc_len_bytes;
    669   }
    670 };
    671 
    672 TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
    673   int tolerance = 251;
    674   double mse = 1734.0;
    675   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu));
    676   EncodeDecodeTest(data_length_, tolerance, mse);
    677   ReInitTest();
    678   EXPECT_FALSE(decoder_->HasDecodePlc());
    679 }
    680 
    681 TEST_F(AudioDecoderPcmATest, EncodeDecode) {
    682   int tolerance = 308;
    683   double mse = 1931.0;
    684   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa));
    685   EncodeDecodeTest(data_length_, tolerance, mse);
    686   ReInitTest();
    687   EXPECT_FALSE(decoder_->HasDecodePlc());
    688 }
    689 
    690 TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
    691   int tolerance = 0;
    692   double mse = 0.0;
    693   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B));
    694   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb));
    695   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz));
    696   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz));
    697   EncodeDecodeTest(2 * data_length_, tolerance, mse);
    698   ReInitTest();
    699   EXPECT_FALSE(decoder_->HasDecodePlc());
    700 }
    701 
    702 TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
    703   int tolerance = 6808;
    704   double mse = 2.13e6;
    705   int delay = 80;  // Delay from input to output.
    706   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderILBC));
    707   EncodeDecodeTest(500, tolerance, mse, delay);
    708   ReInitTest();
    709   EXPECT_TRUE(decoder_->HasDecodePlc());
    710   DecodePlcTest();
    711 }
    712 
    713 TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) {
    714   int tolerance = 3399;
    715   double mse = 434951.0;
    716   int delay = 48;  // Delay from input to output.
    717   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC));
    718   EncodeDecodeTest(0, tolerance, mse, delay);
    719   ReInitTest();
    720   EXPECT_TRUE(decoder_->HasDecodePlc());
    721   DecodePlcTest();
    722 }
    723 
    724 TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
    725   int tolerance = 19757;
    726   double mse = 8.18e6;
    727   int delay = 160;  // Delay from input to output.
    728   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb));
    729   EncodeDecodeTest(0, tolerance, mse, delay);
    730   ReInitTest();
    731   EXPECT_TRUE(decoder_->HasDecodePlc());
    732   DecodePlcTest();
    733 }
    734 
    735 TEST_F(AudioDecoderIsacFbTest, EncodeDecode) {
    736   int tolerance = 19757;
    737   double mse = 8.18e6;
    738   int delay = 160;  // Delay from input to output.
    739   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb));
    740   EncodeDecodeTest(0, tolerance, mse, delay);
    741   ReInitTest();
    742   EXPECT_TRUE(decoder_->HasDecodePlc());
    743   DecodePlcTest();
    744 }
    745 
    746 TEST_F(AudioDecoderIsacFixTest, DISABLED_EncodeDecode) {
    747   int tolerance = 11034;
    748   double mse = 3.46e6;
    749   int delay = 54;  // Delay from input to output.
    750   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC));
    751   EncodeDecodeTest(735, tolerance, mse, delay);
    752   ReInitTest();
    753   EXPECT_FALSE(decoder_->HasDecodePlc());
    754 }
    755 
    756 TEST_F(AudioDecoderG722Test, EncodeDecode) {
    757   int tolerance = 6176;
    758   double mse = 238630.0;
    759   int delay = 22;  // Delay from input to output.
    760   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722));
    761   EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay);
    762   ReInitTest();
    763   EXPECT_FALSE(decoder_->HasDecodePlc());
    764 }
    765 
    766 TEST_F(AudioDecoderG722StereoTest, CreateAndDestroy) {
    767   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch));
    768 }
    769 
    770 TEST_F(AudioDecoderG722StereoTest, EncodeDecode) {
    771   int tolerance = 6176;
    772   int channel_diff_tolerance = 0;
    773   double mse = 238630.0;
    774   int delay = 22;  // Delay from input to output.
    775   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch));
    776   EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance);
    777   ReInitTest();
    778   EXPECT_FALSE(decoder_->HasDecodePlc());
    779 }
    780 
    781 TEST_F(AudioDecoderOpusTest, EncodeDecode) {
    782   int tolerance = 6176;
    783   double mse = 238630.0;
    784   int delay = 22;  // Delay from input to output.
    785   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus));
    786   EncodeDecodeTest(0, tolerance, mse, delay);
    787   ReInitTest();
    788   EXPECT_FALSE(decoder_->HasDecodePlc());
    789 }
    790 
    791 TEST_F(AudioDecoderOpusStereoTest, EncodeDecode) {
    792   int tolerance = 6176;
    793   int channel_diff_tolerance = 0;
    794   double mse = 238630.0;
    795   int delay = 22;  // Delay from input to output.
    796   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus_2ch));
    797   EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance);
    798   ReInitTest();
    799   EXPECT_FALSE(decoder_->HasDecodePlc());
    800 }
    801 
    802 #ifdef WEBRTC_CODEC_CELT
    803 // In the two following CELT tests, the low amplitude of the test signal allow
    804 // us to have such low error thresholds, i.e. |tolerance|, |mse|. Furthermore,
    805 // in general, stereo signals with identical channels do not result in identical
    806 // encoded channels.
    807 TEST_F(AudioDecoderCeltTest, EncodeDecode) {
    808   int tolerance = 20;
    809   double mse = 17.0;
    810   int delay = 80;  // Delay from input to output in samples.
    811   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32));
    812   EncodeDecodeTest(1600, tolerance, mse, delay);
    813   ReInitTest();
    814   EXPECT_TRUE(decoder_->HasDecodePlc());
    815   DecodePlcTest();
    816 }
    817 
    818 TEST_F(AudioDecoderCeltStereoTest, EncodeDecode) {
    819   int tolerance = 20;
    820   // If both channels are identical, CELT not necessarily decodes identical
    821   // channels. However, for this input this is the case.
    822   int channel_diff_tolerance = 0;
    823   double mse = 20.0;
    824   // Delay from input to output in samples, accounting for stereo.
    825   int delay = 160;
    826   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
    827   EncodeDecodeTest(1600, tolerance, mse, delay, channel_diff_tolerance);
    828   ReInitTest();
    829   EXPECT_TRUE(decoder_->HasDecodePlc());
    830   DecodePlcTest();
    831 }
    832 #endif
    833 
    834 TEST(AudioDecoder, CodecSampleRateHz) {
    835   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMu));
    836   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMa));
    837   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMu_2ch));
    838   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMa_2ch));
    839   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderILBC));
    840   EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderISAC));
    841   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderISACswb));
    842   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderISACfb));
    843   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B));
    844   EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bwb));
    845   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb32kHz));
    846   EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb48kHz));
    847   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B_2ch));
    848   EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bwb_2ch));
    849   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb32kHz_2ch));
    850   EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb48kHz_2ch));
    851   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B_5ch));
    852   EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderG722));
    853   EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderG722_2ch));
    854   EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderRED));
    855   EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderAVT));
    856   EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderCNGnb));
    857   EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderCNGwb));
    858   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCNGswb32kHz));
    859   EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderOpus));
    860   EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderOpus_2ch));
    861   // TODO(tlegrand): Change 32000 to 48000 below once ACM has 48 kHz support.
    862   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCNGswb48kHz));
    863   EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderArbitrary));
    864 #ifdef WEBRTC_CODEC_CELT
    865   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32));
    866   EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32_2ch));
    867 #else
    868   EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32));
    869   EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32_2ch));
    870 #endif
    871 }
    872 
    873 TEST(AudioDecoder, CodecSupported) {
    874   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu));
    875   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa));
    876   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu_2ch));
    877   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa_2ch));
    878   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderILBC));
    879   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC));
    880   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb));
    881   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACfb));
    882   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B));
    883   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb));
    884   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz));
    885   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz));
    886   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B_2ch));
    887   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb_2ch));
    888   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz_2ch));
    889   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz_2ch));
    890   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B_5ch));
    891   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722));
    892   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch));
    893   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderRED));
    894   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderAVT));
    895   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGnb));
    896   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGwb));
    897   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGswb32kHz));
    898   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGswb48kHz));
    899   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderArbitrary));
    900   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus));
    901   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus_2ch));
    902 #ifdef WEBRTC_CODEC_CELT
    903   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32));
    904   EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
    905 #else
    906   EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32));
    907   EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
    908 #endif
    909 }
    910 
    911 }  // namespace webrtc
    912