blob: eed7acb8de54978de15f808bc80817bba7d264e6 [file] [log] [blame]
tschumim9d117642017-07-17 01:41:41 -07001/*
2 * Copyright (c) 2017 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "audio/test/audio_bwe_integration_test.h"
tschumim9d117642017-07-17 01:41:41 -070012
Mirko Bonadei317a1f02019-09-17 17:06:18 +020013#include <memory>
14
Danil Chapovalov471783f2019-03-11 14:26:02 +010015#include "api/task_queue/queued_task.h"
Danil Chapovalovad895282019-03-11 10:28:05 +000016#include "api/task_queue/task_queue_base.h"
Artem Titov4e199e92018-08-20 13:30:39 +020017#include "call/fake_network_pipe.h"
18#include "call/simulated_network.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "common_audio/wav_file.h"
Danil Chapovalov31660fd2019-03-22 12:59:48 +010020#include "rtc_base/task_queue_for_test.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "system_wrappers/include/sleep.h"
22#include "test/field_trial.h"
23#include "test/gtest.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "test/testsupport/file_utils.h"
tschumim9d117642017-07-17 01:41:41 -070025
26namespace webrtc {
27namespace test {
28
29namespace {
Elad Alond8d32482019-02-18 23:45:57 +010030enum : int { // The first valid value is 1.
31 kTransportSequenceNumberExtensionId = 1,
32};
33
tschumim9d117642017-07-17 01:41:41 -070034// Wait a second between stopping sending and stopping receiving audio.
35constexpr int kExtraProcessTimeMs = 1000;
36} // namespace
37
38AudioBweTest::AudioBweTest() : EndToEndTest(CallTest::kDefaultTimeoutMs) {}
39
40size_t AudioBweTest::GetNumVideoStreams() const {
41 return 0;
42}
43size_t AudioBweTest::GetNumAudioStreams() const {
44 return 1;
45}
46size_t AudioBweTest::GetNumFlexfecStreams() const {
47 return 0;
48}
49
Artem Titov3faa8322018-03-07 14:44:00 +010050std::unique_ptr<TestAudioDeviceModule::Capturer>
tschumim9d117642017-07-17 01:41:41 -070051AudioBweTest::CreateCapturer() {
Artem Titov3faa8322018-03-07 14:44:00 +010052 return TestAudioDeviceModule::CreateWavFileReader(AudioInputFile());
tschumim9d117642017-07-17 01:41:41 -070053}
54
55void AudioBweTest::OnFakeAudioDevicesCreated(
Artem Titov3faa8322018-03-07 14:44:00 +010056 TestAudioDeviceModule* send_audio_device,
57 TestAudioDeviceModule* recv_audio_device) {
tschumim9d117642017-07-17 01:41:41 -070058 send_audio_device_ = send_audio_device;
59}
60
Danil Chapovalov44db4362019-09-30 04:16:28 +020061std::unique_ptr<test::PacketTransport> AudioBweTest::CreateSendTransport(
62 TaskQueueBase* task_queue,
eladalon413ee9a2017-08-22 04:02:52 -070063 Call* sender_call) {
Danil Chapovalov44db4362019-09-30 04:16:28 +020064 return std::make_unique<test::PacketTransport>(
eladalon413ee9a2017-08-22 04:02:52 -070065 task_queue, sender_call, this, test::PacketTransport::kSender,
Artem Titov4e199e92018-08-20 13:30:39 +020066 test::CallTest::payload_type_map_,
Mirko Bonadei317a1f02019-09-17 17:06:18 +020067 std::make_unique<FakeNetworkPipe>(
Artem Titov4e199e92018-08-20 13:30:39 +020068 Clock::GetRealTimeClock(),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020069 std::make_unique<SimulatedNetwork>(GetNetworkPipeConfig())));
tschumim9d117642017-07-17 01:41:41 -070070}
71
Danil Chapovalov44db4362019-09-30 04:16:28 +020072std::unique_ptr<test::PacketTransport> AudioBweTest::CreateReceiveTransport(
73 TaskQueueBase* task_queue) {
74 return std::make_unique<test::PacketTransport>(
eladalon413ee9a2017-08-22 04:02:52 -070075 task_queue, nullptr, this, test::PacketTransport::kReceiver,
Artem Titov4e199e92018-08-20 13:30:39 +020076 test::CallTest::payload_type_map_,
Mirko Bonadei317a1f02019-09-17 17:06:18 +020077 std::make_unique<FakeNetworkPipe>(
Artem Titov4e199e92018-08-20 13:30:39 +020078 Clock::GetRealTimeClock(),
Mirko Bonadei317a1f02019-09-17 17:06:18 +020079 std::make_unique<SimulatedNetwork>(GetNetworkPipeConfig())));
tschumim9d117642017-07-17 01:41:41 -070080}
81
82void AudioBweTest::PerformTest() {
83 send_audio_device_->WaitForRecordingEnd();
84 SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraProcessTimeMs);
85}
86
Danil Chapovalov471783f2019-03-11 14:26:02 +010087class StatsPollTask : public QueuedTask {
tschumim9d117642017-07-17 01:41:41 -070088 public:
89 explicit StatsPollTask(Call* sender_call) : sender_call_(sender_call) {}
90
91 private:
92 bool Run() override {
93 RTC_CHECK(sender_call_);
94 Call::Stats call_stats = sender_call_->GetStats();
95 EXPECT_GT(call_stats.send_bandwidth_bps, 25000);
Danil Chapovalovad895282019-03-11 10:28:05 +000096 TaskQueueBase::Current()->PostDelayedTask(std::unique_ptr<QueuedTask>(this),
97 100);
tschumim9d117642017-07-17 01:41:41 -070098 return false;
99 }
100 Call* sender_call_;
101};
102
103class NoBandwidthDropAfterDtx : public AudioBweTest {
104 public:
105 NoBandwidthDropAfterDtx()
106 : sender_call_(nullptr), stats_poller_("stats poller task queue") {}
107
108 void ModifyAudioConfigs(
109 AudioSendStream::Config* send_config,
110 std::vector<AudioReceiveStream::Config>* receive_configs) override {
Oskar Sundbom2707fb22017-11-16 10:57:35 +0100111 send_config->send_codec_spec = AudioSendStream::Config::SendCodecSpec(
112 test::CallTest::kAudioSendPayloadType,
113 {"OPUS",
114 48000,
115 2,
116 {{"ptime", "60"}, {"usedtx", "1"}, {"stereo", "1"}}});
tschumim9d117642017-07-17 01:41:41 -0700117
118 send_config->min_bitrate_bps = 6000;
119 send_config->max_bitrate_bps = 100000;
120 send_config->rtp.extensions.push_back(
121 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
122 kTransportSequenceNumberExtensionId));
123 for (AudioReceiveStream::Config& recv_config : *receive_configs) {
124 recv_config.rtp.transport_cc = true;
125 recv_config.rtp.extensions = send_config->rtp.extensions;
126 recv_config.rtp.remote_ssrc = send_config->rtp.ssrc;
127 }
128 }
129
130 std::string AudioInputFile() override {
131 return test::ResourcePath("voice_engine/audio_dtx16", "wav");
132 }
133
Artem Titov75e36472018-10-08 12:28:56 +0200134 BuiltInNetworkBehaviorConfig GetNetworkPipeConfig() override {
135 BuiltInNetworkBehaviorConfig pipe_config;
tschumim9d117642017-07-17 01:41:41 -0700136 pipe_config.link_capacity_kbps = 50;
137 pipe_config.queue_length_packets = 1500;
138 pipe_config.queue_delay_ms = 300;
139 return pipe_config;
140 }
141
142 void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
143 sender_call_ = sender_call;
144 }
145
146 void PerformTest() override {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200147 stats_poller_.PostDelayedTask(std::make_unique<StatsPollTask>(sender_call_),
148 100);
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200149 sender_call_->OnAudioTransportOverheadChanged(0);
tschumim9d117642017-07-17 01:41:41 -0700150 AudioBweTest::PerformTest();
151 }
152
153 private:
154 Call* sender_call_;
Danil Chapovalov31660fd2019-03-22 12:59:48 +0100155 TaskQueueForTest stats_poller_;
tschumim9d117642017-07-17 01:41:41 -0700156};
157
158using AudioBweIntegrationTest = CallTest;
159
tschumime76f55e2017-07-19 07:52:47 -0700160// TODO(tschumim): This test is flaky when run on android and mac. Re-enable the
161// test for when the issue is fixed.
162TEST_F(AudioBweIntegrationTest, DISABLED_NoBandwidthDropAfterDtx) {
tschumim9d117642017-07-17 01:41:41 -0700163 webrtc::test::ScopedFieldTrials override_field_trials(
164 "WebRTC-Audio-SendSideBwe/Enabled/"
165 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
166 NoBandwidthDropAfterDtx test;
167 RunBaseTest(&test);
168}
169
170} // namespace test
171} // namespace webrtc