1 /* 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/base/checks.h" 12 #include "webrtc/base/safe_conversions.h" 13 #include "webrtc/base/scoped_ptr.h" 14 #include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h" 15 #include "webrtc/modules/audio_coding/neteq/tools/neteq_quality_test.h" 16 #include "webrtc/test/testsupport/fileutils.h" 17 18 using google::RegisterFlagValidator; 19 using google::ParseCommandLineFlags; 20 using std::string; 21 using testing::InitGoogleTest; 22 23 namespace webrtc { 24 namespace test { 25 namespace { 26 static const int kInputSampleRateKhz = 8; 27 static const int kOutputSampleRateKhz = 8; 28 29 // Define switch for frame size. 30 static bool ValidateFrameSize(const char* flagname, int32_t value) { 31 if (value == 20 || value == 30 || value == 40 || value == 60) 32 return true; 33 printf("Invalid frame size, should be 20, 30, 40, or 60 ms."); 34 return false; 35 } 36 37 DEFINE_int32(frame_size_ms, 20, "Codec frame size (milliseconds)."); 38 39 static const bool frame_size_dummy = 40 RegisterFlagValidator(&FLAGS_frame_size_ms, &ValidateFrameSize); 41 42 } // namespace 43 44 class NetEqIlbcQualityTest : public NetEqQualityTest { 45 protected: 46 NetEqIlbcQualityTest() 47 : NetEqQualityTest(FLAGS_frame_size_ms, 48 kInputSampleRateKhz, 49 kOutputSampleRateKhz, 50 NetEqDecoder::kDecoderILBC) {} 51 52 void SetUp() override { 53 ASSERT_EQ(1u, channels_) << "iLBC supports only mono audio."; 54 AudioEncoderIlbc::Config config; 55 config.frame_size_ms = FLAGS_frame_size_ms; 56 encoder_.reset(new AudioEncoderIlbc(config)); 57 NetEqQualityTest::SetUp(); 58 } 59 60 int EncodeBlock(int16_t* in_data, 61 size_t block_size_samples, 62 uint8_t* payload, 63 size_t max_bytes) override { 64 const size_t kFrameSizeSamples = 80; // Samples per 10 ms. 65 size_t encoded_samples = 0; 66 uint32_t dummy_timestamp = 0; 67 AudioEncoder::EncodedInfo info; 68 do { 69 info = encoder_->Encode(dummy_timestamp, 70 rtc::ArrayView<const int16_t>( 71 in_data + encoded_samples, kFrameSizeSamples), 72 max_bytes, payload); 73 encoded_samples += kFrameSizeSamples; 74 } while (info.encoded_bytes == 0); 75 return rtc::checked_cast<int>(info.encoded_bytes); 76 } 77 78 private: 79 rtc::scoped_ptr<AudioEncoderIlbc> encoder_; 80 }; 81 82 TEST_F(NetEqIlbcQualityTest, Test) { 83 Simulate(); 84 } 85 86 } // namespace test 87 } // namespace webrtc 88