One row per file: what the case calls itself, the verdict a decoder must reach,
and a link to both the bytes in files/ and the text they were assembled from
in cases/. The case says the rest – which construct it reaches and why that
is worth a file. REACHES.md indexes the same set the other way
round, and the notes say what all of it is.
The groups are folded shut. Click one to open it. All 263 at once are
webp-corners.tgz.
One image with nothing optional in it, and one with all four transforms, a colour cache, an entropy image and every kind of pixel item. Every other lossless file here sets one field of those two to something an encoder would not.
| file | what it is | |
|---|---|---|
lossless-all-features txt |
ok | Every optional part of the lossless format in one image |
lossless-plain txt |
ok | An ordinary lossless image, with none of the corners |
The 1-or-2-symbol shorthand a Huffman code can take. Its symbols are read as raw 8-bit values and are never checked against the alphabet size, so this is where a stream can say things an encoder cannot.
| file | what it is | |
|---|---|---|
simple-dist-1sym-oob txt |
reject | Distance code: simple form, single symbol 255, alphabet_size is 40 |
simple-dist-2sym-both-oob txt |
reject | Distance code: both simple-form symbols out of range (200, 201) |
simple-dist-2sym-duplicate txt |
ok | Distance code: simple form declaring 2 symbols that are the same (5, 5) |
simple-dist-2sym-first-oob txt |
ok | Distance code: simple form, 2 symbols, the first one 200 >= alphabet_size 40 |
simple-dist-2sym-second-oob txt |
ok | Distance code: simple form, 2 symbols, the second one 200 >= 40 |
simple-dist-sym-39-last-valid txt |
ok | Distance code: single symbol 39, the last in-range value |
simple-dist-sym-40-first-oob txt |
reject | Distance code: single symbol 40, the first out-of-range value |
simple-green-1bit-symbol txt |
ok | Green code: simple form with first_symbol_len_code = 0, so the symbol is 1 bit wide |
simple-green-2sym-1bit-each txt |
ok | Green code with two real symbols, so every pixel costs exactly 1 bit |
The Huffman code that describes the lengths of another Huffman code, plus its repeat escapes (16, 17, 18) and the optional max_symbol field. cwebp only ever emits a narrow slice of this.
| file | what it is | |
|---|---|---|
codelen-all-zero-lengths txt |
reject | A code-length stream that assigns length 0 to every symbol |
codelen-depth-15 txt |
ok | A green code containing a symbol of depth 15, MAX_ALLOWED_CODE_LENGTH |
codelen-incomplete txt |
reject | A code whose lengths leave the tree incomplete (two symbols of depth 2) |
codelen-max-symbol-early-stop txt |
ok | Code-length stream with an explicit max_symbol far below the alphabet size |
codelen-max-symbol-too-big txt |
reject | Explicit max_symbol greater than the alphabet size |
codelen-num-codes-19 txt |
ok | All 19 code-length codes declared |
codelen-num-codes-4 txt |
ok | Only 4 code-length codes declared, the minimum the 4-bit field allows |
codelen-over-capacity txt |
reject | Three symbols of depth 1, more than the two codes of that length that exist |
codelen-oversubscribed txt |
reject | Lengths 1, 2, 2, 2: each length is individually possible, but together they over-subscribe the tree |
codelen-repeat-past-end txt |
reject | A repeat run that would write past the end of the alphabet |
codelen-repeat16-no-previous txt |
ok | Code-length stream starting with code 16 (repeat previous), before any non-zero length was seen |
codelen-repeat17-short-zeros txt |
ok | Code-length stream using code 17 (3..10 zeros) rather than 18 |
codelen-repeat18-138-zeros txt |
ok | Code-length stream using code 18 with its maximum run of 138 zeros |
codelen-single-symbol-complex-form txt |
ok | The complex form used to describe a code with exactly one symbol |
codelen-two-level-table txt |
ok | A green code with depths up to 10, past the 8-bit root table |
The sub-image that picks one of several code groups per tile, and the remapping the decoder does when the group count looks implausible.
| file | what it is | |
|---|---|---|
meta-huffman-1001-groups txt |
ok | Entropy image whose highest group index is 1000, one past the decoder’s arbitrary limit |
meta-huffman-groups-truncated txt |
reject | An entropy image naming group 1 when only one group of codes follows |
meta-huffman-per-tile-data txt |
ok | Two Huffman groups that both carry real data, so the code in use changes four pixels into every row |
meta-huffman-precision-max txt |
ok | Meta Huffman with the largest tile size (precision 9, 512x512 pixels) |
meta-huffman-precision-min txt |
ok | Meta Huffman with the smallest tile size (precision 2, 4x4 pixels) |
meta-huffman-sparse-groups txt |
ok | Entropy image referencing groups 0 and 900 only, leaving a 900-entry hole |
meta-huffman-two-groups txt |
ok | Two Huffman groups selected per tile by the entropy image |
Size bounds, and cache-index literals.
| file | what it is | |
|---|---|---|
cache-bits-0-invalid txt |
reject | Color cache flagged as present but with 0 bits |
cache-bits-1 txt |
ok | Color cache with the minimum size, 1 bit (2 entries) |
cache-bits-11 txt |
ok | Color cache with the maximum size, 11 bits (2048 entries) |
cache-bits-12-invalid txt |
reject | Color cache with 12 bits, one past MAX_CACHE_BITS |
cache-index-literal txt |
ok | A pixel coded as a color-cache index rather than as a literal |
A lossless file carries whole image streams inside itself: one for each transform that needs a per-tile parameter, and one for the entropy image. A sub-image is read as an image stream like any other, minus the transforms and the entropy image it may not have of its own. So each carries a colour cache and five Huffman codes a file can say something about. An encoder writes them all the same dull way.
| file | what it is | |
|---|---|---|
subimage-cache-12-invalid txt |
reject | A sub-image color cache of 12 bits, one past MAX_CACHE_BITS |
subimage-cache-entropy-image txt |
ok | A color cache inside the entropy image itself |
subimage-cache-palette-max txt |
ok | A color cache of 11 bits inside the palette sub-image of the color-indexing transform |
subimage-cache-predictor-min txt |
ok | A color cache declared inside the predictor transform’s sub-image, 1 bit |
subimage-cache-zero-invalid txt |
reject | A sub-image color cache flagged present but with 0 bits |
subimage-code-complex-form txt |
ok | The predictor sub-image’s green code written with the code-length repeat escapes |
subimage-code-empty txt |
reject | A sub-image code-length stream that really does assign length 0 to all 280 symbols |
subimage-code-max-symbol txt |
ok | A sub-image code using the explicit max_symbol early stop |
subimage-code-oversubscribed txt |
reject | A sub-image Huffman code with lengths 1, 2, 2, 2, which over-subscribes the tree |
Index width follows the palette size, and the map is padded out to the packing capacity with black.
| file | what it is | |
|---|---|---|
transform-palette-1-color txt |
ok | Palette with a single color, the smallest the 8-bit field can express |
transform-palette-16-colors txt |
ok | Palette of 16 colors, so indices are 4 bits and 2 pixels share a byte |
transform-palette-2-colors txt |
ok | Color-indexing transform with 2 colors, so 8 pixels are packed per byte |
transform-palette-256-colors txt |
ok | Color-indexing transform with the full 256-entry palette |
transform-palette-3-colors txt |
ok | Palette of 3 colors, so indices are 2 bits and 4 pixels share a byte |
transform-palette-index-past-end txt |
ok | Palette of 3 colors addressed with index 3, which does not exist |
Presence, repetition and tile sizes.
| file | what it is | |
|---|---|---|
transform-all-four txt |
ok | All four transforms present in one stream |
transform-cross-color-bits-max txt |
ok | Cross-color transform with bits = 9, the largest tile size |
transform-cross-color-multipliers txt |
ok | A cross-color transform with real multipliers rather than the identity |
transform-predictor-bits-max txt |
ok | Predictor transform with bits = 9, the maximum tile size |
transform-repeated txt |
reject | The subtract-green transform declared twice |
Copy lengths and distances.
| file | what it is | |
|---|---|---|
lz77-distance-1-run txt |
ok | A single literal followed by a length-8 copy at distance 1 |
lz77-distance-2-pattern txt |
ok | A back-reference at distance 2, five pixels long |
lz77-distance-3-overlap txt |
ok | A ten-pixel back-reference at distance 3 |
lz77-distance-direct-121 txt |
ok | Plane code 121, the first value past the table |
lz77-distance-past-start txt |
reject | A back-reference pointing further back than the pixels decoded so far |
lz77-length-past-end txt |
reject | A copy whose length runs past the last pixel of the image |
lz77-max-length-symbol txt |
ok | A back-reference using length symbol 23, the largest the format defines |
lz77-plane-code-1 txt |
ok | Back-reference with plane code 1, which means “the pixel directly above” |
lz77-plane-code-120 txt |
ok | Plane code 120, the last entry of the 2-D offset table |
lz77-plane-code-clamped-to-1 txt |
ok | Plane code 4 on a 1-pixel-wide image, where the 2-D offset computes to 0 |
The per-tile predictor index. It is read as a 4-bit field, so all 16 values are reachable, but the format only defines 14 of them.
| file | what it is | |
|---|---|---|
predictor-all-16-modes txt |
ok | One tile per predictor index, 0 to 15, across a 64x4 image |
predictor-mode-11-select txt |
ok | Predictor 11 (Select) over the whole image |
predictor-mode-13-clamp-half txt |
ok | Predictor 13 (ClampAddSubtractHalf) over the whole image |
predictor-mode-14-undefined txt |
ok | Every tile selects predictor 14, which the format does not define |
predictor-mode-15-undefined txt |
ok | Every tile selects predictor 15, the other undefined index |
predictor-single-row txt |
ok | A predictor transform on a one-row image |
predictor-tile-bits-min txt |
ok | Predictor tiles of 4x4 pixels, the smallest the format allows |
The 14-bit dimension fields and the version escape.
| file | what it is | |
|---|---|---|
header-alpha-is-used txt |
ok | The alpha_is_used hint set on an image whose every pixel is opaque |
header-magic-wrong txt |
reject | Signature byte 0x2e instead of the 0x2f the format defines |
header-max-area-bomb txt |
ok | 34 bytes declaring 16384x16384, every pixel one color |
header-max-area-truncated txt |
reject | The same 16384x16384 header, cut off before the Huffman codes |
header-version-max txt |
reject | Header with the 3-bit version field at 7, the largest it holds |
header-version-nonzero txt |
reject | Header with the 3-bit version field set to 1 |
header-width-16384 txt |
ok | Width 16384, one past WEBP_MAX_DIMENSION |
The layer above the image: the RIFF header, the extended-format VP8X chunk and its canvas size, the optional chunks a decoder must step over by their declared length alone, and the padding rule that makes an odd-sized one even on disk. All of it is read before the frame is.
| file | what it is | |
|---|---|---|
container-chunk-header-truncated txt |
reject | The file cut four bytes into the last chunk header |
container-duplicate-image-chunk txt |
ok | Two VP8 chunks, one after the other |
container-metadata-chunks txt |
ok | ICCP, EXIF and XMP chunks around the frame |
container-no-image-chunk txt |
reject | A VP8X chunk and some metadata, and no image chunk at all |
container-odd-chunk-no-pad txt |
reject | An odd-sized chunk whose header rounds its length up, taking the pad byte away |
container-odd-chunk-payload txt |
ok | An optional chunk with an odd-sized payload, and the pad byte that must follow it |
container-riff-size-past-end txt |
reject, incremental ok | A RIFF header claiming far more bytes than the file holds |
container-riff-size-short txt |
reject | A RIFF header claiming 11 bytes, one less than the smallest legal value |
container-riff-size-truncates-chunks txt |
reject | A RIFF size that stops in the middle of the chunks behind it |
container-trailing-bytes txt |
ok | Bytes after the last chunk that the RIFF size does not account for |
container-unknown-chunk txt |
ok | A chunk with a fourcc the format does not define, ahead of the frame |
container-vp8x-animation txt |
reject | The VP8X animation flag set on a file with no animation chunks |
container-vp8x-area-overflow txt |
reject | A VP8X canvas of 16777216 by 16777216, the largest the two 24-bit fields can describe |
container-vp8x-canvas-mismatch txt |
reject | A VP8X canvas of 64x64 in front of a 32x32 frame |
container-vp8x-reserved-bits txt |
ok | The reserved bits of the VP8X flags field all set |
container-vp8x-still-flags txt |
ok | The four still-image VP8X flags set, with none of the chunks they promise |
container-vp8x-wrong-size txt |
reject | A VP8X chunk whose header claims 9 bytes rather than 10 |
container-vp8x txt |
ok | The extended format: a VP8X chunk ahead of the frame |
container-zero-size-chunk txt |
ok | An optional chunk declaring a zero-length payload |
An ANIM chunk carrying the loop count, then an ANMF per frame with its own position, duration, disposal and blending, and its own image chunks. Reading one takes a container walk, a frame composed over the canvas, and one image decode per frame.
| file | what it is | |
|---|---|---|
anim-alph-after-image txt |
reject, anim_dump reject | A frame whose alpha chunk comes after its image |
anim-alpha-flag-missing txt |
reject, anim_dump ok, webpinfo reject | Frames with transparency in a file whose VP8X does not admit it |
anim-alpha-lossless-frame txt |
reject, anim_dump ok | An animation frame whose alpha plane is a compressed image stream |
anim-alpha-raw-frame txt |
reject, anim_dump ok | An animation frame carrying an uncompressed ALPH chunk beside its lossy image |
anim-anim-chunk-padded txt |
reject, anim_dump ok, webpinfo reject | An ANIM chunk with four bytes of padding after its two fields |
anim-anim-chunk-short txt |
reject, anim_dump reject | An ANIM chunk of two bytes |
anim-anmf-header-truncated txt |
reject, anim_dump reject | An ANMF chunk declaring fewer bytes than its own header needs |
anim-anmf-odd-size txt |
reject, anim_dump reject | An ANMF chunk whose declared length is odd |
anim-anmf-size-past-end txt |
reject, anim_dump reject | An ANMF chunk claiming to be far longer than the file |
anim-anmf-size-short txt |
reject, anim_dump reject | An ANMF chunk declaring less than the image inside it takes up |
anim-background-color txt |
reject, anim_dump ok | A background colour that is neither white nor transparent |
anim-blend-none txt |
reject, anim_dump ok | A half-transparent frame that says not to blend it |
anim-blend-over txt |
reject, anim_dump ok | The same half-transparent frame, blended |
anim-blend-ranges txt |
reject, anim_dump ok | Three frames arranged so the blended region is split in two |
anim-canvas-larger-than-frames txt |
reject, anim_dump ok | A canvas bigger than any frame in it |
anim-dispose-background txt |
reject, anim_dump ok | A partial frame that asks to be cleared away after it is shown |
anim-dispose-blend-matrix txt |
reject, anim_dump ok | The four combinations of the disposal and blending bits, in one sequence |
anim-duplicate-anim txt |
reject, anim_dump ok | A second ANIM chunk between the frames |
anim-duration-extremes txt |
reject, anim_dump ok | One frame of zero milliseconds and one of the longest the field can say |
anim-eight-frames txt |
reject, anim_dump ok | Eight frames, each a different flat colour |
anim-empty-frame-alone txt |
reject, anim_dump reject | An animation whose only frame carries no image |
anim-empty-frame txt |
reject, anim_dump ok, webpinfo reject | An ANMF chunk holding its header and nothing else, followed by a real frame |
anim-frame-1x1 txt |
reject, anim_dump ok | A single-pixel frame in the middle of a canvas |
anim-frame-alpha-only txt |
reject, anim_dump reject | A frame carrying an alpha chunk and no image |
anim-frame-area-overflow txt |
reject, anim_dump reject | An ANMF header claiming a frame of sixteen million by sixteen million, inside a canvas of sixteen by sixteen |
anim-frame-image-past-canvas txt |
reject, anim_dump reject | A frame whose header fits the canvas but whose image does not |
anim-frame-offsets txt |
reject, anim_dump ok | A second frame smaller than the canvas, placed at an offset |
anim-frame-past-canvas txt |
reject, anim_dump reject | A frame whose rectangle runs off the edge of the canvas |
anim-frame-reserved-bits txt |
reject, anim_dump ok | The six reserved bits of the ANMF flag byte all set |
anim-frame-size-mismatch txt |
reject, anim_dump ok, webpinfo reject | An ANMF header claiming a size its own image disagrees with |
anim-frames-without-flag txt |
reject, anim_dump reject | A full animation whose VP8X does not claim to be one |
anim-image-chunk-beside-frames txt |
reject, anim_dump reject | A top-level image chunk in a file that also has frames |
anim-loop-count-max txt |
reject, anim_dump ok | Loop count 65535, the largest the field holds |
anim-lossy-frames txt |
reject, anim_dump ok | Two lossy frames rather than lossless ones |
anim-metadata-chunks txt |
reject, anim_dump ok | An animation carrying an ICC profile and both metadata chunks |
anim-metadata-without-flags txt |
reject, anim_dump ok, webpinfo reject | ICCP and EXIF chunks in an animation that declares neither |
anim-mixed-formats txt |
reject, anim_dump ok | A lossy frame and a lossless one in the same animation |
anim-nested-anmf txt |
reject, anim_dump reject | An ANMF chunk inside another ANMF chunk |
anim-no-anim-chunk txt |
reject, anim_dump reject | Frames with no ANIM chunk in front of them |
anim-no-vp8x txt |
reject, anim_dump reject | ANIM and ANMF chunks with no VP8X in front of them |
anim-riff-size-past-end txt |
reject, anim_dump reject | A RIFF size claiming more bytes than the file has |
anim-riff-size-truncates-frames txt |
reject, anim_dump reject | A RIFF size that stops in the middle of the last frame |
anim-second-vp8x txt |
reject, anim_dump reject | A second VP8X chunk after the frames have started |
anim-single-frame txt |
reject, anim_dump ok | An animation of one frame |
anim-two-frames txt |
reject, anim_dump ok | Two full-canvas lossless frames, the plain animation everything else here is a variation on |
anim-two-images-in-frame txt |
reject, anim_dump reject | One ANMF carrying two image chunks |
anim-unknown-chunk-between-frames txt |
reject, anim_dump ok | An unrecognised chunk sitting between two frames |
anim-vp8l-with-alph txt |
reject, anim_dump reject | A frame carrying both an alpha chunk and a lossless image |
ALPH carries the alpha plane beside a lossy frame: a header byte of four two-bit fields, then the plane itself, either stored as it is or compressed with the lossless coder in its 8-bit mode. Only an alpha chunk reaches that mode, beside a still frame or inside an animation frame alike. Each of the four filters turns the same stored bytes into a different plane, so the pixel hash is what tells them apart. A compressed plane is a lossless stream with its header left off. The alph-plane files write one from text, and break each of the four conditions the 8-bit mode asks for in turn.
| file | what it is | |
|---|---|---|
alph-after-image txt |
ok | An ALPH chunk placed after the image chunk instead of before it |
alph-compression-invalid txt |
reject | A compression method of 2, past the lossless one |
alph-empty-payload txt |
reject | An ALPH chunk holding its header byte and nothing else |
alph-lossless-byte-flipped txt |
reject | The same plane with its last byte replaced |
alph-lossless-palette txt |
ok | A losslessly compressed alpha plane carrying a palette transform, from a cwebp encode of a two-valued plane |
alph-lossless-predictor txt |
ok | A losslessly compressed alpha plane carrying a predictor transform, from a cwebp encode of a gradient |
alph-lossless-truncated txt |
reject | The predictor-transform plane cut to ten bytes |
alph-no-vp8x txt |
reject | An ALPH chunk in a RIFF file with no VP8X ahead of it |
alph-plane-cache txt |
ok | A palette-coded alpha plane that also declares a colour cache |
alph-plane-filtered txt |
ok | A compressed alpha plane with the gradient filter on top |
alph-plane-literals txt |
ok | A compressed alpha plane written as plain green literals |
alph-plane-lz77-dist-2 txt |
ok | An alpha plane back-reference at distance 2 |
alph-plane-lz77-dist-4 txt |
ok | An alpha plane back-reference at distance 4 |
alph-plane-lz77-past-start txt |
reject | An alpha plane copying from before its own beginning |
alph-plane-lz77-plain txt |
ok | Two alpha-plane back-references that take neither pattern arm: one at distance 3, one shorter than its own distance |
alph-plane-lz77-unaligned txt |
ok | An alpha plane back-reference starting one byte off a word boundary |
alph-plane-lz77 txt |
ok | An alpha plane whose second half is a back-reference to its first |
alph-plane-meta-huffman txt |
ok | A palette-coded alpha plane with an entropy image inside it |
alph-plane-nontrivial-red txt |
ok | A palette-coded alpha plane whose red code carries two symbols |
alph-plane-oversubscribed txt |
reject | An alpha plane whose green code is over-subscribed |
alph-plane-palette txt |
ok | A compressed alpha plane of three values, through a palette |
alph-plane-preprocessed txt |
ok | A compressed alpha plane flagged as level-reduced |
alph-plane-two-transforms txt |
ok | An alpha plane carrying a palette and a subtract-green transform |
alph-preprocessing-invalid txt |
reject | A pre-processing value of 2, past level reduction |
alph-raw-filter-gradient txt |
ok | An uncompressed alpha plane under the gradient filter |
alph-raw-filter-horizontal txt |
ok | An uncompressed alpha plane under the horizontal filter |
alph-raw-filter-none txt |
ok | An uncompressed alpha plane under the none filter |
alph-raw-filter-vertical txt |
ok | An uncompressed alpha plane under the vertical filter |
alph-raw-oversized txt |
ok | An uncompressed plane 44 bytes longer than the picture needs |
alph-raw-preprocessing txt |
ok | An uncompressed plane declaring the level-reduction pre-processing |
alph-raw-short txt |
reject | An uncompressed plane one byte short of the picture |
alph-reserved-set txt |
reject | The two reserved bits of the ALPH header byte set |
alph-without-vp8x-flag txt |
ok | An ALPH chunk with the VP8X alpha flag left clear |
The ten uncompressed bytes every lossy frame starts with: the profile, the visibility and key-frame bits, the length of partition 0, the start code and the two 14-bit dimensions.
| file | what it is | |
|---|---|---|
lossy-frame-bad-start-code txt |
reject | The three-byte start code changed from 9d 01 2a to 9d 01 29 |
lossy-frame-colorspace-clamp txt |
ok | The colour-space and clamping-type bits both set |
lossy-frame-interframe txt |
reject | The key-frame bit cleared, so the frame claims to be an inter frame |
lossy-frame-not-shown txt |
reject | A key frame with the show_frame bit cleared |
lossy-frame-part0-empty txt |
reject | The frame tag claims a zero-byte partition 0 |
lossy-frame-part0-past-end txt |
reject | The frame tag claims a partition 0 far larger than the file |
lossy-frame-scale-1 txt |
ok | A horizontal upscaling hint of 1 and a vertical one of 3 |
lossy-frame-scale-2 txt |
ok | A horizontal upscaling hint of 2 and a vertical one of 1 |
lossy-frame-scaled txt |
ok | Horizontal and vertical upscaling hints of 3 (2x) in the top bits of the dimension fields |
lossy-frame-version-1 txt |
ok | A frame declaring profile 1 instead of 0 |
lossy-frame-version-2 txt |
ok | Profile 2, one of the four values the decoder accepts |
lossy-frame-version-3 txt |
ok | Profile 3, the largest the decoder accepts |
lossy-frame-version-4 txt |
reject | Profile 4, one past the last valid value |
lossy-frame-version-7 txt |
reject | Profile 7, the largest the 3-bit field can hold |
lossy-frame-width-16383 txt |
ok | The widest frame the 14-bit field can describe, one macroblock tall |
lossy-frame-zero-width txt |
reject | A frame whose width field is zero, with a height of 32 |
Up to four segments, each with its own quantizer and loop-filter strength, and a per-macroblock map saying which is which. cwebp uses the feature but only ever writes absolute values, and always writes the map and the data together.
| file | what it is | |
|---|---|---|
lossy-segment-delta-quantizers txt |
ok | Segment quantizers read as deltas on the frame quantizer instead of absolute values |
lossy-segment-filter-strengths txt |
ok | Per-segment loop-filter strengths, from 0 to 63, under a frame filter level of 40 |
lossy-segment-four-quantizers txt |
ok | Four segments with four different absolute quantizers, one macroblock each |
lossy-segment-map-only txt |
ok | A segment map with no segment data behind it |
lossy-segment-no-map txt |
ok | Segmentation on, quantizers given, but no segment map: every macroblock is segment 0 |
lossy-segment-prob-extremes txt |
ok | Segment probabilities of 0 and 255, and loop-filter updates at both ends of their range |
lossy-segment-quant-extremes txt |
ok | Segment quantizers at 127, -127, 0 and absent |
The in-loop deblocking filter: simple or normal, its level and sharpness, and the per-reference and per-mode deltas. Sharpness moves the interior limit in two steps, at 1 and at 5, and the sharpness files sit either side of both.
| file | what it is | |
|---|---|---|
lossy-filter-lf-delta-extremes txt |
ok | Loop-filter mode deltas at -63 and 63 |
lossy-filter-lf-delta txt |
ok | Loop-filter deltas: 63 and -63 on the reference deltas, and a delta on the 4x4 mode |
lossy-filter-normal-max txt |
ok | The normal loop filter at level 63, sharpness 0 |
lossy-filter-sharpness-4 txt |
ok | Sharpness 4, the last level that halves the interior limit |
lossy-filter-sharpness-5 txt |
ok | Sharpness 5, the first level that quarters it |
lossy-filter-simple-max txt |
ok | The simple loop filter at level 63 and sharpness 7 |
The frame quantizer index and the five deltas around it, one per plane and coefficient kind, with clamps that are not all the same.
| file | what it is | |
|---|---|---|
lossy-quant-deltas-mirrored txt |
ok | The five quantizer deltas at the ends lossy-quant-deltas does not use |
lossy-quant-deltas txt |
ok | All five quantizer deltas present, at the ends of their 4-bit range |
lossy-quant-dequant-overflow txt |
ok | A coefficient of 2114 at the coarsest quantizer, so the dequantized value does not fit the int16 it is stored in |
lossy-quant-max txt |
ok | The frame quantizer at 127, the coarsest |
lossy-quant-min txt |
ok | The frame quantizer at 0, the finest the format allows |
lossy-quant-uv-dc-clamp txt |
ok | A chroma DC quantizer index pushed past 117, where it is clamped rather than at 127 |
The 1056 probabilities that drive the coefficient coder, each one optionally replaced in the frame header, plus the skip probability.
| file | what it is | |
|---|---|---|
lossy-proba-all-updated txt |
ok | Every one of the 1056 coefficient probabilities updated |
lossy-proba-one-update txt |
ok | A single coefficient probability updated, the other 1055 left alone |
lossy-proba-refresh-and-skip-zero txt |
ok | The entropy-refresh bit set, and a skip probability of 0 |
lossy-proba-skip-extremes txt |
ok | A skip probability of 255 with nothing skipped, and the flag itself written out |
lossy-proba-zero txt |
ok | Coefficient probabilities of 0 and of 255, the ends of the range |
The 16x16 and 4x4 luma modes and the chroma modes, and the neighbour-indexed probability table the 4x4 modes are coded with.
| file | what it is | |
|---|---|---|
lossy-mode-i16-all-four txt |
ok | The four 16x16 luma modes, one per macroblock |
lossy-mode-i4-all-ten txt |
ok | All ten 4x4 luma modes inside one macroblock, twice over |
lossy-mode-i4-context txt |
ok | Four B_PRED macroblocks whose 4x4 modes walk the [above][left] probability table |
lossy-mode-mixed txt |
ok | 16x16 and 4x4 macroblocks alternating, in both directions |
lossy-mode-uv-all-four txt |
ok | The four chroma modes, one per macroblock |
The token coder of section 13: magnitudes and their escape categories, end-of-block, zero runs, and the four coefficient types. The band sweeps below share a trick: the three token classes drive the context of the next position – a zero gives 0, a +-1 gives 1, anything larger gives 2 – so a block of each, walked to position 15, reads every band at that class, and placing the blocks so their neighbour contexts are 0, 1 and 2 in turn is the only way to reach band 0, which is never a token’s successor.
| file | what it is | |
|---|---|---|
lossy-coeff-all-types txt |
ok | All four coefficient types in one macroblock, and both luma types across two |
lossy-coeff-bands-chroma txt |
ok | The same sweep across the four blocks of a chroma plane |
lossy-coeff-bands-i16 txt |
ok | The same sweep for the two block kinds a 16x16 macroblock has: the Y2 block and the luma blocks that follow it |
lossy-coeff-bands-i4 txt |
ok | Three 4x4 luma blocks that sweep every coefficient band, one per context |
lossy-coeff-cat3 txt |
ok | Category-3 coefficients: 11 to 18, three extra bits each |
lossy-coeff-cat4 txt |
ok | Category-4 coefficients: 19 to 34, four extra bits |
lossy-coeff-cat5 txt |
ok | Category-5 coefficients: 35 to 66, five extra bits |
lossy-coeff-cat6-max txt |
ok | The largest coefficient the format can encode: 2114 |
lossy-coeff-cat6 txt |
ok | Category-6 coefficients: 67 upwards, eleven extra bits |
lossy-coeff-context txt |
ok | Neighbouring blocks with and without coefficients, so that every context value from 0 to 2 is used |
lossy-coeff-empty-blocks txt |
ok | Every one of the 25 blocks empty, but the macroblock not skipped |
lossy-coeff-full-block txt |
ok | A block with all sixteen coefficients non-zero, so the loop ends by running out of positions rather than on an end-of-block |
lossy-coeff-medium-magnitudes txt |
ok | Coefficients of 5 through 10, coded with the fixed probabilities 159, 165 and 145 |
lossy-coeff-small-magnitudes txt |
ok | Coefficients of 1, 2, 3 and 4, the magnitudes with their own tree branches |
lossy-coeff-wht-full txt |
ok | A Y2 block with more than one coefficient, next to one with only a DC |
lossy-coeff-zero-runs txt |
ok | Single coefficients at positions 15, 12, 8 and 1, each behind a run of zeros |
The per-macroblock skip flag, which drops the residual entirely and clears the neighbouring non-zero flags – almost all of them.
| file | what it is | |
|---|---|---|
lossy-skip-all txt |
ok | Every macroblock skipped |
lossy-skip-i4x4-nz-dc txt |
ok | A skipped 4x4 macroblock between two 16x16 ones that both carry a Y2 block |
lossy-skip-mixed txt |
ok | Skipped and coded macroblocks alternating, with a skip probability of 1 |
A lossy frame may carry 1, 2, 4 or 8 token partitions. Macroblock row r is read from partition r & (n - 1). No encoder here emits more than one, so nothing but a written bitstream reaches the rest.
| file | what it is | |
|---|---|---|
lossy-parts-2-wrap txt |
ok | Four rows over two partitions, so each partition holds two non-adjacent rows |
lossy-parts-8-rows txt |
ok | Eight macroblock rows over eight token partitions, one row each, every row different |
lossy-parts-last-empty txt |
reject | Four partitions whose declared sizes leave nothing for the last one |
lossy-parts-size-past-end txt |
reject | Four partitions, the first declaring 16 MB of data |
lossy-parts-table-too-small txt |
reject | Eight partitions declared in a frame with only ten bytes left for the twenty-one-byte size table |
Frames that stop early, at each of the places the decoder can notice: inside partition 0, inside the macroblock modes, and inside the token data.
| file | what it is | |
|---|---|---|
lossy-truncated-header txt |
reject | Partition 0 cut to two bytes, which is enough for the segment header and not for the filter header |
lossy-truncated-modes txt |
reject | Partition 0 long enough for the whole frame header and not for the macroblock modes that follow it |
lossy-truncated-short-modes txt |
ok | Mode data for 15 macroblocks in a frame whose dimensions call for 16 |
lossy-truncated-tokens txt |
reject | Partition 0 intact, the token partition cut in half |
The four files behind these are genuine encoder output, made through the encoder API rather than cwebp, and the broken ones rewrite the raw size table that follows partition 0. They carry a whole frame of real coefficients, which the assembled cases do not.
| file | what it is | |
|---|---|---|
lossy-1-partitions |
ok | A single token partition: the default, and the control for the others |
lossy-2-partitions |
ok | A plain 2-partition lossy frame |
lossy-4-partitions |
ok | A plain 4-partition lossy frame |
lossy-8-partitions |
ok | A plain 8-partition lossy frame, the maximum the 2-bit field allows |
lossy-8-partitions-size-overflow |
reject | Eight partitions whose first declared size is 0xffffff, far past the data |
lossy-8-partitions-zero-sizes |
reject | Eight partitions all declared as zero bytes long |
lossy-8-partitions-sizes-sum-past-end |
reject | Eight partitions whose declared sizes add up to more than the chunk holds |
lossy-combo-all-features txt |
ok | Every optional tool switched on in one frame at once |