VP8: split out declarations to new header
[libav.git] / libavcodec / vp8.h
CommitLineData
bcf4568f
JGG
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 *
8 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25#ifndef AVCODEC_VP8_H
26#define AVCODEC_VP8_H
27
28#include "vp56.h"
29#include "vp56data.h"
30#include "vp8dsp.h"
31#include "h264pred.h"
32
33#define VP8_MAX_QUANT 127
34
35enum dct_token {
36 DCT_0,
37 DCT_1,
38 DCT_2,
39 DCT_3,
40 DCT_4,
41 DCT_CAT1,
42 DCT_CAT2,
43 DCT_CAT3,
44 DCT_CAT4,
45 DCT_CAT5,
46 DCT_CAT6,
47 DCT_EOB,
48
49 NUM_DCT_TOKENS
50};
51
52// used to signal 4x4 intra pred in luma MBs
53#define MODE_I4x4 4
54
55enum inter_mvmode {
56 VP8_MVMODE_ZERO = MODE_I4x4 + 1,
57 VP8_MVMODE_MV,
58 VP8_MVMODE_SPLIT
59};
60
61enum inter_splitmvmode {
62 VP8_SPLITMVMODE_16x8 = 0, ///< 2 16x8 blocks (vertical)
63 VP8_SPLITMVMODE_8x16, ///< 2 8x16 blocks (horizontal)
64 VP8_SPLITMVMODE_8x8, ///< 2x2 blocks of 8x8px each
65 VP8_SPLITMVMODE_4x4, ///< 4x4 blocks of 4x4px each
66 VP8_SPLITMVMODE_NONE, ///< (only used in prediction) no split MVs
67};
68
69typedef struct {
70 uint8_t filter_level;
71 uint8_t inner_limit;
72 uint8_t inner_filter;
73} VP8FilterStrength;
74
75typedef struct {
76 uint8_t skip;
77 // todo: make it possible to check for at least (i4x4 or split_mv)
78 // in one op. are others needed?
79 uint8_t mode;
80 uint8_t ref_frame;
81 uint8_t partitioning;
82 VP56mv mv;
83 VP56mv bmv[16];
84} VP8Macroblock;
85
86typedef struct {
87 AVCodecContext *avctx;
88 DSPContext dsp;
89 VP8DSPContext vp8dsp;
90 H264PredContext hpc;
91 vp8_mc_func put_pixels_tab[3][3][3];
92 AVFrame frames[4];
93 AVFrame *framep[4];
94 uint8_t *edge_emu_buffer;
95 VP56RangeCoder c; ///< header context, includes mb modes and motion vectors
96 int profile;
97
98 int mb_width; /* number of horizontal MB */
99 int mb_height; /* number of vertical MB */
100 int linesize;
101 int uvlinesize;
102
103 int keyframe;
104 int invisible;
105 int update_last; ///< update VP56_FRAME_PREVIOUS with the current one
106 int update_golden; ///< VP56_FRAME_NONE if not updated, or which frame to copy if so
107 int update_altref;
108 int deblock_filter;
109
110 /**
111 * If this flag is not set, all the probability updates
112 * are discarded after this frame is decoded.
113 */
114 int update_probabilities;
115
116 /**
117 * All coefficients are contained in separate arith coding contexts.
118 * There can be 1, 2, 4, or 8 of these after the header context.
119 */
120 int num_coeff_partitions;
121 VP56RangeCoder coeff_partition[8];
122
123 VP8Macroblock *macroblocks;
124 VP8Macroblock *macroblocks_base;
125 VP8FilterStrength *filter_strength;
126
127 uint8_t *intra4x4_pred_mode_top;
128 uint8_t intra4x4_pred_mode_left[4];
129 uint8_t *segmentation_map;
130
131 /**
132 * Cache of the top row needed for intra prediction
133 * 16 for luma, 8 for each chroma plane
134 */
135 uint8_t (*top_border)[16+8+8];
136
137 /**
138 * For coeff decode, we need to know whether the above block had non-zero
139 * coefficients. This means for each macroblock, we need data for 4 luma
140 * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
141 * per macroblock. We keep the last row in top_nnz.
142 */
143 uint8_t (*top_nnz)[9];
144 DECLARE_ALIGNED(8, uint8_t, left_nnz)[9];
145
146 /**
147 * This is the index plus one of the last non-zero coeff
148 * for each of the blocks in the current macroblock.
149 * So, 0 -> no coeffs
150 * 1 -> dc-only (special transform)
151 * 2+-> full transform
152 */
153 DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4];
154 DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16];
155 DECLARE_ALIGNED(16, DCTELEM, block_dc)[16];
156 uint8_t intra4x4_pred_mode_mb[16];
157
158 int chroma_pred_mode; ///< 8x8c pred mode of the current macroblock
159 int segment; ///< segment of the current macroblock
160 VP56mv mv_min;
161 VP56mv mv_max;
162
163 int mbskip_enabled;
164 int sign_bias[4]; ///< one state [0, 1] per ref frame type
165 int ref_count[3];
166
167 /**
168 * Base parameters for segmentation, i.e. per-macroblock parameters.
169 * These must be kept unchanged even if segmentation is not used for
170 * a frame, since the values persist between interframes.
171 */
172 struct {
173 int enabled;
174 int absolute_vals;
175 int update_map;
176 int8_t base_quant[4];
177 int8_t filter_level[4]; ///< base loop filter level
178 } segmentation;
179
180 /**
181 * Macroblocks can have one of 4 different quants in a frame when
182 * segmentation is enabled.
183 * If segmentation is disabled, only the first segment's values are used.
184 */
185 struct {
186 // [0] - DC qmul [1] - AC qmul
187 int16_t luma_qmul[2];
188 int16_t luma_dc_qmul[2]; ///< luma dc-only block quant
189 int16_t chroma_qmul[2];
190 } qmat[4];
191
192 struct {
193 int simple;
194 int level;
195 int sharpness;
196 } filter;
197
198 struct {
199 int enabled; ///< whether each mb can have a different strength based on mode/ref
200
201 /**
202 * filter strength adjustment for the following macroblock modes:
203 * [0-3] - i16x16 (always zero)
204 * [4] - i4x4
205 * [5] - zero mv
206 * [6] - inter modes except for zero or split mv
207 * [7] - split mv
208 * i16x16 modes never have any adjustment
209 */
210 int8_t mode[VP8_MVMODE_SPLIT+1];
211
212 /**
213 * filter strength adjustment for macroblocks that reference:
214 * [0] - intra / VP56_FRAME_CURRENT
215 * [1] - VP56_FRAME_PREVIOUS
216 * [2] - VP56_FRAME_GOLDEN
217 * [3] - altref / VP56_FRAME_GOLDEN2
218 */
219 int8_t ref[4];
220 } lf_delta;
221
222 /**
223 * These are all of the updatable probabilities for binary decisions.
224 * They are only implictly reset on keyframes, making it quite likely
225 * for an interframe to desync if a prior frame's header was corrupt
226 * or missing outright!
227 */
228 struct {
229 uint8_t segmentid[3];
230 uint8_t mbskip;
231 uint8_t intra;
232 uint8_t last;
233 uint8_t golden;
234 uint8_t pred16x16[4];
235 uint8_t pred8x8c[3];
236 /* Padded to allow overreads */
237 uint8_t token[4][17][3][NUM_DCT_TOKENS-1];
238 uint8_t mvc[2][19];
239 } prob[2];
240} VP8Context;
241
242#endif