Skip to main content
This page is the demo

One source. Two kinds of cargo.
Every number here is measured in this tab.

In the standard· the standard codestream inside WAI objects In the standard· integer video, frame by frame against the native reference In the standard· AV1 inside WAI objects In the standard· refusal and fallback Building· staged delivery on this page Roadmap· synthetic pieces as instructions
wai.video.int_motion wai.video.av1 decode-equivalence

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…

The path both panes take

  1. 01 Encode

    Encode

    Classical
    Codes every rung of the ladder from the source.
    WAI
    Splits the content into pieces and names the capability that rebuilds each.

  2. 02 Origin

    Origin

    Classical
    Stores every rung.
    WAI
    Stores one object per piece with its content hash; identical segments are stored once.

  3. 03 Edge

    Edge

    Classical
    Caches and serves fragments.
    WAI
    Forwards objects and their receipts byte for byte, and serves the tracks a sink subscribes to.

  4. 04 Last mile

    Last mile

    Classical
    Carries the rung the player picked.
    WAI
    Carries the pieces the sink picked — a base first, refinements after.

  5. 05 Device

    Device

    Classical
    Decodes for display.
    WAI
    Rebuilds each piece, checks it by hash, refuses a mismatch and falls back to another rendition.

The two panes

Delivery
WAI class
Advanced

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.

    WAI cargo

    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.

      0:00.00 · frame 1 of 474 Drift —

      Loading the catalog…

      What each pane does

      Classical ladder

      • Each rung is a complete encode of the excerpt at one rate, with a key frame at the start of every piece; the player takes a rung for each piece.
      • Pictures are coded as transform coefficients; colour is stored at half resolution (4:2:0), as the source holds it.
      • The decoder is part of this browser; nothing is fetched to install it.
      • The fragments carry no decoded-picture hash, so this page cannot check a decoded picture against a reference.

      WAI cargo

      • The package holds two renditions of every piece: an AV1 bitstream inside a WAI object (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.
      • A class of the package's policy says which rendition each piece travels as (packaging extension §8.1), and the policy's digest is in the signed package receipt. Class per-piece, the default, lists every piece's standard rendition: natural video travels as the registered standard codestream, AV1, rebuilt by this browser's decoder and checked frame by frame here. The sink takes a piece's integer rendition instead only where the policy marks the piece for a byte-exact rebuild (a moment tagged 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.
      • Class integer is the byte-exact lane: every piece's integer rendition, rebuilt in integer arithmetic by the standard's WebAssembly, so each frame reproduces the native decoder's bytes on any machine. The ledger shows what that costs in bytes on this film.
      • This tab checks each object's content hash against the stage index, whose digest the receipt binds, before it decodes anything.
      • It checks every rebuilt frame's SHA-256 against the hash the standard's native decoder recorded for the same bytes. The integer rendition is integer arithmetic end to end, and AV1 decoding is exact by its specification, so both reproduce here. An object that does not match is refused, and the piece's other rendition plays.

      The ledger

      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.

      Measured in this tab, for each pane
      MeasureClassical ladderWAI 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
      EnergyNot meteredNot metered. This page reads no energy counter; a figure appears here only with its acquisition class.

      Rate and quality, as measured

      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.

      classical AV1 classical H.264 WAI integer rendition WAI AV1 rendition

      No point measured yet.

      Fetches and measures every rung and both WAI renditions over every piece (about 8.2 MB, declared by the catalog). These are counted as measurement, never as either pane's cargo.
      The chart as a table
      LaneBits per pixelLuma PSNR, dBMeasured overSource

      Every WAI object, as checked

      PieceRendition, and whyBytesContent hashFramesDecode

      No object received yet.

      Package receipt
      1150a34fd4680eccd3c8ed16b8267d5d5d05ac00861275877abdfd34c87fdab4
      Signed by
      did:key:z6MkidwefKbYphRGMMGYaRrcunXQBMkfoc6GXGKhkPGbqfFU
      Stage index digest
      not read yet
      Policy digest
      9dfcb876d2159281d39fb7980678dddcf0ad2a6e4e1596f6b63d0300e6546878

      The 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.

      Method and provenance

      The source
      • One film file from its publisher's download: —; SHA-256 —. The media credit and the licence are above and in the asset folder.
      • The excerpt: frames 0 to 473 (19.75 seconds at 24 frames per second), the middle 2:1 of the picture scaled to 256 × 128 by Lanczos in the 4:2:0 domain, so no colour matrix is assumed. On-screen text: —
      • The source is the 4:2:0 picture; RGB is its conversion by the packaging extension §4.7 (BT.709, limited range), which the integer rendition is coded against and every pane's quality is measured against.
      • 10 pieces of 48 or 45 frames (at most 2 seconds, cut early at a scene change by wai.pack.scenecut/1); every rung and both renditions have a key frame at each piece's first frame.
      The encodes
      • AV1 · CRF 50: SVT-AV1 v4.2.0, preset 4, CRF 50; codecs av01.0.00M.08.
      • AV1 · CRF 40 (also the WAI package's AV1 rendition): SVT-AV1 v4.2.0, preset 4, CRF 40; codecs av01.0.00M.08.
      • AV1 · CRF 30: SVT-AV1 v4.2.0, preset 4, CRF 30; codecs av01.0.00M.08.
      • H.264 · CRF 34: x264 - core 165 r3222 b35605a, preset slower, tune animation, CRF 34; codecs avc1.64000C.
      • H.264 · CRF 28: x264 - core 165 r3222 b35605a, preset slower, tune animation, CRF 28; codecs avc1.64000C.
      • H.264 · CRF 22: x264 - core 165 r3222 b35605a, preset slower, tune animation, CRF 22; codecs avc1.64000C.
      • Integer rendition: the standard's encoder (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).
      • The package: 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
      
      The code that runs
      • The standard at 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.
      • In this tab: the shared WebAssembly binding, SHA-256 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.
      • An AV1 frame is checked after the conversion the standard's native AV1 decode applies (its stated YUV to RGB8), and painted and measured after the packaging §4.7 conversion; an integer frame is checked, painted and measured as rebuilt.
      • The classical pane is this browser's player; to measure it, the tab decodes the same fragment bytes again through WebCodecs and converts them by packaging §4.7.
      Every command that made the assets
      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

      What this page does not show

      • A saving. This page reports what it measures; it states no saving in bytes, quality or energy.
      • Other resolutions. Both panes decode 256 × 128 pictures; results at other sizes differ and are not measured here.
      • Other content. One open-film excerpt; other content gives other numbers.
      • Decoders on equal terms. The player and the AV1 decoder are native code this browser chooses; the integer decoder is WebAssembly on one thread.
      • Synthetic pieces as instructions. Title cards and overlays can travel as instructions the sink evaluates; the reference packager does not pack them yet, and this excerpt has none. Roadmap
      • Staged delivery. A base first and refinements after, on this page. Building
      • Energy. Not metered.

      Before you start

      Pressing Start fetches, and counts, what both panes need. These sizes are declared by the catalog; the ledger counts what actually arrives.

      Terms

      Piece
      A span of the excerpt that decodes on its own: at most 2 seconds, opening on a key frame.
      Rendition
      One representation of a piece, named by the capability that rebuilds it.
      Class
      A delivery profile in the package's policy: which rendition of each piece a sink of that class takes.
      Content hash
      The BLAKE3 hash of a whole object, listed in the stage index; an object that does not hash to it is refused.
      Native reference
      The SHA-256 of every frame the standard's own decoder rebuilt from the same bytes.

      Keys

      Single-key shortcuts are ignored while a text field or a menu has focus, or a modifier key is held; the seek slider keeps its arrow keys.