open-standards/wai/wai-rs/tests/carriage.rs
Transaction Science eacf33dd6a Merge B3b #430 (gain maps, ST 2094-50 and exact tone mapping) into train/wai-c
Merged head 17ff17d84f.

By meaning:
- codecs/mod.rs: is_companion_only lists the HDR descriptors, the gain map,
  LCEVC and both DRED layers; the licence test's patent-pool list keeps
  DRED's and the HDR companions' entries.
- tests/carriage.rs: base_of() (DRED's) gains B3b's gain-map case, an
  image base (wai.image.png); the test reads the base from base_of() as
  DRED left it.
- SPEC §7.1: the companion list names the HDR descriptors with ST 2094-50,
  the gain map, LCEVC and the DRED layers; rule 2 keeps the gain map's
  image class and DRED's base admission side by side.
- determinism-tiers §2: exact-upscale's paragraph (pinned integer
  derivations keep the tier), then B3b's (HDR display adaptation, pinned
  by exact-tonemap).
- wai-conformance.yml: paths unioned; the step that conflicted is rebuilt
  as two whole steps, QoE aggregation's then exact tone mapping's.
- Shared lists kept both sides: CHANGELOG (B3b's entry on top), REGISTRY
  rows in order, registry constants and wire identifiers, the
  live-conformance index (tonemap/ row, its provenance sentence, its
  verifier line). capabilities.json and v2.ttl taken from the PR and
  regenerated next.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 07:10:29 -04:00

212 lines
11 KiB
Rust

//! Carriage conformance — WAI's universal job, proven for EVERY registered
//! capability: wrap a payload under the capability, write the envelope, read it
//! back, and the payload survives **byte-identically** (§2: payload = the named
//! codec's canonical bytes, carried verbatim), the envelope passes the role check
//! (a candidate fails the candidate check, SPEC §5), and the registry reports a
//! fidelity tier + a license class for it.
//!
//! This is the honest meaning of "WAI handles all of them": WAI *carries* the
//! canonical bytes and *names* the decoder — it does not re-implement the
//! codec. The payload here is opaque test bytes; that it is opaque is the
//! point — the same envelope carries a JPEG 2000 codestream, an IAMF stream, a
//! Draco buffer, or a proprietary AC-4 frame identically. Real end-to-end
//! decode of the open formats (JPEG 2000 via OpenJPEG, IAMF via ffmpeg) is
//! demonstrated in tools/wai_carriage_demo.sh.
//!
//! A companion-only capability (HDR dynamic metadata, an LCEVC enhancement) is
//! carried the only way SPEC §5 allows: as a `WAI2` companion bound to a base
//! rendition. As a `WAI1` capability it still survives the wire (parsing is
//! format-agnostic) but fails the role check. The converse holds for every
//! other registered capability: marked companion, it survives the wire and
//! fails the role check (SPEC §7.1, rule 1).
//!
//! Pure container + registry — no codec feature required, so it runs in the
//! same no-system-deps matrix as the cargo classes.
use wai::codecs::{
capability_license, capability_media, capability_tier, is_candidate, is_companion_only,
is_known_capability, is_refinement_only, known_capabilities, Media,
};
use wai::container::{Rendition, RoleError, WaiMulti};
use wai::{Conditioning, Manifest, ModelRequirement, Wai};
fn media_for(cap: &str) -> &'static str {
capability_media(cap).map_or("binary", Media::label)
}
/// A representative payload for a capability — arbitrary bytes whose exact
/// reproduction through the envelope is the thing under test. Sized and seeded
/// off the capability so each class carries distinct content.
fn payload_for(cap: &str, n: usize) -> Vec<u8> {
let seed = cap.bytes().fold(0x1234_5678u32, |a, b| a.wrapping_mul(31).wrapping_add(b as u32));
let mut s = seed | 1;
(0..n)
.map(|_| {
s ^= s << 13;
s ^= s >> 17;
s ^= s << 5;
(s & 0xff) as u8
})
.collect()
}
fn wrap(cap: &str, payload: Vec<u8>) -> Wai {
Wai::new(
Manifest::new(
media_for(cap),
"replicate",
ModelRequirement::new(cap).with_fallback("wai.image.png"),
Conditioning::new("bytes"),
),
payload,
)
}
/// A refinement-only capability in the form SPEC §5 allows: a `WAI1` with `refines`
/// and no fallback (`extensions/staged-delivery.md` §3).
fn wrap_refinement(cap: &str, payload: Vec<u8>) -> Wai {
let h = "a".repeat(64);
let mut m = Manifest::new(media_for(cap), "replicate", ModelRequirement::new(cap), Conditioning::new("wir1"));
m.refines = Some(serde_json::json!({"base": h, "prev": h, "layer": 1}));
Wai::new(m, payload)
}
/// The base a companion-only capability binds to in these tests (SPEC §7.1, rule 2; SPEC §5,
/// *Base admission*): a video rendition for the descriptors and LCEVC, an image for the gain
/// map, which is a companion of an image, and one Opus packet for the two DRED enhancement
/// layers, whose one base it is.
fn base_of(cap: &str) -> (&'static str, &'static str, &'static str) {
if wai::codecs::admits(cap, "wai.audio.opus.packet") {
("wai.audio.opus.packet", "audio", "opus")
} else if cap == "wai.meta.gainmap" {
("wai.image.png", media_for("wai.image.png"), "png")
} else {
("wai.video.hevc", "video", "hevc")
}
}
/// A companion-only capability in the form SPEC §5 allows: a `WAI2` companion
/// bound to a base rendition of a capability it applies to (`base_of`). Returns the
/// parsed envelope.
fn wrap_companion(cap: &str, payload: Vec<u8>) -> WaiMulti {
let (b, media, label) = base_of(cap);
let base = payload_for(b, 64);
let env = WaiMulti::new(media, "replicate", serde_json::Value::Null, vec![
Rendition::media(b, label, base),
Rendition::companion(cap, payload, b),
]);
WaiMulti::from_bytes(&env.to_bytes().expect("serialize envelope")).expect("parse envelope")
}
#[test]
fn every_registered_capability_carries_bytes_byte_exact() {
let mut n_checked = 0;
for &cap in known_capabilities() {
// a few payload sizes incl. 0 (empty) and a chunky one
for &len in &[0usize, 1, 31, 4096, 65537] {
let payload = payload_for(cap, len);
if is_companion_only(cap) {
let back = wrap_companion(cap, payload.clone());
let (base, _, _) = base_of(cap);
assert_eq!(back.check_component_roles(), Ok(()), "{cap}: companion carriage must conform");
let bound = back.companions_of(base);
assert_eq!(bound.len(), 1, "{cap}: companion not bound to its base");
assert_eq!(bound[0].0.capability, cap, "{cap}: capability not preserved");
assert_eq!(bound[0].1, payload.as_slice(), "{cap}: payload not carried byte-identically at {len} B");
assert_eq!(back.primary(wai::container::no_parameter_sets()).unwrap().meta.capability,
base, "{cap}: companion was selectable");
assert!(capability_tier(cap).is_some(), "{cap}: no fidelity tier");
assert!(capability_license(cap).is_some(), "{cap}: no license class");
continue;
}
if is_refinement_only(cap) {
let back = Wai::from_bytes(&wrap_refinement(cap, payload.clone()).to_bytes().expect("serialize")).expect("parse");
assert_eq!(back.check_component_roles(), Ok(()), "{cap}: refinement carriage must conform");
assert_eq!(back.payload, payload, "{cap}: payload not carried byte-identically at {len} B");
assert_eq!(back.refines().map(|r| r.map(|r| r.layer)), Some(Ok(1)), "{cap}: refines not preserved");
assert!(capability_tier(cap).is_some() && capability_license(cap).is_some(), "{cap}: unclassified");
continue;
}
let env = wrap(cap, payload.clone());
let bytes = env.to_bytes().expect("serialize envelope");
let back = Wai::from_bytes(&bytes).expect("parse envelope");
assert_eq!(back.check_component_roles(), Ok(()), "{cap}: standalone WAI1 must conform");
assert_eq!(back.payload, payload, "{cap}: payload not carried byte-identically at {len} B");
assert_eq!(back.capability(), cap, "{cap}: capability not preserved");
assert_eq!(back.fallback(), Some("wai.image.png"), "{cap}: fallback not preserved");
// A candidate still carries byte-exact, and the candidate check reports it.
assert_eq!(back.check_candidates().is_ok(), !is_candidate(cap), "{cap}");
// the registry classifies it (tier + license) — what makes the
// per-title fidelity/royalty choice auditable.
assert!(capability_tier(cap).is_some(), "{cap}: no fidelity tier");
assert!(capability_license(cap).is_some(), "{cap}: no license class");
}
n_checked += 1;
}
assert!(n_checked >= 50, "expected the full registry, got {n_checked}");
}
#[test]
fn dispatch_distinguishes_known_from_unknown() {
// the floor + the immersive/cinema/volumetric/haptics classes + the
// broadcast and streaming codecs are known
for cap in [
"wai.image.png", "wai.audio.iamf", "wai.image.jp2", "wai.mesh.draco",
"wai.pc.gpcc", "wai.haptic.mihs", "wai.meta.hdr10plus", "wai.audio.ac4",
"wai.video.av2", "wai.video.vvc", "wai.video.hevc", "wai.video.avc", "wai.video.vp9",
"wai.video.evc", "wai.video.evc.baseline", "wai.video.avs3", "wai.video.lcevc",
"wai.audio.mpegh", "wai.audio.avs3", "wai.audio.aac",
"wai.video.vp8", "wai.audio.opus.packet",
] {
assert!(is_known_capability(cap), "{cap} should be registered");
let env = wrap(cap, payload_for(cap, 128));
let back = Wai::from_bytes(&env.to_bytes().unwrap()).unwrap();
assert_eq!(back.capability(), cap);
// The v1.0 role check separates a standalone payload from a
// companion-only one, which a WAI1 cannot carry conformantly.
assert_eq!(back.check_component_roles().is_ok(), !is_companion_only(cap), "{cap}");
}
// an unregistered capability is still CARRIED (the envelope is
// format-agnostic) but is NOT known — a sink returns the loud
// missing-capability error rather than guessing.
let env = wrap("wai.image.nope", payload_for("x", 64));
let back = Wai::from_bytes(&env.to_bytes().unwrap()).unwrap();
assert_eq!(back.capability(), "wai.image.nope");
assert!(!is_known_capability(back.capability()));
}
#[test]
fn no_standalone_capability_is_carried_as_a_companion() {
// SPEC §7.1, rule 1: every registered capability that is not companion-only
// is standalone media. Bound as a companion to a video base it still
// survives the wire byte-exact, and the role check reports it.
let mut n_checked = 0;
for &cap in known_capabilities() {
if is_companion_only(cap) {
continue;
}
let payload = payload_for(cap, 257);
if is_refinement_only(cap) {
// A refinement is not standalone media either: carried as a companion, the
// role check reports it as a refinement-only capability in another role.
let env = WaiMulti::new("video", "replicate", serde_json::Value::Null, vec![
Rendition::media("wai.video.hevc", "hevc", payload_for("wai.video.hevc", 64)),
Rendition::companion(cap, payload.clone(), "wai.video.hevc"),
]);
let back = WaiMulti::from_bytes(&env.to_bytes().expect("serialize envelope")).expect("parse envelope");
assert_eq!(back.check_component_roles(),
Err(RoleError::RefinementOnlyAsComponent { index: 1, capability: cap.into() }), "{cap}");
continue;
}
let env = WaiMulti::new("video", "replicate", serde_json::Value::Null, vec![
Rendition::media("wai.video.hevc", "hevc", payload_for("wai.video.hevc", 64)),
Rendition::companion(cap, payload.clone(), "wai.video.hevc"),
]);
let back = WaiMulti::from_bytes(&env.to_bytes().expect("serialize envelope")).expect("parse envelope");
assert_eq!(back.companions()[0].1, payload.as_slice(), "{cap}: payload not carried byte-identically");
assert_eq!(back.check_component_roles(),
Err(RoleError::StandaloneAsCompanion { index: 1, capability: cap.into() }), "{cap}");
n_checked += 1;
}
assert!(n_checked >= 50, "expected the full registry, got {n_checked}");
}