blob: e1b645e7046b8cf20d4e87d419814004d605cea2 [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
12#include "test/call_test.h"
13
14namespace webrtc {
15namespace test {
16
17SendAudioStream::SendAudioStream(
18 CallClient* sender,
19 AudioStreamConfig config,
20 rtc::scoped_refptr<AudioEncoderFactory> encoder_factory,
21 Transport* send_transport)
22 : sender_(sender), config_(config) {
23 AudioSendStream::Config send_config(send_transport);
24 ssrc_ = sender->GetNextAudioSsrc();
25 send_config.rtp.ssrc = ssrc_;
26 SdpAudioFormat::Parameters sdp_params;
27 if (config.source.channels == 2)
28 sdp_params["stereo"] = "1";
29 if (config.encoder.initial_frame_length != TimeDelta::ms(20))
30 sdp_params["ptime"] =
31 std::to_string(config.encoder.initial_frame_length.ms());
32
33 // SdpAudioFormat::num_channels indicates that the encoder is capable of
34 // stereo, but the actual channel count used is based on the "stereo"
35 // parameter.
36 send_config.send_codec_spec = AudioSendStream::Config::SendCodecSpec(
37 CallTest::kAudioSendPayloadType, {"opus", 48000, 2, sdp_params});
38 RTC_DCHECK_LE(config.source.channels, 2);
39 send_config.encoder_factory = encoder_factory;
40
41 if (config.encoder.fixed_rate)
42 send_config.send_codec_spec->target_bitrate_bps =
43 config.encoder.fixed_rate->bps();
44
45 if (config.encoder.allocate_bitrate ||
46 config.stream.in_bandwidth_estimation) {
47 DataRate min_rate = DataRate::Infinity();
48 DataRate max_rate = DataRate::Infinity();
49 if (config.encoder.fixed_rate) {
50 min_rate = *config.encoder.fixed_rate;
51 max_rate = *config.encoder.fixed_rate;
52 } else {
53 min_rate = *config.encoder.min_rate;
54 max_rate = *config.encoder.max_rate;
55 }
56 if (field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")) {
57 TimeDelta frame_length = config.encoder.initial_frame_length;
58 DataSize rtp_overhead = DataSize::bytes(12);
59 DataSize total_overhead = config.stream.packet_overhead + rtp_overhead;
60 min_rate += total_overhead / frame_length;
61 max_rate += total_overhead / frame_length;
62 }
63 send_config.min_bitrate_bps = min_rate.bps();
64 send_config.max_bitrate_bps = max_rate.bps();
65 }
66
67 if (config.stream.in_bandwidth_estimation) {
68 send_config.send_codec_spec->transport_cc_enabled = true;
69 send_config.rtp.extensions = {
70 {RtpExtension::kTransportSequenceNumberUri, 8}};
71 }
72
73 if (config.stream.rate_allocation_priority) {
74 send_config.track_id = sender->GetNextPriorityId();
75 }
76 send_stream_ = sender_->call_->CreateAudioSendStream(send_config);
77 if (field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")) {
78 sender->call_->OnTransportOverheadChanged(
79 MediaType::AUDIO, config.stream.packet_overhead.bytes());
80 }
81}
82
83SendAudioStream::~SendAudioStream() {
84 sender_->call_->DestroyAudioSendStream(send_stream_);
85}
86
87void SendAudioStream::Start() {
88 send_stream_->Start();
89}
90
91bool SendAudioStream::TryDeliverPacket(rtc::CopyOnWriteBuffer packet,
92 uint64_t receiver,
93 Timestamp at_time) {
94 // Removes added overhead before delivering RTCP packet to sender.
95 RTC_DCHECK_GE(packet.size(), config_.stream.packet_overhead.bytes());
96 packet.SetSize(packet.size() - config_.stream.packet_overhead.bytes());
97 sender_->DeliverPacket(MediaType::AUDIO, packet, at_time);
98 return true;
99}
100ReceiveAudioStream::ReceiveAudioStream(
101 CallClient* receiver,
102 AudioStreamConfig config,
103 SendAudioStream* send_stream,
104 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
105 Transport* feedback_transport)
106 : receiver_(receiver), config_(config) {
107 AudioReceiveStream::Config recv_config;
108 recv_config.rtp.local_ssrc = CallTest::kReceiverLocalAudioSsrc;
109 recv_config.rtcp_send_transport = feedback_transport;
110 recv_config.rtp.remote_ssrc = send_stream->ssrc_;
111 if (config.stream.in_bandwidth_estimation) {
112 recv_config.rtp.transport_cc = true;
113 recv_config.rtp.extensions = {
114 {RtpExtension::kTransportSequenceNumberUri, 8}};
115 }
116 recv_config.decoder_factory = decoder_factory;
117 recv_config.decoder_map = {
118 {CallTest::kAudioSendPayloadType, {"opus", 48000, 2}}};
119 recv_config.sync_group = config.render.sync_group;
120 receive_stream_ = receiver_->call_->CreateAudioReceiveStream(recv_config);
121}
122ReceiveAudioStream::~ReceiveAudioStream() {
123 receiver_->call_->DestroyAudioReceiveStream(receive_stream_);
124}
125
126bool ReceiveAudioStream::TryDeliverPacket(rtc::CopyOnWriteBuffer packet,
127 uint64_t receiver,
128 Timestamp at_time) {
129 RTC_DCHECK_GE(packet.size(), config_.stream.packet_overhead.bytes());
130 packet.SetSize(packet.size() - config_.stream.packet_overhead.bytes());
131 receiver_->DeliverPacket(MediaType::AUDIO, packet, at_time);
132 return true;
133}
134
135AudioStreamPair::~AudioStreamPair() = default;
136
137AudioStreamPair::AudioStreamPair(
138 CallClient* sender,
139 std::vector<NetworkNode*> send_link,
140 uint64_t send_receiver_id,
141 rtc::scoped_refptr<AudioEncoderFactory> encoder_factory,
142 CallClient* receiver,
143 std::vector<NetworkNode*> return_link,
144 uint64_t return_receiver_id,
145 rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
146 AudioStreamConfig config)
147 : config_(config),
148 send_link_(send_link),
149 return_link_(return_link),
150 send_transport_(sender,
151 send_link.front(),
152 send_receiver_id,
153 config.stream.packet_overhead),
154 return_transport_(receiver,
155 return_link.front(),
156 return_receiver_id,
157 config.stream.packet_overhead),
158 send_stream_(sender, config, encoder_factory, &send_transport_),
159 receive_stream_(receiver,
160 config,
161 &send_stream_,
162 decoder_factory,
163 &return_transport_) {
164 NetworkNode::Route(send_transport_.ReceiverId(), send_link_,
165 &receive_stream_);
166 NetworkNode::Route(return_transport_.ReceiverId(), return_link_,
167 &send_stream_);
168}
169
170} // namespace test
171} // namespace webrtc