blob: 13921555f63f25da34650e30ed4fdcc2ba1f4feb [file] [log] [blame]
Sebastian Jansson98b07e912018-09-27 11:47:011/*
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 18:21:4712#include "absl/memory/memory.h"
Steve Anton10542f22019-01-11 17:11:0013#include "rtc_base/bitrate_allocation_strategy.h"
Sebastian Jansson98b07e912018-09-27 11:47:0114#include "test/call_test.h"
15
Sebastian Janssonb9972fa2018-10-17 14:27:5516#if WEBRTC_ENABLE_PROTOBUF
17RTC_PUSH_IGNORING_WUNDEF()
18#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
19#include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
20#else
21#include "modules/audio_coding/audio_network_adaptor/config.pb.h"
22#endif
23RTC_POP_IGNORING_WUNDEF()
24#endif
25
Sebastian Jansson98b07e912018-09-27 11:47:0126namespace webrtc {
27namespace test {
Sebastian Janssonb9972fa2018-10-17 14:27:5528namespace {
29absl::optional<std::string> CreateAdaptationString(
30 AudioStreamConfig::NetworkAdaptation config) {
31#if WEBRTC_ENABLE_PROTOBUF
32
33 audio_network_adaptor::config::ControllerManager cont_conf;
34 if (config.frame.max_rate_for_60_ms.IsFinite()) {
35 auto controller =
36 cont_conf.add_controllers()->mutable_frame_length_controller();
37 controller->set_fl_decreasing_packet_loss_fraction(
38 config.frame.min_packet_loss_for_decrease);
39 controller->set_fl_increasing_packet_loss_fraction(
40 config.frame.max_packet_loss_for_increase);
41
42 controller->set_fl_20ms_to_60ms_bandwidth_bps(
43 config.frame.min_rate_for_20_ms.bps<int32_t>());
44 controller->set_fl_60ms_to_20ms_bandwidth_bps(
45 config.frame.max_rate_for_60_ms.bps<int32_t>());
46
47 if (config.frame.max_rate_for_120_ms.IsFinite()) {
48 controller->set_fl_60ms_to_120ms_bandwidth_bps(
49 config.frame.min_rate_for_60_ms.bps<int32_t>());
50 controller->set_fl_120ms_to_60ms_bandwidth_bps(
51 config.frame.max_rate_for_120_ms.bps<int32_t>());
52 }
53 }
54 cont_conf.add_controllers()->mutable_bitrate_controller();
55 std::string config_string = cont_conf.SerializeAsString();
56 return config_string;
57#else
58 RTC_LOG(LS_ERROR) << "audio_network_adaptation is enabled"
59 " but WEBRTC_ENABLE_PROTOBUF is false.\n"
60 "Ignoring settings.";
61 return absl::nullopt;
62#endif // WEBRTC_ENABLE_PROTOBUF
63}
64} // namespace
Sebastian Jansson98b07e912018-09-27 11:47:0165
66SendAudioStream::SendAudioStream(
67 CallClient* sender,
68 AudioStreamConfig config,
69 rtc::scoped_refptr<AudioEncoderFactory> encoder_factory,
70 Transport* send_transport)
71 : sender_(sender), config_(config) {
Niels Möller7d76a312018-10-26 10:57:0772 AudioSendStream::Config send_config(send_transport,
73 /*media_transport=*/nullptr);
Sebastian Jansson98b07e912018-09-27 11:47:0174 ssrc_ = sender->GetNextAudioSsrc();
75 send_config.rtp.ssrc = ssrc_;
76 SdpAudioFormat::Parameters sdp_params;
77 if (config.source.channels == 2)
78 sdp_params["stereo"] = "1";
79 if (config.encoder.initial_frame_length != TimeDelta::ms(20))
80 sdp_params["ptime"] =
81 std::to_string(config.encoder.initial_frame_length.ms());
Sebastian Janssonad871942019-01-16 16:21:2882 if (config.encoder.enable_dtx)
83 sdp_params["usedtx"] = "1";
Sebastian Jansson98b07e912018-09-27 11:47:0184
85 // SdpAudioFormat::num_channels indicates that the encoder is capable of
86 // stereo, but the actual channel count used is based on the "stereo"
87 // parameter.
88 send_config.send_codec_spec = AudioSendStream::Config::SendCodecSpec(
89 CallTest::kAudioSendPayloadType, {"opus", 48000, 2, sdp_params});
90 RTC_DCHECK_LE(config.source.channels, 2);
91 send_config.encoder_factory = encoder_factory;
92
93 if (config.encoder.fixed_rate)
94 send_config.send_codec_spec->target_bitrate_bps =
95 config.encoder.fixed_rate->bps();
96
Sebastian Janssonb9972fa2018-10-17 14:27:5597 if (config.network_adaptation) {
98 send_config.audio_network_adaptor_config =
99 CreateAdaptationString(config.adapt);
100 }
Sebastian Jansson98b07e912018-09-27 11:47:01101 if (config.encoder.allocate_bitrate ||
102 config.stream.in_bandwidth_estimation) {
103 DataRate min_rate = DataRate::Infinity();
104 DataRate max_rate = DataRate::Infinity();
105 if (config.encoder.fixed_rate) {
106 min_rate = *config.encoder.fixed_rate;
107 max_rate = *config.encoder.fixed_rate;
108 } else {
109 min_rate = *config.encoder.min_rate;
110 max_rate = *config.encoder.max_rate;
111 }
Sebastian Jansson98b07e912018-09-27 11:47:01112 send_config.min_bitrate_bps = min_rate.bps();
113 send_config.max_bitrate_bps = max_rate.bps();
114 }
115
116 if (config.stream.in_bandwidth_estimation) {
117 send_config.send_codec_spec->transport_cc_enabled = true;
118 send_config.rtp.extensions = {
119 {RtpExtension::kTransportSequenceNumberUri, 8}};
120 }
121
Sebastian Jansson2b101d22018-11-12 15:33:39122 if (config.encoder.priority_rate) {
Sebastian Jansson98b07e912018-09-27 11:47:01123 send_config.track_id = sender->GetNextPriorityId();
Sebastian Jansson2b101d22018-11-12 15:33:39124 sender_->call_->SetBitrateAllocationStrategy(
125 absl::make_unique<rtc::AudioPriorityBitrateAllocationStrategy>(
126 send_config.track_id,
127 config.encoder.priority_rate->bps<uint32_t>()));
Sebastian Jansson98b07e912018-09-27 11:47:01128 }
Sebastian Jansson105a10a2019-04-01 07:18:14129 sender_->SendTask([&] {
130 send_stream_ = sender_->call_->CreateAudioSendStream(send_config);
131 if (field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")) {
132 sender->call_->OnAudioTransportOverheadChanged(
133 sender_->transport_->packet_overhead().bytes());
134 }
135 });
Sebastian Jansson98b07e912018-09-27 11:47:01136}
137
138SendAudioStream::~SendAudioStream() {
Sebastian Jansson105a10a2019-04-01 07:18:14139 sender_->SendTask(
140 [this] { sender_->call_->DestroyAudioSendStream(send_stream_); });
Sebastian Jansson98b07e912018-09-27 11:47:01141}
142
143void SendAudioStream::Start() {
Sebastian Jansson105a10a2019-04-01 07:18:14144 sender_->SendTask([this] {
145 send_stream_->Start();
146 sender_->call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
147 });
Sebastian Jansson98b07e912018-09-27 11:47:01148}
149
Sebastian Janssonbdfadd62019-02-08 12:34:57150void SendAudioStream::Stop() {
Sebastian Jansson105a10a2019-04-01 07:18:14151 sender_->SendTask([this] { send_stream_->Stop(); });
Sebastian Janssonbdfadd62019-02-08 12:34:57152}
153
Sebastian Janssonad871942019-01-16 16:21:28154void SendAudioStream::SetMuted(bool mute) {
155 send_stream_->SetMuted(mute);
156}
157
Sebastian Jansson359d60a2018-10-25 14:22:02158ColumnPrinter SendAudioStream::StatsPrinter() {
159 return ColumnPrinter::Lambda(
160 "audio_target_rate",
161 [this](rtc::SimpleStringBuilder& sb) {
Sebastian Jansson105a10a2019-04-01 07:18:14162 sender_->SendTask([this, &sb] {
163 AudioSendStream::Stats stats = send_stream_->GetStats();
164 sb.AppendFormat("%.0lf", stats.target_bitrate_bps / 8.0);
165 });
Sebastian Jansson359d60a2018-10-25 14:22:02166 },
167 64);
168}
169
Sebastian Jansson98b07e912018-09-27 11:47:01170ReceiveAudioStream::ReceiveAudioStream(
171 CallClient* receiver,
172 AudioStreamConfig config,
173 SendAudioStream* send_stream,
174 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
175 Transport* feedback_transport)
176 : receiver_(receiver), config_(config) {
177 AudioReceiveStream::Config recv_config;
Sebastian Jansson5fbebd52019-02-20 10:16:19178 recv_config.rtp.local_ssrc = receiver_->GetNextAudioLocalSsrc();
Sebastian Jansson98b07e912018-09-27 11:47:01179 recv_config.rtcp_send_transport = feedback_transport;
180 recv_config.rtp.remote_ssrc = send_stream->ssrc_;
Sebastian Jansson800e1212018-10-22 09:49:03181 receiver->ssrc_media_types_[recv_config.rtp.remote_ssrc] = MediaType::AUDIO;
Sebastian Jansson98b07e912018-09-27 11:47:01182 if (config.stream.in_bandwidth_estimation) {
183 recv_config.rtp.transport_cc = true;
184 recv_config.rtp.extensions = {
185 {RtpExtension::kTransportSequenceNumberUri, 8}};
186 }
Sebastian Janssonfd201712018-11-12 15:44:16187 receiver_->AddExtensions(recv_config.rtp.extensions);
Sebastian Jansson98b07e912018-09-27 11:47:01188 recv_config.decoder_factory = decoder_factory;
189 recv_config.decoder_map = {
190 {CallTest::kAudioSendPayloadType, {"opus", 48000, 2}}};
191 recv_config.sync_group = config.render.sync_group;
Sebastian Jansson105a10a2019-04-01 07:18:14192 receiver_->SendTask([&] {
193 receive_stream_ = receiver_->call_->CreateAudioReceiveStream(recv_config);
194 });
Sebastian Jansson98b07e912018-09-27 11:47:01195}
196ReceiveAudioStream::~ReceiveAudioStream() {
Sebastian Jansson105a10a2019-04-01 07:18:14197 receiver_->SendTask(
198 [&] { receiver_->call_->DestroyAudioReceiveStream(receive_stream_); });
Sebastian Jansson98b07e912018-09-27 11:47:01199}
200
Sebastian Jansson49a78432018-11-20 15:15:29201void ReceiveAudioStream::Start() {
Sebastian Jansson105a10a2019-04-01 07:18:14202 receiver_->SendTask([&] {
203 receive_stream_->Start();
204 receiver_->call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
205 });
Sebastian Jansson49a78432018-11-20 15:15:29206}
207
Sebastian Janssonbdfadd62019-02-08 12:34:57208void ReceiveAudioStream::Stop() {
Sebastian Jansson105a10a2019-04-01 07:18:14209 receiver_->SendTask([&] { receive_stream_->Stop(); });
Sebastian Janssonbdfadd62019-02-08 12:34:57210}
211
Sebastian Jansson98b07e912018-09-27 11:47:01212AudioStreamPair::~AudioStreamPair() = default;
213
214AudioStreamPair::AudioStreamPair(
215 CallClient* sender,
Sebastian Jansson98b07e912018-09-27 11:47:01216 rtc::scoped_refptr<AudioEncoderFactory> encoder_factory,
217 CallClient* receiver,
Sebastian Jansson98b07e912018-09-27 11:47:01218 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
219 AudioStreamConfig config)
220 : config_(config),
Sebastian Jansson105a10a2019-04-01 07:18:14221 send_stream_(sender, config, encoder_factory, sender->transport_.get()),
Sebastian Jansson98b07e912018-09-27 11:47:01222 receive_stream_(receiver,
223 config,
224 &send_stream_,
225 decoder_factory,
Sebastian Jansson105a10a2019-04-01 07:18:14226 receiver->transport_.get()) {}
Sebastian Jansson98b07e912018-09-27 11:47:01227
228} // namespace test
229} // namespace webrtc