Implement Cast Streaming mirroring, DLNA casting, daemon+GUI, and breadd integration
Some checks failed
dev release / build (push) Failing after 12s
Some checks failed
dev release / build (push) Failing after 12s
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.
This commit is contained in:
parent
887c29002f
commit
8c745d18e0
283 changed files with 36788 additions and 0 deletions
64
breadcast-caststream-sys/vendor/openscreen/PATCHES.md
vendored
Normal file
64
breadcast-caststream-sys/vendor/openscreen/PATCHES.md
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
# Vendoring notes
|
||||
|
||||
This directory is a **pruned subset** of [chromium/openscreen](https://chromium.googlesource.com/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.proto`** — `SenderSession` 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.cc`** — `frame_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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue