1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "media/engine/simulcast_encoder_adapter.h"
12
13 #include <array>
14 #include <memory>
15 #include <vector>
16
17 #include "api/test/create_simulcast_test_fixture.h"
18 #include "api/test/simulcast_test_fixture.h"
19 #include "api/test/video/function_video_decoder_factory.h"
20 #include "api/test/video/function_video_encoder_factory.h"
21 #include "api/video/video_codec_constants.h"
22 #include "api/video_codecs/sdp_video_format.h"
23 #include "api/video_codecs/video_encoder.h"
24 #include "api/video_codecs/video_encoder_factory.h"
25 #include "common_video/include/video_frame_buffer.h"
26 #include "media/base/media_constants.h"
27 #include "media/engine/internal_encoder_factory.h"
28 #include "modules/video_coding/codecs/vp8/include/vp8.h"
29 #include "modules/video_coding/include/video_codec_interface.h"
30 #include "modules/video_coding/utility/simulcast_test_fixture_impl.h"
31 #include "rtc_base/checks.h"
32 #include "test/field_trial.h"
33 #include "test/gmock.h"
34 #include "test/gtest.h"
35
36 using ::testing::_;
37 using ::testing::Return;
38 using EncoderInfo = webrtc::VideoEncoder::EncoderInfo;
39 using FramerateFractions =
40 absl::InlinedVector<uint8_t, webrtc::kMaxTemporalStreams>;
41
42 namespace webrtc {
43 namespace test {
44
45 namespace {
46
47 constexpr int kDefaultWidth = 1280;
48 constexpr int kDefaultHeight = 720;
49
50 const VideoEncoder::Capabilities kCapabilities(false);
51 const VideoEncoder::Settings kSettings(kCapabilities, 1, 1200);
52
CreateSpecificSimulcastTestFixture(VideoEncoderFactory * internal_encoder_factory)53 std::unique_ptr<SimulcastTestFixture> CreateSpecificSimulcastTestFixture(
54 VideoEncoderFactory* internal_encoder_factory) {
55 std::unique_ptr<VideoEncoderFactory> encoder_factory =
56 std::make_unique<FunctionVideoEncoderFactory>(
57 [internal_encoder_factory]() {
58 return std::make_unique<SimulcastEncoderAdapter>(
59 internal_encoder_factory,
60 SdpVideoFormat(cricket::kVp8CodecName));
61 });
62 std::unique_ptr<VideoDecoderFactory> decoder_factory =
63 std::make_unique<FunctionVideoDecoderFactory>(
64 []() { return VP8Decoder::Create(); });
65 return CreateSimulcastTestFixture(std::move(encoder_factory),
66 std::move(decoder_factory),
67 SdpVideoFormat(cricket::kVp8CodecName));
68 }
69 } // namespace
70
TEST(SimulcastEncoderAdapterSimulcastTest,TestKeyFrameRequestsOnAllStreams)71 TEST(SimulcastEncoderAdapterSimulcastTest, TestKeyFrameRequestsOnAllStreams) {
72 InternalEncoderFactory internal_encoder_factory;
73 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
74 fixture->TestKeyFrameRequestsOnAllStreams();
75 }
76
TEST(SimulcastEncoderAdapterSimulcastTest,TestPaddingAllStreams)77 TEST(SimulcastEncoderAdapterSimulcastTest, TestPaddingAllStreams) {
78 InternalEncoderFactory internal_encoder_factory;
79 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
80 fixture->TestPaddingAllStreams();
81 }
82
TEST(SimulcastEncoderAdapterSimulcastTest,TestPaddingTwoStreams)83 TEST(SimulcastEncoderAdapterSimulcastTest, TestPaddingTwoStreams) {
84 InternalEncoderFactory internal_encoder_factory;
85 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
86 fixture->TestPaddingTwoStreams();
87 }
88
TEST(SimulcastEncoderAdapterSimulcastTest,TestPaddingTwoStreamsOneMaxedOut)89 TEST(SimulcastEncoderAdapterSimulcastTest, TestPaddingTwoStreamsOneMaxedOut) {
90 InternalEncoderFactory internal_encoder_factory;
91 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
92 fixture->TestPaddingTwoStreamsOneMaxedOut();
93 }
94
TEST(SimulcastEncoderAdapterSimulcastTest,TestPaddingOneStream)95 TEST(SimulcastEncoderAdapterSimulcastTest, TestPaddingOneStream) {
96 InternalEncoderFactory internal_encoder_factory;
97 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
98 fixture->TestPaddingOneStream();
99 }
100
TEST(SimulcastEncoderAdapterSimulcastTest,TestPaddingOneStreamTwoMaxedOut)101 TEST(SimulcastEncoderAdapterSimulcastTest, TestPaddingOneStreamTwoMaxedOut) {
102 InternalEncoderFactory internal_encoder_factory;
103 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
104 fixture->TestPaddingOneStreamTwoMaxedOut();
105 }
106
TEST(SimulcastEncoderAdapterSimulcastTest,TestSendAllStreams)107 TEST(SimulcastEncoderAdapterSimulcastTest, TestSendAllStreams) {
108 InternalEncoderFactory internal_encoder_factory;
109 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
110 fixture->TestSendAllStreams();
111 }
112
TEST(SimulcastEncoderAdapterSimulcastTest,TestDisablingStreams)113 TEST(SimulcastEncoderAdapterSimulcastTest, TestDisablingStreams) {
114 InternalEncoderFactory internal_encoder_factory;
115 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
116 fixture->TestDisablingStreams();
117 }
118
TEST(SimulcastEncoderAdapterSimulcastTest,TestActiveStreams)119 TEST(SimulcastEncoderAdapterSimulcastTest, TestActiveStreams) {
120 InternalEncoderFactory internal_encoder_factory;
121 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
122 fixture->TestActiveStreams();
123 }
124
TEST(SimulcastEncoderAdapterSimulcastTest,TestSwitchingToOneStream)125 TEST(SimulcastEncoderAdapterSimulcastTest, TestSwitchingToOneStream) {
126 InternalEncoderFactory internal_encoder_factory;
127 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
128 fixture->TestSwitchingToOneStream();
129 }
130
TEST(SimulcastEncoderAdapterSimulcastTest,TestSwitchingToOneOddStream)131 TEST(SimulcastEncoderAdapterSimulcastTest, TestSwitchingToOneOddStream) {
132 InternalEncoderFactory internal_encoder_factory;
133 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
134 fixture->TestSwitchingToOneOddStream();
135 }
136
TEST(SimulcastEncoderAdapterSimulcastTest,TestStrideEncodeDecode)137 TEST(SimulcastEncoderAdapterSimulcastTest, TestStrideEncodeDecode) {
138 InternalEncoderFactory internal_encoder_factory;
139 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
140 fixture->TestStrideEncodeDecode();
141 }
142
TEST(SimulcastEncoderAdapterSimulcastTest,TestSpatioTemporalLayers333PatternEncoder)143 TEST(SimulcastEncoderAdapterSimulcastTest,
144 TestSpatioTemporalLayers333PatternEncoder) {
145 InternalEncoderFactory internal_encoder_factory;
146 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
147 fixture->TestSpatioTemporalLayers333PatternEncoder();
148 }
149
TEST(SimulcastEncoderAdapterSimulcastTest,TestSpatioTemporalLayers321PatternEncoder)150 TEST(SimulcastEncoderAdapterSimulcastTest,
151 TestSpatioTemporalLayers321PatternEncoder) {
152 InternalEncoderFactory internal_encoder_factory;
153 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
154 fixture->TestSpatioTemporalLayers321PatternEncoder();
155 }
156
TEST(SimulcastEncoderAdapterSimulcastTest,TestDecodeWidthHeightSet)157 TEST(SimulcastEncoderAdapterSimulcastTest, TestDecodeWidthHeightSet) {
158 InternalEncoderFactory internal_encoder_factory;
159 auto fixture = CreateSpecificSimulcastTestFixture(&internal_encoder_factory);
160 fixture->TestDecodeWidthHeightSet();
161 }
162
163 class MockVideoEncoder;
164
165 class MockVideoEncoderFactory : public VideoEncoderFactory {
166 public:
167 std::vector<SdpVideoFormat> GetSupportedFormats() const override;
168
169 std::unique_ptr<VideoEncoder> CreateVideoEncoder(
170 const SdpVideoFormat& format) override;
171
172 const std::vector<MockVideoEncoder*>& encoders() const;
173 void SetEncoderNames(const std::vector<const char*>& encoder_names);
set_create_video_encode_return_nullptr(bool return_nullptr)174 void set_create_video_encode_return_nullptr(bool return_nullptr) {
175 create_video_encoder_return_nullptr_ = return_nullptr;
176 }
177 void set_init_encode_return_value(int32_t value);
set_requested_resolution_alignments(std::vector<int> requested_resolution_alignments)178 void set_requested_resolution_alignments(
179 std::vector<int> requested_resolution_alignments) {
180 requested_resolution_alignments_ = requested_resolution_alignments;
181 }
set_supports_simulcast(bool supports_simulcast)182 void set_supports_simulcast(bool supports_simulcast) {
183 supports_simulcast_ = supports_simulcast;
184 }
set_resolution_bitrate_limits(std::vector<VideoEncoder::ResolutionBitrateLimits> limits)185 void set_resolution_bitrate_limits(
186 std::vector<VideoEncoder::ResolutionBitrateLimits> limits) {
187 resolution_bitrate_limits_ = limits;
188 }
189
190 void DestroyVideoEncoder(VideoEncoder* encoder);
191
192 private:
193 bool create_video_encoder_return_nullptr_ = false;
194 int32_t init_encode_return_value_ = 0;
195 std::vector<MockVideoEncoder*> encoders_;
196 std::vector<const char*> encoder_names_;
197 // Keep number of entries in sync with `kMaxSimulcastStreams`.
198 std::vector<int> requested_resolution_alignments_ = {1, 1, 1};
199 bool supports_simulcast_ = false;
200 std::vector<VideoEncoder::ResolutionBitrateLimits> resolution_bitrate_limits_;
201 };
202
203 class MockVideoEncoder : public VideoEncoder {
204 public:
MockVideoEncoder(MockVideoEncoderFactory * factory)205 explicit MockVideoEncoder(MockVideoEncoderFactory* factory)
206 : factory_(factory),
207 scaling_settings_(VideoEncoder::ScalingSettings::kOff),
208 video_format_("unknown"),
209 callback_(nullptr) {}
210
211 MOCK_METHOD(void,
212 SetFecControllerOverride,
213 (FecControllerOverride * fec_controller_override),
214 (override));
215
InitEncode(const VideoCodec * codecSettings,const VideoEncoder::Settings & settings)216 int32_t InitEncode(const VideoCodec* codecSettings,
217 const VideoEncoder::Settings& settings) override {
218 codec_ = *codecSettings;
219 return init_encode_return_value_;
220 }
221
222 MOCK_METHOD(int32_t,
223 Encode,
224 (const VideoFrame& inputImage,
225 const std::vector<VideoFrameType>* frame_types),
226 (override));
227
RegisterEncodeCompleteCallback(EncodedImageCallback * callback)228 int32_t RegisterEncodeCompleteCallback(
229 EncodedImageCallback* callback) override {
230 callback_ = callback;
231 return 0;
232 }
233
234 MOCK_METHOD(int32_t, Release, (), (override));
235
SetRates(const RateControlParameters & parameters)236 void SetRates(const RateControlParameters& parameters) {
237 last_set_rates_ = parameters;
238 }
239
GetEncoderInfo() const240 EncoderInfo GetEncoderInfo() const override {
241 EncoderInfo info;
242 info.supports_native_handle = supports_native_handle_;
243 info.implementation_name = implementation_name_;
244 info.scaling_settings = scaling_settings_;
245 info.requested_resolution_alignment = requested_resolution_alignment_;
246 info.apply_alignment_to_all_simulcast_layers =
247 apply_alignment_to_all_simulcast_layers_;
248 info.has_trusted_rate_controller = has_trusted_rate_controller_;
249 info.is_hardware_accelerated = is_hardware_accelerated_;
250 info.fps_allocation[0] = fps_allocation_;
251 info.supports_simulcast = supports_simulcast_;
252 info.is_qp_trusted = is_qp_trusted_;
253 info.resolution_bitrate_limits = resolution_bitrate_limits;
254 return info;
255 }
256
~MockVideoEncoder()257 virtual ~MockVideoEncoder() { factory_->DestroyVideoEncoder(this); }
258
codec() const259 const VideoCodec& codec() const { return codec_; }
260
SendEncodedImage(int width,int height)261 void SendEncodedImage(int width, int height) {
262 // Sends a fake image of the given width/height.
263 EncodedImage image;
264 image._encodedWidth = width;
265 image._encodedHeight = height;
266 CodecSpecificInfo codec_specific_info;
267 codec_specific_info.codecType = webrtc::kVideoCodecVP8;
268 callback_->OnEncodedImage(image, &codec_specific_info);
269 }
270
set_supports_native_handle(bool enabled)271 void set_supports_native_handle(bool enabled) {
272 supports_native_handle_ = enabled;
273 }
274
set_implementation_name(const std::string & name)275 void set_implementation_name(const std::string& name) {
276 implementation_name_ = name;
277 }
278
set_init_encode_return_value(int32_t value)279 void set_init_encode_return_value(int32_t value) {
280 init_encode_return_value_ = value;
281 }
282
set_scaling_settings(const VideoEncoder::ScalingSettings & settings)283 void set_scaling_settings(const VideoEncoder::ScalingSettings& settings) {
284 scaling_settings_ = settings;
285 }
286
set_requested_resolution_alignment(int requested_resolution_alignment)287 void set_requested_resolution_alignment(int requested_resolution_alignment) {
288 requested_resolution_alignment_ = requested_resolution_alignment;
289 }
290
set_apply_alignment_to_all_simulcast_layers(bool apply)291 void set_apply_alignment_to_all_simulcast_layers(bool apply) {
292 apply_alignment_to_all_simulcast_layers_ = apply;
293 }
294
set_has_trusted_rate_controller(bool trusted)295 void set_has_trusted_rate_controller(bool trusted) {
296 has_trusted_rate_controller_ = trusted;
297 }
298
set_is_hardware_accelerated(bool is_hardware_accelerated)299 void set_is_hardware_accelerated(bool is_hardware_accelerated) {
300 is_hardware_accelerated_ = is_hardware_accelerated;
301 }
302
set_fps_allocation(const FramerateFractions & fps_allocation)303 void set_fps_allocation(const FramerateFractions& fps_allocation) {
304 fps_allocation_ = fps_allocation;
305 }
306
last_set_rates() const307 RateControlParameters last_set_rates() const { return last_set_rates_; }
308
set_supports_simulcast(bool supports_simulcast)309 void set_supports_simulcast(bool supports_simulcast) {
310 supports_simulcast_ = supports_simulcast;
311 }
312
set_video_format(const SdpVideoFormat & video_format)313 void set_video_format(const SdpVideoFormat& video_format) {
314 video_format_ = video_format;
315 }
316
set_is_qp_trusted(absl::optional<bool> is_qp_trusted)317 void set_is_qp_trusted(absl::optional<bool> is_qp_trusted) {
318 is_qp_trusted_ = is_qp_trusted;
319 }
320
set_resolution_bitrate_limits(std::vector<VideoEncoder::ResolutionBitrateLimits> limits)321 void set_resolution_bitrate_limits(
322 std::vector<VideoEncoder::ResolutionBitrateLimits> limits) {
323 resolution_bitrate_limits = limits;
324 }
325
supports_simulcast() const326 bool supports_simulcast() const { return supports_simulcast_; }
327
video_format() const328 SdpVideoFormat video_format() const { return video_format_; }
329
330 private:
331 MockVideoEncoderFactory* const factory_;
332 bool supports_native_handle_ = false;
333 std::string implementation_name_ = "unknown";
334 VideoEncoder::ScalingSettings scaling_settings_;
335 int requested_resolution_alignment_ = 1;
336 bool apply_alignment_to_all_simulcast_layers_ = false;
337 bool has_trusted_rate_controller_ = false;
338 bool is_hardware_accelerated_ = false;
339 int32_t init_encode_return_value_ = 0;
340 VideoEncoder::RateControlParameters last_set_rates_;
341 FramerateFractions fps_allocation_;
342 bool supports_simulcast_ = false;
343 absl::optional<bool> is_qp_trusted_;
344 SdpVideoFormat video_format_;
345 std::vector<VideoEncoder::ResolutionBitrateLimits> resolution_bitrate_limits;
346
347 VideoCodec codec_;
348 EncodedImageCallback* callback_;
349 };
350
GetSupportedFormats() const351 std::vector<SdpVideoFormat> MockVideoEncoderFactory::GetSupportedFormats()
352 const {
353 std::vector<SdpVideoFormat> formats = {SdpVideoFormat("VP8")};
354 return formats;
355 }
356
CreateVideoEncoder(const SdpVideoFormat & format)357 std::unique_ptr<VideoEncoder> MockVideoEncoderFactory::CreateVideoEncoder(
358 const SdpVideoFormat& format) {
359 if (create_video_encoder_return_nullptr_) {
360 return nullptr;
361 }
362
363 auto encoder = std::make_unique<::testing::NiceMock<MockVideoEncoder>>(this);
364 encoder->set_init_encode_return_value(init_encode_return_value_);
365 const char* encoder_name = encoder_names_.empty()
366 ? "codec_implementation_name"
367 : encoder_names_[encoders_.size()];
368 encoder->set_implementation_name(encoder_name);
369 RTC_CHECK_LT(encoders_.size(), requested_resolution_alignments_.size());
370 encoder->set_requested_resolution_alignment(
371 requested_resolution_alignments_[encoders_.size()]);
372 encoder->set_supports_simulcast(supports_simulcast_);
373 encoder->set_video_format(format);
374 encoder->set_resolution_bitrate_limits(resolution_bitrate_limits_);
375 encoders_.push_back(encoder.get());
376 return encoder;
377 }
378
DestroyVideoEncoder(VideoEncoder * encoder)379 void MockVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder* encoder) {
380 for (size_t i = 0; i < encoders_.size(); ++i) {
381 if (encoders_[i] == encoder) {
382 encoders_.erase(encoders_.begin() + i);
383 break;
384 }
385 }
386 }
387
encoders() const388 const std::vector<MockVideoEncoder*>& MockVideoEncoderFactory::encoders()
389 const {
390 return encoders_;
391 }
SetEncoderNames(const std::vector<const char * > & encoder_names)392 void MockVideoEncoderFactory::SetEncoderNames(
393 const std::vector<const char*>& encoder_names) {
394 encoder_names_ = encoder_names;
395 }
set_init_encode_return_value(int32_t value)396 void MockVideoEncoderFactory::set_init_encode_return_value(int32_t value) {
397 init_encode_return_value_ = value;
398 }
399
400 class TestSimulcastEncoderAdapterFakeHelper {
401 public:
TestSimulcastEncoderAdapterFakeHelper(bool use_fallback_factory,const SdpVideoFormat & video_format)402 explicit TestSimulcastEncoderAdapterFakeHelper(
403 bool use_fallback_factory,
404 const SdpVideoFormat& video_format)
405 : primary_factory_(new MockVideoEncoderFactory()),
406 fallback_factory_(use_fallback_factory ? new MockVideoEncoderFactory()
407 : nullptr),
408 video_format_(video_format) {}
409
410 // Can only be called once as the SimulcastEncoderAdapter will take the
411 // ownership of `factory_`.
CreateMockEncoderAdapter()412 VideoEncoder* CreateMockEncoderAdapter() {
413 return new SimulcastEncoderAdapter(primary_factory_.get(),
414 fallback_factory_.get(), video_format_);
415 }
416
factory()417 MockVideoEncoderFactory* factory() { return primary_factory_.get(); }
fallback_factory()418 MockVideoEncoderFactory* fallback_factory() {
419 return fallback_factory_.get();
420 }
421
422 private:
423 std::unique_ptr<MockVideoEncoderFactory> primary_factory_;
424 std::unique_ptr<MockVideoEncoderFactory> fallback_factory_;
425 SdpVideoFormat video_format_;
426 };
427
428 static const int kTestTemporalLayerProfile[3] = {3, 2, 1};
429
430 class TestSimulcastEncoderAdapterFake : public ::testing::Test,
431 public EncodedImageCallback {
432 public:
TestSimulcastEncoderAdapterFake()433 TestSimulcastEncoderAdapterFake()
434 : last_encoded_image_width_(-1),
435 last_encoded_image_height_(-1),
436 last_encoded_image_simulcast_index_(-1),
437 use_fallback_factory_(false) {}
438
~TestSimulcastEncoderAdapterFake()439 virtual ~TestSimulcastEncoderAdapterFake() {
440 if (adapter_) {
441 adapter_->Release();
442 }
443 }
444
SetUp()445 void SetUp() override {
446 helper_.reset(new TestSimulcastEncoderAdapterFakeHelper(
447 use_fallback_factory_, SdpVideoFormat("VP8", sdp_video_parameters_)));
448 adapter_.reset(helper_->CreateMockEncoderAdapter());
449 last_encoded_image_width_ = -1;
450 last_encoded_image_height_ = -1;
451 last_encoded_image_simulcast_index_ = -1;
452 }
453
ReSetUp()454 void ReSetUp() {
455 if (adapter_) {
456 adapter_->Release();
457 // `helper_` owns factories which `adapter_` needs to destroy encoders.
458 // Release `adapter_` before `helper_` (released in SetUp()).
459 adapter_.reset();
460 }
461 SetUp();
462 }
463
OnEncodedImage(const EncodedImage & encoded_image,const CodecSpecificInfo * codec_specific_info)464 Result OnEncodedImage(const EncodedImage& encoded_image,
465 const CodecSpecificInfo* codec_specific_info) override {
466 last_encoded_image_width_ = encoded_image._encodedWidth;
467 last_encoded_image_height_ = encoded_image._encodedHeight;
468 last_encoded_image_simulcast_index_ =
469 encoded_image.SpatialIndex().value_or(-1);
470
471 return Result(Result::OK, encoded_image.Timestamp());
472 }
473
GetLastEncodedImageInfo(int * out_width,int * out_height,int * out_simulcast_index)474 bool GetLastEncodedImageInfo(int* out_width,
475 int* out_height,
476 int* out_simulcast_index) {
477 if (last_encoded_image_width_ == -1) {
478 return false;
479 }
480 *out_width = last_encoded_image_width_;
481 *out_height = last_encoded_image_height_;
482 *out_simulcast_index = last_encoded_image_simulcast_index_;
483 return true;
484 }
485
SetupCodec()486 void SetupCodec() { SetupCodec(/*active_streams=*/{true, true, true}); }
487
SetupCodec(std::vector<bool> active_streams)488 void SetupCodec(std::vector<bool> active_streams) {
489 SimulcastTestFixtureImpl::DefaultSettings(
490 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
491 kVideoCodecVP8);
492 ASSERT_LE(active_streams.size(), codec_.numberOfSimulcastStreams);
493 codec_.numberOfSimulcastStreams = active_streams.size();
494 for (size_t stream_idx = 0; stream_idx < kMaxSimulcastStreams;
495 ++stream_idx) {
496 if (stream_idx >= codec_.numberOfSimulcastStreams) {
497 // Reset parameters of unspecified stream.
498 codec_.simulcastStream[stream_idx] = {0};
499 } else {
500 codec_.simulcastStream[stream_idx].active = active_streams[stream_idx];
501 }
502 }
503 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
504 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
505 adapter_->RegisterEncodeCompleteCallback(this);
506 }
507
VerifyCodec(const VideoCodec & ref,int stream_index)508 void VerifyCodec(const VideoCodec& ref, int stream_index) {
509 const VideoCodec& target =
510 helper_->factory()->encoders()[stream_index]->codec();
511 EXPECT_EQ(ref.codecType, target.codecType);
512 EXPECT_EQ(ref.width, target.width);
513 EXPECT_EQ(ref.height, target.height);
514 EXPECT_EQ(ref.startBitrate, target.startBitrate);
515 EXPECT_EQ(ref.maxBitrate, target.maxBitrate);
516 EXPECT_EQ(ref.minBitrate, target.minBitrate);
517 EXPECT_EQ(ref.maxFramerate, target.maxFramerate);
518 EXPECT_EQ(ref.GetVideoEncoderComplexity(),
519 target.GetVideoEncoderComplexity());
520 EXPECT_EQ(ref.VP8().numberOfTemporalLayers,
521 target.VP8().numberOfTemporalLayers);
522 EXPECT_EQ(ref.VP8().denoisingOn, target.VP8().denoisingOn);
523 EXPECT_EQ(ref.VP8().automaticResizeOn, target.VP8().automaticResizeOn);
524 EXPECT_EQ(ref.GetFrameDropEnabled(), target.GetFrameDropEnabled());
525 EXPECT_EQ(ref.VP8().keyFrameInterval, target.VP8().keyFrameInterval);
526 EXPECT_EQ(ref.qpMax, target.qpMax);
527 EXPECT_EQ(0, target.numberOfSimulcastStreams);
528 EXPECT_EQ(ref.mode, target.mode);
529
530 // No need to compare simulcastStream as numberOfSimulcastStreams should
531 // always be 0.
532 }
533
InitRefCodec(int stream_index,VideoCodec * ref_codec,bool reverse_layer_order=false)534 void InitRefCodec(int stream_index,
535 VideoCodec* ref_codec,
536 bool reverse_layer_order = false) {
537 *ref_codec = codec_;
538 ref_codec->VP8()->numberOfTemporalLayers =
539 kTestTemporalLayerProfile[reverse_layer_order ? 2 - stream_index
540 : stream_index];
541 ref_codec->width = codec_.simulcastStream[stream_index].width;
542 ref_codec->height = codec_.simulcastStream[stream_index].height;
543 ref_codec->maxBitrate = codec_.simulcastStream[stream_index].maxBitrate;
544 ref_codec->minBitrate = codec_.simulcastStream[stream_index].minBitrate;
545 ref_codec->qpMax = codec_.simulcastStream[stream_index].qpMax;
546 }
547
VerifyCodecSettings()548 void VerifyCodecSettings() {
549 EXPECT_EQ(3u, helper_->factory()->encoders().size());
550 VideoCodec ref_codec;
551
552 // stream 0, the lowest resolution stream.
553 InitRefCodec(0, &ref_codec);
554 ref_codec.qpMax = 45;
555 ref_codec.SetVideoEncoderComplexity(
556 webrtc::VideoCodecComplexity::kComplexityHigher);
557 ref_codec.VP8()->denoisingOn = false;
558 ref_codec.startBitrate = 100; // Should equal to the target bitrate.
559 VerifyCodec(ref_codec, 0);
560
561 // stream 1
562 InitRefCodec(1, &ref_codec);
563 ref_codec.VP8()->denoisingOn = false;
564 // The start bitrate (300kbit) minus what we have for the lower layers
565 // (100kbit).
566 ref_codec.startBitrate = 200;
567 VerifyCodec(ref_codec, 1);
568
569 // stream 2, the biggest resolution stream.
570 InitRefCodec(2, &ref_codec);
571 // We don't have enough bits to send this, so the adapter should have
572 // configured it to use the min bitrate for this layer (600kbit) but turn
573 // off sending.
574 ref_codec.startBitrate = 600;
575 VerifyCodec(ref_codec, 2);
576 }
577
578 protected:
579 std::unique_ptr<TestSimulcastEncoderAdapterFakeHelper> helper_;
580 std::unique_ptr<VideoEncoder> adapter_;
581 VideoCodec codec_;
582 int last_encoded_image_width_;
583 int last_encoded_image_height_;
584 int last_encoded_image_simulcast_index_;
585 std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
586 bool use_fallback_factory_;
587 SdpVideoFormat::Parameters sdp_video_parameters_;
588 };
589
TEST_F(TestSimulcastEncoderAdapterFake,InitEncode)590 TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) {
591 SetupCodec();
592 VerifyCodecSettings();
593 }
594
TEST_F(TestSimulcastEncoderAdapterFake,ReleaseWithoutInitEncode)595 TEST_F(TestSimulcastEncoderAdapterFake, ReleaseWithoutInitEncode) {
596 EXPECT_EQ(0, adapter_->Release());
597 }
598
TEST_F(TestSimulcastEncoderAdapterFake,Reinit)599 TEST_F(TestSimulcastEncoderAdapterFake, Reinit) {
600 SetupCodec();
601 EXPECT_EQ(0, adapter_->Release());
602
603 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
604 }
605
TEST_F(TestSimulcastEncoderAdapterFake,EncodedCallbackForDifferentEncoders)606 TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) {
607 SetupCodec();
608
609 // Set bitrates so that we send all layers.
610 adapter_->SetRates(VideoEncoder::RateControlParameters(
611 rate_allocator_->Allocate(VideoBitrateAllocationParameters(1200, 30)),
612 30.0));
613
614 // At this point, the simulcast encoder adapter should have 3 streams: HD,
615 // quarter HD, and quarter quarter HD. We're going to mostly ignore the exact
616 // resolutions, to test that the adapter forwards on the correct resolution
617 // and simulcast index values, going only off the encoder that generates the
618 // image.
619 std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
620 ASSERT_EQ(3u, encoders.size());
621 encoders[0]->SendEncodedImage(1152, 704);
622 int width;
623 int height;
624 int simulcast_index;
625 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
626 EXPECT_EQ(1152, width);
627 EXPECT_EQ(704, height);
628 // SEA doesn't intercept frame encode complete callback for the lowest stream.
629 EXPECT_EQ(-1, simulcast_index);
630
631 encoders[1]->SendEncodedImage(300, 620);
632 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
633 EXPECT_EQ(300, width);
634 EXPECT_EQ(620, height);
635 EXPECT_EQ(1, simulcast_index);
636
637 encoders[2]->SendEncodedImage(120, 240);
638 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
639 EXPECT_EQ(120, width);
640 EXPECT_EQ(240, height);
641 EXPECT_EQ(2, simulcast_index);
642 }
643
644 // This test verifies that the underlying encoders are reused, when the adapter
645 // is reinited with different number of simulcast streams. It further checks
646 // that the allocated encoders are reused in the same order as before, starting
647 // with the lowest stream.
TEST_F(TestSimulcastEncoderAdapterFake,ReusesEncodersInOrder)648 TEST_F(TestSimulcastEncoderAdapterFake, ReusesEncodersInOrder) {
649 // Set up common settings for three streams.
650 SimulcastTestFixtureImpl::DefaultSettings(
651 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
652 kVideoCodecVP8);
653 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
654 adapter_->RegisterEncodeCompleteCallback(this);
655 const uint32_t target_bitrate =
656 1000 * (codec_.simulcastStream[0].targetBitrate +
657 codec_.simulcastStream[1].targetBitrate +
658 codec_.simulcastStream[2].minBitrate);
659
660 // Input data.
661 rtc::scoped_refptr<VideoFrameBuffer> buffer(I420Buffer::Create(1280, 720));
662 VideoFrame input_frame = VideoFrame::Builder()
663 .set_video_frame_buffer(buffer)
664 .set_timestamp_rtp(100)
665 .set_timestamp_ms(1000)
666 .set_rotation(kVideoRotation_180)
667 .build();
668 std::vector<VideoFrameType> frame_types;
669
670 // Encode with three streams.
671 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
672 VerifyCodecSettings();
673 adapter_->SetRates(VideoEncoder::RateControlParameters(
674 rate_allocator_->Allocate(
675 VideoBitrateAllocationParameters(target_bitrate, 30)),
676 30.0));
677
678 std::vector<MockVideoEncoder*> original_encoders =
679 helper_->factory()->encoders();
680 ASSERT_EQ(3u, original_encoders.size());
681 EXPECT_CALL(*original_encoders[0], Encode(_, _))
682 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
683 EXPECT_CALL(*original_encoders[1], Encode(_, _))
684 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
685 EXPECT_CALL(*original_encoders[2], Encode(_, _))
686 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
687 frame_types.resize(3, VideoFrameType::kVideoFrameKey);
688 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
689 EXPECT_CALL(*original_encoders[0], Release())
690 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
691 EXPECT_CALL(*original_encoders[1], Release())
692 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
693 EXPECT_CALL(*original_encoders[2], Release())
694 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
695 EXPECT_EQ(0, adapter_->Release());
696
697 // Encode with two streams.
698 codec_.width /= 2;
699 codec_.height /= 2;
700 codec_.numberOfSimulcastStreams = 2;
701 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
702 adapter_->SetRates(VideoEncoder::RateControlParameters(
703 rate_allocator_->Allocate(
704 VideoBitrateAllocationParameters(target_bitrate, 30)),
705 30.0));
706 std::vector<MockVideoEncoder*> new_encoders = helper_->factory()->encoders();
707 ASSERT_EQ(2u, new_encoders.size());
708 ASSERT_EQ(original_encoders[0], new_encoders[0]);
709 EXPECT_CALL(*original_encoders[0], Encode(_, _))
710 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
711 ASSERT_EQ(original_encoders[1], new_encoders[1]);
712 EXPECT_CALL(*original_encoders[1], Encode(_, _))
713 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
714 frame_types.resize(2, VideoFrameType::kVideoFrameKey);
715 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
716 EXPECT_CALL(*original_encoders[0], Release())
717 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
718 EXPECT_CALL(*original_encoders[1], Release())
719 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
720 EXPECT_EQ(0, adapter_->Release());
721
722 // Encode with single stream.
723 codec_.width /= 2;
724 codec_.height /= 2;
725 codec_.numberOfSimulcastStreams = 1;
726 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
727 adapter_->SetRates(VideoEncoder::RateControlParameters(
728 rate_allocator_->Allocate(
729 VideoBitrateAllocationParameters(target_bitrate, 30)),
730 30.0));
731 new_encoders = helper_->factory()->encoders();
732 ASSERT_EQ(1u, new_encoders.size());
733 ASSERT_EQ(original_encoders[0], new_encoders[0]);
734 EXPECT_CALL(*original_encoders[0], Encode(_, _))
735 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
736 frame_types.resize(1, VideoFrameType::kVideoFrameKey);
737 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
738 EXPECT_CALL(*original_encoders[0], Release())
739 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
740 EXPECT_EQ(0, adapter_->Release());
741
742 // Encode with three streams, again.
743 codec_.width *= 4;
744 codec_.height *= 4;
745 codec_.numberOfSimulcastStreams = 3;
746 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
747 adapter_->SetRates(VideoEncoder::RateControlParameters(
748 rate_allocator_->Allocate(
749 VideoBitrateAllocationParameters(target_bitrate, 30)),
750 30.0));
751 new_encoders = helper_->factory()->encoders();
752 ASSERT_EQ(3u, new_encoders.size());
753 // The first encoder is reused.
754 ASSERT_EQ(original_encoders[0], new_encoders[0]);
755 EXPECT_CALL(*original_encoders[0], Encode(_, _))
756 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
757 // The second and third encoders are new.
758 EXPECT_CALL(*new_encoders[1], Encode(_, _))
759 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
760 EXPECT_CALL(*new_encoders[2], Encode(_, _))
761 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
762 frame_types.resize(3, VideoFrameType::kVideoFrameKey);
763 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
764 EXPECT_CALL(*original_encoders[0], Release())
765 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
766 EXPECT_CALL(*new_encoders[1], Release())
767 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
768 EXPECT_CALL(*new_encoders[2], Release())
769 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
770 EXPECT_EQ(0, adapter_->Release());
771 }
772
TEST_F(TestSimulcastEncoderAdapterFake,DoesNotLeakEncoders)773 TEST_F(TestSimulcastEncoderAdapterFake, DoesNotLeakEncoders) {
774 SetupCodec();
775 VerifyCodecSettings();
776
777 EXPECT_EQ(3u, helper_->factory()->encoders().size());
778
779 // The adapter should destroy all encoders it has allocated. Since
780 // `helper_->factory()` is owned by `adapter_`, however, we need to rely on
781 // lsan to find leaks here.
782 EXPECT_EQ(0, adapter_->Release());
783 adapter_.reset();
784 }
785
786 // This test verifies that an adapter reinit with the same codec settings as
787 // before does not change the underlying encoder codec settings.
TEST_F(TestSimulcastEncoderAdapterFake,ReinitDoesNotReorderEncoderSettings)788 TEST_F(TestSimulcastEncoderAdapterFake, ReinitDoesNotReorderEncoderSettings) {
789 SetupCodec();
790 VerifyCodecSettings();
791
792 // Capture current codec settings.
793 std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
794 ASSERT_EQ(3u, encoders.size());
795 std::array<VideoCodec, 3> codecs_before;
796 for (int i = 0; i < 3; ++i) {
797 codecs_before[i] = encoders[i]->codec();
798 }
799
800 // Reinitialize and verify that the new codec settings are the same.
801 EXPECT_EQ(0, adapter_->Release());
802 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
803 for (int i = 0; i < 3; ++i) {
804 const VideoCodec& codec_before = codecs_before[i];
805 const VideoCodec& codec_after = encoders[i]->codec();
806
807 // webrtc::VideoCodec does not implement operator==.
808 EXPECT_EQ(codec_before.codecType, codec_after.codecType);
809 EXPECT_EQ(codec_before.width, codec_after.width);
810 EXPECT_EQ(codec_before.height, codec_after.height);
811 EXPECT_EQ(codec_before.startBitrate, codec_after.startBitrate);
812 EXPECT_EQ(codec_before.maxBitrate, codec_after.maxBitrate);
813 EXPECT_EQ(codec_before.minBitrate, codec_after.minBitrate);
814 EXPECT_EQ(codec_before.maxFramerate, codec_after.maxFramerate);
815 EXPECT_EQ(codec_before.qpMax, codec_after.qpMax);
816 EXPECT_EQ(codec_before.numberOfSimulcastStreams,
817 codec_after.numberOfSimulcastStreams);
818 EXPECT_EQ(codec_before.mode, codec_after.mode);
819 EXPECT_EQ(codec_before.expect_encode_from_texture,
820 codec_after.expect_encode_from_texture);
821 }
822 }
823
824 // This test is similar to the one above, except that it tests the simulcastIdx
825 // from the CodecSpecificInfo that is connected to an encoded frame. The
826 // PayloadRouter demuxes the incoming encoded frames on different RTP modules
827 // using the simulcastIdx, so it's important that there is no corresponding
828 // encoder reordering in between adapter reinits as this would lead to PictureID
829 // discontinuities.
TEST_F(TestSimulcastEncoderAdapterFake,ReinitDoesNotReorderFrameSimulcastIdx)830 TEST_F(TestSimulcastEncoderAdapterFake, ReinitDoesNotReorderFrameSimulcastIdx) {
831 SetupCodec();
832 adapter_->SetRates(VideoEncoder::RateControlParameters(
833 rate_allocator_->Allocate(VideoBitrateAllocationParameters(1200, 30)),
834 30.0));
835 VerifyCodecSettings();
836
837 // Send frames on all streams.
838 std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
839 ASSERT_EQ(3u, encoders.size());
840 encoders[0]->SendEncodedImage(1152, 704);
841 int width;
842 int height;
843 int simulcast_index;
844 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
845 // SEA doesn't intercept frame encode complete callback for the lowest stream.
846 EXPECT_EQ(-1, simulcast_index);
847
848 encoders[1]->SendEncodedImage(300, 620);
849 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
850 EXPECT_EQ(1, simulcast_index);
851
852 encoders[2]->SendEncodedImage(120, 240);
853 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
854 EXPECT_EQ(2, simulcast_index);
855
856 // Reinitialize.
857 EXPECT_EQ(0, adapter_->Release());
858 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
859 adapter_->SetRates(VideoEncoder::RateControlParameters(
860 rate_allocator_->Allocate(VideoBitrateAllocationParameters(1200, 30)),
861 30.0));
862
863 // Verify that the same encoder sends out frames on the same simulcast index.
864 encoders[0]->SendEncodedImage(1152, 704);
865 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
866 EXPECT_EQ(-1, simulcast_index);
867
868 encoders[1]->SendEncodedImage(300, 620);
869 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
870 EXPECT_EQ(1, simulcast_index);
871
872 encoders[2]->SendEncodedImage(120, 240);
873 EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
874 EXPECT_EQ(2, simulcast_index);
875 }
876
TEST_F(TestSimulcastEncoderAdapterFake,SupportsNativeHandleForSingleStreams)877 TEST_F(TestSimulcastEncoderAdapterFake, SupportsNativeHandleForSingleStreams) {
878 SimulcastTestFixtureImpl::DefaultSettings(
879 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
880 kVideoCodecVP8);
881 codec_.numberOfSimulcastStreams = 1;
882 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
883 adapter_->RegisterEncodeCompleteCallback(this);
884 ASSERT_EQ(1u, helper_->factory()->encoders().size());
885 helper_->factory()->encoders()[0]->set_supports_native_handle(true);
886 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
887 EXPECT_TRUE(adapter_->GetEncoderInfo().supports_native_handle);
888 helper_->factory()->encoders()[0]->set_supports_native_handle(false);
889 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
890 EXPECT_FALSE(adapter_->GetEncoderInfo().supports_native_handle);
891 }
892
TEST_F(TestSimulcastEncoderAdapterFake,SetRatesUnderMinBitrate)893 TEST_F(TestSimulcastEncoderAdapterFake, SetRatesUnderMinBitrate) {
894 SimulcastTestFixtureImpl::DefaultSettings(
895 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
896 kVideoCodecVP8);
897 codec_.minBitrate = 50;
898 codec_.numberOfSimulcastStreams = 1;
899 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
900 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
901
902 // Above min should be respected.
903 VideoBitrateAllocation target_bitrate = rate_allocator_->Allocate(
904 VideoBitrateAllocationParameters(codec_.minBitrate * 1000, 30));
905 adapter_->SetRates(VideoEncoder::RateControlParameters(target_bitrate, 30.0));
906 EXPECT_EQ(target_bitrate,
907 helper_->factory()->encoders()[0]->last_set_rates().bitrate);
908
909 // Below min but non-zero should be replaced with the min bitrate.
910 VideoBitrateAllocation too_low_bitrate = rate_allocator_->Allocate(
911 VideoBitrateAllocationParameters((codec_.minBitrate - 1) * 1000, 30));
912 adapter_->SetRates(
913 VideoEncoder::RateControlParameters(too_low_bitrate, 30.0));
914 EXPECT_EQ(target_bitrate,
915 helper_->factory()->encoders()[0]->last_set_rates().bitrate);
916
917 // Zero should be passed on as is, since it means "pause".
918 adapter_->SetRates(
919 VideoEncoder::RateControlParameters(VideoBitrateAllocation(), 30.0));
920 EXPECT_EQ(VideoBitrateAllocation(),
921 helper_->factory()->encoders()[0]->last_set_rates().bitrate);
922 }
923
TEST_F(TestSimulcastEncoderAdapterFake,SupportsImplementationName)924 TEST_F(TestSimulcastEncoderAdapterFake, SupportsImplementationName) {
925 SimulcastTestFixtureImpl::DefaultSettings(
926 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
927 kVideoCodecVP8);
928 std::vector<const char*> encoder_names;
929 encoder_names.push_back("codec1");
930 encoder_names.push_back("codec2");
931 encoder_names.push_back("codec3");
932 helper_->factory()->SetEncoderNames(encoder_names);
933 EXPECT_EQ("SimulcastEncoderAdapter",
934 adapter_->GetEncoderInfo().implementation_name);
935 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
936 EXPECT_EQ("SimulcastEncoderAdapter (codec1, codec2, codec3)",
937 adapter_->GetEncoderInfo().implementation_name);
938
939 // Single streams should not expose "SimulcastEncoderAdapter" in name.
940 EXPECT_EQ(0, adapter_->Release());
941 codec_.numberOfSimulcastStreams = 1;
942 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
943 adapter_->RegisterEncodeCompleteCallback(this);
944 ASSERT_EQ(1u, helper_->factory()->encoders().size());
945 EXPECT_EQ("codec1", adapter_->GetEncoderInfo().implementation_name);
946 }
947
TEST_F(TestSimulcastEncoderAdapterFake,RuntimeEncoderInfoUpdate)948 TEST_F(TestSimulcastEncoderAdapterFake, RuntimeEncoderInfoUpdate) {
949 SimulcastTestFixtureImpl::DefaultSettings(
950 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
951 kVideoCodecVP8);
952 std::vector<const char*> encoder_names;
953 encoder_names.push_back("codec1");
954 encoder_names.push_back("codec2");
955 encoder_names.push_back("codec3");
956 helper_->factory()->SetEncoderNames(encoder_names);
957 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
958 EXPECT_EQ("SimulcastEncoderAdapter (codec1, codec2, codec3)",
959 adapter_->GetEncoderInfo().implementation_name);
960
961 // Change name of first encoder to indicate it has done a fallback to another
962 // implementation.
963 helper_->factory()->encoders().front()->set_implementation_name("fallback1");
964 EXPECT_EQ("SimulcastEncoderAdapter (fallback1, codec2, codec3)",
965 adapter_->GetEncoderInfo().implementation_name);
966 }
967
TEST_F(TestSimulcastEncoderAdapterFake,SupportsNativeHandleForMultipleStreams)968 TEST_F(TestSimulcastEncoderAdapterFake,
969 SupportsNativeHandleForMultipleStreams) {
970 SimulcastTestFixtureImpl::DefaultSettings(
971 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
972 kVideoCodecVP8);
973 codec_.numberOfSimulcastStreams = 3;
974 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
975 adapter_->RegisterEncodeCompleteCallback(this);
976 ASSERT_EQ(3u, helper_->factory()->encoders().size());
977 for (MockVideoEncoder* encoder : helper_->factory()->encoders())
978 encoder->set_supports_native_handle(true);
979 // As long as one encoder supports native handle, it's enabled.
980 helper_->factory()->encoders()[0]->set_supports_native_handle(false);
981 EXPECT_TRUE(adapter_->GetEncoderInfo().supports_native_handle);
982 // Once none do, then the adapter claims no support.
983 helper_->factory()->encoders()[1]->set_supports_native_handle(false);
984 helper_->factory()->encoders()[2]->set_supports_native_handle(false);
985 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
986 EXPECT_FALSE(adapter_->GetEncoderInfo().supports_native_handle);
987 }
988
989 class FakeNativeBufferI420 : public VideoFrameBuffer {
990 public:
FakeNativeBufferI420(int width,int height,bool allow_to_i420)991 FakeNativeBufferI420(int width, int height, bool allow_to_i420)
992 : width_(width), height_(height), allow_to_i420_(allow_to_i420) {}
993
type() const994 Type type() const override { return Type::kNative; }
width() const995 int width() const override { return width_; }
height() const996 int height() const override { return height_; }
997
ToI420()998 rtc::scoped_refptr<I420BufferInterface> ToI420() override {
999 if (allow_to_i420_) {
1000 return I420Buffer::Create(width_, height_);
1001 } else {
1002 RTC_DCHECK_NOTREACHED();
1003 }
1004 return nullptr;
1005 }
1006
1007 private:
1008 const int width_;
1009 const int height_;
1010 const bool allow_to_i420_;
1011 };
1012
TEST_F(TestSimulcastEncoderAdapterFake,NativeHandleForwardingForMultipleStreams)1013 TEST_F(TestSimulcastEncoderAdapterFake,
1014 NativeHandleForwardingForMultipleStreams) {
1015 SimulcastTestFixtureImpl::DefaultSettings(
1016 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1017 kVideoCodecVP8);
1018 codec_.numberOfSimulcastStreams = 3;
1019 // High start bitrate, so all streams are enabled.
1020 codec_.startBitrate = 3000;
1021 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1022 adapter_->RegisterEncodeCompleteCallback(this);
1023 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1024 for (MockVideoEncoder* encoder : helper_->factory()->encoders())
1025 encoder->set_supports_native_handle(true);
1026 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1027 EXPECT_TRUE(adapter_->GetEncoderInfo().supports_native_handle);
1028
1029 rtc::scoped_refptr<VideoFrameBuffer> buffer(
1030 rtc::make_ref_counted<FakeNativeBufferI420>(1280, 720,
1031 /*allow_to_i420=*/false));
1032 VideoFrame input_frame = VideoFrame::Builder()
1033 .set_video_frame_buffer(buffer)
1034 .set_timestamp_rtp(100)
1035 .set_timestamp_ms(1000)
1036 .set_rotation(kVideoRotation_180)
1037 .build();
1038 // Expect calls with the given video frame verbatim, since it's a texture
1039 // frame and can't otherwise be modified/resized.
1040 for (MockVideoEncoder* encoder : helper_->factory()->encoders())
1041 EXPECT_CALL(*encoder, Encode(::testing::Ref(input_frame), _)).Times(1);
1042 std::vector<VideoFrameType> frame_types(3, VideoFrameType::kVideoFrameKey);
1043 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1044 }
1045
TEST_F(TestSimulcastEncoderAdapterFake,NativeHandleForwardingOnlyIfSupported)1046 TEST_F(TestSimulcastEncoderAdapterFake, NativeHandleForwardingOnlyIfSupported) {
1047 SimulcastTestFixtureImpl::DefaultSettings(
1048 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1049 kVideoCodecVP8);
1050 codec_.numberOfSimulcastStreams = 3;
1051 // High start bitrate, so all streams are enabled.
1052 codec_.startBitrate = 3000;
1053 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1054 adapter_->RegisterEncodeCompleteCallback(this);
1055 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1056
1057 // QVGA encoders has fallen back to software.
1058 auto& encoders = helper_->factory()->encoders();
1059 encoders[0]->set_supports_native_handle(false);
1060 encoders[1]->set_supports_native_handle(true);
1061 encoders[2]->set_supports_native_handle(true);
1062
1063 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1064 EXPECT_TRUE(adapter_->GetEncoderInfo().supports_native_handle);
1065
1066 rtc::scoped_refptr<VideoFrameBuffer> buffer(
1067 rtc::make_ref_counted<FakeNativeBufferI420>(1280, 720,
1068 /*allow_to_i420=*/true));
1069 VideoFrame input_frame = VideoFrame::Builder()
1070 .set_video_frame_buffer(buffer)
1071 .set_timestamp_rtp(100)
1072 .set_timestamp_ms(1000)
1073 .set_rotation(kVideoRotation_180)
1074 .build();
1075 // Expect calls with the given video frame verbatim, since it's a texture
1076 // frame and can't otherwise be modified/resized, but only on the two
1077 // streams supporting it...
1078 EXPECT_CALL(*encoders[1], Encode(::testing::Ref(input_frame), _)).Times(1);
1079 EXPECT_CALL(*encoders[2], Encode(::testing::Ref(input_frame), _)).Times(1);
1080 // ...the lowest one gets a software buffer.
1081 EXPECT_CALL(*encoders[0], Encode)
1082 .WillOnce([&](const VideoFrame& frame,
1083 const std::vector<VideoFrameType>* frame_types) {
1084 EXPECT_EQ(frame.video_frame_buffer()->type(),
1085 VideoFrameBuffer::Type::kI420);
1086 return 0;
1087 });
1088 std::vector<VideoFrameType> frame_types(3, VideoFrameType::kVideoFrameKey);
1089 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1090 }
1091
TEST_F(TestSimulcastEncoderAdapterFake,GeneratesKeyFramesOnRequestedLayers)1092 TEST_F(TestSimulcastEncoderAdapterFake, GeneratesKeyFramesOnRequestedLayers) {
1093 // Set up common settings for three streams.
1094 SimulcastTestFixtureImpl::DefaultSettings(
1095 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1096 kVideoCodecVP8);
1097 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
1098 adapter_->RegisterEncodeCompleteCallback(this);
1099
1100 // Input data.
1101 rtc::scoped_refptr<VideoFrameBuffer> buffer(I420Buffer::Create(1280, 720));
1102
1103 // Encode with three streams.
1104 codec_.startBitrate = 3000;
1105 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1106
1107 std::vector<VideoFrameType> frame_types;
1108 frame_types.resize(3, VideoFrameType::kVideoFrameKey);
1109
1110 std::vector<VideoFrameType> expected_keyframe(1,
1111 VideoFrameType::kVideoFrameKey);
1112 std::vector<VideoFrameType> expected_deltaframe(
1113 1, VideoFrameType::kVideoFrameDelta);
1114
1115 std::vector<MockVideoEncoder*> original_encoders =
1116 helper_->factory()->encoders();
1117 ASSERT_EQ(3u, original_encoders.size());
1118 EXPECT_CALL(*original_encoders[0],
1119 Encode(_, ::testing::Pointee(::testing::Eq(expected_keyframe))))
1120 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1121 EXPECT_CALL(*original_encoders[1],
1122 Encode(_, ::testing::Pointee(::testing::Eq(expected_keyframe))))
1123 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1124 EXPECT_CALL(*original_encoders[2],
1125 Encode(_, ::testing::Pointee(::testing::Eq(expected_keyframe))))
1126 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1127 VideoFrame first_frame = VideoFrame::Builder()
1128 .set_video_frame_buffer(buffer)
1129 .set_timestamp_rtp(0)
1130 .set_timestamp_ms(0)
1131 .build();
1132 EXPECT_EQ(0, adapter_->Encode(first_frame, &frame_types));
1133
1134 // Request [key, delta, delta].
1135 EXPECT_CALL(*original_encoders[0],
1136 Encode(_, ::testing::Pointee(::testing::Eq(expected_keyframe))))
1137 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1138 EXPECT_CALL(*original_encoders[1],
1139 Encode(_, ::testing::Pointee(::testing::Eq(expected_deltaframe))))
1140 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1141 EXPECT_CALL(*original_encoders[2],
1142 Encode(_, ::testing::Pointee(::testing::Eq(expected_deltaframe))))
1143 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1144 frame_types[1] = VideoFrameType::kVideoFrameKey;
1145 frame_types[1] = VideoFrameType::kVideoFrameDelta;
1146 frame_types[2] = VideoFrameType::kVideoFrameDelta;
1147 VideoFrame second_frame = VideoFrame::Builder()
1148 .set_video_frame_buffer(buffer)
1149 .set_timestamp_rtp(10000)
1150 .set_timestamp_ms(100000)
1151 .build();
1152 EXPECT_EQ(0, adapter_->Encode(second_frame, &frame_types));
1153
1154 // Request [delta, key, delta].
1155 EXPECT_CALL(*original_encoders[0],
1156 Encode(_, ::testing::Pointee(::testing::Eq(expected_deltaframe))))
1157 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1158 EXPECT_CALL(*original_encoders[1],
1159 Encode(_, ::testing::Pointee(::testing::Eq(expected_keyframe))))
1160 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1161 EXPECT_CALL(*original_encoders[2],
1162 Encode(_, ::testing::Pointee(::testing::Eq(expected_deltaframe))))
1163 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1164 frame_types[0] = VideoFrameType::kVideoFrameDelta;
1165 frame_types[1] = VideoFrameType::kVideoFrameKey;
1166 frame_types[2] = VideoFrameType::kVideoFrameDelta;
1167 VideoFrame third_frame = VideoFrame::Builder()
1168 .set_video_frame_buffer(buffer)
1169 .set_timestamp_rtp(20000)
1170 .set_timestamp_ms(200000)
1171 .build();
1172 EXPECT_EQ(0, adapter_->Encode(third_frame, &frame_types));
1173 }
1174
TEST_F(TestSimulcastEncoderAdapterFake,TestFailureReturnCodesFromEncodeCalls)1175 TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) {
1176 SimulcastTestFixtureImpl::DefaultSettings(
1177 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1178 kVideoCodecVP8);
1179 codec_.numberOfSimulcastStreams = 3;
1180 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1181 adapter_->RegisterEncodeCompleteCallback(this);
1182 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1183 // Tell the 2nd encoder to request software fallback.
1184 EXPECT_CALL(*helper_->factory()->encoders()[1], Encode(_, _))
1185 .WillOnce(Return(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE));
1186
1187 // Send a fake frame and assert the return is software fallback.
1188 rtc::scoped_refptr<I420Buffer> input_buffer =
1189 I420Buffer::Create(kDefaultWidth, kDefaultHeight);
1190 input_buffer->InitializeData();
1191 VideoFrame input_frame = VideoFrame::Builder()
1192 .set_video_frame_buffer(input_buffer)
1193 .set_timestamp_rtp(0)
1194 .set_timestamp_us(0)
1195 .set_rotation(kVideoRotation_0)
1196 .build();
1197 std::vector<VideoFrameType> frame_types(3, VideoFrameType::kVideoFrameKey);
1198 EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE,
1199 adapter_->Encode(input_frame, &frame_types));
1200 }
1201
TEST_F(TestSimulcastEncoderAdapterFake,TestInitFailureCleansUpEncoders)1202 TEST_F(TestSimulcastEncoderAdapterFake, TestInitFailureCleansUpEncoders) {
1203 SimulcastTestFixtureImpl::DefaultSettings(
1204 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1205 kVideoCodecVP8);
1206 codec_.numberOfSimulcastStreams = 3;
1207 helper_->factory()->set_init_encode_return_value(
1208 WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
1209 EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE,
1210 adapter_->InitEncode(&codec_, kSettings));
1211 EXPECT_TRUE(helper_->factory()->encoders().empty());
1212 }
1213
TEST_F(TestSimulcastEncoderAdapterFake,DoesNotAlterMaxQpForScreenshare)1214 TEST_F(TestSimulcastEncoderAdapterFake, DoesNotAlterMaxQpForScreenshare) {
1215 const int kHighMaxQp = 56;
1216 const int kLowMaxQp = 46;
1217
1218 SimulcastTestFixtureImpl::DefaultSettings(
1219 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1220 kVideoCodecVP8);
1221 codec_.numberOfSimulcastStreams = 3;
1222 codec_.simulcastStream[0].qpMax = kHighMaxQp;
1223 codec_.mode = VideoCodecMode::kScreensharing;
1224
1225 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1226 EXPECT_EQ(3u, helper_->factory()->encoders().size());
1227
1228 // Just check the lowest stream, which is the one that where the adapter
1229 // might alter the max qp setting.
1230 VideoCodec ref_codec;
1231 InitRefCodec(0, &ref_codec);
1232 ref_codec.qpMax = kHighMaxQp;
1233 ref_codec.SetVideoEncoderComplexity(
1234 webrtc::VideoCodecComplexity::kComplexityHigher);
1235 ref_codec.VP8()->denoisingOn = false;
1236 ref_codec.startBitrate = 100; // Should equal to the target bitrate.
1237 VerifyCodec(ref_codec, 0);
1238
1239 // Change the max qp and try again.
1240 codec_.simulcastStream[0].qpMax = kLowMaxQp;
1241 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1242 EXPECT_EQ(3u, helper_->factory()->encoders().size());
1243 ref_codec.qpMax = kLowMaxQp;
1244 VerifyCodec(ref_codec, 0);
1245 }
1246
TEST_F(TestSimulcastEncoderAdapterFake,DoesNotAlterMaxQpForScreenshareReversedLayer)1247 TEST_F(TestSimulcastEncoderAdapterFake,
1248 DoesNotAlterMaxQpForScreenshareReversedLayer) {
1249 const int kHighMaxQp = 56;
1250 const int kLowMaxQp = 46;
1251
1252 SimulcastTestFixtureImpl::DefaultSettings(
1253 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1254 kVideoCodecVP8, true /* reverse_layer_order */);
1255 codec_.numberOfSimulcastStreams = 3;
1256 codec_.simulcastStream[2].qpMax = kHighMaxQp;
1257 codec_.mode = VideoCodecMode::kScreensharing;
1258
1259 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1260 EXPECT_EQ(3u, helper_->factory()->encoders().size());
1261
1262 // Just check the lowest stream, which is the one that where the adapter
1263 // might alter the max qp setting.
1264 VideoCodec ref_codec;
1265 InitRefCodec(2, &ref_codec, true /* reverse_layer_order */);
1266 ref_codec.qpMax = kHighMaxQp;
1267 ref_codec.SetVideoEncoderComplexity(
1268 webrtc::VideoCodecComplexity::kComplexityHigher);
1269 ref_codec.VP8()->denoisingOn = false;
1270 ref_codec.startBitrate = 100; // Should equal to the target bitrate.
1271 VerifyCodec(ref_codec, 2);
1272
1273 // Change the max qp and try again.
1274 codec_.simulcastStream[2].qpMax = kLowMaxQp;
1275 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1276 EXPECT_EQ(3u, helper_->factory()->encoders().size());
1277 ref_codec.qpMax = kLowMaxQp;
1278 VerifyCodec(ref_codec, 2);
1279 }
1280
TEST_F(TestSimulcastEncoderAdapterFake,ActivatesCorrectStreamsInInitEncode)1281 TEST_F(TestSimulcastEncoderAdapterFake, ActivatesCorrectStreamsInInitEncode) {
1282 // Set up common settings for three streams.
1283 SimulcastTestFixtureImpl::DefaultSettings(
1284 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1285 kVideoCodecVP8);
1286 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
1287 adapter_->RegisterEncodeCompleteCallback(this);
1288
1289 // Only enough start bitrate for the lowest stream.
1290 ASSERT_EQ(3u, codec_.numberOfSimulcastStreams);
1291 codec_.startBitrate = codec_.simulcastStream[0].targetBitrate +
1292 codec_.simulcastStream[1].minBitrate - 1;
1293
1294 // Input data.
1295 rtc::scoped_refptr<VideoFrameBuffer> buffer(I420Buffer::Create(1280, 720));
1296 VideoFrame input_frame = VideoFrame::Builder()
1297 .set_video_frame_buffer(buffer)
1298 .set_timestamp_rtp(100)
1299 .set_timestamp_ms(1000)
1300 .set_rotation(kVideoRotation_180)
1301 .build();
1302
1303 // Encode with three streams.
1304 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1305 std::vector<MockVideoEncoder*> original_encoders =
1306 helper_->factory()->encoders();
1307 ASSERT_EQ(3u, original_encoders.size());
1308 // Only first encoder will be active and called.
1309 EXPECT_CALL(*original_encoders[0], Encode(_, _))
1310 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1311 EXPECT_CALL(*original_encoders[1], Encode(_, _)).Times(0);
1312 EXPECT_CALL(*original_encoders[2], Encode(_, _)).Times(0);
1313
1314 std::vector<VideoFrameType> frame_types;
1315 frame_types.resize(3, VideoFrameType::kVideoFrameKey);
1316 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1317 }
1318
TEST_F(TestSimulcastEncoderAdapterFake,TrustedRateControl)1319 TEST_F(TestSimulcastEncoderAdapterFake, TrustedRateControl) {
1320 // Set up common settings for three streams.
1321 SimulcastTestFixtureImpl::DefaultSettings(
1322 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1323 kVideoCodecVP8);
1324 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
1325 adapter_->RegisterEncodeCompleteCallback(this);
1326
1327 // Only enough start bitrate for the lowest stream.
1328 ASSERT_EQ(3u, codec_.numberOfSimulcastStreams);
1329 codec_.startBitrate = codec_.simulcastStream[0].targetBitrate +
1330 codec_.simulcastStream[1].minBitrate - 1;
1331
1332 // Input data.
1333 rtc::scoped_refptr<VideoFrameBuffer> buffer(I420Buffer::Create(1280, 720));
1334 VideoFrame input_frame = VideoFrame::Builder()
1335 .set_video_frame_buffer(buffer)
1336 .set_timestamp_rtp(100)
1337 .set_timestamp_ms(1000)
1338 .set_rotation(kVideoRotation_180)
1339 .build();
1340
1341 // No encoder trusted, so simulcast adapter should not be either.
1342 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1343 EXPECT_FALSE(adapter_->GetEncoderInfo().has_trusted_rate_controller);
1344
1345 // Encode with three streams.
1346 std::vector<MockVideoEncoder*> original_encoders =
1347 helper_->factory()->encoders();
1348
1349 // All encoders are trusted, so simulcast adapter should be too.
1350 original_encoders[0]->set_has_trusted_rate_controller(true);
1351 original_encoders[1]->set_has_trusted_rate_controller(true);
1352 original_encoders[2]->set_has_trusted_rate_controller(true);
1353 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1354 EXPECT_TRUE(adapter_->GetEncoderInfo().has_trusted_rate_controller);
1355
1356 // One encoder not trusted, so simulcast adapter should not be either.
1357 original_encoders[2]->set_has_trusted_rate_controller(false);
1358 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1359 EXPECT_FALSE(adapter_->GetEncoderInfo().has_trusted_rate_controller);
1360
1361 // No encoder trusted, so simulcast adapter should not be either.
1362 original_encoders[0]->set_has_trusted_rate_controller(false);
1363 original_encoders[1]->set_has_trusted_rate_controller(false);
1364 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1365 EXPECT_FALSE(adapter_->GetEncoderInfo().has_trusted_rate_controller);
1366 }
1367
TEST_F(TestSimulcastEncoderAdapterFake,ReportsHardwareAccelerated)1368 TEST_F(TestSimulcastEncoderAdapterFake, ReportsHardwareAccelerated) {
1369 SimulcastTestFixtureImpl::DefaultSettings(
1370 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1371 kVideoCodecVP8);
1372 codec_.numberOfSimulcastStreams = 3;
1373 adapter_->RegisterEncodeCompleteCallback(this);
1374 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1375 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1376
1377 // None of the encoders uses HW support, so simulcast adapter reports false.
1378 for (MockVideoEncoder* encoder : helper_->factory()->encoders()) {
1379 encoder->set_is_hardware_accelerated(false);
1380 }
1381 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1382 EXPECT_FALSE(adapter_->GetEncoderInfo().is_hardware_accelerated);
1383
1384 // One encoder uses HW support, so simulcast adapter reports true.
1385 helper_->factory()->encoders()[2]->set_is_hardware_accelerated(true);
1386 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1387 EXPECT_TRUE(adapter_->GetEncoderInfo().is_hardware_accelerated);
1388 }
1389
TEST_F(TestSimulcastEncoderAdapterFake,ReportsLeastCommonMultipleOfRequestedResolutionAlignments)1390 TEST_F(TestSimulcastEncoderAdapterFake,
1391 ReportsLeastCommonMultipleOfRequestedResolutionAlignments) {
1392 SimulcastTestFixtureImpl::DefaultSettings(
1393 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1394 kVideoCodecVP8);
1395 codec_.numberOfSimulcastStreams = 3;
1396 helper_->factory()->set_requested_resolution_alignments({2, 4, 7});
1397 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1398
1399 EXPECT_EQ(adapter_->GetEncoderInfo().requested_resolution_alignment, 28);
1400 }
1401
TEST_F(TestSimulcastEncoderAdapterFake,ReportsApplyAlignmentToSimulcastLayers)1402 TEST_F(TestSimulcastEncoderAdapterFake,
1403 ReportsApplyAlignmentToSimulcastLayers) {
1404 SimulcastTestFixtureImpl::DefaultSettings(
1405 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1406 kVideoCodecVP8);
1407 codec_.numberOfSimulcastStreams = 3;
1408
1409 // No encoder has apply_alignment_to_all_simulcast_layers, report false.
1410 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1411 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1412 for (MockVideoEncoder* encoder : helper_->factory()->encoders()) {
1413 encoder->set_apply_alignment_to_all_simulcast_layers(false);
1414 }
1415 EXPECT_FALSE(
1416 adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers);
1417
1418 // One encoder has apply_alignment_to_all_simulcast_layers, report true.
1419 helper_->factory()
1420 ->encoders()[1]
1421 ->set_apply_alignment_to_all_simulcast_layers(true);
1422 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1423 EXPECT_TRUE(
1424 adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers);
1425 }
1426
TEST_F(TestSimulcastEncoderAdapterFake,EncoderInfoFromFieldTrialDoesNotOverrideExistingBitrateLimitsInSinglecast)1427 TEST_F(
1428 TestSimulcastEncoderAdapterFake,
1429 EncoderInfoFromFieldTrialDoesNotOverrideExistingBitrateLimitsInSinglecast) {
1430 test::ScopedFieldTrials field_trials(
1431 "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
1432 "frame_size_pixels:123|456|789,"
1433 "min_start_bitrate_bps:11000|22000|33000,"
1434 "min_bitrate_bps:44000|55000|66000,"
1435 "max_bitrate_bps:77000|88000|99000/");
1436
1437 std::vector<VideoEncoder::ResolutionBitrateLimits> bitrate_limits;
1438 bitrate_limits.push_back(
1439 VideoEncoder::ResolutionBitrateLimits(111, 11100, 44400, 77700));
1440 bitrate_limits.push_back(
1441 VideoEncoder::ResolutionBitrateLimits(444, 22200, 55500, 88700));
1442 bitrate_limits.push_back(
1443 VideoEncoder::ResolutionBitrateLimits(777, 33300, 66600, 99900));
1444 SetUp();
1445 helper_->factory()->set_resolution_bitrate_limits(bitrate_limits);
1446
1447 SimulcastTestFixtureImpl::DefaultSettings(
1448 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1449 kVideoCodecVP8);
1450 codec_.numberOfSimulcastStreams = 1;
1451 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1452 ASSERT_EQ(1u, helper_->factory()->encoders().size());
1453 EXPECT_EQ(adapter_->GetEncoderInfo().resolution_bitrate_limits,
1454 bitrate_limits);
1455 }
1456
TEST_F(TestSimulcastEncoderAdapterFake,EncoderInfoFromFieldTrial)1457 TEST_F(TestSimulcastEncoderAdapterFake, EncoderInfoFromFieldTrial) {
1458 test::ScopedFieldTrials field_trials(
1459 "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
1460 "requested_resolution_alignment:8,"
1461 "apply_alignment_to_all_simulcast_layers/");
1462 SetUp();
1463 SimulcastTestFixtureImpl::DefaultSettings(
1464 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1465 kVideoCodecVP8);
1466 codec_.numberOfSimulcastStreams = 3;
1467 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1468 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1469
1470 EXPECT_EQ(8, adapter_->GetEncoderInfo().requested_resolution_alignment);
1471 EXPECT_TRUE(
1472 adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers);
1473 EXPECT_TRUE(adapter_->GetEncoderInfo().resolution_bitrate_limits.empty());
1474 }
1475
TEST_F(TestSimulcastEncoderAdapterFake,EncoderInfoFromFieldTrialForSingleStream)1476 TEST_F(TestSimulcastEncoderAdapterFake,
1477 EncoderInfoFromFieldTrialForSingleStream) {
1478 test::ScopedFieldTrials field_trials(
1479 "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
1480 "requested_resolution_alignment:9,"
1481 "frame_size_pixels:123|456|789,"
1482 "min_start_bitrate_bps:11000|22000|33000,"
1483 "min_bitrate_bps:44000|55000|66000,"
1484 "max_bitrate_bps:77000|88000|99000/");
1485 SetUp();
1486 SimulcastTestFixtureImpl::DefaultSettings(
1487 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1488 kVideoCodecVP8);
1489 codec_.numberOfSimulcastStreams = 1;
1490 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1491 ASSERT_EQ(1u, helper_->factory()->encoders().size());
1492
1493 EXPECT_EQ(9, adapter_->GetEncoderInfo().requested_resolution_alignment);
1494 EXPECT_FALSE(
1495 adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers);
1496 EXPECT_THAT(
1497 adapter_->GetEncoderInfo().resolution_bitrate_limits,
1498 ::testing::ElementsAre(
1499 VideoEncoder::ResolutionBitrateLimits{123, 11000, 44000, 77000},
1500 VideoEncoder::ResolutionBitrateLimits{456, 22000, 55000, 88000},
1501 VideoEncoder::ResolutionBitrateLimits{789, 33000, 66000, 99000}));
1502 }
1503
TEST_F(TestSimulcastEncoderAdapterFake,ReportsIsQpTrusted)1504 TEST_F(TestSimulcastEncoderAdapterFake, ReportsIsQpTrusted) {
1505 SimulcastTestFixtureImpl::DefaultSettings(
1506 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1507 kVideoCodecVP8);
1508 codec_.numberOfSimulcastStreams = 3;
1509 adapter_->RegisterEncodeCompleteCallback(this);
1510 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1511 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1512
1513 // All encoders have internal source, simulcast adapter reports true.
1514 for (MockVideoEncoder* encoder : helper_->factory()->encoders()) {
1515 encoder->set_is_qp_trusted(true);
1516 }
1517 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1518 EXPECT_TRUE(adapter_->GetEncoderInfo().is_qp_trusted.value_or(false));
1519
1520 // One encoder reports QP not trusted, simulcast adapter reports false.
1521 helper_->factory()->encoders()[2]->set_is_qp_trusted(false);
1522 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1523 EXPECT_FALSE(adapter_->GetEncoderInfo().is_qp_trusted.value_or(true));
1524 }
1525
TEST_F(TestSimulcastEncoderAdapterFake,ReportsFpsAllocation)1526 TEST_F(TestSimulcastEncoderAdapterFake, ReportsFpsAllocation) {
1527 SimulcastTestFixtureImpl::DefaultSettings(
1528 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1529 kVideoCodecVP8);
1530 codec_.numberOfSimulcastStreams = 3;
1531 adapter_->RegisterEncodeCompleteCallback(this);
1532 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1533 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1534
1535 // Combination of three different supported mode:
1536 // Simulcast stream 0 has undefined fps behavior.
1537 // Simulcast stream 1 has three temporal layers.
1538 // Simulcast stream 2 has 1 temporal layer.
1539 FramerateFractions expected_fps_allocation[kMaxSpatialLayers];
1540 expected_fps_allocation[1].push_back(EncoderInfo::kMaxFramerateFraction / 4);
1541 expected_fps_allocation[1].push_back(EncoderInfo::kMaxFramerateFraction / 2);
1542 expected_fps_allocation[1].push_back(EncoderInfo::kMaxFramerateFraction);
1543 expected_fps_allocation[2].push_back(EncoderInfo::kMaxFramerateFraction);
1544
1545 // All encoders have internal source, simulcast adapter reports true.
1546 for (size_t i = 0; i < codec_.numberOfSimulcastStreams; ++i) {
1547 MockVideoEncoder* encoder = helper_->factory()->encoders()[i];
1548 encoder->set_fps_allocation(expected_fps_allocation[i]);
1549 }
1550 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1551 EXPECT_THAT(adapter_->GetEncoderInfo().fps_allocation,
1552 ::testing::ElementsAreArray(expected_fps_allocation));
1553 }
1554
TEST_F(TestSimulcastEncoderAdapterFake,SetRateDistributesBandwithAllocation)1555 TEST_F(TestSimulcastEncoderAdapterFake, SetRateDistributesBandwithAllocation) {
1556 SimulcastTestFixtureImpl::DefaultSettings(
1557 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1558 kVideoCodecVP8);
1559 codec_.numberOfSimulcastStreams = 3;
1560 const DataRate target_bitrate =
1561 DataRate::KilobitsPerSec(codec_.simulcastStream[0].targetBitrate +
1562 codec_.simulcastStream[1].targetBitrate +
1563 codec_.simulcastStream[2].minBitrate);
1564 const DataRate bandwidth_allocation =
1565 target_bitrate + DataRate::KilobitsPerSec(600);
1566
1567 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
1568 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1569 adapter_->RegisterEncodeCompleteCallback(this);
1570
1571 // Set bitrates so that we send all layers.
1572 adapter_->SetRates(VideoEncoder::RateControlParameters(
1573 rate_allocator_->Allocate(
1574 VideoBitrateAllocationParameters(target_bitrate.bps(), 30)),
1575 30.0, bandwidth_allocation));
1576
1577 std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
1578
1579 ASSERT_EQ(3u, encoders.size());
1580
1581 for (size_t i = 0; i < 3; ++i) {
1582 const uint32_t layer_bitrate_bps =
1583 (i < static_cast<size_t>(codec_.numberOfSimulcastStreams) - 1
1584 ? codec_.simulcastStream[i].targetBitrate
1585 : codec_.simulcastStream[i].minBitrate) *
1586 1000;
1587 EXPECT_EQ(layer_bitrate_bps,
1588 encoders[i]->last_set_rates().bitrate.get_sum_bps())
1589 << i;
1590 EXPECT_EQ(
1591 (layer_bitrate_bps * bandwidth_allocation.bps()) / target_bitrate.bps(),
1592 encoders[i]->last_set_rates().bandwidth_allocation.bps())
1593 << i;
1594 }
1595 }
1596
TEST_F(TestSimulcastEncoderAdapterFake,CanSetZeroBitrateWithHeadroom)1597 TEST_F(TestSimulcastEncoderAdapterFake, CanSetZeroBitrateWithHeadroom) {
1598 SimulcastTestFixtureImpl::DefaultSettings(
1599 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1600 kVideoCodecVP8);
1601 codec_.numberOfSimulcastStreams = 3;
1602
1603 rate_allocator_.reset(new SimulcastRateAllocator(codec_));
1604 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1605 adapter_->RegisterEncodeCompleteCallback(this);
1606
1607 // Set allocated bitrate to 0, but keep (network) bandwidth allocation.
1608 VideoEncoder::RateControlParameters rate_params;
1609 rate_params.framerate_fps = 30;
1610 rate_params.bandwidth_allocation = DataRate::KilobitsPerSec(600);
1611
1612 adapter_->SetRates(rate_params);
1613
1614 std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
1615
1616 ASSERT_EQ(3u, encoders.size());
1617 for (size_t i = 0; i < 3; ++i) {
1618 EXPECT_EQ(0u, encoders[i]->last_set_rates().bitrate.get_sum_bps());
1619 }
1620 }
1621
TEST_F(TestSimulcastEncoderAdapterFake,SupportsSimulcast)1622 TEST_F(TestSimulcastEncoderAdapterFake, SupportsSimulcast) {
1623 SimulcastTestFixtureImpl::DefaultSettings(
1624 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1625 kVideoCodecVP8);
1626 codec_.numberOfSimulcastStreams = 3;
1627
1628 // Indicate that mock encoders internally support simulcast.
1629 helper_->factory()->set_supports_simulcast(true);
1630 adapter_->RegisterEncodeCompleteCallback(this);
1631 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1632
1633 // Only one encoder should have been produced.
1634 ASSERT_EQ(1u, helper_->factory()->encoders().size());
1635
1636 rtc::scoped_refptr<VideoFrameBuffer> buffer(I420Buffer::Create(1280, 720));
1637 VideoFrame input_frame = VideoFrame::Builder()
1638 .set_video_frame_buffer(buffer)
1639 .set_timestamp_rtp(100)
1640 .set_timestamp_ms(1000)
1641 .set_rotation(kVideoRotation_180)
1642 .build();
1643 EXPECT_CALL(*helper_->factory()->encoders()[0], Encode)
1644 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1645 std::vector<VideoFrameType> frame_types(3, VideoFrameType::kVideoFrameKey);
1646 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1647 }
1648
TEST_F(TestSimulcastEncoderAdapterFake,PassesSdpVideoFormatToEncoder)1649 TEST_F(TestSimulcastEncoderAdapterFake, PassesSdpVideoFormatToEncoder) {
1650 sdp_video_parameters_ = {{"test_param", "test_value"}};
1651 SetUp();
1652 SetupCodec();
1653 std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
1654 ASSERT_GT(encoders.size(), 0u);
1655 EXPECT_EQ(encoders[0]->video_format(),
1656 SdpVideoFormat("VP8", sdp_video_parameters_));
1657 }
1658
TEST_F(TestSimulcastEncoderAdapterFake,SupportsFallback)1659 TEST_F(TestSimulcastEncoderAdapterFake, SupportsFallback) {
1660 // Enable support for fallback encoder factory and re-setup.
1661 use_fallback_factory_ = true;
1662 SetUp();
1663
1664 SetupCodec();
1665
1666 // Make sure we have bitrate for all layers.
1667 DataRate max_bitrate = DataRate::Zero();
1668 for (int i = 0; i < 3; ++i) {
1669 max_bitrate +=
1670 DataRate::KilobitsPerSec(codec_.simulcastStream[i].maxBitrate);
1671 }
1672 const auto rate_settings = VideoEncoder::RateControlParameters(
1673 rate_allocator_->Allocate(
1674 VideoBitrateAllocationParameters(max_bitrate.bps(), 30)),
1675 30.0, max_bitrate);
1676 adapter_->SetRates(rate_settings);
1677
1678 std::vector<MockVideoEncoder*> primary_encoders =
1679 helper_->factory()->encoders();
1680 std::vector<MockVideoEncoder*> fallback_encoders =
1681 helper_->fallback_factory()->encoders();
1682
1683 ASSERT_EQ(3u, primary_encoders.size());
1684 ASSERT_EQ(3u, fallback_encoders.size());
1685
1686 // Create frame to test with.
1687 rtc::scoped_refptr<VideoFrameBuffer> buffer(I420Buffer::Create(1280, 720));
1688 VideoFrame input_frame = VideoFrame::Builder()
1689 .set_video_frame_buffer(buffer)
1690 .set_timestamp_rtp(100)
1691 .set_timestamp_ms(1000)
1692 .set_rotation(kVideoRotation_180)
1693 .build();
1694 std::vector<VideoFrameType> frame_types(3, VideoFrameType::kVideoFrameKey);
1695
1696 // All primary encoders used.
1697 for (auto codec : primary_encoders) {
1698 EXPECT_CALL(*codec, Encode).WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1699 }
1700 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1701
1702 // Trigger fallback on first encoder.
1703 primary_encoders[0]->set_init_encode_return_value(
1704 WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
1705 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1706 adapter_->SetRates(rate_settings);
1707 EXPECT_CALL(*fallback_encoders[0], Encode)
1708 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1709 EXPECT_CALL(*primary_encoders[1], Encode)
1710 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1711 EXPECT_CALL(*primary_encoders[2], Encode)
1712 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1713 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1714
1715 // Trigger fallback on all encoder.
1716 primary_encoders[1]->set_init_encode_return_value(
1717 WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
1718 primary_encoders[2]->set_init_encode_return_value(
1719 WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
1720 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1721 adapter_->SetRates(rate_settings);
1722 EXPECT_CALL(*fallback_encoders[0], Encode)
1723 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1724 EXPECT_CALL(*fallback_encoders[1], Encode)
1725 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1726 EXPECT_CALL(*fallback_encoders[2], Encode)
1727 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1728 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1729
1730 // Return to primary encoders on all streams.
1731 for (int i = 0; i < 3; ++i) {
1732 primary_encoders[i]->set_init_encode_return_value(WEBRTC_VIDEO_CODEC_OK);
1733 }
1734 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1735 adapter_->SetRates(rate_settings);
1736 for (auto codec : primary_encoders) {
1737 EXPECT_CALL(*codec, Encode).WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
1738 }
1739 EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
1740 }
1741
TEST_F(TestSimulcastEncoderAdapterFake,SupportsPerSimulcastLayerMaxFramerate)1742 TEST_F(TestSimulcastEncoderAdapterFake, SupportsPerSimulcastLayerMaxFramerate) {
1743 SimulcastTestFixtureImpl::DefaultSettings(
1744 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1745 kVideoCodecVP8);
1746 codec_.numberOfSimulcastStreams = 3;
1747 codec_.simulcastStream[0].maxFramerate = 60;
1748 codec_.simulcastStream[1].maxFramerate = 30;
1749 codec_.simulcastStream[2].maxFramerate = 10;
1750
1751 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1752 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1753 EXPECT_EQ(60u, helper_->factory()->encoders()[0]->codec().maxFramerate);
1754 EXPECT_EQ(30u, helper_->factory()->encoders()[1]->codec().maxFramerate);
1755 EXPECT_EQ(10u, helper_->factory()->encoders()[2]->codec().maxFramerate);
1756 }
1757
TEST_F(TestSimulcastEncoderAdapterFake,CreatesEncoderOnlyIfStreamIsActive)1758 TEST_F(TestSimulcastEncoderAdapterFake, CreatesEncoderOnlyIfStreamIsActive) {
1759 // Legacy singlecast
1760 SetupCodec(/*active_streams=*/{});
1761 EXPECT_EQ(1u, helper_->factory()->encoders().size());
1762
1763 // Simulcast-capable underlaying encoder
1764 ReSetUp();
1765 helper_->factory()->set_supports_simulcast(true);
1766 SetupCodec(/*active_streams=*/{true, true});
1767 EXPECT_EQ(1u, helper_->factory()->encoders().size());
1768
1769 // Muti-encoder simulcast
1770 ReSetUp();
1771 helper_->factory()->set_supports_simulcast(false);
1772 SetupCodec(/*active_streams=*/{true, true});
1773 EXPECT_EQ(2u, helper_->factory()->encoders().size());
1774
1775 // Singlecast via layers deactivation. Lowest layer is active.
1776 ReSetUp();
1777 helper_->factory()->set_supports_simulcast(false);
1778 SetupCodec(/*active_streams=*/{true, false});
1779 EXPECT_EQ(1u, helper_->factory()->encoders().size());
1780
1781 // Singlecast via layers deactivation. Highest layer is active.
1782 ReSetUp();
1783 helper_->factory()->set_supports_simulcast(false);
1784 SetupCodec(/*active_streams=*/{false, true});
1785 EXPECT_EQ(1u, helper_->factory()->encoders().size());
1786 }
1787
TEST_F(TestSimulcastEncoderAdapterFake,RecreateEncoderIfPreferTemporalSupportIsEnabled)1788 TEST_F(TestSimulcastEncoderAdapterFake,
1789 RecreateEncoderIfPreferTemporalSupportIsEnabled) {
1790 // Normally SEA reuses encoders. But, when TL-based SW fallback is enabled,
1791 // the encoder which served the lowest stream should be recreated before it
1792 // can be used to process an upper layer and vice-versa.
1793 test::ScopedFieldTrials field_trials(
1794 "WebRTC-Video-PreferTemporalSupportOnBaseLayer/Enabled/");
1795 use_fallback_factory_ = true;
1796 ReSetUp();
1797
1798 // Legacy singlecast
1799 SetupCodec(/*active_streams=*/{});
1800 ASSERT_EQ(1u, helper_->factory()->encoders().size());
1801
1802 // Singlecast, the lowest stream is active. Encoder should be reused.
1803 MockVideoEncoder* prev_encoder = helper_->factory()->encoders()[0];
1804 SetupCodec(/*active_streams=*/{true, false});
1805 ASSERT_EQ(1u, helper_->factory()->encoders().size());
1806 EXPECT_EQ(helper_->factory()->encoders()[0], prev_encoder);
1807
1808 // Singlecast, an upper stream is active. Encoder should be recreated.
1809 EXPECT_CALL(*prev_encoder, Release()).Times(1);
1810 SetupCodec(/*active_streams=*/{false, true});
1811 ASSERT_EQ(1u, helper_->factory()->encoders().size());
1812 EXPECT_NE(helper_->factory()->encoders()[0], prev_encoder);
1813
1814 // Singlecast, the lowest stream is active. Encoder should be recreated.
1815 prev_encoder = helper_->factory()->encoders()[0];
1816 EXPECT_CALL(*prev_encoder, Release()).Times(1);
1817 SetupCodec(/*active_streams=*/{true, false});
1818 ASSERT_EQ(1u, helper_->factory()->encoders().size());
1819 EXPECT_NE(helper_->factory()->encoders()[0], prev_encoder);
1820 }
1821
TEST_F(TestSimulcastEncoderAdapterFake,UseFallbackEncoderIfCreatePrimaryEncoderFailed)1822 TEST_F(TestSimulcastEncoderAdapterFake,
1823 UseFallbackEncoderIfCreatePrimaryEncoderFailed) {
1824 // Enable support for fallback encoder factory and re-setup.
1825 use_fallback_factory_ = true;
1826 SetUp();
1827 SimulcastTestFixtureImpl::DefaultSettings(
1828 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1829 kVideoCodecVP8);
1830 codec_.numberOfSimulcastStreams = 1;
1831 helper_->factory()->SetEncoderNames({"primary"});
1832 helper_->fallback_factory()->SetEncoderNames({"fallback"});
1833
1834 // Emulate failure at creating of primary encoder and verify that SEA switches
1835 // to fallback encoder.
1836 helper_->factory()->set_create_video_encode_return_nullptr(true);
1837 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1838 ASSERT_EQ(0u, helper_->factory()->encoders().size());
1839 ASSERT_EQ(1u, helper_->fallback_factory()->encoders().size());
1840 EXPECT_EQ("fallback", adapter_->GetEncoderInfo().implementation_name);
1841 }
1842
TEST_F(TestSimulcastEncoderAdapterFake,InitEncodeReturnsErrorIfEncoderCannotBeCreated)1843 TEST_F(TestSimulcastEncoderAdapterFake,
1844 InitEncodeReturnsErrorIfEncoderCannotBeCreated) {
1845 // Enable support for fallback encoder factory and re-setup.
1846 use_fallback_factory_ = true;
1847 SetUp();
1848 SimulcastTestFixtureImpl::DefaultSettings(
1849 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1850 kVideoCodecVP8);
1851 codec_.numberOfSimulcastStreams = 1;
1852 helper_->factory()->SetEncoderNames({"primary"});
1853 helper_->fallback_factory()->SetEncoderNames({"fallback"});
1854
1855 // Emulate failure at creating of primary and fallback encoders and verify
1856 // that `InitEncode` returns an error.
1857 helper_->factory()->set_create_video_encode_return_nullptr(true);
1858 helper_->fallback_factory()->set_create_video_encode_return_nullptr(true);
1859 EXPECT_EQ(WEBRTC_VIDEO_CODEC_MEMORY,
1860 adapter_->InitEncode(&codec_, kSettings));
1861 }
1862
TEST_F(TestSimulcastEncoderAdapterFake,PopulatesScalabilityModeOfSubcodecs)1863 TEST_F(TestSimulcastEncoderAdapterFake, PopulatesScalabilityModeOfSubcodecs) {
1864 SimulcastTestFixtureImpl::DefaultSettings(
1865 &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
1866 kVideoCodecVP8);
1867 codec_.numberOfSimulcastStreams = 3;
1868 codec_.simulcastStream[0].numberOfTemporalLayers = 1;
1869 codec_.simulcastStream[1].numberOfTemporalLayers = 2;
1870 codec_.simulcastStream[2].numberOfTemporalLayers = 3;
1871
1872 EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
1873 ASSERT_EQ(3u, helper_->factory()->encoders().size());
1874 EXPECT_EQ(helper_->factory()->encoders()[0]->codec().GetScalabilityMode(),
1875 ScalabilityMode::kL1T1);
1876 EXPECT_EQ(helper_->factory()->encoders()[1]->codec().GetScalabilityMode(),
1877 ScalabilityMode::kL1T2);
1878 EXPECT_EQ(helper_->factory()->encoders()[2]->codec().GetScalabilityMode(),
1879 ScalabilityMode::kL1T3);
1880 }
1881
1882 } // namespace test
1883 } // namespace webrtc
1884