draft-ietf-cellar-ffv1-14.txt | draft-ietf-cellar-ffv1-15.txt | |||
---|---|---|---|---|
cellar M. Niedermayer | cellar M. Niedermayer | |||
Internet-Draft | Internet-Draft | |||
Intended status: Informational D. Rice | Intended status: Informational 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 0, 1, and 3 | FFV1 Video Coding Format Version 0, 1, and 3 | |||
draft-ietf-cellar-ffv1-14 | draft-ietf-cellar-ffv1-15 | |||
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 . . . . . . . . . . . . . . . 29 | 4.2.1. version . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
4.1.5. colorspace_type . . . . . . . . . . . . . . . . . . . 30 | 4.2.2. micro_version . . . . . . . . . . . . . . . . . . . . 30 | |||
4.1.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 30 | 4.2.3. coder_type . . . . . . . . . . . . . . . . . . . . . 31 | |||
4.1.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 31 | 4.2.4. state_transition_delta . . . . . . . . . . . . . . . 31 | |||
4.1.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 31 | 4.2.5. colorspace_type . . . . . . . . . . . . . . . . . . . 32 | |||
4.1.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 31 | 4.2.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 32 | |||
4.1.10. extra_plane . . . . . . . . . . . . . . . . . . . . . 31 | 4.2.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 33 | |||
4.1.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 32 | 4.2.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 33 | |||
4.1.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 32 | 4.2.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 33 | |||
4.1.13. quant_table_set_count . . . . . . . . . . . . . . . . 32 | 4.2.10. extra_plane . . . . . . . . . . . . . . . . . . . . . 33 | |||
4.1.14. states_coded . . . . . . . . . . . . . . . . . . . . 32 | 4.2.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 34 | |||
4.1.15. initial_state_delta . . . . . . . . . . . . . . . . . 32 | 4.2.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 34 | |||
4.1.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 33 | 4.2.13. quant_table_set_count . . . . . . . . . . . . . . . . 34 | |||
4.1.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 33 | 4.2.14. states_coded . . . . . . . . . . . . . . . . . . . . 34 | |||
4.2. Configuration Record . . . . . . . . . . . . . . . . . . 34 | 4.2.15. initial_state_delta . . . . . . . . . . . . . . . . . 34 | |||
4.2.1. reserved_for_future_use . . . . . . . . . . . . . . . 34 | 4.2.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
4.2.2. configuration_record_crc_parity . . . . . . . . . . . 34 | 4.2.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
4.2.3. Mapping FFV1 into Containers . . . . . . . . . . . . 34 | 4.3. Configuration Record . . . . . . . . . . . . . . . . . . 36 | |||
4.3. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | 4.3.1. reserved_for_future_use . . . . . . . . . . . . . . . 36 | |||
4.4. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | 4.3.2. configuration_record_crc_parity . . . . . . . . . . . 36 | |||
4.5. Slice Header . . . . . . . . . . . . . . . . . . . . . . 38 | 4.3.3. Mapping FFV1 into Containers . . . . . . . . . . . . 36 | |||
4.5.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 38 | 4.4. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
4.5.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 38 | 4.5. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
4.5.3. slice_width . . . . . . . . . . . . . . . . . . . . . 38 | 4.6. Slice Header . . . . . . . . . . . . . . . . . . . . . . 40 | |||
4.5.4. slice_height . . . . . . . . . . . . . . . . . . . . 38 | 4.6.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
4.5.5. quant_table_set_index_count . . . . . . . . . . . . . 39 | 4.6.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
4.5.6. quant_table_set_index . . . . . . . . . . . . . . . . 39 | 4.6.3. slice_width . . . . . . . . . . . . . . . . . . . . . 41 | |||
4.5.7. picture_structure . . . . . . . . . . . . . . . . . . 39 | 4.6.4. slice_height . . . . . . . . . . . . . . . . . . . . 41 | |||
4.5.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 39 | 4.6.5. quant_table_set_index_count . . . . . . . . . . . . . 41 | |||
4.5.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 40 | 4.6.6. quant_table_set_index . . . . . . . . . . . . . . . . 42 | |||
4.6. Slice Content . . . . . . . . . . . . . . . . . . . . . . 40 | 4.6.7. picture_structure . . . . . . . . . . . . . . . . . . 42 | |||
4.6.1. primary_color_count . . . . . . . . . . . . . . . . . 40 | 4.6.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
4.6.2. plane_pixel_height . . . . . . . . . . . . . . . . . 41 | 4.6.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
4.6.3. slice_pixel_height . . . . . . . . . . . . . . . . . 41 | 4.7. Slice Content . . . . . . . . . . . . . . . . . . . . . . 43 | |||
4.6.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 41 | 4.7.1. primary_color_count . . . . . . . . . . . . . . . . . 43 | |||
4.7. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 4.7.2. plane_pixel_height . . . . . . . . . . . . . . . . . 43 | |||
4.7.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 41 | 4.7.3. slice_pixel_height . . . . . . . . . . . . . . . . . 44 | |||
4.7.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 42 | 4.7.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 44 | |||
4.7.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 42 | 4.8. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 44 | |||
4.7.4. sample_difference . . . . . . . . . . . . . . . . . . 42 | 4.8.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 44 | |||
4.8. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 42 | 4.8.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 45 | |||
4.8.1. slice_size . . . . . . . . . . . . . . . . . . . . . 42 | 4.8.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 45 | |||
4.8.2. error_status . . . . . . . . . . . . . . . . . . . . 43 | 4.8.4. sample_difference . . . . . . . . . . . . . . . . . . 45 | |||
4.8.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 43 | 4.9. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 45 | |||
4.9. Quantization Table Set . . . . . . . . . . . . . . . . . 43 | 4.9.1. slice_size . . . . . . . . . . . . . . . . . . . . . 45 | |||
4.9.1. quant_tables . . . . . . . . . . . . . . . . . . . . 44 | 4.9.2. error_status . . . . . . . . . . . . . . . . . . . . 46 | |||
4.9.2. context_count . . . . . . . . . . . . . . . . . . . . 44 | 4.9.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 46 | |||
5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 45 | 5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 45 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 47 | |||
7. Media Type Definition . . . . . . . . . . . . . . . . . . . . 46 | 7. Media Type Definition . . . . . . . . . . . . . . . . . . . . 48 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 49 | |||
9. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 48 | 9. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 49 | |||
10. Normative References . . . . . . . . . . . . . . . . . . . . 48 | 10. Normative References . . . . . . . . . . . . . . . . . . . . 49 | |||
11. Informative References . . . . . . . . . . . . . . . . . . . 49 | 11. Informative References . . . . . . . . . . . . . . . . . . . 50 | |||
Appendix A. Multi-theaded decoder implementation suggestions . . 50 | 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 . . . . . . . . . . . . . . . . . . . 50 | conforming encoders . . . . . . . . . . . . . . . . . . . 52 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 51 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
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 5, line 15 ¶ | skipping to change at page 5, line 15 ¶ | |||
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 39 ¶ | skipping to change at page 8, line 39 ¶ | |||
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 23 ¶ | skipping to change at page 9, line 23 ¶ | |||
)" 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 36 ¶ | skipping to change at page 30, line 36 ¶ | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| 3 | FFV1 version 3 | | | 3 | FFV1 version 3 | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| 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 21 ¶ | skipping to change at page 31, line 21 ¶ | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| Other | reserved for future use | | | Other | reserved for future use | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
Table 6: The definitions for | Table 6: The definitions for | |||
"micro_version" values for FFV1 | "micro_version" values for FFV1 | |||
version 3. | version 3. | |||
* development versions may be incompatible with the stable variants. | * development versions may be incompatible with the stable 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 29, line 48 ¶ | skipping to change at page 31, line 48 ¶ | |||
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 30, line 38 ¶ | skipping to change at page 32, line 38 ¶ | |||
| | for future | future use | future use | for future | | | | for future | future use | future use | for future | | |||
| | use | | | use | | | | use | | | use | | |||
+-------+-------------+----------------+--------------+-------------+ | +-------+-------------+----------------+--------------+-------------+ | |||
Table 8 | Table 8 | |||
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 9 | Table 9 | |||
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 10 | Table 10 | |||
* 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 11 | Table 11 | |||
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 12 | Table 12 | |||
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 13 | Table 13 | |||
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 14 | Table 14 | |||
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 37, line 5 ¶ | skipping to change at page 39, line 36 ¶ | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| last slice header | | | last slice header | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| last slice content | | | last slice content | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| last slice footer | | | last slice footer | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
Table 15 | Table 15 | |||
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 38, line 5 ¶ | skipping to change at page 40, line 38 ¶ | |||
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 | |||
} | | } | | |||
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 39, line 45 ¶ | skipping to change at page 42, line 39 ¶ | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| 2 | bottom field first | | | 2 | bottom field first | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| 3 | progressive | | | 3 | progressive | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| Other | reserved for future use | | | Other | reserved for future use | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
Table 16 | Table 16 | |||
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.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 40, line 48 ¶ | skipping to change at page 43, line 43 ¶ | |||
} | | } | | |||
} 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 17 | Table 17 | |||
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 46, line 22 ¶ | skipping to change at page 48, 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 48, line 15 ¶ | skipping to change at page 49, 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 | |||
[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/ | ||||
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>. | |||
[RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | ||||
Specifications and Registration Procedures", BCP 13, | ||||
RFC 6838, DOI 10.17487/RFC6838, January 2013, | ||||
<https://www.rfc-editor.org/info/rfc6838>. | ||||
[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.9899.2018] | ||||
International Organization for Standardization, | ||||
"Programming languages - C", 2018. | ||||
[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>. | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[ISO.9899.1990] | [ISO.9899.1990] | |||
International Organization for Standardization, | International Organization for Standardization, | |||
"Programming languages - C", 1990. | "Programming languages - C", 1990. | |||
[RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | [ISO.9899.2018] | |||
Specifications and Registration Procedures", BCP 13, | International Organization for Standardization, | |||
RFC 6838, DOI 10.17487/RFC6838, January 2013, | "Programming languages - C", 2018. | |||
<https://www.rfc-editor.org/info/rfc6838>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
11. Informative References | [Matroska] IETF, "Matroska", 2019, <https://datatracker.ietf.org/doc/ | |||
draft-ietf-cellar-matroska/>. | ||||
[YCbCr] Wikipedia, "YCbCr", undated, | [ISO.15444-1.2016] | |||
<https://en.wikipedia.org/w/index.php?title=YCbCr>. | International Organization for Standardization, | |||
"Information technology -- JPEG 2000 image coding system: | ||||
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>. | ||||
11. Informative References | ||||
[REFIMPL] Niedermayer, M., "The reference FFV1 implementation / the | [REFIMPL] Niedermayer, M., "The reference FFV1 implementation / the | |||
FFV1 codec in FFmpeg", undated, <https://ffmpeg.org>. | FFV1 codec in FFmpeg", undated, <https://ffmpeg.org>. | |||
[Address-Sanitizer] | [range-coding] | |||
The Clang Team, "ASAN AddressSanitizer website", undated, | Nigel, G. and N. Martin, "Range encoding: an algorithm for | |||
<https://clang.llvm.org/docs/AddressSanitizer.html>. | removing redundancy from a digitised message.", July 1979. | |||
[NUT] Niedermayer, M., "NUT Open Container Format", December | ||||
2013, <https://ffmpeg.org/~michael/nut.txt>. | ||||
[VALGRIND] Valgrind Developers, "Valgrind website", undated, | [VALGRIND] Valgrind Developers, "Valgrind website", undated, | |||
<https://valgrind.org/>. | <https://valgrind.org/>. | |||
[ISO.14495-1.1999] | ||||
International Organization for Standardization, | ||||
"Information technology -- Lossless and near-lossless | ||||
compression of continuous-tone still images: Baseline", | ||||
December 1999. | ||||
[ISO.14496-10.2014] | ||||
International Organization for Standardization, | ||||
"Information technology -- Coding of audio-visual objects | ||||
-- Part 10: Advanced Video Coding", September 2014. | ||||
[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. | |||
[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, | [AVI] Microsoft, "AVI RIFF File Reference", undated, | |||
<https://msdn.microsoft.com/en-us/library/windows/desktop/ | <https://msdn.microsoft.com/en-us/library/windows/desktop/ | |||
dd318189%28v=vs.85%29.aspx>. | dd318189%28v=vs.85%29.aspx>. | |||
[NUT] Niedermayer, M., "NUT Open Container Format", December | [HuffYUV] Rudiak-Gould, B., "HuffYUV", December 2003, | |||
2013, <https://ffmpeg.org/~michael/nut.txt>. | <https://web.archive.org/web/20040402121343/ | |||
http://cultact-server.novi.dk/kpo/huffyuv/huffyuv.html>. | ||||
[FFV1_V3] Niedermayer, M., "Commit to mark FFV1 version 3 as non- | ||||
experimental", August 2013, <https://git.videolan.org/?p=f | ||||
fmpeg.git;a=commit;h=abe76b851c05eea8743f6c899cbe5f7409b0f | ||||
301>. | ||||
[range-coding] | ||||
Nigel, G. and N. Martin, "Range encoding: an algorithm for | ||||
removing redundancy from a digitised message.", July 1979. | ||||
[FFV1_V0] Niedermayer, M., "Commit to mark FFV1 version 0 as non- | [FFV1_V0] Niedermayer, M., "Commit to mark FFV1 version 0 as non- | |||
experimental", April 2006, <https://git.videolan.org/?p=ff | experimental", April 2006, <https://git.videolan.org/?p=ff | |||
mpeg.git;a=commit;h=b548f2b91b701e1235608ac882ea6df915167c | mpeg.git;a=commit;h=b548f2b91b701e1235608ac882ea6df915167c | |||
7e>. | 7e>. | |||
[ISO.14496-10.2014] | ||||
International Organization for Standardization, | ||||
"Information technology -- Coding of audio-visual objects | ||||
-- Part 10: Advanced Video Coding", September 2014. | ||||
[FFV1_V1] Niedermayer, M., "Commit to release FFV1 version 1", April | [FFV1_V1] Niedermayer, M., "Commit to release FFV1 version 1", April | |||
2009, <https://git.videolan.org/?p=ffmpeg.git;a=commit;h=6 | 2009, <https://git.videolan.org/?p=ffmpeg.git;a=commit;h=6 | |||
8f8d33becbd73b4d0aa277f472a6e8e72ea6849>. | 8f8d33becbd73b4d0aa277f472a6e8e72ea6849>. | |||
[YCbCr] Wikipedia, "YCbCr", undated, | ||||
<https://en.wikipedia.org/w/index.php?title=YCbCr>. | ||||
[ISO.14495-1.1999] | ||||
International Organization for Standardization, | ||||
"Information technology -- Lossless and near-lossless | ||||
compression of continuous-tone still images: Baseline", | ||||
December 1999. | ||||
[Address-Sanitizer] | ||||
The Clang Team, "ASAN AddressSanitizer website", undated, | ||||
<https://clang.llvm.org/docs/AddressSanitizer.html>. | ||||
[FFV1_V3] Niedermayer, M., "Commit to mark FFV1 version 3 as non- | ||||
experimental", August 2013, <https://git.videolan.org/?p=f | ||||
fmpeg.git;a=commit;h=abe76b851c05eea8743f6c899cbe5f7409b0f | ||||
301>. | ||||
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. 112 change blocks. | ||||
370 lines changed or deleted | 394 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/ |