2 * @file libavcodec/vp56.c
3 * VP5 and VP6 compatible video decoder (common features)
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
7 * This file is part of FFmpeg.
9 * FFmpeg is free software; you can redistribute it and/or
10 * 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.
14 * FFmpeg is distributed in the hope that it will be useful,
15 * 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.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "bytestream.h"
31 void vp56_init_dequant(VP56Context
*s
, int quantizer
)
33 s
->quantizer
= quantizer
;
34 s
->dequant_dc
= vp56_dc_dequant
[quantizer
] << 2;
35 s
->dequant_ac
= vp56_ac_dequant
[quantizer
] << 2;
38 static int vp56_get_vectors_predictors(VP56Context
*s
, int row
, int col
,
42 VP56mv vect
[2] = {{0,0}, {0,0}};
46 for (pos
=0; pos
<12; pos
++) {
47 mvp
.x
= col
+ vp56_candidate_predictor_pos
[pos
][0];
48 mvp
.y
= row
+ vp56_candidate_predictor_pos
[pos
][1];
49 if (mvp
.x
< 0 || mvp
.x
>= s
->mb_width
||
50 mvp
.y
< 0 || mvp
.y
>= s
->mb_height
)
52 offset
= mvp
.x
+ s
->mb_width
*mvp
.y
;
54 if (vp56_reference_frame
[s
->macroblocks
[offset
].type
] != ref_frame
)
56 if ((s
->macroblocks
[offset
].mv
.x
== vect
[0].x
&&
57 s
->macroblocks
[offset
].mv
.y
== vect
[0].y
) ||
58 (s
->macroblocks
[offset
].mv
.x
== 0 &&
59 s
->macroblocks
[offset
].mv
.y
== 0))
62 vect
[nb_pred
++] = s
->macroblocks
[offset
].mv
;
67 s
->vector_candidate_pos
= pos
;
70 s
->vector_candidate
[0] = vect
[0];
71 s
->vector_candidate
[1] = vect
[1];
76 static void vp56_parse_mb_type_models(VP56Context
*s
)
78 VP56RangeCoder
*c
= &s
->c
;
79 VP56Model
*model
= s
->modelp
;
82 for (ctx
=0; ctx
<3; ctx
++) {
83 if (vp56_rac_get_prob(c
, 174)) {
84 int idx
= vp56_rac_gets(c
, 4);
85 memcpy(model
->mb_types_stats
[ctx
],
86 vp56_pre_def_mb_type_stats
[idx
][ctx
],
87 sizeof(model
->mb_types_stats
[ctx
]));
89 if (vp56_rac_get_prob(c
, 254)) {
90 for (type
=0; type
<10; type
++) {
92 if (vp56_rac_get_prob(c
, 205)) {
93 int delta
, sign
= vp56_rac_get(c
);
95 delta
= vp56_rac_get_tree(c
, vp56_pmbtm_tree
,
96 vp56_mb_type_model_model
);
98 delta
= 4 * vp56_rac_gets(c
, 7);
99 model
->mb_types_stats
[ctx
][type
][i
] += (delta
^ -sign
) + sign
;
106 /* compute MB type probability tables based on previous MB type */
107 for (ctx
=0; ctx
<3; ctx
++) {
110 for (type
=0; type
<10; type
++)
111 p
[type
] = 100 * model
->mb_types_stats
[ctx
][type
][1];
113 for (type
=0; type
<10; type
++) {
114 int p02
, p34
, p0234
, p17
, p56
, p89
, p5689
, p156789
;
116 /* conservative MB type probability */
117 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 p
[type
] = 0; /* same MB type => weight is null */
121 /* binary tree parsing probabilities */
129 p156789
= p17
+ p5689
;
131 model
->mb_type
[ctx
][type
][1] = 1 + 255 * p0234
/(1+p0234
+p156789
);
132 model
->mb_type
[ctx
][type
][2] = 1 + 255 * p02
/ (1+p0234
);
133 model
->mb_type
[ctx
][type
][3] = 1 + 255 * p17
/ (1+p156789
);
134 model
->mb_type
[ctx
][type
][4] = 1 + 255 * p
[0] / (1+p02
);
135 model
->mb_type
[ctx
][type
][5] = 1 + 255 * p
[3] / (1+p34
);
136 model
->mb_type
[ctx
][type
][6] = 1 + 255 * p
[1] / (1+p17
);
137 model
->mb_type
[ctx
][type
][7] = 1 + 255 * p56
/ (1+p5689
);
138 model
->mb_type
[ctx
][type
][8] = 1 + 255 * p
[5] / (1+p56
);
139 model
->mb_type
[ctx
][type
][9] = 1 + 255 * p
[8] / (1+p89
);
141 /* restore initial value */
142 p
[type
] = 100 * model
->mb_types_stats
[ctx
][type
][1];
147 static VP56mb
vp56_parse_mb_type(VP56Context
*s
,
148 VP56mb prev_type
, int ctx
)
150 uint8_t *mb_type_model
= s
->modelp
->mb_type
[ctx
][prev_type
];
151 VP56RangeCoder
*c
= &s
->c
;
153 if (vp56_rac_get_prob(c
, mb_type_model
[0]))
156 return vp56_rac_get_tree(c
, vp56_pmbt_tree
, mb_type_model
);
159 static void vp56_decode_4mv(VP56Context
*s
, int row
, int col
)
165 /* parse each block type */
166 for (b
=0; b
<4; b
++) {
167 type
[b
] = vp56_rac_gets(&s
->c
, 2);
169 type
[b
]++; /* only returns 0, 2, 3 or 4 (all INTER_PF) */
173 for (b
=0; b
<4; b
++) {
175 case VP56_MB_INTER_NOVEC_PF
:
176 s
->mv
[b
] = (VP56mv
) {0,0};
178 case VP56_MB_INTER_DELTA_PF
:
179 s
->parse_vector_adjustment(s
, &s
->mv
[b
]);
181 case VP56_MB_INTER_V1_PF
:
182 s
->mv
[b
] = s
->vector_candidate
[0];
184 case VP56_MB_INTER_V2_PF
:
185 s
->mv
[b
] = s
->vector_candidate
[1];
192 /* this is the one selected for the whole MB for prediction */
193 s
->macroblocks
[row
* s
->mb_width
+ col
].mv
= s
->mv
[3];
195 /* chroma vectors are average luma vectors */
196 if (s
->avctx
->codec
->id
== CODEC_ID_VP5
) {
197 s
->mv
[4].x
= s
->mv
[5].x
= RSHIFT(mv
.x
,2);
198 s
->mv
[4].y
= s
->mv
[5].y
= RSHIFT(mv
.y
,2);
200 s
->mv
[4] = s
->mv
[5] = (VP56mv
) {mv
.x
/4, mv
.y
/4};
204 static VP56mb
vp56_decode_mv(VP56Context
*s
, int row
, int col
)
206 VP56mv
*mv
, vect
= {0,0};
209 ctx
= vp56_get_vectors_predictors(s
, row
, col
, VP56_FRAME_PREVIOUS
);
210 s
->mb_type
= vp56_parse_mb_type(s
, s
->mb_type
, ctx
);
211 s
->macroblocks
[row
* s
->mb_width
+ col
].type
= s
->mb_type
;
213 switch (s
->mb_type
) {
214 case VP56_MB_INTER_V1_PF
:
215 mv
= &s
->vector_candidate
[0];
218 case VP56_MB_INTER_V2_PF
:
219 mv
= &s
->vector_candidate
[1];
222 case VP56_MB_INTER_V1_GF
:
223 vp56_get_vectors_predictors(s
, row
, col
, VP56_FRAME_GOLDEN
);
224 mv
= &s
->vector_candidate
[0];
227 case VP56_MB_INTER_V2_GF
:
228 vp56_get_vectors_predictors(s
, row
, col
, VP56_FRAME_GOLDEN
);
229 mv
= &s
->vector_candidate
[1];
232 case VP56_MB_INTER_DELTA_PF
:
233 s
->parse_vector_adjustment(s
, &vect
);
237 case VP56_MB_INTER_DELTA_GF
:
238 vp56_get_vectors_predictors(s
, row
, col
, VP56_FRAME_GOLDEN
);
239 s
->parse_vector_adjustment(s
, &vect
);
243 case VP56_MB_INTER_4V
:
244 vp56_decode_4mv(s
, row
, col
);
252 s
->macroblocks
[row
*s
->mb_width
+ col
].mv
= *mv
;
254 /* same vector for all blocks */
261 static void vp56_add_predictors_dc(VP56Context
*s
, VP56Frame ref_frame
)
263 int idx
= s
->scantable
.permutated
[0];
266 for (b
=0; b
<6; b
++) {
267 VP56RefDc
*ab
= &s
->above_blocks
[s
->above_block_idx
[b
]];
268 VP56RefDc
*lb
= &s
->left_block
[vp56_b6to4
[b
]];
273 if (ref_frame
== lb
->ref_frame
) {
277 if (ref_frame
== ab
->ref_frame
) {
281 if (s
->avctx
->codec
->id
== CODEC_ID_VP5
)
283 if (count
< 2 && ref_frame
== ab
[-1+2*i
].ref_frame
) {
284 dc
+= ab
[-1+2*i
].dc_coeff
;
288 dc
= s
->prev_dc
[vp56_b2p
[b
]][ref_frame
];
292 s
->block_coeff
[b
][idx
] += dc
;
293 s
->prev_dc
[vp56_b2p
[b
]][ref_frame
] = s
->block_coeff
[b
][idx
];
294 ab
->dc_coeff
= s
->block_coeff
[b
][idx
];
295 ab
->ref_frame
= ref_frame
;
296 lb
->dc_coeff
= s
->block_coeff
[b
][idx
];
297 lb
->ref_frame
= ref_frame
;
298 s
->block_coeff
[b
][idx
] *= s
->dequant_dc
;
302 static void vp56_edge_filter(VP56Context
*s
, uint8_t *yuv
,
303 int pix_inc
, int line_inc
, int t
)
305 int pix2_inc
= 2 * pix_inc
;
308 for (i
=0; i
<12; i
++) {
309 v
= (yuv
[-pix2_inc
] + 3*(yuv
[0]-yuv
[-pix_inc
]) - yuv
[pix_inc
] + 4) >>3;
311 yuv
[-pix_inc
] = av_clip_uint8(yuv
[-pix_inc
] + v
);
312 yuv
[0] = av_clip_uint8(yuv
[0] - v
);
317 static void vp56_deblock_filter(VP56Context
*s
, uint8_t *yuv
,
318 int stride
, int dx
, int dy
)
320 int t
= vp56_filter_threshold
[s
->quantizer
];
321 if (dx
) vp56_edge_filter(s
, yuv
+ 10-dx
, 1, stride
, t
);
322 if (dy
) vp56_edge_filter(s
, yuv
+ stride
*(10-dy
), stride
, 1, t
);
325 static void vp56_mc(VP56Context
*s
, int b
, int plane
, uint8_t *src
,
326 int stride
, int x
, int y
)
328 uint8_t *dst
=s
->framep
[VP56_FRAME_CURRENT
]->data
[plane
]+s
->block_offset
[b
];
331 int overlap_offset
= 0;
332 int mask
= s
->vp56_coord_div
[b
] - 1;
333 int deblock_filtering
= s
->deblock_filtering
;
337 if (s
->avctx
->skip_loop_filter
>= AVDISCARD_ALL
||
338 (s
->avctx
->skip_loop_filter
>= AVDISCARD_NONKEY
339 && !s
->framep
[VP56_FRAME_CURRENT
]->key_frame
))
340 deblock_filtering
= 0;
342 dx
= s
->mv
[b
].x
/ s
->vp56_coord_div
[b
];
343 dy
= s
->mv
[b
].y
/ s
->vp56_coord_div
[b
];
352 if (x
<0 || x
+12>=s
->plane_width
[plane
] ||
353 y
<0 || y
+12>=s
->plane_height
[plane
]) {
354 ff_emulated_edge_mc(s
->edge_emu_buffer
,
355 src
+ s
->block_offset
[b
] + (dy
-2)*stride
+ (dx
-2),
356 stride
, 12, 12, x
, y
,
357 s
->plane_width
[plane
],
358 s
->plane_height
[plane
]);
359 src_block
= s
->edge_emu_buffer
;
360 src_offset
= 2 + 2*stride
;
361 } else if (deblock_filtering
) {
362 /* only need a 12x12 block, but there is no such dsp function, */
363 /* so copy a 16x12 block */
364 s
->dsp
.put_pixels_tab
[0][0](s
->edge_emu_buffer
,
365 src
+ s
->block_offset
[b
] + (dy
-2)*stride
+ (dx
-2),
367 src_block
= s
->edge_emu_buffer
;
368 src_offset
= 2 + 2*stride
;
371 src_offset
= s
->block_offset
[b
] + dy
*stride
+ dx
;
374 if (deblock_filtering
)
375 vp56_deblock_filter(s
, src_block
, stride
, dx
&7, dy
&7);
377 if (s
->mv
[b
].x
& mask
)
378 overlap_offset
+= (s
->mv
[b
].x
> 0) ? 1 : -1;
379 if (s
->mv
[b
].y
& mask
)
380 overlap_offset
+= (s
->mv
[b
].y
> 0) ? stride
: -stride
;
382 if (overlap_offset
) {
384 s
->filter(s
, dst
, src_block
, src_offset
, src_offset
+overlap_offset
,
385 stride
, s
->mv
[b
], mask
, s
->filter_selection
, b
<4);
387 s
->dsp
.put_no_rnd_pixels_l2
[1](dst
, src_block
+src_offset
,
388 src_block
+src_offset
+overlap_offset
,
391 s
->dsp
.put_pixels_tab
[1][0](dst
, src_block
+src_offset
, stride
, 8);
395 static void vp56_decode_mb(VP56Context
*s
, int row
, int col
, int is_alpha
)
397 AVFrame
*frame_current
, *frame_ref
;
400 int b
, ab
, b_max
, plane
, off
;
402 if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
)
403 mb_type
= VP56_MB_INTRA
;
405 mb_type
= vp56_decode_mv(s
, row
, col
);
406 ref_frame
= vp56_reference_frame
[mb_type
];
408 s
->dsp
.clear_blocks(*s
->block_coeff
);
412 vp56_add_predictors_dc(s
, ref_frame
);
414 frame_current
= s
->framep
[VP56_FRAME_CURRENT
];
415 frame_ref
= s
->framep
[ref_frame
];
418 b_max
= 6 - 2*is_alpha
;
422 for (b
=0; b
<b_max
; b
++) {
423 plane
= vp56_b2p
[b
+ab
];
424 s
->dsp
.idct_put(frame_current
->data
[plane
] + s
->block_offset
[b
],
425 s
->stride
[plane
], s
->block_coeff
[b
]);
429 case VP56_MB_INTER_NOVEC_PF
:
430 case VP56_MB_INTER_NOVEC_GF
:
431 for (b
=0; b
<b_max
; b
++) {
432 plane
= vp56_b2p
[b
+ab
];
433 off
= s
->block_offset
[b
];
434 s
->dsp
.put_pixels_tab
[1][0](frame_current
->data
[plane
] + off
,
435 frame_ref
->data
[plane
] + off
,
436 s
->stride
[plane
], 8);
437 s
->dsp
.idct_add(frame_current
->data
[plane
] + off
,
438 s
->stride
[plane
], s
->block_coeff
[b
]);
442 case VP56_MB_INTER_DELTA_PF
:
443 case VP56_MB_INTER_V1_PF
:
444 case VP56_MB_INTER_V2_PF
:
445 case VP56_MB_INTER_DELTA_GF
:
446 case VP56_MB_INTER_4V
:
447 case VP56_MB_INTER_V1_GF
:
448 case VP56_MB_INTER_V2_GF
:
449 for (b
=0; b
<b_max
; b
++) {
450 int x_off
= b
==1 || b
==3 ? 8 : 0;
451 int y_off
= b
==2 || b
==3 ? 8 : 0;
452 plane
= vp56_b2p
[b
+ab
];
453 vp56_mc(s
, b
, plane
, frame_ref
->data
[plane
], s
->stride
[plane
],
454 16*col
+x_off
, 16*row
+y_off
);
455 s
->dsp
.idct_add(frame_current
->data
[plane
] + s
->block_offset
[b
],
456 s
->stride
[plane
], s
->block_coeff
[b
]);
462 static int vp56_size_changed(AVCodecContext
*avctx
)
464 VP56Context
*s
= avctx
->priv_data
;
465 int stride
= s
->framep
[VP56_FRAME_CURRENT
]->linesize
[0];
468 s
->plane_width
[0] = s
->plane_width
[3] = avctx
->coded_width
;
469 s
->plane_width
[1] = s
->plane_width
[2] = avctx
->coded_width
/2;
470 s
->plane_height
[0] = s
->plane_height
[3] = avctx
->coded_height
;
471 s
->plane_height
[1] = s
->plane_height
[2] = avctx
->coded_height
/2;
474 s
->stride
[i
] = s
->flip
* s
->framep
[VP56_FRAME_CURRENT
]->linesize
[i
];
476 s
->mb_width
= (avctx
->coded_width
+15) / 16;
477 s
->mb_height
= (avctx
->coded_height
+15) / 16;
479 if (s
->mb_width
> 1000 || s
->mb_height
> 1000) {
480 av_log(avctx
, AV_LOG_ERROR
, "picture too big\n");
484 s
->above_blocks
= av_realloc(s
->above_blocks
,
485 (4*s
->mb_width
+6) * sizeof(*s
->above_blocks
));
486 s
->macroblocks
= av_realloc(s
->macroblocks
,
487 s
->mb_width
*s
->mb_height
*sizeof(*s
->macroblocks
));
488 av_free(s
->edge_emu_buffer_alloc
);
489 s
->edge_emu_buffer_alloc
= av_malloc(16*stride
);
490 s
->edge_emu_buffer
= s
->edge_emu_buffer_alloc
;
492 s
->edge_emu_buffer
+= 15 * stride
;
497 int vp56_decode_frame(AVCodecContext
*avctx
, void *data
, int *data_size
,
500 const uint8_t *buf
= avpkt
->data
;
501 VP56Context
*s
= avctx
->priv_data
;
502 AVFrame
*const p
= s
->framep
[VP56_FRAME_CURRENT
];
503 int remaining_buf_size
= avpkt
->size
;
504 int is_alpha
, av_uninit(alpha_offset
);
507 alpha_offset
= bytestream_get_be24(&buf
);
508 remaining_buf_size
-= 3;
511 for (is_alpha
=0; is_alpha
< 1+s
->has_alpha
; is_alpha
++) {
512 int mb_row
, mb_col
, mb_row_flip
, mb_offset
= 0;
513 int block
, y
, uv
, stride_y
, stride_uv
;
514 int golden_frame
= 0;
517 s
->modelp
= &s
->models
[is_alpha
];
519 res
= s
->parse_header(s
, buf
, remaining_buf_size
, &golden_frame
);
525 if (avctx
->get_buffer(avctx
, p
) < 0) {
526 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
531 if (vp56_size_changed(avctx
)) {
532 avctx
->release_buffer(avctx
, p
);
538 p
->pict_type
= FF_I_TYPE
;
539 s
->default_models_init(s
);
540 for (block
=0; block
<s
->mb_height
*s
->mb_width
; block
++)
541 s
->macroblocks
[block
].type
= VP56_MB_INTRA
;
543 p
->pict_type
= FF_P_TYPE
;
544 vp56_parse_mb_type_models(s
);
545 s
->parse_vector_models(s
);
546 s
->mb_type
= VP56_MB_INTER_NOVEC_PF
;
549 s
->parse_coeff_models(s
);
551 memset(s
->prev_dc
, 0, sizeof(s
->prev_dc
));
552 s
->prev_dc
[1][VP56_FRAME_CURRENT
] = 128;
553 s
->prev_dc
[2][VP56_FRAME_CURRENT
] = 128;
555 for (block
=0; block
< 4*s
->mb_width
+6; block
++) {
556 s
->above_blocks
[block
].ref_frame
= VP56_FRAME_NONE
;
557 s
->above_blocks
[block
].dc_coeff
= 0;
558 s
->above_blocks
[block
].not_null_dc
= 0;
560 s
->above_blocks
[2*s
->mb_width
+ 2].ref_frame
= VP56_FRAME_CURRENT
;
561 s
->above_blocks
[3*s
->mb_width
+ 4].ref_frame
= VP56_FRAME_CURRENT
;
563 stride_y
= p
->linesize
[0];
564 stride_uv
= p
->linesize
[1];
569 /* main macroblocks loop */
570 for (mb_row
=0; mb_row
<s
->mb_height
; mb_row
++) {
572 mb_row_flip
= s
->mb_height
- mb_row
- 1;
574 mb_row_flip
= mb_row
;
576 for (block
=0; block
<4; block
++) {
577 s
->left_block
[block
].ref_frame
= VP56_FRAME_NONE
;
578 s
->left_block
[block
].dc_coeff
= 0;
579 s
->left_block
[block
].not_null_dc
= 0;
581 memset(s
->coeff_ctx
, 0, sizeof(s
->coeff_ctx
));
582 memset(s
->coeff_ctx_last
, 24, sizeof(s
->coeff_ctx_last
));
584 s
->above_block_idx
[0] = 1;
585 s
->above_block_idx
[1] = 2;
586 s
->above_block_idx
[2] = 1;
587 s
->above_block_idx
[3] = 2;
588 s
->above_block_idx
[4] = 2*s
->mb_width
+ 2 + 1;
589 s
->above_block_idx
[5] = 3*s
->mb_width
+ 4 + 1;
591 s
->block_offset
[s
->frbi
] = (mb_row_flip
*16 + mb_offset
) * stride_y
;
592 s
->block_offset
[s
->srbi
] = s
->block_offset
[s
->frbi
] + 8*stride_y
;
593 s
->block_offset
[1] = s
->block_offset
[0] + 8;
594 s
->block_offset
[3] = s
->block_offset
[2] + 8;
595 s
->block_offset
[4] = (mb_row_flip
*8 + mb_offset
) * stride_uv
;
596 s
->block_offset
[5] = s
->block_offset
[4];
598 for (mb_col
=0; mb_col
<s
->mb_width
; mb_col
++) {
599 vp56_decode_mb(s
, mb_row
, mb_col
, is_alpha
);
601 for (y
=0; y
<4; y
++) {
602 s
->above_block_idx
[y
] += 2;
603 s
->block_offset
[y
] += 16;
606 for (uv
=4; uv
<6; uv
++) {
607 s
->above_block_idx
[uv
] += 1;
608 s
->block_offset
[uv
] += 8;
613 if (p
->key_frame
|| golden_frame
) {
614 if (s
->framep
[VP56_FRAME_GOLDEN
]->data
[0] &&
615 s
->framep
[VP56_FRAME_GOLDEN
] != s
->framep
[VP56_FRAME_GOLDEN2
])
616 avctx
->release_buffer(avctx
, s
->framep
[VP56_FRAME_GOLDEN
]);
617 s
->framep
[VP56_FRAME_GOLDEN
] = p
;
621 FFSWAP(AVFrame
*, s
->framep
[VP56_FRAME_GOLDEN
],
622 s
->framep
[VP56_FRAME_GOLDEN2
]);
624 remaining_buf_size
-= alpha_offset
;
628 if (s
->framep
[VP56_FRAME_PREVIOUS
] == s
->framep
[VP56_FRAME_GOLDEN
] ||
629 s
->framep
[VP56_FRAME_PREVIOUS
] == s
->framep
[VP56_FRAME_GOLDEN2
]) {
630 if (s
->framep
[VP56_FRAME_UNUSED
] != s
->framep
[VP56_FRAME_GOLDEN
] &&
631 s
->framep
[VP56_FRAME_UNUSED
] != s
->framep
[VP56_FRAME_GOLDEN2
])
632 FFSWAP(AVFrame
*, s
->framep
[VP56_FRAME_PREVIOUS
],
633 s
->framep
[VP56_FRAME_UNUSED
]);
635 FFSWAP(AVFrame
*, s
->framep
[VP56_FRAME_PREVIOUS
],
636 s
->framep
[VP56_FRAME_UNUSED2
]);
637 } else if (s
->framep
[VP56_FRAME_PREVIOUS
]->data
[0])
638 avctx
->release_buffer(avctx
, s
->framep
[VP56_FRAME_PREVIOUS
]);
639 FFSWAP(AVFrame
*, s
->framep
[VP56_FRAME_CURRENT
],
640 s
->framep
[VP56_FRAME_PREVIOUS
]);
642 *(AVFrame
*)data
= *p
;
643 *data_size
= sizeof(AVFrame
);
648 av_cold
void vp56_init(AVCodecContext
*avctx
, int flip
, int has_alpha
)
650 VP56Context
*s
= avctx
->priv_data
;
654 avctx
->pix_fmt
= has_alpha
? PIX_FMT_YUVA420P
: PIX_FMT_YUV420P
;
656 if (avctx
->idct_algo
== FF_IDCT_AUTO
)
657 avctx
->idct_algo
= FF_IDCT_VP3
;
658 dsputil_init(&s
->dsp
, avctx
);
659 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->scantable
,ff_zigzag_direct
);
662 s
->framep
[i
] = &s
->frames
[i
];
663 s
->framep
[VP56_FRAME_UNUSED
] = s
->framep
[VP56_FRAME_GOLDEN
];
664 s
->framep
[VP56_FRAME_UNUSED2
] = s
->framep
[VP56_FRAME_GOLDEN2
];
665 s
->edge_emu_buffer_alloc
= NULL
;
667 s
->above_blocks
= NULL
;
668 s
->macroblocks
= NULL
;
670 s
->deblock_filtering
= 1;
674 s
->has_alpha
= has_alpha
;
686 av_cold
int vp56_free(AVCodecContext
*avctx
)
688 VP56Context
*s
= avctx
->priv_data
;
690 av_free(s
->above_blocks
);
691 av_free(s
->macroblocks
);
692 av_free(s
->edge_emu_buffer_alloc
);
693 if (s
->framep
[VP56_FRAME_GOLDEN
]->data
[0])
694 avctx
->release_buffer(avctx
, s
->framep
[VP56_FRAME_GOLDEN
]);
695 if (s
->framep
[VP56_FRAME_GOLDEN2
]->data
[0])
696 avctx
->release_buffer(avctx
, s
->framep
[VP56_FRAME_GOLDEN2
]);
697 if (s
->framep
[VP56_FRAME_PREVIOUS
]->data
[0])
698 avctx
->release_buffer(avctx
, s
->framep
[VP56_FRAME_PREVIOUS
]);