Some checks failed
wai-ops-gpu integer operators on GPUs / does this change touch it (push) Successful in 25s
WAI operation catalogue / does this change touch it (push) Successful in 34s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 40s
wai-det-jpegai WAISM float-level module of record / does this change touch it (push) Successful in 1m7s
wai-app and Create / wai-app · does this change touch it (push) Successful in 46s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 1m23s
wai-ops integer operators / does this change touch it (push) Successful in 35s
wai-quantum for JavaScript / does this change touch it (push) Successful in 31s
wai-sink-android native sink library / does this change touch it (push) Successful in 18s
wai-pack / wai-pack · does this change touch it (push) Successful in 33s
wai-ledger service / does this change touch it (push) Successful in 1m37s
joule-moq-http live HTTP egress / joule-moq-http · does this change touch it (push) Successful in 1m48s
wai-audit collector and player integration / does this change touch it (push) Successful in 1m44s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 1m47s
wai-key-proxy / does this change touch it (push) Successful in 1m38s
wai-fleet service / does this change touch it (push) Successful in 1m38s
WAI Studio / does this change touch it (push) Successful in 22s
wai-sink-swift native sink package / does this change touch it (push) Successful in 51s
wai-quantum studio and desktop / does this change touch it (push) Successful in 1m9s
wai-ops-gpu integer operators on GPUs / Vulkan GPUs (framework-128gb) (push) Successful in 9m59s
wai-ops-gpu integer operators on GPUs / Vulkan GPUs (jetson-hub) (push) Successful in 11m56s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Has been cancelled
WAI Studio / Studio in Chromium and Firefox · macos (push) Has been cancelled
WAI Studio / Studio in WebKit · linux (push) Has been cancelled
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Has been cancelled
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Has been cancelled
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Has been cancelled
wai-quantum studio and desktop / studio · browser (push) Has been cancelled
wai-quantum studio and desktop / desktop app · macos (push) Has been cancelled
wai-quantum studio and desktop / desktop app · linux (push) Has been cancelled
wai-quantum studio and desktop / desktop app · windows (push) Has been cancelled
wai-quantum for JavaScript / javascript · linux (push) Has been cancelled
wai-pack / wai-pack · linux (push) Has been cancelled
wai-pack / wai-pack · linux-arm64 (push) Has been cancelled
wai-pack / wai-pack · macos (push) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (push) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (push) Has been cancelled
wai-pack / wai-pack · dependency licences (push) Has been cancelled
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (push) Has been cancelled
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (push) Has been cancelled
wai-ledger service / service · linux (push) Has been cancelled
wai-ledger service / service · macos (push) Has been cancelled
wai-key-proxy / proxy · linux (push) Has been cancelled
wai-fleet service / service · linux (push) Has been cancelled
wai-fleet service / service · macos (push) Has been cancelled
WAI examples / WAI examples · does this change touch them (push) Has been cancelled
WAI examples / WAI examples · portable · linux (push) Has been cancelled
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (push) Has been cancelled
WAI examples / WAI examples · android-app · linux-arm64 (push) Has been cancelled
wai-det-jpegai WAISM float-level module of record / linux · both checkers, F1, F2 on wasmtime (Cranelift, Winch, Pulley) and Wasmi, the planted faults (push) Has been cancelled
wai-det-jpegai WAISM float-level module of record / linux-arm64 · both checkers, F1, F2 on wasmtime (Cranelift, Winch, Pulley) and Wasmi, the planted faults (push) Has been cancelled
WAI operation catalogue / the catalogue and every door · linux (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Has been cancelled
wai-audit collector and player integration / collector · linux (push) Has been cancelled
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Has been cancelled
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Has been cancelled
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Has been cancelled
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (push) Has been cancelled
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Has been cancelled
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Has been cancelled
joule-moq-http live HTTP egress / joule-moq-http, every target (push) Has been cancelled
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 37s
wai-ops integer operators / linux-aarch64 (push) Successful in 4m58s
wai-ops integer operators / wasm32-wasip2 (wasmtime) (push) Successful in 1m1s
wai-ops integer operators / independent checker (Python) (push) Successful in 26s
wai-ops integer operators / wasm32 under Node (push) Successful in 50s
wai-ops integer operators / linux-x86_64 (push) Successful in 3m6s
wai-ffmpeg / wai-ffmpeg · VLC 3.0.24 on the patched FFmpeg, playing the corpora (push) Failing after 4m37s
wai-gstreamer / wai-gstreamer · the plugin on a distribution's GStreamer (push) Failing after 5m59s
wai-ffmpeg / wai-ffmpeg · the series on FFmpeg 9.0.2, checked and fuzzed (push) Successful in 17m38s
wai-ops integer operators / macos-arm64 (push) Successful in 1m55s
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Successful in 9m49s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Successful in 15m49s
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Successful in 20m14s
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Successful in 14m1s
wai-quantum energy-landscape jobs / the same bits · macos (push) Successful in 12m3s
Completeness row C8. The exact decoder (jpegai_decode) decoded one configuration, the reference codestream's; every other trapped. With the jpegai/v1 bundle (tools_0, the high-operation-point synthesis, one eICCI pair) it now decodes: - pictures whose sides are 128, 192 or 256, any display cropping (the post-filters run on the displayed picture; eICCI pads a side to a multiple of 4 by repetition); - beta_displacement_log from -1069 to 702, the chroma one independent or not; - LSBS off per plane; residual variance scaling and GRFS both off, or GRFS alone (one band); - each post-filter off; eICCI on any plane subset with the bundle's pair; no colour transform. Held by 29 configuration vectors (wai-rs/tests/vectors/jpegai/configs/: synthetic pictures the reference software's encoder coded at each configuration, its rate search off, and header edits of them), each pinned to its RGB8 (the same digests on Linux x86_64 and macOS arm64), decoded the direct way to the same bits at every stage, and max|d| = 1 from the reference decoder's picture on 2.5% to 6.6% of samples (tests/jpegai_configs.rs; wai-jpegai-e2e.yml). Refused with a new code, configuration_undetermined (D74): residual variance scaling without GRFS (the reference dequantises it by an integer shift or a float division as its tables sit, and raises on a CPU) and a signalled colour matrix (a library inverse, applied by its first row alone; the reference raises before either). Everything else outside scope is refused as before, each with a vector or a header test showing where. Readings fixed (D74): the scale's incomplete 8x8 blocks pad with 1411; LEF samples its scale surface at the binary32 quotient's floor; no colour transform gives the decoded components. The float ONNX path keeps the reference codestream's configuration alone (check_reference_configuration). The scale path's text (integer-operators 13.6.1) gains the picture's sizes, beta and the RVS modes; 13.6.2 states the graphs' declared sizes as maxima. Second reader: tools/wai_jpegai_header.py (standard library) reads and writes the headers and gives each codestream's scope; tools/wai_jpegai_configs.py writes the manifest, checks that reader against it and holds decodes to the reference pictures; tools/wai_jpegai_make_vectors.py makes the vectors (the edits regenerate byte for byte). Planted faults (cfg(wai_planted), never in an ordinary build), each caught by the vectors: likely-pad-index, beta-after-likely, grfs-only-floor, rvs-mode-swap, lef-nearest-round, icci-pad-index, crop-index, icci-subset-swap, lsbs-off-ignored, ct0-order. Co-Authored-By: Claude Opus 5.5 <[email protected]>
50 lines
2.4 KiB
Rust
50 lines
2.4 KiB
Rust
//! The float ONNX path (`wai::neural::jpegai`) accepts one of the configurations the
|
||
//! exact decoder accepts, the reference codestream's (tools_0, β = 0, the
|
||
//! high-operation-point synthesis, one eICCI model pair, 256×256 4:4:4, every tool on;
|
||
//! `jpegai_decode::check_reference_configuration`), and a codestream outside it, one the
|
||
//! exact decoder decodes among them, is refused with `Unsupported` rather than decoded to
|
||
//! the wrong image.
|
||
//!
|
||
//! env: WAI_JPEGAI_ASSETS = the jpegai-vm-assets root (the ONNX model bundle).
|
||
//! Skips without it; no CI job provides it.
|
||
#![cfg(feature = "neural")]
|
||
|
||
use wai::neural::jpegai::{decode, JpegAiError, JpegAiModel};
|
||
|
||
const TEST256: &[u8] = include_bytes!("vectors/jpegai/test256.bin");
|
||
|
||
/// Overwrite `n` bits (MSB-first) at absolute bit `pos` with `value`.
|
||
fn set_bits(data: &mut [u8], pos: usize, n: usize, value: u64) {
|
||
for i in 0..n {
|
||
let bit = (value >> (n - 1 - i)) & 1;
|
||
let (byte, sh) = ((pos + i) / 8, 7 - (pos + i) % 8);
|
||
data[byte] = (data[byte] & !(1 << sh)) | ((bit as u8) << sh);
|
||
}
|
||
}
|
||
|
||
#[test]
|
||
fn ort_path_refuses_what_the_exact_decoder_refuses() {
|
||
let Ok(dir) = std::env::var("WAI_JPEGAI_ASSETS") else {
|
||
eprintln!("skip: set WAI_JPEGAI_ASSETS to the jpegai-vm-assets root");
|
||
return;
|
||
};
|
||
let model = JpegAiModel::load(&dir).expect("load the ONNX model bundle");
|
||
|
||
use wai::jpegai_bitstream::{find_segment, parse_container, parse_picture_header, Marker};
|
||
let pih = find_segment(&parse_container(TEST256), Marker::Pih).unwrap().start_bit();
|
||
// (field offset inside the PIH payload, width, new value, word the refusal names)
|
||
for (at, width, value, word) in [(90, 12, 2048 + 7, "β 0"), (85, 4, 1, "model_id")] {
|
||
let mut d = TEST256.to_vec();
|
||
set_bits(&mut d, pih + at, width, value);
|
||
let ph = parse_picture_header(&d, pih);
|
||
assert!(ph.beta_displacement_log != [0, 0] || ph.model_id != 0, "the edit hit a field");
|
||
match decode(&d, &model) {
|
||
Err(JpegAiError::Unsupported(why)) => assert!(why.contains(word), "{why}"),
|
||
Err(e) => panic!("expected Unsupported naming {word}, got {e}"),
|
||
Ok(_) => panic!("an out-of-scope codestream ({word}) was decoded"),
|
||
}
|
||
}
|
||
|
||
let img = decode(TEST256, &model).expect("the in-scope codestream decodes");
|
||
assert_eq!((img.width, img.height), (256, 256));
|
||
}
|