wai-pack: packages — the stage index, the version-2 package receipt, the floor, and HLS, DASH and Media over QUIC views #172

Merged
dcharlot merged 29 commits from wai/w4-3-packages into main 2026-10-06 10:32:04 -04:00
338 changed files with 13207 additions and 84 deletions

View file

@ -1,13 +1,17 @@
name: wai-pack
# The reference packager of WAI's packaging extension (wai/extensions/packaging.md) and
# its conformance corpus (wai/pack-conformance). Three jobs:
# its conformance corpus (wai/pack-conformance). Four jobs:
#
# - legs: on each architecture of the fleet, clippy with float arithmetic denied (no
# float decides anything in a package), the tests in release with a floor on how many
# each target lists, and the corpus recomputed by the crate.
# each target lists, and the corpus recomputed by the crate: the golden packages
# packed again byte for byte and verified, every mutation's reason.
# - independent: the corpus recomputed by its second implementation, written in Python
# from the extension text and sharing no code with wai-pack.
# from the extension text and sharing no code with wai-pack, the golden packages
# verified and re-derived from their sources among it.
# - media: the golden's floor, its CMAF initialization segment and fragments, read and
# decoded by a media prober (test 14).
# - licences: every crate in wai-pack's dependency graph is under a licence deny.toml
# allows; a source-available licence fails it.
#
@ -90,8 +94,11 @@ jobs:
echo "$target: $n tests (floor $floor)"
[ "$n" -ge "$floor" ] || { echo "::error::$target lists $n tests, under its floor of $floor"; fail=1; }
done <<'EOF'
--lib 17
--lib 28
--test=conformance 1
--test=packs 7
--test=review 9
--test=refusals 5
--test=scenecut 3
--test=source_alloc 1
EOF
@ -109,8 +116,14 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: '3.11'
# Standard library only (tomllib, hashlib); BLAKE3 comes from the shared pure-Python
# module beside the claim corpus.
# The standard library (tomllib, hashlib); BLAKE3 from the shared pure-Python module
# beside the claim corpus; the package receipts' Ed25519 equation from the
# `cryptography` package, pinned with its dependencies by SHA-256 so pip installs only
# the files the requirements name.
- name: Install the Ed25519 library (hashes required)
shell: bash
working-directory: wai
run: python -m pip install --require-hashes -r pack-conformance/requirements-verify.txt
- name: pack_verify.py
working-directory: wai
shell: bash
@ -150,6 +163,37 @@ jobs:
working-directory: wai/wai-pack
run: python3 ../pack-conformance/segment_diff.py target/release/wai-pack 1 2000
media:
name: wai-pack · the floor through a media prober
runs-on: linux
steps:
- uses: actions/checkout@v5
- name: Install a media prober
shell: bash
run: |
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
$SUDO apt-get update -qq
$SUDO apt-get install -y -qq ffmpeg
# Test 14: the golden's init.mp4 and its fragments, in its floor playlist's order,
# read as one AV1 track of every frame of the source, with a key frame at each piece
# start of the plan and nowhere else, and decode without an error.
- name: The golden's floor reads and decodes
shell: bash
working-directory: wai/pack-conformance/packs/video-base-01/package
run: |
set -euo pipefail
tmp=$(mktemp -d)
cat floor/v/init.mp4 $(grep -v '^#' hls/classic/floor-v.m3u8 | sed 's#^\.\./\.\./##') > "$tmp/floor.mp4"
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=codec_name,width,height,nb_read_frames -of default=nw=1 "$tmp/floor.mp4" | tee "$tmp/probe.txt"
grep -qx 'codec_name=av1' "$tmp/probe.txt"
grep -qx 'nb_read_frames=200' "$tmp/probe.txt"
keys=$(ffprobe -v error -select_streams v:0 -show_entries packet=pts,flags -of csv=p=0 "$tmp/floor.mp4" | awk -F, '$2 ~ /K/ {print $1}' | tr '\n' ' ')
want=$(tr '\n' ' ' < plan-v.txt)
echo "key frames: $keys"
[ "$keys" = "$want" ] || { echo "::error::key frames at $keys; the plan says $want"; exit 1; }
ffmpeg -v error -xerror -i "$tmp/floor.mp4" -f null -
echo "the floor reads as one AV1 track of 200 frames, a key frame at each piece start"
licences:
name: wai-pack · dependency licences
runs-on: linux

View file

@ -205,6 +205,40 @@ wire format may change and such changes are recorded here.
code and each family reports how many cases it generated and how many were refused.
- No envelope byte or receipt byte changes for existing material.
### Packaging: objects, the stage index, the floor, catalogs and the package receipt
- **Objects** ([packaging](extensions/packaging.md) §5): each one envelope, named by its
receipt content hash, with no manifest member naming a position, so a repeated piece
is one object. The packer's base encode calls `choose_q` per piece.
- **The stage index** `WSIX` (§6, `wai-rs` `stage_index`, feature `video_package`): per
component, every object of the package by content hash, its lengths, role, layer,
the tier and decoded-output digest of the prefix it completes, its SSE, and the class
plan; its digest and a Merkle stage root; a named reason for every rule a verifier
applies to an index and to the objects it lists.
- **The floor** (§7): a supplied AV1 floor, checked against the keyframe plan
(`wai-pack plan --out`) and the listing the policy pins, written as floor objects
that carry `derived_from` and as CMAF files (`init.mp4` with `av01`/`av1C`, one
fragment per piece).
- **SPEC §7.1, *Derived renditions***: `derived_from` on a manifest or a rendition
entry states that a payload presents another object and was made from it; an
OPTIONAL member under the MINOR rule that never breaks a parse (§8).
- **Catalogs** (§8): on http-delivery's Mode N, a classical master and floor playlist
that name nothing of WAI; per class, its master (with the one SESSION-DATA line
http-delivery allows), its WAI playlist with the codecs union and floor, and a WAI
media playlist adjacent to the floor's, with `#EXT-X-GAP` for a piece the class
takes as floor only and a `#WAI-LAYER` line for each refinement layer it lists (no
package of this revision carries one: the packer refuses refinement rungs, §11.4);
the classical and per-class DASH MPDs; the MoQ catalog; and a stage view per class.
- **The version-2 package receipt** (§9, `wai-rs` `package`): binds the policy digest
and each component's index by digest and stage root, with entry, object and byte
counts every verifier recomputes; RFC 8785 JSON both ways; a measurement claim beside
a metered figure. The version-1 receipt gains the same JSON form and keeps its
bytes. Both share the figure profile `wai:video-package-receipt-id`.
- **`wai-pack pack`, `verify` and `listing`**, and the corpus's golden package
`video-base-01`, its index, object and receipt mutations with their reasons, and
version-1 receipts as JSON. The registry lists packaging's wire identifiers.
- No envelope byte or receipt byte changes for existing material.
### Packaging: a declared policy, its digest, and pieces cut at scene changes
- **The extension** [packaging](extensions/packaging.md), first sections: a package is

View file

