draft-ietf-cellar-ffv1-v4-14.txt | draft-ietf-cellar-ffv1-v4-15.txt | |||
---|---|---|---|---|
cellar M. Niedermayer | cellar M. Niedermayer | |||
Internet-Draft | Internet-Draft | |||
Intended status: Standards Track D. Rice | Intended status: Standards Track D. Rice | |||
Expires: 22 February 2021 | Expires: 10 April 2021 | |||
J. Martinez | J. Martinez | |||
21 August 2020 | 7 October 2020 | |||
FFV1 Video Coding Format Version 4 | FFV1 Video Coding Format Version 4 | |||
draft-ietf-cellar-ffv1-v4-14 | draft-ietf-cellar-ffv1-v4-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 22 February 2021. | This Internet-Draft will expire on 10 April 2021. | |||
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 20 ¶ | skipping to change at page 2, line 20 ¶ | |||
extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2. Notation and Conventions . . . . . . . . . . . . . . . . . . 4 | 2. Notation and Conventions . . . . . . . . . . . . . . . . . . 4 | |||
2.1. Definitions . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. Definitions . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2.2. Conventions . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.2. Conventions . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.2.1. Pseudo-code . . . . . . . . . . . . . . . . . . . . . 5 | 2.2.1. Pseudo-code . . . . . . . . . . . . . . . . . . . . . 6 | |||
2.2.2. Arithmetic Operators . . . . . . . . . . . . . . . . 6 | 2.2.2. Arithmetic Operators . . . . . . . . . . . . . . . . 6 | |||
2.2.3. Assignment Operators . . . . . . . . . . . . . . . . 6 | 2.2.3. Assignment Operators . . . . . . . . . . . . . . . . 7 | |||
2.2.4. Comparison Operators . . . . . . . . . . . . . . . . 7 | 2.2.4. Comparison Operators . . . . . . . . . . . . . . . . 7 | |||
2.2.5. Mathematical Functions . . . . . . . . . . . . . . . 7 | 2.2.5. Mathematical Functions . . . . . . . . . . . . . . . 7 | |||
2.2.6. Order of Operation Precedence . . . . . . . . . . . . 8 | 2.2.6. Order of Operation Precedence . . . . . . . . . . . . 8 | |||
2.2.7. Range . . . . . . . . . . . . . . . . . . . . . . . . 8 | 2.2.7. Range . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
2.2.8. NumBytes . . . . . . . . . . . . . . . . . . . . . . 8 | 2.2.8. NumBytes . . . . . . . . . . . . . . . . . . . . . . 9 | |||
2.2.9. Bitstream Functions . . . . . . . . . . . . . . . . . 9 | 2.2.9. Bitstream Functions . . . . . . . . . . . . . . . . . 9 | |||
3. Sample Coding . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3. Sample Coding . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
3.1. Border . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3.1. Border . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
3.2. Samples . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 3.2. Samples . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
3.3. Median Predictor . . . . . . . . . . . . . . . . . . . . 11 | 3.3. Median Predictor . . . . . . . . . . . . . . . . . . . . 11 | |||
3.4. Quantization Table Sets . . . . . . . . . . . . . . . . . 12 | 3.4. Quantization Table Sets . . . . . . . . . . . . . . . . . 12 | |||
3.5. Context . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 3.5. Context . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
3.6. Quantization Table Set Indexes . . . . . . . . . . . . . 12 | 3.6. Quantization Table Set Indexes . . . . . . . . . . . . . 12 | |||
3.7. Color spaces . . . . . . . . . . . . . . . . . . . . . . 13 | 3.7. Color spaces . . . . . . . . . . . . . . . . . . . . . . 13 | |||
3.7.1. YCbCr . . . . . . . . . . . . . . . . . . . . . . . . 13 | 3.7.1. YCbCr . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
3.7.2. RGB . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 3.7.2. RGB . . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
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 . . . . . . . . . . . . . . . . . . 21 | 3.8.2. Golomb Rice Mode . . . . . . . . . . . . . . . . . . 22 | |||
4. Bitstream . . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 4. Bitstream . . . . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
4.1. Quantization Table Set . . . . . . . . . . . . . . . . . 27 | 4.1. Quantization Table Set . . . . . . . . . . . . . . . . . 29 | |||
4.1.1. quant_tables . . . . . . . . . . . . . . . . . . . . 28 | 4.1.1. quant_tables . . . . . . . . . . . . . . . . . . . . 30 | |||
4.1.2. context_count . . . . . . . . . . . . . . . . . . . . 29 | 4.1.2. context_count . . . . . . . . . . . . . . . . . . . . 31 | |||
4.2. Parameters . . . . . . . . . . . . . . . . . . . . . . . 29 | 4.2. Parameters . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
4.2.1. version . . . . . . . . . . . . . . . . . . . . . . . 31 | 4.2.1. version . . . . . . . . . . . . . . . . . . . . . . . 33 | |||
4.2.2. micro_version . . . . . . . . . . . . . . . . . . . . 31 | 4.2.2. micro_version . . . . . . . . . . . . . . . . . . . . 33 | |||
4.2.3. coder_type . . . . . . . . . . . . . . . . . . . . . 32 | 4.2.3. coder_type . . . . . . . . . . . . . . . . . . . . . 34 | |||
4.2.4. state_transition_delta . . . . . . . . . . . . . . . 33 | 4.2.4. state_transition_delta . . . . . . . . . . . . . . . 35 | |||
4.2.5. colorspace_type . . . . . . . . . . . . . . . . . . . 33 | 4.2.5. colorspace_type . . . . . . . . . . . . . . . . . . . 35 | |||
4.2.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 34 | 4.2.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 36 | |||
4.2.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 34 | 4.2.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 36 | |||
4.2.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 35 | 4.2.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 37 | |||
4.2.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 35 | 4.2.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 37 | |||
4.2.10. extra_plane . . . . . . . . . . . . . . . . . . . . . 35 | 4.2.10. extra_plane . . . . . . . . . . . . . . . . . . . . . 37 | |||
4.2.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 35 | 4.2.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 37 | |||
4.2.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 36 | 4.2.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 38 | |||
4.2.13. quant_table_set_count . . . . . . . . . . . . . . . . 36 | 4.2.13. quant_table_set_count . . . . . . . . . . . . . . . . 38 | |||
4.2.14. states_coded . . . . . . . . . . . . . . . . . . . . 36 | 4.2.14. states_coded . . . . . . . . . . . . . . . . . . . . 38 | |||
4.2.15. initial_state_delta . . . . . . . . . . . . . . . . . 36 | 4.2.15. initial_state_delta . . . . . . . . . . . . . . . . . 38 | |||
4.2.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 37 | 4.2.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
4.2.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 37 | 4.2.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
4.3. Configuration Record . . . . . . . . . . . . . . . . . . 37 | 4.3. Configuration Record . . . . . . . . . . . . . . . . . . 39 | |||
4.3.1. reserved_for_future_use . . . . . . . . . . . . . . . 38 | 4.3.1. reserved_for_future_use . . . . . . . . . . . . . . . 40 | |||
4.3.2. configuration_record_crc_parity . . . . . . . . . . . 38 | 4.3.2. configuration_record_crc_parity . . . . . . . . . . . 40 | |||
4.3.3. Mapping FFV1 into Containers . . . . . . . . . . . . 38 | 4.3.3. Mapping FFV1 into Containers . . . . . . . . . . . . 40 | |||
4.4. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 39 | 4.4. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
4.5. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 4.5. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
4.6. Slice Header . . . . . . . . . . . . . . . . . . . . . . 42 | 4.6. Slice Header . . . . . . . . . . . . . . . . . . . . . . 44 | |||
4.6.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 42 | 4.6.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 44 | |||
4.6.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 42 | 4.6.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 44 | |||
4.6.3. slice_width . . . . . . . . . . . . . . . . . . . . . 42 | 4.6.3. slice_width . . . . . . . . . . . . . . . . . . . . . 44 | |||
4.6.4. slice_height . . . . . . . . . . . . . . . . . . . . 43 | 4.6.4. slice_height . . . . . . . . . . . . . . . . . . . . 45 | |||
4.6.5. quant_table_set_index_count . . . . . . . . . . . . . 43 | 4.6.5. quant_table_set_index_count . . . . . . . . . . . . . 45 | |||
4.6.6. quant_table_set_index . . . . . . . . . . . . . . . . 43 | 4.6.6. quant_table_set_index . . . . . . . . . . . . . . . . 45 | |||
4.6.7. picture_structure . . . . . . . . . . . . . . . . . . 43 | 4.6.7. picture_structure . . . . . . . . . . . . . . . . . . 45 | |||
4.6.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 44 | 4.6.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
4.6.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 44 | 4.6.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
4.6.10. reset_contexts . . . . . . . . . . . . . . . . . . . 44 | 4.6.10. reset_contexts . . . . . . . . . . . . . . . . . . . 46 | |||
4.6.11. slice_coding_mode . . . . . . . . . . . . . . . . . . 44 | 4.6.11. slice_coding_mode . . . . . . . . . . . . . . . . . . 46 | |||
4.7. Slice Content . . . . . . . . . . . . . . . . . . . . . . 45 | 4.7. Slice Content . . . . . . . . . . . . . . . . . . . . . . 47 | |||
4.7.1. primary_color_count . . . . . . . . . . . . . . . . . 45 | 4.7.1. primary_color_count . . . . . . . . . . . . . . . . . 47 | |||
4.7.2. plane_pixel_height . . . . . . . . . . . . . . . . . 45 | 4.7.2. plane_pixel_height . . . . . . . . . . . . . . . . . 47 | |||
4.7.3. slice_pixel_height . . . . . . . . . . . . . . . . . 46 | 4.7.3. slice_pixel_height . . . . . . . . . . . . . . . . . 48 | |||
4.7.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 46 | 4.7.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 48 | |||
4.8. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | 4.8. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 48 | |||
4.8.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 46 | 4.8.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 48 | |||
4.8.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 47 | 4.8.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 49 | |||
4.8.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 47 | 4.8.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 49 | |||
4.8.4. sample_difference . . . . . . . . . . . . . . . . . . 47 | 4.8.4. sample_difference . . . . . . . . . . . . . . . . . . 49 | |||
4.9. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 47 | 4.9. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 49 | |||
4.9.1. slice_size . . . . . . . . . . . . . . . . . . . . . 48 | 4.9.1. slice_size . . . . . . . . . . . . . . . . . . . . . 50 | |||
4.9.2. error_status . . . . . . . . . . . . . . . . . . . . 48 | 4.9.2. error_status . . . . . . . . . . . . . . . . . . . . 50 | |||
4.9.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 48 | 4.9.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 50 | |||
5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 48 | 5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 50 | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 49 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 51 | |||
7. Media Type Definition . . . . . . . . . . . . . . . . . . . . 50 | 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 52 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 51 | 7.1. Media Type Definition . . . . . . . . . . . . . . . . . . 52 | |||
9. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | 8. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 53 | |||
10. Normative References . . . . . . . . . . . . . . . . . . . . 51 | 9. Normative References . . . . . . . . . . . . . . . . . . . . 53 | |||
11. Informative References . . . . . . . . . . . . . . . . . . . 52 | 10. Informative References . . . . . . . . . . . . . . . . . . . 54 | |||
Appendix A. Multi-theaded decoder implementation suggestions . . 54 | Appendix A. Multi-theaded decoder implementation suggestions . . 55 | |||
Appendix B. Future handling of some streams created by non | Appendix B. Future handling of some streams created by non | |||
conforming encoders . . . . . . . . . . . . . . . . . . . 54 | conforming encoders . . . . . . . . . . . . . . . . . . . 56 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 54 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 56 | |||
1. Introduction | 1. Introduction | |||
This document describes FFV1, a lossless video encoding format. The | This document describes FFV1, a lossless video encoding format. The | |||
design of FFV1 considers the storage of image characteristics, data | design of FFV1 considers the storage of image characteristics, data | |||
fixity, and the optimized use of encoding time and storage | fixity, and the optimized use of encoding time and storage | |||
requirements. FFV1 is designed to support a wide range of lossless | requirements. FFV1 is designed to support a wide range of lossless | |||
video applications such as long-term audiovisual preservation, | video applications such as long-term audiovisual preservation, | |||
scientific imaging, screen recording, and other video encoding | scientific imaging, screen recording, and other video encoding | |||
scenarios that seek to avoid the generational loss of lossy video | scenarios that seek to avoid the generational loss of lossy video | |||
skipping to change at page 4, line 46 ¶ | skipping to change at page 4, line 46 ¶ | |||
2. Notation and Conventions | 2. Notation and Conventions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
2.1. Definitions | 2.1. Definitions | |||
"Container": Format that encapsulates "Frames" (see Section 4.4) and | "FFV1": choosen name of this video encoding format, short version of | |||
"FF Video 1", the letters "FF" coming from "FFmpeg", the name of the | ||||
reference decoder, whose the first letters originaly means "Fast | ||||
Forward". | ||||
"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 (Y), Blue-difference Chroma (Cb), Red-difference Chroma (Cr), | Luma (Y), Blue-difference Chroma (Cb), Red-difference Chroma (Cr), | |||
Transparency, Red, Green, and Blue. | Transparency, Red, Green, and Blue. | |||
"Plane": A discrete component of a static image comprised of | "Symbol": A value stored in the bitstream, which is defined and | |||
"Samples" that represent a specific quantification of "Samples" of | decoded through one of the methods described in Table 4. | |||
that image. | ||||
"Line": A discrete component of a static image composed of Samples | ||||
that represent a specific quantification of Samples of that image. | ||||
"Plane": A discrete component of a static image composed of Lines | ||||
that represent a specific quantification of Lines of that image. | ||||
"Pixel": The smallest addressable representation of a color in a | "Pixel": The smallest addressable representation of a color in a | |||
"Frame". It is composed of one or more "Samples". | Frame. It is composed of one or more Samples. | |||
"ESC": An ESCape symbol to indicate that the symbol to be stored is | "ESC": An ESCape Symbol to indicate that the Symbol to be stored is | |||
too large for normal storage and that an alternate storage method is | too large for normal storage and that an alternate storage method is | |||
used. | used. | |||
"MSB": Most Significant Bit, the bit that can cause the largest | "MSB": Most Significant Bit, the bit that can cause the largest | |||
change in magnitude of the symbol. | change in magnitude of the Symbol. | |||
"VLC": Variable Length Code, a code that maps source symbols to a | "VLC": Variable Length Code, a code that maps source symbols to a | |||
variable number of bits. | variable number of bits. | |||
"RGB": A reference to the method of storing the value of a "Pixel" by | "RGB": A reference to the method of storing the value of a Pixel by | |||
using three numeric values that represent Red, Green, and Blue. | using three numeric values that represent Red, Green, and Blue. | |||
"YCbCr": A reference to the method of storing the value of a "Pixel" | "YCbCr": A reference to the method of storing the value of a Pixel by | |||
by using three numeric values that represent the luma of the "Pixel" | using three numeric values that represent the luma of the Pixel (Y) | |||
(Y) and the chroma of the "Pixel" (Cb and Cr). YCbCr word is used | and the chroma of the Pixel (Cb and Cr). YCbCr word is used for | |||
for historical reasons and currently references any color space | historical reasons and currently references any color space relying | |||
relying on 1 luma "Sample" and 2 chroma "Samples", e.g. YCbCr, YCgCo | on 1 luma Sample and 2 chroma Samples, e.g. YCbCr, YCgCo or ICtCp. | |||
or ICtCp. The exact meaning of the three numeric values is | The exact meaning of the three numeric values is unspecified. | |||
unspecified. | ||||
"TBA": To Be Announced. Used in reference to the development of | "TBA": To Be Announced. Used in reference to the development of | |||
future iterations of the FFV1 specification. | future iterations of the FFV1 specification. | |||
2.2. Conventions | 2.2. Conventions | |||
2.2.1. Pseudo-code | 2.2.1. Pseudo-code | |||
The FFV1 bitstream is described in this document using pseudo-code. | The FFV1 bitstream is described in this document using pseudo-code. | |||
Note that the pseudo-code is used for clarity in order to illustrate | Note that the pseudo-code is used for clarity in order to illustrate | |||
the structure of FFV1 and not intended to specify any particular | the structure of FFV1 and not intended to specify any particular | |||
implementation. The pseudo-code used is based upon the C programming | implementation. The pseudo-code used is based upon the C programming | |||
language [ISO.9899.1990] and uses its "if/else", "while" and "for" | language [ISO.9899.2018] and uses its "if/else", "while" and "for" | |||
keywords as well as functions defined within this document. | keywords as well as functions defined within this document. | |||
In some instances, pseudo-code is presented in a two-column format | In some instances, pseudo-code is presented in a two-column format | |||
such as shown in Figure 1. In this form the "type" column provides a | such as shown in Figure 1. In this form the "type" column provides a | |||
symbol as defined in Table 4 that defines the storage of the data | Symbol as defined in Table 4 that defines the storage of the data | |||
referenced in that same line of pseudo-code. | referenced in that same line of pseudo-code. | |||
pseudo-code | type | pseudo-code | type | |||
--------------------------------------------------------------|----- | --------------------------------------------------------------|----- | |||
ExamplePseudoCode( ) { | | ExamplePseudoCode( ) { | | |||
value | ur | value | ur | |||
} | | } | | |||
Figure 1: A depiction of type-labelled pseudo-code used within | Figure 1: A depiction of type-labelled pseudo-code used within | |||
this document. | this document. | |||
skipping to change at page 7, line 17 ¶ | skipping to change at page 7, line 28 ¶ | |||
"a--" is equivalent to a is assigned a - 1. | "a--" is equivalent to a is assigned a - 1. | |||
"a += b" is equivalent to a is assigned a + b. | "a += b" is equivalent to a is assigned a + b. | |||
"a -= b" is equivalent to a is assigned a - b. | "a -= b" is equivalent to a is assigned a - b. | |||
"a *= b" is equivalent to a is assigned a * b. | "a *= b" is equivalent to a is assigned a * b. | |||
2.2.4. Comparison Operators | 2.2.4. Comparison Operators | |||
"a > b" means a is greater than b. | "a > b" is true when a is greater than b. | |||
"a >= b" means a is greater than or equal to b. | "a >= b" is true when a is greater than or equal to b. | |||
"a < b" means a is less than b. | "a < b" is true when a is less than b. | |||
"a <= b" means a is less than or equal b. | "a <= b" is true when a is less than or equal b. | |||
"a == b" means a is equal to b. | "a == b" is true when a is equal to b. | |||
"a != b" means a is not equal to b. | "a != b" is true when a is not equal to b. | |||
"a && b" means Boolean logical "and" of a and b. | "a && b" is true when both a is true and b is true. | |||
"a || b" means Boolean logical "or" of a and b. | "a || b" is true when either a is true or b is true. | |||
"!a" means Boolean logical "not" of a. | "!a" is true when a is not true. | |||
"a ? b : c" if a is true, then b, otherwise c. | "a ? b : c" if a is true, then b, otherwise c. | |||
2.2.5. Mathematical Functions | 2.2.5. Mathematical Functions | |||
"floor(a)" means the largest integer less than or equal to a. | "floor(a)" means the largest integer less than or equal to a. | |||
"ceil(a)" means the smallest integer greater than or equal to a. | "ceil(a)" means the smallest integer greater than or equal to a. | |||
"sign(a)" extracts the sign of a number, i.e. if a < 0 then -1, else | "sign(a)" extracts the sign of a number, i.e. if a < 0 then -1, else | |||
if a > 0 then 1, else 0. | if a > 0 then 1, else 0. | |||
"abs(a)" means the absolute value of a, i.e. "abs(a)" = "sign(a) * | "abs(a)" means the absolute value of a, i.e. "abs(a)" = "sign(a) * | |||
a". | a". | |||
"log2(a)" means the base-two logarithm of a. | "log2(a)" means the base-two logarithm of a. | |||
"min(a,b)" means the smallest of two values a and b. | "min(a,b)" means the smaller of two values a and b. | |||
"max(a,b)" means the largest of two values a and b. | "max(a,b)" means the larger of two values a and b. | |||
"median(a,b,c)" means the numerical middle value in a data set of a, | "median(a,b,c)" means the numerical middle value in a data set of a, | |||
b, and c, i.e. a+b+c-min(a,b,c)-max(a,b,c). | b, and c, i.e. a+b+c-min(a,b,c)-max(a,b,c). | |||
"A <== B" means B implies A. | "A <== B" means B implies A. | |||
"A <==> B" means A <== B , B <== A. | "A <==> B" means A <== B , B <== A. | |||
a_(b) means the b-th value of a sequence of a | a_(b) means the b-th value of a sequence of a | |||
skipping to change at page 8, line 29 ¶ | skipping to change at page 8, line 39 ¶ | |||
When order of precedence is not indicated explicitly by use of | When order of precedence is not indicated explicitly by use of | |||
parentheses, operations are evaluated in the following order (from | parentheses, operations are evaluated in the following order (from | |||
top to bottom, operations of same precedence being evaluated from | top to bottom, operations of same precedence being evaluated from | |||
left to right). This order of operations is based on the order of | left to right). This order of operations is based on the order of | |||
operations used in Standard C. | operations used in Standard C. | |||
a++, a-- | a++, a-- | |||
!a, -a | !a, -a | |||
a ^ b | a ^ b | |||
a * b, a / b, a % b | a * b, a / b | |||
a + b, a - b | a + b, a - b | |||
a << b, a >> b | a << b, a >> b | |||
a < b, a <= b, a > b, a >= b | a < b, a <= b, a > b, a >= b | |||
a == b, a != b | a == b, a != b | |||
a & b | a & b | |||
a | b | a | b | |||
a && b | a && b | |||
a || b | a || b | |||
a ? b : c | a ? b : c | |||
a = b, a += b, a -= b, a *= b | a = b, a += b, a -= b, a *= b | |||
2.2.7. Range | 2.2.7. Range | |||
"a...b" means any value starting from a to b, inclusive. | "a...b" means any value 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.3.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( NumBytes )" means the count of | |||
after the pointer in that "Configuration Record" or "Frame". It is | remaining bits after the pointer in that "Configuration Record" or | |||
computed from the "NumBytes" value multiplied by 8 minus the count of | "Frame". It is computed from the "NumBytes" value multiplied by 8 | |||
bits of that "Configuration Record" or "Frame" already read by the | minus the count of bits of that "Configuration Record" or "Frame" | |||
bitstream parser. | already read by the bitstream parser. | |||
2.2.9.2. remaining_symbols_in_syntax | 2.2.9.2. remaining_symbols_in_syntax | |||
"remaining_symbols_in_syntax( )" is true as long as the RangeCoder | "remaining_symbols_in_syntax( )" is true as long as the RangeCoder | |||
has not consumed all the given input bytes. | has not consumed all the given input bytes. | |||
2.2.9.3. byte_aligned | 2.2.9.3. byte_aligned | |||
"byte_aligned( )" is true if "remaining_bits_in_bitstream( NumBytes | "byte_aligned( )" is true if "remaining_bits_in_bitstream( NumBytes | |||
)" 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.5) 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 | |||
the "Color Space" (see Section 3.7). Each "Sample" is predicted by | color space (see Section 3.7). Each Sample is predicted by the | |||
the median predictor as described in Section 3.3 from other "Samples" | 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: | |||
* one column of "Samples" to the left of the coded slice is assumed | * one column of Samples to the left of the coded slice is assumed as | |||
as identical to the "Samples" of the leftmost column of the coded | identical to the Samples of the leftmost column of the coded slice | |||
slice shifted down by one row. The value of the topmost "Sample" | shifted down by one row. The value of the topmost Sample of the | |||
of the column of "Samples" to the left of the coded slice is | column of Samples to the left of the coded slice is assumed to be | |||
assumed to be "0" | "0" | |||
* one column of "Samples" to the right of the coded slice is assumed | * one column of Samples to the right of the coded slice is assumed | |||
as identical to the "Samples" of the rightmost column of the coded | as identical to the Samples of the rightmost column of the coded | |||
slice | slice | |||
* an additional column of "Samples" to the left of the coded slice | * an additional column of Samples to the left of the coded slice and | |||
and two rows of "Samples" above the coded slice are assumed to be | two rows of Samples above the coded slice are assumed to be "0" | |||
"0" | ||||
Figure 2 depicts a slice of 9 "Samples" "a,b,c,d,e,f,g,h,i" in a 3x3 | Figure 2 depicts a slice of 9 Samples "a,b,c,d,e,f,g,h,i" in a 3x3 | |||
arrangement along with its assumed border. | arrangement along with its assumed border. | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 0 | | 0 | 0 | 0 | | 0 | | | 0 | 0 | | 0 | 0 | 0 | | 0 | | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 0 | | 0 | 0 | 0 | | 0 | | | 0 | 0 | | 0 | 0 | 0 | | 0 | | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| | | | | | | | | | | | | | | | | | | | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 0 | | a | b | c | | c | | | 0 | 0 | | a | b | c | | c | | |||
skipping to change at page 10, line 35 ¶ | skipping to change at page 10, line 45 ¶ | |||
| 0 | a | | d | e | f | | f | | | 0 | a | | d | e | f | | f | | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | d | | g | h | i | | i | | | 0 | d | | g | h | i | | i | | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
Figure 2: A depiction of FFV1's assumed border for a set example | Figure 2: A depiction of FFV1's assumed border for a set example | |||
Samples. | Samples. | |||
3.2. Samples | 3.2. Samples | |||
Relative to any "Sample" "X", six other relatively positioned | Relative to any Sample "X", six other relatively positioned Samples | |||
"Samples" from the coded "Samples" and presumed border are identified | from the coded Samples and presumed border are identified according | |||
according to the labels used in Figure 3. The labels for these | to the labels used in Figure 3. The labels for these relatively | |||
relatively positioned "Samples" are used within the median predictor | positioned Samples are used within the median predictor and context. | |||
and context. | ||||
+---+---+---+---+ | +---+---+---+---+ | |||
| | | T | | | | | | T | | | |||
+---+---+---+---+ | +---+---+---+---+ | |||
| |tl | t |tr | | | |tl | t |tr | | |||
+---+---+---+---+ | +---+---+---+---+ | |||
| L | l | X | | | | L | l | X | | | |||
+---+---+---+---+ | +---+---+---+---+ | |||
Figure 3: A depiction of how relatively positions Samples are | Figure 3: A depiction of how relatively positioned Samples are | |||
references within this document. | referenced within this document. | |||
The labels for these relative "Samples" are made of the first letters | The labels for these relative Samples are made of the first letters | |||
of the words Top, Left and Right. | of the words Top, Left and Right. | |||
3.3. Median Predictor | 3.3. Median Predictor | |||
The prediction for any "Sample" value at position "X" may be computed | The prediction for any Sample value at position "X" may be computed | |||
based upon the relative neighboring values of "l", "t", and "tl" via | based upon the relative neighboring values of "l", "t", and "tl" via | |||
this equation: | this equation: | |||
median(l, t, l + t - tl) | median(l, t, l + t - tl) | |||
Note, this prediction template is also used in [ISO.14495-1.1999] and | Note, this prediction template is also used in [ISO.14495-1.1999] and | |||
[HuffYUV]. | [HuffYUV]. | |||
Exception for the median predictor: if "colorspace_type == 0 && | Exception for the median predictor: if "colorspace_type == 0 && | |||
bits_per_raw_sample == 16 && ( coder_type == 1 || coder_type == 2 )", | bits_per_raw_sample == 16 && ( coder_type == 1 || coder_type == 2 )" | |||
the following median predictor MUST be used: | (see Section 4.2.5, Section 4.2.7 and Section 4.2.5), the following | |||
median predictor MUST be used: | ||||
median(left16s, top16s, left16s + top16s - diag16s) | median(left16s, top16s, left16s + top16s - diag16s) | |||
where: | where: | |||
left16s = l >= 32768 ? ( l - 65536 ) : l | left16s = l >= 32768 ? ( l - 65536 ) : l | |||
top16s = t >= 32768 ? ( t - 65536 ) : t | top16s = t >= 32768 ? ( t - 65536 ) : t | |||
diag16s = tl >= 32768 ? ( tl - 65536 ) : tl | diag16s = tl >= 32768 ? ( tl - 65536 ) : tl | |||
Background: a two's complement signed 16-bit signed integer was used | Background: a two's complement 16-bit signed integer was used for | |||
for storing "Sample" values in all known implementations of FFV1 | storing Sample values in all known implementations of FFV1 bitstream. | |||
bitstream. So in some circumstances, the most significant bit was | So in some circumstances, the most significant bit was wrongly | |||
wrongly interpreted (used as a sign bit instead of the 16th bit of an | interpreted (used as a sign bit instead of the 16th bit of an | |||
unsigned integer). Note that when the issue was discovered, the only | unsigned integer). Note that when the issue was discovered, the only | |||
configuration of all known implementations being impacted is 16-bit | configuration of all known implementations being impacted is 16-bit | |||
YCbCr with no Pixel transformation with Range Coder coder, as other | YCbCr with no Pixel transformation with Range Coder coder, as other | |||
potentially impacted configurations (e.g. 15/16-bit JPEG2000-RCT with | potentially impacted configurations (e.g. 15/16-bit JPEG2000-RCT with | |||
Range Coder coder, or 16-bit content with Golomb Rice coder) were | Range Coder coder, or 16-bit content with Golomb Rice coder) were | |||
implemented nowhere [ISO.15444-1.2016]. In the meanwhile, 16-bit | implemented nowhere [ISO.15444-1.2016]. In the meanwhile, 16-bit | |||
JPEG2000-RCT with Range Coder coder was implemented without this | JPEG2000-RCT with Range Coder coder was implemented without this | |||
issue in one implementation and validated by one conformance checker. | issue in one implementation and validated by one conformance checker. | |||
It is expected (to be confirmed) to remove this exception for the | It is expected (to be confirmed) to remove this exception for the | |||
median predictor in the next version of the FFV1 bitstream. | median predictor in the next version of the FFV1 bitstream. | |||
skipping to change at page 12, line 25 ¶ | skipping to change at page 12, line 29 ¶ | |||
Q_(j)[k] = quant_tables[i][j][k&255] | Q_(j)[k] = quant_tables[i][j][k&255] | |||
Figure 4 | Figure 4 | |||
In this formula, "i" is the Quantization Table Set index, "j" is the | In this formula, "i" is the Quantization Table Set index, "j" is the | |||
Quantized Table index, "k" the Quantized Sample Difference. | Quantized Table index, "k" the Quantized Sample Difference. | |||
3.5. Context | 3.5. Context | |||
Relative to any "Sample" "X", the Quantized Sample Differences "L-l", | Relative to any Sample "X", the Quantized Sample Differences "L-l", | |||
"l-tl", "tl-t", "T-t", and "t-tr" are used as context: | "l-tl", "tl-t", "T-t", and "t-tr" are used as context: | |||
context = Q_(0)[l - tl] + | context = Q_(0)[l - tl] + | |||
Q_(1)[tl - t] + | Q_(1)[tl - t] + | |||
Q_(2)[t - tr] + | Q_(2)[t - tr] + | |||
Q_(3)[L - l] + | Q_(3)[L - l] + | |||
Q_(4)[T - t] | Q_(4)[T - t] | |||
Figure 5 | Figure 5 | |||
If "context >= 0" then "context" is used and the difference between | If "context >= 0" then "context" is used and the difference between | |||
the "Sample" and its predicted value is encoded as is, else | the Sample and its predicted value is encoded as is, else "-context" | |||
"-context" is used and the difference between the "Sample" and its | is used and the difference between the Sample and its predicted value | |||
predicted value is encoded with a flipped sign. | is encoded with a flipped sign. | |||
3.6. Quantization Table Set Indexes | 3.6. Quantization Table Set Indexes | |||
For each "Plane" of each slice, a Quantization Table Set is selected | For each Plane of each slice, a Quantization Table Set is selected | |||
from an index: | from an index: | |||
* For Y "Plane", "quant_table_set_index[ 0 ]" index is used | * For Y Plane, "quant_table_set_index[ 0 ]" index is used | |||
* For Cb and Cr Planes, "quant_table_set_index[ 1 ]" index is used | ||||
* For Cb and Cr "Planes", "quant_table_set_index[ 1 ]" index is used | ||||
* For extra "Plane", "quant_table_set_index[ (version <= 3 || | * For extra Plane, "quant_table_set_index[ (version <= 3 || | |||
chroma_planes) ? 2 : 1 ]" index is used | chroma_planes) ? 2 : 1 ]" index is used | |||
Background: in first implementations of FFV1 bitstream, the index for | Background: in first implementations of FFV1 bitstream, the index for | |||
Cb and Cr "Planes" was stored even if it is not used (chroma_planes | Cb and Cr Planes was stored even if it is not used (chroma_planes set | |||
set to 0), this index is kept for "version" <= 3 in order to keep | to 0), this index is kept for "version" <= 3 in order to keep | |||
compatibility with FFV1 bitstreams in the wild. | compatibility with FFV1 bitstreams in the wild. | |||
3.7. Color spaces | 3.7. Color spaces | |||
FFV1 supports several color spaces. The count of allowed coded | FFV1 supports several color spaces. The count of allowed coded | |||
planes and the meaning of the extra "Plane" are determined by the | planes and the meaning of the extra Plane are determined by the | |||
selected color space. | selected color space. | |||
The FFV1 bitstream interleaves data in an order determined by the | The FFV1 bitstream interleaves data in an order determined by the | |||
color space. In YCbCr for each "Plane", each "Line" is coded from | color space. In YCbCr for each Plane, each Line is coded from top to | |||
top to bottom and for each "Line", each "Sample" is coded from left | bottom and for each Line, each Sample is coded from left to right. | |||
to right. In JPEG2000-RCT for each "Line" from top to bottom, each | In JPEG2000-RCT for each Line from top to bottom, each Plane is coded | |||
"Plane" is coded and for each "Plane", each "Sample" is encoded from | and for each Plane, each Sample is encoded from left to right. | |||
left to right. | ||||
3.7.1. YCbCr | 3.7.1. YCbCr | |||
This color space allows 1 to 4 "Planes". | This color space allows 1 to 4 Planes. | |||
The Cb and Cr "Planes" are optional, but if used then MUST be used | The Cb and Cr Planes are optional, but if used then MUST be used | |||
together. Omitting the Cb and Cr "Planes" codes the frames in | together. Omitting the Cb and Cr Planes codes the frames in | |||
grayscale without color data. | grayscale without color data. | |||
An optional transparency "Plane" can be used to code transparency | An optional transparency Plane can be used to code transparency data. | |||
data. | ||||
An FFV1 "Frame" using YCbCr MUST use one of the following | An FFV1 Frame using YCbCr MUST use one of the following arrangements: | |||
arrangements: | ||||
* Y | * Y | |||
* Y, Transparency | * Y, Transparency | |||
* Y, Cb, Cr | * Y, Cb, Cr | |||
* Y, Cb, Cr, Transparency | * Y, Cb, Cr, Transparency | |||
The Y "Plane" MUST be coded first. If the Cb and Cr "Planes" are | The Y Plane MUST be coded first. If the Cb and Cr Planes are used | |||
used then they MUST be coded after the Y "Plane". If a transparency | then they MUST be coded after the Y Plane. If a transparency Plane | |||
"Plane" is used, then it MUST be coded last. | is used, then it MUST be coded last. | |||
3.7.2. RGB | 3.7.2. RGB | |||
This color space allows 3 or 4 "Planes". | This color space allows 3 or 4 Planes. | |||
An optional transparency "Plane" can be used to code transparency | An optional transparency Plane can be used to code transparency data. | |||
data. | ||||
JPEG2000-RCT is a Reversible Color Transform that codes RGB (red, | JPEG2000-RCT is a Reversible Color Transform that codes RGB (red, | |||
green, blue) "Planes" losslessly in a modified YCbCr color space | green, blue) Planes losslessly in a modified YCbCr color space | |||
[ISO.15444-1.2016]. Reversible Pixel transformations between YCbCr | [ISO.15444-1.2016]. Reversible Pixel transformations between YCbCr | |||
and RGB use the following formulae. | and RGB use the following formulae. | |||
Cb = b - g | Cb = b - g | |||
Cr = r - g | Cr = r - g | |||
Y = g + (Cb + Cr) >> 2 | Y = g + (Cb + Cr) >> 2 | |||
g = Y - (Cb + Cr) >> 2 | g = Y - (Cb + Cr) >> 2 | |||
r = Cr + g | r = Cr + g | |||
b = Cb + g | b = Cb + g | |||
skipping to change at page 14, line 38 ¶ | skipping to change at page 14, line 41 ¶ | |||
Cr = r - b | Cr = r - b | |||
Y = b +(Cb + Cr) >> 2 | Y = b +(Cb + Cr) >> 2 | |||
b = Y -(Cb + Cr) >> 2 | b = Y -(Cb + Cr) >> 2 | |||
r = Cr + b | r = Cr + b | |||
g = Cb + b | g = Cb + b | |||
Figure 7 | Figure 7 | |||
Background: At the time of this writing, in all known implementations | Background: At the time of this writing, in all known implementations | |||
of FFV1 bitstream, when "bits_per_raw_sample" was between 9 and 15 | of FFV1 bitstream, when "bits_per_raw_sample" was between 9 and 15 | |||
inclusive and "extra_plane" is 0, GBR "Planes" were used as BGR | inclusive and "extra_plane" is 0, GBR Planes were used as BGR Planes | |||
"Planes" during both encoding and decoding. In the meanwhile, 16-bit | during both encoding and decoding. In the meanwhile, 16-bit | |||
JPEG2000-RCT was implemented without this issue in one implementation | JPEG2000-RCT was implemented without this issue in one implementation | |||
and validated by one conformance checker. Methods to address this | and validated by one conformance checker. Methods to address this | |||
exception for the transform are under consideration for the next | exception for the transform are under consideration for the next | |||
version of the FFV1 bitstream. | version of the FFV1 bitstream. | |||
Cb and Cr are positively offset by "1 << bits_per_raw_sample" after | Cb and Cr are positively offset by "1 << bits_per_raw_sample" after | |||
the conversion from RGB to the modified YCbCr and are negatively | the conversion from RGB to the modified YCbCr and are negatively | |||
offseted by the same value before the conversion from the modified | offseted by the same value before the conversion from the modified | |||
YCbCr to RGB, in order to have only non-negative values after the | YCbCr to RGB, in order to have only non-negative values after the | |||
conversion. | conversion. | |||
When FFV1 uses the JPEG2000-RCT, the horizontal "Lines" are | When FFV1 uses the JPEG2000-RCT, the horizontal Lines are interleaved | |||
interleaved to improve caching efficiency since it is most likely | to improve caching efficiency since it is most likely that the | |||
that the JPEG2000-RCT will immediately be converted to RGB during | JPEG2000-RCT will immediately be converted to RGB during decoding. | |||
decoding. The interleaved coding order is also Y, then Cb, then Cr, | The interleaved coding order is also Y, then Cb, then Cr, and then, | |||
and then if used transparency. | if used, transparency. | |||
As an example, a "Frame" that is two "Pixels" wide and two "Pixels" | As an example, a Frame that is two Pixels wide and two Pixels high, | |||
high, could comprise the following structure: | could comprise the following structure: | |||
+------------------------+------------------------+ | +------------------------+------------------------+ | |||
| Pixel(1,1) | Pixel(2,1) | | | Pixel(1,1) | Pixel(2,1) | | |||
| Y(1,1) Cb(1,1) Cr(1,1) | Y(2,1) Cb(2,1) Cr(2,1) | | | Y(1,1) Cb(1,1) Cr(1,1) | Y(2,1) Cb(2,1) Cr(2,1) | | |||
+------------------------+------------------------+ | +------------------------+------------------------+ | |||
| Pixel(1,2) | Pixel(2,2) | | | Pixel(1,2) | Pixel(2,2) | | |||
| Y(1,2) Cb(1,2) Cr(1,2) | Y(2,2) Cb(2,2) Cr(2,2) | | | Y(1,2) Cb(1,2) Cr(1,2) | Y(2,2) Cb(2,2) Cr(2,2) | | |||
+------------------------+------------------------+ | +------------------------+------------------------+ | |||
In JPEG2000-RCT, the coding order would be left to right and then top | In JPEG2000-RCT, the coding order would be left to right and then top | |||
to bottom, with values interleaved by "Lines" and stored in this | to bottom, with values interleaved by Lines and stored in this order: | |||
order: | ||||
Y(1,1) Y(2,1) Cb(1,1) Cb(2,1) Cr(1,1) Cr(2,1) Y(1,2) Y(2,2) Cb(1,2) | Y(1,1) Y(2,1) Cb(1,1) Cb(2,1) Cr(1,1) Cr(2,1) Y(1,2) Y(2,2) Cb(1,2) | |||
Cb(2,2) Cr(1,2) Cr(2,2) | Cb(2,2) Cr(1,2) Cr(2,2) | |||
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 = [(sample_difference + 2 ^ (bits - 1)) & | coder_input = [(sample_difference + 2 ^ (bits - 1)) & | |||
(2 ^ bits - 1)] - 2 ^ (bits - 1) | (2 ^ bits - 1)] - 2 ^ (bits - 1) | |||
Figure 8: Description of the coding of the Sample Difference in | Figure 8: Description of the coding of the Sample Difference in | |||
the bitstream. | 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 N. Martin in 1979 [range-coding]. | |||
3.8.1.1. Range Binary Values | 3.8.1.1. Range Binary Values | |||
To encode binary digits efficiently a Range coder is used. C_(i) is | To encode binary digits efficiently a Range coder is used. C_(i) is | |||
the i-th Context. B_(i) is the i-th byte of the bytestream. b_(i) is | the i-th Context. B_(i) is the i-th byte of the bytestream. b_(i) is | |||
the i-th Range coded binary value, S_(0, i) is the i-th initial | the i-th Range coded binary value, S_(0, i) is the i-th initial | |||
state. The length of the bytestream encoding n binary symbols is | state. The length of the bytestream encoding n binary symbols is | |||
j_(n) bytes. | j_(n) bytes. | |||
r_(i) = floor( ( R_(i) * S_(i, C_(i)) ) / 2 ^ 8 ) | r_(i) = floor( ( R_(i) * S_(i, C_(i)) ) / 2 ^ 8 ) | |||
Figure 9 | Figure 9: A formula of the read of a binary value in Range Binary | |||
mode. | ||||
S_(i + 1, C_(i)) = zero_state_(S_(i, C_(i))) AND | S_(i + 1, C_(i)) = zero_state_(S_(i, C_(i))) AND | |||
l_(i) = L_(i) AND | l_(i) = L_(i) AND | |||
t_(i) = R_(i) - r_(i) <== | t_(i) = R_(i) - r_(i) <== | |||
b_(i) = 0 <==> | b_(i) = 0 <==> | |||
L_(i) < R_(i) - r_(i) | L_(i) < R_(i) - r_(i) | |||
S_(i + 1, C_(i)) = one_state_(S_(i, C_(i))) AND | S_(i + 1, C_(i)) = one_state_(S_(i, C_(i))) AND | |||
l_(i) = L_(i) - R_(i) + r_(i) AND | l_(i) = L_(i) - R_(i) + r_(i) AND | |||
t_(i) = r_(i) <== | t_(i) = r_(i) <== | |||
skipping to change at page 17, line 10 ¶ | skipping to change at page 17, line 10 ¶ | |||
Figure 13 | Figure 13 | |||
L_(0) = 2 ^ 8 * B_(0) + B_(1) | L_(0) = 2 ^ 8 * B_(0) + B_(1) | |||
Figure 14 | Figure 14 | |||
j_(0) = 2 | j_(0) = 2 | |||
Figure 15 | Figure 15 | |||
range = 0xFF00; | ||||
end = 0; | ||||
low = get_bits(16); | ||||
if (low >= range) { | ||||
low = range; | ||||
end = 1; | ||||
} | ||||
Figure 16: A pseudo-code description of the initial states in | ||||
Range Binary mode. | ||||
refill() { | ||||
if (range < 256) { | ||||
range = range * 256; | ||||
low = low * 256; | ||||
if (!end) { | ||||
c.low += get_bits(8); | ||||
if (remaining_bits_in_bitstream( NumBytes ) == 0) { | ||||
end = 1; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
Figure 17: A pseudo-code description of refilling the Range | ||||
Binary Value coder buffer. | ||||
get_rac(state) { | ||||
rangeoff = (range * state) / 256; | ||||
range -= rangeoff; | ||||
if (low < range) { | ||||
state = zero_state[state]; | ||||
refill(); | ||||
return 0; | ||||
} else { | ||||
low -= range; | ||||
state = one_state[state]; | ||||
range = rangeoff; | ||||
refill(); | ||||
return 1; | ||||
} | ||||
} | ||||
Figure 18: A pseudo-code description of the read of a binary | ||||
value in Range Binary mode. | ||||
3.8.1.1.1. Termination | 3.8.1.1.1. Termination | |||
The range coder can be used in three modes. | The range coder can be used in three modes. | |||
* In "Open mode" when decoding, every symbol the reader attempts to | * In "Open mode" when decoding, every Symbol the reader attempts to | |||
read is available. In this mode arbitrary data can have been | read is available. In this mode arbitrary data can have been | |||
appended without affecting the range coder output. This mode is | appended without affecting the range coder output. This mode is | |||
not used in FFV1. | not used in FFV1. | |||
* In "Closed mode" the length in bytes of the bytestream is provided | * In "Closed mode" the length in bytes of the bytestream is provided | |||
to the range decoder. Bytes beyond the length are read as 0 by | to the range decoder. Bytes beyond the length are read as 0 by | |||
the range decoder. This is generally one byte shorter than the | the range decoder. This is generally one byte shorter than the | |||
open mode. | open mode. | |||
* In "Sentinel mode" the exact length in bytes is not known and thus | * In "Sentinel mode" the exact length in bytes is not known and thus | |||
the range decoder MAY read into the data that follows the range | the range decoder MAY read into the data that follows the range | |||
coded bytestream by one byte. In "Sentinel mode", the end of the | coded bytestream by one byte. In "Sentinel mode", the end of the | |||
range coded bytestream is a binary symbol with state 129, which | range coded bytestream is a binary Symbol with state 129, which | |||
value SHALL be discarded. After reading this symbol, the range | value SHALL be discarded. After reading this Symbol, the range | |||
decoder will have read one byte beyond the end of the range coded | decoder will have read one byte beyond the end of the range coded | |||
bytestream. This way the byte position of the end can be | bytestream. This way the byte position of the end can be | |||
determined. Bytestreams written in "Sentinel mode" can be read in | determined. Bytestreams written in "Sentinel mode" can be read in | |||
"Closed mode" if the length can be determined, in this case the | "Closed mode" if the length can be determined, in this case the | |||
last (sentinel) symbol will be read non-corrupted and be of value | last (sentinel) Symbol will be read non-corrupted and be of value | |||
0. | 0. | |||
Above describes the range decoding. Encoding is defined as any | Above describes the range decoding. Encoding is defined as any | |||
process which produces a decodable bytestream. | process which produces a decodable bytestream. | |||
There are three places where range coder termination is needed in | There are three places where range coder termination is needed in | |||
FFV1. First is in the "Configuration Record", in this case the size | FFV1. First is in the "Configuration Record", in this case the size | |||
of the range coded bytestream is known and handled as "Closed mode". | of the range coded bytestream is known and handled as "Closed mode". | |||
Second is the switch from the "Slice Header" which is range coded to | Second is the switch from the "Slice Header" which is range coded to | |||
Golomb coded slices as "Sentinel mode". Third is the end of range | Golomb coded slices as "Sentinel mode". Third is the end of range | |||
coded Slices which need to terminate before the CRC at their end. | coded Slices which need to terminate before the CRC at their end. | |||
This can be handled as "Sentinel mode" or as "Closed mode" if the CRC | This can be handled as "Sentinel mode" or as "Closed mode" if the CRC | |||
position has been determined. | position has been determined. | |||
3.8.1.2. Range Non Binary Values | 3.8.1.2. Range Non Binary Values | |||
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 16. | Figure 19. | |||
int get_symbol(RangeCoder *c, uint8_t *state, int is_signed) { | int get_symbol(RangeCoder *c, uint8_t *state, int is_signed) { | |||
if (get_rac(c, state + 0) { | if (get_rac(c, state + 0) { | |||
return 0; | return 0; | |||
} | } | |||
int e = 0; | int e = 0; | |||
while (get_rac(c, state + 1 + min(e, 9)) { //1..10 | while (get_rac(c, state + 1 + min(e, 9)) { //1..10 | |||
e++; | e++; | |||
} | } | |||
skipping to change at page 18, line 45 ¶ | skipping to change at page 19, line 45 ¶ | |||
return a; | return a; | |||
} | } | |||
if (get_rac(c, state + 11 + min(e, 10))) { //11..21 | if (get_rac(c, state + 11 + min(e, 10))) { //11..21 | |||
return -a; | return -a; | |||
} else { | } else { | |||
return a; | return a; | |||
} | } | |||
} | } | |||
Figure 16: A pseudo-code description of the contexts of Range Non | Figure 19: 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" | "get_symbol" is used for the read out of "sample_difference" | |||
indicated in Figure 8. | indicated in Figure 8. | |||
"get_rac" returns a boolean, computed from the bytestream as | "get_rac" returns a boolean, computed from the bytestream as | |||
described in Section 3.8.1.1. | described in Figure 9 as a formula and in Figure 18 as pseudo-code. | |||
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 | When "keyframe" (see Section 4.4) value is 1, all Range coder state | |||
state. | variables are set to their initial 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) | |||
Figure 17 | Figure 20 | |||
zero_state_(i) = 256 - one_state_(256-i) | zero_state_(i) = 256 - one_state_(256-i) | |||
Figure 18 | Figure 21 | |||
3.8.1.5. default_state_transition | 3.8.1.5. default_state_transition | |||
0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, | 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, | |||
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, | 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, | |||
43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, | 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, | |||
58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, | 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, | |||
skipping to change at page 20, line 43 ¶ | skipping to change at page 21, line 43 ¶ | |||
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.2.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.2. The reference implementation of FFV1 | "Parameters", see Section 4.2. The reference implementation of FFV1 | |||
in FFmpeg uses Figure 19 by default at the time of this writing when | in FFmpeg uses Figure 22 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 37 ¶ | skipping to change at page 22, line 37 ¶ | |||
175,189,179,181,186,183,192,185,200,187,191,188,190,197,193,196, | 175,189,179,181,186,183,192,185,200,187,191,188,190,197,193,196, | |||
197,194,195,196,198,202,199,201,210,203,207,204,205,206,208,214, | 197,194,195,196,198,202,199,201,210,203,207,204,205,206,208,214, | |||
209,211,221,212,213,215,224,216,217,218,219,220,222,228,223,225, | 209,211,221,212,213,215,224,216,217,218,219,220,222,228,223,225, | |||
226,224,227,229,240,230,231,232,233,234,235,236,238,239,237,242, | 226,224,227,229,240,230,231,232,233,234,235,236,238,239,237,242, | |||
241,243,242,244,245,246,247,248,249,250,251,252,252,253,254,255, | 241,243,242,244,245,246,247,248,249,250,251,252,252,253,254,255, | |||
Figure 19: Alternative state transition table for Range coding. | Figure 22: Alternative state transition table for Range coding. | |||
3.8.2. Golomb Rice Mode | 3.8.2. Golomb Rice Mode | |||
The end of the bitstream of the "Frame" is filled with 0-bits until | The end of the bitstream of the Frame is padded with 0-bits until the | |||
that the bitstream contains a multiple of 8 bits. | 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. | |||
int get_ur_golomb(k) { | int get_ur_golomb(k) { | |||
for (prefix = 0; prefix < 12; prefix++) { | for (prefix = 0; prefix < 12; prefix++) { | |||
if (get_bits(1)) { | if (get_bits(1)) { | |||
return get_bits(k) + (prefix << k); | return get_bits(k) + (prefix << k); | |||
} | } | |||
} | } | |||
return get_bits(bits) + 11; | return get_bits(bits) + 11; | |||
} | } | |||
Figure 20: A pseudo-code description of the read of an unsigned | Figure 23: A pseudo-code description of the read of an unsigned | |||
integer in Golomb Rice mode. | integer in Golomb Rice mode. | |||
int get_sr_golomb(k) { | int get_sr_golomb(k) { | |||
v = get_ur_golomb(k); | v = get_ur_golomb(k); | |||
if (v & 1) return - (v >> 1) - 1; | if (v & 1) return - (v >> 1) - 1; | |||
else return (v >> 1); | else return (v >> 1); | |||
} | } | |||
Figure 21: A pseudo-code description of the read of a signed | Figure 24: A pseudo-code description of the read of a signed | |||
integer in Golomb Rice mode. | 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 23, line 16 ¶ | skipping to change at page 24, line 16 ¶ | |||
+=========+========================================+ | +=========+========================================+ | |||
+=========+========================================+ | +=========+========================================+ | |||
| non ESC | the k least significant bits MSB first | | | non ESC | the k least significant bits MSB first | | |||
+---------+----------------------------------------+ | +---------+----------------------------------------+ | |||
| ESC | the value - 11, in MSB first order | | | ESC | the value - 11, in MSB first order | | |||
+---------+----------------------------------------+ | +---------+----------------------------------------+ | |||
Table 2 | Table 2 | |||
"ESC" MUST NOT be used if the value can be coded as "non ESC". | ESC MUST NOT be used if the value can be coded as non ESC. | |||
3.8.2.1.3. Examples | 3.8.2.1.3. Examples | |||
Table 3 shows practical examples of how Signed Golomb Rice Codes are | ||||
decoded based on the series of bits extracted from the bitstream as | ||||
described by the method above: | ||||
+=====+=======================+=======+ | +=====+=======================+=======+ | |||
| k | bits | value | | | k | bits | value | | |||
+=====+=======================+=======+ | +=====+=======================+=======+ | |||
| 0 | 1 | 0 | | | 0 | 1 | 0 | | |||
+-----+-----------------------+-------+ | +-----+-----------------------+-------+ | |||
| 0 | 001 | 2 | | | 0 | 001 | 2 | | |||
+-----+-----------------------+-------+ | +-----+-----------------------+-------+ | |||
| 2 | 1 00 | 0 | | | 2 | 1 00 | 0 | | |||
+-----+-----------------------+-------+ | +-----+-----------------------+-------+ | |||
| 2 | 1 10 | 2 | | | 2 | 1 10 | 2 | | |||
+-----+-----------------------+-------+ | +-----+-----------------------+-------+ | |||
| 2 | 01 01 | 5 | | | 2 | 01 01 | 5 | | |||
+-----+-----------------------+-------+ | +-----+-----------------------+-------+ | |||
| any | 000000000000 10000000 | 139 | | | any | 000000000000 10000000 | 139 | | |||
+-----+-----------------------+-------+ | +-----+-----------------------+-------+ | |||
Table 3 | Table 3: Examples of decoded Signed | |||
Golomb Rice Codes. | ||||
3.8.2.2. Run Mode | 3.8.2.2. Run Mode | |||
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 sample difference is identical to the | |||
The run and the first different level are coded. | predicted one. The run and the first different sample difference are | |||
coded as defined in Section 3.8.2.4.1. | ||||
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. | |||
log2_run[41] = { | log2_run[41] = { | |||
0, 0, 0, 0, 1, 1, 1, 1, | 0, 0, 0, 0, 1, 1, 1, 1, | |||
2, 2, 2, 2, 3, 3, 3, 3, | 2, 2, 2, 2, 3, 3, 3, 3, | |||
4, 4, 5, 5, 6, 6, 7, 7, | 4, 4, 5, 5, 6, 6, 7, 7, | |||
8, 9,10,11,12,13,14,15, | 8, 9,10,11,12,13,14,15, | |||
16,17,18,19,20,21,22,23, | 16,17,18,19,20,21,22,23, | |||
24, | 24, | |||
}; | }; | |||
skipping to change at page 25, line 49 ¶ | skipping to change at page 27, line 44 ¶ | |||
-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.4.1. Level Coding | 3.8.2.4.1. Golomb Rice Sample Difference 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.5. 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 | When "keyframe" (see Section 4.4) value is 1, all coder state | |||
state. | variables are set to their initial state. | |||
drift = 0; | drift = 0; | |||
error_sum = 4; | error_sum = 4; | |||
bias = 0; | bias = 0; | |||
count = 1; | count = 1; | |||
4. Bitstream | 4. Bitstream | |||
An FFV1 bitstream is composed of a series of one or more "Frames" and | An FFV1 bitstream is composed of a series of one or more Frames and | |||
(when required) a "Configuration Record". | (when required) a "Configuration Record". | |||
Within the following sub-sections, pseudo-code is used to explain the | Within the following sub-sections, pseudo-code is used, as described | |||
structure of each FFV1 bitstream component, as described in | in Section 2.2.1, to explain the structure of each FFV1 bitstream | |||
Section 2.2.1. Table 4 lists symbols used to annotate that pseudo- | component. Table 4 lists symbols used to annotate that pseudo-code | |||
code in order to define the storage of the data referenced in that | in order to define the storage of the data referenced in that line of | |||
line of pseudo-code. | pseudo-code. | |||
+========+==============================================+ | +========+=================================================+ | |||
| Symbol | Definition | | | Symbol | Definition | | |||
+========+==============================================+ | +========+=================================================+ | |||
| u(n) | unsigned big endian integer using n bits | | | u(n) | unsigned big endian integer Symbol using n bits | | |||
+--------+----------------------------------------------+ | +--------+-------------------------------------------------+ | |||
| sg | Golomb Rice coded signed scalar symbol coded | | | sg | Golomb Rice coded signed scalar Symbol coded | | |||
| | with the method described in Section 3.8.2 | | | | with the method described in Section 3.8.2 | | |||
+--------+----------------------------------------------+ | +--------+-------------------------------------------------+ | |||
| br | Range coded Boolean (1-bit) symbol with the | | | br | Range coded Boolean (1-bit) Symbol with the | | |||
| | method described in Section 3.8.1.1 | | | | method described in Section 3.8.1.1 | | |||
+--------+----------------------------------------------+ | +--------+-------------------------------------------------+ | |||
| ur | Range coded unsigned scalar symbol coded | | | ur | Range coded unsigned scalar Symbol coded with | | |||
| | with the method described in Section 3.8.1.2 | | | | the method described in Section 3.8.1.2 | | |||
+--------+----------------------------------------------+ | +--------+-------------------------------------------------+ | |||
| sr | Range coded signed scalar symbol coded with | | | sr | Range coded signed scalar Symbol coded with the | | |||
| | the method described in Section 3.8.1.2 | | | | method described in Section 3.8.1.2 | | |||
+--------+----------------------------------------------+ | +--------+-------------------------------------------------+ | |||
| sd | Sample difference coded with the method | | | sd | Sample difference Symbol 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 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. Quantization Table Set | 4.1. Quantization Table Set | |||
The Quantization Table Sets are stored by storing the number of equal | 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" | entries -1 of the first half of the table (represented as "len - 1" | |||
in the pseudo-code below) using the method described in | in the pseudo-code below) using the method described in | |||
skipping to change at page 29, line 14 ¶ | skipping to change at page 31, line 14 ¶ | |||
4.1.2. context_count | 4.1.2. context_count | |||
"context_count[ i ]" indicates the count of contexts for Quantization | "context_count[ i ]" indicates the count of contexts for Quantization | |||
Table Set "i". "context_count[ i ]" MUST be less than or equal to | Table Set "i". "context_count[ i ]" MUST be less than or equal to | |||
32768. | 32768. | |||
4.2. Parameters | 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 22 describes the contents of the bitstream. | tables. Figure 25 describes the contents of the bitstream. | |||
"Parameters" has its own initial states, all set to 128. | "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 | |||
} | | } | | |||
skipping to change at page 30, line 50 ¶ | skipping to change at page 32, 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 22: A pseudo-code description of the bitstream contents. | Figure 25: A pseudo-code description of the bitstream contents. | |||
CONTEXT_SIZE is 32. | CONTEXT_SIZE is 32. | |||
4.2.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. | |||
skipping to change at page 34, line 5 ¶ | skipping to change at page 36, line 5 ¶ | |||
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.2.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 then | | |||
| | | | | then | | | | | | | Line | | |||
| | | | | "Line" | | +-------+--------------+----------------+--------------+------------+ | |||
+-------+-------------+----------------+--------------+-------------+ | | 1 | RGB | JPEG2000-RCT | Transparency | Line then | | |||
| 1 | RGB | JPEG2000-RCT | Transparency | "Line" | | | | | | | Plane | | |||
| | | | | then | | +-------+--------------+----------------+--------------+------------+ | |||
| | | | | "Plane" | | | Other | reserved | reserved for | reserved for | reserved | | |||
+-------+-------------+----------------+--------------+-------------+ | | | for future | future use | future use | for future | | |||
| Other | reserved | reserved for | reserved for | reserved | | | | use | | | use | | |||
| | for future | future use | future use | for future | | +-------+--------------+----------------+--------------+------------+ | |||
| | use | | | use | | ||||
+-------+-------------+----------------+--------------+-------------+ | ||||
Table 9 | Table 9 | |||
FFV1 bitstreams with "colorspace_type" == 1 && ("chroma_planes" != | FFV1 bitstreams with "colorspace_type" == 1 && ("chroma_planes" != | |||
1 || "log2_h_chroma_subsample" != 0 || "log2_v_chroma_subsample" != | 1 || "log2_h_chroma_subsample" != 0 || "log2_v_chroma_subsample" != | |||
0) are not part of this specification. | 0) are not part of this specification. | |||
4.2.6. chroma_planes | 4.2.6. chroma_planes | |||
"chroma_planes" indicates if chroma (color) "Planes" are present. | "chroma_planes" indicates if chroma (color) Planes are present. | |||
+=======+=================================+ | +=======+===============================+ | |||
| value | presence | | | value | presence | | |||
+=======+=================================+ | +=======+===============================+ | |||
| 0 | chroma "Planes" are not present | | | 0 | chroma Planes are not present | | |||
+-------+---------------------------------+ | +-------+-------------------------------+ | |||
| 1 | chroma "Planes" are present | | | 1 | chroma Planes are present | | |||
+-------+---------------------------------+ | +-------+-------------------------------+ | |||
Table 10 | Table 10 | |||
4.2.7. bits_per_raw_sample | 4.2.7. bits_per_raw_sample | |||
"bits_per_raw_sample" indicates the number of bits for each "Sample". | "bits_per_raw_sample" indicates the number of bits for each Sample. | |||
Inferred to be 8 if not present. | Inferred to be 8 if not present. | |||
+=======+===================================+ | +=======+=================================+ | |||
| value | bits for each sample | | | value | bits for each sample | | |||
+=======+===================================+ | +=======+=================================+ | |||
| 0 | reserved* | | | 0 | reserved* | | |||
+-------+-----------------------------------+ | +-------+---------------------------------+ | |||
| Other | the actual bits for each "Sample" | | | Other | the actual bits for each Sample | | |||
+-------+-----------------------------------+ | +-------+---------------------------------+ | |||
Table 11 | Table 11 | |||
* Encoders MUST NOT store "bits_per_raw_sample" = 0. Decoders SHOULD | * Encoders MUST NOT store "bits_per_raw_sample" = 0. Decoders SHOULD | |||
accept and interpret "bits_per_raw_sample" = 0 as 8. | accept and interpret "bits_per_raw_sample" = 0 as 8. | |||
4.2.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 is raised, between luma and chroma width | |||
width ("chroma_width = 2 ^ -log2_h_chroma_subsample * luma_width"). | ("chroma_width = 2 ^ -log2_h_chroma_subsample * luma_width"). | |||
4.2.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 is 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.2.10. extra_plane | 4.2.10. extra_plane | |||
"extra_plane" indicates if an extra "Plane" is present. | "extra_plane" indicates if an extra Plane is present. | |||
+=======+==============================+ | +=======+============================+ | |||
| value | presence | | | value | presence | | |||
+=======+==============================+ | +=======+============================+ | |||
| 0 | extra "Plane" is not present | | | 0 | extra Plane is not present | | |||
+-------+------------------------------+ | +-------+----------------------------+ | |||
| 1 | extra "Plane" is present | | | 1 | extra Plane is present | | |||
+-------+------------------------------+ | +-------+----------------------------+ | |||
Table 12 | Table 12 | |||
4.2.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. | |||
skipping to change at page 36, line 46 ¶ | skipping to change at page 38, line 46 ¶ | |||
Table 13 | Table 13 | |||
4.2.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 23 | Figure 26 | |||
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 24 | Figure 27 | |||
4.2.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 in "ConfigurationRecord" | | | 0 | 32-bit CRC in "ConfigurationRecord" | | |||
+-------+-------------------------------------------------+ | +-------+-------------------------------------------------+ | |||
| 1 | 32-bit CRC in "Slice" and "ConfigurationRecord" | | | 1 | 32-bit CRC in "Slice" and "ConfigurationRecord" | | |||
+-------+-------------------------------------------------+ | +-------+-------------------------------------------------+ | |||
| Other | reserved for future use | | | Other | reserved for future use | | |||
+-------+-------------------------------------------------+ | +-------+-------------------------------------------------+ | |||
Table 14 | Table 14 | |||
4.2.17. intra | 4.2.17. intra | |||
"intra" indicates the constraint on "keyframe" in each instance of | "intra" indicates the constraint on "keyframe" in each instance of | |||
"Frame". | Frame. | |||
Inferred to be 0 if not present. | Inferred to be 0 if not present. | |||
+=======+=======================================================+ | +=======+=======================================================+ | |||
| value | relationship | | | value | relationship | | |||
+=======+=======================================================+ | +=======+=======================================================+ | |||
| 0 | "keyframe" can be 0 or 1 (non keyframes or keyframes) | | | 0 | "keyframe" can be 0 or 1 (non keyframes or keyframes) | | |||
+-------+-------------------------------------------------------+ | +-------+-------------------------------------------------------+ | |||
| 1 | "keyframe" MUST be 1 (keyframes only) | | | 1 | "keyframe" MUST be 1 (keyframes only) | | |||
+-------+-------------------------------------------------------+ | +-------+-------------------------------------------------------+ | |||
| Other | reserved for future use | | | Other | reserved for future use | | |||
+-------+-------------------------------------------------------+ | +-------+-------------------------------------------------------+ | |||
Table 15 | Table 15 | |||
4.3. 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" as described in | Record" is stored in the underlying Container as described in | |||
Section 4.3.3. It contains the "Parameters" used for all instances | Section 4.3.3. It contains the "Parameters" used for all instances | |||
of "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.3.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" is a placeholder for future updates of this | |||
use. | specification. | |||
Encoders conforming to this version of this specification SHALL NOT | Encoders conforming to this version of this specification SHALL NOT | |||
write this value. | write "reserved_for_future_use". | |||
Decoders conforming to this version of this specification SHALL | Decoders conforming to this version of this specification SHALL | |||
ignore its value. | ignore "reserved_for_future_use". | |||
4.3.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.9.3. | The CRC generator polynomial used is described in Section 4.9.3. | |||
skipping to change at page 39, line 42 ¶ | skipping to change at page 41, line 42 ¶ | |||
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.4. 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 | |||
The whole "Frame" is provided by the underlaying container. | 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" | |||
"version" <= 1), and a sequence of independent slices. The pseudo- | <= 1), and a sequence of independent slices. The pseudo-code below | |||
code below describes the contents of a "Frame". | describes the contents of a Frame. | |||
"keyframe" field has its own initial state, set to 128. | "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( ) | | |||
} | | } | | |||
} | | } | | |||
Architecture overview of slices in a "Frame": | Architecture overview of slices in a Frame: | |||
+=================================================================+ | +=================================================================+ | |||
+=================================================================+ | +=================================================================+ | |||
| first slice header | | | first slice header | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| first slice content | | | first slice content | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| first slice footer | | | first slice footer | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| --------------------------------------------------------------- | | | --------------------------------------------------------------- | | |||
skipping to change at page 41, line 7 ¶ | skipping to change at page 43, line 7 ¶ | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| last slice content | | | last slice content | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
| last slice footer | | | last slice footer | | |||
+-----------------------------------------------------------------+ | +-----------------------------------------------------------------+ | |||
Table 16 | Table 16 | |||
4.5. 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 | |||
of more than one "Slice" per "Frame" can be useful for taking | more than one "Slice" per Frame can be useful for taking advantage of | |||
advantage of the opportunities of multithreaded encoding and | 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". | |||
pseudo-code | type | pseudo-code | type | |||
--------------------------------------------------------------|----- | --------------------------------------------------------------|----- | |||
Slice( ) { | | Slice( ) { | | |||
if (version >= 3) { | | if (version >= 3) { | | |||
SliceHeader( ) | | SliceHeader( ) | | |||
skipping to change at page 41, line 46 ¶ | skipping to change at page 43, line 45 ¶ | |||
} | | } | | |||
} | | } | | |||
"padding" specifies a bit without any significance and used only for | "padding" specifies a bit without any significance and used only for | |||
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 "reserved". | |||
Decoders SHOULD ignore these bits. | Decoders SHOULD ignore "reserved". | |||
4.6. 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. | "Slice Header" has its own initial states, all set to 128. | |||
skipping to change at page 43, line 30 ¶ | skipping to change at page 45, line 30 ¶ | |||
"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 Content". | "Slice Content". | |||
Inferred to be 0 if not present. | Inferred to be 0 if not present. | |||
4.6.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 | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| 1 | top field first | | | 1 | top field first | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
skipping to change at page 44, line 7 ¶ | skipping to change at page 46, line 7 ¶ | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| 3 | progressive | | | 3 | progressive | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| Other | reserved for future use | | | Other | reserved for future use | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
Table 17 | Table 17 | |||
4.6.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.6.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.10. reset_contexts | 4.6.10. reset_contexts | |||
"reset_contexts" indicates if slice contexts must be reset. | "reset_contexts" indicates if slice contexts MUST be reset. | |||
Inferred to be 0 if not present. | Inferred to be 0 if not present. | |||
4.6.11. slice_coding_mode | 4.6.11. slice_coding_mode | |||
"slice_coding_mode" indicates the slice coding mode. | "slice_coding_mode" indicates the slice coding mode. | |||
Inferred to be 0 if not present. | Inferred to be 0 if not present. | |||
+=======+=============================+ | +=======+=============================+ | |||
skipping to change at page 45, line 19 ¶ | skipping to change at page 47, line 19 ¶ | |||
+-------+-----------------------------+ | +-------+-----------------------------+ | |||
| 1 | raw PCM | | | 1 | raw PCM | | |||
+-------+-----------------------------+ | +-------+-----------------------------+ | |||
| Other | reserved for future use | | | Other | reserved for future use | | |||
+-------+-----------------------------+ | +-------+-----------------------------+ | |||
Table 18 | Table 18 | |||
4.7. 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 | |||
"Plane" then by row (YCbCr) or by row then by "Plane" (RGB). | 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) { | | |||
for (p = 0; p < primary_color_count; p++) { | | for (p = 0; p < primary_color_count; p++) { | | |||
for (y = 0; y < plane_pixel_height[ p ]; y++) { | | for (y = 0; y < plane_pixel_height[ p ]; y++) { | | |||
Line( p, y ) | | Line( p, y ) | | |||
} | | } | | |||
} | | } | | |||
skipping to change at page 45, line 50 ¶ | skipping to change at page 47, line 50 ¶ | |||
} | | } | | |||
4.7.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.7.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 | |||
the "Slice". It is defined as: | "Slice". It is defined as: | |||
chroma_planes == 1 && (p == 1 || p == 2) | chroma_planes == 1 && (p == 1 || p == 2) | |||
? ceil(slice_pixel_height / (1 << log2_v_chroma_subsample)) | ? ceil(slice_pixel_height / (1 << log2_v_chroma_subsample)) | |||
: slice_pixel_height | : slice_pixel_height | |||
4.7.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: | |||
skipping to change at page 46, line 29 ¶ | skipping to change at page 48, line 29 ¶ | |||
4.7.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.8. 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.8.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) | chroma\_planes == 1 && (p == 1 || p == 2) | |||
? ceil( slice_pixel_width / (1 << log2_h_chroma_subsample) ) | ? ceil( slice_pixel_width / (1 << log2_h_chroma_subsample) ) | |||
: slice_pixel_width. | : slice_pixel_width. | |||
4.8.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( | floor( | |||
( slice_x + slice_width ) | ( slice_x + slice_width ) | |||
* slice_pixel_width | * slice_pixel_width | |||
/ num_h_slices | / num_h_slices | |||
) - slice_pixel_x | ) - slice_pixel_x | |||
4.8.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.8.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 | |||
"Sample" value is computed based on median predictor and context | value is computed based on median predictor and context described in | |||
described in Section 3.2. | Section 3.2. | |||
4.9. 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 | |||
skipping to change at page 48, line 48 ¶ | skipping to change at page 50, line 48 ¶ | |||
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. | |||
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 | |||
one and only one slice of the "Frame" (no missing slice position, no | one and only one slice of the Frame (no missing slice position, no | |||
slice overlapping). | slice overlapping). | |||
For each "Frame" with "keyframe" value of 0, each slice MUST have the | For each Frame with "keyframe" value of 0, each slice MUST have the | |||
same value of "slice_x", "slice_y", "slice_width", "slice_height" as | same value of "slice_x", "slice_y", "slice_width", "slice_height" as | |||
a slice in the previous "Frame", except if "reset_contexts" is 1. | a slice in the previous Frame, except if "reset_contexts" is 1. | |||
6. Security Considerations | 6. Security Considerations | |||
Like any other codec, (such as [RFC6716]), FFV1 should not be used | Like any other codec, (such as [RFC6716]), FFV1 should not be used | |||
with insecure ciphers or cipher-modes that are vulnerable to known | with insecure ciphers or cipher-modes that are vulnerable to known | |||
plaintext attacks. Some of the header bits as well as the padding | plaintext attacks. Some of the header bits as well as the padding | |||
are easily predictable. | are easily predictable. | |||
Implementations of the FFV1 codec need to take appropriate security | Implementations of the FFV1 codec need to take appropriate security | |||
considerations into account, as outlined in [RFC4732]. It is | considerations into account, as outlined in [RFC4732]. It is | |||
extremely important for the decoder to be robust against malicious | extremely important for the decoder to be robust against malicious | |||
payloads. Malicious payloads must not cause the decoder to overrun | payloads. Malicious payloads MUST NOT cause the decoder to overrun | |||
its allocated memory or to take an excessive amount of resources to | its allocated memory or to take an excessive amount of resources to | |||
decode. The same applies to the encoder, even though problems in | decode. The same applies to the encoder, even though problems in | |||
encoders are typically rarer. Malicious video streams must not cause | encoders are typically rarer. Malicious video streams MUST NOT cause | |||
the encoder to misbehave because this would allow an attacker to | the encoder to misbehave because this would allow an attacker to | |||
attack transcoding gateways. A frequent security problem in image | attack transcoding gateways. A frequent security problem in image | |||
and video codecs is also to not check for integer overflows, for | and video codecs is failure to check for integer overflows. An | |||
example to allocate "frame_pixel_width * frame_pixel_height" in | example is allocating "frame_pixel_width * frame_pixel_height" in | |||
"Pixel" count computations without considering that the | Pixel count computations without considering that the multiplication | |||
multiplication result may have overflowed the arithmetic types range. | result may have overflowed the arithmetic types range. The range | |||
The range coder could, if implemented naively, read one byte over the | coder could, if implemented naively, read one byte over the end. The | |||
end. The implementation must ensure that no read outside allocated | implementation MUST ensure that no read outside allocated and | |||
and initialized memory occurs. | initialized memory occurs. | |||
None of the content carried in FFV1 is intended to be executable. | None of the content carried in FFV1 is intended to be executable. | |||
The reference implementation [REFIMPL] contains no known buffer | The reference implementation [REFIMPL] contains no known buffer | |||
overflow or cases where a specially crafted packet or video segment | overflow or cases where a specially crafted packet or video segment | |||
could cause a significant increase in CPU load. | could cause a significant increase in CPU load. | |||
The reference implementation [REFIMPL] was validated in the following | The reference implementation [REFIMPL] was validated in the following | |||
conditions: | conditions: | |||
skipping to change at page 50, line 13 ¶ | skipping to change at page 52, line 13 ¶ | |||
then subjected to random corruption. | then subjected to random corruption. | |||
* 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. IANA Considerations | |||
The IANA is requested to register the following values: | ||||
7.1. Media Type Definition | ||||
This registration is done using the template defined in [RFC6838] and | This registration is done using the template defined 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. | |||
skipping to change at page 51, line 32 ¶ | skipping to change at page 53, line 39 ¶ | |||
Niedermayer michael@niedermayer.cc (mailto:michael@niedermayer.cc) | Niedermayer michael@niedermayer.cc (mailto:michael@niedermayer.cc) | |||
Intended usage: COMMON | Intended usage: COMMON | |||
Restrictions on usage: None. | Restrictions on usage: None. | |||
Author: Dave Rice dave@dericed.com (mailto:dave@dericed.com) | Author: Dave Rice dave@dericed.com (mailto:dave@dericed.com) | |||
Change controller: IETF cellar working group delegated from the IESG. | Change controller: IETF cellar working group delegated from the IESG. | |||
8. IANA Considerations | 8. Changelog | |||
The IANA is requested to register the following values: | ||||
* Media type registration as described in Section 7. | ||||
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 | 9. Normative References | |||
[ISO.15444-1.2016] | ||||
International Organization for Standardization, | ||||
"Information technology -- JPEG 2000 image coding system: | ||||
Core coding system", October 2016. | ||||
[ISO.9899.2018] | ||||
International Organization for Standardization, | ||||
"Programming languages - C", ISO Standard 9899, 2018. | ||||
[Matroska] IETF, "Matroska", 2019, <https://datatracker.ietf.org/doc/ | ||||
draft-ietf-cellar-matroska/>. | ||||
[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>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
[RFC4732] Handley, M., Ed., Rescorla, E., Ed., and IAB, "Internet | [RFC4732] Handley, M., Ed., Rescorla, E., Ed., and IAB, "Internet | |||
Denial-of-Service Considerations", RFC 4732, | Denial-of-Service Considerations", RFC 4732, | |||
DOI 10.17487/RFC4732, December 2006, | DOI 10.17487/RFC4732, December 2006, | |||
<https://www.rfc-editor.org/info/rfc4732>. | <https://www.rfc-editor.org/info/rfc4732>. | |||
[ISO.9899.2018] | [RFC4855] Casner, S., "Media Type Registration of RTP Payload | |||
International Organization for Standardization, | Formats", RFC 4855, DOI 10.17487/RFC4855, February 2007, | |||
"Programming languages - C", ISO Standard 9899, 2018. | <https://www.rfc-editor.org/info/rfc4855>. | |||
[RFC6716] Valin, JM., Vos, K., and T. Terriberry, "Definition of the | ||||
Opus Audio Codec", RFC 6716, DOI 10.17487/RFC6716, | ||||
September 2012, <https://www.rfc-editor.org/info/rfc6716>. | ||||
[RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | |||
Specifications and Registration Procedures", BCP 13, | Specifications and Registration Procedures", BCP 13, | |||
RFC 6838, DOI 10.17487/RFC6838, January 2013, | RFC 6838, DOI 10.17487/RFC6838, January 2013, | |||
<https://www.rfc-editor.org/info/rfc6838>. | <https://www.rfc-editor.org/info/rfc6838>. | |||
[ISO.9899.1990] | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
International Organization for Standardization, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
"Programming languages - C", ISO Standard 9899, 1990. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[ISO.15444-1.2016] | ||||
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 | 10. Informative References | |||
Opus Audio Codec", RFC 6716, DOI 10.17487/RFC6716, | ||||
September 2012, <https://www.rfc-editor.org/info/rfc6716>. | ||||
[RFC4855] Casner, S., "Media Type Registration of RTP Payload | [Address-Sanitizer] | |||
Formats", RFC 4855, DOI 10.17487/RFC4855, February 2007, | The Clang Team, "ASAN AddressSanitizer website", undated, | |||
<https://www.rfc-editor.org/info/rfc4855>. | <https://clang.llvm.org/docs/AddressSanitizer.html>. | |||
[Matroska] IETF, "Matroska", 2019, <https://datatracker.ietf.org/doc/ | [AVI] Microsoft, "AVI RIFF File Reference", undated, | |||
draft-ietf-cellar-matroska/>. | <https://msdn.microsoft.com/en-us/library/windows/desktop/ | |||
dd318189%28v=vs.85%29.aspx>. | ||||
11. Informative References | [HuffYUV] Rudiak-Gould, B., "HuffYUV", December 2003, | |||
<https://web.archive.org/web/20040402121343/ | ||||
http://cultact-server.novi.dk/kpo/huffyuv/huffyuv.html>. | ||||
[I-D.ietf-cellar-ffv1] | [I-D.ietf-cellar-ffv1] | |||
Niedermayer, M., Rice, D., and J. Martinez, "FFV1 Video | Niedermayer, M., Rice, D., and J. Martinez, "FFV1 Video | |||
Coding Format Version 0, 1, and 3", Work in Progress, | Coding Format Version 0, 1, and 3", Work in Progress, | |||
Internet-Draft, draft-ietf-cellar-ffv1-16, 2 July 2020, | Internet-Draft, draft-ietf-cellar-ffv1-17, 21 August 2020, | |||
<https://tools.ietf.org/html/draft-ietf-cellar-ffv1-16>. | <https://tools.ietf.org/html/draft-ietf-cellar-ffv1-17>. | |||
[ISO.14495-1.1999] | [ISO.14495-1.1999] | |||
International Organization for Standardization, | International Organization for Standardization, | |||
"Information technology -- Lossless and near-lossless | "Information technology -- Lossless and near-lossless | |||
compression of continuous-tone still images: Baseline", | compression of continuous-tone still images: Baseline", | |||
December 1999. | December 1999. | |||
[NUT] Niedermayer, M., "NUT Open Container Format", December | ||||
2013, <https://ffmpeg.org/~michael/nut.txt>. | ||||
[YCbCr] Wikipedia, "YCbCr", undated, | ||||
<https://en.wikipedia.org/w/index.php?title=YCbCr>. | ||||
[ISO.14496-10.2014] | [ISO.14496-10.2014] | |||
International Organization for Standardization, | International Organization for Standardization, | |||
"Information technology -- Coding of audio-visual objects | "Information technology -- Coding of audio-visual objects | |||
-- Part 10: Advanced Video Coding", September 2014. | -- Part 10: Advanced Video Coding", September 2014. | |||
[VALGRIND] Valgrind Developers, "Valgrind website", undated, | ||||
<https://valgrind.org/>. | ||||
[REFIMPL] Niedermayer, M., "The reference FFV1 implementation / the | ||||
FFV1 codec in FFmpeg", undated, <https://ffmpeg.org>. | ||||
[HuffYUV] Rudiak-Gould, B., "HuffYUV", December 2003, | ||||
<https://web.archive.org/web/20040402121343/ | ||||
http://cultact-server.novi.dk/kpo/huffyuv/huffyuv.html>. | ||||
[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. | |||
[NUT] Niedermayer, M., "NUT Open Container Format", December | ||||
2013, <https://ffmpeg.org/~michael/nut.txt>. | ||||
[range-coding] | [range-coding] | |||
Nigel, G. and N. Martin, "Range encoding: an algorithm for | Martin, G. N. N., "Range encoding: an algorithm for | |||
removing redundancy from a digitised message.", | removing redundancy from a digitised message", Proceedings | |||
Proceedings of the Conference on Video and Data | of the Conference on Video and Data Recording. Institution | |||
Recording. Institution of Electronic and Radio Engineers, | of Electronic and Radio Engineers, Hampshire, England, | |||
Hampshire, England, July 1979. | July 1979. | |||
[AVI] Microsoft, "AVI RIFF File Reference", undated, | [REFIMPL] Niedermayer, M., "The reference FFV1 implementation / the | |||
<https://msdn.microsoft.com/en-us/library/windows/desktop/ | FFV1 codec in FFmpeg", undated, <https://ffmpeg.org>. | |||
dd318189%28v=vs.85%29.aspx>. | ||||
[Address-Sanitizer] | [VALGRIND] Valgrind Developers, "Valgrind website", undated, | |||
The Clang Team, "ASAN AddressSanitizer website", undated, | <https://valgrind.org/>. | |||
<https://clang.llvm.org/docs/AddressSanitizer.html>. | ||||
[YCbCr] Wikipedia, "YCbCr", undated, | ||||
<https://en.wikipedia.org/w/index.php?title=YCbCr>. | ||||
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 | |||
End of changes. 167 change blocks. | ||||
411 lines changed or deleted | 455 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |