Enable flexible mode by default
Added a dedicated kill-switch WebRTC-Video-Vp9FlexibleMode.
Bug: webrtc:329396373
Change-Id: I1acb28032898379eecf7dd81a770c73708286d74
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/355700
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42543}
diff --git a/experiments/field_trials.py b/experiments/field_trials.py
index 6fd3d04..5949cdc 100755
--- a/experiments/field_trials.py
+++ b/experiments/field_trials.py
@@ -155,6 +155,9 @@
FieldTrial('WebRTC-Video-H26xPacketBuffer',
41480904,
date(2024, 6, 1)),
+ FieldTrial('WebRTC-Video-Vp9FlexibleMode',
+ 329396373,
+ date(2025, 6, 26)),
# keep-sorted end
]) # yapf: disable
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index 70176e8..33ad546 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -978,10 +978,8 @@
{{"off", webrtc::InterLayerPredMode::kOff},
{"on", webrtc::InterLayerPredMode::kOn},
{"onkeypic", webrtc::InterLayerPredMode::kOnKeyPic}});
- webrtc::FieldTrialFlag force_flexible_mode("FlexibleMode");
webrtc::ParseFieldTrial(
- {&interlayer_pred_experiment_enabled, &inter_layer_pred_mode,
- &force_flexible_mode},
+ {&interlayer_pred_experiment_enabled, &inter_layer_pred_mode},
call_->trials().Lookup("WebRTC-Vp9InterLayerPred"));
if (interlayer_pred_experiment_enabled) {
vp9_settings.interLayerPred = inter_layer_pred_mode;
@@ -989,7 +987,10 @@
// Limit inter-layer prediction to key pictures by default.
vp9_settings.interLayerPred = webrtc::InterLayerPredMode::kOnKeyPic;
}
- vp9_settings.flexibleMode = force_flexible_mode.Get();
+
+ // TODO(webrtc:329396373): Remove after flexible mode is fully deployed.
+ vp9_settings.flexibleMode =
+ IsDisabled(call_->trials(), "WebRTC-Video-Vp9FlexibleMode");
} else {
// Multiple spatial layers vp9 screenshare needs flexible mode.
vp9_settings.flexibleMode = vp9_settings.numberOfSpatialLayers > 1;
@@ -1503,9 +1504,9 @@
RTC_DCHECK(ssrc != 0);
send_streams_[ssrc] = stream;
- if (ssrc_list_changed_callback_) {
- ssrc_list_changed_callback_(send_ssrcs_);
- }
+ if (ssrc_list_changed_callback_) {
+ ssrc_list_changed_callback_(send_ssrcs_);
+ }
if (sending_) {
stream->SetSend(true);
@@ -3146,22 +3147,22 @@
// BWE has already been notified of this received packet.
return false;
}
- // Ignore unknown ssrcs if we recently created an unsignalled receive
- // stream since this shouldn't happen frequently. Getting into a state
- // of creating decoders on every packet eats up processing time (e.g.
- // https://crbug.com/1069603) and this cooldown prevents that.
- if (last_unsignalled_ssrc_creation_time_ms_.has_value()) {
- int64_t now_ms = rtc::TimeMillis();
- if (now_ms - last_unsignalled_ssrc_creation_time_ms_.value() <
- kUnsignaledSsrcCooldownMs) {
- // We've already created an unsignalled ssrc stream within the last
- // 0.5 s, ignore with a warning.
- RTC_LOG(LS_WARNING)
- << "Another unsignalled ssrc packet arrived shortly after the "
- << "creation of an unsignalled ssrc stream. Dropping packet.";
- return false;
- }
+ // Ignore unknown ssrcs if we recently created an unsignalled receive
+ // stream since this shouldn't happen frequently. Getting into a state
+ // of creating decoders on every packet eats up processing time (e.g.
+ // https://crbug.com/1069603) and this cooldown prevents that.
+ if (last_unsignalled_ssrc_creation_time_ms_.has_value()) {
+ int64_t now_ms = rtc::TimeMillis();
+ if (now_ms - last_unsignalled_ssrc_creation_time_ms_.value() <
+ kUnsignaledSsrcCooldownMs) {
+ // We've already created an unsignalled ssrc stream within the last
+ // 0.5 s, ignore with a warning.
+ RTC_LOG(LS_WARNING)
+ << "Another unsignalled ssrc packet arrived shortly after the "
+ << "creation of an unsignalled ssrc stream. Dropping packet.";
+ return false;
}
+ }
// RTX SSRC not yet known.
ReCreateDefaultReceiveStream(packet.Ssrc(), absl::nullopt);