diff --git a/experiments/field_trials.py b/experiments/field_trials.py index 6fd3d04b11..5949cdc4df 100755 --- a/experiments/field_trials.py +++ b/experiments/field_trials.py @@ -155,6 +155,9 @@ ACTIVE_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ 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 70176e88af..33ad546ce2 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc @@ -978,10 +978,8 @@ WebRtcVideoSendChannel::WebRtcVideoSendStream::ConfigureVideoEncoderSettings( {{"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 @@ WebRtcVideoSendChannel::WebRtcVideoSendStream::ConfigureVideoEncoderSettings( // 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 @@ bool WebRtcVideoSendChannel::AddSendStream(const StreamParams& sp) { 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 @@ bool WebRtcVideoReceiveChannel::MaybeCreateDefaultReceiveStream( // 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);