blob: f0041332c8675c9d6176b0d11a469995c2a0967f [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#include "media/base/stream_params.h"
Yves Gerey3e707812018-11-28 16:47:49 +010012
13#include <stdint.h>
14
Steve Anton10542f22019-01-11 09:11:00 -080015#include "media/base/test_utils.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "rtc_base/arraysize.h"
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018
Peter Boström0c4e06b2015-10-07 12:23:21 +020019static const uint32_t kSsrcs1[] = {1};
20static const uint32_t kSsrcs2[] = {1, 2};
21static const uint32_t kSsrcs3[] = {1, 2, 3};
22static const uint32_t kRtxSsrcs3[] = {4, 5, 6};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000023
24static cricket::StreamParams CreateStreamParamsWithSsrcGroup(
Peter Boström0c4e06b2015-10-07 12:23:21 +020025 const std::string& semantics,
26 const uint32_t ssrcs_in[],
27 size_t len) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028 cricket::StreamParams stream;
Peter Boström0c4e06b2015-10-07 12:23:21 +020029 std::vector<uint32_t> ssrcs(ssrcs_in, ssrcs_in + len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030 cricket::SsrcGroup sg(semantics, ssrcs);
31 stream.ssrcs = ssrcs;
32 stream.ssrc_groups.push_back(sg);
33 return stream;
34}
35
36TEST(SsrcGroup, EqualNotEqual) {
37 cricket::SsrcGroup ssrc_groups[] = {
Yves Gerey665174f2018-06-19 15:03:05 +020038 cricket::SsrcGroup("ABC", MAKE_VECTOR(kSsrcs1)),
39 cricket::SsrcGroup("ABC", MAKE_VECTOR(kSsrcs2)),
40 cricket::SsrcGroup("Abc", MAKE_VECTOR(kSsrcs2)),
41 cricket::SsrcGroup("abc", MAKE_VECTOR(kSsrcs2)),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042 };
43
tfarina5237aaf2015-11-10 23:44:30 -080044 for (size_t i = 0; i < arraysize(ssrc_groups); ++i) {
45 for (size_t j = 0; j < arraysize(ssrc_groups); ++j) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046 EXPECT_EQ((ssrc_groups[i] == ssrc_groups[j]), (i == j));
47 EXPECT_EQ((ssrc_groups[i] != ssrc_groups[j]), (i != j));
48 }
49 }
50}
51
52TEST(SsrcGroup, HasSemantics) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000053 cricket::SsrcGroup sg1("ABC", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054 EXPECT_TRUE(sg1.has_semantics("ABC"));
55
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000056 cricket::SsrcGroup sg2("Abc", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 EXPECT_FALSE(sg2.has_semantics("ABC"));
58
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000059 cricket::SsrcGroup sg3("abc", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 EXPECT_FALSE(sg3.has_semantics("ABC"));
61}
62
63TEST(SsrcGroup, ToString) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000064 cricket::SsrcGroup sg1("ABC", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 EXPECT_STREQ("{semantics:ABC;ssrcs:[1]}", sg1.ToString().c_str());
66}
67
68TEST(StreamParams, CreateLegacy) {
Peter Boström0c4e06b2015-10-07 12:23:21 +020069 const uint32_t ssrc = 7;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 cricket::StreamParams one_sp = cricket::StreamParams::CreateLegacy(ssrc);
71 EXPECT_EQ(1U, one_sp.ssrcs.size());
72 EXPECT_EQ(ssrc, one_sp.first_ssrc());
73 EXPECT_TRUE(one_sp.has_ssrcs());
74 EXPECT_TRUE(one_sp.has_ssrc(ssrc));
Yves Gerey665174f2018-06-19 15:03:05 +020075 EXPECT_FALSE(one_sp.has_ssrc(ssrc + 1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000076 EXPECT_FALSE(one_sp.has_ssrc_groups());
77 EXPECT_EQ(0U, one_sp.ssrc_groups.size());
78}
79
80TEST(StreamParams, HasSsrcGroup) {
81 cricket::StreamParams sp =
tfarina5237aaf2015-11-10 23:44:30 -080082 CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 EXPECT_EQ(2U, sp.ssrcs.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000084 EXPECT_EQ(kSsrcs2[0], sp.first_ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 EXPECT_TRUE(sp.has_ssrcs());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000086 EXPECT_TRUE(sp.has_ssrc(kSsrcs2[0]));
87 EXPECT_TRUE(sp.has_ssrc(kSsrcs2[1]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088 EXPECT_TRUE(sp.has_ssrc_group("XYZ"));
89 EXPECT_EQ(1U, sp.ssrc_groups.size());
90 EXPECT_EQ(2U, sp.ssrc_groups[0].ssrcs.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000091 EXPECT_EQ(kSsrcs2[0], sp.ssrc_groups[0].ssrcs[0]);
92 EXPECT_EQ(kSsrcs2[1], sp.ssrc_groups[0].ssrcs[1]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093}
94
95TEST(StreamParams, GetSsrcGroup) {
96 cricket::StreamParams sp =
tfarina5237aaf2015-11-10 23:44:30 -080097 CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098 EXPECT_EQ(NULL, sp.get_ssrc_group("xyz"));
99 EXPECT_EQ(&sp.ssrc_groups[0], sp.get_ssrc_group("XYZ"));
100}
101
Seth Hampson5897a6e2018-04-03 11:16:33 -0700102TEST(StreamParams, HasStreamWithNoSsrcs) {
103 cricket::StreamParams sp_1 = cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
104 cricket::StreamParams sp_2 = cricket::StreamParams::CreateLegacy(kSsrcs2[0]);
105 std::vector<cricket::StreamParams> streams({sp_1, sp_2});
106 EXPECT_FALSE(HasStreamWithNoSsrcs(streams));
107
108 cricket::StreamParams unsignaled_stream;
109 streams.push_back(unsignaled_stream);
110 EXPECT_TRUE(HasStreamWithNoSsrcs(streams));
111}
112
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113TEST(StreamParams, EqualNotEqual) {
114 cricket::StreamParams l1 = cricket::StreamParams::CreateLegacy(1);
115 cricket::StreamParams l2 = cricket::StreamParams::CreateLegacy(2);
116 cricket::StreamParams sg1 =
tfarina5237aaf2015-11-10 23:44:30 -0800117 CreateStreamParamsWithSsrcGroup("ABC", kSsrcs1, arraysize(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 cricket::StreamParams sg2 =
tfarina5237aaf2015-11-10 23:44:30 -0800119 CreateStreamParamsWithSsrcGroup("ABC", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 cricket::StreamParams sg3 =
tfarina5237aaf2015-11-10 23:44:30 -0800121 CreateStreamParamsWithSsrcGroup("Abc", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 cricket::StreamParams sg4 =
tfarina5237aaf2015-11-10 23:44:30 -0800123 CreateStreamParamsWithSsrcGroup("abc", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 cricket::StreamParams sps[] = {l1, l2, sg1, sg2, sg3, sg4};
125
tfarina5237aaf2015-11-10 23:44:30 -0800126 for (size_t i = 0; i < arraysize(sps); ++i) {
127 for (size_t j = 0; j < arraysize(sps); ++j) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 EXPECT_EQ((sps[i] == sps[j]), (i == j));
129 EXPECT_EQ((sps[i] != sps[j]), (i != j));
130 }
131 }
132}
133
134TEST(StreamParams, FidFunctions) {
Peter Boström0c4e06b2015-10-07 12:23:21 +0200135 uint32_t fid_ssrc;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136
137 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(1);
138 EXPECT_FALSE(sp.AddFidSsrc(10, 20));
139 EXPECT_TRUE(sp.AddFidSsrc(1, 2));
140 EXPECT_TRUE(sp.GetFidSsrc(1, &fid_ssrc));
141 EXPECT_EQ(2u, fid_ssrc);
142 EXPECT_FALSE(sp.GetFidSsrc(15, &fid_ssrc));
143
144 sp.add_ssrc(20);
brandtr9688e382016-11-22 00:59:48 -0800145 EXPECT_TRUE(sp.AddFidSsrc(20, 30));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000146 EXPECT_TRUE(sp.GetFidSsrc(20, &fid_ssrc));
147 EXPECT_EQ(30u, fid_ssrc);
148
149 // Manually create SsrcGroup to test bounds-checking
150 // in GetSecondarySsrc. We construct an invalid StreamParams
151 // for this.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200152 std::vector<uint32_t> fid_vector;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 fid_vector.push_back(13);
154 cricket::SsrcGroup invalid_fid_group(cricket::kFidSsrcGroupSemantics,
Yves Gerey665174f2018-06-19 15:03:05 +0200155 fid_vector);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 cricket::StreamParams sp_invalid;
157 sp_invalid.add_ssrc(13);
158 sp_invalid.ssrc_groups.push_back(invalid_fid_group);
159 EXPECT_FALSE(sp_invalid.GetFidSsrc(13, &fid_ssrc));
160}
161
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000162TEST(StreamParams, GetPrimaryAndFidSsrcs) {
163 cricket::StreamParams sp;
164 sp.ssrcs.push_back(1);
165 sp.ssrcs.push_back(2);
166 sp.ssrcs.push_back(3);
167
Peter Boström0c4e06b2015-10-07 12:23:21 +0200168 std::vector<uint32_t> primary_ssrcs;
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000169 sp.GetPrimarySsrcs(&primary_ssrcs);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200170 std::vector<uint32_t> fid_ssrcs;
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000171 sp.GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
172 ASSERT_EQ(1u, primary_ssrcs.size());
173 EXPECT_EQ(1u, primary_ssrcs[0]);
174 ASSERT_EQ(0u, fid_ssrcs.size());
175
176 sp.ssrc_groups.push_back(
177 cricket::SsrcGroup(cricket::kSimSsrcGroupSemantics, sp.ssrcs));
178 sp.AddFidSsrc(1, 10);
179 sp.AddFidSsrc(2, 20);
180
181 primary_ssrcs.clear();
182 sp.GetPrimarySsrcs(&primary_ssrcs);
183 fid_ssrcs.clear();
184 sp.GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
185 ASSERT_EQ(3u, primary_ssrcs.size());
186 EXPECT_EQ(1u, primary_ssrcs[0]);
187 EXPECT_EQ(2u, primary_ssrcs[1]);
188 EXPECT_EQ(3u, primary_ssrcs[2]);
189 ASSERT_EQ(2u, fid_ssrcs.size());
190 EXPECT_EQ(10u, fid_ssrcs[0]);
191 EXPECT_EQ(20u, fid_ssrcs[1]);
192}
193
brandtr9688e382016-11-22 00:59:48 -0800194TEST(StreamParams, FecFrFunctions) {
195 uint32_t fecfr_ssrc;
196
197 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(1);
198 EXPECT_FALSE(sp.AddFecFrSsrc(10, 20));
199 EXPECT_TRUE(sp.AddFecFrSsrc(1, 2));
200 EXPECT_TRUE(sp.GetFecFrSsrc(1, &fecfr_ssrc));
201 EXPECT_EQ(2u, fecfr_ssrc);
202 EXPECT_FALSE(sp.GetFecFrSsrc(15, &fecfr_ssrc));
203
204 sp.add_ssrc(20);
205 EXPECT_TRUE(sp.AddFecFrSsrc(20, 30));
206 EXPECT_TRUE(sp.GetFecFrSsrc(20, &fecfr_ssrc));
207 EXPECT_EQ(30u, fecfr_ssrc);
208
209 // Manually create SsrcGroup to test bounds-checking
210 // in GetSecondarySsrc. We construct an invalid StreamParams
211 // for this.
212 std::vector<uint32_t> fecfr_vector;
213 fecfr_vector.push_back(13);
214 cricket::SsrcGroup invalid_fecfr_group(cricket::kFecFrSsrcGroupSemantics,
215 fecfr_vector);
216 cricket::StreamParams sp_invalid;
217 sp_invalid.add_ssrc(13);
218 sp_invalid.ssrc_groups.push_back(invalid_fecfr_group);
219 EXPECT_FALSE(sp_invalid.GetFecFrSsrc(13, &fecfr_ssrc));
220}
221
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222TEST(StreamParams, ToString) {
223 cricket::StreamParams sp =
tfarina5237aaf2015-11-10 23:44:30 -0800224 CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
Seth Hampson5b4f0752018-04-02 16:31:36 -0700225 sp.set_stream_ids({"stream_id"});
226 EXPECT_STREQ(
227 "{ssrcs:[1,2];ssrc_groups:{semantics:XYZ;ssrcs:[1,2]};stream_ids:stream_"
228 "id;}",
229 sp.ToString().c_str());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230}
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000231
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000232TEST(StreamParams, TestIsOneSsrcStream_LegacyStream) {
233 EXPECT_TRUE(
234 cricket::IsOneSsrcStream(cricket::StreamParams::CreateLegacy(13)));
235}
236
237TEST(StreamParams, TestIsOneSsrcStream_SingleRtxStream) {
238 cricket::StreamParams stream;
239 stream.add_ssrc(13);
240 EXPECT_TRUE(stream.AddFidSsrc(13, 14));
241 EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
242}
243
brandtr9688e382016-11-22 00:59:48 -0800244TEST(StreamParams, TestIsOneSsrcStream_SingleFlexfecStream) {
245 cricket::StreamParams stream;
246 stream.add_ssrc(13);
247 EXPECT_TRUE(stream.AddFecFrSsrc(13, 14));
248 EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
249}
250
251TEST(StreamParams, TestIsOneSsrcStream_SingleFlexfecAndRtxStream) {
252 cricket::StreamParams stream;
253 stream.add_ssrc(13);
254 EXPECT_TRUE(stream.AddFecFrSsrc(13, 14));
255 EXPECT_TRUE(stream.AddFidSsrc(13, 15));
256 EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
257}
258
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000259TEST(StreamParams, TestIsOneSsrcStream_SimulcastStream) {
260 EXPECT_FALSE(cricket::IsOneSsrcStream(
261 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2))));
262 EXPECT_FALSE(cricket::IsOneSsrcStream(
263 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))));
264}
265
266TEST(StreamParams, TestIsOneSsrcStream_SimRtxStream) {
Yves Gerey665174f2018-06-19 15:03:05 +0200267 cricket::StreamParams stream = cricket::CreateSimWithRtxStreamParams(
268 "cname", MAKE_VECTOR(kSsrcs3), MAKE_VECTOR(kRtxSsrcs3));
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000269 EXPECT_FALSE(cricket::IsOneSsrcStream(stream));
270}
271
272TEST(StreamParams, TestIsSimulcastStream_LegacyStream) {
273 EXPECT_FALSE(
274 cricket::IsSimulcastStream(cricket::StreamParams::CreateLegacy(13)));
275}
276
277TEST(StreamParams, TestIsSimulcastStream_SingleRtxStream) {
278 cricket::StreamParams stream;
279 stream.add_ssrc(13);
280 EXPECT_TRUE(stream.AddFidSsrc(13, 14));
281 EXPECT_FALSE(cricket::IsSimulcastStream(stream));
282}
283
284TEST(StreamParams, TestIsSimulcastStream_SimulcastStream) {
285 EXPECT_TRUE(cricket::IsSimulcastStream(
286 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2))));
287 EXPECT_TRUE(cricket::IsSimulcastStream(
288 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))));
289}
290
291TEST(StreamParams, TestIsSimulcastStream_SimRtxStream) {
Yves Gerey665174f2018-06-19 15:03:05 +0200292 cricket::StreamParams stream = cricket::CreateSimWithRtxStreamParams(
293 "cname", MAKE_VECTOR(kSsrcs3), MAKE_VECTOR(kRtxSsrcs3));
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000294 EXPECT_TRUE(cricket::IsSimulcastStream(stream));
295}
296
297TEST(StreamParams, TestIsSimulcastStream_InvalidStreams) {
298 // stream1 has extra non-sim, non-fid ssrc.
Yves Gerey665174f2018-06-19 15:03:05 +0200299 cricket::StreamParams stream1 = cricket::CreateSimWithRtxStreamParams(
300 "cname", MAKE_VECTOR(kSsrcs3), MAKE_VECTOR(kRtxSsrcs3));
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000301 stream1.add_ssrc(25);
302 EXPECT_FALSE(cricket::IsSimulcastStream(stream1));
303
304 // stream2 has invalid fid-group (no primary).
305 cricket::StreamParams stream2;
306 stream2.add_ssrc(13);
307 EXPECT_TRUE(stream2.AddFidSsrc(13, 14));
Artem Titovf7d7e902018-06-13 22:52:46 +0200308 stream2.ssrcs.erase(
309 std::remove(stream2.ssrcs.begin(), stream2.ssrcs.end(), 13u),
310 stream2.ssrcs.end());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000311 EXPECT_FALSE(cricket::IsSimulcastStream(stream2));
312
313 // stream3 has two SIM groups.
314 cricket::StreamParams stream3 =
315 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2));
Peter Boström0c4e06b2015-10-07 12:23:21 +0200316 std::vector<uint32_t> sim_ssrcs = MAKE_VECTOR(kRtxSsrcs3);
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000317 cricket::SsrcGroup sg(cricket::kSimSsrcGroupSemantics, sim_ssrcs);
318 for (size_t i = 0; i < sim_ssrcs.size(); i++) {
319 stream3.add_ssrc(sim_ssrcs[i]);
320 }
321 stream3.ssrc_groups.push_back(sg);
322 EXPECT_FALSE(cricket::IsSimulcastStream(stream3));
323}