Chromium Code Reviews| Index: webrtc/audio/test/low_bandwidth_audio_test.cc | 
| diff --git a/webrtc/audio/test/low_bandwidth_audio_test.cc b/webrtc/audio/test/low_bandwidth_audio_test.cc | 
| index c78e8897a824008e6336d676b7a3e5040c1ff5b5..c0bb703a08117b98b3f1101a069086a400acfd2f 100644 | 
| --- a/webrtc/audio/test/low_bandwidth_audio_test.cc | 
| +++ b/webrtc/audio/test/low_bandwidth_audio_test.cc | 
| @@ -1,5 +1,5 @@ | 
| /* | 
| - * Copyright 2017 The WebRTC Project Authors. All rights reserved. | 
| + * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 
| * | 
| * Use of this source code is governed by a BSD-style license | 
| * that can be found in the LICENSE file in the root of the source | 
| @@ -8,9 +8,144 @@ | 
| * be found in the AUTHORS file in the root of the source tree. | 
| */ | 
| -// This is a placeholder for the work oprypin@ is doing on a low-bandwidth | 
| -// audio test executable. | 
| +#include <algorithm> | 
| -int main() { | 
| +#include "webrtc/audio/test/low_bandwidth_audio_test.h" | 
| +#include "webrtc/common_audio/wav_file.h" | 
| +#include "webrtc/test/gtest.h" | 
| +#include "webrtc/test/run_test.h" | 
| +#include "webrtc/system_wrappers/include/sleep.h" | 
| +#include "webrtc/test/testsupport/fileutils.h" | 
| + | 
| +namespace { | 
| +// Wait half a second between stopping sending and stopping receiving audio. | 
| +constexpr int kExtraRecordTimeMs = 500; | 
| + | 
| +// Large bitrate by default. | 
| +const webrtc::CodecInst kDefaultCodec{120, "OPUS", 48000, 960, 2, 64000}; | 
| + | 
| +// The best that can be done with PESQ. | 
| +constexpr int kAudioFileBitRate = 16000; | 
| +} | 
| + | 
| +namespace webrtc { | 
| +namespace test { | 
| + | 
| +AudioQualityTest::AudioQualityTest() | 
| + : EndToEndTest(CallTest::kDefaultTimeoutMs) {} | 
| + | 
| +size_t AudioQualityTest::GetNumVideoStreams() const { | 
| return 0; | 
| } | 
| +size_t AudioQualityTest::GetNumAudioStreams() const { | 
| + return 1; | 
| +} | 
| +size_t AudioQualityTest::GetNumFlexfecStreams() const { | 
| + return 0; | 
| +} | 
| + | 
| +std::string AudioQualityTest::AudioInputFile() { | 
| + return test::ResourcePath("voice_engine/audio_tiny16", "wav"); | 
| +} | 
| + | 
| +std::string AudioQualityTest::AudioOutputFile() { | 
| + const ::testing::TestInfo* const test_info = | 
| + ::testing::UnitTest::GetInstance()->current_test_info(); | 
| + return webrtc::test::OutputPath() + | 
| + "LowBandwidth_" + test_info->name() + ".wav"; | 
| +} | 
| + | 
| +std::unique_ptr<test::FakeAudioDevice::Capturer> | 
| + AudioQualityTest::CreateCapturer() { | 
| + return test::FakeAudioDevice::CreateWavFileReader(AudioInputFile()); | 
| +} | 
| + | 
| +std::unique_ptr<test::FakeAudioDevice::Renderer> | 
| + AudioQualityTest::CreateRenderer() { | 
| + return test::FakeAudioDevice::CreateBoundedWavFileWriter( | 
| + AudioOutputFile(), kAudioFileBitRate); | 
| +} | 
| + | 
| +void AudioQualityTest::OnFakeAudioDevicesCreated( | 
| + test::FakeAudioDevice* send_audio_device, | 
| + test::FakeAudioDevice* recv_audio_device) { | 
| + send_audio_device_ = send_audio_device; | 
| +} | 
| + | 
| +FakeNetworkPipe::Config AudioQualityTest::GetNetworkPipeConfig() { | 
| + return FakeNetworkPipe::Config(); | 
| +} | 
| + | 
| +test::PacketTransport* AudioQualityTest::CreateSendTransport( | 
| + Call* sender_call) { | 
| + return new test::PacketTransport( | 
| + sender_call, this, test::PacketTransport::kSender, | 
| + GetNetworkPipeConfig()); | 
| +} | 
| + | 
| +test::PacketTransport* AudioQualityTest::CreateReceiveTransport() { | 
| + return new test::PacketTransport(nullptr, this, | 
| + test::PacketTransport::kReceiver, GetNetworkPipeConfig()); | 
| +} | 
| + | 
| +void AudioQualityTest::ModifyAudioConfigs( | 
| + AudioSendStream::Config* send_config, | 
| + std::vector<AudioReceiveStream::Config>* receive_configs) { | 
| + send_config->send_codec_spec.codec_inst = kDefaultCodec; | 
| +} | 
| + | 
| +void AudioQualityTest::PerformTest() { | 
| + // Wait until the input audio file is done... | 
| + send_audio_device_->WaitForRecordingEnd(); | 
| + // and some extra time to account for network delay. | 
| + SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraRecordTimeMs); | 
| 
 
stefan-webrtc
2017/03/20 14:40:10
Can we perhaps wait until enough audio has been pl
 
oprypin_webrtc
2017/03/20 15:09:16
I've given this some thought. Relying on the recei
 
stefan-webrtc
2017/03/20 15:42:32
Ok, convinced!
 
 | 
| +} | 
| + | 
| +void AudioQualityTest::OnTestFinished() { | 
| + const ::testing::TestInfo* const test_info = | 
| + ::testing::UnitTest::GetInstance()->current_test_info(); | 
| + | 
| + // Output information about the input and output audio files so that further | 
| + // processing can be done by an external process. | 
| + printf("TEST %s %s:%s\n", test_info->name(), | 
| + AudioInputFile().c_str(), AudioOutputFile().c_str()); | 
| +} | 
| + | 
| + | 
| +using LowBandwidthAudioTest = CallTest; | 
| + | 
| +TEST_F(LowBandwidthAudioTest, GoodNetworkHighBitrate) { | 
| + AudioQualityTest test; | 
| + RunBaseTest(&test); | 
| +} | 
| + | 
| + | 
| +class Mobile2GNetworkTest : public AudioQualityTest { | 
| + void ModifyAudioConfigs(AudioSendStream::Config* send_config, | 
| + std::vector<AudioReceiveStream::Config>* receive_configs) override { | 
| + send_config->send_codec_spec.codec_inst = CodecInst{ | 
| + 120, // pltype | 
| + "OPUS", // plname | 
| + 48000, // plfreq | 
| + 2880, // pacsize | 
| + 1, // channels | 
| + 6000 // rate bits/sec | 
| + }; | 
| + } | 
| + | 
| + FakeNetworkPipe::Config GetNetworkPipeConfig() override { | 
| + FakeNetworkPipe::Config pipe_config; | 
| + pipe_config.link_capacity_kbps = 12; | 
| + pipe_config.queue_length_packets = 1500; | 
| + pipe_config.queue_delay_ms = 400; | 
| + return pipe_config; | 
| + } | 
| +}; | 
| + | 
| +TEST_F(LowBandwidthAudioTest, Mobile2GNetwork) { | 
| + Mobile2GNetworkTest test; | 
| + RunBaseTest(&test); | 
| +} | 
| + | 
| +} // namespace test | 
| +} // namespace webrtc |