| // Copyright (c) 2025 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/encoder_speed_experiment.h" |
| |
| #include "api/field_trials.h" |
| #include "api/video/video_codec_type.h" |
| #include "api/video_codecs/video_codec.h" |
| #include "test/gtest.h" |
| |
| namespace webrtc { |
| namespace { |
| |
| TEST(EncoderSpeedExperimentTest, DisabledByDefault) { |
| FieldTrials field_trials(""); |
| EncoderSpeedExperiment config(field_trials); |
| EXPECT_FALSE(config.IsDynamicSpeedEnabled()); |
| } |
| |
| TEST(EncoderSpeedExperimentTest, DynamicSpeedEnabled) { |
| FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:true/"); |
| EncoderSpeedExperiment config(field_trials); |
| EXPECT_TRUE(config.IsDynamicSpeedEnabled()); |
| } |
| |
| TEST(EncoderSpeedExperimentTest, DynamicSpeedExplicitlyDisabled) { |
| FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:false/"); |
| EncoderSpeedExperiment config(field_trials); |
| EXPECT_FALSE(config.IsDynamicSpeedEnabled()); |
| } |
| |
| TEST(EncoderSpeedExperimentTest, DefaultComplexity) { |
| FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:true/"); |
| |
| EncoderSpeedExperiment config(field_trials); |
| |
| EXPECT_EQ(config.GetComplexity(kVideoCodecVP8, /*is_screenshare=*/false), |
| VideoCodecComplexity::kComplexityNormal); |
| EXPECT_EQ(config.GetComplexity(kVideoCodecAV1, /*is_screenshare=*/true), |
| VideoCodecComplexity::kComplexityNormal); |
| } |
| |
| TEST(EncoderSpeedExperimentTest, PerCodecComplexity) { |
| FieldTrials field_trials( |
| "WebRTC-EncoderSpeed/" |
| "dynamic_speed:true,av1_camera:high,av1_screenshare:low,vp8_camera:max/"); |
| |
| EncoderSpeedExperiment config(field_trials); |
| EXPECT_TRUE(config.IsDynamicSpeedEnabled()); |
| |
| // AV1 |
| EXPECT_EQ(config.GetComplexity(kVideoCodecAV1, /*is_screenshare=*/false), |
| VideoCodecComplexity::kComplexityHigh); |
| EXPECT_EQ(config.GetComplexity(kVideoCodecAV1, /*is_screenshare=*/true), |
| VideoCodecComplexity::kComplexityLow); |
| |
| // VP8 |
| EXPECT_EQ(config.GetComplexity(kVideoCodecVP8, /*is_screenshare=*/false), |
| VideoCodecComplexity::kComplexityMax); |
| EXPECT_EQ(config.GetComplexity(kVideoCodecVP8, /*is_screenshare=*/true), |
| VideoCodecComplexity::kComplexityNormal); // Default |
| |
| // VP9 (Not specified) |
| EXPECT_EQ(config.GetComplexity(kVideoCodecVP9, /*is_screenshare=*/false), |
| VideoCodecComplexity::kComplexityNormal); |
| EXPECT_EQ(config.GetComplexity(kVideoCodecVP9, /*is_screenshare=*/true), |
| VideoCodecComplexity::kComplexityNormal); |
| } |
| |
| TEST(EncoderSpeedExperimentTest, PerCodecComplexityDynamicSpeedDisabled) { |
| FieldTrials field_trials( |
| "WebRTC-EncoderSpeed/" |
| "dynamic_speed:false,av1_camera:high,av1_screenshare:low/"); |
| |
| EncoderSpeedExperiment config(field_trials); |
| EXPECT_FALSE(config.IsDynamicSpeedEnabled()); |
| |
| // AV1 |
| EXPECT_EQ(config.GetComplexity(kVideoCodecAV1, /*is_screenshare=*/false), |
| VideoCodecComplexity::kComplexityHigh); |
| EXPECT_EQ(config.GetComplexity(kVideoCodecAV1, /*is_screenshare=*/true), |
| VideoCodecComplexity::kComplexityLow); |
| } |
| |
| TEST(EncoderSpeedExperimentTest, InvalidCodecComplexityValue) { |
| FieldTrials field_trials( |
| "WebRTC-EncoderSpeed/" |
| "dynamic_speed:true,av1_camera:invalid,vp8_screenshare:max/"); |
| |
| EncoderSpeedExperiment config(field_trials); |
| EXPECT_TRUE(config.IsDynamicSpeedEnabled()); |
| EXPECT_EQ(config.GetComplexity(kVideoCodecAV1, /*is_screenshare=*/false), |
| VideoCodecComplexity::kComplexityNormal); // Invalid value |
| EXPECT_EQ(config.GetComplexity(kVideoCodecVP8, /*is_screenshare=*/true), |
| VideoCodecComplexity::kComplexityMax); |
| } |
| |
| TEST(EncoderSpeedExperimentTest, InvalidDynamicSpeedValue) { |
| FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:invalid/"); |
| EncoderSpeedExperiment config(field_trials); |
| EXPECT_FALSE(config.IsDynamicSpeedEnabled()); // Should default to false |
| } |
| |
| } // namespace |
| |
| } // namespace webrtc |