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

Side by Side Diff: webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc

Issue 3007683002: Let VideoEncoderSoftwareFallbackWrapper own the wrapped encoder (Closed)
Patch Set: Created 3 years, 3 months 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) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 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
(...skipping 21 matching lines...) Expand all
32 const int kDefaultMinPixelsPerFrame = 320 * 180; 32 const int kDefaultMinPixelsPerFrame = 320 * 180;
33 } // namespace 33 } // namespace
34 34
35 class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test { 35 class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
36 protected: 36 protected:
37 VideoEncoderSoftwareFallbackWrapperTest() 37 VideoEncoderSoftwareFallbackWrapperTest()
38 : VideoEncoderSoftwareFallbackWrapperTest("") {} 38 : VideoEncoderSoftwareFallbackWrapperTest("") {}
39 explicit VideoEncoderSoftwareFallbackWrapperTest( 39 explicit VideoEncoderSoftwareFallbackWrapperTest(
40 const std::string& field_trials) 40 const std::string& field_trials)
41 : override_field_trials_(field_trials), 41 : override_field_trials_(field_trials),
42 fallback_wrapper_(cricket::VideoCodec("VP8"), &fake_encoder_) {} 42 fake_encoder_(new CountingFakeEncoder()),
43 fallback_wrapper_(cricket::VideoCodec("VP8"),
44 std::unique_ptr<VideoEncoder>(fake_encoder_)) {}
43 45
44 class CountingFakeEncoder : public VideoEncoder { 46 class CountingFakeEncoder : public VideoEncoder {
45 public: 47 public:
46 int32_t InitEncode(const VideoCodec* codec_settings, 48 int32_t InitEncode(const VideoCodec* codec_settings,
47 int32_t number_of_cores, 49 int32_t number_of_cores,
48 size_t max_payload_size) override { 50 size_t max_payload_size) override {
49 ++init_encode_count_; 51 ++init_encode_count_;
50 return init_encode_return_code_; 52 return init_encode_return_code_;
51 } 53 }
52 int32_t Encode(const VideoFrame& frame, 54 int32_t Encode(const VideoFrame& frame,
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 void UtilizeFallbackEncoder(); 129 void UtilizeFallbackEncoder();
128 void FallbackFromEncodeRequest(); 130 void FallbackFromEncodeRequest();
129 void EncodeFrame(); 131 void EncodeFrame();
130 void EncodeFrame(int expected_ret); 132 void EncodeFrame(int expected_ret);
131 void CheckLastEncoderName(const char* expected_name) { 133 void CheckLastEncoderName(const char* expected_name) {
132 EXPECT_STREQ(expected_name, callback_.last_codec_name_.c_str()); 134 EXPECT_STREQ(expected_name, callback_.last_codec_name_.c_str());
133 } 135 }
134 136
135 test::ScopedFieldTrials override_field_trials_; 137 test::ScopedFieldTrials override_field_trials_;
136 FakeEncodedImageCallback callback_; 138 FakeEncodedImageCallback callback_;
137 CountingFakeEncoder fake_encoder_; 139 // |fake_encoder_| is owned and released by |fallback_wrapper_|.
140 CountingFakeEncoder* fake_encoder_;
138 VideoEncoderSoftwareFallbackWrapper fallback_wrapper_; 141 VideoEncoderSoftwareFallbackWrapper fallback_wrapper_;
139 VideoCodec codec_ = {}; 142 VideoCodec codec_ = {};
140 std::unique_ptr<VideoFrame> frame_; 143 std::unique_ptr<VideoFrame> frame_;
141 std::unique_ptr<SimulcastRateAllocator> rate_allocator_; 144 std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
142 }; 145 };
143 146
144 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame() { 147 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame() {
145 EncodeFrame(WEBRTC_VIDEO_CODEC_OK); 148 EncodeFrame(WEBRTC_VIDEO_CODEC_OK);
146 } 149 }
147 150
148 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame(int expected_ret) { 151 void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame(int expected_ret) {
149 rtc::scoped_refptr<I420Buffer> buffer = 152 rtc::scoped_refptr<I420Buffer> buffer =
150 I420Buffer::Create(codec_.width, codec_.height); 153 I420Buffer::Create(codec_.width, codec_.height);
151 I420Buffer::SetBlack(buffer); 154 I420Buffer::SetBlack(buffer);
152 std::vector<FrameType> types(1, kVideoFrameKey); 155 std::vector<FrameType> types(1, kVideoFrameKey);
153 156
154 frame_.reset(new VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0)); 157 frame_.reset(new VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0));
155 EXPECT_EQ(expected_ret, fallback_wrapper_.Encode(*frame_, nullptr, &types)); 158 EXPECT_EQ(expected_ret, fallback_wrapper_.Encode(*frame_, nullptr, &types));
156 } 159 }
157 160
158 void VideoEncoderSoftwareFallbackWrapperTest::UtilizeFallbackEncoder() { 161 void VideoEncoderSoftwareFallbackWrapperTest::UtilizeFallbackEncoder() {
159 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); 162 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
160 EXPECT_EQ(&callback_, fake_encoder_.encode_complete_callback_); 163 EXPECT_EQ(&callback_, fake_encoder_->encode_complete_callback_);
161 164
162 // Register with failing fake encoder. Should succeed with VP8 fallback. 165 // Register with failing fake encoder. Should succeed with VP8 fallback.
163 codec_.codecType = kVideoCodecVP8; 166 codec_.codecType = kVideoCodecVP8;
164 codec_.maxFramerate = kFramerate; 167 codec_.maxFramerate = kFramerate;
165 codec_.width = kWidth; 168 codec_.width = kWidth;
166 codec_.height = kHeight; 169 codec_.height = kHeight;
167 codec_.VP8()->numberOfTemporalLayers = 1; 170 codec_.VP8()->numberOfTemporalLayers = 1;
168 std::unique_ptr<TemporalLayersFactory> tl_factory( 171 std::unique_ptr<TemporalLayersFactory> tl_factory(
169 new TemporalLayersFactory()); 172 new TemporalLayersFactory());
170 codec_.VP8()->tl_factory = tl_factory.get(); 173 codec_.VP8()->tl_factory = tl_factory.get();
171 rate_allocator_.reset( 174 rate_allocator_.reset(
172 new SimulcastRateAllocator(codec_, std::move(tl_factory))); 175 new SimulcastRateAllocator(codec_, std::move(tl_factory)));
173 176
174 fake_encoder_.init_encode_return_code_ = WEBRTC_VIDEO_CODEC_ERROR; 177 fake_encoder_->init_encode_return_code_ = WEBRTC_VIDEO_CODEC_ERROR;
175 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 178 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
176 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); 179 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
177 EXPECT_EQ( 180 EXPECT_EQ(
178 WEBRTC_VIDEO_CODEC_OK, 181 WEBRTC_VIDEO_CODEC_OK,
179 fallback_wrapper_.SetRateAllocation( 182 fallback_wrapper_.SetRateAllocation(
180 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate)); 183 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate));
181 184
182 int callback_count = callback_.callback_count_; 185 int callback_count = callback_.callback_count_;
183 int encode_count = fake_encoder_.encode_count_; 186 int encode_count = fake_encoder_->encode_count_;
184 EncodeFrame(); 187 EncodeFrame();
185 EXPECT_EQ(encode_count, fake_encoder_.encode_count_); 188 EXPECT_EQ(encode_count, fake_encoder_->encode_count_);
186 EXPECT_EQ(callback_count + 1, callback_.callback_count_); 189 EXPECT_EQ(callback_count + 1, callback_.callback_count_);
187 } 190 }
188 191
189 void VideoEncoderSoftwareFallbackWrapperTest::FallbackFromEncodeRequest() { 192 void VideoEncoderSoftwareFallbackWrapperTest::FallbackFromEncodeRequest() {
190 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); 193 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
191 codec_.codecType = kVideoCodecVP8; 194 codec_.codecType = kVideoCodecVP8;
192 codec_.maxFramerate = kFramerate; 195 codec_.maxFramerate = kFramerate;
193 codec_.width = kWidth; 196 codec_.width = kWidth;
194 codec_.height = kHeight; 197 codec_.height = kHeight;
195 codec_.VP8()->numberOfTemporalLayers = 1; 198 codec_.VP8()->numberOfTemporalLayers = 1;
196 std::unique_ptr<TemporalLayersFactory> tl_factory( 199 std::unique_ptr<TemporalLayersFactory> tl_factory(
197 new TemporalLayersFactory()); 200 new TemporalLayersFactory());
198 codec_.VP8()->tl_factory = tl_factory.get(); 201 codec_.VP8()->tl_factory = tl_factory.get();
199 rate_allocator_.reset( 202 rate_allocator_.reset(
200 new SimulcastRateAllocator(codec_, std::move(tl_factory))); 203 new SimulcastRateAllocator(codec_, std::move(tl_factory)));
201 fallback_wrapper_.InitEncode(&codec_, 2, kMaxPayloadSize); 204 fallback_wrapper_.InitEncode(&codec_, 2, kMaxPayloadSize);
202 EXPECT_EQ( 205 EXPECT_EQ(
203 WEBRTC_VIDEO_CODEC_OK, 206 WEBRTC_VIDEO_CODEC_OK,
204 fallback_wrapper_.SetRateAllocation( 207 fallback_wrapper_.SetRateAllocation(
205 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate)); 208 rate_allocator_->GetAllocation(300000, kFramerate), kFramerate));
206 EXPECT_EQ(1, fake_encoder_.init_encode_count_); 209 EXPECT_EQ(1, fake_encoder_->init_encode_count_);
207 210
208 // Have the non-fallback encoder request a software fallback. 211 // Have the non-fallback encoder request a software fallback.
209 fake_encoder_.encode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE; 212 fake_encoder_->encode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
210 int callback_count = callback_.callback_count_; 213 int callback_count = callback_.callback_count_;
211 int encode_count = fake_encoder_.encode_count_; 214 int encode_count = fake_encoder_->encode_count_;
212 EncodeFrame(); 215 EncodeFrame();
213 // Single encode request, which returned failure. 216 // Single encode request, which returned failure.
214 EXPECT_EQ(encode_count + 1, fake_encoder_.encode_count_); 217 EXPECT_EQ(encode_count + 1, fake_encoder_->encode_count_);
215 EXPECT_EQ(callback_count + 1, callback_.callback_count_); 218 EXPECT_EQ(callback_count + 1, callback_.callback_count_);
216 } 219 }
217 220
218 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, InitializesEncoder) { 221 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, InitializesEncoder) {
219 VideoCodec codec = {}; 222 VideoCodec codec = {};
220 fallback_wrapper_.InitEncode(&codec, 2, kMaxPayloadSize); 223 fallback_wrapper_.InitEncode(&codec, 2, kMaxPayloadSize);
221 EXPECT_EQ(1, fake_encoder_.init_encode_count_); 224 EXPECT_EQ(1, fake_encoder_->init_encode_count_);
222 } 225 }
223 226
224 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, EncodeRequestsFallback) { 227 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, EncodeRequestsFallback) {
225 FallbackFromEncodeRequest(); 228 FallbackFromEncodeRequest();
226 // After fallback, further encodes shouldn't hit the fake encoder. 229 // After fallback, further encodes shouldn't hit the fake encoder.
227 int encode_count = fake_encoder_.encode_count_; 230 int encode_count = fake_encoder_->encode_count_;
228 EncodeFrame(); 231 EncodeFrame();
229 EXPECT_EQ(encode_count, fake_encoder_.encode_count_); 232 EXPECT_EQ(encode_count, fake_encoder_->encode_count_);
230 } 233 }
231 234
232 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, CanUtilizeFallbackEncoder) { 235 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, CanUtilizeFallbackEncoder) {
233 UtilizeFallbackEncoder(); 236 UtilizeFallbackEncoder();
234 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 237 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
235 } 238 }
236 239
237 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, 240 TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
238 InternalEncoderReleasedDuringFallback) { 241 InternalEncoderReleasedDuringFallback) {
239 EXPECT_EQ(0, fake_encoder_.release_count_); 242 EXPECT_EQ(0, fake_encoder_->release_count_);
240 UtilizeFallbackEncoder(); 243 UtilizeFallbackEncoder();
241 EXPECT_EQ(1, fake_encoder_.release_count_); 244 EXPECT_EQ(1, fake_encoder_->release_count_);
242 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 245 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
243 // No extra release when the fallback is released. 246 // No extra release when the fallback is released.
244 EXPECT_EQ(1, fake_encoder_.release_count_); 247 EXPECT_EQ(1, fake_encoder_->release_count_);
245 } 248 }
246 249
247 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, 250 TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
248 InternalEncoderNotEncodingDuringFallback) { 251 InternalEncoderNotEncodingDuringFallback) {
249 UtilizeFallbackEncoder(); 252 UtilizeFallbackEncoder();
250 int encode_count = fake_encoder_.encode_count_; 253 int encode_count = fake_encoder_->encode_count_;
251 EncodeFrame(); 254 EncodeFrame();
252 EXPECT_EQ(encode_count, fake_encoder_.encode_count_); 255 EXPECT_EQ(encode_count, fake_encoder_->encode_count_);
253 256
254 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 257 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
255 } 258 }
256 259
257 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, 260 TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
258 CanRegisterCallbackWhileUsingFallbackEncoder) { 261 CanRegisterCallbackWhileUsingFallbackEncoder) {
259 UtilizeFallbackEncoder(); 262 UtilizeFallbackEncoder();
260 // Registering an encode-complete callback should still work when fallback 263 // Registering an encode-complete callback should still work when fallback
261 // encoder is being used. 264 // encoder is being used.
262 FakeEncodedImageCallback callback2; 265 FakeEncodedImageCallback callback2;
263 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback2); 266 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback2);
264 EXPECT_EQ(&callback2, fake_encoder_.encode_complete_callback_); 267 EXPECT_EQ(&callback2, fake_encoder_->encode_complete_callback_);
265 268
266 // Encoding a frame using the fallback should arrive at the new callback. 269 // Encoding a frame using the fallback should arrive at the new callback.
267 std::vector<FrameType> types(1, kVideoFrameKey); 270 std::vector<FrameType> types(1, kVideoFrameKey);
268 frame_->set_timestamp(frame_->timestamp() + 1000); 271 frame_->set_timestamp(frame_->timestamp() + 1000);
269 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 272 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
270 fallback_wrapper_.Encode(*frame_, nullptr, &types)); 273 fallback_wrapper_.Encode(*frame_, nullptr, &types));
271 274
272 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 275 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
273 } 276 }
274 277
275 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, 278 TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
276 SetChannelParametersForwardedDuringFallback) { 279 SetChannelParametersForwardedDuringFallback) {
277 UtilizeFallbackEncoder(); 280 UtilizeFallbackEncoder();
278 EXPECT_EQ(0, fake_encoder_.set_channel_parameters_count_); 281 EXPECT_EQ(0, fake_encoder_->set_channel_parameters_count_);
279 fallback_wrapper_.SetChannelParameters(1, 1); 282 fallback_wrapper_.SetChannelParameters(1, 1);
280 EXPECT_EQ(1, fake_encoder_.set_channel_parameters_count_); 283 EXPECT_EQ(1, fake_encoder_->set_channel_parameters_count_);
281 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 284 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
282 } 285 }
283 286
284 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, 287 TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
285 SetRatesForwardedDuringFallback) { 288 SetRatesForwardedDuringFallback) {
286 UtilizeFallbackEncoder(); 289 UtilizeFallbackEncoder();
287 EXPECT_EQ(1, fake_encoder_.set_rates_count_); 290 EXPECT_EQ(1, fake_encoder_->set_rates_count_);
288 fallback_wrapper_.SetRateAllocation(BitrateAllocation(), 1); 291 fallback_wrapper_.SetRateAllocation(BitrateAllocation(), 1);
289 EXPECT_EQ(2, fake_encoder_.set_rates_count_); 292 EXPECT_EQ(2, fake_encoder_->set_rates_count_);
290 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 293 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
291 } 294 }
292 295
293 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, 296 TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
294 SupportsNativeHandleForwardedWithoutFallback) { 297 SupportsNativeHandleForwardedWithoutFallback) {
295 fallback_wrapper_.SupportsNativeHandle(); 298 fallback_wrapper_.SupportsNativeHandle();
296 EXPECT_EQ(1, fake_encoder_.supports_native_handle_count_); 299 EXPECT_EQ(1, fake_encoder_->supports_native_handle_count_);
297 } 300 }
298 301
299 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, 302 TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
300 SupportsNativeHandleNotForwardedDuringFallback) { 303 SupportsNativeHandleNotForwardedDuringFallback) {
301 UtilizeFallbackEncoder(); 304 UtilizeFallbackEncoder();
302 fallback_wrapper_.SupportsNativeHandle(); 305 fallback_wrapper_.SupportsNativeHandle();
303 EXPECT_EQ(0, fake_encoder_.supports_native_handle_count_); 306 EXPECT_EQ(0, fake_encoder_->supports_native_handle_count_);
304 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 307 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
305 } 308 }
306 309
307 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, ReportsImplementationName) { 310 TEST_F(VideoEncoderSoftwareFallbackWrapperTest, ReportsImplementationName) {
308 codec_.width = kWidth; 311 codec_.width = kWidth;
309 codec_.height = kHeight; 312 codec_.height = kHeight;
310 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); 313 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
311 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize); 314 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize);
312 EncodeFrame(); 315 EncodeFrame();
313 CheckLastEncoderName("fake-encoder"); 316 CheckLastEncoderName("fake-encoder");
(...skipping 22 matching lines...) Expand all
336 : VideoEncoderSoftwareFallbackWrapperTest(field_trials) {} 339 : VideoEncoderSoftwareFallbackWrapperTest(field_trials) {}
337 340
338 ~ForcedFallbackTest() override {} 341 ~ForcedFallbackTest() override {}
339 342
340 protected: 343 protected:
341 void SetUp() override { 344 void SetUp() override {
342 clock_.SetTimeMicros(1234); 345 clock_.SetTimeMicros(1234);
343 ConfigureVp8Codec(); 346 ConfigureVp8Codec();
344 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.InitEncode( 347 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.InitEncode(
345 &codec_, kNumCores, kMaxPayloadSize)); 348 &codec_, kNumCores, kMaxPayloadSize));
346 EXPECT_EQ(1, fake_encoder_.init_encode_count_); 349 EXPECT_EQ(1, fake_encoder_->init_encode_count_);
347 } 350 }
348 351
349 void TearDown() override { 352 void TearDown() override {
350 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release()); 353 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
351 } 354 }
352 355
353 void ConfigureVp8Codec() { 356 void ConfigureVp8Codec() {
354 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_); 357 fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
355 std::unique_ptr<TemporalLayersFactory> tl_factory( 358 std::unique_ptr<TemporalLayersFactory> tl_factory(
356 new TemporalLayersFactory()); 359 new TemporalLayersFactory());
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 // Duration passed, expect fallback. 505 // Duration passed, expect fallback.
503 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); 506 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
504 EncodeFrameAndVerifyLastName("libvpx"); 507 EncodeFrameAndVerifyLastName("libvpx");
505 // Bitrate at high threshold, expect fallback ended. 508 // Bitrate at high threshold, expect fallback ended.
506 SetRateAllocation(kHighKbps); 509 SetRateAllocation(kHighKbps);
507 EncodeFrameAndVerifyLastName("fake-encoder"); 510 EncodeFrameAndVerifyLastName("fake-encoder");
508 } 511 }
509 } 512 }
510 513
511 TEST_F(ForcedFallbackTestEnabled, DropsFirstNonNativeFrameAfterFallbackEnds) { 514 TEST_F(ForcedFallbackTestEnabled, DropsFirstNonNativeFrameAfterFallbackEnds) {
512 fake_encoder_.supports_native_handle_ = true; 515 fake_encoder_->supports_native_handle_ = true;
513 516
514 // Bitrate at low threshold. 517 // Bitrate at low threshold.
515 SetRateAllocation(kLowKbps); 518 SetRateAllocation(kLowKbps);
516 EncodeFrameAndVerifyLastName("fake-encoder"); 519 EncodeFrameAndVerifyLastName("fake-encoder");
517 // Duration passed, expect fallback. 520 // Duration passed, expect fallback.
518 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); 521 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
519 EncodeFrameAndVerifyLastName("libvpx"); 522 EncodeFrameAndVerifyLastName("libvpx");
520 // Bitrate at high threshold, fallback should be ended but first non-native 523 // Bitrate at high threshold, fallback should be ended but first non-native
521 // frame dropped (i.e. frame not encoded). 524 // frame dropped (i.e. frame not encoded).
522 SetRateAllocation(kHighKbps); 525 SetRateAllocation(kHighKbps);
523 EncodeFrameAndVerifyLastName("libvpx", WEBRTC_VIDEO_CODEC_ERROR); 526 EncodeFrameAndVerifyLastName("libvpx", WEBRTC_VIDEO_CODEC_ERROR);
524 // Next frame should be encoded. 527 // Next frame should be encoded.
525 EncodeFrameAndVerifyLastName("fake-encoder"); 528 EncodeFrameAndVerifyLastName("fake-encoder");
526 } 529 }
527 530
528 TEST_F(ForcedFallbackTestEnabled, FallbackIsKeptWhenInitEncodeIsCalled) { 531 TEST_F(ForcedFallbackTestEnabled, FallbackIsKeptWhenInitEncodeIsCalled) {
529 // Bitrate below low threshold. 532 // Bitrate below low threshold.
530 SetRateAllocation(kLowKbps - 1); 533 SetRateAllocation(kLowKbps - 1);
531 EncodeFrameAndVerifyLastName("fake-encoder"); 534 EncodeFrameAndVerifyLastName("fake-encoder");
532 // Duration passed, expect fallback. 535 // Duration passed, expect fallback.
533 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); 536 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
534 EncodeFrameAndVerifyLastName("libvpx"); 537 EncodeFrameAndVerifyLastName("libvpx");
535 538
536 // Re-initialize encoder, still expect fallback. 539 // Re-initialize encoder, still expect fallback.
537 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 540 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
538 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); 541 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
539 EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change. 542 EXPECT_EQ(1, fake_encoder_->init_encode_count_); // No change.
540 SetRateAllocation(kLowKbps); 543 SetRateAllocation(kLowKbps);
541 EncodeFrameAndVerifyLastName("libvpx"); 544 EncodeFrameAndVerifyLastName("libvpx");
542 } 545 }
543 546
544 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedWhenResolutionIsTooLarge) { 547 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedWhenResolutionIsTooLarge) {
545 // Bitrate below low threshold. 548 // Bitrate below low threshold.
546 SetRateAllocation(kLowKbps - 1); 549 SetRateAllocation(kLowKbps - 1);
547 EncodeFrameAndVerifyLastName("fake-encoder"); 550 EncodeFrameAndVerifyLastName("fake-encoder");
548 // Duration passed, expect fallback. 551 // Duration passed, expect fallback.
549 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); 552 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
550 EncodeFrameAndVerifyLastName("libvpx"); 553 EncodeFrameAndVerifyLastName("libvpx");
551 554
552 // Re-initialize encoder with a larger resolution, expect no fallback. 555 // Re-initialize encoder with a larger resolution, expect no fallback.
553 codec_.width += 1; 556 codec_.width += 1;
554 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 557 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
555 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); 558 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
556 EXPECT_EQ(2, fake_encoder_.init_encode_count_); 559 EXPECT_EQ(2, fake_encoder_->init_encode_count_);
557 SetRateAllocation(kLowKbps); 560 SetRateAllocation(kLowKbps);
558 EncodeFrameAndVerifyLastName("fake-encoder"); 561 EncodeFrameAndVerifyLastName("fake-encoder");
559 } 562 }
560 563
561 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedForNonValidSettings) { 564 TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedForNonValidSettings) {
562 // Bitrate below low threshold. 565 // Bitrate below low threshold.
563 SetRateAllocation(kLowKbps - 1); 566 SetRateAllocation(kLowKbps - 1);
564 EncodeFrameAndVerifyLastName("fake-encoder"); 567 EncodeFrameAndVerifyLastName("fake-encoder");
565 // Duration passed, expect fallback. 568 // Duration passed, expect fallback.
566 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); 569 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
567 EncodeFrameAndVerifyLastName("libvpx"); 570 EncodeFrameAndVerifyLastName("libvpx");
568 571
569 // Re-initialize encoder with invalid setting, expect no fallback. 572 // Re-initialize encoder with invalid setting, expect no fallback.
570 codec_.VP8()->numberOfTemporalLayers = 2; 573 codec_.VP8()->numberOfTemporalLayers = 2;
571 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 574 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
572 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); 575 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
573 EXPECT_EQ(2, fake_encoder_.init_encode_count_); 576 EXPECT_EQ(2, fake_encoder_->init_encode_count_);
574 SetRateAllocation(kLowKbps); 577 SetRateAllocation(kLowKbps);
575 EncodeFrameAndVerifyLastName("fake-encoder"); 578 EncodeFrameAndVerifyLastName("fake-encoder");
576 579
577 // Re-initialize encoder with valid setting but fallback disabled from now on. 580 // Re-initialize encoder with valid setting but fallback disabled from now on.
578 codec_.VP8()->numberOfTemporalLayers = 1; 581 codec_.VP8()->numberOfTemporalLayers = 1;
579 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 582 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
580 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); 583 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
581 EXPECT_EQ(3, fake_encoder_.init_encode_count_); 584 EXPECT_EQ(3, fake_encoder_->init_encode_count_);
582 // Bitrate at low threshold. 585 // Bitrate at low threshold.
583 SetRateAllocation(kLowKbps); 586 SetRateAllocation(kLowKbps);
584 EncodeFrameAndVerifyLastName("fake-encoder"); 587 EncodeFrameAndVerifyLastName("fake-encoder");
585 // Duration passed, expect no fallback. 588 // Duration passed, expect no fallback.
586 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); 589 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
587 EncodeFrameAndVerifyLastName("fake-encoder"); 590 EncodeFrameAndVerifyLastName("fake-encoder");
588 } 591 }
589 592
590 TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithoutFallback) { 593 TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithoutFallback) {
591 // Bitrate at low threshold. 594 // Bitrate at low threshold.
(...skipping 23 matching lines...) Expand all
615 SetRateAllocation(kLowKbps); 618 SetRateAllocation(kLowKbps);
616 EncodeFrameAndVerifyLastName("fake-encoder"); 619 EncodeFrameAndVerifyLastName("fake-encoder");
617 // Duration passed, expect fallback. 620 // Duration passed, expect fallback.
618 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs)); 621 clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
619 EncodeFrameAndVerifyLastName("libvpx"); 622 EncodeFrameAndVerifyLastName("libvpx");
620 623
621 // Re-initialize encoder with a resolution less than |kMinPixelsStop|. 624 // Re-initialize encoder with a resolution less than |kMinPixelsStop|.
622 codec_.height = kMinPixelsStop / codec_.width - 1; 625 codec_.height = kMinPixelsStop / codec_.width - 1;
623 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 626 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
624 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); 627 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
625 EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change 628 EXPECT_EQ(1, fake_encoder_->init_encode_count_); // No change
626 SetRateAllocation(kHighKbps - 1); 629 SetRateAllocation(kHighKbps - 1);
627 EncodeFrameAndVerifyLastName("libvpx"); 630 EncodeFrameAndVerifyLastName("libvpx");
628 // Bitrate at high threshold but resolution too small for fallback to end. 631 // Bitrate at high threshold but resolution too small for fallback to end.
629 SetRateAllocation(kHighKbps); 632 SetRateAllocation(kHighKbps);
630 EncodeFrameAndVerifyLastName("libvpx"); 633 EncodeFrameAndVerifyLastName("libvpx");
631 634
632 // Re-initialize encoder with a resolution equal to |kMinPixelsStop|. 635 // Re-initialize encoder with a resolution equal to |kMinPixelsStop|.
633 codec_.height++; 636 codec_.height++;
634 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, 637 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
635 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize)); 638 fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
636 EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change 639 EXPECT_EQ(1, fake_encoder_->init_encode_count_); // No change
637 SetRateAllocation(kHighKbps - 1); 640 SetRateAllocation(kHighKbps - 1);
638 EncodeFrameAndVerifyLastName("libvpx"); 641 EncodeFrameAndVerifyLastName("libvpx");
639 // Bitrate at high threshold and resolution large enough for fallback to end. 642 // Bitrate at high threshold and resolution large enough for fallback to end.
640 SetRateAllocation(kHighKbps); 643 SetRateAllocation(kHighKbps);
641 EncodeFrameAndVerifyLastName("fake-encoder"); 644 EncodeFrameAndVerifyLastName("fake-encoder");
642 } 645 }
643 646
644 } // namespace webrtc 647 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698