FFmpeg
ffv1.h
Go to the documentation of this file.
1 /*
2  * FFV1 codec for libavcodec
3  *
4  * Copyright (c) 2003-2012 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef AVCODEC_FFV1_H
24 #define AVCODEC_FFV1_H
25 
26 /**
27  * @file
28  * FF Video Codec 1 (a lossless codec)
29  */
30 
31 #include "libavutil/attributes.h"
32 #include "avcodec.h"
33 #include "get_bits.h"
34 #include "mathops.h"
35 #include "progressframe.h"
36 #include "put_bits.h"
37 #include "rangecoder.h"
38 
39 #ifdef __INTEL_COMPILER
40 #undef av_flatten
41 #define av_flatten
42 #endif
43 
44 #define MAX_PLANES 4
45 #define CONTEXT_SIZE 32
46 
47 #define MAX_QUANT_TABLES 8
48 #define MAX_QUANT_TABLE_SIZE 256
49 #define MAX_QUANT_TABLE_MASK (MAX_QUANT_TABLE_SIZE - 1)
50 #define MAX_CONTEXT_INPUTS 5
51 
52 #define AC_GOLOMB_RICE 0
53 #define AC_RANGE_DEFAULT_TAB 1
54 #define AC_RANGE_CUSTOM_TAB 2
55 #define AC_RANGE_DEFAULT_TAB_FORCE -2
56 
57 typedef struct VlcState {
58  uint32_t error_sum;
59  int16_t drift;
60  int8_t bias;
61  uint8_t count;
62 } VlcState;
63 
64 typedef struct PlaneContext {
67  uint8_t (*state)[CONTEXT_SIZE];
69 } PlaneContext;
70 
71 #define MAX_SLICES 1024
72 
73 typedef struct FFV1SliceContext {
74  int16_t *sample_buffer;
76 
79  int slice_x;
80  int slice_y;
81  int sx, sy;
82 
83  int run_index;
87  int remap;
88 
89  // RefStruct reference, array of MAX_PLANES elements
93 
94  int ac_byte_count; ///< number of bytes used for AC coding
95 
96  union {
97  // decoder-only
98  struct {
101  };
102 
103  // encoder-only
104  struct {
105  uint64_t rc_stat[256][2];
106  uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
107  };
108  };
109  int remap_count[4];
110 
111  uint32_t *bitmap [4]; //float encode
112  uint16_t *fltmap [4]; //halffloat encode & decode
113  uint32_t *fltmap32[4]; //float decode
114  unsigned int fltmap_size[4];
115  unsigned int fltmap32_size[4];
116  struct Unit {
117  uint32_t val; //this is unneeded if you accept a dereference on each access
118  uint32_t ndx;
119  } *unit[4];
121 
122 typedef struct FFV1Context {
123  AVClass *class;
125  uint64_t rc_stat[256][2];
126  uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
127  int version;
130  int width, height;
134  int flags;
139  uint32_t crcref;
142 
145  int ac; ///< 1=range coder <-> 0=golomb rice
148  uint8_t state_transition[256];
151  int flt;
154 
155  int use32bit;
156 
157  int ec;
158  int intra;
161  int qtable;
162 
165 
168 
173 
175  /* RefStruct object, per-slice damage flags shared between frame threads.
176  *
177  * After a frame thread marks some slice as finished with
178  * ff_progress_frame_report(), the corresponding array element must not be
179  * accessed by this thread anymore, as from then on it is owned by the next
180  * thread.
181  */
182  uint8_t *slice_damaged;
183  /* Frame damage flag, used to delay announcing progress, since ER is
184  * applied after all the slices are decoded.
185  * NOT shared between frame threads.
186  */
187  uint8_t frame_damaged;
188 } FFV1Context;
189 
198 int ff_need_new_slices(int width, int num_h_slices, int chroma_shift);
202  int16_t quant_table[MAX_CONTEXT_INPUTS][256]);
203 void ff_ffv1_compute_bits_per_plane(const FFV1Context *f, FFV1SliceContext *sc, int bits[4], int offset[1], int mask[4], int bits_per_raw_sample);
204 int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed);
205 
206 /**
207  * This is intended for both width and height
208  */
209 int ff_slice_coord(const FFV1Context *f, int width, int sx, int num_h_slices, int chroma_shift);
210 
211 static av_always_inline int fold(int diff, int bits)
212 {
213  if (bits == 8)
214  diff = (int8_t)diff;
215  else {
217  }
218 
219  return diff;
220 }
221 
222 static inline void update_vlc_state(VlcState *const state, const int v)
223 {
224  int drift = state->drift;
225  int count = state->count;
226  state->error_sum += FFABS(v);
227  drift += v;
228 
229  if (count == 128) { // FIXME: variable
230  count >>= 1;
231  drift >>= 1;
232  state->error_sum >>= 1;
233  }
234  count++;
235 
236  if (drift <= -count) {
237  state->bias = FFMAX(state->bias - 1, -128);
238 
239  drift = FFMAX(drift + count, -count + 1);
240  } else if (drift > 0) {
241  state->bias = FFMIN(state->bias + 1, 127);
242 
243  drift = FFMIN(drift - count, 0);
244  }
245 
246  state->drift = drift;
247  state->count = count;
248 }
249 
250 
251 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state,
252  int is_signed)
253 {
254  if (get_rac(c, state + 0))
255  return 0;
256  else {
257  int e;
258  unsigned a;
259  e = 0;
260  while (get_rac(c, state + 1 + FFMIN(e, 9))) { // 1..10
261  e++;
262  if (e > 31)
263  return AVERROR_INVALIDDATA;
264  }
265 
266  a = 1;
267  for (int i = e - 1; i >= 0; i--)
268  a += a + get_rac(c, state + 22 + FFMIN(i, 9)); // 22..31
269 
270  e = -(is_signed && get_rac(c, state + 11 + FFMIN(e, 10))); // 11..21
271  return (a ^ e) - e;
272  }
273 }
274 
275 #endif /* AVCODEC_FFV1_H */
FFV1Context::chroma_v_shift
int chroma_v_shift
Definition: ffv1.h:132
FFV1SliceContext::slice_height
int slice_height
Definition: ffv1.h:78
FFV1Context::flags
int flags
Definition: ffv1.h:134
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
FFV1Context::key_frame_ok
int key_frame_ok
Definition: ffv1.h:159
update_vlc_state
static void update_vlc_state(VlcState *const state, const int v)
Definition: ffv1.h:222
FFV1Context::last_picture
ProgressFrame last_picture
Definition: ffv1.h:137
FFV1Context::context_count
int context_count[MAX_QUANT_TABLES]
Definition: ffv1.h:147
ff_ffv1_clear_slice_state
void ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1.c:198
FFV1SliceContext::plane
PlaneContext * plane
Definition: ffv1.h:90
FFV1Context::ec
int ec
Definition: ffv1.h:157
int64_t
long long int64_t
Definition: coverity.c:34
mask
int mask
Definition: mediacodecdec_common.c:154
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
FFV1Context::crcref
uint32_t crcref
Definition: ffv1.h:139
FFV1Context::configured_pix_fmt
enum AVPixelFormat configured_pix_fmt
Definition: ffv1.h:141
FFV1Context::remap_mode
int remap_mode
Definition: ffv1.h:152
MAX_QUANT_TABLE_SIZE
#define MAX_QUANT_TABLE_SIZE
Definition: ffv1.h:48
rangecoder.h
PlaneContext::state
uint8_t(* state)[CONTEXT_SIZE]
Definition: ffv1.h:67
FFV1Context::num_h_slices
int num_h_slices
Definition: ffv1.h:172
FFV1Context::hwaccel_picture_private
void * hwaccel_picture_private
Definition: ffv1.h:138
FFV1SliceContext::pb
PutBitContext pb
Definition: ffv1.h:91
FFV1SliceContext::fltmap_size
unsigned int fltmap_size[4]
Definition: ffv1.h:114
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
FFV1Context::quant_tables
int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE]
Definition: ffv1.h:146
FFV1Context::chroma_h_shift
int chroma_h_shift
Definition: ffv1.h:132
FFV1SliceContext::slice_x
int slice_x
Definition: ffv1.h:79
ff_ffv1_read_extra_header
int ff_ffv1_read_extra_header(FFV1Context *f)
Definition: ffv1_parse.c:70
ff_ffv1_common_init
int ff_ffv1_common_init(AVCodecContext *avctx, FFV1Context *s)
Definition: ffv1.c:36
FFV1Context::combined_version
int combined_version
Definition: ffv1.h:129
ff_ffv1_get_symbol
int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1.c:259
CONTEXT_SIZE
#define CONTEXT_SIZE
Definition: ffv1.h:45
FFV1Context::chroma_planes
int chroma_planes
Definition: ffv1.h:131
PlaneContext::context_count
int context_count
Definition: ffv1.h:66
progressframe.h
FFV1Context::hwaccel_last_picture_private
void * hwaccel_last_picture_private
Definition: ffv1.h:138
FFV1Context::bits_per_raw_sample
int bits_per_raw_sample
Definition: ffv1.h:163
FFV1SliceContext::sample_buffer
int16_t * sample_buffer
Definition: ffv1.h:74
FFV1Context::use32bit
int use32bit
Definition: ffv1.h:155
FFV1Context::quant_table_count
int quant_table_count
Definition: ffv1.h:167
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFV1Context::slice_count
int slice_count
Definition: ffv1.h:169
FFV1Context::max_slice_count
int max_slice_count
Definition: ffv1.h:170
bits
uint8_t bits
Definition: vp3data.h:128
FFV1Context::intra
int intra
Definition: ffv1.h:158
FFV1Context::rc_stat
uint64_t rc_stat[256][2]
Definition: ffv1.h:125
FFV1SliceContext::fltmap32_size
unsigned int fltmap32_size[4]
Definition: ffv1.h:115
FFV1SliceContext::rc_stat2
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:106
get_bits.h
fold
static av_always_inline int fold(int diff, int bits)
Definition: ffv1.h:211
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:145
FFV1Context::plane_count
int plane_count
Definition: ffv1.h:144
FFV1Context::slice_damaged
uint8_t * slice_damaged
Definition: ffv1.h:182
PutBitContext
Definition: put_bits.h:50
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
quant_table
static const int16_t quant_table[64]
Definition: intrax8.c:511
ff_ffv1_close
void ff_ffv1_close(FFV1Context *s)
Definition: ffv1.c:264
FFV1SliceContext::sx
int sx
Definition: ffv1.h:81
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
PlaneContext::vlc_state
VlcState * vlc_state
Definition: ffv1.h:68
FFV1SliceContext::unit
struct FFV1SliceContext::Unit * unit[4]
FFV1SliceContext::Unit::val
uint32_t val
Definition: ffv1.h:117
FFV1Context::num_v_slices
int num_v_slices
Definition: ffv1.h:171
FFV1SliceContext::fltmap32
uint32_t * fltmap32[4]
Definition: ffv1.h:113
FFV1Context::colorspace
int colorspace
Definition: ffv1.h:150
ff_ffv1_compute_bits_per_plane
void ff_ffv1_compute_bits_per_plane(const FFV1Context *f, FFV1SliceContext *sc, int bits[4], int offset[1], int mask[4], int bits_per_raw_sample)
FFV1Context::slices
FFV1SliceContext * slices
Definition: ffv1.h:174
FFV1Context::state_transition
uint8_t state_transition[256]
Definition: ffv1.h:148
mathops.h
PlaneContext
Definition: ffv1.h:64
state
static struct @487 state
FFV1Context::width
int width
Definition: ffv1.h:130
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
VlcState
Definition: ffv1.h:57
FFV1Context::height
int height
Definition: ffv1.h:130
FFV1SliceContext::slice_width
int slice_width
Definition: ffv1.h:77
f
f
Definition: af_crystalizer.c:122
ff_ffv1_planes_alloc
PlaneContext * ff_ffv1_planes_alloc(void)
Definition: ffv1.c:66
FFV1SliceContext::bitmap
uint32_t * bitmap[4]
Definition: ffv1.h:111
VlcState::count
uint8_t count
Definition: ffv1.h:61
ff_ffv1_init_slice_state
int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1.c:72
get_symbol_inline
static av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1.h:251
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
FFV1Context::picture
ProgressFrame picture
Definition: ffv1.h:137
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
FFV1SliceContext::slice_rct_by_coef
int slice_rct_by_coef
Definition: ffv1.h:85
FFV1Context::flt
int flt
Definition: ffv1.h:151
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
ff_ffv1_init_slices_state
int ff_ffv1_init_slices_state(FFV1Context *f)
Definition: ffv1.c:110
attributes.h
FFV1SliceContext::rc_stat
uint64_t rc_stat[256][2]
Definition: ffv1.h:105
PlaneContext::quant_table_index
int quant_table_index
Definition: ffv1.h:65
VlcState::drift
int16_t drift
Definition: ffv1.h:59
ff_slice_coord
int ff_slice_coord(const FFV1Context *f, int width, int sx, int num_h_slices, int chroma_shift)
This is intended for both width and height.
Definition: ffv1.c:127
FFV1Context::initial_states
uint8_t(*[MAX_QUANT_TABLES] initial_states)[32]
Definition: ffv1.h:149
FFV1SliceContext::c
RangeCoder c
Definition: ffv1.h:92
ff_ffv1_allocate_initial_states
int ff_ffv1_allocate_initial_states(FFV1Context *f)
Definition: ffv1.c:183
ff_need_new_slices
int ff_need_new_slices(int width, int num_h_slices, int chroma_shift)
Definition: ffv1.c:120
FFV1Context::gob_count
int gob_count
Definition: ffv1.h:166
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
FFV1SliceContext::slice_rct_ry_coef
int slice_rct_ry_coef
Definition: ffv1.h:86
av_flatten
#define av_flatten
Definition: attributes.h:96
FFV1SliceContext::remap_count
int remap_count[4]
Definition: ffv1.h:109
av_always_inline
#define av_always_inline
Definition: attributes.h:49
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
FFV1SliceContext::sample_buffer32
int32_t * sample_buffer32
Definition: ffv1.h:75
FFV1SliceContext
Definition: ffv1.h:73
get_rac
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition: rangecoder.h:118
MAX_CONTEXT_INPUTS
#define MAX_CONTEXT_INPUTS
Definition: ffv1.h:50
FFV1Context::packed_at_lsb
int packed_at_lsb
Definition: ffv1.h:164
ff_ffv1_read_quant_tables
int ff_ffv1_read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256])
Definition: ffv1_parse.c:52
avcodec.h
FFV1Context::avctx
AVCodecContext * avctx
Definition: ffv1.h:124
FFV1SliceContext::fltmap
uint16_t * fltmap[4]
Definition: ffv1.h:112
FFV1Context::qtable
int qtable
Definition: ffv1.h:161
FFV1SliceContext::slice_y
int slice_y
Definition: ffv1.h:80
FFV1SliceContext::Unit::ndx
uint32_t ndx
Definition: ffv1.h:118
FFV1Context::picture_number
int64_t picture_number
Definition: ffv1.h:135
FFV1Context::rc_stat2
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:126
FFV1Context::pix_fmt
enum AVPixelFormat pix_fmt
Definition: ffv1.h:140
AVCodecContext
main external API structure.
Definition: avcodec.h:431
VlcState::bias
int8_t bias
Definition: ffv1.h:60
FFV1Context::context_model
int context_model
Definition: ffv1.h:160
FFV1SliceContext::remap
int remap
Definition: ffv1.h:87
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:131
ff_ffv1_parse_header
int ff_ffv1_parse_header(FFV1Context *f, RangeCoder *c, uint8_t *state)
Definition: ffv1_parse.c:208
FFV1Context::key_frame
int key_frame
Definition: ffv1.h:136
FFV1SliceContext::sy
int sy
Definition: ffv1.h:81
VlcState::error_sum
uint32_t error_sum
Definition: ffv1.h:58
FFV1SliceContext::Unit
Definition: ffv1.h:116
ff_ffv1_init_slice_contexts
int ff_ffv1_init_slice_contexts(FFV1Context *f)
Definition: ffv1.c:140
MAX_QUANT_TABLES
#define MAX_QUANT_TABLES
Definition: ffv1.h:47
FFV1Context
Definition: ffv1.h:122
FFV1Context::transparency
int transparency
Definition: ffv1.h:133
ProgressFrame
The ProgressFrame structure.
Definition: progressframe.h:73
FFV1SliceContext::run_index
int run_index
Definition: ffv1.h:83
int32_t
int32_t
Definition: audioconvert.c:56
FFV1SliceContext::slice_reset_contexts
int slice_reset_contexts
Definition: ffv1.h:99
FFV1Context::cur_enc_frame
const AVFrame * cur_enc_frame
Definition: ffv1.h:143
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
FFV1Context::micro_version
int micro_version
Definition: ffv1.h:128
RangeCoder
Definition: mss3.c:63
width
#define width
Definition: dsp.h:85
FFV1SliceContext::ac_byte_count
int ac_byte_count
number of bytes used for AC coding
Definition: ffv1.h:94
FFV1SliceContext::slice_damaged
int slice_damaged
Definition: ffv1.h:100
put_bits.h
FFV1SliceContext::slice_coding_mode
int slice_coding_mode
Definition: ffv1.h:84
FFV1Context::remap_optimizer
int remap_optimizer
Definition: ffv1.h:153
FFV1Context::version
int version
Definition: ffv1.h:127
FFV1Context::frame_damaged
uint8_t frame_damaged
Definition: ffv1.h:187