@@ -171,6 +171,9 @@ class MockVideoEncoderFactory : public VideoEncoderFactory {
171171
172172 const std::vector<MockVideoEncoder*>& encoders () const ;
173173 void SetEncoderNames (const std::vector<const char *>& encoder_names);
174+ void set_create_video_encode_return_nullptr (bool return_nullptr) {
175+ create_video_encoder_return_nullptr_ = return_nullptr;
176+ }
174177 void set_init_encode_return_value (int32_t value);
175178 void set_requested_resolution_alignments (
176179 std::vector<int > requested_resolution_alignments) {
@@ -183,6 +186,7 @@ class MockVideoEncoderFactory : public VideoEncoderFactory {
183186 void DestroyVideoEncoder (VideoEncoder* encoder);
184187
185188 private:
189+ bool create_video_encoder_return_nullptr_ = false ;
186190 int32_t init_encode_return_value_ = 0 ;
187191 std::vector<MockVideoEncoder*> encoders_;
188192 std::vector<const char *> encoder_names_;
@@ -340,6 +344,10 @@ std::vector<SdpVideoFormat> MockVideoEncoderFactory::GetSupportedFormats()
340344
341345std::unique_ptr<VideoEncoder> MockVideoEncoderFactory::CreateVideoEncoder (
342346 const SdpVideoFormat& format) {
347+ if (create_video_encoder_return_nullptr_) {
348+ return nullptr ;
349+ }
350+
343351 auto encoder = std::make_unique<::testing::NiceMock<MockVideoEncoder>>(this );
344352 encoder->set_init_encode_return_value (init_encode_return_value_);
345353 const char * encoder_name = encoder_names_.empty ()
@@ -1683,5 +1691,46 @@ TEST_F(TestSimulcastEncoderAdapterFake,
16831691 EXPECT_NE (helper_->factory ()->encoders ()[0 ], prev_encoder);
16841692}
16851693
1694+ TEST_F (TestSimulcastEncoderAdapterFake,
1695+ UseFallbackEncoderIfCreatePrimaryEncoderFailed) {
1696+ // Enable support for fallback encoder factory and re-setup.
1697+ use_fallback_factory_ = true ;
1698+ SetUp ();
1699+ SimulcastTestFixtureImpl::DefaultSettings (
1700+ &codec_, static_cast <const int *>(kTestTemporalLayerProfile ),
1701+ kVideoCodecVP8 );
1702+ codec_.numberOfSimulcastStreams = 1 ;
1703+ helper_->factory ()->SetEncoderNames ({" primary" });
1704+ helper_->fallback_factory ()->SetEncoderNames ({" fallback" });
1705+
1706+ // Emulate failure at creating of primary encoder and verify that SEA switches
1707+ // to fallback encoder.
1708+ helper_->factory ()->set_create_video_encode_return_nullptr (true );
1709+ EXPECT_EQ (0 , adapter_->InitEncode (&codec_, kSettings ));
1710+ ASSERT_EQ (0u , helper_->factory ()->encoders ().size ());
1711+ ASSERT_EQ (1u , helper_->fallback_factory ()->encoders ().size ());
1712+ EXPECT_EQ (" fallback" , adapter_->GetEncoderInfo ().implementation_name );
1713+ }
1714+
1715+ TEST_F (TestSimulcastEncoderAdapterFake,
1716+ InitEncodeReturnsErrorIfEncoderCannotBeCreated) {
1717+ // Enable support for fallback encoder factory and re-setup.
1718+ use_fallback_factory_ = true ;
1719+ SetUp ();
1720+ SimulcastTestFixtureImpl::DefaultSettings (
1721+ &codec_, static_cast <const int *>(kTestTemporalLayerProfile ),
1722+ kVideoCodecVP8 );
1723+ codec_.numberOfSimulcastStreams = 1 ;
1724+ helper_->factory ()->SetEncoderNames ({" primary" });
1725+ helper_->fallback_factory ()->SetEncoderNames ({" fallback" });
1726+
1727+ // Emulate failure at creating of primary and fallback encoders and verify
1728+ // that `InitEncode` returns an error.
1729+ helper_->factory ()->set_create_video_encode_return_nullptr (true );
1730+ helper_->fallback_factory ()->set_create_video_encode_return_nullptr (true );
1731+ EXPECT_EQ (WEBRTC_VIDEO_CODEC_MEMORY,
1732+ adapter_->InitEncode (&codec_, kSettings ));
1733+ }
1734+
16861735} // namespace test
16871736} // namespace webrtc
0 commit comments