wai-pack: packages — the stage index, the version-2 package receipt, the floor, and HLS, DASH and Media over QUIC views #172
338 changed files with 13207 additions and 84 deletions
56
.github/workflows/wai-pack.yml
vendored
56
.github/workflows/wai-pack.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
|
|
|
|||
35
wai/SPEC.md
35
wai/SPEC.md
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
BIN
wai/pack-conformance/catalogs/both-layers-on-800.wsix
Normal file
BIN
wai/pack-conformance/catalogs/both-layers-on-800.wsix
Normal file
Binary file not shown.
49
wai/pack-conformance/catalogs/expected.json
Normal file
49
wai/pack-conformance/catalogs/expected.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
wai/pack-conformance/catalogs/layer-1-on-its-own-deadline.wsix
Normal file
BIN
wai/pack-conformance/catalogs/layer-1-on-its-own-deadline.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/catalogs/one-deadline.wsix
Normal file
BIN
wai/pack-conformance/catalogs/one-deadline.wsix
Normal file
Binary file not shown.
505
wai/pack-conformance/mutations/expected.json
Normal file
505
wai/pack-conformance/mutations/expected.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
wai/pack-conformance/mutations/index/base-with-refines.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/base-with-refines.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/class-flag-unknown.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/class-flag-unknown.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/deadline-on-base.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/deadline-on-base.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/digest-without-tier.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/digest-without-tier.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/dup-flag-lie.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/dup-flag-lie.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/dup-flag-missing.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/dup-flag-missing.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/dup-length.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/dup-length.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/entry-flag-unknown.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/entry-flag-unknown.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/entry-in-another-piece.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/entry-in-another-piece.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/floor-at-layer-1.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/floor-at-layer-1.wsix
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/layer-gap.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/layer-gap.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/magic.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/magic.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/media-class.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/media-class.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/ok.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/ok.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/on-demand-first-entry.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/on-demand-first-entry.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/on-demand-first-piece.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/on-demand-first-piece.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/on-demand-start.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/on-demand-start.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/piece-empty.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/piece-empty.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/piece-entries-overlap.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/piece-entries-overlap.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/piece-gap.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/piece-gap.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/piece-kind-unknown.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/piece-kind-unknown.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/plan-floor-only-class.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/plan-floor-only-class.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/plan-past-class.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/plan-past-class.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/plan-past-piece.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/plan-past-piece.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/refines-flipped.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/refines-flipped.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/refines-outside-window.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/refines-outside-window.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/reserved.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/reserved.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/role.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/role.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/string-index.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/string-index.wsix
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/tier-on-floor.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/tier-on-floor.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/tier.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/tier.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/timebase-zero.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/timebase-zero.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/trailing.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/trailing.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/truncated-table.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/truncated-table.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/index/version.wsix
Normal file
BIN
wai/pack-conformance/mutations/index/version.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/capability.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/capability.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/cmaf-listed.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/cmaf-listed.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/derived-from.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/derived-from.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/hash.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/hash.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/length.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/length.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/lengths.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/lengths.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/missing.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/missing.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/not-its-format.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/not-its-format.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/objects-index/ok.wsix
Normal file
BIN
wai/pack-conformance/mutations/objects-index/ok.wsix
Normal file
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.
1
wai/pack-conformance/mutations/receipt/counts.json
Normal file
1
wai/pack-conformance/mutations/receipt/counts.json
Normal 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}
|
||||
|
|
@ -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}
|
||||
|
|
@ -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}
|
||||
1
wai/pack-conformance/mutations/receipt/energy.json
Normal file
1
wai/pack-conformance/mutations/receipt/energy.json
Normal 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}
|
||||
|
|
@ -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}
|
||||
1
wai/pack-conformance/mutations/receipt/index-digest.json
Normal file
1
wai/pack-conformance/mutations/receipt/index-digest.json
Normal 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}
|
||||
BIN
wai/pack-conformance/mutations/receipt/index-v.wsix
Normal file
BIN
wai/pack-conformance/mutations/receipt/index-v.wsix
Normal file
Binary file not shown.
BIN
wai/pack-conformance/mutations/receipt/live/index-v.wsix
Normal file
BIN
wai/pack-conformance/mutations/receipt/live/index-v.wsix
Normal file
Binary file not shown.
|
|
@ -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}
|
||||
1
wai/pack-conformance/mutations/receipt/media-class.json
Normal file
1
wai/pack-conformance/mutations/receipt/media-class.json
Normal 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}
|
||||
1
wai/pack-conformance/mutations/receipt/minus-zero.json
Normal file
1
wai/pack-conformance/mutations/receipt/minus-zero.json
Normal 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}
|
||||
1
wai/pack-conformance/mutations/receipt/no-component.json
Normal file
1
wai/pack-conformance/mutations/receipt/no-component.json
Normal 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}
|
||||
1
wai/pack-conformance/mutations/receipt/null-value.json
Normal file
1
wai/pack-conformance/mutations/receipt/null-value.json
Normal 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}
|
||||
1
wai/pack-conformance/mutations/receipt/ok-labelled.json
Normal file
1
wai/pack-conformance/mutations/receipt/ok-labelled.json
Normal 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}
|
||||
|
|
@ -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}
|
||||
1
wai/pack-conformance/mutations/receipt/ok.json
Normal file
1
wai/pack-conformance/mutations/receipt/ok.json
Normal 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}
|
||||
|
|
@ -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}
|
||||
1
wai/pack-conformance/mutations/receipt/parent-kind.json
Normal file
1
wai/pack-conformance/mutations/receipt/parent-kind.json
Normal 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}
|
||||
|
|
@ -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}
|
||||
1
wai/pack-conformance/mutations/receipt/receipt-hash.json
Normal file
1
wai/pack-conformance/mutations/receipt/receipt-hash.json
Normal 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}
|
||||
1
wai/pack-conformance/mutations/receipt/signature.json
Normal file
1
wai/pack-conformance/mutations/receipt/signature.json
Normal 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}
|
||||
1
wai/pack-conformance/mutations/receipt/stage-root.json
Normal file
1
wai/pack-conformance/mutations/receipt/stage-root.json
Normal 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}
|
||||
|
|
@ -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}
|
||||
|
|
@ -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
|
|
@ -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
|
||||
Binary file not shown.
|
|
@ -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}
|
||||
|
|
@ -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}}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
Loading…
Reference in a new issue