| Index: webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
|
| diff --git a/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc b/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
|
| index f66551958fcabcd982e1c9937e8a9c579839c429..ecf719948f0b7911ef29391ee3904cbd684a5fed 100644
|
| --- a/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
|
| +++ b/webrtc/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
|
| @@ -29,6 +29,7 @@ const int kHeight = 240;
|
| const int kNumCores = 2;
|
| const uint32_t kFramerate = 30;
|
| const size_t kMaxPayloadSize = 800;
|
| +const int kDefaultMinPixelsPerFrame = 320 * 180;
|
| } // namespace
|
|
|
| class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
|
| @@ -93,6 +94,10 @@ class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
|
| return "fake-encoder";
|
| }
|
|
|
| + VideoEncoder::ScalingSettings GetScalingSettings() const override {
|
| + return VideoEncoder::ScalingSettings(true);
|
| + }
|
| +
|
| int init_encode_count_ = 0;
|
| int32_t init_encode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
|
| int32_t encode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
|
| @@ -141,7 +146,8 @@ void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame() {
|
| }
|
|
|
| void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame(int expected_ret) {
|
| - rtc::scoped_refptr<I420Buffer> buffer = I420Buffer::Create(kWidth, kHeight);
|
| + rtc::scoped_refptr<I420Buffer> buffer =
|
| + I420Buffer::Create(codec_.width, codec_.height);
|
| I420Buffer::SetBlack(buffer);
|
| std::vector<FrameType> types(1, kVideoFrameKey);
|
|
|
| @@ -299,9 +305,10 @@ TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
|
| }
|
|
|
| TEST_F(VideoEncoderSoftwareFallbackWrapperTest, ReportsImplementationName) {
|
| - VideoCodec codec = {};
|
| + codec_.width = kWidth;
|
| + codec_.height = kHeight;
|
| fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
|
| - fallback_wrapper_.InitEncode(&codec, kNumCores, kMaxPayloadSize);
|
| + fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize);
|
| EncodeFrame();
|
| CheckLastEncoderName("fake-encoder");
|
| }
|
| @@ -318,6 +325,8 @@ namespace {
|
| const int kLowKbps = 220;
|
| const int kHighKbps = 300;
|
| const int kMinLowDurationMs = 4000;
|
| +const int kMinPixelsPerFrame = 1;
|
| +const int kMinPixelsStop = 320 * 180;
|
| const std::string kFieldTrial = "WebRTC-VP8-Forced-Fallback-Encoder";
|
| } // namespace
|
|
|
| @@ -350,6 +359,8 @@ class ForcedFallbackTest : public VideoEncoderSoftwareFallbackWrapperTest {
|
| codec_.width = kWidth;
|
| codec_.height = kHeight;
|
| codec_.VP8()->numberOfTemporalLayers = 1;
|
| + codec_.VP8()->automaticResizeOn = true;
|
| + codec_.VP8()->frameDroppingOn = true;
|
| codec_.VP8()->tl_factory = tl_factory.get();
|
| rate_allocator_.reset(
|
| new SimulcastRateAllocator(codec_, std::move(tl_factory)));
|
| @@ -381,7 +392,8 @@ class ForcedFallbackTestEnabled : public ForcedFallbackTest {
|
| : ForcedFallbackTest(kFieldTrial + "/Enabled-" +
|
| std::to_string(kLowKbps) + "," +
|
| std::to_string(kHighKbps) + "," +
|
| - std::to_string(kMinLowDurationMs) + "/") {}
|
| + std::to_string(kMinLowDurationMs) + "," +
|
| + std::to_string(kMinPixelsPerFrame) + "/") {}
|
| };
|
|
|
| class ForcedFallbackTestDisabled : public ForcedFallbackTest {
|
| @@ -575,4 +587,58 @@ TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedForNonValidSettings) {
|
| EncodeFrameAndVerifyLastName("fake-encoder");
|
| }
|
|
|
| +TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithoutFallback) {
|
| + // Bitrate at low threshold.
|
| + SetRateAllocation(kLowKbps);
|
| + EncodeFrameAndVerifyLastName("fake-encoder");
|
| + // Default min pixels per frame should be used.
|
| + const auto settings = fallback_wrapper_.GetScalingSettings();
|
| + EXPECT_TRUE(settings.enabled);
|
| + EXPECT_EQ(kDefaultMinPixelsPerFrame, settings.min_pixels_per_frame);
|
| +}
|
| +
|
| +TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithFallback) {
|
| + // Bitrate at low threshold.
|
| + SetRateAllocation(kLowKbps);
|
| + EncodeFrameAndVerifyLastName("fake-encoder");
|
| + // Duration passed, expect fallback.
|
| + clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
|
| + EncodeFrameAndVerifyLastName("libvpx");
|
| + // Configured min pixels per frame should be used.
|
| + const auto settings = fallback_wrapper_.GetScalingSettings();
|
| + EXPECT_TRUE(settings.enabled);
|
| + EXPECT_EQ(kMinPixelsPerFrame, settings.min_pixels_per_frame);
|
| +}
|
| +
|
| +TEST_F(ForcedFallbackTestEnabled, FallbackIsKeptIfResolutionIsTooSmall) {
|
| + // Bitrate at low threshold.
|
| + SetRateAllocation(kLowKbps);
|
| + EncodeFrameAndVerifyLastName("fake-encoder");
|
| + // Duration passed, expect fallback.
|
| + clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
|
| + EncodeFrameAndVerifyLastName("libvpx");
|
| +
|
| + // Re-initialize encoder with a resolution less than |kMinPixelsStop|.
|
| + codec_.height = kMinPixelsStop / codec_.width - 1;
|
| + EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
|
| + fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
|
| + EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change
|
| + SetRateAllocation(kHighKbps - 1);
|
| + EncodeFrameAndVerifyLastName("libvpx");
|
| + // Bitrate at high threshold but resolution too small for fallback to end.
|
| + SetRateAllocation(kHighKbps);
|
| + EncodeFrameAndVerifyLastName("libvpx");
|
| +
|
| + // Re-initialize encoder with a resolution equal to |kMinPixelsStop|.
|
| + codec_.height++;
|
| + EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
|
| + fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
|
| + EXPECT_EQ(1, fake_encoder_.init_encode_count_); // No change
|
| + SetRateAllocation(kHighKbps - 1);
|
| + EncodeFrameAndVerifyLastName("libvpx");
|
| + // Bitrate at high threshold and resolution large enough for fallback to end.
|
| + SetRateAllocation(kHighKbps);
|
| + EncodeFrameAndVerifyLastName("fake-encoder");
|
| +}
|
| +
|
| } // namespace webrtc
|
|
|