Repository navigation
refactor(core): C++23 Wave bundle (#319 log + #232 gpu_dispatch_env + #136 opt+read_json_model + #154 feature_extractor + #198 cli_parse+vmaf) - #531
Merged
Conversation
This was referenced Jun 1, 2026
Converts core/src/log.c to core/src/log.cpp and wires it into the meson build as the second C++23 pilot under ADR-0708 (first was dict.c/dict.cpp per ADR-0727). The log.cpp file existed on master from the earlier PR #45 attempt but remained inert (meson still referenced log.c, see PR #205 "Wave 1 INERT" audit). This PR completes the conversion by: - Adding `extern "C"` guards to core/src/log.h so the header is includable from both C and C++ TUs. - Wrapping the function definitions in log.cpp in `extern "C"` so the emitted symbols carry C-mangling (verified via nm: `vmaf_log` and `vmaf_set_log_level` are C-mangled exports, same as the prior log.c build). - Replacing the C `static` file-scope log state with a C++ anonymous namespace (clang-tidy misc-use-anonymous-namespace clean). - Compiling log.cpp in an isolated `log_cpp23_lib` static_library with `override_options: ['cpp_std=' + libvmaf_cpu_cpp_std]`, mirroring the ADR-0708 `metadata_handler_cpp20_lib` pattern so the C++23 override does not leak to other TUs. - Removing log.c from libvmaf_sources; adding `log_cpp23_lib` objects to the libvmaf library() target. - Removing 21 inline `'../src/log.c'` source entries from test executables in core/test/meson.build; adding a shared `log_cpp23_test_objects` aggregate that those tests pick up via objects:. - Wiring the orphan `test_log` executable into the fast suite (mirrors the orphan-test sweep in draft PR #315) so the formatter / log-level filtering coverage is no longer silently dead. Behaviour is byte-identical to the prior C build: same fprintf format string, same va_list pass-through, same stderr destination, same ANSI colour codes. std::print / std::format were considered but rejected to preserve printf-style varargs at the libvmaf log surface. Build + test: meson setup build-cpu core -Denable_cuda=false -Denable_sycl=false \ -Denable_hip=false ninja -C build-cpu # 726 targets, all link clean meson test -C build-cpu --suite=fast # 50/50 pass, incl. new test_log ABI verification (nm libvmaf.so | grep vmaf_log): master: 0000000000000000 t vmaf_log (LTO-hidden) 0000000000000000 t vmaf_log.constprop.0 (LTO-hidden) this PR: 0000000000000000 T vmaf_log (externally visible) 0000000000000000 T vmaf_set_log_level (externally visible) The promotion from `t` (local) to `T` (global) is a consequence of moving the TU into an isolated static_library — the linker can no longer elide the symbol via LTO. This matches the established metadata_handler_cpp20_lib precedent (vmaf_metadata_* are also `T` in master). Neither symbol is marked VMAF_EXPORT, so the public libvmaf ABI is unchanged. **Research digest**: ADR-0708 (C++23 internals pilot policy) and the Wave 1 backlog rationale in ADR-0727 §Context. The log.c migration recipe is the same as metadata_handler (extern "C", isolated static_lib, cpp_std override) — no separate research digest needed. **Decision matrix**: log.c was chosen as the next pilot over mem.c, opt.c, and fex_ctx_vector.c because (1) its C surface is the smallest of the four (72 lines, two functions, no out-params), (2) it has zero callers in the public ABI (vmaf_log / vmaf_set_log_level are internal diagnostics, not VMAF_EXPORT-marked), and (3) the log.cpp body already existed in tree from a prior aborted Wave 1 attempt — adopting it is strictly cheaper than starting fresh from mem.c. See ADR-0708 `## Alternatives considered` for the original ROI ranking. **AGENTS.md invariant note**: no rebase-sensitive invariants — the log function semantics, output format, and stderr destination are unchanged. The rebase-mapping (upstream `libvmaf/src/log.c` → fork `core/src/log.cpp`) is recorded in docs/rebase-notes.md so future port-upstream-commit runs target the right file. **Reproducer / smoke-test command**: meson setup build-cpu core -Denable_cuda=false -Denable_sycl=false \ -Denable_hip=false ninja -C build-cpu meson test -C build-cpu test_log --print-errorlogs nm build-cpu/src/libvmaf.so | grep -E " T vmaf_log| T vmaf_set_log_level" **CHANGELOG fragment**: changelog.d/changed/log-c-to-cpp23.md **Rebase note**: docs/rebase-notes.md — section "log.c → log.cpp C++23 pilot (ADR-0708 Wave 1, 2026-05-30)". Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the platform-#ifdef pthread_mutex_t/CRITICAL_SECTION lock bootstrap with std::mutex + std::lock_guard RAII; replace strdup + nullable char * with std::optional<std::string>; use std::string_view for the fast-path comparisons; add [[nodiscard]] to the public entry point. The Windows-specific InitOnceExecuteOnce / CRITICAL_SECTION branch (~25 LOC) is eliminated entirely. Compiled as an isolated gpu_dispatch_env_cpp23_lib static library with override_options=['cpp_std=c++23'], following the ADR-0708 pattern for metadata_handler_cpp20_lib. Public extern "C" symbol unchanged; all GPU backends link without modification. Fast-test gate: 49/49 pass (CPU-only build). Six deliverables (ADR-0108): D1: no digest needed: trivial mechanical conversion D2: ADR-0858 §Alternatives considered D3: core/AGENTS.md — added invariant #7 for isolated lib pattern D4: reproducer: meson setup core/build -Denable_cuda=false && ninja D5: changelog.d/changed/adr-0858-cpp23-gpu-dispatch-env.md D6: docs/rebase-notes.md — feat/cpp23-gpu-dispatch-env-20260529 entry Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…pp (ADR-0761) Activate opt.cpp (completing Wave 1 / ADR-0721) and convert read_json_model.c → read_json_model.cpp (new, 639 LOC). Both compile under cpp_std=c++23 in isolated static libraries (opt_cpp23_lib / read_json_model_cpp23_lib) linked into libvmaf.so via extract_all_objects(). Public C ABI unchanged. Changes per file: - opt.h: extern "C" guards added; opt_cpp23_lib wired into meson - read_json_model.cpp: nullptr, static_cast<>, [[nodiscard]] on 4 entry points; goto-past-init replaced with if/else scoping; C++ <c*> headers - log.h, model.h, read_json_model.h: extern "C" guards added - core/src/meson.build: opt_cpp23_lib + read_json_model_cpp23_lib static libs; opt.c and read_json_model.c comments in libvmaf_sources - core/test/meson.build: wave8_cpp23_objects variable; all affected test executables updated to use objects instead of direct source compilation - scripts/ci/coverage-check.sh: updated opt.c -> opt.cpp, read_json_model.c -> read_json_model.cpp in critical-coverage exclusion list - core/src/AGENTS.md: invariant 10 documenting the active .cpp files predict.c skipped: depends on feature_extractor.h / feature_collector.h without extern "C" guards; deferred to a later wave. Build: 49/49 fast-suite pass (CPU-only). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Six void* cast fixups, one atomic_load arithmetic guard, placement-new pool slot init (avoids copying std::atomic), extern "C" guards on feature_extractor.h / log.h / opt.h, and extern "C" on opt.cpp definition. meson.build refs updated; old .c deleted via git rm. Fast-test gate: 49/49 PASS (CPU-only build-0772). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Convert core/tools/cli_parse.c and core/tools/vmaf.c to C++23 translation units. Conservative idioms only: nullptr, static_cast, [[nodiscard]], [[noreturn]], std::string_view for option-string dispatch, and a ModelArrays RAII struct that replaces the three manual vmaf_model_destroy/free loops in vmaf.cpp's goto-cleanup block. - cli_parse.h: extern "C" guards for C caller compatibility - spinner.h: static internal linkage on spinner[]/spinner_length - meson.build: cpp files + cpp_args + override_options cpp_std=c++23 - .pre-commit-config.yaml: add --disable-version-check to semgrep entry to fix spurious exit-2 from semgrep 1.159.0 version-check notification Build: CPU-only build in container — 724 targets, zero errors. Smoke: vmaf --help output identical; Netflix golden pair scores 76.66783 (ADR-0214 PASS; places=4 >= 76.668). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…files Conflicts in .github/workflows/libvmaf-build-matrix.yml (2 blocks) and .github/workflows/security-scans.yml (1 block) were committed into the PR branch prior to this rebase. They produced blank lines or garbled YAML steps that would fail CI. Remove all conflict markers and restore the correct content matching the master baseline. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
lusoris
force-pushed
the
refactor/cpp23-wave-bundle-319-232-136-154-198
branch
from
June 2, 2026 14:47
cc65bfd to
8033921
Compare
lusoris
marked this pull request as ready for review
June 2, 2026 14:47
This was referenced Jun 3, 2026
Closed
lusoris
added a commit
that referenced
this pull request
Jun 3, 2026
…768) (#564) Convert two core/src/*.c files to C++23, continuing the ADR-0708 migration playbook (isolated static_library per TU, cpp_std=c++23 scoped): - picture_pool.cpp: typedef struct → struct, nullptr, static_cast / reinterpret_cast for the C-style first-member inheritance pattern (PooledPicturePriv ↔ VmafPicturePrivate). - gpu_picture_pool.cpp: typedef struct → struct, nullptr, std::malloc / std::memset, std::free. Note: gpu_dispatch_env.cpp was already converted in PR #531 (ADR-0858); this wave covers only picture_pool and gpu_picture_pool. Collateral: extern "C" guards added to picture.h, mem.h, ref.h, and picture_pool.h so the new C++ TUs resolve unmangled C symbols at link time. All gpu_picture_pool.c references in test/meson.build updated to .cpp. No user-discoverable surface change (internal build wiring only). Co-authored-by: Lusoris <lusoris@pm.me> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This was referenced Jun 4, 2026
lusoris
added a commit
that referenced
this pull request
Jun 8, 2026
…omotion + tune-report (#852) * docs(deprecations): add VmafLegacyQualityRunner entry with ADR-0749 cite Documents the removal of VmafLegacyQualityRunner (broken after the float_ansnr feature was dropped in PR #38), with migration pointer to VmafQualityRunner and a current .json model. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(policy): document container-only canonical artifact publishing (ADR-1102) Phase 4b.9 decision: the vmaf-dev-mcp container is the exclusive source for all canonical artifacts (release binaries, published ghcr.io images, CI benchmark/snapshot artifacts). Host-side builds remain available for IDE/clangd, debugger, and sanitizer workflows but must not produce published artifacts. Changes: - CLAUDE.md §15: add publishing bullet citing ADR-1102 and publishing.md - docs/development/publishing.md: new policy doc with rebuild trigger conditions and approved host-side use cases - docs/adr/1102-phase4b9-container-only-publishing.md: decision record - docs/adr/README.md: add ADR-1102 index row - changelog.d/added/1102-container-only-publishing-policy.md: fragment - docs/rebase-notes.md: no rebase impact note Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(cambi): port upstream 721569bc — cambi_high_res_speedup param + motion2 score update Port Netflix/vmaf commit 721569bc (resource/doc: add cambi_high_res_speedup parameter and update motion2 score) to fork's relocated doc tree. Changes applied to fork path equivalents: - docs/metrics/cambi.md ← resource/doc/cambi.md: add cambi_high_res_speedup option - docs/metrics/confidence-interval.md ← resource/doc/conf_interval.md: update motion2 score - docs/usage/python.md ← resource/doc/python.md: update motion2 score The cherry-pick was applied with manual conflict resolution due to doc relocation (ADR-0700 moved resource/doc/ → docs/). Upstream trailing whitespace stripped to comply with fork's pre-commit gate. Upstream commit: 721569bc1b18847a396c86575f4698e372454c04 Upstream author: christosb <christosb@netflix.com> * ci(sycl): calibrate float_ssim for Arc DG2-G10 and promote parity test to required Adds an `arc:dg2-g10` calibration entry to `scripts/ci/gpu_ulp_calibration.yaml` with `float_ssim: 5.0e-4` (places=3), resolving T-SYCL-ARC-FLOAT-SSIM-PARITY-2026-06-03. Two stacked causes drive the relaxed tolerance on DG2-G10 class Intel Arc devices: (1) CPU path (float_ssim.c / iqa_ssim) uses the L×C×S decomposition with a sqrt(var_ref*var_cmp) contrast term; the SYCL kernel (integer_ssim_sycl.cpp) uses the Wang 2004 Eq.(13) combined formula (2*covar) — intentional design. (2) DG2-G10 has shaderFloat64=false; fp32 accumulation drift over 177K pixel SSIM values compounds to ~2.7e-4. RTX 4090 (native fp64) passes at places=4. Empirical max_abs_diff on Arc A380: 2.68e-4. See Research-0985 §3 / ADR-0234. Also adds a dedicated `sycl-float-ssim-parity` job in `tests-and-quality-gates.yml` targeting the self-hosted `gpu-full` runner (same gate as `coverage-gpu`), and promotes it to the required-status list in `required-aggregator.yml`. The aggregator treats "check not reported" (no GPU runner available) as path-filter-skip/OK, so the gate degrades gracefully when the Arc runner is offline. Closes: T-SYCL-ARC-FLOAT-SSIM-PARITY-2026-06-03 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ci): add ssimulacra2 DG2-G10 SYCL calibration placeholder entry Add a named calibration entry sycl:0x8086:0x56a* (Intel Arc Alchemist DG2/G10, Arc A380 class) in scripts/ci/gpu_ulp_calibration.yaml with ssimulacra2 anchored at the default places=2 (5e-3) tolerance. This resolves T-SYCL-ARC-SSIMULACRA2-PARITY-2026-06-03 (partial). Before this change the gate matched Arc A380 only via the coarse sycl:0x8086:* generic glob, which has no ssimulacra2 override and therefore fell back to the built-in 5e-3 default silently. The new DG2-G10 entry makes the match explicit, documents the observed 8.72e-2 divergence, and records the follow-up work inline. Root cause: fp32-IIR accumulation drift in the 3-pole Charalampidis blur (ssimulacra2_sycl.cpp::launch_blur) over up to 329 rows of recurrence state per scale x 6 pyramid scales. Arc A380 lacks native fp64 (ADR-0220). RTX 4090 passes places=2 without issue. Follow-up (long-term, T-SYCL-ARC-SSIMULACRA2-PARITY-2026-06-03 §b): - Kahan-compensated IIR rewrite in core/src/feature/sycl/ssimulacra2_sycl.cpp::launch_blur. - CUDA twin in core/src/feature/cuda/ssimulacra2/. - Requires Arc A380 hardware access; blocked on self-hosted runner. - Replace placeholder with a hardware-validated places=1 (5e-2) value once calibration corpus is available. Also updates docs/state.md to record the partial fix and adds a changelog fragment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci(sycl): re-enable clang-tidy-sycl job via synthetic compile_commands The clang-tidy-sycl CI job was removed on 2026-06-06 because stock LLVM clang-tidy could not parse SYCL TUs: meson compiles them via CUSTOM_COMMAND (icpx -fsycl) so they have no entries in compile_commands.json, and without those entries clang-tidy falls back to default flags where <sycl/sycl.hpp> cannot be found. This commit re-enables the job with a two-step approach: 1. scripts/ci/gen-sycl-compile-commands.py — new 120-line script that parses build.ninja, extracts CUSTOM_COMMAND entries for SYCL .cpp TUs, and synthesises compile_commands.json entries by replacing icpx with clang++ and dropping -fsycl. The -I project include paths and -D flags are preserved so clang-tidy can resolve internal headers. 2. scripts/ci/clang-tidy-sycl.sh (unchanged) — existing wrapper that injects -isystem<sycl/sycl.hpp path> + -D__SYCL_DEVICE_ONLY__=0. The __SYCL_DEVICE_ONLY__ guard covers all __spirv_ControlBarrier and __ocl_event_t usages in nd_item.hpp and group.hpp (verified in oneAPI 2026.0.0). The re-added CI job runs on ubuntu-24.04, installs intel-oneapi-compiler- dpcpp-cpp + clang-tidy-18, sets up a SYCL build tree (CC=icx CXX=icpx meson setup ... -Denable_sycl=true), calls gen-sycl-compile-commands.py to augment compile_commands.json, then invokes clang-tidy-sycl.sh on changed SYCL TUs in parallel. continue-on-error: true (advisory) until one green master run confirms the wrapper holds across all 21 SYCL TUs. File paths updated from pre-ADR-0700 libvmaf/ to core/ throughout. docs/state.md: T-SYCL-CLANG-TIDY-DISABLED moved from open to resolved. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(ci): promote docker-image.yml smoke step to blocking 3 consecutive green master runs met the T-DOCKER-SMOKE promotion criterion. Changes: - Remove `continue-on-error: true` from the Docker Image Build job. - Add a CPU score-assertion smoke step: runs `vmaf --backend cpu` inside the built image against the 576x324 YUV fixture pair in `testdata/`, asserts mean VMAF ≈ 94.32 ± 0.5 (model vmaf_v0.6.1.json). This proves the binary executes correctly, not merely that the Dockerfile parses. - Raise timeout from 30 min to 45 min to accommodate score computation. - Update docs/state.md: move T-DOCKER-SMOKE row to Recently closed. - Add changelog.d/chore/promote-docker-smoke-blocking.md fragment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(vmaf-tune): improve HTML report quality — mobile layout, failed-row affordances, axis alignment Five concrete issues found in the profile-card renderer: 1. Missing <meta name="viewport"> — without it, every mobile browser renders the report at ~980 px desktop width, requiring pinch-zoom just to read codec tables. 2. Light-mode --ok / --bad CSS variables were absent from the @media (prefers-color-scheme: light) block. The dark-mode green (#4caf50) and red (#ef5350) fail WCAG AA contrast against the light-mode #fff panel background. Added #2e7d32 / #c62828 overrides which clear 4.5:1 on white. 3. Numeric table-header alignment mismatch. td.num right-aligned all data cells but <th> headers stayed left-aligned, making columns appear shifted. Added th.num selector to the CSS and applied class='num' to bitrate, CRF, encode-time, and VMAF header cells in both the codec-comparison and sweep-summary tables. 4. Failed-row affordances. Failed CodecRow and sweep rows now carry class='failed' on the <tr>, which applies opacity: 0.7 so the dimmed row is immediately distinguishable from successful rows. The .tag.bad inline span alone was insufficient at a glance. 5. Pre block for the JSON dump had no max-height / scroll cap — large reports pushed the JSON block to 60+ rem, forcing the reader to scroll past it. Added max-height: 28rem + overflow-y: auto. Also added min-width: 320px to .chart svg so charts do not collapse below readability on narrow viewports. Additionally: .table-scroll gets -webkit-overflow-scrolling: touch for iOS momentum-scroll, and .kv grid falls back to a narrower column on screens ≤ 480 px. No logic changes; pure renderer / CSS fixes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(backlog): close stale T-CPP23-READ-JSON-MODEL row (PR #531 already converted) The T-CPP23-READ-JSON-MODEL-PENDING-2026-05-29 row in docs/state.md was stale: the read_json_model.c → read_json_model.cpp C++23 conversion landed in PR #531 (2026-06-02) as part of ADR-0846 Wave 8. Remove the Open row and add a Recently Closed entry citing PR #531 + ADR-0846. No production code changes. --------- Co-authored-by: Lusoris <lusoris@pm.me> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
12 tasks done
lusoris
added a commit
that referenced
this pull request
Sep 20, 2026
…cated core/test/meson.build registered test_log twice: #315 wired it in as an orphan test, and #531 added a second test() under a comment saying it had never been registered, so it ran twice in every fast-suite run. The second registration and its now-false comment go. Folding the stack duplicated two pieces of docs/state.md: the closed row for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from each stacked branch had revised in turn. The header is one sentence again, carrying all nine ids. Six resurrected old-register lines in core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above them, are removed.
lusoris
added a commit
that referenced
this pull request
Sep 20, 2026
…cated core/test/meson.build registered test_log twice: #315 wired it in as an orphan test, and #531 added a second test() under a comment saying it had never been registered, so it ran twice in every fast-suite run. The second registration and its now-false comment go. Folding the stack duplicated two pieces of docs/state.md: the closed row for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from each stacked branch had revised in turn. The header is one sentence again, carrying all nine ids. Six resurrected old-register lines in core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above them, are removed.
lusoris
added a commit
that referenced
this pull request
Sep 20, 2026
…cated core/test/meson.build registered test_log twice: #315 wired it in as an orphan test, and #531 added a second test() under a comment saying it had never been registered, so it ran twice in every fast-suite run. The second registration and its now-false comment go. Folding the stack duplicated two pieces of docs/state.md: the closed row for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from each stacked branch had revised in turn. The header is one sentence again, carrying all nine ids. Six resurrected old-register lines in core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above them, are removed.
lusoris
added a commit
that referenced
this pull request
Sep 20, 2026
…cated core/test/meson.build registered test_log twice: #315 wired it in as an orphan test, and #531 added a second test() under a comment saying it had never been registered, so it ran twice in every fast-suite run. The second registration and its now-false comment go. Folding the stack duplicated two pieces of docs/state.md: the closed row for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from each stacked branch had revised in turn. The header is one sentence again, carrying all nine ids. Six resurrected old-register lines in core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above them, are removed.
lusoris
added a commit
that referenced
this pull request
Sep 20, 2026
…cated core/test/meson.build registered test_log twice: #315 wired it in as an orphan test, and #531 added a second test() under a comment saying it had never been registered, so it ran twice in every fast-suite run. The second registration and its now-false comment go. Folding the stack duplicated two pieces of docs/state.md: the closed row for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from each stacked branch had revised in turn. The header is one sentence again, carrying all nine ids. Six resurrected old-register lines in core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above them, are removed.
lusoris
added a commit
that referenced
this pull request
Sep 20, 2026
…cated core/test/meson.build registered test_log twice: #315 wired it in as an orphan test, and #531 added a second test() under a comment saying it had never been registered, so it ran twice in every fast-suite run. The second registration and its now-false comment go. Folding the stack duplicated two pieces of docs/state.md: the closed row for T-HIP-ADM-TESTS-STALE-SHOULD-FAIL, which master already carries from each stacked branch had revised in turn. The header is one sentence again, carrying all nine ids. Six resurrected old-register lines in core/src/feature/hip/AGENTS.md, exact duplicates of the paragraph above them, are removed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Bundles 5 sequential C++23 file-rename PRs into one coherent diff:
log.c → log.cpp— isolatedlog_cpp23_libstatic librarygpu_dispatch_env.c → gpu_dispatch_env.cpp—std::mutex+std::optionalopt.cppactivation +read_json_model.c → read_json_model.cppfeature_extractor.c → feature_extractor.cppcli_parse.c → cli_parse.cpp+vmaf.c → vmaf.cppEach TU compiles in an isolated C++23 static library. Public C ABI is preserved throughout via
extern "C"guards. All source.cfiles that were converted remain in tree as upstream-parity references but are not compiled.ADR-0108 Deliverables Checklist
extern "C"guards;.cppwave rule documented incore/src/AGENTS.md §10. Each converted.cfile remains as upstream-parity reference and must not be re-added tolibvmaf_sourcesor any testsources:list.meson setup core/build && ninja -C core/build && meson test -C core/build --suite=fastchangelog.d/refactor/cpp23-wave-bundle.mdConflict resolution notes
Applied via
git am --3wayin strict order. All conflicts were in documentation files (rebase-notes.md, state.md, ADR README.md, AGENTS.md files) that accumulated master additions after each source PR was opened. Code conflicts were resolved by keeping the HEAD (bundle-tip) side for code quality fixes and keeping both sides for additive documentation blocks. Post-application fixups applied per-PR:../src/log.c; replaced withlog_cpp23_test_objectsin objects arrays.test_gpu_dispatch_runtime) still referencedgpu_dispatch_env.c; switched togpu_dispatch_env_cpp23_libobjects.opt.candread_json_model.cremoved from all test source arrays (25 instances);wave8_cpp23_objectsadded to coverage tests;feature_collector.cpp(non-static public symbols) restored as the compiled source; ORT internal elem-type functions restored after conflict-resolution dropout.opt.hduplicateextern "C" {block fixed;feature_collector.cppre-pinned;test_predictsource array bracket restored.CLIModelConfigdesignated-initializer order corrected;VmafModelCollectionScoreTypeexplicit cast added.Build verification
All 5 PRs verified with
meson setup+ninja -C(CPU-only,enable_cuda=false enable_sycl=false) after each am step. 837 targets linked cleanly at final tip.🤖 Generated with Claude Code