blob: cf2037ee65257b0d24ab15a6e28668a8844916fb [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/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();
solenbergc7a8b082015-10-16 14:35:07 -070050 call_.reset(webrtc::Call::Create(config));
51 }
52
53 webrtc::Call* operator->() { return call_.get(); }
54
55 private:
Danil Chapovalov83bbe912019-08-07 12:24:53 +020056 webrtc::RtcEventLogNull event_log_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020057 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
kwibergb25345e2016-03-12 06:10:44 -080058 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070059};
60} // namespace
61
62namespace webrtc {
63
64TEST(CallTest, ConstructDestruct) {
65 CallHelper call;
66}
67
68TEST(CallTest, CreateDestroy_AudioSendStream) {
69 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010070 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070071 AudioSendStream::Config config(&send_transport, MediaTransportConfig());
solenbergc7a8b082015-10-16 14:35:07 -070072 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 14:35:07 -070073 AudioSendStream* stream = call->CreateAudioSendStream(config);
74 EXPECT_NE(stream, nullptr);
75 call->DestroyAudioSendStream(stream);
76}
77
78TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010079 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -070080 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +020081 MockTransport rtcp_send_transport;
solenbergc7a8b082015-10-16 14:35:07 -070082 config.rtp.remote_ssrc = 42;
Niels Möllerae4237e2018-10-05 11:28:38 +020083 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010084 config.decoder_factory =
85 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -070086 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
87 EXPECT_NE(stream, nullptr);
88 call->DestroyAudioReceiveStream(stream);
89}
90
91TEST(CallTest, CreateDestroy_AudioSendStreams) {
92 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +010093 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070094 AudioSendStream::Config config(&send_transport, MediaTransportConfig());
solenbergc7a8b082015-10-16 14:35:07 -070095 std::list<AudioSendStream*> streams;
96 for (int i = 0; i < 2; ++i) {
97 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
98 config.rtp.ssrc = ssrc;
99 AudioSendStream* stream = call->CreateAudioSendStream(config);
100 EXPECT_NE(stream, nullptr);
101 if (ssrc & 1) {
102 streams.push_back(stream);
103 } else {
104 streams.push_front(stream);
105 }
106 }
107 for (auto s : streams) {
108 call->DestroyAudioSendStream(s);
109 }
110 streams.clear();
111 }
112}
113
114TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100115 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -0700116 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200117 MockTransport rtcp_send_transport;
118 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100119 config.decoder_factory =
120 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -0700121 std::list<AudioReceiveStream*> streams;
122 for (int i = 0; i < 2; ++i) {
123 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
124 config.rtp.remote_ssrc = ssrc;
125 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
126 EXPECT_NE(stream, nullptr);
127 if (ssrc & 1) {
128 streams.push_back(stream);
129 } else {
130 streams.push_front(stream);
131 }
132 }
133 for (auto s : streams) {
134 call->DestroyAudioReceiveStream(s);
135 }
136 streams.clear();
137 }
138}
brandtr25445d32016-10-23 23:37:14 -0700139
solenberg7602aab2016-11-14 11:30:07 -0800140TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100141 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800142 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200143 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800144 recv_config.rtp.remote_ssrc = 42;
145 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200146 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100147 recv_config.decoder_factory =
148 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800149 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
150 EXPECT_NE(recv_stream, nullptr);
151
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100152 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700153 AudioSendStream::Config send_config(&send_transport, MediaTransportConfig());
solenberg7602aab2016-11-14 11:30:07 -0800154 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800155 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
156 EXPECT_NE(send_stream, nullptr);
157
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100158 internal::AudioReceiveStream* internal_recv_stream =
159 static_cast<internal::AudioReceiveStream*>(recv_stream);
160 EXPECT_EQ(send_stream,
161 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800162
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100163 call->DestroyAudioSendStream(send_stream);
164 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
165
solenberg7602aab2016-11-14 11:30:07 -0800166 call->DestroyAudioReceiveStream(recv_stream);
167}
168
169TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100170 CallHelper call;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100171 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700172 AudioSendStream::Config send_config(&send_transport, MediaTransportConfig());
solenberg7602aab2016-11-14 11:30:07 -0800173 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800174 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
175 EXPECT_NE(send_stream, nullptr);
176
177 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200178 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800179 recv_config.rtp.remote_ssrc = 42;
180 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200181 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100182 recv_config.decoder_factory =
183 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800184 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
185 EXPECT_NE(recv_stream, nullptr);
186
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100187 internal::AudioReceiveStream* internal_recv_stream =
188 static_cast<internal::AudioReceiveStream*>(recv_stream);
189 EXPECT_EQ(send_stream,
190 internal_recv_stream->GetAssociatedSendStreamForTesting());
191
solenberg7602aab2016-11-14 11:30:07 -0800192 call->DestroyAudioReceiveStream(recv_stream);
193
194 call->DestroyAudioSendStream(send_stream);
195}
196
brandtr25445d32016-10-23 23:37:14 -0700197TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
198 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800199 MockTransport rtcp_send_transport;
200 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800201 config.payload_type = 118;
202 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700203 config.protected_media_ssrcs = {27273};
204
205 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
206 EXPECT_NE(stream, nullptr);
207 call->DestroyFlexfecReceiveStream(stream);
208}
209
210TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
211 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800212 MockTransport rtcp_send_transport;
213 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800214 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700215 std::list<FlexfecReceiveStream*> streams;
216
217 for (int i = 0; i < 2; ++i) {
218 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800219 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700220 config.protected_media_ssrcs = {ssrc + 1};
221 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
222 EXPECT_NE(stream, nullptr);
223 if (ssrc & 1) {
224 streams.push_back(stream);
225 } else {
226 streams.push_front(stream);
227 }
228 }
229 for (auto s : streams) {
230 call->DestroyFlexfecReceiveStream(s);
231 }
232 streams.clear();
233 }
234}
235
236TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
237 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800238 MockTransport rtcp_send_transport;
239 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800240 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700241 config.protected_media_ssrcs = {1324234};
242 FlexfecReceiveStream* stream;
243 std::list<FlexfecReceiveStream*> streams;
244
brandtr1cfbd602016-12-08 04:17:53 -0800245 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700246 stream = call->CreateFlexfecReceiveStream(config);
247 EXPECT_NE(stream, nullptr);
248 streams.push_back(stream);
249
brandtr1cfbd602016-12-08 04:17:53 -0800250 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700251 stream = call->CreateFlexfecReceiveStream(config);
252 EXPECT_NE(stream, nullptr);
253 streams.push_back(stream);
254
brandtr1cfbd602016-12-08 04:17:53 -0800255 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700256 stream = call->CreateFlexfecReceiveStream(config);
257 EXPECT_NE(stream, nullptr);
258 streams.push_back(stream);
259
brandtr1cfbd602016-12-08 04:17:53 -0800260 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700261 stream = call->CreateFlexfecReceiveStream(config);
262 EXPECT_NE(stream, nullptr);
263 streams.push_back(stream);
264
265 for (auto s : streams) {
266 call->DestroyFlexfecReceiveStream(s);
267 }
268}
269
ossuc3d4b482017-05-23 06:07:11 -0700270TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
271 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100272 CallHelper call;
ossuc3d4b482017-05-23 06:07:11 -0700273
274 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100275 MockTransport send_transport;
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700276 AudioSendStream::Config config(&send_transport, MediaTransportConfig());
ossuc3d4b482017-05-23 06:07:11 -0700277 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 06:07:11 -0700278 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100279 const RtpState rtp_state =
280 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 06:07:11 -0700281 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 06:07:11 -0700282 return rtp_state;
283 };
284
285 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
286 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
287
288 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
289 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
290 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
291 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
292 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
293 rtp_state2.last_timestamp_time_ms);
294 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
295}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100296
solenbergc7a8b082015-10-16 14:35:07 -0700297} // namespace webrtc