blob: cf727d40445c7c9fbda9c25482fe8e036ce3bbaa [file] [log] [blame]
solenbergc7a8b082015-10-16 14:35:07 -07001/*
2 * Copyright (c) 2015 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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "call/call.h"
12
solenbergc7a8b082015-10-16 14:35:07 -070013#include <list>
kwiberg1c07c702017-03-27 07:15:49 -070014#include <map>
kwibergb25345e2016-03-12 06:10:44 -080015#include <memory>
zstein7cb69d52017-05-08 11:52:38 -070016#include <utility>
solenbergc7a8b082015-10-16 14:35:07 -070017
Karl Wiberg918f50c2018-07-05 11:40:33 +020018#include "absl/memory/memory.h"
Karl Wibergf3850f62017-11-02 13:04:41 +010019#include "api/audio_codecs/builtin_audio_decoder_factory.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020020#include "api/rtc_event_log/rtc_event_log.h"
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020021#include "api/task_queue/default_task_queue_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "api/test/mock_audio_mixer.h"
Erik Språng014dd3c2019-11-28 13:44:25 +010023#include "api/transport/field_trial_based_config.h"
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010024#include "audio/audio_receive_stream.h"
Yves Gerey665174f2018-06-19 15:03:05 +020025#include "audio/audio_send_stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "call/audio_state.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "modules/audio_device/include/mock_audio_device.h"
Fredrik Solenberg2a877972017-12-15 16:42:15 +010028#include "modules/audio_processing/include/mock_audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "modules/rtp_rtcp/include/rtp_rtcp.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020030#include "test/fake_encoder.h"
31#include "test/gtest.h"
32#include "test/mock_audio_decoder_factory.h"
33#include "test/mock_transport.h"
solenbergc7a8b082015-10-16 14:35:07 -070034
35namespace {
36
37struct CallHelper {
Per Åhgrencc73ed32020-04-26 23:56:17 +020038 explicit CallHelper(bool use_null_audio_processing) {
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020039 task_queue_factory_ = webrtc::CreateDefaultTaskQueueFactory();
solenberg566ef242015-11-06 15:34:49 -080040 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010041 audio_state_config.audio_mixer =
42 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
43 audio_state_config.audio_processing =
Per Åhgrencc73ed32020-04-26 23:56:17 +020044 use_null_audio_processing
45 ? nullptr
46 : new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
Fredrik Solenberg2a877972017-12-15 16:42:15 +010047 audio_state_config.audio_device_module =
48 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070049 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080050 config.audio_state = webrtc::AudioState::Create(audio_state_config);
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020051 config.task_queue_factory = task_queue_factory_.get();
Erik Språng014dd3c2019-11-28 13:44:25 +010052 config.trials = &field_trials_;
solenbergc7a8b082015-10-16 14:35:07 -070053 call_.reset(webrtc::Call::Create(config));
54 }
55
56 webrtc::Call* operator->() { return call_.get(); }
57
58 private:
Danil Chapovalov83bbe912019-08-07 12:24:53 +020059 webrtc::RtcEventLogNull event_log_;
Erik Språng014dd3c2019-11-28 13:44:25 +010060 webrtc::FieldTrialBasedConfig field_trials_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020061 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
kwibergb25345e2016-03-12 06:10:44 -080062 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070063};
64} // namespace
65
66namespace webrtc {
67
68TEST(CallTest, ConstructDestruct) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020069 for (bool use_null_audio_processing : {false, true}) {
70 CallHelper call(use_null_audio_processing);
71 }
solenbergc7a8b082015-10-16 14:35:07 -070072}
73
74TEST(CallTest, CreateDestroy_AudioSendStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020075 for (bool use_null_audio_processing : {false, true}) {
76 CallHelper call(use_null_audio_processing);
77 MockTransport send_transport;
78 AudioSendStream::Config config(&send_transport);
79 config.rtp.ssrc = 42;
80 AudioSendStream* stream = call->CreateAudioSendStream(config);
81 EXPECT_NE(stream, nullptr);
82 call->DestroyAudioSendStream(stream);
83 }
solenbergc7a8b082015-10-16 14:35:07 -070084}
85
86TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020087 for (bool use_null_audio_processing : {false, true}) {
88 CallHelper call(use_null_audio_processing);
89 AudioReceiveStream::Config config;
90 MockTransport rtcp_send_transport;
91 config.rtp.remote_ssrc = 42;
92 config.rtcp_send_transport = &rtcp_send_transport;
93 config.decoder_factory =
94 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
95 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
96 EXPECT_NE(stream, nullptr);
97 call->DestroyAudioReceiveStream(stream);
98 }
solenbergc7a8b082015-10-16 14:35:07 -070099}
100
101TEST(CallTest, CreateDestroy_AudioSendStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200102 for (bool use_null_audio_processing : {false, true}) {
103 CallHelper call(use_null_audio_processing);
104 MockTransport send_transport;
105 AudioSendStream::Config config(&send_transport);
106 std::list<AudioSendStream*> streams;
107 for (int i = 0; i < 2; ++i) {
108 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
109 config.rtp.ssrc = ssrc;
110 AudioSendStream* stream = call->CreateAudioSendStream(config);
111 EXPECT_NE(stream, nullptr);
112 if (ssrc & 1) {
113 streams.push_back(stream);
114 } else {
115 streams.push_front(stream);
116 }
solenbergc7a8b082015-10-16 14:35:07 -0700117 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200118 for (auto s : streams) {
119 call->DestroyAudioSendStream(s);
120 }
121 streams.clear();
solenbergc7a8b082015-10-16 14:35:07 -0700122 }
solenbergc7a8b082015-10-16 14:35:07 -0700123 }
124}
125
126TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200127 for (bool use_null_audio_processing : {false, true}) {
128 CallHelper call(use_null_audio_processing);
129 AudioReceiveStream::Config config;
130 MockTransport rtcp_send_transport;
131 config.rtcp_send_transport = &rtcp_send_transport;
132 config.decoder_factory =
133 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
134 std::list<AudioReceiveStream*> streams;
135 for (int i = 0; i < 2; ++i) {
136 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
137 config.rtp.remote_ssrc = ssrc;
138 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
139 EXPECT_NE(stream, nullptr);
140 if (ssrc & 1) {
141 streams.push_back(stream);
142 } else {
143 streams.push_front(stream);
144 }
solenbergc7a8b082015-10-16 14:35:07 -0700145 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200146 for (auto s : streams) {
147 call->DestroyAudioReceiveStream(s);
148 }
149 streams.clear();
solenbergc7a8b082015-10-16 14:35:07 -0700150 }
solenbergc7a8b082015-10-16 14:35:07 -0700151 }
152}
brandtr25445d32016-10-23 23:37:14 -0700153
solenberg7602aab2016-11-14 11:30:07 -0800154TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200155 for (bool use_null_audio_processing : {false, true}) {
156 CallHelper call(use_null_audio_processing);
157 AudioReceiveStream::Config recv_config;
158 MockTransport rtcp_send_transport;
159 recv_config.rtp.remote_ssrc = 42;
160 recv_config.rtp.local_ssrc = 777;
161 recv_config.rtcp_send_transport = &rtcp_send_transport;
162 recv_config.decoder_factory =
163 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
164 AudioReceiveStream* recv_stream =
165 call->CreateAudioReceiveStream(recv_config);
166 EXPECT_NE(recv_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800167
Per Åhgrencc73ed32020-04-26 23:56:17 +0200168 MockTransport send_transport;
169 AudioSendStream::Config send_config(&send_transport);
170 send_config.rtp.ssrc = 777;
171 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
172 EXPECT_NE(send_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800173
Per Åhgrencc73ed32020-04-26 23:56:17 +0200174 internal::AudioReceiveStream* internal_recv_stream =
175 static_cast<internal::AudioReceiveStream*>(recv_stream);
176 EXPECT_EQ(send_stream,
177 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800178
Per Åhgrencc73ed32020-04-26 23:56:17 +0200179 call->DestroyAudioSendStream(send_stream);
180 EXPECT_EQ(nullptr,
181 internal_recv_stream->GetAssociatedSendStreamForTesting());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100182
Per Åhgrencc73ed32020-04-26 23:56:17 +0200183 call->DestroyAudioReceiveStream(recv_stream);
184 }
solenberg7602aab2016-11-14 11:30:07 -0800185}
186
187TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200188 for (bool use_null_audio_processing : {false, true}) {
189 CallHelper call(use_null_audio_processing);
190 MockTransport send_transport;
191 AudioSendStream::Config send_config(&send_transport);
192 send_config.rtp.ssrc = 777;
193 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
194 EXPECT_NE(send_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800195
Per Åhgrencc73ed32020-04-26 23:56:17 +0200196 AudioReceiveStream::Config recv_config;
197 MockTransport rtcp_send_transport;
198 recv_config.rtp.remote_ssrc = 42;
199 recv_config.rtp.local_ssrc = 777;
200 recv_config.rtcp_send_transport = &rtcp_send_transport;
201 recv_config.decoder_factory =
202 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
203 AudioReceiveStream* recv_stream =
204 call->CreateAudioReceiveStream(recv_config);
205 EXPECT_NE(recv_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800206
Per Åhgrencc73ed32020-04-26 23:56:17 +0200207 internal::AudioReceiveStream* internal_recv_stream =
208 static_cast<internal::AudioReceiveStream*>(recv_stream);
209 EXPECT_EQ(send_stream,
210 internal_recv_stream->GetAssociatedSendStreamForTesting());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100211
Per Åhgrencc73ed32020-04-26 23:56:17 +0200212 call->DestroyAudioReceiveStream(recv_stream);
solenberg7602aab2016-11-14 11:30:07 -0800213
Per Åhgrencc73ed32020-04-26 23:56:17 +0200214 call->DestroyAudioSendStream(send_stream);
215 }
solenberg7602aab2016-11-14 11:30:07 -0800216}
217
brandtr25445d32016-10-23 23:37:14 -0700218TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200219 for (bool use_null_audio_processing : {false, true}) {
220 CallHelper call(use_null_audio_processing);
221 MockTransport rtcp_send_transport;
222 FlexfecReceiveStream::Config config(&rtcp_send_transport);
223 config.payload_type = 118;
224 config.remote_ssrc = 38837212;
225 config.protected_media_ssrcs = {27273};
brandtr25445d32016-10-23 23:37:14 -0700226
Per Åhgrencc73ed32020-04-26 23:56:17 +0200227 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
228 EXPECT_NE(stream, nullptr);
229 call->DestroyFlexfecReceiveStream(stream);
230 }
brandtr25445d32016-10-23 23:37:14 -0700231}
232
233TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200234 for (bool use_null_audio_processing : {false, true}) {
235 CallHelper call(use_null_audio_processing);
236 MockTransport rtcp_send_transport;
237 FlexfecReceiveStream::Config config(&rtcp_send_transport);
238 config.payload_type = 118;
239 std::list<FlexfecReceiveStream*> streams;
brandtr25445d32016-10-23 23:37:14 -0700240
Per Åhgrencc73ed32020-04-26 23:56:17 +0200241 for (int i = 0; i < 2; ++i) {
242 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
243 config.remote_ssrc = ssrc;
244 config.protected_media_ssrcs = {ssrc + 1};
245 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
246 EXPECT_NE(stream, nullptr);
247 if (ssrc & 1) {
248 streams.push_back(stream);
249 } else {
250 streams.push_front(stream);
251 }
brandtr25445d32016-10-23 23:37:14 -0700252 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200253 for (auto s : streams) {
254 call->DestroyFlexfecReceiveStream(s);
255 }
256 streams.clear();
brandtr25445d32016-10-23 23:37:14 -0700257 }
brandtr25445d32016-10-23 23:37:14 -0700258 }
259}
260
261TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200262 for (bool use_null_audio_processing : {false, true}) {
263 CallHelper call(use_null_audio_processing);
264 MockTransport rtcp_send_transport;
265 FlexfecReceiveStream::Config config(&rtcp_send_transport);
266 config.payload_type = 118;
267 config.protected_media_ssrcs = {1324234};
268 FlexfecReceiveStream* stream;
269 std::list<FlexfecReceiveStream*> streams;
brandtr25445d32016-10-23 23:37:14 -0700270
Per Åhgrencc73ed32020-04-26 23:56:17 +0200271 config.remote_ssrc = 838383;
272 stream = call->CreateFlexfecReceiveStream(config);
273 EXPECT_NE(stream, nullptr);
274 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700275
Per Åhgrencc73ed32020-04-26 23:56:17 +0200276 config.remote_ssrc = 424993;
277 stream = call->CreateFlexfecReceiveStream(config);
278 EXPECT_NE(stream, nullptr);
279 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700280
Per Åhgrencc73ed32020-04-26 23:56:17 +0200281 config.remote_ssrc = 99383;
282 stream = call->CreateFlexfecReceiveStream(config);
283 EXPECT_NE(stream, nullptr);
284 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700285
Per Åhgrencc73ed32020-04-26 23:56:17 +0200286 config.remote_ssrc = 5548;
287 stream = call->CreateFlexfecReceiveStream(config);
288 EXPECT_NE(stream, nullptr);
289 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700290
Per Åhgrencc73ed32020-04-26 23:56:17 +0200291 for (auto s : streams) {
292 call->DestroyFlexfecReceiveStream(s);
293 }
brandtr25445d32016-10-23 23:37:14 -0700294 }
295}
296
ossuc3d4b482017-05-23 06:07:11 -0700297TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
298 constexpr uint32_t kSSRC = 12345;
Per Åhgrencc73ed32020-04-26 23:56:17 +0200299 for (bool use_null_audio_processing : {false, true}) {
300 CallHelper call(use_null_audio_processing);
ossuc3d4b482017-05-23 06:07:11 -0700301
Per Åhgrencc73ed32020-04-26 23:56:17 +0200302 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
303 MockTransport send_transport;
304 AudioSendStream::Config config(&send_transport);
305 config.rtp.ssrc = ssrc;
306 AudioSendStream* stream = call->CreateAudioSendStream(config);
307 const RtpState rtp_state =
308 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
309 call->DestroyAudioSendStream(stream);
310 return rtp_state;
311 };
ossuc3d4b482017-05-23 06:07:11 -0700312
Per Åhgrencc73ed32020-04-26 23:56:17 +0200313 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
314 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
ossuc3d4b482017-05-23 06:07:11 -0700315
Per Åhgrencc73ed32020-04-26 23:56:17 +0200316 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
317 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
318 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
319 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
320 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
321 rtp_state2.last_timestamp_time_ms);
322 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
323 }
ossuc3d4b482017-05-23 06:07:11 -0700324}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100325
solenbergc7a8b082015-10-16 14:35:07 -0700326} // namespace webrtc