blob: f5d21167ff7a5528aa230cb68d6d56f162203cc7 [file] [log] [blame]
Sebastian Jansson98b07e92018-09-27 13:47:01 +02001/*
2 * Copyright 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#include "test/scenario/audio_stream.h"
11
Steve Anton40d55332019-01-07 10:21:47 -080012#include "absl/memory/memory.h"
Sebastian Jansson98b07e92018-09-27 13:47:01 +020013#include "test/call_test.h"
14
Sebastian Janssonb9972fa2018-10-17 16:27:55 +020015#if WEBRTC_ENABLE_PROTOBUF
16RTC_PUSH_IGNORING_WUNDEF()
17#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
18#include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
19#else
20#include "modules/audio_coding/audio_network_adaptor/config.pb.h"
21#endif
22RTC_POP_IGNORING_WUNDEF()
23#endif
24
Sebastian Jansson98b07e92018-09-27 13:47:01 +020025namespace webrtc {
26namespace test {
Sebastian Janssonb9972fa2018-10-17 16:27:55 +020027namespace {
Sebastian Janssone112bb82019-06-13 17:36:01 +020028enum : int { // The first valid value is 1.
29 kTransportSequenceNumberExtensionId = 1,
30 kAbsSendTimeExtensionId
31};
32
Sebastian Janssonb9972fa2018-10-17 16:27:55 +020033absl::optional<std::string> CreateAdaptationString(
34 AudioStreamConfig::NetworkAdaptation config) {
35#if WEBRTC_ENABLE_PROTOBUF
36
37 audio_network_adaptor::config::ControllerManager cont_conf;
38 if (config.frame.max_rate_for_60_ms.IsFinite()) {
39 auto controller =
40 cont_conf.add_controllers()->mutable_frame_length_controller();
41 controller->set_fl_decreasing_packet_loss_fraction(
42 config.frame.min_packet_loss_for_decrease);
43 controller->set_fl_increasing_packet_loss_fraction(
44 config.frame.max_packet_loss_for_increase);
45
46 controller->set_fl_20ms_to_60ms_bandwidth_bps(
47 config.frame.min_rate_for_20_ms.bps<int32_t>());
48 controller->set_fl_60ms_to_20ms_bandwidth_bps(
49 config.frame.max_rate_for_60_ms.bps<int32_t>());
50
51 if (config.frame.max_rate_for_120_ms.IsFinite()) {
52 controller->set_fl_60ms_to_120ms_bandwidth_bps(
53 config.frame.min_rate_for_60_ms.bps<int32_t>());
54 controller->set_fl_120ms_to_60ms_bandwidth_bps(
55 config.frame.max_rate_for_120_ms.bps<int32_t>());
56 }
57 }
58 cont_conf.add_controllers()->mutable_bitrate_controller();
59 std::string config_string = cont_conf.SerializeAsString();
60 return config_string;
61#else
62 RTC_LOG(LS_ERROR) << "audio_network_adaptation is enabled"
63 " but WEBRTC_ENABLE_PROTOBUF is false.\n"
64 "Ignoring settings.";
65 return absl::nullopt;
66#endif // WEBRTC_ENABLE_PROTOBUF
67}
68} // namespace
Sebastian Jansson98b07e92018-09-27 13:47:01 +020069
70SendAudioStream::SendAudioStream(
71 CallClient* sender,
72 AudioStreamConfig config,
73 rtc::scoped_refptr<AudioEncoderFactory> encoder_factory,
74 Transport* send_transport)
75 : sender_(sender), config_(config) {
Niels Möller7d76a312018-10-26 12:57:07 +020076 AudioSendStream::Config send_config(send_transport,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070077 webrtc::MediaTransportConfig());
Sebastian Jansson98b07e92018-09-27 13:47:01 +020078 ssrc_ = sender->GetNextAudioSsrc();
79 send_config.rtp.ssrc = ssrc_;
80 SdpAudioFormat::Parameters sdp_params;
81 if (config.source.channels == 2)
82 sdp_params["stereo"] = "1";
83 if (config.encoder.initial_frame_length != TimeDelta::ms(20))
84 sdp_params["ptime"] =
85 std::to_string(config.encoder.initial_frame_length.ms());
Sebastian Janssonad871942019-01-16 17:21:28 +010086 if (config.encoder.enable_dtx)
87 sdp_params["usedtx"] = "1";
Sebastian Jansson98b07e92018-09-27 13:47:01 +020088
89 // SdpAudioFormat::num_channels indicates that the encoder is capable of
90 // stereo, but the actual channel count used is based on the "stereo"
91 // parameter.
92 send_config.send_codec_spec = AudioSendStream::Config::SendCodecSpec(
93 CallTest::kAudioSendPayloadType, {"opus", 48000, 2, sdp_params});
94 RTC_DCHECK_LE(config.source.channels, 2);
95 send_config.encoder_factory = encoder_factory;
96
97 if (config.encoder.fixed_rate)
98 send_config.send_codec_spec->target_bitrate_bps =
99 config.encoder.fixed_rate->bps();
100
Sebastian Janssonb9972fa2018-10-17 16:27:55 +0200101 if (config.network_adaptation) {
102 send_config.audio_network_adaptor_config =
103 CreateAdaptationString(config.adapt);
104 }
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200105 if (config.encoder.allocate_bitrate ||
106 config.stream.in_bandwidth_estimation) {
107 DataRate min_rate = DataRate::Infinity();
108 DataRate max_rate = DataRate::Infinity();
109 if (config.encoder.fixed_rate) {
110 min_rate = *config.encoder.fixed_rate;
111 max_rate = *config.encoder.fixed_rate;
112 } else {
113 min_rate = *config.encoder.min_rate;
114 max_rate = *config.encoder.max_rate;
115 }
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200116 send_config.min_bitrate_bps = min_rate.bps();
117 send_config.max_bitrate_bps = max_rate.bps();
118 }
119
120 if (config.stream.in_bandwidth_estimation) {
121 send_config.send_codec_spec->transport_cc_enabled = true;
Sebastian Janssone112bb82019-06-13 17:36:01 +0200122 send_config.rtp.extensions = {{RtpExtension::kTransportSequenceNumberUri,
123 kTransportSequenceNumberExtensionId}};
124 }
125 if (config.stream.abs_send_time) {
126 send_config.rtp.extensions.push_back(
127 {RtpExtension::kAbsSendTimeUri, kAbsSendTimeExtensionId});
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200128 }
129
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200130 sender_->SendTask([&] {
131 send_stream_ = sender_->call_->CreateAudioSendStream(send_config);
132 if (field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")) {
133 sender->call_->OnAudioTransportOverheadChanged(
134 sender_->transport_->packet_overhead().bytes());
135 }
136 });
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200137}
138
139SendAudioStream::~SendAudioStream() {
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200140 sender_->SendTask(
141 [this] { sender_->call_->DestroyAudioSendStream(send_stream_); });
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200142}
143
144void SendAudioStream::Start() {
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200145 sender_->SendTask([this] {
146 send_stream_->Start();
147 sender_->call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
148 });
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200149}
150
Sebastian Janssonbdfadd62019-02-08 13:34:57 +0100151void SendAudioStream::Stop() {
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200152 sender_->SendTask([this] { send_stream_->Stop(); });
Sebastian Janssonbdfadd62019-02-08 13:34:57 +0100153}
154
Sebastian Janssonad871942019-01-16 17:21:28 +0100155void SendAudioStream::SetMuted(bool mute) {
156 send_stream_->SetMuted(mute);
157}
158
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200159ColumnPrinter SendAudioStream::StatsPrinter() {
160 return ColumnPrinter::Lambda(
161 "audio_target_rate",
162 [this](rtc::SimpleStringBuilder& sb) {
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200163 sender_->SendTask([this, &sb] {
164 AudioSendStream::Stats stats = send_stream_->GetStats();
165 sb.AppendFormat("%.0lf", stats.target_bitrate_bps / 8.0);
166 });
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200167 },
168 64);
169}
170
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200171ReceiveAudioStream::ReceiveAudioStream(
172 CallClient* receiver,
173 AudioStreamConfig config,
174 SendAudioStream* send_stream,
175 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
176 Transport* feedback_transport)
177 : receiver_(receiver), config_(config) {
178 AudioReceiveStream::Config recv_config;
Sebastian Jansson5fbebd52019-02-20 11:16:19 +0100179 recv_config.rtp.local_ssrc = receiver_->GetNextAudioLocalSsrc();
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200180 recv_config.rtcp_send_transport = feedback_transport;
181 recv_config.rtp.remote_ssrc = send_stream->ssrc_;
Sebastian Jansson800e1212018-10-22 11:49:03 +0200182 receiver->ssrc_media_types_[recv_config.rtp.remote_ssrc] = MediaType::AUDIO;
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200183 if (config.stream.in_bandwidth_estimation) {
184 recv_config.rtp.transport_cc = true;
Sebastian Jansson63c38e22019-08-06 17:17:43 +0200185 recv_config.rtp.extensions = {{RtpExtension::kTransportSequenceNumberUri,
186 kTransportSequenceNumberExtensionId}};
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200187 }
Sebastian Janssonfd201712018-11-12 16:44:16 +0100188 receiver_->AddExtensions(recv_config.rtp.extensions);
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200189 recv_config.decoder_factory = decoder_factory;
190 recv_config.decoder_map = {
191 {CallTest::kAudioSendPayloadType, {"opus", 48000, 2}}};
192 recv_config.sync_group = config.render.sync_group;
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200193 receiver_->SendTask([&] {
194 receive_stream_ = receiver_->call_->CreateAudioReceiveStream(recv_config);
195 });
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200196}
197ReceiveAudioStream::~ReceiveAudioStream() {
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200198 receiver_->SendTask(
199 [&] { receiver_->call_->DestroyAudioReceiveStream(receive_stream_); });
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200200}
201
Sebastian Jansson49a78432018-11-20 16:15:29 +0100202void ReceiveAudioStream::Start() {
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200203 receiver_->SendTask([&] {
204 receive_stream_->Start();
205 receiver_->call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
206 });
Sebastian Jansson49a78432018-11-20 16:15:29 +0100207}
208
Sebastian Janssonbdfadd62019-02-08 13:34:57 +0100209void ReceiveAudioStream::Stop() {
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200210 receiver_->SendTask([&] { receive_stream_->Stop(); });
Sebastian Janssonbdfadd62019-02-08 13:34:57 +0100211}
212
Sebastian Janssonf4481c82019-04-09 12:48:34 +0200213AudioReceiveStream::Stats ReceiveAudioStream::GetStats() const {
214 AudioReceiveStream::Stats result;
215 receiver_->SendTask([&] { result = receive_stream_->GetStats(); });
216 return result;
217}
218
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200219AudioStreamPair::~AudioStreamPair() = default;
220
221AudioStreamPair::AudioStreamPair(
222 CallClient* sender,
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200223 rtc::scoped_refptr<AudioEncoderFactory> encoder_factory,
224 CallClient* receiver,
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200225 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
226 AudioStreamConfig config)
227 : config_(config),
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200228 send_stream_(sender, config, encoder_factory, sender->transport_.get()),
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200229 receive_stream_(receiver,
230 config,
231 &send_stream_,
232 decoder_factory,
Sebastian Jansson105a10a2019-04-01 09:18:14 +0200233 receiver->transport_.get()) {}
Sebastian Jansson98b07e92018-09-27 13:47:01 +0200234
235} // namespace test
236} // namespace webrtc