Commit | Line | Data |
---|---|---|
2ba45a60 DM |
1 | /* |
2 | * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org> | |
3 | * | |
4 | * This file is part of FFmpeg. | |
5 | * | |
6 | * FFmpeg is free software; you can redistribute it and/or | |
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 | * | |
11 | * FFmpeg is distributed in the hope that it will be useful, | |
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 | |
17 | * License along with FFmpeg; if not, write to the Free Software | |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
19 | */ | |
20 | ||
21 | /** | |
22 | * @file | |
23 | * VP5 and VP6 compatible video decoder (common features) | |
24 | */ | |
25 | ||
26 | #include "avcodec.h" | |
27 | #include "bytestream.h" | |
28 | #include "internal.h" | |
29 | #include "h264chroma.h" | |
30 | #include "vp56.h" | |
31 | #include "vp56data.h" | |
32 | ||
33 | ||
34 | void ff_vp56_init_dequant(VP56Context *s, int quantizer) | |
35 | { | |
36 | s->quantizer = quantizer; | |
37 | s->dequant_dc = ff_vp56_dc_dequant[quantizer] << 2; | |
38 | s->dequant_ac = ff_vp56_ac_dequant[quantizer] << 2; | |
39 | } | |
40 | ||
41 | static int vp56_get_vectors_predictors(VP56Context *s, int row, int col, | |
42 | VP56Frame ref_frame) | |
43 | { | |
44 | int nb_pred = 0; | |
45 | VP56mv vect[2] = {{0,0}, {0,0}}; | |
46 | int pos, offset; | |
47 | VP56mv mvp; | |
48 | ||
49 | for (pos=0; pos<12; pos++) { | |
50 | mvp.x = col + ff_vp56_candidate_predictor_pos[pos][0]; | |
51 | mvp.y = row + ff_vp56_candidate_predictor_pos[pos][1]; | |
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 | ||
57 | if (ff_vp56_reference_frame[s->macroblocks[offset].type] != ref_frame) | |
58 | continue; | |
59 | if ((s->macroblocks[offset].mv.x == vect[0].x && | |
60 | s->macroblocks[offset].mv.y == vect[0].y) || | |
61 | (s->macroblocks[offset].mv.x == 0 && | |
62 | s->macroblocks[offset].mv.y == 0)) | |
63 | continue; | |
64 | ||
65 | vect[nb_pred++] = s->macroblocks[offset].mv; | |
66 | if (nb_pred > 1) { | |
67 | nb_pred = -1; | |
68 | break; | |
69 | } | |
70 | s->vector_candidate_pos = pos; | |
71 | } | |
72 | ||
73 | s->vector_candidate[0] = vect[0]; | |
74 | s->vector_candidate[1] = vect[1]; | |
75 | ||
76 | return nb_pred+1; | |
77 | } | |
78 | ||
79 | static void vp56_parse_mb_type_models(VP56Context *s) | |
80 | { | |
81 | VP56RangeCoder *c = &s->c; | |
82 | VP56Model *model = s->modelp; | |
83 | int i, ctx, type; | |
84 | ||
85 | for (ctx=0; ctx<3; ctx++) { | |
86 | if (vp56_rac_get_prob_branchy(c, 174)) { | |
87 | int idx = vp56_rac_gets(c, 4); | |
88 | memcpy(model->mb_types_stats[ctx], | |
89 | ff_vp56_pre_def_mb_type_stats[idx][ctx], | |
90 | sizeof(model->mb_types_stats[ctx])); | |
91 | } | |
92 | if (vp56_rac_get_prob_branchy(c, 254)) { | |
93 | for (type=0; type<10; type++) { | |
94 | for(i=0; i<2; i++) { | |
95 | if (vp56_rac_get_prob_branchy(c, 205)) { | |
96 | int delta, sign = vp56_rac_get(c); | |
97 | ||
98 | delta = vp56_rac_get_tree(c, ff_vp56_pmbtm_tree, | |
99 | ff_vp56_mb_type_model_model); | |
100 | if (!delta) | |
101 | delta = 4 * vp56_rac_gets(c, 7); | |
102 | model->mb_types_stats[ctx][type][i] += (delta ^ -sign) + sign; | |
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++) | |
114 | p[type] = 100 * model->mb_types_stats[ctx][type][1]; | |
115 | ||
116 | for (type=0; type<10; type++) { | |
117 | int p02, p34, p0234, p17, p56, p89, p5689, p156789; | |
118 | ||
119 | /* conservative MB type probability */ | |
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]); | |
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 | ||
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); | |
143 | ||
144 | /* restore initial value */ | |
145 | p[type] = 100 * model->mb_types_stats[ctx][type][1]; | |
146 | } | |
147 | } | |
148 | } | |
149 | ||
150 | static VP56mb vp56_parse_mb_type(VP56Context *s, | |
151 | VP56mb prev_type, int ctx) | |
152 | { | |
153 | uint8_t *mb_type_model = s->modelp->mb_type[ctx][prev_type]; | |
154 | VP56RangeCoder *c = &s->c; | |
155 | ||
156 | if (vp56_rac_get_prob_branchy(c, mb_type_model[0])) | |
157 | return prev_type; | |
158 | else | |
159 | return vp56_rac_get_tree(c, ff_vp56_pmbt_tree, mb_type_model); | |
160 | } | |
161 | ||
162 | static void vp56_decode_4mv(VP56Context *s, int row, int col) | |
163 | { | |
164 | VP56mv mv = {0,0}; | |
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: | |
179 | s->mv[b] = (VP56mv) {0,0}; | |
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 */ | |
199 | if (s->avctx->codec->id == AV_CODEC_ID_VP5) { | |
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 { | |
203 | s->mv[4] = s->mv[5] = (VP56mv) {mv.x/4, mv.y/4}; | |
204 | } | |
205 | } | |
206 | ||
207 | static VP56mb vp56_decode_mv(VP56Context *s, int row, int col) | |
208 | { | |
209 | VP56mv *mv, vect = {0,0}; | |
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: | |
236 | s->parse_vector_adjustment(s, &vect); | |
237 | mv = &vect; | |
238 | break; | |
239 | ||
240 | case VP56_MB_INTER_DELTA_GF: | |
241 | vp56_get_vectors_predictors(s, row, col, VP56_FRAME_GOLDEN); | |
242 | s->parse_vector_adjustment(s, &vect); | |
243 | mv = &vect; | |
244 | break; | |
245 | ||
246 | case VP56_MB_INTER_4V: | |
247 | vp56_decode_4mv(s, row, col); | |
248 | return s->mb_type; | |
249 | ||
250 | default: | |
251 | mv = &vect; | |
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 | ||
264 | static void vp56_add_predictors_dc(VP56Context *s, VP56Frame ref_frame) | |
265 | { | |
266 | int idx = s->idct_scantable[0]; | |
267 | int b; | |
268 | ||
269 | for (b=0; b<6; b++) { | |
270 | VP56RefDc *ab = &s->above_blocks[s->above_block_idx[b]]; | |
271 | VP56RefDc *lb = &s->left_block[ff_vp56_b6to4[b]]; | |
272 | int count = 0; | |
273 | int dc = 0; | |
274 | int i; | |
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 | } | |
284 | if (s->avctx->codec->id == AV_CODEC_ID_VP5) | |
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 | } | |
290 | if (count == 0) | |
291 | dc = s->prev_dc[ff_vp56_b2p[b]][ref_frame]; | |
292 | else if (count == 2) | |
293 | dc /= 2; | |
294 | ||
295 | s->block_coeff[b][idx] += dc; | |
296 | s->prev_dc[ff_vp56_b2p[b]][ref_frame] = s->block_coeff[b][idx]; | |
297 | ab->dc_coeff = s->block_coeff[b][idx]; | |
298 | ab->ref_frame = ref_frame; | |
299 | lb->dc_coeff = s->block_coeff[b][idx]; | |
300 | lb->ref_frame = ref_frame; | |
301 | s->block_coeff[b][idx] *= s->dequant_dc; | |
302 | } | |
303 | } | |
304 | ||
305 | static void vp56_deblock_filter(VP56Context *s, uint8_t *yuv, | |
306 | ptrdiff_t stride, int dx, int dy) | |
307 | { | |
308 | int t = ff_vp56_filter_threshold[s->quantizer]; | |
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); | |
311 | } | |
312 | ||
313 | static void vp56_mc(VP56Context *s, int b, int plane, uint8_t *src, | |
314 | ptrdiff_t stride, int x, int y) | |
315 | { | |
316 | uint8_t *dst = s->frames[VP56_FRAME_CURRENT]->data[plane] + s->block_offset[b]; | |
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 | |
327 | && !s->frames[VP56_FRAME_CURRENT]->key_frame)) | |
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]) { | |
342 | s->vdsp.emulated_edge_mc(s->edge_emu_buffer, | |
343 | src + s->block_offset[b] + (dy-2)*stride + (dx-2), | |
344 | stride, stride, | |
345 | 12, 12, x, y, | |
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) { | |
351 | /* only need a 12x12 block, but there is no such dsp function, */ | |
352 | /* so copy a 16x12 block */ | |
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); | |
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 | |
376 | s->vp3dsp.put_no_rnd_pixels_l2(dst, src_block+src_offset, | |
377 | src_block+src_offset+overlap_offset, | |
378 | stride, 8); | |
379 | } else { | |
380 | s->hdsp.put_pixels_tab[1][0](dst, src_block+src_offset, stride, 8); | |
381 | } | |
382 | } | |
383 | ||
384 | static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha) | |
385 | { | |
386 | AVFrame *frame_current, *frame_ref; | |
387 | VP56mb mb_type; | |
388 | VP56Frame ref_frame; | |
389 | int b, ab, b_max, plane, off; | |
390 | ||
391 | if (s->frames[VP56_FRAME_CURRENT]->key_frame) | |
392 | mb_type = VP56_MB_INTRA; | |
393 | else | |
394 | mb_type = vp56_decode_mv(s, row, col); | |
395 | ref_frame = ff_vp56_reference_frame[mb_type]; | |
396 | ||
397 | s->parse_coeff(s); | |
398 | ||
399 | vp56_add_predictors_dc(s, ref_frame); | |
400 | ||
401 | frame_current = s->frames[VP56_FRAME_CURRENT]; | |
402 | frame_ref = s->frames[ref_frame]; | |
403 | if (mb_type != VP56_MB_INTRA && !frame_ref->data[0]) | |
404 | return; | |
405 | ||
406 | ab = 6*is_alpha; | |
407 | b_max = 6 - 2*is_alpha; | |
408 | ||
409 | switch (mb_type) { | |
410 | case VP56_MB_INTRA: | |
411 | for (b=0; b<b_max; b++) { | |
412 | plane = ff_vp56_b2p[b+ab]; | |
413 | s->vp3dsp.idct_put(frame_current->data[plane] + s->block_offset[b], | |
414 | s->stride[plane], s->block_coeff[b]); | |
415 | } | |
416 | break; | |
417 | ||
418 | case VP56_MB_INTER_NOVEC_PF: | |
419 | case VP56_MB_INTER_NOVEC_GF: | |
420 | for (b=0; b<b_max; b++) { | |
421 | plane = ff_vp56_b2p[b+ab]; | |
422 | off = s->block_offset[b]; | |
423 | s->hdsp.put_pixels_tab[1][0](frame_current->data[plane] + off, | |
424 | frame_ref->data[plane] + off, | |
425 | s->stride[plane], 8); | |
426 | s->vp3dsp.idct_add(frame_current->data[plane] + off, | |
427 | s->stride[plane], s->block_coeff[b]); | |
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: | |
438 | for (b=0; b<b_max; b++) { | |
439 | int x_off = b==1 || b==3 ? 8 : 0; | |
440 | int y_off = b==2 || b==3 ? 8 : 0; | |
441 | plane = ff_vp56_b2p[b+ab]; | |
442 | vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane], | |
443 | 16*col+x_off, 16*row+y_off); | |
444 | s->vp3dsp.idct_add(frame_current->data[plane] + s->block_offset[b], | |
445 | s->stride[plane], s->block_coeff[b]); | |
446 | } | |
447 | break; | |
448 | } | |
449 | ||
450 | if (is_alpha) { | |
451 | s->block_coeff[4][0] = 0; | |
452 | s->block_coeff[5][0] = 0; | |
453 | } | |
454 | } | |
455 | ||
456 | static int vp56_size_changed(VP56Context *s) | |
457 | { | |
458 | AVCodecContext *avctx = s->avctx; | |
459 | int stride = s->frames[VP56_FRAME_CURRENT]->linesize[0]; | |
460 | int i; | |
461 | ||
462 | s->plane_width[0] = s->plane_width[3] = avctx->coded_width; | |
463 | s->plane_width[1] = s->plane_width[2] = avctx->coded_width/2; | |
464 | s->plane_height[0] = s->plane_height[3] = avctx->coded_height; | |
465 | s->plane_height[1] = s->plane_height[2] = avctx->coded_height/2; | |
466 | ||
467 | for (i=0; i<4; i++) | |
468 | s->stride[i] = s->flip * s->frames[VP56_FRAME_CURRENT]->linesize[i]; | |
469 | ||
470 | s->mb_width = (avctx->coded_width +15) / 16; | |
471 | s->mb_height = (avctx->coded_height+15) / 16; | |
472 | ||
473 | if (s->mb_width > 1000 || s->mb_height > 1000) { | |
474 | ff_set_dimensions(avctx, 0, 0); | |
475 | av_log(avctx, AV_LOG_ERROR, "picture too big\n"); | |
476 | return -1; | |
477 | } | |
478 | ||
479 | av_reallocp_array(&s->above_blocks, 4*s->mb_width+6, | |
480 | sizeof(*s->above_blocks)); | |
481 | av_reallocp_array(&s->macroblocks, s->mb_width*s->mb_height, | |
482 | sizeof(*s->macroblocks)); | |
483 | av_free(s->edge_emu_buffer_alloc); | |
484 | s->edge_emu_buffer_alloc = av_malloc(16*stride); | |
485 | s->edge_emu_buffer = s->edge_emu_buffer_alloc; | |
486 | if (!s->above_blocks || !s->macroblocks || !s->edge_emu_buffer_alloc) | |
487 | return AVERROR(ENOMEM); | |
488 | if (s->flip < 0) | |
489 | s->edge_emu_buffer += 15 * stride; | |
490 | ||
491 | if (s->alpha_context) | |
492 | return vp56_size_changed(s->alpha_context); | |
493 | ||
494 | return 0; | |
495 | } | |
496 | ||
497 | static int ff_vp56_decode_mbs(AVCodecContext *avctx, void *, int, int); | |
498 | ||
499 | int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, | |
500 | AVPacket *avpkt) | |
501 | { | |
502 | const uint8_t *buf = avpkt->data; | |
503 | VP56Context *s = avctx->priv_data; | |
504 | AVFrame *const p = s->frames[VP56_FRAME_CURRENT]; | |
505 | int remaining_buf_size = avpkt->size; | |
506 | int av_uninit(alpha_offset); | |
507 | int i, res; | |
508 | int ret; | |
509 | ||
510 | if (s->has_alpha) { | |
511 | if (remaining_buf_size < 3) | |
512 | return -1; | |
513 | alpha_offset = bytestream_get_be24(&buf); | |
514 | remaining_buf_size -= 3; | |
515 | if (remaining_buf_size < alpha_offset) | |
516 | return -1; | |
517 | } | |
518 | ||
519 | res = s->parse_header(s, buf, remaining_buf_size); | |
520 | if (res < 0) | |
521 | return res; | |
522 | ||
523 | if (res == VP56_SIZE_CHANGE) { | |
524 | for (i = 0; i < 4; i++) { | |
525 | av_frame_unref(s->frames[i]); | |
526 | if (s->alpha_context) | |
527 | av_frame_unref(s->alpha_context->frames[i]); | |
528 | } | |
529 | } | |
530 | ||
531 | if (ff_get_buffer(avctx, p, AV_GET_BUFFER_FLAG_REF) < 0) | |
532 | return -1; | |
533 | ||
534 | if (avctx->pix_fmt == AV_PIX_FMT_YUVA420P) { | |
535 | av_frame_unref(s->alpha_context->frames[VP56_FRAME_CURRENT]); | |
536 | if ((ret = av_frame_ref(s->alpha_context->frames[VP56_FRAME_CURRENT], p)) < 0) { | |
537 | av_frame_unref(p); | |
538 | return ret; | |
539 | } | |
540 | } | |
541 | ||
542 | if (res == VP56_SIZE_CHANGE) { | |
543 | if (vp56_size_changed(s)) { | |
544 | av_frame_unref(p); | |
545 | return -1; | |
546 | } | |
547 | } | |
548 | ||
549 | if (avctx->pix_fmt == AV_PIX_FMT_YUVA420P) { | |
550 | int bak_w = avctx->width; | |
551 | int bak_h = avctx->height; | |
552 | int bak_cw = avctx->coded_width; | |
553 | int bak_ch = avctx->coded_height; | |
554 | buf += alpha_offset; | |
555 | remaining_buf_size -= alpha_offset; | |
556 | ||
557 | res = s->alpha_context->parse_header(s->alpha_context, buf, remaining_buf_size); | |
558 | if (res != 0) { | |
559 | if(res==VP56_SIZE_CHANGE) { | |
560 | av_log(avctx, AV_LOG_ERROR, "Alpha reconfiguration\n"); | |
561 | avctx->width = bak_w; | |
562 | avctx->height = bak_h; | |
563 | avctx->coded_width = bak_cw; | |
564 | avctx->coded_height = bak_ch; | |
565 | } | |
566 | av_frame_unref(p); | |
567 | return -1; | |
568 | } | |
569 | } | |
570 | ||
571 | avctx->execute2(avctx, ff_vp56_decode_mbs, 0, 0, (avctx->pix_fmt == AV_PIX_FMT_YUVA420P) + 1); | |
572 | ||
573 | if ((res = av_frame_ref(data, p)) < 0) | |
574 | return res; | |
575 | *got_frame = 1; | |
576 | ||
577 | return avpkt->size; | |
578 | } | |
579 | ||
580 | static int ff_vp56_decode_mbs(AVCodecContext *avctx, void *data, | |
581 | int jobnr, int threadnr) | |
582 | { | |
583 | VP56Context *s0 = avctx->priv_data; | |
584 | int is_alpha = (jobnr == 1); | |
585 | VP56Context *s = is_alpha ? s0->alpha_context : s0; | |
586 | AVFrame *const p = s->frames[VP56_FRAME_CURRENT]; | |
587 | int mb_row, mb_col, mb_row_flip, mb_offset = 0; | |
588 | int block, y, uv; | |
589 | ptrdiff_t stride_y, stride_uv; | |
590 | int res; | |
591 | ||
592 | if (p->key_frame) { | |
593 | p->pict_type = AV_PICTURE_TYPE_I; | |
594 | s->default_models_init(s); | |
595 | for (block=0; block<s->mb_height*s->mb_width; block++) | |
596 | s->macroblocks[block].type = VP56_MB_INTRA; | |
597 | } else { | |
598 | p->pict_type = AV_PICTURE_TYPE_P; | |
599 | vp56_parse_mb_type_models(s); | |
600 | s->parse_vector_models(s); | |
601 | s->mb_type = VP56_MB_INTER_NOVEC_PF; | |
602 | } | |
603 | ||
604 | if (s->parse_coeff_models(s)) | |
605 | goto next; | |
606 | ||
607 | memset(s->prev_dc, 0, sizeof(s->prev_dc)); | |
608 | s->prev_dc[1][VP56_FRAME_CURRENT] = 128; | |
609 | s->prev_dc[2][VP56_FRAME_CURRENT] = 128; | |
610 | ||
611 | for (block=0; block < 4*s->mb_width+6; block++) { | |
612 | s->above_blocks[block].ref_frame = VP56_FRAME_NONE; | |
613 | s->above_blocks[block].dc_coeff = 0; | |
614 | s->above_blocks[block].not_null_dc = 0; | |
615 | } | |
616 | s->above_blocks[2*s->mb_width + 2].ref_frame = VP56_FRAME_CURRENT; | |
617 | s->above_blocks[3*s->mb_width + 4].ref_frame = VP56_FRAME_CURRENT; | |
618 | ||
619 | stride_y = p->linesize[0]; | |
620 | stride_uv = p->linesize[1]; | |
621 | ||
622 | if (s->flip < 0) | |
623 | mb_offset = 7; | |
624 | ||
625 | /* main macroblocks loop */ | |
626 | for (mb_row=0; mb_row<s->mb_height; mb_row++) { | |
627 | if (s->flip < 0) | |
628 | mb_row_flip = s->mb_height - mb_row - 1; | |
629 | else | |
630 | mb_row_flip = mb_row; | |
631 | ||
632 | for (block=0; block<4; block++) { | |
633 | s->left_block[block].ref_frame = VP56_FRAME_NONE; | |
634 | s->left_block[block].dc_coeff = 0; | |
635 | s->left_block[block].not_null_dc = 0; | |
636 | } | |
637 | memset(s->coeff_ctx, 0, sizeof(s->coeff_ctx)); | |
638 | memset(s->coeff_ctx_last, 24, sizeof(s->coeff_ctx_last)); | |
639 | ||
640 | s->above_block_idx[0] = 1; | |
641 | s->above_block_idx[1] = 2; | |
642 | s->above_block_idx[2] = 1; | |
643 | s->above_block_idx[3] = 2; | |
644 | s->above_block_idx[4] = 2*s->mb_width + 2 + 1; | |
645 | s->above_block_idx[5] = 3*s->mb_width + 4 + 1; | |
646 | ||
647 | s->block_offset[s->frbi] = (mb_row_flip*16 + mb_offset) * stride_y; | |
648 | s->block_offset[s->srbi] = s->block_offset[s->frbi] + 8*stride_y; | |
649 | s->block_offset[1] = s->block_offset[0] + 8; | |
650 | s->block_offset[3] = s->block_offset[2] + 8; | |
651 | s->block_offset[4] = (mb_row_flip*8 + mb_offset) * stride_uv; | |
652 | s->block_offset[5] = s->block_offset[4]; | |
653 | ||
654 | for (mb_col=0; mb_col<s->mb_width; mb_col++) { | |
655 | vp56_decode_mb(s, mb_row, mb_col, is_alpha); | |
656 | ||
657 | for (y=0; y<4; y++) { | |
658 | s->above_block_idx[y] += 2; | |
659 | s->block_offset[y] += 16; | |
660 | } | |
661 | ||
662 | for (uv=4; uv<6; uv++) { | |
663 | s->above_block_idx[uv] += 1; | |
664 | s->block_offset[uv] += 8; | |
665 | } | |
666 | } | |
667 | } | |
668 | ||
669 | next: | |
670 | if (p->key_frame || s->golden_frame) { | |
671 | av_frame_unref(s->frames[VP56_FRAME_GOLDEN]); | |
672 | if ((res = av_frame_ref(s->frames[VP56_FRAME_GOLDEN], p)) < 0) | |
673 | return res; | |
674 | } | |
675 | ||
676 | av_frame_unref(s->frames[VP56_FRAME_PREVIOUS]); | |
677 | FFSWAP(AVFrame *, s->frames[VP56_FRAME_CURRENT], | |
678 | s->frames[VP56_FRAME_PREVIOUS]); | |
679 | return 0; | |
680 | } | |
681 | ||
682 | av_cold int ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha) | |
683 | { | |
684 | VP56Context *s = avctx->priv_data; | |
685 | return ff_vp56_init_context(avctx, s, flip, has_alpha); | |
686 | } | |
687 | ||
688 | av_cold int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s, | |
689 | int flip, int has_alpha) | |
690 | { | |
691 | int i; | |
692 | ||
693 | s->avctx = avctx; | |
694 | avctx->pix_fmt = has_alpha ? AV_PIX_FMT_YUVA420P : AV_PIX_FMT_YUV420P; | |
695 | if (avctx->skip_alpha) avctx->pix_fmt = AV_PIX_FMT_YUV420P; | |
696 | ||
697 | ff_h264chroma_init(&s->h264chroma, 8); | |
698 | ff_hpeldsp_init(&s->hdsp, avctx->flags); | |
699 | ff_videodsp_init(&s->vdsp, 8); | |
700 | ff_vp3dsp_init(&s->vp3dsp, avctx->flags); | |
701 | ff_vp56dsp_init(&s->vp56dsp, avctx->codec->id); | |
702 | for (i = 0; i < 64; i++) { | |
703 | #define TRANSPOSE(x) (x >> 3) | ((x & 7) << 3) | |
704 | s->idct_scantable[i] = TRANSPOSE(ff_zigzag_direct[i]); | |
705 | #undef TRANSPOSE | |
706 | } | |
707 | ||
708 | for (i = 0; i < FF_ARRAY_ELEMS(s->frames); i++) { | |
709 | s->frames[i] = av_frame_alloc(); | |
710 | if (!s->frames[i]) { | |
711 | ff_vp56_free(avctx); | |
712 | return AVERROR(ENOMEM); | |
713 | } | |
714 | } | |
715 | s->edge_emu_buffer_alloc = NULL; | |
716 | ||
717 | s->above_blocks = NULL; | |
718 | s->macroblocks = NULL; | |
719 | s->quantizer = -1; | |
720 | s->deblock_filtering = 1; | |
721 | s->golden_frame = 0; | |
722 | ||
723 | s->filter = NULL; | |
724 | ||
725 | s->has_alpha = has_alpha; | |
726 | ||
727 | s->modelp = &s->model; | |
728 | ||
729 | if (flip) { | |
730 | s->flip = -1; | |
731 | s->frbi = 2; | |
732 | s->srbi = 0; | |
733 | } else { | |
734 | s->flip = 1; | |
735 | s->frbi = 0; | |
736 | s->srbi = 2; | |
737 | } | |
738 | ||
739 | return 0; | |
740 | } | |
741 | ||
742 | av_cold int ff_vp56_free(AVCodecContext *avctx) | |
743 | { | |
744 | VP56Context *s = avctx->priv_data; | |
745 | return ff_vp56_free_context(s); | |
746 | } | |
747 | ||
748 | av_cold int ff_vp56_free_context(VP56Context *s) | |
749 | { | |
750 | int i; | |
751 | ||
752 | av_freep(&s->above_blocks); | |
753 | av_freep(&s->macroblocks); | |
754 | av_freep(&s->edge_emu_buffer_alloc); | |
755 | ||
756 | for (i = 0; i < FF_ARRAY_ELEMS(s->frames); i++) | |
757 | av_frame_free(&s->frames[i]); | |
758 | ||
759 | return 0; | |
760 | } |