The payload of a VP8 chunk is a VP8 key frame, as defined by
RFC 6386. This page lists every field
up to the end of the frame header. The macroblock data after that is arithmetic-coded
prediction and DCT data, described in full only by the RFC.
Frame tag
Three bytes read as one little-endian 24-bit number.
| Bits | Name | Description |
|---|---|---|
| 0 | frame type | 0 key frame; 1 interframe. |
| 1–3 | version | The profile, 0 to 3; other values are reserved. |
| 4 | show_frame | Whether the frame is for display. |
| 5–23 | first_part_size | Size in bytes of the first partition. |
| Version | Reconstruction filter | Loop filter |
|---|---|---|
| 0 | Bicubic | Normal |
| 1 | Bilinear | Simple |
| 2 | Bilinear | None |
| 3 | None | None |
The RFC notes that the loop filter settings in the frame header are what count for decoding.
Key frame header
Seven more bytes follow the tag on a key frame.
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
| 3 | 3 | bytes | start code | 9D 01 2A |
| 6 | 2 | u16 | width and scale | Low 14 bits width; top 2 bits horizontal scale. |
| 8 | 2 | u16 | height and scale | Low 14 bits height; top 2 bits vertical scale. |
| Scale | Upscaling |
|---|---|
| 0 | None |
| 1 | 5/4 |
| 2 | 5/3 |
| 3 | 2 |
A shown key frame, version 0, with a first partition of 123 bytes and a size of 640 by 480:
70 0F 00 9D 01 2A 80 02 E0 01
Frame header
The frame header is coded by the boolean entropy decoder, starting at the first
partition. L(n) is an unsigned value of n bits, each read with even
probability. Interframe-only fields are in the RFC and are listed here because the
syntax defines them, but a WebP image is a key frame.
| Field | Type | When | Description |
|---|---|---|---|
| color_space | L(1) | key frame | 0 a YUV colour space similar to BT.601; 1 reserved. |
| clamping_type | L(1) | key frame | 0 the decoder must clamp reconstructed values; 1 no clamping is needed. |
| segmentation_enabled | L(1) | Whether update_segmentation follows. | |
| filter_type | L(1) | 0 normal loop filter; 1 simple. | |
| loop_filter_level | L(6) | Filter strength. | |
| sharpness_level | L(3) | Filter sharpness. | |
| mb_lf_adjustments | See below. | ||
| log2_nbr_of_dct_partitions | L(2) | The number of coefficient partitions is 1, 2, 4 or 8. | |
| quant_indices | See below. | ||
| refresh_entropy_probs | L(1) | key frame | Whether the probabilities decoded here are kept for later frames. |
| refresh_golden_frame | L(1) | interframe | |
| refresh_alternate_frame | L(1) | interframe | |
| copy_buffer_to_golden | L(2) | interframe, golden not refreshed | |
| copy_buffer_to_alternate | L(2) | interframe, alternate not refreshed | |
| sign_bias_golden | L(1) | interframe | |
| sign_bias_alternate | L(1) | interframe | |
| refresh_entropy_probs | L(1) | interframe | |
| refresh_last | L(1) | interframe | |
| token_prob_update | For i < 4, j < 8, k < 3, l < 11: coeff_prob_update_flag, then coeff_prob L(8) if set. | ||
| mb_no_skip_coeff | L(1) | ||
| prob_skip_false | L(8) | mb_no_skip_coeff | |
| prob_intra, prob_last, prob_gf | L(8) each | interframe | |
| intra_16x16_prob_update_flag | L(1) | interframe | If set, four intra_16x16_prob L(8). |
| intra_chroma_prob_update_flag | L(1) | interframe | If set, three intra_chroma_prob L(8). |
| mv_prob_update | interframe | For i < 2, j < 19: a flag, then prob L(7) if set. |
update_segmentation
| Field | Type | When | Description |
|---|---|---|---|
| update_mb_segmentation_map | L(1) | ||
| update_segment_feature_data | L(1) | ||
| segment_feature_mode | L(1) | feature data updated | 1 absolute values; 0 deltas. |
| quantizer_update × 4 | L(1) | feature data updated | If set: quantizer_update_value L(7), quantizer_update_sign L(1). |
| loop_filter_update × 4 | L(1) | feature data updated | If set: lf_update_value L(6), lf_update_sign L(1). |
| segment_prob_update × 3 | L(1) | map updated | If set: segment_prob L(8). |
mb_lf_adjustments
| Field | Type | When | Description |
|---|---|---|---|
| loop_filter_adj_enable | L(1) | ||
| mode_ref_lf_delta_update | L(1) | enabled | |
| ref_frame_delta_update_flag × 4 | L(1) | update set | If set: delta_magnitude L(6), delta_sign L(1). |
| mb_mode_delta_update_flag × 4 | L(1) | update set | If set: delta_magnitude L(6), delta_sign L(1). |
quant_indices
| Field | Type | Description |
|---|---|---|
| y_ac_qi | L(7) | The base quantiser index. |
| y_dc_delta_present | L(1) | If set: magnitude L(4), sign L(1). |
| y2_dc_delta_present | L(1) | If set: magnitude L(4), sign L(1). |
| y2_ac_delta_present | L(1) | If set: magnitude L(4), sign L(1). |
| uv_dc_delta_present | L(1) | If set: magnitude L(4), sign L(1). |
| uv_ac_delta_present | L(1) | If set: magnitude L(4), sign L(1). |