blob: a8cf534f902c796cc52b33b4ae6bd1d5740c15fe [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 {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010038 CallHelper() {
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 =
44 new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
45 audio_state_config.audio_device_module =
46 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070047 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080048 config.audio_state = webrtc::AudioState::Create(audio_state_config);
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020049 config.task_queue_factory = task_queue_factory_.get();
Erik Språng014dd3c2019-11-28 13:44:25 +010050 config.trials = &field_trials_;
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_;
Erik Språng014dd3c2019-11-28 13:44:25 +010058 webrtc::FieldTrialBasedConfig field_trials_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020059 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
kwibergb25345e2016-03-12 06:10:44 -080060 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070061};
62} // namespace
63
64namespace webrtc {
65
66TEST(CallTest, ConstructDestruct) {
67 CallHelper call;
68}
69
70TEST(CallTest, CreateDestroy_AudioSendStream) {
71 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010072 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -080073 AudioSendStream::Config config(&send_transport);
solenbergc7a8b082015-10-16 14:35:07 -070074 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 14:35:07 -070075 AudioSendStream* stream = call->CreateAudioSendStream(config);
76 EXPECT_NE(stream, nullptr);
77 call->DestroyAudioSendStream(stream);
78}
79
80TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010081 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -070082 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +020083 MockTransport rtcp_send_transport;
solenbergc7a8b082015-10-16 14:35:07 -070084 config.rtp.remote_ssrc = 42;
Niels Möllerae4237e2018-10-05 11:28:38 +020085 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010086 config.decoder_factory =
87 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -070088 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
89 EXPECT_NE(stream, nullptr);
90 call->DestroyAudioReceiveStream(stream);
91}
92
93TEST(CallTest, CreateDestroy_AudioSendStreams) {
94 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010095 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -080096 AudioSendStream::Config config(&send_transport);
solenbergc7a8b082015-10-16 14:35:07 -070097 std::list<AudioSendStream*> streams;
98 for (int i = 0; i < 2; ++i) {
99 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
100 config.rtp.ssrc = ssrc;
101 AudioSendStream* stream = call->CreateAudioSendStream(config);
102 EXPECT_NE(stream, nullptr);
103 if (ssrc & 1) {
104 streams.push_back(stream);
105 } else {
106 streams.push_front(stream);
107 }
108 }
109 for (auto s : streams) {
110 call->DestroyAudioSendStream(s);
111 }
112 streams.clear();
113 }
114}
115
116TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100117 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -0700118 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200119 MockTransport rtcp_send_transport;
120 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100121 config.decoder_factory =
122 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -0700123 std::list<AudioReceiveStream*> streams;
124 for (int i = 0; i < 2; ++i) {
125 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
126 config.rtp.remote_ssrc = ssrc;
127 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
128 EXPECT_NE(stream, nullptr);
129 if (ssrc & 1) {
130 streams.push_back(stream);
131 } else {
132 streams.push_front(stream);
133 }
134 }
135 for (auto s : streams) {
136 call->DestroyAudioReceiveStream(s);
137 }
138 streams.clear();
139 }
140}
brandtr25445d32016-10-23 23:37:14 -0700141
solenberg7602aab2016-11-14 11:30:07 -0800142TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100143 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800144 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200145 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800146 recv_config.rtp.remote_ssrc = 42;
147 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200148 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100149 recv_config.decoder_factory =
150 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800151 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
152 EXPECT_NE(recv_stream, nullptr);
153
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100154 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800155 AudioSendStream::Config send_config(&send_transport);
solenberg7602aab2016-11-14 11:30:07 -0800156 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800157 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
158 EXPECT_NE(send_stream, nullptr);
159
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100160 internal::AudioReceiveStream* internal_recv_stream =
161 static_cast<internal::AudioReceiveStream*>(recv_stream);
162 EXPECT_EQ(send_stream,
163 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800164
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100165 call->DestroyAudioSendStream(send_stream);
166 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
167
solenberg7602aab2016-11-14 11:30:07 -0800168 call->DestroyAudioReceiveStream(recv_stream);
169}
170
171TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100172 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100173 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800174 AudioSendStream::Config send_config(&send_transport);
solenberg7602aab2016-11-14 11:30:07 -0800175 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800176 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
177 EXPECT_NE(send_stream, nullptr);
178
179 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200180 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800181 recv_config.rtp.remote_ssrc = 42;
182 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200183 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100184 recv_config.decoder_factory =
185 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800186 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
187 EXPECT_NE(recv_stream, nullptr);
188
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100189 internal::AudioReceiveStream* internal_recv_stream =
190 static_cast<internal::AudioReceiveStream*>(recv_stream);
191 EXPECT_EQ(send_stream,
192 internal_recv_stream->GetAssociatedSendStreamForTesting());
193
solenberg7602aab2016-11-14 11:30:07 -0800194 call->DestroyAudioReceiveStream(recv_stream);
195
196 call->DestroyAudioSendStream(send_stream);
197}
198
brandtr25445d32016-10-23 23:37:14 -0700199TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
200 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800201 MockTransport rtcp_send_transport;
202 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800203 config.payload_type = 118;
204 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700205 config.protected_media_ssrcs = {27273};
206
207 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
208 EXPECT_NE(stream, nullptr);
209 call->DestroyFlexfecReceiveStream(stream);
210}
211
212TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
213 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800214 MockTransport rtcp_send_transport;
215 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800216 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700217 std::list<FlexfecReceiveStream*> streams;
218
219 for (int i = 0; i < 2; ++i) {
220 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800221 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700222 config.protected_media_ssrcs = {ssrc + 1};
223 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
224 EXPECT_NE(stream, nullptr);
225 if (ssrc & 1) {
226 streams.push_back(stream);
227 } else {
228 streams.push_front(stream);
229 }
230 }
231 for (auto s : streams) {
232 call->DestroyFlexfecReceiveStream(s);
233 }
234 streams.clear();
235 }
236}
237
238TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
239 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800240 MockTransport rtcp_send_transport;
241 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800242 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700243 config.protected_media_ssrcs = {1324234};
244 FlexfecReceiveStream* stream;
245 std::list<FlexfecReceiveStream*> streams;
246
brandtr1cfbd602016-12-08 04:17:53 -0800247 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700248 stream = call->CreateFlexfecReceiveStream(config);
249 EXPECT_NE(stream, nullptr);
250 streams.push_back(stream);
251
brandtr1cfbd602016-12-08 04:17:53 -0800252 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700253 stream = call->CreateFlexfecReceiveStream(config);
254 EXPECT_NE(stream, nullptr);
255 streams.push_back(stream);
256
brandtr1cfbd602016-12-08 04:17:53 -0800257 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700258 stream = call->CreateFlexfecReceiveStream(config);
259 EXPECT_NE(stream, nullptr);
260 streams.push_back(stream);
261
brandtr1cfbd602016-12-08 04:17:53 -0800262 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700263 stream = call->CreateFlexfecReceiveStream(config);
264 EXPECT_NE(stream, nullptr);
265 streams.push_back(stream);
266
267 for (auto s : streams) {
268 call->DestroyFlexfecReceiveStream(s);
269 }
270}
271
ossuc3d4b482017-05-23 06:07:11 -0700272TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
273 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100274 CallHelper call;
ossuc3d4b482017-05-23 06:07:11 -0700275
276 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100277 MockTransport send_transport;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800278 AudioSendStream::Config config(&send_transport);
ossuc3d4b482017-05-23 06:07:11 -0700279 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 06:07:11 -0700280 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100281 const RtpState rtp_state =
282 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 06:07:11 -0700283 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 06:07:11 -0700284 return rtp_state;
285 };
286
287 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
288 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
289
290 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
291 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
292 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
293 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
294 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
295 rtp_state2.last_timestamp_time_ms);
296 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
297}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100298
solenbergc7a8b082015-10-16 14:35:07 -0700299} // namespace webrtc