rfc9649.original   rfc9649.txt 
Network Working Group J. Zern Internet Engineering Task Force (IETF) J. Zern
Internet-Draft P. Massimino Request for Comments: 9649 P. Massimino
Intended status: Informational J. Alakuijala Category: Informational J. Alakuijala
Expires: 6 October 2024 Google LLC ISSN: 2070-1721 Google LLC
April 2024 October 2024
WebP Image Format WebP Image Format
draft-zern-webp-15
Abstract Abstract
This document defines the WebP image format and registers a media This document defines the WebP image format and registers a media
type supporting its use. type supporting its use.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This document is not an Internet Standards Track specification; it is
provisions of BCP 78 and BCP 79. published for informational purposes.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months This document is a product of the Internet Engineering Task Force
and may be updated, replaced, or obsoleted by other documents at any (IETF). It represents the consensus of the IETF community. It has
time. It is inappropriate to use Internet-Drafts as reference received public review and has been approved for publication by the
material or to cite them other than as "work in progress." Internet Engineering Steering Group (IESG). Not all documents
approved by the IESG are candidates for any level of Internet
Standard; see Section 2 of RFC 7841.
This Internet-Draft will expire on 3 October 2024. Information about the current status of this document, any errata,
and how to provide feedback on it may be obtained at
https://www.rfc-editor.org/info/rfc9649.
Copyright Notice Copyright Notice
Copyright (c) 2024 IETF Trust and the persons identified as the Copyright (c) 2024 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents
license-info) in effect on the date of publication of this document. (https://trustee.ietf.org/license-info) in effect on the date of
Please review these documents carefully, as they describe your rights publication of this document. Please review these documents
and restrictions with respect to this document. Code Components carefully, as they describe your rights and restrictions with respect
extracted from this document must include Revised BSD License text as to this document. Code Components extracted from this document must
described in Section 4.e of the Trust Legal Provisions and are include Revised BSD License text as described in Section 4.e of the
provided without warranty as described in the Revised BSD License. Trust Legal Provisions and are provided without warranty as described
in the Revised BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction
2. WebP Container Specification . . . . . . . . . . . . . . . . 3 2. WebP Container Specification
2.1. Introduction (from "WebP Container Specification") . . . 3 2.1. Introduction (from "WebP Container Specification")
2.2. Terminology & Basics . . . . . . . . . . . . . . . . . . 4 2.2. Terminology & Basics
2.3. RIFF File Format . . . . . . . . . . . . . . . . . . . . 5 2.3. RIFF File Format
2.4. WebP File Header . . . . . . . . . . . . . . . . . . . . 6 2.4. WebP File Header
2.5. Simple File Format (Lossy) . . . . . . . . . . . . . . . 6 2.5. Simple File Format (Lossy)
2.6. Simple File Format (Lossless) . . . . . . . . . . . . . . 7 2.6. Simple File Format (Lossless)
2.7. Extended File Format . . . . . . . . . . . . . . . . . . 8 2.7. Extended File Format
2.7.1. Chunks . . . . . . . . . . . . . . . . . . . . . . . 11 2.7.1. Chunks
2.7.1.1. Animation . . . . . . . . . . . . . . . . . . . . 11 2.7.1.1. Animation
2.7.1.2. Alpha . . . . . . . . . . . . . . . . . . . . . . 14 2.7.1.2. Alpha
2.7.1.3. Bitstream (VP8/VP8L) . . . . . . . . . . . . . . 17 2.7.1.3. Bitstream (VP8/VP8L)
2.7.1.4. Color Profile . . . . . . . . . . . . . . . . . . 17 2.7.1.4. Color Profile
2.7.1.5. Metadata . . . . . . . . . . . . . . . . . . . . 18 2.7.1.5. Metadata
2.7.1.6. Unknown Chunks . . . . . . . . . . . . . . . . . 19 2.7.1.6. Unknown Chunks
2.7.2. Canvas Assembly from Frames . . . . . . . . . . . . . 19 2.7.2. Canvas Assembly from Frames
2.7.3. Example File Layouts . . . . . . . . . . . . . . . . 21 2.7.3. Example File Layouts
3. Specification for WebP Lossless Bitstream . . . . . . . . . . 22 3. Specification for WebP Lossless Bitstream
3.1. Abstract (from "Specification for WebP Lossless 3.1. Abstract (from "Specification for WebP Lossless Bitstream")
Bitstream") . . . . . . . . . . . . . . . . . . . . . . . 22
3.2. Introduction (from "Specification for WebP Lossless 3.2. Introduction (from "Specification for WebP Lossless
Bitstream") . . . . . . . . . . . . . . . . . . . . . . . 23 Bitstream")
3.3. Nomenclature . . . . . . . . . . . . . . . . . . . . . . 24 3.3. Nomenclature
3.4. RIFF Header . . . . . . . . . . . . . . . . . . . . . . . 25 3.4. RIFF Header
3.5. Transforms . . . . . . . . . . . . . . . . . . . . . . . 26 3.5. Transforms
3.5.1. Predictor Transform . . . . . . . . . . . . . . . . . 27 3.5.1. Predictor Transform
3.5.2. Color Transform . . . . . . . . . . . . . . . . . . . 31 3.5.2. Color Transform
3.5.3. Subtract Green Transform . . . . . . . . . . . . . . 33 3.5.3. Subtract Green Transform
3.5.4. Color Indexing Transform . . . . . . . . . . . . . . 34 3.5.4. Color Indexing Transform
3.6. Image Data . . . . . . . . . . . . . . . . . . . . . . . 36 3.6. Image Data
3.6.1. Roles of Image Data . . . . . . . . . . . . . . . . . 36 3.6.1. Roles of Image Data
3.6.2. Encoding of Image Data . . . . . . . . . . . . . . . 36 3.6.2. Encoding of Image Data
3.6.2.1. Prefix-Coded Literals . . . . . . . . . . . . . . 37 3.6.2.1. Prefix-Coded Literals
3.6.2.2. LZ77 Backward Reference . . . . . . . . . . . . . 37 3.6.2.2. LZ77 Backward Reference
3.6.2.3. Color Cache Coding . . . . . . . . . . . . . . . 40 3.6.2.3. Color Cache Coding
3.7. Entropy Code . . . . . . . . . . . . . . . . . . . . . . 41 3.7. Entropy Code
3.7.1. Overview . . . . . . . . . . . . . . . . . . . . . . 41 3.7.1. Overview
3.7.2. Details . . . . . . . . . . . . . . . . . . . . . . . 41 3.7.2. Details
3.7.2.1. Decoding and Building the Prefix Codes . . . . . 42 3.7.2.1. Decoding and Building the Prefix Codes
3.7.2.2. Decoding of Meta Prefix Codes . . . . . . . . . . 44 3.7.2.2. Decoding of Meta Prefix Codes
3.7.2.3. Decoding Entropy-Coded Image Data . . . . . . . . 46 3.7.2.3. Decoding Entropy-Coded Image Data
3.8. Overall Structure of the Format . . . . . . . . . . . . . 47 3.8. Overall Structure of the Format
3.8.1. Basic Structure . . . . . . . . . . . . . . . . . . . 47 3.8.1. Basic Structure
3.8.2. Structure of Transforms . . . . . . . . . . . . . . . 47 3.8.2. Structure of Transforms
3.8.3. Structure of the Image Data . . . . . . . . . . . . . 47 3.8.3. Structure of the Image Data
4. Security Considerations
4. Security Considerations . . . . . . . . . . . . . . . . . . . 48 5. Interoperability Considerations
5. Interoperability Considerations . . . . . . . . . . . . . . . 49 6. IANA Considerations
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 49 6.1. The 'image/webp' Media Type
6.1. The 'image/webp' Media Type . . . . . . . . . . . . . . . 49 6.1.1. Registration Details
6.1.1. Registration Details . . . . . . . . . . . . . . . . 49 7. References
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 50 7.1. Normative References
7.1. Normative References . . . . . . . . . . . . . . . . . . 50 7.2. Informative References
7.2. Informative References . . . . . . . . . . . . . . . . . 52 Authors' Addresses
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 53
1. Introduction 1. Introduction
WebP is an image file format based on the Resource Interchange File WebP is an image file format based on the Resource Interchange File
Format (RIFF) [RIFF-spec] (Section 2) that supports lossless and Format (RIFF) [RIFF-spec] (Section 2) that supports lossless and
lossy compression as well as alpha (transparency) and animation. It lossy compression as well as alpha (transparency) and animation. It
covers use cases similar to JPEG [JPEG-spec], PNG [RFC2083], and the covers use cases similar to JPEG [JPEG-spec], PNG [RFC2083], and the
Graphics Interchange Format (GIF) [GIF-spec]. Graphics Interchange Format (GIF) [GIF-spec].
WebP consists of two compression algorithms used to reduce the size WebP consists of two compression algorithms used to reduce the size
of image pixel data, including alpha (transparency) information. of image pixel data, including alpha (transparency) information.
Lossy compression is achieved using VP8 intra-frame encoding Lossy compression is achieved using VP8 intra-frame encoding
[RFC6386]. The lossless algorithm (Section 3) stores and restores [RFC6386]. The lossless algorithm (Section 3) stores and restores
the pixel values exactly, including the color values for fully the pixel values exactly, including the color values for fully
transparent pixels. A universal algorithm for sequential data transparent pixels. A universal algorithm for sequential data
compression [LZ77], prefix coding [Huffman], and a color cache are compression [LZ77], prefix coding [Huffman], and a color cache are
used for compression of the bulk data. used for compression of the bulk data.
2. WebP Container Specification 2. WebP Container Specification
Note that this section is based on the documentation in the libwebp | Note that this section is based on the documentation in the
source repository [webp-riff-src]. | libwebp source repository [webp-riff-src].
2.1. Introduction (from "WebP Container Specification") 2.1. Introduction (from "WebP Container Specification")
WebP is an image format that uses either (i) the VP8 intra-frame WebP is an image format that uses either (i) the VP8 intra-frame
encoding [RFC6386] to compress image data in a lossy way or (ii) the encoding [RFC6386] to compress image data in a lossy way or (ii) the
WebP lossless encoding (Section 3). These encoding schemes should WebP lossless encoding (Section 3). These encoding schemes should
make it more efficient than older formats, such as JPEG, GIF, and make it more efficient than older formats, such as JPEG, GIF, and
PNG. It is optimized for fast image transfer over the network (for PNG. It is optimized for fast image transfer over the network (for
example, for websites). The WebP format has feature parity (color example, for websites). The WebP format has feature parity (color
profile, metadata, animation, etc.) with other formats as well. This profile, metadata, animation, etc.) with other formats as well. This
skipping to change at page 6, line 51 skipping to change at line 278
contents of individual chunks are described in the following contents of individual chunks are described in the following
sections. sections.
2.5. Simple File Format (Lossy) 2.5. Simple File Format (Lossy)
This layout SHOULD be used if the image requires lossy encoding and This layout SHOULD be used if the image requires lossy encoding and
does not require transparency or other advanced features provided by does not require transparency or other advanced features provided by
the extended format. Files with this layout are smaller and the extended format. Files with this layout are smaller and
supported by older software. supported by older software.
Simple WebP (lossy) file format:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |
| WebP file header (12 bytes) | | WebP file header (12 bytes) |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8 ' Chunk : : 'VP8 ' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 3: Simple WebP (Lossy) File Format Figure 3: Simple WebP (Lossy) File Format
'VP8 ' Chunk:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8 ') | | ChunkHeader('VP8 ') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8 data : : VP8 data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4: 'VP8 ' Chunk Figure 4: 'VP8 ' Chunk
VP8 data: _Chunk Size_ bytes VP8 data: _Chunk Size_ bytes
VP8 bitstream data. VP8 bitstream data.
Note that the fourth character in the 'VP8 ' FourCC is an ASCII space | Note that the fourth character in the 'VP8 ' FourCC is an ASCII
(0x20). | space (0x20).
The VP8 bitstream format specification is described in [RFC6386]. The VP8 bitstream format specification is described in [RFC6386].
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. | 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.
The VP8 specification describes how to decode the image into Y'CbCr The VP8 specification describes how to decode the image into Y'CbCr
format. To convert to RGB, Recommendation 601 [rec601] SHOULD be format. To convert to RGB, Recommendation 601 [rec601] SHOULD be
used. Applications MAY use another conversion method, but visual used. Applications MAY use another conversion method, but visual
results may differ among decoders. results may differ among decoders.
2.6. Simple File Format (Lossless) 2.6. Simple File Format (Lossless)
Note: Older readers may not support files using the lossless format. | Note: Older readers may not support files using the lossless
| format.
This layout SHOULD be used if the image requires lossless encoding This layout SHOULD be used if the image requires lossless encoding
(with an optional transparency channel) and does not require advanced (with an optional transparency channel) and does not require advanced
features provided by the extended format. features provided by the extended format.
Simple WebP (lossless) file format:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |
| WebP file header (12 bytes) | | WebP file header (12 bytes) |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: 'VP8L' Chunk : : 'VP8L' Chunk :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 5: Simple WebP (Lossless) File Format Figure 5: Simple WebP (Lossless) File Format
'VP8L' Chunk:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8L') | | ChunkHeader('VP8L') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: VP8L data : : VP8L data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 6: 'VP8L' Chunk Figure 6: 'VP8L' Chunk
VP8L data: _Chunk Size_ bytes VP8L data: _Chunk Size_ bytes
VP8L bitstream data. VP8L bitstream data.
The specification of the VP8L bitstream can be found in Section 3. The specification of the VP8L bitstream can be found in Section 3.
Note that the VP8L header contains the VP8L image width and height.
That is assumed to be the width and height of the canvas. | Note that the VP8L header contains the VP8L image width and
| height. That is assumed to be the width and height of the
| canvas.
2.7. Extended File Format 2.7. Extended File Format
Note: Older readers may not support files using the extended format. | Note: Older readers may not support files using the extended
| format.
An extended format file consists of: An extended format file consists of:
* A 'VP8X' Chunk with information about features used in the file. * A 'VP8X' Chunk with information about features used in the file.
* An optional 'ICCP' Chunk with a color profile. * An optional 'ICCP' Chunk with a color profile.
* An optional 'ANIM' Chunk with animation control data. * An optional 'ANIM' Chunk with animation control data.
* Image data. * Image data.
skipping to change at page 9, line 21 skipping to change at line 390
For a _still image_, the _image data_ consists of a single frame, For a _still image_, the _image data_ consists of a single frame,
which is made up of: which is made up of:
* An optional alpha subchunk (Section 2.7.1.2). * An optional alpha subchunk (Section 2.7.1.2).
* A bitstream subchunk (Section 2.7.1.3). * A bitstream subchunk (Section 2.7.1.3).
For an _animated image_, the _image data_ consists of multiple For an _animated image_, the _image data_ consists of multiple
frames. More details about frames can be found in Section 2.7.1.1. frames. More details about frames can be found in Section 2.7.1.1.
All chunks necessary for reconstruction and color correction, that is All chunks necessary for reconstruction and color correction, that
'VP8X', 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8 ' and 'VP8L', MUST is, 'VP8X', 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8 ', and 'VP8L', MUST
appear in the order described earlier. Readers SHOULD fail when appear in the order described earlier. Readers SHOULD fail when
chunks necessary for reconstruction and color correction are out of chunks necessary for reconstruction and color correction are out of
order. order.
Metadata (Section 2.7.1.5) and unknown (Section 2.7.1.6) chunks MAY Metadata (Section 2.7.1.5) and unknown chunks (Section 2.7.1.6) MAY
appear out of order. appear out of order.
| Rationale: The chunks necessary for reconstruction should | Rationale: The chunks necessary for reconstruction should
| appear first in the file to allow a reader to begin decoding an | appear first in the file to allow a reader to begin decoding an
| image before receiving all of the data. An application may | image before receiving all of the data. An application may
| benefit from varying the order of metadata and custom chunks to | benefit from varying the order of metadata and custom chunks to
| suit the implementation. | suit the implementation.
Extended WebP file header:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |
| WebP file header (12 bytes) | | WebP file header (12 bytes) |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('VP8X') | | ChunkHeader('VP8X') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
skipping to change at page 11, line 21 skipping to change at line 470
Future specifications may add more fields. Unknown fields MUST be Future specifications may add more fields. Unknown fields MUST be
ignored. ignored.
2.7.1. Chunks 2.7.1. Chunks
2.7.1.1. Animation 2.7.1.1. Animation
An animation is controlled by 'ANIM' and 'ANMF' Chunks. An animation is controlled by 'ANIM' and 'ANMF' Chunks.
'ANIM' Chunk:
For an animated image, this chunk contains the _global parameters_ of
the animation.
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANIM') | | ChunkHeader('ANIM') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Background Color | | Background Color |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Loop Count | | Loop Count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 8: 'ANIM' Chunk Figure 8: 'ANIM' Chunk
For an animated image, this chunk contains the _global parameters_ of
the animation.
Background Color: 32 bits (_uint32_) Background Color: 32 bits (_uint32_)
The default background color of the canvas in [Blue, Green, Red, The default background color of the canvas in [Blue, Green, Red,
Alpha] byte order. This color MAY be used to fill the unused Alpha] byte order. This color MAY be used to fill the unused
space on the canvas around the frames, as well as the transparent space on the canvas around the frames, as well as the transparent
pixels of the first frame. The background color is also used pixels of the first frame. The background color is also used
when the Disposal method is 1. when the Disposal method is 1.
Note: Notes:
* The background color MAY contain a nonopaque alpha value, even * The background color MAY contain a nonopaque alpha value, even
if the _Alpha_ flag in the 'VP8X' Chunk (Figure 7) is unset. if the _Alpha_ flag in the 'VP8X' Chunk (Figure 7) is unset.
* Viewer applications SHOULD treat the background color value as * Viewer applications SHOULD treat the background color value as
a hint and are not required to use it. a hint and are not required to use it.
* The canvas is cleared at the start of each loop. The * The canvas is cleared at the start of each loop. The
background color MAY be used to achieve this. background color MAY be used to achieve this.
Loop Count: 16 bits (_uint16_) Loop Count: 16 bits (_uint16_)
The number of times to loop the animation. If it is 0, this The number of times to loop the animation. If it is 0, this
means infinitely. means infinitely.
This chunk MUST appear if the _Animation_ flag in the 'VP8X' Chunk is 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, set. If the _Animation_ flag is not set and this chunk is present,
it MUST be ignored. it MUST be ignored.
'ANMF' Chunk:
For animated images, this chunk contains information about a _single_
frame. If the _Animation flag_ is not set, then this chunk SHOULD
NOT be present.
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ANMF') | | ChunkHeader('ANMF') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame X | ... | Frame X | ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... Frame Y | Frame Width Minus One ... ... Frame Y | Frame Width Minus One ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... | Frame Height Minus One | ... | Frame Height Minus One |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Frame Duration | Reserved |B|D| | Frame Duration | Reserved |B|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Frame Data : : Frame Data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 9: 'ANMF' Chunk Figure 9: 'ANMF' Chunk
For animated images, this chunk contains information about a _single_
frame. If the _Animation flag_ is not set, then this chunk SHOULD
NOT be present.
Frame X: 24 bits (_uint24_) Frame X: 24 bits (_uint24_)
The X coordinate of the upper left corner of the frame is Frame X The X coordinate of the upper left corner of the frame is Frame X
* 2. * 2.
Frame Y: 24 bits (_uint24_) Frame Y: 24 bits (_uint24_)
The Y coordinate of the upper left corner of the frame is Frame Y The Y coordinate of the upper left corner of the frame is Frame Y
* 2. * 2.
Frame Width Minus One: 24 bits (_uint24_) Frame Width Minus One: 24 bits (_uint24_)
The _1-based_ width of the frame. The frame width is 1 + Frame The _1-based_ width of the frame. The frame width is 1 + Frame
skipping to change at page 13, line 24 skipping to change at line 566
Reserved: 6 bits Reserved: 6 bits
MUST be 0. Readers MUST ignore this field. MUST be 0. Readers MUST ignore this field.
Blending method (B): 1 bit Blending method (B): 1 bit
Indicates how transparent pixels of _the current frame_ are to be Indicates how transparent pixels of _the current frame_ are to be
blended with corresponding pixels of the previous canvas: blended with corresponding pixels of the previous canvas:
* 0: Use alpha-blending. After disposing of the previous frame, * 0: Use alpha-blending. After disposing of the previous frame,
render the current frame on the canvas using alpha-blending render the current frame on the canvas using alpha-blending
(Section 2.7.1.1, Paragraph 10, Item 16.4.2). If the current (Section 2.7.1.1, Paragraph 8, Item 16.4.2). If the current
frame does not have an alpha channel, assume the alpha value frame does not have an alpha channel, assume the alpha value
is 255, effectively replacing the rectangle. is 255, effectively replacing the rectangle.
* 1: Do not blend. After disposing of the previous frame, * 1: Do not blend. After disposing of the previous frame,
render the current frame on the canvas by overwriting the render the current frame on the canvas by overwriting the
rectangle covered by the current frame. rectangle covered by the current frame.
Disposal method (D): 1 bit Disposal method (D): 1 bit
Indicates how _the current frame_ is to be treated after it has Indicates how _the current frame_ is to be treated after it has
been displayed (before rendering the next frame) on the canvas: been displayed (before rendering the next frame) on the canvas:
* 0: Do not dispose. Leave the canvas as is. * 0: Do not dispose. Leave the canvas as is.
* 1: Dispose to the background color. Fill the _rectangle_ on * 1: Dispose to the background color. Fill the _rectangle_ on
the canvas covered by the _current frame_ with the background the canvas covered by the _current frame_ with the background
color specified in the 'ANIM' Chunk (Section 2.7.1.1, color specified in the 'ANIM' Chunk (Figure 8).
Paragraph 2).
Notes: Notes:
* The frame disposal only applies to the _frame rectangle_, that * The frame disposal only applies to the _frame rectangle_, that
is, the rectangle defined by _Frame X_, _Frame Y_, _frame is, the rectangle defined by _Frame X_, _Frame Y_, _frame
width_, and _frame height_. It may or may not cover the whole width_, and _frame height_. It may or may not cover the whole
canvas. canvas.
* Alpha-blending: * Alpha-blending:
skipping to change at page 14, line 23 skipping to change at line 611
blend.RGB = blend.RGB =
(src.RGB * src.A + (src.RGB * src.A +
dst.RGB * dst.A * (1 - src.A / 255)) / blend.A dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
* Alpha-blending SHOULD be done in linear color space by taking * Alpha-blending SHOULD be done in linear color space by taking
into account the color profile (Section 2.7.1.4) of the image. into account the color profile (Section 2.7.1.4) of the image.
If the color profile is not present, standard RGB (sRGB) is to If the color profile is not present, standard RGB (sRGB) is to
be assumed. (Note that sRGB also needs to be linearized due be assumed. (Note that sRGB also needs to be linearized due
to a gamma of ~2.2.) to a gamma of ~2.2.)
Frame Data: _Chunk Size_ - 16 bytes Frame Data: _Chunk Size_ bytes - 16
Consists of: Consists of:
* An optional alpha subchunk (Section 2.7.1.2) for the frame. * An optional alpha subchunk (Section 2.7.1.2) for the frame.
* A bitstream subchunk (Section 2.7.1.3) for the frame. * A bitstream subchunk (Section 2.7.1.3) for the frame.
* An optional list of unknown chunks (Section 2.7.1.6). * An optional list of unknown chunks (Section 2.7.1.6).
Note: The 'ANMF' payload, _Frame Data_, consists of individual | Note: The 'ANMF' payload, _Frame Data_, consists of individual
_padded_ chunks, as described by the RIFF file format (Section 2.3). | _padded_ chunks, as described by the RIFF file format
| (Section 2.3).
2.7.1.2. Alpha 2.7.1.2. Alpha
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('ALPH') | | ChunkHeader('ALPH') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv| P | F | C | Alpha Bitstream... | |Rsv| P | F | C | Alpha Bitstream... |
skipping to change at page 15, line 35 skipping to change at line 672
* 3: Gradient filter. * 3: Gradient filter.
For each pixel, filtering is performed using the following For each pixel, filtering is performed using the following
calculations. Assume the alpha values surrounding the current X calculations. Assume the alpha values surrounding the current X
position are labeled as: position are labeled as:
C | B | C | B |
---+---+ ---+---+
A | X | A | X |
Figure 11 Figure 11: Pixels Used in Alpha Filtering
We seek to compute the alpha value at position X. First, a We seek to compute the alpha value at position X. First, a
prediction is made depending on the filtering method: prediction is made depending on the filtering method:
* Method 0: predictor = 0 * Method 0: predictor = 0
* Method 1: predictor = A * Method 1: predictor = A
* Method 2: predictor = B * Method 2: predictor = B
skipping to change at page 16, line 35 skipping to change at line 720
pixels at location (x, 0) are predicted using the location pixels at location (x, 0) are predicted using the location
(x-1, 0) on the left. (x-1, 0) on the left.
Compression method (C): 2 bits Compression method (C): 2 bits
The compression method used: The compression method used:
* 0: No compression. * 0: No compression.
* 1: Compressed using the WebP lossless format. * 1: Compressed using the WebP lossless format.
Alpha bitstream: _Chunk Size_ - 1 bytes Alpha bitstream: _Chunk Size_ bytes - 1
Encoded alpha bitstream. Encoded alpha bitstream.
This optional chunk contains encoded alpha data for this frame. A This optional chunk contains encoded alpha data for this frame. A
frame containing a 'VP8L' Chunk SHOULD NOT contain this chunk. frame containing a 'VP8L' Chunk SHOULD NOT contain this chunk.
| Rationale: The transparency information is already part of the | Rationale: The transparency information is already part of the
| 'VP8L' Chunk. | 'VP8L' Chunk.
The alpha channel data is stored as uncompressed raw data (when the 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
skipping to change at page 17, line 10 skipping to change at line 742
* Raw data: This consists of a byte sequence of length = width * * Raw data: This consists of a byte sequence of length = width *
height, containing all the 8-bit transparency values in scan height, containing all the 8-bit transparency values in scan
order. order.
* Lossless format compression: The byte sequence is a compressed * Lossless format compression: The byte sequence is a compressed
image-stream (as described in Section 3) of implicit dimensions image-stream (as described in Section 3) of implicit dimensions
width x height. That is, this image-stream does NOT contain any width x height. That is, this image-stream does NOT contain any
headers describing the image dimensions. headers describing the image dimensions.
Rationale: The dimensions are already known from other sources, so | Rationale: The dimensions are already known from other sources,
storing them again would be redundant and prone to errors. | so storing them again would be redundant and prone to errors.
Once the image-stream is decoded into Alpha, Red, Green, Blue Once the image-stream is decoded into Alpha, Red, Green, Blue
(ARGB) color values, following the process described in the (ARGB) color values, following the process described in the
lossless format specification, the transparency information must lossless format specification, the transparency information must
be extracted from the green channel of the ARGB quadruplet. be extracted from the green channel of the ARGB quadruplet.
Rationale: The green channel is allowed extra transformation steps | Rationale: The green channel is allowed extra transformation
in the specification -- unlike the other channels -- that can | steps in the specification -- unlike the other channels -- that
improve compression. | can improve compression.
2.7.1.3. Bitstream (VP8/VP8L) 2.7.1.3. Bitstream (VP8/VP8L)
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 ' A bitstream chunk may be either (i) a 'VP8 ' Chunk, using 'VP8 '
(note the significant fourth-character space) as its FourCC, _or_ (note the significant fourth-character space) as its FourCC, _or_
(ii) a 'VP8L' Chunk, using 'VP8L' as its FourCC. (ii) a 'VP8L' Chunk, 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
skipping to change at page 18, line 21 skipping to change at line 799
2.7.1.5. Metadata 2.7.1.5. Metadata
Metadata can be stored in 'EXIF' or 'XMP ' Chunks. Metadata can be stored in 'EXIF' or 'XMP ' Chunks.
There SHOULD be at most one chunk of each type ('EXIF' and 'XMP '). There SHOULD be at most one chunk of each type ('EXIF' and 'XMP ').
If there are more such chunks, readers MAY ignore all except the If there are more such chunks, readers MAY ignore all except the
first one. first one.
The chunks are defined as follows: The chunks are defined as follows:
'EXIF' Chunk:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('EXIF') | | ChunkHeader('EXIF') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Exif Metadata : : Exif Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 13: 'EXIF' Chunk Figure 13: 'EXIF' Chunk
Exif Metadata: _Chunk Size_ bytes Exif Metadata: _Chunk Size_ bytes
Image metadata in [Exif] format. Image metadata in [Exif] format.
'XMP ' Chunk:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ChunkHeader('XMP ') | | ChunkHeader('XMP ') |
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: XMP Metadata : : XMP Metadata :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 14: 'XMP ' Chunk Figure 14: 'XMP ' Chunk
XMP Metadata: _Chunk Size_ bytes XMP Metadata: _Chunk Size_ bytes
Image metadata in [XMP] format. Image metadata in [XMP] format.
Note that the fourth character in the 'XMP ' FourCC is an ASCII space | Note that the fourth character in the 'XMP ' FourCC is an ASCII
(0x20). | 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 Image Metadata" Metadata Working Group's "Guidelines For Handling Image Metadata"
[MWG]. [MWG].
2.7.1.6. Unknown Chunks 2.7.1.6. Unknown Chunks
A RIFF chunk (described in Section 2.3) whose _FourCC_ is different A RIFF chunk (described in Section 2.3) whose _FourCC_ is different
from any of the chunks described in this section is considered an from any of the chunks described in this section is considered an
_unknown chunk_. _unknown chunk_.
skipping to change at page 21, line 7 skipping to change at line 891
continues until all frames given by 'ANMF' Chunks have been continues until all frames given by 'ANMF' Chunks have been
displayed. A new loop iteration is then begun, or the canvas is left displayed. A new loop iteration is then begun, or the canvas is left
in its final state if all iterations have been completed. in its final state if all iterations have been completed.
The following pseudocode illustrates the rendering process. The The following pseudocode illustrates the rendering process. The
notation _VP8X.field_ means the field in the 'VP8X' Chunk with the notation _VP8X.field_ means the field in the 'VP8X' Chunk with the
same description. same description.
VP8X.flags.hasAnimation MUST be TRUE VP8X.flags.hasAnimation MUST be TRUE
canvas <- new image of size VP8X.canvasWidth x VP8X.canvasHeight with canvas <- new image of size VP8X.canvasWidth x VP8X.canvasHeight with
background color ANIM.background_color. background color ANIM.background_color or
application-defined color.
loop_count <- ANIM.loopCount loop_count <- ANIM.loopCount
dispose_method <- Dispose to background color dispose_method <- Dispose to background color
if loop_count == 0: if loop_count == 0:
loop_count = inf loop_count = inf
frame_params <- nil frame_params <- nil
next chunk in image_data is ANMF MUST be TRUE next chunk in image_data is ANMF MUST be TRUE
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
skipping to change at page 21, line 35 skipping to change at line 920
VP8X.canvasHeight >= frame_bottom MUST be TRUE VP8X.canvasHeight >= frame_bottom MUST be TRUE
for subchunk in 'Frame Data': for subchunk in 'Frame Data':
if subchunk.tag == "ALPH": if subchunk.tag == "ALPH":
alpha subchunks not found in 'Frame Data' earlier MUST be alpha subchunks not found in 'Frame Data' earlier MUST be
TRUE TRUE
frame_params.alpha = alpha_data frame_params.alpha = alpha_data
else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L": else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
bitstream subchunks not found in 'Frame Data' earlier MUST bitstream subchunks not found in 'Frame Data' earlier MUST
be TRUE be TRUE
frame_params.bitstream = bitstream_data frame_params.bitstream = bitstream_data
apply dispose_method.
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 * 1 ms. frame_params.frameDuration * 1 ms.
dispose_method = frame_params.disposeMethod dispose_method = frame_params.disposeMethod
2.7.3. Example File Layouts 2.7.3. Example File Layouts
skipping to change at page 22, line 41 skipping to change at line 976
+- ANMF (frame1 parameters + data) +- ANMF (frame1 parameters + data)
+- ANMF (frame2 parameters + data) +- ANMF (frame2 parameters + data)
+- ANMF (frame3 parameters + data) +- ANMF (frame3 parameters + data)
+- ANMF (frame4 parameters + data) +- ANMF (frame4 parameters + data)
+- EXIF (metadata) +- EXIF (metadata)
Figure 18: An Animated Image with Exif Metadata Figure 18: An Animated Image with Exif Metadata
3. Specification for WebP Lossless Bitstream 3. Specification for WebP Lossless Bitstream
Note that this section is based on the documentation in the libwebp | Note that this section is based on the documentation in the
source repository [webp-lossless-src]. | libwebp source repository [webp-lossless-src].
3.1. Abstract (from "Specification for WebP Lossless Bitstream") 3.1. Abstract (from "Specification for WebP Lossless Bitstream")
WebP lossless is an image format for lossless compression of ARGB WebP lossless is an image format for lossless compression of ARGB
images. The lossless format stores and restores the pixel values images. The lossless format stores and restores the pixel values
exactly, including the color values for pixels whose alpha value is exactly, including the color values for pixels whose alpha value is
0. The format uses subresolution images, recursively embedded into 0. The format uses subresolution images, recursively embedded into
the format itself, for storing statistical data about the images, the format itself, for storing statistical data about the images,
such as the used entropy codes, spatial predictors, color space such as the used entropy codes, spatial predictors, color space
conversion, and color table. A universal algorithm for sequential conversion, and color table. A universal algorithm for sequential
skipping to change at page 26, line 50 skipping to change at line 1173
+==========================+=====+ +==========================+=====+
| PREDICTOR_TRANSFORM | 0 | | PREDICTOR_TRANSFORM | 0 |
+--------------------------+-----+ +--------------------------+-----+
| COLOR_TRANSFORM | 1 | | COLOR_TRANSFORM | 1 |
+--------------------------+-----+ +--------------------------+-----+
| SUBTRACT_GREEN_TRANSFORM | 2 | | SUBTRACT_GREEN_TRANSFORM | 2 |
+--------------------------+-----+ +--------------------------+-----+
| COLOR_INDEXING_TRANSFORM | 3 | | COLOR_INDEXING_TRANSFORM | 3 |
+--------------------------+-----+ +--------------------------+-----+
Table 1 Table 1: Transform Types
The transform type is followed by the transform data. Transform data The transform type is followed by the transform data. Transform data
contains the information required to apply the inverse transform and contains the information required to apply the inverse transform and
depends on the transform type. The inverse transforms are applied in depends on the transform type. The inverse transforms are applied in
the reverse order that they are read from the bitstream, that is, the reverse order that they are read from the bitstream, that is,
last one first. last one first.
Next, we describe the transform data for different types. Next, we describe the transform data for different types.
3.5.1. Predictor Transform 3.5.1. Predictor Transform
skipping to change at page 28, line 15 skipping to change at line 1232
We chose the neighboring pixels (TL, T, TR, and L) of the current We chose the neighboring pixels (TL, T, TR, and L) of the current
pixel (P) as follows: 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 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 TL T TR O O O O
O O O O L P X X X X X 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
X X X X X X X X X X X X X X X X X X X X X X
Figure 19 Figure 19: Neighboring Pixels of the Current Pixel (P)
where TL means top-left, T means top, TR means top-right, and L means where TL means top-left, T means top, TR means top-right, and L means
left. At the time of predicting a value for P, all O, TL, T, TR, and left. At the time of predicting a value for P, all O, TL, T, TR, and
L pixels have already been processed, and the P pixel and all X L pixels have already been processed, and the P pixel and all X
pixels are unknown. pixels are unknown.
Given the preceding neighboring pixels, the different prediction Given the preceding neighboring pixels, the different prediction
modes are defined as follows. modes are defined as follows.
+======+======================================================+ +======+======================================================+
skipping to change at page 29, line 37 skipping to change at line 1274
+------+------------------------------------------------------+ +------+------------------------------------------------------+
| 10 | Average2(Average2(L, TL), Average2(T, TR)) | | 10 | Average2(Average2(L, TL), Average2(T, TR)) |
+------+------------------------------------------------------+ +------+------------------------------------------------------+
| 11 | Select(L, T, TL) | | 11 | Select(L, T, TL) |
+------+------------------------------------------------------+ +------+------------------------------------------------------+
| 12 | ClampAddSubtractFull(L, T, TL) | | 12 | ClampAddSubtractFull(L, T, TL) |
+------+------------------------------------------------------+ +------+------------------------------------------------------+
| 13 | ClampAddSubtractHalf(Average2(L, T), TL) | | 13 | ClampAddSubtractHalf(Average2(L, T), TL) |
+------+------------------------------------------------------+ +------+------------------------------------------------------+
Table 2 Table 2: Prediction Modes
Average2 is defined as follows for each ARGB component: Average2 is defined as follows for each ARGB component:
uint8 Average2(uint8 a, uint8 b) { uint8 Average2(uint8 a, uint8 b) {
return (a + b) / 2; return (a + b) / 2;
} }
The Select predictor is defined as follows: The Select predictor is defined as follows:
uint32 Select(uint32 L, uint32 T, uint32 TL) { uint32 Select(uint32 L, uint32 T, uint32 TL) {
skipping to change at page 30, line 45 skipping to change at line 1324
int ClampAddSubtractFull(int a, int b, int c) { int ClampAddSubtractFull(int a, int b, int c) {
return Clamp(a + b - c); return Clamp(a + b - c);
} }
int ClampAddSubtractHalf(int a, int b) { int ClampAddSubtractHalf(int a, int b) {
return Clamp(a + (a - b) / 2); return Clamp(a + (a - b) / 2);
} }
There are special handling rules for some border pixels. If there is There are special handling rules for some border pixels. If there is
a prediction transform, regardless of the mode [0..13] for these a predictor transform, regardless of the mode [0..13] for these
pixels, the predicted value for the left-topmost pixel of the image pixels, the predicted value for the left-topmost pixel of the image
is 0xff000000, all pixels on the top row are L-pixel, and all pixels is 0xff000000, all pixels on the top row are L-pixel, and all pixels
on the leftmost column are T-pixel. on the leftmost column are T-pixel.
Addressing the TR-pixel for pixels on the rightmost column is Addressing the TR-pixel for pixels on the rightmost column is
exceptional. The pixels on the rightmost column are predicted by exceptional. The pixels on the rightmost column are predicted by
using the modes [0..13], just like pixels not on the border, but the 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 leftmost pixel on the same row as the current pixel is instead used
as the TR-pixel. as the TR-pixel.
skipping to change at page 32, line 38 skipping to change at line 1408
A conversion from the 8-bit unsigned representation (uint8) to the A conversion from the 8-bit unsigned representation (uint8) to the
8-bit signed one (int8) is required before calling 8-bit signed one (int8) is required before calling
ColorTransformDelta(). The signed value should be interpreted as an ColorTransformDelta(). The signed value should be interpreted as an
8-bit two's complement number (that is: uint8 range [128..255] is 8-bit two's complement number (that is: uint8 range [128..255] is
mapped to the [-128..-1] range of its converted int8 value). mapped to the [-128..-1] range of its converted int8 value).
The multiplication is to be done using more precision (with at least The multiplication is to be done using more precision (with at least
16-bit precision). The sign extension property of the shift 16-bit precision). The sign extension property of the shift
operation does not matter here; only the lowest 8 bits are used from operation does not matter here; only the lowest 8 bits are used from
the result, and there the sign extension shifting and unsigned the result, and in these bits, the sign extension shifting and
shifting are consistent with each other. unsigned shifting are consistent with each other.
Now, we describe the contents of color transform data so that Now, we describe the contents of color transform data so that
decoding can apply the inverse color transform and recover the decoding can apply the inverse color transform and recover the
original red and blue values. The first 3 bits of the color original red and blue values. The first 3 bits of the color
transform data contain the width and height of the image block in transform data contain the width and height of the image block in
number of bits, just like the predictor transform: number of bits, just like the predictor transform:
int size_bits = ReadBits(3) + 2; int size_bits = ReadBits(3) + 2;
int block_width = 1 << size_bits; int block_width = 1 << size_bits;
int block_height = 1 << size_bits; int block_height = 1 << size_bits;
skipping to change at page 35, line 29 skipping to change at line 1539
+==================+==================+ +==================+==================+
| 1..2 | 3 | | 1..2 | 3 |
+------------------+------------------+ +------------------+------------------+
| 3..4 | 2 | | 3..4 | 2 |
+------------------+------------------+ +------------------+------------------+
| 5..16 | 1 | | 5..16 | 1 |
+------------------+------------------+ +------------------+------------------+
| 17..256 | 0 | | 17..256 | 0 |
+------------------+------------------+ +------------------+------------------+
Table 3 Table 3: Color Table Size to
Bundled Pixel Bit Width Mapping
width_bits has a value of 0, 1, 2, or 3. A value of 0 indicates no 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 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]. 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 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 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 combined, and each pixel has a range of [0..1], that is, a binary
value. value.
The values are packed into the green component as follows: The values are packed into the green component as follows:
skipping to change at page 36, line 37 skipping to change at line 1594
2. Entropy image: Stores the meta prefix codes (see "Decoding of 2. Entropy image: Stores the meta prefix codes (see "Decoding of
Meta Prefix Codes" (Section 3.7.2.2)). Meta Prefix Codes" (Section 3.7.2.2)).
3. Predictor image: Stores the metadata for the predictor transform 3. Predictor image: Stores the metadata for the predictor transform
(see "Predictor Transform" (Section 3.5.1)). (see "Predictor Transform" (Section 3.5.1)).
4. Color transform image: Created by ColorTransformElement values 4. Color transform image: Created by ColorTransformElement values
(defined in "Color Transform" (Section 3.5.2)) for different (defined in "Color Transform" (Section 3.5.2)) for different
blocks of the image. blocks of the image.
5. Color indexing image: An array of size color_table_size (up to 5. Color indexing image: An array of the size of color_table_size
256 ARGB values) storing the metadata for the color indexing (up to 256 ARGB values) that stores the metadata for the color
transform (see "Color Indexing Transform" (Section 3.5.4)). indexing transform (see "Color Indexing Transform"
(Section 3.5.4)).
3.6.2. Encoding of Image Data 3.6.2. Encoding of Image Data
The encoding of image data is independent of its role. The encoding of image data is independent of its role.
The image is first divided into a set of fixed-size blocks (typically The image is first divided into a set of fixed-size blocks (typically
16x16 blocks). Each of these blocks are modeled using their own 16x16 blocks). Each of these blocks are modeled using their own
entropy codes. Also, several blocks may share the same entropy entropy codes. Also, several blocks may share the same entropy
codes. codes.
skipping to change at page 38, line 5 skipping to change at line 1660
an entropy code). an entropy code).
| Rationale: This approach reduces the storage requirement for | Rationale: This approach reduces the storage requirement for
| the entropy code. Also, large values are usually rare, so | the entropy code. Also, large values are usually rare, so
| extra bits would be used for very few values in the image. | extra bits would be used for very few values in the image.
| Thus, this approach results in better compression overall. | Thus, this approach results in better compression overall.
The following table denotes the prefix codes and extra bits used for The following table denotes the prefix codes and extra bits used for
storing different ranges of values. storing different ranges of values.
Note: The maximum backward reference length is limited to 4096. | Note: The maximum backward reference length is limited to 4096.
Hence, only the first 24 prefix codes (with the respective extra | Hence, only the first 24 prefix codes (with the respective
bits) are meaningful for length values. For distance values, | extra bits) are meaningful for length values. For distance
however, all the 40 prefix codes are valid. | values, however, all the 40 prefix codes are valid.
+=================+=============+============+ +=================+=============+============+
| Value Range | Prefix Code | Extra Bits | | Value Range | Prefix Code | Extra Bits |
+=================+=============+============+ +=================+=============+============+
| 1 | 0 | 0 | | 1 | 0 | 0 |
+-----------------+-------------+------------+ +-----------------+-------------+------------+
| 2 | 1 | 0 | | 2 | 1 | 0 |
+-----------------+-------------+------------+ +-----------------+-------------+------------+
| 3 | 2 | 0 | | 3 | 2 | 0 |
+-----------------+-------------+------------+ +-----------------+-------------+------------+
skipping to change at page 38, line 40 skipping to change at line 1695
+-----------------+-------------+------------+ +-----------------+-------------+------------+
| 3072..4096 | 23 | 10 | | 3072..4096 | 23 | 10 |
+-----------------+-------------+------------+ +-----------------+-------------+------------+
| ... | ... | ... | | ... | ... | ... |
+-----------------+-------------+------------+ +-----------------+-------------+------------+
| 524289..786432 | 38 | 18 | | 524289..786432 | 38 | 18 |
+-----------------+-------------+------------+ +-----------------+-------------+------------+
| 786433..1048576 | 39 | 18 | | 786433..1048576 | 39 | 18 |
+-----------------+-------------+------------+ +-----------------+-------------+------------+
Table 4 Table 4: Value to Prefix Code and Extra
Bits Mapping
The pseudocode to obtain a (length or distance) value from the prefix The pseudocode to obtain a (length or distance) value from the prefix
code is as follows: code is as follows:
if (prefix_code < 4) { if (prefix_code < 4) {
return prefix_code + 1; return prefix_code + 1;
} }
int extra_bits = (prefix_code - 2) >> 1; int extra_bits = (prefix_code - 2) >> 1;
int offset = (2 + (prefix_code & 1)) << extra_bits; int offset = (2 + (prefix_code & 1)) << extra_bits;
return offset + ReadBits(extra_bits) + 1; return offset + ReadBits(extra_bits) + 1;
skipping to change at page 39, line 48 skipping to change at line 1751
(-6, 2), (4, 5), (-4, 5), (5, 4), (-5, 4), (3, 6), (-3, 6), (-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), (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), (-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), (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), (-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), (-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), (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), (-6, 7), (7, 6), (-7, 6), (8, 5), (7, 7), (-7, 7), (8, 6),
(8, 7) (8, 7)
Figure 20 Figure 20: Distance Code to Neighboring Pixel Offset Mapping
For example, the distance code 1 indicates an offset of (0, 1) for 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 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 pixel difference in the X direction and 1 pixel difference in the Y
direction). Similarly, the distance code 3 indicates the top-left direction). Similarly, the distance code 3 indicates the top-left
pixel. pixel.
The decoder can convert a distance code distance_code to a scan-line The decoder can convert a distance code distance_code to a scan-line
order distance dist as follows: order distance dist as follows:
skipping to change at page 43, line 5 skipping to change at line 1895
symbol0 = ReadBits(1 + 7 * is_first_8bits); symbol0 = ReadBits(1 + 7 * is_first_8bits);
code_lengths[symbol0] = 1; code_lengths[symbol0] = 1;
if (num_symbols == 2) { if (num_symbols == 2) {
symbol1 = ReadBits(8); symbol1 = ReadBits(8);
code_lengths[symbol1] = 1; code_lengths[symbol1] = 1;
} }
| The two symbols should be different. Duplicate symbols are | The two symbols should be different. Duplicate symbols are
| allowed, but inefficient. | allowed, but inefficient.
Note: Another special case is when _all_ prefix code lengths are | Note: Another special case is when _all_ prefix code lengths
_zeros_ (an empty prefix code). For example, a prefix code for | are _zeros_ (an empty prefix code). For example, a prefix code
distance can be empty if there are no backward references. | for distance can be empty if there are no backward references.
Similarly, prefix codes for alpha, red, and blue can be empty if all | Similarly, prefix codes for alpha, red, and blue can be empty
pixels within the same meta prefix code are produced using the color | if all pixels within the same meta prefix code are produced
cache. However, this case doesn't need special handling, as empty | using the color cache. However, this case doesn't need special
prefix codes can be coded as those containing a single symbol 0. | handling, as empty prefix codes can be coded as those
| containing a single symbol 0.
3.7.2.1.2. Normal Code Length Code 3.7.2.1.2. Normal Code Length Code
The code lengths of the prefix code fit in 8 bits and are read as 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 follows. First, num_code_lengths specifies the number of code
lengths. lengths.
int num_code_lengths = 4 + ReadBits(4); int num_code_lengths = 4 + ReadBits(4);
The code lengths are themselves encoded using prefix codes; lower- The code lengths are themselves encoded using prefix codes; lower-
skipping to change at page 46, line 15 skipping to change at line 2046
The decoder then uses prefix code group prefix_group to decode the The decoder then uses prefix code group prefix_group to decode the
pixel (x, y), as explained in Section 3.7.2.3. pixel (x, y), as explained in Section 3.7.2.3.
3.7.2.3. Decoding Entropy-Coded Image Data 3.7.2.3. Decoding Entropy-Coded Image Data
For the current position (x, y) in the image, the decoder first For the current position (x, y) in the image, the decoder first
identifies the corresponding prefix code group (as explained in the identifies the corresponding prefix code group (as explained in the
last section). Given the prefix code group, the pixel is read and last section). Given the prefix code group, the pixel is read and
decoded as follows. decoded as follows.
Next, read symbol S from the bitstream using prefix code #1. Note Next, read symbol S from the bitstream using prefix code #1.
that S is any integer in the range 0 to (256 + 24 + color_cache_size
(Section 3.6.2.3)- 1). | Note that S is any integer in the range 0 to (256 + 24 +
| color_cache_size - 1). See Section 3.6.2.3 for details about
| color_cache_size.
The interpretation of S depends on its value: The interpretation of S depends on its value:
1. If S < 256 1. If S < 256
i. Use S as the green component. i. Use S as the green component.
ii. Read red from the bitstream using prefix code #2. ii. Read red from the bitstream using prefix code #2.
iii. Read blue from the bitstream using prefix code #3. iii. Read blue from the bitstream using prefix code #3.
skipping to change at page 47, line 4 skipping to change at line 2085
v. Read extra bits for the distance from the bitstream. v. Read extra bits for the distance from the bitstream.
vi. Determine backward-reference distance D from the distance vi. Determine backward-reference distance D from the distance
prefix code and the extra bits read. prefix code and the extra bits read.
vii. Copy L pixels (in scan-line order) from the sequence of vii. Copy L pixels (in scan-line order) from the sequence of
pixels starting at the current position minus D pixels. pixels starting at the current position minus D pixels.
3. If S >= 256 + 24 3. If S >= 256 + 24
i. Use S - (256 + 24) as the index into the color cache. i. Use S - (256 + 24) as the index into the color cache.
ii. Get ARGB color from the color cache at that index. ii. Get ARGB color from the color cache at that index.
3.8. Overall Structure of the Format 3.8. Overall Structure of the Format
Below is a view into the format in Augmented Backus-Naur Form Below is a view into the format in Augmented Backus-Naur Form
[RFC5234] [RFC7405]. It does not cover all details. The end-of- [RFC5234] [RFC7405]. It does not cover all details. The end-of-
image (EOI) is only implicitly coded into the number of pixels image (EOI) is only implicitly coded into the number of pixels
(image_width * image_height). (image_width * image_height).
Note that *element means element can be repeated 0 or more times. | Note that *element means element can be repeated 0 or more
5element means element is repeated exactly 5 times. %b represents a | times. 5element means element is repeated exactly 5 times. %b
binary value. | represents a binary value.
3.8.1. Basic Structure 3.8.1. Basic Structure
format = RIFF-header image-header image-stream format = RIFF-header image-header image-stream
RIFF-header = %s"RIFF" 4OCTET %s"WEBPVP8L" 4OCTET RIFF-header = %s"RIFF" 4OCTET %s"WEBPVP8L" 4OCTET
image-header = %x2F image-size alpha-is-used version image-header = %x2F image-size alpha-is-used version
image-size = 14BIT 14BIT ; width - 1, height - 1 image-size = 14BIT 14BIT ; width - 1, height - 1
alpha-is-used = 1BIT alpha-is-used = 1BIT
version = 3BIT ; 0 version = 3BIT ; 0
image-stream = optional-transform spatially-coded-image image-stream = optional-transform spatially-coded-image
skipping to change at page 48, line 49 skipping to change at line 2178
uninitialized data usage, null pointer dereferences, resource (disk uninitialized data usage, null pointer dereferences, resource (disk
or memory) exhaustion, and extended resource usage (long running or memory) exhaustion, and extended resource usage (long running
time) as part of the demuxing and decoding process. In particular, time) as part of the demuxing and decoding process. In particular,
implementations reading this format are likely to take input from implementations reading this format are likely to take input from
unknown and possibly unsafe sources -- both clients (for example, web unknown and possibly unsafe sources -- both clients (for example, web
browsers or email clients) and servers (for example, applications browsers or email clients) and servers (for example, applications
that accept uploaded images). These may result in arbitrary code that accept uploaded images). These may result in arbitrary code
execution, information leakage (memory layout and contents), or execution, information leakage (memory layout and contents), or
crashes and thereby allow a device to be compromised or cause a crashes and thereby allow a device to be compromised or cause a
denial of service to an application using the format denial of service to an application using the format
[cve.mitre.org-libwebp] [crbug-security]. [cve.mitre.org-libwebp] [issues-security].
The format does not employ "active content" but does allow metadata The format does not employ "active content" but does allow metadata
(for example, [XMP] and [Exif]) and custom chunks to be embedded in a (for example, [XMP] and [Exif]) and custom chunks to be embedded in a
file. Applications that interpret these chunks may be subject to file. Applications that interpret these chunks may be subject to
security considerations for those formats. security considerations for those formats.
5. Interoperability Considerations 5. Interoperability Considerations
The format is defined using little-endian byte ordering (see The format is defined using little-endian byte ordering (see
Section 3.1 of [RFC2781]), but demuxing and decoding are possible on Section 3.1 of [RFC2781]), but demuxing and decoding are possible on
platforms using a different ordering with the appropriate conversion. platforms using a different ordering with the appropriate conversion.
The container is based on RIFF and allows extension via user-defined The container is based on RIFF and allows extension via user-defined
chunks, but nothing beyond the chunks defined by the container format chunks, but nothing beyond the chunks defined by the container format
(Section 2) are required for decoding of the image. These have been (Section 2) are required for decoding of the image. These have been
finalized but were extended in the format's early stages, so some finalized, but they were extended in the format's early stages, so
older readers may not support lossless or animated image decoding. some older readers may not support lossless or animated image
decoding.
6. IANA Considerations 6. IANA Considerations
IANA has registered the 'image/webp' media type [RFC2046]. IANA has registered the 'image/webp' media type [RFC2046].
6.1. The 'image/webp' Media Type 6.1. The 'image/webp' Media Type
This section contains the media type registration details per This section contains the media type registration details per
[RFC6838]. [RFC6838].
6.1.1. Registration Details 6.1.1. Registration Details
*RFC Editor Note:* Replace RFC XXXX / rfcXXXX with the published RFC
number.
Type name: image Type name: image
Subtype name: webp Subtype name: webp
Required parameters: N/A Required parameters: N/A
Optional parameters: N/A Optional parameters: N/A
Encoding considerations: Binary. The Base64 encoding [RFC4648] Encoding considerations: Binary. The Base64 encoding [RFC4648]
should be used on transports that cannot accommodate binary data should be used on transports that cannot accommodate binary data
directly. directly.
Security considerations: See RFC XXXX, Section 4. Security considerations: See RFC 9649, Section 4.
Interoperability considerations: See RFC XXXX, Section 5. Interoperability considerations: See RFC 9649, Section 5.
Published specification: RFC 9649
Published specification: RFC XXXX
Applications that use this media type: Applications that are used to Applications that use this media type: Applications that are used to
display and process images, especially when smaller image file display and process images, especially when smaller image file
sizes are important. sizes are important.
Fragment identifier considerations: N/A Fragment identifier considerations: N/A
Additional information: Additional information:
Deprecated alias names for this type: N/A Deprecated alias names for this type: N/A
Magic number(s): The first 4 bytes are 0x52, 0x49, 0x46, 0x46 Magic number(s): The first 4 bytes are 0x52, 0x49, 0x46, 0x46
skipping to change at page 50, line 25 skipping to change at line 2247
next 7 bytes are 0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38 next 7 bytes are 0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38
('WEBPVP8'). ('WEBPVP8').
File extension(s): webp File extension(s): webp
Apple Uniform Type Identifier: org.webmproject.webp conforms to Apple Uniform Type Identifier: org.webmproject.webp conforms to
public.image public.image
Object Identifiers: N/A Object Identifiers: N/A
Person & email address to contact for further information: James Person & email address to contact for further information: James
Zern <jzern@google.com> Zern <jzern@google.com>
Intended usage: COMMON
Restrictions on usage: N/A Restrictions on usage: N/A
Author: James Zern <jzern@google.com> Author: James Zern <jzern@google.com>
Change controller: Change controller: IETF
IETF
Intended usage: COMMON Provisional registration?: No
7. References 7. References
7.1. Normative References 7.1. Normative References
[Exif] Camera & Imaging Products Association (CIPA) and Japan [Exif] Camera & Imaging Products Association (CIPA) and Japan
Electronics and Information Technology Industries Electronics and Information Technology Industries
Association (JEITA), "Exchangeable image file format for Association (JEITA), "Exchangeable image file format for
digital still cameras: Exif Version 2.3", CIPA DC- digital still cameras: Exif Version 2.3", CIPA DC-
008-2012, JEITA CP-3451C, December 2012, 008-2012, JEITA CP-3451C, December 2012,
skipping to change at page 52, line 18 skipping to change at line 2335
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[XMP] Adobe Inc., "XMP Specification", [XMP] Adobe Inc., "XMP Specification",
<https://www.adobe.com/devnet/xmp.html>. <https://www.adobe.com/devnet/xmp.html>.
7.2. Informative References 7.2. Informative References
[crbug-security]
"libwebp Security Issues",
<https://bugs.chromium.org/p/webp/issues/
list?q=label%3ASecurity>.
[cve.mitre.org-libwebp] [cve.mitre.org-libwebp]
"libwebp CVE List", <https://cve.mitre.org/cgi-bin/ "libwebp CVE List", <https://cve.mitre.org/cgi-bin/
cvekey.cgi?keyword=libwebp>. cvekey.cgi?keyword=libwebp>.
[GIF-spec] CompuServe Incorporated, "Graphics Interchange [GIF-spec] CompuServe Incorporated, "Graphics Interchange
Format(sm)", Version 89a, July 1990, Format(sm)", Version 89a, July 1990,
<https://www.w3.org/Graphics/GIF/spec-gif89a.txt>. <https://www.w3.org/Graphics/GIF/spec-gif89a.txt>.
[Huffman] Huffman, D., "A Method for the Construction of Minimum- [Huffman] Huffman, D., "A Method for the Construction of Minimum-
Redundancy Codes", Proceedings of the Institute of Radio Redundancy Codes", Proceedings of the Institute of Radio
Engineers, Vol. 40, Issue 9, pp. 1098-1101, Engineers, Vol. 40, Issue 9, pp. 1098-1101,
DOI 10.1109/JRPROC.1952.273898, September 1952, DOI 10.1109/JRPROC.1952.273898, September 1952,
<https://doi.org/10.1109/JRPROC.1952.273898>. <https://doi.org/10.1109/JRPROC.1952.273898>.
[issues-security]
"libwebp Security Issues",
<https://issues.webmproject.org/
issues?q=componentid:1618983%2B%20(%22Restrict-View-
Security%22%20OR%20type:vulnerability)>.
[JPEG-spec] [JPEG-spec]
"Information Technology - Digital Compression and Coding "Information Technology - Digital Compression and Coding
of Continuous-Tone Still Images - Requirements and of Continuous-Tone Still Images - Requirements and
Guidelines", ITU-T Recommendation T.81, ISO/IEC 10918-1, Guidelines", ITU-T Recommendation T.81, ISO/IEC 10918-1,
September 1992, September 1992,
<https://www.w3.org/Graphics/JPEG/itu-t81.pdf>. <https://www.w3.org/Graphics/JPEG/itu-t81.pdf>.
[LZ77] Ziv, J. and A. Lempel, "A Universal Algorithm for [LZ77] Ziv, J. and A. Lempel, "A Universal Algorithm for
Sequential Data Compression", IEEE Transactions on Sequential Data Compression", IEEE Transactions on
Information Theory, Vol. 23, Issue 3, pp. 337-343, Information Theory, Vol. 23, Issue 3, pp. 337-343,
skipping to change at page 53, line 22 skipping to change at line 2385
DOI 10.17487/RFC2083, March 1997, DOI 10.17487/RFC2083, March 1997,
<https://www.rfc-editor.org/info/rfc2083>. <https://www.rfc-editor.org/info/rfc2083>.
[RIFF-spec] [RIFF-spec]
"RIFF (Resource Interchange File Format)", "RIFF (Resource Interchange File Format)",
<https://www.loc.gov/preservation/digital/formats/fdd/ <https://www.loc.gov/preservation/digital/formats/fdd/
fdd000025.shtml>. fdd000025.shtml>.
[webp-lossless-src] [webp-lossless-src]
Alakuijala, J., "WebP Lossless Bitstream Specification", Alakuijala, J., "WebP Lossless Bitstream Specification",
October 2023, July 2024,
<https://chromium.googlesource.com/webm/libwebp/+/refs/ <https://chromium.googlesource.com/webm/libwebp/+/refs/
tags/webp-rfcXXXX/doc/webp-lossless-bitstream-spec.txt>. tags/webp-rfc9649/doc/webp-lossless-bitstream-spec.txt>.
[webp-lossless-study] [webp-lossless-study]
Alakuijala, J. and V. Rabaud, "Lossless and Transparency Alakuijala, J. and V. Rabaud, "Lossless and Transparency
Encoding in WebP", August 2017, Encoding in WebP", August 2017,
<https://developers.google.com/speed/webp/docs/ <https://developers.google.com/speed/webp/docs/
webp_lossless_alpha_study>. webp_lossless_alpha_study>.
[webp-riff-src] [webp-riff-src]
Google LLC, "WebP RIFF Container", April 2024, Google LLC, "WebP RIFF Container", July 2024,
<https://chromium.googlesource.com/webm/libwebp/+/refs/ <https://chromium.googlesource.com/webm/libwebp/+/refs/
tags/webp-rfcXXXX/doc/webp-container-spec.txt>. tags/webp-rfc9649/doc/webp-container-spec.txt>.
Authors' Addresses Authors' Addresses
James Zern James Zern
Google LLC Google LLC
1600 Amphitheatre Parkway 1600 Amphitheatre Parkway
Mountain View, CA 94043 Mountain View, CA 94043
United States of America United States of America
Phone: +1 650 253-0000 Phone: +1 650 253-0000
Email: jzern@google.com Email: jzern@google.com
 End of changes. 69 change blocks. 
187 lines changed or deleted 182 lines changed or added

This html diff was produced by rfcdiff 1.48.