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

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

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

Powered by Google App Engine
This is Rietveld 408576698