blob: 185bd409606e850fe396595145b29051d6df3ece [file] [log] [blame]
Erik Språngadfb4f72019-08-23 20:02:13 +02001/*
2 * Copyright 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "rtc_base/experiments/stable_target_rate_experiment.h"
12
13#include "api/transport/field_trial_based_config.h"
14#include "rtc_base/experiments/rate_control_settings.h"
15
16namespace webrtc {
17namespace {
18constexpr char kFieldTrialName[] = "WebRTC-StableTargetRate";
19} // namespace
20
21StableTargetRateExperiment::StableTargetRateExperiment(
22 const WebRtcKeyValueConfig* const key_value_config,
23 absl::optional<double> default_video_hysteresis,
24 absl::optional<double> default_screenshare_hysteresis)
25 : enabled_("enabled", false),
26 video_hysteresis_factor_("video_hysteresis_factor",
27 default_video_hysteresis),
28 screenshare_hysteresis_factor_("screenshare_hysteresis_factor",
29 default_screenshare_hysteresis) {
30 ParseFieldTrial(
31 {&enabled_, &video_hysteresis_factor_, &screenshare_hysteresis_factor_},
32 key_value_config->Lookup(kFieldTrialName));
33}
34
35StableTargetRateExperiment::StableTargetRateExperiment(
Erik Språngcf9cbf52019-09-04 14:30:57 +020036 const StableTargetRateExperiment&) = default;
37StableTargetRateExperiment::StableTargetRateExperiment(
Erik Språngadfb4f72019-08-23 20:02:13 +020038 StableTargetRateExperiment&&) = default;
39
40StableTargetRateExperiment StableTargetRateExperiment::ParseFromFieldTrials() {
41 FieldTrialBasedConfig config;
42 return ParseFromKeyValueConfig(&config);
43}
44
45StableTargetRateExperiment StableTargetRateExperiment::ParseFromKeyValueConfig(
46 const WebRtcKeyValueConfig* const key_value_config) {
47 if (key_value_config->Lookup("WebRTC-VideoRateControl") != "") {
48 RateControlSettings rate_control =
49 RateControlSettings::ParseFromKeyValueConfig(key_value_config);
50 return StableTargetRateExperiment(key_value_config,
51 rate_control.GetSimulcastHysteresisFactor(
52 VideoCodecMode::kRealtimeVideo),
53 rate_control.GetSimulcastHysteresisFactor(
54 VideoCodecMode::kScreensharing));
55 }
56 return StableTargetRateExperiment(key_value_config, absl::nullopt,
57 absl::nullopt);
58}
59
60bool StableTargetRateExperiment::IsEnabled() const {
61 return enabled_.Get();
62}
63
64absl::optional<double> StableTargetRateExperiment::GetVideoHysteresisFactor()
65 const {
66 return video_hysteresis_factor_.GetOptional();
67}
68
69absl::optional<double>
70StableTargetRateExperiment::GetScreenshareHysteresisFactor() const {
71 return screenshare_hysteresis_factor_.GetOptional();
72}
73
74} // namespace webrtc