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 (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
;
140 if (s
->use_huffman
) {
141 s
->parse_coeff
= vp6_parse_coeff_huffman
;
142 init_get_bits(&s
->gb
, buf
, buf_size
<<3);
144 vp56_init_range_decoder(&s
->cc
, buf
, buf_size
);
154 static void vp6_coeff_order_table_init(VP56Context
*s
)
158 s
->modelp
->coeff_index_to_pos
[0] = 0;
160 for (pos
=1; pos
<64; pos
++)
161 if (s
->modelp
->coeff_reorder
[pos
] == i
)
162 s
->modelp
->coeff_index_to_pos
[idx
++] = pos
;
165 static void vp6_default_models_init(VP56Context
*s
)
167 VP56Model
*model
= s
->modelp
;
169 model
->vector_dct
[0] = 0xA2;
170 model
->vector_dct
[1] = 0xA4;
171 model
->vector_sig
[0] = 0x80;
172 model
->vector_sig
[1] = 0x80;
174 memcpy(model
->mb_types_stats
, vp56_def_mb_types_stats
, sizeof(model
->mb_types_stats
));
175 memcpy(model
->vector_fdv
, vp6_def_fdv_vector_model
, sizeof(model
->vector_fdv
));
176 memcpy(model
->vector_pdv
, vp6_def_pdv_vector_model
, sizeof(model
->vector_pdv
));
177 memcpy(model
->coeff_runv
, vp6_def_runv_coeff_model
, sizeof(model
->coeff_runv
));
178 memcpy(model
->coeff_reorder
, vp6_def_coeff_reorder
, sizeof(model
->coeff_reorder
));
180 vp6_coeff_order_table_init(s
);
183 static void vp6_parse_vector_models(VP56Context
*s
)
185 VP56RangeCoder
*c
= &s
->c
;
186 VP56Model
*model
= s
->modelp
;
189 for (comp
=0; comp
<2; comp
++) {
190 if (vp56_rac_get_prob(c
, vp6_sig_dct_pct
[comp
][0]))
191 model
->vector_dct
[comp
] = vp56_rac_gets_nn(c
, 7);
192 if (vp56_rac_get_prob(c
, vp6_sig_dct_pct
[comp
][1]))
193 model
->vector_sig
[comp
] = vp56_rac_gets_nn(c
, 7);
196 for (comp
=0; comp
<2; comp
++)
197 for (node
=0; node
<7; node
++)
198 if (vp56_rac_get_prob(c
, vp6_pdv_pct
[comp
][node
]))
199 model
->vector_pdv
[comp
][node
] = vp56_rac_gets_nn(c
, 7);
201 for (comp
=0; comp
<2; comp
++)
202 for (node
=0; node
<8; node
++)
203 if (vp56_rac_get_prob(c
, vp6_fdv_pct
[comp
][node
]))
204 model
->vector_fdv
[comp
][node
] = vp56_rac_gets_nn(c
, 7);
207 /* nodes must ascend by count, but with descending symbol order */
208 static int vp6_huff_cmp(const void *va
, const void *vb
)
210 const Node
*a
= va
, *b
= vb
;
211 return (a
->count
- b
->count
)*16 + (b
->sym
- a
->sym
);
214 static void vp6_build_huff_tree(VP56Context
*s
, uint8_t coeff_model
[],
215 const uint8_t *map
, unsigned size
, VLC
*vlc
)
217 Node nodes
[2*size
], *tmp
= &nodes
[size
];
220 /* first compute probabilities from model */
222 for (i
=0; i
<size
-1; i
++) {
223 a
= tmp
[i
].count
* coeff_model
[i
] >> 8;
224 b
= tmp
[i
].count
* (255 - coeff_model
[i
]) >> 8;
225 nodes
[map
[2*i
]].count
= a
+ !a
;
226 nodes
[map
[2*i
+1]].count
= b
+ !b
;
229 /* then build the huffman tree accodring to probabilities */
230 ff_huff_build_tree(s
->avctx
, vlc
, size
, nodes
, vp6_huff_cmp
,
231 FF_HUFFMAN_FLAG_HNODE_FIRST
);
234 static void vp6_parse_coeff_models(VP56Context
*s
)
236 VP56RangeCoder
*c
= &s
->c
;
237 VP56Model
*model
= s
->modelp
;
239 int node
, cg
, ctx
, pos
;
240 int ct
; /* code type */
241 int pt
; /* plane type (0 for Y, 1 for U or V) */
243 memset(def_prob
, 0x80, sizeof(def_prob
));
245 for (pt
=0; pt
<2; pt
++)
246 for (node
=0; node
<11; node
++)
247 if (vp56_rac_get_prob(c
, vp6_dccv_pct
[pt
][node
])) {
248 def_prob
[node
] = vp56_rac_gets_nn(c
, 7);
249 model
->coeff_dccv
[pt
][node
] = def_prob
[node
];
250 } else if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
) {
251 model
->coeff_dccv
[pt
][node
] = def_prob
[node
];
254 if (vp56_rac_get(c
)) {
255 for (pos
=1; pos
<64; pos
++)
256 if (vp56_rac_get_prob(c
, vp6_coeff_reorder_pct
[pos
]))
257 model
->coeff_reorder
[pos
] = vp56_rac_gets(c
, 4);
258 vp6_coeff_order_table_init(s
);
261 for (cg
=0; cg
<2; cg
++)
262 for (node
=0; node
<14; node
++)
263 if (vp56_rac_get_prob(c
, vp6_runv_pct
[cg
][node
]))
264 model
->coeff_runv
[cg
][node
] = vp56_rac_gets_nn(c
, 7);
266 for (ct
=0; ct
<3; ct
++)
267 for (pt
=0; pt
<2; pt
++)
268 for (cg
=0; cg
<6; cg
++)
269 for (node
=0; node
<11; node
++)
270 if (vp56_rac_get_prob(c
, vp6_ract_pct
[ct
][pt
][cg
][node
])) {
271 def_prob
[node
] = vp56_rac_gets_nn(c
, 7);
272 model
->coeff_ract
[pt
][ct
][cg
][node
] = def_prob
[node
];
273 } else if (s
->framep
[VP56_FRAME_CURRENT
]->key_frame
) {
274 model
->coeff_ract
[pt
][ct
][cg
][node
] = def_prob
[node
];
277 if (s
->use_huffman
) {
278 for (pt
=0; pt
<2; pt
++) {
279 vp6_build_huff_tree(s
, model
->coeff_dccv
[pt
],
280 vp6_huff_coeff_map
, 12, &s
->dccv_vlc
[pt
]);
281 vp6_build_huff_tree(s
, model
->coeff_runv
[pt
],
282 vp6_huff_run_map
, 9, &s
->runv_vlc
[pt
]);
283 for (ct
=0; ct
<3; ct
++)
284 for (cg
= 0; cg
< 6; cg
++)
285 vp6_build_huff_tree(s
, model
->coeff_ract
[pt
][ct
][cg
],
286 vp6_huff_coeff_map
, 12,
287 &s
->ract_vlc
[pt
][ct
][cg
]);
289 memset(s
->nb_null
, 0, sizeof(s
->nb_null
));
291 /* coeff_dcct is a linear combination of coeff_dccv */
292 for (pt
=0; pt
<2; pt
++)
293 for (ctx
=0; ctx
<3; ctx
++)
294 for (node
=0; node
<5; node
++)
295 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);
299 static void vp6_parse_vector_adjustment(VP56Context
*s
, VP56mv
*vect
)
301 VP56RangeCoder
*c
= &s
->c
;
302 VP56Model
*model
= s
->modelp
;
305 *vect
= (VP56mv
) {0,0};
306 if (s
->vector_candidate_pos
< 2)
307 *vect
= s
->vector_candidate
[0];
309 for (comp
=0; comp
<2; comp
++) {
312 if (vp56_rac_get_prob(c
, model
->vector_dct
[comp
])) {
313 static const uint8_t prob_order
[] = {0, 1, 2, 7, 6, 5, 4};
314 for (i
=0; i
<sizeof(prob_order
); i
++) {
315 int j
= prob_order
[i
];
316 delta
|= vp56_rac_get_prob(c
, model
->vector_fdv
[comp
][j
])<<j
;
319 delta
|= vp56_rac_get_prob(c
, model
->vector_fdv
[comp
][3])<<3;
323 delta
= vp56_rac_get_tree(c
, vp56_pva_tree
,
324 model
->vector_pdv
[comp
]);
327 if (delta
&& vp56_rac_get_prob(c
, model
->vector_sig
[comp
]))
338 * Read number of consecutive blocks with null DC or AC.
339 * This value is < 74.
341 static unsigned vp6_get_nb_null(VP56Context
*s
)
343 unsigned val
= get_bits(&s
->gb
, 2);
345 val
+= get_bits(&s
->gb
, 2);
347 val
= get_bits1(&s
->gb
) << 2;
348 val
= 6+val
+ get_bits(&s
->gb
, 2+val
);
353 static void vp6_parse_coeff_huffman(VP56Context
*s
)
355 VP56Model
*model
= s
->modelp
;
356 uint8_t *permute
= s
->scantable
.permutated
;
358 int coeff
, sign
, coeff_idx
;
360 int pt
= 0; /* plane type (0 for Y, 1 for U or V) */
362 for (b
=0; b
<6; b
++) {
363 int ct
= 0; /* code type */
365 vlc_coeff
= &s
->dccv_vlc
[pt
];
367 for (coeff_idx
=0; coeff_idx
<64; ) {
369 if (coeff_idx
<2 && s
->nb_null
[coeff_idx
][pt
]) {
370 s
->nb_null
[coeff_idx
][pt
]--;
374 coeff
= get_vlc2(&s
->gb
, vlc_coeff
->table
, 9, 3);
377 int pt
= (coeff_idx
>= 6);
378 run
+= get_vlc2(&s
->gb
, s
->runv_vlc
[pt
].table
, 9, 3);
380 run
+= get_bits(&s
->gb
, 6);
382 s
->nb_null
[0][pt
] = vp6_get_nb_null(s
);
384 } else if (coeff
== 11) { /* end of block */
385 if (coeff_idx
== 1) /* first AC coeff ? */
386 s
->nb_null
[1][pt
] = vp6_get_nb_null(s
);
389 int coeff2
= vp56_coeff_bias
[coeff
];
391 coeff2
+= get_bits(&s
->gb
, coeff
<= 9 ? coeff
- 4 : 11);
392 ct
= 1 + (coeff2
> 1);
393 sign
= get_bits1(&s
->gb
);
394 coeff2
= (coeff2
^ -sign
) + sign
;
396 coeff2
*= s
->dequant_ac
;
397 idx
= model
->coeff_index_to_pos
[coeff_idx
];
398 s
->block_coeff
[b
][permute
[idx
]] = coeff2
;
402 cg
= FFMIN(vp6_coeff_groups
[coeff_idx
], 3);
403 vlc_coeff
= &s
->ract_vlc
[pt
][ct
][cg
];
408 static void vp6_parse_coeff(VP56Context
*s
)
410 VP56RangeCoder
*c
= s
->ccp
;
411 VP56Model
*model
= s
->modelp
;
412 uint8_t *permute
= s
->scantable
.permutated
;
413 uint8_t *model1
, *model2
, *model3
;
414 int coeff
, sign
, coeff_idx
;
415 int b
, i
, cg
, idx
, ctx
;
416 int pt
= 0; /* plane type (0 for Y, 1 for U or V) */
418 for (b
=0; b
<6; b
++) {
419 int ct
= 1; /* code type */
424 ctx
= s
->left_block
[vp56_b6to4
[b
]].not_null_dc
425 + s
->above_blocks
[s
->above_block_idx
[b
]].not_null_dc
;
426 model1
= model
->coeff_dccv
[pt
];
427 model2
= model
->coeff_dcct
[pt
][ctx
];
429 for (coeff_idx
=0; coeff_idx
<64; ) {
430 if ((coeff_idx
>1 && ct
==0) || vp56_rac_get_prob(c
, model2
[0])) {
432 if (vp56_rac_get_prob(c
, model2
[2])) {
433 if (vp56_rac_get_prob(c
, model2
[3])) {
434 idx
= vp56_rac_get_tree(c
, vp56_pc_tree
, model1
);
435 coeff
= vp56_coeff_bias
[idx
+5];
436 for (i
=vp56_coeff_bit_length
[idx
]; i
>=0; i
--)
437 coeff
+= vp56_rac_get_prob(c
, vp56_coeff_parse_table
[idx
][i
]) << i
;
439 if (vp56_rac_get_prob(c
, model2
[4]))
440 coeff
= 3 + vp56_rac_get_prob(c
, model1
[5]);
449 sign
= vp56_rac_get(c
);
450 coeff
= (coeff
^ -sign
) + sign
;
452 coeff
*= s
->dequant_ac
;
453 idx
= model
->coeff_index_to_pos
[coeff_idx
];
454 s
->block_coeff
[b
][permute
[idx
]] = coeff
;
460 if (!vp56_rac_get_prob(c
, model2
[1]))
463 model3
= model
->coeff_runv
[coeff_idx
>= 6];
464 run
= vp56_rac_get_tree(c
, vp6_pcr_tree
, model3
);
466 for (run
=9, i
=0; i
<6; i
++)
467 run
+= vp56_rac_get_prob(c
, model3
[i
+8]) << i
;
471 cg
= vp6_coeff_groups
[coeff_idx
+=run
];
472 model1
= model2
= model
->coeff_ract
[pt
][ct
][cg
];
475 s
->left_block
[vp56_b6to4
[b
]].not_null_dc
=
476 s
->above_blocks
[s
->above_block_idx
[b
]].not_null_dc
= !!s
->block_coeff
[b
][0];
480 static int vp6_adjust(int v
, int t
)
482 int V
= v
, s
= v
>> 31;
485 if (V
-t
-1 >= (unsigned)(t
-1))
493 static int vp6_block_variance(uint8_t *src
, int stride
)
495 int sum
= 0, square_sum
= 0;
498 for (y
=0; y
<8; y
+=2) {
499 for (x
=0; x
<8; x
+=2) {
501 square_sum
+= src
[x
]*src
[x
];
505 return (16*square_sum
- sum
*sum
) >> 8;
508 static void vp6_filter_hv4(uint8_t *dst
, uint8_t *src
, int stride
,
509 int delta
, const int16_t *weights
)
513 for (y
=0; y
<8; y
++) {
514 for (x
=0; x
<8; x
++) {
515 dst
[x
] = av_clip_uint8(( src
[x
-delta
] * weights
[0]
516 + src
[x
] * weights
[1]
517 + src
[x
+delta
] * weights
[2]
518 + src
[x
+2*delta
] * weights
[3] + 64) >> 7);
525 static void vp6_filter_diag2(VP56Context
*s
, uint8_t *dst
, uint8_t *src
,
526 int stride
, int h_weight
, int v_weight
)
528 uint8_t *tmp
= s
->edge_emu_buffer
+16;
529 s
->dsp
.put_h264_chroma_pixels_tab
[0](tmp
, src
, stride
, 9, h_weight
, 0);
530 s
->dsp
.put_h264_chroma_pixels_tab
[0](dst
, tmp
, stride
, 8, 0, v_weight
);
533 static void vp6_filter_diag4(uint8_t *dst
, uint8_t *src
, int stride
,
534 const int16_t *h_weights
,const int16_t *v_weights
)
542 for (y
=0; y
<11; y
++) {
543 for (x
=0; x
<8; x
++) {
544 t
[x
] = av_clip_uint8(( src
[x
-1] * h_weights
[0]
545 + src
[x
] * h_weights
[1]
546 + src
[x
+1] * h_weights
[2]
547 + src
[x
+2] * h_weights
[3] + 64) >> 7);
554 for (y
=0; y
<8; y
++) {
555 for (x
=0; x
<8; x
++) {
556 dst
[x
] = av_clip_uint8(( t
[x
-8 ] * v_weights
[0]
557 + t
[x
] * v_weights
[1]
558 + t
[x
+8 ] * v_weights
[2]
559 + t
[x
+16] * v_weights
[3] + 64) >> 7);
566 static void vp6_filter(VP56Context
*s
, uint8_t *dst
, uint8_t *src
,
567 int offset1
, int offset2
, int stride
,
568 VP56mv mv
, int mask
, int select
, int luma
)
571 int x8
= mv
.x
& mask
;
572 int y8
= mv
.y
& mask
;
577 filter4
= s
->filter_mode
;
579 if (s
->max_vector_length
&&
580 (FFABS(mv
.x
) > s
->max_vector_length
||
581 FFABS(mv
.y
) > s
->max_vector_length
)) {
583 } else if (s
->sample_variance_threshold
584 && (vp6_block_variance(src
+offset1
, stride
)
585 < s
->sample_variance_threshold
)) {
591 if ((y8
&& (offset2
-offset1
)*s
->flip
<0) || (!y8
&& offset1
> offset2
)) {
596 if (!y8
) { /* left or right combine */
597 vp6_filter_hv4(dst
, src
+offset1
, stride
, 1,
598 vp6_block_copy_filter
[select
][x8
]);
599 } else if (!x8
) { /* above or below combine */
600 vp6_filter_hv4(dst
, src
+offset1
, stride
, stride
,
601 vp6_block_copy_filter
[select
][y8
]);
603 vp6_filter_diag4(dst
, src
+offset1
+ ((mv
.x
^mv
.y
)>>31), stride
,
604 vp6_block_copy_filter
[select
][x8
],
605 vp6_block_copy_filter
[select
][y8
]);
609 s
->dsp
.put_h264_chroma_pixels_tab
[0](dst
, src
+offset1
, stride
, 8, x8
, y8
);
611 vp6_filter_diag2(s
, dst
, src
+offset1
+ ((mv
.x
^mv
.y
)>>31), stride
, x8
, y8
);
616 static av_cold
int vp6_decode_init(AVCodecContext
*avctx
)
618 VP56Context
*s
= avctx
->priv_data
;
620 vp56_init(avctx
, avctx
->codec
->id
== CODEC_ID_VP6
,
621 avctx
->codec
->id
== CODEC_ID_VP6A
);
622 s
->vp56_coord_div
= vp6_coord_div
;
623 s
->parse_vector_adjustment
= vp6_parse_vector_adjustment
;
624 s
->adjust
= vp6_adjust
;
625 s
->filter
= vp6_filter
;
626 s
->default_models_init
= vp6_default_models_init
;
627 s
->parse_vector_models
= vp6_parse_vector_models
;
628 s
->parse_coeff_models
= vp6_parse_coeff_models
;
629 s
->parse_header
= vp6_parse_header
;
634 AVCodec vp6_decoder
= {
644 .long_name
= NULL_IF_CONFIG_SMALL("On2 VP6"),
647 /* flash version, not flipped upside-down */
648 AVCodec vp6f_decoder
= {
658 .long_name
= NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version)"),
661 /* flash version, not flipped upside-down, with alpha channel */
662 AVCodec vp6a_decoder
= {
672 .long_name
= NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version, with alpha channel)"),