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 "h264chroma.h"
35 #include "videodsp.h"
36 #include "vp3dsp.h"
37 #include "vp56dsp.h"
38 #include "vpx_rac.h"
39 
40 typedef struct vp56_context VP56Context;
41 
42 typedef enum {
47 } VP56Frame;
48 
49 typedef enum {
50  VP56_MB_INTER_NOVEC_PF = 0, /**< Inter MB, no vector, from previous frame */
51  VP56_MB_INTRA = 1, /**< Intra MB */
52  VP56_MB_INTER_DELTA_PF = 2, /**< Inter MB, above/left vector + delta, from previous frame */
53  VP56_MB_INTER_V1_PF = 3, /**< Inter MB, first vector, from previous frame */
54  VP56_MB_INTER_V2_PF = 4, /**< Inter MB, second vector, from previous frame */
55  VP56_MB_INTER_NOVEC_GF = 5, /**< Inter MB, no vector, from golden frame */
56  VP56_MB_INTER_DELTA_GF = 6, /**< Inter MB, above/left vector + delta, from golden frame */
57  VP56_MB_INTER_4V = 7, /**< Inter MB, 4 vectors, from previous frame */
58  VP56_MB_INTER_V1_GF = 8, /**< Inter MB, first vector, from golden frame */
59  VP56_MB_INTER_V2_GF = 9, /**< Inter MB, second vector, from golden frame */
60 } VP56mb;
61 
62 typedef struct VP56Tree {
63  int8_t val;
64  int8_t prob_idx;
65 } VP56Tree;
66 
67 typedef struct VP56mv {
68  DECLARE_ALIGNED(4, int16_t, x);
69  int16_t y;
70 } VP56mv;
71 
72 #define VP56_SIZE_CHANGE 1
73 
74 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
75  VP56mv *vect);
76 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
77  int offset1, int offset2, ptrdiff_t stride,
78  VP56mv mv, int mask, int select, int luma);
79 typedef int (*VP56ParseCoeff)(VP56Context *s);
80 typedef void (*VP56DefaultModelsInit)(VP56Context *s);
81 typedef void (*VP56ParseVectorModels)(VP56Context *s);
82 typedef int (*VP56ParseCoeffModels)(VP56Context *s);
83 typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf,
84  int buf_size);
85 
86 typedef struct VP56RefDc {
87  uint8_t not_null_dc;
89  int16_t dc_coeff;
90 } VP56RefDc;
91 
92 typedef struct VP56Macroblock {
93  uint8_t type;
96 
97 typedef struct VP56Model {
98  uint8_t coeff_reorder[64]; /* used in vp6 only */
99  uint8_t coeff_index_to_pos[64]; /* used in vp6 only */
100  uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */
101  uint8_t vector_sig[2]; /* delta sign */
102  uint8_t vector_dct[2]; /* delta coding types */
103  uint8_t vector_pdi[2][2]; /* predefined delta init */
104  uint8_t vector_pdv[2][7]; /* predefined delta values */
105  uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */
106  uint8_t coeff_dccv[2][11]; /* DC coeff value */
107  uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */
108  uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */
109  uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */
110  uint8_t coeff_runv[2][14]; /* run value (vp6 only) */
111  uint8_t mb_type[3][10][10]; /* model for decoding MB type */
112  uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */
113 } VP56Model;
114 
115 struct vp56_context {
122  uint8_t idct_scantable[64];
125  uint8_t *edge_emu_buffer;
130 
131  /* frame info */
133  int plane_width[4];
134  int plane_height[4];
135  int mb_width; /* number of horizontal MB */
136  int mb_height; /* number of vertical MB */
137  int block_offset[6];
138 
140  uint16_t dequant_dc;
141  uint16_t dequant_ac;
142 
143  /* DC predictors management */
147  int16_t prev_dc[3][3]; /* [plan][ref_frame] */
148 
149  /* blocks / macroblock */
152  DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64];
154  const uint8_t *def_coeff_reorder;/* used in vp6 only */
155 
156  /* motion vectors */
157  VP56mv mv[6]; /* vectors for each block in MB */
160 
161  /* filtering hints */
162  int filter_header; /* used in vp6 only */
169 
170  uint8_t coeff_ctx[4][64]; /* used in vp5 only */
171  uint8_t coeff_ctx_last[4]; /* used in vp5 only */
172 
174 
175  /* interlacing params */
177  int il_prob;
178  int il_block;
179 
180  /* upside-down flipping hints */
181  int flip; /* are we flipping ? */
182  int frbi; /* first row block index in MB */
183  int srbi; /* second row block index in MB */
184  ptrdiff_t stride[4]; /* stride for each plan */
185 
186  const uint8_t *vp56_coord_div;
194 
195  /* for "slice" parallelism between YUV and A */
196  VP56Context *alpha_context;
197 
200 
201  /* huffman decoding */
206  VLC ract_vlc[2][3][6];
207  unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */
208 
211 };
212 
213 
214 /**
215  * Initializes an VP56Context. Expects its caller to clean up
216  * in case of error.
217  */
218 int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s,
219  int flip, int has_alpha);
220 int ff_vp56_free_context(VP56Context *s);
221 void ff_vp56_init_dequant(VP56Context *s, int quantizer);
223  int *got_frame, AVPacket *avpkt);
224 
225 
226 /**
227  * vp56 specific range coder implementation
228  */
229 
231 {
232  int value = 0;
233 
234  while (bits--) {
235  value = (value << 1) | vpx_rac_get(c);
236  }
237 
238  return value;
239 }
240 
241 // P(7)
243 {
244  int v = vp56_rac_gets(c, 7) << 1;
245  return v + !v;
246 }
247 
248 static av_always_inline
250  const VP56Tree *tree,
251  const uint8_t *probs)
252 {
253  while (tree->val > 0) {
254  if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx]))
255  tree += tree->val;
256  else
257  tree++;
258  }
259  return -tree->val;
260 }
261 
262 #endif /* AVCODEC_VP56_H */
vp56_context::h264chroma
H264ChromaContext h264chroma
Definition: vp56.h:117
vp56_rac_get_tree
static av_always_inline int vp56_rac_get_tree(VPXRangeCoder *c, const VP56Tree *tree, const uint8_t *probs)
Definition: vp56.h:249
vp56_context::block_coeff
int16_t block_coeff[6][64]
Definition: vp56.h:152
ff_vp56_init_context
int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s, int flip, int has_alpha)
Initializes an VP56Context.
Definition: vp56.c:819
vp56_context::dequant_ac
uint16_t dequant_ac
Definition: vp56.h:141
vp56_context
Definition: vp56.h:115
vp56_context::hdsp
HpelDSPContext hdsp
Definition: vp56.h:118
VP56mv::x
int16_t x
Definition: vp56.h:68
VP3DSPContext
Definition: vp3dsp.h:25
VP56_MB_INTER_DELTA_GF
@ VP56_MB_INTER_DELTA_GF
Inter MB, above/left vector + delta, from golden frame.
Definition: vp56.h:56
vp56_context::modelp
VP56Model * modelp
Definition: vp56.h:198
mem_internal.h
vp56_context::max_vector_length
int max_vector_length
Definition: vp56.h:166
VP56ParseHeader
int(* VP56ParseHeader)(VP56Context *s, const uint8_t *buf, int buf_size)
Definition: vp56.h:83
VP56Model::mb_types_stats
uint8_t mb_types_stats[3][10][2]
Definition: vp56.h:112
VP56Model::coeff_acct
uint8_t coeff_acct[2][3][3][6][5]
Definition: vp56.h:108
VP56_MB_INTER_V2_GF
@ VP56_MB_INTER_V2_GF
Inter MB, second vector, from golden frame.
Definition: vp56.h:59
vp56_context::vector_candidate_pos
int vector_candidate_pos
Definition: vp56.h:159
vp56_context::stride
ptrdiff_t stride[4]
Definition: vp56.h:184
mv
static const int8_t mv[256][2]
Definition: 4xm.c:81
vp56_context::golden_frame
int golden_frame
Definition: vp56.h:132
VP56Filter
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:76
av_unused
#define av_unused
Definition: attributes.h:131
mask
int mask
Definition: mediacodecdec_common.c:154
vp3dsp.h
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
vp56_context::vector_candidate
VP56mv vector_candidate[2]
Definition: vp56.h:158
VP56RefDc::not_null_dc
uint8_t not_null_dc
Definition: vp56.h:87
VP56RefDc::ref_frame
VP56Frame ref_frame
Definition: vp56.h:88
vp56_context::dequant_dc
uint16_t dequant_dc
Definition: vp56.h:140
vp56_context::gb
GetBitContext gb
Definition: vp56.h:203
vp56_context::edge_emu_buffer_alloc
uint8_t * edge_emu_buffer_alloc
Definition: vp56.h:124
vp56_context::edge_emu_buffer
uint8_t * edge_emu_buffer
Definition: vp56.h:125
VP56Model::coeff_index_to_pos
uint8_t coeff_index_to_pos[64]
Definition: vp56.h:99
vp56_context::parse_coeff
VP56ParseCoeff parse_coeff
Definition: vp56.h:189
VP56Model::coeff_ract
uint8_t coeff_ract[2][3][6][11]
Definition: vp56.h:107
VPXRangeCoder
Definition: vpx_rac.h:35
vp56_context::vp3dsp
VP3DSPContext vp3dsp
Definition: vp56.h:120
vp56_context::prev_dc
int16_t prev_dc[3][3]
Definition: vp56.h:147
VP56_MB_INTRA
@ VP56_MB_INTRA
Intra MB.
Definition: vp56.h:51
VP56ParseCoeffModels
int(* VP56ParseCoeffModels)(VP56Context *s)
Definition: vp56.h:82
VP56RefDc
Definition: vp56.h:86
VP56ParseVectorAdjustment
void(* VP56ParseVectorAdjustment)(VP56Context *s, VP56mv *vect)
Definition: vp56.h:74
vp56_context::il_prob
int il_prob
Definition: vp56.h:177
vp56_context::vp56dsp
VP56DSPContext vp56dsp
Definition: vp56.h:121
GetBitContext
Definition: get_bits.h:108
VP56_MB_INTER_NOVEC_PF
@ VP56_MB_INTER_NOVEC_PF
Inter MB, no vector, from previous frame.
Definition: vp56.h:50
vp56_context::frames
AVFrame * frames[4]
Definition: vp56.h:123
vp56_context::use_huffman
int use_huffman
Definition: vp56.h:202
VP56Macroblock::type
uint8_t type
Definition: vp56.h:93
VP56_MB_INTER_V1_PF
@ VP56_MB_INTER_V1_PF
Inter MB, first vector, from previous frame.
Definition: vp56.h:53
VP56RefDc::dc_coeff
int16_t dc_coeff
Definition: vp56.h:89
VP56ParseCoeff
int(* VP56ParseCoeff)(VP56Context *s)
Definition: vp56.h:79
vp56_context::dccv_vlc
VLC dccv_vlc[2]
Definition: vp56.h:204
vp56_rac_gets_nn
static av_unused int vp56_rac_gets_nn(VPXRangeCoder *c, int bits)
Definition: vp56.h:242
VP56Model::mb_type
uint8_t mb_type[3][10][10]
Definition: vp56.h:111
vp56_context::frbi
int frbi
Definition: vp56.h:182
s
#define s(width, name)
Definition: cbs_vp9.c:198
VP56_MB_INTER_4V
@ VP56_MB_INTER_4V
Inter MB, 4 vectors, from previous frame.
Definition: vp56.h:57
vp56_context::mb_width
int mb_width
Definition: vp56.h:135
bits
uint8_t bits
Definition: vp3data.h:128
vp56_context::nb_null
unsigned int nb_null[2][2]
Definition: vp56.h:207
get_bits.h
VP56mv::y
int16_t y
Definition: vp56.h:69
VP56mv
Definition: vp56.h:67
VP56Model::coeff_dccv
uint8_t coeff_dccv[2][11]
Definition: vp56.h:106
VP56Model::coeff_dcct
uint8_t coeff_dcct[2][36][5]
Definition: vp56.h:109
VP56Model::vector_sig
uint8_t vector_sig[2]
Definition: vp56.h:101
VP56Model::coeff_runv
uint8_t coeff_runv[2][14]
Definition: vp56.h:110
VP56DefaultModelsInit
void(* VP56DefaultModelsInit)(VP56Context *s)
Definition: vp56.h:80
VP56_MB_INTER_DELTA_PF
@ VP56_MB_INTER_DELTA_PF
Inter MB, above/left vector + delta, from previous frame.
Definition: vp56.h:52
vp56_context::quantizer
int quantizer
Definition: vp56.h:139
vp56_context::plane_height
int plane_height[4]
Definition: vp56.h:134
VP56_MB_INTER_NOVEC_GF
@ VP56_MB_INTER_NOVEC_GF
Inter MB, no vector, from golden frame.
Definition: vp56.h:55
VP56_MB_INTER_V2_PF
@ VP56_MB_INTER_V2_PF
Inter MB, second vector, from previous frame.
Definition: vp56.h:54
vp56_context::interlaced
int interlaced
Definition: vp56.h:176
vp56_context::block_offset
int block_offset[6]
Definition: vp56.h:137
vp56_context::alpha_context
VP56Context * alpha_context
Definition: vp56.h:196
VP56Tree::prob_idx
int8_t prob_idx
Definition: vp56.h:64
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
vp56_context::il_block
int il_block
Definition: vp56.h:178
vp56_context::default_models_init
VP56DefaultModelsInit default_models_init
Definition: vp56.h:190
VP56Macroblock
Definition: vp56.h:92
HpelDSPContext
Half-pel DSP context.
Definition: hpeldsp.h:45
VP56Tree
Definition: vp56.h:62
VP56DSPContext
Definition: vp56dsp.h:27
flip
static void flip(AVCodecContext *avctx, AVFrame *frame)
Definition: rawdec.c:131
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:109
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
vp56_context::def_coeff_reorder
const uint8_t * def_coeff_reorder
Definition: vp56.h:154
vp56_context::filter_selection
int filter_selection
Definition: vp56.h:164
vp56_context::vdsp
VideoDSPContext vdsp
Definition: vp56.h:119
h264chroma.h
vp56_context::above_blocks
VP56RefDc * above_blocks
Definition: vp56.h:144
vp56_context::filter_header
int filter_header
Definition: vp56.h:162
VP56Tree::val
int8_t val
Definition: vp56.h:63
VP56Macroblock::mv
VP56mv mv
Definition: vp56.h:94
vp56_context::sample_variance_threshold
int sample_variance_threshold
Definition: vp56.h:167
VP56_FRAME_NONE
@ VP56_FRAME_NONE
Definition: vp56.h:43
VP56ParseVectorModels
void(* VP56ParseVectorModels)(VP56Context *s)
Definition: vp56.h:81
vp56_rac_gets
static int vp56_rac_gets(VPXRangeCoder *c, int bits)
vp56 specific range coder implementation
Definition: vp56.h:230
vp56_context::model
VP56Model model
Definition: vp56.h:199
vp56_context::discard_frame
int discard_frame
Definition: vp56.h:210
VP56Model::coeff_index_to_idct_selector
uint8_t coeff_index_to_idct_selector[64]
Definition: vp56.h:100
vp56_context::filter_mode
int filter_mode
Definition: vp56.h:165
vp56_context::ccp
VPXRangeCoder * ccp
Definition: vp56.h:128
VP56_MB_INTER_V1_GF
@ VP56_MB_INTER_V1_GF
Inter MB, first vector, from golden frame.
Definition: vp56.h:58
VP56Model::vector_pdi
uint8_t vector_pdi[2][2]
Definition: vp56.h:103
vp56_context::runv_vlc
VLC runv_vlc[2]
Definition: vp56.h:205
vp56_context::avctx
AVCodecContext * avctx
Definition: vp56.h:116
vp56_context::ract_vlc
VLC ract_vlc[2][3][6]
Definition: vp56.h:206
vp56dsp.h
ff_vp56_init_dequant
void ff_vp56_init_dequant(VP56Context *s, int quantizer)
Definition: vp56.c:36
vp56_context::have_undamaged_frame
int have_undamaged_frame
Definition: vp56.h:209
vpx_rac.h
VP56_FRAME_GOLDEN
@ VP56_FRAME_GOLDEN
Definition: vp56.h:46
vp56_context::parse_header
VP56ParseHeader parse_header
Definition: vp56.h:193
vp56_context::coeff_ctx
uint8_t coeff_ctx[4][64]
Definition: vp56.h:170
vp56_context::mv
VP56mv mv[6]
Definition: vp56.h:157
av_always_inline
#define av_always_inline
Definition: attributes.h:49
value
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 default value
Definition: writing_filters.txt:86
vpx_rac_get_prob_branchy
static av_always_inline int vpx_rac_get_prob_branchy(VPXRangeCoder *c, int prob)
Definition: vpx_rac.h:99
VP56mb
VP56mb
Definition: vp56.h:49
vp56_context::has_alpha
int has_alpha
Definition: vp56.h:173
vp56_context::macroblocks
VP56Macroblock * macroblocks
Definition: vp56.h:151
avcodec.h
stride
#define stride
Definition: h264pred_template.c:537
VP56Frame
VP56Frame
Definition: vp56.h:42
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
vp56_context::above_block_idx
int above_block_idx[6]
Definition: vp56.h:146
vp56_context::flip
int flip
Definition: vp56.h:181
vp56_context::plane_width
int plane_width[4]
Definition: vp56.h:133
vp56_context::idct_scantable
uint8_t idct_scantable[64]
Definition: vp56.h:122
VP56Model::vector_fdv
uint8_t vector_fdv[2][8]
Definition: vp56.h:105
VP56_FRAME_CURRENT
@ VP56_FRAME_CURRENT
Definition: vp56.h:44
AVCodecContext
main external API structure.
Definition: avcodec.h:451
vp56_context::idct_selector
int idct_selector[6]
Definition: vp56.h:153
VP56Model
Definition: vp56.h:97
VP56_FRAME_PREVIOUS
@ VP56_FRAME_PREVIOUS
Definition: vp56.h:45
VLC
Definition: vlc.h:36
vp56_context::deblock_filtering
int deblock_filtering
Definition: vp56.h:163
vp56_context::sub_version
int sub_version
Definition: vp56.h:129
VideoDSPContext
Definition: videodsp.h:40
vp56_context::c
VPXRangeCoder c
Definition: vp56.h:126
vpx_rac_get
static av_always_inline int vpx_rac_get(VPXRangeCoder *c)
Definition: vpx_rac.h:117
vp56_context::bounding_values_array
int bounding_values_array[256]
Definition: vp56.h:168
H264ChromaContext
Definition: h264chroma.h:27
ff_vp56_free_context
int ff_vp56_free_context(VP56Context *s)
Definition: vp56.c:870
AVPacket
This structure stores compressed data.
Definition: packet.h:516
videodsp.h
VP56Model::vector_dct
uint8_t vector_dct[2]
Definition: vp56.h:102
ff_vp56_decode_frame
int ff_vp56_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
Definition: vp56.c:607
vp56_context::parse_coeff_models
VP56ParseCoeffModels parse_coeff_models
Definition: vp56.h:192
hpeldsp.h
vp56_context::parse_vector_models
VP56ParseVectorModels parse_vector_models
Definition: vp56.h:191
vp56_context::coeff_ctx_last
uint8_t coeff_ctx_last[4]
Definition: vp56.h:171
vp56_context::srbi
int srbi
Definition: vp56.h:183
vp56_context::vp56_coord_div
const uint8_t * vp56_coord_div
Definition: vp56.h:186
vp56_context::cc
VPXRangeCoder cc
Definition: vp56.h:127
vp56_context::left_block
VP56RefDc left_block[4]
Definition: vp56.h:145
vp56_context::filter
VP56Filter filter
Definition: vp56.h:188
vp56_context::mb_height
int mb_height
Definition: vp56.h:136
src
#define src
Definition: vp8dsp.c:248
VP56Model::vector_pdv
uint8_t vector_pdv[2][7]
Definition: vp56.h:104
vp56_context::mb_type
VP56mb mb_type
Definition: vp56.h:150
VP56Model::coeff_reorder
uint8_t coeff_reorder[64]
Definition: vp56.h:98
vp56_context::parse_vector_adjustment
VP56ParseVectorAdjustment parse_vector_adjustment
Definition: vp56.h:187