/src/ffmpeg/libavcodec/mv30.c
Line | Count | Source |
1 | | /* |
2 | | * MidiVid MV30 decoder |
3 | | * |
4 | | * Copyright (c) 2020 Paul B Mahol |
5 | | * |
6 | | * This file is part of FFmpeg. |
7 | | * |
8 | | * FFmpeg is free software; you can redistribute it and/or |
9 | | * modify it under the terms of the GNU Lesser General Public |
10 | | * License as published by the Free Software Foundation; either |
11 | | * version 2.1 of the License, or (at your option) any later version. |
12 | | * |
13 | | * FFmpeg is distributed in the hope that it will be useful, |
14 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | | * Lesser General Public License for more details. |
17 | | * |
18 | | * You should have received a copy of the GNU Lesser General Public |
19 | | * License along with FFmpeg; if not, write to the Free Software |
20 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | | */ |
22 | | |
23 | | #include <stddef.h> |
24 | | #include <string.h> |
25 | | |
26 | | #include "libavutil/attributes.h" |
27 | | #include "libavutil/mem.h" |
28 | | #include "libavutil/thread.h" |
29 | | |
30 | | #include "avcodec.h" |
31 | | #include "bytestream.h" |
32 | | #include "codec_internal.h" |
33 | | #include "copy_block.h" |
34 | | #include "decode.h" |
35 | | #include "mathops.h" |
36 | | #include "blockdsp.h" |
37 | | #include "get_bits.h" |
38 | | #include "aandcttab.h" |
39 | | |
40 | 220M | #define CBP_VLC_BITS 9 |
41 | | |
42 | | typedef struct MV30Context { |
43 | | GetBitContext gb; |
44 | | |
45 | | int intra_quant; |
46 | | int inter_quant; |
47 | | int is_inter; |
48 | | int mode_size; |
49 | | int nb_mvectors; |
50 | | |
51 | | int block[6][64]; |
52 | | int16_t *mvectors; |
53 | | unsigned int mvectors_size; |
54 | | int16_t *coeffs; |
55 | | unsigned int coeffs_size; |
56 | | |
57 | | int16_t intraq_tab[2][64]; |
58 | | int16_t interq_tab[2][64]; |
59 | | |
60 | | BlockDSPContext bdsp; |
61 | | AVFrame *prev_frame; |
62 | | } MV30Context; |
63 | | |
64 | | static VLCElem cbp_tab[1 << CBP_VLC_BITS]; |
65 | | |
66 | | static const uint8_t luma_tab[] = { |
67 | | 12, 12, 15, 19, 25, 34, 40, 48, |
68 | | 12, 12, 18, 22, 27, 44, 47, 46, |
69 | | 17, 18, 21, 26, 35, 46, 52, 47, |
70 | | 18, 20, 24, 28, 40, 61, 59, 51, |
71 | | 20, 24, 32, 43, 50, 72, 72, 63, |
72 | | 25, 31, 42, 48, 58, 72, 81, 75, |
73 | | 38, 46, 54, 61, 71, 84, 88, 85, |
74 | | 50, 61, 65, 68, 79, 78, 86, 91, |
75 | | }; |
76 | | |
77 | | static const uint8_t chroma_tab[] = { |
78 | | 12, 16, 24, 47, 99, 99, 99, 99, |
79 | | 16, 21, 26, 66, 99, 99, 99, 99, |
80 | | 24, 26, 56, 99, 99, 99, 99, 99, |
81 | | 47, 66, 99, 99, 99, 99, 99, 99, |
82 | | 99, 99, 99, 99, 99, 99, 99, 99, |
83 | | 99, 99, 99, 99, 99, 99, 99, 99, |
84 | | 99, 99, 99, 99, 99, 99, 99, 99, |
85 | | 99, 99, 99, 99, 99, 99, 99, 99, |
86 | | }; |
87 | | |
88 | | static const uint8_t zigzag[] = { |
89 | | 0, 1, 8, 9, 16, 2, 3, 10, |
90 | | 17, 24, 32, 25, 18, 11, 4, 5, |
91 | | 12, 19, 26, 33, 40, 48, 41, 34, |
92 | | 27, 20, 13, 6, 7, 14, 21, 28, |
93 | | 35, 42, 49, 56, 57, 50, 43, 36, |
94 | | 29, 22, 15, 23, 30, 37, 44, 51, |
95 | | 58, 59, 52, 45, 38, 31, 39, 46, |
96 | | 53, 60, 61, 54, 47, 55, 62, 63, |
97 | | }; |
98 | | |
99 | | static void get_qtable(int16_t *table, int quant, const uint8_t *quant_tab) |
100 | 224k | { |
101 | 224k | int factor = quant < 50 ? 5000 / FFMAX(quant, 1) : 200 - FFMIN(quant, 100) * 2; |
102 | | |
103 | 14.5M | for (int i = 0; i < 64; i++) { |
104 | 14.3M | table[i] = av_clip((quant_tab[i] * factor + 0x32) / 100, 1, 0x7fff); |
105 | 14.3M | table[i] = ((int)ff_aanscales[i] * (int)table[i] + 0x800) >> 12; |
106 | 14.3M | } |
107 | 224k | } |
108 | | |
109 | | static inline void idct_1d(unsigned *blk, int step) |
110 | 38.1M | { |
111 | 38.1M | const unsigned t0 = blk[0 * step] + blk[4 * step]; |
112 | 38.1M | const unsigned t1 = blk[0 * step] - blk[4 * step]; |
113 | 38.1M | const unsigned t2 = blk[2 * step] + blk[6 * step]; |
114 | 38.1M | const unsigned t3 = ((int)((blk[2 * step] - blk[6 * step]) * 362U) >> 8) - t2; |
115 | 38.1M | const unsigned t4 = t0 + t2; |
116 | 38.1M | const unsigned t5 = t0 - t2; |
117 | 38.1M | const unsigned t6 = t1 + t3; |
118 | 38.1M | const unsigned t7 = t1 - t3; |
119 | 38.1M | const unsigned t8 = blk[5 * step] + blk[3 * step]; |
120 | 38.1M | const unsigned t9 = blk[5 * step] - blk[3 * step]; |
121 | 38.1M | const unsigned tA = blk[1 * step] + blk[7 * step]; |
122 | 38.1M | const unsigned tB = blk[1 * step] - blk[7 * step]; |
123 | 38.1M | const unsigned tC = t8 + tA; |
124 | 38.1M | const unsigned tD = (int)((tB + t9) * 473U) >> 8; |
125 | 38.1M | const unsigned tE = (((int)(t9 * -669U) >> 8) - tC) + tD; |
126 | 38.1M | const unsigned tF = ((int)((tA - t8) * 362U) >> 8) - tE; |
127 | 38.1M | const unsigned t10 = (((int)(tB * 277U) >> 8) - tD) + tF; |
128 | | |
129 | 38.1M | blk[0 * step] = t4 + tC; |
130 | 38.1M | blk[1 * step] = t6 + tE; |
131 | 38.1M | blk[2 * step] = t7 + tF; |
132 | 38.1M | blk[3 * step] = t5 - t10; |
133 | 38.1M | blk[4 * step] = t5 + t10; |
134 | 38.1M | blk[5 * step] = t7 - tF; |
135 | 38.1M | blk[6 * step] = t6 - tE; |
136 | 38.1M | blk[7 * step] = t4 - tC; |
137 | 38.1M | } |
138 | | |
139 | | static void idct_put(uint8_t *dst, int stride, int *block) |
140 | 3.96M | { |
141 | 35.6M | for (int i = 0; i < 8; i++) { |
142 | 31.6M | if ((block[0x08 + i] | |
143 | 31.6M | block[0x10 + i] | |
144 | 31.6M | block[0x18 + i] | |
145 | 31.6M | block[0x20 + i] | |
146 | 31.6M | block[0x28 + i] | |
147 | 31.6M | block[0x30 + i] | |
148 | 31.6M | block[0x38 + i]) == 0) { |
149 | 31.4M | block[0x08 + i] = block[i]; |
150 | 31.4M | block[0x10 + i] = block[i]; |
151 | 31.4M | block[0x18 + i] = block[i]; |
152 | 31.4M | block[0x20 + i] = block[i]; |
153 | 31.4M | block[0x28 + i] = block[i]; |
154 | 31.4M | block[0x30 + i] = block[i]; |
155 | 31.4M | block[0x38 + i] = block[i]; |
156 | 31.4M | } else { |
157 | 263k | idct_1d(block + i, 8); |
158 | 263k | } |
159 | 31.6M | } |
160 | | |
161 | 35.6M | for (int i = 0; i < 8; i++) { |
162 | 31.6M | idct_1d(block, 1); |
163 | 285M | for (int j = 0; j < 8; j++) |
164 | 253M | dst[j] = av_clip_uint8((block[j] >> 5) + 128); |
165 | 31.6M | block += 8; |
166 | 31.6M | dst += stride; |
167 | 31.6M | } |
168 | 3.96M | } |
169 | | |
170 | | static void idct_add(uint8_t *dst, int stride, |
171 | | const uint8_t *src, int in_linesize, int *block) |
172 | 765k | { |
173 | 6.89M | for (int i = 0; i < 8; i++) { |
174 | 6.12M | if ((block[0x08 + i] | |
175 | 6.12M | block[0x10 + i] | |
176 | 6.12M | block[0x18 + i] | |
177 | 6.12M | block[0x20 + i] | |
178 | 6.12M | block[0x28 + i] | |
179 | 6.12M | block[0x30 + i] | |
180 | 6.12M | block[0x38 + i]) == 0) { |
181 | 6.08M | block[0x08 + i] = block[i]; |
182 | 6.08M | block[0x10 + i] = block[i]; |
183 | 6.08M | block[0x18 + i] = block[i]; |
184 | 6.08M | block[0x20 + i] = block[i]; |
185 | 6.08M | block[0x28 + i] = block[i]; |
186 | 6.08M | block[0x30 + i] = block[i]; |
187 | 6.08M | block[0x38 + i] = block[i]; |
188 | 6.08M | } else { |
189 | 40.4k | idct_1d(block + i, 8); |
190 | 40.4k | } |
191 | 6.12M | } |
192 | | |
193 | 6.89M | for (int i = 0; i < 8; i++) { |
194 | 6.12M | idct_1d(block, 1); |
195 | 55.1M | for (int j = 0; j < 8; j++) |
196 | 49.0M | dst[j] = av_clip_uint8((block[j] >> 5) + src[j]); |
197 | 6.12M | block += 8; |
198 | 6.12M | dst += stride; |
199 | 6.12M | src += in_linesize; |
200 | 6.12M | } |
201 | 765k | } |
202 | | |
203 | | static inline void idct2_1d(int *blk, int step) |
204 | 723k | { |
205 | 723k | const unsigned int t0 = blk[0 * step]; |
206 | 723k | const unsigned int t1 = blk[1 * step]; |
207 | 723k | const unsigned int t2 = (int)(t1 * 473U) >> 8; |
208 | 723k | const unsigned int t3 = t2 - t1; |
209 | 723k | const unsigned int t4 = ((int)(t1 * 362U) >> 8) - t3; |
210 | 723k | const unsigned int t5 = (((int)(t1 * 277U) >> 8) - t2) + t4; |
211 | | |
212 | 723k | blk[0 * step] = t1 + t0; |
213 | 723k | blk[1 * step] = t0 + t3; |
214 | 723k | blk[2 * step] = t4 + t0; |
215 | 723k | blk[3 * step] = t0 - t5; |
216 | 723k | blk[4 * step] = t5 + t0; |
217 | 723k | blk[5 * step] = t0 - t4; |
218 | 723k | blk[6 * step] = t0 - t3; |
219 | 723k | blk[7 * step] = t0 - t1; |
220 | 723k | } |
221 | | |
222 | | static void idct2_put(uint8_t *dst, int stride, int *block) |
223 | 1.76M | { |
224 | 5.28M | for (int i = 0; i < 2; i++) { |
225 | 3.52M | if ((block[0x08 + i]) == 0) { |
226 | 3.43M | block[0x08 + i] = block[i]; |
227 | 3.43M | block[0x10 + i] = block[i]; |
228 | 3.43M | block[0x18 + i] = block[i]; |
229 | 3.43M | block[0x20 + i] = block[i]; |
230 | 3.43M | block[0x28 + i] = block[i]; |
231 | 3.43M | block[0x30 + i] = block[i]; |
232 | 3.43M | block[0x38 + i] = block[i]; |
233 | 3.43M | } else { |
234 | 82.2k | idct2_1d(block + i, 8); |
235 | 82.2k | } |
236 | 3.52M | } |
237 | | |
238 | 15.8M | for (int i = 0; i < 8; i++) { |
239 | 14.0M | if (block[1] == 0) { |
240 | 123M | for (int j = 0; j < 8; j++) |
241 | 109M | dst[j] = av_clip_uint8((block[0] >> 5) + 128); |
242 | 13.7M | } else { |
243 | 384k | idct2_1d(block, 1); |
244 | 3.46M | for (int j = 0; j < 8; j++) |
245 | 3.07M | dst[j] = av_clip_uint8((block[j] >> 5) + 128); |
246 | 384k | } |
247 | 14.0M | block += 8; |
248 | 14.0M | dst += stride; |
249 | 14.0M | } |
250 | 1.76M | } |
251 | | |
252 | | static void idct2_add(uint8_t *dst, int stride, |
253 | | const uint8_t *src, int in_linesize, |
254 | | int *block) |
255 | 403k | { |
256 | 1.20M | for (int i = 0; i < 2; i++) { |
257 | 806k | if ((block[0x08 + i]) == 0) { |
258 | 760k | block[0x08 + i] = block[i]; |
259 | 760k | block[0x10 + i] = block[i]; |
260 | 760k | block[0x18 + i] = block[i]; |
261 | 760k | block[0x20 + i] = block[i]; |
262 | 760k | block[0x28 + i] = block[i]; |
263 | 760k | block[0x30 + i] = block[i]; |
264 | 760k | block[0x38 + i] = block[i]; |
265 | 760k | } else { |
266 | 45.4k | idct2_1d(block + i, 8); |
267 | 45.4k | } |
268 | 806k | } |
269 | | |
270 | 3.62M | for (int i = 0; i < 8; i++) { |
271 | 3.22M | if (block[1] == 0) { |
272 | 27.1M | for (int j = 0; j < 8; j++) |
273 | 24.1M | dst[j] = av_clip_uint8((block[0] >> 5) + src[j]); |
274 | 3.01M | } else { |
275 | 211k | idct2_1d(block, 1); |
276 | 1.90M | for (int j = 0; j < 8; j++) |
277 | 1.68M | dst[j] = av_clip_uint8((block[j] >> 5) + src[j]); |
278 | 211k | } |
279 | 3.22M | block += 8; |
280 | 3.22M | dst += stride; |
281 | 3.22M | src += in_linesize; |
282 | 3.22M | } |
283 | 403k | } |
284 | | |
285 | | static void update_inter_block(uint8_t *dst, int stride, |
286 | | const uint8_t *src, int in_linesize, |
287 | | int block) |
288 | 300k | { |
289 | 2.70M | for (int i = 0; i < 8; i++) { |
290 | 21.6M | for (int j = 0; j < 8; j++) |
291 | 19.2M | dst[j] = av_clip_uint8(block + src[j]); |
292 | 2.40M | dst += stride; |
293 | 2.40M | src += in_linesize; |
294 | 2.40M | } |
295 | 300k | } |
296 | | |
297 | | static int decode_intra_block(AVCodecContext *avctx, int mode, |
298 | | GetByteContext *gbyte, int16_t *qtab, |
299 | | int *block, int *pfill, |
300 | | uint8_t *dst, int linesize) |
301 | 572M | { |
302 | 572M | MV30Context *s = avctx->priv_data; |
303 | 572M | int fill; |
304 | | |
305 | 572M | switch (mode) { |
306 | 565M | case 0: |
307 | 565M | s->bdsp.fill_block_tab[1](dst, 128, linesize, 8); |
308 | 565M | break; |
309 | 1.57M | case 1: |
310 | 1.57M | fill = sign_extend(bytestream2_get_ne16(gbyte), 16); |
311 | 1.57M | pfill[0] += fill; |
312 | 1.57M | block[0] = ((int)((unsigned)pfill[0] * qtab[0]) >> 5) + 128; |
313 | 1.57M | s->bdsp.fill_block_tab[1](dst, block[0], linesize, 8); |
314 | 1.57M | break; |
315 | 1.76M | case 2: |
316 | 1.76M | memset(block, 0, sizeof(*block) * 64); |
317 | 1.76M | fill = sign_extend(bytestream2_get_ne16(gbyte), 16); |
318 | 1.76M | pfill[0] += fill; |
319 | 1.76M | block[0] = (unsigned)pfill[0] * qtab[0]; |
320 | 1.76M | block[1] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[1]; |
321 | 1.76M | block[8] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[8]; |
322 | 1.76M | block[9] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[9]; |
323 | 1.76M | idct2_put(dst, linesize, block); |
324 | 1.76M | break; |
325 | 3.96M | case 3: |
326 | 3.96M | fill = sign_extend(bytestream2_get_ne16(gbyte), 16); |
327 | 3.96M | pfill[0] += fill; |
328 | 3.96M | block[0] = (unsigned)pfill[0] * qtab[0]; |
329 | 253M | for (int i = 1; i < 64; i++) |
330 | 249M | block[zigzag[i]] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[zigzag[i]]; |
331 | 3.96M | idct_put(dst, linesize, block); |
332 | 3.96M | break; |
333 | 572M | } |
334 | | |
335 | 572M | return 0; |
336 | 572M | } |
337 | | |
338 | | static int decode_inter_block(AVCodecContext *avctx, int mode, |
339 | | GetByteContext *gbyte, int16_t *qtab, |
340 | | int *block, int *pfill, |
341 | | uint8_t *dst, int linesize, |
342 | | const uint8_t *src, int in_linesize) |
343 | 3.58M | { |
344 | 3.58M | int fill; |
345 | | |
346 | 3.58M | switch (mode) { |
347 | 2.11M | case 0: |
348 | 2.11M | copy_block8(dst, src, linesize, in_linesize, 8); |
349 | 2.11M | break; |
350 | 300k | case 1: |
351 | 300k | fill = sign_extend(bytestream2_get_ne16(gbyte), 16); |
352 | 300k | pfill[0] += fill; |
353 | 300k | block[0] = (int)((unsigned)pfill[0] * qtab[0]) >> 5; |
354 | 300k | update_inter_block(dst, linesize, src, in_linesize, block[0]); |
355 | 300k | break; |
356 | 403k | case 2: |
357 | 403k | memset(block, 0, sizeof(*block) * 64); |
358 | 403k | fill = sign_extend(bytestream2_get_ne16(gbyte), 16); |
359 | 403k | pfill[0] += fill; |
360 | 403k | block[0] = (unsigned)pfill[0] * qtab[0]; |
361 | 403k | block[1] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[1]; |
362 | 403k | block[8] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[8]; |
363 | 403k | block[9] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[9]; |
364 | 403k | idct2_add(dst, linesize, src, in_linesize, block); |
365 | 403k | break; |
366 | 765k | case 3: |
367 | 765k | fill = sign_extend(bytestream2_get_ne16(gbyte), 16); |
368 | 765k | pfill[0] += fill; |
369 | 765k | block[0] = (unsigned)pfill[0] * qtab[0]; |
370 | 49.0M | for (int i = 1; i < 64; i++) |
371 | 48.2M | block[zigzag[i]] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[zigzag[i]]; |
372 | 765k | idct_add(dst, linesize, src, in_linesize, block); |
373 | 765k | break; |
374 | 3.58M | } |
375 | | |
376 | 3.58M | return 0; |
377 | 3.58M | } |
378 | | |
379 | | static int decode_coeffs(GetBitContext *gb, int16_t *coeffs, int nb_codes) |
380 | 14.7M | { |
381 | 14.7M | memset(coeffs, 0, nb_codes * sizeof(*coeffs)); |
382 | | |
383 | 235M | for (int i = 0; i < nb_codes;) { |
384 | 220M | int value = get_vlc2(gb, cbp_tab, CBP_VLC_BITS, 1); |
385 | | |
386 | 220M | if (value > 0) { |
387 | 17.3M | int x = get_bits(gb, value); |
388 | | |
389 | 17.3M | if (x < (1 << value) / 2) { |
390 | 6.85M | x = (1 << (value - 1)) + (x & ((1 << value) - 1 >> 1)); |
391 | 10.4M | } else { |
392 | 10.4M | x = -(1 << (value - 1)) - (x & ((1 << value) - 1 >> 1)); |
393 | 10.4M | } |
394 | 17.3M | coeffs[i++] = x; |
395 | 203M | } else { |
396 | 203M | int flag = get_bits1(gb); |
397 | | |
398 | 203M | i += get_bits(gb, 3 + flag * 3) + 1 + flag * 8; |
399 | 203M | } |
400 | 220M | } |
401 | | |
402 | 14.7M | return 0; |
403 | 14.7M | } |
404 | | |
405 | | static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame) |
406 | 95.0k | { |
407 | 95.0k | MV30Context *s = avctx->priv_data; |
408 | 95.0k | GetBitContext mgb; |
409 | 95.0k | uint8_t *dst[6]; |
410 | 95.0k | int linesize[6]; |
411 | 95.0k | int ret; |
412 | | |
413 | 95.0k | mgb = *gb; |
414 | 95.0k | if (get_bits_left(gb) < s->mode_size * 8) |
415 | 8.36k | return AVERROR_INVALIDDATA; |
416 | | |
417 | 86.6k | skip_bits_long(gb, s->mode_size * 8); |
418 | | |
419 | 86.6k | linesize[0] = frame->linesize[0]; |
420 | 86.6k | linesize[1] = frame->linesize[0]; |
421 | 86.6k | linesize[2] = frame->linesize[0]; |
422 | 86.6k | linesize[3] = frame->linesize[0]; |
423 | 86.6k | linesize[4] = frame->linesize[1]; |
424 | 86.6k | linesize[5] = frame->linesize[2]; |
425 | | |
426 | 14.7M | for (int y = 0; y < avctx->height; y += 16) { |
427 | 14.6M | GetByteContext gbyte; |
428 | 14.6M | int pfill[3][1] = { {0} }; |
429 | 14.6M | int nb_codes = get_bits(gb, 16); |
430 | | |
431 | 14.6M | av_fast_padded_malloc(&s->coeffs, &s->coeffs_size, nb_codes * sizeof(*s->coeffs)); |
432 | 14.6M | if (!s->coeffs) |
433 | 0 | return AVERROR(ENOMEM); |
434 | 14.6M | ret = decode_coeffs(gb, s->coeffs, nb_codes); |
435 | 14.6M | if (ret < 0) |
436 | 0 | return ret; |
437 | | |
438 | 14.6M | bytestream2_init(&gbyte, (uint8_t *)s->coeffs, nb_codes * sizeof(*s->coeffs)); |
439 | | |
440 | 108M | for (int x = 0; x < avctx->width; x += 16) { |
441 | 94.1M | dst[0] = frame->data[0] + linesize[0] * y + x; |
442 | 94.1M | dst[1] = frame->data[0] + linesize[0] * y + x + 8; |
443 | 94.1M | dst[2] = frame->data[0] + linesize[0] * (y + 8) + x; |
444 | 94.1M | dst[3] = frame->data[0] + linesize[0] * (y + 8) + x + 8; |
445 | 94.1M | dst[4] = frame->data[1] + linesize[4] * (y >> 1) + (x >> 1); |
446 | 94.1M | dst[5] = frame->data[2] + linesize[5] * (y >> 1) + (x >> 1); |
447 | | |
448 | 658M | for (int b = 0; b < 6; b++) { |
449 | 564M | int mode = get_bits_le(&mgb, 2); |
450 | | |
451 | 564M | ret = decode_intra_block(avctx, mode, &gbyte, s->intraq_tab[b >= 4], |
452 | 564M | s->block[b], |
453 | 564M | pfill[(b >= 4) + (b >= 5)], |
454 | 564M | dst[b], linesize[b]); |
455 | 564M | if (ret < 0) |
456 | 0 | return ret; |
457 | 564M | } |
458 | 94.1M | } |
459 | 14.6M | } |
460 | | |
461 | 86.6k | return 0; |
462 | 86.6k | } |
463 | | |
464 | | static int decode_inter(AVCodecContext *avctx, GetBitContext *gb, |
465 | | AVFrame *frame, AVFrame *prev) |
466 | 4.39k | { |
467 | 4.39k | MV30Context *s = avctx->priv_data; |
468 | 4.39k | GetBitContext mask; |
469 | 4.39k | GetBitContext mgb; |
470 | 4.39k | GetByteContext mv; |
471 | 4.39k | const int mask_size = ((avctx->height >> 4) * (avctx->width >> 4) * 2 + 7) / 8; |
472 | 4.39k | uint8_t *dst[6], *src[6]; |
473 | 4.39k | int in_linesize[6]; |
474 | 4.39k | int linesize[6]; |
475 | 4.39k | int ret, cnt = 0; |
476 | 4.39k | int flags = 0; |
477 | | |
478 | 4.39k | in_linesize[0] = prev->linesize[0]; |
479 | 4.39k | in_linesize[1] = prev->linesize[0]; |
480 | 4.39k | in_linesize[2] = prev->linesize[0]; |
481 | 4.39k | in_linesize[3] = prev->linesize[0]; |
482 | 4.39k | in_linesize[4] = prev->linesize[1]; |
483 | 4.39k | in_linesize[5] = prev->linesize[2]; |
484 | | |
485 | 4.39k | linesize[0] = frame->linesize[0]; |
486 | 4.39k | linesize[1] = frame->linesize[0]; |
487 | 4.39k | linesize[2] = frame->linesize[0]; |
488 | 4.39k | linesize[3] = frame->linesize[0]; |
489 | 4.39k | linesize[4] = frame->linesize[1]; |
490 | 4.39k | linesize[5] = frame->linesize[2]; |
491 | | |
492 | 4.39k | av_fast_padded_malloc(&s->mvectors, &s->mvectors_size, 2 * s->nb_mvectors * sizeof(*s->mvectors)); |
493 | 4.39k | if (!s->mvectors) { |
494 | 0 | ret = AVERROR(ENOMEM); |
495 | 0 | goto fail; |
496 | 0 | } |
497 | | |
498 | 4.39k | mask = *gb; |
499 | 4.39k | skip_bits_long(gb, mask_size * 8); |
500 | 4.39k | mgb = *gb; |
501 | 4.39k | skip_bits_long(gb, s->mode_size * 8); |
502 | | |
503 | 4.39k | ret = decode_coeffs(gb, s->mvectors, 2 * s->nb_mvectors); |
504 | 4.39k | if (ret < 0) |
505 | 0 | goto fail; |
506 | | |
507 | 4.39k | bytestream2_init(&mv, (uint8_t *)s->mvectors, 2 * s->nb_mvectors * sizeof(*s->mvectors)); |
508 | | |
509 | 49.1k | for (int y = 0; y < avctx->height; y += 16) { |
510 | 48.6k | GetByteContext gbyte; |
511 | 48.6k | int pfill[3][1] = { {0} }; |
512 | 48.6k | int nb_codes = get_bits(gb, 16); |
513 | | |
514 | 48.6k | skip_bits(gb, 8); |
515 | 48.6k | if (get_bits_left(gb) < 0) { |
516 | 2.44k | ret = AVERROR_INVALIDDATA; |
517 | 2.44k | goto fail; |
518 | 2.44k | } |
519 | | |
520 | 46.2k | av_fast_padded_malloc(&s->coeffs, &s->coeffs_size, nb_codes * sizeof(*s->coeffs)); |
521 | 46.2k | if (!s->coeffs) { |
522 | 0 | ret = AVERROR(ENOMEM); |
523 | 0 | goto fail; |
524 | 0 | } |
525 | | |
526 | 46.2k | ret = decode_coeffs(gb, s->coeffs, nb_codes); |
527 | 46.2k | if (ret < 0) |
528 | 0 | goto fail; |
529 | | |
530 | 46.2k | bytestream2_init(&gbyte, (uint8_t *)s->coeffs, nb_codes * sizeof(*s->coeffs)); |
531 | | |
532 | 3.12M | for (int x = 0; x < avctx->width; x += 16) { |
533 | 3.07M | if (cnt >= 4) |
534 | 768k | cnt = 0; |
535 | 3.07M | if (cnt == 0) { |
536 | 771k | if (get_bits_left(&mask) < 8) { |
537 | 517 | ret = AVERROR_INVALIDDATA; |
538 | 517 | goto fail; |
539 | 517 | } |
540 | 770k | flags = get_bits(&mask, 8); |
541 | 770k | } |
542 | | |
543 | 3.07M | dst[0] = frame->data[0] + linesize[0] * y + x; |
544 | 3.07M | dst[1] = frame->data[0] + linesize[0] * y + x + 8; |
545 | 3.07M | dst[2] = frame->data[0] + linesize[0] * (y + 8) + x; |
546 | 3.07M | dst[3] = frame->data[0] + linesize[0] * (y + 8) + x + 8; |
547 | 3.07M | dst[4] = frame->data[1] + linesize[4] * (y >> 1) + (x >> 1); |
548 | 3.07M | dst[5] = frame->data[2] + linesize[5] * (y >> 1) + (x >> 1); |
549 | | |
550 | 3.07M | if ((flags >> (cnt)) & 1) { |
551 | 1.72M | int mv_x = sign_extend(bytestream2_get_ne16(&mv), 16); |
552 | 1.72M | int mv_y = sign_extend(bytestream2_get_ne16(&mv), 16); |
553 | | |
554 | 1.72M | int px = x + mv_x; |
555 | 1.72M | int py = y + mv_y; |
556 | | |
557 | 1.72M | if (px < 0 || px > FFALIGN(avctx->width , 16) - 16 || |
558 | 1.72M | py < 0 || py > FFALIGN(avctx->height, 16) - 16) |
559 | 903 | return AVERROR_INVALIDDATA; |
560 | | |
561 | 1.72M | src[0] = prev->data[0] + in_linesize[0] * py + px; |
562 | 1.72M | src[1] = prev->data[0] + in_linesize[0] * py + px + 8; |
563 | 1.72M | src[2] = prev->data[0] + in_linesize[0] * (py + 8) + px; |
564 | 1.72M | src[3] = prev->data[0] + in_linesize[0] * (py + 8) + px + 8; |
565 | 1.72M | src[4] = prev->data[1] + in_linesize[4] * (py >> 1) + (px >> 1); |
566 | 1.72M | src[5] = prev->data[2] + in_linesize[5] * (py >> 1) + (px >> 1); |
567 | | |
568 | 1.72M | if ((flags >> (cnt + 4)) & 1) { |
569 | 7.86M | for (int b = 0; b < 6; b++) |
570 | 6.73M | copy_block8(dst[b], src[b], linesize[b], in_linesize[b], 8); |
571 | 1.12M | } else { |
572 | 4.18M | for (int b = 0; b < 6; b++) { |
573 | 3.58M | int mode = get_bits_le(&mgb, 2); |
574 | | |
575 | 3.58M | ret = decode_inter_block(avctx, mode, &gbyte, s->interq_tab[b >= 4], |
576 | 3.58M | s->block[b], |
577 | 3.58M | pfill[(b >= 4) + (b >= 5)], |
578 | 3.58M | dst[b], linesize[b], |
579 | 3.58M | src[b], in_linesize[b]); |
580 | 3.58M | if (ret < 0) |
581 | 0 | goto fail; |
582 | 3.58M | } |
583 | 597k | } |
584 | 1.72M | } else { |
585 | 9.50M | for (int b = 0; b < 6; b++) { |
586 | 8.14M | int mode = get_bits_le(&mgb, 2); |
587 | | |
588 | 8.14M | ret = decode_intra_block(avctx, mode, &gbyte, s->intraq_tab[b >= 4], |
589 | 8.14M | s->block[b], |
590 | 8.14M | pfill[(b >= 4) + (b >= 5)], |
591 | 8.14M | dst[b], linesize[b]); |
592 | 8.14M | if (ret < 0) |
593 | 0 | goto fail; |
594 | 8.14M | } |
595 | 1.35M | } |
596 | | |
597 | 3.07M | cnt++; |
598 | 3.07M | } |
599 | 46.2k | } |
600 | | |
601 | 3.49k | fail: |
602 | 3.49k | return ret; |
603 | 4.39k | } |
604 | | |
605 | | static int decode_frame(AVCodecContext *avctx, AVFrame *frame, |
606 | | int *got_frame, AVPacket *avpkt) |
607 | 109k | { |
608 | 109k | MV30Context *s = avctx->priv_data; |
609 | 109k | GetBitContext *gb = &s->gb; |
610 | 109k | int ret; |
611 | | |
612 | 109k | if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0) |
613 | 0 | return ret; |
614 | | |
615 | 109k | if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0) |
616 | 6.02k | return ret; |
617 | | |
618 | 103k | s->intra_quant = get_bits(gb, 8); |
619 | 103k | s->inter_quant = s->intra_quant + get_sbits(gb, 8); |
620 | 103k | s->is_inter = get_bits_le(gb, 16); |
621 | 103k | s->mode_size = get_bits_le(gb, 16); |
622 | 103k | if (s->is_inter) |
623 | 8.58k | s->nb_mvectors = get_bits_le(gb, 16); |
624 | | |
625 | 103k | get_qtable(s->intraq_tab[0], s->intra_quant, luma_tab); |
626 | 103k | get_qtable(s->intraq_tab[1], s->intra_quant, chroma_tab); |
627 | | |
628 | 103k | if (s->is_inter == 0) { |
629 | 95.0k | frame->flags |= AV_FRAME_FLAG_KEY; |
630 | 95.0k | ret = decode_intra(avctx, gb, frame); |
631 | 95.0k | if (ret < 0) |
632 | 8.36k | return ret; |
633 | 95.0k | } else { |
634 | 8.58k | get_qtable(s->interq_tab[0], s->inter_quant, luma_tab); |
635 | 8.58k | get_qtable(s->interq_tab[1], s->inter_quant, chroma_tab); |
636 | | |
637 | 8.58k | if (!s->prev_frame->data[0]) { |
638 | 4.19k | av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n"); |
639 | 4.19k | return AVERROR_INVALIDDATA; |
640 | 4.19k | } |
641 | | |
642 | 4.39k | frame->flags &= ~AV_FRAME_FLAG_KEY; |
643 | 4.39k | ret = decode_inter(avctx, gb, frame, s->prev_frame); |
644 | 4.39k | if (ret < 0) |
645 | 3.86k | return ret; |
646 | 4.39k | } |
647 | | |
648 | 87.1k | if ((ret = av_frame_replace(s->prev_frame, frame)) < 0) |
649 | 0 | return ret; |
650 | | |
651 | 87.1k | *got_frame = 1; |
652 | | |
653 | 87.1k | return avpkt->size; |
654 | 87.1k | } |
655 | | |
656 | | static const uint8_t cbp_bits[] = { |
657 | | 2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 9, 9, |
658 | | }; |
659 | | |
660 | | static av_cold void init_static_data(void) |
661 | 1 | { |
662 | 1 | VLC_INIT_STATIC_TABLE_FROM_LENGTHS(cbp_tab, CBP_VLC_BITS, |
663 | 1 | FF_ARRAY_ELEMS(cbp_bits), |
664 | 1 | cbp_bits, 1, NULL, 0, 0, 0, 0); |
665 | 1 | } |
666 | | |
667 | | static av_cold int decode_init(AVCodecContext *avctx) |
668 | 1.15k | { |
669 | 1.15k | MV30Context *s = avctx->priv_data; |
670 | 1.15k | static AVOnce init_static_once = AV_ONCE_INIT; |
671 | | |
672 | 1.15k | avctx->pix_fmt = AV_PIX_FMT_YUV420P; |
673 | 1.15k | avctx->color_range = AVCOL_RANGE_JPEG; |
674 | | |
675 | 1.15k | ff_blockdsp_init(&s->bdsp); |
676 | | |
677 | 1.15k | s->prev_frame = av_frame_alloc(); |
678 | 1.15k | if (!s->prev_frame) |
679 | 0 | return AVERROR(ENOMEM); |
680 | | |
681 | 1.15k | ff_thread_once(&init_static_once, init_static_data); |
682 | | |
683 | 1.15k | return 0; |
684 | 1.15k | } |
685 | | |
686 | | static av_cold void decode_flush(AVCodecContext *avctx) |
687 | 70.5k | { |
688 | 70.5k | MV30Context *s = avctx->priv_data; |
689 | | |
690 | 70.5k | av_frame_unref(s->prev_frame); |
691 | 70.5k | } |
692 | | |
693 | | static av_cold int decode_close(AVCodecContext *avctx) |
694 | 1.15k | { |
695 | 1.15k | MV30Context *s = avctx->priv_data; |
696 | | |
697 | 1.15k | av_frame_free(&s->prev_frame); |
698 | 1.15k | av_freep(&s->coeffs); |
699 | 1.15k | s->coeffs_size = 0; |
700 | 1.15k | av_freep(&s->mvectors); |
701 | 1.15k | s->mvectors_size = 0; |
702 | | |
703 | 1.15k | return 0; |
704 | 1.15k | } |
705 | | |
706 | | const FFCodec ff_mv30_decoder = { |
707 | | .p.name = "mv30", |
708 | | CODEC_LONG_NAME("MidiVid 3.0"), |
709 | | .p.type = AVMEDIA_TYPE_VIDEO, |
710 | | .p.id = AV_CODEC_ID_MV30, |
711 | | .priv_data_size = sizeof(MV30Context), |
712 | | .init = decode_init, |
713 | | .close = decode_close, |
714 | | FF_CODEC_DECODE_CB(decode_frame), |
715 | | .flush = decode_flush, |
716 | | .p.capabilities = AV_CODEC_CAP_DR1, |
717 | | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, |
718 | | }; |