Query WebRTC-KeyframeInterval through propagated field trials

Bug: webrtc:42220378
Change-Id: I3556ec6b280bf6c03e6c3a20949a19e182eed2b8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/349640
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42349}
This commit is contained in:
Danil Chapovalov 2024-05-02 16:48:16 +02:00 committed by WebRTC LUCI CQ
parent f317f7106a
commit b57178b836
8 changed files with 26 additions and 35 deletions

View File

@ -152,7 +152,6 @@ rtc_library("keyframe_interval_settings_experiment") {
deps = [ deps = [
":field_trial_parser", ":field_trial_parser",
"../../api:field_trials_view", "../../api:field_trials_view",
"../../api/transport:field_trial_based_config",
] ]
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
} }

View File

@ -10,7 +10,7 @@
#include "rtc_base/experiments/keyframe_interval_settings.h" #include "rtc_base/experiments/keyframe_interval_settings.h"
#include "api/transport/field_trial_based_config.h" #include "api/field_trials_view.h"
namespace webrtc { namespace webrtc {
@ -21,15 +21,10 @@ constexpr char kFieldTrialName[] = "WebRTC-KeyframeInterval";
} // namespace } // namespace
KeyframeIntervalSettings::KeyframeIntervalSettings( KeyframeIntervalSettings::KeyframeIntervalSettings(
const FieldTrialsView* const key_value_config) const FieldTrialsView& key_value_config)
: min_keyframe_send_interval_ms_("min_keyframe_send_interval_ms") { : min_keyframe_send_interval_ms_("min_keyframe_send_interval_ms") {
ParseFieldTrial({&min_keyframe_send_interval_ms_}, ParseFieldTrial({&min_keyframe_send_interval_ms_},
key_value_config->Lookup(kFieldTrialName)); key_value_config.Lookup(kFieldTrialName));
}
KeyframeIntervalSettings KeyframeIntervalSettings::ParseFromFieldTrials() {
FieldTrialBasedConfig field_trial_config;
return KeyframeIntervalSettings(&field_trial_config);
} }
absl::optional<int> KeyframeIntervalSettings::MinKeyframeSendIntervalMs() absl::optional<int> KeyframeIntervalSettings::MinKeyframeSendIntervalMs()

View File

@ -17,20 +17,18 @@
namespace webrtc { namespace webrtc {
// TODO(bugs.webrtc.org/10427): Remove and replace with proper configuration // TODO: bugs.webrtc.org/42220470 - Remove and replace with proper configuration
// parameter, or move to using FIR if intent is to avoid triggering multiple // parameter, or move to using FIR if intent is to avoid triggering multiple
// times to PLIs corresponding to the same request when RTT is large. // times to PLIs corresponding to the same request when RTT is large.
class KeyframeIntervalSettings final { class KeyframeIntervalSettings final {
public: public:
static KeyframeIntervalSettings ParseFromFieldTrials(); explicit KeyframeIntervalSettings(const FieldTrialsView& key_value_config);
// Sender side. // Sender side.
// The encoded keyframe send rate is <= 1/MinKeyframeSendIntervalMs(). // The encoded keyframe send rate is <= 1/MinKeyframeSendIntervalMs().
absl::optional<int> MinKeyframeSendIntervalMs() const; absl::optional<int> MinKeyframeSendIntervalMs() const;
private: private:
explicit KeyframeIntervalSettings(const FieldTrialsView* key_value_config);
FieldTrialOptional<int> min_keyframe_send_interval_ms_; FieldTrialOptional<int> min_keyframe_send_interval_ms_;
}; };

View File

@ -10,33 +10,29 @@
#include "rtc_base/experiments/keyframe_interval_settings.h" #include "rtc_base/experiments/keyframe_interval_settings.h"
#include "test/field_trial.h" #include "test/explicit_key_value_config.h"
#include "test/gtest.h" #include "test/gtest.h"
namespace webrtc { namespace webrtc {
namespace { namespace {
using test::ExplicitKeyValueConfig;
TEST(KeyframeIntervalSettingsTest, ParsesMinKeyframeSendIntervalMs) { TEST(KeyframeIntervalSettingsTest, ParsesMinKeyframeSendIntervalMs) {
EXPECT_FALSE(KeyframeIntervalSettings::ParseFromFieldTrials() EXPECT_FALSE(KeyframeIntervalSettings(ExplicitKeyValueConfig(""))
.MinKeyframeSendIntervalMs()); .MinKeyframeSendIntervalMs());
test::ScopedFieldTrials field_trials( ExplicitKeyValueConfig field_trials(
"WebRTC-KeyframeInterval/min_keyframe_send_interval_ms:100/"); "WebRTC-KeyframeInterval/min_keyframe_send_interval_ms:100/");
EXPECT_EQ(KeyframeIntervalSettings::ParseFromFieldTrials() EXPECT_EQ(KeyframeIntervalSettings(field_trials).MinKeyframeSendIntervalMs(),
.MinKeyframeSendIntervalMs(),
100); 100);
} }
TEST(KeyframeIntervalSettingsTest, DoesNotParseIncorrectValues) { TEST(KeyframeIntervalSettingsTest, DoesNotParseIncorrectValues) {
EXPECT_FALSE(KeyframeIntervalSettings::ParseFromFieldTrials() ExplicitKeyValueConfig field_trials(
.MinKeyframeSendIntervalMs());
test::ScopedFieldTrials field_trials(
"WebRTC-KeyframeInterval/min_keyframe_send_interval_ms:a/"); "WebRTC-KeyframeInterval/min_keyframe_send_interval_ms:a/");
EXPECT_FALSE(KeyframeIntervalSettings::ParseFromFieldTrials() EXPECT_FALSE(
.MinKeyframeSendIntervalMs()); KeyframeIntervalSettings(field_trials).MinKeyframeSendIntervalMs());
EXPECT_FALSE(KeyframeIntervalSettings::ParseFromFieldTrials()
.MinKeyframeSendIntervalMs());
} }
} // namespace } // namespace

View File

@ -14,9 +14,11 @@
#include <utility> #include <utility>
#include "absl/types/optional.h" #include "absl/types/optional.h"
#include "api/environment/environment.h"
#include "api/video_codecs/video_encoder.h" #include "api/video_codecs/video_encoder.h"
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "rtc_base/experiments/keyframe_interval_settings.h" #include "rtc_base/experiments/keyframe_interval_settings.h"
#include "system_wrappers/include/clock.h"
namespace webrtc { namespace webrtc {
@ -25,14 +27,14 @@ constexpr int kMinKeyframeSendIntervalMs = 300;
} // namespace } // namespace
EncoderRtcpFeedback::EncoderRtcpFeedback( EncoderRtcpFeedback::EncoderRtcpFeedback(
Clock* clock, const Environment& env,
bool per_layer_keyframes, bool per_layer_keyframes,
const std::vector<uint32_t>& ssrcs, const std::vector<uint32_t>& ssrcs,
VideoStreamEncoderInterface* encoder, VideoStreamEncoderInterface* encoder,
std::function<std::vector<RtpSequenceNumberMap::Info>( std::function<std::vector<RtpSequenceNumberMap::Info>(
uint32_t ssrc, uint32_t ssrc,
const std::vector<uint16_t>& seq_nums)> get_packet_infos) const std::vector<uint16_t>& seq_nums)> get_packet_infos)
: clock_(clock), : env_(env),
ssrcs_(ssrcs), ssrcs_(ssrcs),
per_layer_keyframes_(per_layer_keyframes), per_layer_keyframes_(per_layer_keyframes),
get_packet_infos_(std::move(get_packet_infos)), get_packet_infos_(std::move(get_packet_infos)),
@ -40,7 +42,7 @@ EncoderRtcpFeedback::EncoderRtcpFeedback(
time_last_packet_delivery_queue_(per_layer_keyframes ? ssrcs.size() : 1, time_last_packet_delivery_queue_(per_layer_keyframes ? ssrcs.size() : 1,
Timestamp::Zero()), Timestamp::Zero()),
min_keyframe_send_interval_( min_keyframe_send_interval_(
TimeDelta::Millis(KeyframeIntervalSettings::ParseFromFieldTrials() TimeDelta::Millis(KeyframeIntervalSettings(env_.field_trials())
.MinKeyframeSendIntervalMs() .MinKeyframeSendIntervalMs()
.value_or(kMinKeyframeSendIntervalMs))) { .value_or(kMinKeyframeSendIntervalMs))) {
RTC_DCHECK(!ssrcs.empty()); RTC_DCHECK(!ssrcs.empty());
@ -60,7 +62,7 @@ void EncoderRtcpFeedback::OnReceivedIntraFrameRequest(uint32_t ssrc) {
size_t ssrc_index = size_t ssrc_index =
per_layer_keyframes_ ? std::distance(ssrcs_.begin(), it) : 0; per_layer_keyframes_ ? std::distance(ssrcs_.begin(), it) : 0;
RTC_CHECK_LE(ssrc_index, time_last_packet_delivery_queue_.size()); RTC_CHECK_LE(ssrc_index, time_last_packet_delivery_queue_.size());
const Timestamp now = clock_->CurrentTime(); const Timestamp now = env_.clock().CurrentTime();
if (time_last_packet_delivery_queue_[ssrc_index] + if (time_last_packet_delivery_queue_[ssrc_index] +
min_keyframe_send_interval_ > min_keyframe_send_interval_ >
now) now)

View File

@ -13,13 +13,13 @@
#include <functional> #include <functional>
#include <vector> #include <vector>
#include "api/environment/environment.h"
#include "api/sequence_checker.h" #include "api/sequence_checker.h"
#include "api/units/time_delta.h" #include "api/units/time_delta.h"
#include "api/units/timestamp.h" #include "api/units/timestamp.h"
#include "call/rtp_video_sender_interface.h" #include "call/rtp_video_sender_interface.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "rtc_base/system/no_unique_address.h" #include "rtc_base/system/no_unique_address.h"
#include "system_wrappers/include/clock.h"
#include "video/video_stream_encoder_interface.h" #include "video/video_stream_encoder_interface.h"
namespace webrtc { namespace webrtc {
@ -32,7 +32,7 @@ class EncoderRtcpFeedback : public RtcpIntraFrameObserver,
public RtcpLossNotificationObserver { public RtcpLossNotificationObserver {
public: public:
EncoderRtcpFeedback( EncoderRtcpFeedback(
Clock* clock, const Environment& env,
bool per_layer_keyframes, bool per_layer_keyframes,
const std::vector<uint32_t>& ssrcs, const std::vector<uint32_t>& ssrcs,
VideoStreamEncoderInterface* encoder, VideoStreamEncoderInterface* encoder,
@ -50,7 +50,7 @@ class EncoderRtcpFeedback : public RtcpIntraFrameObserver,
bool decodability_flag) override; bool decodability_flag) override;
private: private:
Clock* const clock_; const Environment env_;
const std::vector<uint32_t> ssrcs_; const std::vector<uint32_t> ssrcs_;
const bool per_layer_keyframes_; const bool per_layer_keyframes_;
const std::function<std::vector<RtpSequenceNumberMap::Info>( const std::function<std::vector<RtpSequenceNumberMap::Info>(

View File

@ -12,6 +12,7 @@
#include <memory> #include <memory>
#include "api/environment/environment_factory.h"
#include "test/gmock.h" #include "test/gmock.h"
#include "test/gtest.h" #include "test/gtest.h"
#include "video/test/mock_video_stream_encoder.h" #include "video/test/mock_video_stream_encoder.h"
@ -27,7 +28,7 @@ class VideoEncoderFeedbackKeyframeTestBase : public ::testing::Test {
std::vector<uint32_t> ssrcs) std::vector<uint32_t> ssrcs)
: simulated_clock_(123456789), : simulated_clock_(123456789),
encoder_(), encoder_(),
encoder_rtcp_feedback_(&simulated_clock_, encoder_rtcp_feedback_(CreateEnvironment(&simulated_clock_),
per_layer_pli_handling, per_layer_pli_handling,
ssrcs, ssrcs,
&encoder_, &encoder_,

View File

@ -418,7 +418,7 @@ VideoSendStreamImpl::VideoSendStreamImpl(
metronome, metronome,
config_.encoder_selector)), config_.encoder_selector)),
encoder_feedback_( encoder_feedback_(
&env_.clock(), env_,
SupportsPerLayerPictureLossIndication( SupportsPerLayerPictureLossIndication(
encoder_config.video_format.parameters), encoder_config.video_format.parameters),
config_.rtp.ssrcs, config_.rtp.ssrcs,