field_trials.py (40794B)
1 #!/usr/bin/env vpython3 2 3 # Copyright (c) 2022 The WebRTC Project Authors. All Rights Reserved. 4 # 5 # Use of this source code is governed by a BSD-style license 6 # that can be found in the LICENSE file in the root of the source 7 # tree. An additional intellectual property rights grant can be found 8 # in the file PATENTS. All contributing project authors may 9 # be found in the AUTHORS file in the root of the source tree. 10 11 import datetime 12 from datetime import date 13 import hashlib 14 import sys 15 from typing import FrozenSet, List, Set 16 17 import argparse 18 import dataclasses 19 20 21 @dataclasses.dataclass(frozen=True) 22 class FieldTrial: 23 """Representation of all attributes associated with a field trial. 24 25 Attributes: 26 key: Field trial key. 27 bug_id: Associated open bug containing more context. 28 end_date: Date when the field trial expires and must be deleted. 29 """ 30 key: str 31 bug_id: int 32 end_date: date 33 34 def bug_url(self) -> str: 35 if self.bug_id <= 0: 36 return '' 37 return f'https://issues.webrtc.org/issues/{self.bug_id}' 38 39 40 # As per the policy in `g3doc/field-trials.md`, all field trials should be 41 # registered in the container below. 42 ACTIVE_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ 43 # keep-sorted start 44 FieldTrial('WebRTC-Aec3BufferingMaxAllowedExcessRenderBlocksOverride', 45 337900458, 46 date(2024, 9, 1)), 47 FieldTrial('WebRTC-Audio-GainController2', 48 42232605, 49 date(2024, 4, 1)), 50 FieldTrial('WebRTC-Audio-OpusDecodeStereoByDefault', 51 379996136, 52 date(2025, 11, 15)), 53 FieldTrial('WebRTC-Audio-OpusGeneratePlc', 54 42223518, 55 date(2025, 4, 1)), 56 FieldTrial('WebRTC-Audio-PriorityBitrate', 57 42226125, 58 date(2024, 4, 1)), 59 FieldTrial('WebRTC-AV1-OverridePriorityBitrate', 60 42226119, 61 date(2024, 4, 1)), 62 FieldTrial('WebRTC-Av1-GetEncoderInfoOverride', 63 42225234, 64 date(2024, 4, 1)), 65 FieldTrial('WebRTC-BitrateAdjusterUseNewfangledHeadroomAdjustment', 66 349561566, 67 date(2025, 8, 26)), 68 FieldTrial('WebRTC-Bwe-LimitPacingFactorByUpperLinkCapacityEstimate', 69 42220543, 70 date(2025, 1, 1)), 71 FieldTrial('WebRTC-Bwe-ResetOnAdapterIdChange', 72 42225231, 73 date(2025, 5, 30)), 74 FieldTrial('WebRTC-DataChannelMessageInterleaving', 75 41481008, 76 date(2024, 10, 1)), 77 FieldTrial('WebRTC-Dav1dDecoder-CropToRenderResolution', 78 405341160, 79 date(2026, 3, 21)), 80 FieldTrial('WebRTC-DisableRtxRateLimiter', 81 42225500, 82 date(2024, 4, 1)), 83 FieldTrial('WebRTC-DisableSslGroupIds', 84 404763475, 85 date(2025,9,1)), 86 FieldTrial('WebRTC-ElasticBitrateAllocation', 87 350555527, 88 date(2025, 3, 1)), 89 FieldTrial('WebRTC-EncoderDataDumpDirectory', 90 296242528, 91 date(2024, 4, 1)), 92 FieldTrial('WebRTC-ForceDtls13', 93 383141571, 94 date(2024,9,1)), 95 FieldTrial('WebRTC-EnableDtlsPqc', 96 404763475, 97 date(2026,6,1)), 98 FieldTrial('WebRTC-HeaderExtensionNegotiateMemory', 99 439514253, 100 date(2026, 2, 18)), 101 FieldTrial('WebRTC-IPv6NetworkResolutionFixes', 102 42224598, 103 date(2024, 4, 1)), 104 FieldTrial('WebRTC-IncomingTimestampOnMarkerBitOnly', 105 42224805, 106 date(2024, 4, 1)), 107 FieldTrial('WebRTC-IncreaseIceCandidatePriorityHostSrflx', 108 42225331, 109 date(2024, 4, 1)), 110 FieldTrial('WebRTC-JitterEstimatorConfig', 111 42224404, 112 date(2024, 4, 1)), 113 FieldTrial('WebRTC-LibaomAv1Encoder-DropRepeatFramesOnEnhancementLayers', 114 445115234, 115 date(2026, 3, 19)), 116 FieldTrial('WebRTC-LibaomAv1Encoder-PostEncodeFrameDrop', 117 351644568, 118 date(2026, 1, 30)), 119 FieldTrial('WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings', 120 42226191, 121 date(2024, 9, 1)), 122 FieldTrial('WebRTC-MixedCodecSimulcast', 123 362277533, 124 date(2025, 9, 1)), 125 FieldTrial('WebRTC-NoSdpMangleUfrag', 126 375571816, 127 date(2025, 10, 11)), 128 FieldTrial('WebRTC-NoSdpMangleUfragRestrictedAddresses', 129 409713509, 130 date(2025, 10, 11)), 131 FieldTrial('WebRTC-NoSdpMangleReject', 132 40567530, 133 date(2026, 6, 1)), 134 FieldTrial('WebRTC-NoSdpMangleAllowForTesting', 135 40567530, 136 date(2026, 6, 1)), 137 FieldTrial('WebRTC-Pacer-FastRetransmissions', 138 40235589, 139 date(2024, 4, 1)), 140 FieldTrial('WebRTC-Pacer-KeyframeFlushing', 141 42221435, 142 date(2024, 4, 1)), 143 FieldTrial('WebRTC-PostFilterKillSwitch', 144 417439718, 145 date(2025, 9, 1)), 146 FieldTrial('WebRTC-QCM-Dynamic-AV1', 147 349860657, 148 date(2025, 7, 1)), 149 FieldTrial('WebRTC-QCM-Dynamic-VP8', 150 349860657, 151 date(2025, 7, 1)), 152 FieldTrial('WebRTC-QCM-Dynamic-VP9', 153 349860657, 154 date(2025, 7, 1)), 155 FieldTrial('WebRTC-QCM-Static-AV1', 156 349860657, 157 date(2025, 7, 1)), 158 FieldTrial('WebRTC-QCM-Static-VP8', 159 349860657, 160 date(2025, 7, 1)), 161 FieldTrial('WebRTC-QCM-Static-VP9', 162 349860657, 163 date(2025, 7, 1)), 164 FieldTrial('WebRTC-ReceiveBufferSize', 165 42225927, 166 date(2024, 4, 1)), 167 FieldTrial('WebRTC-RFC8888CongestionControlFeedback', 168 42225697, 169 date(2025, 1, 30)), 170 FieldTrial('WebRTC-RtcEventLogEncodeDependencyDescriptor', 171 42225280, 172 date(2024, 4, 1)), 173 FieldTrial('WebRTC-RtcEventLogEncodeNetEqSetMinimumDelayKillSwitch', 174 42225058, 175 date(2024, 4, 1)), 176 FieldTrial('WebRTC-Sctp-Snap', 177 426480601, 178 date(2026, 1, 1)), 179 FieldTrial('WebRTC-SimulcastEncoderAdapter-DropUnalignedResolution', 180 415329365, 181 date(2025, 11, 2)), 182 FieldTrial('WebRTC-SrtpRemoveReceiveStream', 183 42225949, 184 date(2024, 10, 1)), 185 FieldTrial('WebRTC-SwitchEncoderFollowCodecPreferenceOrder', 186 378566918, 187 date(2025, 5, 1)), 188 FieldTrial('WebRTC-SynchronousDestructors', 189 443588673, 190 date(2026, 7, 1)), 191 FieldTrial('WebRTC-PayloadTypesInTransport', 192 360058654, 193 date(2025, 9, 11)), 194 FieldTrial('WebRTC-TimestampExtrapolatorConfig', 195 424739326, 196 date(2026, 6, 30)), 197 FieldTrial('WebRTC-UseAbsCapTimeForG2gMetric', 198 401512883, 199 date(2025, 9, 10)), 200 FieldTrial('WebRTC-UseNtpTimeAbsoluteSendTime', 201 42226305, 202 date(2024, 9, 1)), 203 FieldTrial('WebRTC-VP8-MaxFrameInterval', 204 42225870, 205 date(2024, 4, 1)), 206 FieldTrial('WebRTC-VP9-SvcForSimulcast', 207 347737882, 208 date(2024, 10, 1)), 209 FieldTrial('WebRTC-Video-CalculatePsnr', 210 388070060, 211 date(2026, 1, 1)), 212 FieldTrial('WebRTC-Video-EnableRetransmitAllLayers', 213 42225262, 214 date(2024, 4, 1)), 215 FieldTrial('WebRTC-Video-EncoderFallbackSettings', 216 42231704, 217 date(2024, 4, 1)), 218 FieldTrial('WebRTC-VideoEncoderSettings', 219 40252667, 220 date(2024, 4, 1)), 221 FieldTrial('WebRTC-Video-H26xPacketBuffer', 222 41480904, 223 date(2024, 6, 1)), 224 FieldTrial('WebRTC-Video-Vp9FlexibleMode', 225 329396373, 226 date(2025, 6, 26)), 227 FieldTrial('WebRTC-IceHandshakeDtls', 228 367395350, 229 date(2026, 1, 1)), 230 FieldTrial('WebRTC-H265-QualityScaling', 231 402154973, 232 date(2026, 1, 1)), 233 FieldTrial('WebRTC-RTP-Lifetime', 234 440975167, 235 date(2026, 1, 1)), 236 # keep-sorted end 237 ]) # yapf: disable 238 239 NO_BUG = -1 240 INDEFINITE = date(datetime.MAXYEAR, 1, 1) 241 242 # These field trials precedes the policy in `g3doc/field-trials.md` and are 243 # therefore not required to follow it. Do not add any new field trials here. 244 # If you remove an entry you should also update 245 # POLICY_EXEMPT_FIELD_TRIALS_DIGEST. 246 POLICY_EXEMPT_FIELD_TRIALS: FrozenSet[FieldTrial] = frozenset([ 247 # keep-sorted start 248 FieldTrial('WebRTC-AddNetworkCostToVpn', 249 42223280, 250 date(2024, 4, 1)), 251 FieldTrial('WebRTC-AddPacingToCongestionWindowPushback', 252 42220204, 253 date(2024, 4, 1)), 254 FieldTrial('WebRTC-AdjustOpusBandwidth', 255 42233664, 256 date(2024, 4, 1)), 257 FieldTrial('WebRTC-Aec3AecStateFullResetKillSwitch', 258 42221578, 259 INDEFINITE), 260 FieldTrial('WebRTC-Aec3AecStateSubtractorAnalyzerResetKillSwitch', 261 42221578, 262 INDEFINITE), 263 FieldTrial('WebRTC-Aec3AntiHowlingMinimizationKillSwitch', 264 150764764, 265 INDEFINITE), 266 FieldTrial('WebRTC-Aec3ClampInstQualityToOneKillSwitch', 267 42220991, 268 INDEFINITE), 269 FieldTrial('WebRTC-Aec3ClampInstQualityToZeroKillSwitch', 270 42220991, 271 INDEFINITE), 272 FieldTrial('WebRTC-Aec3CoarseFilterResetHangoverKillSwitch', 273 42222401, 274 date(2024, 4, 1)), 275 FieldTrial('WebRTC-Aec3ConservativeTailFreqResponse', 276 42223361, 277 date(2024, 4, 1)), 278 FieldTrial('WebRTC-Aec3DeactivateInitialStateResetKillSwitch', 279 42221578, 280 date(2024, 4, 1)), 281 FieldTrial('WebRTC-Aec3DelayEstimateSmoothingDelayFoundOverride', 282 42222934, 283 date(2024, 4, 1)), 284 FieldTrial('WebRTC-Aec3DelayEstimateSmoothingOverride', 285 42222934, 286 date(2024, 4, 1)), 287 FieldTrial('WebRTC-Aec3EchoSaturationDetectionKillSwitch', 288 42221578, 289 INDEFINITE), 290 FieldTrial('WebRTC-Aec3EnforceCaptureDelayEstimationDownmixing', 291 42221238, 292 INDEFINITE), 293 FieldTrial( 294 'WebRTC-Aec3EnforceCaptureDelayEstimationLeftRightPrioritization', 295 42221238, 296 INDEFINITE), 297 FieldTrial('WebRTC-Aec3EnforceConservativeHfSuppression', 298 42222109, 299 date(2024, 4, 1)), 300 FieldTrial('WebRTC-Aec3EnforceLowActiveRenderLimit', 301 42221578, 302 INDEFINITE), 303 FieldTrial('WebRTC-Aec3EnforceMoreTransparentNearendSuppressorHfTuning', 304 42221589, 305 INDEFINITE), 306 FieldTrial('WebRTC-Aec3EnforceMoreTransparentNearendSuppressorTuning', 307 42221578, 308 INDEFINITE), 309 FieldTrial('WebRTC-Aec3EnforceMoreTransparentNormalSuppressorHfTuning', 310 42221589, 311 INDEFINITE), 312 FieldTrial('WebRTC-Aec3EnforceMoreTransparentNormalSuppressorTuning', 313 42221578, 314 INDEFINITE), 315 FieldTrial('WebRTC-Aec3EnforceRapidlyAdjustingNearendSuppressorTunings', 316 42221578, 317 INDEFINITE), 318 FieldTrial('WebRTC-Aec3EnforceRapidlyAdjustingNormalSuppressorTunings', 319 42221578, 320 INDEFINITE), 321 FieldTrial('WebRTC-Aec3EnforceRenderDelayEstimationDownmixing', 322 42221238, 323 INDEFINITE), 324 FieldTrial('WebRTC-Aec3EnforceSlowlyAdjustingNearendSuppressorTunings', 325 42221578, 326 INDEFINITE), 327 FieldTrial('WebRTC-Aec3EnforceSlowlyAdjustingNormalSuppressorTunings', 328 42221578, 329 INDEFINITE), 330 FieldTrial('WebRTC-Aec3EnforceStationarityProperties', 331 42221578, 332 INDEFINITE), 333 FieldTrial('WebRTC-Aec3EnforceStationarityPropertiesAtInit', 334 42221578, 335 INDEFINITE), 336 FieldTrial('WebRTC-Aec3EnforceVeryLowActiveRenderLimit', 337 42221578, 338 INDEFINITE), 339 FieldTrial('WebRTC-Aec3HighPassFilterEchoReference', 340 42222401, 341 date(2024, 4, 1)), 342 FieldTrial('WebRTC-Aec3MinErleDuringOnsetsKillSwitch', 343 42220385, 344 date(2024, 4, 1)), 345 FieldTrial('WebRTC-Aec3NonlinearModeReverbKillSwitch', 346 42222109, 347 date(2024, 4, 1)), 348 FieldTrial('WebRTC-Aec3OnsetDetectionKillSwitch', 349 42221578, 350 INDEFINITE), 351 FieldTrial( 352 'WebRTC-Aec3RenderDelayEstimationLeftRightPrioritizationKillSwitch', 353 42221238, 354 date(2024, 4, 1)), 355 FieldTrial('WebRTC-Aec3SensitiveDominantNearendActivation', 356 42221578, 357 INDEFINITE), 358 FieldTrial('WebRTC-Aec3SetupSpecificDefaultConfigDefaultsKillSwitch', 359 42221236, 360 INDEFINITE), 361 FieldTrial('WebRTC-Aec3ShortHeadroomKillSwitch', 362 42220385, 363 date(2024, 4, 1)), 364 FieldTrial('WebRTC-Aec3StereoContentDetectionKillSwitch', 365 42225201, 366 INDEFINITE), 367 FieldTrial('WebRTC-Aec3SuppressorAntiHowlingGainOverride', 368 42221589, 369 INDEFINITE), 370 FieldTrial('WebRTC-Aec3SuppressorDominantNearendEnrExitThresholdOverride', 371 42221589, 372 INDEFINITE), 373 FieldTrial('WebRTC-Aec3SuppressorDominantNearendEnrThresholdOverride', 374 42221589, 375 INDEFINITE), 376 FieldTrial('WebRTC-Aec3SuppressorDominantNearendHoldDurationOverride', 377 42221589, 378 INDEFINITE), 379 FieldTrial('WebRTC-Aec3SuppressorDominantNearendSnrThresholdOverride', 380 42221589, 381 INDEFINITE), 382 FieldTrial('WebRTC-Aec3SuppressorDominantNearendTriggerThresholdOverride', 383 42221589, 384 INDEFINITE), 385 FieldTrial('WebRTC-Aec3SuppressorNearendHfMaskSuppressOverride', 386 42221589, 387 INDEFINITE), 388 FieldTrial('WebRTC-Aec3SuppressorNearendHfMaskTransparentOverride', 389 42221589, 390 INDEFINITE), 391 FieldTrial('WebRTC-Aec3SuppressorNearendLfMaskSuppressOverride', 392 42221589, 393 INDEFINITE), 394 FieldTrial('WebRTC-Aec3SuppressorNearendLfMaskTransparentOverride', 395 42221589, 396 date(2024, 4, 1)), 397 FieldTrial('WebRTC-Aec3SuppressorNearendMaxDecFactorLfOverride', 398 42221589, 399 date(2024, 4, 1)), 400 FieldTrial('WebRTC-Aec3SuppressorNearendMaxIncFactorOverride', 401 42221589, 402 date(2024, 4, 1)), 403 FieldTrial('WebRTC-Aec3SuppressorNormalHfMaskSuppressOverride', 404 42221589, 405 date(2024, 4, 1)), 406 FieldTrial('WebRTC-Aec3SuppressorNormalHfMaskTransparentOverride', 407 42221589, 408 date(2024, 4, 1)), 409 FieldTrial('WebRTC-Aec3SuppressorNormalLfMaskSuppressOverride', 410 42221589, 411 date(2024, 4, 1)), 412 FieldTrial('WebRTC-Aec3SuppressorNormalLfMaskTransparentOverride', 413 42221589, 414 date(2024, 4, 1)), 415 FieldTrial('WebRTC-Aec3SuppressorNormalMaxDecFactorLfOverride', 416 42221589, 417 date(2024, 4, 1)), 418 FieldTrial('WebRTC-Aec3SuppressorNormalMaxIncFactorOverride', 419 42221589, 420 date(2024, 4, 1)), 421 FieldTrial('WebRTC-Aec3SuppressorTuningOverride', 422 42221589, 423 date(2024, 4, 1)), 424 FieldTrial('WebRTC-Aec3TransparentAntiHowlingGain', 425 42221578, 426 date(2024, 4, 1)), 427 FieldTrial('WebRTC-Aec3TransparentModeHmm', 428 42222401, 429 date(2024, 4, 1)), 430 FieldTrial('WebRTC-Aec3TransparentModeKillSwitch', 431 42234438, 432 date(2024, 4, 1)), 433 FieldTrial('WebRTC-Aec3Use1Dot2SecondsInitialStateDuration', 434 42221578, 435 date(2024, 4, 1)), 436 FieldTrial('WebRTC-Aec3Use1Dot6SecondsInitialStateDuration', 437 42221578, 438 date(2024, 4, 1)), 439 FieldTrial('WebRTC-Aec3Use2Dot0SecondsInitialStateDuration', 440 42221578, 441 date(2024, 4, 1)), 442 FieldTrial('WebRTC-Aec3UseDot1SecondsInitialStateDuration', 443 42221578, 444 date(2024, 4, 1)), 445 FieldTrial('WebRTC-Aec3UseDot2SecondsInitialStateDuration', 446 42221578, 447 date(2024, 4, 1)), 448 FieldTrial('WebRTC-Aec3UseDot3SecondsInitialStateDuration', 449 42221578, 450 date(2024, 4, 1)), 451 FieldTrial('WebRTC-Aec3UseDot6SecondsInitialStateDuration', 452 42221578, 453 date(2024, 4, 1)), 454 FieldTrial('WebRTC-Aec3UseDot9SecondsInitialStateDuration', 455 42221578, 456 date(2024, 4, 1)), 457 FieldTrial('WebRTC-Aec3UseErleOnsetCompensationInDominantNearend', 458 42222842, 459 date(2024, 4, 1)), 460 FieldTrial('WebRTC-Aec3UseLowEarlyReflectionsDefaultGain', 461 42221578, 462 date(2024, 4, 1)), 463 FieldTrial('WebRTC-Aec3UseLowLateReflectionsDefaultGain', 464 42221578, 465 date(2024, 4, 1)), 466 FieldTrial('WebRTC-Aec3UseNearendReverbLen', 467 42223329, 468 INDEFINITE), 469 FieldTrial('WebRTC-Aec3UseShortConfigChangeDuration', 470 42221578, 471 date(2024, 4, 1)), 472 FieldTrial('WebRTC-Aec3UseZeroInitialStateDuration', 473 42221578, 474 date(2024, 4, 1)), 475 FieldTrial('WebRTC-Aec3VerySensitiveDominantNearendActivation', 476 42221578, 477 date(2024, 4, 1)), 478 FieldTrial('WebRTC-Agc2SimdAvx2KillSwitch', 479 42232605, 480 date(2024, 4, 1)), 481 FieldTrial('WebRTC-Agc2SimdNeonKillSwitch', 482 42232605, 483 date(2024, 4, 1)), 484 FieldTrial('WebRTC-Agc2SimdSse2KillSwitch', 485 42232605, 486 date(2024, 4, 1)), 487 FieldTrial('WebRTC-AllowMACBasedIPv6', 488 41480878, 489 date(2024, 4, 1)), 490 FieldTrial('WebRTC-AlrDetectorParameters', 491 42220590, 492 INDEFINITE), 493 FieldTrial('WebRTC-AndroidNetworkMonitor-IsAdapterAvailable', 494 42223964, 495 date(2024, 4, 1)), 496 FieldTrial('WebRTC-ApmExperimentalMultiChannelCaptureKillSwitch', 497 42225202, 498 INDEFINITE), 499 FieldTrial('WebRTC-ApmExperimentalMultiChannelRenderKillSwitch', 500 42225203, 501 INDEFINITE), 502 FieldTrial('WebRTC-Audio-2ndAgcMinMicLevelExperiment', 503 40207112, 504 date(2024, 4, 1)), 505 FieldTrial('WebRTC-Audio-ABWENoTWCC', 506 42233370, 507 INDEFINITE), 508 FieldTrial('WebRTC-Audio-AdaptivePtime', 509 40694579, 510 date(2024, 4, 1)), 511 FieldTrial('WebRTC-Audio-Allocation', 512 42220324, 513 INDEFINITE), 514 FieldTrial('WebRTC-Audio-AlrProbing', 515 42220234, 516 date(2024, 4, 1)), 517 FieldTrial('WebRTC-Audio-LegacyOverhead', 518 42221084, 519 INDEFINITE), 520 FieldTrial('WebRTC-Audio-MinimizeResamplingOnMobile', 521 42231221, 522 date(2024, 4, 1)), 523 FieldTrial('WebRTC-Audio-NetEqDecisionLogicConfig', 524 42223518, 525 date(2024, 4, 1)), 526 FieldTrial('WebRTC-Audio-NetEqDelayManagerConfig', 527 42220376, 528 date(2024, 4, 1)), 529 FieldTrial('WebRTC-Audio-NetEqNackTrackerConfig', 530 42220211, 531 date(2024, 4, 1)), 532 FieldTrial('WebRTC-Audio-NetEqSmartFlushing', 533 42222334, 534 date(2024, 4, 1)), 535 FieldTrial('WebRTC-Audio-OpusBitrateMultipliers', 536 42221139, 537 date(2024, 4, 1)), 538 FieldTrial('WebRTC-Audio-Red-For-Opus', 539 42221750, 540 date(2024, 4, 1)), 541 FieldTrial('WebRTC-Audio-iOS-Holding', 542 42233253, 543 date(2024, 4, 1)), 544 FieldTrial('WebRTC-AudioDevicePlayoutBufferSizeFactor', 545 42221006, 546 date(2024, 4, 1)), 547 FieldTrial('WebRTC-BindUsingInterfaceName', 548 42220770, 549 date(2024, 4, 1)), 550 FieldTrial('WebRTC-Bwe-AllocationProbing', 551 42220440, 552 date(2024, 4, 1)), 553 FieldTrial('WebRTC-Bwe-AlrProbing', 554 42220440, 555 date(2024, 4, 1)), 556 FieldTrial('WebRTC-Bwe-EstimateBoundedIncrease', 557 42220543, 558 date(2024, 4, 1)), 559 FieldTrial('WebRTC-Bwe-ExponentialProbing', 560 42220440, 561 date(2024, 4, 1)), 562 FieldTrial('WebRTC-Bwe-IgnoreProbesLowerThanNetworkStateEstimate', 563 42220543, 564 date(2024, 4, 1)), 565 FieldTrial('WebRTC-Bwe-InitialProbing', 566 42220440, 567 date(2024, 4, 1)), 568 FieldTrial('WebRTC-Bwe-InjectedCongestionController', 569 'webrtc:8415', 570 INDEFINITE), 571 FieldTrial('WebRTC-Bwe-LimitProbesLowerThanThroughputEstimate', 572 42221601, 573 date(2024, 4, 1)), 574 FieldTrial('WebRTC-Bwe-LossBasedBweV2', 575 42222865, 576 date(2024, 4, 1)), 577 FieldTrial('WebRTC-Bwe-MaxRttLimit', 578 42234928, 579 INDEFINITE), 580 FieldTrial('WebRTC-Bwe-MinAllocAsLowerBound', 581 NO_BUG, 582 date(2024, 4, 1)), 583 FieldTrial('WebRTC-Bwe-NetworkRouteConstraints', 584 42221535, 585 date(2024, 4, 1)), 586 FieldTrial('WebRTC-Bwe-NoFeedbackReset', 587 42234928, 588 date(2024, 4, 1)), 589 FieldTrial('WebRTC-Bwe-ProbingBehavior', 590 42220440, 591 date(2024, 4, 1)), 592 FieldTrial('WebRTC-Bwe-ProbingConfiguration', 593 42220440, 594 date(2024, 4, 1)), 595 FieldTrial('WebRTC-Bwe-ReceiveTimeFix', 596 42234228, 597 date(2024, 4, 1)), 598 FieldTrial('WebRTC-Bwe-ReceiverLimitCapsOnly', 599 42222445, 600 date(2024, 4, 1)), 601 FieldTrial('WebRTC-Bwe-RobustThroughputEstimatorSettings', 602 42220312, 603 date(2024, 4, 1)), 604 FieldTrial('WebRTC-Bwe-SafeResetOnRouteChange', 605 42234928, 606 INDEFINITE), 607 FieldTrial('WebRTC-Bwe-SeparateAudioPackets', 608 42221011, 609 date(2024, 4, 1)), 610 FieldTrial('WebRTC-Bwe-TrendlineEstimatorSettings', 611 42221011, 612 date(2024, 4, 1)), 613 FieldTrial('WebRTC-BweBackOffFactor', 614 42233342, 615 INDEFINITE), 616 FieldTrial('WebRTC-BweLossExperiment', 617 42230863, 618 date(2024, 4, 1)), 619 FieldTrial('WebRTC-BweRapidRecoveryExperiment', 620 42233136, 621 date(2024, 4, 1)), 622 FieldTrial('WebRTC-BweThroughputWindowConfig', 623 42220312, 624 date(2024, 4, 1)), 625 FieldTrial('WebRTC-BweWindowSizeInPackets', 626 42233342, 627 INDEFINITE), 628 FieldTrial('WebRTC-CongestionWindow', 629 42225197, 630 INDEFINITE), 631 FieldTrial('WebRTC-CpuLoadEstimator', 632 42233645, 633 date(2024, 4, 1)), 634 FieldTrial('WebRTC-Debugging-RtpDump', 635 42220735, 636 INDEFINITE), 637 FieldTrial('WebRTC-DecoderDataDumpDirectory', 638 42224491, 639 INDEFINITE), 640 FieldTrial('WebRTC-DefaultBitrateLimitsKillSwitch', 641 NO_BUG, 642 date(2024, 4, 1)), 643 FieldTrial('WebRTC-DependencyDescriptorAdvertised', 644 42220386, 645 date(2024, 4, 1)), 646 FieldTrial('WebRTC-DisableUlpFecExperiment', 647 NO_BUG, 648 date(2024, 4, 1)), 649 FieldTrial('WebRTC-DontIncreaseDelayBasedBweInAlr', 650 42220590, 651 date(2024, 4, 1)), 652 FieldTrial('WebRTC-DscpFieldTrial', 653 42223835, 654 date(2024, 4, 1)), 655 FieldTrial('WebRTC-ExtraICEPing', 656 42220311, 657 date(2024, 4, 1)), 658 FieldTrial('WebRTC-FakeNetworkReceiveConfig', 659 42224493, 660 INDEFINITE), 661 FieldTrial('WebRTC-FakeNetworkSendConfig', 662 42224493, 663 INDEFINITE), 664 FieldTrial('WebRTC-FilterAbsSendTimeExtension', 665 42220271, 666 INDEFINITE), 667 FieldTrial('WebRTC-FindNetworkHandleWithoutIpv6TemporaryPart', 668 42221149, 669 date(2024, 4, 1)), 670 FieldTrial('WebRTC-FlexFEC-03', 671 42230680, 672 date(2024, 4, 1)), 673 FieldTrial('WebRTC-FlexFEC-03-Advertised', 674 42230680, 675 date(2024, 4, 1)), 676 FieldTrial('WebRTC-ForcePlayoutDelay', 677 42222016, 678 INDEFINITE), 679 FieldTrial('WebRTC-ForceSendPlayoutDelay', 680 42222016, 681 INDEFINITE), 682 FieldTrial('WebRTC-ForceSimulatedOveruseIntervalMs', 683 42224494, 684 INDEFINITE), 685 FieldTrial('WebRTC-FrameDropper', 686 42234921, 687 INDEFINITE), 688 FieldTrial('WebRTC-FullBandHpfKillSwitch', 689 42221279, 690 date(2024, 4, 1)), 691 FieldTrial('WebRTC-GenericCodecDependencyDescriptor', 692 42225273, 693 INDEFINITE), 694 FieldTrial('WebRTC-GenericDescriptorAdvertised', 695 42234553, 696 INDEFINITE), 697 FieldTrial('WebRTC-GenericDescriptorAuth', 698 42220132, 699 INDEFINITE), 700 FieldTrial('WebRTC-GenericPictureId', 701 42234553, 702 INDEFINITE), 703 FieldTrial('WebRTC-GetEncoderInfoOverride', 704 NO_BUG, 705 date(2024, 4, 1)), 706 FieldTrial('WebRTC-H264HighProfile', 707 41481030, 708 date(2024, 4, 1)), 709 FieldTrial('WebRTC-IPv6Default', 710 NO_BUG, # chromium:413437 711 date(2024, 4, 1)), 712 FieldTrial('WebRTC-IceControllerFieldTrials', 713 40658968, 714 INDEFINITE), 715 FieldTrial('WebRTC-IceFieldTrials', 716 42221103, 717 INDEFINITE), 718 FieldTrial('WebRTC-KeyframeInterval', 719 42220470, 720 INDEFINITE), 721 FieldTrial('WebRTC-LegacyFrameIdJumpBehavior', 722 42223541, 723 date(2024, 4, 1)), 724 FieldTrial('WebRTC-LegacySimulcastLayerLimit', 725 42233936, 726 INDEFINITE), 727 FieldTrial('WebRTC-LowresSimulcastBitrateInterpolation', 728 42222558, 729 date(2024, 4, 1)), 730 FieldTrial('WebRTC-MutedStateKillSwitch', 731 177830919, 732 date(2024, 4, 1)), 733 FieldTrial('WebRTC-Network-UseNWPathMonitor', 734 42221045, 735 date(2024, 4, 1)), 736 FieldTrial('WebRTC-NetworkMonitorAutoDetect', 737 42223964, 738 date(2024, 4, 1)), 739 FieldTrial('WebRTC-NormalizeSimulcastResolution', 740 NO_BUG, 741 INDEFINITE), 742 FieldTrial('WebRTC-Pacer-BlockAudio', 743 42233548, 744 INDEFINITE), 745 FieldTrial('WebRTC-Pacer-DrainQueue', 746 42233548, 747 date(2024, 4, 1)), 748 FieldTrial('WebRTC-Pacer-IgnoreTransportOverhead', 749 42235102, 750 INDEFINITE), 751 FieldTrial('WebRTC-Pacer-PadInSilence', 752 42233548, 753 date(2024, 4, 1)), 754 FieldTrial('WebRTC-PacketBufferMaxSize', 755 42235070, 756 INDEFINITE), 757 FieldTrial('WebRTC-PcFactoryDefaultBitrates', 758 42220941, 759 date(2024, 4, 1)), 760 FieldTrial('WebRTC-PiggybackIceCheckAcknowledgement', 761 NO_BUG, 762 date(2024, 4, 1)), 763 FieldTrial('WebRTC-PixelLimitResource', 764 42222397, 765 INDEFINITE), 766 FieldTrial('WebRTC-ProbingScreenshareBwe', 767 42232804, 768 date(2024, 4, 1)), 769 FieldTrial('WebRTC-ProtectionOverheadRateThreshold', 770 42225198, 771 INDEFINITE), 772 FieldTrial('WebRTC-QpParsingKillSwitch', 773 42222690, 774 date(2024, 4, 1)), 775 FieldTrial('WebRTC-RtcEventLogKillSwitch', 776 42222210, 777 INDEFINITE), 778 FieldTrial('WebRTC-RtcEventLogNewFormat', 779 42233237, 780 date(2024, 4, 1)), 781 FieldTrial('WebRTC-RtcpLossNotification', 782 42220379, 783 date(2024, 4, 1)), 784 FieldTrial('WebRTC-SendBufferSizeBytes', 785 42222026, 786 date(2024, 4, 1)), 787 FieldTrial('WebRTC-SendNackDelayMs', 788 42235176, 789 date(2024, 4, 1)), 790 FieldTrial('WebRTC-SetSocketReceiveBuffer', 791 42223976, 792 date(2024, 4, 1)), 793 FieldTrial('WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride', 794 NO_BUG, 795 date(2024, 4, 1)), 796 FieldTrial('WebRTC-SimulcastLayerLimitRoundUp', 797 NO_BUG, 798 date(2024, 4, 1)), 799 FieldTrial('WebRTC-SpsPpsIdrIsH264Keyframe', 800 42233557, 801 INDEFINITE), 802 FieldTrial('WebRTC-StrictPacingAndProbing', 803 42233198, 804 date(2024, 4, 1)), 805 FieldTrial('WebRTC-StunInterPacketDelay', 806 NO_BUG, 807 date(2024, 4, 1)), 808 FieldTrial('WebRTC-SurfaceCellularTypes', 809 42221576, 810 date(2024, 4, 1)), 811 FieldTrial('WebRTC-SwitchEncoderOnInitializationFailures', 812 42223783, 813 date(2024, 4, 1)), 814 FieldTrial('WebRTC-Target-Bitrate-Rtcp', 815 42235192, 816 INDEFINITE), 817 FieldTrial('WebRTC-TransientSuppressorForcedOff', 818 40172597, 819 INDEFINITE), 820 FieldTrial('WebRTC-UseBaseHeavyVP8TL3RateAllocation', 821 42234670, 822 date(2024, 4, 1)), 823 FieldTrial('WebRTC-UseDifferentiatedCellularCosts', 824 42221576, 825 date(2024, 4, 1)), 826 FieldTrial('WebRTC-UseStandardBytesStats', 827 42220573, 828 date(2024, 4, 1)), 829 FieldTrial('WebRTC-UseTurnServerAsStunServer', 830 42221142, 831 date(2024, 4, 1)), 832 FieldTrial('WebRTC-VP8-ForcePartitionResilience', 833 42221952, 834 INDEFINITE), 835 FieldTrial('WebRTC-VP8-Forced-Fallback-Encoder-v2', 836 42231704, 837 INDEFINITE), 838 FieldTrial('WebRTC-VP8-GetEncoderInfoOverride', 839 42221952, 840 INDEFINITE), 841 FieldTrial('WebRTC-VP8-Postproc-Config', 842 42221657, 843 date(2024, 4, 1)), 844 FieldTrial('WebRTC-VP8-Postproc-Config-Arm', 845 42231704, 846 INDEFINITE), 847 FieldTrial('WebRTC-VP8IosMaxNumberOfThread', 848 42220027, 849 date(2024, 4, 1)), 850 FieldTrial('WebRTC-VP9-GetEncoderInfoOverride', 851 NO_BUG, 852 date(2024, 4, 1)), 853 FieldTrial('WebRTC-VP9-LowTierOptimizations', 854 42224122, 855 date(2024, 4, 1)), 856 FieldTrial('WebRTC-VP9-PerformanceFlags', 857 42221657, 858 date(2024, 4, 1)), 859 FieldTrial('WebRTC-VP9QualityScaler', 860 42221411, 861 date(2024, 4, 1)), 862 FieldTrial('WebRTC-Video-BalancedDegradation', 863 42232717, 864 INDEFINITE), 865 FieldTrial('WebRTC-Video-BalancedDegradationSettings', 866 NO_BUG, 867 INDEFINITE), 868 FieldTrial('WebRTC-Video-DisableAutomaticResize', 869 42221931, 870 date(2024, 4, 1)), 871 FieldTrial('WebRTC-Video-DiscardPacketsWithUnknownSsrc', 872 42235091, 873 INDEFINITE), 874 FieldTrial('WebRTC-Video-ForcedSwDecoderFallback', 875 NO_BUG, 876 INDEFINITE), 877 FieldTrial('WebRTC-Video-InitialDecoderResolution', 878 42222018, 879 date(2024, 4, 1)), 880 FieldTrial('WebRTC-Video-MinVideoBitrate', 881 42220993, 882 date(2024, 4, 1)), 883 FieldTrial('WebRTC-Video-Pacing', 884 42220062, 885 date(2024, 4, 1)), 886 FieldTrial('WebRTC-Video-PreferTemporalSupportOnBaseLayer', 887 42221417, 888 INDEFINITE), 889 FieldTrial('WebRTC-Video-QualityScalerSettings', 890 NO_BUG, 891 INDEFINITE), 892 FieldTrial('WebRTC-Video-QualityScaling', 893 42234348, 894 INDEFINITE), 895 FieldTrial('WebRTC-Video-UseFrameRateForOverhead', 896 166341943, 897 date(2024, 4, 1)), 898 FieldTrial('WebRTC-VideoFrameTrackingIdAdvertised', 899 42222747, 900 INDEFINITE), 901 FieldTrial('WebRTC-VideoLayersAllocationAdvertised', 902 42222126, 903 INDEFINITE), 904 FieldTrial('WebRTC-VideoRateControl', 905 42220259, 906 INDEFINITE), 907 FieldTrial('WebRTC-Vp9InterLayerPred', 908 NO_BUG, # chromium:949536 909 INDEFINITE), 910 FieldTrial('WebRTC-Vp9IssueKeyFrameOnLayerDeactivation', 911 40595338, 912 date(2024, 4, 1)), 913 FieldTrial('WebRTC-ZeroPlayoutDelay', 914 40228487, 915 date(2024, 4, 1)), 916 # keep-sorted end 917 ]) # yapf: disable 918 919 POLICY_EXEMPT_FIELD_TRIALS_DIGEST: str = \ 920 '625f8d689ab8bcfe4118347c6f8c852e3ac372c7' 921 922 REGISTERED_FIELD_TRIALS: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS.union( 923 POLICY_EXEMPT_FIELD_TRIALS) 924 925 926 def todays_date() -> date: 927 now = datetime.datetime.now(datetime.timezone.utc) 928 return date(now.year, now.month, now.day) 929 930 931 def registry_header( 932 field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS) -> str: 933 """Generates a C++ header with all field trial keys. 934 935 Args: 936 field_trials: Field trials to include in the header. 937 938 Returns: 939 String representation of a C++ header file containing all field trial 940 keys. 941 942 >>> trials = { 943 ... FieldTrial('B', '', date(1, 1, 1)), 944 ... FieldTrial('A', '', date(1, 1, 1)), 945 ... FieldTrial('B', '', date(2, 2, 2)), 946 ... } 947 >>> print(registry_header(trials)) 948 // This file was automatically generated. Do not edit. 949 <BLANKLINE> 950 #ifndef GEN_REGISTERED_FIELD_TRIALS_H_ 951 #define GEN_REGISTERED_FIELD_TRIALS_H_ 952 <BLANKLINE> 953 #include "absl/strings/string_view.h" 954 <BLANKLINE> 955 namespace webrtc { 956 <BLANKLINE> 957 inline constexpr absl::string_view kRegisteredFieldTrials[] = { 958 "A", 959 "B", 960 }; 961 <BLANKLINE> 962 } // namespace webrtc 963 <BLANKLINE> 964 #endif // GEN_REGISTERED_FIELD_TRIALS_H_ 965 <BLANKLINE> 966 """ 967 registered_keys = {f.key for f in field_trials} 968 keys = '\n'.join(f' "{k}",' for k in sorted(registered_keys)) 969 return ('// This file was automatically generated. Do not edit.\n' 970 '\n' 971 '#ifndef GEN_REGISTERED_FIELD_TRIALS_H_\n' 972 '#define GEN_REGISTERED_FIELD_TRIALS_H_\n' 973 '\n' 974 '#include "absl/strings/string_view.h"\n' 975 '\n' 976 'namespace webrtc {\n' 977 '\n' 978 'inline constexpr absl::string_view kRegisteredFieldTrials[] = {\n' 979 f'{keys}\n' 980 '};\n' 981 '\n' 982 '} // namespace webrtc\n' 983 '\n' 984 '#endif // GEN_REGISTERED_FIELD_TRIALS_H_\n') 985 986 987 def expired_field_trials( 988 threshold: date, 989 field_trials: FrozenSet[FieldTrial] = REGISTERED_FIELD_TRIALS 990 ) -> Set[FieldTrial]: 991 """Obtains expired field trials. 992 993 Args: 994 threshold: Date from which to check end date. 995 field_trials: Field trials to validate. 996 997 Returns: 998 All expired field trials. 999 1000 >>> trials = { 1001 ... FieldTrial('Expired', '', date(1, 1, 1)), 1002 ... FieldTrial('Not-Expired', '', date(1, 1, 2)), 1003 ... } 1004 >>> expired_field_trials(date(1, 1, 1), trials) 1005 {FieldTrial(key='Expired', bug='', end_date=datetime.date(1, 1, 1))} 1006 """ 1007 return {f for f in field_trials if f.end_date <= threshold} 1008 1009 1010 def validate_field_trials( 1011 field_trials: FrozenSet[FieldTrial] = ACTIVE_FIELD_TRIALS 1012 ) -> List[str]: 1013 """Validate that field trials conforms to the policy. 1014 1015 Args: 1016 field_trials: Field trials to validate. 1017 1018 Returns: 1019 A list of explanations for invalid field trials. 1020 """ 1021 invalid = [] 1022 1023 sha1 = hashlib.sha1() 1024 for trial in sorted(POLICY_EXEMPT_FIELD_TRIALS, key=lambda f: f.key): 1025 sha1.update(trial.key.encode('ascii')) 1026 if sha1.hexdigest() != POLICY_EXEMPT_FIELD_TRIALS_DIGEST: 1027 invalid.append( 1028 'POLICY_EXEMPT_FIELD_TRIALS has been modified. Please note that ' 1029 'you must not add any new entries there. If you removed an entry ' 1030 'you should also update POLICY_EXEMPT_FIELD_TRIALS_DIGEST. The ' 1031 f'new digest is "{sha1.hexdigest()}".') 1032 1033 for trial in field_trials: 1034 if not trial.key.startswith('WebRTC-'): 1035 invalid.append(f'{trial.key} does not start with "WebRTC-".') 1036 if trial.bug_id <= 0: 1037 invalid.append(f'{trial.key} must have an associated bug.') 1038 if trial.end_date >= INDEFINITE: 1039 invalid.append(f'{trial.key} must have an end date.') 1040 1041 return invalid 1042 1043 1044 def cmd_header(args: argparse.Namespace) -> None: 1045 if not args.no_validation: 1046 if errors := validate_field_trials(): 1047 print('\n'.join(sorted(errors))) 1048 sys.exit(1) 1049 1050 args.output.write(registry_header()) 1051 1052 1053 def cmd_expired(args: argparse.Namespace) -> None: 1054 today = todays_date() 1055 diff = datetime.timedelta(days=args.in_days) 1056 expired = expired_field_trials( 1057 today + diff, 1058 ACTIVE_FIELD_TRIALS if args.no_exempt else REGISTERED_FIELD_TRIALS) 1059 1060 if len(expired) <= 0: 1061 return 1062 1063 expired_by_date = sorted(expired, key=lambda f: (f.end_date, f.key)) 1064 print('\n'.join( 1065 f'{f.key} ' 1066 f'{f"<{f.bug_url()}> " if f.bug_url() else ""}' 1067 f'{"expired" if f.end_date <= today else "expires"} on {f.end_date}' 1068 for f in expired_by_date)) 1069 if any(f.end_date <= today for f in expired_by_date): 1070 sys.exit(1) 1071 1072 1073 def cmd_validate(args: argparse.Namespace) -> None: 1074 del args 1075 invalid = validate_field_trials() 1076 1077 if len(invalid) <= 0: 1078 return 1079 1080 print('\n'.join(sorted(invalid))) 1081 sys.exit(1) 1082 1083 1084 def main() -> None: 1085 parser = argparse.ArgumentParser() 1086 subcommand = parser.add_subparsers(dest='cmd') 1087 1088 parser_header = subcommand.add_parser( 1089 'header', 1090 help='generate C++ header file containing registered field trial keys') 1091 parser_header.add_argument('--output', 1092 default=sys.stdout, 1093 type=argparse.FileType('w'), 1094 required=False, 1095 help='output file') 1096 parser_header.add_argument( 1097 '--no-validation', 1098 default=False, 1099 action='store_true', 1100 required=False, 1101 help='whether to validate the field trials before writing') 1102 parser_header.set_defaults(cmd=cmd_header) 1103 1104 parser_expired = subcommand.add_parser( 1105 'expired', 1106 help='lists all expired field trials', 1107 description=''' 1108 Lists all expired field trials. Exits with a non-zero exit status if 1109 any field trials has expired, ignoring the --in-days argument. 1110 ''') 1111 parser_expired.add_argument( 1112 '--no-exempt', 1113 default=False, 1114 action='store_true', 1115 required=False, 1116 help='whether to include policy exempt field trials') 1117 parser_expired.add_argument( 1118 '--in-days', 1119 default=0, 1120 type=int, 1121 required=False, 1122 help='number of days relative to today to check') 1123 parser_expired.set_defaults(cmd=cmd_expired) 1124 1125 parser_validate = subcommand.add_parser( 1126 'validate', 1127 help='validates that all field trials conforms to the policy.', 1128 description=''' 1129 Validates that all field trials conforms to the policy. Exits with a 1130 non-zero exit status if any field trials does not. 1131 ''') 1132 parser_validate.set_defaults(cmd=cmd_validate) 1133 1134 args = parser.parse_args() 1135 1136 if not args.cmd: 1137 parser.print_help(sys.stderr) 1138 sys.exit(1) 1139 1140 args.cmd(args) 1141 1142 1143 if __name__ == '__main__': 1144 main()