wai-pack: staged packages — refinement layers, stills, a piece's ladder, live windows and simulated delivery (W4-4) #199

Merged
dcharlot merged 27 commits from wai/w4-4-staged-packages into main 2026-10-11 16:58:55 -04:00
279 changed files with 10588 additions and 668 deletions

View file

@ -717,6 +717,20 @@ jobs:
working-directory: wai
shell: bash
run: python3 staged-measure-conformance/sim_verify.py staged-measure-conformance
# The simulator differentially, outside the corpus: seeded random models (a refinement
# with its own delivery timeout among them) and plans, each simulated by
# wai_stage_measure sim and by sim_verify.py, the refusal or the whole result, the
# stall bound and the longest stall equal, and every stall within the bound where it
# applies. Two fixed seeds, so a run is reproducible.
- name: sim_diff.py, wai_stage_measure against sim_verify.py
working-directory: wai
shell: bash
run: |
set -euo pipefail
(cd wai-rs && cargo build --no-default-features --features stage_measure --bin wai_stage_measure)
for seed in 1 2; do
python3 staged-measure-conformance/sim_diff.py wai-rs/target/debug/wai_stage_measure "$seed" 1500
done
# The quantum corpus's second implementation (quantum-sim extension), integers only:
# it derives the circuit/1 phase table by its recurrence and the circuit2 table by an
# interval-certified procedure, and requires both literal tables and their digests,

View file

@ -9,15 +9,19 @@ name: wai-pack
# 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, the golden packages
# verified and re-derived from their sources among it.
# verified and re-derived from their sources among it (every refinement layer and
# still byte for byte, every delivery case through the staged-measurement simulator's
# Python twin); and the differentials: source readers, policies, scene cuts, the
# staged packer (layers, stills, piece plans, deliveries), and a still's reader.
# - 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.
#
# Push filters match the push's delta, so every path a build or a verifier reads is
# listed: the crate, the wai crate it builds on, the corpus, the BLAKE3 and integer
# payload verifiers and the registry export pack_verify.py reads, and this file.
# listed: the crate, the wai crate it builds on, the corpus, the BLAKE3, integer payload,
# staged-delivery and staged-measurement verifiers and the registry export pack_verify.py
# reads, and this file.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@ -32,6 +36,10 @@ on:
- 'wai/claim-conformance/_blake3.py'
- 'wai/claim-conformance/_ed25519.py'
- 'wai/int-payload-conformance/int_payload_verify.py'
- 'wai/staged-conformance/staged_verify.py'
- 'wai/staged-measure-conformance/sim_verify.py'
- 'wai/staged-measure-conformance/measure_verify.py'
- 'wai/http-conformance/http_verify.py'
- 'wai/registry/capabilities.json'
- '.github/workflows/wai-pack.yml'
push:
@ -43,6 +51,10 @@ on:
- 'wai/claim-conformance/_blake3.py'
- 'wai/claim-conformance/_ed25519.py'
- 'wai/int-payload-conformance/int_payload_verify.py'
- 'wai/staged-conformance/staged_verify.py'
- 'wai/staged-measure-conformance/sim_verify.py'
- 'wai/staged-measure-conformance/measure_verify.py'
- 'wai/http-conformance/http_verify.py'
- 'wai/registry/capabilities.json'
- '.github/workflows/wai-pack.yml'
@ -129,13 +141,14 @@ 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 28
--lib 34
--test=conformance 1
--test=packs 7
--test=review 9
--test=refusals 5
--test=scenecut 3
--test=source_alloc 1
--test=staged 10
EOF
exit $fail
@ -199,6 +212,27 @@ jobs:
shell: bash
working-directory: wai/wai-pack
run: python3 ../pack-conformance/segment_diff.py target/release/wai-pack 1 2000
# The staged packer differentially: refinement layers, stills, piece plans and
# deliveries on seeded random inputs, every result of wai-pack equal to
# pack_verify.py's (debug and release, both with overflow checks).
- name: stage_diff.py, wai-pack against pack_verify.py
shell: bash
working-directory: wai/wai-pack
run: |
set -euo pipefail
python3 ../pack-conformance/stage_diff.py target/debug/wai-pack 1 1000
python3 ../pack-conformance/stage_diff.py target/release/wai-pack 2 3000
# A still's reader differentially: the zlib library's own streams, dynamic blocks
# built on each of RFC 1951's and zlib's code-set rules, and their alterations, every
# verdict of wai-pack's reader equal to pack_verify.py's, which inflates with
# Python's zlib (debug and release).
- name: png_diff.py, wai-pack against pack_verify.py
shell: bash
working-directory: wai/wai-pack
run: |
set -euo pipefail
python3 ../pack-conformance/png_diff.py target/debug/wai-pack 1 2000
python3 ../pack-conformance/png_diff.py target/release/wai-pack 2 4000
media:
name: wai-pack · the floor through a media prober
@ -216,22 +250,25 @@ jobs:
# 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
- name: The goldens' floors read and decode
shell: bash
working-directory: wai/pack-conformance/packs/video-base-01/package
working-directory: wai/pack-conformance/packs
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"
for g in video-base-01 video-staged-01; do
( cd "$g/package"
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 "$g key frames: $keys"
[ "$keys" = "$want" ] || { echo "::error::$g: key frames at $keys; the plan says $want"; exit 1; }
ffmpeg -v error -xerror -i "$tmp/floor.mp4" -f null -
echo "$g: the floor reads as one AV1 track of 200 frames, a key frame at each piece start" )
done
licences:
name: wai-pack · dependency licences

View file

@ -6,6 +6,81 @@ wire format may change and such changes are recorded here.
## v0.4.0 — current
### Packaging: refinement layers, stills, a piece's ladder, live windows and delivery
- **Refinement layers in packages** ([packaging](extensions/packaging.md) §5.4). For
each refinement rung of a piece's ladder the packer writes a `wai.video.int_refine`
object over the piece's `wai.video.int_motion` base: the manifest `wai stage refine`
writes, and a `WIR1` from `wai-rs`'s refinement encoder (`staged::wir1::encode`), one
unit per frame, toward the source from the stage below as a sink reconstructs it. Each
layer is applied to the decoded base by the reference sink before it is kept; the
index states each prefix's tier, digest, SSE and deadline.
- **A piece's ladder, and stills** (§5.7). A rule's `then.ladder` chooses the rungs a
piece is coded in; otherwise the component's first base rung, its refinement chain and
its floors. §3.4 item 10 now requires a rule's ladder to name exactly one base, every
refinement over a rung it names, and every floor of its component. A base of
`wai.image.png` is a still: the piece's first frame, held for the piece, as a PNG every
byte of which is stated (the `Sub` filter, one fixed-Huffman deflate block whose
matches are stated), so an independent implementation writes the same file.
- **Catalogs** (§8.3, §8.4). The MoQ catalog is now a stage set of moq-streaming-format
§4.1, written by `wai::staged::moq`: `wai_staged` on every track, a receipts track and
an alias per media track, `depends` on a track of every layer below; it replaces
`priority` (MOQT's own, §8.5) and `wai_layer`, which the registry no longer lists. Over
HTTP, whose variants cannot mix bases with no capability in common (http-delivery §4.2),
a still's piece is played from the floor; its stage view and MoQ tracks list it.
- **Live windows** (§9.2). `wai-pack live` packs a Y4M stream from standard input as it
arrives, with the coder the on-demand packer uses, in windows sealed by version-2
receipts chained `live-window`; its bases and refinements are the on-demand package's,
byte for byte. `wai-pack listing --primary` lists what the two share. It writes as it
goes: each object when it is published and each window when it is sealed, every file
whole, and the plan file and `LISTING` at the end. It does not keep an object's bytes
once written, or a record per file: each listing line goes to a hidden file and is
sorted into `LISTING` at the end. A source that fails mid-stream keeps every sealed window and the objects
it lists, removes the rest, and exits 1 saying what it kept.
`wai::pin::listing_from_sha256` writes a listing from per-file digests.
- **Stills read by PNG's rules** (§5.7). Both reference readers take a PNG of 8-bit RGB
without interlace and agree on what that admits. They read a suggested palette,
ancillary chunks and split image data. They refuse an interlace, bytes after `IEND`
or after the zlib stream, a short row, a zlib window past 32 KiB, and every other
chunk fault (`stills/`). Both inflate as the zlib library does: no over-subscribed
Huffman code, and no incomplete one but a lone one-bit code. wai-pack's reader has
its own inflater, and `png_diff.py` runs it against `pack_verify.py`'s zlib.
- **The longest piece** (§3.4, §4.4). `max_ms` is at most ten minutes, and at most
`2^24` units on every component's timebase (`policy-piece-bounds`). A verifier
refuses a piece longer than the policy's `max_ms` before it decodes a frame. It
checks each floor object's unit count before decoding (§11.3). It hashes a still's
frame held for its piece without repeating the frame.
- **Manifests checked by both verifiers** (§11.3). A base's manifest must be §5.2's and a
refinement's §5.4's (`object-manifest`, a new reason). A base that does not decode
is `prefix-digest`.
- **A repeated object over HTTP** ([http-delivery](extensions/http-delivery.md) §4.2).
A repeated object contributes once, with its layers, and a layer joins every
occurrence of its base. `http_verify.py` and `wai-rs` now agree on a playlist's
codecs and floor where a piece repeats. `pack_verify.py` checks every golden playlist
with `http_verify.py`'s union, floor and adjacency checks.
- **One stall bound.** `stage_measure::sim::stall_bound_for` is the only bound: a
model's, which takes each refinement's own timeout. wai-web's simulator prints it, as
the native tool does.
- **Delivery, simulated** (§8.9). `wai_pack::delivery` and `wai-pack sim` run
staged-measurement's simulator over what a live packer publishes and what a class
subscribes to: per-track delivery timeouts, §8.5's priorities, the subscriber's cap,
group receipts on each track's chain. The simulator's model gains a refinement's own
`timeout_us`, and §10.4's bound takes the longest refinement timeout
([staged-measurement](extensions/staged-measurement.md) Appendix B); its corpus adds a
per-track model.
- **The corpus**: the golden `video-staged-01` (a moving shot, a bumper played twice, a
still shot, a second moving shot; two refinement layers, a still, the event's deadline,
three classes), its supplied floor and how it was written (`supplied_floor.py`),
`staged-mutations/`, `delivery/`, `stills/` and `live/` (the golden packed live in
windows of two pieces, whose chain `pack_verify.py` checks). `stage_diff.py` runs
refinement layers, stills (wide ones among them, so every deflate distance code is
used), piece plans and deliveries differentially against `pack_verify.py`, which
re-derives every layer and still from the source byte for byte. `sim_diff.py` runs the
delivery simulator differentially against `sim_verify.py`. `pack-refinement-unsupported` and
`pack-rule-ladder-unsupported` are gone.
- The base golden `video-base-01` keeps its objects, index and receipt; its MoQ catalog
and its `LISTING` change.
### The record made true: training, paths, protected content, reader limits, security
- **`int_synth`'s weights are quantised after float training.** SPEC §5 and

View file

@ -308,7 +308,6 @@ and a role are fixed once registered.
| `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_receipt_alias` | catalog | defined | moq-streaming-format §4 |
| `wai_receipts` | catalog | defined | moq-streaming-format §4 |
| `wai_receipts_track` | catalog | defined | moq-streaming-format §4 |

View file

@ -143,8 +143,11 @@ lcalnum = %x61-7A / %x30-39
sequence's objects — a `WAI1`, through its `capability` (staged delivery never takes
a base through its fallback), or a component of a `WAI2`, by the content hash of the
component's exploded envelope ([SPEC](../SPEC.md) §7.1), through the component's
capability. A sequence with a layer whose base it does not hold cannot be described
(`codecs_layer_unbound`). `alt`s are ordered by first appearance, and the
capability. An object a sequence lists more than once (a repeated piece) is one object
of it, described once with every layer it has, and a layer joins every object of the
sequence that is its base, so where a layer is listed beside one occurrence of its base
it describes them all. A sequence with a layer whose base it does not hold cannot be
described (`codecs_layer_unbound`). `alt`s are ordered by first appearance, and the
capabilities after `+` by first appearance in table order, then a sequence's layers
in order. The union is exhaustive: a sink that finds, in a head it has verified, a
selectable, companion or refinement capability the union does not list refuses that

View file

