[FFmpeg-devel] [PATCH] FFV1 specification: Merge of FrameHeader01() and GlobalHeader()

Jerome Martinez jerome at mediaarea.net
Wed May 20 09:24:37 CEST 2015


Le 20/05/2015 03:44, Michael Niedermayer a écrit :
> [...]
>
> If you want to allow multiple w/h/colorspace, its probably better
> to allow multiple global headers as in h264/h265 and put a index
> in the frame header to choose one of the parameter sets
> some of the tables are also large IIRC initial_state_delta is.
> it makes not much sense for this to be anywhere but global

Proposals for the next version of FFV1 is planned ;-).
But for the moment, I focus on having a specification of the existing 
versions.

> maybe none of these headers should have been called frame header
> i dont know ...

I thought it would have been better to separates subjects (on one side 
the merge, on another side the renaming).

Anyway, new patch attached:
- FrameHeader() renamed to Parameters()
- additional line in initial_state_delta[ i ][ j ][ k ] description removed.

https://github.com/MediaArea/FFV1/tree/HeaderMerge is also up to date.
LyX Document
-------------- next part --------------
>From 5580818c24c5de2a721d4bce505a6cfb9f9833f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Martinez?= <jerome at mediaarea.net>
Date: Wed, 20 May 2015 09:11:27 +0200
Subject: [PATCH] Merge of FrameHeader01() and GlobalHeader()

FrameHeader01() and GlobalHeader() have a lot of common fields
and having a common function + default value for fields unused
in previous versions is less complex and more coherent than repeating
the common part.
They are merged and renamed to Parameters().
---
 ffv1.lyx | 528 ++++++++++++++++++++++++---------------------------------------
 1 file changed, 201 insertions(+), 327 deletions(-)

diff --git a/ffv1.lyx b/ffv1.lyx
index 01f7308..d50eba7 100644
--- a/ffv1.lyx
+++ b/ffv1.lyx
@@ -1860,7 +1860,7 @@ alternative state transition table
 The alternative state transition table has been build using iterative minimizati
 on of frame sizes and generally performs better than the default.
  To use it, the coder_type has to be set to 2 and the difference to the
- default has to be stored in the header.
+ default has to be stored in the parameters.
  The reference implemenation of FFV1 in FFmpeg uses this table by default
  at the time of this writing when Range coding is used.
 \end_layout
@@ -2557,6 +2557,10 @@ In the case of a bitstream with version >= 2, a configuration record is
 \begin_inset Newline newline
 \end_inset
 
+It contains the parameters used for all frames.
+\begin_inset Newline newline
+\end_inset
+
 The size of the configuration record, NumBytes, is supplied by the underlying
  container.
 \end_layout
@@ -2642,7 +2646,7 @@ ConfigurationRecordIsPresent = 1
 \begin_inset space ~
 \end_inset
 
-GlobalHeader( )
+Parameters( )
 \end_layout
 
 \end_inset
@@ -3172,7 +3176,7 @@ if( keyframe && !ConfigurationRecordIsPresent)
 \begin_inset space ~
 \end_inset
 
-FrameHeader01( )
+Parameters( )
 \end_layout
 
 \end_inset
@@ -5155,16 +5159,12 @@ reserved for future use
 \end_layout
 
 \begin_layout Subsection
-Header
-\end_layout
-
-\begin_layout Subsubsection
-Version 0 and 1
+Parameters
 \end_layout
 
 \begin_layout Standard
 \begin_inset Tabular
-<lyxtabular version="3" rows="15" columns="2">
+<lyxtabular version="3" rows="34" columns="2">
 <features rotate="0" tabularvalignment="middle">
 <column alignment="left" valignment="top">
 <column alignment="center" valignment="top">
@@ -5173,7 +5173,7 @@ Version 0 and 1
 \begin_inset Text
 
 \begin_layout Plain Layout
