# Android Cast — implementation roadmap ## Stream protection (FEC / NACK) | Item | Status | |------|--------| | GF(256) Reed–Solomon + `ProtectionEnvelope` v1 (monolithic) | Done | | **v2 per-shard FEC** (`FecShardWire`, one ACUD message per RS shard) | Done | | NACK + `RetransmitCache` + `MSG_NACK` | Done | | Post-handshake negotiation | Done | | Backward compat (defer FEC until negotiated; ignore foreign FEC/NACK) | Done | | Default protection **NONE** (stable cast) | Done | | Integration tests (`FecShard*`, `UdpCastTransportFecTest`) | Done | | Lab soak under loss (HY300 / BL6000) | TODO (manual) | | NACK rate limit / backoff | Done (`NackRateLimiter`) | | `MSG_FEC_NACK` by groupId (optional) | Deferred | Enable in **Settings → Stream protection (UDP)** on both sender and receiver, then reconnect. ## libvpx / Opus / Speex | Item | Status | |------|--------| | `libandroidcast_codecs.so` + JNI probes | Done | | Cross-compile `libvpx.a` (`scripts/build-native-codecs.sh`) | Done | | JNI encode/decode in `libvpx_bridge.c` | Done (when `libvpx.a` linked per ABI) | | `LibvpxVideoEncoderSink` (surface + buffer) | Done | | libvpx decoder on receiver (`LibvpxCapableVideoDecoder`) | Done | | Surface → libvpx without MediaCodec passthrough on cast | Done (ImageReader) | | Opus / Speex build + sinks | TODO | See [ndk/README.md](../ndk/README.md).