@ -3,13 +3,15 @@
> 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), 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**,
> pieces (§4), the objects a packager writes, refinements and stills among them, and a
> piece's ladder (§5), the stage index (§6), the floor (§7), what each class is offered
> over HTTP and MoQ and how its delivery is simulated (§8), the package receipt and live
> windows (§9), and the package and its verification (§11). Reference impl: `wai-pack` —
> `policy`, `capcheck`, `source`, `scenecut`, `classify`, `plan`, `encode`, `png`,
> `floor`, `cmaf`, `catalog`, `pack`, `live`, `delivery`, `verify`; in `wai-rs`, the
> encoder `int_video_enc`, the refinement encoder `staged::wir1`, the stage index
> `stage_index`, the receipt `package` and the delivery simulator `stage_measure::sim`;
> the corpus [`pack-conformance/`](../pack-conformance/). Keywords **MUST**, **MUST NOT**,
> **SHOULD**, **MAY** are RFC 2119/8174.
## 1. Scope
@ -147,7 +149,8 @@ first that fails is the refusal:
a reference never names two things (`policy-duplicate-id`).
3. `lead` names a component (`policy-lead`).
4. `segmentation.closed` is true: every piece is closed, §4.1 (`policy-open-gop`).
5. `1 ≤ min_ms ≤ target_ms ≤ max_ms` (`policy-piece-bounds`).
5. `1 ≤ min_ms ≤ target_ms ≤ max_ms ≤ 600000`, and `max_ms` is at most `2^24` units
on every component's timebase (§4.4) (`policy-piece-bounds`).
6. Every rung names a component (`policy-ladder-component`).
7. A rung carries `refines` exactly when its role is `refinement`
(`policy-refines-role`); `refines` names a rung (`policy-dangling-refines`); no
@ -159,8 +162,10 @@ first that fails is the refusal:
refines for a refinement; the policy has one more layer than its highest rung
layer. No class's and no rule's `max_layer` exceeds the highest
(`policy-class-layer`).
10. A rule's `then.ladder` names known rungs, all of one component, at least one of
them a base (`policy-rule-ladder`).
10. A rule's `then.ladder` names known rungs, all of one component, each once:
exactly one base, every refinement over a rung it names (so its layers are a chain
from that base), and every floor rung of the component (every piece has a floor,
§7.1) (`policy-rule-ladder`).
11. `live.layer_lag_ms` has one entry per layer, the first 0, the entries
non-decreasing (`policy-layer-lag`).
12. The deadline values (`defaults.deadline_ms` and every rule's `then.deadline_ms`)
@ -242,6 +247,15 @@ A duration in milliseconds converts to timebase units as
`floor(ms · num / (1000 · den))`; a result of 0 becomes 1, and one above `2^64 − 1`
becomes `2^64 − 1`.
A piece is at most ten minutes long (`max_ms` at most 600000) and at most `2^24` units
on its component's timebase (§3.4 item 5). A verifier takes a piece whole: it decodes
every frame of a base, holds a still's one frame for every frame of its piece and hashes
each (§5.7, §6.5), and reads one floor unit per frame (§7.2). So the longest piece a
policy allows is the most work a verifier does for one piece, and a package states it.
Ten minutes is far past any piece a delivery cuts (the default `max_ms` is four
seconds); `2^24` units bounds that work on any timebase, since a timebase may have up to
`2^32 − 1` units a second.
**4.5** *Components.* Every component of a package shares one presentation timeline
that starts at 0. The policy names one **lead** component; every other component cuts
its pieces at the lead's boundary instants, each converted to its own timebase as
@ -292,8 +306,9 @@ object. The reference packager writes a base's manifest as SPEC §3 orders it, w
`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`.
(the piece's frame count and dimensions, for a still too, whose one frame is held for
the piece, §5.7; 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`:
@ -303,8 +318,30 @@ 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.
object its entry refines (§6.2) among them.
The reference packager writes, for each refinement rung of a piece's ladder (§5.7), one
object of `wai.video.int_refine` over the piece's `wai.video.int_motion` base, layer by
layer. Its manifest is the one `wai stage refine` writes, as SPEC §3 orders it: `media`
the component's, `intent` `replicate`, the capability with no `fallback`,
`conditioning.kind` `wir1`, `refines` with `base` the base's content hash, `prev` the
content hash of the object of the layer below (the base for layer 1) as a string, and
`layer`, and `target` null. Its payload is a `WIR1` (staged-delivery Appendix A) of unit
kind RGB8, one unit per frame of the piece, the identity predictor and one table,
written by `wai-rs`'s refinement encoder (`staged::wir1::encode`) at the rung's step
`q`:
- each sample's residual is `rdiv(source − below, q)`, the quotient rounded half away
from zero, where *below* is the stage the layer refines as a sink reconstructs it;
no frame predicts another;
- the table's `offset` is the least residual and it spans every residual (where they
span more than 4095, the 4095 around the lower median), fitted by §5.5's rule, the
escape at 1; a residual past it is coded through the escape;
- one rANS stream per frame.
The stage the layer reconstructs, `clamp(below + r·q, 0, 255)`, is what the next layer
refines. The packer applies each layer to the decoded base with the reference sink
(staged-delivery §4) before it keeps it, and the sink's output must be the encoder's.
**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
@ -356,6 +393,52 @@ 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`.
**5.7** *A piece's ladder, and stills.* A piece is coded in the rungs of its **ladder**:
those the matching rules' `then.ladder` names (§3.4 folds them: the last that sets it),
where they are rungs of the piece's component; otherwise the component's default ladder,
its first base rung in ladder order, the chain of refinement rungs over it, and its floor
rungs. A rule's ladder therefore chooses a piece's representation: its base, how many
layers refine it, and nothing else (§3.4 item 10). A piece has one entry per rung of its
ladder: its base, each refinement in layer order, then each floor (§6.2), and a
verifier holds an index to that (§11.3).
A base of `wai.image.png` is a **still**: the piece's first frame, held for the piece. A
sink presents that frame for each of the piece's frames, so its prefix is the frame
repeated and its digest the clip digest of the repeats (§6.5), its `sse` is over the
repeats against the piece's frames (§6.6), and its manifest's `target` names the piece's
frames (§5.2). The reference packager writes the frame as a PNG every byte of which is a
pure function of the frame, so an independent implementation writes the same file:
- the signature, `IHDR` (the width, the height, bit depth 8, colour type 2, compression
0, filter 0, interlace 0), one `IDAT` holding the whole compressed stream, and `IEND`;
each chunk a big-endian length, its type, its data and the CRC-32 of type and data;
- every row filtered `Sub` (filter byte 1): each byte less the byte three before it in
the row, modulo 256, the first pixel's bytes less 0;
- a zlib stream (RFC 1950) of `0x78 0x01`, one final deflate block (RFC 1951) of the
fixed Huffman codes, and the Adler-32 of the filtered rows;
- the block's symbols, from the first byte of the filtered rows: where at least three
bytes remain and an earlier position within 32768 bytes starts with the same three
bytes, the latest such position is the match, as long as the two runs agree (at most
258 bytes), written as that length and the distance to it; otherwise one literal.
Every position a symbol covers that has three bytes left becomes the latest position
of its three bytes. The block ends with symbol 256, and the last byte is padded with
zero bits.
A verifier reads a still as a PNG of 8-bit RGB without interlace, by PNG's chunk rules:
every chunk's type four letters and its CRC checked; `IHDR` first; an optional `PLTE`
(a suggested palette) before the image data; the `IDAT`s consecutive; ancillary chunks
read past; any other critical chunk refused; `IEND` last, empty, and nothing after it.
It inflates the zlib stream as the zlib library's inflate does, so two verifiers agree
on every stream: the header's check bits, method 8, a window of at most 32 KiB and no
preset dictionary; a stored block's length and its complement agree; at most 286
literal/length and 30 distance codes, a complete code-length code, a repeat with a
length before it and within the code lengths, and a code for the end of the block; no
Huffman code over-subscribed, and none incomplete but a literal/length or distance code
whose longest code is one bit (a lone one-bit code, or none); a code with no symbol, or
a distance past the bytes written, refused where it is read; the Adler-32, and nothing
after it. The rows are exactly `1 + 3·width` bytes each, under the five filters. A still
a verifier does not read is `prefix-digest` (§11.3).
## 6. Stage index
**6.1** A package carries, per component, one stage index, the file `index-<id>.wsix`
@ -517,8 +600,8 @@ entropy-consistency for `NeuralEntropyExact`, and none otherwise (SPEC §5, §7)
**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
otherwise: for video, the clip digest over RGB8 frames (for a still, of its frame held
for the piece's frames, §5.7); 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.
@ -641,14 +724,19 @@ offered in playlists of their own.
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.
- A variant lists no bases without a capability in common ([http-delivery](http-delivery.md)
§4.2, `codecs_no_common_capability`). A class's HTTP view lists a piece only where the
piece's base is of the component's default base capability (§5.7, its first base rung's),
and plays the floor for any other piece, as for a piece the class takes as floor only: a
still (§5.7) among motion bases is carried over HTTP by the floor. The class's stage view
(§8.8) and its MoQ tracks (§8.4) list it.
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
refinements', over the pieces its HTTP view lists (above). 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`:
@ -662,9 +750,9 @@ codecs string *F* and maximum frame size `FW×FH`:
`#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, byte for byte, with, when the class
lists a WAI object, `#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8"`
lists a WAI object over HTTP, `#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8"`
after `#EXT-X-INDEPENDENT-SEGMENTS`, and no other change.
- `hls/<class>/wai.m3u8`, when the class lists a WAI object: `#EXTM3U`,
- `hls/<class>/wai.m3u8`, when the class's HTTP view 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"`,
@ -673,7 +761,8 @@ codecs string *F* and maximum frame size `FW×FH`:
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>,`, each refinement the class lists,
class's HTTP view lists nothing of it (a floor-only piece, or one whose base is not of
the default base capability), `#EXTINF:<S.mmm>,`, each refinement the class lists,
in entry order, as `#WAI-LAYER:N=<layer>,URI="../../objects/<hash>.wai#n=<byte_len>"`,
then its base as `../../objects/<hash>.wai#n=<byte_len>`: a layer line follows its
segment's `EXTINF` ([http-delivery](http-delivery.md) §10.4).
@ -693,7 +782,7 @@ one `AdaptationSet`, `</Period>` and `</MPD>`, indented by two spaces a level:
`<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:
- `dash/<class>.mpd`, when the class's HTTP view 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
@ -711,31 +800,40 @@ of one component; how the variants and groups of several components are written
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.
`{"tracks": [...], "version": 1}`. A component's bases and refinements are a stage set of
[moq-streaming-format](moq-streaming-format.md) §4.1, one track per (layer, deadline),
by layer, then by deadline ascending, each written as that section's entry: namespace
the policy's `asset_id`; name `<c>/l<k>`, or `<c>/l<k>@<deadline>` for a refinement
whose deadline is not `defaults.deadline_ms`; `packaging` `"wai"`; `isLive` false;
`role` `video`; `renderGroup` 1; `wai_staged` with `set` the component's id, `layer` *k*
and `lead_ms` null (an on-demand package has no live schedule); `wai_capabilities` its
entries' capabilities by first appearance (a still among them on the base track, §5.7);
`wai_determinism` the weakest tier of its entries, absent when that is none; and
receipts declared: `wai_receipts` true, `wai_receipt_alias` the first eight bytes of
`BLAKE3("wai:pack-receipt-alias\x01" ‖ namespace ‖ 0x00 ‖ name)` as a little-endian
integer, less than `2^53` (so two packages published under one key keep apart chains),
and `wai_receipts_track` `<name>/receipts`. A track `depends` on every track that
carries an entry below one of its own entries, down the chain to the base, in track
order: a track of each layer below it, none at or above it, and never one the catalog
does not hold. A sink receives every track a track depends on (moq-streaming-format
§4.1), so a dependency is all of them. A refinement track carries
`wai_delivery_timeout_ms` (§8.6), a catalog field this extension defines under the `wai_`
prefix of moq-streaming-format §4. The base track has `altGroup` 1 when the component has
a floor: the floor is a track `<c>/floor` of `packaging` `"cmaf"`, in the same namespace,
with `altGroup` 1, `renderGroup` 1, `codec`, `width` and `height`, and a sink that
selects the floor subscribes to no layer track. The receipts tracks follow, one per media
track in its order, each `{"isLive": false, "name": "<name>/receipts", "namespace",
"packaging": "wai-receipts"}`. The catalog passes moq-streaming-format §4.1's check, and a
packager writes no other. A package holds no receipt: the publisher signs each track's
groups (a group a piece) on that track's chain as it publishes them (jwp-receipts §2.4.1;
§8.9 simulates it).
**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).
`64 + 32·k`: a refinement track's value is strictly greater than that of every track it
depends on, so it is delivered after them (MOQT: a lower value is delivered first), and
moq-streaming-format §4.1's rule holds; a receipts track's is its media track's. The
priority is MOQT's (`DEFAULT_PUBLISHER_PRIORITY`), set by the publisher, not a catalog
field.
**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
@ -752,12 +850,43 @@ to wait for a refinement. What the receipts of a dropped object say is
**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
`media_playlist` only when the class's HTTP view lists a WAI object (§8.3), 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"`.
**8.9** *Delivery, simulated.* How a package's objects reach a subscriber over a link is
simulated by staged-measurement's delivery simulator ([staged-measurement](staged-measurement.md)
§10, Appendix B); its figures are labelled simulated, with their plan, and are never a
measurement of a network. The reference packager's `delivery` states the model and the
plan, and reads the outcome:
- **Model.** Each object a class lists of each piece (§8.1; a floor-only piece gives none),
on the component's frames as units (a frame of a whole number of microseconds): base the
piece, its layer, units the piece's frames, bytes the whole envelope, and its capture
time the instant it is published. A live packer (§9.2) publishes a piece's base when the
frame that decides the piece's end has arrived (the next piece's first frame plus
`lookahead_frames`, or the source's last frame, §4.3; frame *f* arriving at
`f · frame_us`), plus the encoder's delay, and layer *k* `layer_lag_ms[k]` after its
base. Each refinement takes its track's delivery timeout, `deadline_ms −
layer_lag_ms[k]` milliseconds (§8.6), as its own (staged-measurement Appendix B).
- **Plan.** Live; the link's round trip, rate and chunk; strict priority, which is §8.5's
order; each (piece, layer) a subgroup of its own; no base timeout; the subscriber's
layer cap (moq-streaming-format §4.1, *Capping*); one decode worker, bases first, each
decode 1 µs (the simulation is of the link); playout from the start-up, and a refinement
that arrives after its piece's instant discarded (§8.7).
- **Outcome.** Per piece, at its first frame's presentation instant (the start-up plus its
start): the highest layer presented by then, or none where its base arrived later; its
base's arrival; the layers dropped or abandoned. A class that lists nothing of any piece
sends nothing.
Under §8.5's priorities a refinement delays a base by at most one chunk and one decode
(staged-measurement §10.4). The publisher seals each track's group with a group receipt on
the track's chain (`wai_receipt_alias`, §8.4); a subscriber accepts a delivered object by
its Merkle proof, and holds a dropped one by inclusion alone, never as delivered
([jwp-receipts](jwp-receipts.md) §4.4).
## 9. Package receipt
**9.1** A version-2 package receipt binds the asset id; the policy digest; its parent
@ -829,6 +958,35 @@ 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`.
The reference live packer (`wai-pack live`, `wai_pack::live`) takes a source a frame at a
time, cuts it with the segmenter of §4.3, which decides a frame once `lookahead_frames`
more have arrived, and codes each piece as it closes with the coder the on-demand packer
uses (§5.4–§5.7). So a live and an on-demand pack of one source under one policy write
the same plan and the same bases and refinements, byte for byte. It writes no floor: a
supplied floor is made from the whole source (§7.3), so it is the on-demand package's.
Its pieces are gathered into windows: each a stage index of its pieces' bases and
refinements (`first_piece` and `first_entry` continuing the chain, `prev_index_digest`
the previous window's index digest, zero for the first) sealed by a version-2 receipt
whose parent is the previous window's (`live-window`; none for the first). A piece's
objects are published when the frame that decides its end has arrived: its base then,
and layer *k* `layer_lag_ms[k]` after it (§8.6, §8.9).
It writes as it goes: each object when it is published, and each window's index and
then its receipt when the window is sealed, every file whole (written beside its place
and renamed into it); the plan file and `LISTING` at the end of the source. It keeps no
record per file of the session: each file's listing line goes to a hidden file beside
the package as the file is written, and is sorted into `LISTING` at the end (the one
moment it holds a line per file); an object already written is known by its file; an
object's bytes are not held once written. What it holds is what no window has sealed
yet: those pieces' entry fields and the content hash of each object they published
first. So with windows of `n` pieces that is at most `n` pieces', and with one window
over the whole source (the default) every piece's until the end. Besides those it holds
the frames of the piece being cut and each piece's first frame, eight bytes a piece, for
the plan file. A source that fails before its end (a short frame, a frame of another
size) leaves every sealed window and the objects it lists, removes the objects only
unsealed pieces published, writes no plan file or `LISTING`, and is an error that names
what was kept.
**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`,
@ -931,15 +1089,28 @@ failed check names is not applied:
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
every piece's kind is one a video piece has; its rules and moments are §8.1's from
its kind and span; its entries are the rungs of its ladder (§5.7), by role,
capability and layer: its base, each refinement in layer order, each floor; each
refinement's deadline is its plan's (§8.6); and its class plan is §8.1's from its
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`);
- before any frame is decoded, each piece's floor object, where the policy has a floor
rung and the object's payload reads as §7.2's framing, holds one unit per frame of
its piece (`floor-object-mismatch`);
- every base and refinement, in entry order: a base decodes by its capability (a
still is a PNG §5.7 reads, its one frame held for the piece), or it is
`prefix-digest`; its manifest is the one §5.2 states for its piece's frames and its
frame size (`object-manifest`); a refinement's manifest is §5.4's
(`object-manifest`), and it applies in layer order, to every frame of the stage
below it, by a staged-delivery §4 sink under the reference tools' cost limit and
chain budget, or it is `prefix-digest`; a base that does not decode, or a layer that
does not apply, ends the check;
- then 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
@ -957,15 +1128,17 @@ failed check names is not applied:
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
**11.4** *What this revision packs.* The reference packager packs one video component:
bases of `wai.video.int_motion` (§5.5, §5.6) and stills of `wai.image.png` (§5.7);
refinements of `wai.video.int_refine` over an `int_motion` base (§5.4); each piece by its
ladder, a rule's ladder subset included (§5.7); and a supplied AV1 floor (§7.3). Its live
packer packs the same pieces in windows, without a floor (§9.2). It refuses by name,
before writing anything, what it does not pack yet: another medium
(`pack-media-unsupported`), a floor to encode (`pack-floor-encode-unsupported`), and a rung
of a capability it does not encode, or a refinement over a base it does not refine
(`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
@ -993,6 +1166,6 @@ would leave behind the ones it does not write.
| `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 |
| `unexpected-file`, `listing-missing`, `listing-mismatch`, `policy-digest-mismatch`, `policy-json-mismatch`, `policy-component-mismatch`, `index-missing`, `index-policy-mismatch`, `plan-mismatch`, `object-missing`, `object-manifest`, `prefix-digest`, `catalog-mismatch`, `catalog-unexpected`, `object-unlisted` | §11.3 |
| `pack-id`, `pack-source-missing`, `pack-source-rate`, `pack-media-unsupported`, `pack-floor-encode-unsupported`, `pack-capability-unsupported` (naming the capability) | §11.1, §11.4 |
| `pack-encode`, `pack-piece-length`, `pack-catalog`, `pack-meter`, `pack-measurement-claim`, `pack-listing`, `pack-out-not-empty` | §11.4 |

View file

@ -307,13 +307,15 @@ under the plan minus the same time under the base-only model. The stall bound is
`S = S_link + S_decode`:
- `S_link`: under `strict-priority`, the serialisation time of one chunk; under `fifo`
with a refinement timeout `T`, `T` plus one chunk; otherwise there is no bound.
with a refinement timeout, `T` plus one chunk, where `T` is the longest timeout any
refinement takes (its own, where the model gives it one, or the plan's); otherwise
(a refinement that takes none) there is no bound.
- `S_decode`: under `base-first` decode, one refinement's decode time; otherwise there
is no bound.
**Preconditions.** The bound holds for every model and every plan with no base
timeout (`delivery_timeout_us.base` is `null`), a bounded link schedule (`strict-priority`,
or `fifo` with a refinement timeout) and `base-first` decode, whatever else the plan
or `fifo` where every refinement takes a timeout) and `base-first` decode, whatever else the plan
states (carriage, window, live captures, layer cap, workers, decode times, playout
deadlines). A plan outside them has no bound: a base its refinements delay past its own
timeout is not presented at all, and the two unbounded parts above have counter-plans.
@ -494,9 +496,12 @@ them (`wai-sim-model/1`):
```
`units` is `[from, count]` over the title's units and `bytes` the object's counted
bytes (§3). A model is well formed when every object has at least one byte and one
unit, no two objects cover one unit at one layer, and every unit an object of layer
`k ≥ 1` covers is covered at layer `k − 1` by an object of the same base. A measured
bytes (§3). A refinement **MAY** carry `timeout_us`, a delivery timeout of its own in
place of the plan's for its layer: what a MoQ track's `DELIVERY_TIMEOUT` sets for every
object on it ([packaging](packaging.md) §8, its deadlines). A model is well formed when
every object has at least one byte and one unit, no base carries `timeout_us`, no two
objects cover one unit at one layer, and every unit an object of layer `k ≥ 1` covers is
covered at layer `k − 1` by an object of the same base. A measured
title's model is its objects with their counted bytes, and its bases' capture times.
A **plan** (every member required, none other allowed):
@ -524,7 +529,8 @@ microseconds, and `h = ⌊rtt_us / 2⌋`; a time or a byte sum past 64 bits is r
with no window), and at `max(h, capture_us)` live; a live plan over an object with no
capture time is refused.
- *Deadline.* An object's availability plus its layer's timeout (`base` for layer 0,
`refinement` otherwise); none when that timeout is `null`.
`refinement` otherwise, or a refinement's own `timeout_us`); none when that timeout is
`null`.
- *Cap.* An object above `layer_cap` is capped: never sent, never offered.
- *Datagrams.* Under `datagram`, an object of more than `chunk_bytes` that is not capped
is refused (`datagram-too-large`).

View file

@ -289,6 +289,8 @@
{"name":"parse_head_kid_string","op":"parse_head","input":{"file":"bad/OK.wai"},"expect":{"error":"head_malformed"}},
{"name":"parse_head_kind_number","op":"parse_head","input":{"file":"bad/OKN.wai"},"expect":{"error":"head_malformed"}},
{"name":"union_O10_layers","op":"union_floor","input":{"objects":["O10","O10L1","O10L2"]},"expect":{"union":"wai1.audio.flac+audio.int_refine","floor":"wai1.audio.flac+audio.int_refine"}},
{"name":"union_O10_repeated_layer_after_first","op":"union_floor","input":{"objects":["O10","O10L1","O10"]},"expect":{"union":"wai1.audio.flac+audio.int_refine","floor":"wai1.audio.flac+audio.int_refine"}},
{"name":"union_O10_repeated_layer_after_second","op":"union_floor","input":{"objects":["O10","O10","O10L1"]},"expect":{"union":"wai1.audio.flac+audio.int_refine","floor":"wai1.audio.flac+audio.int_refine"}},
{"name":"union_O10_layers_unbound","op":"union_floor","input":{"objects":["O10L1","O10L2"]},"expect":{"error":"codecs_layer_unbound"}},
{"name":"fetch_O10_base","op":"fetch","input":{"object":"O10","advertises":["wai.audio.flac"]},"expect":{"role":"base","pick":0,"verified_by":"whole-object","why_whole":"single_component","body_bytes":1910,"requests":2,"companions":[],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"67ddfc4700c518d0f0028fd03920901057f419d9fc84349e1c9cf7a75314fefc"}},
{"name":"fetch_O10L1_discovered","op":"fetch","input":{"object":"O10L1","fragment":"#n=12711&h=1009","advertises":[]},"expect":{"role":"layer","pick":0,"verified_by":"whole-object","why_whole":"layer","body_bytes":12892,"requests":3,"companions":[],"refinements":[],"abandoned":[],"dropped":[],"skipped":[],"component_sha256":"96c9e16b31256d323efe54d996bfab6223f4eeb017da5d55ece7fd74fee750e2"}},

View file

@ -1,15 +1,15 @@
# must fail: union_O10_layers
# must fail: union_O10_layers union_O10_repeated_layer_after_first union_O10_repeated_layer_after_second
# a layer joins no alt (codecs::described)
diff --git a/wai/wai-rs/src/http_binding/codecs.rs b/wai/wai-rs/src/http_binding/codecs.rs
index 530ae822..161ed997 100644
index a4d35e39..821b7f51 100644
--- a/wai/wai-rs/src/http_binding/codecs.rs
+++ b/wai/wai-rs/src/http_binding/codecs.rs
@@ -326,7 +326,7 @@ fn described(objects: &[SeqObject]) -> Result<Vec<Element>, CodecsError> {
let el = els[k].as_mut().expect("a base is not a layer");
let alt = el.alts.iter_mut().find(|a| a.cap == base_cap)
.ok_or_else(|| CodecsError::LayerUnbound(format!("wai.{cap}: its base's capability is not dispatched")))?;
- push_unique(&mut alt.plus, cap);
+ let _ = (alt, cap);
@@ -334,7 +334,7 @@ fn described(objects: &[SeqObject]) -> Result<Vec<Element>, CodecsError> {
let el = els[k].as_mut().expect("a base is not a layer");
let alt = el.alts.iter_mut().find(|a| a.cap == base_cap)
.ok_or_else(|| CodecsError::LayerUnbound(format!("wai.{cap}: its base's capability is not dispatched")))?;
- push_unique(&mut alt.plus, cap.clone());
+ let _ = (alt, &cap);
}
}
Ok(els.into_iter().flatten().collect())
}

View file

@ -606,6 +606,15 @@ def base_capability(b, base):
def described(objects):
"""§4.2: each object that is not a layer as an element, each layer's capability after
`+` in the alt of every object of the sequence that is its base. An object listed more
than once is one object, described once with every layer it has."""
seen, uniq = set(), []
for o in objects:
if o["cid"] not in seen:
seen.add(o["cid"])
uniq.append(o)
objects = uniq
els = [None if is_layer(o["head"]) else element_of(o["head"]) for o in objects]
for o in objects:
if not is_layer(o["head"]):
@ -617,19 +626,15 @@ def described(objects):
base = SV.parse_refines(m.get("refines"))["base"]
except SV.Malformed:
raise Refusal("codecs_malformed")
target = None
for k, b in enumerate(objects):
bc = base_capability(b, base)
if bc is not None:
target = (k, bc)
break
if target is None:
targets = [(k, bc) for k, b in enumerate(objects) for bc in [base_capability(b, base)] if bc is not None]
if not targets:
raise Refusal("codecs_layer_unbound")
alt = next((a for a in els[target[0]][1] if a[0] == target[1]), None)
if alt is None:
raise Refusal("codecs_layer_unbound")
if cap not in alt[1:]:
alt.append(cap)
for k, bc in targets:
alt = next((a for a in els[k][1] if a[0] == bc), None)
if alt is None:
raise Refusal("codecs_layer_unbound")
if cap not in alt[1:]:
alt.append(cap)
return [e for e in els if e is not None]

View file

@ -2,9 +2,10 @@
Vectors for [`extensions/packaging.md`](../extensions/packaging.md): 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).
(§4), the integer video payloads, refinement layers and stills a packager writes (§5),
packages (§6–§11), and their delivery over a simulated link (§8.9).
**Provenance.** Generated here: the `wai-pack` fixture generator (`wai-pack/src/fixture.rs`, `wai-pack/src/conformance.rs`) writes every frame from integer functions of the frame and pixel index, and a package's floor is an AV1 coding of those frames. No footage.
**Provenance.** Generated here: the `wai-pack` fixture generator (`wai-pack/src/fixture.rs`, `wai-pack/src/conformance.rs`) writes every frame from integer functions of the frame and pixel index; a package's bases, refinement layers and stills are codings of those frames, and its floor an AV1 coding of them by an encoder, as `supplied_floor.py` states. No footage.
- `policy/` — policies a packager accepts (every rung one it may emit, §3.6), and
`expected.json`: each policy's effective canonical JSON and
@ -12,7 +13,8 @@ digest and what it may ask a packager to emit (§3), how a source is cut into pi
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.
tables, dotted keys, member order, string escapes, integer notation and comments;
and `max-piece.toml`, the longest piece a policy may allow (§4.4), at both bounds.
- `refusals/` — `policy/*.toml`, one fault each (the byte layer's among them: a
byte-order mark, bytes that are not UTF-8, an integer at 2^63, nesting to depth 33 and
80), and `source/*` (Y4M and WAV), and `expected.json`: each one's reason (§12). Every
@ -47,6 +49,14 @@ digest and what it may ask a packager to emit (§3), how a source is cut into pi
`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.
- `packs/video-staged-01/` — a staged golden package (§5.4, §5.7): a moving shot, the
bumper, a still shot, the bumper again and a second moving shot, under a policy of an
`int_motion` base with two `int_refine` layers, a still for a static piece (a rule's
ladder), three classes (one capped by rate, one floor only), a moment whose rule
moves the last piece's layers to an 800 ms deadline, and layer lags. Its floor was
written by `supplied_floor.py`. The bumper's base, layers and floor are one object
each; the still's piece is carried over HTTP by the floor (§8.3) and over MoQ on the
base track.
- `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,
and three receipts carrying a signature only a verifier that checks the equation
@ -58,6 +68,42 @@ digest and what it may ask a packager to emit (§3), how a source is cut into pi
`"signature": "refused"`.
- `catalogs/` — stage indexes no golden package has (refinements on more than one
deadline), with the MoQ catalog each gives (§8.4).
- `live/` — the staged golden's source packed live (§9.2) with its key, in windows of
two pieces: each window's stage index and receipt (`windows/<n>/`), and
`expected.json`: each window's first piece and entry, its pieces, its index digest and
its receipt hash. Each window verifies against its receipt; the first starts the
chain, and each later one names the receipt before it as its `live-window` parent,
the index before it as its `prev_index_digest`, and continues its pieces and entries.
Its pieces, bases and refinements are the golden's, entry for entry (a live pack has
no floor).
- `stills/` — PNG files a still's reader reads or refuses (§5.7: any PNG of 8-bit RGB
without interlace), each a generated 5 × 3 picture written chunk by chunk, and
`expected.json`: each file's verdict and, read, the SHA-256 of its RGB8 samples. Read:
the module's own still, and files with a suggested palette, ancillary chunks, and the
image data split across two chunks. Refused: an interlace, bytes after `IEND`, a short
row, a palette after the image data, an unknown critical chunk, no `IEND`, a chunk
between the image data, a chunk's CRC, a sixth filter, another colour type, a zlib
window past 32 KiB, bytes after the zlib stream, and its Adler-32. And one dynamic
block of literals twice: with a lone distance code of one bit, read (the one
incomplete code set the zlib library takes), and of two bits, refused.
- `staged-mutations/` — the staged golden altered and re-sealed with its key, in the
layout of `package-mutations/`: a refinement on another deadline than its plan's, a
piece missing its top layer, a still where the policy's rule now gives the piece the
default ladder (each `index-policy-mismatch`), a top layer coded again at another step
and a still's digest of its one frame rather than its frame held for the piece (each
`prefix-digest`), and a piece and a still each longer than the policy's `max_ms`
(`index-policy-mismatch`, refused before a frame is decoded, so a still's declared
duration never sets what a verifier allocates); a policy past §4.4's longest piece
(`max_ms` 600001, `policy-piece-bounds`); and the still given the longest piece a
policy allows (`max_ms` ten minutes), its manifest naming those frames, refused by its
floor's unit count before any frame is decoded (`floor-object-mismatch`); a still
whose manifest's `target` holds a member more, and a top layer whose `target` is not
null (each `object-manifest`); and the still as a PNG §5.7 does not read, its one
dynamic block's lone distance code two bits long (`prefix-digest`).
- `delivery/` — `expected.json`: the staged golden packed live and delivered to a `tv`
subscriber over a simulated link (§8.9), under §8.5's priorities, without them, and
capped at layer 1: each piece's presented layer, base arrival and dropped layers, and
the byte counts. Labelled simulated.
- `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
@ -81,6 +127,8 @@ index and the pixel position, and the corpus pins its SHA-256:
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).
- `video-staged-01` — 64 × 36: a moving shot, the bumper, a shot that does not change,
the bumper again, and a second moving shot.
Files are compared as bytes; `.gitattributes` turns off line-ending conversion.
@ -96,8 +144,9 @@ Files are compared as bytes; `.gitattributes` turns off line-ending conversion.
digests of each equal pair to be equal, decodes every encode payload through
`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`
(`wai-pack verify`), gives every mutation and every package mutation its
reason, reads every still to its verdict, and checks the live windows' chain.
`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 and, to sign what it re-derives, `cryptography` (TOML through `tomllib`, so 3.11 or
@ -116,10 +165,21 @@ Files are compared as bytes; `.gitattributes` turns off line-ending conversion.
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.
verifies every package mutation and staged mutation in the same order, refused with
its reason. Every prefix is decoded: a still by its own PNG reader, and each refinement
layer by the `WIR1` decoder of `../staged-conformance/staged_verify.py` (written from
staged-delivery); and the MoQ catalog is checked by that file's moq-streaming-format
§4.1 check. Every HTTP playlist of a golden is read by
`../http-conformance/http_verify.py`'s union, floor and adjacency checks
(http-delivery §4.2), and every file of `stills/` by its own PNG reader, to the
corpus's verdict. Each window of `live/` it reads as an index and a receipt, checks
the chain, and compares with the golden's index. From the regenerated fixture it re-derives what only the source decides:
the pieces, their rules, moments, ladders and class plan, each base's SSE and step and
the encoder's choices, each still's bytes, and each refinement layer's bytes with its
own rANS coder and table fit; and it checks the supplied floor against the policy's
listing and the plan. The delivery cases it re-derives from the fixture's cut and the
package's index by its own mapping onto the simulator of
`../staged-measure-conformance/sim_verify.py`.
python3 pack-conformance/pack_verify.py pack-conformance
@ -138,6 +198,32 @@ Files are compared as bytes; `.gitattributes` turns off line-ending conversion.
python3 pack-conformance/segment_diff.py <wai-pack binary> 1 2000
- `stage_diff.py` runs the staged packer differentially: refinement layers over random
frames and steps, stills of random pictures, piece plans under random policies (rules
with ladder subsets, maximum layers and deadlines, classes with rates, layer lags) and
deliveries of random publications over random links, each result of
`wai-pack stage-json` equal to `pack_verify.py`'s.
python3 pack-conformance/stage_diff.py <wai-pack binary> 1 3000
- `png_diff.py` runs a still's reader differentially: streams the zlib library writes
(every level and strategy, windows from 512 bytes to 32 KiB) and the packager's own
stills; dynamic blocks built on each of RFC 1951's and zlib's code-set rules (complete
codes, no distance code, a lone one-bit distance code used and misused, a lone longer
one, over-subscribed and incomplete codes of each kind, repeats with nothing before
them or past the code lengths, no end-of-block code, too many symbols, a distance past
the bytes written, stored blocks with a wrong complement, fixed blocks with symbols
they cannot use, several blocks of mixed kinds); and those altered. Each verdict, and
each read picture's SHA-256, from `wai-pack stage-json`'s `read-png` must be
`pack_verify.py`'s, which inflates with Python's zlib; and each construction must have
the verdict the rules give it.
python3 pack-conformance/png_diff.py <wai-pack binary> 1 4000
- `supplied_floor.py` is how a golden's supplied floor was written (an AV1 encoder over
each piece of the generated fixture, the policy's listing set to it); it is not a step
of verification, since an encoder's output is pinned by the listing, not re-derived.
- `source_diff.py` runs the source readers differentially: seeded Y4M and WAV
mutations (dimensions and channel counts at and past their range, every format
field, truncations, single-byte changes), each file's verdict from

View file

@ -2,6 +2,7 @@
"cases": [
{
"index": "catalogs/one-deadline.wsix",
"namespace": "catalogs",
"layer_lag_ms": [
0,
200,
@ -13,10 +14,11 @@
"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"
"moq": "{\"tracks\":[{\"altGroup\":1,\"isLive\":false,\"name\":\"v/l0\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_motion\"],\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":6758122338894672,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l0/receipts\",\"wai_staged\":{\"layer\":0,\"lead_ms\":null,\"set\":\"v\"}},{\"depends\":[\"v/l0\"],\"isLive\":false,\"name\":\"v/l1\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":1300,\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":7122743273789469,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l1/receipts\",\"wai_staged\":{\"layer\":1,\"lead_ms\":null,\"set\":\"v\"}},{\"depends\":[\"v/l0\",\"v/l1\"],\"isLive\":false,\"name\":\"v/l2\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":1100,\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":5138816494470210,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l2/receipts\",\"wai_staged\":{\"layer\":2,\"lead_ms\":null,\"set\":\"v\"}},{\"altGroup\":1,\"codec\":\"av01.0.00M.08\",\"height\":36,\"name\":\"v/floor\",\"namespace\":\"catalogs\",\"packaging\":\"cmaf\",\"renderGroup\":1,\"width\":64},{\"isLive\":false,\"name\":\"v/l0/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"},{\"isLive\":false,\"name\":\"v/l1/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"},{\"isLive\":false,\"name\":\"v/l2/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"}],\"version\":1}\n"
},
{
"index": "catalogs/layer-1-on-its-own-deadline.wsix",
"namespace": "catalogs",
"layer_lag_ms": [
0,
200,
@ -28,10 +30,11 @@
"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"
"moq": "{\"tracks\":[{\"altGroup\":1,\"isLive\":false,\"name\":\"v/l0\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_motion\"],\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":6758122338894672,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l0/receipts\",\"wai_staged\":{\"layer\":0,\"lead_ms\":null,\"set\":\"v\"}},{\"depends\":[\"v/l0\"],\"isLive\":false,\"name\":\"v/l1@800\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":600,\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":6300050926507138,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l1@800/receipts\",\"wai_staged\":{\"layer\":1,\"lead_ms\":null,\"set\":\"v\"}},{\"depends\":[\"v/l0\",\"v/l1@800\"],\"isLive\":false,\"name\":\"v/l2\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":1100,\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":5138816494470210,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l2/receipts\",\"wai_staged\":{\"layer\":2,\"lead_ms\":null,\"set\":\"v\"}},{\"altGroup\":1,\"codec\":\"av01.0.00M.08\",\"height\":36,\"name\":\"v/floor\",\"namespace\":\"catalogs\",\"packaging\":\"cmaf\",\"renderGroup\":1,\"width\":64},{\"isLive\":false,\"name\":\"v/l0/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"},{\"isLive\":false,\"name\":\"v/l1@800/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"},{\"isLive\":false,\"name\":\"v/l2/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"}],\"version\":1}\n"
},
{
"index": "catalogs/both-layers-on-800.wsix",
"namespace": "catalogs",
"layer_lag_ms": [
0,
200,
@ -43,7 +46,7 @@
"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"
"moq": "{\"tracks\":[{\"altGroup\":1,\"isLive\":false,\"name\":\"v/l0\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_motion\"],\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":6758122338894672,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l0/receipts\",\"wai_staged\":{\"layer\":0,\"lead_ms\":null,\"set\":\"v\"}},{\"depends\":[\"v/l0\"],\"isLive\":false,\"name\":\"v/l1@800\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":600,\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":6300050926507138,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l1@800/receipts\",\"wai_staged\":{\"layer\":1,\"lead_ms\":null,\"set\":\"v\"}},{\"depends\":[\"v/l0\",\"v/l1@800\"],\"isLive\":false,\"name\":\"v/l2@800\",\"namespace\":\"catalogs\",\"packaging\":\"wai\",\"renderGroup\":1,\"role\":\"video\",\"wai_capabilities\":[\"wai.video.int_refine\"],\"wai_delivery_timeout_ms\":400,\"wai_determinism\":\"decode-equivalence\",\"wai_receipt_alias\":2193082958864004,\"wai_receipts\":true,\"wai_receipts_track\":\"v/l2@800/receipts\",\"wai_staged\":{\"layer\":2,\"lead_ms\":null,\"set\":\"v\"}},{\"altGroup\":1,\"codec\":\"av01.0.00M.08\",\"height\":36,\"name\":\"v/floor\",\"namespace\":\"catalogs\",\"packaging\":\"cmaf\",\"renderGroup\":1,\"width\":64},{\"isLive\":false,\"name\":\"v/l0/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"},{\"isLive\":false,\"name\":\"v/l1@800/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"},{\"isLive\":false,\"name\":\"v/l2@800/receipts\",\"namespace\":\"catalogs\",\"packaging\":\"wai-receipts\"}],\"version\":1}\n"
}
]
}

View file

@ -0,0 +1,321 @@
{
"pack": "video-staged-01",
"class": "tv",
"label": "simulated",
"cases": [
{
"name": "strict",
"plan": {
"rtt_us": 0,
"bytes_per_ms": 40,
"chunk_bytes": 1200,
"enc_us": 0,
"startup_us": 3200000,
"layer_cap": null,
"fifo": false
},
"sim_plan": {
"plan": "wai-sim/1",
"mode": "live",
"link": {
"rtt_us": 0,
"bytes_per_ms": 40,
"chunk_bytes": 1200
},
"sender": {
"schedule": "strict-priority",
"carriage": "subgroup",
"layer_cap": null,
"delivery_timeout_us": {
"base": null,
"refinement": null
},
"vod_window_us": null
},
"sink": {
"workers": 1,
"decode_order": "base-first",
"decode_us": {
"base": 1,
"refinement": 1
},
"playout_start_us": 3200000,
"late_refinement": "discard"
}
},
"presented": [
0,
1,
0,
1,
0
],
"outcome": {
"label": "simulated",
"never_sent_capped": 0,
"pieces": [
{
"piece": 0,
"due_us": 3200000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 2890750,
"dropped": [
1
]
},
{
"piece": 1,
"due_us": 5200000,
"presented": 1,
"floor_only": false,
"base_arrival_us": 3493200,
"dropped": [
2
]
},
{
"piece": 2,
"due_us": 6200000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 4864350,
"dropped": []
},
{
"piece": 3,
"due_us": 7800000,
"presented": 1,
"floor_only": false,
"base_arrival_us": 6082450,
"dropped": [
2
]
},
{
"piece": 4,
"due_us": 8800000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 8750250,
"dropped": [
1,
2
]
}
],
"delivered": 139408,
"dropped": 275887,
"abandoned": 55200
}
},
{
"name": "fifo",
"plan": {
"rtt_us": 0,
"bytes_per_ms": 40,
"chunk_bytes": 1200,
"enc_us": 0,
"startup_us": 3200000,
"layer_cap": null,
"fifo": true
},
"sim_plan": {
"plan": "wai-sim/1",
"mode": "live",
"link": {
"rtt_us": 0,
"bytes_per_ms": 40,
"chunk_bytes": 1200
},
"sender": {
"schedule": "fifo",
"carriage": "subgroup",
"layer_cap": null,
"delivery_timeout_us": {
"base": null,
"refinement": null
},
"vod_window_us": null
},
"sink": {
"workers": 1,
"decode_order": "base-first",
"decode_us": {
"base": 1,
"refinement": 1
},
"playout_start_us": 3200000,
"late_refinement": "discard"
}
},
"presented": [
0,
0,
0,
1,
0
],
"outcome": {
"label": "simulated",
"never_sent_capped": 0,
"pieces": [
{
"piece": 0,
"due_us": 3200000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 2890750,
"dropped": [
1
]
},
{
"piece": 1,
"due_us": 5200000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 4003200,
"dropped": [
1,
2
]
},
{
"piece": 2,
"due_us": 6200000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 4864350,
"dropped": []
},
{
"piece": 3,
"due_us": 7800000,
"presented": 1,
"floor_only": false,
"base_arrival_us": 6082450,
"dropped": [
2
]
},
{
"piece": 4,
"due_us": 8800000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 8750250,
"dropped": [
1,
2
]
}
],
"delivered": 108709,
"dropped": 275386,
"abandoned": 86400
}
},
{
"name": "capped",
"plan": {
"rtt_us": 0,
"bytes_per_ms": 40,
"chunk_bytes": 1200,
"enc_us": 0,
"startup_us": 3200000,
"layer_cap": 1,
"fifo": false
},
"sim_plan": {
"plan": "wai-sim/1",
"mode": "live",
"link": {
"rtt_us": 0,
"bytes_per_ms": 40,
"chunk_bytes": 1200
},
"sender": {
"schedule": "strict-priority",
"carriage": "subgroup",
"layer_cap": 1,
"delivery_timeout_us": {
"base": null,
"refinement": null
},
"vod_window_us": null
},
"sink": {
"workers": 1,
"decode_order": "base-first",
"decode_us": {
"base": 1,
"refinement": 1
},
"playout_start_us": 3200000,
"late_refinement": "discard"
}
},
"presented": [
0,
1,
0,
1,
0
],
"outcome": {
"label": "simulated",
"never_sent_capped": 181901,
"pieces": [
{
"piece": 0,
"due_us": 3200000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 2890750,
"dropped": [
1
]
},
{
"piece": 1,
"due_us": 5200000,
"presented": 1,
"floor_only": false,
"base_arrival_us": 3493200,
"dropped": []
},
{
"piece": 2,
"due_us": 6200000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 4864350,
"dropped": []
},
{
"piece": 3,
"due_us": 7800000,
"presented": 1,
"floor_only": false,
"base_arrival_us": 6082450,
"dropped": []
},
{
"piece": 4,
"due_us": 8800000,
"presented": 0,
"floor_only": false,
"base_arrival_us": 8750250,
"dropped": [
1
]
}
],
"delivered": 139408,
"dropped": 122786,
"abandoned": 26400
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"pack": "video-staged-01",
"component": "v",
"window_pieces": 2,
"windows": [
{
"window": 0,
"first_piece": 0,
"pieces": 2,
"first_entry": 0,
"index_digest": "66b9399454a9937a52eef21bb7c452c8a03257d707d4a8238e99db447926aca0",
"receipt_hash": "c8143d2452499a4d3772e40c528255eae90e781511995a76b1cabd12c87b5950"
},
{
"window": 1,
"first_piece": 2,
"pieces": 2,
"first_entry": 6,
"index_digest": "b31b0d7e1faab1b7331bf26f8400ca848692aba315e2e8083086d1523baac510",
"receipt_hash": "03e9c415609e457da2a3d47298d91c541b36f03b634fb56060c9a4da1c2d8f13"
},
{
"window": 2,
"first_piece": 4,
"pieces": 1,
"first_entry": 10,
"index_digest": "61c64b3027c30891039da2d2b8e30744d83bd6f5b695d6b00ea616c575ceab94",
"receipt_hash": "11621610dbfff4321e11dc4ff8ba32cb2cb9e61fb17707a114bea4ec85d84e6c"
}
]
}

Binary file not shown.

View file

@ -0,0 +1 @@
{"asset_id":"video-staged-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"66b9399454a9937a52eef21bb7c452c8a03257d707d4a8238e99db447926aca0","media_class":"video","stage_root":"3aeb034c4d2f20e768d8e08bec6911370ff20790f8b04d38bc8618ecf18c2edf"}],"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":"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57","receipt_hash":"c8143d2452499a4d3772e40c528255eae90e781511995a76b1cabd12c87b5950","sig":"03bb324e8047e88a7d28494d3c132473992b40742476691b11ea0d4405fd6800928bed7a45303f0c7e3ccb293dfb41a1e2e68b4da3c06c6b70f35d44664fec05","signer_id":"did:key:z6MkhGok4PzLmtw1v5uW3Bpip8gHHifrCt42QJn4gEBfRVQG","signer_pubkey":"29e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55","stored_bytes":260808,"total_bytes":260808,"total_entries":6,"unique_objects":6,"version":2,"work_units":6}

Binary file not shown.

View file

@ -0,0 +1 @@
{"asset_id":"video-staged-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"b31b0d7e1faab1b7331bf26f8400ca848692aba315e2e8083086d1523baac510","media_class":"video","stage_root":"c64c85665b4723be6efbd42ecd2c69e201a8d12c7eb0f2f3739186f5fdc368ed"}],"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":"c8143d2452499a4d3772e40c528255eae90e781511995a76b1cabd12c87b5950","policy_digest":"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57","receipt_hash":"03e9c415609e457da2a3d47298d91c541b36f03b634fb56060c9a4da1c2d8f13","sig":"fb568c45c8645e5213aed52462bbcdf1354f2b55fc0cd134ce563ab2b5721c2f5346111392ef46d2b193aacaa4553cae1a202e6149fcd1abdea9e743d0037a00","signer_id":"did:key:z6MkhGok4PzLmtw1v5uW3Bpip8gHHifrCt42QJn4gEBfRVQG","signer_pubkey":"29e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55","stored_bytes":81674,"total_bytes":81674,"total_entries":4,"unique_objects":4,"version":2,"work_units":4}

Binary file not shown.

View file

@ -0,0 +1 @@
{"asset_id":"video-staged-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"61c64b3027c30891039da2d2b8e30744d83bd6f5b695d6b00ea616c575ceab94","media_class":"video","stage_root":"32198182aa20797140685219dfcaa36ac3611d1ae2f3c0c77cb9161317d86c1d"}],"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":"03e9c415609e457da2a3d47298d91c541b36f03b634fb56060c9a4da1c2d8f13","policy_digest":"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57","receipt_hash":"11621610dbfff4321e11dc4ff8ba32cb2cb9e61fb17707a114bea4ec85d84e6c","sig":"651ed23c5b03c585516ecafbbe23c589a83678bae88f26539bd7aedfc92c3241ee0c38aa53f233145cff1c2a7eaba5233329dfd5b3eae2d0c53734c5a2d66900","signer_id":"did:key:z6MkhGok4PzLmtw1v5uW3Bpip8gHHifrCt42QJn4gEBfRVQG","signer_pubkey":"29e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55","stored_bytes":214312,"total_bytes":214312,"total_entries":3,"unique_objects":3,"version":2,"work_units":3}

File diff suppressed because it is too large Load diff

View file

@ -16,7 +16,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
13b7a7cf473134c1a9dfb0a380c4464bcd5e3a7f2e007efe65f32fd9422175c0 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -16,7 +16,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
44692fd01ae15a4d7edaa1813241e55e8b2367180dc700b0c780d2d4014a4f95 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
1cfc2a0d1b54f1a6ec47ebec95de9bc1cba3a9df40dbc3868d684ffa1f33db8d index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
b1ebb904e14be6aa830e400b4d732bc46ac47986f5b20202be0a261ace2369f0 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c4044eca76959c9f87230484a2b207fb12c0bcaedb8d921eab806014fca53cb8 hls/mobile/wai
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
216c7a0baa5505fb92e3fe5cd2101962f220c6b188fe4ec3a5f655703373738a index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
e1ff9d513a5576dd32236a21b4ad00d1e97b3d9247c8a0b05f44ff2ee3080594 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
4dacc52e68b4fd119cb6da1387961aeabaa7dda4ed75ea9df881e92bfb2552d3 objects/504d5519c3690a705d7e2cb4089ef6bf474311b8809bfe1a7c6a3f00628e8b4c.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
44b744229777bd582f45bf670e2dd873798cb21c205f55efaea164acb3a6128f index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
3ba33185bdcba397875e354354a5f54b06b561da6fa98f98584458752eddd41e objects/455892cdcffca9b861b34ac980ef50e2cfbd4062e81ed7029da687026ef4bd11.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ fa991c3f0242f452b02f5c70b72e10e864db388a40b654bfe64dcca8423b077e hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
f2f570cba26269e220795992dd224078b6c05473940ab1f6a900f2c8d1b220b1 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
ed10f43afaa754358e36b19a8fe5a9b614a272d5741bfaebe5fb24ea2a457086 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
752666c9b5af4bcf8d7eb7a09e43b368069828d2b9848dd882660e64025c74a2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
59c59bd437e2dac861a3b442f36b2387faa5942315c2b9fc0ffadd4163431973 objects/092d88d17b4fd8de5ed3d820c618dccba83a80a0b2d863a797ca9afb4c9ba259.wai
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
11eee7726f33e9ca6e1d16eddb0a01bdd4cff18cfe6caa625585f19429173bbf index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
baabd81a9cad6e8afacbb18311924557956a0e37f5f271e8d458d651921707c4 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
3c481132f733d1076cad2742c8a4b4667dad83397c1a57abfeb8333ab9944cbb index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
8bfd45971ced265bfc01d043d53359c2d23aa8ac4c6512b0a421f78e1bdfe476 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -20,7 +20,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
00641a12e923f55c78bdc6d1262a0d4dc218a7c35904590e3dbaf16a7607f745 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
c3a5e23418c1ff2cc8e12281df47a82bebe61b31260997a71311f1275d104334 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
ad140ff82229d3f47f4b2b67be03006ae5a86f89444b4db2b1265ed32766b965 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
ad140ff82229d3f47f4b2b67be03006ae5a86f89444b4db2b1265ed32766b965 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
108469a87ed44e9a7ce517eae4507fc789b7a3ffa926ded766ca463d6443e161 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai
f3eedf9eb2870c0160801397412e7a4c3aca4a6e16f1a69a276e1356d38c9220 objects/61c7c3b7ccab07ed01df5b0d7ca0240598b914dbf2cabe545aa001e8de12d365.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -17,7 +17,7 @@ c5902f61ffaf77f940c4d3dc6e850340aaaeb3f433e4541f935c32443c50b341 hls/tv/master.
ff4edf2929e380d205c1c74156621185feec53d593ffa968b8dfaf0d05448bcd hls/tv/wai-v.m3u8
5d42147b308330913c3d9c8a868ca83ce4d3f3e460da8d84c84014eb24aaf9d7 hls/tv/wai.m3u8
0b65400d0bbde57ed6a2c19d90cb72ec753de0e76165e4f286acfd5a7bda14d2 index-v.wsix
57ecdf226998f26618121279f42ebe674cb5467c489f6e9aa12feba24989d9ab moq/catalog.json
115e8e1e7ee0765de9bd2f71576cae01ce6576a5ce2a24f3374879eb74d9a6af moq/catalog.json
07e98fb9ef9ff3fa6bf04f9078da2a3d2423e586feea1061256131a1d1fbb943 objects/24761a434c91c627f11abd6265371966b50573602a200dd7bb04e0d90889326d.wai
4d583d03292b77f9d46b02f2c80a774b1cda1b07df38243d18fe586b82eaca60 objects/35c7a45323b7afe979c123fa885f35cc55fabd2a1954759aebe4b95dbc76361f.wai
cfb71256ef44758ea279846a8938823994d321abce83ef73afd2ed269a8e0259 objects/618e0a89be8c7e556b380326b219c2f6fbfc5a0cb97754e871c1c23a99bdb481.wai

View file

@ -1 +1 @@
{"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},{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"v/floor","packaging":"cmaf","renderGroup":1,"width":64}],"version":1}
{"tracks":[{"altGroup":1,"isLive":false,"name":"v/l0","namespace":"video-base-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_motion"],"wai_determinism":"decode-equivalence","wai_receipt_alias":1379901173764869,"wai_receipts":true,"wai_receipts_track":"v/l0/receipts","wai_staged":{"layer":0,"lead_ms":null,"set":"v"}},{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"v/floor","namespace":"video-base-01","packaging":"cmaf","renderGroup":1,"width":64},{"isLive":false,"name":"v/l0/receipts","namespace":"video-base-01","packaging":"wai-receipts"}],"version":1}

Binary file not shown.

View file

@ -0,0 +1 @@
a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5

View file

@ -0,0 +1,41 @@
f9359ffd69743b04bc491f9fe32e6bac50a3f2e6c9ec9e747b0f16572bea0dec dash/classic.mpd
e3f5ca3e780c57e10b71b30b644dd5c488f85cc11cb12557c75307ea6590d657 dash/mobile.mpd
825126074444a4419069e844ae4a0b9dcb02a2ef5830168e4e77967de9df710a dash/tv.mpd
312da579d4bf042888e3ee044b8346360fad3032cdb8cacb7fcf19d7a26c3ba2 floor/v/312da579d4bf042888e3ee044b8346360fad3032cdb8cacb7fcf19d7a26c3ba2.m4s
39f61548f8f65c68612e02ed11803c3477ed293bc1be12608be69ffd652de768 floor/v/39f61548f8f65c68612e02ed11803c3477ed293bc1be12608be69ffd652de768.m4s
470bbd4e4bc7d8c7a14adafdf50ae5c256fb5086b13389099cf0babf164986fa floor/v/470bbd4e4bc7d8c7a14adafdf50ae5c256fb5086b13389099cf0babf164986fa.m4s
c3470c0a3624d3e458b8fe12a0ff68df725d27cf7768984d6f6aca0149dd2362 floor/v/c3470c0a3624d3e458b8fe12a0ff68df725d27cf7768984d6f6aca0149dd2362.m4s
ca9a1818ed7001e0ef0543bf3864b4ad937362fa89b834f4838349bcb789fc5b floor/v/ca9a1818ed7001e0ef0543bf3864b4ad937362fa89b834f4838349bcb789fc5b.m4s
58c598174eed554cd0d1bc8abedca8c9d51d992c8e3b963bcb7574da4983ed9f floor/v/init.mp4
b3a3be45bb384a06e744c8c2293ba59e16738791abe3ac90b262c2db9a0c5744 hls/classic/floor-v.m3u8
586a9ebcc3a05b8497658933f27caca010ff6bd74c885960a4bab04c2406879c hls/classic/master.m3u8
586a9ebcc3a05b8497658933f27caca010ff6bd74c885960a4bab04c2406879c hls/legacy/master.m3u8
44a2f73da356e854f8fd05a564ad30ef05aff81a2f26fb316757a07acb79bf3c hls/mobile/master.m3u8
1b7bf011b974365e6bc6532de6d0c54fa9b1447f75c84f3c52d02e1c433e146a hls/mobile/wai-v.m3u8
adce889f610eaa20b77909693de01dfae787518748223b0774cd56004e0c9353 hls/mobile/wai.m3u8
44a2f73da356e854f8fd05a564ad30ef05aff81a2f26fb316757a07acb79bf3c hls/tv/master.m3u8
1ea26eaea415f8b459f5994a950e14016a501c2464b9ed8d77db800e16da31d2 hls/tv/wai-v.m3u8
fc9db3d8e327724c8a7ee793d4b1f1949cf95df1c1941bfcc2bf539fe4184e77 hls/tv/wai.m3u8
424e86d090780853634a8b95c8a75e9a012fc28e74e0fede44127823cc3e5efe index-v.wsix
0387c4128de60831575723b868864c82f9d8d129aacec6ad8797db5ca5e5acf4 moq/catalog.json
fc3c7e6fc88dae24c824d2a0f14af72e86bbb5aa53c4ad6c0d40c9733fa1358b objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai
8cedefd8d5f0ae91768d7107a0a86b07580526f329339e5384c7e710f6c7edbf objects/3522115bc258246c4dd67879e2b9c10f3be41cbc88aec1254e1d26e9d87b4423.wai
588689b9e92b610b20d5f08ce6762adb6d32ac5221fffa3232882434050ad59d objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai
f6876fbfe12e3a3c164efa2ce9d65e2bc066ce5bb2bba16f285de485c9fddb78 objects/66c03382125a5a72828ca5223599007817784a12129e431066290f8ff5df562e.wai
84fcac3182c4dc25b84001bc58e2fa140ae3b8117a42fa4897af0e7ff7a1e920 objects/7aeabafc9c50d289b5f65a7480a88774f94be9eec5b706c16835a59bbe59a0ec.wai
849b7e2cba0f65d3183119f6f4f2c77e5c2a1db9a38d8552369db2dec28df7a7 objects/8173f0eca11aaae0c29d415aedb60252cd8c8c32460c13e124ad70d9a4acd90f.wai
22c6777c989d288a6a89876062a244194fde54f5b091b0f603c4ef11f1bc4f60 objects/93439520366affbd9ec0a51d57120d0e45a6b4651884ece2eaf5b8954c188038.wai
83657a16f8686cb03f1da0b5fe3a60ad24b32e1b3f24c17e5b9e5e54720571be objects/98bb5bbdb41e89f39288a59eb469b152e55b175983e46521ed2bb40999fc511d.wai
38725131c01f75141fe1790d40209348da7f45241df0bf82a794e8c8196a0fb6 objects/9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9.wai
f9ce66461527b6c1493336ca950908511fe0414fc3d836aff6c045a015090851 objects/a411541dd2eb555c9fd5b6dfe0cd00baae6574568225afa839e36af62f6bbdae.wai
e191fd2fe53e15c30c964e355340cbfbb44562078d6c18c8321c9d3539c43423 objects/a59afe3368e48b835e3f0c170d8fc42b87fce91bb8567f7e8a9b091db0c51b87.wai
59f1b4eae347ec3f0647ccefa738701dcce32ee83a5fa1c0aca29c3a27c7858d objects/cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27.wai
2f5da0ff307fd4a466607d2ef35ac4fc7215353d70f592c875cafe77c7a2fcc7 objects/d955b5f2232046829b6a5da0c436412c91e97b7d0c16afb07e5f6e68a39ef66c.wai
bf7bb63e1e3f03967f8da44a5700f4ded079e6d4d9a6c0ff9503c458269c486f objects/f5cacd6f092d317d0972e3d8ed4efcf4702b820bd5295aebdd252dd8dbc409e9.wai
6204e0570e77912b82c4b0bbbb51d3612334367b2ab62021a93578043e296ec9 package.receipt.json
8454596c213291b896c4483017406c58076e27ad0cab4fab54b850841dfa1a29 plan-v.txt
11536aab05b3fe23aa428a52617da9d156f6326d42ee5b8785af4713b436ecf2 policy.json
61ad0d0ba75977d401ebaeb00b5a8f5795f3b7a1408018fcbb02038f2c412e16 policy.toml
703346f293954ae90516c7cf1a8616e6851f3dba3ca3f51967b388493b1736ff stages/legacy.json
b8beb6eaa1c5a04801b0dcbcbd7f0885f5b0730871708ce0a59093e3c8ea1fdb stages/mobile.json
9c4eda5ea5972cbca98b3b89503235fcd807450c129545ca86c322337e27d872 stages/tv.json

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:full:2011" type="static" mediaPresentationDuration="PT8.000S" minBufferTime="PT3S">
<Period id="p0" start="PT0S">
<AdaptationSet id="1" contentType="video" mimeType="video/mp4" codecs="av01.0.00M.08" width="64" height="36" segmentAlignment="true" startWithSAP="1">
<Representation id="v-floor" bandwidth="9334">
<SegmentList timescale="25">
<Initialization sourceURL="../floor/v/init.mp4"/>
<SegmentTimeline>
<S t="0" d="50"/>
<S t="50" d="25"/>
<S t="75" d="40"/>
<S t="115" d="25"/>
<S t="140" d="60"/>
</SegmentTimeline>
<SegmentURL media="../floor/v/39f61548f8f65c68612e02ed11803c3477ed293bc1be12608be69ffd652de768.m4s"/>
<SegmentURL media="../floor/v/470bbd4e4bc7d8c7a14adafdf50ae5c256fb5086b13389099cf0babf164986fa.m4s"/>
<SegmentURL media="../floor/v/312da579d4bf042888e3ee044b8346360fad3032cdb8cacb7fcf19d7a26c3ba2.m4s"/>
<SegmentURL media="../floor/v/ca9a1818ed7001e0ef0543bf3864b4ad937362fa89b834f4838349bcb789fc5b.m4s"/>
<SegmentURL media="../floor/v/c3470c0a3624d3e458b8fe12a0ff68df725d27cf7768984d6f6aca0149dd2362.m4s"/>
</SegmentList>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:full:2011" type="static" mediaPresentationDuration="PT8.000S" minBufferTime="PT3S">
<Period id="p0" start="PT0S">
<AdaptationSet id="1" contentType="video" mimeType="application/wai" codecs="wai1.video.int_motion+video.int_refine" width="64" height="36">
<EssentialProperty schemeIdUri="tag:transaction.science,2026:wai/http-delivery"/>
<SupplementalProperty schemeIdUri="tag:transaction.science,2026:wai/floor" value="wai1.video.int_motion"/>
<SupplementalProperty schemeIdUri="tag:transaction.science,2026:wai/class" value="mobile"/>
<SupplementalProperty schemeIdUri="tag:transaction.science,2026:wai/stages" value="../stages/mobile.json"/>
<Representation id="v-l0" bandwidth="105367">
<SegmentList timescale="25">
<SegmentTimeline>
<S t="0" d="50"/>
<S t="50" d="25"/>
<S t="115" d="25"/>
<S t="140" d="60"/>
</SegmentTimeline>
<SegmentURL media="../objects/cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27.wai"/>
<SegmentURL media="../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai"/>
<SegmentURL media="../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai"/>
<SegmentURL media="../objects/9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9.wai"/>
</SegmentList>
</Representation>
<Representation id="v-l1" dependencyId="v-l0" bandwidth="245592">
<SegmentList timescale="25">
<SegmentTimeline>
<S t="50" d="25"/>
<S t="115" d="25"/>
</SegmentTimeline>
<SegmentURL media="../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai"/>
<SegmentURL media="../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai"/>
</SegmentList>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:full:2011" type="static" mediaPresentationDuration="PT8.000S" minBufferTime="PT3S">
<Period id="p0" start="PT0S">
<AdaptationSet id="1" contentType="video" mimeType="application/wai" codecs="wai1.video.int_motion+video.int_refine" width="64" height="36">
<EssentialProperty schemeIdUri="tag:transaction.science,2026:wai/http-delivery"/>
<SupplementalProperty schemeIdUri="tag:transaction.science,2026:wai/floor" value="wai1.video.int_motion+video.int_refine"/>
<SupplementalProperty schemeIdUri="tag:transaction.science,2026:wai/class" value="tv"/>
<SupplementalProperty schemeIdUri="tag:transaction.science,2026:wai/stages" value="../stages/tv.json"/>
<Representation id="v-l0" bandwidth="105367">
<SegmentList timescale="25">
<SegmentTimeline>
<S t="0" d="50"/>
<S t="50" d="25"/>
<S t="115" d="25"/>
<S t="140" d="60"/>
</SegmentTimeline>
<SegmentURL media="../objects/cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27.wai"/>
<SegmentURL media="../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai"/>
<SegmentURL media="../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai"/>
<SegmentURL media="../objects/9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9.wai"/>
</SegmentList>
</Representation>
<Representation id="v-l1" dependencyId="v-l0" bandwidth="271357">
<SegmentList timescale="25">
<SegmentTimeline>
<S t="0" d="50"/>
<S t="50" d="25"/>
<S t="115" d="25"/>
<S t="140" d="60"/>
</SegmentTimeline>
<SegmentURL media="../objects/7aeabafc9c50d289b5f65a7480a88774f94be9eec5b706c16835a59bbe59a0ec.wai"/>
<SegmentURL media="../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai"/>
<SegmentURL media="../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai"/>
<SegmentURL media="../objects/98bb5bbdb41e89f39288a59eb469b152e55b175983e46521ed2bb40999fc511d.wai"/>
</SegmentList>
</Representation>
<Representation id="v-l2" dependencyId="v-l1" bandwidth="337650">
<SegmentList timescale="25">
<SegmentTimeline>
<S t="50" d="25"/>
<S t="115" d="25"/>
<S t="140" d="60"/>
</SegmentTimeline>
<SegmentURL media="../objects/f5cacd6f092d317d0972e3d8ed4efcf4702b820bd5295aebdd252dd8dbc409e9.wai"/>
<SegmentURL media="../objects/f5cacd6f092d317d0972e3d8ed4efcf4702b820bd5295aebdd252dd8dbc409e9.wai"/>
<SegmentURL media="../objects/a59afe3368e48b835e3f0c170d8fc42b87fce91bb8567f7e8a9b091db0c51b87.wai"/>
</SegmentList>
</Representation>
</AdaptationSet>
</Period>
</MPD>

View file

@ -0,0 +1,18 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MAP:URI="../../floor/v/init.mp4"
#EXTINF:2.000,
../../floor/v/39f61548f8f65c68612e02ed11803c3477ed293bc1be12608be69ffd652de768.m4s
#EXTINF:1.000,
../../floor/v/470bbd4e4bc7d8c7a14adafdf50ae5c256fb5086b13389099cf0babf164986fa.m4s
#EXTINF:1.600,
../../floor/v/312da579d4bf042888e3ee044b8346360fad3032cdb8cacb7fcf19d7a26c3ba2.m4s
#EXTINF:1.000,
../../floor/v/ca9a1818ed7001e0ef0543bf3864b4ad937362fa89b834f4838349bcb789fc5b.m4s
#EXTINF:2.400,
../../floor/v/c3470c0a3624d3e458b8fe12a0ff68df725d27cf7768984d6f6aca0149dd2362.m4s
#EXT-X-ENDLIST

View file

@ -0,0 +1,5 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=9334,AVERAGE-BANDWIDTH=8796,CODECS="av01.0.00M.08",RESOLUTION=64x36
../classic/floor-v.m3u8

View file

@ -0,0 +1,5 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=9334,AVERAGE-BANDWIDTH=8796,CODECS="av01.0.00M.08",RESOLUTION=64x36
../classic/floor-v.m3u8

View file

@ -0,0 +1,6 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=9334,AVERAGE-BANDWIDTH=8796,CODECS="av01.0.00M.08",RESOLUTION=64x36
../classic/floor-v.m3u8

View file

@ -0,0 +1,20 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXTINF:2.000,
../../objects/cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27.wai#n=26030
#EXTINF:1.000,
#WAI-LAYER:N=1,URI="../../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai#n=30699"
../../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai#n=9698
#EXT-X-GAP
#EXTINF:1.600,
../../objects/8173f0eca11aaae0c29d415aedb60252cd8c8c32460c13e124ad70d9a4acd90f.wai#n=974
#EXTINF:1.000,
#WAI-LAYER:N=1,URI="../../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai#n=30699"
../../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai#n=9698
#EXTINF:2.400,
../../objects/9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9.wai#n=31610
#EXT-X-ENDLIST

View file

@ -0,0 +1,7 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.class",VALUE="mobile"
#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.stages",URI="../../stages/mobile.json"
#EXT-X-STREAM-INF:BANDWIDTH=323176,AVERAGE-BANDWIDTH=173043,CODECS="wai1.video.int_motion+video.int_refine",X-WAI-FLOOR="wai1.video.int_motion",RESOLUTION=64x36
wai-v.m3u8

View file

@ -0,0 +1,6 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.multivariant",VALUE="wai.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=9334,AVERAGE-BANDWIDTH=8796,CODECS="av01.0.00M.08",RESOLUTION=64x36
../classic/floor-v.m3u8

View file

@ -0,0 +1,25 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXTINF:2.000,
#WAI-LAYER:N=1,URI="../../objects/7aeabafc9c50d289b5f65a7480a88774f94be9eec5b706c16835a59bbe59a0ec.wai#n=67779"
../../objects/cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27.wai#n=26030
#EXTINF:1.000,
#WAI-LAYER:N=1,URI="../../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai#n=30699"
#WAI-LAYER:N=2,URI="../../objects/f5cacd6f092d317d0972e3d8ed4efcf4702b820bd5295aebdd252dd8dbc409e9.wai#n=40303"
../../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai#n=9698
#EXT-X-GAP
#EXTINF:1.600,
../../objects/8173f0eca11aaae0c29d415aedb60252cd8c8c32460c13e124ad70d9a4acd90f.wai#n=974
#EXTINF:1.000,
#WAI-LAYER:N=1,URI="../../objects/656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b.wai#n=30699"
#WAI-LAYER:N=2,URI="../../objects/f5cacd6f092d317d0972e3d8ed4efcf4702b820bd5295aebdd252dd8dbc409e9.wai#n=40303"
../../objects/2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61.wai#n=9698
#EXTINF:2.400,
#WAI-LAYER:N=1,URI="../../objects/98bb5bbdb41e89f39288a59eb469b152e55b175983e46521ed2bb40999fc511d.wai#n=81407"
#WAI-LAYER:N=2,URI="../../objects/a59afe3368e48b835e3f0c170d8fc42b87fce91bb8567f7e8a9b091db0c51b87.wai#n=101295"
../../objects/9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9.wai#n=31610
#EXT-X-ENDLIST

View file

@ -0,0 +1,7 @@
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.class",VALUE="tv"
#EXT-X-SESSION-DATA:DATA-ID="science.transaction.wai.stages",URI="../../stages/tv.json"
#EXT-X-STREAM-INF:BANDWIDTH=714374,AVERAGE-BANDWIDTH=586902,CODECS="wai1.video.int_motion+video.int_refine",X-WAI-FLOOR="wai1.video.int_motion+video.int_refine",RESOLUTION=64x36
wai-v.m3u8

View file

@ -0,0 +1 @@
{"tracks":[{"altGroup":1,"isLive":false,"name":"v/l0","namespace":"video-staged-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_motion","wai.image.png"],"wai_determinism":"decode-equivalence","wai_receipt_alias":6826975590310646,"wai_receipts":true,"wai_receipts_track":"v/l0/receipts","wai_staged":{"layer":0,"lead_ms":null,"set":"v"}},{"depends":["v/l0"],"isLive":false,"name":"v/l1@800","namespace":"video-staged-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_refine"],"wai_delivery_timeout_ms":600,"wai_determinism":"decode-equivalence","wai_receipt_alias":4051354593871184,"wai_receipts":true,"wai_receipts_track":"v/l1@800/receipts","wai_staged":{"layer":1,"lead_ms":null,"set":"v"}},{"depends":["v/l0"],"isLive":false,"name":"v/l1","namespace":"video-staged-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_refine"],"wai_delivery_timeout_ms":1300,"wai_determinism":"decode-equivalence","wai_receipt_alias":5745064158311842,"wai_receipts":true,"wai_receipts_track":"v/l1/receipts","wai_staged":{"layer":1,"lead_ms":null,"set":"v"}},{"depends":["v/l0","v/l1@800"],"isLive":false,"name":"v/l2@800","namespace":"video-staged-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_refine"],"wai_delivery_timeout_ms":400,"wai_determinism":"decode-equivalence","wai_receipt_alias":8428654497284120,"wai_receipts":true,"wai_receipts_track":"v/l2@800/receipts","wai_staged":{"layer":2,"lead_ms":null,"set":"v"}},{"depends":["v/l0","v/l1"],"isLive":false,"name":"v/l2","namespace":"video-staged-01","packaging":"wai","renderGroup":1,"role":"video","wai_capabilities":["wai.video.int_refine"],"wai_delivery_timeout_ms":1100,"wai_determinism":"decode-equivalence","wai_receipt_alias":6697012243957121,"wai_receipts":true,"wai_receipts_track":"v/l2/receipts","wai_staged":{"layer":2,"lead_ms":null,"set":"v"}},{"altGroup":1,"codec":"av01.0.00M.08","height":36,"name":"v/floor","namespace":"video-staged-01","packaging":"cmaf","renderGroup":1,"width":64},{"isLive":false,"name":"v/l0/receipts","namespace":"video-staged-01","packaging":"wai-receipts"},{"isLive":false,"name":"v/l1@800/receipts","namespace":"video-staged-01","packaging":"wai-receipts"},{"isLive":false,"name":"v/l1/receipts","namespace":"video-staged-01","packaging":"wai-receipts"},{"isLive":false,"name":"v/l2@800/receipts","namespace":"video-staged-01","packaging":"wai-receipts"},{"isLive":false,"name":"v/l2/receipts","namespace":"video-staged-01","packaging":"wai-receipts"}],"version":1}

View file

@ -0,0 +1 @@
{"asset_id":"video-staged-01","components":[{"id":"v","index":"index-v.wsix","index_digest":"6842a02b45fb2ddf8095621836901abdbf2526451d740976ffe7079fc210932c","media_class":"video","stage_root":"c10304943d547971b05fdb57231dcd6e097d7df38cc68ea92c376ddc957e022d"}],"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":"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57","receipt_hash":"4441a653f101172ee9d4b76f788a10f23ab359e7bf3116fb09327699c2c83ef0","sig":"f62bd725148a4203b440769906eacf7083895accc0191782f7e43197d92a598b90f1a5ea04eedd493dda87a5e622889562f0f09a5010cb053700b016f44cb504","signer_id":"did:key:z6MkhGok4PzLmtw1v5uW3Bpip8gHHifrCt42QJn4gEBfRVQG","signer_pubkey":"29e5833a915a6429a4e3a7948475c338ef436eb82be89c92f059704403db9d55","stored_bytes":484464,"total_bytes":566398,"total_entries":18,"unique_objects":14,"version":2,"work_units":18}

View file

@ -0,0 +1,5 @@
0
50
75
115
140

View file

@ -0,0 +1 @@
{"asset_id":"video-staged-01","class":[{"floor_only":false,"id":"tv","max_layer":2},{"floor_only":false,"id":"mobile","max_kbps":330,"max_layer":1},{"floor_only":true,"id":"legacy","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-staged-01.y4m","timebase":{"den":1,"num":25}}],"defaults":{"deadline_ms":1500},"floor":{"extra_keyframes":false,"supplied_listing":"f00d8bf055ef725d99f925cc0c1c97b6b7fc956c82872f63840c246b4b69e150"},"ladder":[{"capability":"wai.video.int_motion","component":"v","id":"b0","params":{"block":16,"max_sse_px_milli":60000,"mv_precision":1,"q_candidates":[24,16],"search":4},"role":"base"},{"capability":"wai.video.int_refine","component":"v","id":"r1","params":{"q":12},"refines":"b0","role":"refinement"},{"capability":"wai.video.int_refine","component":"v","id":"r2","params":{"q":4},"refines":"r1","role":"refinement"},{"capability":"wai.image.png","component":"v","id":"still","params":{},"role":"base"},{"capability":"wai.video.av1","component":"v","id":"f0","params":{"source":"supplied"},"role":"floor"}],"lead":"v","live":{"layer_lag_ms":[0,200,400]},"moment":[{"from_ms":5600,"id":"m-event","tags":["event"],"to_ms":8000}],"royalty_free_only":true,"rule":[{"id":"static","then":{"ladder":["still","f0"]},"when":{"piece_kind":["static"]}},{"id":"motion","then":{"max_layer":1},"when":{"piece_kind":["motion_high"]}},{"id":"event","then":{"deadline_ms":800},"when":{"moment_tag":["event"]}}],"schema":"wai.pack.policy/1","segmentation":{"closed":true,"cut_abs_permille":300,"cut_rel_permille":3000,"cut_window":8,"lookahead_frames":6,"max_ms":4000,"min_ms":1000,"scene_cut":"wai.pack.scenecut/1","target_ms":2000}}

View file

@ -0,0 +1,94 @@
schema = "wai.pack.policy/1"
asset_id = "video-staged-01"
royalty_free_only = true
lead = "v"
[[component]]
id = "v"
media = "video"
source = "video-staged-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 = [24, 16], max_sse_px_milli = 60000 }
[[ladder]]
id = "r1"
component = "v"
capability = "wai.video.int_refine"
role = "refinement"
refines = "b0"
params = { q = 12 }
[[ladder]]
id = "r2"
component = "v"
capability = "wai.video.int_refine"
role = "refinement"
refines = "r1"
params = { q = 4 }
[[ladder]]
id = "still"
component = "v"
capability = "wai.image.png"
role = "base"
[[ladder]]
id = "f0"
component = "v"
capability = "wai.video.av1"
role = "floor"
params = { source = "supplied" }
[floor]
supplied_listing = "f00d8bf055ef725d99f925cc0c1c97b6b7fc956c82872f63840c246b4b69e150"
[live]
layer_lag_ms = [0, 200, 400]
[[class]]
id = "tv"
max_layer = 2
[[class]]
id = "mobile"
max_layer = 1
max_kbps = 330
[[class]]
id = "legacy"
floor_only = true
[[moment]]
id = "m-event"
from_ms = 5600
to_ms = 8000
tags = ["event"]
[[rule]]
id = "static"
when = { piece_kind = ["static"] }
then = { ladder = ["still", "f0"] }
[[rule]]
id = "motion"
when = { piece_kind = ["motion_high"] }
then = { max_layer = 1 }
[[rule]]
id = "event"
when = { moment_tag = ["event"] }
then = { deadline_ms = 800 }

View file

@ -0,0 +1 @@
{"class":"legacy","components":{"v":{"pieces":[{"dur":50,"floor_only":true,"p":0,"stages":[],"start":0},{"dur":25,"floor_only":true,"p":1,"stages":[],"start":50},{"dur":40,"floor_only":true,"p":2,"stages":[],"start":75},{"dur":25,"floor_only":true,"p":3,"stages":[],"start":115},{"dur":60,"floor_only":true,"p":4,"stages":[],"start":140}]}},"policy_digest":"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57"}

View file

@ -0,0 +1 @@
{"class":"mobile","components":{"v":{"media_playlist":"../hls/mobile/wai-v.m3u8","pieces":[{"dur":50,"p":0,"stages":[{"bytes":26030,"h":"cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27","layer":0}],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9698,"h":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61","layer":0},{"bytes":30699,"deadline_ms":1500,"h":"656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b","layer":1,"refines":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61"}],"start":50},{"dur":40,"p":2,"stages":[{"bytes":974,"h":"8173f0eca11aaae0c29d415aedb60252cd8c8c32460c13e124ad70d9a4acd90f","layer":0}],"start":75},{"dur":25,"p":3,"stages":[{"bytes":9698,"h":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61","layer":0},{"bytes":30699,"deadline_ms":1500,"h":"656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b","layer":1,"refines":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61"}],"start":115},{"dur":60,"p":4,"stages":[{"bytes":31610,"h":"9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9","layer":0}],"start":140}]}},"policy_digest":"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57"}

View file

@ -0,0 +1 @@
{"class":"tv","components":{"v":{"media_playlist":"../hls/tv/wai-v.m3u8","pieces":[{"dur":50,"p":0,"stages":[{"bytes":26030,"h":"cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27","layer":0},{"bytes":67779,"deadline_ms":1500,"h":"7aeabafc9c50d289b5f65a7480a88774f94be9eec5b706c16835a59bbe59a0ec","layer":1,"refines":"cf015505a36b0b76b50c41f15f3a0210163886054d53d35f1c4d414bf1c22d27"}],"start":0},{"dur":25,"p":1,"stages":[{"bytes":9698,"h":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61","layer":0},{"bytes":30699,"deadline_ms":1500,"h":"656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b","layer":1,"refines":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61"},{"bytes":40303,"deadline_ms":1500,"h":"f5cacd6f092d317d0972e3d8ed4efcf4702b820bd5295aebdd252dd8dbc409e9","layer":2,"refines":"656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b"}],"start":50},{"dur":40,"p":2,"stages":[{"bytes":974,"h":"8173f0eca11aaae0c29d415aedb60252cd8c8c32460c13e124ad70d9a4acd90f","layer":0}],"start":75},{"dur":25,"p":3,"stages":[{"bytes":9698,"h":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61","layer":0},{"bytes":30699,"deadline_ms":1500,"h":"656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b","layer":1,"refines":"2b95867d323012d663b0f8c88fc8d8d0c3b5642a9784f00d30ce2ab176341c61"},{"bytes":40303,"deadline_ms":1500,"h":"f5cacd6f092d317d0972e3d8ed4efcf4702b820bd5295aebdd252dd8dbc409e9","layer":2,"refines":"656e5f72c8b8165d9f59f30a6cbca465383cc3d478b6474e2a91e592796f320b"}],"start":115},{"dur":60,"p":4,"stages":[{"bytes":31610,"h":"9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9","layer":0},{"bytes":81407,"deadline_ms":800,"h":"98bb5bbdb41e89f39288a59eb469b152e55b175983e46521ed2bb40999fc511d","layer":1,"refines":"9fb263069ffb6a50052e79baeeee7c5814106011d57be9c4f6396c5dbd9902a9"},{"bytes":101295,"deadline_ms":800,"h":"a59afe3368e48b835e3f0c170d8fc42b87fce91bb8567f7e8a9b091db0c51b87","layer":2,"refines":"98bb5bbdb41e89f39288a59eb469b152e55b175983e46521ed2bb40999fc511d"}],"start":140}]}},"policy_digest":"1bed669917d9d78e1a0f65a5a998db50e98e3dbdf836cc2ae00ff2ac97d67e57"}

View file

@ -0,0 +1,94 @@
schema = "wai.pack.policy/1"
asset_id = "video-staged-01"
royalty_free_only = true
lead = "v"
[[component]]
id = "v"
media = "video"
source = "video-staged-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 = [24, 16], max_sse_px_milli = 60000 }
[[ladder]]
id = "r1"
component = "v"
capability = "wai.video.int_refine"
role = "refinement"
refines = "b0"
params = { q = 12 }
[[ladder]]
id = "r2"
component = "v"
capability = "wai.video.int_refine"
role = "refinement"
refines = "r1"
params = { q = 4 }
[[ladder]]
id = "still"
component = "v"
capability = "wai.image.png"
role = "base"
[[ladder]]
id = "f0"
component = "v"
capability = "wai.video.av1"
role = "floor"
params = { source = "supplied" }
[floor]
supplied_listing = "f00d8bf055ef725d99f925cc0c1c97b6b7fc956c82872f63840c246b4b69e150"
[live]
layer_lag_ms = [0, 200, 400]
[[class]]
id = "tv"
max_layer = 2
[[class]]
id = "mobile"
max_layer = 1
max_kbps = 330
[[class]]
id = "legacy"
floor_only = true
[[moment]]
id = "m-event"
from_ms = 5600
to_ms = 8000
tags = ["event"]
[[rule]]
id = "static"
when = { piece_kind = ["static"] }
then = { ladder = ["still", "f0"] }
[[rule]]
id = "motion"
when = { piece_kind = ["motion_high"] }
then = { max_layer = 1 }
[[rule]]
id = "event"
when = { moment_tag = ["event"] }
then = { deadline_ms = 800 }

View file

@ -0,0 +1,535 @@
#!/usr/bin/env python3
"""A still's reader, differentially: wai-pack's PNG reader against pack_verify.py's, which
reads the zlib stream with Python's zlib module (extensions/packaging.md §5.7).
The inputs, seeded:
- streams the zlib library writes, at every level and strategy and at windows from
512 bytes to 32 KiB, and the reference packager's own stills;
- dynamic blocks built here, each code set chosen to sit on one of RFC 1951's and zlib's
rules: complete codes; no distance code at all; a lone distance code of one bit (the
one incomplete set zlib takes), used and misused; a lone distance code of 2 to 15 bits;
over-subscribed and incomplete literal/length, distance and code-length codes; a
repeat with no length before it, or past the code lengths; no code for the end of the
block; too many length or distance symbols; a distance past the bytes written; stored
blocks with a wrong complement; fixed blocks with the symbols they cannot use; and
several blocks of mixed kinds;
- and every one of those altered: bits flipped, cut short, bytes appended, the header's
bytes and the Adler-32 changed, chunks dropped, repeated, moved or added, the IHDR's
fields and a chunk's length changed.
Each one's verdict and, read, its samples' SHA-256 must be the same from both readers,
and the constructions whose verdict the rules decide must have it.
python3 png_diff.py <wai-pack binary> [seed] [count]
Exit status 0 only if every input agrees.
"""
import hashlib
import heapq
import json
import os
import random
import struct
import subprocess
import sys
import zlib
HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)
import pack_verify as PV # noqa: E402
SIG = b"\x89PNG\r\n\x1a\n"
ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]
def chunk(kind, data):
return struct.pack(">I", len(data)) + kind + data + struct.pack(">I", zlib.crc32(kind + data))
def png_of(w, h, z, extra=()):
ihdr = struct.pack(">II", w, h) + bytes([8, 2, 0, 0, 0])
return SIG + chunk(b"IHDR", ihdr) + b"".join(chunk(k, d) for k, d in extra) + chunk(b"IDAT", z) + chunk(b"IEND", b"")
def picture(rng):
"""A picture's filtered rows: random, flat or striped samples, each row with a filter."""
w, h = rng.randint(1, 40), rng.randint(1, 12)
kind = rng.randrange(3)
raw = bytearray()
for y in range(h):
raw.append(rng.randrange(5))
for x in range(3 * w):
raw.append(rng.randrange(256) if kind == 0 else (7 if kind == 1 else (x // 3 * 11 + y) % 256))
return w, h, bytes(raw)
class Bits:
def __init__(self):
self.out, self.acc, self.n = bytearray(), 0, 0
def put(self, v, n):
for i in range(n):
self.acc |= ((v >> i) & 1) << self.n
self.n += 1
if self.n == 8:
self.out.append(self.acc)
self.acc, self.n = 0, 0
def code(self, c, n):
for i in reversed(range(n)):
self.put((c >> i) & 1, 1)
def align(self):
if self.n:
self.out.append(self.acc)
self.acc, self.n = 0, 0
def canonical(lengths):
"""RFC 1951 §3.2.2's codes of `lengths` (an over-subscribed set gives codes anyway)."""
count = [0] * 16
for x in lengths:
count[x] += 1
count[0] = 0
nxt, code = [0] * 16, 0
for b in range(1, 16):
code = (code + count[b - 1]) << 1
nxt[b] = code
out = []
for x in lengths:
out.append(nxt[x] if x else 0)
if x:
nxt[x] += 1
return out
def huffman(freq, n, limit):
"""Code lengths for symbols 0..n-1 from their counts (a symbol of count 0 gets none):
Huffman's, or equal lengths where Huffman's pass `limit`. Complete for two or more
symbols; one symbol gets one bit."""
used = [s for s in range(n) if freq.get(s)]
lengths = [0] * n
if len(used) == 1:
lengths[used[0]] = 1
return lengths
heap = [(freq[s], i, [s]) for i, s in enumerate(used)]
heapq.heapify(heap)
k = len(heap)
while len(heap) > 1:
a, b = heapq.heappop(heap), heapq.heappop(heap)
for s in a[2] + b[2]:
lengths[s] += 1
heapq.heappush(heap, (a[0] + b[0], k, a[2] + b[2]))
k += 1
if max(lengths) > limit:
# Equal lengths, then the shortest codes split off until the set is complete.
bits = max(1, (len(used) - 1).bit_length())
lengths = [bits if s in used else 0 for s in range(n)]
spare = (1 << bits) - len(used)
for s in used:
if spare == 0:
break
lengths[s] -= 1
spare -= 1
return lengths
LEN_BASE, LEN_EXTRA = PV.LEN_BASE, PV.LEN_EXTRA
DIST_BASE, DIST_EXTRA = PV.DIST_BASE, PV.DIST_EXTRA
def tokens(raw, dists, rng):
"""`raw` as literals and matches, each match at a distance of a symbol in `dists`."""
out, i = [], 0
while i < len(raw):
best = None
if dists and rng.random() < 0.8:
for s in dists:
for d in {DIST_BASE[s], DIST_BASE[s] + (1 << DIST_EXTRA[s]) - 1}:
if d <= i:
m = 0
while m < 258 and i + m < len(raw) and raw[i + m - d] == raw[i + m]:
m += 1
if m >= 3 and (best is None or m > best[0]):
best = (m, d, s)
if best:
out.append(("m", best[0], best[1], best[2]))
i += best[0]
else:
out.append(("l", raw[i]))
i += 1
return out
def length_symbol(m):
li = max(k for k, x in enumerate(LEN_BASE) if x <= m)
return 257 + li, m - LEN_BASE[li], LEN_EXTRA[li]
def write_tokens(b, toks, lit, lc, dist, dc, bad_dist_bit=False):
misused = False
for t in toks:
if t[0] == "l":
b.code(lc[t[1]], lit[t[1]])
continue
_, m, d, s = t
sym, extra, nbits = length_symbol(m)
b.code(lc[sym], lit[sym])
b.put(extra, nbits)
if bad_dist_bit and not misused:
b.put(1, 1) # the unassigned half of a lone one-bit code
misused = True
continue
b.code(dc[s], dist[s])
b.put(d - DIST_BASE[s], DIST_EXTRA[s])
b.code(lc[256], lit[256])
def over(lengths):
"""A complete set made over-subscribed: a code for a symbol that had none, or, with
every symbol coded, its longest code a bit shorter."""
free = [x for x in range(len(lengths)) if not lengths[x]]
if free:
lengths[free[0]] = 1
else:
s = max(range(len(lengths)), key=lambda x: lengths[x])
lengths[s] -= 1
def dynamic_block(b, toks, last, variant, rng):
"""One dynamic block of `toks` with the code sets `variant` asks for."""
freq = {256: 1}
dfreq = {}
for t in toks:
s = t[1] if t[0] == "l" else length_symbol(t[1])[0]
freq[s] = freq.get(s, 0) + 1
if t[0] == "m":
dfreq[t[3]] = dfreq.get(t[3], 0) + 1
if len(freq) == 1:
freq[0] = 1
nlen = max(257, max(freq) + 1)
lit = huffman(freq, nlen, 15)
if variant == "dist-none":
ndist, dist = 1, [0]
elif dfreq:
ndist = max(dfreq) + 1
dist = huffman(dfreq, ndist, 15)
else:
ndist, dist = 1, [0]
used_d = [s for s in range(ndist) if dist[s]]
if variant.startswith("dist-lone-") and len(used_d) == 1:
dist[used_d[0]] = 1 if variant in ("dist-lone-1", "dist-lone-1-misused") else rng.randint(2, 15)
elif variant == "dist-over":
dist = dist + [1, 1, 1]
ndist = len(dist)
elif variant == "dist-incomplete" and used_d:
# One code a bit longer: the set falls short of complete, its longest past one bit.
s = min(used_d, key=lambda x: dist[x])
dist[s] += 1
elif variant == "lit-incomplete":
s = min((x for x in range(nlen) if lit[x]), key=lambda x: lit[x])
lit[s] += 1
elif variant == "lit-over":
# A code for a symbol that had none, on a set that was complete.
over(lit)
elif variant == "no-eob":
lit[256] = 0
ndist = min(ndist, 30)
dist = dist[:ndist]
lc, dc = canonical(lit), canonical(dist)
seq = lit + dist
# The code lengths, run-length coded at random (§3.2.7).
syms, i = [], 0
if variant == "rep16-first":
syms.append((16, 0, 2))
while i < len(seq):
x = seq[i]
run = 1
while i + run < len(seq) and seq[i + run] == x:
run += 1
if x == 0 and run >= 11 and rng.random() < 0.7:
n = min(run, 138)
syms.append((18, n - 11, 7))
i += n
elif x == 0 and run >= 3 and rng.random() < 0.7:
n = min(run, 10)
syms.append((17, n - 3, 3))
i += n
elif i > 0 and seq[i - 1] == x and run >= 3 and rng.random() < 0.7:
n = min(run, 6)
syms.append((16, n - 3, 2))
i += n
else:
syms.append((x, 0, 0))
i += 1
if variant == "rep-past":
syms.append((17, 7, 3))
cfreq = {}
for s, _, _ in syms:
cfreq[s] = cfreq.get(s, 0) + 1
if len(cfreq) == 1:
cfreq[0 if 0 not in cfreq else 1] = 1
cl = huffman(cfreq, 19, 7)
if variant == "cl-incomplete":
s = min((x for x in range(19) if 0 < cl[x] < 7), key=lambda x: cl[x])
cl[s] += 1
elif variant == "cl-over":
over(cl)
cc = canonical(cl)
ncode = max(4, max(k for k, s in enumerate(ORDER) if cl[s]) + 1)
b.put(last, 1)
b.put(2, 2)
hlit = nlen - 257 if variant != "hlit-big" else rng.choice([30, 31])
hdist = ndist - 1 if variant != "hdist-big" else rng.choice([30, 31])
b.put(hlit, 5)
b.put(hdist, 5)
b.put(ncode - 4, 4)
for s in ORDER[:ncode]:
b.put(cl[s], 3)
for s, extra, nbits in syms:
b.code(cc[s], cl[s])
b.put(extra, nbits)
write_tokens(b, toks, lit, lc, dist, dc, bad_dist_bit=variant == "dist-lone-1-misused")
def fixed_block(b, toks, last, variant):
lit = [8] * 144 + [9] * 112 + [7] * 24 + [8] * 8
lc = canonical(lit)
dist, dc = [5] * 32, canonical([5] * 32)
b.put(last, 1)
b.put(1, 2)
if variant == "fixed-lit-286":
b.code(lc[286], 8)
elif variant == "fixed-dist-30" and any(t[0] == "m" for t in toks):
k = next(i for i, t in enumerate(toks) if t[0] == "m")
toks = toks[:k] + [("m", toks[k][1], toks[k][2], 30)] + toks[k + 1:]
dist_base = DIST_BASE + [0, 0]
for t in toks:
if t[0] == "l":
b.code(lc[t[1]], 8 if t[1] < 144 else 9)
else:
sym, extra, nbits = length_symbol(t[1])
b.code(lc[sym], lit[sym])
b.put(extra, nbits)
b.code(dc[t[3]], 5)
if t[3] < 30:
b.put(t[2] - dist_base[t[3]], DIST_EXTRA[t[3]])
b.code(lc[256], 7)
return
write_tokens(b, toks, lit, lc, dist, dc)
def stored_block(b, data, last, variant):
b.put(last, 1)
b.put(0, 2)
b.align()
n = len(data)
nn = (~n) & 0xFFFF if variant != "stored-complement" else n
b.out += struct.pack("<HH", n, nn) + data
# Each construction, and the verdict RFC 1951 and zlib's inflate give it (None: the
# readers must only agree).
VARIANTS = {
"complete": "ok", "dist-none": "ok", "dist-lone-1": "ok", "dist-lone-1-misused": "refused",
"dist-lone-L": "refused", "dist-over": "refused", "dist-incomplete": "refused",
"lit-incomplete": "refused", "lit-over": "refused", "cl-incomplete": "refused", "cl-over": "refused",
"rep16-first": "refused", "rep-past": "refused", "no-eob": "refused", "hlit-big": "refused",
"hdist-big": "refused", "far": "refused", "stored": "ok", "stored-complement": "refused",
"fixed-lit-286": "refused", "fixed-dist-30": "refused", "mixed": "ok",
}
def construct(rng, variant):
w, h, raw = picture(rng)
b = Bits()
if variant in ("stored", "stored-complement"):
stored_block(b, raw, 1, variant)
elif variant in ("fixed-lit-286", "fixed-dist-30"):
toks = tokens(raw, list(range(4)), rng)
if variant == "fixed-dist-30" and not any(t[0] == "m" for t in toks):
return None
fixed_block(b, toks, 1, variant)
elif variant == "mixed":
cut = sorted(rng.sample(range(len(raw) + 1), 2)) if len(raw) >= 2 else [0, len(raw)]
parts = [raw[:cut[0]], raw[cut[0]:cut[1]], raw[cut[1]:]]
for k, part in enumerate(parts):
last = int(k == 2)
kind = rng.randrange(3)
if kind == 0:
stored_block(b, part, last, "stored")
else:
# Matches only within this part, so a distance never reaches into another.
toks = tokens(part, list(range(4)), rng)
if kind == 1:
fixed_block(b, toks, last, "")
else:
dynamic_block(b, toks, last, "complete", rng)
else:
dists = []
if variant not in ("dist-none",):
dists = [rng.randrange(4)] if variant.startswith("dist-lone-") else rng.sample(range(8), rng.randint(1, 4))
toks = tokens(raw, dists, rng)
if variant.startswith("dist-lone-") or variant in ("dist-over", "dist-incomplete"):
if not any(t[0] == "m" for t in toks):
return None
if variant == "far":
toks = [("m", 3, 1, 0)] + toks
dynamic_block(b, toks, 1, "dist-lone-L" if variant == "dist-lone-L" else variant, rng)
b.align()
z = b"\x78\x01" + bytes(b.out) + struct.pack(">I", zlib.adler32(raw))
return png_of(w, h, z)
def zlib_streams(rng):
out = []
for _ in range(40):
w, h, raw = picture(rng)
co = zlib.compressobj(rng.choice([0, 1, 6, 9]), zlib.DEFLATED, rng.choice([9, 10, 12, 15]), 9,
rng.choice([zlib.Z_DEFAULT_STRATEGY, zlib.Z_FIXED, zlib.Z_HUFFMAN_ONLY, zlib.Z_RLE]))
out.append(png_of(w, h, co.compress(raw) + co.flush()))
rgb = bytes(rng.randrange(256) if rng.random() < 0.5 else 9 for _ in range(3 * w * h))
out.append(PV.png_still(rgb, w, h))
return out
def chunks_of(b):
at, out = 8, []
while at + 12 <= len(b):
n = struct.unpack_from(">I", b, at)[0]
if at + 12 + n > len(b):
break
out.append((b[at + 4:at + 8], b[at + 8:at + 8 + n]))
at += 12 + n
return out
def build(chs):
return SIG + b"".join(chunk(k, d) for k, d in chs)
def mutate(b, rng):
if len(b) < 2:
return b + bytes([rng.randrange(256)])
chs = chunks_of(b)
op = rng.randrange(12)
if op == 0 or not chs:
b = bytearray(b)
for _ in range(rng.randint(1, 3)):
i = rng.randrange(len(b))
b[i] ^= 1 << rng.randrange(8)
return bytes(b)
if op == 1:
return b[:rng.randrange(len(b))]
if op == 2:
i, j = rng.randrange(len(chs)), rng.randrange(len(chs))
chs[i], chs[j] = chs[j], chs[i]
return build(chs)
if op == 3:
chs.insert(rng.randrange(len(chs) + 1), chs[rng.randrange(len(chs))])
return build(chs)
if op == 4:
del chs[rng.randrange(len(chs))]
return build(chs)
if op == 5:
kind = rng.choice([b"tEXt", b"PLTE", b"IDAT", b"IEND", b"IHDR", b"abCD", b"ABCD", b"gAMA"])
data = bytes(rng.randrange(256) for _ in range(rng.choice([0, 1, 3, 6, 13, 768, 771])))
chs.insert(rng.randrange(len(chs) + 1), (kind, data))
return build(chs)
idats = [i for i, (k, _) in enumerate(chs) if k == b"IDAT"]
if op in (6, 7, 8, 9) and idats:
z = bytearray(b"".join(chs[i][1] for i in idats))
if op == 6 and z:
for _ in range(rng.randint(1, 4)):
i = rng.randrange(len(z))
z[i] ^= 1 << rng.randrange(8)
elif op == 7:
z = z[:rng.randrange(len(z) + 1)]
elif op == 8:
z += bytes(rng.randrange(256) for _ in range(rng.randint(1, 6)))
elif op == 9 and len(z) >= 2:
z[rng.randrange(2)] = rng.randrange(256)
if rng.random() < 0.7:
flg = z[1] & 0xE0
z[1] = flg | (31 - (z[0] * 256 + flg) % 31) % 31
z = bytes(z)
cut = rng.randrange(len(z) + 1)
rest = [c for i, c in enumerate(chs) if i not in idats]
pos = idats[0]
return build(rest[:pos] + [(b"IDAT", z[:cut]), (b"IDAT", z[cut:])] + rest[pos:])
if op == 10:
for i, (k, d) in enumerate(chs):
if k == b"IHDR" and len(d) == 13:
d = bytearray(d)
d[rng.randrange(13)] = rng.choice([0, 1, 2, 3, 6, 8, 16, 255])
chs[i] = (k, bytes(d))
return build(chs)
return b + bytes(rng.randrange(256) for _ in range(rng.randint(1, 12)))
def py_verdict(b):
try:
w, h, px = PV.png_frame(b)
return {"verdict": "ok", "w": w, "h": h, "rgb_sha256": hashlib.sha256(px).hexdigest()}
except ValueError:
return {"verdict": "refused"}
def main(argv):
if len(argv) < 2:
print(__doc__)
return 2
binary = argv[1]
seed = int(argv[2]) if len(argv) > 2 else 1
count = int(argv[3]) if len(argv) > 3 else 2000
rng = random.Random(seed)
cases = [] # (bytes, variant or None)
for f in sorted(os.listdir(os.path.join(HERE, "stills"))):
if f.endswith(".png"):
cases.append((open(os.path.join(HERE, "stills", f), "rb").read(), None))
cases += [(b, None) for b in zlib_streams(rng)]
names = sorted(VARIANTS)
while len(cases) < count // 2:
v = names[len(cases) % len(names)]
b = construct(rng, v)
if b is not None:
cases.append((b, v))
base = [b for b, _ in cases]
while len(cases) < count:
b = rng.choice(base)
for _ in range(rng.choice([1, 1, 2, 3])):
b = mutate(b, rng)
cases.append((b, None))
lines = "".join(json.dumps({"op": "read-png", "hex": b.hex()}) + "\n" for b, _ in cases)
out = subprocess.run([binary, "stage-json"], input=lines.encode(), capture_output=True, check=True).stdout.decode().splitlines()
if len(out) != len(cases):
print(f"FAIL wai-pack answered {len(out)} of {len(cases)} lines")
return 1
fails, seen = 0, {"ok": 0, "refused": 0}
by_variant = {}
for (b, v), got in zip(cases, out):
rust, mine = json.loads(got), py_verdict(b)
seen[mine["verdict"]] += 1
if v is not None:
by_variant[v] = by_variant.get(v, 0) + 1
why = None
if rust != mine:
why = f"wai-pack {json.dumps(rust)}, pack_verify.py {json.dumps(mine)}"
elif v is not None and VARIANTS[v] != mine["verdict"]:
why = f"the construction {v} should be {VARIANTS[v]}, both readers say {mine['verdict']}"
if why:
fails += 1
if fails <= 5:
print(f"FAIL {v or 'input'} {b[:64].hex()}…: {why}")
missing = [v for v in names if v not in by_variant]
if missing:
fails += 1
print(f"FAIL constructions never built: {missing}")
print(f"png_diff seed {seed}: {len(cases) - fails}/{len(cases)} agree ({seen['ok']} read, {seen['refused']} refused; "
f"{sum(by_variant.values())} constructions of {len(by_variant)} kinds)")
return 0 if fails == 0 else 1
if __name__ == "__main__":
sys.exit(main(sys.argv))

View file

@ -25,6 +25,11 @@
"canonical": "{\"asset_id\":\"pack-fixture-01\",\"class\":[{\"floor_only\":false,\"id\":\"mobile\",\"max_kbps\":900,\"max_layer\":1},{\"floor_only\":false,\"id\":\"tv\",\"max_layer\":2},{\"floor_only\":true,\"id\":\"legacy\",\"max_layer\":0}],\"classify\":{\"motion_high_milli\":9000,\"static_mad_milli\":300,\"static_permille\":5,\"synthetic_bins\":12},\"component\":[{\"id\":\"v\",\"media\":\"video\",\"source\":\"src/video.y4m\",\"timebase\":{\"den\":1,\"num\":25}},{\"id\":\"a\",\"media\":\"audio\",\"source\":\"src/audio.wav\",\"timebase\":{\"den\":1,\"num\":48000}}],\"defaults\":{\"deadline_ms\":1500},\"floor\":{\"extra_keyframes\":false,\"supplied_listing\":\"0000000000000000000000000000000000000000000000000000000000000000\"},\"ladder\":[{\"capability\":\"wai.video.int_motion\",\"component\":\"v\",\"id\":\"b0\",\"params\":{\"block\":16,\"max_sse_px_milli\":40000,\"mv_precision\":2,\"q_candidates\":[16,12,8],\"search\":7},\"role\":\"base\"},{\"capability\":\"wai.video.int_refine\",\"component\":\"v\",\"id\":\"r1\",\"params\":{\"q\":6},\"refines\":\"b0\",\"role\":\"refinement\"},{\"capability\":\"wai.video.int_refine\",\"component\":\"v\",\"id\":\"r2\",\"params\":{\"q\":3},\"refines\":\"r1\",\"role\":\"refinement\"},{\"capability\":\"wai.image.png\",\"component\":\"v\",\"id\":\"still\",\"params\":{},\"role\":\"base\"},{\"capability\":\"wai.video.av1\",\"component\":\"v\",\"id\":\"f0\",\"params\":{\"source\":\"supplied\"},\"role\":\"floor\"},{\"capability\":\"wai.audio.flac\",\"component\":\"a\",\"id\":\"ab\",\"params\":{\"source\":\"encode\"},\"role\":\"base\"}],\"lead\":\"v\",\"live\":{\"layer_lag_ms\":[0,200,400]},\"moment\":[{\"from_ms\":30000,\"id\":\"m-goal\",\"tags\":[\"event\"],\"to_ms\":34000}],\"royalty_free_only\":true,\"rule\":[{\"id\":\"static\",\"then\":{\"ladder\":[\"still\",\"f0\"]},\"when\":{\"piece_kind\":[\"static\"]}},{\"id\":\"motion\",\"then\":{\"max_layer\":1},\"when\":{\"piece_kind\":[\"motion_high\"]}},{\"id\":\"event\",\"then\":{\"deadline_ms\":800,\"max_layer\":2},\"when\":{\"moment_tag\":[\"event\"]}}],\"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}}",
"digest": "1997e19e06f6bf191d5de605ba1a4719a3372d5e7a168b5364cc82638d9dd0e9"
},
{
"file": "max-piece.toml",
"canonical": "{\"asset_id\":\"max-piece\",\"class\":[],\"classify\":{\"motion_high_milli\":9000,\"static_mad_milli\":300,\"static_permille\":5,\"synthetic_bins\":12},\"component\":[{\"id\":\"v\",\"media\":\"video\",\"timebase\":{\"den\":600,\"num\":16777216}}],\"defaults\":{\"deadline_ms\":1500},\"floor\":{\"extra_keyframes\":false},\"ladder\":[{\"capability\":\"wai.video.int_motion\",\"component\":\"v\",\"id\":\"b0\",\"params\":{\"block\":16,\"max_sse_px_milli\":0,\"mv_precision\":2,\"q_candidates\":[8],\"search\":7},\"role\":\"base\"}],\"lead\":\"v\",\"live\":{\"layer_lag_ms\":[0]},\"moment\":[],\"royalty_free_only\":false,\"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\":600000,\"min_ms\":1000,\"scene_cut\":\"wai.pack.scenecut/1\",\"target_ms\":2000}}",
"digest": "9167074601943ba9c5042ae719712c8119a728e2710a355371b2602c2c112e67"
},
{
"file": "eq-defaults-a.toml",
"canonical": "{\"asset_id\":\"r\",\"class\":[],\"classify\":{\"motion_high_milli\":9000,\"static_mad_milli\":300,\"static_permille\":5,\"synthetic_bins\":12},\"component\":[{\"id\":\"v\",\"media\":\"video\",\"timebase\":{\"den\":1,\"num\":25}}],\"defaults\":{\"deadline_ms\":1500},\"floor\":{\"extra_keyframes\":false},\"ladder\":[{\"capability\":\"wai.video.int_motion\",\"component\":\"v\",\"id\":\"b0\",\"params\":{\"block\":16,\"max_sse_px_milli\":0,\"mv_precision\":2,\"q_candidates\":[8],\"search\":7},\"role\":\"base\"}],\"lead\":\"v\",\"live\":{\"layer_lag_ms\":[0]},\"moment\":[],\"royalty_free_only\":true,\"rule\":[],\"schema\":\"wai.pack.policy/1\",\"segmentation\":{\"closed\":true,\"cut_abs_permille\":300,\"cut_rel_permille\":3000,\"cut_window\":8,\"lookahead_frames\":6,\"max_ms\":4000,\"min_ms\":1000,\"scene_cut\":\"wai.pack.scenecut/1\",\"target_ms\":2000}}",

View file

@ -0,0 +1,19 @@
# Accepted: the longest piece a policy may allow (§4.4): max_ms of ten minutes, which is
# exactly 2^24 units on a timebase of 16777216 units in 600 seconds.
schema = "wai.pack.policy/1"
asset_id = "max-piece"
lead = "v"
[[component]]
id = "v"
media = "video"
timebase = { num = 16777216, den = 600 }
[[ladder]]
id = "b0"
component = "v"
capability = "wai.video.int_motion"
role = "base"
[segmentation]
max_ms = 600000

View file

@ -126,11 +126,11 @@ def random_policy(rng):
for c in comps:
body += ["[[component]]", f'id = "{c}"', "media = " + val(q + biased(["video", "audio", "bogus"]) + q)]
if rng.random() > 0.05:
num, den = val(str(biased([25, 0, 48000]))), val(str(biased([1, 1001, 0])))
num, den = val(str(biased([25, 0, 48000, 4294967295, 16777216]))), val(str(biased([1, 1001, 0, 600])))
body.append("timebase = { num = " + num + ", den = " + den + " }")
if rng.random() < 0.6:
body.append("[segmentation]")
for k, choices in [("target_ms", [2000, 500, 0]), ("min_ms", [1000, 3000, 0]), ("max_ms", [4000, 100]),
for k, choices in [("target_ms", [2000, 500, 0]), ("min_ms", [1000, 3000, 0]), ("max_ms", [4000, 100, 600000, 600001, 349525]),
("cut_abs_permille", [300, 0, 1001]), ("cut_window", [8, 0, 2, 3, 65]),
("lookahead_frames", [6, 65]), ("closed", ["true", "false"])]:
if rng.random() < 0.4:

View file

@ -80,6 +80,14 @@
"file": "policy/open-gop.toml",
"reason": "policy-open-gop"
},
{
"file": "policy/piece-bounds-max-ms.toml",
"reason": "policy-piece-bounds"
},
{
"file": "policy/piece-bounds-units.toml",
"reason": "policy-piece-bounds"
},
{
"file": "policy/piece-bounds.toml",
"reason": "policy-piece-bounds"

View file

@ -0,0 +1,18 @@
# Refused: max_ms past ten minutes (§4.4), the largest allowed plus one.
schema = "wai.pack.policy/1"
asset_id = "r"
lead = "v"
[[component]]
id = "v"
media = "video"
timebase = { num = 25, den = 1 }
[[ladder]]
id = "b0"
component = "v"
capability = "wai.video.int_motion"
role = "base"
[segmentation]
max_ms = 600001

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