blob: 17390364371b712b118e38a7d989b3572efc33c3 [file] [log] [blame]
solenbergc7a8b082015-10-16 21:35:071/*
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
11#include <list>
kwiberg1c07c702017-03-27 14:15:4912#include <map>
kwibergb25345e2016-03-12 14:10:4413#include <memory>
zstein7cb69d52017-05-08 18:52:3814#include <utility>
solenbergc7a8b082015-10-16 21:35:0715
Karl Wiberg918f50c2018-07-05 09:40:3316#include "absl/memory/memory.h"
Karl Wibergf3850f62017-11-02 12:04:4117#include "api/audio_codecs/builtin_audio_decoder_factory.h"
Piotr (Peter) Slatalacc8e8bb2018-11-15 16:26:1918#include "api/test/fake_media_transport.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3119#include "api/test/mock_audio_mixer.h"
Fredrik Solenberg8f5787a2018-01-11 12:52:3020#include "audio/audio_receive_stream.h"
Yves Gerey665174f2018-06-19 13:03:0521#include "audio/audio_send_stream.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "call/audio_state.h"
23#include "call/call.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3124#include "logging/rtc_event_log/rtc_event_log.h"
25#include "modules/audio_device/include/mock_audio_device.h"
Fredrik Solenberg2a877972017-12-15 15:42:1526#include "modules/audio_processing/include/mock_audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3127#include "modules/pacing/mock/mock_paced_sender.h"
28#include "modules/rtp_rtcp/include/rtp_rtcp.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3129#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 21:35:0733
34namespace {
35
36struct CallHelper {
Fredrik Solenberg8f5787a2018-01-11 12:52:3037 CallHelper() {
solenberg566ef242015-11-06 23:34:4938 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 15:42:1539 audio_state_config.audio_mixer =
40 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
41 audio_state_config.audio_processing =
42 new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
43 audio_state_config.audio_device_module =
44 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 18:53:0545 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 23:34:4946 config.audio_state = webrtc::AudioState::Create(audio_state_config);
solenbergc7a8b082015-10-16 21:35:0747 call_.reset(webrtc::Call::Create(config));
48 }
49
50 webrtc::Call* operator->() { return call_.get(); }
51
52 private:
skvlad11a9cbf2016-10-07 18:53:0553 webrtc::RtcEventLogNullImpl event_log_;
kwibergb25345e2016-03-12 14:10:4454 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 21:35:0755};
56} // namespace
57
58namespace webrtc {
59
60TEST(CallTest, ConstructDestruct) {
61 CallHelper call;
62}
63
64TEST(CallTest, CreateDestroy_AudioSendStream) {
65 CallHelper call;
Fredrik Solenberg3d2ed19d2018-12-18 08:18:3366 MockTransport send_transport;
67 AudioSendStream::Config config(&send_transport,
Niels Möller7d76a312018-10-26 10:57:0768 /*media_transport=*/nullptr);
solenbergc7a8b082015-10-16 21:35:0769 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 21:35:0770 AudioSendStream* stream = call->CreateAudioSendStream(config);
71 EXPECT_NE(stream, nullptr);
72 call->DestroyAudioSendStream(stream);
73}
74
75TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 12:52:3076 CallHelper call;
solenbergc7a8b082015-10-16 21:35:0777 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 09:28:3878 MockTransport rtcp_send_transport;
solenbergc7a8b082015-10-16 21:35:0779 config.rtp.remote_ssrc = 42;
Niels Möllerae4237e2018-10-05 09:28:3880 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 12:52:3081 config.decoder_factory =
82 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 21:35:0783 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
84 EXPECT_NE(stream, nullptr);
85 call->DestroyAudioReceiveStream(stream);
86}
87
88TEST(CallTest, CreateDestroy_AudioSendStreams) {
89 CallHelper call;
Fredrik Solenberg3d2ed19d2018-12-18 08:18:3390 MockTransport send_transport;
91 AudioSendStream::Config config(&send_transport,
Niels Möller7d76a312018-10-26 10:57:0792 /*media_transport=*/nullptr);
solenbergc7a8b082015-10-16 21:35:0793 std::list<AudioSendStream*> streams;
94 for (int i = 0; i < 2; ++i) {
95 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
96 config.rtp.ssrc = ssrc;
97 AudioSendStream* stream = call->CreateAudioSendStream(config);
98 EXPECT_NE(stream, nullptr);
99 if (ssrc & 1) {
100 streams.push_back(stream);
101 } else {
102 streams.push_front(stream);
103 }
104 }
105 for (auto s : streams) {
106 call->DestroyAudioSendStream(s);
107 }
108 streams.clear();
109 }
110}
111
112TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 12:52:30113 CallHelper call;
solenbergc7a8b082015-10-16 21:35:07114 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 09:28:38115 MockTransport rtcp_send_transport;
116 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 12:52:30117 config.decoder_factory =
118 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 21:35:07119 std::list<AudioReceiveStream*> streams;
120 for (int i = 0; i < 2; ++i) {
121 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
122 config.rtp.remote_ssrc = ssrc;
123 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
124 EXPECT_NE(stream, nullptr);
125 if (ssrc & 1) {
126 streams.push_back(stream);
127 } else {
128 streams.push_front(stream);
129 }
130 }
131 for (auto s : streams) {
132 call->DestroyAudioReceiveStream(s);
133 }
134 streams.clear();
135 }
136}
brandtr25445d32016-10-24 06:37:14137
solenberg7602aab2016-11-14 19:30:07138TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 12:52:30139 CallHelper call;
solenberg7602aab2016-11-14 19:30:07140 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 09:28:38141 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 19:30:07142 recv_config.rtp.remote_ssrc = 42;
143 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 09:28:38144 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 12:52:30145 recv_config.decoder_factory =
146 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 19:30:07147 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
148 EXPECT_NE(recv_stream, nullptr);
149
Fredrik Solenberg3d2ed19d2018-12-18 08:18:33150 MockTransport send_transport;
151 AudioSendStream::Config send_config(&send_transport,
Niels Möller7d76a312018-10-26 10:57:07152 /*media_transport=*/nullptr);
solenberg7602aab2016-11-14 19:30:07153 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 19:30:07154 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
155 EXPECT_NE(send_stream, nullptr);
156
Fredrik Solenberg8f5787a2018-01-11 12:52:30157 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 19:30:07161
Fredrik Solenberg8f5787a2018-01-11 12:52:30162 call->DestroyAudioSendStream(send_stream);
163 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
164
solenberg7602aab2016-11-14 19:30:07165 call->DestroyAudioReceiveStream(recv_stream);
166}
167
168TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 12:52:30169 CallHelper call;
Fredrik Solenberg3d2ed19d2018-12-18 08:18:33170 MockTransport send_transport;
171 AudioSendStream::Config send_config(&send_transport,
Niels Möller7d76a312018-10-26 10:57:07172 /*media_transport=*/nullptr);
solenberg7602aab2016-11-14 19:30:07173 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 19:30:07174 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
175 EXPECT_NE(send_stream, nullptr);
176
177 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 09:28:38178 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 19:30:07179 recv_config.rtp.remote_ssrc = 42;
180 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 09:28:38181 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 12:52:30182 recv_config.decoder_factory =
183 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 19:30:07184 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
185 EXPECT_NE(recv_stream, nullptr);
186
Fredrik Solenberg8f5787a2018-01-11 12:52:30187 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 19:30:07192 call->DestroyAudioReceiveStream(recv_stream);
193
194 call->DestroyAudioSendStream(send_stream);
195}
196
brandtr25445d32016-10-24 06:37:14197TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
198 CallHelper call;
brandtr8313a6f2017-01-13 15:41:19199 MockTransport rtcp_send_transport;
200 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 12:17:53201 config.payload_type = 118;
202 config.remote_ssrc = 38837212;
brandtr25445d32016-10-24 06:37:14203 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 15:41:19212 MockTransport rtcp_send_transport;
213 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 12:17:53214 config.payload_type = 118;
brandtr25445d32016-10-24 06:37:14215 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 12:17:53219 config.remote_ssrc = ssrc;
brandtr25445d32016-10-24 06:37:14220 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 15:41:19238 MockTransport rtcp_send_transport;
239 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 12:17:53240 config.payload_type = 118;
brandtr25445d32016-10-24 06:37:14241 config.protected_media_ssrcs = {1324234};
242 FlexfecReceiveStream* stream;
243 std::list<FlexfecReceiveStream*> streams;
244
brandtr1cfbd602016-12-08 12:17:53245 config.remote_ssrc = 838383;
brandtr25445d32016-10-24 06:37:14246 stream = call->CreateFlexfecReceiveStream(config);
247 EXPECT_NE(stream, nullptr);
248 streams.push_back(stream);
249
brandtr1cfbd602016-12-08 12:17:53250 config.remote_ssrc = 424993;
brandtr25445d32016-10-24 06:37:14251 stream = call->CreateFlexfecReceiveStream(config);
252 EXPECT_NE(stream, nullptr);
253 streams.push_back(stream);
254
brandtr1cfbd602016-12-08 12:17:53255 config.remote_ssrc = 99383;
brandtr25445d32016-10-24 06:37:14256 stream = call->CreateFlexfecReceiveStream(config);
257 EXPECT_NE(stream, nullptr);
258 streams.push_back(stream);
259
brandtr1cfbd602016-12-08 12:17:53260 config.remote_ssrc = 5548;
brandtr25445d32016-10-24 06:37:14261 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 13:07:11270TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
271 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 12:52:30272 CallHelper call;
ossuc3d4b482017-05-23 13:07:11273
274 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
Fredrik Solenberg3d2ed19d2018-12-18 08:18:33275 MockTransport send_transport;
276 AudioSendStream::Config config(&send_transport,
Niels Möller7d76a312018-10-26 10:57:07277 /*media_transport=*/nullptr);
ossuc3d4b482017-05-23 13:07:11278 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 13:07:11279 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 12:52:30280 const RtpState rtp_state =
281 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 13:07:11282 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 13:07:11283 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 12:52:30297
Piotr (Peter) Slatala179a3922018-11-16 17:57:58298TEST(CallTest, RegisterMediaTransportBitrateCallbacksInCreateStream) {
299 CallHelper call;
300 MediaTransportSettings settings;
301 webrtc::FakeMediaTransport fake_media_transport(settings);
302
303 EXPECT_EQ(0, fake_media_transport.target_rate_observers_size());
Fredrik Solenberg3d2ed19d2018-12-18 08:18:33304 // TODO(solenberg): This test shouldn't require a Transport, but currently
305 // RTCPSender requires one.
306 MockTransport send_transport;
307 AudioSendStream::Config config(&send_transport,
Piotr (Peter) Slatala179a3922018-11-16 17:57:58308 /*media_transport=*/&fake_media_transport);
309
310 call->MediaTransportChange(&fake_media_transport);
311 AudioSendStream* stream = call->CreateAudioSendStream(config);
312
313 // We get 2 subscribers: one subscriber from call.cc, and one from
314 // ChannelSend.
315 EXPECT_EQ(2, fake_media_transport.target_rate_observers_size());
316
317 call->DestroyAudioSendStream(stream);
318 EXPECT_EQ(1, fake_media_transport.target_rate_observers_size());
319
320 call->MediaTransportChange(nullptr);
321 EXPECT_EQ(0, fake_media_transport.target_rate_observers_size());
322}
323
solenbergc7a8b082015-10-16 21:35:07324} // namespace webrtc