From 62dc65b5375aea6bb846927c2be6ab6893ca89b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Bostr=C3=B6m?= Date: Tue, 21 Mar 2023 11:27:41 +0100 Subject: [PATCH] Add test that attempting HW is still possible after SW fallback. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on previous discussions I would have thought that this test would fail, but it turns out that it passes. See referenced bug for context. Bug: webrtc:15021 Change-Id: I845b48f688fb25942e3b770d50cafbf8a0bafe94 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/298562 Auto-Submit: Henrik Boström Reviewed-by: Ilya Nikolaevskiy Reviewed-by: Evan Shrubsole Commit-Queue: Henrik Boström Reviewed-by: Erik Språng Cr-Commit-Position: refs/heads/main@{#39625} --- ...oder_software_fallback_wrapper_unittest.cc | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc index b213356e7b..08afbfbb01 100644 --- a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc +++ b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc @@ -796,6 +796,37 @@ TEST(SoftwareFallbackEncoderTest, ReportsHardwareAccelerated) { EXPECT_FALSE(wrapper->GetEncoderInfo().is_hardware_accelerated); } +TEST(SoftwareFallbackEncoderTest, ConfigureHardwareOnSecondAttempt) { + auto* sw_encoder = new ::testing::NiceMock(); + auto* hw_encoder = new ::testing::NiceMock(); + EXPECT_CALL(*sw_encoder, GetEncoderInfo()) + .WillRepeatedly(Return(GetEncoderInfoWithHardwareAccelerated(false))); + EXPECT_CALL(*hw_encoder, GetEncoderInfo()) + .WillRepeatedly(Return(GetEncoderInfoWithHardwareAccelerated(true))); + + std::unique_ptr wrapper = + CreateVideoEncoderSoftwareFallbackWrapper( + std::unique_ptr(sw_encoder), + std::unique_ptr(hw_encoder)); + EXPECT_TRUE(wrapper->GetEncoderInfo().is_hardware_accelerated); + + // Initialize the encoder. When HW attempt fails we fallback to SW. + VideoCodec codec_ = {}; + codec_.width = 100; + codec_.height = 100; + EXPECT_CALL(*hw_encoder, InitEncode(_, _)) + .WillOnce(Return(WEBRTC_VIDEO_CODEC_ERR_PARAMETER)); + EXPECT_CALL(*sw_encoder, InitEncode(_, _)) + .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK)); + wrapper->InitEncode(&codec_, kSettings); + + // When reconfiguring (Release+InitEncode) we should re-attempt HW. + wrapper->Release(); + EXPECT_CALL(*hw_encoder, InitEncode(_, _)) + .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK)); + wrapper->InitEncode(&codec_, kSettings); +} + class PreferTemporalLayersFallbackTest : public ::testing::Test { public: PreferTemporalLayersFallbackTest() {}