)]}'
{
  "commit": "9017801a374d091654f75f360182b00d5565e24f",
  "tree": "f4c353d7fdf447d44c4d3449806816c849e3884e",
  "parents": [
    "777159a37aea750db75ad49ec294a434b7c292fc"
  ],
  "author": {
    "name": "kwasniow",
    "email": "kwasniow@cisco.com",
    "time": "Thu May 28 08:02:10 2026"
  },
  "committer": {
    "name": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "webrtc-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Sun May 31 08:54:56 2026"
  },
  "message": "Add SFrame packet buffer for RTP-level frame assembly\n\nThis CL adds the foundational components for SFrame receive-side support\nin WebRTC, as specified in draft-ietf-avtcore-rtp-sframe. These\ncomponents sit upstream of the existing PacketBuffer and handle\nSFrame-specific parsing and frame boundary validation before packets\nenter the standard video receive pipeline.\n\nThree new components, with BUILD.gn targets and unit tests:\n\nSFrameDescriptor -- header-only struct representing the 1-byte SFrame\n  payload descriptor (S/E/T bits: start-of-frame, end-of-frame,\n  per-packet vs per-frame mode).\n\nSframeRtpPacketReceived -- lightweight wrapper pairing an\n  RtpPacketReceived with its parsed SFrameDescriptor, so downstream code\n  can inspect S/E/T bits without re-parsing.\n\nSFramePacketBuffer -- circular buffer that collects SFrame RTP packets\n  and validates complete S-\u003eE runs (contiguous start-to-end sequences)\n  before releasing them for decryption and depacketization.  Follows the\n  same circular-buffer pattern as the existing PacketBuffer: starts at 96\n  slots, doubles up to 2048, validates frame consistency (T-bit, payload\n  type, timestamp), and supports ClearTo for window management.\n\nWhy this is needed\n\nSFrame (draft-ietf-avtcore-rtp-sframe) adds a 1-byte payload descriptor\nto each RTP packet indicating frame boundaries and encryption mode.\nBefore SFrame packets can enter the existing codec depacketizer\npipeline, we need to:\n\n1. Parse and strip the SFrame descriptor byte\n  2. Collect packets into complete frames (S-\u003eE runs) at the RTP level\n  3. Branch on the T-bit to determine whether decryption is per-packet\n     (T\u003d1) or per-frame (T\u003d0)\n\nThe existing PacketBuffer operates on codec-depacketized payloads and\ncannot perform this pre-processing. A separate buffer layer is required.\n\nMore on architecture plan:\nhttps://github.com/webex/webrtc-sframe/tree/sframe-receive-pipeline\n\nBug: webrtc:479862368\nChange-Id: I40c076739a7e237eae344a6a3282948c53d5420b\nReviewed-on: https://webrtc-review.googlesource.com/c/src/+/466920\nReviewed-by: Philip Eliasson \u003cphilipel@webrtc.org\u003e\nReviewed-by: Harald Alvestrand \u003chta@webrtc.org\u003e\nCommit-Queue: Harald Alvestrand \u003chta@webrtc.org\u003e\nCr-Commit-Position: refs/heads/main@{#47856}\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d0332fe30c63ba78b963f272c21246fb04c2446d",
      "old_mode": 33188,
      "old_path": "modules/rtp_rtcp/BUILD.gn",
      "new_id": "75bc1b77ce1010a808d07ae2caac379f718aee6a",
      "new_mode": 33188,
      "new_path": "modules/rtp_rtcp/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "17ee4b941b9ce0f41bf54fac0aea81f625accb3d",
      "new_mode": 33188,
      "new_path": "modules/rtp_rtcp/source/sframe_descriptor.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0d070f9cd8fe62f288d8550b1b2a7eb3ffc9d98a",
      "new_mode": 33188,
      "new_path": "modules/rtp_rtcp/source/sframe_rtp_packet_received.h"
    },
    {
      "type": "modify",
      "old_id": "705b8f0eb217f6f1a24b2cd8c2c33ec7ef8b0dd2",
      "old_mode": 33188,
      "old_path": "modules/video_coding/BUILD.gn",
      "new_id": "e61afe7718c754b609d98a38ed1838a101fa6784",
      "new_mode": 33188,
      "new_path": "modules/video_coding/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bdf39d20bdd7245a1832c2f6315dda116e106b6e",
      "new_mode": 33188,
      "new_path": "modules/video_coding/sframe_packet_buffer.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d20397f6e6bb729bda290cd1e6f92601e10eb663",
      "new_mode": 33188,
      "new_path": "modules/video_coding/sframe_packet_buffer.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "14254c129804cdc667a0e46fb7f1e3a44c9f1409",
      "new_mode": 33188,
      "new_path": "modules/video_coding/sframe_packet_buffer_unittest.cc"
    }
  ]
}
