Measure what actually reaches Program
A smooth output clock can conceal stale source pictures. Count capture identities on air and confirm the encoded image.
Reviewed 15 October 2026 against e72ff8b4. These pages describe that code and named workload settings; they do not assert what every deployment runs.
Count delivery, not prewarm traffic
Preserve capture identity through Chromium delivery, the private CUDA copy, pacing, compositing and source selection. The repeats counter measures reuse beyond the source’s native frame period; dropped counts capture IDs skipped while continuously on air. Aliases count once, and a producer restart establishes a new baseline. Capture-sequence gaps reveal skipped source pictures; sender acknowledgements and import-cache hits do not.
Warm-up, off-air subscriptions and declared on_change static holds are not continuous-source visual repeats. Intentional static holds appear as static_holds; skipped new captures still count. A freshly selected source needs an observation baseline; counts must not bridge unrelated off-air periods. Compare counter deltas over a known scene sequence, not process-lifetime totals with unknown setup history.
A faster source has an allowance for intentional rate conversion, so capture IDs cannot distinguish losses within that allowance from expected sampling. At matching capture and output rates there is no such allowance. For diagnosis, set mixer_delivery’s trace_source to a source ID and read trace: the last 256 Program timestamps and capture IDs, without retaining pixels.
Observe after output pacing
Output force_fps can maintain a steady stream by reusing an old frame. Program delivery observation belongs after this step. Compositor deadline misses, browser transport failures, dropped queue entries, source capture gaps and output repeats describe different failures; do not combine them into a single unexplained “discard” total.
Ordinary compositor status returns aggregate counters; the per-input diagnostic array is exposed separately as per_input. This avoids serializing one record per input for every bus on every UI poll. Source-quality counters come from node.object.get mixer_delivery per_source on keyed Program, before encoding; they do not measure remote playback or network loss.
Use a short, reproducible acceptance test
- Warm every fixed browser allocation and establish stable imports.
- Enable the intended moving pages and keys at the actual canvas rate.
- Measure deltas through one-second fades and cuts between the heaviest supported scenes, spaced six seconds apart.
- Record the existing encoded Program output. Check RTP cadence and decoded moving regions alongside source counters.
- Report repeats/skips, misses and imports separately, with rate, process grouping, scene layers and encoder presets.
Regular RTP timestamps alone do not prove changing pixels. A moving ticker alone does not prove every tile advanced. Source lineage also has limits during transitions that show the same source more than once. Use both counters and appropriate image regions, and label short smoke results as such.