Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: webrtc/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc

Issue 2488833004: Reland of Issue 2434073003: Extract bitrate allocation ... (Closed)
Patch Set: Rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/modules/video_coding/utility/simulcast_rate_allocator.h" 11 #include "webrtc/modules/video_coding/utility/simulcast_rate_allocator.h"
12 12
13 #include <limits> 13 #include <limits>
14 #include <memory> 14 #include <memory>
15 #include <vector>
15 16
16 #include "webrtc/test/gtest.h" 17 #include "webrtc/test/gtest.h"
17 18
18 namespace webrtc { 19 namespace webrtc {
19 namespace { 20 namespace {
20 constexpr uint32_t kMinBitrate = 50; 21 constexpr uint32_t kMinBitrate = 50;
21 constexpr uint32_t kTargetBitrate = 100; 22 constexpr uint32_t kTargetBitrate = 100;
22 constexpr uint32_t kMaxBitrate = 1000; 23 constexpr uint32_t kMaxBitrate = 1000;
23 } // namespace 24 } // namespace
24 25
25 class SimulcastRateAllocatorTest : public ::testing::Test { 26 class SimulcastRateAllocatorTest : public ::testing::Test {
26 public: 27 public:
27 SimulcastRateAllocatorTest() { 28 SimulcastRateAllocatorTest() {
28 memset(&codec_, 0, sizeof(VideoCodec)); 29 memset(&codec_, 0, sizeof(VideoCodec));
29 codec_.minBitrate = kMinBitrate; 30 codec_.minBitrate = kMinBitrate;
30 codec_.targetBitrate = kTargetBitrate; 31 codec_.targetBitrate = kTargetBitrate;
31 codec_.maxBitrate = kMaxBitrate; 32 codec_.maxBitrate = kMaxBitrate;
32 CreateAllocator(); 33 CreateAllocator();
33 } 34 }
34 virtual ~SimulcastRateAllocatorTest() {} 35 virtual ~SimulcastRateAllocatorTest() {}
35 36
36 template <size_t S> 37 template <size_t S>
37 void ExpectEqual(uint32_t (&expected)[S], 38 void ExpectEqual(uint32_t (&expected)[S],
38 const std::vector<uint32_t>& actual) { 39 const std::vector<uint32_t>& actual) {
39 EXPECT_EQ(S, actual.size()); 40 EXPECT_EQ(S, actual.size());
40 for (size_t i = 0; i < S; ++i) 41 for (size_t i = 0; i < S; ++i)
41 EXPECT_EQ(expected[i], actual[i]) << "Mismatch at index " << i; 42 EXPECT_EQ(expected[i], actual[i]) << "Mismatch at index " << i;
42 } 43 }
43 44
45 template <size_t S>
46 void ExpectEqual(uint32_t (&expected)[S], const BitrateAllocation& actual) {
47 // EXPECT_EQ(S, actual.size());
48 uint32_t sum = 0;
49 for (size_t i = 0; i < S; ++i) {
50 uint32_t layer_bitrate = actual.GetSpatialLayerSum(i);
51 EXPECT_EQ(expected[i] * 1000, layer_bitrate) << "Mismatch at index " << i;
52 sum += layer_bitrate;
53 }
54 EXPECT_EQ(sum, actual.get_sum_bps());
55 }
56
44 void CreateAllocator() { 57 void CreateAllocator() {
45 allocator_.reset(new SimulcastRateAllocator(codec_)); 58 allocator_.reset(new SimulcastRateAllocator(codec_, nullptr));
59 }
60
61 BitrateAllocation GetAllocation(uint32_t target_bitrate) {
62 return allocator_->GetAllocation(target_bitrate * 1000, kDefaultFrameRate);
46 } 63 }
47 64
48 protected: 65 protected:
66 static const int kDefaultFrameRate = 30;
49 VideoCodec codec_; 67 VideoCodec codec_;
50 std::unique_ptr<SimulcastRateAllocator> allocator_; 68 std::unique_ptr<SimulcastRateAllocator> allocator_;
51 }; 69 };
52 70
53 TEST_F(SimulcastRateAllocatorTest, NoSimulcastBelowMin) { 71 TEST_F(SimulcastRateAllocatorTest, NoSimulcastBelowMin) {
54 uint32_t expected[] = {codec_.minBitrate}; 72 uint32_t expected[] = {codec_.minBitrate};
55 ExpectEqual(expected, allocator_->GetAllocation(codec_.minBitrate - 1)); 73 ExpectEqual(expected, GetAllocation(codec_.minBitrate - 1));
56 ExpectEqual(expected, allocator_->GetAllocation(1)); 74 ExpectEqual(expected, GetAllocation(1));
57 ExpectEqual(expected, allocator_->GetAllocation(0)); 75 ExpectEqual(expected, GetAllocation(0));
58 } 76 }
59 77
60 TEST_F(SimulcastRateAllocatorTest, NoSimulcastAboveMax) { 78 TEST_F(SimulcastRateAllocatorTest, NoSimulcastAboveMax) {
61 uint32_t expected[] = {codec_.maxBitrate}; 79 uint32_t expected[] = {codec_.maxBitrate};
62 ExpectEqual(expected, allocator_->GetAllocation(codec_.maxBitrate + 1)); 80 ExpectEqual(expected, GetAllocation(codec_.maxBitrate + 1));
63 ExpectEqual(expected, 81 ExpectEqual(expected, GetAllocation(std::numeric_limits<uint32_t>::max()));
64 allocator_->GetAllocation(std::numeric_limits<uint32_t>::max()));
65 } 82 }
66 83
67 TEST_F(SimulcastRateAllocatorTest, NoSimulcastNoMax) { 84 TEST_F(SimulcastRateAllocatorTest, NoSimulcastNoMax) {
68 constexpr uint32_t kMax = std::numeric_limits<uint32_t>::max(); 85 const uint32_t kMax = BitrateAllocation::kMaxBitrateBps / 1000;
69 codec_.maxBitrate = 0; 86 codec_.maxBitrate = 0;
70 CreateAllocator(); 87 CreateAllocator();
71 88
72 uint32_t expected[] = {kMax}; 89 uint32_t expected[] = {kMax};
73 ExpectEqual(expected, allocator_->GetAllocation(kMax)); 90 ExpectEqual(expected, GetAllocation(kMax));
74 } 91 }
75 92
76 TEST_F(SimulcastRateAllocatorTest, NoSimulcastWithinLimits) { 93 TEST_F(SimulcastRateAllocatorTest, NoSimulcastWithinLimits) {
77 for (uint32_t bitrate = codec_.minBitrate; bitrate <= codec_.maxBitrate; 94 for (uint32_t bitrate = codec_.minBitrate; bitrate <= codec_.maxBitrate;
78 ++bitrate) { 95 ++bitrate) {
79 uint32_t expected[] = {bitrate}; 96 uint32_t expected[] = {bitrate};
80 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 97 ExpectEqual(expected, GetAllocation(bitrate));
81 } 98 }
82 } 99 }
83 100
84 TEST_F(SimulcastRateAllocatorTest, SingleSimulcastBelowMin) { 101 TEST_F(SimulcastRateAllocatorTest, SingleSimulcastBelowMin) {
85 // With simulcast, use the min bitrate from the ss spec instead of the global. 102 // With simulcast, use the min bitrate from the ss spec instead of the global.
86 codec_.numberOfSimulcastStreams = 1; 103 codec_.numberOfSimulcastStreams = 1;
87 const uint32_t kMin = codec_.minBitrate - 10; 104 const uint32_t kMin = codec_.minBitrate - 10;
88 codec_.simulcastStream[0].minBitrate = kMin; 105 codec_.simulcastStream[0].minBitrate = kMin;
89 codec_.simulcastStream[0].targetBitrate = kTargetBitrate; 106 codec_.simulcastStream[0].targetBitrate = kTargetBitrate;
90 CreateAllocator(); 107 CreateAllocator();
91 108
92 uint32_t expected[] = {kMin}; 109 uint32_t expected[] = {kMin};
93 ExpectEqual(expected, allocator_->GetAllocation(kMin - 1)); 110 ExpectEqual(expected, GetAllocation(kMin - 1));
94 ExpectEqual(expected, allocator_->GetAllocation(1)); 111 ExpectEqual(expected, GetAllocation(1));
95 ExpectEqual(expected, allocator_->GetAllocation(0)); 112 ExpectEqual(expected, GetAllocation(0));
96 } 113 }
97 114
98 TEST_F(SimulcastRateAllocatorTest, SingleSimulcastAboveMax) { 115 TEST_F(SimulcastRateAllocatorTest, SingleSimulcastAboveMax) {
99 codec_.numberOfSimulcastStreams = 1; 116 codec_.numberOfSimulcastStreams = 1;
100 codec_.simulcastStream[0].minBitrate = kMinBitrate; 117 codec_.simulcastStream[0].minBitrate = kMinBitrate;
101 const uint32_t kMax = codec_.simulcastStream[0].maxBitrate + 1000; 118 const uint32_t kMax = codec_.simulcastStream[0].maxBitrate + 1000;
102 codec_.simulcastStream[0].maxBitrate = kMax; 119 codec_.simulcastStream[0].maxBitrate = kMax;
103 CreateAllocator(); 120 CreateAllocator();
104 121
105 uint32_t expected[] = {kMax}; 122 uint32_t expected[] = {kMax};
106 ExpectEqual(expected, allocator_->GetAllocation(kMax + 1)); 123 ExpectEqual(expected, GetAllocation(kMax));
107 ExpectEqual(expected, 124 ExpectEqual(expected, GetAllocation(kMax + 1));
108 allocator_->GetAllocation(std::numeric_limits<uint32_t>::max())); 125 ExpectEqual(expected, GetAllocation(std::numeric_limits<uint32_t>::max()));
109 } 126 }
110 127
111 TEST_F(SimulcastRateAllocatorTest, SingleSimulcastWithinLimits) { 128 TEST_F(SimulcastRateAllocatorTest, SingleSimulcastWithinLimits) {
112 codec_.numberOfSimulcastStreams = 1; 129 codec_.numberOfSimulcastStreams = 1;
113 codec_.simulcastStream[0].minBitrate = kMinBitrate; 130 codec_.simulcastStream[0].minBitrate = kMinBitrate;
114 codec_.simulcastStream[0].targetBitrate = kTargetBitrate; 131 codec_.simulcastStream[0].targetBitrate = kTargetBitrate;
115 codec_.simulcastStream[0].maxBitrate = kMaxBitrate; 132 codec_.simulcastStream[0].maxBitrate = kMaxBitrate;
116 CreateAllocator(); 133 CreateAllocator();
117 134
118 for (uint32_t bitrate = kMinBitrate; bitrate <= kMaxBitrate; ++bitrate) { 135 for (uint32_t bitrate = kMinBitrate; bitrate <= kMaxBitrate; ++bitrate) {
119 uint32_t expected[] = {bitrate}; 136 uint32_t expected[] = {bitrate};
120 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 137 ExpectEqual(expected, GetAllocation(bitrate));
121 } 138 }
122 } 139 }
123 140
124 TEST_F(SimulcastRateAllocatorTest, OneToThreeStreams) { 141 TEST_F(SimulcastRateAllocatorTest, OneToThreeStreams) {
125 codec_.numberOfSimulcastStreams = 3; 142 codec_.numberOfSimulcastStreams = 3;
126 codec_.maxBitrate = 0; 143 codec_.maxBitrate = 0;
127 codec_.simulcastStream[0].minBitrate = 10; 144 codec_.simulcastStream[0].minBitrate = 10;
128 codec_.simulcastStream[0].targetBitrate = 100; 145 codec_.simulcastStream[0].targetBitrate = 100;
129 codec_.simulcastStream[0].maxBitrate = 500; 146 codec_.simulcastStream[0].maxBitrate = 500;
130 codec_.simulcastStream[1].minBitrate = 50; 147 codec_.simulcastStream[1].minBitrate = 50;
131 codec_.simulcastStream[1].targetBitrate = 500; 148 codec_.simulcastStream[1].targetBitrate = 500;
132 codec_.simulcastStream[1].maxBitrate = 1000; 149 codec_.simulcastStream[1].maxBitrate = 1000;
133 codec_.simulcastStream[2].minBitrate = 2000; 150 codec_.simulcastStream[2].minBitrate = 2000;
134 codec_.simulcastStream[2].targetBitrate = 3000; 151 codec_.simulcastStream[2].targetBitrate = 3000;
135 codec_.simulcastStream[2].maxBitrate = 4000; 152 codec_.simulcastStream[2].maxBitrate = 4000;
136 CreateAllocator(); 153 CreateAllocator();
137 154
138 { 155 {
139 // Single stream, min bitrate. 156 // Single stream, min bitrate.
140 const uint32_t bitrate = codec_.simulcastStream[0].minBitrate; 157 const uint32_t bitrate = codec_.simulcastStream[0].minBitrate;
141 uint32_t expected[] = {bitrate, 0, 0}; 158 uint32_t expected[] = {bitrate, 0, 0};
142 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 159 ExpectEqual(expected, GetAllocation(bitrate));
143 } 160 }
144 161
145 { 162 {
146 // Single stream at target bitrate. 163 // Single stream at target bitrate.
147 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate; 164 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate;
148 uint32_t expected[] = {bitrate, 0, 0}; 165 uint32_t expected[] = {bitrate, 0, 0};
149 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 166 ExpectEqual(expected, GetAllocation(bitrate));
150 } 167 }
151 168
152 { 169 {
153 // Bitrate above target for first stream, but below min for the next one. 170 // Bitrate above target for first stream, but below min for the next one.
154 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate + 171 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
155 codec_.simulcastStream[1].minBitrate - 1; 172 codec_.simulcastStream[1].minBitrate - 1;
156 uint32_t expected[] = {bitrate, 0, 0}; 173 uint32_t expected[] = {bitrate, 0, 0};
157 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 174 ExpectEqual(expected, GetAllocation(bitrate));
158 } 175 }
159 176
160 { 177 {
161 // Just enough for two streams. 178 // Just enough for two streams.
162 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate + 179 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
163 codec_.simulcastStream[1].minBitrate; 180 codec_.simulcastStream[1].minBitrate;
164 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate, 181 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
165 codec_.simulcastStream[1].minBitrate, 0}; 182 codec_.simulcastStream[1].minBitrate, 0};
166 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 183 ExpectEqual(expected, GetAllocation(bitrate));
167 } 184 }
168 185
169 { 186 {
170 // Second stream maxed out, but not enough for third. 187 // Second stream maxed out, but not enough for third.
171 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate + 188 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
172 codec_.simulcastStream[1].maxBitrate; 189 codec_.simulcastStream[1].maxBitrate;
173 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate, 190 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
174 codec_.simulcastStream[1].maxBitrate, 0}; 191 codec_.simulcastStream[1].maxBitrate, 0};
175 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 192 ExpectEqual(expected, GetAllocation(bitrate));
176 } 193 }
177 194
178 { 195 {
179 // First two streams maxed out, but not enough for third. Nowhere to put 196 // First two streams maxed out, but not enough for third. Nowhere to put
180 // remaining bits. 197 // remaining bits.
181 const uint32_t bitrate = codec_.simulcastStream[0].maxBitrate + 198 const uint32_t bitrate = codec_.simulcastStream[0].maxBitrate +
182 codec_.simulcastStream[1].maxBitrate + 499; 199 codec_.simulcastStream[1].maxBitrate + 499;
183 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate, 200 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
184 codec_.simulcastStream[1].maxBitrate, 0}; 201 codec_.simulcastStream[1].maxBitrate, 0};
185 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 202 ExpectEqual(expected, GetAllocation(bitrate));
186 } 203 }
187 204
188 { 205 {
189 // Just enough for all three streams. 206 // Just enough for all three streams.
190 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate + 207 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
191 codec_.simulcastStream[1].targetBitrate + 208 codec_.simulcastStream[1].targetBitrate +
192 codec_.simulcastStream[2].minBitrate; 209 codec_.simulcastStream[2].minBitrate;
193 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate, 210 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
194 codec_.simulcastStream[1].targetBitrate, 211 codec_.simulcastStream[1].targetBitrate,
195 codec_.simulcastStream[2].minBitrate}; 212 codec_.simulcastStream[2].minBitrate};
196 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 213 ExpectEqual(expected, GetAllocation(bitrate));
197 } 214 }
198 215
199 { 216 {
200 // Third maxed out. 217 // Third maxed out.
201 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate + 218 const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
202 codec_.simulcastStream[1].targetBitrate + 219 codec_.simulcastStream[1].targetBitrate +
203 codec_.simulcastStream[2].maxBitrate; 220 codec_.simulcastStream[2].maxBitrate;
204 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate, 221 uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
205 codec_.simulcastStream[1].targetBitrate, 222 codec_.simulcastStream[1].targetBitrate,
206 codec_.simulcastStream[2].maxBitrate}; 223 codec_.simulcastStream[2].maxBitrate};
207 ExpectEqual(expected, allocator_->GetAllocation(bitrate)); 224 ExpectEqual(expected, GetAllocation(bitrate));
208 } 225 }
209 } 226 }
210 227
211 TEST_F(SimulcastRateAllocatorTest, GetPreferredBitrate) { 228 TEST_F(SimulcastRateAllocatorTest, GetPreferredBitrateBps) {
212 EXPECT_EQ(codec_.maxBitrate, allocator_->GetPreferedBitrate()); 229 EXPECT_EQ(codec_.maxBitrate * 1000,
230 allocator_->GetPreferredBitrateBps(codec_.maxFramerate));
213 } 231 }
214 232
215 TEST_F(SimulcastRateAllocatorTest, GetPreferredBitrateSimulcast) { 233 TEST_F(SimulcastRateAllocatorTest, GetPreferredBitrateSimulcast) {
216 codec_.numberOfSimulcastStreams = 3; 234 codec_.numberOfSimulcastStreams = 3;
217 codec_.maxBitrate = 999999; 235 codec_.maxBitrate = 999999;
218 codec_.simulcastStream[0].minBitrate = 10; 236 codec_.simulcastStream[0].minBitrate = 10;
219 codec_.simulcastStream[0].targetBitrate = 100; 237 codec_.simulcastStream[0].targetBitrate = 100;
220 238
221 codec_.simulcastStream[0].maxBitrate = 500; 239 codec_.simulcastStream[0].maxBitrate = 500;
222 codec_.simulcastStream[1].minBitrate = 50; 240 codec_.simulcastStream[1].minBitrate = 50;
223 codec_.simulcastStream[1].targetBitrate = 500; 241 codec_.simulcastStream[1].targetBitrate = 500;
224 codec_.simulcastStream[1].maxBitrate = 1000; 242 codec_.simulcastStream[1].maxBitrate = 1000;
225 243
226 codec_.simulcastStream[2].minBitrate = 2000; 244 codec_.simulcastStream[2].minBitrate = 2000;
227 codec_.simulcastStream[2].targetBitrate = 3000; 245 codec_.simulcastStream[2].targetBitrate = 3000;
228 codec_.simulcastStream[2].maxBitrate = 4000; 246 codec_.simulcastStream[2].maxBitrate = 4000;
229 CreateAllocator(); 247 CreateAllocator();
230 248
231 uint32_t preferred_bitrate; 249 uint32_t preferred_bitrate_kbps;
232 preferred_bitrate = codec_.simulcastStream[0].targetBitrate; 250 preferred_bitrate_kbps = codec_.simulcastStream[0].targetBitrate;
233 preferred_bitrate += codec_.simulcastStream[1].targetBitrate; 251 preferred_bitrate_kbps += codec_.simulcastStream[1].targetBitrate;
234 preferred_bitrate += codec_.simulcastStream[2].maxBitrate; 252 preferred_bitrate_kbps += codec_.simulcastStream[2].maxBitrate;
235 253
236 EXPECT_EQ(preferred_bitrate, allocator_->GetPreferedBitrate()); 254 EXPECT_EQ(preferred_bitrate_kbps * 1000,
255 allocator_->GetPreferredBitrateBps(codec_.maxFramerate));
237 } 256 }
238 257
239 } // namespace webrtc 258 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698