FFmpeg
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 Fiona 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 <stdatomic.h>
30 
31 #include "libavutil/buffer.h"
32 #include "libavutil/thread.h"
33 
34 #include "h264pred.h"
35 #include "thread.h"
36 #include "vp56.h"
37 #include "vp8dsp.h"
38 
39 #define VP8_MAX_QUANT 127
40 
41 enum dct_token {
54 
56 };
57 
58 // used to signal 4x4 intra pred in luma MBs
59 #define MODE_I4x4 4
60 
65 };
66 
68  VP8_SPLITMVMODE_16x8 = 0, ///< 2 16x8 blocks (vertical)
69  VP8_SPLITMVMODE_8x16, ///< 2 8x16 blocks (horizontal)
70  VP8_SPLITMVMODE_8x8, ///< 2x2 blocks of 8x8px each
71  VP8_SPLITMVMODE_4x4, ///< 4x4 blocks of 4x4px each
72  VP8_SPLITMVMODE_NONE, ///< (only used in prediction) no split MVs
73 };
74 
75 typedef struct VP8FilterStrength {
80 
81 typedef struct VP8Macroblock {
83  // TODO: make it possible to check for at least (i4x4 or split_mv)
84  // in one op. are others needed?
90  uint8_t intra4x4_pred_mode_mb[16];
91  DECLARE_ALIGNED(4, uint8_t, intra4x4_pred_mode_top)[4];
93  VP56mv bmv[16];
95 
96 typedef struct VP8intmv {
97  int x;
98  int y;
99 } VP8intmv;
100 
101 typedef struct VP8mvbounds {
104 } VP8mvbounds;
105 
106 typedef struct VP8ThreadData {
107  DECLARE_ALIGNED(16, int16_t, block)[6][4][16];
108  DECLARE_ALIGNED(16, int16_t, block_dc)[16];
109  /**
110  * This is the index plus one of the last non-zero coeff
111  * for each of the blocks in the current macroblock.
112  * So, 0 -> no coeffs
113  * 1 -> dc-only (special transform)
114  * 2+-> full transform
115  */
116  DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4];
117  /**
118  * For coeff decode, we need to know whether the above block had non-zero
119  * coefficients. This means for each macroblock, we need data for 4 luma
120  * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
121  * per macroblock. We keep the last row in top_nnz.
122  */
123  DECLARE_ALIGNED(8, uint8_t, left_nnz)[9];
125 #if HAVE_THREADS
128 #endif
129  atomic_int thread_mb_pos; // (mb_y << 16) | (mb_x & 0xFFFF)
130  atomic_int wait_mb_pos; // What the current thread is waiting on.
131 
132 #define EDGE_EMU_LINESIZE 32
133  DECLARE_ALIGNED(16, uint8_t, edge_emu_buffer)[21 * EDGE_EMU_LINESIZE];
136 } VP8ThreadData;
137 
138 typedef struct VP8Frame {
141 
144 } VP8Frame;
145 
146 #define MAX_THREADS 8
147 typedef struct VP8Context {
152 
153  VP8Frame *framep[4];
154  VP8Frame *next_framep[4];
157 
158  uint16_t mb_width; /* number of horizontal MB */
159  uint16_t mb_height; /* number of vertical MB */
160  ptrdiff_t linesize;
161  ptrdiff_t uvlinesize;
162 
168 
169  int8_t sign_bias[4]; ///< one state [0, 1] per ref frame type
170  int ref_count[3];
171 
172  /**
173  * Base parameters for segmentation, i.e. per-macroblock parameters.
174  * These must be kept unchanged even if segmentation is not used for
175  * a frame, since the values persist between interframes.
176  */
177  struct {
182  int8_t base_quant[4];
183  int8_t filter_level[4]; ///< base loop filter level
184  } segmentation;
185 
186  struct {
190  } filter;
191 
193 
195  uint8_t intra4x4_pred_mode_left[4];
196 
197  /**
198  * Macroblocks can have one of 4 different quants in a frame when
199  * segmentation is enabled.
200  * If segmentation is disabled, only the first segment's values are used.
201  */
202  struct {
203  // [0] - DC qmul [1] - AC qmul
204  int16_t luma_qmul[2];
205  int16_t luma_dc_qmul[2]; ///< luma dc-only block quant
206  int16_t chroma_qmul[2];
207  } qmat[4];
208 
209  // Raw quantisation values, which may be needed by hwaccel decode.
210  struct {
211  int yac_qi;
217  } quant;
218 
219  struct {
220  uint8_t enabled; ///< whether each mb can have a different strength based on mode/ref
222 
223  /**
224  * filter strength adjustment for the following macroblock modes:
225  * [0-3] - i16x16 (always zero)
226  * [4] - i4x4
227  * [5] - zero mv
228  * [6] - inter modes except for zero or split mv
229  * [7] - split mv
230  * i16x16 modes never have any adjustment
231  */
232  int8_t mode[VP8_MVMODE_SPLIT + 1];
233 
234  /**
235  * filter strength adjustment for macroblocks that reference:
236  * [0] - intra / VP56_FRAME_CURRENT
237  * [1] - VP56_FRAME_PREVIOUS
238  * [2] - VP56_FRAME_GOLDEN
239  * [3] - altref / VP56_FRAME_GOLDEN2
240  */
241  int8_t ref[4];
242  } lf_delta;
243 
244  uint8_t (*top_border)[16 + 8 + 8];
245  uint8_t (*top_nnz)[9];
246 
247  VP56RangeCoder c; ///< header context, includes mb modes and motion vectors
248 
249  /* This contains the entropy coder state at the end of the header
250  * block, in the form specified by the standard. For use by
251  * hwaccels, so that a hardware decoder has the information to
252  * start decoding at the macroblock layer.
253  */
254  struct {
255  const uint8_t *input;
256  uint32_t range;
257  uint32_t value;
259  } coder_state_at_header_end;
260 
262 
263  /**
264  * These are all of the updatable probabilities for binary decisions.
265  * They are only implicitly reset on keyframes, making it quite likely
266  * for an interframe to desync if a prior frame's header was corrupt
267  * or missing outright!
268  */
269  struct {
270  uint8_t segmentid[3];
275  uint8_t pred16x16[4];
276  uint8_t pred8x8c[3];
277  uint8_t token[4][16][3][NUM_DCT_TOKENS - 1];
278  uint8_t mvc[2][19];
279  uint8_t scan[16];
280  } prob[2];
281 
284  int update_last; ///< update VP56_FRAME_PREVIOUS with the current one
285  int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so
287 
288  /**
289  * If this flag is not set, all the probability updates
290  * are discarded after this frame is decoded.
291  */
293 
294  /**
295  * All coefficients are contained in separate arith coding contexts.
296  * There can be 1, 2, 4, or 8 of these after the header context.
297  */
299  VP56RangeCoder coeff_partition[8];
300  int coeff_partition_size[8];
304  vp8_mc_func put_pixels_tab[3][3][3];
306 
307  uint8_t colorspace; ///< 0 is the only value allowed (meaning bt601)
308  uint8_t fullrange; ///< whether we can skip clamping in dsp functions
309 
310  int num_jobs;
311  /**
312  * This describes the macroblock memory layout.
313  * 0 -> Only width+height*2+1 macroblocks allocated (frame/single thread).
314  * 1 -> Macroblocks for entire frame allocated (sliced thread).
315  */
317 
318  int (*decode_mb_row_no_filter)(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr);
319  void (*filter_mb_row)(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr);
320 
321  int vp7;
322 
323  /**
324  * Fade bit present in bitstream (VP7)
325  */
327 
328  /**
329  * Interframe DC prediction (VP7)
330  * [0] VP56_FRAME_PREVIOUS
331  * [1] VP56_FRAME_GOLDEN
332  */
333  uint16_t inter_dc_pred[2][2];
334 
335  /**
336  * Macroblock features (VP7)
337  */
338  uint8_t feature_enabled[4];
339  uint8_t feature_present_prob[4];
340  uint8_t feature_index_prob[4][3];
341  uint8_t feature_value[4][4];
342 } VP8Context;
343 
345 
346 int ff_vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
347  AVPacket *avpkt);
348 
350 
351 #endif /* AVCODEC_VP8_H */
const uint8_t * input
Definition: vp8.h:255
uint8_t golden
Definition: vp8.h:274
Definition: vp8.h:44
atomic_int wait_mb_pos
Definition: vp8.h:130
uint8_t inner_limit
Definition: vp8.h:77
VP8Macroblock * macroblocks
Definition: vp8.h:192
Definition: vp8.h:52
int ff_vp8_decode_free(AVCodecContext *avctx)
Definition: vp8.c:2816
static enum AVPixelFormat pix_fmt
Definition: vp8.h:45
(only used in prediction) no split MVs
Definition: vp8.h:72
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:100
VP5 and VP6 compatible video decoder (common features)
uint32_t value
Definition: vp8.h:257
ptrdiff_t linesize
Definition: vp8.h:160
uint8_t * intra4x4_pred_mode_top
Definition: vp8.h:194
uint8_t mbskip_enabled
Definition: vp8.h:165
int uvac_delta
Definition: vp8.h:216
uint8_t inner_filter
Definition: vp8.h:78
intptr_t atomic_int
Definition: stdatomic.h:55
if it could not because there are no more frames
uint8_t sharpness
Definition: vp8.h:189
2 16x8 blocks (vertical)
Definition: vp8.h:68
int update_probabilities
If this flag is not set, all the probability updates are discarded after this frame is decoded...
Definition: vp8.h:292
VP8intmv mv_min
Definition: vp8.h:102
inter_mvmode
Definition: vp8.h:61
int num_jobs
Definition: vp8.h:310
uint8_t update_map
Definition: vp8.h:180
uint16_t mb_height
Definition: vp8.h:159
int update_golden
VP56_FRAME_NONE if not updated, or which frame to copy if so.
Definition: vp8.h:285
static av_always_inline void filter_mb_row(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr, int is_vp7)
Definition: vp8.c:2498
Definition: vp8.h:96
The exact code depends on how similar the blocks are and how related they are to the block
uint8_t
ptrdiff_t uvlinesize
Definition: vp8.h:161
Definition: vp8.h:42
int fade_present
Fade bit present in bitstream (VP7)
Definition: vp8.h:326
uint8_t ref_frame
Definition: vp8.h:86
int ff_vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: vp8.c:2802
Multithreading support functions.
Definition: vp8.h:50
VP8 compatible video decoder.
VP56mv mv
Definition: vp8.h:92
Context for storing H.264 prediction functions.
Definition: h264pred.h:92
int update_last
update VP56_FRAME_PREVIOUS with the current one
Definition: vp8.h:284
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:112
int ydc_delta
Definition: vp8.h:212
VP8Frame * prev_frame
Definition: vp8.h:156
int num_coeff_partitions
All coefficients are contained in separate arith coding contexts.
Definition: vp8.h:298
#define prob(name, subs,...)
Definition: cbs_vp9.c:374
uint32_t range
Definition: vp8.h:256
uint8_t colorspace
0 is the only value allowed (meaning bt601)
Definition: vp8.h:307
H264PredContext hpc
Definition: vp8.h:303
Definition: vp8.h:138
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce 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
uint8_t absolute_vals
Definition: vp8.h:179
uint16_t mb_width
Definition: vp8.h:158
int y2dc_delta
Definition: vp8.h:213
uint8_t last
Definition: vp8.h:273
uint8_t mode
Definition: vp8.h:85
AVCodecContext * avctx
Definition: vp8.h:149
VP8mvbounds mv_bounds
Definition: vp8.h:167
#define EDGE_EMU_LINESIZE
Definition: vp8.h:132
VideoDSPContext vdsp
Definition: vp8.h:301
VP8Macroblock * macroblocks_base
Definition: vp8.h:282
Definition: vp8.h:47
int yac_qi
Definition: vp8.h:211
uint8_t keyframe
Definition: vp8.h:163
int x
Definition: vp8.h:97
4x4 blocks of 4x4px each
Definition: vp8.h:71
uint8_t deblock_filter
Definition: vp8.h:164
uint8_t fullrange
whether we can skip clamping in dsp functions
Definition: vp8.h:308
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
uint8_t mbskip
Definition: vp8.h:271
int y2ac_delta
Definition: vp8.h:214
VP8mvbounds mv_bounds
Definition: vp8.h:135
ThreadFrame tf
Definition: vp8.h:139
static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr, int is_vp7)
Definition: vp8.c:2358
int bit_count
Definition: vp8.h:258
uint8_t segment
Definition: vp8.h:89
Definition: vp8.h:49
VP8Frame * curframe
Definition: vp8.h:155
uint8_t simple
Definition: vp8.h:187
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:188
AVBufferRef * seg_map
Definition: vp8.h:140
Definition: vp8.h:53
main external API structure.
Definition: avcodec.h:1565
int mb_layout
This describes the macroblock memory layout.
Definition: vp8.h:316
VP56RangeCoder c
header context, includes mb modes and motion vectors
Definition: vp8.h:247
int y
Definition: vp8.h:98
uint8_t update
Definition: vp8.h:221
int vp7
Definition: vp8.h:321
AVBufferRef * hwaccel_priv_buf
Definition: vp8.h:142
VP8FilterStrength * filter_strength
Definition: vp8.h:134
uint8_t enabled
whether each mb can have a different strength based on mode/ref
Definition: vp8.h:178
dct_token
Definition: vp8.h:41
refcounted data buffer API
Definition: vp8.h:51
int actually_webp
Definition: vp8.h:151
int header_partition_size
Definition: vp8.h:261
uint8_t update_feature_data
Definition: vp8.h:181
Definition: vp8.h:43
const uint8_t * quant
H.264 / AVC / MPEG-4 prediction functions.
Definition: vp56.h:66
int ff_vp8_decode_init(AVCodecContext *avctx)
Definition: vp8.c:2887
int update_altref
Definition: vp8.h:286
void * hwaccel_picture_private
Definition: vp8.h:143
2 8x16 blocks (horizontal)
Definition: vp8.h:69
static pthread_mutex_t lock
Definition: ffjni.c:37
int(* cond)(enum AVPixelFormat pix_fmt)
Definition: pixdesc_query.c:28
A reference to a data buffer.
Definition: buffer.h:81
Definition: vp8.h:46
int
uint8_t partitioning
Definition: vp8.h:87
_fmutex pthread_mutex_t
Definition: os2threads.h:49
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
uint8_t chroma_pred_mode
Definition: vp8.h:88
VP8intmv mv_max
Definition: vp8.h:103
int uvdc_delta
Definition: vp8.h:215
Definition: vp8.h:48
int invisible
Definition: vp8.h:283
#define MODE_I4x4
Definition: vp8.h:59
VP8DSPContext vp8dsp
Definition: vp8.h:302
int thread_nr
Definition: vp8.h:124
inter_splitmvmode
Definition: vp8.h:67
uint8_t intra
Definition: vp8.h:272
uint8_t skip
Definition: vp8.h:82
atomic_int thread_mb_pos
Definition: vp8.h:129
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
This structure stores compressed data.
Definition: avcodec.h:1454
uint8_t profile
Definition: vp8.h:166
mode
Use these values in ebur128_init (or&#39;ed).
Definition: ebur128.h:83
VP8ThreadData * thread_data
Definition: vp8.h:148
2x2 blocks of 8x8px each
Definition: vp8.h:70
uint8_t filter_level
Definition: vp8.h:76