draft-ietf-cellar-ffv1-06.txt | draft-ietf-cellar-ffv1-07.txt | |||
---|---|---|---|---|
cellar M. Niedermayer | cellar M. Niedermayer | |||
Internet-Draft | Internet-Draft | |||
Intended status: Informational D. Rice | Intended status: Informational D. Rice | |||
Expires: April 21, 2019 | Expires: August 10, 2019 | |||
J. Martinez | J. Martinez | |||
October 18, 2018 | February 6, 2019 | |||
FFV1 Video Coding Format Version 0, 1, and 3 | FFV1 Video Coding Format Version 0, 1, and 3 | |||
draft-ietf-cellar-ffv1-06 | draft-ietf-cellar-ffv1-07 | |||
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 April 21, 2019. | This Internet-Draft will expire on August 10, 2019. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2019 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 | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | 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 . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.1. Definitions . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
2.2. Conventions . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.2. Conventions . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
2.2.1. Pseudo-code . . . . . . . . . . . . . . . . . . . . . 6 | 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 . . . . . . . . . . . . . . . . 6 | |||
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 . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
2.2.8. NumBytes . . . . . . . . . . . . . . . . . . . . . . 8 | 2.2.8. NumBytes . . . . . . . . . . . . . . . . . . . . . . 8 | |||
2.2.9. Bitstream Functions . . . . . . . . . . . . . . . . . 8 | 2.2.9. Bitstream Functions . . . . . . . . . . . . . . . . . 8 | |||
3. Sample Coding . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3. Sample Coding . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
3.1. Border . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 3.1. Border . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
3.2. Samples . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 3.2. Samples . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
3.3. Median Predictor . . . . . . . . . . . . . . . . . . . . 10 | 3.3. Median Predictor . . . . . . . . . . . . . . . . . . . . 10 | |||
3.4. Context . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 3.4. Context . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
3.5. Quantization Table Sets . . . . . . . . . . . . . . . . . 11 | 3.5. Quantization Table Sets . . . . . . . . . . . . . . . . . 11 | |||
3.6. Quantization Table Set Indexes . . . . . . . . . . . . . 12 | 3.6. Quantization Table Set Indexes . . . . . . . . . . . . . 12 | |||
3.7. Color spaces . . . . . . . . . . . . . . . . . . . . . . 12 | 3.7. Color spaces . . . . . . . . . . . . . . . . . . . . . . 12 | |||
3.7.1. YCbCr . . . . . . . . . . . . . . . . . . . . . . . . 12 | 3.7.1. YCbCr . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
3.7.2. RGB . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 3.7.2. RGB . . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
3.8. Coding of the Sample Difference . . . . . . . . . . . . . 14 | 3.8. Coding of the Sample Difference . . . . . . . . . . . . . 14 | |||
3.8.1. Range Coding Mode . . . . . . . . . . . . . . . . . . 14 | 3.8.1. Range Coding Mode . . . . . . . . . . . . . . . . . . 15 | |||
3.8.2. Golomb Rice Mode . . . . . . . . . . . . . . . . . . 18 | 3.8.2. Golomb Rice Mode . . . . . . . . . . . . . . . . . . 19 | |||
4. Bitstream . . . . . . . . . . . . . . . . . . . . . . . . . . 20 | 4. Bitstream . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
4.1. Parameters . . . . . . . . . . . . . . . . . . . . . . . 21 | 4.1. Parameters . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
4.1.1. version . . . . . . . . . . . . . . . . . . . . . . . 22 | 4.1.1. version . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
4.1.2. micro_version . . . . . . . . . . . . . . . . . . . . 23 | 4.1.2. micro_version . . . . . . . . . . . . . . . . . . . . 26 | |||
4.1.3. coder_type . . . . . . . . . . . . . . . . . . . . . 23 | 4.1.3. coder_type . . . . . . . . . . . . . . . . . . . . . 26 | |||
4.1.4. state_transition_delta . . . . . . . . . . . . . . . 24 | 4.1.4. state_transition_delta . . . . . . . . . . . . . . . 27 | |||
4.1.5. colorspace_type . . . . . . . . . . . . . . . . . . . 24 | 4.1.5. colorspace_type . . . . . . . . . . . . . . . . . . . 27 | |||
4.1.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 24 | 4.1.6. chroma_planes . . . . . . . . . . . . . . . . . . . . 27 | |||
4.1.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 24 | 4.1.7. bits_per_raw_sample . . . . . . . . . . . . . . . . . 28 | |||
4.1.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 25 | 4.1.8. log2_h_chroma_subsample . . . . . . . . . . . . . . . 28 | |||
4.1.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 25 | 4.1.9. log2_v_chroma_subsample . . . . . . . . . . . . . . . 28 | |||
4.1.10. alpha_plane . . . . . . . . . . . . . . . . . . . . . 25 | 4.1.10. extra_plane . . . . . . . . . . . . . . . . . . . . . 28 | |||
4.1.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 25 | 4.1.11. num_h_slices . . . . . . . . . . . . . . . . . . . . 28 | |||
4.1.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 25 | 4.1.12. num_v_slices . . . . . . . . . . . . . . . . . . . . 29 | |||
4.1.13. quant_table_set_count . . . . . . . . . . . . . . . . 26 | 4.1.13. quant_table_set_count . . . . . . . . . . . . . . . . 29 | |||
4.1.14. states_coded . . . . . . . . . . . . . . . . . . . . 26 | 4.1.14. states_coded . . . . . . . . . . . . . . . . . . . . 29 | |||
4.1.15. initial_state_delta . . . . . . . . . . . . . . . . . 26 | 4.1.15. initial_state_delta . . . . . . . . . . . . . . . . . 29 | |||
4.1.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 26 | 4.1.16. ec . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
4.1.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 26 | 4.1.17. intra . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
4.2. Configuration Record . . . . . . . . . . . . . . . . . . 27 | 4.2. Configuration Record . . . . . . . . . . . . . . . . . . 30 | |||
4.2.1. reserved_for_future_use . . . . . . . . . . . . . . . 27 | 4.2.1. reserved_for_future_use . . . . . . . . . . . . . . . 30 | |||
4.2.2. configuration_record_crc_parity . . . . . . . . . . . 27 | 4.2.2. configuration_record_crc_parity . . . . . . . . . . . 30 | |||
4.2.3. Mapping FFV1 into Containers . . . . . . . . . . . . 28 | 4.2.3. Mapping FFV1 into Containers . . . . . . . . . . . . 31 | |||
4.3. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 4.3. Frame . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
4.4. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 4.4. Slice . . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
4.5. Slice Header . . . . . . . . . . . . . . . . . . . . . . 30 | 4.5. Slice Header . . . . . . . . . . . . . . . . . . . . . . 33 | |||
4.5.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 31 | 4.5.1. slice_x . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
4.5.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 31 | 4.5.2. slice_y . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
4.5.3. slice_width . . . . . . . . . . . . . . . . . . . . . 31 | 4.5.3. slice_width . . . . . . . . . . . . . . . . . . . . . 34 | |||
4.5.4. slice_height . . . . . . . . . . . . . . . . . . . . 31 | 4.5.4. slice_height . . . . . . . . . . . . . . . . . . . . 34 | |||
4.5.5. quant_table_set_index_count . . . . . . . . . . . . . 31 | 4.5.5. quant_table_set_index_count . . . . . . . . . . . . . 34 | |||
4.5.6. quant_table_set_index . . . . . . . . . . . . . . . . 31 | 4.5.6. quant_table_set_index . . . . . . . . . . . . . . . . 34 | |||
4.5.7. picture_structure . . . . . . . . . . . . . . . . . . 32 | 4.5.7. picture_structure . . . . . . . . . . . . . . . . . . 35 | |||
4.5.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 32 | 4.5.8. sar_num . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
4.5.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 32 | 4.5.9. sar_den . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
4.6. Slice Content . . . . . . . . . . . . . . . . . . . . . . 32 | 4.6. Slice Content . . . . . . . . . . . . . . . . . . . . . . 35 | |||
4.6.1. primary_color_count . . . . . . . . . . . . . . . . . 33 | 4.6.1. primary_color_count . . . . . . . . . . . . . . . . . 36 | |||
4.6.2. plane_pixel_height . . . . . . . . . . . . . . . . . 33 | 4.6.2. plane_pixel_height . . . . . . . . . . . . . . . . . 36 | |||
4.6.3. slice_pixel_height . . . . . . . . . . . . . . . . . 33 | 4.6.3. slice_pixel_height . . . . . . . . . . . . . . . . . 36 | |||
4.6.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 33 | 4.6.4. slice_pixel_y . . . . . . . . . . . . . . . . . . . . 36 | |||
4.7. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 33 | 4.7. Line . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
4.7.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 34 | 4.7.1. plane_pixel_width . . . . . . . . . . . . . . . . . . 37 | |||
4.7.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 34 | 4.7.2. slice_pixel_width . . . . . . . . . . . . . . . . . . 37 | |||
4.7.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 34 | 4.7.3. slice_pixel_x . . . . . . . . . . . . . . . . . . . . 37 | |||
4.7.4. sample_difference . . . . . . . . . . . . . . . . . . 34 | 4.7.4. sample_difference . . . . . . . . . . . . . . . . . . 37 | |||
4.8. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 34 | 4.8. Slice Footer . . . . . . . . . . . . . . . . . . . . . . 37 | |||
4.8.1. slice_size . . . . . . . . . . . . . . . . . . . . . 35 | 4.8.1. slice_size . . . . . . . . . . . . . . . . . . . . . 38 | |||
4.8.2. error_status . . . . . . . . . . . . . . . . . . . . 35 | 4.8.2. error_status . . . . . . . . . . . . . . . . . . . . 38 | |||
4.8.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 35 | 4.8.3. slice_crc_parity . . . . . . . . . . . . . . . . . . 38 | |||
4.9. Quantization Table Set . . . . . . . . . . . . . . . . . 35 | 4.9. Quantization Table Set . . . . . . . . . . . . . . . . . 38 | |||
4.9.1. quant_tables . . . . . . . . . . . . . . . . . . . . 36 | 4.9.1. quant_tables . . . . . . . . . . . . . . . . . . . . 39 | |||
4.9.2. context_count . . . . . . . . . . . . . . . . . . . . 37 | 4.9.2. context_count . . . . . . . . . . . . . . . . . . . . 40 | |||
5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 37 | 5. Restrictions . . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
6. Security Considerations . . . . . . . . . . . . . . . . . . . 37 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 40 | |||
7. Media Type Definition . . . . . . . . . . . . . . . . . . . . 38 | 7. Media Type Definition . . . . . . . . . . . . . . . . . . . . 41 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 40 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 43 | |||
9. Appendixes . . . . . . . . . . . . . . . . . . . . . . . . . 40 | 9. Appendixes . . . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
9.1. Decoder implementation suggestions . . . . . . . . . . . 40 | 9.1. Decoder implementation suggestions . . . . . . . . . . . 43 | |||
9.1.1. Multi-threading Support and Independence of Slices . 40 | 9.1.1. Multi-threading Support and Independence of Slices . 43 | |||
10. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | 10. Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 40 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
11.1. Normative References . . . . . . . . . . . . . . . . . . 40 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 43 | |||
11.2. Informative References . . . . . . . . . . . . . . . . . 41 | 11.2. Informative References . . . . . . . . . . . . . . . . . 44 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 43 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
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 | |||
encodings. | encodings. | |||
This document defines a version 0, 1, and 3 of FFV1. The | This document defines version 0, 1 and 3 of FFV1. The distinctions | |||
distinctions of the versions are provided throughout the document, | of the versions are provided throughout the document, but in summary: | |||
but in summary: | ||||
o Version 0 of FFV1 was the original implementation of FFV1 and has | o Version 0 of FFV1 was the original implementation of FFV1 and has | |||
been in non-experimental use since April 14, 2006 [FFV1_V0]. | been in non-experimental use since April 14, 2006 [FFV1_V0]. | |||
o Version 1 of FFV1 adds support of more video bit depths and has | o Version 1 of FFV1 adds support of more video bit depths and has | |||
been in use since April 24, 2009 [FFV1_V1]. | been in use since April 24, 2009 [FFV1_V1]. | |||
o Version 2 of FFV1 only existed in experimental form and is not | o Version 2 of FFV1 only existed in experimental form and is not | |||
described by this document, but is available as a LyX file at | described by this document, but is available as a LyX file at | |||
<https://github.com/FFmpeg/FFV1/ | <https://github.com/FFmpeg/FFV1/ | |||
skipping to change at page 5, line 12 ¶ | skipping to change at page 5, line 12 ¶ | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
2.1. Definitions | 2.1. Definitions | |||
"Container": Format that encapsulates "Frames" (see Section 4.3) and | "Container": Format that encapsulates "Frames" (see Section 4.3) and | |||
(when required) a "Configuration Record" into a bitstream. | (when required) a "Configuration Record" into a bitstream. | |||
"Sample": The smallest addressable representation of a color | "Sample": The smallest addressable representation of a color | |||
component or a luma component in a "Frame". Examples of "Sample" are | component or a luma component in a "Frame". Examples of "Sample" are | |||
Luma, Blue Chrominance, Red Chrominance, Alpha, Red, Green, and Blue. | Luma, Blue Chrominance, Red Chrominance, Transparency, Red, Green, | |||
and Blue. | ||||
"Plane": A discrete component of a static image comprised of | "Plane": A discrete component of a static image comprised of | |||
"Samples" that represent a specific quantification of "Samples" of | "Samples" that represent a specific quantification of "Samples" of | |||
that image. | that image. | |||
"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 1 or more "Samples". | "Frame". It is composed of 1 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. | too large for normal storage and that an alternate storage method is | |||
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. | |||
"RCT": Reversible Color Transform, a near linear, exactly reversible | "RCT": Reversible Color Transform, a near linear, exactly reversible | |||
integer transform that converts between RGB and YCbCr representations | integer transform that converts between RGB and YCbCr representations | |||
of a "Pixel". | of a "Pixel". | |||
"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 using three numeric values that represent the luma of the "Pixel" | by using three numeric values that represent the luma of the "Pixel" | |||
(Y) and the chrominance of the "Pixel" (Cb and Cr). YCbCr word is | (Y) and the chrominance of the "Pixel" (Cb and Cr). YCbCr word is | |||
used for historical reasons and currently references any color space | used for historical reasons and currently references any color space | |||
relying on 1 luma "Sample" and 2 chrominance "Samples" e.g. YCbCr, | relying on 1 luma "Sample" and 2 chrominance "Samples", e.g. YCbCr, | |||
YCgCo or ICtCp. Exact meaning of the three numeric values is | YCgCo or ICtCp. 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.1990] and uses its "if/else", "while" and "for" | |||
functions as well as functions defined within this document. | functions as well as functions defined within this document. | |||
2.2.2. Arithmetic Operators | 2.2.2. Arithmetic Operators | |||
skipping to change at page 6, line 28 ¶ | skipping to change at page 6, line 31 ¶ | |||
"a + b" means a plus b. | "a + b" means a plus b. | |||
"a - b" means a minus b. | "a - b" means a minus b. | |||
"-a" means negation of a. | "-a" means negation of a. | |||
"a * b" means a multiplied by b. | "a * b" means a multiplied by b. | |||
"a / b" means a divided by b. | "a / b" means a divided by b. | |||
"a ^ b" means a raised to the b-th power. | ||||
"a & b" means bit-wise "and" of a and b. | "a & b" means bit-wise "and" of a and b. | |||
"a | b" means bit-wise "or" of a and b. | "a | b" means bit-wise "or" of a and b. | |||
"a >> b" means arithmetic right shift of two's complement integer | "a >> b" means arithmetic right shift of two's complement integer | |||
representation of a by b binary digits. | representation of a by b binary digits. | |||
"a << b" means arithmetic left shift of two's complement integer | "a << b" means arithmetic left shift of two's complement integer | |||
representation of a by b binary digits. | representation of a by b binary digits. | |||
skipping to change at page 8, line 15 ¶ | skipping to change at page 8, line 16 ¶ | |||
2.2.6. Order of Operation Precedence | 2.2.6. Order of Operation Precedence | |||
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 starting from a to b, inclusive. | |||
2.2.8. NumBytes | 2.2.8. NumBytes | |||
"NumBytes" is a non-negative integer that expresses the size in 8-bit | "NumBytes" is a non-negative integer that expresses the size in 8-bit | |||
octets of particular FFV1 "Configuration Record" or "Frame". FFV1 | octets of a particular FFV1 "Configuration Record" or "Frame". FFV1 | |||
relies on its "Container" to store the "NumBytes" values, see | relies on its "Container" to store the "NumBytes" values, see | |||
Section 4.2.3. | Section 4.2.3. | |||
2.2.9. Bitstream Functions | 2.2.9. Bitstream Functions | |||
2.2.9.1. remaining_bits_in_bitstream | 2.2.9.1. remaining_bits_in_bitstream | |||
"remaining_bits_in_bitstream( )" means the count of remaining bits | "remaining_bits_in_bitstream( )" means the count of remaining bits | |||
after the pointer in that "Configuration Record" or "Frame". It is | after the pointer in that "Configuration Record" or "Frame". It is | |||
computed from the "NumBytes" value multiplied by 8 minus the count of | computed from the "NumBytes" value multiplied by 8 minus the count of | |||
bits of that "Configuration Record" or "Frame" already read by the | bits of that "Configuration Record" or "Frame" already read by the | |||
bitstream parser. | bitstream parser. | |||
2.2.9.2. byte_aligned | 2.2.9.2. remaining_symbols_in_syntax | |||
"remaining_symbols_in_syntax( )" is true as long as the RangeCoder | ||||
has not consumed all the given input bytes. | ||||
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.3. get_bits | 2.2.9.4. get_bits | |||
"get_bits( i )" is the action to read the next "i" bits in the | "get_bits( i )" is the action to read the next "i" bits in the | |||
bitstream, from most significant bit to least significant bit, and to | bitstream, from most significant bit to least significant bit, and to | |||
return the corresponding value. The pointer is increased by "i". | return the corresponding value. The pointer is increased by "i". | |||
3. Sample Coding | 3. Sample Coding | |||
For each "Slice" (as described in Section 4.4) of a "Frame", the | For each "Slice" (as described in Section 4.4) of a "Frame", the | |||
"Planes", "Lines", and "Samples" are coded in an order determined by | "Planes", "Lines", and "Samples" are coded in an order determined by | |||
the "Color Space" (see Section 3.7). Each "Sample" is predicted by | the "Color Space" (see Section 3.7). Each "Sample" is predicted by | |||
skipping to change at page 12, line 22 ¶ | skipping to change at page 12, line 22 ¶ | |||
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: | |||
o For Y "Plane", "quant_table_set_index [ 0 ]" index is used | o For Y "Plane", "quant_table_set_index [ 0 ]" index is used | |||
o For Cb and Cr "Planes", "quant_table_set_index [ 1 ]" index is | o For Cb and Cr "Planes", "quant_table_set_index [ 1 ]" index is | |||
used | used | |||
o For Alpha "Plane", "quant_table_set_index [ (version <= 3 || | o 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 to 0), this index is kept for version <= 3 in order to keep | set 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 two color spaces: YCbCr and RGB. Both color spaces | FFV1 supports several color spaces. The count of allowed coded | |||
allow an optional Alpha "Plane" that can be used to code transparency | planes and the meaning of the extra "Plane" are determined by the | |||
data. | 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 bottom and for each "Line", each "Sample" is coded from left | top to bottom and for each "Line", each "Sample" is coded from left | |||
to right. In JPEG2000-RCT for each "Line" from top to bottom, each | to right. In JPEG2000-RCT for each "Line" from top to bottom, each | |||
"Plane" is coded and for each "Plane", each "Sample" is encoded from | "Plane" is coded and for each "Plane", each "Sample" is encoded from | |||
left to right. | left to right. | |||
3.7.1. YCbCr | 3.7.1. YCbCr | |||
In YCbCr color space, the Cb and Cr "Planes" are optional, but if | This color space allows 1 to 4 "Planes". | |||
used then MUST be used together. Omitting the Cb and Cr "Planes" | The Cb and Cr "Planes" are optional, but if used then MUST be used | |||
codes the frames in grayscale without color data. An FFV1 "Frame" | together. Omitting the Cb and Cr "Planes" codes the frames in | |||
using YCbCr MUST use one of the following arrangements: | grayscale without color data. | |||
An optional transparency "Plane" can be used to code transparency | ||||
data. | ||||
An FFV1 "Frame" using YCbCr MUST use one of the following | ||||
arrangements: | ||||
o Y | o Y | |||
o Y, Alpha | ||||
o Y, Transparency | ||||
o Y, Cb, Cr | o Y, Cb, Cr | |||
o Y, Cb, Cr, Alpha | o 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 then they MUST be coded after the Y "Plane". If an Alpha | used then they MUST be coded after the Y "Plane". If a transparency | |||
(transparency) "Plane" is used, then it MUST be coded last. | "Plane" is used, then it MUST be coded last. | |||
3.7.2. RGB | 3.7.2. RGB | |||
This color space allows 3 or 4 "Planes". | ||||
An optional transparency "Plane" can be used to code transparency | ||||
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 | |||
Exception for the JPEG2000-RCT conversion: if bits_per_raw_sample is | Exception for the JPEG2000-RCT conversion: if bits_per_raw_sample is | |||
between 9 and 15 inclusive and alpha_plane is 0, the following | between 9 and 15 inclusive and extra_plane is 0, the following | |||
formulae for reversible conversions between YCbCr and RGB MUST be | formulae for reversible conversions between YCbCr and RGB MUST be | |||
used instead of the ones above: | used instead of the ones above: | |||
Cb=g-b | Cb=g-b | |||
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 | |||
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 alpha_plane is 0, GBR "Planes" were used as BGR | inclusive and extra_plane is 0, GBR "Planes" were used as BGR | |||
"Planes" during both encoding and decoding. In the meanwhile, 16-bit | "Planes" 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. | |||
When FFV1 uses the JPEG2000-RCT, the horizontal "Lines" are | When FFV1 uses the JPEG2000-RCT, the horizontal "Lines" are | |||
interleaved to improve caching efficiency since it is most likely | interleaved to improve caching efficiency since it is most likely | |||
that the JPEG2000-RCT will immediately be converted to RGB during | that the JPEG2000-RCT will immediately be converted to RGB during | |||
decoding. The interleaved coding order is also Y, then Cb, then Cr, | decoding. The interleaved coding order is also Y, then Cb, then Cr, | |||
and then if used Alpha. | and then 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, could be comprised of the following structure: | high, could be comprised of 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] | | |||
skipping to change at page 15, line 12 ¶ | skipping to change at page 15, line 21 ¶ | |||
from H.264 as defined in [ISO.14496-10.2014] but due to the uncertain | from H.264 as defined in [ISO.14496-10.2014] but due to the uncertain | |||
patent/royalty situation, as well as its slightly worse performance, | patent/royalty situation, as well as its slightly worse performance, | |||
CABAC was replaced by a Range coder based on an algorithm defined by | CABAC was replaced by a Range coder based on an algorithm defined by | |||
G. Nigel and N. Martin in 1979 [range-coding]. | G. Nigel and N. Martin in 1979 [range-coding]. | |||
3.8.1.1. Range Binary Values | 3.8.1.1. Range Binary Values | |||
To encode binary digits efficiently a Range coder is used. "C_{i}" | 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. | 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 | "b_{i}" is the i-th Range coded binary value, "S_{0,i}" is the i-th | |||
initial state, which is 128. The length of the bytestream encoding n | initial state. The length of the bytestream encoding n binary | |||
binary symbols is "j_{n}" bytes. | symbols is "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 ) | |||
S_{i+1,C_{i}} = zero_state_{S_{i,C_{i}}} XOR | S_{i+1,C_{i}} = zero_state_{S_{i,C_{i}}} XOR | |||
l_i = L_i XOR | l_i = L_i XOR | |||
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}}} XOR | S_{i+1,C_{i}} = one_state_{S_{i,C_{i}}} XOR | |||
skipping to change at page 15, line 44 ¶ | skipping to change at page 16, line 4 ¶ | |||
t_{i} < 2^8 | t_{i} < 2^8 | |||
R_{i+1} = t_{i} XOR | R_{i+1} = t_{i} XOR | |||
L_{i+1} = l_{i} XOR | L_{i+1} = l_{i} XOR | |||
j_{i+1} = j_{i} <== | j_{i+1} = j_{i} <== | |||
t_{i} >= 2^8 | t_{i} >= 2^8 | |||
R_{0} = 65280 | R_{0} = 65280 | |||
L_{0} = 2^8 * B_{0} + B_{1} | L_{0} = 2^8 * B_{0} + B_{1} | |||
j_{0} = 2 | j_{0} = 2 | |||
3.8.1.1.1. Termination | ||||
The range coder can be used in 3 modes. | ||||
o In "Open mode" when decoding, every symbol the reader attempts to | ||||
read is available. In this mode arbitrary data can have been | ||||
appended without affecting the range coder output. This mode is | ||||
not used in FFV1. | ||||
o 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 | ||||
the range decoder. This is generally 1 byte shorter than the open | ||||
mode. | ||||
o 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 | ||||
coded bytestream by one byte. In "Sentinel mode", the end of the | ||||
range coded bytestream is a binary symbol with state 129, which | ||||
value SHALL be discarded. After reading this symbol, the range | ||||
decoder will have read one byte beyond the end of the range coded | ||||
bytestream. This way the byte position of the end can be | ||||
determined. Bytestreams written in "Sentinel mode" can be read in | ||||
"Closed mode" if the length can be determined, in this case the | ||||
last (sentinel) symbol will be read non-corrupted and be of value | ||||
0. | ||||
Above describes the range decoding, encoding is defined as any | ||||
process which produces a decodable bytestream. | ||||
There are 3 places where range coder termination is needed in FFV1. | ||||
First is in the "Configuration Record", in this case the size 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 Golomb | ||||
coded slices as "Sentinel mode". Third is the end of range 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 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 the | mantissa and sign. The exact contexts used are best described by the | |||
following code, followed by some comments. | following code, followed by some comments. | |||
pseudo-code | type | pseudo-code | type | |||
--------------------------------------------------------------|----- | --------------------------------------------------------------|----- | |||
void put_symbol(RangeCoder *c, uint8_t *state, int v, int \ | | void put_symbol(RangeCoder *c, uint8_t *state, int v, int \ | | |||
is_signed) { | | is_signed) { | | |||
int i; | | int i; | | |||
put_rac(c, state+0, !v); | | put_rac(c, state+0, !v); | | |||
if (v) { | | if (v) { | | |||
skipping to change at page 18, line 39 ¶ | skipping to change at page 19, line 39 ¶ | |||
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, | |||
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 | ||||
that the bitstream contains a multiple of 8 bits. | ||||
3.8.2.1. Signed Golomb Rice Codes | ||||
This coding mode uses Golomb Rice codes. The VLC is split into 2 | This coding mode uses Golomb Rice codes. The VLC is split into 2 | |||
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. The end of the bitstream of the "Frame" is filled with | ESC case. | |||
0-bits until that the bitstream contains a multiple of 8 bits. | ||||
pseudo-code | type | ||||
--------------------------------------------------------------|----- | ||||
int get_ur_golomb(k) { | | ||||
for (prefix = 0; prefix < 12; prefix++) { | | ||||
if ( get_bits(1) ) | | ||||
return get_bits(k) + (prefix << k) | | ||||
} | | ||||
return get_bits(bits) + 11 | | ||||
} | | ||||
| | ||||
int get_sr_golomb(k) { | | ||||
v = get_ur_golomb(k); | | ||||
if (v & 1) return - (v >> 1) - 1; | | ||||
else return (v >> 1); | | ||||
} | ||||
3.8.2.1.1. Prefix | ||||
3.8.2.1. Prefix | ||||
+----------------+-------+ | +----------------+-------+ | |||
| bits | value | | | bits | value | | |||
+----------------+-------+ | +----------------+-------+ | |||
| 1 | 0 | | | 1 | 0 | | |||
| 01 | 1 | | | 01 | 1 | | |||
| ... | ... | | | ... | ... | | |||
| 0000 0000 0001 | 11 | | | 0000 0000 0001 | 11 | | |||
| 0000 0000 0000 | ESC | | | 0000 0000 0000 | ESC | | |||
+----------------+-------+ | +----------------+-------+ | |||
3.8.2.2. Suffix | 3.8.2.1.2. Suffix | |||
+-------+-----------------------------------------------------------+ | +-------+-----------------------------------------------------------+ | |||
| non | the k least significant bits MSB first | | | non | the k least significant bits MSB first | | |||
| ESC | | | | ESC | | | |||
| ESC | the value - 11, in MSB first order, ESC may only be used | | | ESC | the value - 11, in MSB first order, ESC may only be used | | |||
| | if the value cannot be coded as non ESC | | | | if the value cannot be coded as non ESC | | |||
+-------+-----------------------------------------------------------+ | +-------+-----------------------------------------------------------+ | |||
3.8.2.3. Examples | 3.8.2.1.3. Examples | |||
+-----+-------------------------+-------+ | +-----+-------------------------+-------+ | |||
| 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 | | |||
+-----+-------------------------+-------+ | +-----+-------------------------+-------+ | |||
3.8.2.4. 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 level is identical to the predicted one. | |||
The run and the first different level are coded. | The run and the first different level are coded. | |||
3.8.2.5. Run Length Coding | 3.8.2.2.1. Run Length Coding | |||
The run value is encoded in 2 parts, the prefix part stores the more | The run value is encoded in 2 parts, the prefix part stores the more | |||
significant part of the run as well as adjusting the run_index that | significant part of the run as well as adjusting the run_index that | |||
determines the number of bits in the less significant part of the | determines the number of bits in the less significant part of the | |||
run. The 2nd part of the value stores the less significant part of | run. The 2nd part of the value stores the less significant part of | |||
the run as it is. The run_index is reset for each "Plane" and slice | the run as it is. The run_index is reset for each "Plane" and slice | |||
to 0. | to 0. | |||
pseudo-code | type | pseudo-code | type | |||
--------------------------------------------------------------|----- | --------------------------------------------------------------|----- | |||
skipping to change at page 20, line 34 ¶ | skipping to change at page 22, line 34 ¶ | |||
else | | else | | |||
run_count = 0; | | run_count = 0; | | |||
if (run_index) | | if (run_index) | | |||
run_index--; | | run_index--; | | |||
run_mode = 2; | | run_mode = 2; | | |||
} | | } | | |||
} | | } | | |||
The log2_run function is also used within [ISO.14495-1.1999]. | The log2_run function is also used within [ISO.14495-1.1999]. | |||
3.8.2.6. Level Coding | 3.8.2.2.2. Level Coding | |||
Level coding is identical to the normal difference coding with the | Level coding is identical to the normal difference coding with the | |||
exception that the 0 value is removed as it cannot occur: | exception that the 0 value is removed as it cannot occur: | |||
if (diff>0) diff--; | diff = get_vlc_symbol(context_state); | |||
encode(diff); | if (diff >= 0) | |||
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.3. Scalar Mode | ||||
Each difference is coded with the per context mean prediction removed | ||||
and a per context value for k. | ||||
get_vlc_symbol(state) { | ||||
i = state->count; | ||||
k = 0; | ||||
while (i < state->error_sum) { | ||||
k++; | ||||
i += i; | ||||
} | ||||
v = get_sr_golomb(k); | ||||
if (2 * state->drift < -state->count) | ||||
v = - 1 - v; | ||||
ret = sign_extend(v + state->bias, bits); | ||||
state->error_sum += abs(v); | ||||
state->drift += v; | ||||
if (state->count == 128) { | ||||
state->count >>= 1; | ||||
state->drift >>= 1; | ||||
state->error_sum >>= 1; | ||||
} | ||||
state->count++; | ||||
if (state->drift <= -state->count) { | ||||
state->bias = max(state->bias - 1, -128); | ||||
state->drift = max(state->drift + state->count, | ||||
-state->count + 1); | ||||
} else if (state->drift > 0) { | ||||
state->bias = min(state->bias + 1, 127); | ||||
state->drift = min(state->drift - state->count, 0); | ||||
} | ||||
return ret; | ||||
} | ||||
3.8.2.4. Initial Values for the VLC context state | ||||
At keyframes all coder state variables are set to their initial | ||||
state. | ||||
drift = 0; | ||||
error_sum = 4; | ||||
bias = 0; | ||||
count = 1; | ||||
4. Bitstream | 4. Bitstream | |||
An FFV1 bitstream is composed of a series of 1 or more "Frames" and | An FFV1 bitstream is composed of a series of 1 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 to explain the | |||
structure of each FFV1 bitstream component, as described in | structure of each FFV1 bitstream component, as described in | |||
Section 2.2.1. The following table lists symbols used to annotate | Section 2.2.1. The following table lists symbols used to annotate | |||
that pseudo-code in order to define the storage of the data | that pseudo-code in order to define the storage of the data | |||
referenced in that line of pseudo-code. | referenced in that line of pseudo-code. | |||
skipping to change at page 22, line 21 ¶ | skipping to change at page 25, line 21 ¶ | |||
coder_type | ur | coder_type | ur | |||
if (coder_type > 1) | | if (coder_type > 1) | | |||
for (i = 1; i < 256; i++) | | for (i = 1; i < 256; i++) | | |||
state_transition_delta[ i ] | sr | state_transition_delta[ i ] | sr | |||
colorspace_type | ur | colorspace_type | ur | |||
if (version >= 1) | | if (version >= 1) | | |||
bits_per_raw_sample | ur | bits_per_raw_sample | ur | |||
chroma_planes | br | chroma_planes | br | |||
log2_h_chroma_subsample | ur | log2_h_chroma_subsample | ur | |||
log2_v_chroma_subsample | ur | log2_v_chroma_subsample | ur | |||
alpha_plane | br | extra_plane | br | |||
if (version >= 3) { | | if (version >= 3) { | | |||
num_h_slices - 1 | ur | num_h_slices - 1 | ur | |||
num_v_slices - 1 | ur | num_v_slices - 1 | ur | |||
quant_table_set_count | ur | quant_table_set_count | ur | |||
} | | } | | |||
for( i = 0; i < quant_table_set_count; i++ ) | | for( i = 0; i < quant_table_set_count; i++ ) | | |||
QuantizationTableSet( i ) | | QuantizationTableSet( i ) | | |||
if (version >= 3) { | | if (version >= 3) { | | |||
for( i = 0; i < quant_table_set_count; i++ ) { | | for( i = 0; i < quant_table_set_count; i++ ) { | | |||
states_coded | br | states_coded | br | |||
skipping to change at page 22, line 45 ¶ | skipping to change at page 25, line 45 ¶ | |||
initial_state_delta[ i ][ j ][ k ] | sr | initial_state_delta[ i ][ j ][ k ] | sr | |||
} | | } | | |||
ec | ur | ec | ur | |||
intra | ur | intra | ur | |||
} | | } | | |||
} | | } | | |||
4.1.1. version | 4.1.1. version | |||
"version" specifies the version of the FFV1 bitstream. | "version" specifies the version of the FFV1 bitstream. | |||
Each version is incompatible with others versions: decoders SHOULD | Each version is incompatible with other versions: decoders SHOULD | |||
reject a file due to unknown version. | reject a file due to an unknown version. | |||
Decoders SHOULD reject a file with version <= 1 && | Decoders SHOULD reject a file with version <= 1 && | |||
ConfigurationRecordIsPresent == 1. | ConfigurationRecordIsPresent == 1. | |||
Decoders SHOULD reject a file with version >= 3 && | Decoders SHOULD reject a file with version >= 3 && | |||
ConfigurationRecordIsPresent == 0. | ConfigurationRecordIsPresent == 0. | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| value | version | | | value | version | | |||
+-------+-------------------------+ | +-------+-------------------------+ | |||
| 0 | FFV1 version 0 | | | 0 | FFV1 version 0 | | |||
| 1 | FFV1 version 1 | | | 1 | FFV1 version 1 | | |||
skipping to change at page 24, line 15 ¶ | skipping to change at page 27, line 15 ¶ | |||
4.1.4. state_transition_delta | 4.1.4. state_transition_delta | |||
"state_transition_delta" specifies the Range coder custom state | "state_transition_delta" specifies the Range coder custom state | |||
transition table. | transition table. | |||
If state_transition_delta is not present in the FFV1 bitstream, all | If state_transition_delta is not present in the FFV1 bitstream, all | |||
Range coder custom state transition table elements are assumed to be | Range coder custom state transition table elements are assumed to be | |||
0. | 0. | |||
4.1.5. colorspace_type | 4.1.5. colorspace_type | |||
"colorspace_type" specifies the color space losslessly encoded, the | "colorspace_type" specifies the color space encoded, the pixel | |||
Pixel transformation used by the encoder, as well as interleave | transformation used by the encoder, the extra plane content, as well | |||
method. | as interleave method. | |||
+-------+---------------------+------------------+------------------+ | +-------+-----------+----------------+---------------+--------------+ | |||
| value | color space | transformation | interleave | | | value | color | pixel | extra plane | interleave | | |||
| | losslessly encoded | | method | | | | space | transformation | content | method | | |||
+-------+---------------------+------------------+------------------+ | | | encoded | | | | | |||
| 0 | YCbCr | No Pixel | "Plane" then | | +-------+-----------+----------------+---------------+--------------+ | |||
| | | transformation | "Line" | | | 0 | YCbCr | None | Transparency | "Plane" then | | |||
| 1 | RGB | JPEG2000-RCT | "Line" then | | | | | | | "Line" | | |||
| | | | "Plane" | | | 1 | RGB | JPEG2000-RCT | Transparency | "Line" then | | |||
| Other | reserved for future | reserved for | reserved for | | | | | | | "Plane" | | |||
| | use | future use | future use | | | Other | reserved | reserved for | reserved for | reserved for | | |||
+-------+---------------------+------------------+------------------+ | | | for | future use | future use | future use | | |||
| | future | | | | | ||||
| | use | | | | | ||||
+-------+-----------+----------------+---------------+--------------+ | ||||
Restrictions: | Restrictions: | |||
If "colorspace_type" is 1, then "chroma_planes" MUST be 1, | If "colorspace_type" is 1, then "chroma_planes" MUST be 1, | |||
"log2_h_chroma_subsample" MUST be 0, and "log2_v_chroma_subsample" | "log2_h_chroma_subsample" MUST be 0, and "log2_v_chroma_subsample" | |||
MUST be 0. | MUST be 0. | |||
4.1.6. chroma_planes | 4.1.6. chroma_planes | |||
"chroma_planes" indicates if chroma (color) "Planes" are present. | "chroma_planes" indicates if chroma (color) "Planes" are present. | |||
skipping to change at page 25, line 27 ¶ | skipping to change at page 28, line 32 ¶ | |||
"log2_h_chroma_subsample" indicates the subsample factor, stored in | "log2_h_chroma_subsample" indicates the subsample factor, stored in | |||
powers to which the number 2 must be raised, between luma and chroma | powers to which the number 2 must be raised, between luma and chroma | |||
width ("chroma_width = 2^(-log2_h_chroma_subsample) * luma_width"). | width ("chroma_width = 2^(-log2_h_chroma_subsample) * luma_width"). | |||
4.1.9. log2_v_chroma_subsample | 4.1.9. log2_v_chroma_subsample | |||
"log2_v_chroma_subsample" indicates the subsample factor, stored in | "log2_v_chroma_subsample" indicates the subsample factor, stored in | |||
powers to which the number 2 must be raised, between luma and chroma | powers to which the number 2 must be raised, between luma and chroma | |||
height ("chroma_height=2^(-log2_v_chroma_subsample) * luma_height"). | height ("chroma_height=2^(-log2_v_chroma_subsample) * luma_height"). | |||
4.1.10. alpha_plane | 4.1.10. extra_plane | |||
"alpha_plane" indicates if a transparency "Plane" is present. | "extra_plane" indicates if an extra "Plane" is present. | |||
+-------+-------------------------------------+ | +-------+------------------------------+ | |||
| value | presence | | | value | presence | | |||
+-------+-------------------------------------+ | +-------+------------------------------+ | |||
| 0 | transparency "Plane" is not present | | | 0 | extra "Plane" is not present | | |||
| 1 | transparency "Plane" is present | | | 1 | extra "Plane" is present | | |||
+-------+-------------------------------------+ | +-------+------------------------------+ | |||
4.1.11. num_h_slices | 4.1.11. num_h_slices | |||
"num_h_slices" indicates the number of horizontal elements of the | "num_h_slices" indicates the number of horizontal elements of the | |||
slice raster. | slice raster. | |||
Inferred to be 1 if not present. | Inferred to be 1 if not present. | |||
4.1.12. num_v_slices | 4.1.12. num_v_slices | |||
"num_v_slices" indicates the number of vertical elements of the slice | "num_v_slices" indicates the number of vertical elements of the slice | |||
skipping to change at page 27, line 22 ¶ | skipping to change at page 30, line 27 ¶ | |||
+-------+-----------------------------------------------------------+ | +-------+-----------------------------------------------------------+ | |||
4.2. Configuration Record | 4.2. Configuration Record | |||
In the case of a FFV1 bitstream with "version >= 3", a "Configuration | In the case of a FFV1 bitstream with "version >= 3", a "Configuration | |||
Record" is stored in the underlying "Container", at the track header | Record" is stored in the underlying "Container", at the track header | |||
level. It contains the "Parameters" used for all instances of | level. It contains the "Parameters" used for all instances of | |||
"Frame". The size of the "Configuration Record", "NumBytes", is | "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_bits_in_bitstream( NumBytes ) > 32 ) | | while( remaining_symbols_in_syntax( NumBytes - 4 ) ) | | |||
reserved_for_future_use | u(1) | reserved_for_future_use | br/ur/sr | |||
configuration_record_crc_parity | u(32) | configuration_record_crc_parity | u(32) | |||
} | | } | | |||
4.2.1. reserved_for_future_use | 4.2.1. reserved_for_future_use | |||
"reserved_for_future_use" has semantics that are reserved for future | "reserved_for_future_use" has semantics that are reserved for future | |||
use. | use. | |||
Encoders conforming to this version of this specification SHALL NOT | Encoders conforming to this version of this specification SHALL NOT | |||
write this value. | write this value. | |||
Decoders conforming to this version of this specification SHALL | Decoders conforming to this version of this specification SHALL | |||
ignore its value. | ignore its value. | |||
skipping to change at page 31, line 46 ¶ | skipping to change at page 34, line 46 ¶ | |||
4.5.4. slice_height | 4.5.4. slice_height | |||
"slice_height" indicates the height on the slice raster formed by | "slice_height" indicates the height on the slice raster formed by | |||
num_v_slices. | num_v_slices. | |||
Inferred to be 1 if not present. | Inferred to be 1 if not present. | |||
4.5.5. quant_table_set_index_count | 4.5.5. quant_table_set_index_count | |||
"quant_table_set_index_count" is defined as "1 + ( ( chroma_planes || | "quant_table_set_index_count" is defined as "1 + ( ( chroma_planes || | |||
version \<= 3 ) ? 1 : 0 ) + ( alpha_plane ? 1 : 0 )". | version \<= 3 ) ? 1 : 0 ) + ( extra_plane ? 1 : 0 )". | |||
4.5.6. quant_table_set_index | 4.5.6. quant_table_set_index | |||
"quant_table_set_index" indicates the Quantization Table Set index to | "quant_table_set_index" indicates the Quantization Table Set index to | |||
select the Quantization Table Set and the initial states for the | select the Quantization Table Set and the initial states for the | |||
slice. | slice. | |||
Inferred to be 0 if not present. | Inferred to be 0 if not present. | |||
4.5.7. picture_structure | 4.5.7. picture_structure | |||
skipping to change at page 33, line 22 ¶ | skipping to change at page 36, line 22 ¶ | |||
} else if (colorspace_type == 1) { | | } else if (colorspace_type == 1) { | | |||
for( y = 0; y < slice_pixel_height; y++ ) | | for( y = 0; y < slice_pixel_height; y++ ) | | |||
for( p = 0; p < primary_color_count; p++ ) | | for( p = 0; p < primary_color_count; p++ ) | | |||
Line( p, y ) | | Line( p, y ) | | |||
} | | } | | |||
} | | } | | |||
4.6.1. primary_color_count | 4.6.1. primary_color_count | |||
"primary_color_count" is defined as "1 + ( chroma_planes ? 2 : 0 ) + | "primary_color_count" is defined as "1 + ( chroma_planes ? 2 : 0 ) + | |||
( alpha_plane ? 1 : 0 )". | ( extra_plane ? 1 : 0 )". | |||
4.6.2. plane_pixel_height | 4.6.2. plane_pixel_height | |||
"plane_pixel_height[ p ]" is the height in pixels of plane p of the | "plane_pixel_height[ p ]" is the height in pixels of plane p of the | |||
slice. | slice. | |||
"plane_pixel_height[ 0 ]" and "plane_pixel_height[ 1 + ( | "plane_pixel_height[ 0 ]" and "plane_pixel_height[ 1 + ( | |||
chroma_planes ? 2 : 0 ) ]" value is "slice_pixel_height". | chroma_planes ? 2 : 0 ) ]" value is "slice_pixel_height". | |||
If "chroma_planes" is set to 1, "plane_pixel_height[ 1 ]" and | If "chroma_planes" is set to 1, "plane_pixel_height[ 1 ]" and | |||
"plane_pixel_height[ 2 ]" value is "ceil(slice_pixel_height / | "plane_pixel_height[ 2 ]" value is "ceil(slice_pixel_height / | |||
log2_v_chroma_subsample)". | log2_v_chroma_subsample)". | |||
skipping to change at page 37, line 46 ¶ | skipping to change at page 40, line 46 ¶ | |||
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. Although problems in encoders are typically rarer, the same | decode. Although problems in encoders are typically rarer, the same | |||
applies to the encoder. Malicious video streams must not cause the | applies to the encoder. Malicious video streams must not cause the | |||
encoder to misbehave because this would allow an attacker to attack | encoder to misbehave because this would allow an attacker to attack | |||
transcoding gateways. A frequent security problem in image and video | transcoding gateways. A frequent security problem in image and video | |||
codecs is also to not check for integer overflows in "Pixel" count | codecs is also to not check for integer overflows in "Pixel" count | |||
computations, that is to allocate width * height without considering | computations, that is to allocate width * height without considering | |||
that the multiplication result may have overflowed the arithmetic | that the multiplication result may have overflowed the arithmetic | |||
types range. | types range. The range coder could, if implemented naively, read one | |||
byte over the end. The implementation must ensure that no read | ||||
outside allocated and initialized memory occurs. | ||||
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: | |||
o Sending the decoder valid packets generated by the reference | o Sending the decoder valid packets generated by the reference | |||
encoder and verifying that the decoder's output matches the | encoder and verifying that the decoder's output matches the | |||
skipping to change at page 39, line 15 ¶ | skipping to change at page 42, line 15 ¶ | |||
bits_per_raw_sample: The version of the FFV1 encoding as defined by | bits_per_raw_sample: The version of the FFV1 encoding as defined by | |||
Section 4.1.7. | Section 4.1.7. | |||
max-slices: The value of max-slices is an integer indicating the | max-slices: The value of max-slices is an integer indicating the | |||
maximum count of slices with a frames of the FFV1 encoding. | maximum count of slices with a frames of the FFV1 encoding. | |||
Encoding considerations: | Encoding considerations: | |||
This media type is defined for encapsulation in several audiovisual | This media type is defined for encapsulation in several audiovisual | |||
container formats and contains binary data; see Section 4.2.3. This | container formats and contains binary data; see Section 4.2.3. This | |||
media type is framed binary data Section 4.8 of [RFC4288]. | media type is framed binary data Section 4.8 of [RFC6838]. | |||
Security considerations: | Security considerations: | |||
See Section 6 of this document. | See Section 6 of this document. | |||
Interoperability considerations: None. | Interoperability considerations: None. | |||
Published specification: | Published specification: | |||
[I-D.ietf-cellar-ffv1] and RFC XXXX. | [I-D.ietf-cellar-ffv1] and RFC XXXX. | |||
skipping to change at page 40, line 44 ¶ | skipping to change at page 43, line 44 ¶ | |||
See <https://github.com/FFmpeg/FFV1/commits/master> | See <https://github.com/FFmpeg/FFV1/commits/master> | |||
11. References | 11. References | |||
11.1. Normative References | 11.1. Normative References | |||
[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", draft-ietf-cellar- | Coding Format Version 0, 1, and 3", draft-ietf-cellar- | |||
ffv1-05 (work in progress), September 2018. | ffv1-06 (work in progress), October 2018. | |||
[ISO.15444-1.2016] | [ISO.15444-1.2016] | |||
International Organization for Standardization, | International Organization for Standardization, | |||
"Information technology -- JPEG 2000 image coding system: | "Information technology -- JPEG 2000 image coding system: | |||
Core coding system", October 2016. | Core coding system", October 2016. | |||
[ISO.9899.1990] | [ISO.9899.1990] | |||
International Organization for Standardization, | International Organization for Standardization, | |||
"Programming languages - C", ISO Standard 9899, 1990. | "Programming languages - C", ISO Standard 9899, 1990. | |||
[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>. | |||
[RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and | ||||
Registration Procedures", RFC 4288, DOI 10.17487/RFC4288, | ||||
December 2005, <https://www.rfc-editor.org/info/rfc4288>. | ||||
[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>. | |||
[RFC4855] Casner, S., "Media Type Registration of RTP Payload | [RFC4855] Casner, S., "Media Type Registration of RTP Payload | |||
Formats", RFC 4855, DOI 10.17487/RFC4855, February 2007, | Formats", RFC 4855, DOI 10.17487/RFC4855, February 2007, | |||
<https://www.rfc-editor.org/info/rfc4855>. | <https://www.rfc-editor.org/info/rfc4855>. | |||
[RFC6716] Valin, JM., Vos, K., and T. Terriberry, "Definition of the | [RFC6716] Valin, JM., Vos, K., and T. Terriberry, "Definition of the | |||
End of changes. 56 change blocks. | ||||
156 lines changed or deleted | 287 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |