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