)]}'
{
  "commit": "c39fa349a58e134f3b2e4a6c890dbd7ac2089b76",
  "tree": "ce40cef65a19821d6a27c7f0db05d5de61b5fa25",
  "parents": [
    "f1c97c11010cc72228af715cdd4615a7c37d4089"
  ],
  "author": {
    "name": "Eusden Lin",
    "email": "eusdenlin@google.com",
    "time": "Thu Jun 11 20:55:36 2026"
  },
  "committer": {
    "name": "openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "openscreen-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Fri Jun 12 13:23:46 2026"
  },
  "message": "[Cast Streaming] Add Python bindings and dynamic mirroring negotiation\n\nThis change introduces a standalone Python native extension\n(`openscreen_sender`) to enable cross-platform automation and validation\nof Cast Streaming sessions,\nKey architectural changes and features:\n- Refactors `standalone_sender/BUILD.gn`:\n  decouple `cast_sender_core` from the standalone executable binary,\n  allowing shared library reuse.\n- Introduces `standalone_sender/python/bindings` a pybind11 bindings,\n  as the interface for python to leverage `cast_sender_core`\n- Enhances session configuration to support specifying video codecs\n  (`VP8`, `VP9`, `AV1`) and pre-launched receiver `transport_id` /\n  `session_id` to seamlessly delegate negotiation and RTP streaming\n  from Python hosts.\n- Updates GN visibility lists across `platform`, `cast/common`, and\n  `standalone_sender`\n- Include new third_party dependency pybind11.\nBug: 487765018\nBug: 504887307\nTest: Verified on multiple platform (Linux, RPi 5, macos) works\n      seamlessly with vp9 and vp8 codecs.\nTest: Verified standalone sender and receiver work seamlessly.\nChange-Id: I8805366c0e2fb693bd1c1162205b429cec68916e\n\nChange-Id: I8805366c0e2fb693bd1c1162205b429cec68916e\nReviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/7850141\nReviewed-by: Jordan Bayles \u003cjophba@chromium.org\u003e\nReviewed-by: Shawn Quereshi \u003cshawnq@google.com\u003e\nCommit-Queue: Eusden Lin \u003ceusdenlin@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "98e194d7725cc31438232e3d65758b8a2f445294",
      "old_mode": 33188,
      "old_path": ".gitmodules",
      "new_id": "ffdd69cbefbf75d1166167fd39a2f115da6555c3",
      "new_mode": 33188,
      "new_path": ".gitmodules"
    },
    {
      "type": "modify",
      "old_id": "4a55fce01d1c52d35596c01958685f8398126cb6",
      "old_mode": 33188,
      "old_path": "BUILD.gn",
      "new_id": "5e8aba67798ca6701b45661b379a91eb3f5648d6",
      "new_mode": 33188,
      "new_path": "BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "7f9b4087d56e5cf3652a22340a44ebcccdd8f9f3",
      "old_mode": 33188,
      "old_path": "DEPS",
      "new_id": "6a168eb1df425ff163915cf1bec1c48d27e951fd",
      "new_mode": 33188,
      "new_path": "DEPS"
    },
    {
      "type": "modify",
      "old_id": "cca52ce60bce09af6842da0c666f4483b57a7045",
      "old_mode": 33188,
      "old_path": "cast/common/BUILD.gn",
      "new_id": "704e1f08d54b9618c8660dce5581bce5b7a56993",
      "new_mode": 33188,
      "new_path": "cast/common/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "5641855c0511e346fdc7e5506d2ce4df11475183",
      "old_mode": 33188,
      "old_path": "cast/standalone_common/BUILD.gn",
      "new_id": "3424ab2fa93fb58595872919b22e9983882b2308",
      "new_mode": 33188,
      "new_path": "cast/standalone_common/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "58f65578bc64bab4bd818b09d629764d19eb91c6",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/BUILD.gn",
      "new_id": "832311ba3264c76893d07f100a0f8d1b47a88123",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "703c709f2bc84bd80b961ff9ef18bdadaada4e54",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e74bf044da536f0478eb52941acffa3986482b3a",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/cast_runtime.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7ef4f9cc91b77b0448424199f1e5240a7db38a51",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/cast_runtime.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cf50a9a63281aef7cefee1f85fc263a42303de12",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/cast_runtime_unittest.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3256470d15875186b083dacc41a7220af1f281e0",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/get_python_include.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "980b6eb560ece395294f8de49b4ba165f9b5af22",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/python_bindings.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bab9934d8dbe53ce2d6fbeb6c81a50a8d6a3ad09",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/sender_bridge.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0b73aeb8c423605e02f2ec6a828451fb72fe2a16",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/sender_bridge.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7db8a79663c64ca112b37230501aa6f8b25b1ea4",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/bindings/python/sender_bridge_unittest.cc"
    },
    {
      "type": "modify",
      "old_id": "a4078ce3344f9251591f0f464f24a0bf94b3a697",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/connection_settings.h",
      "new_id": "2c430968797cb10841e6b7706500076da81b1ec1",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/connection_settings.h"
    },
    {
      "type": "modify",
      "old_id": "f77a8c493edb0e9a59c490e9d00589c6c868e747",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/looping_file_cast_agent.cc",
      "new_id": "5a98bed1900e758b89b202d7b65eae58f733583b",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/looping_file_cast_agent.cc"
    },
    {
      "type": "modify",
      "old_id": "9e4e042540d7c5891be350a9153d870039474bea",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/looping_file_sender.cc",
      "new_id": "b749f903610372d99b9f7a35f4056210b7e3b150",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/looping_file_sender.cc"
    },
    {
      "type": "modify",
      "old_id": "9104160419f4634552a8a3cefff0225d9ae21b41",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/looping_file_sender.h",
      "new_id": "2a016da413084010de6806f03c61e45cad61726e",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/looping_file_sender.h"
    },
    {
      "type": "modify",
      "old_id": "66f9e53154e045b44379e6461392220c53cc7a16",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/streaming_av1_encoder.cc",
      "new_id": "5c2887a0d1b1e15932be529c1f9b7d649a6783df",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/streaming_av1_encoder.cc"
    },
    {
      "type": "modify",
      "old_id": "f8b68d64e5c06392ee81a28f1497002b3ad32b12",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/streaming_av1_encoder.h",
      "new_id": "008bd002d9f4d24a35af55b4ed89bfaca8d94702",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/streaming_av1_encoder.h"
    },
    {
      "type": "modify",
      "old_id": "15d470b4ae20f0e70f9f62afdd259b93afb0a61d",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/streaming_vpx_encoder.cc",
      "new_id": "5846cbb15fd67985a040dac920a04dda1ed7cf60",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/streaming_vpx_encoder.cc"
    },
    {
      "type": "modify",
      "old_id": "5a00e49283742ee4d99dfa00dc88b03e2bf33517",
      "old_mode": 33188,
      "old_path": "cast/standalone_sender/streaming_vpx_encoder.h",
      "new_id": "3d6948554ff6ec2750dfdc5124e78c7070bd47b3",
      "new_mode": 33188,
      "new_path": "cast/standalone_sender/streaming_vpx_encoder.h"
    },
    {
      "type": "modify",
      "old_id": "c97ebcc44d894a9a756d1fd7d178de6a12ca8ab2",
      "old_mode": 33188,
      "old_path": "platform/BUILD.gn",
      "new_id": "3616eed88d3e6ec159dbf3e63d78d55dd5c61ae8",
      "new_mode": 33188,
      "new_path": "platform/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c2368cea4827c6f84ed8f7694e932242d4dc28bb",
      "new_mode": 33188,
      "new_path": "third_party/pybind11/BUILD.gn"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "596c20cdea08d80031185bbbf596fc4ce1b1d110",
      "new_mode": 33188,
      "new_path": "third_party/pybind11/LICENSE"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "57d80e72ddfd3dcfe276c72bf7169f93241d3a23",
      "new_mode": 33188,
      "new_path": "third_party/pybind11/README.chromium"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d03662f0984f652b60e7ddce53d3868002275197",
      "new_mode": 57344,
      "new_path": "third_party/pybind11/src"
    }
  ]
}
