vp8.h
Go to the documentation of this file.
1 /*
2  * VP8 compatible video decoder
3  *
4  * Copyright (C) 2010 David Conrad
5  * Copyright (C) 2010 Ronald S. Bultje
6  * Copyright (C) 2010 Jason Garrett-Glaser
7  * Copyright (C) 2012 Daniel Kang
8  *
9  * This file is part of FFmpeg.
10  *
11  * FFmpeg is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * FFmpeg is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with FFmpeg; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24  */
25 
26 #ifndef AVCODEC_VP8_H
27 #define AVCODEC_VP8_H
28 
29 #include "libavutil/buffer.h"
30 
31 #include "vp56.h"
32 #include "vp56data.h"
33 #include "vp8dsp.h"
34 #include "h264pred.h"
35 #include "thread.h"
36 #if HAVE_PTHREADS
37 #include <pthread.h>
38 #elif HAVE_W32THREADS
39 #include "w32pthreads.h"
40 #elif HAVE_OS2THREADS
41 #include "os2threads.h"
42 #endif
43 
44 #define VP8_MAX_QUANT 127
45 
46 enum dct_token {
59 
61 };
62 
63 // used to signal 4x4 intra pred in luma MBs
64 #define MODE_I4x4 4
65 
70 };
71 
73  VP8_SPLITMVMODE_16x8 = 0, ///< 2 16x8 blocks (vertical)
74  VP8_SPLITMVMODE_8x16, ///< 2 8x16 blocks (horizontal)
75  VP8_SPLITMVMODE_8x8, ///< 2x2 blocks of 8x8px each
76  VP8_SPLITMVMODE_4x4, ///< 4x4 blocks of 4x4px each
77  VP8_SPLITMVMODE_NONE, ///< (only used in prediction) no split MVs
78 };
79 
80 typedef struct VP8FilterStrength {
85 
86 typedef struct VP8Macroblock {
88  // todo: make it possible to check for at least (i4x4 or split_mv)
89  // in one op. are others needed?
95  uint8_t intra4x4_pred_mode_mb[16];
96  uint8_t intra4x4_pred_mode_top[4];
98  VP56mv bmv[16];
100 
101 typedef struct VP8ThreadData {
102  DECLARE_ALIGNED(16, int16_t, block)[6][4][16];
103  DECLARE_ALIGNED(16, int16_t, block_dc)[16];
104  /**
105  * This is the index plus one of the last non-zero coeff
106  * for each of the blocks in the current macroblock.
107  * So, 0 -> no coeffs
108  * 1 -> dc-only (special transform)
109  * 2+-> full transform
110  */
111  DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4];
112  /**
113  * For coeff decode, we need to know whether the above block had non-zero
114  * coefficients. This means for each macroblock, we need data for 4 luma
115  * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
116  * per macroblock. We keep the last row in top_nnz.
117  */
118  DECLARE_ALIGNED(8, uint8_t, left_nnz)[9];
120 #if HAVE_THREADS
121  pthread_mutex_t lock;
122  pthread_cond_t cond;
123 #endif
124  int thread_mb_pos; // (mb_y << 16) | (mb_x & 0xFFFF)
125  int wait_mb_pos; // What the current thread is waiting on.
128 } VP8ThreadData;
129 
130 typedef struct VP8Frame {
133 } VP8Frame;
134 
135 #define MAX_THREADS 8
136 typedef struct VP8Context {
139  VP8Frame *framep[4];
140  VP8Frame *next_framep[4];
143 
144  uint16_t mb_width; /* number of horizontal MB */
145  uint16_t mb_height; /* number of vertical MB */
146  int linesize;
148 
155 
156  int8_t sign_bias[4]; ///< one state [0, 1] per ref frame type
157  int ref_count[3];
158 
159  /**
160  * Base parameters for segmentation, i.e. per-macroblock parameters.
161  * These must be kept unchanged even if segmentation is not used for
162  * a frame, since the values persist between interframes.
163  */
164  struct {
168  int8_t base_quant[4];
169  int8_t filter_level[4]; ///< base loop filter level
170  } segmentation;
171 
172  struct {
176  } filter;
177 
179 
181  uint8_t intra4x4_pred_mode_left[4];
182 
183  /**
184  * Macroblocks can have one of 4 different quants in a frame when
185  * segmentation is enabled.
186  * If segmentation is disabled, only the first segment's values are used.
187  */
188  struct {
189  // [0] - DC qmul [1] - AC qmul
190  int16_t luma_qmul[2];
191  int16_t luma_dc_qmul[2]; ///< luma dc-only block quant
192  int16_t chroma_qmul[2];
193  } qmat[4];
194 
195  struct {
196  uint8_t enabled; ///< whether each mb can have a different strength based on mode/ref
197 
198  /**
199  * filter strength adjustment for the following macroblock modes:
200  * [0-3] - i16x16 (always zero)
201  * [4] - i4x4
202  * [5] - zero mv
203  * [6] - inter modes except for zero or split mv
204  * [7] - split mv
205  * i16x16 modes never have any adjustment
206  */
208 
209  /**
210  * filter strength adjustment for macroblocks that reference:
211  * [0] - intra / VP56_FRAME_CURRENT
212  * [1] - VP56_FRAME_PREVIOUS
213  * [2] - VP56_FRAME_GOLDEN
214  * [3] - altref / VP56_FRAME_GOLDEN2
215  */
216  int8_t ref[4];
217  } lf_delta;
218 
219  uint8_t (*top_border)[16+8+8];
220  uint8_t (*top_nnz)[9];
221 
222  VP56RangeCoder c; ///< header context, includes mb modes and motion vectors
223 
224  /**
225  * These are all of the updatable probabilities for binary decisions.
226  * They are only implictly reset on keyframes, making it quite likely
227  * for an interframe to desync if a prior frame's header was corrupt
228  * or missing outright!
229  */
230  struct {
231  uint8_t segmentid[3];
236  uint8_t pred16x16[4];
237  uint8_t pred8x8c[3];
238  uint8_t token[4][16][3][NUM_DCT_TOKENS-1];
239  uint8_t mvc[2][19];
240  } prob[2];
241 
244  int update_last; ///< update VP56_FRAME_PREVIOUS with the current one
245  int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so
247 
248  /**
249  * If this flag is not set, all the probability updates
250  * are discarded after this frame is decoded.
251  */
253 
254  /**
255  * All coefficients are contained in separate arith coding contexts.
256  * There can be 1, 2, 4, or 8 of these after the header context.
257  */
259  VP56RangeCoder coeff_partition[8];
263  vp8_mc_func put_pixels_tab[3][3][3];
265 
266  int num_jobs;
267  /**
268  * This describes the macroblock memory layout.
269  * 0 -> Only width+height*2+1 macroblocks allocated (frame/single thread).
270  * 1 -> Macroblocks for entire frame alloced (sliced thread).
271  */
273 } VP8Context;
274 
275 #endif /* AVCODEC_VP8_H */
uint8_t golden
Definition: vp8.h:235
Definition: vp8.h:49
uint8_t inner_limit
Definition: vp8.h:82
VP8Macroblock * macroblocks
Definition: vp8.h:178
Definition: vp8.h:57
Definition: vp8.h:50
(only used in prediction) no split MVs
Definition: vp8.h:77
FIXME Range Coding of cr are ref
Definition: snow.txt:367
VP56mv mv_min
Definition: vp8.h:153
VP5 and VP6 compatible video decoder (common features)
uint8_t * intra4x4_pred_mode_top
Definition: vp8.h:180
uint8_t mbskip_enabled
Definition: vp8.h:151
struct VP8Macroblock VP8Macroblock
int linesize
Definition: vp8.h:146
struct VP8Frame VP8Frame
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:59
os2threads to pthreads wrapper
uint8_t inner_filter
Definition: vp8.h:83
uint8_t sharpness
Definition: vp8.h:175
2 16x8 blocks (vertical)
Definition: vp8.h:73
int update_probabilities
If this flag is not set, all the probability updates are discarded after this frame is decoded...
Definition: vp8.h:252
struct VP8FilterStrength VP8FilterStrength
inter_mvmode
Definition: vp8.h:66
int num_jobs
Definition: vp8.h:266
uint8_t update_map
Definition: vp8.h:167
uint16_t mb_height
Definition: vp8.h:145
int update_golden
VP56_FRAME_NONE if not updated, or which frame to copy if so.
Definition: vp8.h:245
HMTX pthread_mutex_t
Definition: os2threads.h:38
uint8_t
Definition: vp8.h:47
mode
Definition: f_perms.c:27
uint8_t ref_frame
Definition: vp8.h:91
Definition: vp8.h:55
VP8 compatible video decoder.
VP56mv mv
Definition: vp8.h:97
Context for storing H.264 prediction functions.
Definition: h264pred.h:92
the mask is usually to keep the same permissions Filters should remove permissions on reference they give to output whenever necessary It can be automatically done by setting the rej_perms field on the output pad Here are a few guidelines corresponding to common then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
int update_last
update VP56_FRAME_PREVIOUS with the current one
Definition: vp8.h:244
VP8Frame * prev_frame
Definition: vp8.h:142
int num_coeff_partitions
All coefficients are contained in separate arith coding contexts.
Definition: vp8.h:258
struct VP8ThreadData VP8ThreadData
H264PredContext hpc
Definition: vp8.h:262
Definition: vp8.h:130
uint8_t absolute_vals
Definition: vp8.h:166
uint16_t mb_width
Definition: vp8.h:144
Multithreading support functions.
uint8_t last
Definition: vp8.h:234
uint8_t mode
Definition: vp8.h:90
AVCodecContext * avctx
Definition: vp8.h:138
VideoDSPContext vdsp
Definition: vp8.h:260
VP8Macroblock * macroblocks_base
Definition: vp8.h:242
Definition: vp8.h:52
uint8_t keyframe
Definition: vp8.h:149
VP5 and VP6 compatible video decoder (common data)
4x4 blocks of 4x4px each
Definition: vp8.h:76
uint8_t deblock_filter
Definition: vp8.h:150
uint8_t mbskip
Definition: vp8.h:232
if it could not because there are no more frames
ThreadFrame tf
Definition: vp8.h:131
uint8_t * edge_emu_buffer
Definition: vp8.h:126
uint8_t segment
Definition: vp8.h:94
Definition: vp8.h:54
VP8Frame * curframe
Definition: vp8.h:141
uint8_t simple
Definition: vp8.h:173
void(* vp8_mc_func)(uint8_t *dst, ptrdiff_t dstStride, uint8_t *src, ptrdiff_t srcStride, int h, int x, int y)
Definition: vp8dsp.h:33
uint8_t level
Definition: vp8.h:174
AVBufferRef * seg_map
Definition: vp8.h:132
Definition: vp8.h:58
main external API structure.
int mb_layout
This describes the macroblock memory layout.
Definition: vp8.h:272
VP56RangeCoder c
header context, includes mb modes and motion vectors
Definition: vp8.h:222
VP8FilterStrength * filter_strength
Definition: vp8.h:127
uint8_t enabled
whether each mb can have a different strength based on mode/ref
Definition: vp8.h:165
struct VP8Context VP8Context
dct_token
Definition: vp8.h:46
refcounted data buffer API
Definition: vp8.h:56
int uvlinesize
Definition: vp8.h:147
VP56mv mv_max
Definition: vp8.h:154
Definition: vp8.h:48
H.264 / AVC / MPEG4 prediction functions.
Definition: vp56.h:41
int update_altref
Definition: vp8.h:246
2 8x16 blocks (horizontal)
Definition: vp8.h:74
A reference to a data buffer.
Definition: buffer.h:81
Definition: vp8.h:51
uint8_t partitioning
Definition: vp8.h:92
int wait_mb_pos
Definition: vp8.h:125
uint8_t chroma_pred_mode
Definition: vp8.h:93
Definition: vp8.h:53
int invisible
Definition: vp8.h:243
#define MODE_I4x4
Definition: vp8.h:64
VP8DSPContext vp8dsp
Definition: vp8.h:261
int thread_nr
Definition: vp8.h:119
inter_splitmvmode
Definition: vp8.h:72
w32threads to pthreads wrapper
uint8_t intra
Definition: vp8.h:233
uint8_t skip
Definition: vp8.h:87
uint8_t profile
Definition: vp8.h:152
VP8ThreadData * thread_data
Definition: vp8.h:137
int thread_mb_pos
Definition: vp8.h:124
2x2 blocks of 8x8px each
Definition: vp8.h:75
uint8_t filter_level
Definition: vp8.h:81