@ -56,8 +56,9 @@ Two further tables hold strings that look like capabilities and are not:
A third holds the **wire identifiers**: the names the container, its delivery
bindings ([http-delivery](extensions/http-delivery.md),
[moq-streaming-format](extensions/moq-streaming-format.md)) and the key discovery
they serve ([jwp-receipts](extensions/jwp-receipts.md) §7) put on the wire outside a
[moq-streaming-format](extensions/moq-streaming-format.md)), the key discovery
they serve ([jwp-receipts](extensions/jwp-receipts.md) §7) and
[packaging](extensions/packaging.md) put on the wire outside a
manifest — magic numbers, a media type, `codecs` prefixes, paths, playlist tags and
attributes, document kinds and catalog fields — each with its kind, the section that
defines it, and whether it is defined, provisional (test material only until
@ -274,13 +275,18 @@ and a role are fixed once registered.
| `WAI2` | magic | defined | SPEC §7.1 |
| `WAI_RECEIPT` | catalog | defined | moq-streaming-format §5 |
| `WHP1` | magic | defined | http-delivery §6.2 |
| `WSIX` | magic | defined | packaging §6 |
| `X-WAI-FLOOR` | playlist-attribute | defined | http-delivery §11.1 |
| `application/wai` | media-type | proposed | http-delivery §3 |
| `mr/` | path | defined | http-delivery §8.6 |
| `rcpt/` | path | defined | http-delivery §8.1 |
| `science.transaction.wai.class` | data-id | defined | packaging §8 |
| `science.transaction.wai.multivariant` | data-id | defined | http-delivery §11.1 |
| `science.transaction.wai.stages` | data-id | defined | packaging §8 |
| `tag:transaction.science,2026:wai/class` | scheme | defined | packaging §8 |
| `tag:transaction.science,2026:wai/floor` | scheme | defined | http-delivery §11.1 |
| `tag:transaction.science,2026:wai/http-delivery` | scheme | defined | http-delivery §11.1 |
| `tag:transaction.science,2026:wai/stages` | scheme | defined | packaging §8 |
| `wai` | catalog | defined | moq-streaming-format §3 |
| `wai-key-status` | document-kind | defined | jwp-receipts §7.9 |
| `wai-module-grant` | document-kind | defined | jwp-receipts §7.9 |
@ -292,6 +298,8 @@ and a role are fixed once registered.
| `wai2` | fourcc | provisional | http-delivery Appendix B |
| `waiC` | fourcc | provisional | http-delivery Appendix B |
| `wai_capabilities` | catalog | defined | moq-streaming-format §4 |
| `wai_delivery_timeout_ms` | catalog | defined | packaging §8 |
| `wai_determinism` | catalog | defined | moq-streaming-format §4 |
| `wai_layer` | catalog | defined | packaging §8 |
| `wai_receipts` | catalog | defined | moq-streaming-format §4 |
<!-- end generated -->

View file

@ -622,7 +622,7 @@ registration and makes no conforming envelope non-conforming (§8).
| `wai.video.manifest` | ATTESTED PER-SESSION MANIFEST — the OTT delivery layer, not a codec: a personalised HLS manifest (ads stitched at `EXT-X-DISCONTINUITY`, blackouts + geo enforced) rendered as a **pure function of the session *class*** `(content, entitlement, geo, blackout set, ad pod, window)` rather than the viewer, and sealed in an Ed25519 receipt that binds the JCP grant (capability, joule ceiling, `funds_ceiling` = ad budget), the composition, the stitched ads and the policy applied. A receipt over a WAI playlist MAY carry `render` and `extras`, the rendering parameters and per-segment lines that playlist adds, both bound through `manifest_hash` ([http-delivery](extensions/http-delivery.md) §8.6) | **manifest-equivalence**: `manifest_hash == hash(render(segments))` and `session_class_hash` are recomputable by anyone holding the bytes, so the ads, blackouts and compose-work stop being dashboard claims; class-determinism means one generation serves every viewer of the class, and `uj_per_viewer` is the amortised energy that a 1:1-unique generator cannot report below its per-viewer cost. Only the measurement — `joules_micro`, its acquisition class and the class's evidence — is measured-attested: signed, and not re-measurable | `wai_video_manifest.rs` |
| `wai.video.ssai` | ATTESTED SERVER-SIDE AD INSERTION — a **deterministic** ad decision (greedy by price within the avail duration and the funds remaining) plus a per-impression Ed25519 receipt binding the candidate pod, the manifest it belongs to, the served `creative_hash`es and the VAST quartile each reached | **spend-equivalence**: `budget_spent_micros` is recomputed from the *billable* impressions and rejected if it exceeds the grant's `funds_ceiling` — an overspent receipt fails verification; every creative and quartile is checkable, so a buyer and seller reconcile impressions from the same bytes instead of two logs that only a dashboard joins. Only the measurement — `joules_micro`, its acquisition class and the class's evidence — is measured-attested: signed, and not re-measurable | `wai_video_ssai.rs` |
| `wai.video.keys` | ATTESTED CONTENT-KEY RELEASE — the DRM licensing decision as a record: every key release, and every refusal, is an Ed25519 receipt binding the KID, the DRM system, the entitlement demanded and the window enforced, with a BLAKE3 `key_commit` proving *which* key was released without carrying it | **decision-equivalence**: `verify()` re-runs the release policy over the receipt's own `(grant capability, entitlement, issued, expiry)` and rejects any misreported outcome, and enforces granted-iff-committed — so "keys went only to entitled, unexpired sessions" is checkable against the signed log, not asserted. Only the measurement — `joules_micro`, its acquisition class and the class's evidence — is measured-attested: signed, and not re-measurable | `wai_video_keys.rs` |
| `wai.video.package` | DETERMINISTIC PACKAGING + ATTESTED SEGMENTMAP — a source sliced into content-hashed segments on GOP boundaries; the ordered `(index → content_hash)` map is a signed Merkle commitment, and identical content (ads, bumpers, replays, simulcast overlap) dedups to one stored/encoded copy | **map-equivalence + verifiable dedup**: `segment_map_root` lets a `wai.video.manifest` reference be checked against the package that produced it, and `verify()` recomputes `unique_segments`/`stored_bytes` from the segments so the storage/encode saving cannot be overstated; `uj_per_unique_segment` is the encode-once energy. Only the measurement — `joules_micro`, its acquisition class and the class's evidence — is measured-attested: signed, and not re-measurable | `wai_video_package.rs` |
| `wai.video.package` | DETERMINISTIC PACKAGING + ATTESTED SEGMENTMAP — a source sliced into content-hashed segments on GOP boundaries; the ordered `(index → content_hash)` map is a signed Merkle commitment, and identical content (ads, bumpers, replays, simulcast overlap) dedups to one stored/encoded copy | **map-equivalence + verifiable dedup**: `segment_map_root` lets a `wai.video.manifest` reference be checked against the package that produced it, and `verify()` recomputes `unique_segments`/`stored_bytes` from the segments so the storage/encode saving cannot be overstated; `uj_per_unique_segment` is the encode-once energy. Only the measurement — `joules_micro`, its acquisition class and the class's evidence — is measured-attested: signed, and not re-measurable. Version 2 ([packaging](extensions/packaging.md) §9) binds the policy digest and one stage index per component, names each object by its jwp-receipts §2.1 content hash, and covers every media class a packager packs; the string keeps `video` for history | `wai_video_package.rs`, `package.rs` |
| `wai.video.channel` | VIRTUAL LINEAR / FAST ASSEMBLY — a continuous schedule of assets over wall-clock time, sliced into attested playback windows; windows chain via `parent_receipt_hash`, so a channel's history is a hash chain of program-as-run records | **schedule-continuity + recomputable program-as-run**: `verify()` rejects a schedule with a gap or overlap (no dead air, no double-booking) and recomputes `aired` from the schedule and the window, so what actually aired is checkable by a licensor, advertiser or regulator against the signed chain rather than an operator-held play-out log. Only the measurement — `joules_micro`, its acquisition class and the class's evidence — is measured-attested: signed, and not re-measurable | `wai_video_channel.rs` |
**Sink-architecture note:** the inter-frame neural video codecs (DCVC-RT,
@ -1876,6 +1876,35 @@ never picks a refinement by capability; and since refinements follow every selec
entry, a sink that picks the first entry it can decode picks a base. If it picks one
by another policy, it finds the capability unsupported and the component inert.
### Derived renditions
A `WAI1` manifest (§3), or a rendition entry, MAY carry `derived_from`. It states that
its payload presents another object, the **motif**, and was made from it by a named
renderer or encoder:
```json
"derived_from": { "motif": "<64 hex>", "motif_capability": "<capability>",
"renderer": "<id>@<version>", "settings": "<64 hex>" }
```
- `motif` is the motif's content hash ([jwp-receipts](extensions/jwp-receipts.md)
§2.1), 64 lowercase hexadecimal digits.
- `motif_capability` is the motif's capability, and `renderer` the renderer or encoder
that made the payload; each a non-empty string.
- `settings` is `BLAKE3("wai:render-settings\x01" ‖ JCS(settings))`, over the settings
the renderer was run with as RFC 8785 canonical JSON, 64 lowercase hexadecimal
digits.
A sink MUST NOT present such a payload's output as meeting the motif's equivalence
criterion, its tier or a `replicate` intent: the payload presents the motif; it does not
reconstruct it. A verifier checks `motif` against a motif it holds and reports every
other member as the producer's statement, except where a profile fixes them:
[packaging](extensions/packaging.md) §7 fixes a supplied floor's `renderer` and
`settings`, and a package's verifier holds them to it. A value of another form makes the member
malformed; the envelope still parses (§8). A reader of an earlier revision ignores the
member and loses only that statement. [packaging](extensions/packaging.md) §7 writes it
on every floor object.
### v1.0 compatibility
v1.0 envelopes (`WAI1`) remain valid and their format is unchanged, except that
@ -1972,7 +2001,9 @@ envelope that uses any string a later revision registers.
them: an envelope whose `refines` is malformed still parses, and
[staged-delivery](extensions/staged-delivery.md) §4 reports it
(`refines-malformed`); one whose `envelope_manifest` does not match its entry still
parses, and §7.1 reports it (`component-manifest-mismatch`).
parses, and §7.1 reports it (`component-manifest-mismatch`). `derived_from`, on a
manifest and on a rendition entry (§7.1, *Derived renditions*), is defined the same
way: an envelope whose `derived_from` is malformed still parses.
- New capabilities (§5) MAY be added in any MINOR revision. Existing
capabilities MUST NOT be redefined — once a capability string is
registered for a codec, its payload format is fixed forever; for a registration

View file

@ -3,9 +3,12 @@
> Status: Draft. A packager turns sources into WAI objects under a declared policy;
> this extension fixes what a verifier recomputes. This revision defines the policy,
> its digest and what it may ask a packager to emit (§3), how a source is cut into
> pieces (§4), and the integer video payloads a packager writes (§5.5). Reference
> impl: `wai-pack` — `policy`, `capcheck`, `source`, `scenecut`, `classify`; the
> encoder `wai-rs` `int_video_enc`; the corpus
> pieces (§4), the objects a packager writes (§5), the stage index (§6), the floor
> (§7), what each class is offered over HTTP and MoQ (§8), the package receipt (§9),
> and the package and its verification (§11). Reference impl: `wai-pack` — `policy`,
> `capcheck`, `source`, `scenecut`, `classify`, `encode`, `floor`, `cmaf`, `catalog`,
> `pack`, `verify`; in `wai-rs`, the encoder `int_video_enc`, the stage index
> `stage_index` and the receipt `package`; the corpus
> [`pack-conformance/`](../pack-conformance/). Keywords **MUST**, **MUST NOT**,
> **SHOULD**, **MAY** are RFC 2119/8174.
@ -37,7 +40,8 @@ where it names them.
**3.2** The **effective policy** is the policy with every default written in (§3.3)
and every override the packager applies (such as a command line forcing
`royalty_free_only`). Its JSON form is §3.3's members, with an optional member that
`royalty_free_only`). An override only ever forces `royalty_free_only` on; it never
turns off what the policy asks for. Its JSON form is §3.3's members, with an optional member that
has no default omitted when absent, and arrays of tables in document order. Its
**policy digest** is
@ -278,15 +282,35 @@ The kind is the first that holds of: **static** (`mad_milli ≤ static_mad_milli
## 5. Objects
**5.1–5.4** Reserved: an object's identity, its independence of its position in a
package, its name, and `refines` on a refinement object are specified with the
packager stage that writes objects.
**5.1** *One envelope.* Each object is exactly one `WAI1` or `WAI2` envelope and
nothing after it ([http-delivery](http-delivery.md) §5.1).
**5.2** *Position independence.* An object's bytes **MUST NOT** depend on its position
in a package or on the package it belongs to: no member of its manifest names a piece,
a time, an asset, a class or a component, so two pieces with identical content are one
object. The reference packager writes a base's manifest as SPEC §3 orders it, with
`media` the component's media, `intent` `replicate`, `model_requirement` the rung's
capability with no `fallback` member, `conditioning.kind` the capability's last
dot-separated segment (`int_motion`, `av1`), and `target` `{"frames": n, "h": h, "w": w}`
(the piece's frame count and dimensions; for a floor, its sequence header's maximum
frame height and width); a floor's `derived_from` (§7.2) comes after `conditioning`.
**5.3** *Name.* An object is named by its content hash ([jwp-receipts](jwp-receipts.md)
§2.1), `BLAKE3("moq-jwp:object\x01" ‖ envelope)`, as `objects/<64 lowercase hex>.wai`:
the same value is its stage-index entry (§6), its receipt leaf, its MoQ content hash and
its HTTP strong `ETag` ([http-delivery](http-delivery.md) §5.2).
**5.4** *Refinements.* A refinement object carries `refines`
([staged-delivery](staged-delivery.md) §3): `base` the content hash of its piece's base,
`layer` its layer, and as producers in `prev` only objects of the layers below it, the
object its entry refines (§6.2) among them. The reference packager does not write
refinements yet.
**5.5** *Integer video.* An object of `wai.video.int_motion` carries a `WIV1` payload
with keyframe 0, as SPEC §5 pins it ([integer-payloads](integer-payloads.md) §3); this
extension defines no other layout for it, and its decode is that section's. The
reference packager does not write objects yet; when it does, it will write these with
one encoder (`wai-rs` `int_video_enc`) at the step §5.6 chooses. The encoder's choices
reference packager writes these with one encoder (`wai-rs` `int_video_enc`) at the step
§5.6 chooses. The encoder's choices
make a payload a function of the source frames, the rung's `block`, `search` and
`mv_precision` (§3.3), and the step `q`:
@ -332,11 +356,619 @@ candidates that meet it alike are decided by their step. Where no candidate meet
it chooses the smallest. The function the reference packager's base encode calls is
`wai_pack::encode::choose_q`.
## 6–11. Stage index, floor, classes and delivery, receipt
## 6. Stage index
Reserved. This revision does not yet define a package's stage index, its floor, its
class plans and catalogs, its receipt, royalty-free packaging of a whole package or
re-pack equivalence; they are specified with the packager stages that write them.
**6.1** A package carries, per component, one stage index, the file `index-<id>.wsix`
(`WSIX`), per window: one window for on-demand content, a chain of windows for live
(§9.2). A window holds whole pieces. Integers are little-endian.
**6.2** *Layout.* A 160-byte header, then `n_pieces` piece records of 32 bytes,
`n_entries` entry records of 128 bytes, `n_classes` class records of 16 bytes, the class
plan, and the string table. Nothing follows the string table. Reserved and padding
bytes are zero.
| Offset | Size | Header field |
|---|---|---|
| 0 | 4 | `"WSIX"` |
| 4 | 2 | version, 1 |
| 6 | 2 | `media_class`: 0 video, 1 image, 2 audio, 3 world, 4 feed, 5 avatar, 6 film |
| 8 | 4 | `tb_num` |
| 12 | 4 | `tb_den` |
| 16 | 4 | `n_pieces` |
| 20 | 4 | `n_entries` |
| 24 | 4 | `n_strings` |
| 28 | 4 | `n_classes` |
| 32 | 32 | `policy_digest` (§3.2) |
| 64 | 32 | `prev_index_digest`: the previous window's index digest; zero for on-demand content and a first window |
| 96 | 8 | `first_piece`: the absolute number of the window's first piece |
| 104 | 8 | `first_entry`: the absolute ordinal of the window's first entry across the chain |
| 112 | 32 | `plan_digest` (§4.2) of the pieces' starts |
| 144 | 2 | `component`: the component's id, as a string index |
| 146 | 14 | reserved |
| Offset | Size | Piece record field |
|---|---|---|
| 0 | 8 | `start`, in timebase units |
| 8 | 4 | `duration`, in timebase units |
| 12 | 4 | `first_entry`, window-relative |
| 16 | 2 | `n_entries` |
| 18 | 1 | `kind`: 0 natural, 1 static, 2 synthetic, 3 motion_high (§4.6), 4 world segment, 5 audio |
| 19 | 1 | flags: bit 0 scene cut, bit 1 forced at `max` (§4.3), bit 2 started by a cue, bit 3 aligned to the lead (§4.5) |
| 20 | 4 | `rules`: bit *i* set when rule *i* matched the piece (§8.1) |
| 24 | 4 | `moments`: bit *i* set when the piece lies in moment *i* (§8.1) |
| 28 | 4 | reserved |
| Offset | Size | Entry record field |
|---|---|---|
| 0 | 32 | `content_hash` (§5.3) |
| 32 | 8 | `byte_len`: the whole envelope's length |
| 40 | 8 | `piece`: the absolute piece number |
| 48 | 4 | `refines`: the window-relative index of the entry this one refines; `0xFFFFFFFF` for none |
| 52 | 2 | `capability`, as a string index |
| 54 | 1 | `role`: 0 base, 1 refinement, 2 floor, 3 snapshot, 4 ops, 5 receipt, 6 asset |
| 55 | 1 | `layer` |
| 56 | 1 | `prefix_tier`: 0 none, 1 entropy-consistency, 2 decode-equivalence (§6.4) |
| 57 | 1 | flags: bit 0 deferrable, bit 1 duplicate (an earlier entry of the index has the content hash), bit 2 the manifest carries `derived_from` |
| 58 | 2 | reserved |
| 60 | 4 | `deadline_ms`: 0 for none (§8.6) |
| 64 | 32 | `prefix_digest` (§6.5) |
| 96 | 8 | `sse` (§6.6); `2^64 − 1` when not computed |
| 104 | 4 | `manifest_len`: the envelope's `man_len` |
| 108 | 4 | reserved |
| 112 | 8 | `payload_len`: the envelope's payload bytes (for a `WAI2`, every component's) |
| 120 | 8 | reserved |
`byte_len`, `manifest_len` and `payload_len` are the envelope's own lengths; for an
object whose payload format WAI checks they are its counted bytes
([staged-measurement](staged-measurement.md) §3), so a verifier also requires each such
payload to parse as its format, after the other object rules of §6.3
(`object-lengths`).
A class record is `u16` name (a string index), `u8 max_layer`, `u8` flags (bit 0
floor only), `u32 max_kbps` (0 for none) and 8 reserved bytes, in the policy's class
order. The class plan is `n_classes` rows of `n_pieces` bytes, each the highest layer
the class lists for the piece or `0xFF` for the floor only (§8.1), zero-padded to a
multiple of 8. The string table is `n_strings` strings, each a `u16` length and that
many bytes of UTF-8, at least one, zero-padded to a multiple of 8. It is the component's
id, then the class ids in policy order, then each capability at its first use, and a
package's verifier holds an index to that (§11.3).
index_digest = BLAKE3("wai:pack-stage-index\x01" ‖ file)
leaf_i = BLAKE3("wai:pack-stage\x01" ‖ entry record i)
stage_root = the jwp-receipts §2.2 Merkle root over the leaves
A reader **MUST** refuse a file that is not this layout, the first that applies, in
this order:
1. its first four bytes are not `WSIX`, a file of fewer included (`index-magic`);
2. a file of fewer than six bytes (`index-truncated`), or a version other than 1
(`index-version`);
3. a file shorter than the header, or than the tables its counts give: the piece, entry
and class records, the class plan with its padding, each string's length and bytes,
and the string table's padding, every size taken from its count before anything is
allocated (`index-truncated`);
4. a reserved or padding byte that is not zero (`index-reserved`);
5. a media class with no meaning (`index-media-class`); then, entry by entry, a role,
then a tier, with none (`index-role`, `index-tier`);
6. a string that is empty or not UTF-8, then a string index past the table
(`index-string`);
7. bytes after the string table's padding (`index-trailing`).
**6.3** *Rules.* An index lists every WAI object of its component, in piece order.
Files that are not WAI envelopes (CMAF initialization segments and fragments, FLAC
files) **MUST NOT** appear in it. A verifier **MUST** refuse an index that breaks one
of these, checked in this order:
1. A timebase of zero (`index-timebase`). An index with no previous window
(`prev_index_digest` zero: on-demand content, or a chain's first window) whose
`first_piece` or `first_entry` is not 0, or whose first piece does not start at 0, the
start of the presentation timeline (§4.5) (`window-start`). Then piece by piece: a
piece that lasts no time or does not start where the one before it ended
(`piece-order`); whose
`first_entry` is not the number of entries before it, or that has none
(`piece-entries`); of a kind or with a flag that has no meaning (`piece-kind`). Then
pieces whose entries are not the index's entries (`piece-entries`).
2. Entry by entry, in order: an entry that does not name its piece's absolute number
(`piece-entries`); a flag with no meaning (`entry-flags`); within its piece, a role
before one that comes earlier in the order base, refinement, floor, any other, or a
refinement at a lower layer than the refinement before it (`entry-order`); an entry
that is not a refinement above layer 0, a refinement at layer 0, or `refines` on an
entry that is not a refinement or missing from one (`layer-role`); a
refinement whose `refines` is outside the window (`refines-outside-window`), is not
an earlier entry of its own piece (`refines-mismatch`) or is not one layer below it
(`layer-gap`); its tier (§6.4: `tier-entropy-passthrough`, `tier-weakest`, then
`tier-mismatch`); a non-zero `prefix_digest` with a tier other than
decode-equivalence (`digest-without-tier`); a deadline on an entry that is not a
refinement (`deadline-role`); a floor without flag bit 2 (`floor-derived-from`); a
content hash an earlier entry has at another length (`dup-length`); the duplicate
flag other than set exactly when an earlier entry has the content hash (`dup-flag`).
3. Class by class: a flag with no meaning (`class-flags`); a plan value other than
`0xFF` for a floor-only class, or other than `0xFF` or at most both the class's
`max_layer` and the piece's highest layer otherwise (`class-plan`).
With the objects in hand, a verifier **MUST** also refuse, entry by entry: bytes of
another length (`object-length`) or that do not hash to the entry's content hash
(`object-hash`); bytes that are not one `WAI1` or `WAI2` envelope and nothing else
(`non-envelope-entry`); a `man_len` or a payload length other than the entry's
(`object-lengths`); a capability other than the entry's (`object-capability`; for a
`WAI2`, its first entry's); a refinement whose object is not a `WAI1` whose `refines`
names its piece's base, its layer and producers of the layers below among which the
entry it refines (§5.4, `object-refines`); and `derived_from` (SPEC §7.1) present
otherwise than bit 2 says, or not well formed (`object-derived-from`). A member whose
value is `null` is absent; for a `WAI2`, `derived_from` is present when any entry
carries it, and well formed when every entry that carries it is. A manifest that does
not parse, or names a member twice, is not an envelope (`non-envelope-entry`).
**6.4** *Tier.* The tier a capability's own decode holds is decode-equivalence for a
capability whose registry class reconstructs exactly (`StandardDefined`, and
`NeuralIntegerExact`, whose pin a sink verifies before it decodes),
entropy-consistency for `NeuralEntropyExact`, and none otherwise (SPEC §5, §7).
- An entry at layer 0 states its capability's tier, except a floor, which states none
(§7.4).
- A prefix with one or more refinements holds decode-equivalence only if every object
along it does, and none otherwise ([derived-tracks](derived-tracks.md) §3, rules 1
and 2): a refinement's tier is decode-equivalence exactly when the entry it refines
states decode-equivalence and its own capability's tier is decode-equivalence.
- An entry with `layer` > 0 **MUST NOT** state entropy-consistency
(`tier-entropy-passthrough`); one with `layer` > 0 that states decode-equivalence over
a prefix that does not hold it is refused `tier-weakest`; any entry stating another
tier than the one this section gives, `tier-mismatch`.
**6.5** `prefix_digest` is the SHA-256 decoded-output digest (SPEC §7, *Digests*) of the
prefix the entry completes when `prefix_tier` is decode-equivalence, and all zero
otherwise: for video, the clip digest over RGB8 frames; for an image, the RGB8 frame
digest; for audio, the digest of the s16le interleaved samples; for world, feed, avatar
and film entries, zero (their state hashes live in their receipts). A verifier decodes
the prefix and compares.
**6.6** `sse` is the integer sum, over every output sample of the prefix, of the
squared difference from the source sample the packager coded (RGB8 channels, or s16
samples). It is the producer's statement: a verifier holding the source recomputes it,
and one without the source cannot. A floor's `sse` is `2^64 − 1`.
## 7. Floor and `derived_from`
**7.1** Every piece of a video, image or audio component **MUST** have a floor rendition
in a capability of SPEC §5's mandatory floor or recommended set; a packager refuses a
video component with no floor rung (`floor-missing`). A film or world package SHOULD
have one. This revision packs a supplied AV1 floor (`wai.video.av1` or
`wai.video.av1.lossless`, `source = "supplied"`).
**7.2** *Floor objects.* Each piece's floor is one object of the floor rung's capability
(§5.2), whose manifest carries `derived_from` (SPEC §7.1, *Derived renditions*) naming
the piece's base: `motif` the base's content hash, `motif_capability` its capability,
`renderer` the floor's maker, and `settings` `BLAKE3("wai:render-settings\x01" ‖
JCS(settings))` (§3.6). For a supplied floor, `renderer` is `supplied@<the supplied
listing's SHA-256>` and the settings are `{"source": "supplied", "supplied_listing":
"<that SHA-256>"}`, so neither names a position. This profile fixes these members: they
are not the producer's statement here (SPEC §7.1), and a verifier holds every floor
object to them, to its framing header and to its target (§11.3). An AV1 floor object's payload is the
length-prefixed framing the reference sink decodes (`wai-rs` `codecs::video`): `n`,
`h`, `w`, `fps_num`, `fps_den` as `u32` little-endian (the piece's temporal units, the
sequence header's maximum frame height and width, the component's timebase `num` and
`den`), then each temporal unit as a `u32` little-endian length and its bytes as the
stream holds them.
**7.3** *A supplied floor* is a directory holding, per video component, `<id>.obu`: an
AV1 stream in the low-overhead OBU format (every OBU with its size field), one temporal
unit per source frame. Its listing (SPEC §3.1) of every file is pinned by the policy's
`floor.supplied_listing`. A packager **MUST** refuse, before it writes anything:
- a directory whose listing does not hash to `floor.supplied_listing`
(`floor-listing-mismatch`), and a component with no stream in it
(`floor-stream-missing`);
- a stream that does not split into temporal units each holding a frame, whose first
unit holds no sequence header, with a sequence header whose bytes differ from the
first's, or with a unit that starts at a shown key frame (below) without a sequence
header (`floor-av1-malformed`);
- another number of temporal units than source frames (`floor-frame-count`);
- a unit that does not start at a shown key frame at a piece's first frame, or one that
does elsewhere unless `floor.extra_keyframes` is true (`floor-keyframe-mismatch`). A
unit starts at a shown key frame when its first frame header has `frame_type`
`KEY_FRAME` and `show_frame` 1, or the sequence uses the reduced still-picture header;
a unit that shows an existing frame does not.
The plan a supplied floor is made against is the **keyframe plan**, the file
`plan-<id>.txt`: each piece's first frame in decimal, one per line, each line ended by a
line feed. Its pieces' starts are the plan of §4.2, and `wai-pack plan` writes it from the
source and the policy before any floor is encoded.
**7.4** The floor is presentation. Its output is never compared with the primary's, and
no tier or `replicate` claim covers it.
**7.5** A floor produced by an encoder that is not a pure function of its input (§11)
**MUST** name that encoder and its version in `derived_from.renderer`.
**7.6** *CMAF.* The floor of a video component is also written as CMAF files, which no
stage index lists: `floor/<id>/init.mp4`, and one fragment per piece,
`floor/<id>/<SHA-256 of the fragment>.m4s`. Box layouts are ISO/IEC 14496-12's, with the
AV1 binding's sample entry; every integer is big-endian and every time 0:
- `init.mp4`: `ftyp` (major brand `cmfc`, minor version 0, compatible `cmfc`, `iso6`,
`av01`), then `moov` holding `mvhd` (version 0, timescale `tb_num`, rate 1, volume 1,
the unity matrix, next track 2), `trak` (`tkhd` version 0 with flags 3, track 1,
layer, alternate group and volume 0, the unity matrix, the width and height in 16.16; `mdia`: `mdhd` version 0, timescale
`tb_num`, language `und`; `hdlr` `vide` named `video` with its terminating zero byte;
`minf`: `vmhd` with flags 1,
`dinf` with one self-contained `url `, and `stbl`: `stsd` with one `av01` sample entry
of the width and height, data reference 1, resolution 72 dpi, frame count 1, an empty
compressor name, depth 24 and pre-defined −1, holding `av1C`, then empty `stts`,
`stsc`, `stsz` and `stco`), and `mvex` with `trex` (track 1, sample description 1).
`av1C` is marker and version 1, then the sequence header's profile, level, tier,
bit depth, monochrome and chroma fields, no initial presentation delay, then the
sequence header OBU as the stream holds it. The width and height are the sequence
header's maximum frame width and height.
- A fragment: `moof` holding `mfhd` (sequence number piece + 1) and `traf` (`tfhd` with
default-base-is-moof, track 1; `tfdt` version 1, the piece's start × `tb_den`; `trun`
version 0 with data offset, sample duration, size and flags, the offset pointing at
the `mdat` payload), then `mdat`. Each sample is a temporal unit without its temporal
delimiter, lasting `tb_den`; its flags are `0x02000000` at a shown key frame and
`0x01010000` otherwise.
The codecs string of the floor is the AV1 binding's short form,
`av01.<profile>.<level, two digits><M or H>.<bit depth, two digits>`.
## 8. Classes, catalogs and delivery
**8.1** *What a class lists.* The stages listed for a class are a pure function of the
class, the piece and the effective policy, so every viewer of a class receives the same
catalog bytes.
- A piece that starts at unit `start` and lasts `duration` units spans the
milliseconds from `s_ms` up to `e_ms`, the floors of `start · den · 1000 / num` and of
`(start + duration) · den · 1000 / num`; it lies in moment *i* when `s_ms < to_ms` and
`e_ms > from_ms`. Rule *i* matches it when each condition the rule states holds: its
kind is in `when.piece_kind`, and a tag of a moment it lies in is in
`when.moment_tag`. Matching rules fold in document order (§3.4).
- A floor-only class lists the floor (`0xFF`). Otherwise the class lists
`min(max_layer, the rules' then.max_layer, the piece's highest layer)`; under
`max_kbps`, while the listed prefix needs more than `max_kbps`, that is
`ceil(8 · bytes · num / (1000 · duration · den))` kilobits per second over the bytes of
the listed bases and refinements, the top layer is dropped, and a base that alone
needs more makes the piece floor-only for the class.
**8.2** A catalog **MUST NOT** list a refinement without the stages below it.
**8.3** *HTTP.* A package is offered in [http-delivery](http-delivery.md)'s Mode N
(§11.1 there): the classical presentation is the floor alone, and WAI objects are
offered in playlists of their own.
- A WAI object is none of the media segment formats of RFC 8216 §3. A WAI playlist is
offered only to a sink that recognizes its codecs value from its own capability list,
and a packager **MUST** write a classical master that names nothing of WAI.
- A browser's media-capabilities query answers only for the browser's own decoders,
and **MUST NOT** be used to decide whether a `wai1.*` value can be decoded
([http-delivery](http-delivery.md) §4.3).
- Each class's WAI playlist **MUST** name its class and its stage view.
Durations: a piece of *d* units lasts `floor(d · den · 1000 / num)` milliseconds,
written `S.mmm` (whole seconds, a full stop, three digits). A target duration is the
largest `ceil(d · den / num)`. A rate is `ceil(8 · bytes · num / (d · den))` bits per
second; a variant's `BANDWIDTH` is the largest over the pieces it lists and
`AVERAGE-BANDWIDTH` the rate of all their bytes over all their durations. A floor
variant's bytes per piece are its fragment's; a WAI variant's are the listed bases' and
refinements', over the pieces the class does not take as floor only. Every playlist
line ends with a line feed. For component *c*, of frame size `W×H`, whose floor has
codecs string *F* and maximum frame size `FW×FH`:
- `hls/classic/master.m3u8`: `#EXTM3U`, `#EXT-X-VERSION:7`,
`#EXT-X-INDEPENDENT-SEGMENTS`, `#EXT-X-STREAM-INF:BANDWIDTH=<b>,AVERAGE-BANDWIDTH=<a>,CODECS="F",RESOLUTION=FWxFH`,
`floor-<c>.m3u8`.
- `hls/classic/floor-<c>.m3u8`: `#EXTM3U`, `#EXT-X-VERSION:7`,
`#EXT-X-TARGETDURATION:<t>`, `#EXT-X-MEDIA-SEQUENCE:0`, `#EXT-X-PLAYLIST-TYPE:VOD`,
`#EXT-X-INDEPENDENT-SEGMENTS`, `#EXT-X-MAP:URI="../../floor/<c>/init.mp4"`, then per
piece `#EXTINF:<S.mmm>,` and `../../floor/<c>/<sha256>.m4s`, then `#EXT-X-ENDLIST`.
- `hls/<class>/master.m3u8`: the classical master's lines, with, when the class lists a
WAI object, `#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8"`
after `#EXT-X-INDEPENDENT-SEGMENTS`, and the variant's URI `../classic/floor-<c>.m3u8`.
- `hls/<class>/wai.m3u8`, when the class lists a WAI object: `#EXTM3U`,
`#EXT-X-VERSION:7`, `#EXT-X-INDEPENDENT-SEGMENTS`,
`#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.class",VALUE="<class>"`,
`#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.stages",URI="../../stages/<class>.json"`,
`#EXT-X-STREAM-INF:BANDWIDTH=<b>,AVERAGE-BANDWIDTH=<a>,CODECS="<union>",X-WAI-FLOOR="<floor>",RESOLUTION=WxH`,
`wai-<c>.m3u8`. The union and the floor are [http-delivery](http-delivery.md) §4.2's
over the objects the class lists.
- `hls/<class>/wai-<c>.m3u8`: the floor playlist's lines without `#EXT-X-MAP`, adjacent
to it ([http-delivery](http-delivery.md) §11.2); per piece, `#EXT-X-GAP` when the
class takes it as floor only, `#EXTINF:<S.mmm>,`, its base as
`../../objects/<hash>.wai#n=<byte_len>`, then each refinement the class lists, in
entry order, as `#WAI-LAYER:N=<layer>,URI="../../objects/<hash>.wai#n=<byte_len>"`
([http-delivery](http-delivery.md) §10.4).
DASH, the same as two MPDs ([http-delivery](http-delivery.md) §11.1), each
`<?xml version="1.0" encoding="UTF-8"?>`, then
`<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:full:2011" type="static" mediaPresentationDuration="PT<S.mmm>S" minBufferTime="PT<t>S">`
over the component's whole duration and its target duration, `<Period id="p0" start="PT0S">`,
one `AdaptationSet`, `</Period>` and `</MPD>`, indented by two spaces a level:
- `dash/classic.mpd`: `<AdaptationSet id="1" contentType="video" mimeType="video/mp4" codecs="F" width="FW" height="FH" segmentAlignment="true" startWithSAP="1">`
holding `<Representation id="<c>-floor" bandwidth="<b>">` with
`<SegmentList timescale="<num>">`: `<Initialization sourceURL="../floor/<c>/init.mp4"/>`,
a `SegmentTimeline` of one `<S t="<(start − first start)·den>" d="<d·den>"/>` per
piece, and one `<SegmentURL media="../floor/<c>/<sha256>.m4s"/>` per piece.
- `dash/<class>.mpd`, when the class lists a WAI object:
`<AdaptationSet id="1" contentType="video" mimeType="application/wai" codecs="<union>" width="W" height="H">`
holding `<EssentialProperty schemeIdUri="tag:transaction.science,2026:wai/http-delivery"/>`,
`<SupplementalProperty>`s of schemes `tag:transaction.science,2026:wai/floor` (value the
floor), `tag:transaction.science,2026:wai/class` (the class) and
`tag:transaction.science,2026:wai/stages` (`../stages/<class>.json`), then
per layer *k* up to the highest the class lists, a `Representation` with attributes
`id="<c>-l<k>"`, for *k* > 0 `dependencyId="<c>-l<k−1>"`, and `bandwidth` the peak rate of its own
layer's objects over the pieces it lists, whose
`SegmentList` has a timeline entry and a `SegmentURL media="../objects/<hash>.wai"`
for each piece the class lists to layer *k* (a gap where it does not).
The media type `application/wai` is proposed, not registered
([http-delivery](http-delivery.md) §3). This revision writes the catalogs of a package
of one component; how the variants and groups of several components are written is
defined with the packing of several components.
**8.4** *MoQ.* `moq/catalog.json` is RFC 8785 canonical JSON and a line feed:
`{"tracks": [...], "version": 1}`, the tracks by layer, then by deadline ascending,
then the floor. Each (component, layer, deadline) is one track of
`packaging` `"wai"`: name `<c>/l<k>`, or `<c>/l<k>@<deadline>` for a refinement whose
deadline is not `defaults.deadline_ms`; `renderGroup` 1; `priority` §8.5's;
`wai_capabilities` its entries' capabilities by first appearance; `wai_layer` *k*;
`wai_receipts` false (no object of this revision carries a `WAI_RECEIPT` property);
`wai_determinism` the weakest tier of its entries, absent when that is none. The base
track has `altGroup` 1 when the component has a floor. MSF's catalog defines `depends`
as the tracks on which a track is dependent, and this section has a sink receive every
one of them (below): a dependency is all of its tracks, not any one. So a refinement track
`depends` on every track that carries an entry its own entries refine, in track order —
the layer below at the same deadline, where a piece's layers share its deadline as the
reference packager writes them — and never on a track the catalog does not hold. It
carries `wai_delivery_timeout_ms` (§8.6). The floor is a track
`<c>/floor` of `packaging` `"cmaf"` with `altGroup` 1, `renderGroup` 1, `codec`,
`width` and `height`. A sink **MUST NOT** subscribe to a track unless it also receives
every track that track depends on, so a sink that selects the floor subscribes to no
layer track. `wai_layer` and `wai_delivery_timeout_ms` are catalog fields this
extension defines under the `wai_` prefix of
[moq-streaming-format](moq-streaming-format.md) §4; a later revision of that extension
may define them there instead.
**8.5** *Priority.* The base track's publisher priority is 64 and layer *k*'s
`64 + 32·k`: a refinement track's value is strictly greater than that of the track it
depends on, so it is delivered after it (MOQT: a lower value is delivered first).
**8.6** *Deadline.* An entry's `deadline_ms` is the longest a refinement may arrive
after the base of its piece was published and still be presented; the rules' or
`defaults.deadline_ms`. A refinement track carries DELIVERY_TIMEOUT
`deadline_ms − live.layer_lag_ms[k]` (§3.4 has refused a policy where that is below 1).
Entries of one layer with different deadlines travel on different tracks. A relay may
drop a late refinement (MOQT §5.2), so a refinement never delays the base.
**8.7** *Presentation.* A sink presents piece *p* at the highest prefix whose objects
all arrived and verified by *p*'s presentation instant, and **MUST NOT** delay the base
to wait for a refinement. What the receipts of a dropped object say is
[jwp-receipts](jwp-receipts.md)' to define, not this extension's.
**8.8** *Stage views.* `stages/<class>.json` is RFC 8785 canonical JSON and a line feed:
`{"class": "<class>", "components": {"<c>": {"media_playlist":
"../hls/<class>/wai-<c>.m3u8", "pieces": [...]}}, "policy_digest": "<hex>"}`, with
`media_playlist` only when the class lists a WAI object, and each piece
`{"dur", "p", "start", "stages": [...]}` with `"floor_only": true` when the class takes
it as floor only (and `stages` empty), and each listed stage `{"bytes", "h", "layer"}`,
a refinement's with `"refines"` (the content hash of the entry it refines) and
`"deadline_ms"`.
## 9. Package receipt
**9.1** A version-2 package receipt binds the asset id; the policy digest; its parent
kind and parent receipt hash; per component its id, media class, index digest and stage
root; the entry, distinct-object, referenced-byte and stored-byte counts, which a
verifier recomputes from the indexes; the packager `builtin:<crate>@<version>`; the
energy figure with its class, or the unmetered form; the grant; and the signer. Its
signing payload, big-endian:
labelled_domain("wai:pack-receipt\x01", label)
u32 len ‖ asset_id ‖ policy_digest[32]
u8 parent_kind (0 none, 1 live-window, 2 re-pack) ‖ [parent_receipt_hash[32] if not 0]
u32 n ‖ n × ( u32 len ‖ id ‖ u8 media_class ‖ index_digest[32] ‖ stage_root[32] )
u64 total_entries ‖ u64 unique_objects ‖ u64 total_bytes ‖ u64 stored_bytes ‖ u64 work_units
u32 len ‖ packager
u64 joules_micro ‖ write_label(label)
grant_hash[32] ‖ u32 len ‖ capability ‖ u64 joule_ceiling_micro ‖ u8 0 | u8 1 ‖ u64 funds_ceiling
signer_pubkey[32] ‖ u32 len ‖ signer_id
receipt_hash = BLAKE3("wai:video-package-receipt-id\x01" ‖ payload ‖ sig)
`labelled_domain` and `write_label` are [energy-measurement](energy-measurement.md)
§2.8's: unmetered, the domain as written and no label; metered, its final byte `\x02`
and the class's signed encoding. `total_entries` counts every entry; `unique_objects`
the distinct content hashes over every component; `total_bytes` the entries'
`byte_len`; `stored_bytes` the `byte_len` of each content hash's first entry;
`work_units` equals `total_entries`. A receipt whose content hash comes at two lengths
has no counts. The signature is Ed25519 (RFC 8032) by `signer_pubkey`.
Its JSON form, `package.receipt.json`, is RFC 8785 canonical, hexadecimal lowercase,
integers as numbers no greater than `2^53 − 1` (a packager refuses to seal anything
else, `receipt-json`): `asset_id`; `components`, each `{"id", "index":
"index-<id>.wsix", "index_digest", "media_class", "stage_root"}`; `grant`
`{"capability", "funds_ceiling", "grant_hash", "joule_ceiling_micro"}` with `null` for
no ceiling (a joule ceiling of `2^64 − 1`); `joules_micro`; `kind` `"package"`;
`packager`; `parent_kind` (`none`, `live-window` or `re-pack`); `parent_receipt_hash`
(`null` for none); `policy_digest`; `receipt_hash`; `sig`; `signer_id`;
`signer_pubkey`; `stored_bytes`; `total_bytes`; `total_entries`; `unique_objects`;
`version` 2; `work_units`; `energy_provenance`, the class's label (energy-measurement
§2.7) or `null` when unmetered; and the class's evidence members exactly as its class
carries them. Every member is present, with `null` where it has no value
(`parent_receipt_hash`, `energy_provenance`, a grant's ceilings) and nowhere else.
A reader refuses, before anything else, JSON that is not RFC 8259 or that names a member
twice in one object, at any depth (`receipt-json`). It then reads `"version"`: absent or
1 is a version-1 receipt (§9.3), 2 a version-2 one, anything else `receipt-version`. It
then refuses (`receipt-json`) a member it does not define or one missing, `null` where
the member has a value, a value of another form (a number that is not an integer of its
range, `-0` among them; a string that is not Unicode scalar values), evidence other than
exactly what the class carries, a class label energy-measurement §2.7 refuses, a parent
kind and hash that disagree, an `index` other than `index-<id>.wsix`, and a
`receipt_hash` that is not the receipt's. A reader does not require the canonical form;
a writer writes it, and a package's `package.receipt.json` must be it (§11.3).
A verifier of a receipt against its indexes, in its components' order, refuses, the
first that applies: no component, or another number of indexes than components, a live
window's receipt included (`receipt-index-count`); an index that breaks §6 (its
reason); one that does not hash to its `index_digest` (`receipt-index-digest`), has
another stage root (`receipt-stage-root`), names another component or media class
(`receipt-component`) or another policy digest (`receipt-policy-digest`); two components
of one id (`receipt-component`); other counts, or a content hash at two lengths in any of the
indexes (`receipt-counts`); a parent kind that does not
match the indexes' `prev_index_digest`, which is zero in every index for none and a
re-pack and non-zero in every one for a live window (`receipt-parent-kind`); an energy
figure and class that do not cohere, or a legacy label (`receipt-energy`); a signature
that does not verify (`receipt-signature`).
**9.2** Live windows chain by the parent link with parent kind `live-window`. A re-pack
of an earlier package **MAY** name it with parent kind `re-pack`.
**9.3** A version-1 receipt (`wai.video.package`'s segment map) keeps its bytes and
still verifies. Its JSON form is RFC 8785 canonical with `version` 1: `asset_id`,
`energy_provenance` (`null` when unmetered) with its evidence, `grant`, `joules_micro`,
`kind` `"package"`, `parent_receipt_hash`, `receipt_hash`, `segment_map_root`,
`segments` (each `{"byte_len", "content_hash", "duration_ms", "index"}`), `sig`,
`signer_id`, `signer_pubkey`, `stored_bytes`, `total_bytes`, `total_segments`,
`unique_segments`, `work_segment_ops`. A reader reads one without `version` as version 1,
and, because version-1 receipts were issued before this form, keeps them verifying:
`energy_provenance` may be absent (read as unmetered), an evidence member written `null`
is absent, and an on-chip counter's filtering, absent, reads as unknown. It refuses a
member named twice as version 2's reader does.
Its signing payload, big-endian, is
"wai:video-package-receipt\x01"
u32 len ‖ asset_id ‖ segment_map_root[32]
u64 total_segments ‖ u64 unique_segments ‖ u64 total_bytes ‖ u64 stored_bytes ‖ u64 work_segment_ops
u64 joules_micro ‖ class (u8 0 when unmetered, else the class's signed encoding)
the grant as §9.1 writes it
u8 0 | u8 1 ‖ parent_receipt_hash[32]
u64 n ‖ n × BLAKE3("wai:video-package-seg\x01" ‖ u64 index ‖ content_hash[32] ‖ u64 duration_ms ‖ u64 byte_len)
signer_pubkey[32] ‖ u32 len ‖ signer_id
`segment_map_root` is the jwp-receipts §2.2 Merkle root over those segment leaves, the
counts are the segments' (the bytes of one copy per content hash for `stored_bytes`), and
`receipt_hash` is version 2's.
Both versions share the identity domain, so the figure profile
`wai:video-package-receipt-id` ([energy-measurement](energy-measurement.md) §6.1)
covers both; a version-2 receipt's figure is read only with the indexes it verifies
against.
**9.4** Where the energy figure is not the unmetered form, the packager **MUST** publish
a `measurement` claim about it ([jwp-receipts](jwp-receipts.md) §2.4.8,
[energy-measurement](energy-measurement.md) §6) as
`claims/<receipt_hash>.measurement.json`: subject the receipt, figure profile
`wai:video-package-receipt-id`, signed with the package key and checked against the
receipt before it is written. A verifier refuses a metered package without it
(`measurement-claim-missing`) or with one that does not verify and check against the
receipt (`measurement-claim-invalid`).
## 10. Royalty-free packaging
A packager run with `royalty_free_only = true` **MUST** refuse to emit any object whose
capability the registry does not classify as royalty-free, including one it does not
classify at all (§3.6, rule 5). A package receipt says nothing about patents.
`royalty_free_only` records the registry class the packager read, "licensed
royalty-free by its standards body"; it is not a freedom-to-operate opinion.
## 11. Package, re-pack equivalence and verification
**11.1** *The package* is a directory of these files and no other file or directory
(every directory below it holds one of them):
policy.toml policy.json plan-<c>.txt index-<c>.wsix package.receipt.json
objects/<content hash>.wai …
floor/<c>/init.mp4 floor/<c>/<sha256>.m4s …
hls/classic/… hls/<class>/… dash/… moq/catalog.json stages/<class>.json
claims/<receipt_hash>.measurement.json (a metered package)
LISTING
`policy.toml` is the policy as given; `policy.json` its effective canonical JSON
(§3.2). `LISTING` is the listing (SPEC §3.1) of every other file, and its SHA-256 is the
**pack digest**. A component or class id that cannot be one path segment of a listing,
two class ids equal once `A`–`Z` are mapped to `a`–`z`, and a class named `classic` in
any case (ids name paths, and paths fold case) are refused (`pack-id`).
**11.2** *Re-pack equivalence.* Given the same source bytes, effective policy, supplied
floor, signing key and packager identity, a conforming reference packager **MUST**
produce byte-identical package files on every machine, except the energy figure and
measurement claim of a metered package and floor objects §7.5 covers. A verifier
**MAY** pack again and compare listings. A packager whose identity differs is not held
to this.
**11.3** *Verification.* A verifier of a package, without its sources, applies these
checks in this order and refuses at the first that fails; a check that reads files a
failed check names is not applied:
1. Every file below the package's directory, read strictly — a name beginning with `.`
and a `*.sha256` file included, as a listing (SPEC §3.1) would not skip them — is a
regular file whose path a listing can carry; a symbolic link, a directory that
cannot be read or holds nothing, or anything else is refused (`unexpected-file`).
2. `LISTING` is present (`listing-missing`) and is the listing of every other file
(`listing-mismatch`).
3. `package.receipt.json` reads as a version-2 receipt (§9.1: `receipt-json`,
`receipt-version`) and is that receipt's canonical form, byte for byte
(`receipt-json`).
4. `policy.json` hashes to the receipt's policy digest (`policy-digest-mismatch`);
`policy.toml` is a policy (its own reason, §3.2–§3.4); `policy.json` is its
effective canonical JSON, `royalty_free_only` forced on where `policy.json` says
`true` (`policy-json-mismatch`; an override never turns it off, §3.2, so a
`policy.json` that says `false` over a `policy.toml` that says `true` is refused
here); its ids can name files (`pack-id`, §11.1); and under that effective policy it
asks for nothing a packager may not emit (§3.6's reason; under `royalty_free_only`, a
patent-pool floor is `license-refused`).
5. The receipt's components are the policy's, by id, in order, each of the policy's
media (`policy-component-mismatch`), so a package is never a receipt over fewer
components than its policy has; each index is present (`index-missing`); the receipt
verifies against them (§9.1, the index rules of §6 among its reasons).
6. Per component, in order:
- the index against the policy (`index-policy-mismatch`): its timebase and media
class are the component's; its string table is the component's id, the class ids
in policy order, then each capability at its first use; its class records are the
policy's classes, in order, with their `max_layer`, floor-only flag and `max_kbps`;
every entry's role, capability and layer are a rung's of its component (a base, a
refinement at the rung's layer, or a floor); every piece's kind is one a video piece
has, and its rules, moments and class plan are §8.1's from its kind, span and
entries;
- the plan file holds the index's starts and its digest is the header's
(`plan-mismatch`);
- every entry's object is present (`object-missing`) and keeps the object rules of
§6.3, its counted bytes included;
- every decode-equivalent prefix decodes to its `prefix_digest` (`prefix-digest`);
- when all of that holds, the floor: per piece, one floor object of the floor rung's
capability whose renderer, settings, framing header, unit count and target are
§7.2's (`floor-object-mismatch`) and which presents the piece's base
(`floor-motif-mismatch`); its units each one temporal unit holding a frame, the
first of the first piece carrying a sequence header, every sequence header the
first's bytes, every shown key frame carrying one (`floor-av1-malformed`); each
piece opening on a shown key frame, and no other unit being one unless the policy
allows extra key frames (`floor-keyframe-mismatch`); and the CMAF files are the
ones its temporal units give (§7.6, `floor-cmaf-mismatch`);
- then the catalogs are the ones the index, the objects and the floor give, and an
index no catalog can be written for (a start past `2^53 − 1`) is refused
(`catalog-mismatch`).
7. A metered package's measurement claim (§9.4: `measurement-claim-missing`,
`measurement-claim-invalid`); an object file no entry names (`object-unlisted`); a
catalog file past the ones given (`catalog-unexpected`); any other file
(`unexpected-file`).
**11.4** *What this revision packs.* The reference packager packs one video component
with a `wai.video.int_motion` base (§5.5, §5.6) and a supplied AV1 floor (§7.3). It
refuses by name, before writing anything, what it does not pack yet: another medium
(`pack-media-unsupported`), a refinement rung (`pack-refinement-unsupported`), a rule's
ladder subset (`pack-rule-ladder-unsupported`), a floor to encode
(`pack-floor-encode-unsupported`), and a rung of a capability it does not encode
(`pack-capability-unsupported:<cap>`, every one naming the capability of the rung it
does not pack); and a component with no source (`pack-source-missing`) or whose source's
frame rate is not its timebase (`pack-source-rate`). Where its own work fails it
refuses by name too, and writes nothing: an encode the encoder refuses, such as a piece
past the samples it holds, or an object it wrote that does not count (`pack-encode`); a
piece past `2^32 − 1` units (`pack-piece-length`); catalogs it cannot write, the case
§11.3 refuses as `catalog-mismatch` (`pack-catalog`); a meter that was asked for and
gives no figure, a span too short to reach a microjoule or a figure past `2^64 − 1`
(`pack-meter`, never an unmetered package in its place); a measurement claim it cannot
write (`pack-measurement-claim`); and a listing it cannot write (`pack-listing`). It
writes a package only into a directory that is new or holds nothing, and refuses any
other before it packs (`pack-out-not-empty`): written among another package's files, it
would leave behind the ones it does not write.
## 12. Reasons
@ -347,3 +979,13 @@ re-pack equivalence; they are specified with the packager stages that write them
| `policy-too-many-components`, `policy-too-many-rungs`, `policy-too-many-classes`, `policy-too-many-rules`, `policy-too-many-moments`, `policy-duplicate-id`, `policy-lead`, `policy-open-gop`, `policy-piece-bounds`, `policy-ladder-component`, `policy-refines-role`, `policy-dangling-refines`, `policy-refines-cycle`, `policy-refines-base`, `policy-refines-branch`, `policy-no-base`, `policy-class-layer`, `policy-rule-ladder`, `policy-layer-lag`, `policy-too-many-deadlines`, `policy-deadline-unreachable` | §3.4 |
| `capability-unknown`, `capability-not-payload`, `capability-candidate`, `capability-role`, `license-unclassified`, `license-refused`, each naming the capability (and the licence label) | §3.6 |
| `y4m-header`, `y4m-interlaced`, `y4m-colorspace`, `y4m-size-change`, `y4m-truncated`, `wav-format`, `wav-truncated` | §4.7 |
| `index-magic`, `index-version`, `index-truncated`, `index-reserved`, `index-media-class`, `index-role`, `index-tier`, `index-string`, `index-trailing` | §6.2 |
| `index-timebase`, `window-start`, `piece-order`, `piece-entries`, `piece-kind`, `entry-flags`, `entry-order`, `layer-role`, `refines-outside-window`, `refines-mismatch`, `layer-gap`, `tier-entropy-passthrough`, `tier-weakest`, `tier-mismatch`, `digest-without-tier`, `deadline-role`, `floor-derived-from`, `dup-length`, `dup-flag`, `class-plan`, `class-flags` | §6.3, §6.4 |
| `object-length`, `object-hash`, `non-envelope-entry`, `object-lengths`, `object-capability`, `object-refines`, `object-derived-from` | §6.3 |
| `floor-missing`, `floor-listing-mismatch`, `floor-stream-missing`, `floor-av1-malformed`, `floor-frame-count`, `floor-keyframe-mismatch` | §7.1, §7.3 |
| `floor-object-mismatch`, `floor-motif-mismatch`, `floor-av1-malformed`, `floor-keyframe-mismatch`, `floor-cmaf-mismatch`, against a package | §11.3 |
| `receipt-json`, `receipt-version`, `receipt-index-count`, `receipt-index-digest`, `receipt-stage-root`, `receipt-component`, `receipt-policy-digest`, `receipt-counts`, `receipt-parent-kind`, `receipt-energy`, `receipt-signature` | §9.1 |
| `measurement-claim-missing`, `measurement-claim-invalid` | §9.4 |
| `unexpected-file`, `listing-missing`, `listing-mismatch`, `policy-digest-mismatch`, `policy-json-mismatch`, `policy-component-mismatch`, `index-missing`, `index-policy-mismatch`, `plan-mismatch`, `object-missing`, `prefix-digest`, `catalog-mismatch`, `catalog-unexpected`, `object-unlisted` | §11.3 |
| `pack-id`, `pack-source-missing`, `pack-source-rate`, `pack-media-unsupported`, `pack-refinement-unsupported`, `pack-rule-ladder-unsupported`, `pack-floor-encode-unsupported`, `pack-capability-unsupported` (naming the capability) | §11.1, §11.4 |
| `pack-encode`, `pack-piece-length`, `pack-catalog`, `pack-meter`, `pack-measurement-claim`, `pack-listing`, `pack-out-not-empty` | §11.4 |

View file

@ -6,7 +6,8 @@ digest and what it may ask a packager to emit (§3), how a source is cut into pi
- `policy/` — policies a packager accepts (every rung one it may emit, §3.6), and
`expected.json`: each policy's effective canonical JSON and
digest (`example.toml` also with `royalty_free_only` overridden to false), and the
digest (`eq-defaults-a.toml` also with `royalty_free_only` forced on, the one way an
override changes it, §3.2), and the
pairs `eq-<name>-a.toml` and `eq-<name>-b.toml`, two spellings of one policy that
must have one digest: every default omitted or written out; standard or inline
tables, dotted keys, member order, string escapes, integer notation and comments.
@ -36,6 +37,33 @@ digest and what it may ask a packager to emit (§3), how a source is cut into pi
every fixture (its first 12 frames), under two bounds: each candidate's SSE and SSE
per sample in thousandths, the step chosen, and the chosen payload's BLAKE3.
- `packs/video-base-01/` — a golden package (§5–§11). Its inputs: `policy.toml`, the
supplied floor `floor/v.obu` (an AV1 stream with a key frame at each piece start of
the plan, each piece coded alone, written by an AV1 encoder from the fixture; the
policy pins its listing), and `key.hex` (a test signing seed, never a production
key). `package/` is every file the packer writes from them and the fixture
`video-base-01`: objects, the stage index, the floor's objects and CMAF files, the
catalogs, the receipt and `LISTING`. The fixture's bumper plays twice, so its pieces
are one object each time.
- `mutations/` — stage indexes, objects and version-2 receipts, and `expected.json`:
each case's reason (§6.2–§6.4, §9.1), a well-formed case of each kind among them.
- `receipts/` — version-1 package receipts as JSON (§9.3), with each one's receipt
hash: the legacy receipt whose hash `wai-rs` pins, and an unmetered one.
- `catalogs/` — stage indexes no golden package has (refinements on more than one
deadline), with the MoQ catalog each gives (§8.4).
- `package-mutations/` — packages a verifier must refuse (§11.3), each the golden
altered and, where the receipt or `LISTING` alone would catch the alteration,
re-sealed with the golden's key: what a dishonest packager holding the key could
publish. Each is an overlay on the golden (`<name>/`, the files that differ or are
new; `expected.json`, the files it removes, the directories it adds that hold
nothing or cannot be read, and its reason), written out as a directory and read
strictly by each verifier: a receipt over no component, an index that is not its
policy's, the policy's own refusals (a `policy.json` that turns `royalty_free_only`
off among them), a missing or corrupted object, a live window no catalog can be
written for, floor objects that do not open on a key frame or are not §7.2's, files
and directories a strict read finds, and a receipt file that is not its canonical
form; and one the verifier must accept (an extra key frame the policy allows).
The fixtures are not committed. `wai-pack fixture gen <name>` writes each from its
definition (`wai-pack/src/fixture.rs`), every byte an integer function of the frame
index and the pixel position, and the corpus pins its SHA-256:
@ -44,6 +72,8 @@ index and the pixel position, and the corpus pins its SHA-256:
a fade, which is not cut; and two shots cut against each other, each return a cut.
- `kinds-01` — one shot of each kind, then a static shot longer than the longest
piece, cut where `max` forces it.
- `video-base-01` — 64 × 36: three shots with a one-second bumper between them, the
bumper the same frames both times (its span reads time from its own start).
Files are compared as bytes; `.gitattributes` turns off line-ending conversion.
@ -57,10 +87,13 @@ Files are compared as bytes; `.gitattributes` turns off line-ending conversion.
- `wai-pack conformance check ../pack-conformance` recomputes every expected file and
every generated input and requires them to equal the committed ones, requires the
digests of each equal pair to be equal, decodes every encode payload through
`decode_int` to the encoder's reconstruction and recomputes its SSE. `cargo test`
`decode_int` to the encoder's reconstruction and recomputes its SSE. It packs each
golden again and compares every file, verifies the committed package
(`wai-pack verify`), and gives every mutation and every package mutation its
reason. `cargo test`
runs the same check, with the scene cuts of each fixture stated as tests
(`tests/scenecut.rs`).
- `pack_verify.py`, Python standard library only (TOML through `tomllib`, so 3.11 or
- `pack_verify.py`, Python standard library and, for Ed25519, `cryptography` (TOML through `tomllib`, so 3.11 or
later) and sharing no code with wai-pack, written from the extension: its own policy
schema, constraints, canonical JSON and digest; its own Y4M and WAV readers; the
fixtures regenerated from their definition; `wai.pack.scenecut/1` in its on-demand
@ -69,7 +102,17 @@ Files are compared as bytes; `.gitattributes` turns off line-ending conversion.
(`../registry/capabilities.json`); and every encode payload decoded to its frames'
SHA-256, with its SSE recomputed from the regenerated source. BLAKE3 comes from
`../claim-conformance/_blake3.py`, and the `WIV1` parser and decoder from
`../int-payload-conformance/int_payload_verify.py`.
`../int-payload-conformance/int_payload_verify.py`. For the packages it has its own
stage index reader and rules, object rules (each payload parsed as its pinned format,
a `WIR1` reader included), version-1 and version-2 receipts (Ed25519 through the
`cryptography` package, imported only where a signature is checked), an AV1 stream
and sequence header reader, the CMAF files, and every catalog: it verifies each golden
package in §11.3's order, rebuilding the floor's files and re-rendering the catalogs
byte for byte, gives every mutation its reason, checks the version-1 receipts, and
verifies every package mutation in the same order, refused with its reason.
From the regenerated fixture it re-derives what only the source decides: the pieces,
their rules, moments and class plan, each base's SSE and step, and the encoder's
choices; and it checks the supplied floor against the policy's listing and the plan.
python3 pack-conformance/pack_verify.py pack-conformance

Binary file not shown.

View file

@ -0,0 +1,49 @@
{
"cases": [
{
"index": "catalogs/one-deadline.wsix",
"layer_lag_ms": [
0,
200,
400
],
"default_deadline": 1500,
"floor": {
"codec": "av01.0.00M.08",
"w": 64,
"h": 36
},
"moq": "{\"tracks\":[{\"altGroup\":1,\"name\":\"v/l0\",\"packaging\":\"wai\",\"priority\":64,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_motion\"],\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":0,\"wai_receipts\":false},{\"depends\":[\"v/l0\"],\"name\":\"v/l1\",\"packaging\":\"wai\",\"priority\":96,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":1300,\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":1,\"wai_receipts\":false},{\"depends\":[\"v/l1\"],\"name\":\"v/l2\",\"packaging\":\"wai\",\"priority\":128,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":1100,\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":2,\"wai_receipts\":false},{\"altGroup\":1,\"codec\":\"av01.0.00M.08\",\"height\":36,\"name\":\"v/floor\",\"packaging\":\"cmaf\",\"renderGroup\":1,\"width\":64}],\"version\":1}\n"
},
{
"index": "catalogs/layer-1-on-its-own-deadline.wsix",
"layer_lag_ms": [
0,
200,
400
],
"default_deadline": 1500,
"floor": {
"codec": "av01.0.00M.08",
"w": 64,
"h": 36
},
"moq": "{\"tracks\":[{\"altGroup\":1,\"name\":\"v/l0\",\"packaging\":\"wai\",\"priority\":64,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_motion\"],\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":0,\"wai_receipts\":false},{\"depends\":[\"v/l0\"],\"name\":\"v/l1@800\",\"packaging\":\"wai\",\"priority\":96,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":600,\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":1,\"wai_receipts\":false},{\"depends\":[\"v/l1@800\"],\"name\":\"v/l2\",\"packaging\":\"wai\",\"priority\":128,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":1100,\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":2,\"wai_receipts\":false},{\"altGroup\":1,\"codec\":\"av01.0.00M.08\",\"height\":36,\"name\":\"v/floor\",\"packaging\":\"cmaf\",\"renderGroup\":1,\"width\":64}],\"version\":1}\n"
},
{
"index": "catalogs/both-layers-on-800.wsix",
"layer_lag_ms": [
0,
200,
400
],
"default_deadline": 1500,
"floor": {
"codec": "av01.0.00M.08",
"w": 64,
"h": 36
},
"moq": "{\"tracks\":[{\"altGroup\":1,\"name\":\"v/l0\",\"packaging\":\"wai\",\"priority\":64,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_motion\"],\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":0,\"wai_receipts\":false},{\"depends\":[\"v/l0\"],\"name\":\"v/l1@800\",\"packaging\":\"wai\",\"priority\":96,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":600,\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":1,\"wai_receipts\":false},{\"depends\":[\"v/l1@800\"],\"name\":\"v/l2@800\",\"packaging\":\"wai\",\"priority\":128,\"renderGroup\":1,\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":400,\"wai_determinism\":\"decode-equivalence\",\"wai_layer\":2,\"wai_receipts\":false},{\"altGroup\":1,\"codec\":\"av01.0.00M.08\",\"height\":36,\"name\":\"v/floor\",\"packaging\":\"cmaf\",\"renderGroup\":1,\"width\":64}],\"version\":1}\n"
}
]
}

Binary file not shown.

View file

@ -0,0 +1,505 @@
{
"cases": [
{
"name": "ok",
"kind": "index",
"index": "index/ok.wsix",
"reason": "ok"
},
{
"name": "refines-flipped",
"kind": "index",
"index": "index/refines-flipped.wsix",
"reason": "refines-mismatch"
},
{
"name": "layer-gap",
"kind": "index",
"index": "index/layer-gap.wsix",
"reason": "layer-gap"
},
{
"name": "refines-outside-window",
"kind": "index",
"index": "index/refines-outside-window.wsix",
"reason": "refines-outside-window"
},
{
"name": "tier-entropy-over-entropy",
"kind": "index",
"index": "index/tier-entropy-over-entropy.wsix",
"reason": "tier-entropy-passthrough"
},
{
"name": "tier-decode-over-entropy",
"kind": "index",
"index": "index/tier-decode-over-entropy.wsix",
"reason": "tier-weakest"
},
{
"name": "tier-on-floor",
"kind": "index",
"index": "index/tier-on-floor.wsix",
"reason": "tier-mismatch"
},
{
"name": "digest-without-tier",
"kind": "index",
"index": "index/digest-without-tier.wsix",
"reason": "digest-without-tier"
},
{
"name": "dup-flag-missing",
"kind": "index",
"index": "index/dup-flag-missing.wsix",
"reason": "dup-flag"
},
{
"name": "dup-flag-lie",
"kind": "index",
"index": "index/dup-flag-lie.wsix",
"reason": "dup-flag"
},
{
"name": "dup-length",
"kind": "index",
"index": "index/dup-length.wsix",
"reason": "dup-length"
},
{
"name": "floor-at-layer-1",
"kind": "index",
"index": "index/floor-at-layer-1.wsix",
"reason": "layer-role"
},
{
"name": "base-with-refines",
"kind": "index",
"index": "index/base-with-refines.wsix",
"reason": "layer-role"
},
{
"name": "floor-before-refinement",
"kind": "index",
"index": "index/floor-before-refinement.wsix",
"reason": "entry-order"
},
{
"name": "deadline-on-base",
"kind": "index",
"index": "index/deadline-on-base.wsix",
"reason": "deadline-role"
},
{
"name": "floor-without-derived-from",
"kind": "index",
"index": "index/floor-without-derived-from.wsix",
"reason": "floor-derived-from"
},
{
"name": "entry-flag-unknown",
"kind": "index",
"index": "index/entry-flag-unknown.wsix",
"reason": "entry-flags"
},
{
"name": "piece-gap",
"kind": "index",
"index": "index/piece-gap.wsix",
"reason": "piece-order"
},
{
"name": "piece-empty",
"kind": "index",
"index": "index/piece-empty.wsix",
"reason": "piece-order"
},
{
"name": "piece-entries-overlap",
"kind": "index",
"index": "index/piece-entries-overlap.wsix",
"reason": "piece-entries"
},
{
"name": "entry-in-another-piece",
"kind": "index",
"index": "index/entry-in-another-piece.wsix",
"reason": "piece-entries"
},
{
"name": "piece-kind-unknown",
"kind": "index",
"index": "index/piece-kind-unknown.wsix",
"reason": "piece-kind"
},
{
"name": "plan-past-piece",
"kind": "index",
"index": "index/plan-past-piece.wsix",
"reason": "class-plan"
},
{
"name": "plan-past-class",
"kind": "index",
"index": "index/plan-past-class.wsix",
"reason": "class-plan"
},
{
"name": "plan-floor-only-class",
"kind": "index",
"index": "index/plan-floor-only-class.wsix",
"reason": "class-plan"
},
{
"name": "class-flag-unknown",
"kind": "index",
"index": "index/class-flag-unknown.wsix",
"reason": "class-flags"
},
{
"name": "timebase-zero",
"kind": "index",
"index": "index/timebase-zero.wsix",
"reason": "index-timebase"
},
{
"name": "on-demand-first-piece",
"kind": "index",
"index": "index/on-demand-first-piece.wsix",
"reason": "window-start"
},
{
"name": "on-demand-first-entry",
"kind": "index",
"index": "index/on-demand-first-entry.wsix",
"reason": "window-start"
},
{
"name": "on-demand-start",
"kind": "index",
"index": "index/on-demand-start.wsix",
"reason": "window-start"
},
{
"name": "truncated-table",
"kind": "index",
"index": "index/truncated-table.wsix",
"reason": "index-truncated"
},
{
"name": "trailing",
"kind": "index",
"index": "index/trailing.wsix",
"reason": "index-trailing"
},
{
"name": "magic",
"kind": "index",
"index": "index/magic.wsix",
"reason": "index-magic"
},
{
"name": "version",
"kind": "index",
"index": "index/version.wsix",
"reason": "index-version"
},
{
"name": "media-class",
"kind": "index",
"index": "index/media-class.wsix",
"reason": "index-media-class"
},
{
"name": "reserved",
"kind": "index",
"index": "index/reserved.wsix",
"reason": "index-reserved"
},
{
"name": "role",
"kind": "index",
"index": "index/role.wsix",
"reason": "index-role"
},
{
"name": "tier",
"kind": "index",
"index": "index/tier.wsix",
"reason": "index-tier"
},
{
"name": "string-index",
"kind": "index",
"index": "index/string-index.wsix",
"reason": "index-string"
},
{
"name": "objects-ok",
"kind": "objects",
"index": "objects-index/ok.wsix",
"objects": "objects/",
"reason": "ok"
},
{
"name": "objects-cmaf-listed",
"kind": "objects",
"index": "objects-index/cmaf-listed.wsix",
"objects": "objects/",
"reason": "non-envelope-entry"
},
{
"name": "objects-missing",
"kind": "objects",
"index": "objects-index/missing.wsix",
"objects": "objects/",
"reason": "object-missing"
},
{
"name": "objects-hash",
"kind": "objects",
"index": "objects-index/hash.wsix",
"objects": "objects/",
"reason": "object-hash"
},
{
"name": "objects-not-its-format",
"kind": "objects",
"index": "objects-index/not-its-format.wsix",
"objects": "objects/",
"reason": "object-lengths"
},
{
"name": "objects-length",
"kind": "objects",
"index": "objects-index/length.wsix",
"objects": "objects/",
"reason": "object-length"
},
{
"name": "objects-lengths",
"kind": "objects",
"index": "objects-index/lengths.wsix",
"objects": "objects/",
"reason": "object-lengths"
},
{
"name": "objects-capability",
"kind": "objects",
"index": "objects-index/capability.wsix",
"objects": "objects/",
"reason": "object-capability"
},
{
"name": "objects-derived-from",
"kind": "objects",
"index": "objects-index/derived-from.wsix",
"objects": "objects/",
"reason": "object-derived-from"
},
{
"name": "objects-refines-names-another",
"kind": "objects",
"index": "objects-index/refines-names-another.wsix",
"objects": "objects/",
"reason": "object-refines"
},
{
"name": "receipt-ok",
"kind": "receipt",
"receipt": "receipt/ok.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "ok"
},
{
"name": "receipt-ok-labelled",
"kind": "receipt",
"receipt": "receipt/ok-labelled.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "ok"
},
{
"name": "receipt-ok-live-window",
"kind": "receipt",
"receipt": "receipt/ok-live-window.json",
"indexes": [
"receipt/live/index-v.wsix"
],
"reason": "ok"
},
{
"name": "receipt-counts",
"kind": "receipt",
"receipt": "receipt/counts.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-counts"
},
{
"name": "receipt-parent-kind",
"kind": "receipt",
"receipt": "receipt/parent-kind.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-parent-kind"
},
{
"name": "receipt-parent-kind-live",
"kind": "receipt",
"receipt": "receipt/parent-kind-live.json",
"indexes": [
"receipt/live/index-v.wsix"
],
"reason": "receipt-parent-kind"
},
{
"name": "receipt-stage-root",
"kind": "receipt",
"receipt": "receipt/stage-root.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-stage-root"
},
{
"name": "receipt-index-digest",
"kind": "receipt",
"receipt": "receipt/index-digest.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-index-digest"
},
{
"name": "receipt-media-class",
"kind": "receipt",
"receipt": "receipt/media-class.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-component"
},
{
"name": "receipt-policy-digest",
"kind": "receipt",
"receipt": "receipt/policy-digest.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-policy-digest"
},
{
"name": "receipt-energy",
"kind": "receipt",
"receipt": "receipt/energy.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-energy"
},
{
"name": "receipt-signature",
"kind": "receipt",
"receipt": "receipt/signature.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-signature"
},
{
"name": "receipt-unknown-member",
"kind": "receipt",
"receipt": "receipt/unknown-member.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-duplicate-member",
"kind": "receipt",
"receipt": "receipt/duplicate-member.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-minus-zero",
"kind": "receipt",
"receipt": "receipt/minus-zero.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-lone-surrogate",
"kind": "receipt",
"receipt": "receipt/lone-surrogate.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-null-value",
"kind": "receipt",
"receipt": "receipt/null-value.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-energy-member-missing",
"kind": "receipt",
"receipt": "receipt/energy-member-missing.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-evidence-without-class",
"kind": "receipt",
"receipt": "receipt/evidence-without-class.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-no-component",
"kind": "receipt",
"receipt": "receipt/no-component.json",
"indexes": [],
"reason": "receipt-index-count"
},
{
"name": "receipt-receipt-hash",
"kind": "receipt",
"receipt": "receipt/receipt-hash.json",
"indexes": [
"receipt/index-v.wsix"
],
"reason": "receipt-json"
},
{
"name": "receipt-two-components-one-id",
"kind": "receipt",
"receipt": "receipt/two-components-one-id.json",
"indexes": [
"receipt/index-v.wsix",
"receipt/index-v.wsix"
],
"reason": "receipt-component"
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"bb5d938ee67a49d3b1a365d53c99b3035d3f5fef01140c01eac707d0377f88fc","sig":"900be144043bce37a5608f4b6844df6b1a4ba4dabe2d8d0ef564a4ca2d64c4cafe159446aed69c298741f723ff700547b56fe4a20708609ae99d89b0090a8106","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2302,"total_bytes":2746,"total_entries":6,"unique_objects":4,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"forged","asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":12,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"b0f4d57cd186a32e5ab6e0186e875f97716e5d11e7e0f8bc3c2a1f6bca815885","sig":"ea3e286e2b489730120665d2bd6869bb356ddd85d413e50a2dc78e0644b8a2a78ad61580ac2cf0259d361fa603af6a4427b2564b5802677db74ca1896dbb6403","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"energy_uncertainty":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"0000000000000000000000000000000000000000000000000000000000000000","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"a49d887c53b7520c90f25995a862a6700834e4996a4758d3dd9c5233e238495d","sig":"cba5ac5bcb072db6b72b9295e9bdd8cecc7ba62fe71e7668ba4efd982b5d76eadec6bea34c875da7f66b79dcdbf11a58c9885a49ebcf41d9c563f17c45aa0701","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

Binary file not shown.

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"\ud800did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"audio","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"e88ed17039da041c5f34112d541ff4c5be9839dff10ace2d2b4c8d02dbb3080a","sig":"9bc82aa4a6428eae4a0460eb517cf178c110bf9fbefdf07af9994ccee17fa9688f3c9202c5a64c3d4394775dd7bccaf9598bf75c9944536c1c3d8eef95257405","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":-0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"e77fea3f0ba63518d3c517764335cabf024d6291b12acdbfc3130be6e3f9bef4","sig":"4d60d7be1a72000593ed93273499eb488e869bc179568b0dac29505bc999591f7450ab9bd519fdc42c5ce90a8097b6e9602a29671c6131a4126059b182844704","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":0,"total_bytes":0,"total_entries":0,"unique_objects":0,"version":2,"work_units":0}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":null,"parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":"ModelBased","grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":25000,"kind":"package","packager":"builtin:[email protected]","parent_kind":"re-pack","parent_receipt_hash":"0303030303030303030303030303030303030303030303030303030303030303","policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"25641733a1cd68a0b2ad3186733259b2dc297df04be31e7d37f8075f7392bb19","sig":"65ac5b18375489d2658f4ac55bac013c1ca135a510070b132de86cf31f3b635e6b7eecdb285106cd00ba4c8b92b5344a2e1b860e0831e8c21538eca397920c05","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"1a198b17cf576faadf0cfe4dcbe7be1fee7e451307145120c9075f26b2cc1521","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"live-window","parent_receipt_hash":"0404040404040404040404040404040404040404040404040404040404040404","policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"d5462e7c710ba3719759ff61e569cf185dcebf1ca12f374fca9a8dd88601c305","sig":"f37f38431ed3e731e27e05d7f3a86c109846fe3cbf45c6383cc1ed937ea77d4edca47becd7c4a1ab98e179d3763356b8a4105a85c714e3899c9533bb27282d0d","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"1a198b17cf576faadf0cfe4dcbe7be1fee7e451307145120c9075f26b2cc1521","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"a5e6c44c2268270461028a317c325e419af15afd006608773f9104e27b2d0808","sig":"273eb0d3e1de76a01e01c1098e6208fdc9c4efed0fe6c05c0faac106ca14d5524ad645610c831940823fdb8e06e763c1324c82b66d744adcfcb2d5b3202a2901","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"live-window","parent_receipt_hash":"0404040404040404040404040404040404040404040404040404040404040404","policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"607237889e3366d7547df87faeff129c94a8fb630cb2c2db9b7734d9b5b23f07","sig":"1f13e250c8893ad224a90496f9792e94aedf101028a9f3e8f0aa844e1324eac4431da3120325523167d7a0a46a5c9aaa4187ccd8484b17de5a39a57a00887206","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0202020202020202020202020202020202020202020202020202020202020202","receipt_hash":"7a87af7d26d74407cc93461bb67ecfd0f166bbc74609d454eedd605de51dfc30","sig":"f46605ce5837222b96d7f8da2c5a58640af0c0dd39a73869992f69d25e4da6ed226ded18fae12d8b2e790e765ed386dbfe7150321b7e6b8b8926b052271b6006","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2747,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"c47f4c9274634eb903492e7ddae2629fcb8c048d25d8ebd10eef07029897be61","sig":"1e484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"0000000000000000000000000000000000000000000000000000000000000000"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"59a6e3757d95053e656d6849d3b728e1207a44f7cfb69e6fc6b1d4383eb9b115","sig":"eadcbecd10d8a24617af708ae31c898f16115151eeceba3521046e478c5ea92401096409d5e5dd59f225cffcab79185ecaf0aced21eef885b367c2a8539ea305","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

View file

@ -0,0 +1 @@
{"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"},{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"31c0763dfaf0816febf5cff79fa80c7014f3afe7f54d2f0059ed33df127ab175","sig":"e7010f2da7361cbddb9e3da971fec47193e85b6cbc3bb103105beae5bcf7f3bceb0b65a91932c0d6c46b9f46d9cf199427463dac011963aca3409e53495c470a","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":5492,"total_entries":12,"unique_objects":5,"version":2,"work_units":12}

View file

@ -0,0 +1 @@
{"extra":1,"asset_id":"mutations","components":[{"id":"v","index":"index-v.wsix","index_digest":"354687c821d088507431959415d285bbb20d02526c614d2e3092adbd48a93d5e","media_class":"video","stage_root":"cc3482c7ed8d99b58f5fd11ae463919d09e27a853d1b3cd5bbfa4b5bedcaa2e3"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"0101010101010101010101010101010101010101010101010101010101010101","receipt_hash":"fa8179343882a12c696cd1fdf2eb5e83b2c461b546bca97b683897e815543ff0","sig":"1f484235104243d9836144636997793a2cd54698c00f6472080d4c0af75c40cef879bcd64b956d173ff1f280bf3813bd8a8a109dbe5b9b59f05be8bf482c630c","signer_id":"did:key:z6MkghLt1e8m1fmANsdJJco3aCLV8Xnigr5UWwC3u5iZFPd3","signer_pubkey":"2152f8d19b791d24453242e15f2eab6cb7cffa7b6a5ed30097960e069881db12","stored_bytes":2312,"total_bytes":2746,"total_entries":6,"unique_objects":5,"version":2,"work_units":6}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,34 @@
91b8aba2292191f2046eb841fe6fcb7b214826cecd9e06a3c193a68e7089e144 dash/classic.mpd
a3aa7658db9b85a9d9a1fed977825189f75c5adad0f5fdfcd70ebd604824c138 dash/mobile.mpd
3f520749a6d2f231cddfd17804ee3629439f3678515e424c44e36cff54d89de9 dash/tv.mpd
04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6 floor/v/04c948608aaa7b5d78ad5355042a2ff65b0f75d9d4b1ad78f3ebffb886a74be6.m4s
06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf floor/v/06d5cd79ba3860cccdc252fe915de0902f941a3c6a000295714f7cab193aa6cf.m4s
2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b floor/v/2f93f0ad449f9cc881b7816c6ab33fd445037d6538b445bcc76431f9c9f91c5b.m4s
420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a floor/v/420ae4c941bba6e12a6c7fdb7d01dc69170ecb4240dffd2e86808ddf87baa12a.m4s
99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15 floor/v/99a24de04f7be9fc21097e69d2d61b222e458b1f93b8082026a9874aeb9f4c15.m4s
58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/v/init.mp4
289bfcb09eb25124ac19597bc624371c34bea00aa1011ced9372d96b5e14b2bd hls/classic/floor-v.m3u8
15a96a7b9a5d5608ebaaf5976cd6ad88bed032ca60c4ecd246e142022e071be5 hls/classic/master.m3u8
c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/mobile/master.m3u8
c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai-v.m3u8
60a6378f46afc9308dc4ac4d138602b16568577616ea0bf4526b142d86899151 hls/mobile/wai.m3u8
c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.m3u8
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
13b7a7cf473134c1a9dfb0a380c4464bcd5e3a7f2e007efe65f32fd9422175c0 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai
f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai
9fdf29f5c9536d1f7701c791328d656ef725ba9b8cb3760bdb00f5a503c69338 objects/761c4649427c51796a2b699568775765b209ee80d2f4fc1cf040838c6724aa2d.wai
a3135205d3139b39409d4e4e2aafed2c042797d293a9f9fc8664467165336e25 objects/7cc2b824ad6105abfccae27093190311b6a2348842e571684b021a213341b94a.wai
3c66c0b25b759cd1fe6245d282ba928441b873d62e4ac62c95260e45a80fff77 objects/8f748dc64787b5c5ece081270c8559277f926322dd6ddc345306b8231f2d1752.wai
b2a40a9a8cec3dcaf6c92a07d6765203c412c57ec879b7e33a52eabb2e74609d objects/c2ce1907255a041c388afd06ccd007436368e8d20467fdec2a1eebbb84b03bf2.wai
f7c00e64b3ba869ad37e3619325d319ee016df3cc294b674713613bc0c1dc087 package.receipt.json
517630d9bee1f5559baff3bb3e642f6aa7b5276226f6e3bdba4f3f9724794859 plan-v.txt
d57f898e6963d4c23a6dc68d965a8b5cbbc103c4de7a28cf21c1f76c67d1ccde policy.json
7f13bffabbf78b92ef693c5c652e2ab3e391e6adbe0f16a4c0eaf2d77ade1ec7 policy.toml
755a1ba06a6b1e5ea0b6169208003deb71ed4d354e4d1abfed21bbe3c931ede3 stages/Classic.json
19406636eb9381287af74850d62f5b1dcaea9e8ee4a15e721b6fb6f0c77aa75d stages/mobile.json
50a07904652a6807db44c6f628fdcb5e7f0851753527301167c18f5e7536a41a stages/tv.json

View file

@ -0,0 +1 @@
{"asset_id":"video-base-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"0fdaa41306fde107a6e19d5a360ce4cb8cc638a3ce15dba75abaa2d1d94c796b","media_class":"video","stage_root":"bd0c7799633b108cf9ccb0c7a4cedbdf6173a83470d3d96b94d075c03e0db7b6"}],"energy_provenance":null,"grant":{"capability":"wai.video.package","funds_ceiling":null,"grant_hash":"0000000000000000000000000000000000000000000000000000000000000000","joule_ceiling_micro":null},"joules_micro":0,"kind":"package","packager":"builtin:[email protected]","parent_kind":"none","parent_receipt_hash":null,"policy_digest":"3f597d88fc83ef8f93b0a07623642ff01460cf09af22d61339373bbe1cb882ee","receipt_hash":"2d4df45396b6fc0f60b3f323934c327118fc1cc2af178cc94692de12b59c3b89","sig":"f09843f6cd58550809ecdbda30450bcf52996ce9cc637996ccb1ed28d4482c4aba668d2d722b148d4517e1231cde8c3a6816c816c9c25bc3cec6a7941c439a0a","signer_id":"did:key:z6MkfMo6gxqdBhaHMNnmfhgZFBjpCDTkmJMJLoypsBZS9PwD","signer_pubkey":"0d7550754e0800a5d237eef5826035766b9b3e5a15868a940ab289958788e3b0","stored_bytes":119779,"total_bytes":130963,"total_entries":10,"unique_objects":8,"version":2,"work_units":10}

View file

@ -0,0 +1 @@
{"asset_id":"video-base-01","class":[{"floor_only":false,"id":"tv","max_layer":0},{"floor_only":false,"id":"mobile","max_kbps":100,"max_layer":0},{"floor_only":true,"id":"Classic","max_layer":0}],"classify":{"motion_high_milli":9000,"static_mad_milli":300,"static_permille":5,"synthetic_bins":12},"component":[{"id":"v","media":"video","source":"video-base-01.y4m","timebase":{"den":1,"num":25}}],"defaults":{"deadline_ms":1500},"floor":{"extra_keyframes":false,"supplied_listing":"6b5ed967f771b936390b4101743a6f6fec8bf0fa2abd1165add3e750b0b86dab"},"ladder":[{"capability":"wai.video.int_motion","component":"v","id":"b0","params":{"block":16,"max_sse_px_milli":30000,"mv_precision":1,"q_candidates":[16,12,8],"search":4},"role":"base"},{"capability":"wai.video.av1","component":"v","id":"f0","params":{"source":"supplied"},"role":"floor"}],"lead":"v","live":{"layer_lag_ms":[0]},"moment":[],"royalty_free_only":true,"rule":[],"schema":"wai.pack.policy/1","segmentation":{"closed":true,"cut_abs_permille":300,"cut_rel_permille":3000,"cut_window":8,"lookahead_frames":6,"max_ms":4000,"min_ms":1000,"scene_cut":"wai.pack.scenecut/1","target_ms":2000}}

View file

@ -0,0 +1,47 @@
schema = "wai.pack.policy/1"
asset_id = "video-base-01"
royalty_free_only = true
lead = "v"
[[component]]
id = "v"
media = "video"
source = "video-base-01.y4m"
[component.timebase]
num = 25
den = 1
[segmentation]
target_ms = 2000
min_ms = 1000
max_ms = 4000
[[ladder]]
id = "b0"
component = "v"
capability = "wai.video.int_motion"
role = "base"
params = { block = 16, search = 4, mv_precision = 1, q_candidates = [16, 12, 8], max_sse_px_milli = 30000 }
[[ladder]]
id = "f0"
component = "v"
capability = "wai.video.av1"
role = "floor"
params = { source = "supplied" }
[floor]
supplied_listing = "6b5ed967f771b936390b4101743a6f6fec8bf0fa2abd1165add3e750b0b86dab"
[[class]]
id = "tv"
max_layer = 0
[[class]]
id = "mobile"
max_kbps = 100
[[class]]
id = "Classic"
floor_only = true

View file

@ -0,0 +1 @@
{"class":"Classic","components":{"v":{"pieces":[{"dur":60,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"floor_only":true,"p":1,"stages":[],"start":60},{"dur":50,"floor_only":true,"p":2,"stages":[],"start":85},{"dur":25,"floor_only":true,"p":3,"stages":[],"start":135},{"dur":40,"floor_only":true,"p":4,"stages":[],"start":160}]}},"policy_digest":"3f597d88fc83ef8f93b0a07623642ff01460cf09af22d61339373bbe1cb882ee"}

Some files were not shown because too many files have changed in this diff Show more