16568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org/* 26568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 36568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org * 46568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org * Use of this source code is governed by a BSD-style license 56568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org * that can be found in the LICENSE file in the root of the source 66568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org * tree. An additional intellectual property rights grant can be found 76568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org * in the file PATENTS. All contributing project authors may 86568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org * be found in the AUTHORS file in the root of the source tree. 96568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org */ 106568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 1174640895fafbb90a6630a6a91b80da0a7cff229cHenrik Kjellander#include "webrtc/modules/audio_coding/codecs/isac/fix/include/isacfix.h" 126568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org#include "webrtc/modules/audio_coding/neteq/tools/neteq_quality_test.h" 136568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 146568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgusing google::RegisterFlagValidator; 156568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgusing google::ParseCommandLineFlags; 166568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgusing std::string; 176568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgusing testing::InitGoogleTest; 186568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 196568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgnamespace webrtc { 206568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgnamespace test { 2183b5c053b9687813c5fc9c08b3beee4d464f7950Henrik Lundinnamespace { 226568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgstatic const int kIsacBlockDurationMs = 30; 236568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgstatic const int kIsacInputSamplingKhz = 16; 246568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgstatic const int kIsacOutputSamplingKhz = 16; 256568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 2683b5c053b9687813c5fc9c08b3beee4d464f7950Henrik Lundin// Define switch for bit rate. 276568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgstatic bool ValidateBitRate(const char* flagname, int32_t value) { 286568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org if (value >= 10 && value <= 32) 296568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org return true; 306568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org printf("Invalid bit rate, should be between 10 and 32 kbps."); 316568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org return false; 326568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org} 336568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 346568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgDEFINE_int32(bit_rate_kbps, 32, "Target bit rate (kbps)."); 356568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 366568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgstatic const bool bit_rate_dummy = 376568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org RegisterFlagValidator(&FLAGS_bit_rate_kbps, &ValidateBitRate); 386568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 3983b5c053b9687813c5fc9c08b3beee4d464f7950Henrik Lundin} // namespace 4083b5c053b9687813c5fc9c08b3beee4d464f7950Henrik Lundin 416568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgclass NetEqIsacQualityTest : public NetEqQualityTest { 426568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org protected: 436568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org NetEqIsacQualityTest(); 4414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void SetUp() override; 4514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void TearDown() override; 46dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting virtual int EncodeBlock(int16_t* in_data, size_t block_size_samples, 47dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting uint8_t* payload, size_t max_bytes); 486568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org private: 496568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org ISACFIX_MainStruct* isac_encoder_; 506568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org int bit_rate_kbps_; 516568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org}; 526568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 536568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgNetEqIsacQualityTest::NetEqIsacQualityTest() 5483b5c053b9687813c5fc9c08b3beee4d464f7950Henrik Lundin : NetEqQualityTest(kIsacBlockDurationMs, 5583b5c053b9687813c5fc9c08b3beee4d464f7950Henrik Lundin kIsacInputSamplingKhz, 566568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org kIsacOutputSamplingKhz, 57ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg NetEqDecoder::kDecoderISAC), 586568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org isac_encoder_(NULL), 59ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg bit_rate_kbps_(FLAGS_bit_rate_kbps) {} 606568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 616568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgvoid NetEqIsacQualityTest::SetUp() { 626955870806624479723addfae6dcf5d13968796cPeter Kasting ASSERT_EQ(1u, channels_) << "iSAC supports only mono audio."; 636568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org // Create encoder memory. 646568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org WebRtcIsacfix_Create(&isac_encoder_); 656568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org ASSERT_TRUE(isac_encoder_ != NULL); 666568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org EXPECT_EQ(0, WebRtcIsacfix_EncoderInit(isac_encoder_, 1)); 676568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org // Set bitrate and block length. 686568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org EXPECT_EQ(0, WebRtcIsacfix_Control(isac_encoder_, bit_rate_kbps_ * 1000, 696568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org kIsacBlockDurationMs)); 706568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org NetEqQualityTest::SetUp(); 716568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org} 726568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 736568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgvoid NetEqIsacQualityTest::TearDown() { 746568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org // Free memory. 756568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org EXPECT_EQ(0, WebRtcIsacfix_Free(isac_encoder_)); 766568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org NetEqQualityTest::TearDown(); 776568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org} 786568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 796568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgint NetEqIsacQualityTest::EncodeBlock(int16_t* in_data, 80dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t block_size_samples, 81dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting uint8_t* payload, size_t max_bytes) { 826568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org // ISAC takes 10 ms for every call. 836568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org const int subblocks = kIsacBlockDurationMs / 10; 846568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org const int subblock_length = 10 * kIsacInputSamplingKhz; 856568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org int value = 0; 866568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 876568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org int pointer = 0; 886568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org for (int idx = 0; idx < subblocks; idx++, pointer += subblock_length) { 896568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org // The Isac encoder does not perform encoding (and returns 0) until it 906568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org // receives a sequence of sub-blocks that amount to the frame duration. 916568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org EXPECT_EQ(0, value); 927ee24a79065a655dcc62a27fd22e0cc77fee6d68kwiberg@webrtc.org value = WebRtcIsacfix_Encode(isac_encoder_, &in_data[pointer], payload); 936568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org } 946568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org EXPECT_GT(value, 0); 956568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org return value; 966568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org} 976568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 986568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.orgTEST_F(NetEqIsacQualityTest, Test) { 99e5ff00a1c65750e7d30a25c4f1da91f0c035d07fHenrik Lundin Simulate(); 1006568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org} 1016568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org 1026568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org} // namespace test 1036568e97d108dffbf10af04a764287f3d1589691fminyue@webrtc.org} // namespace webrtc 104