blob: 248a96a19da2bcdf5f43d71210e0f70045d52623 [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"
Piotr (Peter) Slatalacc8e8bb2018-11-15 08:26:19 -080022#include "api/test/fake_media_transport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "api/test/mock_audio_mixer.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/pacing/mock/mock_paced_sender.h"
30#include "modules/rtp_rtcp/include/rtp_rtcp.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020031#include "test/fake_encoder.h"
32#include "test/gtest.h"
33#include "test/mock_audio_decoder_factory.h"
34#include "test/mock_transport.h"
solenbergc7a8b082015-10-16 14:35:07 -070035
36namespace {
37
38struct CallHelper {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010039 CallHelper() {
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020040 task_queue_factory_ = webrtc::CreateDefaultTaskQueueFactory();
solenberg566ef242015-11-06 15:34:49 -080041 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010042 audio_state_config.audio_mixer =
43 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
44 audio_state_config.audio_processing =
45 new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
46 audio_state_config.audio_device_module =
47 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070048 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080049 config.audio_state = webrtc::AudioState::Create(audio_state_config);
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020050 config.task_queue_factory = task_queue_factory_.get();
solenbergc7a8b082015-10-16 14:35:07 -070051 call_.reset(webrtc::Call::Create(config));
52 }
53
54 webrtc::Call* operator->() { return call_.get(); }
55
56 private:
Danil Chapovalov83bbe912019-08-07 12:24:53 +020057 webrtc::RtcEventLogNull event_log_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020058 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
kwibergb25345e2016-03-12 06:10:44 -080059 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070060};
61} // namespace
62
63namespace webrtc {
64
65TEST(CallTest, ConstructDestruct) {
66 CallHelper call;
67}
68
69TEST(CallTest, CreateDestroy_AudioSendStream) {
70 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010071 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070072 AudioSendStream::Config config(&send_transport, MediaTransportConfig());
solenbergc7a8b082015-10-16 14:35:07 -070073 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 14:35:07 -070074 AudioSendStream* stream = call->CreateAudioSendStream(config);
75 EXPECT_NE(stream, nullptr);
76 call->DestroyAudioSendStream(stream);
77}
78
79TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010080 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -070081 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +020082 MockTransport rtcp_send_transport;
solenbergc7a8b082015-10-16 14:35:07 -070083 config.rtp.remote_ssrc = 42;
Niels Möllerae4237e2018-10-05 11:28:38 +020084 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010085 config.decoder_factory =
86 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -070087 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
88 EXPECT_NE(stream, nullptr);
89 call->DestroyAudioReceiveStream(stream);
90}
91
92TEST(CallTest, CreateDestroy_AudioSendStreams) {
93 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010094 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070095 AudioSendStream::Config config(&send_transport, MediaTransportConfig());
solenbergc7a8b082015-10-16 14:35:07 -070096 std::list<AudioSendStream*> streams;
97 for (int i = 0; i < 2; ++i) {
98 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
99 config.rtp.ssrc = ssrc;
100 AudioSendStream* stream = call->CreateAudioSendStream(config);
101 EXPECT_NE(stream, nullptr);
102 if (ssrc & 1) {
103 streams.push_back(stream);
104 } else {
105 streams.push_front(stream);
106 }
107 }
108 for (auto s : streams) {
109 call->DestroyAudioSendStream(s);
110 }
111 streams.clear();
112 }
113}
114
115TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100116 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -0700117 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200118 MockTransport rtcp_send_transport;
119 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100120 config.decoder_factory =
121 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -0700122 std::list<AudioReceiveStream*> streams;
123 for (int i = 0; i < 2; ++i) {
124 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
125 config.rtp.remote_ssrc = ssrc;
126 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
127 EXPECT_NE(stream, nullptr);
128 if (ssrc & 1) {
129 streams.push_back(stream);
130 } else {
131 streams.push_front(stream);
132 }
133 }
134 for (auto s : streams) {
135 call->DestroyAudioReceiveStream(s);
136 }
137 streams.clear();
138 }
139}
brandtr25445d32016-10-23 23:37:14 -0700140
solenberg7602aab2016-11-14 11:30:07 -0800141TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100142 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800143 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200144 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800145 recv_config.rtp.remote_ssrc = 42;
146 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200147 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100148 recv_config.decoder_factory =
149 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800150 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
151 EXPECT_NE(recv_stream, nullptr);
152
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100153 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700154 AudioSendStream::Config send_config(&send_transport, MediaTransportConfig());
solenberg7602aab2016-11-14 11:30:07 -0800155 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800156 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
157 EXPECT_NE(send_stream, nullptr);
158
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100159 internal::AudioReceiveStream* internal_recv_stream =
160 static_cast<internal::AudioReceiveStream*>(recv_stream);
161 EXPECT_EQ(send_stream,
162 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800163
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100164 call->DestroyAudioSendStream(send_stream);
165 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
166
solenberg7602aab2016-11-14 11:30:07 -0800167 call->DestroyAudioReceiveStream(recv_stream);
168}
169
170TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100171 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100172 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700173 AudioSendStream::Config send_config(&send_transport, MediaTransportConfig());
solenberg7602aab2016-11-14 11:30:07 -0800174 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800175 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
176 EXPECT_NE(send_stream, nullptr);
177
178 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200179 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800180 recv_config.rtp.remote_ssrc = 42;
181 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200182 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100183 recv_config.decoder_factory =
184 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800185 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
186 EXPECT_NE(recv_stream, nullptr);
187
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100188 internal::AudioReceiveStream* internal_recv_stream =
189 static_cast<internal::AudioReceiveStream*>(recv_stream);
190 EXPECT_EQ(send_stream,
191 internal_recv_stream->GetAssociatedSendStreamForTesting());
192
solenberg7602aab2016-11-14 11:30:07 -0800193 call->DestroyAudioReceiveStream(recv_stream);
194
195 call->DestroyAudioSendStream(send_stream);
196}
197
brandtr25445d32016-10-23 23:37:14 -0700198TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
199 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800200 MockTransport rtcp_send_transport;
201 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800202 config.payload_type = 118;
203 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700204 config.protected_media_ssrcs = {27273};
205
206 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
207 EXPECT_NE(stream, nullptr);
208 call->DestroyFlexfecReceiveStream(stream);
209}
210
211TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
212 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800213 MockTransport rtcp_send_transport;
214 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800215 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700216 std::list<FlexfecReceiveStream*> streams;
217
218 for (int i = 0; i < 2; ++i) {
219 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800220 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700221 config.protected_media_ssrcs = {ssrc + 1};
222 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
223 EXPECT_NE(stream, nullptr);
224 if (ssrc & 1) {
225 streams.push_back(stream);
226 } else {
227 streams.push_front(stream);
228 }
229 }
230 for (auto s : streams) {
231 call->DestroyFlexfecReceiveStream(s);
232 }
233 streams.clear();
234 }
235}
236
237TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
238 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800239 MockTransport rtcp_send_transport;
240 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800241 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700242 config.protected_media_ssrcs = {1324234};
243 FlexfecReceiveStream* stream;
244 std::list<FlexfecReceiveStream*> streams;
245
brandtr1cfbd602016-12-08 04:17:53 -0800246 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700247 stream = call->CreateFlexfecReceiveStream(config);
248 EXPECT_NE(stream, nullptr);
249 streams.push_back(stream);
250
brandtr1cfbd602016-12-08 04:17:53 -0800251 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700252 stream = call->CreateFlexfecReceiveStream(config);
253 EXPECT_NE(stream, nullptr);
254 streams.push_back(stream);
255
brandtr1cfbd602016-12-08 04:17:53 -0800256 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700257 stream = call->CreateFlexfecReceiveStream(config);
258 EXPECT_NE(stream, nullptr);
259 streams.push_back(stream);
260
brandtr1cfbd602016-12-08 04:17:53 -0800261 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700262 stream = call->CreateFlexfecReceiveStream(config);
263 EXPECT_NE(stream, nullptr);
264 streams.push_back(stream);
265
266 for (auto s : streams) {
267 call->DestroyFlexfecReceiveStream(s);
268 }
269}
270
ossuc3d4b482017-05-23 06:07:11 -0700271TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
272 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100273 CallHelper call;
ossuc3d4b482017-05-23 06:07:11 -0700274
275 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100276 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700277 AudioSendStream::Config config(&send_transport, MediaTransportConfig());
ossuc3d4b482017-05-23 06:07:11 -0700278 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 06:07:11 -0700279 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100280 const RtpState rtp_state =
281 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 06:07:11 -0700282 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 06:07:11 -0700283 return rtp_state;
284 };
285
286 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
287 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
288
289 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
290 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
291 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
292 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
293 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
294 rtp_state2.last_timestamp_time_ms);
295 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
296}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100297
solenbergc7a8b082015-10-16 14:35:07 -0700298} // namespace webrtc