xref: /aosp_15_r20/external/webrtc/media/engine/simulcast_encoder_adapter_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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