mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00

Replace factory that takes optional FieldTrialView with a constructor that takes non-optional reference to the same interface - all callers already guarantee it is not nullptr Replace several local IsEnabled/IsDisabled helpers with the same helpers in FieldTrialView In CongestionWindowPushbackController tests pass field trials bypassing global field trial string Bug: webrtc:42220378 Change-Id: Ic49ad78919d834a5e3b9b69545d3b39088023a75 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/349900 Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/main@{#42270}
171 lines
5.6 KiB
C++
171 lines
5.6 KiB
C++
/*
|
|
* Copyright (c) 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 <inttypes.h>
|
|
#include <stdio.h>
|
|
|
|
#include <string>
|
|
|
|
#include "absl/strings/match.h"
|
|
#include "api/transport/field_trial_based_config.h"
|
|
#include "rtc_base/logging.h"
|
|
#include "rtc_base/numerics/safe_conversions.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace {
|
|
|
|
const int kDefaultAcceptedQueueMs = 350;
|
|
|
|
const int kDefaultMinPushbackTargetBitrateBps = 30000;
|
|
|
|
const char kCongestionWindowDefaultFieldTrialString[] =
|
|
"QueueSize:350,MinBitrate:30000,DropFrame:true";
|
|
|
|
const char kUseBaseHeavyVp8Tl3RateAllocationFieldTrialName[] =
|
|
"WebRTC-UseBaseHeavyVP8TL3RateAllocation";
|
|
|
|
} // namespace
|
|
|
|
constexpr char CongestionWindowConfig::kKey[];
|
|
|
|
std::unique_ptr<StructParametersParser> CongestionWindowConfig::Parser() {
|
|
return StructParametersParser::Create("QueueSize", &queue_size_ms, //
|
|
"MinBitrate", &min_bitrate_bps,
|
|
"InitWin", &initial_data_window,
|
|
"DropFrame", &drop_frame_only);
|
|
}
|
|
|
|
// static
|
|
CongestionWindowConfig CongestionWindowConfig::Parse(absl::string_view config) {
|
|
CongestionWindowConfig res;
|
|
res.Parser()->Parse(config);
|
|
return res;
|
|
}
|
|
|
|
constexpr char VideoRateControlConfig::kKey[];
|
|
|
|
std::unique_ptr<StructParametersParser> VideoRateControlConfig::Parser() {
|
|
// The empty comments ensures that each pair is on a separate line.
|
|
return StructParametersParser::Create(
|
|
"pacing_factor", &pacing_factor, //
|
|
"alr_probing", &alr_probing, //
|
|
"vp8_qp_max", &vp8_qp_max, //
|
|
"vp8_min_pixels", &vp8_min_pixels, //
|
|
"trust_vp8", &trust_vp8, //
|
|
"trust_vp9", &trust_vp9, //
|
|
"bitrate_adjuster", &bitrate_adjuster, //
|
|
"adjuster_use_headroom", &adjuster_use_headroom, //
|
|
"vp8_s0_boost", &vp8_s0_boost, //
|
|
"vp8_base_heavy_tl3_alloc", &vp8_base_heavy_tl3_alloc);
|
|
}
|
|
|
|
RateControlSettings::RateControlSettings(
|
|
const FieldTrialsView& key_value_config) {
|
|
std::string congestion_window_config =
|
|
key_value_config.Lookup(CongestionWindowConfig::kKey);
|
|
if (congestion_window_config.empty()) {
|
|
congestion_window_config = kCongestionWindowDefaultFieldTrialString;
|
|
}
|
|
congestion_window_config_ =
|
|
CongestionWindowConfig::Parse(congestion_window_config);
|
|
video_config_.vp8_base_heavy_tl3_alloc = key_value_config.IsEnabled(
|
|
kUseBaseHeavyVp8Tl3RateAllocationFieldTrialName);
|
|
video_config_.Parser()->Parse(
|
|
key_value_config.Lookup(VideoRateControlConfig::kKey));
|
|
}
|
|
|
|
RateControlSettings::~RateControlSettings() = default;
|
|
RateControlSettings::RateControlSettings(RateControlSettings&&) = default;
|
|
|
|
RateControlSettings RateControlSettings::ParseFromFieldTrials() {
|
|
return RateControlSettings(FieldTrialBasedConfig());
|
|
}
|
|
|
|
bool RateControlSettings::UseCongestionWindow() const {
|
|
return static_cast<bool>(congestion_window_config_.queue_size_ms);
|
|
}
|
|
|
|
int64_t RateControlSettings::GetCongestionWindowAdditionalTimeMs() const {
|
|
return congestion_window_config_.queue_size_ms.value_or(
|
|
kDefaultAcceptedQueueMs);
|
|
}
|
|
|
|
bool RateControlSettings::UseCongestionWindowPushback() const {
|
|
return congestion_window_config_.queue_size_ms &&
|
|
congestion_window_config_.min_bitrate_bps;
|
|
}
|
|
|
|
bool RateControlSettings::UseCongestionWindowDropFrameOnly() const {
|
|
return congestion_window_config_.drop_frame_only;
|
|
}
|
|
|
|
uint32_t RateControlSettings::CongestionWindowMinPushbackTargetBitrateBps()
|
|
const {
|
|
return congestion_window_config_.min_bitrate_bps.value_or(
|
|
kDefaultMinPushbackTargetBitrateBps);
|
|
}
|
|
|
|
absl::optional<DataSize>
|
|
RateControlSettings::CongestionWindowInitialDataWindow() const {
|
|
return congestion_window_config_.initial_data_window;
|
|
}
|
|
|
|
absl::optional<double> RateControlSettings::GetPacingFactor() const {
|
|
return video_config_.pacing_factor;
|
|
}
|
|
|
|
bool RateControlSettings::UseAlrProbing() const {
|
|
return video_config_.alr_probing;
|
|
}
|
|
|
|
absl::optional<int> RateControlSettings::LibvpxVp8QpMax() const {
|
|
if (video_config_.vp8_qp_max &&
|
|
(*video_config_.vp8_qp_max < 0 || *video_config_.vp8_qp_max > 63)) {
|
|
RTC_LOG(LS_WARNING) << "Unsupported vp8_qp_max_ value, ignored.";
|
|
return absl::nullopt;
|
|
}
|
|
return video_config_.vp8_qp_max;
|
|
}
|
|
|
|
absl::optional<int> RateControlSettings::LibvpxVp8MinPixels() const {
|
|
if (video_config_.vp8_min_pixels && *video_config_.vp8_min_pixels < 1) {
|
|
return absl::nullopt;
|
|
}
|
|
return video_config_.vp8_min_pixels;
|
|
}
|
|
|
|
bool RateControlSettings::LibvpxVp8TrustedRateController() const {
|
|
return video_config_.trust_vp8;
|
|
}
|
|
|
|
bool RateControlSettings::Vp8BoostBaseLayerQuality() const {
|
|
return video_config_.vp8_s0_boost;
|
|
}
|
|
|
|
bool RateControlSettings::LibvpxVp9TrustedRateController() const {
|
|
return video_config_.trust_vp9;
|
|
}
|
|
|
|
bool RateControlSettings::Vp8BaseHeavyTl3RateAllocation() const {
|
|
return video_config_.vp8_base_heavy_tl3_alloc;
|
|
}
|
|
|
|
bool RateControlSettings::UseEncoderBitrateAdjuster() const {
|
|
return video_config_.bitrate_adjuster;
|
|
}
|
|
|
|
bool RateControlSettings::BitrateAdjusterCanUseNetworkHeadroom() const {
|
|
return video_config_.adjuster_use_headroom;
|
|
}
|
|
|
|
} // namespace webrtc
|