blob: 53d355af6ba3e9da9e1954efa39d578103658f15 [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"
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080017#include "test/gmock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "test/gtest.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000019
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080020using ::testing::Each;
21using ::testing::Ne;
22
Peter Boström0c4e06b2015-10-07 12:23:21 +020023static const uint32_t kSsrcs1[] = {1};
24static const uint32_t kSsrcs2[] = {1, 2};
25static const uint32_t kSsrcs3[] = {1, 2, 3};
26static const uint32_t kRtxSsrcs3[] = {4, 5, 6};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
28static cricket::StreamParams CreateStreamParamsWithSsrcGroup(
Peter Boström0c4e06b2015-10-07 12:23:21 +020029 const std::string& semantics,
30 const uint32_t ssrcs_in[],
31 size_t len) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032 cricket::StreamParams stream;
Peter Boström0c4e06b2015-10-07 12:23:21 +020033 std::vector<uint32_t> ssrcs(ssrcs_in, ssrcs_in + len);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034 cricket::SsrcGroup sg(semantics, ssrcs);
35 stream.ssrcs = ssrcs;
36 stream.ssrc_groups.push_back(sg);
37 return stream;
38}
39
40TEST(SsrcGroup, EqualNotEqual) {
41 cricket::SsrcGroup ssrc_groups[] = {
Yves Gerey665174f2018-06-19 15:03:05 +020042 cricket::SsrcGroup("ABC", MAKE_VECTOR(kSsrcs1)),
43 cricket::SsrcGroup("ABC", MAKE_VECTOR(kSsrcs2)),
44 cricket::SsrcGroup("Abc", MAKE_VECTOR(kSsrcs2)),
45 cricket::SsrcGroup("abc", MAKE_VECTOR(kSsrcs2)),
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046 };
47
tfarina5237aaf2015-11-10 23:44:30 -080048 for (size_t i = 0; i < arraysize(ssrc_groups); ++i) {
49 for (size_t j = 0; j < arraysize(ssrc_groups); ++j) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050 EXPECT_EQ((ssrc_groups[i] == ssrc_groups[j]), (i == j));
51 EXPECT_EQ((ssrc_groups[i] != ssrc_groups[j]), (i != j));
52 }
53 }
54}
55
56TEST(SsrcGroup, HasSemantics) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000057 cricket::SsrcGroup sg1("ABC", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 EXPECT_TRUE(sg1.has_semantics("ABC"));
59
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000060 cricket::SsrcGroup sg2("Abc", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 EXPECT_FALSE(sg2.has_semantics("ABC"));
62
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000063 cricket::SsrcGroup sg3("abc", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 EXPECT_FALSE(sg3.has_semantics("ABC"));
65}
66
67TEST(SsrcGroup, ToString) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000068 cricket::SsrcGroup sg1("ABC", MAKE_VECTOR(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069 EXPECT_STREQ("{semantics:ABC;ssrcs:[1]}", sg1.ToString().c_str());
70}
71
72TEST(StreamParams, CreateLegacy) {
Peter Boström0c4e06b2015-10-07 12:23:21 +020073 const uint32_t ssrc = 7;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074 cricket::StreamParams one_sp = cricket::StreamParams::CreateLegacy(ssrc);
75 EXPECT_EQ(1U, one_sp.ssrcs.size());
76 EXPECT_EQ(ssrc, one_sp.first_ssrc());
77 EXPECT_TRUE(one_sp.has_ssrcs());
78 EXPECT_TRUE(one_sp.has_ssrc(ssrc));
Yves Gerey665174f2018-06-19 15:03:05 +020079 EXPECT_FALSE(one_sp.has_ssrc(ssrc + 1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 EXPECT_FALSE(one_sp.has_ssrc_groups());
81 EXPECT_EQ(0U, one_sp.ssrc_groups.size());
82}
83
84TEST(StreamParams, HasSsrcGroup) {
85 cricket::StreamParams sp =
tfarina5237aaf2015-11-10 23:44:30 -080086 CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087 EXPECT_EQ(2U, sp.ssrcs.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000088 EXPECT_EQ(kSsrcs2[0], sp.first_ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089 EXPECT_TRUE(sp.has_ssrcs());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000090 EXPECT_TRUE(sp.has_ssrc(kSsrcs2[0]));
91 EXPECT_TRUE(sp.has_ssrc(kSsrcs2[1]));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 EXPECT_TRUE(sp.has_ssrc_group("XYZ"));
93 EXPECT_EQ(1U, sp.ssrc_groups.size());
94 EXPECT_EQ(2U, sp.ssrc_groups[0].ssrcs.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +000095 EXPECT_EQ(kSsrcs2[0], sp.ssrc_groups[0].ssrcs[0]);
96 EXPECT_EQ(kSsrcs2[1], sp.ssrc_groups[0].ssrcs[1]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097}
98
99TEST(StreamParams, GetSsrcGroup) {
100 cricket::StreamParams sp =
tfarina5237aaf2015-11-10 23:44:30 -0800101 CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 EXPECT_EQ(NULL, sp.get_ssrc_group("xyz"));
103 EXPECT_EQ(&sp.ssrc_groups[0], sp.get_ssrc_group("XYZ"));
104}
105
Seth Hampson5897a6e2018-04-03 11:16:33 -0700106TEST(StreamParams, HasStreamWithNoSsrcs) {
107 cricket::StreamParams sp_1 = cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
108 cricket::StreamParams sp_2 = cricket::StreamParams::CreateLegacy(kSsrcs2[0]);
109 std::vector<cricket::StreamParams> streams({sp_1, sp_2});
110 EXPECT_FALSE(HasStreamWithNoSsrcs(streams));
111
112 cricket::StreamParams unsignaled_stream;
113 streams.push_back(unsignaled_stream);
114 EXPECT_TRUE(HasStreamWithNoSsrcs(streams));
115}
116
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117TEST(StreamParams, EqualNotEqual) {
118 cricket::StreamParams l1 = cricket::StreamParams::CreateLegacy(1);
119 cricket::StreamParams l2 = cricket::StreamParams::CreateLegacy(2);
120 cricket::StreamParams sg1 =
tfarina5237aaf2015-11-10 23:44:30 -0800121 CreateStreamParamsWithSsrcGroup("ABC", kSsrcs1, arraysize(kSsrcs1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 cricket::StreamParams sg2 =
tfarina5237aaf2015-11-10 23:44:30 -0800123 CreateStreamParamsWithSsrcGroup("ABC", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 cricket::StreamParams sg3 =
tfarina5237aaf2015-11-10 23:44:30 -0800125 CreateStreamParamsWithSsrcGroup("Abc", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000126 cricket::StreamParams sg4 =
tfarina5237aaf2015-11-10 23:44:30 -0800127 CreateStreamParamsWithSsrcGroup("abc", kSsrcs2, arraysize(kSsrcs2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 cricket::StreamParams sps[] = {l1, l2, sg1, sg2, sg3, sg4};
129
tfarina5237aaf2015-11-10 23:44:30 -0800130 for (size_t i = 0; i < arraysize(sps); ++i) {
131 for (size_t j = 0; j < arraysize(sps); ++j) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 EXPECT_EQ((sps[i] == sps[j]), (i == j));
133 EXPECT_EQ((sps[i] != sps[j]), (i != j));
134 }
135 }
136}
137
138TEST(StreamParams, FidFunctions) {
Peter Boström0c4e06b2015-10-07 12:23:21 +0200139 uint32_t fid_ssrc;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140
141 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(1);
142 EXPECT_FALSE(sp.AddFidSsrc(10, 20));
143 EXPECT_TRUE(sp.AddFidSsrc(1, 2));
144 EXPECT_TRUE(sp.GetFidSsrc(1, &fid_ssrc));
145 EXPECT_EQ(2u, fid_ssrc);
146 EXPECT_FALSE(sp.GetFidSsrc(15, &fid_ssrc));
147
148 sp.add_ssrc(20);
brandtr9688e382016-11-22 00:59:48 -0800149 EXPECT_TRUE(sp.AddFidSsrc(20, 30));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150 EXPECT_TRUE(sp.GetFidSsrc(20, &fid_ssrc));
151 EXPECT_EQ(30u, fid_ssrc);
152
153 // Manually create SsrcGroup to test bounds-checking
154 // in GetSecondarySsrc. We construct an invalid StreamParams
155 // for this.
Peter Boström0c4e06b2015-10-07 12:23:21 +0200156 std::vector<uint32_t> fid_vector;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 fid_vector.push_back(13);
158 cricket::SsrcGroup invalid_fid_group(cricket::kFidSsrcGroupSemantics,
Yves Gerey665174f2018-06-19 15:03:05 +0200159 fid_vector);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160 cricket::StreamParams sp_invalid;
161 sp_invalid.add_ssrc(13);
162 sp_invalid.ssrc_groups.push_back(invalid_fid_group);
163 EXPECT_FALSE(sp_invalid.GetFidSsrc(13, &fid_ssrc));
164}
165
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000166TEST(StreamParams, GetPrimaryAndFidSsrcs) {
167 cricket::StreamParams sp;
168 sp.ssrcs.push_back(1);
169 sp.ssrcs.push_back(2);
170 sp.ssrcs.push_back(3);
171
Peter Boström0c4e06b2015-10-07 12:23:21 +0200172 std::vector<uint32_t> primary_ssrcs;
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000173 sp.GetPrimarySsrcs(&primary_ssrcs);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200174 std::vector<uint32_t> fid_ssrcs;
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000175 sp.GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
176 ASSERT_EQ(1u, primary_ssrcs.size());
177 EXPECT_EQ(1u, primary_ssrcs[0]);
178 ASSERT_EQ(0u, fid_ssrcs.size());
179
180 sp.ssrc_groups.push_back(
181 cricket::SsrcGroup(cricket::kSimSsrcGroupSemantics, sp.ssrcs));
182 sp.AddFidSsrc(1, 10);
183 sp.AddFidSsrc(2, 20);
184
185 primary_ssrcs.clear();
186 sp.GetPrimarySsrcs(&primary_ssrcs);
187 fid_ssrcs.clear();
188 sp.GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
189 ASSERT_EQ(3u, primary_ssrcs.size());
190 EXPECT_EQ(1u, primary_ssrcs[0]);
191 EXPECT_EQ(2u, primary_ssrcs[1]);
192 EXPECT_EQ(3u, primary_ssrcs[2]);
193 ASSERT_EQ(2u, fid_ssrcs.size());
194 EXPECT_EQ(10u, fid_ssrcs[0]);
195 EXPECT_EQ(20u, fid_ssrcs[1]);
196}
197
brandtr9688e382016-11-22 00:59:48 -0800198TEST(StreamParams, FecFrFunctions) {
199 uint32_t fecfr_ssrc;
200
201 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(1);
202 EXPECT_FALSE(sp.AddFecFrSsrc(10, 20));
203 EXPECT_TRUE(sp.AddFecFrSsrc(1, 2));
204 EXPECT_TRUE(sp.GetFecFrSsrc(1, &fecfr_ssrc));
205 EXPECT_EQ(2u, fecfr_ssrc);
206 EXPECT_FALSE(sp.GetFecFrSsrc(15, &fecfr_ssrc));
207
208 sp.add_ssrc(20);
209 EXPECT_TRUE(sp.AddFecFrSsrc(20, 30));
210 EXPECT_TRUE(sp.GetFecFrSsrc(20, &fecfr_ssrc));
211 EXPECT_EQ(30u, fecfr_ssrc);
212
213 // Manually create SsrcGroup to test bounds-checking
214 // in GetSecondarySsrc. We construct an invalid StreamParams
215 // for this.
216 std::vector<uint32_t> fecfr_vector;
217 fecfr_vector.push_back(13);
218 cricket::SsrcGroup invalid_fecfr_group(cricket::kFecFrSsrcGroupSemantics,
219 fecfr_vector);
220 cricket::StreamParams sp_invalid;
221 sp_invalid.add_ssrc(13);
222 sp_invalid.ssrc_groups.push_back(invalid_fecfr_group);
223 EXPECT_FALSE(sp_invalid.GetFecFrSsrc(13, &fecfr_ssrc));
224}
225
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226TEST(StreamParams, ToString) {
227 cricket::StreamParams sp =
tfarina5237aaf2015-11-10 23:44:30 -0800228 CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
Seth Hampson5b4f0752018-04-02 16:31:36 -0700229 sp.set_stream_ids({"stream_id"});
230 EXPECT_STREQ(
231 "{ssrcs:[1,2];ssrc_groups:{semantics:XYZ;ssrcs:[1,2]};stream_ids:stream_"
232 "id;}",
233 sp.ToString().c_str());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234}
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000235
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000236TEST(StreamParams, TestIsOneSsrcStream_LegacyStream) {
237 EXPECT_TRUE(
238 cricket::IsOneSsrcStream(cricket::StreamParams::CreateLegacy(13)));
239}
240
241TEST(StreamParams, TestIsOneSsrcStream_SingleRtxStream) {
242 cricket::StreamParams stream;
243 stream.add_ssrc(13);
244 EXPECT_TRUE(stream.AddFidSsrc(13, 14));
245 EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
246}
247
brandtr9688e382016-11-22 00:59:48 -0800248TEST(StreamParams, TestIsOneSsrcStream_SingleFlexfecStream) {
249 cricket::StreamParams stream;
250 stream.add_ssrc(13);
251 EXPECT_TRUE(stream.AddFecFrSsrc(13, 14));
252 EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
253}
254
255TEST(StreamParams, TestIsOneSsrcStream_SingleFlexfecAndRtxStream) {
256 cricket::StreamParams stream;
257 stream.add_ssrc(13);
258 EXPECT_TRUE(stream.AddFecFrSsrc(13, 14));
259 EXPECT_TRUE(stream.AddFidSsrc(13, 15));
260 EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
261}
262
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000263TEST(StreamParams, TestIsOneSsrcStream_SimulcastStream) {
264 EXPECT_FALSE(cricket::IsOneSsrcStream(
265 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2))));
266 EXPECT_FALSE(cricket::IsOneSsrcStream(
267 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))));
268}
269
270TEST(StreamParams, TestIsOneSsrcStream_SimRtxStream) {
Yves Gerey665174f2018-06-19 15:03:05 +0200271 cricket::StreamParams stream = cricket::CreateSimWithRtxStreamParams(
272 "cname", MAKE_VECTOR(kSsrcs3), MAKE_VECTOR(kRtxSsrcs3));
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000273 EXPECT_FALSE(cricket::IsOneSsrcStream(stream));
274}
275
276TEST(StreamParams, TestIsSimulcastStream_LegacyStream) {
277 EXPECT_FALSE(
278 cricket::IsSimulcastStream(cricket::StreamParams::CreateLegacy(13)));
279}
280
281TEST(StreamParams, TestIsSimulcastStream_SingleRtxStream) {
282 cricket::StreamParams stream;
283 stream.add_ssrc(13);
284 EXPECT_TRUE(stream.AddFidSsrc(13, 14));
285 EXPECT_FALSE(cricket::IsSimulcastStream(stream));
286}
287
288TEST(StreamParams, TestIsSimulcastStream_SimulcastStream) {
289 EXPECT_TRUE(cricket::IsSimulcastStream(
290 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2))));
291 EXPECT_TRUE(cricket::IsSimulcastStream(
292 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))));
293}
294
295TEST(StreamParams, TestIsSimulcastStream_SimRtxStream) {
Yves Gerey665174f2018-06-19 15:03:05 +0200296 cricket::StreamParams stream = cricket::CreateSimWithRtxStreamParams(
297 "cname", MAKE_VECTOR(kSsrcs3), MAKE_VECTOR(kRtxSsrcs3));
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000298 EXPECT_TRUE(cricket::IsSimulcastStream(stream));
299}
300
301TEST(StreamParams, TestIsSimulcastStream_InvalidStreams) {
302 // stream1 has extra non-sim, non-fid ssrc.
Yves Gerey665174f2018-06-19 15:03:05 +0200303 cricket::StreamParams stream1 = cricket::CreateSimWithRtxStreamParams(
304 "cname", MAKE_VECTOR(kSsrcs3), MAKE_VECTOR(kRtxSsrcs3));
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000305 stream1.add_ssrc(25);
306 EXPECT_FALSE(cricket::IsSimulcastStream(stream1));
307
308 // stream2 has invalid fid-group (no primary).
309 cricket::StreamParams stream2;
310 stream2.add_ssrc(13);
311 EXPECT_TRUE(stream2.AddFidSsrc(13, 14));
Artem Titovf7d7e902018-06-13 22:52:46 +0200312 stream2.ssrcs.erase(
313 std::remove(stream2.ssrcs.begin(), stream2.ssrcs.end(), 13u),
314 stream2.ssrcs.end());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000315 EXPECT_FALSE(cricket::IsSimulcastStream(stream2));
316
317 // stream3 has two SIM groups.
318 cricket::StreamParams stream3 =
319 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2));
Peter Boström0c4e06b2015-10-07 12:23:21 +0200320 std::vector<uint32_t> sim_ssrcs = MAKE_VECTOR(kRtxSsrcs3);
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +0000321 cricket::SsrcGroup sg(cricket::kSimSsrcGroupSemantics, sim_ssrcs);
322 for (size_t i = 0; i < sim_ssrcs.size(); i++) {
323 stream3.add_ssrc(sim_ssrcs[i]);
324 }
325 stream3.ssrc_groups.push_back(sg);
326 EXPECT_FALSE(cricket::IsSimulcastStream(stream3));
327}
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800328
329TEST(StreamParams, TestGenerateSsrcs_SingleStreamWithRtxAndFlex) {
330 rtc::UniqueRandomIdGenerator generator;
331 cricket::StreamParams stream;
332 stream.GenerateSsrcs(1, true, true, &generator);
333 uint32_t primary_ssrc = stream.first_ssrc();
334 ASSERT_NE(0u, primary_ssrc);
335 uint32_t rtx_ssrc = 0;
336 uint32_t flex_ssrc = 0;
337 EXPECT_EQ(3u, stream.ssrcs.size());
338 EXPECT_TRUE(stream.GetFidSsrc(primary_ssrc, &rtx_ssrc));
339 EXPECT_NE(0u, rtx_ssrc);
340 EXPECT_TRUE(stream.GetFecFrSsrc(primary_ssrc, &flex_ssrc));
341 EXPECT_NE(0u, flex_ssrc);
342 EXPECT_FALSE(stream.has_ssrc_group(cricket::kSimSsrcGroupSemantics));
343 EXPECT_TRUE(stream.has_ssrc_group(cricket::kFidSsrcGroupSemantics));
344 EXPECT_TRUE(stream.has_ssrc_group(cricket::kFecFrSsrcGroupSemantics));
345}
346
347TEST(StreamParams, TestGenerateSsrcs_SingleStreamWithRtx) {
348 rtc::UniqueRandomIdGenerator generator;
349 cricket::StreamParams stream;
350 stream.GenerateSsrcs(1, true, false, &generator);
351 uint32_t primary_ssrc = stream.first_ssrc();
352 ASSERT_NE(0u, primary_ssrc);
353 uint32_t rtx_ssrc = 0;
354 uint32_t flex_ssrc = 0;
355 EXPECT_EQ(2u, stream.ssrcs.size());
356 EXPECT_TRUE(stream.GetFidSsrc(primary_ssrc, &rtx_ssrc));
357 EXPECT_NE(0u, rtx_ssrc);
358 EXPECT_FALSE(stream.GetFecFrSsrc(primary_ssrc, &flex_ssrc));
359 EXPECT_EQ(0u, flex_ssrc);
360 EXPECT_FALSE(stream.has_ssrc_group(cricket::kSimSsrcGroupSemantics));
361 EXPECT_TRUE(stream.has_ssrc_group(cricket::kFidSsrcGroupSemantics));
362}
363
364TEST(StreamParams, TestGenerateSsrcs_SingleStreamWithFlex) {
365 rtc::UniqueRandomIdGenerator generator;
366 cricket::StreamParams stream;
367 stream.GenerateSsrcs(1, false, true, &generator);
368 uint32_t primary_ssrc = stream.first_ssrc();
369 ASSERT_NE(0u, primary_ssrc);
370 uint32_t rtx_ssrc = 0;
371 uint32_t flex_ssrc = 0;
372 EXPECT_EQ(2u, stream.ssrcs.size());
373 EXPECT_FALSE(stream.GetFidSsrc(primary_ssrc, &rtx_ssrc));
374 EXPECT_EQ(0u, rtx_ssrc);
375 EXPECT_TRUE(stream.GetFecFrSsrc(primary_ssrc, &flex_ssrc));
376 EXPECT_NE(0u, flex_ssrc);
377 EXPECT_FALSE(stream.has_ssrc_group(cricket::kSimSsrcGroupSemantics));
378 EXPECT_TRUE(stream.has_ssrc_group(cricket::kFecFrSsrcGroupSemantics));
379}
380
381TEST(StreamParams, TestGenerateSsrcs_SimulcastLayersAndRtx) {
382 const size_t kNumStreams = 3;
383 rtc::UniqueRandomIdGenerator generator;
384 cricket::StreamParams stream;
385 stream.GenerateSsrcs(kNumStreams, true, false, &generator);
386 EXPECT_EQ(kNumStreams * 2, stream.ssrcs.size());
387 std::vector<uint32_t> primary_ssrcs, rtx_ssrcs;
388 stream.GetPrimarySsrcs(&primary_ssrcs);
389 EXPECT_EQ(kNumStreams, primary_ssrcs.size());
390 EXPECT_THAT(primary_ssrcs, Each(Ne(0u)));
391 stream.GetFidSsrcs(primary_ssrcs, &rtx_ssrcs);
392 EXPECT_EQ(kNumStreams, rtx_ssrcs.size());
393 EXPECT_THAT(rtx_ssrcs, Each(Ne(0u)));
394 EXPECT_TRUE(stream.has_ssrc_group(cricket::kSimSsrcGroupSemantics));
395 EXPECT_TRUE(stream.has_ssrc_group(cricket::kFidSsrcGroupSemantics));
396}