mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 18:35:41 +01:00 
			
		
		
		
	webp-container-spec: minor wording updates
Mostly grammatical and addition/subtraction of commas from the AUTH48 portion of the RFC review process. The serial comma changes are based on the Chicago Manual of Style (CMOS), 17th edition. Change-Id: Ic75abf2e53e09c8a849e28e9c40e16c127515287
This commit is contained in:
		| @@ -21,7 +21,7 @@ Introduction | |||||||
| ------------ | ------------ | ||||||
|  |  | ||||||
| WebP is an image format that uses either (i) the VP8 key frame encoding to | WebP is an image format that uses either (i) the VP8 key frame encoding to | ||||||
| compress image data in a lossy way, or (ii) the WebP lossless encoding. These | compress image data in a lossy way or (ii) the WebP lossless encoding. These | ||||||
| encoding schemes should make it more efficient than older formats such as JPEG, | encoding schemes should make it more efficient than older formats such as JPEG, | ||||||
| GIF and PNG. It is optimized for fast image transfer over the network (for | GIF and PNG. It is optimized for fast image transfer over the network (for | ||||||
| example, for websites). The WebP format has feature parity (color profile, | example, for websites). The WebP format has feature parity (color profile, | ||||||
| @@ -31,19 +31,20 @@ the structure of a WebP file. | |||||||
| The WebP container (that is, the RIFF container for WebP) allows feature support | The WebP container (that is, the RIFF container for WebP) allows feature support | ||||||
| over and above the basic use case of WebP (that is, a file containing a single | over and above the basic use case of WebP (that is, a file containing a single | ||||||
| image encoded as a VP8 key frame). The WebP container provides additional | image encoded as a VP8 key frame). The WebP container provides additional | ||||||
| support for: | support for the following: | ||||||
|  |  | ||||||
|   * **Lossless compression.** An image can be losslessly compressed, using the |   * Lossless Compression: An image can be losslessly compressed, using the | ||||||
|     WebP Lossless Format. |     WebP Lossless Format. | ||||||
|  |  | ||||||
|   * **Metadata.** An image may have metadata stored in Exif or XMP formats. |   * Metadata: An image may have metadata stored in Exchangeable Image File | ||||||
|  |     Format (Exif) or Extensible Metadata Platform (XMP) format. | ||||||
|  |  | ||||||
|   * **Transparency.** An image may have transparency, that is, an alpha channel. |   * Transparency: An image may have transparency, that is, an alpha channel. | ||||||
|  |  | ||||||
|   * **Color Profile.** An image may have an embedded ICC profile as described |   * Color Profile: An image may have an embedded ICC profile as described | ||||||
|     by the [International Color Consortium][iccspec]. |     by the [International Color Consortium][iccspec]. | ||||||
|  |  | ||||||
|   * **Animation.** An image may have multiple frames with pauses between them, |   * Animation: An image may have multiple frames with pauses between them, | ||||||
|     making it an animation. |     making it an animation. | ||||||
|  |  | ||||||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", | ||||||
| @@ -52,15 +53,15 @@ document are to be interpreted as described in BCP 14 [RFC 2119][] [RFC 8174][] | |||||||
| when, and only when, they appear in all capitals, as shown here. | when, and only when, they appear in all capitals, as shown here. | ||||||
|  |  | ||||||
| Bit numbering in chunk diagrams starts at `0` for the most significant bit | Bit numbering in chunk diagrams starts at `0` for the most significant bit | ||||||
| ('MSB 0') as described in [RFC 1166][]. | ('MSB 0'), as described in [RFC 1166][]. | ||||||
|  |  | ||||||
| Terminology & Basics | Terminology & Basics | ||||||
| -------------------- | -------------------- | ||||||
|  |  | ||||||
| A WebP file contains either a still image (that is, an encoded matrix of pixels) | A WebP file contains either a still image (that is, an encoded matrix of pixels) | ||||||
| or an [animation](#animation). Optionally, it can also contain transparency | or an [animation](#animation). Optionally, it can also contain transparency | ||||||
| information, color profile and metadata. We refer to the matrix of pixels as the | information, a color profile and metadata. We refer to the matrix of pixels as | ||||||
| _canvas_ of the image. | the _canvas_ of the image. | ||||||
|  |  | ||||||
| Below are additional terms used throughout this document: | Below are additional terms used throughout this document: | ||||||
|  |  | ||||||
| @@ -83,7 +84,7 @@ _uint32_ | |||||||
|  |  | ||||||
| _FourCC_ | _FourCC_ | ||||||
|  |  | ||||||
| : A _FourCC_ (four-character code) is a _uint32_ created by concatenating four | : A four-character code (FourCC) is a _uint32_ created by concatenating four | ||||||
|   ASCII characters in little-endian order. This means 'aaaa' (0x61616161) and |   ASCII characters in little-endian order. This means 'aaaa' (0x61616161) and | ||||||
|  'AAAA' (0x41414141) are treated as different _FourCCs_. |  'AAAA' (0x41414141) are treated as different _FourCCs_. | ||||||
|  |  | ||||||
| @@ -94,9 +95,8 @@ _1-based_ | |||||||
|  |  | ||||||
| _ChunkHeader('ABCD')_ | _ChunkHeader('ABCD')_ | ||||||
|  |  | ||||||
| : This is used to describe the _FourCC_ and _Chunk Size_ header of individual | : Used to describe the _FourCC_ and _Chunk Size_ header of individual chunks, | ||||||
|   chunks, where 'ABCD' is the FourCC for the chunk. This element's size is 8 |   where 'ABCD' is the FourCC for the chunk. This element's size is 8 bytes. | ||||||
|   bytes. |  | ||||||
|  |  | ||||||
|  |  | ||||||
| RIFF File Format | RIFF File Format | ||||||
| @@ -124,11 +124,11 @@ Chunk FourCC: 32 bits | |||||||
| Chunk Size: 32 bits (_uint32_) | Chunk Size: 32 bits (_uint32_) | ||||||
|  |  | ||||||
| : The size of the chunk in bytes, not including this field, the chunk | : The size of the chunk in bytes, not including this field, the chunk | ||||||
|   identifier or padding. |   identifier, or padding. | ||||||
|  |  | ||||||
| Chunk Payload: _Chunk Size_ bytes | Chunk Payload: _Chunk Size_ bytes | ||||||
|  |  | ||||||
| : The data payload. If _Chunk Size_ is odd, a single padding byte -- that MUST | : The data payload. If _Chunk Size_ is odd, a single padding byte -- which MUST | ||||||
|   be `0` to conform with RIFF -- is added. |   be `0` to conform with RIFF -- is added. | ||||||
|  |  | ||||||
| **Note:** RIFF has a convention that all-uppercase chunk FourCCs are standard | **Note:** RIFF has a convention that all-uppercase chunk FourCCs are standard | ||||||
| @@ -151,17 +151,17 @@ WebP File Header | |||||||
|  |  | ||||||
| 'RIFF': 32 bits | 'RIFF': 32 bits | ||||||
|  |  | ||||||
| : The ASCII characters 'R' 'I' 'F' 'F'. | : The ASCII characters 'R', 'I', 'F', 'F'. | ||||||
|  |  | ||||||
| File Size: 32 bits (_uint32_) | File Size: 32 bits (_uint32_) | ||||||
|  |  | ||||||
| : The size of the file in bytes starting at offset 8. The maximum value of | : The size of the file in bytes, starting at offset 8. The maximum value of | ||||||
|   this field is 2^32 minus 10 bytes and thus the size of the whole file is at |   this field is 2^32 minus 10 bytes and thus the size of the whole file is at | ||||||
|   most 4GiB minus 2 bytes. |   most 4 GiB minus 2 bytes. | ||||||
|  |  | ||||||
| 'WEBP': 32 bits | 'WEBP': 32 bits | ||||||
|  |  | ||||||
| : The ASCII characters 'W' 'E' 'B' 'P'. | : The ASCII characters 'W', 'E', 'B', 'P'. | ||||||
|  |  | ||||||
| A WebP file MUST begin with a RIFF header with the FourCC 'WEBP'. The file size | A WebP file MUST begin with a RIFF header with the FourCC 'WEBP'. The file size | ||||||
| in the header is the total size of the chunks that follow plus `4` bytes for | in the header is the total size of the chunks that follow plus `4` bytes for | ||||||
| @@ -206,15 +206,15 @@ VP8 data: _Chunk Size_ bytes | |||||||
|  |  | ||||||
| : VP8 bitstream data. | : VP8 bitstream data. | ||||||
|  |  | ||||||
| Note the fourth character in the 'VP8 ' FourCC is an ASCII space (0x20). | Note that the fourth character in the 'VP8 ' FourCC is an ASCII space (0x20). | ||||||
|  |  | ||||||
| The VP8 bitstream format specification can be found at [VP8 Data Format and | The VP8 bitstream format specification is described in [VP8 Data Format and | ||||||
| Decoding Guide][vp8spec]. Note that the VP8 frame header contains the VP8 frame | Decoding Guide][rfc 6386]. Note that the VP8 frame header contains the VP8 frame | ||||||
| width and height. That is assumed to be the width and height of the canvas. | width and height. That is assumed to be the width and height of the canvas. | ||||||
|  |  | ||||||
| The VP8 specification describes how to decode the image into Y'CbCr format. To | The VP8 specification describes how to decode the image into Y'CbCr format. To | ||||||
| convert to RGB, Rec. 601 SHOULD be used. Applications MAY use another | convert to RGB, [Recommendation BT.601][rec601] SHOULD be used. Applications MAY | ||||||
| conversion method, but visual results may differ among decoders. | use another conversion method, but visual results may differ among decoders. | ||||||
|  |  | ||||||
|  |  | ||||||
| Simple File Format (Lossless) | Simple File Format (Lossless) | ||||||
| @@ -326,7 +326,7 @@ Reserved (Rsv): 2 bits | |||||||
|  |  | ||||||
| ICC profile (I): 1 bit | ICC profile (I): 1 bit | ||||||
|  |  | ||||||
| : Set if the file contains an ICC profile. | : Set if the file contains an 'ICCP' Chunk. | ||||||
|  |  | ||||||
| Alpha (L): 1 bit | Alpha (L): 1 bit | ||||||
|  |  | ||||||
| @@ -396,14 +396,14 @@ Background Color: 32 bits (_uint32_) | |||||||
| : The default background color of the canvas in \[Blue, Green, Red, Alpha\] | : The default background color of the canvas in \[Blue, Green, Red, Alpha\] | ||||||
|   byte order. This color MAY be used to fill the unused space on the canvas |   byte order. This color MAY be used to fill the unused space on the canvas | ||||||
|   around the frames, as well as the transparent pixels of the first frame. |   around the frames, as well as the transparent pixels of the first frame. | ||||||
|   Background color is also used when disposal method is `1`. |   The background color is also used when the Disposal method is `1`. | ||||||
|  |  | ||||||
| **Note**: | **Note**: | ||||||
|  |  | ||||||
|   * Background color MAY contain a non-opaque alpha value, even if the _Alpha_ |   * The background color MAY contain a non-opaque alpha value, even if the | ||||||
|     flag in [VP8X chunk](#extended_header) is unset. |     _Alpha_ flag in the ['VP8X' Chunk](#extended_header) is unset. | ||||||
|  |  | ||||||
|   * Viewer applications SHOULD treat the background color value as a hint, and |   * Viewer applications SHOULD treat the background color value as a hint and | ||||||
|     are not required to use it. |     are not required to use it. | ||||||
|  |  | ||||||
|   * The canvas is cleared at the start of each loop. The background color MAY be |   * The canvas is cleared at the start of each loop. The background color MAY be | ||||||
| @@ -411,7 +411,8 @@ Background Color: 32 bits (_uint32_) | |||||||
|  |  | ||||||
| Loop Count: 16 bits (_uint16_) | Loop Count: 16 bits (_uint16_) | ||||||
|  |  | ||||||
| : The number of times to loop the animation. `0` means infinitely. | : The number of times to loop the animation. If it is `0`, this means | ||||||
|  |   infinitely. | ||||||
|  |  | ||||||
| This chunk MUST appear if the _Animation_ flag in the VP8X chunk is set. | This chunk MUST appear if the _Animation_ flag in the VP8X chunk is set. | ||||||
| If the _Animation_ flag is not set and this chunk is present, it MUST be | If the _Animation_ flag is not set and this chunk is present, it MUST be | ||||||
| @@ -459,10 +460,10 @@ Frame Height Minus One: 24 bits (_uint24_) | |||||||
|  |  | ||||||
| Frame Duration: 24 bits (_uint24_) | Frame Duration: 24 bits (_uint24_) | ||||||
|  |  | ||||||
| : The time to wait before displaying the next frame, in 1 millisecond units. | : The time to wait before displaying the next frame, in 1-millisecond units. | ||||||
|   Note the interpretation of frame duration of 0 (and often <= 10) is |   Note that the interpretation of the Frame Duration of 0 (and often <= 10) is | ||||||
|   implementation defined. Many tools and browsers assign a minimum duration |   defined by the implementation. Many tools and browsers assign a minimum | ||||||
|   similar to GIF. |   duration similar to GIF. | ||||||
|  |  | ||||||
| Reserved: 6 bits | Reserved: 6 bits | ||||||
|  |  | ||||||
| @@ -473,10 +474,10 @@ Blending method (B): 1 bit | |||||||
| : Indicates how transparent pixels of _the current frame_ are to be blended | : Indicates how transparent pixels of _the current frame_ are to be blended | ||||||
|   with corresponding pixels of the previous canvas: |   with corresponding pixels of the previous canvas: | ||||||
|  |  | ||||||
|     * `0`: Use alpha blending. After disposing of the previous frame, render the |     * `0`: Use alpha-blending. After disposing of the previous frame, render the | ||||||
|       current frame on the canvas using [alpha-blending](#alpha-blending). If |       current frame on the canvas using [alpha-blending](#alpha-blending). If | ||||||
|       the current frame does not have an alpha channel, assume alpha value of |       the current frame does not have an alpha channel, assume the alpha value | ||||||
|       255, effectively replacing the rectangle. |       is 255, effectively replacing the rectangle. | ||||||
|  |  | ||||||
|     * `1`: Do not blend. After disposing of the previous frame, render the |     * `1`: Do not blend. After disposing of the previous frame, render the | ||||||
|       current frame on the canvas by overwriting the rectangle covered by the |       current frame on the canvas by overwriting the rectangle covered by the | ||||||
| @@ -489,20 +490,20 @@ Disposal method (D): 1 bit | |||||||
|  |  | ||||||
|     * `0`: Do not dispose. Leave the canvas as is. |     * `0`: Do not dispose. Leave the canvas as is. | ||||||
|  |  | ||||||
|     * `1`: Dispose to background color. Fill the _rectangle_ on the canvas |     * `1`: Dispose to the background color. Fill the _rectangle_ on the canvas | ||||||
|       covered by the _current frame_ with background color specified in the |       covered by the _current frame_ with the background color specified in the | ||||||
|       [ANIM chunk](#anim_chunk). |       ['ANIM' Chunk](#anim_chunk). | ||||||
|  |  | ||||||
| **Notes**: | **Notes**: | ||||||
|  |  | ||||||
|   * The frame disposal only applies to the _frame rectangle_, that is, the |   * The frame disposal only applies to the _frame rectangle_, that is, the | ||||||
|     rectangle defined by _Frame X_, _Frame Y_, _frame width_ and _frame height_. |     rectangle defined by _Frame X_, _Frame Y_, _frame width_, and _frame | ||||||
|     It may or may not cover the whole canvas. |     height_. It may or may not cover the whole canvas. | ||||||
|  |  | ||||||
| {:#alpha-blending} | {:#alpha-blending} | ||||||
|   * **Alpha-blending**: |   * Alpha-blending: | ||||||
|  |  | ||||||
|     Given that each of the R, G, B and A channels is 8-bit, and the RGB |     Given that each of the R, G, B, and A channels is 8 bits, and the RGB | ||||||
|     channels are _not premultiplied_ by alpha, the formula for blending |     channels are _not premultiplied_ by alpha, the formula for blending | ||||||
|     'dst' onto 'src' is: |     'dst' onto 'src' is: | ||||||
|  |  | ||||||
| @@ -518,8 +519,8 @@ Disposal method (D): 1 bit | |||||||
|  |  | ||||||
|   * Alpha-blending SHOULD be done in linear color space, by taking into account |   * Alpha-blending SHOULD be done in linear color space, by taking into account | ||||||
|     the [color profile](#color-profile) of the image. If the color profile is |     the [color profile](#color-profile) of the image. If the color profile is | ||||||
|     not present, sRGB is to be assumed. (Note that sRGB also needs to be |     not present, standard RGB (sRGB) is to be assumed. (Note that sRGB also | ||||||
|     linearized due to a gamma of ~2.2). |     needs to be linearized due to a gamma of ~2.2.) | ||||||
|  |  | ||||||
| Frame Data: _Chunk Size_ - `16` bytes | Frame Data: _Chunk Size_ - `16` bytes | ||||||
|  |  | ||||||
| @@ -532,7 +533,7 @@ Frame Data: _Chunk Size_ - `16` bytes | |||||||
|   * An optional list of [unknown chunks](#unknown-chunks). |   * An optional list of [unknown chunks](#unknown-chunks). | ||||||
|  |  | ||||||
| **Note**: The 'ANMF' payload, _Frame Data_ above, consists of individual | **Note**: The 'ANMF' payload, _Frame Data_ above, consists of individual | ||||||
| _padded_ chunks as described by the [RIFF file format](#riff-file-format). | _padded_ chunks, as described by the [RIFF file format](#riff-file-format). | ||||||
|  |  | ||||||
| #### Alpha | #### Alpha | ||||||
|  |  | ||||||
| @@ -549,18 +550,18 @@ Reserved (Rsv): 2 bits | |||||||
|  |  | ||||||
| : MUST be `0`. Readers MUST ignore this field. | : MUST be `0`. Readers MUST ignore this field. | ||||||
|  |  | ||||||
| Pre-processing (P): 2 bits | Preprocessing (P): 2 bits | ||||||
|  |  | ||||||
| : These _informative_ bits are used to signal the pre-processing that has | : These _informative_ bits are used to signal the preprocessing that has | ||||||
|   been performed during compression. The decoder can use this information to |   been performed during compression. The decoder can use this information to | ||||||
|   for example, dither the values or smooth the gradients prior to display. |   for example, dither the values or smooth the gradients prior to display. | ||||||
|  |  | ||||||
|     * `0`: No pre-processing. |     * `0`: No preprocessing. | ||||||
|     * `1`: Level reduction. |     * `1`: Level reduction. | ||||||
|  |  | ||||||
| Filtering method (F): 2 bits | Filtering method (F): 2 bits | ||||||
|  |  | ||||||
| : The filtering method used: | : The filtering methods used are described as follows: | ||||||
|  |  | ||||||
|     * `0`: None. |     * `0`: None. | ||||||
|     * `1`: Horizontal filter. |     * `1`: Horizontal filter. | ||||||
| @@ -584,8 +585,8 @@ made depending on the filtering method: | |||||||
|  |  | ||||||
| where `clip(v)` is equal to: | where `clip(v)` is equal to: | ||||||
|  |  | ||||||
|   * 0    if v < 0 |   * 0    if v < 0, | ||||||
|   * 255  if v > 255 |   * 255  if v > 255, or | ||||||
|   * v    otherwise |   * v    otherwise | ||||||
|  |  | ||||||
| The final value is derived by adding the decompressed value `X` to the | The final value is derived by adding the decompressed value `X` to the | ||||||
| @@ -594,9 +595,10 @@ into the \[0..255\] one: | |||||||
|  |  | ||||||
| `alpha = (predictor + X) % 256` | `alpha = (predictor + X) % 256` | ||||||
|  |  | ||||||
| There are special cases for the left-most and top-most pixel positions: | There are special cases for the left-most and top-most pixel positions. For | ||||||
|  | example, the top-left value at location (0, 0) uses 0 as the predictor value. | ||||||
|  | Otherwise: | ||||||
|  |  | ||||||
|   * The top-left value at location (0, 0) uses 0 as predictor value. Otherwise, |  | ||||||
|   * For horizontal or gradient filtering methods, the left-most pixels at |   * For horizontal or gradient filtering methods, the left-most pixels at | ||||||
|     location (0, y) are predicted using the location (0, y-1) just above. |     location (0, y) are predicted using the location (0, y-1) just above. | ||||||
|   * For vertical or gradient filtering methods, the top-most pixels at |   * For vertical or gradient filtering methods, the top-most pixels at | ||||||
| @@ -622,27 +624,27 @@ containing a 'VP8L' chunk SHOULD NOT contain this chunk. | |||||||
| **Rationale**: The transparency information is already part of the 'VP8L' | **Rationale**: The transparency information is already part of the 'VP8L' | ||||||
| chunk. | chunk. | ||||||
|  |  | ||||||
| The alpha channel data is stored as uncompressed raw data (when | The alpha channel data is stored as uncompressed raw data (when the | ||||||
| compression method is '0') or compressed using the lossless format | compression method is '0') or compressed using the lossless format | ||||||
| (when the compression method is '1'). | (when the compression method is '1'). | ||||||
|  |  | ||||||
|   * Raw data: consists of a byte sequence of length width * height, |   * Raw data: This consists of a byte sequence of length = width * height, | ||||||
|     containing all the 8-bit transparency values in scan order. |     containing all the 8-bit transparency values in scan order. | ||||||
|  |  | ||||||
|   * Lossless format compression: the byte sequence is a compressed |   * Lossless format compression: The byte sequence is a compressed | ||||||
|     image-stream (as described in the [WebP Lossless Bitstream Format] |     image-stream (as described in ["WebP Lossless Bitstream Format"] | ||||||
|     [webpllspec]) of implicit dimension width x height. That is, this |     [webpllspec]) of implicit dimensions width x height. That is, this | ||||||
|     image-stream does NOT contain any headers describing the image dimension. |     image-stream does NOT contain any headers describing the image dimensions. | ||||||
|  |  | ||||||
|     **Rationale**: the dimension is already known from other sources, |     **Rationale**: The dimensions are already known from other sources, | ||||||
|     so storing it again would be redundant and error-prone. |     so storing them again would be redundant and prone to error. | ||||||
|  |  | ||||||
|     Once the image-stream is decoded into ARGB color values, following |     Once the image-stream is decoded into Alpha, Red, Green, Blue (ARGB) color | ||||||
|     the process described in the lossless format specification, the |     values, following the process described in the lossless format | ||||||
|     transparency information must be extracted from the *green* channel |     specification, the transparency information must be extracted from the | ||||||
|     of the ARGB quadruplet. |     *green* channel of the ARGB quadruplet. | ||||||
|  |  | ||||||
|     **Rationale**: the green channel is allowed extra transformation |     **Rationale**: The green channel is allowed extra transformation | ||||||
|     steps in the specification -- unlike the other channels -- that can |     steps in the specification -- unlike the other channels -- that can | ||||||
|     improve compression. |     improve compression. | ||||||
|  |  | ||||||
| @@ -650,13 +652,13 @@ compression method is '0') or compressed using the lossless format | |||||||
|  |  | ||||||
| This chunk contains compressed bitstream data for a single frame. | This chunk contains compressed bitstream data for a single frame. | ||||||
|  |  | ||||||
| A bitstream chunk may be either (i) a VP8 chunk, using "VP8 " (note the | A bitstream chunk may be either (i) a 'VP8 ' Chunk, using 'VP8 ' (note the | ||||||
| significant fourth-character space) as its tag _or_ (ii) a VP8L chunk, using | significant fourth-character space) as its FourCC, _or_ (ii) a 'VP8L' Chunk, | ||||||
| "VP8L" as its tag. | using 'VP8L' as its FourCC. | ||||||
|  |  | ||||||
| The formats of VP8 and VP8L chunks are as described in sections | The formats of 'VP8 ' and 'VP8L' Chunks are as described in sections | ||||||
| [Simple File Format (Lossy)](#simple-file-format-lossy) | [Simple File Format (Lossy)](#simple-file-format-lossy) | ||||||
| and [Simple File Format (Lossless)](#simple-file-format-lossless) respectively. | and [Simple File Format (Lossless)](#simple-file-format-lossless), respectively. | ||||||
|  |  | ||||||
| #### Color Profile | #### Color Profile | ||||||
|  |  | ||||||
| @@ -720,59 +722,59 @@ XMP Metadata: _Chunk Size_ bytes | |||||||
|  |  | ||||||
| : Image metadata in XMP format. | : Image metadata in XMP format. | ||||||
|  |  | ||||||
| Note the fourth character in the 'XMP ' FourCC is an ASCII space (0x20). | Note that the fourth character in the 'XMP ' FourCC is an ASCII space (0x20). | ||||||
|  |  | ||||||
| Additional guidance about handling metadata can be found in the | Additional guidance about handling metadata can be found in the | ||||||
| Metadata Working Group's [Guidelines for Handling Metadata][metadata]. | Metadata Working Group's ["Guidelines for Handling Metadata"][metadata]. | ||||||
|  |  | ||||||
| #### Unknown Chunks | #### Unknown Chunks | ||||||
|  |  | ||||||
| A RIFF chunk (described in [this](#terminology-amp-basics) section) whose _chunk | A RIFF chunk (described in the [RIFF File Format](#riff-file-format) section) | ||||||
| tag_ is different from any of the chunks described in this document, is | whose FourCC is different from any of the chunks described in this document, is | ||||||
| considered an _unknown chunk_. | considered an _unknown chunk_. | ||||||
|  |  | ||||||
| **Rationale**: Allowing unknown chunks gives a provision for future extension | **Rationale**: Allowing unknown chunks gives a provision for future extension | ||||||
| of the format, and also allows storage of any application-specific data. | of the format and also allows storage of any application-specific data. | ||||||
|  |  | ||||||
| A file MAY contain unknown chunks: | A file MAY contain unknown chunks: | ||||||
|  |  | ||||||
|   * At the end of the file as described in [Extended WebP file |   * at the end of the file, as described in [Extended WebP file | ||||||
|     header](#extended_header) section. |     header](#extended_header) section, or | ||||||
|   * At the end of ANMF chunks as described in the |   * at the end of 'ANMF' Chunks, as described in the | ||||||
|     [Animation](#animation) section. |     [Animation](#animation) section. | ||||||
|  |  | ||||||
| Readers SHOULD ignore these chunks. Writers SHOULD preserve them in their | Readers SHOULD ignore these chunks. Writers SHOULD preserve them in their | ||||||
| original order (unless they specifically intend to modify these chunks). | original order (unless they specifically intend to modify these chunks). | ||||||
|  |  | ||||||
| ### Assembling the Canvas From Frames | ### Canvas Assembly from Frames | ||||||
|  |  | ||||||
| Here we provide an overview of how a reader MUST assemble a canvas in the case | Here we provide an overview of how a reader MUST assemble a canvas in the case | ||||||
| of an animated image. | of an animated image. | ||||||
|  |  | ||||||
| The process begins with creating a canvas using the dimensions given in the | The process begins with creating a canvas using the dimensions given in the | ||||||
| 'VP8X' chunk, `Canvas Width Minus One + 1` pixels wide by `Canvas Height Minus | 'VP8X' Chunk, `Canvas Width Minus One + 1` pixels wide by `Canvas Height Minus | ||||||
| One + 1` pixels high. The `Loop Count` field from the 'ANIM' chunk controls how | One + 1` pixels high. The `Loop Count` field from the 'ANIM' Chunk controls how | ||||||
| many times the animation process is repeated. This is `Loop Count - 1` for | many times the animation process is repeated. This is `Loop Count - 1` for | ||||||
| non-zero `Loop Count` values or infinitely if `Loop Count` is zero. | nonzero `Loop Count` values or infinite if the `Loop Count` is zero. | ||||||
|  |  | ||||||
| At the beginning of each loop iteration the canvas is filled using the | At the beginning of each loop iteration, the canvas is filled using the | ||||||
| background color from the 'ANIM' chunk or an application defined color. | background color from the 'ANIM' Chunk or an application-defined color. | ||||||
|  |  | ||||||
| 'ANMF' chunks contain individual frames given in display order. Before rendering | 'ANMF' Chunks contain individual frames given in display order. Before rendering | ||||||
| each frame, the previous frame's `Disposal method` is applied. | each frame, the previous frame's `Disposal method` is applied. | ||||||
|  |  | ||||||
| The rendering of the decoded frame begins at the Cartesian coordinates (`2 * | The rendering of the decoded frame begins at the Cartesian coordinates (`2 * | ||||||
| Frame X`, `2 * Frame Y`) using the top-left corner of the canvas as the origin. | Frame X`, `2 * Frame Y`), using the top-left corner of the canvas as the origin. | ||||||
| `Frame Width Minus One + 1` pixels wide by `Frame Height Minus One + 1` pixels | `Frame Width Minus One + 1` pixels wide by `Frame Height Minus One + 1` pixels | ||||||
| high are rendered onto the canvas using the `Blending method`. | high are rendered onto the canvas using the `Blending method`. | ||||||
|  |  | ||||||
| The canvas is displayed for `Frame Duration` milliseconds. This continues until | The canvas is displayed for `Frame Duration` milliseconds. This continues until | ||||||
| all frames given by 'ANMF' chunks have been displayed. A new loop iteration is | all frames given by 'ANMF' Chunks have been displayed. A new loop iteration is | ||||||
| then begun or the canvas is left in its final state if all iterations have been | then begun, or the canvas is left in its final state if all iterations have been | ||||||
| completed. | completed. | ||||||
|  |  | ||||||
| The following pseudocode illustrates the rendering process. The notation | The following pseudocode illustrates the rendering process. The notation | ||||||
| _VP8X.field_ means the field in the 'VP8X' chunk with the same description. | _VP8X.field_ means the field in the 'VP8X' Chunk with the same description. | ||||||
|  |  | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| assert VP8X.flags.hasAnimation | assert VP8X.flags.hasAnimation | ||||||
| @@ -785,7 +787,7 @@ if loop_count == 0: | |||||||
| frame_params ← nil | frame_params ← nil | ||||||
| assert next chunk in image_data is ANMF | assert next chunk in image_data is ANMF | ||||||
| for loop = 0..loop_count - 1 | for loop = 0..loop_count - 1 | ||||||
|   clear canvas to ANIM.background_color or application defined color |   clear canvas to ANIM.background_color or application-defined color | ||||||
|   until eof or non-ANMF chunk |   until eof or non-ANMF chunk | ||||||
|     frame_params.frameX = Frame X |     frame_params.frameX = Frame X | ||||||
|     frame_params.frameY = Frame Y |     frame_params.frameY = Frame Y | ||||||
| @@ -805,11 +807,11 @@ for loop = 0..loop_count - 1 | |||||||
|         frame_params.bitstream = bitstream_data |         frame_params.bitstream = bitstream_data | ||||||
|     render frame with frame_params.alpha and frame_params.bitstream |     render frame with frame_params.alpha and frame_params.bitstream | ||||||
|       on canvas with top-left corner at (frame_params.frameX, |       on canvas with top-left corner at (frame_params.frameX, | ||||||
|       frame_params.frameY), using blending method |       frame_params.frameY), using Blending method | ||||||
|       frame_params.blendingMethod. |       frame_params.blendingMethod. | ||||||
|     canvas contains the decoded image. |     canvas contains the decoded image. | ||||||
|     Show the contents of the canvas for |     Show the contents of the canvas for | ||||||
|     frame_params.frameDuration * 1ms. |     frame_params.frameDuration * 1 ms. | ||||||
|     dispose_method = frame_params.disposeMethod |     dispose_method = frame_params.disposeMethod | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
| @@ -817,7 +819,7 @@ for loop = 0..loop_count - 1 | |||||||
| Example File Layouts | Example File Layouts | ||||||
| -------------------- | -------------------- | ||||||
|  |  | ||||||
| A lossy encoded image with alpha may look as follows: | A lossy-encoded image with alpha may look as follows: | ||||||
|  |  | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| RIFF/WEBP | RIFF/WEBP | ||||||
| @@ -826,7 +828,7 @@ RIFF/WEBP | |||||||
| +- VP8 (bitstream) | +- VP8 (bitstream) | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
| A losslessly encoded image may look as follows: | A lossless-encoded image may look as follows: | ||||||
|  |  | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| RIFF/WEBP | RIFF/WEBP | ||||||
| @@ -835,7 +837,7 @@ RIFF/WEBP | |||||||
| +- VP8L (lossless bitstream) | +- VP8L (lossless bitstream) | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
| A lossless image with ICC profile and XMP metadata may | A lossless image with an ICC profile and XMP metadata may | ||||||
| look as follows: | look as follows: | ||||||
|  |  | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| @@ -859,10 +861,11 @@ RIFF/WEBP | |||||||
| +- EXIF (metadata) | +- EXIF (metadata) | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  |  | ||||||
| [vp8spec]:  https://datatracker.ietf.org/doc/html/rfc6386 |  | ||||||
| [webpllspec]: https://chromium.googlesource.com/webm/libwebp/+/HEAD/doc/webp-lossless-bitstream-spec.txt | [webpllspec]: https://chromium.googlesource.com/webm/libwebp/+/HEAD/doc/webp-lossless-bitstream-spec.txt | ||||||
| [iccspec]: https://www.color.org/icc_specs2.xalter | [iccspec]: https://www.color.org/icc_specs2.xalter | ||||||
| [metadata]: https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf | [metadata]: https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf | ||||||
|  | [rec601]: https://www.itu.int/rec/R-REC-BT.601 | ||||||
| [rfc 1166]: https://datatracker.ietf.org/doc/html/rfc1166 | [rfc 1166]: https://datatracker.ietf.org/doc/html/rfc1166 | ||||||
| [rfc 2119]: https://datatracker.ietf.org/doc/html/rfc2119 | [rfc 2119]: https://datatracker.ietf.org/doc/html/rfc2119 | ||||||
|  | [rfc 6386]: https://datatracker.ietf.org/doc/html/rfc6386 | ||||||
| [rfc 8174]: https://datatracker.ietf.org/doc/html/rfc8174 | [rfc 8174]: https://datatracker.ietf.org/doc/html/rfc8174 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user