wai-pack: staged packages — refinement layers, stills, a piece's ladder, live windows and simulated delivery (W4-4) #199
279 changed files with 10588 additions and 668 deletions
14
.github/workflows/wai-conformance.yml
vendored
14
.github/workflows/wai-conformance.yml
vendored
|
|
@ -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,
|
||||
|
|
|
|||
71
.github/workflows/wai-pack.yml
vendored
71
.github/workflows/wai-pack.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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`).
|
||||
|
|
|
|||
|
|
@ -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"}},
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
321
wai/pack-conformance/delivery/expected.json
Normal file
321
wai/pack-conformance/delivery/expected.json
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
31
wai/pack-conformance/live/expected.json
Normal file
31
wai/pack-conformance/live/expected.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
wai/pack-conformance/live/windows/0/index-v.wsix
Normal file
BIN
wai/pack-conformance/live/windows/0/index-v.wsix
Normal file
Binary file not shown.
1
wai/pack-conformance/live/windows/0/package.receipt.json
Normal file
1
wai/pack-conformance/live/windows/0/package.receipt.json
Normal 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}
|
||||
BIN
wai/pack-conformance/live/windows/1/index-v.wsix
Normal file
BIN
wai/pack-conformance/live/windows/1/index-v.wsix
Normal file
Binary file not shown.
1
wai/pack-conformance/live/windows/1/package.receipt.json
Normal file
1
wai/pack-conformance/live/windows/1/package.receipt.json
Normal 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}
|
||||
BIN
wai/pack-conformance/live/windows/2/index-v.wsix
Normal file
BIN
wai/pack-conformance/live/windows/2/index-v.wsix
Normal file
Binary file not shown.
1
wai/pack-conformance/live/windows/2/package.receipt.json
Normal file
1
wai/pack-conformance/live/windows/2/package.receipt.json
Normal 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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
BIN
wai/pack-conformance/packs/video-staged-01/floor/v.obu
Normal file
BIN
wai/pack-conformance/packs/video-staged-01/floor/v.obu
Normal file
Binary file not shown.
1
wai/pack-conformance/packs/video-staged-01/key.hex
Normal file
1
wai/pack-conformance/packs/video-staged-01/key.hex
Normal file
|
|
@ -0,0 +1 @@
|
|||
a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5
|
||||
41
wai/pack-conformance/packs/video-staged-01/package/LISTING
Normal file
41
wai/pack-conformance/packs/video-staged-01/package/LISTING
Normal 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
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
BIN
wai/pack-conformance/packs/video-staged-01/package/index-v.wsix
Normal file
BIN
wai/pack-conformance/packs/video-staged-01/package/index-v.wsix
Normal file
Binary file not shown.
|
|
@ -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}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
0
|
||||
50
|
||||
75
|
||||
115
|
||||
140
|
||||
|
|
@ -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}}
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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"}
|
||||
|
|
@ -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"}
|
||||
|
|
@ -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"}
|
||||
94
wai/pack-conformance/packs/video-staged-01/policy.toml
Normal file
94
wai/pack-conformance/packs/video-staged-01/policy.toml
Normal 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 }
|
||||
535
wai/pack-conformance/png_diff.py
Normal file
535
wai/pack-conformance/png_diff.py
Normal 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))
|
||||
|
|
@ -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}}",
|
||||
|
|
|
|||
19
wai/pack-conformance/policy/max-piece.toml
Normal file
19
wai/pack-conformance/policy/max-piece.toml
Normal 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
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue