2 * @file libavcodec/vp6.c
3 * VP6 compatible video decoder
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
7 * The VP6F decoder accepts an optional 1 byte extradata. It is composed of:
8 * - upper 4bits: difference between encoded width and visible width
9 * - lower 4bits: difference between encoded height and visible height
11 * This file is part of FFmpeg.
13 * FFmpeg is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
18 * FFmpeg is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with FFmpeg; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
32 #include "bitstream.h"
40 static void vp6_parse_coeff(VP56Context
*s
);
41 static void vp6_parse_coeff_huffman(VP56Context
*s
);
43 static int vp6_parse_header(VP56Context
*s
, const uint8_t *buf
, int buf_size
,
46 VP56RangeCoder
*c
= &s
->c
;
47 int parse_filter_info
= 0;
53 int separated_coeff
= buf
[0] & 1;
55 s
->framep
[VP56_FRAME_CURRENT
]->key_frame
= !(buf
[0] & 0x80);
56 vp56_init_dequant(s
, (buf
[0] >> 1) & 0x3F);
58 if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
) {
59 sub_version
= buf
[1] >> 3;
62 s
->filter_header
= buf
[1] & 0x06;
64 av_log(s
->avctx
, AV_LOG_ERROR
, "interlacing not supported\n");
67 if (separated_coeff
|| !s
->filter_header
) {
68 coeff_offset
= AV_RB16(buf
+2) - 2;
73 rows
= buf
[2]; /* number of stored macroblock rows */
74 cols
= buf
[3]; /* number of stored macroblock cols */
75 /* buf[4] is number of displayed macroblock rows */
76 /* buf[5] is number of displayed macroblock cols */
78 if (!s
->macroblocks
|| /* first frame */
79 16*cols
!= s
->avctx
->coded_width
||
80 16*rows
!= s
->avctx
->coded_height
) {
81 avcodec_set_dimensions(s
->avctx
, 16*cols
, 16*rows
);
82 if (s
->avctx
->extradata_size
== 1) {
83 s
->avctx
->width
-= s
->avctx
->extradata
[0] >> 4;
84 s
->avctx
->height
-= s
->avctx
->extradata
[0] & 0x0F;
89 vp56_init_range_decoder(c
, buf
+6, buf_size
-6);
92 parse_filter_info
= s
->filter_header
;
95 s
->sub_version
= sub_version
;
100 if (separated_coeff
|| !s
->filter_header
) {
101 coeff_offset
= AV_RB16(buf
+1) - 2;
105 vp56_init_range_decoder(c
, buf
+1, buf_size
-1);
107 *golden_frame
= vp56_rac_get(c
);
108 if (s
->filter_header
) {
109 s
->deblock_filtering
= vp56_rac_get(c
);
110 if (s
->deblock_filtering
)
112 if (s
->sub_version
> 7)
113 parse_filter_info
= vp56_rac_get(c
);
117 if (parse_filter_info
) {
118 if (vp56_rac_get(c
)) {
120 s
->sample_variance_threshold
= vp56_rac_gets(c
, 5) << vrt_shift
;
121 s
->max_vector_length
= 2 << vp56_rac_gets(c
, 3);
122 } else if (vp56_rac_get(c
)) {
127 if (s
->sub_version
> 7)
128 s
->filter_selection
= vp56_rac_gets(c
, 4);
130 s
->filter_selection
= 16;
133 s
->use_huffman
= vp56_rac_get(c
);
135 s
->parse_coeff
= vp6_parse_coeff
;
138 buf_size
-= coeff_offset
;
141 if (s
->use_huffman
) {
142 s
->parse_coeff
= vp6_parse_coeff_huffman
;
143 init_get_bits(&s
->gb
, buf
, buf_size
<<3);
145 vp56_init_range_decoder(&s
->cc
, buf
, buf_size
);
155 static void vp6_coeff_order_table_init(VP56Context
*s
)
159 s
->modelp
->coeff_index_to_pos
[0] = 0;
161 for (pos
=1; pos
<64; pos
++)
162 if (s
->modelp
->coeff_reorder
[pos
] == i
)
163 s
->modelp
->coeff_index_to_pos
[idx
++] = pos
;
166 static void vp6_default_models_init(VP56Context
*s
)
168 VP56Model
*model
= s
->modelp
;
170 model
->vector_dct
[0] = 0xA2;
171 model
->vector_dct
[1] = 0xA4;
172 model
->vector_sig
[0] = 0x80;
173 model
->vector_sig
[1] = 0x80;
175 memcpy(model
->mb_types_stats
, vp56_def_mb_types_stats
, sizeof(model
->mb_types_stats
));
176 memcpy(model
->vector_fdv
, vp6_def_fdv_vector_model
, sizeof(model
->vector_fdv
));
177 memcpy(model
->vector_pdv
, vp6_def_pdv_vector_model
, sizeof(model
->vector_pdv
));
178 memcpy(model
->coeff_runv
, vp6_def_runv_coeff_model
, sizeof(model
->coeff_runv
));
179 memcpy(model
->coeff_reorder
, vp6_def_coeff_reorder
, sizeof(model
->coeff_reorder
));
181 vp6_coeff_order_table_init(s
);
184 static void vp6_parse_vector_models(VP56Context
*s
)
186 VP56RangeCoder
*c
= &s
->c
;
187 VP56Model
*model
= s
->modelp
;
190 for (comp
=0; comp
<2; comp
++) {
191 if (vp56_rac_get_prob(c
, vp6_sig_dct_pct
[comp
][0]))
192 model
->vector_dct
[comp
] = vp56_rac_gets_nn(c
, 7);
193 if (vp56_rac_get_prob(c
, vp6_sig_dct_pct
[comp
][1]))
194 model
->vector_sig
[comp
] = vp56_rac_gets_nn(c
, 7);
197 for (comp
=0; comp
<2; comp
++)
198 for (node
=0; node
<7; node
++)
199 if (vp56_rac_get_prob(c
, vp6_pdv_pct
[comp
][node
]))
200 model
->vector_pdv
[comp
][node
] = vp56_rac_gets_nn(c
, 7);
202 for (comp
=0; comp
<2; comp
++)
203 for (node
=0; node
<8; node
++)
204 if (vp56_rac_get_prob(c
, vp6_fdv_pct
[comp
][node
]))
205 model
->vector_fdv
[comp
][node
] = vp56_rac_gets_nn(c
, 7);
208 /* nodes must ascend by count, but with descending symbol order */
209 static int vp6_huff_cmp(const void *va
, const void *vb
)
211 const Node
*a
= va
, *b
= vb
;
212 return (a
->count
- b
->count
)*16 + (b
->sym
- a
->sym
);
215 static void vp6_build_huff_tree(VP56Context
*s
, uint8_t coeff_model
[],
216 const uint8_t *map
, unsigned size
, VLC
*vlc
)
218 Node nodes
[2*size
], *tmp
= &nodes
[size
];
221 /* first compute probabilities from model */
223 for (i
=0; i
<size
-1; i
++) {
224 a
= tmp
[i
].count
* coeff_model
[i
] >> 8;
225 b
= tmp
[i
].count
* (255 - coeff_model
[i
]) >> 8;
226 nodes
[map
[2*i
]].count
= a
+ !a
;
227 nodes
[map
[2*i
+1]].count
= b
+ !b
;
230 /* then build the huffman tree accodring to probabilities */
231 ff_huff_build_tree(s
->avctx
, vlc
, size
, nodes
, vp6_huff_cmp
,
232 FF_HUFFMAN_FLAG_HNODE_FIRST
);
235 static void vp6_parse_coeff_models(VP56Context
*s
)
237 VP56RangeCoder
*c
= &s
->c
;
238 VP56Model
*model
= s
->modelp
;
240 int node
, cg
, ctx
, pos
;
241 int ct
; /* code type */
242 int pt
; /* plane type (0 for Y, 1 for U or V) */
244 memset(def_prob
, 0x80, sizeof(def_prob
));
246 for (pt
=0; pt
<2; pt
++)
247 for (node
=0; node
<11; node
++)
248 if (vp56_rac_get_prob(c
, vp6_dccv_pct
[pt
][node
])) {
249 def_prob
[node
] = vp56_rac_gets_nn(c
, 7);
250 model
->coeff_dccv
[pt
][node
] = def_prob
[node
];
251 } else if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
) {
252 model
->coeff_dccv
[pt
][node
] = def_prob
[node
];
255 if (vp56_rac_get(c
)) {
256 for (pos
=1; pos
<64; pos
++)
257 if (vp56_rac_get_prob(c
, vp6_coeff_reorder_pct
[pos
]))
258 model
->coeff_reorder
[pos
] = vp56_rac_gets(c
, 4);
259 vp6_coeff_order_table_init(s
);
262 for (cg
=0; cg
<2; cg
++)
263 for (node
=0; node
<14; node
++)
264 if (vp56_rac_get_prob(c
, vp6_runv_pct
[cg
][node
]))
265 model
->coeff_runv
[cg
][node
] = vp56_rac_gets_nn(c
, 7);
267 for (ct
=0; ct
<3; ct
++)
268 for (pt
=0; pt
<2; pt
++)
269 for (cg
=0; cg
<6; cg
++)
270 for (node
=0; node
<11; node
++)
271 if (vp56_rac_get_prob(c
, vp6_ract_pct
[ct
][pt
][cg
][node
])) {
272 def_prob
[node
] = vp56_rac_gets_nn(c
, 7);
273 model
->coeff_ract
[pt
][ct
][cg
][node
] = def_prob
[node
];
274 } else if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
) {
275 model
->coeff_ract
[pt
][ct
][cg
][node
] = def_prob
[node
];
278 if (s
->use_huffman
) {
279 for (pt
=0; pt
<2; pt
++) {
280 vp6_build_huff_tree(s
, model
->coeff_dccv
[pt
],
281 vp6_huff_coeff_map
, 12, &s
->dccv_vlc
[pt
]);
282 vp6_build_huff_tree(s
, model
->coeff_runv
[pt
],
283 vp6_huff_run_map
, 9, &s
->runv_vlc
[pt
]);
284 for (ct
=0; ct
<3; ct
++)
285 for (cg
= 0; cg
< 6; cg
++)
286 vp6_build_huff_tree(s
, model
->coeff_ract
[pt
][ct
][cg
],
287 vp6_huff_coeff_map
, 12,
288 &s
->ract_vlc
[pt
][ct
][cg
]);
290 memset(s
->nb_null
, 0, sizeof(s
->nb_null
));
292 /* coeff_dcct is a linear combination of coeff_dccv */
293 for (pt
=0; pt
<2; pt
++)
294 for (ctx
=0; ctx
<3; ctx
++)
295 for (node
=0; node
<5; node
++)
296 model
->coeff_dcct
[pt
][ctx
][node
] = av_clip(((model
->coeff_dccv
[pt
][node
] * vp6_dccv_lc
[ctx
][node
][0] + 128) >> 8) + vp6_dccv_lc
[ctx
][node
][1], 1, 255);
300 static void vp6_parse_vector_adjustment(VP56Context
*s
, VP56mv
*vect
)
302 VP56RangeCoder
*c
= &s
->c
;
303 VP56Model
*model
= s
->modelp
;
306 *vect
= (VP56mv
) {0,0};
307 if (s
->vector_candidate_pos
< 2)
308 *vect
= s
->vector_candidate
[0];
310 for (comp
=0; comp
<2; comp
++) {
313 if (vp56_rac_get_prob(c
, model
->vector_dct
[comp
])) {
314 static const uint8_t prob_order
[] = {0, 1, 2, 7, 6, 5, 4};
315 for (i
=0; i
<sizeof(prob_order
); i
++) {
316 int j
= prob_order
[i
];
317 delta
|= vp56_rac_get_prob(c
, model
->vector_fdv
[comp
][j
])<<j
;
320 delta
|= vp56_rac_get_prob(c
, model
->vector_fdv
[comp
][3])<<3;
324 delta
= vp56_rac_get_tree(c
, vp56_pva_tree
,
325 model
->vector_pdv
[comp
]);
328 if (delta
&& vp56_rac_get_prob(c
, model
->vector_sig
[comp
]))
339 * Read number of consecutive blocks with null DC or AC.
340 * This value is < 74.
342 static unsigned vp6_get_nb_null(VP56Context
*s
)
344 unsigned val
= get_bits(&s
->gb
, 2);
346 val
+= get_bits(&s
->gb
, 2);
348 val
= get_bits1(&s
->gb
) << 2;
349 val
= 6+val
+ get_bits(&s
->gb
, 2+val
);
354 static void vp6_parse_coeff_huffman(VP56Context
*s
)
356 VP56Model
*model
= s
->modelp
;
357 uint8_t *permute
= s
->scantable
.permutated
;
359 int coeff
, sign
, coeff_idx
;
361 int pt
= 0; /* plane type (0 for Y, 1 for U or V) */
363 for (b
=0; b
<6; b
++) {
364 int ct
= 0; /* code type */
366 vlc_coeff
= &s
->dccv_vlc
[pt
];
368 for (coeff_idx
=0; coeff_idx
<64; ) {
370 if (coeff_idx
<2 && s
->nb_null
[coeff_idx
][pt
]) {
371 s
->nb_null
[coeff_idx
][pt
]--;
375 coeff
= get_vlc2(&s
->gb
, vlc_coeff
->table
, 9, 3);
378 int pt
= (coeff_idx
>= 6);
379 run
+= get_vlc2(&s
->gb
, s
->runv_vlc
[pt
].table
, 9, 3);
381 run
+= get_bits(&s
->gb
, 6);
383 s
->nb_null
[0][pt
] = vp6_get_nb_null(s
);
385 } else if (coeff
== 11) { /* end of block */
386 if (coeff_idx
== 1) /* first AC coeff ? */
387 s
->nb_null
[1][pt
] = vp6_get_nb_null(s
);
390 int coeff2
= vp56_coeff_bias
[coeff
];
392 coeff2
+= get_bits(&s
->gb
, coeff
<= 9 ? coeff
- 4 : 11);
393 ct
= 1 + (coeff2
> 1);
394 sign
= get_bits1(&s
->gb
);
395 coeff2
= (coeff2
^ -sign
) + sign
;
397 coeff2
*= s
->dequant_ac
;
398 idx
= model
->coeff_index_to_pos
[coeff_idx
];
399 s
->block_coeff
[b
][permute
[idx
]] = coeff2
;
403 cg
= FFMIN(vp6_coeff_groups
[coeff_idx
], 3);
404 vlc_coeff
= &s
->ract_vlc
[pt
][ct
][cg
];
409 static void vp6_parse_coeff(VP56Context
*s
)
411 VP56RangeCoder
*c
= s
->ccp
;
412 VP56Model
*model
= s
->modelp
;
413 uint8_t *permute
= s
->scantable
.permutated
;
414 uint8_t *model1
, *model2
, *model3
;
415 int coeff
, sign
, coeff_idx
;
416 int b
, i
, cg
, idx
, ctx
;
417 int pt
= 0; /* plane type (0 for Y, 1 for U or V) */
419 for (b
=0; b
<6; b
++) {
420 int ct
= 1; /* code type */
425 ctx
= s
->left_block
[vp56_b6to4
[b
]].not_null_dc
426 + s
->above_blocks
[s
->above_block_idx
[b
]].not_null_dc
;
427 model1
= model
->coeff_dccv
[pt
];
428 model2
= model
->coeff_dcct
[pt
][ctx
];
430 for (coeff_idx
=0; coeff_idx
<64; ) {
431 if ((coeff_idx
>1 && ct
==0) || vp56_rac_get_prob(c
, model2
[0])) {
433 if (vp56_rac_get_prob(c
, model2
[2])) {
434 if (vp56_rac_get_prob(c
, model2
[3])) {
435 idx
= vp56_rac_get_tree(c
, vp56_pc_tree
, model1
);
436 coeff
= vp56_coeff_bias
[idx
+5];
437 for (i
=vp56_coeff_bit_length
[idx
]; i
>=0; i
--)
438 coeff
+= vp56_rac_get_prob(c
, vp56_coeff_parse_table
[idx
][i
]) << i
;
440 if (vp56_rac_get_prob(c
, model2
[4]))
441 coeff
= 3 + vp56_rac_get_prob(c
, model1
[5]);
450 sign
= vp56_rac_get(c
);
451 coeff
= (coeff
^ -sign
) + sign
;
453 coeff
*= s
->dequant_ac
;
454 idx
= model
->coeff_index_to_pos
[coeff_idx
];
455 s
->block_coeff
[b
][permute
[idx
]] = coeff
;
461 if (!vp56_rac_get_prob(c
, model2
[1]))
464 model3
= model
->coeff_runv
[coeff_idx
>= 6];
465 run
= vp56_rac_get_tree(c
, vp6_pcr_tree
, model3
);
467 for (run
=9, i
=0; i
<6; i
++)
468 run
+= vp56_rac_get_prob(c
, model3
[i
+8]) << i
;
472 cg
= vp6_coeff_groups
[coeff_idx
+=run
];
473 model1
= model2
= model
->coeff_ract
[pt
][ct
][cg
];
476 s
->left_block
[vp56_b6to4
[b
]].not_null_dc
=
477 s
->above_blocks
[s
->above_block_idx
[b
]].not_null_dc
= !!s
->block_coeff
[b
][0];
481 static int vp6_adjust(int v
, int t
)
483 int V
= v
, s
= v
>> 31;
486 if (V
-t
-1 >= (unsigned)(t
-1))
494 static int vp6_block_variance(uint8_t *src
, int stride
)
496 int sum
= 0, square_sum
= 0;
499 for (y
=0; y
<8; y
+=2) {
500 for (x
=0; x
<8; x
+=2) {
502 square_sum
+= src
[x
]*src
[x
];
506 return (16*square_sum
- sum
*sum
) >> 8;
509 static void vp6_filter_hv4(uint8_t *dst
, uint8_t *src
, int stride
,
510 int delta
, const int16_t *weights
)
514 for (y
=0; y
<8; y
++) {
515 for (x
=0; x
<8; x
++) {
516 dst
[x
] = av_clip_uint8(( src
[x
-delta
] * weights
[0]
517 + src
[x
] * weights
[1]
518 + src
[x
+delta
] * weights
[2]
519 + src
[x
+2*delta
] * weights
[3] + 64) >> 7);
526 static void vp6_filter_diag2(VP56Context
*s
, uint8_t *dst
, uint8_t *src
,
527 int stride
, int h_weight
, int v_weight
)
529 uint8_t *tmp
= s
->edge_emu_buffer
+16;
530 s
->dsp
.put_h264_chroma_pixels_tab
[0](tmp
, src
, stride
, 9, h_weight
, 0);
531 s
->dsp
.put_h264_chroma_pixels_tab
[0](dst
, tmp
, stride
, 8, 0, v_weight
);
534 static void vp6_filter(VP56Context
*s
, uint8_t *dst
, uint8_t *src
,
535 int offset1
, int offset2
, int stride
,
536 VP56mv mv
, int mask
, int select
, int luma
)
539 int x8
= mv
.x
& mask
;
540 int y8
= mv
.y
& mask
;
545 filter4
= s
->filter_mode
;
547 if (s
->max_vector_length
&&
548 (FFABS(mv
.x
) > s
->max_vector_length
||
549 FFABS(mv
.y
) > s
->max_vector_length
)) {
551 } else if (s
->sample_variance_threshold
552 && (vp6_block_variance(src
+offset1
, stride
)
553 < s
->sample_variance_threshold
)) {
559 if ((y8
&& (offset2
-offset1
)*s
->flip
<0) || (!y8
&& offset1
> offset2
)) {
564 if (!y8
) { /* left or right combine */
565 vp6_filter_hv4(dst
, src
+offset1
, stride
, 1,
566 vp6_block_copy_filter
[select
][x8
]);
567 } else if (!x8
) { /* above or below combine */
568 vp6_filter_hv4(dst
, src
+offset1
, stride
, stride
,
569 vp6_block_copy_filter
[select
][y8
]);
571 s
->dsp
.vp6_filter_diag4(dst
, src
+offset1
+((mv
.x
^mv
.y
)>>31), stride
,
572 vp6_block_copy_filter
[select
][x8
],
573 vp6_block_copy_filter
[select
][y8
]);
577 s
->dsp
.put_h264_chroma_pixels_tab
[0](dst
, src
+offset1
, stride
, 8, x8
, y8
);
579 vp6_filter_diag2(s
, dst
, src
+offset1
+ ((mv
.x
^mv
.y
)>>31), stride
, x8
, y8
);
584 static av_cold
int vp6_decode_init(AVCodecContext
*avctx
)
586 VP56Context
*s
= avctx
->priv_data
;
588 vp56_init(avctx
, avctx
->codec
->id
== CODEC_ID_VP6
,
589 avctx
->codec
->id
== CODEC_ID_VP6A
);
590 s
->vp56_coord_div
= vp6_coord_div
;
591 s
->parse_vector_adjustment
= vp6_parse_vector_adjustment
;
592 s
->adjust
= vp6_adjust
;
593 s
->filter
= vp6_filter
;
594 s
->default_models_init
= vp6_default_models_init
;
595 s
->parse_vector_models
= vp6_parse_vector_models
;
596 s
->parse_coeff_models
= vp6_parse_coeff_models
;
597 s
->parse_header
= vp6_parse_header
;
602 AVCodec vp6_decoder
= {
612 .long_name
= NULL_IF_CONFIG_SMALL("On2 VP6"),
615 /* flash version, not flipped upside-down */
616 AVCodec vp6f_decoder
= {
626 .long_name
= NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version)"),
629 /* flash version, not flipped upside-down, with alpha channel */
630 AVCodec vp6a_decoder
= {
640 .long_name
= NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version, with alpha channel)"),