blob: 193f8c02592d96d754a573e371ecccdb3ca1776a [file] [log] [blame]
Åsa Persson31cb8f92018-06-27 08:44:561/*
2 * Copyright 2018 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 "media/engine/simulcast.h"
12
Erik Språngceb44952020-09-22 09:36:3513#include "api/transport/field_trial_based_config.h"
Steve Anton10542f22019-01-11 17:11:0014#include "media/base/media_constants.h"
Åsa Persson31cb8f92018-06-27 08:44:5615#include "media/engine/constants.h"
16#include "test/field_trial.h"
17#include "test/gtest.h"
18
19namespace webrtc {
20namespace {
21constexpr int kQpMax = 55;
22constexpr double kBitratePriority = 2.0;
Åsa Persson31cb8f92018-06-27 08:44:5623constexpr bool kScreenshare = true;
24constexpr int kDefaultTemporalLayers = 3; // Value from simulcast.cc.
25
26// Values from kSimulcastConfigs in simulcast.cc.
27const std::vector<VideoStream> GetSimulcastBitrates720p() {
28 std::vector<VideoStream> streams(3);
29 streams[0].min_bitrate_bps = 30000;
30 streams[0].target_bitrate_bps = 150000;
31 streams[0].max_bitrate_bps = 200000;
32 streams[1].min_bitrate_bps = 150000;
33 streams[1].target_bitrate_bps = 500000;
34 streams[1].max_bitrate_bps = 700000;
35 streams[2].min_bitrate_bps = 600000;
36 streams[2].target_bitrate_bps = 2500000;
37 streams[2].max_bitrate_bps = 2500000;
38 return streams;
39}
40} // namespace
41
42TEST(SimulcastTest, TotalMaxBitrateIsZeroForNoStreams) {
43 std::vector<VideoStream> streams;
Oskar Segersvärddc81e112020-02-12 15:45:5344 EXPECT_EQ(0, cricket::GetTotalMaxBitrate(streams).bps());
Åsa Persson31cb8f92018-06-27 08:44:5645}
46
47TEST(SimulcastTest, GetTotalMaxBitrateForSingleStream) {
48 std::vector<VideoStream> streams(1);
49 streams[0].max_bitrate_bps = 100000;
Oskar Segersvärddc81e112020-02-12 15:45:5350 EXPECT_EQ(100000, cricket::GetTotalMaxBitrate(streams).bps());
Åsa Persson31cb8f92018-06-27 08:44:5651}
52
53TEST(SimulcastTest, GetTotalMaxBitrateForMultipleStreams) {
54 std::vector<VideoStream> streams(3);
55 streams[0].target_bitrate_bps = 100000;
56 streams[1].target_bitrate_bps = 200000;
57 streams[2].max_bitrate_bps = 400000;
Oskar Segersvärddc81e112020-02-12 15:45:5358 EXPECT_EQ(700000, cricket::GetTotalMaxBitrate(streams).bps());
Åsa Persson31cb8f92018-06-27 08:44:5659}
60
61TEST(SimulcastTest, BandwidthAboveTotalMaxBitrateGivenToHighestStream) {
62 std::vector<VideoStream> streams(3);
63 streams[0].target_bitrate_bps = 100000;
64 streams[1].target_bitrate_bps = 200000;
65 streams[2].max_bitrate_bps = 400000;
66
Danil Chapovalovcad3e0e2020-02-17 17:46:0767 const webrtc::DataRate one_bps = webrtc::DataRate::BitsPerSec(1);
Oskar Segersvärddc81e112020-02-12 15:45:5368
Åsa Persson31cb8f92018-06-27 08:44:5669 // No bitrate above the total max to give to the highest stream.
Oskar Segersvärddc81e112020-02-12 15:45:5370 const webrtc::DataRate max_total_bitrate =
71 cricket::GetTotalMaxBitrate(streams);
72 cricket::BoostMaxSimulcastLayer(max_total_bitrate, &streams);
Åsa Persson31cb8f92018-06-27 08:44:5673 EXPECT_EQ(400000, streams[2].max_bitrate_bps);
Oskar Segersvärddc81e112020-02-12 15:45:5374 EXPECT_EQ(max_total_bitrate, cricket::GetTotalMaxBitrate(streams));
Åsa Persson31cb8f92018-06-27 08:44:5675
76 // The bitrate above the total max should be given to the highest stream.
Oskar Segersvärddc81e112020-02-12 15:45:5377 cricket::BoostMaxSimulcastLayer(max_total_bitrate + one_bps, &streams);
Åsa Persson31cb8f92018-06-27 08:44:5678 EXPECT_EQ(400000 + 1, streams[2].max_bitrate_bps);
Oskar Segersvärddc81e112020-02-12 15:45:5379 EXPECT_EQ(max_total_bitrate + one_bps, cricket::GetTotalMaxBitrate(streams));
Åsa Persson31cb8f92018-06-27 08:44:5680}
81
82TEST(SimulcastTest, GetConfig) {
83 const std::vector<VideoStream> kExpected = GetSimulcastBitrates720p();
Erik Språngceb44952020-09-22 09:36:3584 const FieldTrialBasedConfig trials;
Åsa Persson31cb8f92018-06-27 08:44:5685
Ilya Nikolaevskiy03d90962020-02-11 11:50:3886 const size_t kMinLayers = 1;
Åsa Persson31cb8f92018-06-27 08:44:5687 const size_t kMaxLayers = 3;
88 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:3889 kMinLayers, kMaxLayers, 1280, 720, kBitratePriority, kQpMax,
Erik Språngceb44952020-09-22 09:36:3590 !kScreenshare, true, trials);
Åsa Persson31cb8f92018-06-27 08:44:5691
92 EXPECT_EQ(kMaxLayers, streams.size());
93 EXPECT_EQ(320u, streams[0].width);
94 EXPECT_EQ(180u, streams[0].height);
95 EXPECT_EQ(640u, streams[1].width);
96 EXPECT_EQ(360u, streams[1].height);
97 EXPECT_EQ(1280u, streams[2].width);
98 EXPECT_EQ(720u, streams[2].height);
99
100 for (size_t i = 0; i < streams.size(); ++i) {
Mirko Bonadei3d72f6d2018-07-20 13:35:41101 EXPECT_EQ(size_t{kDefaultTemporalLayers}, streams[i].num_temporal_layers);
Åsa Persson8c1bf952018-09-13 08:42:19102 EXPECT_EQ(cricket::kDefaultVideoMaxFramerate, streams[i].max_framerate);
Åsa Persson31cb8f92018-06-27 08:44:56103 EXPECT_EQ(kQpMax, streams[i].max_qp);
104 EXPECT_EQ(kExpected[i].min_bitrate_bps, streams[i].min_bitrate_bps);
105 EXPECT_EQ(kExpected[i].target_bitrate_bps, streams[i].target_bitrate_bps);
106 EXPECT_EQ(kExpected[i].max_bitrate_bps, streams[i].max_bitrate_bps);
107 EXPECT_TRUE(streams[i].active);
108 }
109 // Currently set on lowest stream.
110 EXPECT_EQ(kBitratePriority, streams[0].bitrate_priority);
111 EXPECT_FALSE(streams[1].bitrate_priority);
112 EXPECT_FALSE(streams[2].bitrate_priority);
113}
114
Rasmus Brandt73d117f2018-10-02 09:12:52115TEST(SimulcastTest, GetConfigWithBaseHeavyVP8TL3RateAllocation) {
116 test::ScopedFieldTrials field_trials(
117 "WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/");
Erik Språngceb44952020-09-22 09:36:35118 FieldTrialBasedConfig trials;
Rasmus Brandt73d117f2018-10-02 09:12:52119
120 const std::vector<VideoStream> kExpected = GetSimulcastBitrates720p();
121
Ilya Nikolaevskiy03d90962020-02-11 11:50:38122 const size_t kMinLayers = 1;
Rasmus Brandt73d117f2018-10-02 09:12:52123 const size_t kMaxLayers = 3;
124 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38125 kMinLayers, kMaxLayers, 1280, 720, kBitratePriority, kQpMax,
Erik Språngceb44952020-09-22 09:36:35126 !kScreenshare, true, trials);
Rasmus Brandt73d117f2018-10-02 09:12:52127
128 EXPECT_EQ(kExpected[0].min_bitrate_bps, streams[0].min_bitrate_bps);
129 EXPECT_EQ(static_cast<int>(0.4 * kExpected[0].target_bitrate_bps / 0.6),
130 streams[0].target_bitrate_bps);
131 EXPECT_EQ(static_cast<int>(0.4 * kExpected[0].max_bitrate_bps / 0.6),
132 streams[0].max_bitrate_bps);
133 for (size_t i = 1; i < streams.size(); ++i) {
134 EXPECT_EQ(kExpected[i].min_bitrate_bps, streams[i].min_bitrate_bps);
135 EXPECT_EQ(kExpected[i].target_bitrate_bps, streams[i].target_bitrate_bps);
136 EXPECT_EQ(kExpected[i].max_bitrate_bps, streams[i].max_bitrate_bps);
137 }
138}
139
Åsa Persson31cb8f92018-06-27 08:44:56140TEST(SimulcastTest, GetConfigWithLimitedMaxLayers) {
Ilya Nikolaevskiy03d90962020-02-11 11:50:38141 const size_t kMinLayers = 1;
Åsa Persson31cb8f92018-06-27 08:44:56142 const size_t kMaxLayers = 2;
Erik Språngceb44952020-09-22 09:36:35143 FieldTrialBasedConfig trials;
Åsa Persson31cb8f92018-06-27 08:44:56144 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38145 kMinLayers, kMaxLayers, 1280, 720, kBitratePriority, kQpMax,
Erik Språngceb44952020-09-22 09:36:35146 !kScreenshare, true, trials);
Åsa Persson31cb8f92018-06-27 08:44:56147
148 EXPECT_EQ(kMaxLayers, streams.size());
Florent Castelli668ce0c2019-07-04 15:06:04149 EXPECT_EQ(640u, streams[0].width);
150 EXPECT_EQ(360u, streams[0].height);
151 EXPECT_EQ(1280u, streams[1].width);
152 EXPECT_EQ(720u, streams[1].height);
Åsa Persson31cb8f92018-06-27 08:44:56153}
154
Åsa Persson645512b2018-09-14 14:42:58155TEST(SimulcastTest, GetConfigWithLimitedMaxLayersForResolution) {
Florent Castelli9b1700c2019-08-05 15:12:20156 test::ScopedFieldTrials field_trials(
157 "WebRTC-LegacySimulcastLayerLimit/Enabled/");
Erik Språngceb44952020-09-22 09:36:35158 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38159 const size_t kMinLayers = 1;
Åsa Persson645512b2018-09-14 14:42:58160 const size_t kMaxLayers = 3;
161 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38162 kMinLayers, kMaxLayers, 800, 600, kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35163 true, trials);
Åsa Persson645512b2018-09-14 14:42:58164
Florent Castelli9b1700c2019-08-05 15:12:20165 EXPECT_EQ(2u, streams.size());
166 EXPECT_EQ(400u, streams[0].width);
167 EXPECT_EQ(300u, streams[0].height);
168 EXPECT_EQ(800u, streams[1].width);
169 EXPECT_EQ(600u, streams[1].height);
Åsa Persson645512b2018-09-14 14:42:58170}
171
Ilya Nikolaevskiy9d7eb282019-10-01 13:43:14172TEST(SimulcastTest, GetConfigWithLowResolutionScreenshare) {
173 test::ScopedFieldTrials field_trials(
174 "WebRTC-LegacySimulcastLayerLimit/Enabled/");
Erik Språngceb44952020-09-22 09:36:35175 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38176 const size_t kMinLayers = 1;
Ilya Nikolaevskiy9d7eb282019-10-01 13:43:14177 const size_t kMaxLayers = 3;
Erik Språngceb44952020-09-22 09:36:35178 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
179 kMinLayers, kMaxLayers, 100, 100, kBitratePriority, kQpMax, kScreenshare,
180 true, trials);
Ilya Nikolaevskiy9d7eb282019-10-01 13:43:14181
182 // Simulcast streams number is never decreased for screenshare,
183 // even for very low resolution.
184 EXPECT_GT(streams.size(), 1u);
185}
186
Åsa Persson645512b2018-09-14 14:42:58187TEST(SimulcastTest, GetConfigWithNotLimitedMaxLayersForResolution) {
Florent Castelli9b1700c2019-08-05 15:12:20188 test::ScopedFieldTrials field_trials(
189 "WebRTC-LegacySimulcastLayerLimit/Disabled/");
Erik Språngceb44952020-09-22 09:36:35190 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38191 const size_t kMinLayers = 1;
Åsa Persson645512b2018-09-14 14:42:58192 const size_t kMaxLayers = 3;
193 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38194 kMinLayers, kMaxLayers, 800, 600, kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35195 true, trials);
Åsa Persson645512b2018-09-14 14:42:58196
197 EXPECT_EQ(kMaxLayers, streams.size());
198 EXPECT_EQ(200u, streams[0].width);
199 EXPECT_EQ(150u, streams[0].height);
200 EXPECT_EQ(400u, streams[1].width);
201 EXPECT_EQ(300u, streams[1].height);
202 EXPECT_EQ(800u, streams[2].width);
203 EXPECT_EQ(600u, streams[2].height);
204}
205
Åsa Persson31cb8f92018-06-27 08:44:56206TEST(SimulcastTest, GetConfigWithNormalizedResolution) {
Erik Språngceb44952020-09-22 09:36:35207 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38208 const size_t kMinLayers = 1;
Åsa Persson31cb8f92018-06-27 08:44:56209 const size_t kMaxLayers = 2;
210 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38211 kMinLayers, kMaxLayers, 640 + 1, 360 + 1, kBitratePriority, kQpMax,
Erik Språngceb44952020-09-22 09:36:35212 !kScreenshare, true, trials);
Åsa Persson31cb8f92018-06-27 08:44:56213
Åsa Persson1a35fbd2018-10-12 15:36:57214 // Must be divisible by |2 ^ (num_layers - 1)|.
Åsa Persson31cb8f92018-06-27 08:44:56215 EXPECT_EQ(kMaxLayers, streams.size());
216 EXPECT_EQ(320u, streams[0].width);
217 EXPECT_EQ(180u, streams[0].height);
218 EXPECT_EQ(640u, streams[1].width);
219 EXPECT_EQ(360u, streams[1].height);
220}
221
Åsa Persson1a35fbd2018-10-12 15:36:57222TEST(SimulcastTest, GetConfigWithNormalizedResolutionDivisibleBy4) {
223 test::ScopedFieldTrials field_trials(
224 "WebRTC-NormalizeSimulcastResolution/Enabled-2/");
Erik Språngceb44952020-09-22 09:36:35225 FieldTrialBasedConfig trials;
Åsa Persson1a35fbd2018-10-12 15:36:57226
Ilya Nikolaevskiy03d90962020-02-11 11:50:38227 const size_t kMinLayers = 1;
Åsa Persson1a35fbd2018-10-12 15:36:57228 const size_t kMaxLayers = 2;
229 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38230 kMinLayers, kMaxLayers, 709, 501, kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35231 true, trials);
Åsa Persson1a35fbd2018-10-12 15:36:57232
233 // Must be divisible by |2 ^ 2|.
234 EXPECT_EQ(kMaxLayers, streams.size());
235 EXPECT_EQ(354u, streams[0].width);
236 EXPECT_EQ(250u, streams[0].height);
237 EXPECT_EQ(708u, streams[1].width);
238 EXPECT_EQ(500u, streams[1].height);
239}
240
241TEST(SimulcastTest, GetConfigWithNormalizedResolutionDivisibleBy8) {
242 test::ScopedFieldTrials field_trials(
243 "WebRTC-NormalizeSimulcastResolution/Enabled-3/");
Erik Språngceb44952020-09-22 09:36:35244 FieldTrialBasedConfig trials;
Åsa Persson1a35fbd2018-10-12 15:36:57245
Ilya Nikolaevskiy03d90962020-02-11 11:50:38246 const size_t kMinLayers = 1;
Åsa Persson1a35fbd2018-10-12 15:36:57247 const size_t kMaxLayers = 2;
248 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38249 kMinLayers, kMaxLayers, 709, 501, kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35250 true, trials);
Åsa Persson1a35fbd2018-10-12 15:36:57251
252 // Must be divisible by |2 ^ 3|.
253 EXPECT_EQ(kMaxLayers, streams.size());
254 EXPECT_EQ(352u, streams[0].width);
255 EXPECT_EQ(248u, streams[0].height);
256 EXPECT_EQ(704u, streams[1].width);
257 EXPECT_EQ(496u, streams[1].height);
258}
259
Florent Castellia9fbb222019-07-24 14:06:45260TEST(SimulcastTest, GetConfigForLegacyLayerLimit) {
261 test::ScopedFieldTrials field_trials(
262 "WebRTC-LegacySimulcastLayerLimit/Enabled/");
Erik Språngceb44952020-09-22 09:36:35263 FieldTrialBasedConfig trials;
Florent Castellia9fbb222019-07-24 14:06:45264
Ilya Nikolaevskiy03d90962020-02-11 11:50:38265 const size_t kMinLayers = 1;
Florent Castellia9fbb222019-07-24 14:06:45266 const int kMaxLayers = 3;
267 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38268 kMinLayers, kMaxLayers, 320, 180, kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35269 true, trials);
Florent Castellia9fbb222019-07-24 14:06:45270 EXPECT_EQ(1u, streams.size());
271
Ilya Nikolaevskiy03d90962020-02-11 11:50:38272 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 640, 360,
273 kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35274 true, trials);
Florent Castellia9fbb222019-07-24 14:06:45275 EXPECT_EQ(2u, streams.size());
276
Ilya Nikolaevskiy03d90962020-02-11 11:50:38277 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 1920, 1080,
278 kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35279 true, trials);
Ilya Nikolaevskiy03d90962020-02-11 11:50:38280 EXPECT_EQ(3u, streams.size());
281}
282
283TEST(SimulcastTest, GetConfigForLegacyLayerLimitWithRequiredHD) {
284 test::ScopedFieldTrials field_trials(
285 "WebRTC-LegacySimulcastLayerLimit/Enabled/");
Erik Språngceb44952020-09-22 09:36:35286 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38287
288 const size_t kMinLayers = 3; // "HD" layer must be present!
289 const int kMaxLayers = 3;
290 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
291 kMinLayers, kMaxLayers, 320, 180, kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35292 true, trials);
Ilya Nikolaevskiy03d90962020-02-11 11:50:38293 EXPECT_EQ(3u, streams.size());
294
295 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 640, 360,
296 kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35297 true, trials);
Ilya Nikolaevskiy03d90962020-02-11 11:50:38298 EXPECT_EQ(3u, streams.size());
299
300 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 1920, 1080,
301 kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35302 true, trials);
Florent Castellia9fbb222019-07-24 14:06:45303 EXPECT_EQ(3u, streams.size());
304}
305
Åsa Persson31cb8f92018-06-27 08:44:56306TEST(SimulcastTest, GetConfigForScreenshareSimulcast) {
Erik Språngceb44952020-09-22 09:36:35307 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38308 const size_t kMinLayers = 1;
Åsa Persson31cb8f92018-06-27 08:44:56309 const size_t kMaxLayers = 3;
Erik Språngceb44952020-09-22 09:36:35310 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
311 kMinLayers, kMaxLayers, 1400, 800, kBitratePriority, kQpMax, kScreenshare,
312 true, trials);
Åsa Persson31cb8f92018-06-27 08:44:56313
314 EXPECT_GT(streams.size(), 1u);
315 for (size_t i = 0; i < streams.size(); ++i) {
316 EXPECT_EQ(1400u, streams[i].width) << "Screen content never scaled.";
317 EXPECT_EQ(800u, streams[i].height) << "Screen content never scaled.";
318 EXPECT_EQ(kQpMax, streams[i].max_qp);
319 EXPECT_TRUE(streams[i].active);
Mirko Bonadei3d72f6d2018-07-20 13:35:41320 EXPECT_GT(streams[i].num_temporal_layers, size_t{1});
Åsa Persson31cb8f92018-06-27 08:44:56321 EXPECT_GT(streams[i].max_framerate, 0);
322 EXPECT_GT(streams[i].min_bitrate_bps, 0);
323 EXPECT_GT(streams[i].target_bitrate_bps, streams[i].min_bitrate_bps);
324 EXPECT_GE(streams[i].max_bitrate_bps, streams[i].target_bitrate_bps);
325 }
326}
327
328TEST(SimulcastTest, GetConfigForScreenshareSimulcastWithLimitedMaxLayers) {
Erik Språngceb44952020-09-22 09:36:35329 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38330 const size_t kMinLayers = 1;
Åsa Persson31cb8f92018-06-27 08:44:56331 const size_t kMaxLayers = 1;
Erik Språngceb44952020-09-22 09:36:35332 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
333 kMinLayers, kMaxLayers, 1400, 800, kBitratePriority, kQpMax, kScreenshare,
334 true, trials);
Åsa Persson31cb8f92018-06-27 08:44:56335
336 EXPECT_EQ(kMaxLayers, streams.size());
337}
338
Ilya Nikolaevskiy73ceed52019-09-16 12:53:29339TEST(SimulcastTest, AveragesBitratesForNonStandardResolution) {
Erik Språngceb44952020-09-22 09:36:35340 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy03d90962020-02-11 11:50:38341 const size_t kMinLayers = 1;
Ilya Nikolaevskiy73ceed52019-09-16 12:53:29342 const size_t kMaxLayers = 3;
343 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38344 kMinLayers, kMaxLayers, 900, 800, kBitratePriority, kQpMax, !kScreenshare,
Erik Språngceb44952020-09-22 09:36:35345 true, trials);
Ilya Nikolaevskiy73ceed52019-09-16 12:53:29346
347 EXPECT_EQ(kMaxLayers, streams.size());
348 EXPECT_EQ(900u, streams[2].width);
349 EXPECT_EQ(800u, streams[2].height);
350 EXPECT_EQ(1850000, streams[2].max_bitrate_bps);
351 EXPECT_EQ(1850000, streams[2].target_bitrate_bps);
352 EXPECT_EQ(475000, streams[2].min_bitrate_bps);
353}
354
355TEST(SimulcastTest, BitratesForCloseToStandardResolution) {
Ilya Nikolaevskiy03d90962020-02-11 11:50:38356 const size_t kMinLayers = 1;
Ilya Nikolaevskiy73ceed52019-09-16 12:53:29357 const size_t kMaxLayers = 3;
358 // Resolution very close to 720p in number of pixels
359 const size_t kWidth = 1280;
360 const size_t kHeight = 716;
361 const std::vector<VideoStream> kExpectedNear = GetSimulcastBitrates720p();
Erik Språngceb44952020-09-22 09:36:35362 FieldTrialBasedConfig trials;
Ilya Nikolaevskiy73ceed52019-09-16 12:53:29363
364 std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
Ilya Nikolaevskiy03d90962020-02-11 11:50:38365 kMinLayers, kMaxLayers, kWidth, kHeight, kBitratePriority, kQpMax,
Erik Språngceb44952020-09-22 09:36:35366 !kScreenshare, true, trials);
Ilya Nikolaevskiy73ceed52019-09-16 12:53:29367
368 EXPECT_EQ(kMaxLayers, streams.size());
369 EXPECT_EQ(kWidth, streams[2].width);
370 EXPECT_EQ(kHeight, streams[2].height);
371 for (size_t i = 0; i < streams.size(); ++i) {
372 EXPECT_NEAR(kExpectedNear[i].max_bitrate_bps, streams[i].max_bitrate_bps,
373 20000);
374 EXPECT_NEAR(kExpectedNear[i].target_bitrate_bps,
375 streams[i].target_bitrate_bps, 20000);
376 EXPECT_NEAR(kExpectedNear[i].min_bitrate_bps, streams[i].min_bitrate_bps,
377 20000);
378 }
379}
380
Åsa Persson29bd8632021-01-18 08:15:07381TEST(SimulcastTest, MaxLayers) {
382 FieldTrialBasedConfig trials;
383 const size_t kMinLayers = 1;
384 const int kMaxLayers = 3;
385
386 std::vector<VideoStream> streams;
387 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 540,
388 kBitratePriority, kQpMax, !kScreenshare,
389 true, trials);
390 EXPECT_EQ(3u, streams.size());
391 // <960x540: 2 layers
392 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 539,
393 kBitratePriority, kQpMax, !kScreenshare,
394 true, trials);
395 EXPECT_EQ(2u, streams.size());
396 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 270,
397 kBitratePriority, kQpMax, !kScreenshare,
398 true, trials);
399 EXPECT_EQ(2u, streams.size());
400 // <480x270: 1 layer
401 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 269,
402 kBitratePriority, kQpMax, !kScreenshare,
403 true, trials);
404 EXPECT_EQ(1u, streams.size());
405}
406
407TEST(SimulcastTest, MaxLayersWithFieldTrial) {
408 test::ScopedFieldTrials field_trials(
409 "WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.1/");
410 FieldTrialBasedConfig trials;
411 const size_t kMinLayers = 1;
412 const int kMaxLayers = 3;
413
414 std::vector<VideoStream> streams;
415 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 540,
416 kBitratePriority, kQpMax, !kScreenshare,
417 true, trials);
418 EXPECT_EQ(3u, streams.size());
419 // Lowest cropped height where max layers from higher resolution is used.
420 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 512,
421 kBitratePriority, kQpMax, !kScreenshare,
422 true, trials);
423 EXPECT_EQ(3u, streams.size());
424 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 510,
425 kBitratePriority, kQpMax, !kScreenshare,
426 true, trials);
427 EXPECT_EQ(2u, streams.size());
428 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 270,
429 kBitratePriority, kQpMax, !kScreenshare,
430 true, trials);
431 EXPECT_EQ(2u, streams.size());
432 // Lowest cropped height where max layers from higher resolution is used.
433 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 256,
434 kBitratePriority, kQpMax, !kScreenshare,
435 true, trials);
436 EXPECT_EQ(2u, streams.size());
437 streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 254,
438 kBitratePriority, kQpMax, !kScreenshare,
439 true, trials);
440 EXPECT_EQ(1u, streams.size());
441}
442
Åsa Persson31cb8f92018-06-27 08:44:56443} // namespace webrtc