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 
88  // RefStruct reference, array of MAX_PLANES elements
92 
93  int ac_byte_count; ///< number of bytes used for AC coding
94 
95  union {
96  // decoder-only
97  struct {
100  };
101 
102  // encoder-only
103  struct {
104  uint64_t rc_stat[256][2];
105  uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
106  };
107  };
109 
110 typedef struct FFV1Context {
111  AVClass *class;
113  uint64_t rc_stat[256][2];
114  uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
115  int version;
118  int width, height;
122  int flags;
126  uint32_t crcref;
128 
131  int ac; ///< 1=range coder <-> 0=golomb rice
134  uint8_t state_transition[256];
137 
138  int use32bit;
139 
140  int ec;
141  int intra;
144  int qtable;
145 
148 
151 
156 
158  /* RefStruct object, per-slice damage flags shared between frame threads.
159  *
160  * After a frame thread marks some slice as finished with
161  * ff_progress_frame_report(), the corresponding array element must not be
162  * accessed by this thread anymore, as from then on it is owned by the next
163  * thread.
164  */
165  uint8_t *slice_damaged;
166  /* Frame damage flag, used to delay announcing progress, since ER is
167  * applied after all the slices are decoded.
168  * NOT shared between frame threads.
169  */
170  uint8_t frame_damaged;
171 } FFV1Context;
172 
181 int ff_need_new_slices(int width, int num_h_slices, int chroma_shift);
185  int16_t quant_table[MAX_CONTEXT_INPUTS][256]);
186 int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed);
187 
188 /**
189  * This is intended for both width and height
190  */
191 int ff_slice_coord(const FFV1Context *f, int width, int sx, int num_h_slices, int chroma_shift);
192 
193 static av_always_inline int fold(int diff, int bits)
194 {
195  if (bits == 8)
196  diff = (int8_t)diff;
197  else {
199  }
200 
201  return diff;
202 }
203 
204 static inline void update_vlc_state(VlcState *const state, const int v)
205 {
206  int drift = state->drift;
207  int count = state->count;
208  state->error_sum += FFABS(v);
209  drift += v;
210 
211  if (count == 128) { // FIXME: variable
212  count >>= 1;
213  drift >>= 1;
214  state->error_sum >>= 1;
215  }
216  count++;
217 
218  if (drift <= -count) {
219  state->bias = FFMAX(state->bias - 1, -128);
220 
221  drift = FFMAX(drift + count, -count + 1);
222  } else if (drift > 0) {
223  state->bias = FFMIN(state->bias + 1, 127);
224 
225  drift = FFMIN(drift - count, 0);
226  }
227 
228  state->drift = drift;
229  state->count = count;
230 }
231 
232 
233 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state,
234  int is_signed)
235 {
236  if (get_rac(c, state + 0))
237  return 0;
238  else {
239  int e;
240  unsigned a;
241  e = 0;
242  while (get_rac(c, state + 1 + FFMIN(e, 9))) { // 1..10
243  e++;
244  if (e > 31)
245  return AVERROR_INVALIDDATA;
246  }
247 
248  a = 1;
249  for (int i = e - 1; i >= 0; i--)
250  a += a + get_rac(c, state + 22 + FFMIN(i, 9)); // 22..31
251 
252  e = -(is_signed && get_rac(c, state + 11 + FFMIN(e, 10))); // 11..21
253  return (a ^ e) - e;
254  }
255 }
256 
257 #endif /* AVCODEC_FFV1_H */
FFV1Context::chroma_v_shift
int chroma_v_shift
Definition: ffv1.h:120
FFV1SliceContext::slice_height
int slice_height
Definition: ffv1.h:78
FFV1Context::flags
int flags
Definition: ffv1.h:122
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
FFV1Context::key_frame_ok
int key_frame_ok
Definition: ffv1.h:142
update_vlc_state
static void update_vlc_state(VlcState *const state, const int v)
Definition: ffv1.h:204
FFV1Context::last_picture
ProgressFrame last_picture
Definition: ffv1.h:125
FFV1Context::context_count
int context_count[MAX_QUANT_TABLES]
Definition: ffv1.h:133
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:89
FFV1Context::ec
int ec
Definition: ffv1.h:140
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:126
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:155
FFV1SliceContext::pb
PutBitContext pb
Definition: ffv1.h:90
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:132
FFV1Context::chroma_h_shift
int chroma_h_shift
Definition: ffv1.h:120
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:117
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:119
PlaneContext::context_count
int context_count
Definition: ffv1.h:66
progressframe.h
FFV1Context::bits_per_raw_sample
int bits_per_raw_sample
Definition: ffv1.h:146
FFV1SliceContext::sample_buffer
int16_t * sample_buffer
Definition: ffv1.h:74
FFV1Context::use32bit
int use32bit
Definition: ffv1.h:138
FFV1Context::quant_table_count
int quant_table_count
Definition: ffv1.h:150
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFV1Context::slice_count
int slice_count
Definition: ffv1.h:152
FFV1Context::max_slice_count
int max_slice_count
Definition: ffv1.h:153
bits
uint8_t bits
Definition: vp3data.h:128
FFV1Context::intra
int intra
Definition: ffv1.h:141
FFV1Context::rc_stat
uint64_t rc_stat[256][2]
Definition: ffv1.h:113
FFV1SliceContext::rc_stat2
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:105
get_bits.h
fold
static av_always_inline int fold(int diff, int bits)
Definition: ffv1.h:193
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:131
FFV1Context::plane_count
int plane_count
Definition: ffv1.h:130
FFV1Context::slice_damaged
uint8_t * slice_damaged
Definition: ffv1.h:165
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:517
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
FFV1Context::num_v_slices
int num_v_slices
Definition: ffv1.h:154
FFV1Context::colorspace
int colorspace
Definition: ffv1.h:136
FFV1Context::slices
FFV1SliceContext * slices
Definition: ffv1.h:157
FFV1Context::state_transition
uint8_t state_transition[256]
Definition: ffv1.h:134
mathops.h
PlaneContext
Definition: ffv1.h:64
FFV1Context::width
int width
Definition: ffv1.h:118
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:118
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
state
static struct @474 state
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:233
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:125
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
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:104
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:135
FFV1SliceContext::c
RangeCoder c
Definition: ffv1.h:91
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:149
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:147
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:112
FFV1Context::qtable
int qtable
Definition: ffv1.h:144
FFV1SliceContext::slice_y
int slice_y
Definition: ffv1.h:80
FFV1Context::picture_number
int64_t picture_number
Definition: ffv1.h:123
FFV1Context::rc_stat2
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:114
FFV1Context::pix_fmt
enum AVPixelFormat pix_fmt
Definition: ffv1.h:127
AVCodecContext
main external API structure.
Definition: avcodec.h:451
VlcState::bias
int8_t bias
Definition: ffv1.h:60
FFV1Context::context_model
int context_model
Definition: ffv1.h:143
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:201
FFV1Context::key_frame
int key_frame
Definition: ffv1.h:124
FFV1SliceContext::sy
int sy
Definition: ffv1.h:81
VlcState::error_sum
uint32_t error_sum
Definition: ffv1.h:58
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:110
FFV1Context::transparency
int transparency
Definition: ffv1.h:121
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:98
FFV1Context::cur_enc_frame
const AVFrame * cur_enc_frame
Definition: ffv1.h:129
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
FFV1Context::micro_version
int micro_version
Definition: ffv1.h:116
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:93
FFV1SliceContext::slice_damaged
int slice_damaged
Definition: ffv1.h:99
put_bits.h
FFV1SliceContext::slice_coding_mode
int slice_coding_mode
Definition: ffv1.h:84
FFV1Context::version
int version
Definition: ffv1.h:115
FFV1Context::frame_damaged
uint8_t frame_damaged
Definition: ffv1.h:170