Skip to content

docs(bench): v0.13 — per-shot CRF steering is an honest negative on the CRF axis#34

Merged
lusoris merged 1 commit into
masterfrom
docs/per-shot-crf-negative
Jun 20, 2026
Merged

docs(bench): v0.13 — per-shot CRF steering is an honest negative on the CRF axis#34
lusoris merged 1 commit into
masterfrom
docs/per-shot-crf-negative

Conversation

@lusoris

@lusoris lusoris commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

What

Documents an honest negative: per-shot CRF steering (the ADR-0132 lever), tested as a simple complexity→b=-zone mapping, loses vs flat CRF. No code change — this is the measurement (bench-results.md v0.13).

Method

  • Pass 1: extract per-frame complexity via the lavfi.pelorus.* frame metadata (ADR-0136), aggregate per shot (a 3-shot BBB clip, real ~2× complexity spread: 0.065 / 0.052 / 0.032).
  • Pass 2: bias x265 rate-control per shot via --zones b= factors (complex shot b=1.16, simple b=0.82).
  • RD curve (CRF 26/30/34/38), BD-rate vs flat CRF (VMAF + SSIMULACRA2).

(First attempt used zones=…,crf=invalid; x265 zones support only q=/b=. Corrected.)

Result

metric BD-rate verdict
VMAF +8.81 % loss
SSIMULACRA2 +7.35 % loss

Per-shot redistribution spent ~5 % more bits and scored slightly lower at every CRF.

Why

CRF is already a constant-quality target — x265 allocates more bits to complex shots on its own. Pushing beyond constant-quality leaves the quality/bitrate convex hull. The per-shot win in the literature is for budget/VBR allocation or per-shot resolution, not pure CRF.

This is the 4th measured negative in the "compete with the encoder's mature rate-control" space (after fp16, subgroup, perceptual-AQ): Pelorus's edge is preprocessing the source, not out-guessing CRF / 2-pass / mbtree. ADR-0132 stays Proposed; the lever now hinges on the autotune (ADR-0106) beating flat CRF against a low ceiling. The durable result is the shipped ADR-0136 metadata path, which made this measurable from the shell.

🤖 Generated with Claude Code

…he CRF axis

Tested the ADR-0132 per-shot complexity-budget lever as a simple hand-tuned
mapping: extract per-frame complexity via the lavfi.pelorus.* metadata (ADR-0136),
aggregate per shot, bias x265 rate-control per shot via --zones. Real ffmpeg +
libx265, 3-shot BBB clip (~2x complexity spread), RD curve, BD-rate vs flat CRF.

(First attempt used zones=...,crf= which is invalid — x265 zones support only q=
and b=; corrected to b= bitrate factors.)

Result: per-shot redistribution LOSES — VMAF BD-rate +8.81%, SSIMULACRA2 +7.35%
(~5% more bits AND slightly lower quality at every CRF). Root cause: CRF is
already a constant-quality target, so x265 allocates more bits to complex shots
on its own; pushing beyond that leaves the quality/bitrate convex hull. The
per-shot win in the literature is for budget/VBR or per-shot resolution, not pure
CRF.

4th measured negative in the "compete with the encoder's mature rate-control"
space (after fp16, subgroup, perceptual-AQ) — Pelorus's edge is preprocessing,
not out-guessing CRF/2-pass/mbtree. ADR-0132 stays Proposed; the lever now
depends on the autotune (ADR-0106) beating flat CRF against a low ceiling. The
shipped ADR-0136 metadata path is the durable enabler that made this measurable.

No code change (orchestration experiment, scripts only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@lusoris
lusoris merged commit 408df76 into master Jun 20, 2026
3 checks passed
@lusoris
lusoris deleted the docs/per-shot-crf-negative branch June 20, 2026 20:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant