)]}'
{
  "commit": "82dd1ebf2efeeb8d5943c080a061fa100a06f5de",
  "tree": "e2d0f5898cb7e1b496bc6b215a71466c938d6817",
  "parents": [
    "9be5c73ad9cd1eb2df04d6f931b4cb1e0c6e5395"
  ],
  "author": {
    "name": "Sergey Silkin",
    "email": "ssilkin@webrtc.org",
    "time": "Sun Oct 18 17:55:46 2026"
  },
  "committer": {
    "name": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Mon Oct 19 13:38:17 2026"
  },
  "message": "Update quality convergence only on base temporal layer frames.\n\nWhen temporal layering is used, VideoStreamEncoder::OnEncodedImage()\npasses the QP of every encoded frame (T0, T1, T2) to\nQualityConvergenceController::AddSampleAndCheckTargetQuality() and\nFrameCadenceAdapterInterface::UpdateLayerQualityConvergence() [1].\nNon-reference T\u003e0 frames do not update the T0 reference buffer, so a T\u003e0\nframe reaching static_qp_threshold [2] prematurely halts ZeroHertz\nconvergence repeats before the T0 reference buffer converges, and\ninterleaving T0 and T\u003e0 QPs skews the 12-sample dynamic QP window [3].\n\nGate quality convergence updates in VideoStreamEncoder::OnEncodedImage()\non TemporalIndex().value_or(0) \u003d\u003d 0. Guard this by the\nenabled-by-default WebRTC-QCM-IgnoreEnhancementTemporalLayers\nkill-switch.\n\n[1]\nhttps://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/video_stream_encoder.cc;l\u003d2317-2325\n[2]\nhttps://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/quality_convergence_monitor.cc;l\u003d146-150\n[3]\nhttps://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/video/quality_convergence_monitor.cc;l\u003d166-193\n\nBug: chromium:328598314\nChange-Id: I383b5e2aa69463513e474861151788681e7a6ff5\nReviewed-on: https://webrtc-review.googlesource.com/c/src/+/509742\nReviewed-by: Johannes Kron \u003ckron@webrtc.org\u003e\nCommit-Queue: Sergey Silkin \u003cssilkin@webrtc.org\u003e\nCr-Commit-Position: refs/heads/main@{#48970}\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "78aa790cbea5819a48c91ce1600bfbcadab194df",
      "old_mode": 33261,
      "old_path": "experiments/field_trials.py",
      "new_id": "505de0567b7cef735a6e131c18308e97b8fc8c7e",
      "new_mode": 33261,
      "new_path": "experiments/field_trials.py"
    },
    {
      "type": "modify",
      "old_id": "e87187f6cd077921a428b3f802beed4302c4fee4",
      "old_mode": 33188,
      "old_path": "video/video_stream_encoder.cc",
      "new_id": "0841b1e57753c19d8cee0a214580e72842dfddf2",
      "new_mode": 33188,
      "new_path": "video/video_stream_encoder.cc"
    },
    {
      "type": "modify",
      "old_id": "682fd23b6cf52c64ebd9a9230503de3d5f56f3e7",
      "old_mode": 33188,
      "old_path": "video/video_stream_encoder.h",
      "new_id": "886556787f11f8d01f152070929ac992c4e13629",
      "new_mode": 33188,
      "new_path": "video/video_stream_encoder.h"
    },
    {
      "type": "modify",
      "old_id": "97cf24e499f23eaf4cf063dfa4517cee8c98d410",
      "old_mode": 33188,
      "old_path": "video/video_stream_encoder_unittest.cc",
      "new_id": "c0d4de563b8e01153876f2aa0f5dd8a0ce2b8c2a",
      "new_mode": 33188,
      "new_path": "video/video_stream_encoder_unittest.cc"
    }
  ]
}
