open-standards/wai/format-probe-conformance/README.md
Transaction Science f5a242a9a2
All checks were successful
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 23s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 21s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 22s
wai-app and Create / wai-app · does this change touch it (push) Successful in 31s
WAI operation catalogue / does this change touch it (push) Successful in 20s
wai-audit collector and player integration / does this change touch it (push) Successful in 30s
wai-sink-swift native sink package / does this change touch it (push) Successful in 18s
wai-quantum studio and desktop / does this change touch it (push) Successful in 14s
wai-ledger service / does this change touch it (push) Successful in 45s
wai-fleet service / does this change touch it (push) Successful in 1m1s
wai-sink-android native sink library / does this change touch it (push) Successful in 19s
wai-quantum for JavaScript / does this change touch it (push) Successful in 51s
WAI Studio / does this change touch it (push) Successful in 52s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 2m14s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Successful in 5m12s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 5m30s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 7m13s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 27s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 41s
wai-audit collector and player integration / collector · linux (push) Successful in 2m30s
wai-ledger service / service · linux (push) Successful in 1m53s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m5s
wai-quantum studio and desktop / studio · browser (push) Successful in 4m38s
wai-quantum for JavaScript / javascript · linux (push) Successful in 3m51s
wai-fleet service / service · linux (push) Successful in 4m2s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 8m54s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 11m31s
WAI Studio / Studio in WebKit · linux (push) Successful in 13m53s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 9m58s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 1m1s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 2m17s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 8m46s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 5m29s
wai-ledger service / service · macos (push) Successful in 1m5s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 17m5s
wai-fleet service / service · macos (push) Successful in 44s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 8m34s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 18m3s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 12m15s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 1m46s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 9m10s
wai: header probes for AV2, AC-4, IAMF and IVAS, their codec strings, and why EVC has none
format-probes §14 to §17 add probes of basis `standard`, each read from its published text:

- AV2 (`wai.video.av2`, AV2 v1.0.0): the length-delimited bitstream of Annex B, the OBU
  headers, the temporal delimiter a payload begins with, and the first sequence header OBU
  through its cropping window: profile, level, tier, chroma format, bit depth, maximum and
  cropped size, layer counts, with Annex A's reserved profiles and levels and each profile's
  chroma formats refused. No codec string: AOMedia's ISO BMFF binding is a working draft.
- AC-4 (`wai.audio.ac4`, ETSI TS 103 190-1 V1.4.1 and -2 V1.3.1): sync frames with their CRC
  checked and the first table of contents to the first presentation's md_compat; the codec
  string of TS 103 190-2 E.13.
- IAMF (`wai.audio.iamf`, IAMF v2.0.0): a standalone IA Sequence, its profiles, the order of
  its Descriptors, the Opus, FLAC and LPCM configurations as §3.13 constrains them, the start of
  each audio element; the codec string of §6.4.
- IVAS (`wai.audio.ivas`, 3GPP TS 26.253 V19.3.0 Annex A): one IVAS payload's E and ToC bytes,
  frame sizes, processing information, padding and the first IVAS frame's format; `sivs`
  (TS 26.244 A.2.2).

§18 says why EVC has no probe: its framing, NAL unit types and SPS are in ISO/IEC 23094-1,
which is not openly readable, and RFC 9584 gives only the NAL unit header. §2.6 and
platform-decode §2.5: the probes' `codec`, which browser-sink §4.2's gate refuses, so no user
agent is asked; a native sink reads the string from the payload. SPEC §5 pins the payload forms
of AC-4, IAMF and IVAS to what their probes read. Nothing is added to the floor or the
recommended set.

format-probe-conformance: hand-built vectors with known field values under gen/av2, gen/ac4,
gen/iamf and gen/ivas, the texts' codec-string examples among them, and negative controls;
format_probe_verify.py reads them with its own readers and requires the new planted faults
(stated profiles, levels, versions, bit rates and codec strings, header bytes under restated
digests) to fail, as tests/format_probe.rs requires of corpus::verify.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-10 15:29:02 -05:00

5.4 KiB
Raw Permalink Blame History

format-probe-conformance — header probes

The corpus of extensions/format-probes.md §13 and of extensions/projection.md §7.

