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

Side by Side Diff: webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_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) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 } 88 }
89 89
90 TEST_F(TestSimulcastEncoderAdapter, TestSaptioTemporalLayers333PatternEncoder) { 90 TEST_F(TestSimulcastEncoderAdapter, TestSaptioTemporalLayers333PatternEncoder) {
91 TestVp8Simulcast::TestSaptioTemporalLayers333PatternEncoder(); 91 TestVp8Simulcast::TestSaptioTemporalLayers333PatternEncoder();
92 } 92 }
93 93
94 TEST_F(TestSimulcastEncoderAdapter, TestSpatioTemporalLayers321PatternEncoder) { 94 TEST_F(TestSimulcastEncoderAdapter, TestSpatioTemporalLayers321PatternEncoder) {
95 TestVp8Simulcast::TestSpatioTemporalLayers321PatternEncoder(); 95 TestVp8Simulcast::TestSpatioTemporalLayers321PatternEncoder();
96 } 96 }
97 97
98 // TODO(ronghuawu): Enable this test when SkipEncodingUnusedStreams option is
99 // implemented for SimulcastEncoderAdapter.
100 TEST_F(TestSimulcastEncoderAdapter, DISABLED_TestSkipEncodingUnusedStreams) {
101 TestVp8Simulcast::TestSkipEncodingUnusedStreams();
102 }
103
98 TEST_F(TestSimulcastEncoderAdapter, DISABLED_TestRPSIEncoder) { 104 TEST_F(TestSimulcastEncoderAdapter, DISABLED_TestRPSIEncoder) {
99 TestVp8Simulcast::TestRPSIEncoder(); 105 TestVp8Simulcast::TestRPSIEncoder();
100 } 106 }
101 107
102 class MockVideoEncoder : public VideoEncoder { 108 class MockVideoEncoder : public VideoEncoder {
103 public: 109 public:
104 // TODO(nisse): Valid overrides commented out, because the gmock 110 // TODO(nisse): Valid overrides commented out, because the gmock
105 // methods don't use any override declarations, and we want to avoid 111 // methods don't use any override declarations, and we want to avoid
106 // warnings from -Winconsistent-missing-override. See 112 // warnings from -Winconsistent-missing-override. See
107 // http://crbug.com/428099. 113 // http://crbug.com/428099.
(...skipping 11 matching lines...) Expand all
119 const std::vector<FrameType>* frame_types) /* override */); 125 const std::vector<FrameType>* frame_types) /* override */);
120 126
121 int32_t RegisterEncodeCompleteCallback( 127 int32_t RegisterEncodeCompleteCallback(
122 EncodedImageCallback* callback) /* override */ { 128 EncodedImageCallback* callback) /* override */ {
123 callback_ = callback; 129 callback_ = callback;
124 return 0; 130 return 0;
125 } 131 }
126 132
127 int32_t Release() /* override */ { return 0; } 133 int32_t Release() /* override */ { return 0; }
128 134
129 int32_t SetRateAllocation(const BitrateAllocation& bitrate_allocation, 135 int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) /* override */ {
130 uint32_t framerate) { 136 last_set_bitrate_ = static_cast<int32_t>(newBitRate);
131 last_set_bitrate_ = bitrate_allocation;
132 return 0; 137 return 0;
133 } 138 }
134 139
135 MOCK_METHOD2(SetChannelParameters, int32_t(uint32_t packetLoss, int64_t rtt)); 140 MOCK_METHOD2(SetChannelParameters, int32_t(uint32_t packetLoss, int64_t rtt));
136 141
137 bool SupportsNativeHandle() const /* override */ { 142 bool SupportsNativeHandle() const /* override */ {
138 return supports_native_handle_; 143 return supports_native_handle_;
139 } 144 }
140 145
141 virtual ~MockVideoEncoder() {} 146 virtual ~MockVideoEncoder() {}
142 147
143 const VideoCodec& codec() const { return codec_; } 148 const VideoCodec& codec() const { return codec_; }
144 149
145 void SendEncodedImage(int width, int height) { 150 void SendEncodedImage(int width, int height) {
146 // Sends a fake image of the given width/height. 151 // Sends a fake image of the given width/height.
147 EncodedImage image; 152 EncodedImage image;
148 image._encodedWidth = width; 153 image._encodedWidth = width;
149 image._encodedHeight = height; 154 image._encodedHeight = height;
150 CodecSpecificInfo codec_specific_info; 155 CodecSpecificInfo codec_specific_info;
151 memset(&codec_specific_info, 0, sizeof(codec_specific_info)); 156 memset(&codec_specific_info, 0, sizeof(codec_specific_info));
152 callback_->OnEncodedImage(image, &codec_specific_info, NULL); 157 callback_->OnEncodedImage(image, &codec_specific_info, NULL);
153 } 158 }
154 159
155 void set_supports_native_handle(bool enabled) { 160 void set_supports_native_handle(bool enabled) {
156 supports_native_handle_ = enabled; 161 supports_native_handle_ = enabled;
157 } 162 }
158 BitrateAllocation last_set_bitrate() const { return last_set_bitrate_; } 163 int32_t last_set_bitrate() const { return last_set_bitrate_; }
159 164
160 MOCK_CONST_METHOD0(ImplementationName, const char*()); 165 MOCK_CONST_METHOD0(ImplementationName, const char*());
161 166
162 private: 167 private:
163 bool supports_native_handle_ = false; 168 bool supports_native_handle_ = false;
164 BitrateAllocation last_set_bitrate_; 169 int32_t last_set_bitrate_ = -1;
165 170
166 VideoCodec codec_; 171 VideoCodec codec_;
167 EncodedImageCallback* callback_; 172 EncodedImageCallback* callback_;
168 }; 173 };
169 174
170 class MockVideoEncoderFactory : public VideoEncoderFactory { 175 class MockVideoEncoderFactory : public VideoEncoderFactory {
171 public: 176 public:
172 VideoEncoder* Create() override { 177 VideoEncoder* Create() override {
173 MockVideoEncoder* encoder = new 178 MockVideoEncoder* encoder = new
174 ::testing::NiceMock<MockVideoEncoder>(); 179 ::testing::NiceMock<MockVideoEncoder>();
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 266 }
262 *out_width = last_encoded_image_width_; 267 *out_width = last_encoded_image_width_;
263 *out_height = last_encoded_image_height_; 268 *out_height = last_encoded_image_height_;
264 *out_simulcast_index = last_encoded_image_simulcast_index_; 269 *out_simulcast_index = last_encoded_image_simulcast_index_;
265 return true; 270 return true;
266 } 271 }
267 272
268 void SetupCodec() { 273 void SetupCodec() {
269 TestVp8Simulcast::DefaultSettings( 274 TestVp8Simulcast::DefaultSettings(
270 &codec_, static_cast<const int*>(kTestTemporalLayerProfile)); 275 &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
271 rate_allocator_.reset(new SimulcastRateAllocator(codec_, nullptr));
272 tl_factory_.SetListener(rate_allocator_.get());
273 codec_.codecSpecific.VP8.tl_factory = &tl_factory_;
274 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 276 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
275 adapter_->RegisterEncodeCompleteCallback(this); 277 adapter_->RegisterEncodeCompleteCallback(this);
276 } 278 }
277 279
278 void VerifyCodec(const VideoCodec& ref, int stream_index) { 280 void VerifyCodec(const VideoCodec& ref, int stream_index) {
279 const VideoCodec& target = 281 const VideoCodec& target =
280 helper_->factory()->encoders()[stream_index]->codec(); 282 helper_->factory()->encoders()[stream_index]->codec();
281 EXPECT_EQ(ref.codecType, target.codecType); 283 EXPECT_EQ(ref.codecType, target.codecType);
282 EXPECT_EQ(0, strcmp(ref.plName, target.plName)); 284 EXPECT_EQ(0, strcmp(ref.plName, target.plName));
283 EXPECT_EQ(ref.plType, target.plType); 285 EXPECT_EQ(ref.plType, target.plType);
284 EXPECT_EQ(ref.width, target.width); 286 EXPECT_EQ(ref.width, target.width);
285 EXPECT_EQ(ref.height, target.height); 287 EXPECT_EQ(ref.height, target.height);
286 EXPECT_EQ(ref.startBitrate, target.startBitrate); 288 EXPECT_EQ(ref.startBitrate, target.startBitrate);
287 EXPECT_EQ(ref.maxBitrate, target.maxBitrate); 289 EXPECT_EQ(ref.maxBitrate, target.maxBitrate);
288 EXPECT_EQ(ref.minBitrate, target.minBitrate); 290 EXPECT_EQ(ref.minBitrate, target.minBitrate);
289 EXPECT_EQ(ref.maxFramerate, target.maxFramerate); 291 EXPECT_EQ(ref.maxFramerate, target.maxFramerate);
290 EXPECT_EQ(ref.VP8().pictureLossIndicationOn, 292 EXPECT_EQ(ref.VP8().pictureLossIndicationOn,
291 target.VP8().pictureLossIndicationOn); 293 target.VP8().pictureLossIndicationOn);
292 EXPECT_EQ(ref.VP8().feedbackModeOn, target.VP8().feedbackModeOn); 294 EXPECT_EQ(ref.VP8().feedbackModeOn, target.VP8().feedbackModeOn);
293 EXPECT_EQ(ref.VP8().complexity, target.VP8().complexity); 295 EXPECT_EQ(ref.VP8().complexity, target.VP8().complexity);
294 EXPECT_EQ(ref.VP8().resilience, target.VP8().resilience); 296 EXPECT_EQ(ref.VP8().resilience, target.VP8().resilience);
295 EXPECT_EQ(ref.VP8().numberOfTemporalLayers, 297 EXPECT_EQ(ref.VP8().numberOfTemporalLayers,
296 target.VP8().numberOfTemporalLayers); 298 target.VP8().numberOfTemporalLayers);
297 EXPECT_EQ(ref.VP8().denoisingOn, target.VP8().denoisingOn); 299 EXPECT_EQ(ref.VP8().denoisingOn, target.VP8().denoisingOn);
298 EXPECT_EQ(ref.VP8().errorConcealmentOn, target.VP8().errorConcealmentOn); 300 EXPECT_EQ(ref.VP8().errorConcealmentOn, target.VP8().errorConcealmentOn);
299 EXPECT_EQ(ref.VP8().automaticResizeOn, target.VP8().automaticResizeOn); 301 EXPECT_EQ(ref.VP8().automaticResizeOn, target.VP8().automaticResizeOn);
300 EXPECT_EQ(ref.VP8().frameDroppingOn, target.VP8().frameDroppingOn); 302 EXPECT_EQ(ref.VP8().frameDroppingOn, target.VP8().frameDroppingOn);
301 EXPECT_EQ(ref.VP8().keyFrameInterval, target.VP8().keyFrameInterval); 303 EXPECT_EQ(ref.VP8().keyFrameInterval, target.VP8().keyFrameInterval);
304 EXPECT_EQ(ref.VP8().tl_factory, target.VP8().tl_factory);
302 EXPECT_EQ(ref.qpMax, target.qpMax); 305 EXPECT_EQ(ref.qpMax, target.qpMax);
303 EXPECT_EQ(0, target.numberOfSimulcastStreams); 306 EXPECT_EQ(0, target.numberOfSimulcastStreams);
304 EXPECT_EQ(ref.mode, target.mode); 307 EXPECT_EQ(ref.mode, target.mode);
305 308
306 // No need to compare simulcastStream as numberOfSimulcastStreams should 309 // No need to compare simulcastStream as numberOfSimulcastStreams should
307 // always be 0. 310 // always be 0.
308 } 311 }
309 312
310 void InitRefCodec(int stream_index, VideoCodec* ref_codec) { 313 void InitRefCodec(int stream_index, VideoCodec* ref_codec) {
311 *ref_codec = codec_; 314 *ref_codec = codec_;
312 ref_codec->VP8()->numberOfTemporalLayers = 315 ref_codec->VP8()->numberOfTemporalLayers =
313 kTestTemporalLayerProfile[stream_index]; 316 kTestTemporalLayerProfile[stream_index];
314 ref_codec->codecSpecific.VP8.tl_factory = &tl_factory_;
315 ref_codec->width = codec_.simulcastStream[stream_index].width; 317 ref_codec->width = codec_.simulcastStream[stream_index].width;
316 ref_codec->height = codec_.simulcastStream[stream_index].height; 318 ref_codec->height = codec_.simulcastStream[stream_index].height;
317 ref_codec->maxBitrate = codec_.simulcastStream[stream_index].maxBitrate; 319 ref_codec->maxBitrate = codec_.simulcastStream[stream_index].maxBitrate;
318 ref_codec->minBitrate = codec_.simulcastStream[stream_index].minBitrate; 320 ref_codec->minBitrate = codec_.simulcastStream[stream_index].minBitrate;
319 ref_codec->qpMax = codec_.simulcastStream[stream_index].qpMax; 321 ref_codec->qpMax = codec_.simulcastStream[stream_index].qpMax;
320 } 322 }
321 323
322 void VerifyCodecSettings() { 324 void VerifyCodecSettings() {
323 EXPECT_EQ(3u, helper_->factory()->encoders().size()); 325 EXPECT_EQ(3u, helper_->factory()->encoders().size());
324 VideoCodec ref_codec; 326 VideoCodec ref_codec;
(...skipping 23 matching lines...) Expand all
348 VerifyCodec(ref_codec, 2); 350 VerifyCodec(ref_codec, 2);
349 } 351 }
350 352
351 protected: 353 protected:
352 std::unique_ptr<TestSimulcastEncoderAdapterFakeHelper> helper_; 354 std::unique_ptr<TestSimulcastEncoderAdapterFakeHelper> helper_;
353 std::unique_ptr<VP8Encoder> adapter_; 355 std::unique_ptr<VP8Encoder> adapter_;
354 VideoCodec codec_; 356 VideoCodec codec_;
355 int last_encoded_image_width_; 357 int last_encoded_image_width_;
356 int last_encoded_image_height_; 358 int last_encoded_image_height_;
357 int last_encoded_image_simulcast_index_; 359 int last_encoded_image_simulcast_index_;
358 TemporalLayersFactory tl_factory_;
359 std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
360 }; 360 };
361 361
362 TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) { 362 TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) {
363 SetupCodec(); 363 SetupCodec();
364 VerifyCodecSettings(); 364 VerifyCodecSettings();
365 } 365 }
366 366
367 TEST_F(TestSimulcastEncoderAdapterFake, SetChannelParameters) { 367 TEST_F(TestSimulcastEncoderAdapterFake, SetChannelParameters) {
368 SetupCodec(); 368 SetupCodec();
369 const uint32_t packetLoss = 5; 369 const uint32_t packetLoss = 5;
370 const int64_t rtt = 30; 370 const int64_t rtt = 30;
371 helper_->ExpectCallSetChannelParameters(packetLoss, rtt); 371 helper_->ExpectCallSetChannelParameters(packetLoss, rtt);
372 adapter_->SetChannelParameters(packetLoss, rtt); 372 adapter_->SetChannelParameters(packetLoss, rtt);
373 } 373 }
374 374
375 TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) { 375 TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) {
376 SetupCodec(); 376 SetupCodec();
377 377
378 // Set bitrates so that we send all layers. 378 // Set bitrates so that we send all layers.
379 adapter_->SetRateAllocation(rate_allocator_->GetAllocation(1200, 30), 30); 379 adapter_->SetRates(1200, 30);
380 380
381 // At this point, the simulcast encoder adapter should have 3 streams: HD, 381 // At this point, the simulcast encoder adapter should have 3 streams: HD,
382 // quarter HD, and quarter quarter HD. We're going to mostly ignore the exact 382 // quarter HD, and quarter quarter HD. We're going to mostly ignore the exact
383 // resolutions, to test that the adapter forwards on the correct resolution 383 // resolutions, to test that the adapter forwards on the correct resolution
384 // and simulcast index values, going only off the encoder that generates the 384 // and simulcast index values, going only off the encoder that generates the
385 // image. 385 // image.
386 EXPECT_EQ(3u, helper_->factory()->encoders().size()); 386 EXPECT_EQ(3u, helper_->factory()->encoders().size());
387 helper_->factory()->encoders()[0]->SendEncodedImage(1152, 704); 387 helper_->factory()->encoders()[0]->SendEncodedImage(1152, 704);
388 int width; 388 int width;
389 int height; 389 int height;
(...skipping 12 matching lines...) Expand all
402 helper_->factory()->encoders()[2]->SendEncodedImage(120, 240); 402 helper_->factory()->encoders()[2]->SendEncodedImage(120, 240);
403 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index)); 403 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
404 EXPECT_EQ(120, width); 404 EXPECT_EQ(120, width);
405 EXPECT_EQ(240, height); 405 EXPECT_EQ(240, height);
406 EXPECT_EQ(2, simulcast_index); 406 EXPECT_EQ(2, simulcast_index);
407 } 407 }
408 408
409 TEST_F(TestSimulcastEncoderAdapterFake, SupportsNativeHandleForSingleStreams) { 409 TEST_F(TestSimulcastEncoderAdapterFake, SupportsNativeHandleForSingleStreams) {
410 TestVp8Simulcast::DefaultSettings( 410 TestVp8Simulcast::DefaultSettings(
411 &codec_, static_cast<const int*>(kTestTemporalLayerProfile)); 411 &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
412 codec_.codecSpecific.VP8.tl_factory = &tl_factory_;
413 codec_.numberOfSimulcastStreams = 1; 412 codec_.numberOfSimulcastStreams = 1;
414 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 413 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
415 adapter_->RegisterEncodeCompleteCallback(this); 414 adapter_->RegisterEncodeCompleteCallback(this);
416 ASSERT_EQ(1u, helper_->factory()->encoders().size()); 415 ASSERT_EQ(1u, helper_->factory()->encoders().size());
417 helper_->factory()->encoders()[0]->set_supports_native_handle(true); 416 helper_->factory()->encoders()[0]->set_supports_native_handle(true);
418 EXPECT_TRUE(adapter_->SupportsNativeHandle()); 417 EXPECT_TRUE(adapter_->SupportsNativeHandle());
419 helper_->factory()->encoders()[0]->set_supports_native_handle(false); 418 helper_->factory()->encoders()[0]->set_supports_native_handle(false);
420 EXPECT_FALSE(adapter_->SupportsNativeHandle()); 419 EXPECT_FALSE(adapter_->SupportsNativeHandle());
421 } 420 }
422 421
423 TEST_F(TestSimulcastEncoderAdapterFake, SetRatesUnderMinBitrate) { 422 TEST_F(TestSimulcastEncoderAdapterFake, SetRatesUnderMinBitrate) {
424 TestVp8Simulcast::DefaultSettings( 423 TestVp8Simulcast::DefaultSettings(
425 &codec_, static_cast<const int*>(kTestTemporalLayerProfile)); 424 &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
426 codec_.codecSpecific.VP8.tl_factory = &tl_factory_;
427 codec_.minBitrate = 50; 425 codec_.minBitrate = 50;
428 codec_.numberOfSimulcastStreams = 1; 426 codec_.numberOfSimulcastStreams = 1;
429 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 427 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
430 rate_allocator_.reset(new SimulcastRateAllocator(codec_, nullptr));
431 428
432 // Above min should be respected. 429 // Above min should be respected.
433 BitrateAllocation target_bitrate = 430 adapter_->SetRates(100, 30);
434 rate_allocator_->GetAllocation(codec_.minBitrate * 1000, 30); 431 EXPECT_EQ(100, helper_->factory()->encoders()[0]->last_set_bitrate());
435 adapter_->SetRateAllocation(target_bitrate, 30);
436 EXPECT_EQ(target_bitrate,
437 helper_->factory()->encoders()[0]->last_set_bitrate());
438 432
439 // Below min but non-zero should be replaced with the min bitrate. 433 // Below min but non-zero should be replaced with the min bitrate.
440 BitrateAllocation too_low_bitrate = 434 adapter_->SetRates(15, 30);
441 rate_allocator_->GetAllocation((codec_.minBitrate - 1) * 1000, 30); 435 EXPECT_EQ(50, helper_->factory()->encoders()[0]->last_set_bitrate());
442 adapter_->SetRateAllocation(too_low_bitrate, 30);
443 EXPECT_EQ(target_bitrate,
444 helper_->factory()->encoders()[0]->last_set_bitrate());
445 436
446 // Zero should be passed on as is, since it means "pause". 437 // Zero should be passed on as is, since it means "pause".
447 adapter_->SetRateAllocation(BitrateAllocation(), 30); 438 adapter_->SetRates(0, 30);
448 EXPECT_EQ(BitrateAllocation(), 439 EXPECT_EQ(0, helper_->factory()->encoders()[0]->last_set_bitrate());
449 helper_->factory()->encoders()[0]->last_set_bitrate());
450 } 440 }
451 441
452 TEST_F(TestSimulcastEncoderAdapterFake, SupportsImplementationName) { 442 TEST_F(TestSimulcastEncoderAdapterFake, SupportsImplementationName) {
453 EXPECT_STREQ("SimulcastEncoderAdapter", adapter_->ImplementationName()); 443 EXPECT_STREQ("SimulcastEncoderAdapter", adapter_->ImplementationName());
454 TestVp8Simulcast::DefaultSettings( 444 TestVp8Simulcast::DefaultSettings(
455 &codec_, static_cast<const int*>(kTestTemporalLayerProfile)); 445 &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
456 codec_.codecSpecific.VP8.tl_factory = &tl_factory_;
457 std::vector<const char*> encoder_names; 446 std::vector<const char*> encoder_names;
458 encoder_names.push_back("codec1"); 447 encoder_names.push_back("codec1");
459 encoder_names.push_back("codec2"); 448 encoder_names.push_back("codec2");
460 encoder_names.push_back("codec3"); 449 encoder_names.push_back("codec3");
461 helper_->factory()->SetEncoderNames(encoder_names); 450 helper_->factory()->SetEncoderNames(encoder_names);
462 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 451 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
463 EXPECT_STREQ("SimulcastEncoderAdapter (codec1, codec2, codec3)", 452 EXPECT_STREQ("SimulcastEncoderAdapter (codec1, codec2, codec3)",
464 adapter_->ImplementationName()); 453 adapter_->ImplementationName());
465 454
466 // Single streams should not expose "SimulcastEncoderAdapter" in name. 455 // Single streams should not expose "SimulcastEncoderAdapter" in name.
467 adapter_->Release(); 456 adapter_->Release();
468 codec_.numberOfSimulcastStreams = 1; 457 codec_.numberOfSimulcastStreams = 1;
469 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 458 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
470 adapter_->RegisterEncodeCompleteCallback(this); 459 adapter_->RegisterEncodeCompleteCallback(this);
471 ASSERT_EQ(1u, helper_->factory()->encoders().size()); 460 ASSERT_EQ(1u, helper_->factory()->encoders().size());
472 EXPECT_STREQ("codec1", adapter_->ImplementationName()); 461 EXPECT_STREQ("codec1", adapter_->ImplementationName());
473 } 462 }
474 463
475 TEST_F(TestSimulcastEncoderAdapterFake, 464 TEST_F(TestSimulcastEncoderAdapterFake,
476 SupportsNativeHandleForMultipleStreams) { 465 SupportsNativeHandleForMultipleStreams) {
477 TestVp8Simulcast::DefaultSettings( 466 TestVp8Simulcast::DefaultSettings(
478 &codec_, static_cast<const int*>(kTestTemporalLayerProfile)); 467 &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
479 codec_.codecSpecific.VP8.tl_factory = &tl_factory_;
480 codec_.numberOfSimulcastStreams = 3; 468 codec_.numberOfSimulcastStreams = 3;
481 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 469 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
482 adapter_->RegisterEncodeCompleteCallback(this); 470 adapter_->RegisterEncodeCompleteCallback(this);
483 ASSERT_EQ(3u, helper_->factory()->encoders().size()); 471 ASSERT_EQ(3u, helper_->factory()->encoders().size());
484 for (MockVideoEncoder* encoder : helper_->factory()->encoders()) 472 for (MockVideoEncoder* encoder : helper_->factory()->encoders())
485 encoder->set_supports_native_handle(true); 473 encoder->set_supports_native_handle(true);
486 // If one encoder doesn't support it, then overall support is disabled. 474 // If one encoder doesn't support it, then overall support is disabled.
487 helper_->factory()->encoders()[0]->set_supports_native_handle(false); 475 helper_->factory()->encoders()[0]->set_supports_native_handle(false);
488 EXPECT_FALSE(adapter_->SupportsNativeHandle()); 476 EXPECT_FALSE(adapter_->SupportsNativeHandle());
489 // Once all do, then the adapter claims support. 477 // Once all do, then the adapter claims support.
490 helper_->factory()->encoders()[0]->set_supports_native_handle(true); 478 helper_->factory()->encoders()[0]->set_supports_native_handle(true);
491 EXPECT_TRUE(adapter_->SupportsNativeHandle()); 479 EXPECT_TRUE(adapter_->SupportsNativeHandle());
492 } 480 }
493 481
494 class FakeNativeHandleBuffer : public NativeHandleBuffer { 482 class FakeNativeHandleBuffer : public NativeHandleBuffer {
495 public: 483 public:
496 FakeNativeHandleBuffer(void* native_handle, int width, int height) 484 FakeNativeHandleBuffer(void* native_handle, int width, int height)
497 : NativeHandleBuffer(native_handle, width, height) {} 485 : NativeHandleBuffer(native_handle, width, height) {}
498 rtc::scoped_refptr<VideoFrameBuffer> NativeToI420Buffer() override { 486 rtc::scoped_refptr<VideoFrameBuffer> NativeToI420Buffer() override {
499 RTC_NOTREACHED(); 487 RTC_NOTREACHED();
500 return nullptr; 488 return nullptr;
501 } 489 }
502 }; 490 };
503 491
504 TEST_F(TestSimulcastEncoderAdapterFake, 492 TEST_F(TestSimulcastEncoderAdapterFake,
505 NativeHandleForwardingForMultipleStreams) { 493 NativeHandleForwardingForMultipleStreams) {
506 TestVp8Simulcast::DefaultSettings( 494 TestVp8Simulcast::DefaultSettings(
507 &codec_, static_cast<const int*>(kTestTemporalLayerProfile)); 495 &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
508 codec_.codecSpecific.VP8.tl_factory = &tl_factory_;
509 codec_.numberOfSimulcastStreams = 3; 496 codec_.numberOfSimulcastStreams = 3;
510 // High start bitrate, so all streams are enabled. 497 // High start bitrate, so all streams are enabled.
511 codec_.startBitrate = 3000; 498 codec_.startBitrate = 3000;
512 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 499 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
513 adapter_->RegisterEncodeCompleteCallback(this); 500 adapter_->RegisterEncodeCompleteCallback(this);
514 ASSERT_EQ(3u, helper_->factory()->encoders().size()); 501 ASSERT_EQ(3u, helper_->factory()->encoders().size());
515 for (MockVideoEncoder* encoder : helper_->factory()->encoders()) 502 for (MockVideoEncoder* encoder : helper_->factory()->encoders())
516 encoder->set_supports_native_handle(true); 503 encoder->set_supports_native_handle(true);
517 EXPECT_TRUE(adapter_->SupportsNativeHandle()); 504 EXPECT_TRUE(adapter_->SupportsNativeHandle());
518 505
519 rtc::scoped_refptr<VideoFrameBuffer> buffer( 506 rtc::scoped_refptr<VideoFrameBuffer> buffer(
520 new rtc::RefCountedObject<FakeNativeHandleBuffer>(this, 1280, 720)); 507 new rtc::RefCountedObject<FakeNativeHandleBuffer>(this, 1280, 720));
521 VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180); 508 VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180);
522 // Expect calls with the given video frame verbatim, since it's a texture 509 // Expect calls with the given video frame verbatim, since it's a texture
523 // frame and can't otherwise be modified/resized. 510 // frame and can't otherwise be modified/resized.
524 for (MockVideoEncoder* encoder : helper_->factory()->encoders()) 511 for (MockVideoEncoder* encoder : helper_->factory()->encoders())
525 EXPECT_CALL(*encoder, Encode(::testing::Ref(input_frame), _, _)).Times(1); 512 EXPECT_CALL(*encoder, Encode(::testing::Ref(input_frame), _, _)).Times(1);
526 std::vector<FrameType> frame_types(3, kVideoFrameKey); 513 std::vector<FrameType> frame_types(3, kVideoFrameKey);
527 EXPECT_EQ(0, adapter_->Encode(input_frame, NULL, &frame_types)); 514 EXPECT_EQ(0, adapter_->Encode(input_frame, NULL, &frame_types));
528 } 515 }
529 516
530 TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) { 517 TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) {
531 TestVp8Simulcast::DefaultSettings( 518 TestVp8Simulcast::DefaultSettings(
532 &codec_, static_cast<const int*>(kTestTemporalLayerProfile)); 519 &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
533 codec_.codecSpecific.VP8.tl_factory = &tl_factory_;
534 codec_.numberOfSimulcastStreams = 3; 520 codec_.numberOfSimulcastStreams = 3;
535 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200)); 521 EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
536 adapter_->RegisterEncodeCompleteCallback(this); 522 adapter_->RegisterEncodeCompleteCallback(this);
537 ASSERT_EQ(3u, helper_->factory()->encoders().size()); 523 ASSERT_EQ(3u, helper_->factory()->encoders().size());
538 // Tell the 2nd encoder to request software fallback. 524 // Tell the 2nd encoder to request software fallback.
539 EXPECT_CALL(*helper_->factory()->encoders()[1], Encode(_, _, _)) 525 EXPECT_CALL(*helper_->factory()->encoders()[1], Encode(_, _, _))
540 .WillOnce(Return(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE)); 526 .WillOnce(Return(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE));
541 527
542 // Send a fake frame and assert the return is software fallback. 528 // Send a fake frame and assert the return is software fallback.
543 int half_width = (kDefaultWidth + 1) / 2; 529 int half_width = (kDefaultWidth + 1) / 2;
544 rtc::scoped_refptr<I420Buffer> input_buffer = I420Buffer::Create( 530 rtc::scoped_refptr<I420Buffer> input_buffer = I420Buffer::Create(
545 kDefaultWidth, kDefaultHeight, kDefaultWidth, half_width, half_width); 531 kDefaultWidth, kDefaultHeight, kDefaultWidth, half_width, half_width);
546 input_buffer->InitializeData(); 532 input_buffer->InitializeData();
547 VideoFrame input_frame(input_buffer, 0, 0, webrtc::kVideoRotation_0); 533 VideoFrame input_frame(input_buffer, 0, 0, webrtc::kVideoRotation_0);
548 std::vector<FrameType> frame_types(3, kVideoFrameKey); 534 std::vector<FrameType> frame_types(3, kVideoFrameKey);
549 EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE, 535 EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE,
550 adapter_->Encode(input_frame, nullptr, &frame_types)); 536 adapter_->Encode(input_frame, nullptr, &frame_types));
551 } 537 }
552 538
553 } // namespace testing 539 } // namespace testing
554 } // namespace webrtc 540 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698