| <!-- |
| |
| Although you may be viewing an alternate representation, this document is |
| sourced in Markdown, a light-duty markup scheme, and is optimized for the |
| [kramdown](https://kramdown.gettalong.org/) transformer. |
| |
| See the accompanying specs_generation.md. External link targets are referenced |
| at the end of this file. |
| |
| --> |
| |
| Specification for WebP Lossless Bitstream |
| ========================================= |
| |
| _Jyrki Alakuijala, Ph.D., Google, Inc., 2023-03-09_ |
| |
| Abstract |
| -------- |
| |
| WebP lossless is an image format for lossless compression of ARGB images. The |
| lossless format stores and restores the pixel values exactly, including the |
| color values for pixels whose alpha value is 0. The format uses subresolution |
| images, recursively embedded into the format itself, for storing statistical |
| data about the images, such as the used entropy codes, spatial predictors, color |
| space conversion, and color table. LZ77, prefix coding, and a color cache are |
| used for compression of the bulk data. Decoding speeds faster than PNG have been |
| demonstrated, as well as 25% denser compression than can be achieved using |
| today's PNG format. |
| |
| |
| * TOC placeholder |
| {:toc} |
| |
| |
| 1 Introduction |
| -------------- |
| |
| This document describes the compressed data representation of a WebP lossless |
| image. It is intended as a detailed reference for the WebP lossless encoder and |
| decoder implementation. |
| |
| In this document, we extensively use C programming language syntax to describe |
| the bitstream, and assume the existence of a function for reading bits, |
| `ReadBits(n)`. The bytes are read in the natural order of the stream containing |
| them, and bits of each byte are read in least-significant-bit-first order. When |
| multiple bits are read at the same time, the integer is constructed from the |
| original data in the original order. The most significant bits of the returned |
| integer are also the most significant bits of the original data. Thus, the |
| statement |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| b = ReadBits(2); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| is equivalent with the two statements below: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| b = ReadBits(1); |
| b |= ReadBits(1) << 1; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| We assume that each color component, that is, alpha, red, blue and green, is |
| represented using an 8-bit byte. We define the corresponding type as uint8. A |
| whole ARGB pixel is represented by a type called uint32, an unsigned integer |
| consisting of 32 bits. In the code showing the behavior of the transformations, |
| alpha value is codified in bits 31..24, red in bits 23..16, green in bits 15..8 |
| and blue in bits 7..0, but implementations of the format are free to use another |
| representation internally. |
| |
| Broadly, a WebP lossless image contains header data, transform information and |
| actual image data. Headers contain width and height of the image. A WebP |
| lossless image can go through four different types of transformation before |
| being entropy encoded. The transform information in the bitstream contains the |
| data required to apply the respective inverse transforms. |
| |
| |
| 2 Nomenclature |
| -------------- |
| |
| ARGB |
| : A pixel value consisting of alpha, red, green, and blue values. |
| |
| ARGB image |
| : A two-dimensional array containing ARGB pixels. |
| |
| color cache |
| : A small hash-addressed array to store recently used colors, to be able to |
| recall them with shorter codes. |
| |
| color indexing image |
| : A one-dimensional image of colors that can be indexed using a small integer |
| (up to 256 within WebP lossless). |
| |
| color transform image |
| : A two-dimensional subresolution image containing data about correlations of |
| color components. |
| |
| distance mapping |
| : Changes LZ77 distances to have the smallest values for pixels in 2D |
| proximity. |
| |
| entropy image |
| : A two-dimensional subresolution image indicating which entropy coding should |
| be used in a respective square in the image, that is, each pixel is a meta |
| prefix code. |
| |
| prefix code |
| : A classic way to do entropy coding where a smaller number of bits are used |
| for more frequent codes. |
| |
| LZ77 |
| : Dictionary-based sliding window compression algorithm that either emits |
| symbols or describes them as sequences of past symbols. |
| |
| meta prefix code |
| : A small integer (up to 16 bits) that indexes an element in the meta prefix |
| table. |
| |
| predictor image |
| : A two-dimensional subresolution image indicating which spatial predictor is |
| used for a particular square in the image. |
| |
| prefix coding |
| : A way to entropy code larger integers that codes a few bits of the integer |
| using an entropy code and codifies the remaining bits raw. This allows for |
| the descriptions of the entropy codes to remain relatively small even when |
| the range of symbols is large. |
| |
| scan-line order |
| : A processing order of pixels, left-to-right, top-to-bottom, starting from |
| the left-hand-top pixel, proceeding to the right. Once a row is completed, |
| continue from the left-hand column of the next row. |
| |
| 3 RIFF Header |
| ------------- |
| |
| The beginning of the header has the RIFF container. This consists of the |
| following 21 bytes: |
| |
| 1. String "RIFF" |
| 2. A little-endian 32 bit value of the block length, the whole size |
| of the block controlled by the RIFF header. Normally this equals |
| the payload size (file size minus 8 bytes: 4 bytes for the 'RIFF' |
| identifier and 4 bytes for storing the value itself). |
| 3. String "WEBP" (RIFF container name). |
| 4. String "VP8L" (chunk tag for lossless encoded image data). |
| 5. A little-endian 32-bit value of the number of bytes in the |
| lossless stream. |
| 6. One byte signature 0x2f. |
| |
| The first 28 bits of the bitstream specify the width and height of the image. |
| Width and height are decoded as 14-bit integers as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int image_width = ReadBits(14) + 1; |
| int image_height = ReadBits(14) + 1; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The 14-bit precision for image width and height limits the maximum size of a |
| WebP lossless image to 16384✕16384 pixels. |
| |
| The alpha_is_used bit is a hint only, and should not impact decoding. It should |
| be set to 0 when all alpha values are 255 in the picture, and 1 otherwise. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int alpha_is_used = ReadBits(1); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The version_number is a 3 bit code that must be set to 0. Any other value should |
| be treated as an error. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int version_number = ReadBits(3); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| 4 Transformations |
| ----------------- |
| |
| Transformations are reversible manipulations of the image data that can reduce |
| the remaining symbolic entropy by modeling spatial and color correlations. |
| Transformations can make the final compression more dense. |
| |
| An image can go through four types of transformation. A 1 bit indicates the |
| presence of a transform. Each transform is allowed to be used only once. The |
| transformations are used only for the main level ARGB image: the subresolution |
| images have no transforms, not even the 0 bit indicating the end-of-transforms. |
| |
| Typically, an encoder would use these transforms to reduce the Shannon entropy |
| in the residual image. Also, the transform data can be decided based on entropy |
| minimization. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| while (ReadBits(1)) { // Transform present. |
| // Decode transform type. |
| enum TransformType transform_type = ReadBits(2); |
| // Decode transform data. |
| ... |
| } |
| |
| // Decode actual image data (Section 4). |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| If a transform is present then the next two bits specify the transform type. |
| There are four types of transforms. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| enum TransformType { |
| PREDICTOR_TRANSFORM = 0, |
| COLOR_TRANSFORM = 1, |
| SUBTRACT_GREEN_TRANSFORM = 2, |
| COLOR_INDEXING_TRANSFORM = 3, |
| }; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The transform type is followed by the transform data. Transform data contains |
| the information required to apply the inverse transform and depends on the |
| transform type. Next we describe the transform data for different types. |
| |
| |
| ### 4.1 Predictor Transform |
| |
| The predictor transform can be used to reduce entropy by exploiting the fact |
| that neighboring pixels are often correlated. In the predictor transform, the |
| current pixel value is predicted from the pixels already decoded (in scan-line |
| order) and only the residual value (actual - predicted) is encoded. The |
| _prediction mode_ determines the type of prediction to use. We divide the image |
| into squares and all the pixels in a square use the same prediction mode. |
| |
| The first 3 bits of prediction data define the block width and height in number |
| of bits. The number of block columns, `block_xsize`, is used in indexing |
| two-dimensionally. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int size_bits = ReadBits(3) + 2; |
| int block_width = (1 << size_bits); |
| int block_height = (1 << size_bits); |
| #define DIV_ROUND_UP(num, den) (((num) + (den) - 1) / (den)) |
| int block_xsize = DIV_ROUND_UP(image_width, 1 << size_bits); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The transform data contains the prediction mode for each block of the image. All |
| the `block_width * block_height` pixels of a block use same prediction mode. The |
| prediction modes are treated as pixels of an image and encoded using the same |
| techniques described in [Chapter 5](#image-data). |
| |
| For a pixel _x, y_, one can compute the respective filter block address by: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int block_index = (y >> size_bits) * block_xsize + |
| (x >> size_bits); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| There are 14 different prediction modes. In each prediction mode, the current |
| pixel value is predicted from one or more neighboring pixels whose values are |
| already known. |
| |
| We choose the neighboring pixels (TL, T, TR, and L) of the current pixel (P) as |
| follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| O O O O O O O O O O O |
| O O O O O O O O O O O |
| O O O O TL T TR O O O O |
| O O O O L P X X X X X |
| X X X X X X X X X X X |
| X X X X X X X X X X X |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| where TL means top-left, T top, TR top-right, L left pixel. At the time of |
| predicting a value for P, all pixels O, TL, T, TR and L have already been |
| processed, and pixel P and all pixels X are unknown. |
| |
| Given the above neighboring pixels, the different prediction modes are defined |
| as follows. |
| |
| | Mode | Predicted value of each channel of the current pixel | |
| | ------ | ------------------------------------------------------- | |
| | 0 | 0xff000000 (represents solid black color in ARGB) | |
| | 1 | L | |
| | 2 | T | |
| | 3 | TR | |
| | 4 | TL | |
| | 5 | Average2(Average2(L, TR), T) | |
| | 6 | Average2(L, TL) | |
| | 7 | Average2(L, T) | |
| | 8 | Average2(TL, T) | |
| | 9 | Average2(T, TR) | |
| | 10 | Average2(Average2(L, TL), Average2(T, TR)) | |
| | 11 | Select(L, T, TL) | |
| | 12 | ClampAddSubtractFull(L, T, TL) | |
| | 13 | ClampAddSubtractHalf(Average2(L, T), TL) | |
| |
| |
| `Average2` is defined as follows for each ARGB component: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| uint8 Average2(uint8 a, uint8 b) { |
| return (a + b) / 2; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The Select predictor is defined as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| uint32 Select(uint32 L, uint32 T, uint32 TL) { |
| // L = left pixel, T = top pixel, TL = top left pixel. |
| |
| // ARGB component estimates for prediction. |
| int pAlpha = ALPHA(L) + ALPHA(T) - ALPHA(TL); |
| int pRed = RED(L) + RED(T) - RED(TL); |
| int pGreen = GREEN(L) + GREEN(T) - GREEN(TL); |
| int pBlue = BLUE(L) + BLUE(T) - BLUE(TL); |
| |
| // Manhattan distances to estimates for left and top pixels. |
| int pL = abs(pAlpha - ALPHA(L)) + abs(pRed - RED(L)) + |
| abs(pGreen - GREEN(L)) + abs(pBlue - BLUE(L)); |
| int pT = abs(pAlpha - ALPHA(T)) + abs(pRed - RED(T)) + |
| abs(pGreen - GREEN(T)) + abs(pBlue - BLUE(T)); |
| |
| // Return either left or top, the one closer to the prediction. |
| if (pL < pT) { |
| return L; |
| } else { |
| return T; |
| } |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The functions `ClampAddSubtractFull` and `ClampAddSubtractHalf` are performed |
| for each ARGB component as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| // Clamp the input value between 0 and 255. |
| int Clamp(int a) { |
| return (a < 0) ? 0 : (a > 255) ? 255 : a; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int ClampAddSubtractFull(int a, int b, int c) { |
| return Clamp(a + b - c); |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int ClampAddSubtractHalf(int a, int b) { |
| return Clamp(a + (a - b) / 2); |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| There are special handling rules for some border pixels. If there is a |
| prediction transform, regardless of the mode \[0..13\] for these pixels, the |
| predicted value for the left-topmost pixel of the image is 0xff000000, L-pixel |
| for all pixels on the top row, and T-pixel for all pixels on the leftmost |
| column. |
| |
| Addressing the TR-pixel for pixels on the rightmost column is |
| exceptional. The pixels on the rightmost column are predicted by using the modes |
| \[0..13\] just like pixels not on the border, but the leftmost pixel on the same |
| row as the current pixel is instead used as the TR-pixel. |
| |
| |
| ### 4.2 Color Transform |
| |
| The goal of the color transform is to decorrelate the R, G and B values of each |
| pixel. The color transform keeps the green (G) value as it is, transforms red |
| (R) based on green and transforms blue (B) based on green and then based on red. |
| |
| As is the case for the predictor transform, first the image is divided into |
| blocks and the same transform mode is used for all the pixels in a block. For |
| each block there are three types of color transform elements. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| typedef struct { |
| uint8 green_to_red; |
| uint8 green_to_blue; |
| uint8 red_to_blue; |
| } ColorTransformElement; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The actual color transformation is done by defining a color transform delta. The |
| color transform delta depends on the `ColorTransformElement`, which is the same |
| for all the pixels in a particular block. The delta is subtracted during the |
| color transform. The inverse color transform then is just adding those deltas. |
| |
| The color transform function is defined as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| void ColorTransform(uint8 red, uint8 blue, uint8 green, |
| ColorTransformElement *trans, |
| uint8 *new_red, uint8 *new_blue) { |
| // Transformed values of red and blue components |
| int tmp_red = red; |
| int tmp_blue = blue; |
| |
| // Applying the transform is just subtracting the transform deltas |
| tmp_red -= ColorTransformDelta(trans->green_to_red_, green); |
| tmp_blue -= ColorTransformDelta(trans->green_to_blue_, green); |
| tmp_blue -= ColorTransformDelta(trans->red_to_blue_, red); |
| |
| *new_red = tmp_red & 0xff; |
| *new_blue = tmp_blue & 0xff; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| `ColorTransformDelta` is computed using a signed 8-bit integer representing a |
| 3.5-fixed-point number, and a signed 8-bit RGB color channel (c) \[-128..127\] |
| and is defined as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int8 ColorTransformDelta(int8 t, int8 c) { |
| return (t * c) >> 5; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| A conversion from the 8-bit unsigned representation (uint8) to the 8-bit signed |
| one (int8) is required before calling `ColorTransformDelta()`. It should be |
| performed using 8-bit two's complement (that is: uint8 range \[128..255\] is |
| mapped to the \[-128..-1\] range of its converted int8 value). |
| |
| The multiplication is to be done using more precision (with at least 16-bit |
| precision). The sign extension property of the shift operation does not matter |
| here: only the lowest 8 bits are used from the result, and there the sign |
| extension shifting and unsigned shifting are consistent with each other. |
| |
| Now we describe the contents of color transform data so that decoding can apply |
| the inverse color transform and recover the original red and blue values. The |
| first 3 bits of the color transform data contain the width and height of the |
| image block in number of bits, just like the predictor transform: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int size_bits = ReadBits(3) + 2; |
| int block_width = 1 << size_bits; |
| int block_height = 1 << size_bits; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The remaining part of the color transform data contains `ColorTransformElement` |
| instances corresponding to each block of the image. `ColorTransformElement` |
| instances are treated as pixels of an image and encoded using the methods |
| described in [Chapter 5](#image-data). |
| |
| During decoding, `ColorTransformElement` instances of the blocks are decoded and |
| the inverse color transform is applied on the ARGB values of the pixels. As |
| mentioned earlier, that inverse color transform is just adding |
| `ColorTransformElement` values to the red and blue channels. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| void InverseTransform(uint8 red, uint8 green, uint8 blue, |
| ColorTransformElement *trans, |
| uint8 *new_red, uint8 *new_blue) { |
| // Transformed values of red and blue components |
| int tmp_red = red; |
| int tmp_blue = blue; |
| |
| // Applying the inverse transform is just adding the |
| // color transform deltas |
| tmp_red += ColorTransformDelta(trans->green_to_red, green); |
| tmp_blue += ColorTransformDelta(trans->green_to_blue, green); |
| tmp_blue += |
| ColorTransformDelta(trans->red_to_blue, tmp_red & 0xff); |
| |
| *new_red = tmp_red & 0xff; |
| *new_blue = tmp_blue & 0xff; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| ### 4.3 Subtract Green Transform |
| |
| The subtract green transform subtracts green values from red and blue values of |
| each pixel. When this transform is present, the decoder needs to add the green |
| value to both red and blue. There is no data associated with this transform. The |
| decoder applies the inverse transform as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| void AddGreenToBlueAndRed(uint8 green, uint8 *red, uint8 *blue) { |
| *red = (*red + green) & 0xff; |
| *blue = (*blue + green) & 0xff; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| This transform is redundant as it can be modeled using the color transform, but |
| since there is no additional data here, the subtract green transform can be |
| coded using fewer bits than a full-blown color transform. |
| |
| |
| ### 4.4 Color Indexing Transform |
| |
| If there are not many unique pixel values, it may be more efficient to create a |
| color index array and replace the pixel values by the array's indices. The color |
| indexing transform achieves this. (In the context of WebP lossless, we |
| specifically do not call this a palette transform because a similar but more |
| dynamic concept exists in WebP lossless encoding: color cache). |
| |
| The color indexing transform checks for the number of unique ARGB values in the |
| image. If that number is below a threshold (256), it creates an array of those |
| ARGB values, which is then used to replace the pixel values with the |
| corresponding index: the green channel of the pixels are replaced with the |
| index; all alpha values are set to 255; all red and blue values to 0. |
| |
| The transform data contains color table size and the entries in the color table. |
| The decoder reads the color indexing transform data as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| // 8 bit value for color table size |
| int color_table_size = ReadBits(8) + 1; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The color table is stored using the image storage format itself. The color table |
| can be obtained by reading an image, without the RIFF header, image size, and |
| transforms, assuming a height of one pixel and a width of `color_table_size`. |
| The color table is always subtraction-coded to reduce image entropy. The deltas |
| of palette colors contain typically much less entropy than the colors |
| themselves, leading to significant savings for smaller images. In decoding, |
| every final color in the color table can be obtained by adding the previous |
| color component values by each ARGB component separately, and storing the least |
| significant 8 bits of the result. |
| |
| The inverse transform for the image is simply replacing the pixel values (which |
| are indices to the color table) with the actual color table values. The indexing |
| is done based on the green component of the ARGB color. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| // Inverse transform |
| argb = color_table[GREEN(argb)]; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| If the index is equal or larger than `color_table_size`, the argb color value |
| should be set to 0x00000000 (transparent black). |
| |
| When the color table is small (equal to or less than 16 colors), several pixels |
| are bundled into a single pixel. The pixel bundling packs several (2, 4, or 8) |
| pixels into a single pixel, reducing the image width respectively. Pixel |
| bundling allows for a more efficient joint distribution entropy coding of |
| neighboring pixels, and gives some arithmetic coding-like benefits to the |
| entropy code, but it can only be used when there are 16 or fewer unique values. |
| |
| `color_table_size` specifies how many pixels are combined: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int width_bits; |
| if (color_table_size <= 2) { |
| width_bits = 3; |
| } else if (color_table_size <= 4) { |
| width_bits = 2; |
| } else if (color_table_size <= 16) { |
| width_bits = 1; |
| } else { |
| width_bits = 0; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| `width_bits` has a value of 0, 1, 2 or 3. A value of 0 indicates no pixel |
| bundling is to be done for the image. A value of 1 indicates that two pixels are |
| combined, and each pixel has a range of \[0..15\]. A value of 2 indicates that |
| four pixels are combined, and each pixel has a range of \[0..3\]. A value of 3 |
| indicates that eight pixels are combined and each pixel has a range of \[0..1\], |
| that is, a binary value. |
| |
| The values are packed into the green component as follows: |
| |
| * `width_bits` = 1: for every x value where x ≡ 0 (mod 2), a green |
| value at x is positioned into the 4 least-significant bits of the |
| green value at x / 2, a green value at x + 1 is positioned into the |
| 4 most-significant bits of the green value at x / 2. |
| * `width_bits` = 2: for every x value where x ≡ 0 (mod 4), a green |
| value at x is positioned into the 2 least-significant bits of the |
| green value at x / 4, green values at x + 1 to x + 3 are positioned in order |
| to the more significant bits of the green value at x / 4. |
| * `width_bits` = 3: for every x value where x ≡ 0 (mod 8), a green |
| value at x is positioned into the least-significant bit of the green |
| value at x / 8, green values at x + 1 to x + 7 are positioned in order to |
| the more significant bits of the green value at x / 8. |
| |
| |
| 5 Image Data |
| ------------ |
| |
| Image data is an array of pixel values in scan-line order. |
| |
| ### 5.1 Roles of Image Data |
| |
| We use image data in five different roles: |
| |
| 1. ARGB image: Stores the actual pixels of the image. |
| 1. Entropy image: Stores the |
| [meta prefix codes](#decoding-of-meta-prefix-codes). The red and green |
| components of a pixel define the meta prefix code used in a particular |
| block of the ARGB image. |
| 1. Predictor image: Stores the metadata for |
| [Predictor Transform](#predictor-transform). The green component of a pixel |
| defines which of the 14 predictors is used within a particular block of the |
| ARGB image. |
| 1. Color transform image. It is created by `ColorTransformElement` values |
| (defined in [Color Transform](#color-transform)) for different blocks of |
| the image. Each `ColorTransformElement` `'cte'` is treated as a pixel whose |
| alpha component is `255`, red component is `cte.red_to_blue`, green |
| component is `cte.green_to_blue` and blue component is `cte.green_to_red`. |
| 1. Color indexing image: An array of size `color_table_size` (up to 256 |
| ARGB values) storing the metadata for the |
| [Color Indexing Transform](#color-indexing-transform). This is stored as an |
| image of width `color_table_size` and height `1`. |
| |
| ### 5.2 Encoding of Image Data |
| |
| The encoding of image data is independent of its role. |
| |
| The image is first divided into a set of fixed-size blocks (typically 16x16 |
| blocks). Each of these blocks are modeled using their own entropy codes. Also, |
| several blocks may share the same entropy codes. |
| |
| **Rationale:** Storing an entropy code incurs a cost. This cost can be minimized |
| if statistically similar blocks share an entropy code, thereby storing that code |
| only once. For example, an encoder can find similar blocks by clustering them |
| using their statistical properties, or by repeatedly joining a pair of randomly |
| selected clusters when it reduces the overall amount of bits needed to encode |
| the image. |
| |
| Each pixel is encoded using one of the three possible methods: |
| |
| 1. Prefix coded literal: each channel (green, red, blue and alpha) is |
| entropy-coded independently; |
| 2. LZ77 backward reference: a sequence of pixels are copied from elsewhere |
| in the image; or |
| 3. Color cache code: using a short multiplicative hash code (color cache |
| index) of a recently seen color. |
| |
| The following subsections describe each of these in detail. |
| |
| #### 5.2.1 Prefix Coded Literals |
| |
| The pixel is stored as prefix coded values of green, red, blue and alpha (in |
| that order). See [Section 6.2.3](#decoding-entropy-coded-image-data) for |
| details. |
| |
| #### 5.2.2 LZ77 Backward Reference |
| |
| Backward references are tuples of _length_ and _distance code_: |
| |
| * Length indicates how many pixels in scan-line order are to be copied. |
| * Distance code is a number indicating the position of a previously seen |
| pixel, from which the pixels are to be copied. The exact mapping is |
| described [below](#distance-mapping). |
| |
| The length and distance values are stored using **LZ77 prefix coding**. |
| |
| LZ77 prefix coding divides large integer values into two parts: the _prefix |
| code_ and the _extra bits_: the prefix code is stored using an entropy code, |
| while the extra bits are stored as they are (without an entropy code). |
| |
| **Rationale**: This approach reduces the storage requirement for the entropy |
| code. Also, large values are usually rare, and so extra bits would be used for |
| very few values in the image. Thus, this approach results in better compression |
| overall. |
| |
| The following table denotes the prefix codes and extra bits used for storing |
| different ranges of values. |
| |
| Note: The maximum backward reference length is limited to 4096. Hence, only the |
| first 24 prefix codes (with the respective extra bits) are meaningful for length |
| values. For distance values, however, all the 40 prefix codes are valid. |
| |
| | Value range | Prefix code | Extra bits | |
| | --------------- | ----------- | ---------- | |
| | 1 | 0 | 0 | |
| | 2 | 1 | 0 | |
| | 3 | 2 | 0 | |
| | 4 | 3 | 0 | |
| | 5..6 | 4 | 1 | |
| | 7..8 | 5 | 1 | |
| | 9..12 | 6 | 2 | |
| | 13..16 | 7 | 2 | |
| | ... | ... | ... | |
| | 3072..4096 | 23 | 10 | |
| | ... | ... | ... | |
| | 524289..786432 | 38 | 18 | |
| | 786433..1048576 | 39 | 18 | |
| |
| The pseudocode to obtain a (length or distance) value from the prefix code is as |
| follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| if (prefix_code < 4) { |
| return prefix_code + 1; |
| } |
| int extra_bits = (prefix_code - 2) >> 1; |
| int offset = (2 + (prefix_code & 1)) << extra_bits; |
| return offset + ReadBits(extra_bits) + 1; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| **Distance Mapping:** |
| {:#distance-mapping} |
| |
| As noted previously, a distance code is a number indicating the position of a |
| previously seen pixel, from which the pixels are to be copied. This subsection |
| defines the mapping between a distance code and the position of a previous |
| pixel. |
| |
| Distance codes larger than 120 denote the pixel-distance in scan-line order, |
| offset by 120. |
| |
| The smallest distance codes \[1..120\] are special, and are reserved for a close |
| neighborhood of the current pixel. This neighborhood consists of 120 pixels: |
| |
| * Pixels that are 1 to 7 rows above the current pixel, and are up to 8 columns |
| to the left or up to 7 columns to the right of the current pixel. \[Total |
| such pixels = `7 * (8 + 1 + 7) = 112`\]. |
| * Pixels that are in same row as the current pixel, and are up to 8 columns to |
| the left of the current pixel. \[`8` such pixels\]. |
| |
| The mapping between distance code `i` and the neighboring pixel offset |
| `(xi, yi)` is as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| (0, 1), (1, 0), (1, 1), (-1, 1), (0, 2), (2, 0), (1, 2), |
| (-1, 2), (2, 1), (-2, 1), (2, 2), (-2, 2), (0, 3), (3, 0), |
| (1, 3), (-1, 3), (3, 1), (-3, 1), (2, 3), (-2, 3), (3, 2), |
| (-3, 2), (0, 4), (4, 0), (1, 4), (-1, 4), (4, 1), (-4, 1), |
| (3, 3), (-3, 3), (2, 4), (-2, 4), (4, 2), (-4, 2), (0, 5), |
| (3, 4), (-3, 4), (4, 3), (-4, 3), (5, 0), (1, 5), (-1, 5), |
| (5, 1), (-5, 1), (2, 5), (-2, 5), (5, 2), (-5, 2), (4, 4), |
| (-4, 4), (3, 5), (-3, 5), (5, 3), (-5, 3), (0, 6), (6, 0), |
| (1, 6), (-1, 6), (6, 1), (-6, 1), (2, 6), (-2, 6), (6, 2), |
| (-6, 2), (4, 5), (-4, 5), (5, 4), (-5, 4), (3, 6), (-3, 6), |
| (6, 3), (-6, 3), (0, 7), (7, 0), (1, 7), (-1, 7), (5, 5), |
| (-5, 5), (7, 1), (-7, 1), (4, 6), (-4, 6), (6, 4), (-6, 4), |
| (2, 7), (-2, 7), (7, 2), (-7, 2), (3, 7), (-3, 7), (7, 3), |
| (-7, 3), (5, 6), (-5, 6), (6, 5), (-6, 5), (8, 0), (4, 7), |
| (-4, 7), (7, 4), (-7, 4), (8, 1), (8, 2), (6, 6), (-6, 6), |
| (8, 3), (5, 7), (-5, 7), (7, 5), (-7, 5), (8, 4), (6, 7), |
| (-6, 7), (7, 6), (-7, 6), (8, 5), (7, 7), (-7, 7), (8, 6), |
| (8, 7) |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| For example, the distance code `1` indicates an offset of `(0, 1)` for the |
| neighboring pixel, that is, the pixel above the current pixel (0 pixel |
| difference in the X-direction and 1 pixel difference in the Y-direction). |
| Similarly, the distance code `3` indicates the left-top pixel. |
| |
| The decoder can convert a distance code `i` to a scan-line order distance `dist` |
| as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| (xi, yi) = distance_map[i - 1] |
| dist = xi + yi * xsize |
| if (dist < 1) { |
| dist = 1 |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| where `distance_map` is the mapping noted above and `xsize` is the width of the |
| image in pixels. |
| |
| |
| #### 5.2.3 Color Cache Coding |
| {:#color-cache-code} |
| |
| Color cache stores a set of colors that have been recently used in the image. |
| |
| **Rationale:** This way, the recently used colors can sometimes be referred to |
| more efficiently than emitting them using the other two methods (described in |
| [5.2.1](#prefix-coded-literals) and [5.2.2](#lz77-backward-reference)). |
| |
| Color cache codes are stored as follows. First, there is a 1-bit value that |
| indicates if the color cache is used. If this bit is 0, no color cache codes |
| exist, and they are not transmitted in the prefix code that decodes the green |
| symbols and the length prefix codes. However, if this bit is 1, the color cache |
| size is read next: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int color_cache_code_bits = ReadBits(4); |
| int color_cache_size = 1 << color_cache_code_bits; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| `color_cache_code_bits` defines the size of the color_cache by (1 << |
| `color_cache_code_bits`). The range of allowed values for |
| `color_cache_code_bits` is \[1..11\]. Compliant decoders must indicate a |
| corrupted bitstream for other values. |
| |
| A color cache is an array of size `color_cache_size`. Each entry stores one ARGB |
| color. Colors are looked up by indexing them by (0x1e35a7bd * `color`) >> (32 - |
| `color_cache_code_bits`). Only one lookup is done in a color cache; there is no |
| conflict resolution. |
| |
| In the beginning of decoding or encoding of an image, all entries in all color |
| cache values are set to zero. The color cache code is converted to this color at |
| decoding time. The state of the color cache is maintained by inserting every |
| pixel, be it produced by backward referencing or as literals, into the cache in |
| the order they appear in the stream. |
| |
| |
| 6 Entropy Code |
| -------------- |
| |
| ### 6.1 Overview |
| |
| Most of the data is coded using a [canonical prefix code][canonical_huff]. |
| Hence, the codes are transmitted by sending the _prefix code lengths_, as |
| opposed to the actual _prefix codes_. |
| |
| In particular, the format uses **spatially-variant prefix coding**. In other |
| words, different blocks of the image can potentially use different entropy |
| codes. |
| |
| **Rationale**: Different areas of the image may have different characteristics. |
| So, allowing them to use different entropy codes provides more flexibility and |
| potentially better compression. |
| |
| ### 6.2 Details |
| |
| The encoded image data consists of several parts: |
| |
| 1. Decoding and building the prefix codes |
| 1. Meta prefix codes |
| 1. Entropy-coded image data |
| |
| #### 6.2.1 Decoding and Building the Prefix Codes |
| |
| There are several steps in decoding the prefix codes. |
| |
| **Decoding the Code Lengths:** |
| {:#decoding-the-code-lengths} |
| |
| This section describes how to read the prefix code lengths from the bitstream. |
| |
| The prefix code lengths can be coded in two ways. The method used is specified |
| by a 1-bit value. |
| |
| * If this bit is 1, it is a _simple code length code_, and |
| * If this bit is 0, it is a _normal code length code_. |
| |
| In both cases, there can be unused code lengths that are still part of the |
| stream. This may be inefficient, but it is allowed by the format. |
| The described tree must be a complete binary tree. A single leaf node is |
| considered a complete binary tree and can be encoded using either the simple |
| code length code or the normal code length code. When coding a single leaf |
| node using the _normal code length code_, all but one code length should be |
| zeros, and the single leaf node value is marked with the length of 1 -- even |
| when no bits are consumed when that single leaf node tree is used. |
| |
| **(i) Simple Code Length Code:** |
| |
| This variant is used in the special case when only 1 or 2 prefix symbols are in |
| the range \[0..255\] with code length `1`. All other prefix code lengths are |
| implicitly zeros. |
| |
| The first bit indicates the number of symbols: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int num_symbols = ReadBits(1) + 1; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Following are the symbol values. |
| |
| This first symbol is coded using 1 or 8 bits depending on the value of |
| `is_first_8bits`. The range is \[0..1\] or \[0..255\], respectively. The second |
| symbol, if present, is always assumed to be in the range \[0..255\] and coded |
| using 8 bits. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int is_first_8bits = ReadBits(1); |
| symbol0 = ReadBits(1 + 7 * is_first_8bits); |
| code_lengths[symbol0] = 1; |
| if (num_symbols == 2) { |
| symbol1 = ReadBits(8); |
| code_lengths[symbol1] = 1; |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| **Note:** Another special case is when _all_ prefix code lengths are _zeros_ (an |
| empty prefix code). For example, a prefix code for distance can be empty if |
| there are no backward references. Similarly, prefix codes for alpha, red, and |
| blue can be empty if all pixels within the same meta prefix code are produced |
| using the color cache. However, this case doesn't need special handling, as |
| empty prefix codes can be coded as those containing a single symbol `0`. |
| |
| **(ii) Normal Code Length Code:** |
| |
| The code lengths of the prefix code fit in 8 bits and are read as follows. |
| First, `num_code_lengths` specifies the number of code lengths. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int num_code_lengths = 4 + ReadBits(4); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| If `num_code_lengths` is > 19, the bitstream is invalid. |
| |
| The code lengths are themselves encoded using prefix codes: lower level code |
| lengths, `code_length_code_lengths`, first have to be read. The rest of those |
| `code_length_code_lengths` (according to the order in `kCodeLengthCodeOrder`) |
| are zeros. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int kCodeLengthCodes = 19; |
| int kCodeLengthCodeOrder[kCodeLengthCodes] = { |
| 17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 |
| }; |
| int code_length_code_lengths[kCodeLengthCodes] = { 0 }; // All zeros |
| for (i = 0; i < num_code_lengths; ++i) { |
| code_length_code_lengths[kCodeLengthCodeOrder[i]] = ReadBits(3); |
| } |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Next, if `ReadBits(1) == 0`, the maximum number of different read symbols is |
| `num_code_lengths`. Otherwise, it is defined as: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int length_nbits = 2 + 2 * ReadBits(3); |
| int max_symbol = 2 + ReadBits(length_nbits); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| A prefix table is then built from `code_length_code_lengths` and used to read up |
| to `max_symbol` code lengths. |
| |
| * Code \[0..15\] indicates literal code lengths. |
| * Value 0 means no symbols have been coded. |
| * Values \[1..15\] indicate the bit length of the respective code. |
| * Code 16 repeats the previous non-zero value \[3..6\] times, that is, |
| `3 + ReadBits(2)` times. If code 16 is used before a non-zero |
| value has been emitted, a value of 8 is repeated. |
| * Code 17 emits a streak of zeros \[3..10\], that is, `3 + ReadBits(3)` |
| times. |
| * Code 18 emits a streak of zeros of length \[11..138\], that is, |
| `11 + ReadBits(7)` times. |
| |
| Once code lengths are read, a prefix code for each symbol type (A, R, G, B, |
| distance) is formed using their respective alphabet sizes: |
| |
| * G channel: 256 + 24 + `color_cache_size` |
| * other literals (A,R,B): 256 |
| * distance code: 40 |
| |
| The Normal Code Length Code must code a full decision tree, that is, the sum of |
| `2 ^ (-length)` for all non-zero codes must be exactly one. There is however |
| one exception to this rule, the single leaf node tree, where the leaf node |
| value is marked with value 1 and other values are 0s. |
| |
| #### 6.2.2 Decoding of Meta Prefix Codes |
| |
| As noted earlier, the format allows the use of different prefix codes for |
| different blocks of the image. _Meta prefix codes_ are indexes identifying which |
| prefix codes to use in different parts of the image. |
| |
| Meta prefix codes may be used _only_ when the image is being used in the |
| [role](#roles-of-image-data) of an _ARGB image_. |
| |
| There are two possibilities for the meta prefix codes, indicated by a 1-bit |
| value: |
| |
| * If this bit is zero, there is only one meta prefix code used everywhere in |
| the image. No more data is stored. |
| * If this bit is one, the image uses multiple meta prefix codes. These meta |
| prefix codes are stored as an _entropy image_ (described below). |
| |
| **Entropy image:** |
| |
| The entropy image defines which prefix codes are used in different parts of the |
| image, as described below. |
| |
| The first 3-bits contain the `prefix_bits` value. The dimensions of the entropy |
| image are derived from `prefix_bits`. |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int prefix_bits = ReadBits(3) + 2; |
| int prefix_xsize = DIV_ROUND_UP(xsize, 1 << prefix_bits); |
| int prefix_ysize = DIV_ROUND_UP(ysize, 1 << prefix_bits); |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| where `DIV_ROUND_UP` is as defined [earlier](#predictor-transform). |
| |
| The next bits contain an entropy image of width `prefix_xsize` and height |
| `prefix_ysize`. |
| |
| **Interpretation of Meta Prefix Codes:** |
| |
| For any given pixel (x, y), there is a set of five prefix codes associated with |
| it. These codes are (in bitstream order): |
| |
| * **Prefix code #1**: used for green channel, backward-reference length and |
| color cache. |
| * **Prefix code #2, #3 and #4**: used for red, blue and alpha channels |
| respectively. |
| * **Prefix code #5**: used for backward-reference distance. |
| |
| From here on, we refer to this set as a **prefix code group**. |
| |
| The number of prefix code groups in the ARGB image can be obtained by finding |
| the _largest meta prefix code_ from the entropy image: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int num_prefix_groups = max(entropy image) + 1; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| where `max(entropy image)` indicates the largest prefix code stored in the |
| entropy image. |
| |
| As each prefix code group contains five prefix codes, the total number of prefix |
| codes is: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int num_prefix_codes = 5 * num_prefix_groups; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Given a pixel (x, y) in the ARGB image, we can obtain the corresponding prefix |
| codes to be used as follows: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| int position = |
| (y >> prefix_bits) * prefix_xsize + (x >> prefix_bits); |
| int meta_prefix_code = (entropy_image[position] >> 8) & 0xffff; |
| PrefixCodeGroup prefix_group = prefix_code_groups[meta_prefix_code]; |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| where, we have assumed the existence of `PrefixCodeGroup` structure, which |
| represents a set of five prefix codes. Also, `prefix_code_groups` is an array of |
| `PrefixCodeGroup` (of size `num_prefix_groups`). |
| |
| The decoder then uses prefix code group `prefix_group` to decode the pixel |
| (x, y) as explained in the [next section](#decoding-entropy-coded-image-data). |
| |
| #### 6.2.3 Decoding Entropy-Coded Image Data |
| |
| For the current position (x, y) in the image, the decoder first identifies the |
| corresponding prefix code group (as explained in the last section). Given the |
| prefix code group, the pixel is read and decoded as follows: |
| |
| Read the next symbol S from the bitstream using prefix code #1. Note that S is |
| any integer in the range `0` to |
| `(256 + 24 + ` [`color_cache_size`](#color-cache-code)` - 1)`. |
| |
| The interpretation of S depends on its value: |
| |
| 1. if S < 256 |
| 1. Use S as the green component. |
| 1. Read red from the bitstream using prefix code #2. |
| 1. Read blue from the bitstream using prefix code #3. |
| 1. Read alpha from the bitstream using prefix code #4. |
| 1. if S >= 256 && S < 256 + 24 |
| 1. Use S - 256 as a length prefix code. |
| 1. Read extra bits for length from the bitstream. |
| 1. Determine backward-reference length L from length prefix code and the |
| extra bits read. |
| 1. Read distance prefix code from the bitstream using prefix code #5. |
| 1. Read extra bits for distance from the bitstream. |
| 1. Determine backward-reference distance D from distance prefix code and |
| the extra bits read. |
| 1. Copy the L pixels (in scan-line order) from the sequence of pixels |
| prior to them by D pixels. |
| 1. if S >= 256 + 24 |
| 1. Use S - (256 + 24) as the index into the color cache. |
| 1. Get ARGB color from the color cache at that index. |
| |
| |
| 7 Overall Structure of the Format |
| --------------------------------- |
| |
| Below is a view into the format in Augmented Backus-Naur Form ([ABNF]). It does |
| not cover all details. End-of-image (EOI) is only implicitly coded into the |
| number of pixels (xsize * ysize). |
| |
| |
| #### 7.1 Basic Structure |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| format = RIFF-header image-header image-stream |
| RIFF-header = "RIFF" 4OCTET "WEBP" "VP8L" 4OCTET %x2F |
| image-header = image-size alpha-is-used version |
| image-size = 14BIT 14BIT ; width - 1, height - 1 |
| alpha-is-used = 1BIT |
| version = 3BIT ; 0 |
| image-stream = optional-transform spatially-coded-image |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| #### 7.2 Structure of Transforms |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| optional-transform = (%b1 transform optional-transform) / %b0 |
| transform = predictor-tx / color-tx / subtract-green-tx |
| transform =/ color-indexing-tx |
| |
| predictor-tx = %b00 predictor-image |
| predictor-image = 3BIT ; sub-pixel code |
| entropy-coded-image |
| |
| color-tx = %b01 color-image |
| color-image = 3BIT ; sub-pixel code |
| entropy-coded-image |
| |
| subtract-green-tx = %b10 |
| |
| color-indexing-tx = %b11 color-indexing-image |
| color-indexing-image = 8BIT ; color count |
| entropy-coded-image |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| #### 7.3 Structure of the Image Data |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| spatially-coded-image = color-cache-info meta-prefix data |
| entropy-coded-image = color-cache-info data |
| |
| color-cache-info = %b0 |
| color-cache-info =/ (%b1 4BIT) ; 1 followed by color cache size |
| |
| meta-prefix = %b0 / (%b1 entropy-image) |
| |
| data = prefix-codes lz77-coded-image |
| entropy-image = 3BIT ; subsample value |
| entropy-coded-image |
| |
| prefix-codes = prefix-code-group *prefix-codes |
| prefix-code-group = |
| 5prefix-code ; See "Interpretation of Meta Prefix Codes" to |
| ; understand what each of these five prefix |
| ; codes are for. |
| |
| prefix-code = simple-prefix-code / normal-prefix-code |
| simple-prefix-code = ; see "Simple Code Length Code" for details |
| normal-prefix-code = ; see "Normal Code Length Code" for details |
| |
| lz77-coded-image = |
| *((argb-pixel / lz77-copy / color-cache-code) lz77-coded-image) |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| A possible example sequence: |
| |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| RIFF-header image-size %b1 subtract-green-tx |
| %b1 predictor-tx %b0 color-cache-info |
| %b0 prefix-codes lz77-coded-image |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| [ABNF]: https://www.rfc-editor.org/rfc/rfc5234 |
| [canonical_huff]: https://en.wikipedia.org/wiki/Canonical_Huffman_code |