FFmpeg
vp56.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * VP5 and VP6 compatible video decoder (common features)
24  */
25 
26 #ifndef AVCODEC_VP56_H
27 #define AVCODEC_VP56_H
28 
29 #include "avcodec.h"
30 #include "get_bits.h"
31 #include "hpeldsp.h"
32 #include "bytestream.h"
33 #include "h264chroma.h"
34 #include "videodsp.h"
35 #include "vp3dsp.h"
36 #include "vp56dsp.h"
37 
38 typedef struct vp56_context VP56Context;
39 
40 typedef enum {
46 } VP56Frame;
47 
48 typedef enum {
49  VP56_MB_INTER_NOVEC_PF = 0, /**< Inter MB, no vector, from previous frame */
50  VP56_MB_INTRA = 1, /**< Intra MB */
51  VP56_MB_INTER_DELTA_PF = 2, /**< Inter MB, above/left vector + delta, from previous frame */
52  VP56_MB_INTER_V1_PF = 3, /**< Inter MB, first vector, from previous frame */
53  VP56_MB_INTER_V2_PF = 4, /**< Inter MB, second vector, from previous frame */
54  VP56_MB_INTER_NOVEC_GF = 5, /**< Inter MB, no vector, from golden frame */
55  VP56_MB_INTER_DELTA_GF = 6, /**< Inter MB, above/left vector + delta, from golden frame */
56  VP56_MB_INTER_4V = 7, /**< Inter MB, 4 vectors, from previous frame */
57  VP56_MB_INTER_V1_GF = 8, /**< Inter MB, first vector, from golden frame */
58  VP56_MB_INTER_V2_GF = 9, /**< Inter MB, second vector, from golden frame */
59 } VP56mb;
60 
61 typedef struct VP56Tree {
62  int8_t val;
63  int8_t prob_idx;
64 } VP56Tree;
65 
66 typedef struct VP56mv {
67  DECLARE_ALIGNED(4, int16_t, x);
68  int16_t y;
69 } VP56mv;
70 
71 #define VP56_SIZE_CHANGE 1
72 
73 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
74  VP56mv *vect);
75 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
76  int offset1, int offset2, ptrdiff_t stride,
77  VP56mv mv, int mask, int select, int luma);
78 typedef int (*VP56ParseCoeff)(VP56Context *s);
79 typedef void (*VP56DefaultModelsInit)(VP56Context *s);
80 typedef void (*VP56ParseVectorModels)(VP56Context *s);
81 typedef int (*VP56ParseCoeffModels)(VP56Context *s);
82 typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf,
83  int buf_size);
84 
85 typedef struct VP56RangeCoder {
86  int high;
87  int bits; /* stored negated (i.e. negative "bits" is a positive number of
88  bits left) in order to eliminate a negate in cache refilling */
89  const uint8_t *buffer;
90  const uint8_t *end;
91  unsigned int code_word;
93 
94 typedef struct VP56RefDc {
97  int16_t dc_coeff;
98 } VP56RefDc;
99 
100 typedef struct VP56Macroblock {
104 
105 typedef struct VP56Model {
106  uint8_t coeff_reorder[64]; /* used in vp6 only */
107  uint8_t coeff_index_to_pos[64]; /* used in vp6 only */
108  uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */
109  uint8_t vector_sig[2]; /* delta sign */
110  uint8_t vector_dct[2]; /* delta coding types */
111  uint8_t vector_pdi[2][2]; /* predefined delta init */
112  uint8_t vector_pdv[2][7]; /* predefined delta values */
113  uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */
114  uint8_t coeff_dccv[2][11]; /* DC coeff value */
115  uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */
116  uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */
117  uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */
118  uint8_t coeff_runv[2][14]; /* run value (vp6 only) */
119  uint8_t mb_type[3][10][10]; /* model for decoding MB type */
120  uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */
121 } VP56Model;
122 
123 struct vp56_context {
130  uint8_t idct_scantable[64];
138 
139  /* frame info */
141  int plane_width[4];
142  int plane_height[4];
143  int mb_width; /* number of horizontal MB */
144  int mb_height; /* number of vertical MB */
145  int block_offset[6];
146 
148  uint16_t dequant_dc;
149  uint16_t dequant_ac;
150 
151  /* DC predictors management */
153  VP56RefDc left_block[4];
154  int above_block_idx[6];
155  int16_t prev_dc[3][3]; /* [plan][ref_frame] */
156 
157  /* blocks / macroblock */
160  DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64];
161  int idct_selector[6];
162 
163  /* motion vectors */
164  VP56mv mv[6]; /* vectors for each block in MB */
165  VP56mv vector_candidate[2];
167 
168  /* filtering hints */
169  int filter_header; /* used in vp6 only */
175  DECLARE_ALIGNED(8, int, bounding_values_array)[256];
176 
177  uint8_t coeff_ctx[4][64]; /* used in vp5 only */
178  uint8_t coeff_ctx_last[4]; /* used in vp5 only */
179 
181 
182  /* upside-down flipping hints */
183  int flip; /* are we flipping ? */
184  int frbi; /* first row block index in MB */
185  int srbi; /* second row block index in MB */
186  ptrdiff_t stride[4]; /* stride for each plan */
187 
196 
197  /* for "slice" parallelism between YUV and A */
198  VP56Context *alpha_context;
199 
202 
203  /* huffman decoding */
206  VLC dccv_vlc[2];
207  VLC runv_vlc[2];
208  VLC ract_vlc[2][3][6];
209  unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */
210 
213 };
214 
215 
216 int ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha);
217 int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s,
218  int flip, int has_alpha);
219 int ff_vp56_free(AVCodecContext *avctx);
220 int ff_vp56_free_context(VP56Context *s);
221 void ff_vp56_init_dequant(VP56Context *s, int quantizer);
222 int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
223  AVPacket *avpkt);
224 
225 
226 /**
227  * vp56 specific range coder implementation
228  */
229 
230 extern const uint8_t ff_vp56_norm_shift[256];
231 int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size);
232 
233 /**
234  * vp5689 returns 1 if the end of the stream has been reached, 0 otherwise.
235  */
237 {
238  return c->end <= c->buffer && c->bits >= 0;
239 }
240 
242 {
243  int shift = ff_vp56_norm_shift[c->high];
244  int bits = c->bits;
245  unsigned int code_word = c->code_word;
246 
247  c->high <<= shift;
248  code_word <<= shift;
249  bits += shift;
250  if(bits >= 0 && c->buffer < c->end) {
251  code_word |= bytestream_get_be16(&c->buffer) << bits;
252  bits -= 16;
253  }
254  c->bits = bits;
255  return code_word;
256 }
257 
258 #if ARCH_ARM
259 #include "arm/vp56_arith.h"
260 #elif ARCH_X86
261 #include "x86/vp56_arith.h"
262 #endif
263 
264 #ifndef vp56_rac_get_prob
265 #define vp56_rac_get_prob vp56_rac_get_prob
267 {
268  unsigned int code_word = vp56_rac_renorm(c);
269  unsigned int low = 1 + (((c->high - 1) * prob) >> 8);
270  unsigned int low_shift = low << 16;
271  int bit = code_word >= low_shift;
272 
273  c->high = bit ? c->high - low : low;
274  c->code_word = bit ? code_word - low_shift : code_word;
275 
276  return bit;
277 }
278 #endif
279 
280 #ifndef vp56_rac_get_prob_branchy
281 // branchy variant, to be used where there's a branch based on the bit decoded
283 {
284  unsigned long code_word = vp56_rac_renorm(c);
285  unsigned low = 1 + (((c->high - 1) * prob) >> 8);
286  unsigned low_shift = low << 16;
287 
288  if (code_word >= low_shift) {
289  c->high -= low;
290  c->code_word = code_word - low_shift;
291  return 1;
292  }
293 
294  c->high = low;
295  c->code_word = code_word;
296  return 0;
297 }
298 #endif
299 
301 {
302  unsigned int code_word = vp56_rac_renorm(c);
303  /* equiprobable */
304  int low = (c->high + 1) >> 1;
305  unsigned int low_shift = low << 16;
306  int bit = code_word >= low_shift;
307  if (bit) {
308  c->high -= low;
309  code_word -= low_shift;
310  } else {
311  c->high = low;
312  }
313 
314  c->code_word = code_word;
315  return bit;
316 }
317 
318 // rounding is different than vp56_rac_get, is vp56_rac_get wrong?
320 {
321  return vp56_rac_get_prob(c, 128);
322 }
323 
325 {
326  int value = 0;
327 
328  while (bits--) {
329  value = (value << 1) | vp56_rac_get(c);
330  }
331 
332  return value;
333 }
334 
336 {
337  int value = 0;
338 
339  while (bits--) {
340  value = (value << 1) | vp8_rac_get(c);
341  }
342 
343  return value;
344 }
345 
346 // fixme: add 1 bit to all the calls to this?
348 {
349  int v;
350 
351  if (!vp8_rac_get(c))
352  return 0;
353 
354  v = vp8_rac_get_uint(c, bits);
355 
356  if (vp8_rac_get(c))
357  v = -v;
358 
359  return v;
360 }
361 
362 // P(7)
364 {
365  int v = vp56_rac_gets(c, 7) << 1;
366  return v + !v;
367 }
368 
370 {
371  int v = vp8_rac_get_uint(c, 7) << 1;
372  return v + !v;
373 }
374 
375 static av_always_inline
377  const VP56Tree *tree,
378  const uint8_t *probs)
379 {
380  while (tree->val > 0) {
381  if (vp56_rac_get_prob_branchy(c, probs[tree->prob_idx]))
382  tree += tree->val;
383  else
384  tree++;
385  }
386  return -tree->val;
387 }
388 
389 // how probabilities are associated with decisions is different I think
390 // well, the new scheme fits in the old but this way has one fewer branches per decision
391 static av_always_inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2],
392  const uint8_t *probs)
393 {
394  int i = 0;
395 
396  do {
397  i = tree[i][vp56_rac_get_prob(c, probs[i])];
398  } while (i > 0);
399 
400  return -i;
401 }
402 
403 // DCTextra
405 {
406  int v = 0;
407 
408  do {
409  v = (v<<1) + vp56_rac_get_prob(c, *prob++);
410  } while (*prob);
411 
412  return v;
413 }
414 
415 #endif /* AVCODEC_VP56_H */
VP56mb mb_type
Definition: vp56.h:158
static int shift(int a, int b)
Definition: sonic.c:82
unsigned int code_word
Definition: vp56.h:91
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:100
int(* VP56ParseCoeff)(VP56Context *s)
Definition: vp56.h:78
int(* VP56ParseCoeffModels)(VP56Context *s)
Definition: vp56.h:81
static av_always_inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t(*tree)[2], const uint8_t *probs)
Definition: vp56.h:391
int deblock_filtering
Definition: vp56.h:170
VP3DSPContext vp3dsp
Definition: vp56.h:128
int vector_candidate_pos
Definition: vp56.h:166
Inter MB, no vector, from previous frame.
Definition: vp56.h:49
VP56ParseVectorAdjustment parse_vector_adjustment
Definition: vp56.h:189
int use_huffman
Definition: vp56.h:204
uint16_t dequant_ac
Definition: vp56.h:149
#define src
Definition: vp8dsp.c:254
VP56ParseCoeffModels parse_coeff_models
Definition: vp56.h:194
if it could not because there are no more frames
VP56ParseVectorModels parse_vector_models
Definition: vp56.h:193
int ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha)
Definition: vp56.c:776
int16_t y
Definition: vp56.h:68
int mb_height
Definition: vp56.h:144
void(* VP56ParseVectorModels)(VP56Context *s)
Definition: vp56.h:80
uint8_t
uint16_t dequant_dc
Definition: vp56.h:148
int mb_width
Definition: vp56.h:143
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
GLsizei GLboolean const GLfloat * value
Definition: opengl_enc.c:108
VP56DSPContext vp56dsp
Definition: vp56.h:129
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:112
void ff_vp56_init_dequant(VP56Context *s, int quantizer)
Definition: vp56.c:34
bitstream reader API header.
static av_always_inline int vpX_rac_is_end(VP56RangeCoder *c)
vp5689 returns 1 if the end of the stream has been reached, 0 otherwise.
Definition: vp56.h:236
uint8_t * edge_emu_buffer
Definition: vp56.h:133
static av_always_inline int vp56_rac_get_tree(VP56RangeCoder *c, const VP56Tree *tree, const uint8_t *probs)
Definition: vp56.h:376
Inter MB, second vector, from golden frame.
Definition: vp56.h:58
VP56ParseCoeff parse_coeff
Definition: vp56.h:191
#define prob(name, subs,...)
Definition: cbs_vp9.c:374
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
static const uint16_t mask[17]
Definition: lzw.c:38
static void flip(AVCodecContext *avctx, AVFrame *frame)
Definition: rawdec.c:136
static av_always_inline int vp56_rac_get(VP56RangeCoder *c)
Definition: vp56.h:300
VP56mb
Definition: vp56.h:48
Definition: vp56.h:94
uint8_t type
Definition: vp56.h:101
uint8_t bits
Definition: vp3data.h:202
Inter MB, first vector, from previous frame.
Definition: vp56.h:52
int frbi
Definition: vp56.h:184
Definition: vlc.h:26
const uint8_t * end
Definition: vp56.h:90
Intra MB.
Definition: vp56.h:50
VP56RangeCoder cc
Definition: vp56.h:135
VP56Frame
Definition: vp56.h:40
VP56RangeCoder * ccp
Definition: vp56.h:136
int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size)
Definition: vp56rac.c:40
static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits)
Definition: vp56.h:363
Definition: vp56.h:61
VP56Context * alpha_context
Definition: vp56.h:198
Inter MB, first vector, from golden frame.
Definition: vp56.h:57
Half-pel DSP context.
Definition: hpeldsp.h:45
void(* VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src, int offset1, int offset2, ptrdiff_t stride, VP56mv mv, int mask, int select, int luma)
Definition: vp56.h:75
int8_t prob_idx
Definition: vp56.h:63
VP56RangeCoder c
Definition: vp56.h:134
static av_unused int vp8_rac_get_sint(VP56RangeCoder *c, int bits)
Definition: vp56.h:347
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
VP56ParseHeader parse_header
Definition: vp56.h:195
#define s(width, name)
Definition: cbs_vp9.c:257
int filter_selection
Definition: vp56.h:171
#define vp56_rac_get_prob
Definition: vp56.h:265
VP56Macroblock * macroblocks
Definition: vp56.h:159
VP56RefDc * above_blocks
Definition: vp56.h:152
VP56Frame ref_frame
Definition: vp56.h:96
static const int8_t mv[256][2]
Definition: 4xm.c:77
static av_always_inline int vp56_rac_get_prob_branchy(VP56RangeCoder *c, int prob)
Definition: vp56.h:282
Inter MB, 4 vectors, from previous frame.
Definition: vp56.h:56
int quantizer
Definition: vp56.h:147
int discard_frame
Definition: vp56.h:212
Half-pel DSP functions.
Inter MB, no vector, from golden frame.
Definition: vp56.h:54
int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s, int flip, int has_alpha)
Definition: vp56.c:782
Libavcodec external API header.
Inter MB, second vector, from previous frame.
Definition: vp56.h:53
main external API structure.
Definition: avcodec.h:1565
static av_always_inline unsigned int vp56_rac_renorm(VP56RangeCoder *c)
Definition: vp56.h:241
int ff_vp56_free(AVCodecContext *avctx)
Definition: vp56.c:835
uint8_t not_null_dc
Definition: vp56.h:95
int sub_version
Definition: vp56.h:137
void * buf
Definition: avisynth_c.h:766
int bits
Definition: vp56.h:87
VP56DefaultModelsInit default_models_init
Definition: vp56.h:192
int have_undamaged_frame
Definition: vp56.h:211
int8_t val
Definition: vp56.h:62
Inter MB, above/left vector + delta, from previous frame.
Definition: vp56.h:51
static av_always_inline int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob)
Definition: vp56.h:404
int sample_variance_threshold
Definition: vp56.h:174
int ff_vp56_free_context(VP56Context *s)
Definition: vp56.c:841
VideoDSPContext vdsp
Definition: vp56.h:127
const uint8_t ff_vp56_norm_shift[256]
vp56 specific range coder implementation
Definition: vp56rac.c:25
static int vp8_rac_get_uint(VP56RangeCoder *c, int bits)
Definition: vp56.h:335
Definition: vp56.h:66
int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: vp56.c:568
int srbi
Definition: vp56.h:185
const uint8_t * vp56_coord_div
Definition: vp56.h:188
int max_vector_length
Definition: vp56.h:173
GLint GLenum GLboolean GLsizei stride
Definition: opengl_enc.c:104
int
VP56mv mv
Definition: vp56.h:102
int filter_mode
Definition: vp56.h:172
int(* VP56ParseHeader)(VP56Context *s, const uint8_t *buf, int buf_size)
Definition: vp56.h:82
void(* VP56ParseVectorAdjustment)(VP56Context *s, VP56mv *vect)
Definition: vp56.h:73
int golden_frame
Definition: vp56.h:140
void(* VP56DefaultModelsInit)(VP56Context *s)
Definition: vp56.h:79
static av_always_inline int vp8_rac_get(VP56RangeCoder *c)
Definition: vp56.h:319
VP56Filter filter
Definition: vp56.h:190
Core video DSP helper functions.
int filter_header
Definition: vp56.h:169
int16_t dc_coeff
Definition: vp56.h:97
HpelDSPContext hdsp
Definition: vp56.h:126
Inter MB, above/left vector + delta, from golden frame.
Definition: vp56.h:55
VP56Model * modelp
Definition: vp56.h:200
int has_alpha
Definition: vp56.h:180
int flip
Definition: vp56.h:183
VP56Model model
Definition: vp56.h:201
uint8_t * edge_emu_buffer_alloc
Definition: vp56.h:132
static av_unused int vp8_rac_get_nn(VP56RangeCoder *c)
Definition: vp56.h:369
const uint8_t * buffer
Definition: vp56.h:89
#define av_always_inline
Definition: attributes.h:39
AVCodecContext * avctx
Definition: vp56.h:124
int high
Definition: vp56.h:86
#define stride
This structure stores compressed data.
Definition: avcodec.h:1454
#define av_unused
Definition: attributes.h:125
H264ChromaContext h264chroma
Definition: vp56.h:125
static int vp56_rac_gets(VP56RangeCoder *c, int bits)
Definition: vp56.h:324
GetBitContext gb
Definition: vp56.h:205