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  union {
110  uint16_t bitmap [4][65536]; //float encode
111  uint16_t fltmap [4][65536]; //halffloat encode & decode
112  uint32_t fltmap32[4][65536]; //float decode
113  };
114  struct Unit {
115  uint32_t val; //this is unneeded if you accept a dereference on each access
116  uint16_t ndx;
117  } unit[4][65536];
119 
120 typedef struct FFV1Context {
121  AVClass *class;
123  uint64_t rc_stat[256][2];
124  uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
125  int version;
128  int width, height;
132  int flags;
137  uint32_t crcref;
140 
143  int ac; ///< 1=range coder <-> 0=golomb rice
146  uint8_t state_transition[256];
149  int flt;
152 
153  int use32bit;
154 
155  int ec;
156  int intra;
159  int qtable;
160 
163 
166 
171 
173  /* RefStruct object, per-slice damage flags shared between frame threads.
174  *
175  * After a frame thread marks some slice as finished with
176  * ff_progress_frame_report(), the corresponding array element must not be
177  * accessed by this thread anymore, as from then on it is owned by the next
178  * thread.
179  */
180  uint8_t *slice_damaged;
181  /* Frame damage flag, used to delay announcing progress, since ER is
182  * applied after all the slices are decoded.
183  * NOT shared between frame threads.
184  */
185  uint8_t frame_damaged;
186 } FFV1Context;
187 
196 int ff_need_new_slices(int width, int num_h_slices, int chroma_shift);
200  int16_t quant_table[MAX_CONTEXT_INPUTS][256]);
201 int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed);
202 
203 /**
204  * This is intended for both width and height
205  */
206 int ff_slice_coord(const FFV1Context *f, int width, int sx, int num_h_slices, int chroma_shift);
207 
208 static av_always_inline int fold(int diff, int bits)
209 {
210  if (bits == 8)
211  diff = (int8_t)diff;
212  else {
214  }
215 
216  return diff;
217 }
218 
219 static inline void update_vlc_state(VlcState *const state, const int v)
220 {
221  int drift = state->drift;
222  int count = state->count;
223  state->error_sum += FFABS(v);
224  drift += v;
225 
226  if (count == 128) { // FIXME: variable
227  count >>= 1;
228  drift >>= 1;
229  state->error_sum >>= 1;
230  }
231  count++;
232 
233  if (drift <= -count) {
234  state->bias = FFMAX(state->bias - 1, -128);
235 
236  drift = FFMAX(drift + count, -count + 1);
237  } else if (drift > 0) {
238  state->bias = FFMIN(state->bias + 1, 127);
239 
240  drift = FFMIN(drift - count, 0);
241  }
242 
243  state->drift = drift;
244  state->count = count;
245 }
246 
247 
248 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state,
249  int is_signed)
250 {
251  if (get_rac(c, state + 0))
252  return 0;
253  else {
254  int e;
255  unsigned a;
256  e = 0;
257  while (get_rac(c, state + 1 + FFMIN(e, 9))) { // 1..10
258  e++;
259  if (e > 31)
260  return AVERROR_INVALIDDATA;
261  }
262 
263  a = 1;
264  for (int i = e - 1; i >= 0; i--)
265  a += a + get_rac(c, state + 22 + FFMIN(i, 9)); // 22..31
266 
267  e = -(is_signed && get_rac(c, state + 11 + FFMIN(e, 10))); // 11..21
268  return (a ^ e) - e;
269  }
270 }
271 
272 #endif /* AVCODEC_FFV1_H */
FFV1Context::chroma_v_shift
int chroma_v_shift
Definition: ffv1.h:130
FFV1SliceContext::slice_height
int slice_height
Definition: ffv1.h:78
FFV1Context::flags
int flags
Definition: ffv1.h:132
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
FFV1Context::key_frame_ok
int key_frame_ok
Definition: ffv1.h:157
update_vlc_state
static void update_vlc_state(VlcState *const state, const int v)
Definition: ffv1.h:219
FFV1Context::last_picture
ProgressFrame last_picture
Definition: ffv1.h:135
FFV1Context::context_count
int context_count[MAX_QUANT_TABLES]
Definition: ffv1.h:145
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:155
int64_t
long long int64_t
Definition: coverity.c:34
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
FFV1Context::crcref
uint32_t crcref
Definition: ffv1.h:137
FFV1Context::configured_pix_fmt
enum AVPixelFormat configured_pix_fmt
Definition: ffv1.h:139
FFV1Context::remap_mode
int remap_mode
Definition: ffv1.h:150
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:170
FFV1Context::hwaccel_picture_private
void * hwaccel_picture_private
Definition: ffv1.h:136
FFV1SliceContext::pb
PutBitContext pb
Definition: ffv1.h:91
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:144
FFV1Context::chroma_h_shift
int chroma_h_shift
Definition: ffv1.h:130
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 @488 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:127
ff_ffv1_get_symbol
int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1.c:222
CONTEXT_SIZE
#define CONTEXT_SIZE
Definition: ffv1.h:45
FFV1Context::chroma_planes
int chroma_planes
Definition: ffv1.h:129
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:136
FFV1Context::bits_per_raw_sample
int bits_per_raw_sample
Definition: ffv1.h:161
FFV1SliceContext::sample_buffer
int16_t * sample_buffer
Definition: ffv1.h:74
FFV1Context::use32bit
int use32bit
Definition: ffv1.h:153
FFV1Context::quant_table_count
int quant_table_count
Definition: ffv1.h:165
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFV1Context::slice_count
int slice_count
Definition: ffv1.h:167
FFV1Context::max_slice_count
int max_slice_count
Definition: ffv1.h:168
bits
uint8_t bits
Definition: vp3data.h:128
FFV1Context::intra
int intra
Definition: ffv1.h:156
FFV1Context::rc_stat
uint64_t rc_stat[256][2]
Definition: ffv1.h:123
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:208
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:143
FFV1Context::plane_count
int plane_count
Definition: ffv1.h:142
FFV1Context::slice_damaged
uint8_t * slice_damaged
Definition: ffv1.h:180
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:227
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::val
uint32_t val
Definition: ffv1.h:115
FFV1Context::num_v_slices
int num_v_slices
Definition: ffv1.h:169
FFV1Context::colorspace
int colorspace
Definition: ffv1.h:148
FFV1Context::slices
FFV1SliceContext * slices
Definition: ffv1.h:172
FFV1Context::state_transition
uint8_t state_transition[256]
Definition: ffv1.h:146
mathops.h
PlaneContext
Definition: ffv1.h:64
FFV1Context::width
int width
Definition: ffv1.h:128
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:128
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
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:248
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:135
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:149
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:147
FFV1SliceContext::c
RangeCoder c
Definition: ffv1.h:92
FFV1SliceContext::unit
struct FFV1SliceContext::Unit unit[4][65536]
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:164
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
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:162
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:122
FFV1Context::qtable
int qtable
Definition: ffv1.h:159
FFV1SliceContext::slice_y
int slice_y
Definition: ffv1.h:80
FFV1Context::picture_number
int64_t picture_number
Definition: ffv1.h:133
FFV1Context::rc_stat2
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:124
FFV1Context::pix_fmt
enum AVPixelFormat pix_fmt
Definition: ffv1.h:138
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:158
FFV1SliceContext::remap
int remap
Definition: ffv1.h:87
FFV1SliceContext::fltmap
uint16_t fltmap[4][65536]
Definition: ffv1.h:111
FFV1SliceContext::fltmap32
uint32_t fltmap32[4][65536]
Definition: ffv1.h:112
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:134
FFV1SliceContext::sy
int sy
Definition: ffv1.h:81
VlcState::error_sum
uint32_t error_sum
Definition: ffv1.h:58
FFV1SliceContext::Unit
Definition: ffv1.h:114
FFV1SliceContext::bitmap
uint16_t bitmap[4][65536]
Definition: ffv1.h:110
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:120
FFV1Context::transparency
int transparency
Definition: ffv1.h:131
ProgressFrame
The ProgressFrame structure.
Definition: progressframe.h:73
FFV1SliceContext::run_index
int run_index
Definition: ffv1.h:83
FFV1SliceContext::Unit::ndx
uint16_t ndx
Definition: ffv1.h:116
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:141
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
FFV1Context::micro_version
int micro_version
Definition: ffv1.h:126
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:151
FFV1Context::version
int version
Definition: ffv1.h:125
FFV1Context::frame_damaged
uint8_t frame_damaged
Definition: ffv1.h:185