FFmpeg
vp8.h
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 {
42  DCT_0,
43  DCT_1,
44  DCT_2,
45  DCT_3,
46  DCT_4,
47  DCT_CAT1,
48  DCT_CAT2,
49  DCT_CAT3,
50  DCT_CAT4,
51  DCT_CAT5,
52  DCT_CAT6,
53  DCT_EOB,
54 
55  NUM_DCT_TOKENS
56 };
57 
58 // used to signal 4x4 intra pred in luma MBs
59 #define MODE_I4x4 4
60 
61 enum inter_mvmode {
62  VP8_MVMODE_ZERO = MODE_I4x4 + 1,
63  VP8_MVMODE_MV,
64  VP8_MVMODE_SPLIT
65 };
66 
67 enum inter_splitmvmode {
68  VP8_SPLITMVMODE_16x8 = 0,
69  VP8_SPLITMVMODE_8x16,
70  VP8_SPLITMVMODE_8x8,
71  VP8_SPLITMVMODE_4x4,
72  VP8_SPLITMVMODE_NONE,
73 };
74 
75 typedef struct VP8FilterStrength {
76  uint8_t filter_level;
77  uint8_t inner_limit;
78  uint8_t inner_filter;
80 
81 typedef struct VP8Macroblock {
82  uint8_t skip;
83  // TODO: make it possible to check for at least (i4x4 or split_mv)
84  // in one op. are others needed?
85  uint8_t mode;
86  uint8_t ref_frame;
87  uint8_t partitioning;
88  uint8_t chroma_pred_mode;
89  uint8_t segment;
90  uint8_t intra4x4_pred_mode_mb[16];
91  DECLARE_ALIGNED(4, uint8_t, intra4x4_pred_mode_top)[4];
92  VP56mv mv;
93  VP56mv bmv[16];
95 
96 typedef struct VP8intmv {
97  int x;
98  int y;
99 } VP8intmv;
100 
101 typedef struct VP8mvbounds {
102  VP8intmv mv_min;
103  VP8intmv mv_max;
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];
116  DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4];
123  DECLARE_ALIGNED(8, uint8_t, left_nnz)[9];
124  int thread_nr;
125 #if HAVE_THREADS
126  pthread_mutex_t lock;
127  pthread_cond_t cond;
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];
134  VP8FilterStrength *filter_strength;
135  VP8mvbounds mv_bounds;
136 } VP8ThreadData;
137 
138 typedef struct VP8Frame {
139  ThreadFrame tf;
140  AVBufferRef *seg_map;
141 
142  AVBufferRef *hwaccel_priv_buf;
143  void *hwaccel_picture_private;
144 } VP8Frame;
145 
146 #define MAX_THREADS 8
147 typedef struct VP8Context {
149  AVCodecContext *avctx;
150  enum AVPixelFormat pix_fmt;
151  int actually_webp;
152 
153  VP8Frame *framep[4];
154  VP8Frame *next_framep[4];
155  VP8Frame *curframe;
156  VP8Frame *prev_frame;
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 
163  uint8_t keyframe;
164  uint8_t deblock_filter;
165  uint8_t mbskip_enabled;
166  uint8_t profile;
167  VP8mvbounds mv_bounds;
168 
169  int8_t sign_bias[4];
170  int ref_count[3];
171 
177  struct {
178  uint8_t enabled;
179  uint8_t absolute_vals;
180  uint8_t update_map;
181  uint8_t update_feature_data;
182  int8_t base_quant[4];
183  int8_t filter_level[4];
184  } segmentation;
185 
186  struct {
187  uint8_t simple;
188  uint8_t level;
189  uint8_t sharpness;
190  } filter;
191 
192  VP8Macroblock *macroblocks;
193 
194  uint8_t *intra4x4_pred_mode_top;
195  uint8_t intra4x4_pred_mode_left[4];
196 
202  struct {
203  // [0] - DC qmul [1] - AC qmul
204  int16_t luma_qmul[2];
205  int16_t luma_dc_qmul[2];
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;
212  int ydc_delta;
213  int y2dc_delta;
214  int y2ac_delta;
215  int uvdc_delta;
216  int uvac_delta;
217  } quant;
218 
219  struct {
220  uint8_t enabled;
221  uint8_t update;
222 
232  int8_t mode[VP8_MVMODE_SPLIT + 1];
233 
241  int8_t ref[4];
242  } lf_delta;
243 
244  uint8_t (*top_border)[16 + 8 + 8];
245  uint8_t (*top_nnz)[9];
246 
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;
258  int bit_count;
259  } coder_state_at_header_end;
260 
261  int header_partition_size;
262 
269  struct {
270  uint8_t segmentid[3];
271  uint8_t mbskip;
272  uint8_t intra;
273  uint8_t last;
274  uint8_t golden;
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 
282  VP8Macroblock *macroblocks_base;
283  int invisible;
286  int update_altref;
287 
293 
299  VP56RangeCoder coeff_partition[8];
300  int coeff_partition_size[8];
301  VideoDSPContext vdsp;
302  VP8DSPContext vp8dsp;
303  H264PredContext hpc;
304  vp8_mc_func put_pixels_tab[3][3][3];
305  VP8Frame frames[5];
306 
307  uint8_t colorspace;
308  uint8_t fullrange;
309 
310  int num_jobs;
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 
327 
333  uint16_t inter_dc_pred[2][2];
334 
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 
344 int ff_vp8_decode_init(AVCodecContext *avctx);
345 
346 int ff_vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
347  AVPacket *avpkt);
348 
349 int ff_vp8_decode_free(AVCodecContext *avctx);
350 
351 #endif /* AVCODEC_VP8_H */
Definition: videodsp.h:41
VP5 and VP6 compatible video decoder (common features)
int update_probabilities
If this flag is not set, all the probability updates are discarded after this frame is decoded...
Definition: vp8.h:292
int update_golden
VP56_FRAME_NONE if not updated, or which frame to copy if so.
Definition: vp8.h:285
Definition: vp8.h:96
int fade_present
Fade bit present in bitstream (VP7)
Definition: vp8.h:326
VP8 compatible video decoder.
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:120
Definition: os2threads.h:54
int num_coeff_partitions
All coefficients are contained in separate arith coding contexts.
Definition: vp8.h:298
uint8_t colorspace
0 is the only value allowed (meaning bt601)
Definition: vp8.h:307
Definition: vp8.h:138
Definition: vf_nlmeans.c:357
Definition: hls.c:68
uint8_t fullrange
whether we can skip clamping in dsp functions
Definition: vp8.h:308
Definition: vp8.h:106
Definition: thread.h:34
Definition: vp8.h:75
main external API structure.
Definition: avcodec.h:1518
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
uint8_t enabled
whether each mb can have a different strength based on mode/ref
Definition: vp8.h:178
refcounted data buffer API
Definition: vp8.h:101
Definition: vp8.h:81
H.264 / AVC / MPEG-4 prediction functions.
Definition: vp56.h:66
A reference to a data buffer.
Definition: buffer.h:81
Definition: vp8dsp.h:37
Definition: vp56.h:85
Definition: vp8.h:147
AVPixelFormat
Pixel format.
Definition: pixfmt.h:60
This structure stores compressed data.
Definition: avcodec.h:1407
mode
Use these values in ebur128_init (or&#39;ed).
Definition: ebur128.h:83