)]}'
{
  "commit": "85b4247024c3cc83b9cd06d7be2f53e66917a30d",
  "tree": "eb59e72571291b420520f52c2cfa0e6d746a01a8",
  "parents": [
    "6d243c3c238d5e18b9a57a9417b5b0ad70fbd43f"
  ],
  "author": {
    "name": "Erik Språng",
    "email": "sprang@webrtc.org",
    "time": "Wed Sep 30 12:03:17 2026"
  },
  "committer": {
    "name": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Tue Oct 06 15:59:51 2026"
  },
  "message": "Generalize TemporalLayerRateTracker into CbrLayerRateTracker.\n\nThe tracker now covers spatial as well as temporal layers and produces\nan encoder agnostic CumulativeCbrAllocation: per spatial layer bitrates\nthat are cumulative over the temporal layers, together with the temporal\nlayer frame rate factors. Encoder wrappers only translate it to their\nown types and decide themselves when to apply it.\n\n- The tracker is fed once per temporal unit with the FrameEncodeSettings passed to Encode, instead of once per frame. Temporal unit boundaries are therefore known rather than guessed from the spatial ids.\n- Spatial layers without a frame in a temporal unit keep their last   bitrate. Some rate controllers otherwise set the bitrate to zero,  disabling the layer with unintended side effects.\n- The priming after a keyframe now applies to all spatial layers of the temporal unit that follows it, not only to single spatial layer   streams.\n- The libaom wrapper only hands the encoder config and the SVC parameters to libaom when they differ from what was last applied. Both paths recompute the per layer rate control state from the frame rate of the most recently encoded frame, and reset the buffer of any layer whose per frame budget then appears to have changed by more than a factor of two. With spatial layers running at different frame rates this reset the lower layers before each of their frames, which made them overshoot their targets severalfold.\n\nBug: webrtc:496266459\nChange-Id: I260b348328ce9dfc2595a080b719e20b37b6890d\nReviewed-on: https://webrtc-review.googlesource.com/c/src/+/506562\nReviewed-by: Sergey Silkin \u003cssilkin@webrtc.org\u003e\nCommit-Queue: Erik Språng \u003csprang@webrtc.org\u003e\nCr-Commit-Position: refs/heads/main@{#48812}\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d8790cf3f799ea075607a92653fde0ae8245f46b",
      "old_mode": 33188,
      "old_path": "modules/video_coding/BUILD.gn",
      "new_id": "632752933a5609183aa7bf1e9a145e0a0268a268",
      "new_mode": 33188,
      "new_path": "modules/video_coding/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "b28e7294f36d2cd2f00c5670d1aa1e6cbbe72b23",
      "old_mode": 33188,
      "old_path": "modules/video_coding/codecs/av1/libaom_av1_encoder_v2.cc",
      "new_id": "e9931da9be1a1e9aa9fe263fbe2734eb526dc176",
      "new_mode": 33188,
      "new_path": "modules/video_coding/codecs/av1/libaom_av1_encoder_v2.cc"
    },
    {
      "type": "modify",
      "old_id": "b94f08a75c3e1330c74c8932443ce6cea9359d66",
      "old_mode": 33188,
      "old_path": "modules/video_coding/codecs/av1/libaom_av1_encoder_v2.h",
      "new_id": "e44d8788d3914c40265d41b27bc8d31adc8795e3",
      "new_mode": 33188,
      "new_path": "modules/video_coding/codecs/av1/libaom_av1_encoder_v2.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1a3f8f846d3230a6cd7affd14ec2dd81bb74357b",
      "new_mode": 33188,
      "new_path": "modules/video_coding/utility/cbr_layer_rate_tracker.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "51cf0dcf485db41a1bdc2c35dd164d974896509f",
      "new_mode": 33188,
      "new_path": "modules/video_coding/utility/cbr_layer_rate_tracker.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e4582b35288e61a532c5b42e83f6577e9b2ccd21",
      "new_mode": 33188,
      "new_path": "modules/video_coding/utility/cbr_layer_rate_tracker_unittest.cc"
    },
    {
      "type": "delete",
      "old_id": "4316f1131bddd87d5738038269f75411be42c842",
      "old_mode": 33188,
      "old_path": "modules/video_coding/utility/temporal_layer_rate_tracker.cc",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "9d029a3c105e55e8c3fca899bf359d671266bb01",
      "old_mode": 33188,
      "old_path": "modules/video_coding/utility/temporal_layer_rate_tracker.h",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "f97d597c199ec1c0072f751a9840777e520793c4",
      "old_mode": 33188,
      "old_path": "modules/video_coding/utility/temporal_layer_rate_tracker_unittest.cc",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    }
  ]
}
