128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org/*
228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org *
428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org *  Use of this source code is governed by a BSD-style license
528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org *  that can be found in the LICENSE file in the root of the source
628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org *  tree. An additional intellectual property rights grant can be found
728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org *  in the file PATENTS.  All contributing project authors may
828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org */
1028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org#include <string>
1128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
1228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
1328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h"
1496c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org#include "webrtc/modules/audio_coding/codecs/opus/opus_inst.h"
1528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
1628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
1728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgnamespace webrtc {
1828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
1928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// Number of samples in a 60 ms stereo frame, sampled at 48 kHz.
20254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.orgconst int kOpusMaxFrameSamples = 48 * 60 * 2;
2128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// Maximum number of bytes in output bitstream.
2298b201189e601aa1863085e0016e868d2db416b1pbos@webrtc.orgconst size_t kMaxBytes = 1000;
23254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org// Number of samples-per-channel in a 20 ms frame, sampled at 48 kHz.
24254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.orgconst int kOpus20msFrameSamples = 48 * 20;
25254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org// Number of samples-per-channel in a 10 ms frame, sampled at 48 kHz.
26254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.orgconst int kOpus10msFrameSamples = 48 * 10;
2728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
2828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgclass OpusTest : public ::testing::Test {
2928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org protected:
3028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  OpusTest();
3128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  virtual void SetUp();
3228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
33b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  void TestSetMaxPlaybackRate(opus_int32 expect, int32_t set);
3496c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org
3528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  WebRtcOpusEncInst* opus_mono_encoder_;
3628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  WebRtcOpusEncInst* opus_stereo_encoder_;
3728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  WebRtcOpusDecInst* opus_mono_decoder_;
3828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  WebRtcOpusDecInst* opus_mono_decoder_new_;
3928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  WebRtcOpusDecInst* opus_stereo_decoder_;
4028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  WebRtcOpusDecInst* opus_stereo_decoder_new_;
4128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
42254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t speech_data_[kOpusMaxFrameSamples];
43254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_[kOpusMaxFrameSamples];
4428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  uint8_t bitstream_[kMaxBytes];
4528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org};
4628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
4728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgOpusTest::OpusTest()
4828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    : opus_mono_encoder_(NULL),
4928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org      opus_stereo_encoder_(NULL),
5028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org      opus_mono_decoder_(NULL),
5128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org      opus_mono_decoder_new_(NULL),
5228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org      opus_stereo_decoder_(NULL),
5328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org      opus_stereo_decoder_new_(NULL) {
5428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
5528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
5628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgvoid OpusTest::SetUp() {
5728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  FILE* input_file;
5828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  const std::string file_name =
59254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org        webrtc::test::ResourcePath("audio_coding/speech_mono_32_48kHz", "pcm");
6028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  input_file = fopen(file_name.c_str(), "rb");
6128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  ASSERT_TRUE(input_file != NULL);
62254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  ASSERT_EQ(kOpusMaxFrameSamples,
6328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org            static_cast<int32_t>(fread(speech_data_, sizeof(int16_t),
64254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                       kOpusMaxFrameSamples, input_file)));
6528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  fclose(input_file);
6628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  input_file = NULL;
6728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
6828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
69b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.orgvoid OpusTest::TestSetMaxPlaybackRate(opus_int32 expect, int32_t set) {
7096c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  opus_int32 bandwidth;
7196c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  // Test mono encoder.
72b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetMaxPlaybackRate(opus_mono_encoder_, set));
7396c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  opus_encoder_ctl(opus_mono_encoder_->encoder,
7496c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org                   OPUS_GET_MAX_BANDWIDTH(&bandwidth));
7596c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  EXPECT_EQ(expect, bandwidth);
7696c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  // Test stereo encoder.
77b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetMaxPlaybackRate(opus_stereo_encoder_, set));
7896c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  opus_encoder_ctl(opus_stereo_encoder_->encoder,
7996c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org                   OPUS_GET_MAX_BANDWIDTH(&bandwidth));
8096c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  EXPECT_EQ(expect, bandwidth);
8196c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org}
8296c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org
8328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// Test failing Create.
8428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusCreateFail) {
8528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Test to see that an invalid pointer is caught.
8628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(NULL, 1));
8728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 3));
8828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(NULL, 1));
8928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 3));
9028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
9128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
9228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// Test failing Free.
9328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusFreeFail) {
9428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Test to see that an invalid pointer is caught.
9528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_EncoderFree(NULL));
9628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_DecoderFree(NULL));
9728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
9828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
9928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// Test normal Create and Free.
10028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusCreateFree) {
10128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
10228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 1));
10328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
10428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2));
10528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_TRUE(opus_mono_encoder_ != NULL);
10628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_TRUE(opus_mono_decoder_ != NULL);
10728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_TRUE(opus_stereo_encoder_ != NULL);
10828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_TRUE(opus_stereo_decoder_ != NULL);
10928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Free encoder and decoder memory.
11028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
11128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_));
11228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
11328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_));
11428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
11528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
11628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusEncodeDecodeMono) {
11728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Create encoder memory.
11828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
11928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 1));
12028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_new_, 1));
12128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
12228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Set bitrate.
12328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 32000));
12428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
12528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Check number of channels for decoder.
12628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_));
12728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_new_));
12828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
12928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Encode & decode.
13028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t encoded_bytes;
13128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t audio_type;
132254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_new[kOpusMaxFrameSamples];
133254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode[kOpusMaxFrameSamples];
13428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t* coded = reinterpret_cast<int16_t*>(bitstream_);
135254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  encoded_bytes = WebRtcOpus_Encode(opus_mono_encoder_, speech_data_,
136254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    kOpus20msFrameSamples, kMaxBytes,
137254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    bitstream_);
138254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
139254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeNew(opus_mono_decoder_new_, bitstream_,
140254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 encoded_bytes, output_data_decode_new,
141254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 &audio_type));
142254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
143254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_Decode(opus_mono_decoder_, coded,
144254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              encoded_bytes, output_data_decode,
145254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              &audio_type));
14628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
14728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Data in |output_data_decode_new| should be the same as in
14828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // |output_data_decode|.
149254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  for (int i = 0; i < kOpus20msFrameSamples; i++) {
15028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    EXPECT_EQ(output_data_decode_new[i], output_data_decode[i]);
15128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  }
15228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
15328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Free memory.
15428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
15528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_));
15628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_new_));
15728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
15828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
15928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusEncodeDecodeStereo) {
16028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Create encoder memory.
16128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
16228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2));
16328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_new_, 2));
16428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
16528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Set bitrate.
16628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 64000));
16728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
16828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Check number of channels for decoder.
16928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_));
17028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_new_));
17128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
17228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Encode & decode.
17328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t encoded_bytes;
17428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t audio_type;
175254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_new[kOpusMaxFrameSamples];
176254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode[kOpusMaxFrameSamples];
177254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_slave[kOpusMaxFrameSamples];
17828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t* coded = reinterpret_cast<int16_t*>(bitstream_);
179254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_,
180254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    kOpus20msFrameSamples, kMaxBytes,
181254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    bitstream_);
182254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
183254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_,
184254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 encoded_bytes, output_data_decode_new,
185254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 &audio_type));
186254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
187254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_Decode(opus_stereo_decoder_, coded,
188254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              encoded_bytes, output_data_decode,
189254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              &audio_type));
190254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
191254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded,
192254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                   encoded_bytes, output_data_decode_slave,
19328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org                                   &audio_type));
19428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
19528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Data in |output_data_decode_new| should be the same as in
19628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // |output_data_decode| and |output_data_decode_slave| interleaved to a
19728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // stereo signal.
198254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  for (int i = 0; i < kOpus20msFrameSamples; i++) {
19928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    EXPECT_EQ(output_data_decode_new[i * 2], output_data_decode[i]);
20028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    EXPECT_EQ(output_data_decode_new[i * 2 + 1], output_data_decode_slave[i]);
20128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  }
20228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
20328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Free memory.
20428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
20528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_));
20628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_new_));
20728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
20828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
20928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusSetBitRate) {
21028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Test without creating encoder memory.
21128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetBitRate(opus_mono_encoder_, 60000));
21228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 60000));
21328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
21428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Create encoder memory, try with different bitrates.
21528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
21628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
21728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 30000));
21828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 60000));
21928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 300000));
22028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 600000));
22128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
22228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Free memory.
22328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
22428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
22528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
22628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
2271f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.orgTEST_F(OpusTest, OpusSetComplexity) {
2281f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  // Test without creating encoder memory.
2291f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_mono_encoder_, 9));
2301f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 9));
2311f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org
2321f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  // Create encoder memory, try with different complexities.
2331f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
2341f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
2351f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org
2361f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_mono_encoder_, 0));
2371f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 0));
2381f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_mono_encoder_, 10));
2391f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 10));
2401f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_mono_encoder_, 11));
2411f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_stereo_encoder_, 11));
2421f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org
2431f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  // Free memory.
2441f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
2451f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
2461f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org}
2471f2820b28dfbbe8917eafee618579608bea200baminyue@webrtc.org
24828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// Encode and decode one frame (stereo), initialize the decoder and
24928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// decode once more.
25028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusDecodeInit) {
25128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Create encoder memory.
25228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
25328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2));
25428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_new_, 2));
25528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
25628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Encode & decode.
25728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t encoded_bytes;
25828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t audio_type;
259254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_new[kOpusMaxFrameSamples];
260254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode[kOpusMaxFrameSamples];
261254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_slave[kOpusMaxFrameSamples];
26228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t* coded = reinterpret_cast<int16_t*>(bitstream_);
263254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_,
264254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    kOpus20msFrameSamples, kMaxBytes,
265254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    bitstream_);
266254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
267254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_,
268254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 encoded_bytes, output_data_decode_new,
269254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 &audio_type));
270254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
271254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_Decode(opus_stereo_decoder_, coded,
272254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              encoded_bytes, output_data_decode,
273254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              &audio_type));
274254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
275254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded,
276254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                   encoded_bytes, output_data_decode_slave,
27728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org                                   &audio_type));
27828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
27928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Data in |output_data_decode_new| should be the same as in
28028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // |output_data_decode| and |output_data_decode_slave| interleaved to a
28128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // stereo signal.
282254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  for (int i = 0; i < kOpus20msFrameSamples; i++) {
28328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    EXPECT_EQ(output_data_decode_new[i * 2], output_data_decode[i]);
28428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    EXPECT_EQ(output_data_decode_new[i * 2 + 1], output_data_decode_slave[i]);
28528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  }
28628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
28728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderInitNew(opus_stereo_decoder_new_));
28828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderInit(opus_stereo_decoder_));
28928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderInitSlave(opus_stereo_decoder_));
29028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
291254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
292254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_,
293254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 encoded_bytes, output_data_decode_new,
294254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 &audio_type));
295254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
296254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_Decode(opus_stereo_decoder_, coded,
297254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              encoded_bytes, output_data_decode,
298254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              &audio_type));
299254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
300254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded,
301254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                   encoded_bytes, output_data_decode_slave,
30228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org                                   &audio_type));
30328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
30428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Data in |output_data_decode_new| should be the same as in
30528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // |output_data_decode| and |output_data_decode_slave| interleaved to a
30628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // stereo signal.
307254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  for (int i = 0; i < kOpus20msFrameSamples; i++) {
30828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    EXPECT_EQ(output_data_decode_new[i * 2], output_data_decode[i]);
30928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org    EXPECT_EQ(output_data_decode_new[i * 2 + 1], output_data_decode_slave[i]);
31028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  }
31128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
31228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Free memory.
31328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
31428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_));
31528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_new_));
31628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
31728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
31852db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.orgTEST_F(OpusTest, OpusEnableDisableFec) {
31952db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  // Test without creating encoder memory.
32052db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_EnableFec(opus_mono_encoder_));
32152db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_DisableFec(opus_stereo_encoder_));
32252db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
32352db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  // Create encoder memory, try with different bitrates.
32452db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
32552db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
32652db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
32752db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_mono_encoder_));
32852db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_stereo_encoder_));
32952db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DisableFec(opus_mono_encoder_));
33052db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DisableFec(opus_stereo_encoder_));
33152db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
33252db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  // Free memory.
33352db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
33452db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
33552db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org}
33652db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
33752db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.orgTEST_F(OpusTest, OpusSetPacketLossRate) {
33852db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  // Test without creating encoder memory.
33952db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, 50));
34052db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, 50));
34152db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
34252db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  // Create encoder memory, try with different bitrates.
34352db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
34452db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
34552db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
34652db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, 50));
34752db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, 50));
34852db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, -1));
34952db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, -1));
35052db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_mono_encoder_, 101));
35152db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_stereo_encoder_, 101));
35252db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
35352db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  // Free memory.
35452db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
35552db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
35652db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org}
35752db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
358b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.orgTEST_F(OpusTest, OpusSetMaxPlaybackRate) {
35996c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  // Test without creating encoder memory.
360b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetMaxPlaybackRate(opus_mono_encoder_, 20000));
361b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  EXPECT_EQ(-1, WebRtcOpus_SetMaxPlaybackRate(opus_stereo_encoder_, 20000));
36296c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org
36396c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  // Create encoder memory, try with different bitrates.
36496c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
36596c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
36696c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org
367b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_FULLBAND, 48000);
368b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_FULLBAND, 24001);
369b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_SUPERWIDEBAND, 24000);
370b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_SUPERWIDEBAND, 16001);
371b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_WIDEBAND, 16000);
372b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_WIDEBAND, 12001);
373b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_MEDIUMBAND, 12000);
374b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_MEDIUMBAND, 8001);
375b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_NARROWBAND, 8000);
376b0aac71bfeb5b06083a9664434d936e091f54d91minyue@webrtc.org  TestSetMaxPlaybackRate(OPUS_BANDWIDTH_NARROWBAND, 4000);
37796c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org
37896c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  // Free memory.
37996c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
38096c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
38196c18e050e926d0654f1b9d6756177009ef1790dminyue@webrtc.org}
38252db76a4671d26cdef4bb8a8ddf09f1899a46c29minyue@webrtc.org
383ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org// PLC in mono mode.
384ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.orgTEST_F(OpusTest, OpusDecodePlcMono) {
385ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Create encoder memory.
386ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1));
387ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 1));
388ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_mono_decoder_new_, 1));
389ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
390ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Set bitrate.
391ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, 32000));
392ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
393ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Check number of channels for decoder.
394ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_));
395ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(1, WebRtcOpus_DecoderChannels(opus_mono_decoder_new_));
396ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
397ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Encode & decode.
398ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  int16_t encoded_bytes;
399ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  int16_t audio_type;
400254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_new[kOpusMaxFrameSamples];
401254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode[kOpusMaxFrameSamples];
402ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  int16_t* coded = reinterpret_cast<int16_t*>(bitstream_);
403254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  encoded_bytes = WebRtcOpus_Encode(opus_mono_encoder_, speech_data_,
404254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    kOpus20msFrameSamples, kMaxBytes,
405254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    bitstream_);
406254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
407254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeNew(opus_mono_decoder_new_, bitstream_,
408254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 encoded_bytes, output_data_decode_new,
409254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 &audio_type));
410254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
411254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_Decode(opus_mono_decoder_, coded,
412254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              encoded_bytes, output_data_decode,
413254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              &audio_type));
414ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
415ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Call decoder PLC for both versions of the decoder.
416254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t plc_buffer[kOpusMaxFrameSamples];
417254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t plc_buffer_new[kOpusMaxFrameSamples];
418254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
419254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodePlcMaster(opus_mono_decoder_, plc_buffer, 1));
420254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
421254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodePlc(opus_mono_decoder_new_, plc_buffer_new, 1));
422ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
423ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Data in |plc_buffer| should be the same as in |plc_buffer_new|.
424254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  for (int i = 0; i < kOpus20msFrameSamples; i++) {
425ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org    EXPECT_EQ(plc_buffer[i], plc_buffer_new[i]);
426ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  }
427ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
428ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Free memory.
429ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_mono_encoder_));
430ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_));
431ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_mono_decoder_new_));
432ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org}
433ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
434ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org// PLC in stereo mode.
435ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.orgTEST_F(OpusTest, OpusDecodePlcStereo) {
436ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Create encoder memory.
437ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
438ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2));
439ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_new_, 2));
440ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
441ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Set bitrate.
442ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, 64000));
443ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
444ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Check number of channels for decoder.
445ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_));
446ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(2, WebRtcOpus_DecoderChannels(opus_stereo_decoder_new_));
447ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
448ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Encode & decode.
449ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  int16_t encoded_bytes;
450ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  int16_t audio_type;
451254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_new[kOpusMaxFrameSamples];
452254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode[kOpusMaxFrameSamples];
453254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t output_data_decode_slave[kOpusMaxFrameSamples];
454ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  int16_t* coded = reinterpret_cast<int16_t*>(bitstream_);
455254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_,
456254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    kOpus20msFrameSamples, kMaxBytes,
457254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    bitstream_);
458254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
459254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeNew(opus_stereo_decoder_new_, bitstream_,
460254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 encoded_bytes, output_data_decode_new,
461254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                 &audio_type));
462254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
463254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_Decode(opus_stereo_decoder_, coded,
464254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              encoded_bytes, output_data_decode,
465254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                              &audio_type));
466254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
467254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodeSlave(opus_stereo_decoder_, coded,
468254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                   encoded_bytes,
469254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                   output_data_decode_slave,
470ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org                                   &audio_type));
471ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
472ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Call decoder PLC for both versions of the decoder.
473254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t plc_buffer_left[kOpusMaxFrameSamples];
474254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t plc_buffer_right[kOpusMaxFrameSamples];
475254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  int16_t plc_buffer_new[kOpusMaxFrameSamples];
476254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
477254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodePlcMaster(opus_stereo_decoder_,
478254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                       plc_buffer_left, 1));
479254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
480254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodePlcSlave(opus_stereo_decoder_,
481254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                      plc_buffer_right, 1));
482254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
483254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DecodePlc(opus_stereo_decoder_new_, plc_buffer_new, 1));
484ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Data in |plc_buffer_left| and |plc_buffer_right|should be the same as the
485ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // interleaved samples in |plc_buffer_new|.
486254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  for (int i = 0, j = 0; i < kOpus20msFrameSamples; i++) {
487ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org    EXPECT_EQ(plc_buffer_left[i], plc_buffer_new[j++]);
488ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org    EXPECT_EQ(plc_buffer_right[i], plc_buffer_new[j++]);
489ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  }
490ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org
491ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  // Free memory.
492ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
493ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_));
494ea5f28b558ca3893ddcbbb3dad03b2eaf2790660tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_new_));
49528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
49628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
49728fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org// Duration estimation.
49828fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.orgTEST_F(OpusTest, OpusDurationEstimation) {
49928fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Create.
50028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2));
50128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2));
50228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
50328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  int16_t encoded_bytes;
50428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
50528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // 10 ms.
506254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_,
507254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    kOpus10msFrameSamples, kMaxBytes,
508254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    bitstream_);
509254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus10msFrameSamples,
510254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DurationEst(opus_stereo_decoder_, bitstream_,
511254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                   encoded_bytes));
51228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
51328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // 20 ms
514254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  encoded_bytes = WebRtcOpus_Encode(opus_stereo_encoder_, speech_data_,
515254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    kOpus20msFrameSamples, kMaxBytes,
516254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                    bitstream_);
517254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org  EXPECT_EQ(kOpus20msFrameSamples,
518254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org            WebRtcOpus_DurationEst(opus_stereo_decoder_, bitstream_,
519254879d7e969771c28d0882582e02b1a0b0eeb14minyue@webrtc.org                                   encoded_bytes));
52028fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
52128fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  // Free memory.
52228fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_stereo_encoder_));
52328fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_stereo_decoder_));
52428fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}
52528fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org
52628fb40d05ae8540f76cea3f33eaf68eff5df6370tina.legrand@webrtc.org}  // namespace webrtc
527