blob: 754be81645ccddbfc206e9fe046ae0365fb4c7a6 [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"
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010023#include "audio/audio_receive_stream.h"
Yves Gerey665174f2018-06-19 15:03:05 +020024#include "audio/audio_send_stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "call/audio_state.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "modules/audio_device/include/mock_audio_device.h"
Fredrik Solenberg2a877972017-12-15 16:42:15 +010027#include "modules/audio_processing/include/mock_audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "modules/rtp_rtcp/include/rtp_rtcp.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "test/fake_encoder.h"
30#include "test/gtest.h"
31#include "test/mock_audio_decoder_factory.h"
32#include "test/mock_transport.h"
solenbergc7a8b082015-10-16 14:35:07 -070033
34namespace {
35
36struct CallHelper {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010037 CallHelper() {
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020038 task_queue_factory_ = webrtc::CreateDefaultTaskQueueFactory();
solenberg566ef242015-11-06 15:34:49 -080039 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010040 audio_state_config.audio_mixer =
41 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
42 audio_state_config.audio_processing =
43 new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
44 audio_state_config.audio_device_module =
45 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070046 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080047 config.audio_state = webrtc::AudioState::Create(audio_state_config);
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020048 config.task_queue_factory = task_queue_factory_.get();
solenbergc7a8b082015-10-16 14:35:07 -070049 call_.reset(webrtc::Call::Create(config));
50 }
51
52 webrtc::Call* operator->() { return call_.get(); }
53
54 private:
Danil Chapovalov83bbe912019-08-07 12:24:53 +020055 webrtc::RtcEventLogNull event_log_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020056 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
kwibergb25345e2016-03-12 06:10:44 -080057 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070058};
59} // namespace
60
61namespace webrtc {
62
63TEST(CallTest, ConstructDestruct) {
64 CallHelper call;
65}
66
67TEST(CallTest, CreateDestroy_AudioSendStream) {
68 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010069 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -080070 AudioSendStream::Config config(&send_transport);
solenbergc7a8b082015-10-16 14:35:07 -070071 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 14:35:07 -070072 AudioSendStream* stream = call->CreateAudioSendStream(config);
73 EXPECT_NE(stream, nullptr);
74 call->DestroyAudioSendStream(stream);
75}
76
77TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010078 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -070079 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +020080 MockTransport rtcp_send_transport;
solenbergc7a8b082015-10-16 14:35:07 -070081 config.rtp.remote_ssrc = 42;
Niels Möllerae4237e2018-10-05 11:28:38 +020082 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010083 config.decoder_factory =
84 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -070085 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
86 EXPECT_NE(stream, nullptr);
87 call->DestroyAudioReceiveStream(stream);
88}
89
90TEST(CallTest, CreateDestroy_AudioSendStreams) {
91 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010092 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -080093 AudioSendStream::Config config(&send_transport);
solenbergc7a8b082015-10-16 14:35:07 -070094 std::list<AudioSendStream*> streams;
95 for (int i = 0; i < 2; ++i) {
96 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
97 config.rtp.ssrc = ssrc;
98 AudioSendStream* stream = call->CreateAudioSendStream(config);
99 EXPECT_NE(stream, nullptr);
100 if (ssrc & 1) {
101 streams.push_back(stream);
102 } else {
103 streams.push_front(stream);
104 }
105 }
106 for (auto s : streams) {
107 call->DestroyAudioSendStream(s);
108 }
109 streams.clear();
110 }
111}
112
113TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100114 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -0700115 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200116 MockTransport rtcp_send_transport;
117 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100118 config.decoder_factory =
119 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -0700120 std::list<AudioReceiveStream*> streams;
121 for (int i = 0; i < 2; ++i) {
122 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
123 config.rtp.remote_ssrc = ssrc;
124 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
125 EXPECT_NE(stream, nullptr);
126 if (ssrc & 1) {
127 streams.push_back(stream);
128 } else {
129 streams.push_front(stream);
130 }
131 }
132 for (auto s : streams) {
133 call->DestroyAudioReceiveStream(s);
134 }
135 streams.clear();
136 }
137}
brandtr25445d32016-10-23 23:37:14 -0700138
solenberg7602aab2016-11-14 11:30:07 -0800139TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100140 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800141 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200142 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800143 recv_config.rtp.remote_ssrc = 42;
144 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200145 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100146 recv_config.decoder_factory =
147 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800148 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
149 EXPECT_NE(recv_stream, nullptr);
150
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100151 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800152 AudioSendStream::Config send_config(&send_transport);
solenberg7602aab2016-11-14 11:30:07 -0800153 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800154 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
155 EXPECT_NE(send_stream, nullptr);
156
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100157 internal::AudioReceiveStream* internal_recv_stream =
158 static_cast<internal::AudioReceiveStream*>(recv_stream);
159 EXPECT_EQ(send_stream,
160 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800161
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100162 call->DestroyAudioSendStream(send_stream);
163 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
164
solenberg7602aab2016-11-14 11:30:07 -0800165 call->DestroyAudioReceiveStream(recv_stream);
166}
167
168TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100169 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100170 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800171 AudioSendStream::Config send_config(&send_transport);
solenberg7602aab2016-11-14 11:30:07 -0800172 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800173 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
174 EXPECT_NE(send_stream, nullptr);
175
176 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200177 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800178 recv_config.rtp.remote_ssrc = 42;
179 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200180 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100181 recv_config.decoder_factory =
182 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800183 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
184 EXPECT_NE(recv_stream, nullptr);
185
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100186 internal::AudioReceiveStream* internal_recv_stream =
187 static_cast<internal::AudioReceiveStream*>(recv_stream);
188 EXPECT_EQ(send_stream,
189 internal_recv_stream->GetAssociatedSendStreamForTesting());
190
solenberg7602aab2016-11-14 11:30:07 -0800191 call->DestroyAudioReceiveStream(recv_stream);
192
193 call->DestroyAudioSendStream(send_stream);
194}
195
brandtr25445d32016-10-23 23:37:14 -0700196TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
197 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800198 MockTransport rtcp_send_transport;
199 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800200 config.payload_type = 118;
201 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700202 config.protected_media_ssrcs = {27273};
203
204 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
205 EXPECT_NE(stream, nullptr);
206 call->DestroyFlexfecReceiveStream(stream);
207}
208
209TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
210 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800211 MockTransport rtcp_send_transport;
212 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800213 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700214 std::list<FlexfecReceiveStream*> streams;
215
216 for (int i = 0; i < 2; ++i) {
217 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800218 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700219 config.protected_media_ssrcs = {ssrc + 1};
220 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
221 EXPECT_NE(stream, nullptr);
222 if (ssrc & 1) {
223 streams.push_back(stream);
224 } else {
225 streams.push_front(stream);
226 }
227 }
228 for (auto s : streams) {
229 call->DestroyFlexfecReceiveStream(s);
230 }
231 streams.clear();
232 }
233}
234
235TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
236 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800237 MockTransport rtcp_send_transport;
238 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800239 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700240 config.protected_media_ssrcs = {1324234};
241 FlexfecReceiveStream* stream;
242 std::list<FlexfecReceiveStream*> streams;
243
brandtr1cfbd602016-12-08 04:17:53 -0800244 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700245 stream = call->CreateFlexfecReceiveStream(config);
246 EXPECT_NE(stream, nullptr);
247 streams.push_back(stream);
248
brandtr1cfbd602016-12-08 04:17:53 -0800249 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700250 stream = call->CreateFlexfecReceiveStream(config);
251 EXPECT_NE(stream, nullptr);
252 streams.push_back(stream);
253
brandtr1cfbd602016-12-08 04:17:53 -0800254 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700255 stream = call->CreateFlexfecReceiveStream(config);
256 EXPECT_NE(stream, nullptr);
257 streams.push_back(stream);
258
brandtr1cfbd602016-12-08 04:17:53 -0800259 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700260 stream = call->CreateFlexfecReceiveStream(config);
261 EXPECT_NE(stream, nullptr);
262 streams.push_back(stream);
263
264 for (auto s : streams) {
265 call->DestroyFlexfecReceiveStream(s);
266 }
267}
268
ossuc3d4b482017-05-23 06:07:11 -0700269TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
270 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100271 CallHelper call;
ossuc3d4b482017-05-23 06:07:11 -0700272
273 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100274 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800275 AudioSendStream::Config config(&send_transport);
ossuc3d4b482017-05-23 06:07:11 -0700276 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 06:07:11 -0700277 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100278 const RtpState rtp_state =
279 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 06:07:11 -0700280 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 06:07:11 -0700281 return rtp_state;
282 };
283
284 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
285 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
286
287 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
288 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
289 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
290 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
291 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
292 rtp_state2.last_timestamp_time_ms);
293 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
294}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100295
solenbergc7a8b082015-10-16 14:35:07 -0700296} // namespace webrtc