Files
hyperframes/packages/producer/tests/hdr-hlg-regression/README.md
T
Vance Ingalls d7c1050e44 test(producer): add hdr-regression and hdr-hlg-regression test suites (#365)
## Summary

Replace the trivial `hdr-pq` and `hdr-image-only` tests with two consolidated, time-windowed regression suites that exercise the full HDR pipeline. These goldens are the safety net for every other PR in this stack.

## Why

The pre-existing HDR tests covered only a single full-bleed video or image with a static text label — none of the features that the HDR pipeline has to handle differently from SDR (opacity animation, z-ordered multi-layer compositing, transforms, border-radius clipping, shader transitions, multiple HDR sources, object-fit modes, mixed HDR+SDR layering, HLG transfer). This PR builds the missing safety net first so every subsequent fix can be proven correct.

## What changed

- New `packages/producer/tests/hdr-regression/` (PQ, BT.2020, ~20 s, 1080p, 8 windows A–H):
  - A: static baseline (HDR video + DOM overlay)
  - B: wrapper-opacity fade
  - C: direct-on-`<video>` opacity tween (documents the Chunk 1 bug)
  - D: z-order sandwich (DOM → HDR → DOM)
  - E: two HDR videos side-by-side (pins PR #289)
  - F: rotation + scale + border-radius (documents the Chunk 4 bug)
  - G: `object-fit: contain`
  - H: shader crossfade between HDR video and HDR image
- New `packages/producer/tests/hdr-hlg-regression/` (HLG, ARIB STD-B67, ~5 s, 2 windows A–B) — exercises the separate HLG LUT/OETF code path that previously had **zero** coverage.
- New `scripts/generate-hdr-photo-pq.py` synthesizes `hdr-photo-pq.png` with a cICP chunk for BT.2020/PQ/full.
- Removed `tests/hdr-pq/` and `tests/hdr-image-only/`.
- Updated `.github/workflows/regression.yml` HDR shard to run the new pair sequentially.
- All compositions follow the documented timed-element pattern (`data-start`, `data-duration`, `class="clip"` directly on each timed leaf — no wrapper inheritance).

## Test plan

- [x] Goldens generated with `bun run test:update --sequential`.
- [x] `ffprobe` confirms HEVC/yuv420p10le/bt2020nc/smpte2084 (PQ) and arib-std-b67 (HLG).
- [x] Suite green with `maxFrameFailures` budgets that absorb the documented Chunk 1 / Chunk 4 known-fails — tightened in follow-up PRs in this stack.

## Stack

Foundational PR for the HDR follow-ups stack (Chunk 0 of `plans/hdr-followups.md`). Every subsequent PR builds on this safety net.
2026-04-22 15:43:04 -07:00

53 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# hdr-hlg-regression
Regression test that locks down end-to-end **HDR HLG (BT.2020 ARIB STD-B67)**
video rendering. Companion to `hdr-regression` (PQ), kept as a separate suite
so the HLG-specific encoder/metadata path stays tested in isolation.
## What it covers
| Window | Time | Shape | Expected |
| ------ | ------------ | ------------------------------------- | -------- |
| A | 0.0 2.5 s | Baseline HLG video + DOM overlay | pass |
| B | 2.5 5.0 s | Wrapper opacity fade around HLG video | pass |
The test pins the contract that:
- `extractVideoMetadata` reports `bt2020/arib-std-b67/limited` for the HLG
source (i.e. HLG is detected and not silently coerced to PQ).
- `isHdrColorSpace` flips the orchestrator into the layered HDR path on the
HLG signal.
- The HLG source is decoded into `rgb48le` and blitted under the SDR DOM
overlay on every frame.
- Wrapper-opacity composition (window B) does not break HLG pass-through.
- `hdrEncoder` writes HEVC Main10 / `yuv420p10le` / BT.2020 HLG with the
correct color tags (no PQ mastering display metadata for HLG).
The suite is intentionally short (5 s, two windows) — it exists to detect
regressions in the HLG-specific code path, not to enumerate every composition
shape (those live in `hdr-regression`).
## Tolerance
`maxFrameFailures` is **0** here. HLG is a pure pass-through path — no known
failures, no transcoder workarounds — and HEVC encoding against the rendered
`rgb48le` buffer is byte-deterministic on the same fixture. Any drift is a
real regression, not codec noise, so the budget is the strictest possible.
## Fixture
`src/hdr-hlg-clip.mp4` — last 5 seconds of a user-recorded HEVC HLG clip,
remuxed (no re-encode) so the HLG color tags survive verbatim.
## Running
```bash
cd packages/producer
bun run test hdr-hlg-regression
bun run test:update hdr-hlg-regression
```
In CI it runs in the `hdr` shard alongside `hdr-regression`
(see `.github/workflows/regression.yml`).