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(vp56_context_t
*s
);
41 static void vp6_parse_coeff_huffman(vp56_context_t
*s
);
43 static int vp6_parse_header(vp56_context_t
*s
, const uint8_t *buf
, int buf_size
,
46 vp56_range_coder_t
*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 (16*cols
!= s
->avctx
->coded_width
||
79 16*rows
!= s
->avctx
->coded_height
) {
80 avcodec_set_dimensions(s
->avctx
, 16*cols
, 16*rows
);
81 if (s
->avctx
->extradata_size
== 1) {
82 s
->avctx
->width
-= s
->avctx
->extradata
[0] >> 4;
83 s
->avctx
->height
-= s
->avctx
->extradata
[0] & 0x0F;
88 vp56_init_range_decoder(c
, buf
+6, buf_size
-6);
91 parse_filter_info
= s
->filter_header
;
94 s
->sub_version
= sub_version
;
99 if (separated_coeff
|| !s
->filter_header
) {
100 coeff_offset
= AV_RB16(buf
+1) - 2;
104 vp56_init_range_decoder(c
, buf
+1, buf_size
-1);
106 *golden_frame
= vp56_rac_get(c
);
107 if (s
->filter_header
) {
108 s
->deblock_filtering
= vp56_rac_get(c
);
109 if (s
->deblock_filtering
)
111 if (s
->sub_version
> 7)
112 parse_filter_info
= vp56_rac_get(c
);
116 if (parse_filter_info
) {
117 if (vp56_rac_get(c
)) {
119 s
->sample_variance_threshold
= vp56_rac_gets(c
, 5) << vrt_shift
;
120 s
->max_vector_length
= 2 << vp56_rac_gets(c
, 3);
121 } else if (vp56_rac_get(c
)) {
126 if (s
->sub_version
> 7)
127 s
->filter_selection
= vp56_rac_gets(c
, 4);
129 s
->filter_selection
= 16;
132 s
->use_huffman
= vp56_rac_get(c
);
134 s
->parse_coeff
= vp6_parse_coeff
;
137 buf_size
-= coeff_offset
;
138 if (s
->use_huffman
) {
139 s
->parse_coeff
= vp6_parse_coeff_huffman
;
140 init_get_bits(&s
->gb
, buf
, buf_size
<<3);
142 vp56_init_range_decoder(&s
->cc
, buf
, buf_size
);
152 static void vp6_coeff_order_table_init(vp56_context_t
*s
)
156 s
->modelp
->coeff_index_to_pos
[0] = 0;
158 for (pos
=1; pos
<64; pos
++)
159 if (s
->modelp
->coeff_reorder
[pos
] == i
)
160 s
->modelp
->coeff_index_to_pos
[idx
++] = pos
;
163 static void vp6_default_models_init(vp56_context_t
*s
)
165 vp56_model_t
*model
= s
->modelp
;
167 model
->vector_dct
[0] = 0xA2;
168 model
->vector_dct
[1] = 0xA4;
169 model
->vector_sig
[0] = 0x80;
170 model
->vector_sig
[1] = 0x80;
172 memcpy(model
->mb_types_stats
, vp56_def_mb_types_stats
, sizeof(model
->mb_types_stats
));
173 memcpy(model
->vector_fdv
, vp6_def_fdv_vector_model
, sizeof(model
->vector_fdv
));
174 memcpy(model
->vector_pdv
, vp6_def_pdv_vector_model
, sizeof(model
->vector_pdv
));
175 memcpy(model
->coeff_runv
, vp6_def_runv_coeff_model
, sizeof(model
->coeff_runv
));
176 memcpy(model
->coeff_reorder
, vp6_def_coeff_reorder
, sizeof(model
->coeff_reorder
));
178 vp6_coeff_order_table_init(s
);
181 static void vp6_parse_vector_models(vp56_context_t
*s
)
183 vp56_range_coder_t
*c
= &s
->c
;
184 vp56_model_t
*model
= s
->modelp
;
187 for (comp
=0; comp
<2; comp
++) {
188 if (vp56_rac_get_prob(c
, vp6_sig_dct_pct
[comp
][0]))
189 model
->vector_dct
[comp
] = vp56_rac_gets_nn(c
, 7);
190 if (vp56_rac_get_prob(c
, vp6_sig_dct_pct
[comp
][1]))
191 model
->vector_sig
[comp
] = vp56_rac_gets_nn(c
, 7);
194 for (comp
=0; comp
<2; comp
++)
195 for (node
=0; node
<7; node
++)
196 if (vp56_rac_get_prob(c
, vp6_pdv_pct
[comp
][node
]))
197 model
->vector_pdv
[comp
][node
] = vp56_rac_gets_nn(c
, 7);
199 for (comp
=0; comp
<2; comp
++)
200 for (node
=0; node
<8; node
++)
201 if (vp56_rac_get_prob(c
, vp6_fdv_pct
[comp
][node
]))
202 model
->vector_fdv
[comp
][node
] = vp56_rac_gets_nn(c
, 7);
205 static int vp6_huff_cmp(const void *va
, const void *vb
)
207 const Node
*a
= va
, *b
= vb
;
208 return a
->count
>= b
->count
;
211 static void vp6_build_huff_tree(vp56_context_t
*s
, uint8_t coeff_model
[],
212 const uint8_t *map
, unsigned size
, VLC
*vlc
)
214 Node nodes
[2*size
], *tmp
= &nodes
[size
];
217 /* first compute probabilities from model */
219 for (i
=0; i
<size
-1; i
++) {
220 a
= tmp
[i
].count
* coeff_model
[i
] >> 8;
221 b
= tmp
[i
].count
* (255 - coeff_model
[i
]) >> 8;
222 nodes
[map
[2*i
]].count
= a
+ !a
;
223 nodes
[map
[2*i
+1]].count
= b
+ !b
;
226 /* then build the huffman tree accodring to probabilities */
227 ff_huff_build_tree(s
->avctx
, vlc
, size
, nodes
, vp6_huff_cmp
,
228 FF_HUFFMAN_FLAG_HNODE_FIRST
);
231 static void vp6_parse_coeff_models(vp56_context_t
*s
)
233 vp56_range_coder_t
*c
= &s
->c
;
234 vp56_model_t
*model
= s
->modelp
;
236 int node
, cg
, ctx
, pos
;
237 int ct
; /* code type */
238 int pt
; /* plane type (0 for Y, 1 for U or V) */
240 memset(def_prob
, 0x80, sizeof(def_prob
));
242 for (pt
=0; pt
<2; pt
++)
243 for (node
=0; node
<11; node
++)
244 if (vp56_rac_get_prob(c
, vp6_dccv_pct
[pt
][node
])) {
245 def_prob
[node
] = vp56_rac_gets_nn(c
, 7);
246 model
->coeff_dccv
[pt
][node
] = def_prob
[node
];
247 } else if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
) {
248 model
->coeff_dccv
[pt
][node
] = def_prob
[node
];
251 if (vp56_rac_get(c
)) {
252 for (pos
=1; pos
<64; pos
++)
253 if (vp56_rac_get_prob(c
, vp6_coeff_reorder_pct
[pos
]))
254 model
->coeff_reorder
[pos
] = vp56_rac_gets(c
, 4);
255 vp6_coeff_order_table_init(s
);
258 for (cg
=0; cg
<2; cg
++)
259 for (node
=0; node
<14; node
++)
260 if (vp56_rac_get_prob(c
, vp6_runv_pct
[cg
][node
]))
261 model
->coeff_runv
[cg
][node
] = vp56_rac_gets_nn(c
, 7);
263 for (ct
=0; ct
<3; ct
++)
264 for (pt
=0; pt
<2; pt
++)
265 for (cg
=0; cg
<6; cg
++)
266 for (node
=0; node
<11; node
++)
267 if (vp56_rac_get_prob(c
, vp6_ract_pct
[ct
][pt
][cg
][node
])) {
268 def_prob
[node
] = vp56_rac_gets_nn(c
, 7);
269 model
->coeff_ract
[pt
][ct
][cg
][node
] = def_prob
[node
];
270 } else if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
) {
271 model
->coeff_ract
[pt
][ct
][cg
][node
] = def_prob
[node
];
274 if (s
->use_huffman
) {
275 for (pt
=0; pt
<2; pt
++) {
276 vp6_build_huff_tree(s
, model
->coeff_dccv
[pt
],
277 vp6_huff_coeff_map
, 12, &s
->dccv_vlc
[pt
]);
278 vp6_build_huff_tree(s
, model
->coeff_runv
[pt
],
279 vp6_huff_run_map
, 9, &s
->runv_vlc
[pt
]);
280 for (ct
=0; ct
<3; ct
++)
281 for (cg
= 0; cg
< 6; cg
++)
282 vp6_build_huff_tree(s
, model
->coeff_ract
[pt
][ct
][cg
],
283 vp6_huff_coeff_map
, 12,
284 &s
->ract_vlc
[pt
][ct
][cg
]);
286 memset(s
->nb_null
, 0, sizeof(s
->nb_null
));
288 /* coeff_dcct is a linear combination of coeff_dccv */
289 for (pt
=0; pt
<2; pt
++)
290 for (ctx
=0; ctx
<3; ctx
++)
291 for (node
=0; node
<5; node
++)
292 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);
296 static void vp6_parse_vector_adjustment(vp56_context_t
*s
, vp56_mv_t
*vect
)
298 vp56_range_coder_t
*c
= &s
->c
;
299 vp56_model_t
*model
= s
->modelp
;
302 *vect
= (vp56_mv_t
) {0,0};
303 if (s
->vector_candidate_pos
< 2)
304 *vect
= s
->vector_candidate
[0];
306 for (comp
=0; comp
<2; comp
++) {
309 if (vp56_rac_get_prob(c
, model
->vector_dct
[comp
])) {
310 static const uint8_t prob_order
[] = {0, 1, 2, 7, 6, 5, 4};
311 for (i
=0; i
<sizeof(prob_order
); i
++) {
312 int j
= prob_order
[i
];
313 delta
|= vp56_rac_get_prob(c
, model
->vector_fdv
[comp
][j
])<<j
;
316 delta
|= vp56_rac_get_prob(c
, model
->vector_fdv
[comp
][3])<<3;
320 delta
= vp56_rac_get_tree(c
, vp56_pva_tree
,
321 model
->vector_pdv
[comp
]);
324 if (delta
&& vp56_rac_get_prob(c
, model
->vector_sig
[comp
]))
335 * Read number of consecutive blocks with null DC or AC.
336 * This value is < 74.
338 static unsigned vp6_get_nb_null(vp56_context_t
*s
)
340 unsigned val
= get_bits(&s
->gb
, 2);
342 val
+= get_bits(&s
->gb
, 2);
344 val
= get_bits1(&s
->gb
) << 2;
345 val
= 6+val
+ get_bits(&s
->gb
, 2+val
);
350 static void vp6_parse_coeff_huffman(vp56_context_t
*s
)
352 vp56_model_t
*model
= s
->modelp
;
353 uint8_t *permute
= s
->scantable
.permutated
;
355 int coeff
, sign
, coeff_idx
;
357 int pt
= 0; /* plane type (0 for Y, 1 for U or V) */
359 for (b
=0; b
<6; b
++) {
360 int ct
= 0; /* code type */
362 vlc_coeff
= &s
->dccv_vlc
[pt
];
364 for (coeff_idx
=0; coeff_idx
<64; ) {
366 if (coeff_idx
<2 && s
->nb_null
[coeff_idx
][pt
]) {
367 s
->nb_null
[coeff_idx
][pt
]--;
371 coeff
= get_vlc2(&s
->gb
, vlc_coeff
->table
, 9, 3);
374 int pt
= (coeff_idx
>= 6);
375 run
+= get_vlc2(&s
->gb
, s
->runv_vlc
[pt
].table
, 9, 3);
377 run
+= get_bits(&s
->gb
, 6);
379 s
->nb_null
[0][pt
] = vp6_get_nb_null(s
);
381 } else if (coeff
== 11) { /* end of block */
382 if (coeff_idx
== 1) /* first AC coeff ? */
383 s
->nb_null
[1][pt
] = vp6_get_nb_null(s
);
386 int coeff2
= vp56_coeff_bias
[coeff
];
388 coeff2
+= get_bits(&s
->gb
, coeff
<= 9 ? coeff
- 4 : 11);
389 ct
= 1 + (coeff2
> 1);
390 sign
= get_bits1(&s
->gb
);
391 coeff2
= (coeff2
^ -sign
) + sign
;
393 coeff2
*= s
->dequant_ac
;
394 idx
= model
->coeff_index_to_pos
[coeff_idx
];
395 s
->block_coeff
[b
][permute
[idx
]] = coeff2
;
399 cg
= FFMIN(vp6_coeff_groups
[coeff_idx
], 3);
400 vlc_coeff
= &s
->ract_vlc
[pt
][ct
][cg
];
405 static void vp6_parse_coeff(vp56_context_t
*s
)
407 vp56_range_coder_t
*c
= s
->ccp
;
408 vp56_model_t
*model
= s
->modelp
;
409 uint8_t *permute
= s
->scantable
.permutated
;
410 uint8_t *model1
, *model2
, *model3
;
411 int coeff
, sign
, coeff_idx
;
412 int b
, i
, cg
, idx
, ctx
;
413 int pt
= 0; /* plane type (0 for Y, 1 for U or V) */
415 for (b
=0; b
<6; b
++) {
416 int ct
= 1; /* code type */
421 ctx
= s
->left_block
[vp56_b6to4
[b
]].not_null_dc
422 + s
->above_blocks
[s
->above_block_idx
[b
]].not_null_dc
;
423 model1
= model
->coeff_dccv
[pt
];
424 model2
= model
->coeff_dcct
[pt
][ctx
];
426 for (coeff_idx
=0; coeff_idx
<64; ) {
427 if ((coeff_idx
>1 && ct
==0) || vp56_rac_get_prob(c
, model2
[0])) {
429 if (vp56_rac_get_prob(c
, model2
[2])) {
430 if (vp56_rac_get_prob(c
, model2
[3])) {
431 idx
= vp56_rac_get_tree(c
, vp56_pc_tree
, model1
);
432 coeff
= vp56_coeff_bias
[idx
+5];
433 for (i
=vp56_coeff_bit_length
[idx
]; i
>=0; i
--)
434 coeff
+= vp56_rac_get_prob(c
, vp56_coeff_parse_table
[idx
][i
]) << i
;
436 if (vp56_rac_get_prob(c
, model2
[4]))
437 coeff
= 3 + vp56_rac_get_prob(c
, model1
[5]);
446 sign
= vp56_rac_get(c
);
447 coeff
= (coeff
^ -sign
) + sign
;
449 coeff
*= s
->dequant_ac
;
450 idx
= model
->coeff_index_to_pos
[coeff_idx
];
451 s
->block_coeff
[b
][permute
[idx
]] = coeff
;
457 if (!vp56_rac_get_prob(c
, model2
[1]))
460 model3
= model
->coeff_runv
[coeff_idx
>= 6];
461 run
= vp56_rac_get_tree(c
, vp6_pcr_tree
, model3
);
463 for (run
=9, i
=0; i
<6; i
++)
464 run
+= vp56_rac_get_prob(c
, model3
[i
+8]) << i
;
468 cg
= vp6_coeff_groups
[coeff_idx
+=run
];
469 model1
= model2
= model
->coeff_ract
[pt
][ct
][cg
];
472 s
->left_block
[vp56_b6to4
[b
]].not_null_dc
=
473 s
->above_blocks
[s
->above_block_idx
[b
]].not_null_dc
= !!s
->block_coeff
[b
][0];
477 static int vp6_adjust(int v
, int t
)
479 int V
= v
, s
= v
>> 31;
482 if (V
-t
-1 >= (unsigned)(t
-1))
490 static int vp6_block_variance(uint8_t *src
, int stride
)
492 int sum
= 0, square_sum
= 0;
495 for (y
=0; y
<8; y
+=2) {
496 for (x
=0; x
<8; x
+=2) {
498 square_sum
+= src
[x
]*src
[x
];
502 return (16*square_sum
- sum
*sum
) >> 8;
505 static void vp6_filter_hv4(uint8_t *dst
, uint8_t *src
, int stride
,
506 int delta
, const int16_t *weights
)
510 for (y
=0; y
<8; y
++) {
511 for (x
=0; x
<8; x
++) {
512 dst
[x
] = av_clip_uint8(( src
[x
-delta
] * weights
[0]
513 + src
[x
] * weights
[1]
514 + src
[x
+delta
] * weights
[2]
515 + src
[x
+2*delta
] * weights
[3] + 64) >> 7);
522 static void vp6_filter_diag2(vp56_context_t
*s
, uint8_t *dst
, uint8_t *src
,
523 int stride
, int h_weight
, int v_weight
)
525 uint8_t *tmp
= s
->edge_emu_buffer
+16;
526 s
->dsp
.put_h264_chroma_pixels_tab
[0](tmp
, src
, stride
, 9, h_weight
, 0);
527 s
->dsp
.put_h264_chroma_pixels_tab
[0](dst
, tmp
, stride
, 8, 0, v_weight
);
530 static void vp6_filter_diag4(uint8_t *dst
, uint8_t *src
, int stride
,
531 const int16_t *h_weights
,const int16_t *v_weights
)
539 for (y
=0; y
<11; y
++) {
540 for (x
=0; x
<8; x
++) {
541 t
[x
] = av_clip_uint8(( src
[x
-1] * h_weights
[0]
542 + src
[x
] * h_weights
[1]
543 + src
[x
+1] * h_weights
[2]
544 + src
[x
+2] * h_weights
[3] + 64) >> 7);
551 for (y
=0; y
<8; y
++) {
552 for (x
=0; x
<8; x
++) {
553 dst
[x
] = av_clip_uint8(( t
[x
-8 ] * v_weights
[0]
554 + t
[x
] * v_weights
[1]
555 + t
[x
+8 ] * v_weights
[2]
556 + t
[x
+16] * v_weights
[3] + 64) >> 7);
563 static void vp6_filter(vp56_context_t
*s
, uint8_t *dst
, uint8_t *src
,
564 int offset1
, int offset2
, int stride
,
565 vp56_mv_t mv
, int mask
, int select
, int luma
)
568 int x8
= mv
.x
& mask
;
569 int y8
= mv
.y
& mask
;
574 filter4
= s
->filter_mode
;
576 if (s
->max_vector_length
&&
577 (FFABS(mv
.x
) > s
->max_vector_length
||
578 FFABS(mv
.y
) > s
->max_vector_length
)) {
580 } else if (s
->sample_variance_threshold
581 && (vp6_block_variance(src
+offset1
, stride
)
582 < s
->sample_variance_threshold
)) {
588 if ((y8
&& (offset2
-offset1
)*s
->flip
<0) || (!y8
&& offset1
> offset2
)) {
593 if (!y8
) { /* left or right combine */
594 vp6_filter_hv4(dst
, src
+offset1
, stride
, 1,
595 vp6_block_copy_filter
[select
][x8
]);
596 } else if (!x8
) { /* above or below combine */
597 vp6_filter_hv4(dst
, src
+offset1
, stride
, stride
,
598 vp6_block_copy_filter
[select
][y8
]);
600 vp6_filter_diag4(dst
, src
+offset1
+ ((mv
.x
^mv
.y
)>>31), stride
,
601 vp6_block_copy_filter
[select
][x8
],
602 vp6_block_copy_filter
[select
][y8
]);
606 s
->dsp
.put_h264_chroma_pixels_tab
[0](dst
, src
+offset1
, stride
, 8, x8
, y8
);
608 vp6_filter_diag2(s
, dst
, src
+offset1
+ ((mv
.x
^mv
.y
)>>31), stride
, x8
, y8
);
613 static av_cold
int vp6_decode_init(AVCodecContext
*avctx
)
615 vp56_context_t
*s
= avctx
->priv_data
;
617 vp56_init(avctx
, avctx
->codec
->id
== CODEC_ID_VP6
,
618 avctx
->codec
->id
== CODEC_ID_VP6A
);
619 s
->vp56_coord_div
= vp6_coord_div
;
620 s
->parse_vector_adjustment
= vp6_parse_vector_adjustment
;
621 s
->adjust
= vp6_adjust
;
622 s
->filter
= vp6_filter
;
623 s
->default_models_init
= vp6_default_models_init
;
624 s
->parse_vector_models
= vp6_parse_vector_models
;
625 s
->parse_coeff_models
= vp6_parse_coeff_models
;
626 s
->parse_header
= vp6_parse_header
;
631 AVCodec vp6_decoder
= {
635 sizeof(vp56_context_t
),
641 .long_name
= "On2 VP6",
644 /* flash version, not flipped upside-down */
645 AVCodec vp6f_decoder
= {
649 sizeof(vp56_context_t
),
655 .long_name
= "On2 VP6 (Flash version)"
658 /* flash version, not flipped upside-down, with alpha channel */
659 AVCodec vp6a_decoder
= {
663 sizeof(vp56_context_t
),
669 .long_name
= "On2 VP6 (Flash version, with alpha channel)",