Host half of the §ABR-overdrive fix. The stream loop now reads
`Encoder::applied_bitrate_bps()` after every bitrate apply and stores THAT into
`bitrate_kbps`/`live_bitrate` — the send pacer, web console, mgmt registry and
control-task acks all track what the ASIC really targets instead of the
requested rate (the pre-fix ack promised 1.01 Gbps while the encoder ran
794 Mbps, and the client controller climbed from the phantom base forever).
- A short apply teaches `encoder_ceiling_kbps` (shared atomic): the stream loop
pre-clamps incoming requests to it and SKIPS the apply when nothing would
change — ending the reconfigure-reject → full-rebuild(~0.6 s + IDR) storm —
and the control task resolves future SetBitrate acks against it, so the
client learns the ceiling through the existing ack path (no wire change; old
clients converge too).
- `cadence_degraded` (shared flag, leaky-bucket level ≥ 10 or an escalated
session): while set, the control task resolves climbs to the current applied
rate — on a fat LAN no network signal ever stops a climb the encoder can't
serve, and past the compute knee more bits only deepen the cadence miss.
Descents always pass; they're the cure.
- Escalation-warmup hygiene: an ABR rebuild stall (~70 missed deadlines at
120 fps, 3.5× the escalate threshold) and the backlog scored against a
heavier rate no longer feed the latency escalation — rebuilds reset the
leaky bucket and re-run the warmup; in-place down-steps clear the bucket.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>