blob: f89ced97f4d5f4737a180f0481b4074720f3e08e [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 Bonadei92ea95e2017-09-15 06:47:31 +020013#include "common_audio/wav_file.h"
14#include "rtc_base/ptr_util.h"
15#include "system_wrappers/include/sleep.h"
16#include "test/field_trial.h"
17#include "test/gtest.h"
18#include "test/testsupport/fileutils.h"
tschumim9d117642017-07-17 01:41:41 -070019
20namespace webrtc {
21namespace test {
22
23namespace {
24// Wait a second between stopping sending and stopping receiving audio.
25constexpr int kExtraProcessTimeMs = 1000;
26} // namespace
27
28AudioBweTest::AudioBweTest() : EndToEndTest(CallTest::kDefaultTimeoutMs) {}
29
30size_t AudioBweTest::GetNumVideoStreams() const {
31 return 0;
32}
33size_t AudioBweTest::GetNumAudioStreams() const {
34 return 1;
35}
36size_t AudioBweTest::GetNumFlexfecStreams() const {
37 return 0;
38}
39
40std::unique_ptr<test::FakeAudioDevice::Capturer>
41AudioBweTest::CreateCapturer() {
42 return test::FakeAudioDevice::CreateWavFileReader(AudioInputFile());
43}
44
45void AudioBweTest::OnFakeAudioDevicesCreated(
46 test::FakeAudioDevice* send_audio_device,
47 test::FakeAudioDevice* recv_audio_device) {
48 send_audio_device_ = send_audio_device;
49}
50
eladalon413ee9a2017-08-22 04:02:52 -070051test::PacketTransport* AudioBweTest::CreateSendTransport(
52 SingleThreadedTaskQueueForTesting* task_queue,
53 Call* sender_call) {
tschumim9d117642017-07-17 01:41:41 -070054 return new test::PacketTransport(
eladalon413ee9a2017-08-22 04:02:52 -070055 task_queue, sender_call, this, test::PacketTransport::kSender,
tschumim9d117642017-07-17 01:41:41 -070056 test::CallTest::payload_type_map_, GetNetworkPipeConfig());
57}
58
eladalon413ee9a2017-08-22 04:02:52 -070059test::PacketTransport* AudioBweTest::CreateReceiveTransport(
60 SingleThreadedTaskQueueForTesting* task_queue) {
tschumim9d117642017-07-17 01:41:41 -070061 return new test::PacketTransport(
eladalon413ee9a2017-08-22 04:02:52 -070062 task_queue, nullptr, this, test::PacketTransport::kReceiver,
tschumim9d117642017-07-17 01:41:41 -070063 test::CallTest::payload_type_map_, GetNetworkPipeConfig());
64}
65
66void AudioBweTest::PerformTest() {
67 send_audio_device_->WaitForRecordingEnd();
68 SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraProcessTimeMs);
69}
70
71class StatsPollTask : public rtc::QueuedTask {
72 public:
73 explicit StatsPollTask(Call* sender_call) : sender_call_(sender_call) {}
74
75 private:
76 bool Run() override {
77 RTC_CHECK(sender_call_);
78 Call::Stats call_stats = sender_call_->GetStats();
79 EXPECT_GT(call_stats.send_bandwidth_bps, 25000);
80 rtc::TaskQueue::Current()->PostDelayedTask(
81 std::unique_ptr<QueuedTask>(this), 100);
82 return false;
83 }
84 Call* sender_call_;
85};
86
87class NoBandwidthDropAfterDtx : public AudioBweTest {
88 public:
89 NoBandwidthDropAfterDtx()
90 : sender_call_(nullptr), stats_poller_("stats poller task queue") {}
91
92 void ModifyAudioConfigs(
93 AudioSendStream::Config* send_config,
94 std::vector<AudioReceiveStream::Config>* receive_configs) override {
Oskar Sundbom2707fb22017-11-16 10:57:35 +010095 send_config->send_codec_spec = AudioSendStream::Config::SendCodecSpec(
96 test::CallTest::kAudioSendPayloadType,
97 {"OPUS",
98 48000,
99 2,
100 {{"ptime", "60"}, {"usedtx", "1"}, {"stereo", "1"}}});
tschumim9d117642017-07-17 01:41:41 -0700101
102 send_config->min_bitrate_bps = 6000;
103 send_config->max_bitrate_bps = 100000;
104 send_config->rtp.extensions.push_back(
105 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
106 kTransportSequenceNumberExtensionId));
107 for (AudioReceiveStream::Config& recv_config : *receive_configs) {
108 recv_config.rtp.transport_cc = true;
109 recv_config.rtp.extensions = send_config->rtp.extensions;
110 recv_config.rtp.remote_ssrc = send_config->rtp.ssrc;
111 }
112 }
113
114 std::string AudioInputFile() override {
115 return test::ResourcePath("voice_engine/audio_dtx16", "wav");
116 }
117
118 FakeNetworkPipe::Config GetNetworkPipeConfig() override {
119 FakeNetworkPipe::Config pipe_config;
120 pipe_config.link_capacity_kbps = 50;
121 pipe_config.queue_length_packets = 1500;
122 pipe_config.queue_delay_ms = 300;
123 return pipe_config;
124 }
125
126 void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
127 sender_call_ = sender_call;
128 }
129
130 void PerformTest() override {
131 stats_poller_.PostDelayedTask(
132 std::unique_ptr<rtc::QueuedTask>(new StatsPollTask(sender_call_)), 100);
133 sender_call_->OnTransportOverheadChanged(webrtc::MediaType::AUDIO, 0);
134 AudioBweTest::PerformTest();
135 }
136
137 private:
138 Call* sender_call_;
139 rtc::TaskQueue stats_poller_;
140};
141
142using AudioBweIntegrationTest = CallTest;
143
tschumime76f55e2017-07-19 07:52:47 -0700144// TODO(tschumim): This test is flaky when run on android and mac. Re-enable the
145// test for when the issue is fixed.
146TEST_F(AudioBweIntegrationTest, DISABLED_NoBandwidthDropAfterDtx) {
tschumim9d117642017-07-17 01:41:41 -0700147 webrtc::test::ScopedFieldTrials override_field_trials(
148 "WebRTC-Audio-SendSideBwe/Enabled/"
149 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
150 NoBandwidthDropAfterDtx test;
151 RunBaseTest(&test);
152}
153
154} // namespace test
155} // namespace webrtc