ffmpeg / libavcodec / vp56.c @ d23e3e5f
History | View | Annotate | Download (22.9 KB)
1 | 5ce117c3 | Aurelien Jacobs | /**
|
---|---|---|---|
2 | ba87f080 | Diego Biurrun | * @file
|
3 | 5ce117c3 | Aurelien Jacobs | * VP5 and VP6 compatible video decoder (common features)
|
4 | *
|
||
5 | * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
|
||
6 | *
|
||
7 | b78e7197 | Diego Biurrun | * This file is part of FFmpeg.
|
8 | *
|
||
9 | * FFmpeg is free software; you can redistribute it and/or
|
||
10 | 5ce117c3 | Aurelien Jacobs | * modify it under the terms of the GNU Lesser General Public
|
11 | * License as published by the Free Software Foundation; either
|
||
12 | * version 2.1 of the License, or (at your option) any later version.
|
||
13 | *
|
||
14 | b78e7197 | Diego Biurrun | * FFmpeg is distributed in the hope that it will be useful,
|
15 | 5ce117c3 | Aurelien Jacobs | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
17 | * Lesser General Public License for more details.
|
||
18 | *
|
||
19 | * You should have received a copy of the GNU Lesser General Public
|
||
20 | b78e7197 | Diego Biurrun | * License along with FFmpeg; if not, write to the Free Software
|
21 | e5a389a1 | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
22 | 5ce117c3 | Aurelien Jacobs | */
|
23 | |||
24 | #include "avcodec.h" |
||
25 | 91fc2cf1 | Aurelien Jacobs | #include "bytestream.h" |
26 | 5ce117c3 | Aurelien Jacobs | |
27 | #include "vp56.h" |
||
28 | #include "vp56data.h" |
||
29 | |||
30 | |||
31 | d9504970 | Alex Converse | void ff_vp56_init_dequant(VP56Context *s, int quantizer) |
32 | 5ce117c3 | Aurelien Jacobs | { |
33 | s->quantizer = quantizer; |
||
34 | s->dequant_dc = vp56_dc_dequant[quantizer] << 2;
|
||
35 | s->dequant_ac = vp56_ac_dequant[quantizer] << 2;
|
||
36 | 800274f8 | Reimar Döffinger | memset(s->qscale_table, quantizer, s->mb_width); |
37 | 5ce117c3 | Aurelien Jacobs | } |
38 | |||
39 | 3d52bca6 | Aurelien Jacobs | static int vp56_get_vectors_predictors(VP56Context *s, int row, int col, |
40 | VP56Frame ref_frame) |
||
41 | 5ce117c3 | Aurelien Jacobs | { |
42 | int nb_pred = 0; |
||
43 | 3d52bca6 | Aurelien Jacobs | VP56mv vect[2] = {{0,0}, {0,0}}; |
44 | 5ce117c3 | Aurelien Jacobs | int pos, offset;
|
45 | 3d52bca6 | Aurelien Jacobs | VP56mv mvp; |
46 | 5ce117c3 | Aurelien Jacobs | |
47 | for (pos=0; pos<12; pos++) { |
||
48 | mvp.x = col + vp56_candidate_predictor_pos[pos][0];
|
||
49 | mvp.y = row + vp56_candidate_predictor_pos[pos][1];
|
||
50 | if (mvp.x < 0 || mvp.x >= s->mb_width || |
||
51 | mvp.y < 0 || mvp.y >= s->mb_height)
|
||
52 | continue;
|
||
53 | offset = mvp.x + s->mb_width*mvp.y; |
||
54 | |||
55 | if (vp56_reference_frame[s->macroblocks[offset].type] != ref_frame)
|
||
56 | continue;
|
||
57 | d120e402 | Aurelien Jacobs | if ((s->macroblocks[offset].mv.x == vect[0].x && |
58 | s->macroblocks[offset].mv.y == vect[0].y) ||
|
||
59 | 5ce117c3 | Aurelien Jacobs | (s->macroblocks[offset].mv.x == 0 &&
|
60 | s->macroblocks[offset].mv.y == 0))
|
||
61 | continue;
|
||
62 | |||
63 | d120e402 | Aurelien Jacobs | vect[nb_pred++] = s->macroblocks[offset].mv; |
64 | 5ce117c3 | Aurelien Jacobs | if (nb_pred > 1) { |
65 | nb_pred = -1;
|
||
66 | break;
|
||
67 | } |
||
68 | s->vector_candidate_pos = pos; |
||
69 | } |
||
70 | |||
71 | d120e402 | Aurelien Jacobs | s->vector_candidate[0] = vect[0]; |
72 | s->vector_candidate[1] = vect[1]; |
||
73 | 5ce117c3 | Aurelien Jacobs | |
74 | return nb_pred+1; |
||
75 | } |
||
76 | |||
77 | 3d52bca6 | Aurelien Jacobs | static void vp56_parse_mb_type_models(VP56Context *s) |
78 | 5ce117c3 | Aurelien Jacobs | { |
79 | 3d52bca6 | Aurelien Jacobs | VP56RangeCoder *c = &s->c; |
80 | d887151d | Aurelien Jacobs | VP56Model *model = s->modelp; |
81 | 5ce117c3 | Aurelien Jacobs | int i, ctx, type;
|
82 | |||
83 | for (ctx=0; ctx<3; ctx++) { |
||
84 | if (vp56_rac_get_prob(c, 174)) { |
||
85 | int idx = vp56_rac_gets(c, 4); |
||
86 | 247df384 | Aurelien Jacobs | memcpy(model->mb_types_stats[ctx], |
87 | vp56_pre_def_mb_type_stats[idx][ctx], |
||
88 | sizeof(model->mb_types_stats[ctx]));
|
||
89 | 5ce117c3 | Aurelien Jacobs | } |
90 | if (vp56_rac_get_prob(c, 254)) { |
||
91 | for (type=0; type<10; type++) { |
||
92 | for(i=0; i<2; i++) { |
||
93 | if (vp56_rac_get_prob(c, 205)) { |
||
94 | int delta, sign = vp56_rac_get(c);
|
||
95 | |||
96 | delta = vp56_rac_get_tree(c, vp56_pmbtm_tree, |
||
97 | vp56_mb_type_model_model); |
||
98 | if (!delta)
|
||
99 | delta = 4 * vp56_rac_gets(c, 7); |
||
100 | 247df384 | Aurelien Jacobs | model->mb_types_stats[ctx][type][i] += (delta ^ -sign) + sign; |
101 | 5ce117c3 | Aurelien Jacobs | } |
102 | } |
||
103 | } |
||
104 | } |
||
105 | } |
||
106 | |||
107 | /* compute MB type probability tables based on previous MB type */
|
||
108 | for (ctx=0; ctx<3; ctx++) { |
||
109 | int p[10]; |
||
110 | |||
111 | for (type=0; type<10; type++) |
||
112 | 247df384 | Aurelien Jacobs | p[type] = 100 * model->mb_types_stats[ctx][type][1]; |
113 | 5ce117c3 | Aurelien Jacobs | |
114 | for (type=0; type<10; type++) { |
||
115 | int p02, p34, p0234, p17, p56, p89, p5689, p156789;
|
||
116 | |||
117 | /* conservative MB type probability */
|
||
118 | 247df384 | Aurelien Jacobs | model->mb_type[ctx][type][0] = 255 - (255 * model->mb_types_stats[ctx][type][0]) / (1 + model->mb_types_stats[ctx][type][0] + model->mb_types_stats[ctx][type][1]); |
119 | 5ce117c3 | Aurelien Jacobs | |
120 | p[type] = 0; /* same MB type => weight is null */ |
||
121 | |||
122 | /* binary tree parsing probabilities */
|
||
123 | p02 = p[0] + p[2]; |
||
124 | p34 = p[3] + p[4]; |
||
125 | p0234 = p02 + p34; |
||
126 | p17 = p[1] + p[7]; |
||
127 | p56 = p[5] + p[6]; |
||
128 | p89 = p[8] + p[9]; |
||
129 | p5689 = p56 + p89; |
||
130 | p156789 = p17 + p5689; |
||
131 | |||
132 | 247df384 | Aurelien Jacobs | model->mb_type[ctx][type][1] = 1 + 255 * p0234/(1+p0234+p156789); |
133 | model->mb_type[ctx][type][2] = 1 + 255 * p02 / (1+p0234); |
||
134 | model->mb_type[ctx][type][3] = 1 + 255 * p17 / (1+p156789); |
||
135 | model->mb_type[ctx][type][4] = 1 + 255 * p[0] / (1+p02); |
||
136 | model->mb_type[ctx][type][5] = 1 + 255 * p[3] / (1+p34); |
||
137 | model->mb_type[ctx][type][6] = 1 + 255 * p[1] / (1+p17); |
||
138 | model->mb_type[ctx][type][7] = 1 + 255 * p56 / (1+p5689); |
||
139 | model->mb_type[ctx][type][8] = 1 + 255 * p[5] / (1+p56); |
||
140 | model->mb_type[ctx][type][9] = 1 + 255 * p[8] / (1+p89); |
||
141 | 5ce117c3 | Aurelien Jacobs | |
142 | /* restore initial value */
|
||
143 | 247df384 | Aurelien Jacobs | p[type] = 100 * model->mb_types_stats[ctx][type][1]; |
144 | 5ce117c3 | Aurelien Jacobs | } |
145 | } |
||
146 | } |
||
147 | |||
148 | 3d52bca6 | Aurelien Jacobs | static VP56mb vp56_parse_mb_type(VP56Context *s,
|
149 | 76025d91 | Aurelien Jacobs | VP56mb prev_type, int ctx)
|
150 | 5ce117c3 | Aurelien Jacobs | { |
151 | 247df384 | Aurelien Jacobs | uint8_t *mb_type_model = s->modelp->mb_type[ctx][prev_type]; |
152 | 3d52bca6 | Aurelien Jacobs | VP56RangeCoder *c = &s->c; |
153 | 5ce117c3 | Aurelien Jacobs | |
154 | if (vp56_rac_get_prob(c, mb_type_model[0])) |
||
155 | return prev_type;
|
||
156 | else
|
||
157 | return vp56_rac_get_tree(c, vp56_pmbt_tree, mb_type_model);
|
||
158 | } |
||
159 | |||
160 | 3d52bca6 | Aurelien Jacobs | static void vp56_decode_4mv(VP56Context *s, int row, int col) |
161 | 5ce117c3 | Aurelien Jacobs | { |
162 | 3d52bca6 | Aurelien Jacobs | VP56mv mv = {0,0}; |
163 | 5ce117c3 | Aurelien Jacobs | int type[4]; |
164 | int b;
|
||
165 | |||
166 | /* parse each block type */
|
||
167 | for (b=0; b<4; b++) { |
||
168 | type[b] = vp56_rac_gets(&s->c, 2);
|
||
169 | if (type[b])
|
||
170 | type[b]++; /* only returns 0, 2, 3 or 4 (all INTER_PF) */
|
||
171 | } |
||
172 | |||
173 | /* get vectors */
|
||
174 | for (b=0; b<4; b++) { |
||
175 | switch (type[b]) {
|
||
176 | case VP56_MB_INTER_NOVEC_PF:
|
||
177 | 3d52bca6 | Aurelien Jacobs | s->mv[b] = (VP56mv) {0,0}; |
178 | 5ce117c3 | Aurelien Jacobs | break;
|
179 | case VP56_MB_INTER_DELTA_PF:
|
||
180 | s->parse_vector_adjustment(s, &s->mv[b]); |
||
181 | break;
|
||
182 | case VP56_MB_INTER_V1_PF:
|
||
183 | s->mv[b] = s->vector_candidate[0];
|
||
184 | break;
|
||
185 | case VP56_MB_INTER_V2_PF:
|
||
186 | s->mv[b] = s->vector_candidate[1];
|
||
187 | break;
|
||
188 | } |
||
189 | mv.x += s->mv[b].x; |
||
190 | mv.y += s->mv[b].y; |
||
191 | } |
||
192 | |||
193 | /* this is the one selected for the whole MB for prediction */
|
||
194 | s->macroblocks[row * s->mb_width + col].mv = s->mv[3];
|
||
195 | |||
196 | /* chroma vectors are average luma vectors */
|
||
197 | if (s->avctx->codec->id == CODEC_ID_VP5) {
|
||
198 | s->mv[4].x = s->mv[5].x = RSHIFT(mv.x,2); |
||
199 | s->mv[4].y = s->mv[5].y = RSHIFT(mv.y,2); |
||
200 | } else {
|
||
201 | 3d52bca6 | Aurelien Jacobs | s->mv[4] = s->mv[5] = (VP56mv) {mv.x/4, mv.y/4}; |
202 | 5ce117c3 | Aurelien Jacobs | } |
203 | } |
||
204 | |||
205 | 3d52bca6 | Aurelien Jacobs | static VP56mb vp56_decode_mv(VP56Context *s, int row, int col) |
206 | 5ce117c3 | Aurelien Jacobs | { |
207 | 3d52bca6 | Aurelien Jacobs | VP56mv *mv, vect = {0,0}; |
208 | 5ce117c3 | Aurelien Jacobs | int ctx, b;
|
209 | |||
210 | ctx = vp56_get_vectors_predictors(s, row, col, VP56_FRAME_PREVIOUS); |
||
211 | s->mb_type = vp56_parse_mb_type(s, s->mb_type, ctx); |
||
212 | s->macroblocks[row * s->mb_width + col].type = s->mb_type; |
||
213 | |||
214 | switch (s->mb_type) {
|
||
215 | case VP56_MB_INTER_V1_PF:
|
||
216 | mv = &s->vector_candidate[0];
|
||
217 | break;
|
||
218 | |||
219 | case VP56_MB_INTER_V2_PF:
|
||
220 | mv = &s->vector_candidate[1];
|
||
221 | break;
|
||
222 | |||
223 | case VP56_MB_INTER_V1_GF:
|
||
224 | vp56_get_vectors_predictors(s, row, col, VP56_FRAME_GOLDEN); |
||
225 | mv = &s->vector_candidate[0];
|
||
226 | break;
|
||
227 | |||
228 | case VP56_MB_INTER_V2_GF:
|
||
229 | vp56_get_vectors_predictors(s, row, col, VP56_FRAME_GOLDEN); |
||
230 | mv = &s->vector_candidate[1];
|
||
231 | break;
|
||
232 | |||
233 | case VP56_MB_INTER_DELTA_PF:
|
||
234 | d120e402 | Aurelien Jacobs | s->parse_vector_adjustment(s, &vect); |
235 | mv = &vect; |
||
236 | 5ce117c3 | Aurelien Jacobs | break;
|
237 | |||
238 | case VP56_MB_INTER_DELTA_GF:
|
||
239 | vp56_get_vectors_predictors(s, row, col, VP56_FRAME_GOLDEN); |
||
240 | d120e402 | Aurelien Jacobs | s->parse_vector_adjustment(s, &vect); |
241 | mv = &vect; |
||
242 | 5ce117c3 | Aurelien Jacobs | break;
|
243 | |||
244 | case VP56_MB_INTER_4V:
|
||
245 | vp56_decode_4mv(s, row, col); |
||
246 | return s->mb_type;
|
||
247 | |||
248 | default:
|
||
249 | d120e402 | Aurelien Jacobs | mv = &vect; |
250 | 5ce117c3 | Aurelien Jacobs | break;
|
251 | } |
||
252 | |||
253 | s->macroblocks[row*s->mb_width + col].mv = *mv; |
||
254 | |||
255 | /* same vector for all blocks */
|
||
256 | for (b=0; b<6; b++) |
||
257 | s->mv[b] = *mv; |
||
258 | |||
259 | return s->mb_type;
|
||
260 | } |
||
261 | |||
262 | 3d52bca6 | Aurelien Jacobs | static void vp56_add_predictors_dc(VP56Context *s, VP56Frame ref_frame) |
263 | 5ce117c3 | Aurelien Jacobs | { |
264 | int idx = s->scantable.permutated[0]; |
||
265 | d7af6a9d | Aurelien Jacobs | int b;
|
266 | 5ce117c3 | Aurelien Jacobs | |
267 | d7af6a9d | Aurelien Jacobs | for (b=0; b<6; b++) { |
268 | 3d52bca6 | Aurelien Jacobs | VP56RefDc *ab = &s->above_blocks[s->above_block_idx[b]]; |
269 | VP56RefDc *lb = &s->left_block[vp56_b6to4[b]]; |
||
270 | 5ce117c3 | Aurelien Jacobs | int count = 0; |
271 | int dc = 0; |
||
272 | 7ecae905 | Aurelien Jacobs | int i;
|
273 | 5ce117c3 | Aurelien Jacobs | |
274 | if (ref_frame == lb->ref_frame) {
|
||
275 | dc += lb->dc_coeff; |
||
276 | count++; |
||
277 | } |
||
278 | if (ref_frame == ab->ref_frame) {
|
||
279 | dc += ab->dc_coeff; |
||
280 | count++; |
||
281 | } |
||
282 | 7ecae905 | Aurelien Jacobs | if (s->avctx->codec->id == CODEC_ID_VP5)
|
283 | for (i=0; i<2; i++) |
||
284 | if (count < 2 && ref_frame == ab[-1+2*i].ref_frame) { |
||
285 | dc += ab[-1+2*i].dc_coeff; |
||
286 | count++; |
||
287 | } |
||
288 | 5ce117c3 | Aurelien Jacobs | if (count == 0) |
289 | d7af6a9d | Aurelien Jacobs | dc = s->prev_dc[vp56_b2p[b]][ref_frame]; |
290 | 5ce117c3 | Aurelien Jacobs | else if (count == 2) |
291 | dc /= 2;
|
||
292 | |||
293 | d7af6a9d | Aurelien Jacobs | s->block_coeff[b][idx] += dc; |
294 | s->prev_dc[vp56_b2p[b]][ref_frame] = s->block_coeff[b][idx]; |
||
295 | ab->dc_coeff = s->block_coeff[b][idx]; |
||
296 | 5ce117c3 | Aurelien Jacobs | ab->ref_frame = ref_frame; |
297 | d7af6a9d | Aurelien Jacobs | lb->dc_coeff = s->block_coeff[b][idx]; |
298 | 5ce117c3 | Aurelien Jacobs | lb->ref_frame = ref_frame; |
299 | d7af6a9d | Aurelien Jacobs | s->block_coeff[b][idx] *= s->dequant_dc; |
300 | 5ce117c3 | Aurelien Jacobs | } |
301 | } |
||
302 | |||
303 | 3d52bca6 | Aurelien Jacobs | static void vp56_deblock_filter(VP56Context *s, uint8_t *yuv, |
304 | 5ce117c3 | Aurelien Jacobs | int stride, int dx, int dy) |
305 | { |
||
306 | int t = vp56_filter_threshold[s->quantizer];
|
||
307 | 5e1ba34b | Måns Rullgård | if (dx) s->vp56dsp.edge_filter_hor(yuv + 10-dx , stride, t); |
308 | if (dy) s->vp56dsp.edge_filter_ver(yuv + stride*(10-dy), stride, t); |
||
309 | 5ce117c3 | Aurelien Jacobs | } |
310 | |||
311 | 3d52bca6 | Aurelien Jacobs | static void vp56_mc(VP56Context *s, int b, int plane, uint8_t *src, |
312 | 5ce117c3 | Aurelien Jacobs | int stride, int x, int y) |
313 | { |
||
314 | 704a2881 | Aurelien Jacobs | uint8_t *dst=s->framep[VP56_FRAME_CURRENT]->data[plane]+s->block_offset[b]; |
315 | 5ce117c3 | Aurelien Jacobs | uint8_t *src_block; |
316 | int src_offset;
|
||
317 | int overlap_offset = 0; |
||
318 | int mask = s->vp56_coord_div[b] - 1; |
||
319 | int deblock_filtering = s->deblock_filtering;
|
||
320 | int dx;
|
||
321 | int dy;
|
||
322 | |||
323 | if (s->avctx->skip_loop_filter >= AVDISCARD_ALL ||
|
||
324 | (s->avctx->skip_loop_filter >= AVDISCARD_NONKEY |
||
325 | 704a2881 | Aurelien Jacobs | && !s->framep[VP56_FRAME_CURRENT]->key_frame)) |
326 | 5ce117c3 | Aurelien Jacobs | deblock_filtering = 0;
|
327 | |||
328 | dx = s->mv[b].x / s->vp56_coord_div[b]; |
||
329 | dy = s->mv[b].y / s->vp56_coord_div[b]; |
||
330 | |||
331 | if (b >= 4) { |
||
332 | x /= 2;
|
||
333 | y /= 2;
|
||
334 | } |
||
335 | x += dx - 2;
|
||
336 | y += dy - 2;
|
||
337 | |||
338 | if (x<0 || x+12>=s->plane_width[plane] || |
||
339 | y<0 || y+12>=s->plane_height[plane]) { |
||
340 | d23e3e5f | Ronald S. Bultje | s->dsp.emulated_edge_mc(s->edge_emu_buffer, |
341 | 5ce117c3 | Aurelien Jacobs | src + s->block_offset[b] + (dy-2)*stride + (dx-2), |
342 | stride, 12, 12, x, y, |
||
343 | s->plane_width[plane], |
||
344 | s->plane_height[plane]); |
||
345 | src_block = s->edge_emu_buffer; |
||
346 | src_offset = 2 + 2*stride; |
||
347 | } else if (deblock_filtering) { |
||
348 | a8678a3a | Aurelien Jacobs | /* only need a 12x12 block, but there is no such dsp function, */
|
349 | /* so copy a 16x12 block */
|
||
350 | s->dsp.put_pixels_tab[0][0](s->edge_emu_buffer, |
||
351 | src + s->block_offset[b] + (dy-2)*stride + (dx-2), |
||
352 | stride, 12);
|
||
353 | 5ce117c3 | Aurelien Jacobs | src_block = s->edge_emu_buffer; |
354 | src_offset = 2 + 2*stride; |
||
355 | } else {
|
||
356 | src_block = src; |
||
357 | src_offset = s->block_offset[b] + dy*stride + dx; |
||
358 | } |
||
359 | |||
360 | if (deblock_filtering)
|
||
361 | vp56_deblock_filter(s, src_block, stride, dx&7, dy&7); |
||
362 | |||
363 | if (s->mv[b].x & mask)
|
||
364 | overlap_offset += (s->mv[b].x > 0) ? 1 : -1; |
||
365 | if (s->mv[b].y & mask)
|
||
366 | overlap_offset += (s->mv[b].y > 0) ? stride : -stride;
|
||
367 | |||
368 | if (overlap_offset) {
|
||
369 | if (s->filter)
|
||
370 | s->filter(s, dst, src_block, src_offset, src_offset+overlap_offset, |
||
371 | stride, s->mv[b], mask, s->filter_selection, b<4);
|
||
372 | else
|
||
373 | s->dsp.put_no_rnd_pixels_l2[1](dst, src_block+src_offset,
|
||
374 | src_block+src_offset+overlap_offset, |
||
375 | stride, 8);
|
||
376 | } else {
|
||
377 | s->dsp.put_pixels_tab[1][0](dst, src_block+src_offset, stride, 8); |
||
378 | } |
||
379 | } |
||
380 | |||
381 | 3d52bca6 | Aurelien Jacobs | static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha) |
382 | 5ce117c3 | Aurelien Jacobs | { |
383 | AVFrame *frame_current, *frame_ref; |
||
384 | 3d52bca6 | Aurelien Jacobs | VP56mb mb_type; |
385 | VP56Frame ref_frame; |
||
386 | 442b145a | Aurelien Jacobs | int b, ab, b_max, plane, off;
|
387 | 5ce117c3 | Aurelien Jacobs | |
388 | 704a2881 | Aurelien Jacobs | if (s->framep[VP56_FRAME_CURRENT]->key_frame)
|
389 | 5ce117c3 | Aurelien Jacobs | mb_type = VP56_MB_INTRA; |
390 | else
|
||
391 | mb_type = vp56_decode_mv(s, row, col); |
||
392 | ref_frame = vp56_reference_frame[mb_type]; |
||
393 | |||
394 | 5fecfb7d | Loren Merritt | s->dsp.clear_blocks(*s->block_coeff); |
395 | 5ce117c3 | Aurelien Jacobs | |
396 | s->parse_coeff(s); |
||
397 | |||
398 | vp56_add_predictors_dc(s, ref_frame); |
||
399 | |||
400 | 704a2881 | Aurelien Jacobs | frame_current = s->framep[VP56_FRAME_CURRENT]; |
401 | frame_ref = s->framep[ref_frame]; |
||
402 | 5ce117c3 | Aurelien Jacobs | |
403 | 91fc2cf1 | Aurelien Jacobs | ab = 6*is_alpha;
|
404 | b_max = 6 - 2*is_alpha; |
||
405 | |||
406 | 5ce117c3 | Aurelien Jacobs | switch (mb_type) {
|
407 | case VP56_MB_INTRA:
|
||
408 | 91fc2cf1 | Aurelien Jacobs | for (b=0; b<b_max; b++) { |
409 | 442b145a | Aurelien Jacobs | plane = vp56_b2p[b+ab]; |
410 | s->dsp.idct_put(frame_current->data[plane] + s->block_offset[b], |
||
411 | s->stride[plane], s->block_coeff[b]); |
||
412 | 5ce117c3 | Aurelien Jacobs | } |
413 | break;
|
||
414 | |||
415 | case VP56_MB_INTER_NOVEC_PF:
|
||
416 | case VP56_MB_INTER_NOVEC_GF:
|
||
417 | 91fc2cf1 | Aurelien Jacobs | for (b=0; b<b_max; b++) { |
418 | 442b145a | Aurelien Jacobs | plane = vp56_b2p[b+ab]; |
419 | 5ce117c3 | Aurelien Jacobs | off = s->block_offset[b]; |
420 | 442b145a | Aurelien Jacobs | s->dsp.put_pixels_tab[1][0](frame_current->data[plane] + off, |
421 | frame_ref->data[plane] + off, |
||
422 | s->stride[plane], 8);
|
||
423 | s->dsp.idct_add(frame_current->data[plane] + off, |
||
424 | s->stride[plane], s->block_coeff[b]); |
||
425 | 5ce117c3 | Aurelien Jacobs | } |
426 | break;
|
||
427 | |||
428 | case VP56_MB_INTER_DELTA_PF:
|
||
429 | case VP56_MB_INTER_V1_PF:
|
||
430 | case VP56_MB_INTER_V2_PF:
|
||
431 | case VP56_MB_INTER_DELTA_GF:
|
||
432 | case VP56_MB_INTER_4V:
|
||
433 | case VP56_MB_INTER_V1_GF:
|
||
434 | case VP56_MB_INTER_V2_GF:
|
||
435 | 91fc2cf1 | Aurelien Jacobs | for (b=0; b<b_max; b++) { |
436 | 5ce117c3 | Aurelien Jacobs | int x_off = b==1 || b==3 ? 8 : 0; |
437 | int y_off = b==2 || b==3 ? 8 : 0; |
||
438 | 442b145a | Aurelien Jacobs | plane = vp56_b2p[b+ab]; |
439 | vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane], |
||
440 | 5ce117c3 | Aurelien Jacobs | 16*col+x_off, 16*row+y_off); |
441 | 442b145a | Aurelien Jacobs | s->dsp.idct_add(frame_current->data[plane] + s->block_offset[b], |
442 | s->stride[plane], s->block_coeff[b]); |
||
443 | 5ce117c3 | Aurelien Jacobs | } |
444 | break;
|
||
445 | } |
||
446 | } |
||
447 | |||
448 | 1457516f | Aurelien Jacobs | static int vp56_size_changed(AVCodecContext *avctx) |
449 | 5ce117c3 | Aurelien Jacobs | { |
450 | 3d52bca6 | Aurelien Jacobs | VP56Context *s = avctx->priv_data; |
451 | 704a2881 | Aurelien Jacobs | int stride = s->framep[VP56_FRAME_CURRENT]->linesize[0]; |
452 | 5ce117c3 | Aurelien Jacobs | int i;
|
453 | |||
454 | 91fc2cf1 | Aurelien Jacobs | s->plane_width[0] = s->plane_width[3] = avctx->coded_width; |
455 | 1457516f | Aurelien Jacobs | s->plane_width[1] = s->plane_width[2] = avctx->coded_width/2; |
456 | 91fc2cf1 | Aurelien Jacobs | s->plane_height[0] = s->plane_height[3] = avctx->coded_height; |
457 | 1457516f | Aurelien Jacobs | s->plane_height[1] = s->plane_height[2] = avctx->coded_height/2; |
458 | 5ce117c3 | Aurelien Jacobs | |
459 | 91fc2cf1 | Aurelien Jacobs | for (i=0; i<4; i++) |
460 | 704a2881 | Aurelien Jacobs | s->stride[i] = s->flip * s->framep[VP56_FRAME_CURRENT]->linesize[i]; |
461 | 5ce117c3 | Aurelien Jacobs | |
462 | 1457516f | Aurelien Jacobs | s->mb_width = (avctx->coded_width +15) / 16; |
463 | s->mb_height = (avctx->coded_height+15) / 16; |
||
464 | 5ce117c3 | Aurelien Jacobs | |
465 | if (s->mb_width > 1000 || s->mb_height > 1000) { |
||
466 | av_log(avctx, AV_LOG_ERROR, "picture too big\n");
|
||
467 | return -1; |
||
468 | } |
||
469 | |||
470 | 800274f8 | Reimar Döffinger | s->qscale_table = av_realloc(s->qscale_table, s->mb_width); |
471 | 5ce117c3 | Aurelien Jacobs | s->above_blocks = av_realloc(s->above_blocks, |
472 | (4*s->mb_width+6) * sizeof(*s->above_blocks)); |
||
473 | s->macroblocks = av_realloc(s->macroblocks, |
||
474 | s->mb_width*s->mb_height*sizeof(*s->macroblocks));
|
||
475 | a8678a3a | Aurelien Jacobs | av_free(s->edge_emu_buffer_alloc); |
476 | s->edge_emu_buffer_alloc = av_malloc(16*stride);
|
||
477 | 5ce117c3 | Aurelien Jacobs | s->edge_emu_buffer = s->edge_emu_buffer_alloc; |
478 | if (s->flip < 0) |
||
479 | s->edge_emu_buffer += 15 * stride;
|
||
480 | |||
481 | return 0; |
||
482 | } |
||
483 | |||
484 | d9504970 | Alex Converse | int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
485 | b6356d97 | Alex Converse | AVPacket *avpkt) |
486 | 5ce117c3 | Aurelien Jacobs | { |
487 | 012f9308 | Aurelien Jacobs | const uint8_t *buf = avpkt->data;
|
488 | 3d52bca6 | Aurelien Jacobs | VP56Context *s = avctx->priv_data; |
489 | 704a2881 | Aurelien Jacobs | AVFrame *const p = s->framep[VP56_FRAME_CURRENT];
|
490 | 012f9308 | Aurelien Jacobs | int remaining_buf_size = avpkt->size;
|
491 | ed761067 | Aurelien Jacobs | int is_alpha, av_uninit(alpha_offset);
|
492 | 91fc2cf1 | Aurelien Jacobs | |
493 | if (s->has_alpha) {
|
||
494 | 68a4d349 | Laurent Aimar | if (remaining_buf_size < 3) |
495 | return -1; |
||
496 | 91fc2cf1 | Aurelien Jacobs | alpha_offset = bytestream_get_be24(&buf); |
497 | 5210529e | Aurelien Jacobs | remaining_buf_size -= 3;
|
498 | 68a4d349 | Laurent Aimar | if (remaining_buf_size < alpha_offset)
|
499 | return -1; |
||
500 | 91fc2cf1 | Aurelien Jacobs | } |
501 | |||
502 | for (is_alpha=0; is_alpha < 1+s->has_alpha; is_alpha++) { |
||
503 | f62a2b61 | Aurelien Jacobs | int mb_row, mb_col, mb_row_flip, mb_offset = 0; |
504 | int block, y, uv, stride_y, stride_uv;
|
||
505 | int golden_frame = 0; |
||
506 | int res;
|
||
507 | 5ce117c3 | Aurelien Jacobs | |
508 | f62a2b61 | Aurelien Jacobs | s->modelp = &s->models[is_alpha]; |
509 | 247df384 | Aurelien Jacobs | |
510 | 5210529e | Aurelien Jacobs | res = s->parse_header(s, buf, remaining_buf_size, &golden_frame); |
511 | f62a2b61 | Aurelien Jacobs | if (!res)
|
512 | return -1; |
||
513 | 5ce117c3 | Aurelien Jacobs | |
514 | f62a2b61 | Aurelien Jacobs | if (!is_alpha) {
|
515 | p->reference = 1;
|
||
516 | if (avctx->get_buffer(avctx, p) < 0) { |
||
517 | av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||
518 | return -1; |
||
519 | } |
||
520 | 5ce117c3 | Aurelien Jacobs | |
521 | f62a2b61 | Aurelien Jacobs | if (res == 2) |
522 | if (vp56_size_changed(avctx)) {
|
||
523 | avctx->release_buffer(avctx, p); |
||
524 | return -1; |
||
525 | } |
||
526 | 5ce117c3 | Aurelien Jacobs | } |
527 | |||
528 | f62a2b61 | Aurelien Jacobs | if (p->key_frame) {
|
529 | p->pict_type = FF_I_TYPE; |
||
530 | s->default_models_init(s); |
||
531 | for (block=0; block<s->mb_height*s->mb_width; block++) |
||
532 | s->macroblocks[block].type = VP56_MB_INTRA; |
||
533 | } else {
|
||
534 | p->pict_type = FF_P_TYPE; |
||
535 | vp56_parse_mb_type_models(s); |
||
536 | s->parse_vector_models(s); |
||
537 | s->mb_type = VP56_MB_INTER_NOVEC_PF; |
||
538 | } |
||
539 | 5ce117c3 | Aurelien Jacobs | |
540 | f62a2b61 | Aurelien Jacobs | s->parse_coeff_models(s); |
541 | 5ce117c3 | Aurelien Jacobs | |
542 | f62a2b61 | Aurelien Jacobs | memset(s->prev_dc, 0, sizeof(s->prev_dc)); |
543 | s->prev_dc[1][VP56_FRAME_CURRENT] = 128; |
||
544 | s->prev_dc[2][VP56_FRAME_CURRENT] = 128; |
||
545 | 5ce117c3 | Aurelien Jacobs | |
546 | f62a2b61 | Aurelien Jacobs | for (block=0; block < 4*s->mb_width+6; block++) { |
547 | 738a89b9 | Carl Eugen Hoyos | s->above_blocks[block].ref_frame = VP56_FRAME_NONE; |
548 | f62a2b61 | Aurelien Jacobs | s->above_blocks[block].dc_coeff = 0;
|
549 | s->above_blocks[block].not_null_dc = 0;
|
||
550 | } |
||
551 | 738a89b9 | Carl Eugen Hoyos | s->above_blocks[2*s->mb_width + 2].ref_frame = VP56_FRAME_CURRENT; |
552 | s->above_blocks[3*s->mb_width + 4].ref_frame = VP56_FRAME_CURRENT; |
||
553 | 5ce117c3 | Aurelien Jacobs | |
554 | f62a2b61 | Aurelien Jacobs | stride_y = p->linesize[0];
|
555 | stride_uv = p->linesize[1];
|
||
556 | 5ce117c3 | Aurelien Jacobs | |
557 | if (s->flip < 0) |
||
558 | f62a2b61 | Aurelien Jacobs | mb_offset = 7;
|
559 | |||
560 | /* main macroblocks loop */
|
||
561 | for (mb_row=0; mb_row<s->mb_height; mb_row++) { |
||
562 | if (s->flip < 0) |
||
563 | mb_row_flip = s->mb_height - mb_row - 1;
|
||
564 | else
|
||
565 | mb_row_flip = mb_row; |
||
566 | |||
567 | for (block=0; block<4; block++) { |
||
568 | 738a89b9 | Carl Eugen Hoyos | s->left_block[block].ref_frame = VP56_FRAME_NONE; |
569 | f62a2b61 | Aurelien Jacobs | s->left_block[block].dc_coeff = 0;
|
570 | s->left_block[block].not_null_dc = 0;
|
||
571 | 5ce117c3 | Aurelien Jacobs | } |
572 | d3f9edba | Aurelien Jacobs | memset(s->coeff_ctx, 0, sizeof(s->coeff_ctx)); |
573 | f62a2b61 | Aurelien Jacobs | memset(s->coeff_ctx_last, 24, sizeof(s->coeff_ctx_last)); |
574 | |||
575 | s->above_block_idx[0] = 1; |
||
576 | s->above_block_idx[1] = 2; |
||
577 | s->above_block_idx[2] = 1; |
||
578 | s->above_block_idx[3] = 2; |
||
579 | s->above_block_idx[4] = 2*s->mb_width + 2 + 1; |
||
580 | s->above_block_idx[5] = 3*s->mb_width + 4 + 1; |
||
581 | |||
582 | s->block_offset[s->frbi] = (mb_row_flip*16 + mb_offset) * stride_y;
|
||
583 | s->block_offset[s->srbi] = s->block_offset[s->frbi] + 8*stride_y;
|
||
584 | s->block_offset[1] = s->block_offset[0] + 8; |
||
585 | s->block_offset[3] = s->block_offset[2] + 8; |
||
586 | s->block_offset[4] = (mb_row_flip*8 + mb_offset) * stride_uv; |
||
587 | s->block_offset[5] = s->block_offset[4]; |
||
588 | |||
589 | for (mb_col=0; mb_col<s->mb_width; mb_col++) { |
||
590 | vp56_decode_mb(s, mb_row, mb_col, is_alpha); |
||
591 | |||
592 | for (y=0; y<4; y++) { |
||
593 | s->above_block_idx[y] += 2;
|
||
594 | s->block_offset[y] += 16;
|
||
595 | } |
||
596 | 5ce117c3 | Aurelien Jacobs | |
597 | f62a2b61 | Aurelien Jacobs | for (uv=4; uv<6; uv++) { |
598 | s->above_block_idx[uv] += 1;
|
||
599 | s->block_offset[uv] += 8;
|
||
600 | } |
||
601 | 5ce117c3 | Aurelien Jacobs | } |
602 | } |
||
603 | |||
604 | f62a2b61 | Aurelien Jacobs | if (p->key_frame || golden_frame) {
|
605 | if (s->framep[VP56_FRAME_GOLDEN]->data[0] && |
||
606 | s->framep[VP56_FRAME_GOLDEN] != s->framep[VP56_FRAME_GOLDEN2]) |
||
607 | avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]); |
||
608 | s->framep[VP56_FRAME_GOLDEN] = p; |
||
609 | } |
||
610 | 91fc2cf1 | Aurelien Jacobs | |
611 | f62a2b61 | Aurelien Jacobs | if (s->has_alpha) {
|
612 | FFSWAP(AVFrame *, s->framep[VP56_FRAME_GOLDEN], |
||
613 | s->framep[VP56_FRAME_GOLDEN2]); |
||
614 | buf += alpha_offset; |
||
615 | 5210529e | Aurelien Jacobs | remaining_buf_size -= alpha_offset; |
616 | f62a2b61 | Aurelien Jacobs | } |
617 | 91fc2cf1 | Aurelien Jacobs | } |
618 | |||
619 | if (s->framep[VP56_FRAME_PREVIOUS] == s->framep[VP56_FRAME_GOLDEN] ||
|
||
620 | s->framep[VP56_FRAME_PREVIOUS] == s->framep[VP56_FRAME_GOLDEN2]) { |
||
621 | if (s->framep[VP56_FRAME_UNUSED] != s->framep[VP56_FRAME_GOLDEN] &&
|
||
622 | s->framep[VP56_FRAME_UNUSED] != s->framep[VP56_FRAME_GOLDEN2]) |
||
623 | FFSWAP(AVFrame *, s->framep[VP56_FRAME_PREVIOUS], |
||
624 | s->framep[VP56_FRAME_UNUSED]); |
||
625 | else
|
||
626 | FFSWAP(AVFrame *, s->framep[VP56_FRAME_PREVIOUS], |
||
627 | s->framep[VP56_FRAME_UNUSED2]); |
||
628 | } else if (s->framep[VP56_FRAME_PREVIOUS]->data[0]) |
||
629 | avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]); |
||
630 | 704a2881 | Aurelien Jacobs | FFSWAP(AVFrame *, s->framep[VP56_FRAME_CURRENT], |
631 | s->framep[VP56_FRAME_PREVIOUS]); |
||
632 | 5ce117c3 | Aurelien Jacobs | |
633 | 800274f8 | Reimar Döffinger | p->qstride = 0;
|
634 | p->qscale_table = s->qscale_table; |
||
635 | p->qscale_type = FF_QSCALE_TYPE_VP56; |
||
636 | eba0fcad | Aurelien Jacobs | *(AVFrame*)data = *p; |
637 | *data_size = sizeof(AVFrame);
|
||
638 | 5ce117c3 | Aurelien Jacobs | |
639 | 012f9308 | Aurelien Jacobs | return avpkt->size;
|
640 | 5ce117c3 | Aurelien Jacobs | } |
641 | |||
642 | d9504970 | Alex Converse | av_cold void ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha) |
643 | 5ce117c3 | Aurelien Jacobs | { |
644 | 3d52bca6 | Aurelien Jacobs | VP56Context *s = avctx->priv_data; |
645 | 5ce117c3 | Aurelien Jacobs | int i;
|
646 | |||
647 | s->avctx = avctx; |
||
648 | 91fc2cf1 | Aurelien Jacobs | avctx->pix_fmt = has_alpha ? PIX_FMT_YUVA420P : PIX_FMT_YUV420P; |
649 | 5ce117c3 | Aurelien Jacobs | |
650 | 1457516f | Aurelien Jacobs | if (avctx->idct_algo == FF_IDCT_AUTO)
|
651 | avctx->idct_algo = FF_IDCT_VP3; |
||
652 | dsputil_init(&s->dsp, avctx); |
||
653 | 5e1ba34b | Måns Rullgård | ff_vp56dsp_init(&s->vp56dsp, avctx->codec->id); |
654 | 5ce117c3 | Aurelien Jacobs | ff_init_scantable(s->dsp.idct_permutation, &s->scantable,ff_zigzag_direct); |
655 | |||
656 | 91fc2cf1 | Aurelien Jacobs | for (i=0; i<4; i++) |
657 | 704a2881 | Aurelien Jacobs | s->framep[i] = &s->frames[i]; |
658 | s->framep[VP56_FRAME_UNUSED] = s->framep[VP56_FRAME_GOLDEN]; |
||
659 | 91fc2cf1 | Aurelien Jacobs | s->framep[VP56_FRAME_UNUSED2] = s->framep[VP56_FRAME_GOLDEN2]; |
660 | 5ce117c3 | Aurelien Jacobs | s->edge_emu_buffer_alloc = NULL;
|
661 | |||
662 | s->above_blocks = NULL;
|
||
663 | s->macroblocks = NULL;
|
||
664 | s->quantizer = -1;
|
||
665 | s->deblock_filtering = 1;
|
||
666 | |||
667 | s->filter = NULL;
|
||
668 | |||
669 | 91fc2cf1 | Aurelien Jacobs | s->has_alpha = has_alpha; |
670 | 5ce117c3 | Aurelien Jacobs | if (flip) {
|
671 | s->flip = -1;
|
||
672 | s->frbi = 2;
|
||
673 | s->srbi = 0;
|
||
674 | } else {
|
||
675 | s->flip = 1;
|
||
676 | s->frbi = 0;
|
||
677 | s->srbi = 2;
|
||
678 | } |
||
679 | } |
||
680 | |||
681 | d9504970 | Alex Converse | av_cold int ff_vp56_free(AVCodecContext *avctx)
|
682 | 5ce117c3 | Aurelien Jacobs | { |
683 | 3d52bca6 | Aurelien Jacobs | VP56Context *s = avctx->priv_data; |
684 | 5ce117c3 | Aurelien Jacobs | |
685 | 800274f8 | Reimar Döffinger | av_freep(&s->qscale_table); |
686 | 6242b1c4 | Reimar Döffinger | av_freep(&s->above_blocks); |
687 | av_freep(&s->macroblocks); |
||
688 | av_freep(&s->edge_emu_buffer_alloc); |
||
689 | 1457516f | Aurelien Jacobs | if (s->framep[VP56_FRAME_GOLDEN]->data[0]) |
690 | 704a2881 | Aurelien Jacobs | avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN]); |
691 | 91fc2cf1 | Aurelien Jacobs | if (s->framep[VP56_FRAME_GOLDEN2]->data[0]) |
692 | avctx->release_buffer(avctx, s->framep[VP56_FRAME_GOLDEN2]); |
||
693 | 704a2881 | Aurelien Jacobs | if (s->framep[VP56_FRAME_PREVIOUS]->data[0]) |
694 | avctx->release_buffer(avctx, s->framep[VP56_FRAME_PREVIOUS]); |
||
695 | 5ce117c3 | Aurelien Jacobs | return 0; |
696 | } |