yading@10
|
1 /*
|
yading@10
|
2 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
|
yading@10
|
3 *
|
yading@10
|
4 * This file is part of FFmpeg.
|
yading@10
|
5 *
|
yading@10
|
6 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
7 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
8 * License as published by the Free Software Foundation; either
|
yading@10
|
9 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
10 *
|
yading@10
|
11 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
14 * Lesser General Public License for more details.
|
yading@10
|
15 *
|
yading@10
|
16 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
17 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
19 */
|
yading@10
|
20
|
yading@10
|
21 /**
|
yading@10
|
22 * @file
|
yading@10
|
23 * VP5 and VP6 compatible video decoder (common features)
|
yading@10
|
24 */
|
yading@10
|
25
|
yading@10
|
26 #ifndef AVCODEC_VP56_H
|
yading@10
|
27 #define AVCODEC_VP56_H
|
yading@10
|
28
|
yading@10
|
29 #include "vp56data.h"
|
yading@10
|
30 #include "dsputil.h"
|
yading@10
|
31 #include "get_bits.h"
|
yading@10
|
32 #include "hpeldsp.h"
|
yading@10
|
33 #include "bytestream.h"
|
yading@10
|
34 #include "h264chroma.h"
|
yading@10
|
35 #include "videodsp.h"
|
yading@10
|
36 #include "vp3dsp.h"
|
yading@10
|
37 #include "vp56dsp.h"
|
yading@10
|
38
|
yading@10
|
39 typedef struct vp56_context VP56Context;
|
yading@10
|
40
|
yading@10
|
41 typedef struct VP56mv {
|
yading@10
|
42 DECLARE_ALIGNED(4, int16_t, x);
|
yading@10
|
43 int16_t y;
|
yading@10
|
44 } VP56mv;
|
yading@10
|
45
|
yading@10
|
46 #define VP56_SIZE_CHANGE 1
|
yading@10
|
47
|
yading@10
|
48 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
|
yading@10
|
49 VP56mv *vect);
|
yading@10
|
50 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
|
yading@10
|
51 int offset1, int offset2, int stride,
|
yading@10
|
52 VP56mv mv, int mask, int select, int luma);
|
yading@10
|
53 typedef void (*VP56ParseCoeff)(VP56Context *s);
|
yading@10
|
54 typedef void (*VP56DefaultModelsInit)(VP56Context *s);
|
yading@10
|
55 typedef void (*VP56ParseVectorModels)(VP56Context *s);
|
yading@10
|
56 typedef int (*VP56ParseCoeffModels)(VP56Context *s);
|
yading@10
|
57 typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf,
|
yading@10
|
58 int buf_size);
|
yading@10
|
59
|
yading@10
|
60 typedef struct VP56RangeCoder {
|
yading@10
|
61 int high;
|
yading@10
|
62 int bits; /* stored negated (i.e. negative "bits" is a positive number of
|
yading@10
|
63 bits left) in order to eliminate a negate in cache refilling */
|
yading@10
|
64 const uint8_t *buffer;
|
yading@10
|
65 const uint8_t *end;
|
yading@10
|
66 unsigned int code_word;
|
yading@10
|
67 } VP56RangeCoder;
|
yading@10
|
68
|
yading@10
|
69 typedef struct VP56RefDc {
|
yading@10
|
70 uint8_t not_null_dc;
|
yading@10
|
71 VP56Frame ref_frame;
|
yading@10
|
72 int16_t dc_coeff;
|
yading@10
|
73 } VP56RefDc;
|
yading@10
|
74
|
yading@10
|
75 typedef struct VP56Macroblock {
|
yading@10
|
76 uint8_t type;
|
yading@10
|
77 VP56mv mv;
|
yading@10
|
78 } VP56Macroblock;
|
yading@10
|
79
|
yading@10
|
80 typedef struct VP56Model {
|
yading@10
|
81 uint8_t coeff_reorder[64]; /* used in vp6 only */
|
yading@10
|
82 uint8_t coeff_index_to_pos[64]; /* used in vp6 only */
|
yading@10
|
83 uint8_t vector_sig[2]; /* delta sign */
|
yading@10
|
84 uint8_t vector_dct[2]; /* delta coding types */
|
yading@10
|
85 uint8_t vector_pdi[2][2]; /* predefined delta init */
|
yading@10
|
86 uint8_t vector_pdv[2][7]; /* predefined delta values */
|
yading@10
|
87 uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */
|
yading@10
|
88 uint8_t coeff_dccv[2][11]; /* DC coeff value */
|
yading@10
|
89 uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */
|
yading@10
|
90 uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */
|
yading@10
|
91 uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */
|
yading@10
|
92 uint8_t coeff_runv[2][14]; /* run value (vp6 only) */
|
yading@10
|
93 uint8_t mb_type[3][10][10]; /* model for decoding MB type */
|
yading@10
|
94 uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */
|
yading@10
|
95 } VP56Model;
|
yading@10
|
96
|
yading@10
|
97 struct vp56_context {
|
yading@10
|
98 AVCodecContext *avctx;
|
yading@10
|
99 H264ChromaContext h264chroma;
|
yading@10
|
100 HpelDSPContext hdsp;
|
yading@10
|
101 VideoDSPContext vdsp;
|
yading@10
|
102 VP3DSPContext vp3dsp;
|
yading@10
|
103 VP56DSPContext vp56dsp;
|
yading@10
|
104 uint8_t idct_scantable[64];
|
yading@10
|
105 AVFrame *frames[4];
|
yading@10
|
106 uint8_t *edge_emu_buffer_alloc;
|
yading@10
|
107 uint8_t *edge_emu_buffer;
|
yading@10
|
108 VP56RangeCoder c;
|
yading@10
|
109 VP56RangeCoder cc;
|
yading@10
|
110 VP56RangeCoder *ccp;
|
yading@10
|
111 int sub_version;
|
yading@10
|
112
|
yading@10
|
113 /* frame info */
|
yading@10
|
114 int golden_frame;
|
yading@10
|
115 int plane_width[4];
|
yading@10
|
116 int plane_height[4];
|
yading@10
|
117 int mb_width; /* number of horizontal MB */
|
yading@10
|
118 int mb_height; /* number of vertical MB */
|
yading@10
|
119 int block_offset[6];
|
yading@10
|
120
|
yading@10
|
121 int quantizer;
|
yading@10
|
122 uint16_t dequant_dc;
|
yading@10
|
123 uint16_t dequant_ac;
|
yading@10
|
124
|
yading@10
|
125 /* DC predictors management */
|
yading@10
|
126 VP56RefDc *above_blocks;
|
yading@10
|
127 VP56RefDc left_block[4];
|
yading@10
|
128 int above_block_idx[6];
|
yading@10
|
129 int16_t prev_dc[3][3]; /* [plan][ref_frame] */
|
yading@10
|
130
|
yading@10
|
131 /* blocks / macroblock */
|
yading@10
|
132 VP56mb mb_type;
|
yading@10
|
133 VP56Macroblock *macroblocks;
|
yading@10
|
134 DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64];
|
yading@10
|
135
|
yading@10
|
136 /* motion vectors */
|
yading@10
|
137 VP56mv mv[6]; /* vectors for each block in MB */
|
yading@10
|
138 VP56mv vector_candidate[2];
|
yading@10
|
139 int vector_candidate_pos;
|
yading@10
|
140
|
yading@10
|
141 /* filtering hints */
|
yading@10
|
142 int filter_header; /* used in vp6 only */
|
yading@10
|
143 int deblock_filtering;
|
yading@10
|
144 int filter_selection;
|
yading@10
|
145 int filter_mode;
|
yading@10
|
146 int max_vector_length;
|
yading@10
|
147 int sample_variance_threshold;
|
yading@10
|
148
|
yading@10
|
149 uint8_t coeff_ctx[4][64]; /* used in vp5 only */
|
yading@10
|
150 uint8_t coeff_ctx_last[4]; /* used in vp5 only */
|
yading@10
|
151
|
yading@10
|
152 int has_alpha;
|
yading@10
|
153
|
yading@10
|
154 /* upside-down flipping hints */
|
yading@10
|
155 int flip; /* are we flipping ? */
|
yading@10
|
156 int frbi; /* first row block index in MB */
|
yading@10
|
157 int srbi; /* second row block index in MB */
|
yading@10
|
158 int stride[4]; /* stride for each plan */
|
yading@10
|
159
|
yading@10
|
160 const uint8_t *vp56_coord_div;
|
yading@10
|
161 VP56ParseVectorAdjustment parse_vector_adjustment;
|
yading@10
|
162 VP56Filter filter;
|
yading@10
|
163 VP56ParseCoeff parse_coeff;
|
yading@10
|
164 VP56DefaultModelsInit default_models_init;
|
yading@10
|
165 VP56ParseVectorModels parse_vector_models;
|
yading@10
|
166 VP56ParseCoeffModels parse_coeff_models;
|
yading@10
|
167 VP56ParseHeader parse_header;
|
yading@10
|
168
|
yading@10
|
169 /* for "slice" parallelism between YUV and A */
|
yading@10
|
170 VP56Context *alpha_context;
|
yading@10
|
171
|
yading@10
|
172 VP56Model *modelp;
|
yading@10
|
173 VP56Model model;
|
yading@10
|
174
|
yading@10
|
175 /* huffman decoding */
|
yading@10
|
176 int use_huffman;
|
yading@10
|
177 GetBitContext gb;
|
yading@10
|
178 VLC dccv_vlc[2];
|
yading@10
|
179 VLC runv_vlc[2];
|
yading@10
|
180 VLC ract_vlc[2][3][6];
|
yading@10
|
181 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */
|
yading@10
|
182 };
|
yading@10
|
183
|
yading@10
|
184
|
yading@10
|
185 int ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha);
|
yading@10
|
186 int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s,
|
yading@10
|
187 int flip, int has_alpha);
|
yading@10
|
188 int ff_vp56_free(AVCodecContext *avctx);
|
yading@10
|
189 int ff_vp56_free_context(VP56Context *s);
|
yading@10
|
190 void ff_vp56_init_dequant(VP56Context *s, int quantizer);
|
yading@10
|
191 int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
yading@10
|
192 AVPacket *avpkt);
|
yading@10
|
193
|
yading@10
|
194
|
yading@10
|
195 /**
|
yading@10
|
196 * vp56 specific range coder implementation
|
yading@10
|
197 */
|
yading@10
|
198
|
yading@10
|
199 extern const uint8_t ff_vp56_norm_shift[256];
|
yading@10
|
200 void ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size);
|
yading@10
|
201
|
yading@10
|
202 static av_always_inline unsigned int vp56_rac_renorm(VP56RangeCoder *c)
|
yading@10
|
203 {
|
yading@10
|
204 int shift = ff_vp56_norm_shift[c->high];
|
yading@10
|
205 int bits = c->bits;
|
yading@10
|
206 unsigned int code_word = c->code_word;
|
yading@10
|
207
|
yading@10
|
208 c->high <<= shift;
|
yading@10
|
209 code_word <<= shift;
|
yading@10
|
210 bits += shift;
|
yading@10
|
211 if(bits >= 0 && c->buffer < c->end) {
|
yading@10
|
212 code_word |= bytestream_get_be16(&c->buffer) << bits;
|
yading@10
|
213 bits -= 16;
|
yading@10
|
214 }
|
yading@10
|
215 c->bits = bits;
|
yading@10
|
216 return code_word;
|
yading@10
|
217 }
|
yading@10
|
218
|
yading@10
|
219 #if ARCH_ARM
|
yading@10
|
220 #include "arm/vp56_arith.h"
|
yading@10
|
221 #elif ARCH_X86
|
yading@10
|
222 #include "x86/vp56_arith.h"
|
yading@10
|
223 #endif
|
yading@10
|
224
|
yading@10
|
225 #ifndef vp56_rac_get_prob
|
yading@10
|
226 #define vp56_rac_get_prob vp56_rac_get_prob
|
yading@10
|
227 static av_always_inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
|
yading@10
|
228 {
|
yading@10
|
229 unsigned int code_word = vp56_rac_renorm(c);
|
yading@10
|
230 unsigned int low = 1 + (((c->high - 1) * prob) >> 8);
|
yading@10
|
231 unsigned int low_shift = low << 16;
|
yading@10
|
232 int bit = code_word >= low_shift;
|
yading@10
|
233
|
yading@10
|
234 c->high = bit ? c->high - low : low;
|
yading@10
|
235 c->code_word = bit ? code_word - low_shift : code_word;
|
yading@10
|
236
|
yading@10
|
237 return bit;
|
yading@10
|
238 }
|
yading@10
|
239 #endif
|
yading@10
|
240
|
yading@10
|
241 #ifndef vp56_rac_get_prob_branchy
|
yading@10
|
242 // branchy variant, to be used where there's a branch based on the bit decoded
|
yading@10
|
243 static av_always_inline int vp56_rac_get_prob_branchy(VP56RangeCoder *c, int prob)
|
yading@10
|
244 {
|
yading@10
|
245 unsigned long code_word = vp56_rac_renorm(c);
|
yading@10
|
246 unsigned low = 1 + (((c->high - 1) * prob) >> 8);
|
yading@10
|
247 unsigned low_shift = low << 16;
|
yading@10
|
248
|
yading@10
|
249 if (code_word >= low_shift) {
|
yading@10
|
250 c->high -= low;
|
yading@10
|
251 c->code_word = code_word - low_shift;
|
yading@10
|
252 return 1;
|
yading@10
|
253 }
|
yading@10
|
254
|
yading@10
|
255 c->high = low;
|
yading@10
|
256 c->code_word = code_word;
|
yading@10
|
257 return 0;
|
yading@10
|
258 }
|
yading@10
|
259 #endif
|
yading@10
|
260
|
yading@10
|
261 static av_always_inline int vp56_rac_get(VP56RangeCoder *c)
|
yading@10
|
262 {
|
yading@10
|
263 unsigned int code_word = vp56_rac_renorm(c);
|
yading@10
|
264 /* equiprobable */
|
yading@10
|
265 int low = (c->high + 1) >> 1;
|
yading@10
|
266 unsigned int low_shift = low << 16;
|
yading@10
|
267 int bit = code_word >= low_shift;
|
yading@10
|
268 if (bit) {
|
yading@10
|
269 c->high -= low;
|
yading@10
|
270 code_word -= low_shift;
|
yading@10
|
271 } else {
|
yading@10
|
272 c->high = low;
|
yading@10
|
273 }
|
yading@10
|
274
|
yading@10
|
275 c->code_word = code_word;
|
yading@10
|
276 return bit;
|
yading@10
|
277 }
|
yading@10
|
278
|
yading@10
|
279 // rounding is different than vp56_rac_get, is vp56_rac_get wrong?
|
yading@10
|
280 static av_always_inline int vp8_rac_get(VP56RangeCoder *c)
|
yading@10
|
281 {
|
yading@10
|
282 return vp56_rac_get_prob(c, 128);
|
yading@10
|
283 }
|
yading@10
|
284
|
yading@10
|
285 static av_unused int vp56_rac_gets(VP56RangeCoder *c, int bits)
|
yading@10
|
286 {
|
yading@10
|
287 int value = 0;
|
yading@10
|
288
|
yading@10
|
289 while (bits--) {
|
yading@10
|
290 value = (value << 1) | vp56_rac_get(c);
|
yading@10
|
291 }
|
yading@10
|
292
|
yading@10
|
293 return value;
|
yading@10
|
294 }
|
yading@10
|
295
|
yading@10
|
296 static av_unused int vp8_rac_get_uint(VP56RangeCoder *c, int bits)
|
yading@10
|
297 {
|
yading@10
|
298 int value = 0;
|
yading@10
|
299
|
yading@10
|
300 while (bits--) {
|
yading@10
|
301 value = (value << 1) | vp8_rac_get(c);
|
yading@10
|
302 }
|
yading@10
|
303
|
yading@10
|
304 return value;
|
yading@10
|
305 }
|
yading@10
|
306
|
yading@10
|
307 // fixme: add 1 bit to all the calls to this?
|
yading@10
|
308 static av_unused int vp8_rac_get_sint(VP56RangeCoder *c, int bits)
|
yading@10
|
309 {
|
yading@10
|
310 int v;
|
yading@10
|
311
|
yading@10
|
312 if (!vp8_rac_get(c))
|
yading@10
|
313 return 0;
|
yading@10
|
314
|
yading@10
|
315 v = vp8_rac_get_uint(c, bits);
|
yading@10
|
316
|
yading@10
|
317 if (vp8_rac_get(c))
|
yading@10
|
318 v = -v;
|
yading@10
|
319
|
yading@10
|
320 return v;
|
yading@10
|
321 }
|
yading@10
|
322
|
yading@10
|
323 // P(7)
|
yading@10
|
324 static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits)
|
yading@10
|
325 {
|
yading@10
|
326 int v = vp56_rac_gets(c, 7) << 1;
|
yading@10
|
327 return v + !v;
|
yading@10
|
328 }
|
yading@10
|
329
|
yading@10
|
330 static av_unused int vp8_rac_get_nn(VP56RangeCoder *c)
|
yading@10
|
331 {
|
yading@10
|
332 int v = vp8_rac_get_uint(c, 7) << 1;
|
yading@10
|
333 return v + !v;
|
yading@10
|
334 }
|
yading@10
|
335
|
yading@10
|
336 static av_always_inline
|
yading@10
|
337 int vp56_rac_get_tree(VP56RangeCoder *c,
|
yading@10
|
338 const VP56Tree *tree,
|
yading@10
|
339 const uint8_t *probs)
|
yading@10
|
340 {
|
yading@10
|
341 while (tree->val > 0) {
|
yading@10
|
342 if (vp56_rac_get_prob(c, probs[tree->prob_idx]))
|
yading@10
|
343 tree += tree->val;
|
yading@10
|
344 else
|
yading@10
|
345 tree++;
|
yading@10
|
346 }
|
yading@10
|
347 return -tree->val;
|
yading@10
|
348 }
|
yading@10
|
349
|
yading@10
|
350 // how probabilities are associated with decisions is different I think
|
yading@10
|
351 // well, the new scheme fits in the old but this way has one fewer branches per decision
|
yading@10
|
352 static av_always_inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2],
|
yading@10
|
353 const uint8_t *probs)
|
yading@10
|
354 {
|
yading@10
|
355 int i = 0;
|
yading@10
|
356
|
yading@10
|
357 do {
|
yading@10
|
358 i = tree[i][vp56_rac_get_prob(c, probs[i])];
|
yading@10
|
359 } while (i > 0);
|
yading@10
|
360
|
yading@10
|
361 return -i;
|
yading@10
|
362 }
|
yading@10
|
363
|
yading@10
|
364 // DCTextra
|
yading@10
|
365 static av_always_inline int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob)
|
yading@10
|
366 {
|
yading@10
|
367 int v = 0;
|
yading@10
|
368
|
yading@10
|
369 do {
|
yading@10
|
370 v = (v<<1) + vp56_rac_get_prob(c, *prob++);
|
yading@10
|
371 } while (*prob);
|
yading@10
|
372
|
yading@10
|
373 return v;
|
yading@10
|
374 }
|
yading@10
|
375
|
yading@10
|
376 #endif /* AVCODEC_VP56_H */
|