diff options
Diffstat (limited to 'video/quality_scaling_tests.cc')
-rw-r--r-- | video/quality_scaling_tests.cc | 460 |
1 files changed, 304 insertions, 156 deletions
diff --git a/video/quality_scaling_tests.cc b/video/quality_scaling_tests.cc index 0da9b69042..9837517b78 100644 --- a/video/quality_scaling_tests.cc +++ b/video/quality_scaling_tests.cc @@ -22,11 +22,12 @@ namespace webrtc { namespace { -constexpr int kWidth = 1280; -constexpr int kHeight = 720; +constexpr int kInitialWidth = 1280; +constexpr int kInitialHeight = 720; constexpr int kLowStartBps = 100000; constexpr int kHighStartBps = 1000000; -constexpr size_t kTimeoutMs = 10000; // Some tests are expected to time out. +constexpr int kDefaultVgaMinStartBps = 500000; // From video_stream_encoder.cc +constexpr int kTimeoutMs = 10000; // Some tests are expected to time out. void SetEncoderSpecific(VideoEncoderConfig* encoder_config, VideoCodecType type, @@ -35,26 +36,22 @@ void SetEncoderSpecific(VideoEncoderConfig* encoder_config, if (type == kVideoCodecVP8) { VideoCodecVP8 vp8 = VideoEncoder::GetDefaultVp8Settings(); vp8.automaticResizeOn = automatic_resize; - encoder_config->encoder_specific_settings = new rtc::RefCountedObject< - VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8); + encoder_config->encoder_specific_settings = + rtc::make_ref_counted<VideoEncoderConfig::Vp8EncoderSpecificSettings>( + vp8); } else if (type == kVideoCodecVP9) { VideoCodecVP9 vp9 = VideoEncoder::GetDefaultVp9Settings(); vp9.automaticResizeOn = automatic_resize; vp9.numberOfSpatialLayers = num_spatial_layers; - encoder_config->encoder_specific_settings = new rtc::RefCountedObject< - VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9); + encoder_config->encoder_specific_settings = + rtc::make_ref_counted<VideoEncoderConfig::Vp9EncoderSpecificSettings>( + vp9); } } } // namespace class QualityScalingTest : public test::CallTest { protected: - void RunTest(const std::string& payload_name, - const std::vector<bool>& streams_active, - int start_bps, - bool automatic_resize, - bool expect_adaptation); - const std::string kPrefix = "WebRTC-Video-QualityScaling/Enabled-"; const std::string kEnd = ",0,0,0.9995,0.9999,1/"; const absl::optional<VideoEncoder::ResolutionBitrateLimits> @@ -69,153 +66,254 @@ class QualityScalingTest : public test::CallTest { 640 * 360); }; -void QualityScalingTest::RunTest(const std::string& payload_name, - const std::vector<bool>& streams_active, - int start_bps, - bool automatic_resize, - bool expect_adaptation) { - class ScalingObserver - : public test::SendTest, - public test::FrameGeneratorCapturer::SinkWantsObserver { - public: - ScalingObserver(const std::string& payload_name, - const std::vector<bool>& streams_active, - int start_bps, - bool automatic_resize, - bool expect_adaptation) - : SendTest(expect_adaptation ? kDefaultTimeoutMs : kTimeoutMs), - encoder_factory_([](const SdpVideoFormat& format) - -> std::unique_ptr<VideoEncoder> { - if (format.name == "VP8") - return VP8Encoder::Create(); - if (format.name == "VP9") - return VP9Encoder::Create(); - if (format.name == "H264") - return H264Encoder::Create(cricket::VideoCodec("H264")); - RTC_NOTREACHED() << format.name; - return nullptr; - }), - payload_name_(payload_name), - streams_active_(streams_active), - start_bps_(start_bps), - automatic_resize_(automatic_resize), - expect_adaptation_(expect_adaptation) {} - - private: - void OnFrameGeneratorCapturerCreated( - test::FrameGeneratorCapturer* frame_generator_capturer) override { - frame_generator_capturer->SetSinkWantsObserver(this); - // Set initial resolution. - frame_generator_capturer->ChangeResolution(kWidth, kHeight); - } +class ScalingObserver : public test::SendTest { + protected: + ScalingObserver(const std::string& payload_name, + const std::vector<bool>& streams_active, + int start_bps, + bool automatic_resize, + bool expect_scaling) + : SendTest(expect_scaling ? kTimeoutMs * 4 : kTimeoutMs), + encoder_factory_( + [](const SdpVideoFormat& format) -> std::unique_ptr<VideoEncoder> { + if (format.name == "VP8") + return VP8Encoder::Create(); + if (format.name == "VP9") + return VP9Encoder::Create(); + if (format.name == "H264") + return H264Encoder::Create(cricket::VideoCodec("H264")); + RTC_NOTREACHED() << format.name; + return nullptr; + }), + payload_name_(payload_name), + streams_active_(streams_active), + start_bps_(start_bps), + automatic_resize_(automatic_resize), + expect_scaling_(expect_scaling) {} + + DegradationPreference degradation_preference_ = + DegradationPreference::MAINTAIN_FRAMERATE; + + private: + void ModifySenderBitrateConfig(BitrateConstraints* bitrate_config) override { + bitrate_config->start_bitrate_bps = start_bps_; + } - // Called when FrameGeneratorCapturer::AddOrUpdateSink is called. - void OnSinkWantsChanged(rtc::VideoSinkInterface<VideoFrame>* sink, - const rtc::VideoSinkWants& wants) override { - if (wants.max_pixel_count < kWidth * kHeight) - observation_complete_.Set(); + void ModifyVideoDegradationPreference( + DegradationPreference* degradation_preference) override { + *degradation_preference = degradation_preference_; + } + + size_t GetNumVideoStreams() const override { + return (payload_name_ == "VP9") ? 1 : streams_active_.size(); + } + + void ModifyVideoConfigs( + VideoSendStream::Config* send_config, + std::vector<VideoReceiveStream::Config>* receive_configs, + VideoEncoderConfig* encoder_config) override { + send_config->encoder_settings.encoder_factory = &encoder_factory_; + send_config->rtp.payload_name = payload_name_; + send_config->rtp.payload_type = test::CallTest::kVideoSendPayloadType; + encoder_config->video_format.name = payload_name_; + const VideoCodecType codec_type = PayloadStringToCodecType(payload_name_); + encoder_config->codec_type = codec_type; + encoder_config->max_bitrate_bps = + std::max(start_bps_, encoder_config->max_bitrate_bps); + if (payload_name_ == "VP9") { + // Simulcast layers indicates which spatial layers are active. + encoder_config->simulcast_layers.resize(streams_active_.size()); + encoder_config->simulcast_layers[0].max_bitrate_bps = + encoder_config->max_bitrate_bps; } - void ModifySenderBitrateConfig( - BitrateConstraints* bitrate_config) override { - bitrate_config->start_bitrate_bps = start_bps_; + double scale_factor = 1.0; + for (int i = streams_active_.size() - 1; i >= 0; --i) { + VideoStream& stream = encoder_config->simulcast_layers[i]; + stream.active = streams_active_[i]; + stream.scale_resolution_down_by = scale_factor; + scale_factor *= (payload_name_ == "VP9") ? 1.0 : 2.0; } + SetEncoderSpecific(encoder_config, codec_type, automatic_resize_, + streams_active_.size()); + } - size_t GetNumVideoStreams() const override { - return (payload_name_ == "VP9") ? 1 : streams_active_.size(); - } + void PerformTest() override { EXPECT_EQ(expect_scaling_, Wait()); } - void ModifyVideoConfigs( - VideoSendStream::Config* send_config, - std::vector<VideoReceiveStream::Config>* receive_configs, - VideoEncoderConfig* encoder_config) override { - send_config->encoder_settings.encoder_factory = &encoder_factory_; - send_config->rtp.payload_name = payload_name_; - send_config->rtp.payload_type = kVideoSendPayloadType; - encoder_config->video_format.name = payload_name_; - const VideoCodecType codec_type = PayloadStringToCodecType(payload_name_); - encoder_config->codec_type = codec_type; - encoder_config->max_bitrate_bps = - std::max(start_bps_, encoder_config->max_bitrate_bps); - if (payload_name_ == "VP9") { - // Simulcast layers indicates which spatial layers are active. - encoder_config->simulcast_layers.resize(streams_active_.size()); - encoder_config->simulcast_layers[0].max_bitrate_bps = - encoder_config->max_bitrate_bps; - } - double scale_factor = 1.0; - for (int i = streams_active_.size() - 1; i >= 0; --i) { - VideoStream& stream = encoder_config->simulcast_layers[i]; - stream.active = streams_active_[i]; - stream.scale_resolution_down_by = scale_factor; - scale_factor *= (payload_name_ == "VP9") ? 1.0 : 2.0; - } - SetEncoderSpecific(encoder_config, codec_type, automatic_resize_, - streams_active_.size()); - } + test::FunctionVideoEncoderFactory encoder_factory_; + const std::string payload_name_; + const std::vector<bool> streams_active_; + const int start_bps_; + const bool automatic_resize_; + const bool expect_scaling_; +}; - void PerformTest() override { - EXPECT_EQ(expect_adaptation_, Wait()) - << "Timed out while waiting for a scale down."; - } +class DownscalingObserver + : public ScalingObserver, + public test::FrameGeneratorCapturer::SinkWantsObserver { + public: + DownscalingObserver(const std::string& payload_name, + const std::vector<bool>& streams_active, + int start_bps, + bool automatic_resize, + bool expect_downscale) + : ScalingObserver(payload_name, + streams_active, + start_bps, + automatic_resize, + expect_downscale) {} + + private: + void OnFrameGeneratorCapturerCreated( + test::FrameGeneratorCapturer* frame_generator_capturer) override { + frame_generator_capturer->SetSinkWantsObserver(this); + frame_generator_capturer->ChangeResolution(kInitialWidth, kInitialHeight); + } - test::FunctionVideoEncoderFactory encoder_factory_; - const std::string payload_name_; - const std::vector<bool> streams_active_; - const int start_bps_; - const bool automatic_resize_; - const bool expect_adaptation_; - } test(payload_name, streams_active, start_bps, automatic_resize, - expect_adaptation); + void OnSinkWantsChanged(rtc::VideoSinkInterface<VideoFrame>* sink, + const rtc::VideoSinkWants& wants) override { + if (wants.max_pixel_count < kInitialWidth * kInitialHeight) + observation_complete_.Set(); + } +}; - RunBaseTest(&test); -} +class UpscalingObserver + : public ScalingObserver, + public test::FrameGeneratorCapturer::SinkWantsObserver { + public: + UpscalingObserver(const std::string& payload_name, + const std::vector<bool>& streams_active, + int start_bps, + bool automatic_resize, + bool expect_upscale) + : ScalingObserver(payload_name, + streams_active, + start_bps, + automatic_resize, + expect_upscale) {} + + void SetDegradationPreference(DegradationPreference preference) { + degradation_preference_ = preference; + } + + private: + void OnFrameGeneratorCapturerCreated( + test::FrameGeneratorCapturer* frame_generator_capturer) override { + frame_generator_capturer->SetSinkWantsObserver(this); + frame_generator_capturer->ChangeResolution(kInitialWidth, kInitialHeight); + } + + void OnSinkWantsChanged(rtc::VideoSinkInterface<VideoFrame>* sink, + const rtc::VideoSinkWants& wants) override { + if (wants.max_pixel_count > last_wants_.max_pixel_count) { + if (wants.max_pixel_count == std::numeric_limits<int>::max()) + observation_complete_.Set(); + } + last_wants_ = wants; + } + + rtc::VideoSinkWants last_wants_; +}; TEST_F(QualityScalingTest, AdaptsDownForHighQp_Vp8) { // qp_low:1, qp_high:1 -> kHighQp test::ScopedFieldTrials field_trials(kPrefix + "1,1,0,0,0,0" + kEnd); - RunTest("VP8", {true}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP8", /*streams_active=*/{true}, kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForHighQpIfScalingOff_Vp8) { // qp_low:1, qp_high:1 -> kHighQp test::ScopedFieldTrials field_trials(kPrefix + "1,1,0,0,0,0" + kEnd); - RunTest("VP8", {true}, kHighStartBps, - /*automatic_resize=*/false, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{true}, kHighStartBps, + /*automatic_resize=*/false, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForNormalQp_Vp8) { // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {true}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{true}, kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, AdaptsDownForLowStartBitrate_Vp8) { // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {true}, kLowStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP8", /*streams_active=*/{true}, kLowStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); +} + +TEST_F(QualityScalingTest, AdaptsDownForLowStartBitrateAndThenUp) { + // qp_low:127, qp_high:127 -> kLowQp + test::ScopedFieldTrials field_trials( + kPrefix + "127,127,0,0,0,0" + kEnd + + "WebRTC-Video-BalancedDegradationSettings/" + "pixels:230400|921600,fps:20|30,kbps:300|500/"); // should not affect + + UpscalingObserver test("VP8", /*streams_active=*/{true}, + kDefaultVgaMinStartBps - 1, + /*automatic_resize=*/true, /*expect_upscale=*/true); + RunBaseTest(&test); +} + +TEST_F(QualityScalingTest, AdaptsDownAndThenUpWithBalanced) { + // qp_low:127, qp_high:127 -> kLowQp + test::ScopedFieldTrials field_trials( + kPrefix + "127,127,0,0,0,0" + kEnd + + "WebRTC-Video-BalancedDegradationSettings/" + "pixels:230400|921600,fps:20|30,kbps:300|499/"); + + UpscalingObserver test("VP8", /*streams_active=*/{true}, + kDefaultVgaMinStartBps - 1, + /*automatic_resize=*/true, /*expect_upscale=*/true); + test.SetDegradationPreference(DegradationPreference::BALANCED); + RunBaseTest(&test); +} + +TEST_F(QualityScalingTest, AdaptsDownButNotUpWithBalancedIfBitrateNotEnough) { + // qp_low:127, qp_high:127 -> kLowQp + test::ScopedFieldTrials field_trials( + kPrefix + "127,127,0,0,0,0" + kEnd + + "WebRTC-Video-BalancedDegradationSettings/" + "pixels:230400|921600,fps:20|30,kbps:300|500/"); + + UpscalingObserver test("VP8", /*streams_active=*/{true}, + kDefaultVgaMinStartBps - 1, + /*automatic_resize=*/true, /*expect_upscale=*/false); + test.SetDegradationPreference(DegradationPreference::BALANCED); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForLowStartBitrate_Simulcast) { // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {true, true}, kLowStartBps, - /*automatic_resize=*/false, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{true, true}, kLowStartBps, + /*automatic_resize=*/false, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, AdaptsDownForHighQp_HighestStreamActive_Vp8) { // qp_low:1, qp_high:1 -> kHighQp test::ScopedFieldTrials field_trials(kPrefix + "1,1,0,0,0,0" + kEnd); - RunTest("VP8", {false, false, true}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP8", /*streams_active=*/{false, false, true}, + kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } TEST_F(QualityScalingTest, @@ -223,18 +321,32 @@ TEST_F(QualityScalingTest, // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {false, false, true}, - kSinglecastLimits720pVp8->min_start_bitrate_bps - 1, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP8", /*streams_active=*/{false, false, true}, + kSinglecastLimits720pVp8->min_start_bitrate_bps - 1, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); +} + +TEST_F(QualityScalingTest, AdaptsDownButNotUpWithMinStartBitrateLimit) { + // qp_low:127, qp_high:127 -> kLowQp + test::ScopedFieldTrials field_trials(kPrefix + "127,127,0,0,0,0" + kEnd); + + UpscalingObserver test("VP8", /*streams_active=*/{false, true}, + kSinglecastLimits720pVp8->min_start_bitrate_bps - 1, + /*automatic_resize=*/true, /*expect_upscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForLowStartBitrateIfBitrateEnough_Vp8) { // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {false, false, true}, - kSinglecastLimits720pVp8->min_start_bitrate_bps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{false, false, true}, + kSinglecastLimits720pVp8->min_start_bitrate_bps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, @@ -244,9 +356,11 @@ TEST_F(QualityScalingTest, kPrefix + "1,127,0,0,0,0" + kEnd + "WebRTC-DefaultBitrateLimitsKillSwitch/Enabled/"); - RunTest("VP8", {false, false, true}, - kSinglecastLimits720pVp8->min_start_bitrate_bps - 1, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{false, false, true}, + kSinglecastLimits720pVp8->min_start_bitrate_bps - 1, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, @@ -254,16 +368,22 @@ TEST_F(QualityScalingTest, // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {true}, kSinglecastLimits720pVp8->min_start_bitrate_bps - 1, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{true}, + kSinglecastLimits720pVp8->min_start_bitrate_bps - 1, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForHighQp_LowestStreamActive_Vp8) { // qp_low:1, qp_high:1 -> kHighQp test::ScopedFieldTrials field_trials(kPrefix + "1,1,0,0,0,0" + kEnd); - RunTest("VP8", {true, false, false}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{true, false, false}, + kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, @@ -271,16 +391,21 @@ TEST_F(QualityScalingTest, // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {true, false, false}, kLowStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{true, false, false}, + kLowStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForLowStartBitrateIfScalingOff_Vp8) { // qp_low:1, qp_high:127 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "1,127,0,0,0,0" + kEnd); - RunTest("VP8", {true}, kLowStartBps, - /*automatic_resize=*/false, /*expect_adaptation=*/false); + DownscalingObserver test("VP8", /*streams_active=*/{true}, kLowStartBps, + /*automatic_resize=*/false, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, AdaptsDownForHighQp_Vp9) { @@ -288,8 +413,10 @@ TEST_F(QualityScalingTest, AdaptsDownForHighQp_Vp9) { test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,1,0,0" + kEnd + "WebRTC-VP9QualityScaler/Enabled/"); - RunTest("VP9", {true}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP9", /*streams_active=*/{true}, kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForHighQpIfScalingOff_Vp9) { @@ -297,8 +424,10 @@ TEST_F(QualityScalingTest, NoAdaptDownForHighQpIfScalingOff_Vp9) { test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,1,0,0" + kEnd + "WebRTC-VP9QualityScaler/Disabled/"); - RunTest("VP9", {true}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP9", /*streams_active=*/{true}, kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, AdaptsDownForLowStartBitrate_Vp9) { @@ -306,8 +435,10 @@ TEST_F(QualityScalingTest, AdaptsDownForLowStartBitrate_Vp9) { test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,255,0,0" + kEnd + "WebRTC-VP9QualityScaler/Enabled/"); - RunTest("VP9", {true}, kLowStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP9", /*streams_active=*/{true}, kLowStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForHighQp_LowestStreamActive_Vp9) { @@ -315,8 +446,11 @@ TEST_F(QualityScalingTest, NoAdaptDownForHighQp_LowestStreamActive_Vp9) { test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,1,0,0" + kEnd + "WebRTC-VP9QualityScaler/Enabled/"); - RunTest("VP9", {true, false, false}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP9", /*streams_active=*/{true, false, false}, + kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, @@ -325,8 +459,11 @@ TEST_F(QualityScalingTest, test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,255,0,0" + kEnd + "WebRTC-VP9QualityScaler/Enabled/"); - RunTest("VP9", {true, false, false}, kLowStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP9", /*streams_active=*/{true, false, false}, + kLowStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } TEST_F(QualityScalingTest, AdaptsDownForHighQp_MiddleStreamActive_Vp9) { @@ -334,8 +471,11 @@ TEST_F(QualityScalingTest, AdaptsDownForHighQp_MiddleStreamActive_Vp9) { test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,1,0,0" + kEnd + "WebRTC-VP9QualityScaler/Enabled/"); - RunTest("VP9", {false, true, false}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP9", /*streams_active=*/{false, true, false}, + kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } TEST_F(QualityScalingTest, @@ -344,9 +484,11 @@ TEST_F(QualityScalingTest, test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,255,0,0" + kEnd + "WebRTC-VP9QualityScaler/Enabled/"); - RunTest("VP9", {false, true, false}, - kSinglecastLimits360pVp9->min_start_bitrate_bps - 1, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("VP9", /*streams_active=*/{false, true, false}, + kSinglecastLimits360pVp9->min_start_bitrate_bps - 1, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } TEST_F(QualityScalingTest, NoAdaptDownForLowStartBitrateIfBitrateEnough_Vp9) { @@ -354,9 +496,11 @@ TEST_F(QualityScalingTest, NoAdaptDownForLowStartBitrateIfBitrateEnough_Vp9) { test::ScopedFieldTrials field_trials(kPrefix + "0,0,1,255,0,0" + kEnd + "WebRTC-VP9QualityScaler/Enabled/"); - RunTest("VP9", {false, true, false}, - kSinglecastLimits360pVp9->min_start_bitrate_bps, - /*automatic_resize=*/true, /*expect_adaptation=*/false); + DownscalingObserver test("VP9", /*streams_active=*/{false, true, false}, + kSinglecastLimits360pVp9->min_start_bitrate_bps, + /*automatic_resize=*/true, + /*expect_downscale=*/false); + RunBaseTest(&test); } #if defined(WEBRTC_USE_H264) @@ -364,16 +508,20 @@ TEST_F(QualityScalingTest, AdaptsDownForHighQp_H264) { // qp_low:1, qp_high:1 -> kHighQp test::ScopedFieldTrials field_trials(kPrefix + "0,0,0,0,1,1" + kEnd); - RunTest("H264", {true}, kHighStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("H264", /*streams_active=*/{true}, kHighStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } TEST_F(QualityScalingTest, AdaptsDownForLowStartBitrate_H264) { // qp_low:1, qp_high:51 -> kNormalQp test::ScopedFieldTrials field_trials(kPrefix + "0,0,0,0,1,51" + kEnd); - RunTest("H264", {true}, kLowStartBps, - /*automatic_resize=*/true, /*expect_adaptation=*/true); + DownscalingObserver test("H264", /*streams_active=*/{true}, kLowStartBps, + /*automatic_resize=*/true, + /*expect_downscale=*/true); + RunBaseTest(&test); } #endif // defined(WEBRTC_USE_H264) |