draft-ietf-cellar-ffv1-v4-11.txt   draft-ietf-cellar-ffv1-v4-12.txt 
cellar M. Niedermayer cellar M. Niedermayer
Internet-Draft Internet-Draft
Intended status: Standards Track D. Rice Intended status: Standards Track D. Rice
Expires: 27 November 2020 Expires: 25 December 2020
J. Martinez J. Martinez
26 May 2020 23 June 2020
FFV1 Video Coding Format Version 4 FFV1 Video Coding Format Version 4
draft-ietf-cellar-ffv1-v4-11 draft-ietf-cellar-ffv1-v4-12
Abstract Abstract
This document defines FFV1, a lossless intra-frame video encoding This document defines FFV1, a lossless intra-frame video encoding
format. FFV1 is designed to efficiently compress video data in a format. FFV1 is designed to efficiently compress video data in a
variety of pixel formats. Compared to uncompressed video, FFV1 variety of pixel formats. Compared to uncompressed video, FFV1
offers storage compression, frame fixity, and self-description, which offers storage compression, frame fixity, and self-description, which
makes FFV1 useful as a preservation or intermediate video format. makes FFV1 useful as a preservation or intermediate video format.
Status of This Memo Status of This Memo
skipping to change at page 1, line 36 skipping to change at page 1, line 36
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 27 November 2020. This Internet-Draft will expire on 25 December 2020.
Copyright Notice Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the Copyright (c) 2020 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 (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights Please review these documents carefully, as they describe your rights
skipping to change at page 2, line 43 skipping to change at page 2, line 43
3.4. Context . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.4. Context . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.5. Quantization Table Sets . . . . . . . . . . . . . . . . . 12 3.5. Quantization Table Sets . . . . . . . . . . . . . . . . . 12
3.6. Quantization Table Set Indexes . . . . . . . . . . . . . 12 3.6. Quantization Table Set Indexes . . . . . . . . . . . . . 12
3.7. Color spaces . . . . . . . . . . . . . . . . . . . . . . 12 3.7. Color spaces . . . . . . . . . . . . . . . . . . . . . . 12
3.7.1. YCbCr . . . . . . . . . . . . . . . . . . . . . . . . 13 3.7.1. YCbCr . . . . . . . . . . . . . . . . . . . . . . . . 13
3.7.2. RGB . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.7.2. RGB . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.8. Coding of the Sample Difference . . . . . . . . . . . . . 15 3.8. Coding of the Sample Difference . . . . . . . . . . . . . 15
3.8.1. Range Coding Mode . . . . . . . . . . . . . . . . . . 15 3.8.1. Range Coding Mode . . . . . . . . . . . . . . . . . . 15
3.8.2. Golomb Rice Mode . . . . . . . . . . . . . . . . . . 20 3.8.2. Golomb Rice Mode . . . . . . . . . . . . . . . . . . 20
4. Bitstream . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4. Bitstream . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.1. Parameters . . . . . . . . . . . . . . . . . . . . . . . 26 4.1. Quantization Table Set . . . . . . . . . . . . . . . . . 26
4.1.1. version . . . . . . . . . . . . . . . . . . . . . . . 28 4.1.1. quant_tables . . . . . . . . . . . . . . . . . . . . 27
4.1.2. micro_version . . . . . . . . . . . . . . . . . . . . 28 4.1.2. context_count . . . . . . . . . . . . . . . . . . . . 28
4.1.3. coder_type . . . . . . . . . . . . . . . . . . . . . 29 4.2. Parameters . . . . . . . . . . . . . . . . . . . . . . . 28
4.1.4. state_transition_delta . . . . . . . . . . . . . . . 30 4.2.1. version . . . . . . . . . . . . . . . . . . . . . . . 30
4.1.5. colorspace_type . . . . . . . . . . . . . . . . . . . 30 4.2.2. micro_version . . . . . . . . . . . . . . . . . . . . 30
4.1.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 31 4.2.3. coder_type . . . . . . . . . . . . . . . . . . . . . 31
4.1.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 31 4.2.4. state_transition_delta . . . . . . . . . . . . . . . 32
4.1.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 32 4.2.5. colorspace_type . . . . . . . . . . . . . . . . . . . 32
4.1.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 32 4.2.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 33
4.1.10. extra_plane . . . . . . . . . . . . . . . . . . . . . 32 4.2.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 33
4.1.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 32 4.2.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 34
4.1.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 33 4.2.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 34
4.1.13. quant_table_set_count . . . . . . . . . . . . . . . . 33 4.2.10. extra_plane . . . . . . . . . . . . . . . . . . . . . 34
4.1.14. states_coded . . . . . . . . . . . . . . . . . . . . 33 4.2.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 34
4.1.15. initial_state_delta . . . . . . . . . . . . . . . . . 33 4.2.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 35
4.1.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.13. quant_table_set_count . . . . . . . . . . . . . . . . 35
4.1.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.14. states_coded . . . . . . . . . . . . . . . . . . . . 35
4.2. Configuration Record . . . . . . . . . . . . . . . . . . 34 4.2.15. initial_state_delta . . . . . . . . . . . . . . . . . 35
4.2.1. reserved_for_future_use . . . . . . . . . . . . . . . 35 4.2.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.2. configuration_record_crc_parity . . . . . . . . . . . 35 4.2.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.3. Mapping FFV1 into Containers . . . . . . . . . . . . 35 4.3. Configuration Record . . . . . . . . . . . . . . . . . . 36
4.3. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.3.1. reserved_for_future_use . . . . . . . . . . . . . . . 37
4.4. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.3.2. configuration_record_crc_parity . . . . . . . . . . . 37
4.5. Slice Header . . . . . . . . . . . . . . . . . . . . . . 39 4.3.3. Mapping FFV1 into Containers . . . . . . . . . . . . 37
4.5.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 39 4.4. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.5.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 39 4.5. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.5.3. slice_width . . . . . . . . . . . . . . . . . . . . . 39 4.6. Slice Header . . . . . . . . . . . . . . . . . . . . . . 41
4.5.4. slice_height . . . . . . . . . . . . . . . . . . . . 40 4.6.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 41
4.5.5. quant_table_set_index_count . . . . . . . . . . . . . 40 4.6.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 41
4.5.6. quant_table_set_index . . . . . . . . . . . . . . . . 40 4.6.3. slice_width . . . . . . . . . . . . . . . . . . . . . 41
4.5.7. picture_structure . . . . . . . . . . . . . . . . . . 40 4.6.4. slice_height . . . . . . . . . . . . . . . . . . . . 42
4.5.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 41 4.6.5. quant_table_set_index_count . . . . . . . . . . . . . 42
4.5.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 41 4.6.6. quant_table_set_index . . . . . . . . . . . . . . . . 42
4.5.10. reset_contexts . . . . . . . . . . . . . . . . . . . 41 4.6.7. picture_structure . . . . . . . . . . . . . . . . . . 42
4.5.11. slice_coding_mode . . . . . . . . . . . . . . . . . . 41 4.6.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 43
4.6. Slice Content . . . . . . . . . . . . . . . . . . . . . . 42 4.6.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 43
4.6.1. primary_color_count . . . . . . . . . . . . . . . . . 42 4.6.10. reset_contexts . . . . . . . . . . . . . . . . . . . 43
4.6.2. plane_pixel_height . . . . . . . . . . . . . . . . . 42 4.6.11. slice_coding_mode . . . . . . . . . . . . . . . . . . 43
4.6.3. slice_pixel_height . . . . . . . . . . . . . . . . . 43 4.7. Slice Content . . . . . . . . . . . . . . . . . . . . . . 44
4.6.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 43 4.7.1. primary_color_count . . . . . . . . . . . . . . . . . 44
4.7. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.7.2. plane_pixel_height . . . . . . . . . . . . . . . . . 44
4.7.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 43 4.7.3. slice_pixel_height . . . . . . . . . . . . . . . . . 45
4.7.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 44 4.7.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 45
4.7.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 44 4.8. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.7.4. sample_difference . . . . . . . . . . . . . . . . . . 44 4.8.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 45
4.8. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 44 4.8.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 46
4.8.1. slice_size . . . . . . . . . . . . . . . . . . . . . 44 4.8.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 46
4.8.2. error_status . . . . . . . . . . . . . . . . . . . . 45 4.8.4. sample_difference . . . . . . . . . . . . . . . . . . 46
4.8.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 45 4.9. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 46
4.9. Quantization Table Set . . . . . . . . . . . . . . . . . 45 4.9.1. slice_size . . . . . . . . . . . . . . . . . . . . . 46
4.9.1. quant_tables . . . . . . . . . . . . . . . . . . . . 46 4.9.2. error_status . . . . . . . . . . . . . . . . . . . . 47
4.9.2. context_count . . . . . . . . . . . . . . . . . . . . 46 4.9.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 47
5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 47 5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 47
6. Security Considerations . . . . . . . . . . . . . . . . . . . 47 6. Security Considerations . . . . . . . . . . . . . . . . . . . 48
7. Media Type Definition . . . . . . . . . . . . . . . . . . . . 48 7. Media Type Definition . . . . . . . . . . . . . . . . . . . . 49
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 49 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 50
9. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 50 9. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 50
10. Normative References . . . . . . . . . . . . . . . . . . . . 50 10. Normative References . . . . . . . . . . . . . . . . . . . . 50
11. Informative References . . . . . . . . . . . . . . . . . . . 51 11. Informative References . . . . . . . . . . . . . . . . . . . 51
Appendix A. Multi-theaded decoder implementation suggestions . . 52 Appendix A. Multi-theaded decoder implementation suggestions . . 52
Appendix B. Future handling of some streams created by non Appendix B. Future handling of some streams created by non
conforming encoders . . . . . . . . . . . . . . . . . . . 52 conforming encoders . . . . . . . . . . . . . . . . . . . 53
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 52 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 53
1. Introduction 1. Introduction
This document describes FFV1, a lossless video encoding format. The This document describes FFV1, a lossless video encoding format. The
design of FFV1 considers the storage of image characteristics, data design of FFV1 considers the storage of image characteristics, data
fixity, and the optimized use of encoding time and storage fixity, and the optimized use of encoding time and storage
requirements. FFV1 is designed to support a wide range of lossless requirements. FFV1 is designed to support a wide range of lossless
video applications such as long-term audiovisual preservation, video applications such as long-term audiovisual preservation,
scientific imaging, screen recording, and other video encoding scientific imaging, screen recording, and other video encoding
scenarios that seek to avoid the generational loss of lossy video scenarios that seek to avoid the generational loss of lossy video
skipping to change at page 4, line 46 skipping to change at page 4, line 46
2. Notation and Conventions 2. Notation and Conventions
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP "OPTIONAL" in this document are to be interpreted as described in BCP
14 [RFC2119] [RFC8174] when, and only when, they appear in all 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here. capitals, as shown here.
2.1. Definitions 2.1. Definitions
"Container": Format that encapsulates "Frames" (see Section 4.3) and "Container": Format that encapsulates "Frames" (see Section 4.4) and
(when required) a "Configuration Record" into a bitstream. (when required) a "Configuration Record" into a bitstream.
"Sample": The smallest addressable representation of a color "Sample": The smallest addressable representation of a color
component or a luma component in a "Frame". Examples of "Sample" are component or a luma component in a "Frame". Examples of "Sample" are
Luma, Blue Chrominance, Red Chrominance, Transparency, Red, Green, Luma, Blue Chrominance, Red Chrominance, Transparency, Red, Green,
and Blue. and Blue.
"Plane": A discrete component of a static image comprised of "Plane": A discrete component of a static image comprised of
"Samples" that represent a specific quantification of "Samples" of "Samples" that represent a specific quantification of "Samples" of
that image. that image.
skipping to change at page 8, line 37 skipping to change at page 8, line 37
2.2.7. Range 2.2.7. Range
"a...b" means any value starting from a to b, inclusive. "a...b" means any value starting from a to b, inclusive.
2.2.8. NumBytes 2.2.8. NumBytes
"NumBytes" is a non-negative integer that expresses the size in 8-bit "NumBytes" is a non-negative integer that expresses the size in 8-bit
octets of a particular FFV1 "Configuration Record" or "Frame". FFV1 octets of a particular FFV1 "Configuration Record" or "Frame". FFV1
relies on its "Container" to store the "NumBytes" values; see relies on its "Container" to store the "NumBytes" values; see
Section 4.2.3. Section 4.3.3.
2.2.9. Bitstream Functions 2.2.9. Bitstream Functions
2.2.9.1. remaining_bits_in_bitstream 2.2.9.1. remaining_bits_in_bitstream
"remaining_bits_in_bitstream( )" means the count of remaining bits "remaining_bits_in_bitstream( )" means the count of remaining bits
after the pointer in that "Configuration Record" or "Frame". It is after the pointer in that "Configuration Record" or "Frame". It is
computed from the "NumBytes" value multiplied by 8 minus the count of computed from the "NumBytes" value multiplied by 8 minus the count of
bits of that "Configuration Record" or "Frame" already read by the bits of that "Configuration Record" or "Frame" already read by the
bitstream parser. bitstream parser.
skipping to change at page 9, line 18 skipping to change at page 9, line 18
)" is a multiple of 8, otherwise false. )" is a multiple of 8, otherwise false.
2.2.9.4. get_bits 2.2.9.4. get_bits
"get_bits( i )" is the action to read the next "i" bits in the "get_bits( i )" is the action to read the next "i" bits in the
bitstream, from most significant bit to least significant bit, and to bitstream, from most significant bit to least significant bit, and to
return the corresponding value. The pointer is increased by "i". return the corresponding value. The pointer is increased by "i".
3. Sample Coding 3. Sample Coding
For each "Slice" (as described in Section 4.4) of a "Frame", the For each "Slice" (as described in Section 4.5) of a "Frame", the
"Planes", "Lines", and "Samples" are coded in an order determined by "Planes", "Lines", and "Samples" are coded in an order determined by
the "Color Space" (see Section 3.7). Each "Sample" is predicted by the "Color Space" (see Section 3.7). Each "Sample" is predicted by
the median predictor as described in Section 3.3 from other "Samples" the median predictor as described in Section 3.3 from other "Samples"
within the same "Plane" and the difference is stored using the method within the same "Plane" and the difference is stored using the method
described in Section 3.8. described in Section 3.8.
3.1. Border 3.1. Border
A border is assumed for each coded "Slice" for the purpose of the A border is assumed for each coded "Slice" for the purpose of the
median predictor and context according to the following rules: median predictor and context according to the following rules:
skipping to change at page 15, line 20 skipping to change at page 15, line 20
3.8. Coding of the Sample Difference 3.8. Coding of the Sample Difference
Instead of coding the n+1 bits of the Sample Difference with Huffman Instead of coding the n+1 bits of the Sample Difference with Huffman
or Range coding (or n+2 bits, in the case of JPEG2000-RCT), only the or Range coding (or n+2 bits, in the case of JPEG2000-RCT), only the
n (or n+1, in the case of JPEG2000-RCT) least significant bits are n (or n+1, in the case of JPEG2000-RCT) least significant bits are
used, since this is sufficient to recover the original "Sample". In used, since this is sufficient to recover the original "Sample". In
the equation below, the term "bits" represents "bits_per_raw_sample + the equation below, the term "bits" represents "bits_per_raw_sample +
1" for JPEG2000-RCT or "bits_per_raw_sample" otherwise: 1" for JPEG2000-RCT or "bits_per_raw_sample" otherwise:
coder_input = coder_input = [(sample_difference + 2 ^ (bits - 1)) &
[(sample_difference + 2 ^ (bits-1)) & (2 ^ bits - 1)] - 2 ^ (bits - 1) (2 ^ bits - 1)] - 2 ^ (bits - 1)
Figure 7 Figure 7: Description of the coding of the Sample Difference in
the bitstream.
3.8.1. Range Coding Mode 3.8.1. Range Coding Mode
Early experimental versions of FFV1 used the CABAC Arithmetic coder Early experimental versions of FFV1 used the CABAC Arithmetic coder
from H.264 as defined in [ISO.14496-10.2014] but due to the uncertain from H.264 as defined in [ISO.14496-10.2014] but due to the uncertain
patent/royalty situation, as well as its slightly worse performance, patent/royalty situation, as well as its slightly worse performance,
CABAC was replaced by a Range coder based on an algorithm defined by CABAC was replaced by a Range coder based on an algorithm defined by
G. Nigel and N. Martin in 1979 [range-coding]. G. Nigel and N. Martin in 1979 [range-coding].
3.8.1.1. Range Binary Values 3.8.1.1. Range Binary Values
skipping to change at page 17, line 51 skipping to change at page 17, line 51
To encode scalar integers, it would be possible to encode each bit To encode scalar integers, it would be possible to encode each bit
separately and use the past bits as context. However that would mean separately and use the past bits as context. However that would mean
255 contexts per 8-bit symbol that is not only a waste of memory but 255 contexts per 8-bit symbol that is not only a waste of memory but
also requires more past data to reach a reasonably good estimate of also requires more past data to reach a reasonably good estimate of
the probabilities. Alternatively assuming a Laplacian distribution the probabilities. Alternatively assuming a Laplacian distribution
and only dealing with its variance and mean (as in Huffman coding) and only dealing with its variance and mean (as in Huffman coding)
would also be possible, however, for maximum flexibility and would also be possible, however, for maximum flexibility and
simplicity, the chosen method uses a single symbol to encode if a simplicity, the chosen method uses a single symbol to encode if a
number is 0, and if not, encodes the number using its exponent, number is 0, and if not, encodes the number using its exponent,
mantissa and sign. The exact contexts used are best described by mantissa and sign. The exact contexts used are best described by
Figure 15, followed by some comments. Figure 15.
pseudo-code | type int get_symbol(RangeCoder *c, uint8_t *state, int is_signed) {
--------------------------------------------------------------|----- if (get_rac(c, state + 0) {
void put_symbol(RangeCoder *c, uint8_t *state, int v, int \ | return 0;
is_signed) { | }
int i; |
put_rac(c, state+0, !v); | int e = 0;
if (v) { | while (get_rac(c, state + 1 + min(e, 9)) { //1..10
int a= abs(v); | e++;
int e= log2(a); | }
|
for (i = 0; i < e; i++) { | int a = 1;
put_rac(c, state+1+min(i,9), 1); //1..10 | for (int i = e - 1; i >= 0; i--) {
} | a = a * 2 + get_rac(c, state + 22 + min(i, 9)); // 22..31
| }
put_rac(c, state+1+min(i,9), 0); |
for (i = e-1; i >= 0; i--) { | if (!is_signed) {
put_rac(c, state+22+min(i,9), (a>>i)&1); //22..31 | return a;
} | }
|
if (is_signed) { | if (get_rac(c, state + 11 + min(e, 10))) { //11..21
put_rac(c, state+11 + min(e, 10), v < 0); //11..21| return -a;
} | } else {
} | return a;
} | }
}
Figure 15: A pseudo-code description of the contexts of Range Non Figure 15: A pseudo-code description of the contexts of Range Non
Binary Values. Binary Values.
"get_symbol" is used for the read out of "sample_difference"
indicated in Figure 7.
"get_rac" is the process described in Section 3.8.1.1.
3.8.1.3. Initial Values for the Context Model 3.8.1.3. Initial Values for the Context Model
At keyframes all Range coder state variables are set to their initial At keyframes all Range coder state variables are set to their initial
state. state.
3.8.1.4. State Transition Table 3.8.1.4. State Transition Table
one_state_{i} = one_state_{i} =
default_state_transition_{i} + state_transition_delta_{i} default_state_transition_{i} + state_transition_delta_{i}
skipping to change at page 19, line 40 skipping to change at page 19, line 44
210,211,212,213,215,215,216,217,218,219,220,220,222,223,224,225, 210,211,212,213,215,215,216,217,218,219,220,220,222,223,224,225,
226,227,227,229,229,230,231,232,234,234,235,236,237,238,239,240, 226,227,227,229,229,230,231,232,234,234,235,236,237,238,239,240,
241,242,243,244,245,246,247,248,248, 0, 0, 0, 0, 0, 0, 0, 241,242,243,244,245,246,247,248,248, 0, 0, 0, 0, 0, 0, 0,
3.8.1.6. Alternative State Transition Table 3.8.1.6. Alternative State Transition Table
The alternative state transition table has been built using iterative The alternative state transition table has been built using iterative
minimization of frame sizes and generally performs better than the minimization of frame sizes and generally performs better than the
default. To use it, the "coder_type" (see Section 4.1.3) MUST be set default. To use it, the "coder_type" (see Section 4.2.3) MUST be set
to 2 and the difference to the default MUST be stored in the to 2 and the difference to the default MUST be stored in the
"Parameters", see Section 4.1. The reference implementation of FFV1 "Parameters", see Section 4.2. The reference implementation of FFV1
in FFmpeg uses Figure 18 by default at the time of this writing when in FFmpeg uses Figure 18 by default at the time of this writing when
Range coding is used. Range coding is used.
0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49, 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39, 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52, 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
53, 74, 55, 57, 58, 58, 74, 60,101, 61, 62, 84, 66, 66, 68, 69, 53, 74, 55, 57, 58, 58, 74, 60,101, 61, 62, 84, 66, 66, 68, 69,
skipping to change at page 21, line 5 skipping to change at page 21, line 5
The end of the bitstream of the "Frame" is filled with 0-bits until The end of the bitstream of the "Frame" is filled with 0-bits until
that the bitstream contains a multiple of 8 bits. that the bitstream contains a multiple of 8 bits.
3.8.2.1. Signed Golomb Rice Codes 3.8.2.1. Signed Golomb Rice Codes
This coding mode uses Golomb Rice codes. The VLC is split into two This coding mode uses Golomb Rice codes. The VLC is split into two
parts. The prefix stores the most significant bits and the suffix parts. The prefix stores the most significant bits and the suffix
stores the k least significant bits or stores the whole number in the stores the k least significant bits or stores the whole number in the
ESC case. ESC case.
pseudo-code | type int get_ur_golomb(k) {
--------------------------------------------------------------|----- for (prefix = 0; prefix < 12; prefix++) {
int get_ur_golomb(k) { | if (get_bits(1)) {
for (prefix = 0; prefix < 12; prefix++) { | return get_bits(k) + (prefix << k);
if (get_bits(1)) { | }
return get_bits(k) + (prefix << k) | }
} | return get_bits(bits) + 11;
} | }
return get_bits(bits) + 11 |
} | Figure 19: A pseudo-code description of the read of an unsigned
| integer in Golomb Rice mode.
int get_sr_golomb(k) { |
v = get_ur_golomb(k); | int get_sr_golomb(k) {
if (v & 1) return - (v >> 1) - 1; | v = get_ur_golomb(k);
else return (v >> 1); | if (v & 1) return - (v >> 1) - 1;
else return (v >> 1);
} }
Figure 20: A pseudo-code description of the read of a signed
integer in Golomb Rice mode.
3.8.2.1.1. Prefix 3.8.2.1.1. Prefix
+----------------+-------+ +----------------+-------+
| bits | value | | bits | value |
+================+=======+ +================+=======+
| 1 | 0 | | 1 | 0 |
+----------------+-------+ +----------------+-------+
| 01 | 1 | | 01 | 1 |
+----------------+-------+ +----------------+-------+
| ... | ... | | ... | ... |
skipping to change at page 22, line 50 skipping to change at page 22, line 50
Run mode is entered when the context is 0 and left as soon as a non-0 Run mode is entered when the context is 0 and left as soon as a non-0
difference is found. The level is identical to the predicted one. difference is found. The level is identical to the predicted one.
The run and the first different level are coded. The run and the first different level are coded.
3.8.2.2.1. Run Length Coding 3.8.2.2.1. Run Length Coding
The run value is encoded in two parts. The prefix part stores the The run value is encoded in two parts. The prefix part stores the
more significant part of the run as well as adjusting the "run_index" more significant part of the run as well as adjusting the "run_index"
that determines the number of bits in the less significant part of that determines the number of bits in the less significant part of
the run. The second part of the value stores the less significant the run. The second part of the value stores the less significant
part of the run as it is. The run_index is reset for each "Plane" part of the run as it is. The "run_index" is reset for each "Plane"
and slice to 0. and slice to 0.
pseudo-code | type log2_run[41] = {
--------------------------------------------------------------|----- 0, 0, 0, 0, 1, 1, 1, 1,
log2_run[41]={ | 2, 2, 2, 2, 3, 3, 3, 3,
0, 0, 0, 0, 1, 1, 1, 1, | 4, 4, 5, 5, 6, 6, 7, 7,
2, 2, 2, 2, 3, 3, 3, 3, | 8, 9,10,11,12,13,14,15,
4, 4, 5, 5, 6, 6, 7, 7, | 16,17,18,19,20,21,22,23,
8, 9,10,11,12,13,14,15, | 24,
16,17,18,19,20,21,22,23, | };
24, |
}; | if (run_count == 0 && run_mode == 1) {
| if (get_bits(1)) {
if (run_count == 0 && run_mode == 1) { | run_count = 1 << log2_run[run_index];
if (get_bits(1)) { | if (x + run_count <= w) {
run_count = 1 << log2_run[run_index]; | run_index++;
if (x + run_count <= w) { | }
run_index++; | } else {
} | if (log2_run[run_index]) {
} else { | run_count = get_bits(log2_run[run_index]);
if (log2_run[run_index]) { | } else {
run_count = get_bits(log2_run[run_index]); | run_count = 0;
} else { | }
run_count = 0; | if (run_index) {
} | run_index--;
if (run_index) { | }
run_index--; | run_mode = 2;
} | }
run_mode = 2; | }
} |
} |
The "log2_run" array is also used within [ISO.14495-1.1999]. The "log2_run" array is also used within [ISO.14495-1.1999].
3.8.2.3. Scalar Mode 3.8.2.3. Sign extension
"sign_extend" is the function of increasing the number of bits of an
input binary number in twos complement signed number representation
while preserving the input number's sign (positive/negative) and
value, in order to fit in the output bit width. It MAY be computed
with:
sign_extend(input_number, input_bits) {
negative_bias = 1 << (input_bits - 1);
bits_mask = negative_bias - 1;
output_number = input_number & bits_mask; // Remove negative bit
is_negative = input_number & negative_bias; // Test negative bit
if (is_negative)
output_number -= negative_bias;
return output_number
}
3.8.2.4. Scalar Mode
Each difference is coded with the per context mean prediction removed Each difference is coded with the per context mean prediction removed
and a per context value for k. and a per context value for k.
get_vlc_symbol(state) { get_vlc_symbol(state) {
i = state->count; i = state->count;
k = 0; k = 0;
while (i < state->error_sum) { while (i < state->error_sum) {
k++; k++;
i += i; i += i;
skipping to change at page 24, line 44 skipping to change at page 24, line 49
-state->count + 1); -state->count + 1);
} else if (state->drift > 0) { } else if (state->drift > 0) {
state->bias = min(state->bias + 1, 127); state->bias = min(state->bias + 1, 127);
state->drift = min(state->drift - state->count, 0); state->drift = min(state->drift - state->count, 0);
} }
return ret; return ret;
} }
3.8.2.3.1. Level Coding 3.8.2.4.1. Level Coding
Level coding is identical to the normal difference coding with the Level coding is identical to the normal difference coding with the
exception that the 0 value is removed as it cannot occur: exception that the 0 value is removed as it cannot occur:
diff = get_vlc_symbol(context_state); diff = get_vlc_symbol(context_state);
if (diff >= 0) { if (diff >= 0) {
diff++; diff++;
} }
Note, this is different from JPEG-LS, which doesn't use prediction in Note, this is different from JPEG-LS, which doesn't use prediction in
run mode and uses a different encoding and context model for the last run mode and uses a different encoding and context model for the last
difference. On a small set of test "Samples" the use of prediction difference. On a small set of test "Samples" the use of prediction
slightly improved the compression rate. slightly improved the compression rate.
3.8.2.4. Initial Values for the VLC context state 3.8.2.5. Initial Values for the VLC context state
At keyframes all coder state variables are set to their initial At keyframes all coder state variables are set to their initial
state. state.
drift = 0; drift = 0;
error_sum = 4; error_sum = 4;
bias = 0; bias = 0;
count = 1; count = 1;
4. Bitstream 4. Bitstream
skipping to change at page 26, line 29 skipping to change at page 26, line 29
| sr | Range coded signed scalar symbol coded with | | sr | Range coded signed scalar symbol coded with |
| | the method described in Section 3.8.1.2 | | | the method described in Section 3.8.1.2 |
+--------+----------------------------------------------+ +--------+----------------------------------------------+
| sd | Sample difference coded with the method | | sd | Sample difference coded with the method |
| | described in Section 3.8 | | | described in Section 3.8 |
+--------+----------------------------------------------+ +--------+----------------------------------------------+
Table 4: Definition of pseudo-code symbols for this Table 4: Definition of pseudo-code symbols for this
document. document.
The same context that is initialized to 128 is used for all fields in
the header.
The following MUST be provided by external means during The following MUST be provided by external means during
initialization of the decoder: initialization of the decoder:
"frame_pixel_width" is defined as "Frame" width in "Pixels". "frame_pixel_width" is defined as "Frame" width in "Pixels".
"frame_pixel_height" is defined as "Frame" height in "Pixels". "frame_pixel_height" is defined as "Frame" height in "Pixels".
Default values at the decoder initialization phase: Default values at the decoder initialization phase:
"ConfigurationRecordIsPresent" is set to 0. "ConfigurationRecordIsPresent" is set to 0.
4.1. Parameters 4.1. Quantization Table Set
The Quantization Table Sets are stored by storing the number of equal
entries -1 of the first half of the table (represented as "len - 1"
in the pseudo-code below) using the method described in
Section 3.8.1.2. The second half doesn't need to be stored as it is
identical to the first with flipped sign. "scale" and "len_count[ i
][ j ]" are temporary values used for the computing of
"context_count[ i ]" and are not used outside Quantization Table Set
pseudo-code.
Example:
Table: 0 0 1 1 1 1 2 2 -2 -2 -2 -1 -1 -1 -1 0
Stored values: 1, 3, 1
"QuantizationTableSet" has its own initial states, all set to 128.
pseudo-code | type
--------------------------------------------------------------|-----
QuantizationTableSet( i ) { |
scale = 1 |
for (j = 0; j < MAX_CONTEXT_INPUTS; j++) { |
QuantizationTable( i, j, scale ) |
scale *= 2 * len_count[ i ][ j ] - 1 |
} |
context_count[ i ] = ceil( scale / 2 ) |
} |
"MAX_CONTEXT_INPUTS" is 5.
pseudo-code | type
--------------------------------------------------------------|-----
QuantizationTable(i, j, scale) { |
v = 0 |
for (k = 0; k < 128;) { |
len - 1 | ur
for (n = 0; n < len; n++) { |
quant_tables[ i ][ j ][ k ] = scale * v |
k++ |
} |
v++ |
} |
for (k = 1; k < 128; k++) { |
quant_tables[ i ][ j ][ 256 - k ] = \ |
-quant_tables[ i ][ j ][ k ] |
} |
quant_tables[ i ][ j ][ 128 ] = \ |
-quant_tables[ i ][ j ][ 127 ] |
len_count[ i ][ j ] = v |
} |
4.1.1. quant_tables
"quant_tables[ i ][ j ][ k ]" indicates the quantification table
value of the Quantized Sample Difference "k" of the Quantization
Table "j" of the Set Quantization Table Set "i".
4.1.2. context_count
"context_count[ i ]" indicates the count of contexts for Quantization
Table Set "i". "context_count[ i ]" MUST be less than or equal to
32768.
4.2. Parameters
The "Parameters" section contains significant characteristics about The "Parameters" section contains significant characteristics about
the decoding configuration used for all instances of "Frame" (in FFV1 the decoding configuration used for all instances of "Frame" (in FFV1
version 0 and 1) or the whole FFV1 bitstream (other versions), version 0 and 1) or the whole FFV1 bitstream (other versions),
including the stream version, color configuration, and quantization including the stream version, color configuration, and quantization
tables. Figure 19 describes the contents of the bitstream. tables. Figure 21 describes the contents of the bitstream.
"Parameters" has its own initial states, all set to 128.
pseudo-code | type pseudo-code | type
--------------------------------------------------------------|----- --------------------------------------------------------------|-----
Parameters( ) { | Parameters( ) { |
version | ur version | ur
if (version >= 3) { | if (version >= 3) { |
micro_version | ur micro_version | ur
} | } |
coder_type | ur coder_type | ur
if (coder_type > 1) { | if (coder_type > 1) { |
skipping to change at page 27, line 50 skipping to change at page 29, line 50
initial_state_delta[ i ][ j ][ k ] | sr initial_state_delta[ i ][ j ][ k ] | sr
} | } |
} | } |
} | } |
} | } |
ec | ur ec | ur
intra | ur intra | ur
} | } |
} | } |
Figure 19: A pseudo-code description of the bitstream contents. Figure 21: A pseudo-code description of the bitstream contents.
CONTEXT_SIZE is 32. CONTEXT_SIZE is 32.
4.1.1. version 4.2.1. version
"version" specifies the version of the FFV1 bitstream. "version" specifies the version of the FFV1 bitstream.
Each version is incompatible with other versions: decoders SHOULD Each version is incompatible with other versions: decoders SHOULD
reject FFV1 bitstreams due to an unknown version. reject FFV1 bitstreams due to an unknown version.
Decoders SHOULD reject FFV1 bitstreams with version <= 1 && Decoders SHOULD reject FFV1 bitstreams with version <= 1 &&
ConfigurationRecordIsPresent == 1. ConfigurationRecordIsPresent == 1.
Decoders SHOULD reject FFV1 bitstreams with version >= 3 && Decoders SHOULD reject FFV1 bitstreams with version >= 3 &&
skipping to change at page 28, line 38 skipping to change at page 30, line 38
+-------+-------------------------+ +-------+-------------------------+
| 4 | FFV1 version 4 | | 4 | FFV1 version 4 |
+-------+-------------------------+ +-------+-------------------------+
| Other | reserved for future use | | Other | reserved for future use |
+-------+-------------------------+ +-------+-------------------------+
Table 5 Table 5
* Version 2 was experimental and this document does not describe it. * Version 2 was experimental and this document does not describe it.
4.1.2. micro_version 4.2.2. micro_version
"micro_version" specifies the micro-version of the FFV1 bitstream. "micro_version" specifies the micro-version of the FFV1 bitstream.
After a version is considered stable (a micro-version value is After a version is considered stable (a micro-version value is
assigned to be the first stable variant of a specific version), each assigned to be the first stable variant of a specific version), each
new micro-version after this first stable variant is compatible with new micro-version after this first stable variant is compatible with
the previous micro-version: decoders SHOULD NOT reject FFV1 the previous micro-version: decoders SHOULD NOT reject FFV1
bitstreams due to an unknown micro-version equal or above the micro- bitstreams due to an unknown micro-version equal or above the micro-
version considered as stable. version considered as stable.
skipping to change at page 29, line 43 skipping to change at page 31, line 43
| Other | reserved for future use | | Other | reserved for future use |
+---------+-------------------------+ +---------+-------------------------+
Table 7: The definitions for Table 7: The definitions for
"micro_version" values for FFV1 "micro_version" values for FFV1
version 4. version 4.
* development versions which may be incompatible with the stable * development versions which may be incompatible with the stable
variants. variants.
4.1.3. coder_type 4.2.3. coder_type
"coder_type" specifies the coder used. "coder_type" specifies the coder used.
+-------+-------------------------------------------------+ +-------+-------------------------------------------------+
| value | coder used | | value | coder used |
+=======+=================================================+ +=======+=================================================+
| 0 | Golomb Rice | | 0 | Golomb Rice |
+-------+-------------------------------------------------+ +-------+-------------------------------------------------+
| 1 | Range Coder with default state transition table | | 1 | Range Coder with default state transition table |
+-------+-------------------------------------------------+ +-------+-------------------------------------------------+
skipping to change at page 30, line 28 skipping to change at page 32, line 28
Restrictions: Restrictions:
If "coder_type" is 0, then "bits_per_raw_sample" SHOULD NOT be > 8. If "coder_type" is 0, then "bits_per_raw_sample" SHOULD NOT be > 8.
Background: At the time of this writing, there is no known Background: At the time of this writing, there is no known
implementation of FFV1 bitstream supporting Golomb Rice algorithm implementation of FFV1 bitstream supporting Golomb Rice algorithm
with "bits_per_raw_sample" greater than 8, and Range Coder is with "bits_per_raw_sample" greater than 8, and Range Coder is
prefered. prefered.
4.1.4. state_transition_delta 4.2.4. state_transition_delta
"state_transition_delta" specifies the Range coder custom state "state_transition_delta" specifies the Range coder custom state
transition table. transition table.
If "state_transition_delta" is not present in the FFV1 bitstream, all If "state_transition_delta" is not present in the FFV1 bitstream, all
Range coder custom state transition table elements are assumed to be Range coder custom state transition table elements are assumed to be
0. 0.
4.1.5. colorspace_type 4.2.5. colorspace_type
"colorspace_type" specifies the color space encoded, the pixel "colorspace_type" specifies the color space encoded, the pixel
transformation used by the encoder, the extra plane content, as well transformation used by the encoder, the extra plane content, as well
as interleave method. as interleave method.
+-------+-------------+----------------+--------------+-------------+ +-------+-------------+----------------+--------------+-------------+
| value | color space | pixel | extra plane | interleave | | value | color space | pixel | extra plane | interleave |
| | encoded | transformation | content | method | | | encoded | transformation | content | method |
+=======+=============+================+==============+=============+ +=======+=============+================+==============+=============+
| 0 | YCbCr | None | Transparency | "Plane" | | 0 | YCbCr | None | Transparency | "Plane" |
skipping to change at page 31, line 28 skipping to change at page 33, line 28
| | for future | future use | future use | for future | | | for future | future use | future use | for future |
| | use | | | use | | | use | | | use |
+-------+-------------+----------------+--------------+-------------+ +-------+-------------+----------------+--------------+-------------+
Table 9 Table 9
FFV1 bitstreams with "colorspace_type" == 1 && ("chroma_planes" != FFV1 bitstreams with "colorspace_type" == 1 && ("chroma_planes" !=
1 || "log2_h_chroma_subsample" != 0 || "log2_v_chroma_subsample" != 1 || "log2_h_chroma_subsample" != 0 || "log2_v_chroma_subsample" !=
0) are not part of this specification. 0) are not part of this specification.
4.1.6. chroma_planes 4.2.6. chroma_planes
"chroma_planes" indicates if chroma (color) "Planes" are present. "chroma_planes" indicates if chroma (color) "Planes" are present.
+-------+---------------------------------+ +-------+---------------------------------+
| value | presence | | value | presence |
+=======+=================================+ +=======+=================================+
| 0 | chroma "Planes" are not present | | 0 | chroma "Planes" are not present |
+-------+---------------------------------+ +-------+---------------------------------+
| 1 | chroma "Planes" are present | | 1 | chroma "Planes" are present |
+-------+---------------------------------+ +-------+---------------------------------+
Table 10 Table 10
4.1.7. bits_per_raw_sample 4.2.7. bits_per_raw_sample
"bits_per_raw_sample" indicates the number of bits for each "Sample". "bits_per_raw_sample" indicates the number of bits for each "Sample".
Inferred to be 8 if not present. Inferred to be 8 if not present.
+-------+-----------------------------------+ +-------+-----------------------------------+
| value | bits for each sample | | value | bits for each sample |
+=======+===================================+ +=======+===================================+
| 0 | reserved* | | 0 | reserved* |
+-------+-----------------------------------+ +-------+-----------------------------------+
| Other | the actual bits for each "Sample" | | Other | the actual bits for each "Sample" |
+-------+-----------------------------------+ +-------+-----------------------------------+
Table 11 Table 11
* Encoders MUST NOT store "bits_per_raw_sample" = 0. Decoders SHOULD * Encoders MUST NOT store "bits_per_raw_sample" = 0. Decoders SHOULD
accept and interpret "bits_per_raw_sample" = 0 as 8. accept and interpret "bits_per_raw_sample" = 0 as 8.
4.1.8. log2_h_chroma_subsample 4.2.8. log2_h_chroma_subsample
"log2_h_chroma_subsample" indicates the subsample factor, stored in "log2_h_chroma_subsample" indicates the subsample factor, stored in
powers to which the number 2 must be raised, between luma and chroma powers to which the number 2 must be raised, between luma and chroma
width ("chroma_width = 2 ^ -log2_h_chroma_subsample * luma_width"). width ("chroma_width = 2 ^ -log2_h_chroma_subsample * luma_width").
4.1.9. log2_v_chroma_subsample 4.2.9. log2_v_chroma_subsample
"log2_v_chroma_subsample" indicates the subsample factor, stored in "log2_v_chroma_subsample" indicates the subsample factor, stored in
powers to which the number 2 must be raised, between luma and chroma powers to which the number 2 must be raised, between luma and chroma
height ("chroma_height = 2 ^ -log2_v_chroma_subsample * height ("chroma_height = 2 ^ -log2_v_chroma_subsample *
luma_height"). luma_height").
4.1.10. extra_plane 4.2.10. extra_plane
"extra_plane" indicates if an extra "Plane" is present. "extra_plane" indicates if an extra "Plane" is present.
+-------+------------------------------+ +-------+------------------------------+
| value | presence | | value | presence |
+=======+==============================+ +=======+==============================+
| 0 | extra "Plane" is not present | | 0 | extra "Plane" is not present |
+-------+------------------------------+ +-------+------------------------------+
| 1 | extra "Plane" is present | | 1 | extra "Plane" is present |
+-------+------------------------------+ +-------+------------------------------+
Table 12 Table 12
4.1.11. num_h_slices 4.2.11. num_h_slices
"num_h_slices" indicates the number of horizontal elements of the "num_h_slices" indicates the number of horizontal elements of the
slice raster. slice raster.
Inferred to be 1 if not present. Inferred to be 1 if not present.
4.1.12. num_v_slices 4.2.12. num_v_slices
"num_v_slices" indicates the number of vertical elements of the slice "num_v_slices" indicates the number of vertical elements of the slice
raster. raster.
Inferred to be 1 if not present. Inferred to be 1 if not present.
4.1.13. quant_table_set_count 4.2.13. quant_table_set_count
"quant_table_set_count" indicates the number of Quantization "quant_table_set_count" indicates the number of Quantization
Table Sets. "quant_table_set_count" MUST be less than or equal to 8. Table Sets. "quant_table_set_count" MUST be less than or equal to 8.
Inferred to be 1 if not present. Inferred to be 1 if not present.
MUST NOT be 0. MUST NOT be 0.
4.1.14. states_coded 4.2.14. states_coded
"states_coded" indicates if the respective Quantization Table Set has "states_coded" indicates if the respective Quantization Table Set has
the initial states coded. the initial states coded.
Inferred to be 0 if not present. Inferred to be 0 if not present.
+-------+--------------------------------+ +-------+--------------------------------+
| value | initial states | | value | initial states |
+=======+================================+ +=======+================================+
| 0 | initial states are not present | | 0 | initial states are not present |
| | and are assumed to be all 128 | | | and are assumed to be all 128 |
+-------+--------------------------------+ +-------+--------------------------------+
| 1 | initial states are present | | 1 | initial states are present |
+-------+--------------------------------+ +-------+--------------------------------+
Table 13 Table 13
4.1.15. initial_state_delta 4.2.15. initial_state_delta
"initial_state_delta[ i ][ j ][ k ]" indicates the initial Range "initial_state_delta[ i ][ j ][ k ]" indicates the initial Range
coder state, it is encoded using "k" as context index and coder state, it is encoded using "k" as context index and
pred = j ? initial_states[ i ][j - 1][ k ] : 128 pred = j ? initial_states[ i ][j - 1][ k ] : 128
Figure 20 Figure 22
initial_state[ i ][ j ][ k ] = initial_state[ i ][ j ][ k ] =
( pred + initial_state_delta[ i ][ j ][ k ] ) & 255 ( pred + initial_state_delta[ i ][ j ][ k ] ) & 255
Figure 21 Figure 23
4.1.16. ec 4.2.16. ec
"ec" indicates the error detection/correction type. "ec" indicates the error detection/correction type.
+-------+--------------------------------------------+ +-------+-------------------------------------------------+
| value | error detection/correction type | | value | error detection/correction type |
+=======+============================================+ +=======+=================================================+
| 0 | 32-bit CRC on the global header | | 0 | 32-bit CRC in "ConfigurationRecord" |
+-------+--------------------------------------------+ +-------+-------------------------------------------------+
| 1 | 32-bit CRC per slice and the global header | | 1 | 32-bit CRC in "Slice" and "ConfigurationRecord" |
+-------+--------------------------------------------+ +-------+-------------------------------------------------+
| Other | reserved for future use | | Other | reserved for future use |
+-------+--------------------------------------------+ +-------+-------------------------------------------------+
Table 14 Table 14
4.1.17. intra 4.2.17. intra
"intra" indicates the constraint on "keyframe" in each instance of "intra" indicates the constraint on "keyframe" in each instance of
"Frame". "Frame".
Inferred to be 0 if not present. Inferred to be 0 if not present.
+-------+-------------------------------------------------------+ +-------+-------------------------------------------------------+
| value | relationship | | value | relationship |
+=======+=======================================================+ +=======+=======================================================+
| 0 | "keyframe" can be 0 or 1 (non keyframes or keyframes) | | 0 | "keyframe" can be 0 or 1 (non keyframes or keyframes) |
+-------+-------------------------------------------------------+ +-------+-------------------------------------------------------+
| 1 | "keyframe" MUST be 1 (keyframes only) | | 1 | "keyframe" MUST be 1 (keyframes only) |
+-------+-------------------------------------------------------+ +-------+-------------------------------------------------------+
| Other | reserved for future use | | Other | reserved for future use |
+-------+-------------------------------------------------------+ +-------+-------------------------------------------------------+
Table 15 Table 15
4.2. Configuration Record 4.3. Configuration Record
In the case of a FFV1 bitstream with "version >= 3", a "Configuration In the case of a FFV1 bitstream with "version >= 3", a "Configuration
Record" is stored in the underlying "Container", at the track header Record" is stored in the underlying "Container" as described in
level. It contains the "Parameters" used for all instances of Section 4.3.3. It contains the "Parameters" used for all instances
"Frame". The size of the "Configuration Record", "NumBytes", is of "Frame". The size of the "Configuration Record", "NumBytes", is
supplied by the underlying "Container". supplied by the underlying "Container".
pseudo-code | type pseudo-code | type
-----------------------------------------------------------|----- -----------------------------------------------------------|-----
ConfigurationRecord( NumBytes ) { | ConfigurationRecord( NumBytes ) { |
ConfigurationRecordIsPresent = 1 | ConfigurationRecordIsPresent = 1 |
Parameters( ) | Parameters( ) |
while (remaining_symbols_in_syntax(NumBytes - 4)) { | while (remaining_symbols_in_syntax(NumBytes - 4)) { |
reserved_for_future_use | br/ur/sr reserved_for_future_use | br/ur/sr
} | } |
configuration_record_crc_parity | u(32) configuration_record_crc_parity | u(32)
} | } |
4.2.1. reserved_for_future_use 4.3.1. reserved_for_future_use
"reserved_for_future_use" has semantics that are reserved for future "reserved_for_future_use" has semantics that are reserved for future
use. use.
Encoders conforming to this version of this specification SHALL NOT Encoders conforming to this version of this specification SHALL NOT
write this value. write this value.
Decoders conforming to this version of this specification SHALL Decoders conforming to this version of this specification SHALL
ignore its value. ignore its value.
4.2.2. configuration_record_crc_parity 4.3.2. configuration_record_crc_parity
"configuration_record_crc_parity" 32 bits that are chosen so that the "configuration_record_crc_parity" 32 bits that are chosen so that the
"Configuration Record" as a whole has a CRC remainder of 0. "Configuration Record" as a whole has a CRC remainder of 0.
This is equivalent to storing the CRC remainder in the 32-bit parity. This is equivalent to storing the CRC remainder in the 32-bit parity.
The CRC generator polynomial used is described in Section 4.8.3. The CRC generator polynomial used is described in Section 4.9.3.
4.2.3. Mapping FFV1 into Containers 4.3.3. Mapping FFV1 into Containers
This "Configuration Record" can be placed in any file format This "Configuration Record" can be placed in any file format
supporting "Configuration Records", fitting as much as possible with supporting "Configuration Records", fitting as much as possible with
how the file format uses to store "Configuration Records". The how the file format uses to store "Configuration Records". The
"Configuration Record" storage place and "NumBytes" are currently "Configuration Record" storage place and "NumBytes" are currently
defined and supported by this version of this specification for the defined and supported by this version of this specification for the
following formats: following formats:
4.2.3.1. AVI File Format 4.3.3.1. AVI File Format
The "Configuration Record" extends the stream format chunk ("AVI ", The "Configuration Record" extends the stream format chunk ("AVI ",
"hdlr", "strl", "strf") with the ConfigurationRecord bitstream. "hdlr", "strl", "strf") with the ConfigurationRecord bitstream.
See [AVI] for more information about chunks. See [AVI] for more information about chunks.
"NumBytes" is defined as the size, in bytes, of the strf chunk "NumBytes" is defined as the size, in bytes, of the strf chunk
indicated in the chunk header minus the size of the stream format indicated in the chunk header minus the size of the stream format
structure. structure.
4.2.3.2. ISO Base Media File Format 4.3.3.2. ISO Base Media File Format
The "Configuration Record" extends the sample description box The "Configuration Record" extends the sample description box
("moov", "trak", "mdia", "minf", "stbl", "stsd") with a "glbl" box ("moov", "trak", "mdia", "minf", "stbl", "stsd") with a "glbl" box
that contains the ConfigurationRecord bitstream. See that contains the ConfigurationRecord bitstream. See
[ISO.14496-12.2015] for more information about boxes. [ISO.14496-12.2015] for more information about boxes.
"NumBytes" is defined as the size, in bytes, of the "glbl" box "NumBytes" is defined as the size, in bytes, of the "glbl" box
indicated in the box header minus the size of the box header. indicated in the box header minus the size of the box header.
4.2.3.3. NUT File Format 4.3.3.3. NUT File Format
The "codec_specific_data" element (in "stream_header" packet) The "codec_specific_data" element (in "stream_header" packet)
contains the ConfigurationRecord bitstream. See [NUT] for more contains the ConfigurationRecord bitstream. See [NUT] for more
information about elements. information about elements.
"NumBytes" is defined as the size, in bytes, of the "NumBytes" is defined as the size, in bytes, of the
"codec_specific_data" element as indicated in the "length" field of "codec_specific_data" element as indicated in the "length" field of
"codec_specific_data". "codec_specific_data".
4.2.3.4. Matroska File Format 4.3.3.4. Matroska File Format
FFV1 SHOULD use "V_FFV1" as the Matroska "Codec ID". For FFV1 FFV1 SHOULD use "V_FFV1" as the Matroska "Codec ID". For FFV1
versions 2 or less, the Matroska "CodecPrivate" Element SHOULD NOT be versions 2 or less, the Matroska "CodecPrivate" Element SHOULD NOT be
used. For FFV1 versions 3 or greater, the Matroska "CodecPrivate" used. For FFV1 versions 3 or greater, the Matroska "CodecPrivate"
Element MUST contain the FFV1 "Configuration Record" structure and no Element MUST contain the FFV1 "Configuration Record" structure and no
other data. See [Matroska] for more information about elements. other data. See [Matroska] for more information about elements.
"NumBytes" is defined as the "Element Data Size" of the "NumBytes" is defined as the "Element Data Size" of the
"CodecPrivate" Element. "CodecPrivate" Element.
4.3. Frame 4.4. Frame
A "Frame" is an encoded representation of a complete static image. A "Frame" is an encoded representation of a complete static image.
The whole "Frame" is provided by the underlaying container. The whole "Frame" is provided by the underlaying container.
A "Frame" consists of the "keyframe" field, "Parameters" (if A "Frame" consists of the "keyframe" field, "Parameters" (if
"version" <= 1), and a sequence of independent slices. The pseudo- "version" <= 1), and a sequence of independent slices. The pseudo-
code below describes the contents of a "Frame". code below describes the contents of a "Frame".
"keyframe" field has its own initial state, set to 128.
pseudo-code | type pseudo-code | type
--------------------------------------------------------------|----- --------------------------------------------------------------|-----
Frame( NumBytes ) { | Frame( NumBytes ) { |
keyframe | br keyframe | br
if (keyframe && !ConfigurationRecordIsPresent { | if (keyframe && !ConfigurationRecordIsPresent { |
Parameters( ) | Parameters( ) |
} | } |
while (remaining_bits_in_bitstream( NumBytes )) { | while (remaining_bits_in_bitstream( NumBytes )) { |
Slice( ) | Slice( ) |
} | } |
skipping to change at page 38, line 5 skipping to change at page 40, line 5
+-----------------------------------------------------------------+ +-----------------------------------------------------------------+
| last slice header | | last slice header |
+-----------------------------------------------------------------+ +-----------------------------------------------------------------+
| last slice content | | last slice content |
+-----------------------------------------------------------------+ +-----------------------------------------------------------------+
| last slice footer | | last slice footer |
+-----------------------------------------------------------------+ +-----------------------------------------------------------------+
Table 16 Table 16
4.4. Slice 4.5. Slice
A "Slice" is an independent spatial sub-section of a "Frame" that is A "Slice" is an independent spatial sub-section of a "Frame" that is
encoded separately from another region of the same "Frame". The use encoded separately from another region of the same "Frame". The use
of more than one "Slice" per "Frame" can be useful for taking of more than one "Slice" per "Frame" can be useful for taking
advantage of the opportunities of multithreaded encoding and advantage of the opportunities of multithreaded encoding and
decoding. decoding.
A "Slice" consists of a "Slice Header" (when relevant), a "Slice A "Slice" consists of a "Slice Header" (when relevant), a "Slice
Content", and a "Slice Footer" (when relevant). The pseudo-code Content", and a "Slice Footer" (when relevant). The pseudo-code
below describes the contents of a "Slice". below describes the contents of a "Slice".
skipping to change at page 39, line 5 skipping to change at page 41, line 5
byte alignment. MUST be 0. byte alignment. MUST be 0.
"reserved" specifies a bit without any significance in this revision "reserved" specifies a bit without any significance in this revision
of the specification and may have a significance in a later revision of the specification and may have a significance in a later revision
of this specification. of this specification.
Encoders SHOULD NOT fill these bits. Encoders SHOULD NOT fill these bits.
Decoders SHOULD ignore these bits. Decoders SHOULD ignore these bits.
4.5. Slice Header 4.6. Slice Header
A "Slice Header" provides information about the decoding A "Slice Header" provides information about the decoding
configuration of the "Slice", such as its spatial position, size, and configuration of the "Slice", such as its spatial position, size, and
aspect ratio. The pseudo-code below describes the contents of the aspect ratio. The pseudo-code below describes the contents of the
"Slice Header". "Slice Header".
"Slice Header" has its own initial states, all set to 128.
pseudo-code | type pseudo-code | type
--------------------------------------------------------------|----- --------------------------------------------------------------|-----
SliceHeader( ) { | SliceHeader( ) { |
slice_x | ur slice_x | ur
slice_y | ur slice_y | ur
slice_width - 1 | ur slice_width - 1 | ur
slice_height - 1 | ur slice_height - 1 | ur
for (i = 0; i < quant_table_set_index_count; i++) { | for (i = 0; i < quant_table_set_index_count; i++) { |
quant_table_set_index[ i ] | ur quant_table_set_index[ i ] | ur
} | } |
picture_structure | ur picture_structure | ur
sar_num | ur sar_num | ur
sar_den | ur sar_den | ur
if (version >= 4) { | if (version >= 4) { |
reset_contexts | br reset_contexts | br
slice_coding_mode | ur slice_coding_mode | ur
} | } |
} | } |
4.5.1. slice_x 4.6.1. slice_x
"slice_x" indicates the x position on the slice raster formed by "slice_x" indicates the x position on the slice raster formed by
num_h_slices. num_h_slices.
Inferred to be 0 if not present. Inferred to be 0 if not present.
4.5.2. slice_y 4.6.2. slice_y
"slice_y" indicates the y position on the slice raster formed by "slice_y" indicates the y position on the slice raster formed by
num_v_slices. num_v_slices.
Inferred to be 0 if not present. Inferred to be 0 if not present.
4.5.3. slice_width 4.6.3. slice_width
"slice_width" indicates the width on the slice raster formed by "slice_width" indicates the width on the slice raster formed by
num_h_slices. num_h_slices.
Inferred to be 1 if not present. Inferred to be 1 if not present.
4.5.4. slice_height 4.6.4. slice_height
"slice_height" indicates the height on the slice raster formed by "slice_height" indicates the height on the slice raster formed by
num_v_slices. num_v_slices.
Inferred to be 1 if not present. Inferred to be 1 if not present.
4.5.5. quant_table_set_index_count 4.6.5. quant_table_set_index_count
"quant_table_set_index_count" is defined as: "quant_table_set_index_count" is defined as:
1 + ( ( chroma_planes || version <= 3 ) ? 1 : 0 ) + ( extra_plane ? 1 1 + ( ( chroma_planes || version <= 3 ) ? 1 : 0 ) + ( extra_plane ? 1
: 0 ) : 0 )
4.5.6. quant_table_set_index 4.6.6. quant_table_set_index
"quant_table_set_index" indicates the Quantization Table Set index to "quant_table_set_index" indicates the Quantization Table Set index to
select the Quantization Table Set and the initial states for the select the Quantization Table Set and the initial states for the
slice. "Slice Content".
Inferred to be 0 if not present. Inferred to be 0 if not present.
4.5.7. picture_structure 4.6.7. picture_structure
"picture_structure" specifies the temporal and spatial relationship "picture_structure" specifies the temporal and spatial relationship
of each "Line" of the "Frame". of each "Line" of the "Frame".
Inferred to be 0 if not present. Inferred to be 0 if not present.
+-------+-------------------------+ +-------+-------------------------+
| value | picture structure used | | value | picture structure used |
+=======+=========================+ +=======+=========================+
| 0 | unknown | | 0 | unknown |
skipping to change at page 41, line 5 skipping to change at page 43, line 5
+-------+-------------------------+ +-------+-------------------------+
| 2 | bottom field first | | 2 | bottom field first |
+-------+-------------------------+ +-------+-------------------------+
| 3 | progressive | | 3 | progressive |
+-------+-------------------------+ +-------+-------------------------+
| Other | reserved for future use | | Other | reserved for future use |
+-------+-------------------------+ +-------+-------------------------+
Table 17 Table 17
4.5.8. sar_num 4.6.8. sar_num
"sar_num" specifies the "Sample" aspect ratio numerator. "sar_num" specifies the "Sample" aspect ratio numerator.
Inferred to be 0 if not present. Inferred to be 0 if not present.
A value of 0 means that aspect ratio is unknown. A value of 0 means that aspect ratio is unknown.
Encoders MUST write 0 if "Sample" aspect ratio is unknown. Encoders MUST write 0 if "Sample" aspect ratio is unknown.
If "sar_den" is 0, decoders SHOULD ignore the encoded value and If "sar_den" is 0, decoders SHOULD ignore the encoded value and
consider that "sar_num" is 0. consider that "sar_num" is 0.
4.5.9. sar_den 4.6.9. sar_den
"sar_den" specifies the "Sample" aspect ratio denominator. "sar_den" specifies the "Sample" aspect ratio denominator.
Inferred to be 0 if not present. Inferred to be 0 if not present.
A value of 0 means that aspect ratio is unknown. A value of 0 means that aspect ratio is unknown.
Encoders MUST write 0 if "Sample" aspect ratio is unknown. Encoders MUST write 0 if "Sample" aspect ratio is unknown.
If "sar_num" is 0, decoders SHOULD ignore the encoded value and If "sar_num" is 0, decoders SHOULD ignore the encoded value and
consider that "sar_den" is 0. consider that "sar_den" is 0.
4.5.10. reset_contexts 4.6.10. reset_contexts
"reset_contexts" indicates if slice contexts must be reset. "reset_contexts" indicates if slice contexts must be reset.
Inferred to be 0 if not present. Inferred to be 0 if not present.
4.5.11. slice_coding_mode 4.6.11. slice_coding_mode
"slice_coding_mode" indicates the slice coding mode. "slice_coding_mode" indicates the slice coding mode.
Inferred to be 0 if not present. Inferred to be 0 if not present.
+-------+-----------------------------+ +-------+-----------------------------+
| value | slice coding mode | | value | slice coding mode |
+=======+=============================+ +=======+=============================+
| 0 | Range Coding or Golomb Rice | | 0 | Range Coding or Golomb Rice |
+-------+-----------------------------+ +-------+-----------------------------+
| 1 | raw PCM | | 1 | raw PCM |
+-------+-----------------------------+ +-------+-----------------------------+
| Other | reserved for future use | | Other | reserved for future use |
+-------+-----------------------------+ +-------+-----------------------------+
Table 18 Table 18
4.6. Slice Content 4.7. Slice Content
A "Slice Content" contains all "Line" elements part of the "Slice". A "Slice Content" contains all "Line" elements part of the "Slice".
Depending on the configuration, "Line" elements are ordered by Depending on the configuration, "Line" elements are ordered by
"Plane" then by row (YCbCr) or by row then by "Plane" (RGB). "Plane" then by row (YCbCr) or by row then by "Plane" (RGB).
pseudo-code | type pseudo-code | type
--------------------------------------------------------------|----- --------------------------------------------------------------|-----
SliceContent( ) { | SliceContent( ) { |
if (colorspace_type == 0) { | if (colorspace_type == 0) { |
skipping to change at page 42, line 42 skipping to change at page 44, line 42
} | } |
} else if (colorspace_type == 1) { | } else if (colorspace_type == 1) { |
for (y = 0; y < slice_pixel_height; y++) { | for (y = 0; y < slice_pixel_height; y++) { |
for (p = 0; p < primary_color_count; p++) { | for (p = 0; p < primary_color_count; p++) { |
Line( p, y ) | Line( p, y ) |
} | } |
} | } |
} | } |
} | } |
4.6.1. primary_color_count 4.7.1. primary_color_count
"primary_color_count" is defined as: "primary_color_count" is defined as:
1 + ( chroma_planes ? 2 : 0 ) + ( extra_plane ? 1 : 0 ) 1 + ( chroma_planes ? 2 : 0 ) + ( extra_plane ? 1 : 0 )
4.6.2. plane_pixel_height 4.7.2. plane_pixel_height
"plane_pixel_height[ p ]" is the height in "Pixels" of "Plane" p of "plane_pixel_height[ p ]" is the height in "Pixels" of "Plane" p of
the "Slice". It is defined as: the "Slice". It is defined as:
(chroma_planes == 1 && (p == 1 || p == 2)) ? ceil(slice_pixel_height (chroma_planes == 1 && (p == 1 || p == 2)) ? ceil(slice_pixel_height
/ (1 << log2_v_chroma_subsample)) : slice_pixel_height / (1 << log2_v_chroma_subsample)) : slice_pixel_height
4.6.3. slice_pixel_height 4.7.3. slice_pixel_height
"slice_pixel_height" is the height in pixels of the slice. It is "slice_pixel_height" is the height in pixels of the slice. It is
defined as: defined as:
floor( ( slice_y + slice_height ) * slice_pixel_height / num_v_slices floor( ( slice_y + slice_height ) * slice_pixel_height / num_v_slices
) - slice_pixel_y. ) - slice_pixel_y.
4.6.4. slice_pixel_y 4.7.4. slice_pixel_y
"slice_pixel_y" is the slice vertical position in pixels. It is "slice_pixel_y" is the slice vertical position in pixels. It is
defined as: defined as:
floor( slice_y * frame_pixel_height / num_v_slices ) floor( slice_y * frame_pixel_height / num_v_slices )
4.7. Line 4.8. Line
A "Line" is a list of the sample differences (relative to the A "Line" is a list of the sample differences (relative to the
predictor) of primary color components. The pseudo-code below predictor) of primary color components. The pseudo-code below
describes the contents of the "Line". describes the contents of the "Line".
pseudo-code | type pseudo-code | type
--------------------------------------------------------------|----- --------------------------------------------------------------|-----
Line( p, y ) { | Line( p, y ) { |
if (colorspace_type == 0) { | if (colorspace_type == 0) { |
for (x = 0; x < plane_pixel_width[ p ]; x++) { | for (x = 0; x < plane_pixel_width[ p ]; x++) { |
sample_difference[ p ][ y ][ x ] | sd sample_difference[ p ][ y ][ x ] | sd
} | } |
} else if (colorspace_type == 1) { | } else if (colorspace_type == 1) { |
for (x = 0; x < slice_pixel_width; x++) { | for (x = 0; x < slice_pixel_width; x++) { |
sample_difference[ p ][ y ][ x ] | sd sample_difference[ p ][ y ][ x ] | sd
} | } |
} | } |
} | } |
4.7.1. plane_pixel_width 4.8.1. plane_pixel_width
"plane_pixel_width[ p ]" is the width in "Pixels" of "Plane" p of the "plane_pixel_width[ p ]" is the width in "Pixels" of "Plane" p of the
"Slice". It is defined as: "Slice". It is defined as:
(chroma_planes == 1 && (p == 1 || p == 2)) ? ceil( slice_pixel_width (chroma_planes == 1 && (p == 1 || p == 2)) ? ceil( slice_pixel_width
/ (1 << log2_h_chroma_subsample) ) : slice_pixel_width. / (1 << log2_h_chroma_subsample) ) : slice_pixel_width.
4.7.2. slice_pixel_width 4.8.2. slice_pixel_width
"slice_pixel_width" is the width in "Pixels" of the slice. It is "slice_pixel_width" is the width in "Pixels" of the slice. It is
defined as: defined as:
floor( ( slice_x + slice_width ) * slice_pixel_width / num_h_slices ) floor( ( slice_x + slice_width ) * slice_pixel_width / num_h_slices )
- slice_pixel_x - slice_pixel_x
4.7.3. slice_pixel_x 4.8.3. slice_pixel_x
"slice_pixel_x" is the slice horizontal position in "Pixels". It is "slice_pixel_x" is the slice horizontal position in "Pixels". It is
defined as: defined as:
floor( slice_x * frame_pixel_width / num_h_slices ) floor( slice_x * frame_pixel_width / num_h_slices )
4.7.4. sample_difference 4.8.4. sample_difference
"sample_difference[ p ][ y ][ x ]" is the sample difference for "sample_difference[ p ][ y ][ x ]" is the sample difference for
"Sample" at "Plane" "p", y position "y", and x position "x". The "Sample" at "Plane" "p", y position "y", and x position "x". The
"Sample" value is computed based on median predictor and context "Sample" value is computed based on median predictor and context
described in Section 3.2. described in Section 3.2.
4.8. Slice Footer 4.9. Slice Footer
A "Slice Footer" provides information about slice size and A "Slice Footer" provides information about slice size and
(optionally) parity. The pseudo-code below describes the contents of (optionally) parity. The pseudo-code below describes the contents of
the "Slice Footer". the "Slice Footer".
Note: "Slice Footer" is always byte aligned. Note: "Slice Footer" is always byte aligned.
pseudo-code | type pseudo-code | type
--------------------------------------------------------------|----- --------------------------------------------------------------|-----
SliceFooter( ) { | SliceFooter( ) { |
slice_size | u(24) slice_size | u(24)
if (ec) { | if (ec) { |
error_status | u(8) error_status | u(8)
slice_crc_parity | u(32) slice_crc_parity | u(32)
} | } |
} | } |
4.8.1. slice_size 4.9.1. slice_size
"slice_size" indicates the size of the slice in bytes. "slice_size" indicates the size of the slice in bytes.
Note: this allows finding the start of slices before previous slices Note: this allows finding the start of slices before previous slices
have been fully decoded, and allows parallel decoding as well as have been fully decoded, and allows parallel decoding as well as
error resilience. error resilience.
4.8.2. error_status 4.9.2. error_status
"error_status" specifies the error status. "error_status" specifies the error status.
+-------+--------------------------------------+ +-------+--------------------------------------+
| value | error status | | value | error status |
+=======+======================================+ +=======+======================================+
| 0 | no error | | 0 | no error |
+-------+--------------------------------------+ +-------+--------------------------------------+
| 1 | slice contains a correctable error | | 1 | slice contains a correctable error |
+-------+--------------------------------------+ +-------+--------------------------------------+
| 2 | slice contains a uncorrectable error | | 2 | slice contains a uncorrectable error |
+-------+--------------------------------------+ +-------+--------------------------------------+
| Other | reserved for future use | | Other | reserved for future use |
+-------+--------------------------------------+ +-------+--------------------------------------+
Table 19 Table 19
4.8.3. slice_crc_parity 4.9.3. slice_crc_parity
"slice_crc_parity" 32 bits that are chosen so that the slice as a "slice_crc_parity" 32 bits that are chosen so that the slice as a
whole has a crc remainder of 0. whole has a crc remainder of 0.
This is equivalent to storing the crc remainder in the 32-bit parity. This is equivalent to storing the crc remainder in the 32-bit parity.
The CRC generator polynomial used is the standard IEEE CRC polynomial The CRC generator polynomial used is the standard IEEE CRC polynomial
(0x104C11DB7), with initial value 0, without pre-inversion and (0x104C11DB7), with initial value 0, without pre-inversion and
without post-inversion. without post-inversion.
4.9. Quantization Table Set
The Quantization Table Sets are stored by storing the number of equal
entries -1 of the first half of the table (represented as "len - 1"
in the pseudo-code below) using the method described in
Section 3.8.1.2. The second half doesn't need to be stored as it is
identical to the first with flipped sign. "scale" and "len_count[ i
][ j ]" are temporary values used for the computing of
"context_count[ i ]" and are not used outside Quantization Table Set
pseudo-code.
Example:
Table: 0 0 1 1 1 1 2 2 -2 -2 -2 -1 -1 -1 -1 0
Stored values: 1, 3, 1
pseudo-code | type
--------------------------------------------------------------|-----
QuantizationTableSet( i ) { |
scale = 1 |
for (j = 0; j < MAX_CONTEXT_INPUTS; j++) { |
QuantizationTable( i, j, scale ) |
scale *= 2 * len_count[ i ][ j ] - 1 |
} |
context_count[ i ] = ceil( scale / 2 ) |
} |
"MAX_CONTEXT_INPUTS" is 5.
pseudo-code | type
--------------------------------------------------------------|-----
QuantizationTable(i, j, scale) { |
v = 0 |
for (k = 0; k < 128;) { |
len - 1 | ur
for (a = 0; a < len; a++) { |
quant_tables[ i ][ j ][ k ] = scale * v |
k++ |
} |
v++ |
} |
for (k = 1; k < 128; k++) { |
quant_tables[ i ][ j ][ 256 - k ] = \ |
-quant_tables[ i ][ j ][ k ] |
} |
quant_tables[ i ][ j ][ 128 ] = \ |
-quant_tables[ i ][ j ][ 127 ] |
len_count[ i ][ j ] = v |
} |
4.9.1. quant_tables
"quant_tables[ i ][ j ][ k ]" indicates the quantification table
value of the Quantized Sample Difference "k" of the Quantization
Table "j" of the Set Quantization Table Set "i".
4.9.2. context_count
"context_count[ i ]" indicates the count of contexts for Quantization
Table Set "i". "context_count[ i ]" MUST be less than or equal to
32768.
5. Restrictions 5. Restrictions
To ensure that fast multithreaded decoding is possible, starting with To ensure that fast multithreaded decoding is possible, starting with
version 3 and if "frame_pixel_width * frame_pixel_height" is more version 3 and if "frame_pixel_width * frame_pixel_height" is more
than 101376, "slice_width * slice_height" MUST be less or equal to than 101376, "slice_width * slice_height" MUST be less or equal to
"num_h_slices * num_v_slices / 4". Note: 101376 is the frame size in "num_h_slices * num_v_slices / 4". Note: 101376 is the frame size in
"Pixels" of a 352x288 frame also known as CIF ("Common Intermediate "Pixels" of a 352x288 frame also known as CIF ("Common Intermediate
Format") frame size format. Format") frame size format.
For each "Frame", each position in the slice raster MUST be filled by For each "Frame", each position in the slice raster MUST be filled by
skipping to change at page 48, line 22 skipping to change at page 49, line 7
* Sending the decoder random packets that are not FFV1. * Sending the decoder random packets that are not FFV1.
In all of the conditions above, the decoder and encoder was run In all of the conditions above, the decoder and encoder was run
inside the [VALGRIND] memory debugger as well as clangs address inside the [VALGRIND] memory debugger as well as clangs address
sanitizer [Address-Sanitizer], which track reads and writes to sanitizer [Address-Sanitizer], which track reads and writes to
invalid memory regions as well as the use of uninitialized memory. invalid memory regions as well as the use of uninitialized memory.
There were no errors reported on any of the tested conditions. There were no errors reported on any of the tested conditions.
7. Media Type Definition 7. Media Type Definition
This section completes the media type registration template defined This registration is done using the template defined in [RFC6838] and
in [RFC6838] and following [RFC4855]. following [RFC4855].
Type name: video Type name: video
Subtype name: FFV1 Subtype name: FFV1
Required parameters: None. Required parameters: None.
Optional parameters: Optional parameters: These parameters are used to signal the
capabilities of a receiver implementation. These parameters MUST NOT
This parameter is used to signal the capabilities of a receiver be used for any other purpose.
implementation. This parameter MUST NOT be used for any other
purpose.
"version": The "version" of the FFV1 encoding as defined by
Section 4.1.1.
"micro_version": The "micro_version" of the FFV1 encoding as defined
by Section 4.1.2.
"coder_type": The "coder_type" of the FFV1 encoding as defined by * "version": The "version" of the FFV1 encoding as defined by
Section 4.1.3. Section 4.2.1.
"colorspace_type": The "colorspace_type" of the FFV1 encoding as * "micro_version": The "micro_version" of the FFV1 encoding as
defined by Section 4.1.5. defined by Section 4.2.2.
"bits_per_raw_sample": The "bits_per_raw_sample" of the FFV1 encoding * "coder_type": The "coder_type" of the FFV1 encoding as defined by
as defined by Section 4.1.7. Section 4.2.3.
"max_slices": The value of "max_slices" is an integer indicating the * "colorspace_type": The "colorspace_type" of the FFV1 encoding as
maximum count of slices with a frames of the FFV1 encoding. defined by Section 4.2.5.
Encoding considerations: * "bits_per_raw_sample": The "bits_per_raw_sample" of the FFV1
encoding as defined by Section 4.2.7.
This media type is defined for encapsulation in several audiovisual * "max_slices": The value of "max_slices" is an integer indicating
container formats and contains binary data; see Section 4.2.3. This the maximum count of slices with a frames of the FFV1 encoding.
media type is framed binary data; see Section 4.8 of [RFC6838].
Security considerations: Encoding considerations: This media type is defined for encapsulation
in several audiovisual container formats and contains binary data;
see Section 4.3.3. This media type is framed binary data; see
Section 4.8 of [RFC6838].
See Section 6 of this document. Security considerations: See Section 6 of this document.
Interoperability considerations: None. Interoperability considerations: None.
Published specification: Published specification: RFC XXXX.
RFC XXXX.
[RFC Editor: Upon publication as an RFC, please replace "XXXX" with [RFC Editor: Upon publication as an RFC, please replace "XXXX" with
the number assigned to this document and remove this note.] the number assigned to this document and remove this note.]
Applications which use this media type: Any application that requires
Applications which use this media type: the transport of lossless video can use this media type. Some
examples are, but not limited to screen recording, scientific
Any application that requires the transport of lossless video can use imaging, and digital video preservation.
this media type. Some examples are, but not limited to screen
recording, scientific imaging, and digital video preservation.
Fragment identifier considerations: N/A. Fragment identifier considerations: N/A.
Additional information: None. Additional information: None.
Person & email address to contact for further information: Michael Person & email address to contact for further information: Michael
Niedermayer michael@niedermayer.cc (mailto:michael@niedermayer.cc) Niedermayer michael@niedermayer.cc (mailto:michael@niedermayer.cc)
Intended usage: COMMON Intended usage: COMMON
skipping to change at page 50, line 15 skipping to change at page 50, line 40
9. Changelog 9. Changelog
See https://github.com/FFmpeg/FFV1/commits/master See https://github.com/FFmpeg/FFV1/commits/master
(https://github.com/FFmpeg/FFV1/commits/master) (https://github.com/FFmpeg/FFV1/commits/master)
[RFC Editor: Please remove this Changelog section prior to [RFC Editor: Please remove this Changelog section prior to
publication.] publication.]
10. Normative References 10. Normative References
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC6716] Valin, JM., Vos, K., and T. Terriberry, "Definition of the
Opus Audio Codec", RFC 6716, DOI 10.17487/RFC6716,
September 2012, <https://www.rfc-editor.org/info/rfc6716>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
[ISO.9899.1990]
International Organization for Standardization,
"Programming languages - C", 1990.
[ISO.15444-1.2016]
International Organization for Standardization,
"Information technology -- JPEG 2000 image coding system:
Core coding system", October 2016.
[Matroska] IETF, "Matroska", 2019, <https://datatracker.ietf.org/doc/ [Matroska] IETF, "Matroska", 2019, <https://datatracker.ietf.org/doc/
draft-ietf-cellar-matroska/>. draft-ietf-cellar-matroska/>.
[RFC4732] Handley, M., Ed., Rescorla, E., Ed., and IAB, "Internet [RFC4732] Handley, M., Ed., Rescorla, E., Ed., and IAB, "Internet
Denial-of-Service Considerations", RFC 4732, Denial-of-Service Considerations", RFC 4732,
DOI 10.17487/RFC4732, December 2006, DOI 10.17487/RFC4732, December 2006,
<https://www.rfc-editor.org/info/rfc4732>. <https://www.rfc-editor.org/info/rfc4732>.
[ISO.9899.2018]
International Organization for Standardization,
"Programming languages - C", 2018.
[ISO.9899.1990]
International Organization for Standardization,
"Programming languages - C", 1990.
[RFC4855] Casner, S., "Media Type Registration of RTP Payload [RFC4855] Casner, S., "Media Type Registration of RTP Payload
Formats", RFC 4855, DOI 10.17487/RFC4855, February 2007, Formats", RFC 4855, DOI 10.17487/RFC4855, February 2007,
<https://www.rfc-editor.org/info/rfc4855>. <https://www.rfc-editor.org/info/rfc4855>.
[ISO.15444-1.2016] [ISO.9899.2018]
International Organization for Standardization, International Organization for Standardization,
"Information technology -- JPEG 2000 image coding system: "Programming languages - C", 2018.
Core coding system", October 2016.
[RFC6716] Valin, JM., Vos, K., and T. Terriberry, "Definition of the
Opus Audio Codec", RFC 6716, DOI 10.17487/RFC6716,
September 2012, <https://www.rfc-editor.org/info/rfc6716>.
[RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type
Specifications and Registration Procedures", BCP 13, Specifications and Registration Procedures", BCP 13,
RFC 6838, DOI 10.17487/RFC6838, January 2013, RFC 6838, DOI 10.17487/RFC6838, January 2013,
<https://www.rfc-editor.org/info/rfc6838>. <https://www.rfc-editor.org/info/rfc6838>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 11. Informative References
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [REFIMPL] Niedermayer, M., "The reference FFV1 implementation / the
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, FFV1 codec in FFmpeg", undated, <https://ffmpeg.org>.
May 2017, <https://www.rfc-editor.org/info/rfc8174>.
11. Informative References [ISO.14496-10.2014]
International Organization for Standardization,
"Information technology -- Coding of audio-visual objects
-- Part 10: Advanced Video Coding", September 2014.
[range-coding]
Nigel, G. and N. Martin, "Range encoding: an algorithm for
removing redundancy from a digitised message.", July 1979.
[HuffYUV] Rudiak-Gould, B., "HuffYUV", December 2003,
<https://web.archive.org/web/20040402121343/
http://cultact-server.novi.dk/kpo/huffyuv/huffyuv.html>.
[AVI] Microsoft, "AVI RIFF File Reference", undated,
<https://msdn.microsoft.com/en-us/library/windows/desktop/
dd318189%28v=vs.85%29.aspx>.
[ISO.14496-12.2015] [ISO.14496-12.2015]
International Organization for Standardization, International Organization for Standardization,
"Information technology -- Coding of audio-visual objects "Information technology -- Coding of audio-visual objects
-- Part 12: ISO base media file format", December 2015. -- Part 12: ISO base media file format", December 2015.
[VALGRIND] Valgrind Developers, "Valgrind website", undated, [NUT] Niedermayer, M., "NUT Open Container Format", December
<https://valgrind.org/>. 2013, <https://ffmpeg.org/~michael/nut.txt>.
[I-D.ietf-cellar-ffv1]
Niedermayer, M., Rice, D., and J. Martinez, "FFV1 Video
Coding Format Version 0, 1, and 3", Work in Progress,
Internet-Draft, draft-ietf-cellar-ffv1-13, 28 April 2020,
<https://tools.ietf.org/html/draft-ietf-cellar-ffv1-13>.
[range-coding] [YCbCr] Wikipedia, "YCbCr", undated,
Nigel, G. and N. Martin, "Range encoding: an algorithm for <https://en.wikipedia.org/w/index.php?title=YCbCr>.
removing redundancy from a digitised message.", July 1979.
[ISO.14495-1.1999] [ISO.14495-1.1999]
International Organization for Standardization, International Organization for Standardization,
"Information technology -- Lossless and near-lossless "Information technology -- Lossless and near-lossless
compression of continuous-tone still images: Baseline", compression of continuous-tone still images: Baseline",
December 1999. December 1999.
[ISO.14496-10.2014] [I-D.ietf-cellar-ffv1]
International Organization for Standardization, Niedermayer, M., Rice, D., and J. Martinez, "FFV1 Video
"Information technology -- Coding of audio-visual objects Coding Format Version 0, 1, and 3", Work in Progress,
-- Part 10: Advanced Video Coding", September 2014. Internet-Draft, draft-ietf-cellar-ffv1-14, 26 May 2020,
<https://tools.ietf.org/html/draft-ietf-cellar-ffv1-14>.
[YCbCr] Wikipedia, "YCbCr", undated,
<https://en.wikipedia.org/w/index.php?title=YCbCr>.
[AVI] Microsoft, "AVI RIFF File Reference", undated, [VALGRIND] Valgrind Developers, "Valgrind website", undated,
<https://msdn.microsoft.com/en-us/library/windows/desktop/ <https://valgrind.org/>.
dd318189%28v=vs.85%29.aspx>.
[Address-Sanitizer] [Address-Sanitizer]
The Clang Team, "ASAN AddressSanitizer website", undated, The Clang Team, "ASAN AddressSanitizer website", undated,
<https://clang.llvm.org/docs/AddressSanitizer.html>. <https://clang.llvm.org/docs/AddressSanitizer.html>.
[NUT] Niedermayer, M., "NUT Open Container Format", December
2013, <https://ffmpeg.org/~michael/nut.txt>.
[REFIMPL] Niedermayer, M., "The reference FFV1 implementation / the
FFV1 codec in FFmpeg", undated, <https://ffmpeg.org>.
[HuffYUV] Rudiak-Gould, B., "HuffYUV", December 2003,
<https://web.archive.org/web/20040402121343/
http://cultact-server.novi.dk/kpo/huffyuv/huffyuv.html>.
Appendix A. Multi-theaded decoder implementation suggestions Appendix A. Multi-theaded decoder implementation suggestions
This appendix is informative. This appendix is informative.
The FFV1 bitstream is parsable in two ways: in sequential order as The FFV1 bitstream is parsable in two ways: in sequential order as
described in this document or with the pre-analysis of the footer of described in this document or with the pre-analysis of the footer of
each slice. Each slice footer contains a "slice_size" field so the each slice. Each slice footer contains a "slice_size" field so the
boundary of each slice is computable without having to parse the boundary of each slice is computable without having to parse the
slice content. That allows multi-threading as well as independence slice content. That allows multi-threading as well as independence
of slice content (a bitstream error in a slice header or slice of slice content (a bitstream error in a slice header or slice
 End of changes. 115 change blocks. 
371 lines changed or deleted 395 lines changed or added

This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/