2019-02-04 11:09:46 +01:00
|
|
|
/*
|
|
|
|
|
* Copyright 2019 The WebRTC project authors. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "rtc_base/experiments/rate_control_settings.h"
|
|
|
|
|
|
|
|
|
|
#include "api/video_codecs/video_codec.h"
|
2024-05-17 16:31:00 +02:00
|
|
|
#include "test/explicit_key_value_config.h"
|
|
|
|
|
#include "test/gmock.h"
|
2019-02-04 11:09:46 +01:00
|
|
|
#include "test/gtest.h"
|
2022-09-29 10:28:24 +02:00
|
|
|
#include "video/config/video_encoder_config.h"
|
2019-02-04 11:09:46 +01:00
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
using test::ExplicitKeyValueConfig;
|
|
|
|
|
using ::testing::DoubleEq;
|
|
|
|
|
using ::testing::Optional;
|
|
|
|
|
|
|
|
|
|
RateControlSettings ParseFrom(absl::string_view field_trials) {
|
|
|
|
|
return RateControlSettings(ExplicitKeyValueConfig(field_trials));
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-04 12:00:24 +01:00
|
|
|
TEST(RateControlSettingsTest, CongestionWindow) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(ParseFrom("").UseCongestionWindow());
|
2019-02-04 12:00:24 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
const RateControlSettings settings =
|
|
|
|
|
ParseFrom("WebRTC-CongestionWindow/QueueSize:100/");
|
|
|
|
|
EXPECT_TRUE(settings.UseCongestionWindow());
|
|
|
|
|
EXPECT_EQ(settings.GetCongestionWindowAdditionalTimeMs(), 100);
|
2019-02-04 12:00:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(RateControlSettingsTest, CongestionWindowPushback) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(ParseFrom("").UseCongestionWindowPushback());
|
2019-02-04 12:00:24 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
const RateControlSettings settings =
|
|
|
|
|
ParseFrom("WebRTC-CongestionWindow/QueueSize:100,MinBitrate:100000/");
|
|
|
|
|
EXPECT_TRUE(settings.UseCongestionWindowPushback());
|
|
|
|
|
EXPECT_EQ(settings.CongestionWindowMinPushbackTargetBitrateBps(), 100000u);
|
2019-02-04 12:00:24 +01:00
|
|
|
}
|
|
|
|
|
|
2021-02-05 11:07:00 +01:00
|
|
|
TEST(RateControlSettingsTest, CongestionWindowPushbackDropframe) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(ParseFrom("").UseCongestionWindowPushback());
|
2021-02-05 11:07:00 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
const RateControlSettings settings = ParseFrom(
|
2021-02-05 11:07:00 +01:00
|
|
|
"WebRTC-CongestionWindow/"
|
|
|
|
|
"QueueSize:100,MinBitrate:100000,DropFrame:true/");
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(settings.UseCongestionWindowPushback());
|
|
|
|
|
EXPECT_EQ(settings.CongestionWindowMinPushbackTargetBitrateBps(), 100000u);
|
|
|
|
|
EXPECT_TRUE(settings.UseCongestionWindowDropFrameOnly());
|
2021-02-05 11:07:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(RateControlSettingsTest, CongestionWindowPushbackDefaultConfig) {
|
2024-05-17 16:31:00 +02:00
|
|
|
const RateControlSettings settings = ParseFrom("");
|
2021-02-05 11:07:00 +01:00
|
|
|
EXPECT_TRUE(settings.UseCongestionWindowPushback());
|
|
|
|
|
EXPECT_EQ(settings.CongestionWindowMinPushbackTargetBitrateBps(), 30000u);
|
|
|
|
|
EXPECT_TRUE(settings.UseCongestionWindowDropFrameOnly());
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-04 12:00:24 +01:00
|
|
|
TEST(RateControlSettingsTest, PacingFactor) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("").GetPacingFactor());
|
2019-02-04 12:00:24 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_THAT(
|
|
|
|
|
ParseFrom("WebRTC-VideoRateControl/pacing_factor:1.2/").GetPacingFactor(),
|
|
|
|
|
Optional(DoubleEq(1.2)));
|
2019-02-04 12:00:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(RateControlSettingsTest, AlrProbing) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("").UseAlrProbing());
|
2019-02-04 11:09:46 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(
|
|
|
|
|
ParseFrom("WebRTC-VideoRateControl/alr_probing:1/").UseAlrProbing());
|
2019-02-04 12:00:24 +01:00
|
|
|
}
|
|
|
|
|
|
2019-05-08 14:44:12 +02:00
|
|
|
TEST(RateControlSettingsTest, LibvpxVp8QpMax) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("").LibvpxVp8QpMax());
|
2019-05-08 14:44:12 +02:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
ParseFrom("WebRTC-VideoRateControl/vp8_qp_max:50/").LibvpxVp8QpMax(), 50);
|
2019-05-08 14:44:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(RateControlSettingsTest, DoesNotGetTooLargeLibvpxVp8QpMaxValue) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(
|
|
|
|
|
ParseFrom("WebRTC-VideoRateControl/vp8_qp_max:70/").LibvpxVp8QpMax());
|
2019-05-08 14:44:12 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-27 13:44:30 +02:00
|
|
|
TEST(RateControlSettingsTest, LibvpxVp8MinPixels) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("").LibvpxVp8MinPixels());
|
2019-06-27 13:44:30 +02:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_EQ(ParseFrom("WebRTC-VideoRateControl/vp8_min_pixels:50000/")
|
|
|
|
|
.LibvpxVp8MinPixels(),
|
2019-06-27 13:44:30 +02:00
|
|
|
50000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(RateControlSettingsTest, DoesNotGetTooSmallLibvpxVp8MinPixelValue) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("WebRTC-VideoRateControl/vp8_min_pixels:0/")
|
|
|
|
|
.LibvpxVp8MinPixels());
|
2019-06-27 13:44:30 +02:00
|
|
|
}
|
|
|
|
|
|
2019-02-04 12:00:24 +01:00
|
|
|
TEST(RateControlSettingsTest, LibvpxTrustedRateController) {
|
2024-05-17 16:31:00 +02:00
|
|
|
const RateControlSettings default_settings = ParseFrom("");
|
|
|
|
|
EXPECT_TRUE(default_settings.LibvpxVp8TrustedRateController());
|
|
|
|
|
EXPECT_TRUE(default_settings.LibvpxVp9TrustedRateController());
|
2019-02-04 12:00:24 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
const RateControlSettings settings =
|
|
|
|
|
ParseFrom("WebRTC-VideoRateControl/trust_vp8:0,trust_vp9:0/");
|
|
|
|
|
EXPECT_FALSE(settings.LibvpxVp8TrustedRateController());
|
|
|
|
|
EXPECT_FALSE(settings.LibvpxVp9TrustedRateController());
|
2019-02-04 11:09:46 +01:00
|
|
|
}
|
|
|
|
|
|
2019-10-30 13:01:46 +01:00
|
|
|
TEST(RateControlSettingsTest, Vp8BaseHeavyTl3RateAllocationLegacyKey) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("").Vp8BaseHeavyTl3RateAllocation());
|
2019-10-30 13:01:46 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(ParseFrom("WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/")
|
|
|
|
|
.Vp8BaseHeavyTl3RateAllocation());
|
2019-10-30 13:01:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(RateControlSettingsTest,
|
|
|
|
|
Vp8BaseHeavyTl3RateAllocationVideoRateControlKey) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("").Vp8BaseHeavyTl3RateAllocation());
|
2019-10-30 13:01:46 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(ParseFrom("WebRTC-VideoRateControl/vp8_base_heavy_tl3_alloc:1/")
|
|
|
|
|
.Vp8BaseHeavyTl3RateAllocation());
|
2019-10-30 13:01:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(RateControlSettingsTest,
|
|
|
|
|
Vp8BaseHeavyTl3RateAllocationVideoRateControlKeyOverridesLegacyKey) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("").Vp8BaseHeavyTl3RateAllocation());
|
2019-10-30 13:01:46 +01:00
|
|
|
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_FALSE(ParseFrom("WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/"
|
|
|
|
|
"WebRTC-VideoRateControl/vp8_base_heavy_tl3_alloc:0/")
|
|
|
|
|
.Vp8BaseHeavyTl3RateAllocation());
|
2019-10-30 13:01:46 +01:00
|
|
|
}
|
|
|
|
|
|
2019-02-06 16:20:17 +01:00
|
|
|
TEST(RateControlSettingsTest, UseEncoderBitrateAdjuster) {
|
2024-05-17 16:31:00 +02:00
|
|
|
EXPECT_TRUE(ParseFrom("").UseEncoderBitrateAdjuster());
|
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(ParseFrom("WebRTC-VideoRateControl/bitrate_adjuster:false/")
|
|
|
|
|
.UseEncoderBitrateAdjuster());
|
2019-02-06 16:20:17 +01:00
|
|
|
}
|
|
|
|
|
|
2019-02-04 11:09:46 +01:00
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
} // namespace webrtc
|