Classical ladder
AV1 and H.264 at several rates · 256 × 128 · this browser's player
Each cell is one piece; it names the rung its fragment came from.
Both panes start from the same 256 × 128 frames of an open film. On the left, a classical ladder: AV1 and H.264 bitstreams at several rates, played by this browser's own player. On the right, a WAI package of the same excerpt, which holds every piece twice: as an AV1 bitstream inside a WAI object, and as an object of WAI's integer video codec. By default every piece of this natural video travels as the standard codestream, AV1, which this browser's own decoder rebuilds. The integer rendition is there to show a byte-exact rebuild: the integer lane plays every piece that way, with its real bytes.
This tab checks every object against the package's stage index before it decodes it, rebuilds it, and checks every rebuilt frame against the hash the standard's native decoder recorded for the same bytes. A mismatch is refused and the piece's other rendition plays. Bytes are counted as they arrive, quality is computed against the source frames, and decode time is timed on this device.
Media credit: loading…
A change of delivery applies when playback starts again: reload the page to start over.
AV1 and H.264 at several rates · 256 × 128 · this browser's player
Each cell is one piece; it names the rung its fragment came from.
A representation chosen per piece · rebuilt and checked in this tab
int: integer rendition (wai.video.int_motion) · AV1: AV1 rendition (wai.video.av1) · ✓n: frames equal to the native reference · ✗→: the first rendition was refused.
This browser does not decode AV1 through WebCodecs, so the WAI pane takes every piece's integer rendition: a sink never takes a rendition it cannot decode.
This browser has no WebCodecs: the classical pane plays, but its pictures cannot be measured, and the WAI pane takes only integer renditions.
Loading the catalog…
wai.video.av1), and an object of WAI's integer video codec (wai.video.int_motion), which predicts each frame from the one before it and codes an integer residual for every pixel and channel, without a transform.byte-exact; this excerpt has none), where this browser cannot decode AV1, or, live, where only the integer rendition can arrive before the piece plays.Every value is computed in this tab from what it received and rebuilt, and updates as the panes play. Open a row's name for its formula.
| Measure | Classical ladder | WAI cargo |
|---|---|---|
| Bytes | ||
Cargo receivedThe sum of the bytes read from each response body for this pane's media: fragments on the left; objects on the right, refused objects included. | — | — |
SplitLeft: by rung. Right: by rendition, with the count of objects, and the objects refused. | — | — |
Around the coded picturesLeft: each fragment's bytes less its samples' bytes (the moof and the mdat header), read from the fragment. Right: each accepted object's bytes less its payload (the envelope's header and manifest), read by the standard's envelope parser. | — | — |
Rate8 × cargo received ÷ the seconds of media it covers; bits per pixel = 8 × cargo ÷ (frames × 256 × 128). | — | — |
ControlLeft: the initialization segment of each rung played. Right: the package receipt, the stage index and the class's stage view. | — | — |
Decoder installLeft: the browser's own decoders. Right: the standard's WebAssembly binding, counted as fetched, and its glue, read from Resource Timing because it arrives as a module import. | Built into this browser · 0 B fetched | — |
Bytes to first frameEvery byte this pane had received, install included, when its first frame could be shown. | — | — |
| Quality, against the source frames | ||
Luma PSNR10 · log10(255² · N / SSE), with SSE the integer sum of squared luma differences, Y = (77R + 150G + 29B + 128) >> 8, over the N luma samples of the frames measured (staged-measurement extension §4.2, computed by the standard's WebAssembly). The lowest single frame is in brackets. | — | — |
RGB PSNRThe same over the three RGB channels. | — | — |
Luma SSIMThe mean structural similarity of the luma planes, 8 × 8 windows at a stride of 4, in integer arithmetic (staged-measurement §4.2). | — | — |
CoverageFrames measured, of the frames received. Sampled measures every 8th frame of each piece, from its first. | — | — |
| Work on this device | ||
Decode timeLeft: WebCodecs, from the first decode call until the decoder has flushed the piece, per frame (the player decodes separately). Right: per rendition, the WebAssembly decode call, or WebCodecs for the AV1 rendition, per frame; hashing and colour conversion are not included. | — | — |
Time to first frameFrom the press of Start until this pane could show its first frame. | — | — |
StallsTime the clock ran while this pane had no frame for it, and frames skipped to catch up. The clock never waits for one pane once both have started. | — | — |
Live latencyLive only: wall time now less the time the frame on screen was captured, on the live schedule. | — | — |
| Integrity | ||
Per-frame identityEach rebuilt frame's SHA-256 (RGB8, SPEC §7 Digests) against the native reference's for the same object. | No reference hash travels with these fragments; not checked | — |
ObjectsEach object's content hash, BLAKE3 over "moq-jwp:object", 0x01 and the envelope (jwp-receipts §2.1), against its stage-index entry; objects refused; pieces that played their other rendition. | — | — |
| Energy | ||
| Energy | Not metered | Not metered. This page reads no energy counter; a figure appears here only with its acquisition class. |
One point per lane this tab has played, placed by the bytes it received and the luma PSNR it measured. Nothing is plotted until it is measured.
No point measured yet.
| Lane | Bits per pixel | Luma PSNR, dB | Measured over | Source |
|---|
| Piece | Rendition, and why | Bytes | Content hash | Frames | Decode |
|---|
No object received yet.
1150a34fd4680eccd3c8ed16b8267d5d5d05ac00861275877abdfd34c87fdab4did:key:z6MkidwefKbYphRGMMGYaRrcunXQBMkfoc6GXGKhkPGbqfFUnot read yet9dfcb876d2159281d39fb7980678dddcf0ad2a6e4e1596f6b63d0300e6546878The receipt's Ed25519 signature was checked before publication by wai-pack verify and by the packaging corpus's independent verifier (pack_verify.py: 151/151 checks hold). This tab checks the stage index against the digest the receipt binds, and every object against the index; it does not check the signature.
—. The media credit and the licence are above and in the asset folder.wai.pack.scenecut/1); every rung and both renditions have a key frame at each piece's first frame.av01.0.00M.08.av01.0.00M.08.av01.0.00M.08.avc1.64000C.avc1.64000C.avc1.64000C.int_video_enc, through wai-pack pack): 16 × 16 blocks, half-pel motion within ±4 pixels, and the largest step among 16, 12 and 8 whose mean squared error per sample is at most 12 (packaging §5.6).wai-pack (builtin:wai-pack@0.1.0), verified by wai-pack verify: ok (pack digest 7cce0205b8cfd19f017b90173223c9b96a0855d812a8bf7d547cc70967b67dfd) and pack_verify.py: 151/151 checks hold. Its policy, whose digest the receipt binds:schema = "wai.pack.policy/1"
asset_id = "cargo-v1"
royalty_free_only = true
lead = "v"
[[component]]
id = "v"
media = "video"
source = "excerpt.y4m"
[component.timebase]
num = 24
den = 1
[segmentation]
target_ms = 2000
min_ms = 1000
max_ms = 2000
[[ladder]]
id = "int_motion"
component = "v"
capability = "wai.video.int_motion"
role = "base"
params = { block = 16, search = 4, mv_precision = 2, q_candidates = [16, 12, 8], max_sse_px_milli = 12000 }
[[ladder]]
id = "av1_floor"
component = "v"
capability = "wai.video.av1"
role = "floor"
params = { source = "supplied" }
[floor]
supplied_listing = "e68c698fc39f397cb654552a858474f055adc39e8cea1d59272bdb33d96c6033"
[[class]]
id = "per-piece"
floor_only = true
[[class]]
id = "integer"
max_layer = 0
248846f13f2d, the commit every tool above was built from; native reference hashes from wai stage apply --json (integer) and wai decode (AV1, libdav1d) at that commit.computed once installed; WebCodecs for AV1 and H.264, preferring this browser's software decoders. The catalog's SHA-256 is not fetched yet; this page pins 2f9c7721f2bba1a88e7b52dea2e155d2ebb5f1053ddeac4659c73c047cebd742.ffmpeg -nostdin -v error -y -i <source> -map 0:v:0 -frames:v 474 -vf crop=1920:960:0:60,scale=256:128:flags=lanczos+accurate_rnd+full_chroma_int -pix_fmt yuv420p -f yuv4mpegpipe <work>/pack-in/excerpt.y4m wai-pack plan --policy <work>/pack-in/plan-policy.toml --component v --out <work>/plan-v.txt ffmpeg -nostdin -v info -hide_banner -y -i <work>/pack-in/excerpt.y4m -c:v libsvtav1 -preset 4 -crf 40 -g 100000 -force_key_frames 'expr:eq(n,0)+eq(n,48)+eq(n,96)+eq(n,144)+eq(n,192)+eq(n,240)+eq(n,285)+eq(n,333)+eq(n,378)+eq(n,426)' -svtav1-params scd=0:keyint=-1 -vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -f obu <work>/pack-in/floor/v.obu wai-pack listing <work>/pack-in/floor wai-pack policy <work>/pack-in/policy.toml ffmpeg -nostdin -v error -y -i <work>/pack-in/excerpt.y4m -c:v libsvtav1 -preset 4 -crf 50 -g 100000 -force_key_frames 'expr:eq(n,0)+eq(n,48)+eq(n,96)+eq(n,144)+eq(n,192)+eq(n,240)+eq(n,285)+eq(n,333)+eq(n,378)+eq(n,426)' -svtav1-params scd=0:keyint=-1 -vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -an -movflags +frag_keyframe+empty_moov+default_base_moof -f mp4 <work>/av1-crf50.mp4 ffmpeg -nostdin -v error -y -i <work>/pack-in/excerpt.y4m -c:v libsvtav1 -preset 4 -crf 30 -g 100000 -force_key_frames 'expr:eq(n,0)+eq(n,48)+eq(n,96)+eq(n,144)+eq(n,192)+eq(n,240)+eq(n,285)+eq(n,333)+eq(n,378)+eq(n,426)' -svtav1-params scd=0:keyint=-1 -vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -an -movflags +frag_keyframe+empty_moov+default_base_moof -f mp4 <work>/av1-crf30.mp4 ffmpeg -nostdin -v error -y -i <work>/pack-in/excerpt.y4m -c:v libx264 -preset slower -tune animation -profile:v high -crf 34 -g 100000 -sc_threshold 0 -force_key_frames 'expr:eq(n,0)+eq(n,48)+eq(n,96)+eq(n,144)+eq(n,192)+eq(n,240)+eq(n,285)+eq(n,333)+eq(n,378)+eq(n,426)' -x264-params open-gop=0 -vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -an -movflags +frag_keyframe+empty_moov+default_base_moof+negative_cts_offsets -f mp4 <work>/avc-crf34.mp4 ffmpeg -nostdin -v error -y -i <work>/pack-in/excerpt.y4m -c:v libx264 -preset slower -tune animation -profile:v high -crf 28 -g 100000 -sc_threshold 0 -force_key_frames 'expr:eq(n,0)+eq(n,48)+eq(n,96)+eq(n,144)+eq(n,192)+eq(n,240)+eq(n,285)+eq(n,333)+eq(n,378)+eq(n,426)' -x264-params open-gop=0 -vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -an -movflags +frag_keyframe+empty_moov+default_base_moof+negative_cts_offsets -f mp4 <work>/avc-crf28.mp4 ffmpeg -nostdin -v error -y -i <work>/pack-in/excerpt.y4m -c:v libx264 -preset slower -tune animation -profile:v high -crf 22 -g 100000 -sc_threshold 0 -force_key_frames 'expr:eq(n,0)+eq(n,48)+eq(n,96)+eq(n,144)+eq(n,192)+eq(n,240)+eq(n,285)+eq(n,333)+eq(n,378)+eq(n,426)' -x264-params open-gop=0 -vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709:range=tv -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -an -movflags +frag_keyframe+empty_moov+default_base_moof+negative_cts_offsets -f mp4 <work>/avc-crf22.mp4 ffmpeg -nostdin -v error -y -i <source> -map 0:a:0 -t 19.75 -ac 2 -c:a aac -b:a 128k -movflags +faststart <out>/audio/excerpt.m4a wai-pack pack --policy <work>/pack-in/policy.toml --out <out>/package --key <seed> wai-pack verify <out>/package /Volumes/macos_4TB_external_1/tmp/cargo-source/venv/bin/python <work>/pack_verify_driver.py <open-standards>/wai/pack-conformance <work>/pack-verify <out>/package wai stage apply <out>/package/objects/25aedd58d75bdbfdd9bd40e3fd43616bd10b55d10644abfe2ba7a5be427733f5.wai --json wai decode <out>/package/objects/1a94d205237b6b3870556eb2e9a2807e30119e61286e7c345890860e96d9b152.wai -o <work>/native/1a94d205237b6b3870556eb2e9a2807e30119e61286e7c345890860e96d9b152.rgb wai stage apply <out>/package/objects/5f5f2f6416eb701bbdd20ebcf8c21a1a41c0c3b813b9fd87918d7e1c3b5098da.wai --json wai decode <out>/package/objects/7a2c8e1f672f1d183645f5d04c6261eb3eacf80c51cbf961071bf0c47897ad43.wai -o <work>/native/7a2c8e1f672f1d183645f5d04c6261eb3eacf80c51cbf961071bf0c47897ad43.rgb wai stage apply <out>/package/objects/c4dd0f1f6e1761a05eef733c634114a1d46ef49b6b9cf148f5c51174a6b250aa.wai --json wai decode <out>/package/objects/ad4cecfdd294df2bc05f8579511dbdd5d2b23f16cc597ac292c182e715f138e3.wai -o <work>/native/ad4cecfdd294df2bc05f8579511dbdd5d2b23f16cc597ac292c182e715f138e3.rgb wai stage apply <out>/package/objects/4e94ee18d6c83300ebc4f65c8beb139631ab155376d63a8022acd7ec73e0703a.wai --json wai decode <out>/package/objects/d7b27348ee12268f453dd8e978e68fb01040afbe9159ec391af4b6e94959774d.wai -o <work>/native/d7b27348ee12268f453dd8e978e68fb01040afbe9159ec391af4b6e94959774d.rgb wai stage apply <out>/package/objects/d705e8b43bac55c467d0f6eb859975d1878f3095fb4294755743acad0d463112.wai --json wai decode <out>/package/objects/bb0015f5b38de62401686e08ee6f68b132eadabb457971387331bdbef6b4d62a.wai -o <work>/native/bb0015f5b38de62401686e08ee6f68b132eadabb457971387331bdbef6b4d62a.rgb wai stage apply <out>/package/objects/fbdb8658f43474d2a1867f2d1e16adca0867445d77762ebf781dbbb2d78c8ec5.wai --json wai decode <out>/package/objects/64e11beed01130a31878f09992b0c705cade90d318adf5d179d7d20d6e4a6adf.wai -o <work>/native/64e11beed01130a31878f09992b0c705cade90d318adf5d179d7d20d6e4a6adf.rgb wai stage apply <out>/package/objects/f6a4eb98f97f93498b2cd7f89381a4d6262dcd8480f14338037a26e322ae2496.wai --json wai decode <out>/package/objects/642769e868e2ec5f0760866b3d38bbab899324da7eae9a45a3b3dca5153bea2b.wai -o <work>/native/642769e868e2ec5f0760866b3d38bbab899324da7eae9a45a3b3dca5153bea2b.rgb wai stage apply <out>/package/objects/eab99e018b332a417b00144b153822a75e28723a5766456c83c7fae66628bac9.wai --json wai decode <out>/package/objects/518219b3b3f9c6fe252c16e42843d08f0faa147c1653f128b5b36575b1ba9444.wai -o <work>/native/518219b3b3f9c6fe252c16e42843d08f0faa147c1653f128b5b36575b1ba9444.rgb wai stage apply <out>/package/objects/db9ac577c6d2e4e0e8399ca81bcf4a1828727fb4e1511db481f19be3a9c4228a.wai --json wai decode <out>/package/objects/18888421f0560dea67678366371fa9176d1aeb7093549a46a93f5689b1ea2f42.wai -o <work>/native/18888421f0560dea67678366371fa9176d1aeb7093549a46a93f5689b1ea2f42.rgb wai stage apply <out>/package/objects/668740fe5acd3c149a4c57fa2d919b348f10dd77729ac28d37fdf7c18402c592.wai --json wai decode <out>/package/objects/2541789fceda7c9ef6ed238bc2ab018f30c695a13fc72261688acc396d8fc778.wai -o <work>/native/2541789fceda7c9ef6ed238bc2ab018f30c695a13fc72261688acc396d8fc778.rgb