ADR-0614: Per-Shot ABR Rendition Selection¶
- Status: Proposed
- Date: 2026-05-19
- Deciders: lusoris
- Tags:
ai,planning,vmaf-tune
Context¶
The Phase E ladder produces a per-title convex-hull set of (resolution, bitrate) knees. The Phase D per-shot tuner picks a CRF per shot but always encodes at source resolution. The cross-product — assigning each shot a (resolution, CRF) pair drawn from the per-title ladder — is absent. A title with 1000 shots has shots whose optimal encoding resolution may differ by 2–3 ladder rungs; forcing all shots to source resolution wastes bits on simple shots and may under-serve complex ones at lower rungs. Per-shot ABR rendition enables DASH packaging where each segment can be at a different resolution.
Decision¶
We will implement per-shot VMAF-targeted rung selection (Research 0610 Option B): a new rendition_picker.py evaluates candidate ladder rungs for each shot using the Phase B bisect predicate and selects the lowest-bitrate rung meeting the shot's VMAF target. The output is an extended ShotRecommendation that includes the selected ladder rung. DASH resolution clustering is scoped as a follow-on phase (P3) and deferred.
Alternatives considered¶
| Option | Pros | Cons | Why not chosen |
|---|---|---|---|
| A — complexity-threshold fixed rung | Zero encode overhead | Hand-tuned thresholds; coarse | Accuracy insufficient for production |
| B — VMAF-targeted rung selection (chosen) | Content-adaptive; no hand-tuning | O(rungs × shots) probes | Mitigated by ADR-0615 (NR) |
| C — learned per-shot predictor | Zero runtime overhead | Training data + ADR-0618 dependency | Deferred post classifier |
| D — joint DO-extended optimisation | Global optimum | Highest complexity; requires ADR-0613 | Deferred |
Consequences¶
- Positive: 5–15% estimated BD-rate improvement on heterogeneous titles; each shot encodes at its natural resolution sweet spot.
- Negative: DASH packaging complexity increases; HLS backwards compatibility requires explicit handling (constant resolution per HLS variant stream).
- Neutral / follow-ups: Packaging support (
packaging.pyor Shaka Packager integration) must follow in P3.
Dependencies¶
- ADR-0295 (
ladder.pyPhase E) — must be stable; rung set is the input. - ADR-0615 (Fast NR pre-scoring) — optional; reduces O(rungs × shots) to O(rungs + 1 FR call) per shot.
- ADR-0613 (Dynamic Optimizer) — optional; can be extended to joint shot-rung-CRF optimisation, not required for initial rung picker.
Implementation phases¶
| Phase | Description | Effort |
|---|---|---|
| P1 | rendition_picker.py; per-shot rung evaluation; unit tests | 2 days |
| P2 | Integration with tune_per_shot and merge_shots; extended EncodingPlan | 1 day |
| P3 | DASH resolution clustering; multi-Representation output | 2 days |
| P4 | CLI flag --per-shot-resolution; docs | 0.5 day |
| P5 (post ADR-0615) | Switch probes to NR oracle; validate speedup | 1 day |
Total estimate: 5.5–6.5 days (excluding P5).
References¶
- Research digest: docs/research/0610-per-shot-abr-rendition-research.md.
- arXiv:2408.01932 — Durbha & Bovik, 2024 (retrieved 2026-05-19).
- arXiv:2512.12952 — Durbha et al., 2025 (retrieved 2026-05-19).
tools/vmaf-tune/src/vmaftune/ladder.py,per_shot.py.- Source: per user direction (roadmap planning session 2026-05-19).