blob: 83e96ff3874c5ff3683581c1bcac147e11a8f2be [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
11#include <list>
kwiberg1c07c702017-03-27 07:15:49 -070012#include <map>
kwibergb25345e2016-03-12 06:10:44 -080013#include <memory>
zstein7cb69d52017-05-08 11:52:38 -070014#include <utility>
solenbergc7a8b082015-10-16 14:35:07 -070015
Karl Wiberg918f50c2018-07-05 11:40:33 +020016#include "absl/memory/memory.h"
Karl Wibergf3850f62017-11-02 13:04:41 +010017#include "api/audio_codecs/builtin_audio_decoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/test/mock_audio_mixer.h"
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010019#include "audio/audio_receive_stream.h"
Yves Gerey665174f2018-06-19 15:03:05 +020020#include "audio/audio_send_stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "call/audio_state.h"
22#include "call/call.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "logging/rtc_event_log/rtc_event_log.h"
24#include "modules/audio_device/include/mock_audio_device.h"
Fredrik Solenberg2a877972017-12-15 16:42:15 +010025#include "modules/audio_processing/include/mock_audio_processing.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "modules/pacing/mock/mock_paced_sender.h"
27#include "modules/rtp_rtcp/include/rtp_rtcp.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "test/fake_encoder.h"
29#include "test/gtest.h"
30#include "test/mock_audio_decoder_factory.h"
31#include "test/mock_transport.h"
solenbergc7a8b082015-10-16 14:35:07 -070032
33namespace {
34
35struct CallHelper {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010036 CallHelper() {
solenberg566ef242015-11-06 15:34:49 -080037 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010038 audio_state_config.audio_mixer =
39 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
40 audio_state_config.audio_processing =
41 new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
42 audio_state_config.audio_device_module =
43 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070044 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080045 config.audio_state = webrtc::AudioState::Create(audio_state_config);
solenbergc7a8b082015-10-16 14:35:07 -070046 call_.reset(webrtc::Call::Create(config));
47 }
48
49 webrtc::Call* operator->() { return call_.get(); }
50
51 private:
skvlad11a9cbf2016-10-07 11:53:05 -070052 webrtc::RtcEventLogNullImpl event_log_;
kwibergb25345e2016-03-12 06:10:44 -080053 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070054};
55} // namespace
56
57namespace webrtc {
58
59TEST(CallTest, ConstructDestruct) {
60 CallHelper call;
61}
62
63TEST(CallTest, CreateDestroy_AudioSendStream) {
64 CallHelper call;
Niels Möller7d76a312018-10-26 12:57:07 +020065 AudioSendStream::Config config(/*send_transport=*/nullptr,
66 /*media_transport=*/nullptr);
solenbergc7a8b082015-10-16 14:35:07 -070067 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 14:35:07 -070068 AudioSendStream* stream = call->CreateAudioSendStream(config);
69 EXPECT_NE(stream, nullptr);
70 call->DestroyAudioSendStream(stream);
71}
72
73TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010074 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -070075 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +020076 MockTransport rtcp_send_transport;
solenbergc7a8b082015-10-16 14:35:07 -070077 config.rtp.remote_ssrc = 42;
Niels Möllerae4237e2018-10-05 11:28:38 +020078 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010079 config.decoder_factory =
80 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -070081 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
82 EXPECT_NE(stream, nullptr);
83 call->DestroyAudioReceiveStream(stream);
84}
85
86TEST(CallTest, CreateDestroy_AudioSendStreams) {
87 CallHelper call;
Niels Möller7d76a312018-10-26 12:57:07 +020088 AudioSendStream::Config config(/*send_transport=*/nullptr,
89 /*media_transport=*/nullptr);
solenbergc7a8b082015-10-16 14:35:07 -070090 std::list<AudioSendStream*> streams;
91 for (int i = 0; i < 2; ++i) {
92 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
93 config.rtp.ssrc = ssrc;
94 AudioSendStream* stream = call->CreateAudioSendStream(config);
95 EXPECT_NE(stream, nullptr);
96 if (ssrc & 1) {
97 streams.push_back(stream);
98 } else {
99 streams.push_front(stream);
100 }
101 }
102 for (auto s : streams) {
103 call->DestroyAudioSendStream(s);
104 }
105 streams.clear();
106 }
107}
108
109TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100110 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -0700111 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200112 MockTransport rtcp_send_transport;
113 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100114 config.decoder_factory =
115 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -0700116 std::list<AudioReceiveStream*> streams;
117 for (int i = 0; i < 2; ++i) {
118 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
119 config.rtp.remote_ssrc = ssrc;
120 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
121 EXPECT_NE(stream, nullptr);
122 if (ssrc & 1) {
123 streams.push_back(stream);
124 } else {
125 streams.push_front(stream);
126 }
127 }
128 for (auto s : streams) {
129 call->DestroyAudioReceiveStream(s);
130 }
131 streams.clear();
132 }
133}
brandtr25445d32016-10-23 23:37:14 -0700134
solenberg7602aab2016-11-14 11:30:07 -0800135TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100136 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800137 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200138 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800139 recv_config.rtp.remote_ssrc = 42;
140 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200141 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100142 recv_config.decoder_factory =
143 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800144 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
145 EXPECT_NE(recv_stream, nullptr);
146
Niels Möller7d76a312018-10-26 12:57:07 +0200147 AudioSendStream::Config send_config(/*send_transport=*/nullptr,
148 /*media_transport=*/nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800149 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800150 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
151 EXPECT_NE(send_stream, nullptr);
152
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100153 internal::AudioReceiveStream* internal_recv_stream =
154 static_cast<internal::AudioReceiveStream*>(recv_stream);
155 EXPECT_EQ(send_stream,
156 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800157
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100158 call->DestroyAudioSendStream(send_stream);
159 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
160
solenberg7602aab2016-11-14 11:30:07 -0800161 call->DestroyAudioReceiveStream(recv_stream);
162}
163
164TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100165 CallHelper call;
Niels Möller7d76a312018-10-26 12:57:07 +0200166 AudioSendStream::Config send_config(/*send_transport=*/nullptr,
167 /*media_transport=*/nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800168 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800169 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
170 EXPECT_NE(send_stream, nullptr);
171
172 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200173 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800174 recv_config.rtp.remote_ssrc = 42;
175 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200176 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100177 recv_config.decoder_factory =
178 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800179 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
180 EXPECT_NE(recv_stream, nullptr);
181
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100182 internal::AudioReceiveStream* internal_recv_stream =
183 static_cast<internal::AudioReceiveStream*>(recv_stream);
184 EXPECT_EQ(send_stream,
185 internal_recv_stream->GetAssociatedSendStreamForTesting());
186
solenberg7602aab2016-11-14 11:30:07 -0800187 call->DestroyAudioReceiveStream(recv_stream);
188
189 call->DestroyAudioSendStream(send_stream);
190}
191
brandtr25445d32016-10-23 23:37:14 -0700192TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
193 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800194 MockTransport rtcp_send_transport;
195 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800196 config.payload_type = 118;
197 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700198 config.protected_media_ssrcs = {27273};
199
200 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
201 EXPECT_NE(stream, nullptr);
202 call->DestroyFlexfecReceiveStream(stream);
203}
204
205TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
206 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800207 MockTransport rtcp_send_transport;
208 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800209 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700210 std::list<FlexfecReceiveStream*> streams;
211
212 for (int i = 0; i < 2; ++i) {
213 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800214 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700215 config.protected_media_ssrcs = {ssrc + 1};
216 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
217 EXPECT_NE(stream, nullptr);
218 if (ssrc & 1) {
219 streams.push_back(stream);
220 } else {
221 streams.push_front(stream);
222 }
223 }
224 for (auto s : streams) {
225 call->DestroyFlexfecReceiveStream(s);
226 }
227 streams.clear();
228 }
229}
230
231TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
232 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800233 MockTransport rtcp_send_transport;
234 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800235 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700236 config.protected_media_ssrcs = {1324234};
237 FlexfecReceiveStream* stream;
238 std::list<FlexfecReceiveStream*> streams;
239
brandtr1cfbd602016-12-08 04:17:53 -0800240 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700241 stream = call->CreateFlexfecReceiveStream(config);
242 EXPECT_NE(stream, nullptr);
243 streams.push_back(stream);
244
brandtr1cfbd602016-12-08 04:17:53 -0800245 config.remote_ssrc = 424993;
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 = 99383;
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 = 5548;
brandtr25445d32016-10-23 23:37:14 -0700256 stream = call->CreateFlexfecReceiveStream(config);
257 EXPECT_NE(stream, nullptr);
258 streams.push_back(stream);
259
260 for (auto s : streams) {
261 call->DestroyFlexfecReceiveStream(s);
262 }
263}
264
ossuc3d4b482017-05-23 06:07:11 -0700265TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
266 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100267 CallHelper call;
ossuc3d4b482017-05-23 06:07:11 -0700268
269 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
Niels Möller7d76a312018-10-26 12:57:07 +0200270 AudioSendStream::Config config(/*send_transport=*/nullptr,
271 /*media_transport=*/nullptr);
ossuc3d4b482017-05-23 06:07:11 -0700272 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 06:07:11 -0700273 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100274 const RtpState rtp_state =
275 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 06:07:11 -0700276 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 06:07:11 -0700277 return rtp_state;
278 };
279
280 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
281 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
282
283 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
284 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
285 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
286 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
287 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
288 rtp_state2.last_timestamp_time_ms);
289 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
290}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100291
solenbergc7a8b082015-10-16 14:35:07 -0700292} // namespace webrtc