blob: 8ae04008f9ca3ba84c2973ff2cadb1301bb18b64 [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;
65 AudioSendStream::Config config(nullptr);
66 config.rtp.ssrc = 42;
solenbergc7a8b082015-10-16 14:35:07 -070067 AudioSendStream* stream = call->CreateAudioSendStream(config);
68 EXPECT_NE(stream, nullptr);
69 call->DestroyAudioSendStream(stream);
70}
71
72TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010073 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -070074 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +020075 MockTransport rtcp_send_transport;
solenbergc7a8b082015-10-16 14:35:07 -070076 config.rtp.remote_ssrc = 42;
Niels Möllerae4237e2018-10-05 11:28:38 +020077 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010078 config.decoder_factory =
79 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -070080 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
81 EXPECT_NE(stream, nullptr);
82 call->DestroyAudioReceiveStream(stream);
83}
84
85TEST(CallTest, CreateDestroy_AudioSendStreams) {
86 CallHelper call;
87 AudioSendStream::Config config(nullptr);
solenbergc7a8b082015-10-16 14:35:07 -070088 std::list<AudioSendStream*> streams;
89 for (int i = 0; i < 2; ++i) {
90 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
91 config.rtp.ssrc = ssrc;
92 AudioSendStream* stream = call->CreateAudioSendStream(config);
93 EXPECT_NE(stream, nullptr);
94 if (ssrc & 1) {
95 streams.push_back(stream);
96 } else {
97 streams.push_front(stream);
98 }
99 }
100 for (auto s : streams) {
101 call->DestroyAudioSendStream(s);
102 }
103 streams.clear();
104 }
105}
106
107TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100108 CallHelper call;
solenbergc7a8b082015-10-16 14:35:07 -0700109 AudioReceiveStream::Config config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200110 MockTransport rtcp_send_transport;
111 config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100112 config.decoder_factory =
113 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenbergc7a8b082015-10-16 14:35:07 -0700114 std::list<AudioReceiveStream*> streams;
115 for (int i = 0; i < 2; ++i) {
116 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
117 config.rtp.remote_ssrc = ssrc;
118 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
119 EXPECT_NE(stream, nullptr);
120 if (ssrc & 1) {
121 streams.push_back(stream);
122 } else {
123 streams.push_front(stream);
124 }
125 }
126 for (auto s : streams) {
127 call->DestroyAudioReceiveStream(s);
128 }
129 streams.clear();
130 }
131}
brandtr25445d32016-10-23 23:37:14 -0700132
solenberg7602aab2016-11-14 11:30:07 -0800133TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100134 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800135 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200136 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800137 recv_config.rtp.remote_ssrc = 42;
138 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200139 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100140 recv_config.decoder_factory =
141 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800142 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
143 EXPECT_NE(recv_stream, nullptr);
144
solenberg7602aab2016-11-14 11:30:07 -0800145 AudioSendStream::Config send_config(nullptr);
146 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800147 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
148 EXPECT_NE(send_stream, nullptr);
149
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100150 internal::AudioReceiveStream* internal_recv_stream =
151 static_cast<internal::AudioReceiveStream*>(recv_stream);
152 EXPECT_EQ(send_stream,
153 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800154
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100155 call->DestroyAudioSendStream(send_stream);
156 EXPECT_EQ(nullptr, internal_recv_stream->GetAssociatedSendStreamForTesting());
157
solenberg7602aab2016-11-14 11:30:07 -0800158 call->DestroyAudioReceiveStream(recv_stream);
159}
160
161TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100162 CallHelper call;
solenberg7602aab2016-11-14 11:30:07 -0800163 AudioSendStream::Config send_config(nullptr);
164 send_config.rtp.ssrc = 777;
solenberg7602aab2016-11-14 11:30:07 -0800165 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
166 EXPECT_NE(send_stream, nullptr);
167
168 AudioReceiveStream::Config recv_config;
Niels Möllerae4237e2018-10-05 11:28:38 +0200169 MockTransport rtcp_send_transport;
solenberg7602aab2016-11-14 11:30:07 -0800170 recv_config.rtp.remote_ssrc = 42;
171 recv_config.rtp.local_ssrc = 777;
Niels Möllerae4237e2018-10-05 11:28:38 +0200172 recv_config.rtcp_send_transport = &rtcp_send_transport;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100173 recv_config.decoder_factory =
174 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
solenberg7602aab2016-11-14 11:30:07 -0800175 AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
176 EXPECT_NE(recv_stream, nullptr);
177
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100178 internal::AudioReceiveStream* internal_recv_stream =
179 static_cast<internal::AudioReceiveStream*>(recv_stream);
180 EXPECT_EQ(send_stream,
181 internal_recv_stream->GetAssociatedSendStreamForTesting());
182
solenberg7602aab2016-11-14 11:30:07 -0800183 call->DestroyAudioReceiveStream(recv_stream);
184
185 call->DestroyAudioSendStream(send_stream);
186}
187
brandtr25445d32016-10-23 23:37:14 -0700188TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
189 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800190 MockTransport rtcp_send_transport;
191 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800192 config.payload_type = 118;
193 config.remote_ssrc = 38837212;
brandtr25445d32016-10-23 23:37:14 -0700194 config.protected_media_ssrcs = {27273};
195
196 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
197 EXPECT_NE(stream, nullptr);
198 call->DestroyFlexfecReceiveStream(stream);
199}
200
201TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
202 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800203 MockTransport rtcp_send_transport;
204 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800205 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700206 std::list<FlexfecReceiveStream*> streams;
207
208 for (int i = 0; i < 2; ++i) {
209 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
brandtr1cfbd602016-12-08 04:17:53 -0800210 config.remote_ssrc = ssrc;
brandtr25445d32016-10-23 23:37:14 -0700211 config.protected_media_ssrcs = {ssrc + 1};
212 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
213 EXPECT_NE(stream, nullptr);
214 if (ssrc & 1) {
215 streams.push_back(stream);
216 } else {
217 streams.push_front(stream);
218 }
219 }
220 for (auto s : streams) {
221 call->DestroyFlexfecReceiveStream(s);
222 }
223 streams.clear();
224 }
225}
226
227TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
228 CallHelper call;
brandtr8313a6f2017-01-13 07:41:19 -0800229 MockTransport rtcp_send_transport;
230 FlexfecReceiveStream::Config config(&rtcp_send_transport);
brandtr1cfbd602016-12-08 04:17:53 -0800231 config.payload_type = 118;
brandtr25445d32016-10-23 23:37:14 -0700232 config.protected_media_ssrcs = {1324234};
233 FlexfecReceiveStream* stream;
234 std::list<FlexfecReceiveStream*> streams;
235
brandtr1cfbd602016-12-08 04:17:53 -0800236 config.remote_ssrc = 838383;
brandtr25445d32016-10-23 23:37:14 -0700237 stream = call->CreateFlexfecReceiveStream(config);
238 EXPECT_NE(stream, nullptr);
239 streams.push_back(stream);
240
brandtr1cfbd602016-12-08 04:17:53 -0800241 config.remote_ssrc = 424993;
brandtr25445d32016-10-23 23:37:14 -0700242 stream = call->CreateFlexfecReceiveStream(config);
243 EXPECT_NE(stream, nullptr);
244 streams.push_back(stream);
245
brandtr1cfbd602016-12-08 04:17:53 -0800246 config.remote_ssrc = 99383;
brandtr25445d32016-10-23 23:37:14 -0700247 stream = call->CreateFlexfecReceiveStream(config);
248 EXPECT_NE(stream, nullptr);
249 streams.push_back(stream);
250
brandtr1cfbd602016-12-08 04:17:53 -0800251 config.remote_ssrc = 5548;
brandtr25445d32016-10-23 23:37:14 -0700252 stream = call->CreateFlexfecReceiveStream(config);
253 EXPECT_NE(stream, nullptr);
254 streams.push_back(stream);
255
256 for (auto s : streams) {
257 call->DestroyFlexfecReceiveStream(s);
258 }
259}
260
ossuc3d4b482017-05-23 06:07:11 -0700261TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
262 constexpr uint32_t kSSRC = 12345;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100263 CallHelper call;
ossuc3d4b482017-05-23 06:07:11 -0700264
265 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
266 AudioSendStream::Config config(nullptr);
267 config.rtp.ssrc = ssrc;
ossuc3d4b482017-05-23 06:07:11 -0700268 AudioSendStream* stream = call->CreateAudioSendStream(config);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100269 const RtpState rtp_state =
270 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
ossuc3d4b482017-05-23 06:07:11 -0700271 call->DestroyAudioSendStream(stream);
ossuc3d4b482017-05-23 06:07:11 -0700272 return rtp_state;
273 };
274
275 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
276 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
277
278 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
279 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
280 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
281 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
282 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
283 rtp_state2.last_timestamp_time_ms);
284 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
285}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100286
solenbergc7a8b082015-10-16 14:35:07 -0700287} // namespace webrtc