Feature equivalence. A conforming probe of a capability, given a vector's file, reaches the outcome vectors.json states for it: the parameters ({"accept": {...}}, the members each section of format-probes names) or the refusal ({"refuse": code}, a code of its §12). A conforming reader of the projection descriptor gives each binding of bindings its outcome (projection.md §5). Each fact of facts holds of its file's probe: what its encoder was asked for.

  • ext/ — vectors written by encoders, from synthetic pictures (tools/yuv.py):
    • vvc/ H.266 Main 10 at 64×64 and at 100×58 (a conformance window);
    • mvhevc/ an MV-HEVC bitstream of two views, and hevc/ its base layer;
    • jxs/ JPEG XS codestreams: 4:2:2 at 10 bits, R, G and B under the reversible colour transform, and a lossless 4:4:4 one; jxs-video/ three frames in wai.video.jxs's framing;
    • avs3/ an AVS3 video stream of three pictures.
  • gen/ — what wai_format_probe gen writes: LCEVC streams, MHAS streams, AVS3 audio frame headers, IEEE 1857.11 picture headers and projection descriptors from fixed values; AV2 length-delimited streams (av2/), AC-4 sync frames (ac4/), IA Sequences (iamf/) and IVAS payloads (ivas/), built from the syntax of format-probes §14 to §17 with known field values; and the negative controls, each a change to one vector, every code of §12 given.
  • vectors.json — every vector's capability, file, SHA-256, origin and outcome; the bindings; the facts; the probes and codes of §2.4 and §12; and the fetched LCEVC streams with what their encoder was asked for.
  • provenance.json — every external vector's encoder, input and command, its decodes (the output's size and SHA-256 under each decoder) and, for JPEG XS, whether the decoders agree.
  • fetch.sh — fetches five LCEVC streams by digest (format-probes §13.3).

Provenance. ext/ is written by tools/make_external.sh on the build host, from synthetic pictures tools/yuv.py writes (a ramp, a checker and a moving bar per plane; the second view of the stereo pair is the first shifted four columns), with these encoders and decoders, each at the revision the script pins and refuses to run without:

key role licence
vvc_enc, vvc_dec an open H.266 encoder and decoder BSD-3-Clause-Clear
jxs an open JPEG XS encoder and decoder BSD-2-Clause-Patent
jxs2 a second, independent JPEG XS decoder (a crate, without default features) MIT
mvhevc the MV-HEVC reference encoder and decoder of the joint video team BSD-3-Clause
avs3_enc an open AVS3 video encoder BSD-4-Clause
avs3_dec an open AVS3 video decoder BSD-3-Clause

The script names each repository and revision. None of their code or data is in this corpus: only the bitstreams they wrote from the synthetic pictures. gen/ is written by wai_format_probe gen from fixed values and from ext/; no permissively licensed encoder writes LCEVC, MPEG-H 3D Audio or AVS3 audio, so those vectors are the generator's, laid out as format-probes §6, §7 and §9 read them, and are not decodable streams. The fetched LCEVC streams are an open LCEVC decoder's unit-test streams (BSD-3-Clause-Clear), written by an LCEVC encoder from a short test sequence; their licence notice names their owner, so they are fetched by SHA-256 and not committed.

The AV2, AC-4, IAMF and IVAS vectors are the generator's alone: no encoder or decoder of those formats was run, and no third-party file is in the corpus. Each is laid out as format-probes §14 to §17 read it, from the published texts those sections name; past the fields the probes read they hold fixed filler bytes, so they are not decodable streams. Their codec strings include the texts' own examples (ac-4.02.01.03, ac-4.00.00.03, iamf.003.003.Opus).

Measured (provenance.json, on the arm64 build host): every H.266, MV-HEVC, H.265 and AVS3 vector decodes with its decoder, and the base layer of the MV-HEVC vector decodes to the same bytes alone as within the two-view stream. Every JPEG XS codestream decodes to identical bytes along the first decoder's C path and its SIMD path. The second decoder gives the same bytes on five of the six codestreams; it does not implement the MLS.12 profile of the lossless one (it refuses its Ppih), and on a copy whose Ppih and Plev are 0 its output differs, while the first decoder's output equals that vector's source picture, byte for byte. No x86 decode was measured.

Checks.

  • wai_format_probe verify . (from ../wai-rs, feature format_probe) and wai-rs/tests/format_probe.rs: every vector's digest and outcome, every binding and fact, the generated files byte for byte and no other file under gen/, and the extension's tables; with --fetched <dir>, the five fetched streams, every one required.

  • format_probe_verify.py, written from the two extensions and sharing no code with wai-rs: probes every vector, binding, fact and fetched stream itself, and requires every mutated copy of the corpus to fail, among them a stated AV2 profile and level, AC-4, IAMF and IVAS codec strings, and header bytes changed with their digests restated:

    bash fetch.sh /tmp/lcevc && python3 -I format_probe_verify.py . --fetched /tmp/lcevc