14f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org/*
24f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
34f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org *
44f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org *  Use of this source code is governed by a BSD-style license
54f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org *  that can be found in the LICENSE file in the root of the source
64f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org *  tree. An additional intellectual property rights grant can be found
74f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org *  in the file PATENTS.  All contributing project authors may
84f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
94f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org */
104f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
113e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/acm2/acm_receiver.h"
124f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
134f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org#include <algorithm>  // std::min
144f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
154f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
1600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
173e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
183e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h"
194f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
2098f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/clock.h"
214f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org#include "webrtc/test/test_suite.h"
224f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
234f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
244f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.orgnamespace webrtc {
254f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
264f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.orgnamespace acm2 {
274f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.orgnamespace {
284f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
294f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.orgbool CodecsEqual(const CodecInst& codec_a, const CodecInst& codec_b) {
304f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    if (strcmp(codec_a.plname, codec_b.plname) != 0 ||
314f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org        codec_a.plfreq != codec_b.plfreq ||
324f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org        codec_a.pltype != codec_b.pltype ||
334f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org        codec_b.channels != codec_a.channels)
344f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      return false;
354f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    return true;
364f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}
374f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
38fce4a945b872e4ca52e76a3872a3278a88e17b85kwibergstruct CodecIdInst {
39fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  explicit CodecIdInst(RentACodec::CodecId codec_id) {
40fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    const auto codec_ix = RentACodec::CodecIndexFromId(codec_id);
41fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    EXPECT_TRUE(codec_ix);
42fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    id = *codec_ix;
43fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    const auto codec_inst = RentACodec::CodecInstById(codec_id);
44fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    EXPECT_TRUE(codec_inst);
45fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    inst = *codec_inst;
46fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  }
47fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  int id;
48fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  CodecInst inst;
49fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg};
50fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg
514f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}  // namespace
524f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
534f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.orgclass AcmReceiverTestOldApi : public AudioPacketizationCallback,
544f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org                              public ::testing::Test {
554f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org protected:
564f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  AcmReceiverTestOldApi()
574f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      : timestamp_(0),
584f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org        packet_sent_(false),
594f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org        last_packet_send_timestamp_(timestamp_),
6022993e1a0c114122fc1b9de0fc74d4096ec868bdpbos        last_frame_type_(kEmptyFrame) {
614f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    AudioCodingModule::Config config;
624f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    acm_.reset(new AudioCodingModuleImpl(config));
634f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    receiver_.reset(new AcmReceiver(config));
644f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
654f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
664f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  ~AcmReceiverTestOldApi() {}
674f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
6814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void SetUp() override {
694f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    ASSERT_TRUE(receiver_.get() != NULL);
704f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    ASSERT_TRUE(acm_.get() != NULL);
71fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    codecs_ = RentACodec::Database();
724f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
734f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    acm_->InitializeReceiver();
744f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    acm_->RegisterTransportCallback(this);
754f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
764f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.sequenceNumber = 0;
774f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.timestamp = 0;
784f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.markerBit = false;
794f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.ssrc = 0x12345678;  // Arbitrary.
804f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.numCSRCs = 0;
814f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.payloadType = 0;
824f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.frameType = kAudioFrameSpeech;
834f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.type.Audio.isCNG = false;
844f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
854f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
8614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void TearDown() override {}
874f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
884f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  void InsertOnePacketOfSilence(int codec_id) {
89d6c0f8cac19eb549c26f032386e707559313f58fkwiberg    CodecInst codec =
90d6c0f8cac19eb549c26f032386e707559313f58fkwiberg        *RentACodec::CodecInstById(*RentACodec::CodecIdFromIndex(codec_id));
914f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    if (timestamp_ == 0) {  // This is the first time inserting audio.
924f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
934f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    } else {
941fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg      auto current_codec = acm_->SendCodec();
951fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg      ASSERT_TRUE(current_codec);
961fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg      if (!CodecsEqual(codec, *current_codec))
974f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org        ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
984f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    }
994f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    AudioFrame frame;
1004f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    // Frame setup according to the codec.
1014f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    frame.sample_rate_hz_ = codec.plfreq;
1024f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    frame.samples_per_channel_ = codec.plfreq / 100;  // 10 ms.
1034f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    frame.num_channels_ = codec.channels;
1044f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    memset(frame.data_, 0, frame.samples_per_channel_ * frame.num_channels_ *
1054f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org           sizeof(int16_t));
1064f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    packet_sent_ = false;
1074f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    last_packet_send_timestamp_ = timestamp_;
108f56c1623103e3f72198d6b0f50de9f0585b6f52fhenrik.lundin@webrtc.org    while (!packet_sent_) {
1094f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      frame.timestamp_ = timestamp_;
1104f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      timestamp_ += frame.samples_per_channel_;
111f56c1623103e3f72198d6b0f50de9f0585b6f52fhenrik.lundin@webrtc.org      ASSERT_GE(acm_->Add10MsData(frame), 0);
1124f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    }
1134f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
1144f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
115fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  template <size_t N>
116fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  void AddSetOfCodecs(const RentACodec::CodecId(&ids)[N]) {
117fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    for (auto id : ids) {
118fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      const auto i = RentACodec::CodecIndexFromId(id);
119fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      ASSERT_TRUE(i);
120fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      ASSERT_EQ(
121fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg          0, receiver_->AddCodec(*i, codecs_[*i].pltype, codecs_[*i].channels,
1224cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                                 codecs_[*i].plfreq, nullptr, ""));
1234f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    }
1244f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
1254f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
12614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int SendData(FrameType frame_type,
12714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org               uint8_t payload_type,
12814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org               uint32_t timestamp,
12914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org               const uint8_t* payload_data,
13014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org               size_t payload_len_bytes,
13114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org               const RTPFragmentationHeader* fragmentation) override {
13222993e1a0c114122fc1b9de0fc74d4096ec868bdpbos    if (frame_type == kEmptyFrame)
1334f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      return 0;
1344f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
1354f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.payloadType = payload_type;
1364f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.frameType = frame_type;
1374f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    if (frame_type == kAudioFrameSpeech)
1384f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      rtp_header_.type.Audio.isCNG = false;
1394f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    else
1404f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      rtp_header_.type.Audio.isCNG = true;
1414f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.timestamp = timestamp;
1424f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
143ee2bac26dd3eb4463126098f87701ff66098b288kwiberg    int ret_val = receiver_->InsertPacket(
144ee2bac26dd3eb4463126098f87701ff66098b288kwiberg        rtp_header_,
145ee2bac26dd3eb4463126098f87701ff66098b288kwiberg        rtc::ArrayView<const uint8_t>(payload_data, payload_len_bytes));
1464f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    if (ret_val < 0) {
1474f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      assert(false);
1484f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      return -1;
1494f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    }
1504f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    rtp_header_.header.sequenceNumber++;
1514f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    packet_sent_ = true;
1524f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    last_frame_type_ = frame_type;
1534f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    return 0;
1544f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
1554f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
15600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<AcmReceiver> receiver_;
157fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  rtc::ArrayView<const CodecInst> codecs_;
15800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<AudioCodingModule> acm_;
1594f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  WebRtcRTPHeader rtp_header_;
1604f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  uint32_t timestamp_;
1614f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  bool packet_sent_;  // Set when SendData is called reset when inserting audio.
1624f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  uint32_t last_packet_send_timestamp_;
1634f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  FrameType last_frame_type_;
1644f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org};
1654f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
166e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
167e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecGetCodec DISABLED_AddCodecGetCodec
168e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
169e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecGetCodec AddCodecGetCodec
170e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
171e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecGetCodec) {
1724f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Add codec.
173fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  for (size_t n = 0; n < codecs_.size(); ++n) {
1744f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    if (n & 0x1)  // Just add codecs with odd index.
175d8399e630f3f4886d455e2c4d2307794b60261c0Karl Wiberg      EXPECT_EQ(0,
176d8399e630f3f4886d455e2c4d2307794b60261c0Karl Wiberg                receiver_->AddCodec(n, codecs_[n].pltype, codecs_[n].channels,
1774cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                                    codecs_[n].plfreq, NULL, ""));
1784f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
1794f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Get codec and compare.
180fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  for (size_t n = 0; n < codecs_.size(); ++n) {
1814f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    CodecInst my_codec;
1824f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    if (n & 0x1) {
1834f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      // Codecs with odd index should match the reference.
1844f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      EXPECT_EQ(0, receiver_->DecoderByPayloadType(codecs_[n].pltype,
1854f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org                                                   &my_codec));
1864f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      EXPECT_TRUE(CodecsEqual(codecs_[n], my_codec));
1874f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    } else {
1884f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      // Codecs with even index are not registered.
1894f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      EXPECT_EQ(-1, receiver_->DecoderByPayloadType(codecs_[n].pltype,
1904f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org                                                    &my_codec));
1914f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    }
1924f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
1934f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}
1944f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
195e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
196e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecChangePayloadType DISABLED_AddCodecChangePayloadType
197e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
198e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecChangePayloadType AddCodecChangePayloadType
199e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
200e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecChangePayloadType) {
201fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const CodecIdInst codec1(RentACodec::CodecId::kPCMA);
202fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  CodecInst codec2 = codec1.inst;
203fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  ++codec2.pltype;
2044f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  CodecInst test_codec;
2054f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
206a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic  // Register the same codec with different payloads.
207fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec1.inst.pltype,
208fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg                                   codec1.inst.channels, codec1.inst.plfreq,
2094cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                                   nullptr, ""));
210fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec2.pltype, codec2.channels,
2114cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                                   codec2.plfreq, NULL, ""));
212a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic
213a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic  // Both payload types should exist.
214fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(0,
215fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg            receiver_->DecoderByPayloadType(codec1.inst.pltype, &test_codec));
216fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(true, CodecsEqual(codec1.inst, test_codec));
217fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(0, receiver_->DecoderByPayloadType(codec2.pltype, &test_codec));
218fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(true, CodecsEqual(codec2, test_codec));
219a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic}
220a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic
221e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
222e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecChangeCodecId DISABLED_AddCodecChangeCodecId
223e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
224e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecChangeCodecId AddCodecChangeCodecId
225e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
226e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(AcmReceiverTestOldApi, AddCodecChangeCodecId) {
227fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const CodecIdInst codec1(RentACodec::CodecId::kPCMU);
228fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  CodecIdInst codec2(RentACodec::CodecId::kPCMA);
229fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  codec2.inst.pltype = codec1.inst.pltype;
230a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic  CodecInst test_codec;
2314f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
232a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic  // Register the same payload type with different codec ID.
233fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec1.inst.pltype,
234fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg                                   codec1.inst.channels, codec1.inst.plfreq,
2354cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                                   nullptr, ""));
236fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(0, receiver_->AddCodec(codec2.id, codec2.inst.pltype,
237fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg                                   codec2.inst.channels, codec2.inst.plfreq,
2384cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                                   nullptr, ""));
2394f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
240a990784da381fefc4e45f3171e50159d24992c53Jelena Marusic  // Make sure that the last codec is used.
241fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(0,
242fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg            receiver_->DecoderByPayloadType(codec2.inst.pltype, &test_codec));
243fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(true, CodecsEqual(codec2.inst, test_codec));
2444f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}
2454f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
246e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
247e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecRemoveCodec DISABLED_AddCodecRemoveCodec
248e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
249e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_AddCodecRemoveCodec AddCodecRemoveCodec
250e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
251e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecRemoveCodec) {
252fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const CodecIdInst codec(RentACodec::CodecId::kPCMA);
253fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const int payload_type = codec.inst.pltype;
254fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(
255fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels,
2564cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                             codec.inst.plfreq, nullptr, ""));
2574f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
2584f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Remove non-existing codec should not fail. ACM1 legacy.
2594f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_EQ(0, receiver_->RemoveCodec(payload_type + 1));
2604f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
2614f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Remove an existing codec.
2624f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_EQ(0, receiver_->RemoveCodec(payload_type));
2634f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
2644f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Ask for the removed codec, must fail.
265fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  CodecInst ci;
266fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  EXPECT_EQ(-1, receiver_->DecoderByPayloadType(payload_type, &ci));
2674f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}
2684f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
269e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
270e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_SampleRate DISABLED_SampleRate
271e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
272e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_SampleRate SampleRate
273e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
274e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(AcmReceiverTestOldApi, MAYBE_SampleRate) {
275fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const RentACodec::CodecId kCodecId[] = {RentACodec::CodecId::kISAC,
276fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg                                          RentACodec::CodecId::kISACSWB};
2774f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  AddSetOfCodecs(kCodecId);
2784f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
2794f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  AudioFrame frame;
2804f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  const int kOutSampleRateHz = 8000;  // Different than codec sample rate.
281fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  for (const auto codec_id : kCodecId) {
282fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    const CodecIdInst codec(codec_id);
283fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100);
284fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    InsertOnePacketOfSilence(codec.id);
2854f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    for (int k = 0; k < num_10ms_frames; ++k) {
2864f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      EXPECT_EQ(0, receiver_->GetAudio(kOutSampleRateHz, &frame));
2874f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    }
288d89814bfd78b4c4ab6bf00e6ca4fd9e9ee6055c4henrik.lundin    EXPECT_EQ(codec.inst.plfreq, receiver_->last_output_sample_rate_hz());
2894f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
2904f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}
2914f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
292e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
293e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_PostdecodingVad DISABLED_PostdecodingVad
294e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#else
295e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_PostdecodingVad PostdecodingVad
296e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
297e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(AcmReceiverTestOldApi, MAYBE_PostdecodingVad) {
2984f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  receiver_->EnableVad();
2994f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_TRUE(receiver_->vad_enabled());
300fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const CodecIdInst codec(RentACodec::CodecId::kPCM16Bwb);
301fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  ASSERT_EQ(
302fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels,
3034cf61dd116288e9f119209c59e07f1d9439d8d05henrik.lundin                             codec.inst.plfreq, nullptr, ""));
3044f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  const int kNumPackets = 5;
305fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100);
3064f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  AudioFrame frame;
3074f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  for (int n = 0; n < kNumPackets; ++n) {
308fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    InsertOnePacketOfSilence(codec.id);
3094f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    for (int k = 0; k < num_10ms_frames; ++k)
310fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame));
3114f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
3124f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_EQ(AudioFrame::kVadPassive, frame.vad_activity_);
3134f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3144f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  receiver_->DisableVad();
3154f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_FALSE(receiver_->vad_enabled());
3164f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3174f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  for (int n = 0; n < kNumPackets; ++n) {
318fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    InsertOnePacketOfSilence(codec.id);
3194f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    for (int k = 0; k < num_10ms_frames; ++k)
320fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame));
3214f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
3224f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_EQ(AudioFrame::kVadUnknown, frame.vad_activity_);
3234f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}
3244f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
325e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_ANDROID)
326e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_LastAudioCodec DISABLED_LastAudioCodec
32798ab3a46d6b98bd6626ab741092f7cbf104d127bkwiberg#else
328e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#define MAYBE_LastAudioCodec LastAudioCodec
32998ab3a46d6b98bd6626ab741092f7cbf104d127bkwiberg#endif
330e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#if defined(WEBRTC_CODEC_ISAC)
331e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter BoströmTEST_F(AcmReceiverTestOldApi, MAYBE_LastAudioCodec) {
332fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const RentACodec::CodecId kCodecId[] = {
333fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      RentACodec::CodecId::kISAC, RentACodec::CodecId::kPCMA,
334fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      RentACodec::CodecId::kISACSWB, RentACodec::CodecId::kPCM16Bswb32kHz};
3354f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  AddSetOfCodecs(kCodecId);
3364f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
337fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  const RentACodec::CodecId kCngId[] = {
338fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      // Not including full-band.
339fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      RentACodec::CodecId::kCNNB, RentACodec::CodecId::kCNWB,
340fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      RentACodec::CodecId::kCNSWB};
3414f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  AddSetOfCodecs(kCngId);
3424f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3434f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Register CNG at sender side.
344fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  for (auto id : kCngId)
345fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    ASSERT_EQ(0, acm_->RegisterSendCodec(CodecIdInst(id).inst));
3464f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3474f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  CodecInst codec;
3484f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // No audio payload is received.
3494f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_EQ(-1, receiver_->LastAudioCodec(&codec));
3504f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3514f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Start with sending DTX.
3524f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  ASSERT_EQ(0, acm_->SetVAD(true, true, VADVeryAggr));
3534f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  packet_sent_ = false;
354fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  InsertOnePacketOfSilence(CodecIdInst(kCodecId[0]).id);  // Enough to test
355fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg                                                          // with one codec.
3564f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  ASSERT_TRUE(packet_sent_);
3574f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_EQ(kAudioFrameCN, last_frame_type_);
3584f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3594f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  // Has received, only, DTX. Last Audio codec is undefined.
3604f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  EXPECT_EQ(-1, receiver_->LastAudioCodec(&codec));
361057fb89f83f4ba51d4f0151aa8f8cfa5d5bb0addhenrik.lundin  EXPECT_FALSE(receiver_->last_packet_sample_rate_hz());
3624f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
363fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg  for (auto id : kCodecId) {
364fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    const CodecIdInst c(id);
365fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg
3664f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    // Set DTX off to send audio payload.
3674f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    acm_->SetVAD(false, false, VADAggr);
3684f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    packet_sent_ = false;
369fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    InsertOnePacketOfSilence(c.id);
3704f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3714f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    // Sanity check if Actually an audio payload received, and it should be
3724f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    // of type "speech."
3734f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    ASSERT_TRUE(packet_sent_);
3744f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    ASSERT_EQ(kAudioFrameSpeech, last_frame_type_);
375057fb89f83f4ba51d4f0151aa8f8cfa5d5bb0addhenrik.lundin    EXPECT_EQ(rtc::Optional<int>(c.inst.plfreq),
376057fb89f83f4ba51d4f0151aa8f8cfa5d5bb0addhenrik.lundin              receiver_->last_packet_sample_rate_hz());
3774f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3784f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    // Set VAD on to send DTX. Then check if the "Last Audio codec" returns
3794f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    // the expected codec.
3804f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    acm_->SetVAD(true, true, VADAggr);
3814f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3824f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    // Do as many encoding until a DTX is sent.
3834f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    while (last_frame_type_ != kAudioFrameCN) {
3844f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      packet_sent_ = false;
385fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg      InsertOnePacketOfSilence(c.id);
3864f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org      ASSERT_TRUE(packet_sent_);
3874f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    }
388057fb89f83f4ba51d4f0151aa8f8cfa5d5bb0addhenrik.lundin    EXPECT_EQ(rtc::Optional<int>(c.inst.plfreq),
389057fb89f83f4ba51d4f0151aa8f8cfa5d5bb0addhenrik.lundin              receiver_->last_packet_sample_rate_hz());
3904f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org    EXPECT_EQ(0, receiver_->LastAudioCodec(&codec));
391fce4a945b872e4ca52e76a3872a3278a88e17b85kwiberg    EXPECT_TRUE(CodecsEqual(c.inst, codec));
3924f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org  }
3934f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}
394e2976c87f7ba627fa1e1246f0ccfb34b4b9f3a73Peter Boström#endif
3954f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3964f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}  // namespace acm2
3974f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org
3984f6f22f0c6e08e94838a0c8fe22f08fd47f39df5andresp@webrtc.org}  // namespace webrtc
399