FFmpeg: libavcodec/ffv1.h Source File

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 {
65   int quant_table_index;
66   int context_count;
67   uint8_t (*state)[CONTEXT_SIZE];
68   VlcState *vlc_state;
69 } PlaneContext;
70 
71  #define MAX_SLICES 1024
72 
73  typedef struct FFV1SliceContext {
74   int16_t *sample_buffer;
75   int32_t *sample_buffer32;
76 
77   int slice_width;
78   int slice_height;
79   int slice_x;
80   int slice_y;
81   int sx, sy;
82 
83   int run_index;
84   int slice_coding_mode;
85   int slice_rct_by_coef;
86   int slice_rct_ry_coef;
87   int remap;
88 
89  // RefStruct reference, array of MAX_PLANES elements
90   PlaneContext *plane;
91   PutBitContext pb;
92   RangeCoder c;
93 
94   int ac_byte_count; ///< number of bytes used for AC coding
95 
96  union {
97  // decoder-only
98  struct {
99   int slice_reset_contexts;
100   int slice_damaged;
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];
120 } FFV1SliceContext;
121 
122  typedef struct FFV1Context {
123   AVClass *class;
124   AVCodecContext *avctx;
125   uint64_t rc_stat[256][2];
126   uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
127   int version;
128   int micro_version;
129   int combined_version;
130   int width, height;
131   int chroma_planes;
132   int chroma_h_shift, chroma_v_shift;
133   int transparency;
134   int flags;
135   int64_t picture_number;
136   int key_frame;
137   ProgressFrame picture, last_picture;
138   void *hwaccel_picture_private, *hwaccel_last_picture_private;
139   uint32_t crcref;
140   enum AVPixelFormat pix_fmt;
141   enum AVPixelFormat configured_pix_fmt;
142 
143   const AVFrame *cur_enc_frame;
144   int plane_count;
145   int ac; ///< 1=range coder <-> 0=golomb rice
146   int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE];
147   int context_count[MAX_QUANT_TABLES];
148   uint8_t state_transition[256];
149   uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
150   int colorspace;
151   int flt;
152   int remap_mode;
153   int remap_optimizer;
154   int maxsize_warned;
155 
156   int use32bit;
157 
158   int ec;
159   int intra;
160   int key_frame_ok;
161   int context_model;
162   int qtable;
163 
164   int bits_per_raw_sample;
165   int packed_at_lsb;
166 
167   int gob_count;
168   int quant_table_count;
169 
170   int slice_count;
171   int max_slice_count;
172   int num_v_slices;
173   int num_h_slices;
174 
175   FFV1SliceContext *slices;
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 
191 int ff_ffv1_common_init(AVCodecContext *avctx, FFV1Context *s);
192 int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1SliceContext *sc);
193 int ff_ffv1_init_slices_state(FFV1Context *f);
194 int ff_ffv1_init_slice_contexts(FFV1Context *f);
195 PlaneContext *ff_ffv1_planes_alloc(void);
196 int ff_ffv1_allocate_initial_states(FFV1Context *f);
197 void ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1SliceContext *sc);
198 void ff_ffv1_close(FFV1Context *s);
199 int ff_need_new_slices(int width, int num_h_slices, int chroma_shift);
200 int ff_ffv1_parse_header(FFV1Context *f, RangeCoder *c, uint8_t *state);
201 int ff_ffv1_read_extra_header(FFV1Context *f);
202 int ff_ffv1_read_quant_tables(RangeCoder *c,
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, 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 {
217  diff = sign_extend(diff, bits);
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:427
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
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
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:112
FFV1SliceContext::remap_count
int remap_count[4]
Definition: ffv1.h:109
av_always_inline
#define av_always_inline
Definition: attributes.h:63
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
ff_ffv1_compute_bits_per_plane
void ff_ffv1_compute_bits_per_plane(const FFV1Context *f, FFV1SliceContext *sc, int bits[4], int *offset, int mask[4], int bits_per_raw_sample)
Definition: ffv1.c:222
avcodec.h
FFV1Context::avctx
AVCodecContext * avctx
Definition: ffv1.h:124
FFV1SliceContext::fltmap
uint16_t * fltmap[4]
Definition: ffv1.h:112
state
static struct @531 state
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:132
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

Generated on Sat Oct 18 2025 19:22:03 for FFmpeg by   doxygen 1.8.17

AltStyle によって変換されたページ (->オリジナル) /