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