blob: 91677dbd8beac6fff16876a124d2786e31b310e1 [file] [log] [blame]
Niels Möller7d76a312018-10-26 12:57:07 +02001/*
2 * Copyright (c) 2018 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 "api/audio_codecs/audio_decoder_factory_template.h"
12#include "api/audio_codecs/audio_encoder_factory_template.h"
13#include "api/audio_codecs/opus/audio_decoder_opus.h"
14#include "api/audio_codecs/opus/audio_encoder_opus.h"
15#include "api/test/loopback_media_transport.h"
16#include "api/test/mock_audio_mixer.h"
17#include "audio/audio_receive_stream.h"
18#include "audio/audio_send_stream.h"
19#include "call/test/mock_bitrate_allocator.h"
20#include "logging/rtc_event_log/rtc_event_log.h"
21#include "modules/audio_device/include/test_audio_device.h"
22#include "modules/audio_mixer/audio_mixer_impl.h"
23#include "modules/audio_processing/include/mock_audio_processing.h"
24#include "modules/utility/include/process_thread.h"
25#include "rtc_base/task_queue.h"
26#include "rtc_base/timeutils.h"
27#include "test/gtest.h"
28#include "test/mock_transport.h"
29
30namespace webrtc {
31namespace test {
32
33namespace {
34constexpr int kPayloadTypeOpus = 17;
35constexpr int kSamplingFrequency = 48000;
36constexpr int kNumChannels = 2;
37constexpr int kWantedSamples = 3000;
38constexpr int kTestTimeoutMs = 2 * rtc::kNumMillisecsPerSec;
39
40class TestRenderer : public TestAudioDeviceModule::Renderer {
41 public:
42 TestRenderer(int sampling_frequency, int num_channels, size_t wanted_samples)
43 : sampling_frequency_(sampling_frequency),
44 num_channels_(num_channels),
45 wanted_samples_(wanted_samples) {}
46 ~TestRenderer() override = default;
47
48 int SamplingFrequency() const override { return sampling_frequency_; }
49 int NumChannels() const override { return num_channels_; }
50
51 bool Render(rtc::ArrayView<const int16_t> data) override {
52 if (data.size() >= wanted_samples_) {
53 return false;
54 }
55 wanted_samples_ -= data.size();
56 return true;
57 }
58
59 private:
60 const int sampling_frequency_;
61 const int num_channels_;
62 size_t wanted_samples_;
63};
64
65} // namespace
66
67TEST(AudioWithMediaTransport, DeliversAudio) {
Bjorn Mellem273d0292018-11-01 16:42:44 -070068 std::unique_ptr<rtc::Thread> transport_thread = rtc::Thread::Create();
69 transport_thread->Start();
70 MediaTransportPair transport_pair(transport_thread.get());
Niels Möller7d76a312018-10-26 12:57:07 +020071 MockTransport rtcp_send_transport;
72 MockTransport send_transport;
73 std::unique_ptr<RtcEventLog> null_event_log = RtcEventLog::CreateNull();
74 MockBitrateAllocator bitrate_allocator;
75
76 rtc::scoped_refptr<TestAudioDeviceModule> audio_device =
77 TestAudioDeviceModule::CreateTestAudioDeviceModule(
78 TestAudioDeviceModule::CreatePulsedNoiseCapturer(
79 /* max_amplitude= */ 10000, kSamplingFrequency, kNumChannels),
80 absl::make_unique<TestRenderer>(kSamplingFrequency, kNumChannels,
81 kWantedSamples));
82
83 AudioState::Config audio_config;
84 audio_config.audio_mixer = AudioMixerImpl::Create();
85 // TODO(nisse): Is a mock AudioProcessing enough?
86 audio_config.audio_processing =
87 new rtc::RefCountedObject<MockAudioProcessing>();
88 audio_config.audio_device_module = audio_device;
89 rtc::scoped_refptr<AudioState> audio_state = AudioState::Create(audio_config);
90
91 // TODO(nisse): Use some lossless codec?
92 const SdpAudioFormat audio_format("opus", kSamplingFrequency, kNumChannels);
93
94 // Setup receive stream;
95 webrtc::AudioReceiveStream::Config receive_config;
96 // TODO(nisse): Update AudioReceiveStream to not require rtcp_send_transport
97 // when a MediaTransport is provided.
98 receive_config.rtcp_send_transport = &rtcp_send_transport;
99 receive_config.media_transport = transport_pair.first();
100 receive_config.decoder_map.emplace(kPayloadTypeOpus, audio_format);
101 receive_config.decoder_factory =
102 CreateAudioDecoderFactory<AudioDecoderOpus>();
103
104 std::unique_ptr<ProcessThread> receive_process_thread =
105 ProcessThread::Create("audio recv thread");
106
107 webrtc::internal::AudioReceiveStream receive_stream(
108 /*rtp_stream_receiver_controller=*/nullptr,
109 /*packet_router=*/nullptr, receive_process_thread.get(), receive_config,
110 audio_state, null_event_log.get());
111
112 // TODO(nisse): Update AudioSendStream to not require send_transport when a
113 // MediaTransport is provided.
114 AudioSendStream::Config send_config(&send_transport, transport_pair.second());
115 send_config.send_codec_spec =
116 AudioSendStream::Config::SendCodecSpec(kPayloadTypeOpus, audio_format);
117 send_config.encoder_factory = CreateAudioEncoderFactory<AudioEncoderOpus>();
118 rtc::TaskQueue send_tq("audio send queue");
119 std::unique_ptr<ProcessThread> send_process_thread =
120 ProcessThread::Create("audio send thread");
121 TimeInterval life_time;
122 webrtc::internal::AudioSendStream send_stream(
123 send_config, audio_state, &send_tq, send_process_thread.get(),
124 /*transport=*/nullptr, &bitrate_allocator, null_event_log.get(),
125 /*rtcp_rtt_stats=*/nullptr, absl::optional<RtpState>(), &life_time);
126
127 audio_device->Init(); // Starts thread.
128 audio_device->RegisterAudioCallback(audio_state->audio_transport());
129
130 receive_stream.Start();
131 send_stream.Start();
132 audio_device->StartPlayout();
133 audio_device->StartRecording();
134
135 EXPECT_TRUE(audio_device->WaitForPlayoutEnd(kTestTimeoutMs));
136
137 audio_device->StopRecording();
138 audio_device->StopPlayout();
139 receive_stream.Stop();
140 send_stream.Stop();
141}
142
143} // namespace test
144} // namespace webrtc