breadcast/breadcast-caststream-sys/vendor/openscreen/PATCHES.md
Breadway 8c745d18e0
Some checks failed
dev release / build (push) Failing after 12s
Implement Cast Streaming mirroring, DLNA casting, daemon+GUI, and breadd integration
Builds out the full v1 scope: a vendored+patched openscreen subset for
low-latency Cast Streaming (Mirroring receiver 0F5096E8) alongside the
existing Cast V2/HLS and new DLNA/AVTransport casting paths, breadcastd's
Idle/Casting state machine with a private IPC socket, the breadcast GTK4
popup as a thin IPC client, and bread.cast.*/bread.command.cast.* breadd
integration (device discovery, start/stop, mirroring lifecycle events).
Also adds bakery/systemd/Forgejo CI packaging.

Validated end-to-end against a real Chromecast/Google TV: negotiated
Cast Streaming session, live pipeline playback, and daemon+GUI click-to-cast/
stop through the actual popup.
2026-08-03 09:07:21 +08:00

3.5 KiB

Vendoring notes

This directory is a pruned subset of chromium/openscreen, pinned at the commit in PINNED_COMMIT, licensed BSD-3-Clause (see LICENSE). It contains only the files needed for the Cast Streaming sender data path (RTP/RTCP send, OFFER/ANSWER message types, AES frame encryption) plus the POSIX platform/util plumbing that path needs — not the receiver, not OSP discovery, not remoting/RPC, not TLS (breadcast's TLS CASTV2 control channel is handled by the existing rust_cast-based Rust code; this vendored code only drives the UDP RTP/RTCP data path once rust_cast has already negotiated OFFER/ANSWER and we know where to send packets).

It is compiled directly via the cc crate in ../build.rs, not GN/Ninja — there is no build system here to regenerate anything from.

Rolling the pin

There are no release/API-stability guarantees upstream. To update:

  1. Re-run the file selection against the new commit's cast/streaming/BUILD.gn (:common + :sender targets, minus public/sender_session.* and public/rpc_messenger.* — see "What's excluded" below) plus platform/BUILD.gn's :base/:api/:standalone_impl targets.
  2. Re-apply the patches below (they're small; check if upstream has since fixed the same problem and the patch can be dropped).
  3. Update PINNED_COMMIT and rebuild.

What's excluded and why

  • public/sender_session.{h,cc}, public/rpc_messenger.{h,cc}, public/receiver_session.*, receiver-side files, remoting.proto/ input.protoSenderSession bundles mirroring negotiation together with RPC/remoting/input support, which pulls in protobuf (input.pb.h/remoting.pb.h) for no benefit here (breadcast only ever does one-way video mirroring). Instead, ../src/session.cc drives Offer/Answer/SessionConfig directly — logic adapted from sender_session.cc's CreateMirroringOffer/StartNegotiation/ SelectSenders, minus everything RPC/remoting/audio/input-related.
  • All TLS support (platform/impl/tls_*, platform/impl/stream_socket*) — unused; see above.
  • util/crypto/{certificate_utils,digest_sign,pem_helpers,rsa_private_key, secure_hash,sha2}.* — only needed for OSP discovery / X.509 certificate handling, not the RTP data path.
  • util/scoped_wake_lock_mac.cc — macOS-only.

Local patches (not upstream)

  1. build/build_config.h, build/buildflag.h — stand-ins for Chromium's GN-generated versions of these headers. Only define what the 3 callers here actually check (IS_POSIX, IS_LINUX, IS_APPLE, IS_ANDROID), hardcoded for Linux.
  2. patches/aes_ctr128_compat.ccframe_crypto.cc calls AES_ctr128_encrypt(), a BoringSSL convenience wrapper not in system OpenSSL's public headers. Reimplemented from scratch (standard CTR mode over AES_encrypt(), which OpenSSL does still expose).
  3. platform/impl/platform_client_posix.{h,cc} — stripped the TlsDataRouterPosix member/accessor (see "All TLS support" above).
  4. util/crypto/openssl_util.{h,cc} — dropped SSLErrorCodeToError()/ GetSSLError(), which reference BoringSSL's SSL_error_description() (not in system OpenSSL). Unused for the same reason as (3).
  5. util/base64.cc — upstream implements this on third_party/modp_b64, which isn't fetched by a plain shallow clone (pulled in separately via gclient/DEPS in a full Chromium checkout). Reimplemented on EVP_EncodeBlock/EVP_DecodeBlock from system OpenSSL instead, same public interface.