Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4288,6 +4288,17 @@ make `core/AGENTS.md` a generated index over `AGENTS.d/` topic pages ([ADR-1454]
combination stops the operator at startup.


- **The vendored Pelorus x265 CSV reader builds without warnings under an
optimising GCC.** `x265_csv_read_rows()` in
`core/src/interop/pelorus_qp_report_csv.c` left its column-index struct
uninitialised until the header row was seen, and GCC 16 at `-O2 -Wall -Wextra`
raised seven `-Wmaybe-uninitialized` warnings (`type`, `poc`, `qp`, `bits`,
`psnr_y`, `psnr_u`, `psnr_v`). Every index now starts at -1 (absent), which the
reader already treats as a missing column. The fix is in VMAFx/pelorus
(#79) and re-vendored here (pin `42cb17106a2d`); the parsed values are
unchanged.


- **The ASan + UBSan job no longer kills `test_pic_preallocation`.** The test
runs the `vmaf_v0.6.1` model on 1080p frames in the unoptimised sanitizer
build, about 9 s of CPU, and a hosted runner running the fast suite in
Expand Down
9 changes: 9 additions & 0 deletions changelog.d/fixed/pelorus-qp-csv-cols-initialised.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
- **The vendored Pelorus x265 CSV reader builds without warnings under an
optimising GCC.** `x265_csv_read_rows()` in
`core/src/interop/pelorus_qp_report_csv.c` left its column-index struct
uninitialised until the header row was seen, and GCC 16 at `-O2 -Wall -Wextra`
raised seven `-Wmaybe-uninitialized` warnings (`type`, `poc`, `qp`, `bits`,
`psnr_y`, `psnr_u`, `psnr_v`). Every index now starts at -1 (absent), which the
reader already treats as a missing column. The fix is in VMAFx/pelorus
(#79) and re-vendored here (pin `42cb17106a2d`); the parsed values are
unchanged.
2 changes: 1 addition & 1 deletion core/include/libvmaf/pelorus/deband.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
2 changes: 1 addition & 1 deletion core/include/libvmaf/pelorus/denoise.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
2 changes: 1 addition & 1 deletion core/include/libvmaf/pelorus/interop.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
2 changes: 1 addition & 1 deletion core/include/libvmaf/pelorus/pelorus.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
2 changes: 1 addition & 1 deletion core/src/interop/pelorus_deband_params.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
2 changes: 1 addition & 1 deletion core/src/interop/pelorus_denoise_params.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
2 changes: 1 addition & 1 deletion core/src/interop/pelorus_interop.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
6 changes: 4 additions & 2 deletions core/src/interop/pelorus_qp_report_csv.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down Expand Up @@ -425,7 +425,9 @@ static pel_result x265_csv_read_rows(FILE *fp, PelorusX265Frame *out_frames, siz
{
char line[PEL_CSV_LINE_MAX]; /* bounded, fixed (Po10): no heap, no VLA */
char *fields[PEL_CSV_MAX_FIELDS];
csv_cols cols;
/* Every index starts "absent" (-1): a row is then never admitted before a header has set the
* real indices, and the compiler sees a defined value on every path. */
csv_cols cols = {-1, -1, -1, -1, -1, -1, -1};

while (fgets(line, (int)sizeof(line), fp) != NULL) {
size_t nf = split_fields(line, fields, PEL_CSV_MAX_FIELDS);
Expand Down
2 changes: 1 addition & 1 deletion core/src/interop/pelorus_version.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/

/*
* VENDORED FROM VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT.
* VENDORED FROM VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT.
* Append-only ABI; single
* source of truth is pelorus. Re-sync via scripts/sync-pelorus-interop.sh.
* See docs/adr/1113-vendor-pelorus-interop-abi.md.
Expand Down
2 changes: 1 addition & 1 deletion core/src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -2743,7 +2743,7 @@ libvmaf_sources = [
# ADR-1113: vendored Pelorus <-> vmafx interop ABI (pack/parse, deband +
# denoise param contracts, x265 CSV QP-report reader, version/result-string
# accessors). CPU-only, dependency-free, NO Vulkan. Verbatim mirror of
# VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 (ABI 1.3).
# VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f (ABI 1.3).
# DO NOT EDIT; re-sync via
# scripts/sync-pelorus-interop.sh. See docs/api/pelorus-interop.md.
src_dir + 'interop/pelorus_interop.c',
Expand Down
2 changes: 1 addition & 1 deletion core/test/test_pelorus_interop.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

/*
* test_pelorus_interop.c — vmafx side of the SHARED Pelorus interop ABI
* conformance fixture (VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955
* conformance fixture (VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f
* test/interop_test.c, ABI 1.3).
*
* Both repos run byte-for-byte the same checks against their own copy of
Expand Down
8 changes: 4 additions & 4 deletions docs/api/pelorus-interop.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ re-pin and exact-mirror guard rails are recorded in

!!! warning "The mirror is read-only"
Do not edit the vendored files. They are byte-identical to their Pelorus
origin (pinned at `VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955`)
origin (pinned at `VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f`)
except for a `VENDORED FROM ... DO NOT EDIT` banner and the include-path
rewrite described below. Fix any defect upstream in Pelorus, then
[re-sync](#re-syncing-the-mirror).
Expand Down Expand Up @@ -50,7 +50,7 @@ Pelorus's. (`qp_report_csv.c` is required to link: the ABI-1.3 fixture exercises
### The only local edits

1. A `VENDORED FROM
VMAFx/pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955 — DO NOT EDIT`
VMAFx/pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f — DO NOT EDIT`
banner inserted after the (unchanged) Pelorus license header.
2. Intra-Pelorus `#include "pelorus/<x>.h"` rewritten to
`#include "libvmaf/pelorus/<x>.h"` so the headers resolve under
Expand Down Expand Up @@ -200,7 +200,7 @@ python3 scripts/ci/run_meson_test.py -- \
The pin and the drift guard live in
[`scripts/sync-pelorus-interop.sh`](../../scripts/sync-pelorus-interop.sh). It
reads the vendored sources from the **pinned commit's git tree object**
(`git show 013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955:libpelorus/…`), so it
(`git show 42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f:libpelorus/…`), so it
stays accurate even when the local Pelorus checkout's `HEAD` has moved past the
pin. A directory that is not a Git checkout, or a checkout that lacks the exact
object, fails closed.
Expand All @@ -215,7 +215,7 @@ scripts/sync-pelorus-interop.sh /path/to/pelorus
```

The output is
`OK - mirror matches pelorus@013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955`,
`OK - mirror matches pelorus@42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f`,
or `FAIL - mirror has drifted` with a diff and exit code 1.

To re-vendor after a reviewed Pelorus ABI addition or a released parser
Expand Down
8 changes: 8 additions & 0 deletions docs/rebase-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -61652,3 +61652,11 @@ No score, public API or FFmpeg patch impact.
pin (ADR-1113); `compat/python-vmaf/core/adm_dwt2_cy.pyx` keeps its first line,
`# SPDX-License-Identifier: BSD-2-Clause-Patent`, when upstream Netflix is synced. No score,
public API or FFmpeg patch impact.

## Pelorus pin moves to the qp_report_csv initialisation fix

- `PELORUS_VENDOR_SHA` moves to `42cb17106a2d` (VMAFx/pelorus #79: `csv_cols` starts at -1 in
`x265_csv_read_rows()`). The mirror stays verbatim (ADR-1113): a conflict in
`core/src/interop/pelorus_*.c` takes master's side and re-runs
`scripts/sync-pelorus-interop.sh --update`; never merge a hunk by hand. No score, public API
or FFmpeg patch impact.
1 change: 1 addition & 0 deletions docs/state.md
Original file line number Diff line number Diff line change
Expand Up @@ -1022,6 +1022,7 @@ landed fix yet._
## Recently closed

| **T-GOLDEN-ASSERTIONS-BEHIND-UPSTREAM-2026-10-05** — the fork's golden assertions held Netflix's older values at looser places than Netflix's own re-records (`5c7770080`, `005988ead`, `4679db83c`, `d93495f5c`, `e3827e4dd`: 164 changed assertions), because the golden-data rule read as a ban on any edit | **FOUND by the upstream sync of 2026-10-05 and FIXED on `port/upstream-golden-updates-2026-05` (opened and closed by one PR).** A measurement against the fork's CPU build found 156 of 164 reproduced at upstream's places, none failing, 8 not exercised. The maintainer decided to adopt them; the rule now allows exactly this, a verbatim port of Netflix's own update after a measurement. `make test-netflix-golden` passes on the PR head. | [ADR-1828](adr/1828-port-netflix-golden-updates.md) | `port/upstream-golden-updates-2026-05` | 2026-10-05 | closed |
| **T-PELORUS-QP-CSV-MAYBE-UNINIT-2026-10-05** — the vendored `core/src/interop/pelorus_qp_report_csv.c` gave seven `-Wmaybe-uninitialized` warnings at gcc 16 `-O2 -Wall -Wextra` (`cols.type`, `poc`, `qp`, `bits`, `psnr_y`, `psnr_u`, `psnr_v`, lines 217-290): `x265_csv_read_rows()` left its `csv_cols` uninitialised until the header row; HISS-10 binds vendored code | **FOUND by the RC3 hygiene read of the #2117 re-vendor and FIXED on `fix/pelorus-qp-csv-maybe-uninit` (opened and closed by one PR).** The cause is fixed in VMAFx/pelorus ([#79](https://github.com/VMAFx/pelorus/pull/79), merge `42cb17106a2d`: every index starts at -1, no pragma; its CI gains an optimised gcc werror build) and re-vendored here with `scripts/sync-pelorus-interop.sh --update`. Verified: the file at gcc 16.2.1 `-std=c11 -O2 -Wall -Wextra` gave 7 warnings on the old pin and gives 0 on the new one; `--check` reports no drift. Known remainder: no vmafx CI lane builds with `-Werror` (`core/meson.build` sets `warning_level=2` only), so a new warning in any file is not caught here. | none: bug fix | `fix/pelorus-qp-csv-maybe-uninit` | `scripts/sync-pelorus-interop.sh <pelorus checkout>; gcc -std=c11 -O2 -Wall -Wextra -Icore/include -Icore/src -c core/src/interop/pelorus_qp_report_csv.c -o /dev/null` |
| **T-TESTER-REPORT-DROPS-FAILURE-CAUSE-2026-10-05** — the tester report threw away the evidence that names a failure: a failed `vmaf` run kept only its last stderr line, and a unit-test program that died on a signal was a bare `fail` | **FOUND in the Apple M4 Pro report of [#2118](https://github.com/VMAFx/vmafx/issues/2118) and FIXED on `fix/tester-keep-failure-diagnostics` (opened and closed by one PR).** In that report the Metal equivalence errors on both 1080p checkerboards read `vmaf exited 234: libvmaf WARNING est_params: covariance matrix was singular on 4 of 4 solves`: a warning printed while closing, after the message that named the `-EINVAL` (`tools/rc1-tester/src/vmaf_rc1_tester/hw_equiv.py` kept `stderr.splitlines()[-1:]` only). The same report listed `test_metal_ssimulacra2_parity` as `fail` with eight passing cases and no message: the program died on a signal in its ninth case (`T-METAL-SSIMULACRA2-YUV400-ACCEPTED-2026-10-05`), and `hw_suites.py` recorded neither the signal nor the case; a timeout dropped the output it had already printed. Now a failed run's `error` keeps, after the head line (`vmaf exited N`, the signal's name for a crash, the last line), every distinct `problem ...`, `error: ...` and libvmaf `ERROR` / `WARNING` line (at most 20 lines, 4 KB); a unit-test program killed by a signal, timed out, stopped at the output limit, or exiting with a failure status without a failing case gets a line in `unit_tests.reason` (`<test>: killed by signal 11 (SIGSEGV) during case <case>`), and in a program that prints `@case` lines the case that started without a verdict is `fail` with `no verdict printed: ...`; a timeout keeps the cases printed before it. The report schema is unchanged (schema 3's `error`, `reason`, `cases`, `case_messages`). `tests/test_hw_report.py` and `tests/test_hw_metal.py` hold ten new cases, and all ten fail on master's `hw_equiv.py` / `hw_suites.py`. | [docs/usage/tester-image.md](usage/tester-image.md), [ADR-1496](adr/1496-metal-gate-in-tester-bundle.md) | `fix/tester-keep-failure-diagnostics` | `python3 -m pytest -q tools/rc1-tester/tests/test_hw_report.py tools/rc1-tester/tests/test_hw_metal.py` |
| **T-SPEED-FLOAT-GATE-DEFAULT-MODEL-2026-10-05** — a `-Denable_float=false` build could not score with the default model: `speed_chroma` and `speed_temporal` were compiled and registered only with `enable_float=true`, and `vmaf_v1.0.16_3d0h` reads `speed_chroma` (`could not initialize feature extractor "Speed_chroma_feature_speed_chroma_uv_score"`, `problem loading feature extractors from model: vmaf_v1.0.16_3d0h`) | **FOUND by the upstream sync of 2026-10-05 (Netflix/vmaf `6046b1926` and the build hunk of `4718b4f5f` were not ported) and FIXED on `port/6046b1926-speed-without-float` (opened and closed by one PR).** `speed.c`, `speed_internal.c`, `vif_tools.c` and `common/convolution.c` move to the unconditional source list of `core/src/meson.build`, the two extractors out of `#if VMAF_FLOAT_FEATURES` in `core/src/feature/feature_extractor.cpp`, and the SpEED tests lose their `enable_float` gate. Measured on `ryzen-4090-arc`, GCC 16.2.1, release builds without LTO: on master `52e265fc0` with `-Denable_float=false` the default model fails on the Netflix 576x324 pair; after the change it scores (pooled `vmaf` mean 82.81606015944988) and its JSON equals the `-Denable_float=true` build's byte for byte apart from `fps`/`version`. Float build before and after at `--precision max`, the three Netflix pairs: default model and `speed_chroma` + `speed_temporal` + `float_vif` + `float_motion` reports identical (6 of 6, 108 frames, 1404 values). `test_speed` fails in a float-off build when the registry hunk is reverted (`speed_chroma extractor must be registered by name`) and passes with it; the seven SpEED test binaries pass in the float-off build; fast suite 327 of 327; Netflix golden gate 280 passed, 3 skipped. | (none: upstream port) | `port/6046b1926-speed-without-float` | 2026-10-05 | closed |
| **T-HARDWARE-NEEDS-CPU-ROW-OVERALL-VERDICT-2026-10-05** — the "Hardware we need" table (`docs/usage/hardware-we-need.md`, `scripts/docs/generate-hardware-reports.py`) gave a CPU family row the report's overall verdict, so a report whose CPU checks all passed and whose GPU section failed rated the processor row "worst fail" | **FOUND on the office workstation's regeneration of the table and on the outside-tester reports of 2026-10-05 (#2116: UHD 770 SYCL image, every CPU check passing, `failed_checks` `["gpu"]`), and FIXED on `fix/hardware-needs-cpu-row-verdict` (opened and closed by one PR).** `_verdicts()` appended `report["verdict"]` for every host-matched row. `_host_verdict()` now rates a CPU row from the report's CPU checks (dispatch and reference equivalence, unit tests, golden check) and `image.files_match_build`, through `CHECK_KEYS` / `PASSING` of `vmaf_rc1_tester.hw_report`; the native macOS row adds the Metal equivalence and the Metal gate (it closes the Metal rows). Run over the three reports of 2026-10-05 (#2116, #2118, #2119), the AVX2 row reads "2 reported, worst pass" (was "worst fail"); the Apple, Ampere and Xe-LP rows are unchanged (fail, pass, fail). Test: `CpuRowVerdictTests` in `scripts/docs/tests/test_hardware_needs.py` (`test_gpu_failure_does_not_fail_the_cpu_row` fails on the old generator). | — | `fix/hardware-needs-cpu-row-verdict` | 2026-10-05 | fixed |
Expand Down
2 changes: 1 addition & 1 deletion scripts/sync-pelorus-interop.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ set -euo pipefail
# reviewed interop ABI addition or a parser correctness/security fix, even when
# ABI major/minor stay unchanged. Keep this in lock step with every vendored
# banner and docs/api/pelorus-interop.md.
PELORUS_VENDOR_SHA="013bc59f04f1701d9f9e8e6ff2a2f6b985c6d955"
PELORUS_VENDOR_SHA="42cb17106a2d3fae7790754f7cd8c6e1fbe6fa7f"

repo_root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
mirror_policy="$repo_root/scripts/ci/pelorus_mirror.py"
Expand Down
Loading