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 |
|
|
* VP6 compatible video decoder |
24 |
|
|
* |
25 |
|
|
* The VP6F decoder accepts an optional 1 byte extradata. It is composed of: |
26 |
|
|
* - upper 4 bits: difference between encoded width and visible width |
27 |
|
|
* - lower 4 bits: difference between encoded height and visible height |
28 |
|
|
*/ |
29 |
|
|
|
30 |
|
|
#include <stdlib.h> |
31 |
|
|
|
32 |
|
|
#include "avcodec.h" |
33 |
|
|
#include "get_bits.h" |
34 |
|
|
#include "huffman.h" |
35 |
|
|
#include "internal.h" |
36 |
|
|
|
37 |
|
|
#include "vp56.h" |
38 |
|
|
#include "vp56data.h" |
39 |
|
|
#include "vp6data.h" |
40 |
|
|
|
41 |
|
|
#define VP6_MAX_HUFF_SIZE 12 |
42 |
|
|
|
43 |
|
|
static int vp6_parse_coeff(VP56Context *s); |
44 |
|
|
static int vp6_parse_coeff_huffman(VP56Context *s); |
45 |
|
|
|
46 |
|
713 |
static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size) |
47 |
|
|
{ |
48 |
|
713 |
VP56RangeCoder *c = &s->c; |
49 |
|
713 |
int parse_filter_info = 0; |
50 |
|
713 |
int coeff_offset = 0; |
51 |
|
713 |
int vrt_shift = 0; |
52 |
|
|
int sub_version; |
53 |
|
|
int rows, cols; |
54 |
|
713 |
int res = 0; |
55 |
|
|
int ret; |
56 |
|
713 |
int separated_coeff = buf[0] & 1; |
57 |
|
|
|
58 |
|
713 |
s->frames[VP56_FRAME_CURRENT]->key_frame = !(buf[0] & 0x80); |
59 |
|
713 |
ff_vp56_init_dequant(s, (buf[0] >> 1) & 0x3F); |
60 |
|
|
|
61 |
✓✓ |
713 |
if (s->frames[VP56_FRAME_CURRENT]->key_frame) { |
62 |
|
39 |
sub_version = buf[1] >> 3; |
63 |
✗✓ |
39 |
if (sub_version > 8) |
64 |
|
|
return AVERROR_INVALIDDATA; |
65 |
|
39 |
s->filter_header = buf[1] & 0x06; |
66 |
✗✓ |
39 |
if (buf[1] & 1) { |
67 |
|
|
avpriv_report_missing_feature(s->avctx, "Interlacing"); |
68 |
|
|
return AVERROR_PATCHWELCOME; |
69 |
|
|
} |
70 |
✓✓✗✓
|
39 |
if (separated_coeff || !s->filter_header) { |
71 |
|
11 |
coeff_offset = AV_RB16(buf+2) - 2; |
72 |
|
11 |
buf += 2; |
73 |
|
11 |
buf_size -= 2; |
74 |
|
|
} |
75 |
|
|
|
76 |
|
39 |
rows = buf[2]; /* number of stored macroblock rows */ |
77 |
|
39 |
cols = buf[3]; /* number of stored macroblock cols */ |
78 |
|
|
/* buf[4] is number of displayed macroblock rows */ |
79 |
|
|
/* buf[5] is number of displayed macroblock cols */ |
80 |
✓✗✗✓
|
39 |
if (!rows || !cols) { |
81 |
|
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid size %dx%d\n", cols << 4, rows << 4); |
82 |
|
|
return AVERROR_INVALIDDATA; |
83 |
|
|
} |
84 |
|
|
|
85 |
✓✓ |
39 |
if (!s->macroblocks || /* first frame */ |
86 |
✓✗ |
28 |
16*cols != s->avctx->coded_width || |
87 |
✗✓ |
28 |
16*rows != s->avctx->coded_height) { |
88 |
✓✓ |
11 |
if (s->avctx->extradata_size == 0 && |
89 |
✓✓ |
9 |
FFALIGN(s->avctx->width, 16) == 16 * cols && |
90 |
✓✗ |
4 |
FFALIGN(s->avctx->height, 16) == 16 * rows) { |
91 |
|
|
// We assume this is properly signalled container cropping, |
92 |
|
|
// in an F4V file. Just set the coded_width/height, don't |
93 |
|
|
// touch the cropped ones. |
94 |
|
4 |
s->avctx->coded_width = 16 * cols; |
95 |
|
4 |
s->avctx->coded_height = 16 * rows; |
96 |
|
|
} else { |
97 |
|
7 |
ret = ff_set_dimensions(s->avctx, 16 * cols, 16 * rows); |
98 |
✗✓ |
7 |
if (ret < 0) |
99 |
|
|
return ret; |
100 |
|
|
|
101 |
✓✓ |
7 |
if (s->avctx->extradata_size == 1) { |
102 |
|
2 |
s->avctx->width -= s->avctx->extradata[0] >> 4; |
103 |
|
2 |
s->avctx->height -= s->avctx->extradata[0] & 0x0F; |
104 |
|
|
} |
105 |
|
|
} |
106 |
|
11 |
res = VP56_SIZE_CHANGE; |
107 |
|
|
} |
108 |
|
|
|
109 |
|
39 |
ret = ff_vp56_init_range_decoder(c, buf+6, buf_size-6); |
110 |
✗✓ |
39 |
if (ret < 0) |
111 |
|
|
goto fail; |
112 |
|
39 |
vp56_rac_gets(c, 2); |
113 |
|
|
|
114 |
|
39 |
parse_filter_info = s->filter_header; |
115 |
✓✓ |
39 |
if (sub_version < 8) |
116 |
|
14 |
vrt_shift = 5; |
117 |
|
39 |
s->sub_version = sub_version; |
118 |
|
39 |
s->golden_frame = 0; |
119 |
|
|
} else { |
120 |
✓✗✓✗ ✗✓ |
674 |
if (!s->sub_version || !s->avctx->coded_width || !s->avctx->coded_height) |
121 |
|
|
return AVERROR_INVALIDDATA; |
122 |
|
|
|
123 |
✓✓✗✓
|
674 |
if (separated_coeff || !s->filter_header) { |
124 |
|
126 |
coeff_offset = AV_RB16(buf+1) - 2; |
125 |
|
126 |
buf += 2; |
126 |
|
126 |
buf_size -= 2; |
127 |
|
|
} |
128 |
|
674 |
ret = ff_vp56_init_range_decoder(c, buf+1, buf_size-1); |
129 |
✗✓ |
674 |
if (ret < 0) |
130 |
|
|
return ret; |
131 |
|
|
|
132 |
|
674 |
s->golden_frame = vp56_rac_get(c); |
133 |
✓✓ |
674 |
if (s->filter_header) { |
134 |
|
548 |
s->deblock_filtering = vp56_rac_get(c); |
135 |
✓✗ |
548 |
if (s->deblock_filtering) |
136 |
|
548 |
vp56_rac_get(c); |
137 |
✓✓ |
548 |
if (s->sub_version > 7) |
138 |
|
429 |
parse_filter_info = vp56_rac_get(c); |
139 |
|
|
} |
140 |
|
|
} |
141 |
|
|
|
142 |
✓✓ |
713 |
if (parse_filter_info) { |
143 |
✓✗ |
167 |
if (vp56_rac_get(c)) { |
144 |
|
167 |
s->filter_mode = 2; |
145 |
|
167 |
s->sample_variance_threshold = vp56_rac_gets(c, 5) << vrt_shift; |
146 |
|
167 |
s->max_vector_length = 2 << vp56_rac_gets(c, 3); |
147 |
|
|
} else if (vp56_rac_get(c)) { |
148 |
|
|
s->filter_mode = 1; |
149 |
|
|
} else { |
150 |
|
|
s->filter_mode = 0; |
151 |
|
|
} |
152 |
✓✓ |
167 |
if (s->sub_version > 7) |
153 |
|
164 |
s->filter_selection = vp56_rac_gets(c, 4); |
154 |
|
|
else |
155 |
|
3 |
s->filter_selection = 16; |
156 |
|
|
} |
157 |
|
|
|
158 |
|
713 |
s->use_huffman = vp56_rac_get(c); |
159 |
|
|
|
160 |
|
713 |
s->parse_coeff = vp6_parse_coeff; |
161 |
✓✓ |
713 |
if (coeff_offset) { |
162 |
|
137 |
buf += coeff_offset; |
163 |
|
137 |
buf_size -= coeff_offset; |
164 |
✗✓ |
137 |
if (buf_size < 0) { |
165 |
|
|
ret = AVERROR_INVALIDDATA; |
166 |
|
|
goto fail; |
167 |
|
|
} |
168 |
✓✓ |
137 |
if (s->use_huffman) { |
169 |
|
117 |
s->parse_coeff = vp6_parse_coeff_huffman; |
170 |
|
117 |
init_get_bits(&s->gb, buf, buf_size<<3); |
171 |
|
|
} else { |
172 |
|
20 |
ret = ff_vp56_init_range_decoder(&s->cc, buf, buf_size); |
173 |
✗✓ |
20 |
if (ret < 0) |
174 |
|
|
goto fail; |
175 |
|
20 |
s->ccp = &s->cc; |
176 |
|
|
} |
177 |
|
|
} else { |
178 |
|
576 |
s->ccp = &s->c; |
179 |
|
|
} |
180 |
|
|
|
181 |
|
713 |
return res; |
182 |
|
|
fail: |
183 |
|
|
if (res == VP56_SIZE_CHANGE) |
184 |
|
|
ff_set_dimensions(s->avctx, 0, 0); |
185 |
|
|
return ret; |
186 |
|
|
} |
187 |
|
|
|
188 |
|
40 |
static void vp6_coeff_order_table_init(VP56Context *s) |
189 |
|
|
{ |
190 |
|
40 |
int i, pos, idx = 1; |
191 |
|
|
|
192 |
|
40 |
s->modelp->coeff_index_to_pos[0] = 0; |
193 |
✓✓ |
680 |
for (i=0; i<16; i++) |
194 |
✓✓ |
40960 |
for (pos=1; pos<64; pos++) |
195 |
✓✓ |
40320 |
if (s->modelp->coeff_reorder[pos] == i) |
196 |
|
2520 |
s->modelp->coeff_index_to_pos[idx++] = pos; |
197 |
|
|
|
198 |
✓✓ |
2600 |
for (idx = 0; idx < 64; idx++) { |
199 |
|
2560 |
int max = 0; |
200 |
✓✓ |
85760 |
for (i = 0; i <= idx; i++) { |
201 |
|
83200 |
int v = s->modelp->coeff_index_to_pos[i]; |
202 |
✓✓ |
83200 |
if (v > max) |
203 |
|
80640 |
max = v; |
204 |
|
|
} |
205 |
✓✗ |
2560 |
if (s->sub_version > 6) |
206 |
|
2560 |
max++; |
207 |
|
2560 |
s->modelp->coeff_index_to_idct_selector[idx] = max; |
208 |
|
|
} |
209 |
|
40 |
} |
210 |
|
|
|
211 |
|
39 |
static void vp6_default_models_init(VP56Context *s) |
212 |
|
|
{ |
213 |
|
39 |
VP56Model *model = s->modelp; |
214 |
|
|
|
215 |
|
39 |
model->vector_dct[0] = 0xA2; |
216 |
|
39 |
model->vector_dct[1] = 0xA4; |
217 |
|
39 |
model->vector_sig[0] = 0x80; |
218 |
|
39 |
model->vector_sig[1] = 0x80; |
219 |
|
|
|
220 |
|
39 |
memcpy(model->mb_types_stats, ff_vp56_def_mb_types_stats, sizeof(model->mb_types_stats)); |
221 |
|
39 |
memcpy(model->vector_fdv, vp6_def_fdv_vector_model, sizeof(model->vector_fdv)); |
222 |
|
39 |
memcpy(model->vector_pdv, vp6_def_pdv_vector_model, sizeof(model->vector_pdv)); |
223 |
|
39 |
memcpy(model->coeff_runv, vp6_def_runv_coeff_model, sizeof(model->coeff_runv)); |
224 |
|
39 |
memcpy(model->coeff_reorder, vp6_def_coeff_reorder, sizeof(model->coeff_reorder)); |
225 |
|
|
|
226 |
|
39 |
vp6_coeff_order_table_init(s); |
227 |
|
39 |
} |
228 |
|
|
|
229 |
|
674 |
static void vp6_parse_vector_models(VP56Context *s) |
230 |
|
|
{ |
231 |
|
674 |
VP56RangeCoder *c = &s->c; |
232 |
|
674 |
VP56Model *model = s->modelp; |
233 |
|
|
int comp, node; |
234 |
|
|
|
235 |
✓✓ |
2022 |
for (comp=0; comp<2; comp++) { |
236 |
✓✓ |
1348 |
if (vp56_rac_get_prob_branchy(c, vp6_sig_dct_pct[comp][0])) |
237 |
|
109 |
model->vector_dct[comp] = vp56_rac_gets_nn(c, 7); |
238 |
✓✓ |
1348 |
if (vp56_rac_get_prob_branchy(c, vp6_sig_dct_pct[comp][1])) |
239 |
|
17 |
model->vector_sig[comp] = vp56_rac_gets_nn(c, 7); |
240 |
|
|
} |
241 |
|
|
|
242 |
✓✓ |
2022 |
for (comp=0; comp<2; comp++) |
243 |
✓✓ |
10784 |
for (node=0; node<7; node++) |
244 |
✓✓ |
9436 |
if (vp56_rac_get_prob_branchy(c, vp6_pdv_pct[comp][node])) |
245 |
|
24 |
model->vector_pdv[comp][node] = vp56_rac_gets_nn(c, 7); |
246 |
|
|
|
247 |
✓✓ |
2022 |
for (comp=0; comp<2; comp++) |
248 |
✓✓ |
12132 |
for (node=0; node<8; node++) |
249 |
✓✓ |
10784 |
if (vp56_rac_get_prob_branchy(c, vp6_fdv_pct[comp][node])) |
250 |
|
10 |
model->vector_fdv[comp][node] = vp56_rac_gets_nn(c, 7); |
251 |
|
674 |
} |
252 |
|
|
|
253 |
|
|
/* nodes must ascend by count, but with descending symbol order */ |
254 |
|
149929 |
static int vp6_huff_cmp(const void *va, const void *vb) |
255 |
|
|
{ |
256 |
|
149929 |
const Node *a = va, *b = vb; |
257 |
|
149929 |
return (a->count - b->count)*16 + (b->sym - a->sym); |
258 |
|
|
} |
259 |
|
|
|
260 |
|
4680 |
static int vp6_build_huff_tree(VP56Context *s, uint8_t coeff_model[], |
261 |
|
|
const uint8_t *map, unsigned size, VLC *vlc) |
262 |
|
|
{ |
263 |
|
4680 |
Node nodes[2*VP6_MAX_HUFF_SIZE], *tmp = &nodes[size]; |
264 |
|
|
int a, b, i; |
265 |
|
|
|
266 |
|
|
/* first compute probabilities from model */ |
267 |
|
4680 |
tmp[0].count = 256; |
268 |
✓✓ |
55458 |
for (i=0; i<size-1; i++) { |
269 |
|
50778 |
a = tmp[i].count * coeff_model[i] >> 8; |
270 |
|
50778 |
b = tmp[i].count * (255 - coeff_model[i]) >> 8; |
271 |
|
50778 |
nodes[map[2*i ]].count = a + !a; |
272 |
|
50778 |
nodes[map[2*i+1]].count = b + !b; |
273 |
|
|
} |
274 |
|
|
|
275 |
|
4680 |
ff_free_vlc(vlc); |
276 |
|
|
/* then build the huffman tree according to probabilities */ |
277 |
|
4680 |
return ff_huff_build_tree(s->avctx, vlc, size, FF_HUFFMAN_BITS, |
278 |
|
|
nodes, vp6_huff_cmp, |
279 |
|
|
FF_HUFFMAN_FLAG_HNODE_FIRST); |
280 |
|
|
} |
281 |
|
|
|
282 |
|
713 |
static int vp6_parse_coeff_models(VP56Context *s) |
283 |
|
|
{ |
284 |
|
713 |
VP56RangeCoder *c = &s->c; |
285 |
|
713 |
VP56Model *model = s->modelp; |
286 |
|
|
int def_prob[11]; |
287 |
|
|
int node, cg, ctx, pos; |
288 |
|
|
int ct; /* code type */ |
289 |
|
|
int pt; /* plane type (0 for Y, 1 for U or V) */ |
290 |
|
|
|
291 |
|
713 |
memset(def_prob, 0x80, sizeof(def_prob)); |
292 |
|
|
|
293 |
✓✓ |
2139 |
for (pt=0; pt<2; pt++) |
294 |
✓✓ |
17112 |
for (node=0; node<11; node++) |
295 |
✓✓ |
15686 |
if (vp56_rac_get_prob_branchy(c, vp6_dccv_pct[pt][node])) { |
296 |
|
1101 |
def_prob[node] = vp56_rac_gets_nn(c, 7); |
297 |
|
1101 |
model->coeff_dccv[pt][node] = def_prob[node]; |
298 |
✓✓ |
14585 |
} else if (s->frames[VP56_FRAME_CURRENT]->key_frame) { |
299 |
|
562 |
model->coeff_dccv[pt][node] = def_prob[node]; |
300 |
|
|
} |
301 |
|
|
|
302 |
✓✓ |
713 |
if (vp56_rac_get(c)) { |
303 |
✓✓ |
64 |
for (pos=1; pos<64; pos++) |
304 |
✗✓ |
63 |
if (vp56_rac_get_prob_branchy(c, vp6_coeff_reorder_pct[pos])) |
305 |
|
|
model->coeff_reorder[pos] = vp56_rac_gets(c, 4); |
306 |
|
1 |
vp6_coeff_order_table_init(s); |
307 |
|
|
} |
308 |
|
|
|
309 |
✓✓ |
2139 |
for (cg=0; cg<2; cg++) |
310 |
✓✓ |
21390 |
for (node=0; node<14; node++) |
311 |
✓✓ |
19964 |
if (vp56_rac_get_prob_branchy(c, vp6_runv_pct[cg][node])) |
312 |
|
812 |
model->coeff_runv[cg][node] = vp56_rac_gets_nn(c, 7); |
313 |
|
|
|
314 |
✓✓ |
2852 |
for (ct=0; ct<3; ct++) |
315 |
✓✓ |
6417 |
for (pt=0; pt<2; pt++) |
316 |
✓✓ |
29946 |
for (cg=0; cg<6; cg++) |
317 |
✓✓ |
308016 |
for (node=0; node<11; node++) |
318 |
✓✓ |
282348 |
if (vp56_rac_get_prob_branchy(c, vp6_ract_pct[ct][pt][cg][node])) { |
319 |
|
4801 |
def_prob[node] = vp56_rac_gets_nn(c, 7); |
320 |
|
4801 |
model->coeff_ract[pt][ct][cg][node] = def_prob[node]; |
321 |
✓✓ |
277547 |
} else if (s->frames[VP56_FRAME_CURRENT]->key_frame) { |
322 |
|
13830 |
model->coeff_ract[pt][ct][cg][node] = def_prob[node]; |
323 |
|
|
} |
324 |
|
|
|
325 |
✓✓ |
713 |
if (s->use_huffman) { |
326 |
✓✓ |
351 |
for (pt=0; pt<2; pt++) { |
327 |
✗✓ |
234 |
if (vp6_build_huff_tree(s, model->coeff_dccv[pt], |
328 |
|
|
vp6_huff_coeff_map, 12, &s->dccv_vlc[pt])) |
329 |
|
|
return -1; |
330 |
✗✓ |
234 |
if (vp6_build_huff_tree(s, model->coeff_runv[pt], |
331 |
|
|
vp6_huff_run_map, 9, &s->runv_vlc[pt])) |
332 |
|
|
return -1; |
333 |
✓✓ |
936 |
for (ct=0; ct<3; ct++) |
334 |
✓✓ |
4914 |
for (cg = 0; cg < 6; cg++) |
335 |
✗✓ |
4212 |
if (vp6_build_huff_tree(s, model->coeff_ract[pt][ct][cg], |
336 |
|
|
vp6_huff_coeff_map, 12, |
337 |
|
|
&s->ract_vlc[pt][ct][cg])) |
338 |
|
|
return -1; |
339 |
|
|
} |
340 |
|
117 |
memset(s->nb_null, 0, sizeof(s->nb_null)); |
341 |
|
|
} else { |
342 |
|
|
/* coeff_dcct is a linear combination of coeff_dccv */ |
343 |
✓✓ |
1788 |
for (pt=0; pt<2; pt++) |
344 |
✓✓ |
4768 |
for (ctx=0; ctx<3; ctx++) |
345 |
✓✓ |
21456 |
for (node=0; node<5; node++) |
346 |
|
17880 |
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); |
347 |
|
|
} |
348 |
|
713 |
return 0; |
349 |
|
|
} |
350 |
|
|
|
351 |
|
18340 |
static void vp6_parse_vector_adjustment(VP56Context *s, VP56mv *vect) |
352 |
|
|
{ |
353 |
|
18340 |
VP56RangeCoder *c = &s->c; |
354 |
|
18340 |
VP56Model *model = s->modelp; |
355 |
|
|
int comp; |
356 |
|
|
|
357 |
|
18340 |
*vect = (VP56mv) {0,0}; |
358 |
✓✓ |
18340 |
if (s->vector_candidate_pos < 2) |
359 |
|
15667 |
*vect = s->vector_candidate[0]; |
360 |
|
|
|
361 |
✓✓ |
55020 |
for (comp=0; comp<2; comp++) { |
362 |
|
36680 |
int i, delta = 0; |
363 |
|
|
|
364 |
✓✓ |
36680 |
if (vp56_rac_get_prob_branchy(c, model->vector_dct[comp])) { |
365 |
|
|
static const uint8_t prob_order[] = {0, 1, 2, 7, 6, 5, 4}; |
366 |
✓✓ |
68968 |
for (i=0; i<sizeof(prob_order); i++) { |
367 |
|
60347 |
int j = prob_order[i]; |
368 |
|
60347 |
delta |= vp56_rac_get_prob(c, model->vector_fdv[comp][j])<<j; |
369 |
|
|
} |
370 |
✓✓ |
8621 |
if (delta & 0xF0) |
371 |
|
4328 |
delta |= vp56_rac_get_prob(c, model->vector_fdv[comp][3])<<3; |
372 |
|
|
else |
373 |
|
4293 |
delta |= 8; |
374 |
|
|
} else { |
375 |
|
28059 |
delta = vp56_rac_get_tree(c, ff_vp56_pva_tree, |
376 |
|
28059 |
model->vector_pdv[comp]); |
377 |
|
|
} |
378 |
|
|
|
379 |
✓✓✓✓
|
36680 |
if (delta && vp56_rac_get_prob_branchy(c, model->vector_sig[comp])) |
380 |
|
13620 |
delta = -delta; |
381 |
|
|
|
382 |
✓✓ |
36680 |
if (!comp) |
383 |
|
18340 |
vect->x += delta; |
384 |
|
|
else |
385 |
|
18340 |
vect->y += delta; |
386 |
|
|
} |
387 |
|
18340 |
} |
388 |
|
|
|
389 |
|
|
/** |
390 |
|
|
* Read number of consecutive blocks with null DC or AC. |
391 |
|
|
* This value is < 74. |
392 |
|
|
*/ |
393 |
|
28576 |
static unsigned vp6_get_nb_null(VP56Context *s) |
394 |
|
|
{ |
395 |
|
28576 |
unsigned val = get_bits(&s->gb, 2); |
396 |
✓✓ |
28576 |
if (val == 2) |
397 |
|
4892 |
val += get_bits(&s->gb, 2); |
398 |
✓✓ |
23684 |
else if (val == 3) { |
399 |
|
806 |
val = get_bits1(&s->gb) << 2; |
400 |
|
806 |
val = 6+val + get_bits(&s->gb, 2+val); |
401 |
|
|
} |
402 |
|
28576 |
return val; |
403 |
|
|
} |
404 |
|
|
|
405 |
|
16848 |
static int vp6_parse_coeff_huffman(VP56Context *s) |
406 |
|
|
{ |
407 |
|
16848 |
VP56Model *model = s->modelp; |
408 |
|
16848 |
uint8_t *permute = s->idct_scantable; |
409 |
|
|
VLC *vlc_coeff; |
410 |
|
|
int coeff, sign, coeff_idx; |
411 |
|
|
int b, cg, idx; |
412 |
|
16848 |
int pt = 0; /* plane type (0 for Y, 1 for U or V) */ |
413 |
|
|
|
414 |
✓✓ |
117936 |
for (b=0; b<6; b++) { |
415 |
|
101088 |
int ct = 0; /* code type */ |
416 |
✓✓ |
101088 |
if (b > 3) pt = 1; |
417 |
|
101088 |
vlc_coeff = &s->dccv_vlc[pt]; |
418 |
|
|
|
419 |
|
101088 |
for (coeff_idx = 0;;) { |
420 |
|
1161120 |
int run = 1; |
421 |
✓✓✓✓
|
1161120 |
if (coeff_idx<2 && s->nb_null[coeff_idx][pt]) { |
422 |
|
28871 |
s->nb_null[coeff_idx][pt]--; |
423 |
✓✓ |
28871 |
if (coeff_idx) |
424 |
|
11362 |
break; |
425 |
|
|
} else { |
426 |
✗✓ |
1132249 |
if (get_bits_left(&s->gb) <= 0) |
427 |
|
|
return AVERROR_INVALIDDATA; |
428 |
|
1132249 |
coeff = get_vlc2(&s->gb, vlc_coeff->table, FF_HUFFMAN_BITS, 3); |
429 |
✓✓ |
1132249 |
if (coeff == 0) { |
430 |
✓✓ |
345601 |
if (coeff_idx) { |
431 |
|
326823 |
int pt = (coeff_idx >= 6); |
432 |
|
326823 |
run += get_vlc2(&s->gb, s->runv_vlc[pt].table, FF_HUFFMAN_BITS, 3); |
433 |
✓✓ |
326823 |
if (run >= 9) |
434 |
|
60162 |
run += get_bits(&s->gb, 6); |
435 |
|
|
} else |
436 |
|
18778 |
s->nb_null[0][pt] = vp6_get_nb_null(s); |
437 |
|
345601 |
ct = 0; |
438 |
✓✓ |
786648 |
} else if (coeff == 11) { /* end of block */ |
439 |
✓✓ |
88872 |
if (coeff_idx == 1) /* first AC coeff ? */ |
440 |
|
9798 |
s->nb_null[1][pt] = vp6_get_nb_null(s); |
441 |
|
88872 |
break; |
442 |
|
|
} else { |
443 |
|
697776 |
int coeff2 = ff_vp56_coeff_bias[coeff]; |
444 |
✓✓ |
697776 |
if (coeff > 4) |
445 |
✓✓ |
39048 |
coeff2 += get_bits(&s->gb, coeff <= 9 ? coeff - 4 : 11); |
446 |
✓✓ |
697776 |
ct = 1 + (coeff2 > 1); |
447 |
|
697776 |
sign = get_bits1(&s->gb); |
448 |
|
697776 |
coeff2 = (coeff2 ^ -sign) + sign; |
449 |
✓✓ |
697776 |
if (coeff_idx) |
450 |
|
632975 |
coeff2 *= s->dequant_ac; |
451 |
|
697776 |
idx = model->coeff_index_to_pos[coeff_idx]; |
452 |
|
697776 |
s->block_coeff[b][permute[idx]] = coeff2; |
453 |
|
|
} |
454 |
|
|
} |
455 |
|
1060886 |
coeff_idx+=run; |
456 |
✓✓ |
1060886 |
if (coeff_idx >= 64) |
457 |
|
854 |
break; |
458 |
|
1060032 |
cg = FFMIN(vp6_coeff_groups[coeff_idx], 3); |
459 |
|
1060032 |
vlc_coeff = &s->ract_vlc[pt][ct][cg]; |
460 |
|
|
} |
461 |
|
101088 |
s->idct_selector[b] = model->coeff_index_to_idct_selector[FFMIN(coeff_idx, 63)]; |
462 |
|
|
} |
463 |
|
16848 |
return 0; |
464 |
|
|
} |
465 |
|
|
|
466 |
|
78707 |
static int vp6_parse_coeff(VP56Context *s) |
467 |
|
|
{ |
468 |
|
78707 |
VP56RangeCoder *c = s->ccp; |
469 |
|
78707 |
VP56Model *model = s->modelp; |
470 |
|
78707 |
uint8_t *permute = s->idct_scantable; |
471 |
|
|
uint8_t *model1, *model2, *model3; |
472 |
|
|
int coeff, sign, coeff_idx; |
473 |
|
|
int b, i, cg, idx, ctx; |
474 |
|
78707 |
int pt = 0; /* plane type (0 for Y, 1 for U or V) */ |
475 |
|
|
|
476 |
✗✓ |
78707 |
if (vpX_rac_is_end(c)) { |
477 |
|
|
av_log(s->avctx, AV_LOG_ERROR, "End of AC stream reached in vp6_parse_coeff\n"); |
478 |
|
|
return AVERROR_INVALIDDATA; |
479 |
|
|
} |
480 |
|
|
|
481 |
✓✓ |
550949 |
for (b=0; b<6; b++) { |
482 |
|
472242 |
int ct = 1; /* code type */ |
483 |
|
472242 |
int run = 1; |
484 |
|
|
|
485 |
✓✓ |
472242 |
if (b > 3) pt = 1; |
486 |
|
|
|
487 |
|
472242 |
ctx = s->left_block[ff_vp56_b6to4[b]].not_null_dc |
488 |
|
472242 |
+ s->above_blocks[s->above_block_idx[b]].not_null_dc; |
489 |
|
472242 |
model1 = model->coeff_dccv[pt]; |
490 |
|
472242 |
model2 = model->coeff_dcct[pt][ctx]; |
491 |
|
|
|
492 |
|
472242 |
coeff_idx = 0; |
493 |
|
|
for (;;) { |
494 |
✓✓✓✓ ✓✓ |
1838805 |
if ((coeff_idx>1 && ct==0) || vp56_rac_get_prob_branchy(c, model2[0])) { |
495 |
|
|
/* parse a coeff */ |
496 |
✓✓ |
671305 |
if (vp56_rac_get_prob_branchy(c, model2[2])) { |
497 |
✓✓ |
159041 |
if (vp56_rac_get_prob_branchy(c, model2[3])) { |
498 |
|
33140 |
idx = vp56_rac_get_tree(c, ff_vp56_pc_tree, model1); |
499 |
|
33140 |
coeff = ff_vp56_coeff_bias[idx+5]; |
500 |
✓✓ |
105809 |
for (i=ff_vp56_coeff_bit_length[idx]; i>=0; i--) |
501 |
|
72669 |
coeff += vp56_rac_get_prob(c, ff_vp56_coeff_parse_table[idx][i]) << i; |
502 |
|
|
} else { |
503 |
✓✓ |
125901 |
if (vp56_rac_get_prob_branchy(c, model2[4])) |
504 |
|
39387 |
coeff = 3 + vp56_rac_get_prob(c, model1[5]); |
505 |
|
|
else |
506 |
|
86514 |
coeff = 2; |
507 |
|
|
} |
508 |
|
159041 |
ct = 2; |
509 |
|
|
} else { |
510 |
|
512264 |
ct = 1; |
511 |
|
512264 |
coeff = 1; |
512 |
|
|
} |
513 |
|
671305 |
sign = vp56_rac_get(c); |
514 |
|
671305 |
coeff = (coeff ^ -sign) + sign; |
515 |
✓✓ |
671305 |
if (coeff_idx) |
516 |
|
594035 |
coeff *= s->dequant_ac; |
517 |
|
671305 |
idx = model->coeff_index_to_pos[coeff_idx]; |
518 |
|
671305 |
s->block_coeff[b][permute[idx]] = coeff; |
519 |
|
671305 |
run = 1; |
520 |
|
|
} else { |
521 |
|
|
/* parse a run */ |
522 |
|
1167500 |
ct = 0; |
523 |
✓✓ |
1167500 |
if (coeff_idx > 0) { |
524 |
✓✓ |
772528 |
if (!vp56_rac_get_prob_branchy(c, model2[1])) |
525 |
|
471292 |
break; |
526 |
|
|
|
527 |
|
301236 |
model3 = model->coeff_runv[coeff_idx >= 6]; |
528 |
|
301236 |
run = vp56_rac_get_tree(c, vp6_pcr_tree, model3); |
529 |
✓✓ |
301236 |
if (!run) |
530 |
✓✓ |
343273 |
for (run=9, i=0; i<6; i++) |
531 |
|
294234 |
run += vp56_rac_get_prob(c, model3[i+8]) << i; |
532 |
|
|
} |
533 |
|
|
} |
534 |
|
1367513 |
coeff_idx += run; |
535 |
✓✓ |
1367513 |
if (coeff_idx >= 64) |
536 |
|
950 |
break; |
537 |
|
1366563 |
cg = vp6_coeff_groups[coeff_idx]; |
538 |
|
1366563 |
model1 = model2 = model->coeff_ract[pt][ct][cg]; |
539 |
|
|
} |
540 |
|
|
|
541 |
|
472242 |
s->left_block[ff_vp56_b6to4[b]].not_null_dc = |
542 |
|
472242 |
s->above_blocks[s->above_block_idx[b]].not_null_dc = !!s->block_coeff[b][0]; |
543 |
|
472242 |
s->idct_selector[b] = model->coeff_index_to_idct_selector[FFMIN(coeff_idx, 63)]; |
544 |
|
|
} |
545 |
|
78707 |
return 0; |
546 |
|
|
} |
547 |
|
|
|
548 |
|
84892 |
static int vp6_block_variance(uint8_t *src, ptrdiff_t stride) |
549 |
|
|
{ |
550 |
|
84892 |
int sum = 0, square_sum = 0; |
551 |
|
|
int y, x; |
552 |
|
|
|
553 |
✓✓ |
424460 |
for (y=0; y<8; y+=2) { |
554 |
✓✓ |
1697840 |
for (x=0; x<8; x+=2) { |
555 |
|
1358272 |
sum += src[x]; |
556 |
|
1358272 |
square_sum += src[x]*src[x]; |
557 |
|
|
} |
558 |
|
339568 |
src += 2*stride; |
559 |
|
|
} |
560 |
|
84892 |
return (16*square_sum - sum*sum) >> 8; |
561 |
|
|
} |
562 |
|
|
|
563 |
|
32615 |
static void vp6_filter_hv4(uint8_t *dst, uint8_t *src, ptrdiff_t stride, |
564 |
|
|
int delta, const int16_t *weights) |
565 |
|
|
{ |
566 |
|
|
int x, y; |
567 |
|
|
|
568 |
✓✓ |
293535 |
for (y=0; y<8; y++) { |
569 |
✓✓ |
2348280 |
for (x=0; x<8; x++) { |
570 |
|
2087360 |
dst[x] = av_clip_uint8(( src[x-delta ] * weights[0] |
571 |
|
2087360 |
+ src[x ] * weights[1] |
572 |
|
2087360 |
+ src[x+delta ] * weights[2] |
573 |
|
2087360 |
+ src[x+2*delta] * weights[3] + 64) >> 7); |
574 |
|
|
} |
575 |
|
260920 |
src += stride; |
576 |
|
260920 |
dst += stride; |
577 |
|
|
} |
578 |
|
32615 |
} |
579 |
|
|
|
580 |
|
52432 |
static void vp6_filter_diag2(VP56Context *s, uint8_t *dst, uint8_t *src, |
581 |
|
|
ptrdiff_t stride, int h_weight, int v_weight) |
582 |
|
|
{ |
583 |
|
52432 |
uint8_t *tmp = s->edge_emu_buffer+16; |
584 |
|
52432 |
s->h264chroma.put_h264_chroma_pixels_tab[0](tmp, src, stride, 9, h_weight, 0); |
585 |
|
52432 |
s->h264chroma.put_h264_chroma_pixels_tab[0](dst, tmp, stride, 8, 0, v_weight); |
586 |
|
52432 |
} |
587 |
|
|
|
588 |
|
171252 |
static void vp6_filter(VP56Context *s, uint8_t *dst, uint8_t *src, |
589 |
|
|
int offset1, int offset2, ptrdiff_t stride, |
590 |
|
|
VP56mv mv, int mask, int select, int luma) |
591 |
|
|
{ |
592 |
|
171252 |
int filter4 = 0; |
593 |
|
171252 |
int x8 = mv.x & mask; |
594 |
|
171252 |
int y8 = mv.y & mask; |
595 |
|
|
|
596 |
✓✓ |
171252 |
if (luma) { |
597 |
|
116166 |
x8 *= 2; |
598 |
|
116166 |
y8 *= 2; |
599 |
|
116166 |
filter4 = s->filter_mode; |
600 |
✓✓ |
116166 |
if (filter4 == 2) { |
601 |
✓✗ |
105317 |
if (s->max_vector_length && |
602 |
✓✓ |
105317 |
(FFABS(mv.x) > s->max_vector_length || |
603 |
✓✓ |
92552 |
FFABS(mv.y) > s->max_vector_length)) { |
604 |
|
20425 |
filter4 = 0; |
605 |
✓✗ |
84892 |
} else if (s->sample_variance_threshold |
606 |
|
84892 |
&& (vp6_block_variance(src+offset1, stride) |
607 |
✓✓ |
84892 |
< s->sample_variance_threshold)) { |
608 |
|
24931 |
filter4 = 0; |
609 |
|
|
} |
610 |
|
|
} |
611 |
|
|
} |
612 |
|
|
|
613 |
✓✓✓✓ ✓✓✓✓
|
171252 |
if ((y8 && (offset2-offset1)*s->flip<0) || (!y8 && offset1 > offset2)) { |
614 |
|
89123 |
offset1 = offset2; |
615 |
|
|
} |
616 |
|
|
|
617 |
✓✓ |
171252 |
if (filter4) { |
618 |
✓✓ |
59961 |
if (!y8) { /* left or right combine */ |
619 |
|
12003 |
vp6_filter_hv4(dst, src+offset1, stride, 1, |
620 |
|
12003 |
vp6_block_copy_filter[select][x8]); |
621 |
✓✓ |
47958 |
} else if (!x8) { /* above or below combine */ |
622 |
|
20612 |
vp6_filter_hv4(dst, src+offset1, stride, stride, |
623 |
|
20612 |
vp6_block_copy_filter[select][y8]); |
624 |
|
|
} else { |
625 |
|
27346 |
s->vp56dsp.vp6_filter_diag4(dst, src+offset1+((mv.x^mv.y)>>31), stride, |
626 |
|
27346 |
vp6_block_copy_filter[select][x8], |
627 |
|
27346 |
vp6_block_copy_filter[select][y8]); |
628 |
|
|
} |
629 |
|
|
} else { |
630 |
✓✓✓✓
|
111291 |
if (!x8 || !y8) { |
631 |
|
58859 |
s->h264chroma.put_h264_chroma_pixels_tab[0](dst, src + offset1, stride, 8, x8, y8); |
632 |
|
|
} else { |
633 |
|
52432 |
vp6_filter_diag2(s, dst, src+offset1 + ((mv.x^mv.y)>>31), stride, x8, y8); |
634 |
|
|
} |
635 |
|
|
} |
636 |
|
171252 |
} |
637 |
|
|
|
638 |
|
|
static av_cold void vp6_decode_init_context(VP56Context *s); |
639 |
|
|
|
640 |
|
13 |
static av_cold int vp6_decode_init(AVCodecContext *avctx) |
641 |
|
|
{ |
642 |
|
13 |
VP56Context *s = avctx->priv_data; |
643 |
|
|
int ret; |
644 |
|
|
|
645 |
✗✓ |
13 |
if ((ret = ff_vp56_init(avctx, avctx->codec->id == AV_CODEC_ID_VP6, |
646 |
|
13 |
avctx->codec->id == AV_CODEC_ID_VP6A)) < 0) |
647 |
|
|
return ret; |
648 |
|
13 |
ff_vp6dsp_init(&s->vp56dsp); |
649 |
|
|
|
650 |
|
13 |
vp6_decode_init_context(s); |
651 |
|
|
|
652 |
✓✓ |
13 |
if (s->has_alpha) { |
653 |
|
4 |
s->alpha_context = av_mallocz(sizeof(VP56Context)); |
654 |
|
4 |
ff_vp56_init_context(avctx, s->alpha_context, |
655 |
|
4 |
s->flip == -1, s->has_alpha); |
656 |
|
4 |
ff_vp6dsp_init(&s->alpha_context->vp56dsp); |
657 |
|
4 |
vp6_decode_init_context(s->alpha_context); |
658 |
|
|
} |
659 |
|
|
|
660 |
|
13 |
return 0; |
661 |
|
|
} |
662 |
|
|
|
663 |
|
17 |
static av_cold void vp6_decode_init_context(VP56Context *s) |
664 |
|
|
{ |
665 |
|
17 |
s->deblock_filtering = 0; |
666 |
|
17 |
s->vp56_coord_div = vp6_coord_div; |
667 |
|
17 |
s->parse_vector_adjustment = vp6_parse_vector_adjustment; |
668 |
|
17 |
s->filter = vp6_filter; |
669 |
|
17 |
s->default_models_init = vp6_default_models_init; |
670 |
|
17 |
s->parse_vector_models = vp6_parse_vector_models; |
671 |
|
17 |
s->parse_coeff_models = vp6_parse_coeff_models; |
672 |
|
17 |
s->parse_header = vp6_parse_header; |
673 |
|
17 |
} |
674 |
|
|
|
675 |
|
|
static av_cold void vp6_decode_free_context(VP56Context *s); |
676 |
|
|
|
677 |
|
13 |
static av_cold int vp6_decode_free(AVCodecContext *avctx) |
678 |
|
|
{ |
679 |
|
13 |
VP56Context *s = avctx->priv_data; |
680 |
|
|
|
681 |
|
13 |
ff_vp56_free(avctx); |
682 |
|
13 |
vp6_decode_free_context(s); |
683 |
|
|
|
684 |
✓✓ |
13 |
if (s->alpha_context) { |
685 |
|
4 |
ff_vp56_free_context(s->alpha_context); |
686 |
|
4 |
vp6_decode_free_context(s->alpha_context); |
687 |
|
4 |
av_freep(&s->alpha_context); |
688 |
|
|
} |
689 |
|
|
|
690 |
|
13 |
return 0; |
691 |
|
|
} |
692 |
|
|
|
693 |
|
17 |
static av_cold void vp6_decode_free_context(VP56Context *s) |
694 |
|
|
{ |
695 |
|
|
int pt, ct, cg; |
696 |
|
|
|
697 |
✓✓ |
51 |
for (pt=0; pt<2; pt++) { |
698 |
|
34 |
ff_free_vlc(&s->dccv_vlc[pt]); |
699 |
|
34 |
ff_free_vlc(&s->runv_vlc[pt]); |
700 |
✓✓ |
136 |
for (ct=0; ct<3; ct++) |
701 |
✓✓ |
714 |
for (cg=0; cg<6; cg++) |
702 |
|
612 |
ff_free_vlc(&s->ract_vlc[pt][ct][cg]); |
703 |
|
|
} |
704 |
|
17 |
} |
705 |
|
|
|
706 |
|
|
AVCodec ff_vp6_decoder = { |
707 |
|
|
.name = "vp6", |
708 |
|
|
.long_name = NULL_IF_CONFIG_SMALL("On2 VP6"), |
709 |
|
|
.type = AVMEDIA_TYPE_VIDEO, |
710 |
|
|
.id = AV_CODEC_ID_VP6, |
711 |
|
|
.priv_data_size = sizeof(VP56Context), |
712 |
|
|
.init = vp6_decode_init, |
713 |
|
|
.close = vp6_decode_free, |
714 |
|
|
.decode = ff_vp56_decode_frame, |
715 |
|
|
.capabilities = AV_CODEC_CAP_DR1, |
716 |
|
|
}; |
717 |
|
|
|
718 |
|
|
/* flash version, not flipped upside-down */ |
719 |
|
|
AVCodec ff_vp6f_decoder = { |
720 |
|
|
.name = "vp6f", |
721 |
|
|
.long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version)"), |
722 |
|
|
.type = AVMEDIA_TYPE_VIDEO, |
723 |
|
|
.id = AV_CODEC_ID_VP6F, |
724 |
|
|
.priv_data_size = sizeof(VP56Context), |
725 |
|
|
.init = vp6_decode_init, |
726 |
|
|
.close = vp6_decode_free, |
727 |
|
|
.decode = ff_vp56_decode_frame, |
728 |
|
|
.capabilities = AV_CODEC_CAP_DR1, |
729 |
|
|
}; |
730 |
|
|
|
731 |
|
|
/* flash version, not flipped upside-down, with alpha channel */ |
732 |
|
|
AVCodec ff_vp6a_decoder = { |
733 |
|
|
.name = "vp6a", |
734 |
|
|
.long_name = NULL_IF_CONFIG_SMALL("On2 VP6 (Flash version, with alpha channel)"), |
735 |
|
|
.type = AVMEDIA_TYPE_VIDEO, |
736 |
|
|
.id = AV_CODEC_ID_VP6A, |
737 |
|
|
.priv_data_size = sizeof(VP56Context), |
738 |
|
|
.init = vp6_decode_init, |
739 |
|
|
.close = vp6_decode_free, |
740 |
|
|
.decode = ff_vp56_decode_frame, |
741 |
|
|
.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS, |
742 |
|
|
}; |