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