blob: c4f72de1783a06e76cd33edf20c67d1a025c8650 [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
11#include "webrtc/audio/test/audio_bwe_integration_test.h"
12
13#include "webrtc/common_audio/wav_file.h"
14#include "webrtc/rtc_base/ptr_util.h"
15#include "webrtc/system_wrappers/include/sleep.h"
16#include "webrtc/test/field_trial.h"
17#include "webrtc/test/gtest.h"
18#include "webrtc/test/testsupport/fileutils.h"
19
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
51test::PacketTransport* AudioBweTest::CreateSendTransport(Call* sender_call) {
52 return new test::PacketTransport(
53 sender_call, this, test::PacketTransport::kSender,
54 test::CallTest::payload_type_map_, GetNetworkPipeConfig());
55}
56
57test::PacketTransport* AudioBweTest::CreateReceiveTransport() {
58 return new test::PacketTransport(
59 nullptr, this, test::PacketTransport::kReceiver,
60 test::CallTest::payload_type_map_, GetNetworkPipeConfig());
61}
62
63void AudioBweTest::PerformTest() {
64 send_audio_device_->WaitForRecordingEnd();
65 SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraProcessTimeMs);
66}
67
68class StatsPollTask : public rtc::QueuedTask {
69 public:
70 explicit StatsPollTask(Call* sender_call) : sender_call_(sender_call) {}
71
72 private:
73 bool Run() override {
74 RTC_CHECK(sender_call_);
75 Call::Stats call_stats = sender_call_->GetStats();
76 EXPECT_GT(call_stats.send_bandwidth_bps, 25000);
77 rtc::TaskQueue::Current()->PostDelayedTask(
78 std::unique_ptr<QueuedTask>(this), 100);
79 return false;
80 }
81 Call* sender_call_;
82};
83
84class NoBandwidthDropAfterDtx : public AudioBweTest {
85 public:
86 NoBandwidthDropAfterDtx()
87 : sender_call_(nullptr), stats_poller_("stats poller task queue") {}
88
89 void ModifyAudioConfigs(
90 AudioSendStream::Config* send_config,
91 std::vector<AudioReceiveStream::Config>* receive_configs) override {
92 send_config->send_codec_spec =
93 rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
94 {test::CallTest::kAudioSendPayloadType,
95 {"OPUS",
96 48000,
97 2,
98 {{"ptime", "60"}, {"usedtx", "1"}, {"stereo", "1"}}}});
99
100 send_config->min_bitrate_bps = 6000;
101 send_config->max_bitrate_bps = 100000;
102 send_config->rtp.extensions.push_back(
103 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
104 kTransportSequenceNumberExtensionId));
105 for (AudioReceiveStream::Config& recv_config : *receive_configs) {
106 recv_config.rtp.transport_cc = true;
107 recv_config.rtp.extensions = send_config->rtp.extensions;
108 recv_config.rtp.remote_ssrc = send_config->rtp.ssrc;
109 }
110 }
111
112 std::string AudioInputFile() override {
113 return test::ResourcePath("voice_engine/audio_dtx16", "wav");
114 }
115
116 FakeNetworkPipe::Config GetNetworkPipeConfig() override {
117 FakeNetworkPipe::Config pipe_config;
118 pipe_config.link_capacity_kbps = 50;
119 pipe_config.queue_length_packets = 1500;
120 pipe_config.queue_delay_ms = 300;
121 return pipe_config;
122 }
123
124 void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
125 sender_call_ = sender_call;
126 }
127
128 void PerformTest() override {
129 stats_poller_.PostDelayedTask(
130 std::unique_ptr<rtc::QueuedTask>(new StatsPollTask(sender_call_)), 100);
131 sender_call_->OnTransportOverheadChanged(webrtc::MediaType::AUDIO, 0);
132 AudioBweTest::PerformTest();
133 }
134
135 private:
136 Call* sender_call_;
137 rtc::TaskQueue stats_poller_;
138};
139
140using AudioBweIntegrationTest = CallTest;
141
tschumime76f55e2017-07-19 07:52:47 -0700142// TODO(tschumim): This test is flaky when run on android and mac. Re-enable the
143// test for when the issue is fixed.
144TEST_F(AudioBweIntegrationTest, DISABLED_NoBandwidthDropAfterDtx) {
tschumim9d117642017-07-17 01:41:41 -0700145 webrtc::test::ScopedFieldTrials override_field_trials(
146 "WebRTC-Audio-SendSideBwe/Enabled/"
147 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
148 NoBandwidthDropAfterDtx test;
149 RunBaseTest(&test);
150}
151
152} // namespace test
153} // namespace webrtc