FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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;
155 
156  int use32bit;
157 
158  int ec;
159  int intra;
162  int qtable;
163 
166 
169 
174 
176  /* RefStruct object, per-slice damage flags shared between frame threads.
177  *
178  * After a frame thread marks some slice as finished with
179  * ff_progress_frame_report(), the corresponding array element must not be
180  * accessed by this thread anymore, as from then on it is owned by the next
181  * thread.
182  */
183  uint8_t *slice_damaged;
184  /* Frame damage flag, used to delay announcing progress, since ER is
185  * applied after all the slices are decoded.
186  * NOT shared between frame threads.
187  */
188  uint8_t frame_damaged;
189 } FFV1Context;
190 
199 int ff_need_new_slices(int width, int num_h_slices, int chroma_shift);
203  int16_t quant_table[MAX_CONTEXT_INPUTS][256]);
204 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);
205 int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed);
206 
207 /**
208  * This is intended for both width and height
209  */
210 int ff_slice_coord(const FFV1Context *f, int width, int sx, int num_h_slices, int chroma_shift);
211 
212 static av_always_inline int fold(int diff, int bits)
213 {
214  if (bits == 8)
215  diff = (int8_t)diff;
216  else {
218  }
219 
220  return diff;
221 }
222 
223 static inline void update_vlc_state(VlcState *const state, const int v)
224 {
225  int drift = state->drift;
226  int count = state->count;
227  state->error_sum += FFABS(v);
228  drift += v;
229 
230  if (count == 128) { // FIXME: variable
231  count >>= 1;
232  drift >>= 1;
233  state->error_sum >>= 1;
234  }
235  count++;
236 
237  if (drift <= -count) {
238  state->bias = FFMAX(state->bias - 1, -128);
239 
240  drift = FFMAX(drift + count, -count + 1);
241  } else if (drift > 0) {
242  state->bias = FFMIN(state->bias + 1, 127);
243 
244  drift = FFMIN(drift - count, 0);
245  }
246 
247  state->drift = drift;
248  state->count = count;
249 }
250 
251 
252 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state,
253  int is_signed)
254 {
255  if (get_rac(c, state + 0))
256  return 0;
257  else {
258  int e;
259  unsigned a;
260  e = 0;
261  while (get_rac(c, state + 1 + FFMIN(e, 9))) { // 1..10
262  e++;
263  if (e > 31)
264  return AVERROR_INVALIDDATA;
265  }
266 
267  a = 1;
268  for (int i = e - 1; i >= 0; i--)
269  a += a + get_rac(c, state + 22 + FFMIN(i, 9)); // 22..31
270 
271  e = -(is_signed && get_rac(c, state + 11 + FFMIN(e, 10))); // 11..21
272  return (a ^ e) - e;
273  }
274 }
275 
276 #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:160
update_vlc_state
static void update_vlc_state(VlcState *const state, const int v)
Definition: ffv1.h:223
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:158
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:173
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
state
static struct @501 state
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:164
FFV1SliceContext::sample_buffer
int16_t * sample_buffer
Definition: ffv1.h:74
FFV1Context::use32bit
int use32bit
Definition: ffv1.h:156
FFV1Context::quant_table_count
int quant_table_count
Definition: ffv1.h:168
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFV1Context::slice_count
int slice_count
Definition: ffv1.h:170
FFV1Context::max_slice_count
int max_slice_count
Definition: ffv1.h:171
bits
uint8_t bits
Definition: vp3data.h:128
FFV1Context::intra
int intra
Definition: ffv1.h:159
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:212
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:145
FFV1Context::maxsize_warned
int maxsize_warned
Definition: ffv1.h:154
FFV1Context::plane_count
int plane_count
Definition: ffv1.h:144
FFV1Context::slice_damaged
uint8_t * slice_damaged
Definition: ffv1.h:183
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:76
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:172
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:175
FFV1Context::state_transition
uint8_t state_transition[256]
Definition: ffv1.h:148
mathops.h
PlaneContext
Definition: ffv1.h:64
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:252
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:167
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:165
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:162
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:161
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:89
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:188