blob: d57fef8453efd5640c6070443f9ec62708926431 [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 {
95 send_config->send_codec_spec =
96 rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
97 {test::CallTest::kAudioSendPayloadType,
98 {"OPUS",
99 48000,
100 2,
101 {{"ptime", "60"}, {"usedtx", "1"}, {"stereo", "1"}}}});
102
103 send_config->min_bitrate_bps = 6000;
104 send_config->max_bitrate_bps = 100000;
105 send_config->rtp.extensions.push_back(
106 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
107 kTransportSequenceNumberExtensionId));
108 for (AudioReceiveStream::Config& recv_config : *receive_configs) {
109 recv_config.rtp.transport_cc = true;
110 recv_config.rtp.extensions = send_config->rtp.extensions;
111 recv_config.rtp.remote_ssrc = send_config->rtp.ssrc;
112 }
113 }
114
115 std::string AudioInputFile() override {
116 return test::ResourcePath("voice_engine/audio_dtx16", "wav");
117 }
118
119 FakeNetworkPipe::Config GetNetworkPipeConfig() override {
120 FakeNetworkPipe::Config pipe_config;
121 pipe_config.link_capacity_kbps = 50;
122 pipe_config.queue_length_packets = 1500;
123 pipe_config.queue_delay_ms = 300;
124 return pipe_config;
125 }
126
127 void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
128 sender_call_ = sender_call;
129 }
130
131 void PerformTest() override {
132 stats_poller_.PostDelayedTask(
133 std::unique_ptr<rtc::QueuedTask>(new StatsPollTask(sender_call_)), 100);
134 sender_call_->OnTransportOverheadChanged(webrtc::MediaType::AUDIO, 0);
135 AudioBweTest::PerformTest();
136 }
137
138 private:
139 Call* sender_call_;
140 rtc::TaskQueue stats_poller_;
141};
142
143using AudioBweIntegrationTest = CallTest;
144
tschumime76f55e2017-07-19 07:52:47 -0700145// TODO(tschumim): This test is flaky when run on android and mac. Re-enable the
146// test for when the issue is fixed.
147TEST_F(AudioBweIntegrationTest, DISABLED_NoBandwidthDropAfterDtx) {
tschumim9d117642017-07-17 01:41:41 -0700148 webrtc::test::ScopedFieldTrials override_field_trials(
149 "WebRTC-Audio-SendSideBwe/Enabled/"
150 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
151 NoBandwidthDropAfterDtx test;
152 RunBaseTest(&test);
153}
154
155} // namespace test
156} // namespace webrtc