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