-FrameHeader01( ) {
+Parameters( ) {
 \end_layout
 
 \end_inset
@@ -5224,6 +5224,92 @@ ur
 </cell>
 </row>
 <row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+if( version > 2 )
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+micro_version
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+ur
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
 <cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
@@ -5482,7 +5568,7 @@ if( version > 0 )
 </cell>
 </row>
 <row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -5692,7 +5778,7 @@ br
 \begin_inset space ~
 \end_inset
 
-QuantizationTable( 0 )
+if ( version > 1 ) {
 \end_layout
 
 \end_inset
@@ -5708,52 +5794,42 @@ QuantizationTable( 0 )
 </cell>
 </row>
 <row>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-}
-\end_layout
+\begin_inset space ~
+\end_inset
+
 
+\begin_inset space ~
 \end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
 
-\end_layout
+\begin_inset space ~
+\end_inset
 
+
+\begin_inset space ~
 \end_inset
-</cell>
-</row>
-</lyxtabular>
 
+
+\begin_inset space ~
 \end_inset
 
 
-\end_layout
+\begin_inset space ~
+\end_inset
 
-\begin_layout Subsubsection
-Version 3
-\end_layout
 
-\begin_layout Standard
-Version 2 and later files use a global header and a per frame header.
-\end_layout
+\begin_inset space ~
+\end_inset
 
-\begin_layout Standard
-\begin_inset Tabular
-<lyxtabular version="3" rows="28" columns="2">
-<features rotate="0" tabularvalignment="middle">
-<column alignment="left" valignment="top">
-<column alignment="center" valignment="top">
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
-GlobalHeader( ) {
+\begin_inset space ~
+\end_inset
+
+num_h_slices - 1
 \end_layout
 
 \end_inset
@@ -5762,7 +5838,7 @@ GlobalHeader( ) {
 \begin_inset Text
 
 \begin_layout Plain Layout
-type
+ur
 \end_layout
 
 \end_inset
@@ -5788,7 +5864,23 @@ type
 \begin_inset space ~
 \end_inset
 
-version
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset space ~
+\end_inset
+
+num_v_slices - 1
 \end_layout
 
 \end_inset
@@ -5823,26 +5915,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-micro_version
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-ur
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -5858,7 +5931,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-coder_type
+quant_table_count
 \end_layout
 
 \end_inset
@@ -5893,7 +5966,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-if( coder_type > 1 )
+}
 \end_layout
 
 \end_inset
@@ -5928,23 +6001,7 @@ if( coder_type > 1 )
 \begin_inset space ~
 \end_inset
 
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-for( i = 1; i < 256; i++ )
+for( i = 0; i < quant_table_count; i++ )
 \end_layout
 
 \end_inset
@@ -5995,23 +6052,7 @@ for( i = 1; i < 256; i++ )
 \begin_inset space ~
 \end_inset
 
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-state_transition_delta[ i ]
+QuantizationTable( i )
 \end_layout
 
 \end_inset
@@ -6020,14 +6061,14 @@ state_transition_delta[ i ]
 \begin_inset Text
 
 \begin_layout Plain Layout
-sr
+
 \end_layout
 
 \end_inset
 </cell>
 </row>
 <row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -6046,7 +6087,7 @@ sr
 \begin_inset space ~
 \end_inset
 
-colorspace_type
+if ( version > 1 ) {
 \end_layout
 
 \end_inset
@@ -6055,14 +6096,14 @@ colorspace_type
 \begin_inset Text
 
 \begin_layout Plain Layout
-ur
+
 \end_layout
 
 \end_inset
 </cell>
 </row>
 <row>
-<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -6081,26 +6122,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-bits_per_raw_sample
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-ur
-\end_layout
 
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6116,7 +6138,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-chroma_planes
+for( i = 0; i < quant_table_count; i++ ) {
 \end_layout
 
 \end_inset
@@ -6125,7 +6147,7 @@ chroma_planes
 \begin_inset Text
 
 \begin_layout Plain Layout
-br
+
 \end_layout
 
 \end_inset
@@ -6151,26 +6173,7 @@ br
 \begin_inset space ~
 \end_inset
 
-log2( h_chroma_subsample )
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-ur
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6186,26 +6189,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-log2( v_chroma_subsample )
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-ur
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6221,7 +6205,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-alpha_plane
+states_coded
 \end_layout
 
 \end_inset
@@ -6256,26 +6240,7 @@ br
 \begin_inset space ~
 \end_inset
 
-num_h_slices - 1
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-ur
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6291,26 +6256,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-num_v_slices - 1
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
-ur
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6326,7 +6272,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-quant_table_count
+if( states_coded )
 \end_layout
 
 \end_inset
@@ -6335,7 +6281,7 @@ quant_table_count
 \begin_inset Text
 
 \begin_layout Plain Layout
-ur
+
 \end_layout
 
 \end_inset
@@ -6361,26 +6307,19 @@ ur
 \begin_inset space ~
 \end_inset
 
-for( i = 0; i < quant_table_count; i++ )
-\end_layout
 
+\begin_inset space ~
 \end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
 
-\end_layout
+\begin_inset space ~
+\end_inset
 
+
+\begin_inset space ~
 \end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
+
 \begin_inset space ~
 \end_inset
 
@@ -6412,7 +6351,11 @@ for( i = 0; i < quant_table_count; i++ )
 \begin_inset space ~
 \end_inset
 
-QuantizationTable( i )
+
+\begin_inset space ~
+\end_inset
+
+for( j = 0; j < context_count[ i ]; j++ )
 \end_layout
 
 \end_inset
@@ -6447,26 +6390,7 @@ QuantizationTable( i )
 \begin_inset space ~
 \end_inset
 
-for( i = 0; i < quant_table_count; i++ ) {
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
 
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6498,26 +6422,7 @@ for( i = 0; i < quant_table_count; i++ ) {
 \begin_inset space ~
 \end_inset
 
-states_coded
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-br
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6549,7 +6454,7 @@ br
 \begin_inset space ~
 \end_inset
 
-if( states_coded )
+for( k = 0; k < CONTEXT_SIZE; k++ )
 \end_layout
 
 \end_inset
@@ -6616,41 +6521,6 @@ if( states_coded )
 \begin_inset space ~
 \end_inset
 
-for( j = 0; j < context_count[ i ]; j++ )
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
-
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
-\end_inset
-
 
 \begin_inset space ~
 \end_inset
@@ -6699,7 +6569,7 @@ for( j = 0; j < context_count[ i ]; j++ )
 \begin_inset space ~
 \end_inset
 
-for( k = 0; k < CONTEXT_SIZE; k++ )
+initial_state_delta[ i ][ j ][ k ]
 \end_layout
 
 \end_inset
@@ -6708,7 +6578,7 @@ for( k = 0; k < CONTEXT_SIZE; k++ )
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+sr
 \end_layout
 
 \end_inset
@@ -6750,23 +6620,26 @@ for( k = 0; k < CONTEXT_SIZE; k++ )
 \begin_inset space ~
 \end_inset
 
+}
+\end_layout
 
-\begin_inset space ~
-\end_inset
-
-
-\begin_inset space ~
 \end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\begin_layout Plain Layout
 
-\begin_inset space ~
-\end_inset
-
+\end_layout
 
-\begin_inset space ~
 \end_inset
+</cell>
+</row>
+<row>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-
+\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6798,7 +6671,7 @@ for( k = 0; k < CONTEXT_SIZE; k++ )
 \begin_inset space ~
 \end_inset
 
-initial_state_delta[ i ][ j ][ k ]
+ec
 \end_layout
 
 \end_inset
@@ -6807,7 +6680,7 @@ initial_state_delta[ i ][ j ][ k ]
 \begin_inset Text
 
 \begin_layout Plain Layout
-sr
+ur
 \end_layout
 
 \end_inset
@@ -6833,26 +6706,7 @@ sr
 \begin_inset space ~
 \end_inset
 
-}
-\end_layout
-
-\end_inset
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
-
-\end_layout
 
-\end_inset
-</cell>
-</row>
-<row>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\begin_layout Plain Layout
 \begin_inset space ~
 \end_inset
 
@@ -6868,7 +6722,7 @@ sr
 \begin_inset space ~
 \end_inset
 
-ec
+intra
 \end_layout
 
 \end_inset
@@ -6903,7 +6757,7 @@ ur
 \begin_inset space ~
 \end_inset
 
-intra
+}
 \end_layout
 
 \end_inset
@@ -6912,7 +6766,7 @@ intra
 \begin_inset Text
 
 \begin_layout Plain Layout
-ur
+
 \end_layout
 
 \end_inset
@@ -7838,14 +7692,26 @@ transparency plane is present
 
 \begin_layout Description
 num_h_slices indicates the number of horizontal elements of the slice raster.
+\begin_inset Newline newline
+\end_inset
+
+Inferred to be 1 if not present.
 \end_layout
 
 \begin_layout Description
 num_v_slices indicates the number of vertical elements of the slice raster.
+\begin_inset Newline newline
+\end_inset
+
+Inferred to be 1 if not present.
 \end_layout
 
 \begin_layout Description
 quant_table_count indicates the number of quantization table sets.
+\begin_inset Newline newline
+\end_inset
+
+Inferred to be 1 if not present.
 \end_layout
 
 \begin_layout Description
@@ -7854,6 +7720,10 @@ states_coded indicates if the respective quantization table set has the
 \begin_inset Newline newline
 \end_inset
 
+Inferred to be 0 if not present.
+\begin_inset Newline newline
+\end_inset
+
 
 \begin_inset Tabular
 <lyxtabular version="3" rows="3" columns="2">
@@ -8049,6 +7919,10 @@ intra indicates the relationship between frames.
 \begin_inset Newline newline
 \end_inset
 
+Inferred to be 0 if not present.
+\begin_inset Newline newline
+\end_inset
+
 
 \begin_inset Tabular
 <lyxtabular version="3" rows="4" columns="2">
-- 
1.9.5.msysgit.1



More information about the ffmpeg-devel mailing list