3 * Copyright (c) 2003 Michael Niedermayer
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "libavutil/frame.h"
30 #include "libavutil/imgutils.h"
31 #include "libavutil/intreadwrite.h"
34 #include "bitstream.h"
37 #include "bytestream.h"
40 #define BLOCK_TYPE_VLC_BITS 5
41 #define ACDC_VLC_BITS 9
43 #define CFRAME_BUFFER_COUNT 100
45 static const uint8_t block_type_tab[2][4][8][2] = {
47 { // { 8, 4, 2 } x { 8, 4, 2}
48 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
50 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
52 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
54 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
57 { // { 8, 4, 2 } x { 8, 4, 2}
58 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
60 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
62 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
64 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
69 static const uint8_t size2index[4][4] = {
76 static const int8_t mv[256][2] = {
77 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
78 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
79 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
80 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
81 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
82 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
83 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
84 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
85 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
86 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
87 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
88 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
89 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
90 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
91 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
92 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
93 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
94 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
95 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
96 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
97 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
98 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
99 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
100 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
101 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
102 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
103 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
104 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
105 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
106 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
107 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
108 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
111 /* This is simply the scaled down elementwise product of the standard JPEG
112 * quantizer table and the AAN premul table. */
113 static const uint8_t dequant_table[64] = {
114 16, 15, 13, 19, 24, 31, 28, 17,
115 17, 23, 25, 31, 36, 63, 45, 21,
116 18, 24, 27, 37, 52, 59, 49, 20,
117 16, 28, 34, 40, 60, 80, 51, 20,
118 18, 31, 48, 66, 68, 86, 56, 21,
119 19, 38, 56, 59, 64, 64, 48, 20,
120 27, 48, 55, 55, 56, 51, 35, 15,
121 20, 35, 34, 32, 31, 22, 15, 8,
124 static VLC block_type_vlc[2][4];
127 typedef struct CFrameBuffer {
128 unsigned int allocated_size;
134 typedef struct FourXContext {
135 AVCodecContext *avctx;
136 BlockDSPContext bdsp;
137 BswapDSPContext bbdsp;
138 uint16_t *frame_buffer;
139 uint16_t *last_frame_buffer;
140 BitstreamContext pre_bc; // ac/dc prefix
147 DECLARE_ALIGNED(16, int16_t, block)[6][64];
148 void *bitstream_buffer;
149 unsigned int bitstream_buffer_size;
151 CFrameBuffer cfrm[CFRAME_BUFFER_COUNT];
155 #define FIX_1_082392200 70936
156 #define FIX_1_414213562 92682
157 #define FIX_1_847759065 121095
158 #define FIX_2_613125930 171254
160 #define MULTIPLY(var, const) (((var) * (const)) >> 16)
162 static void idct(int16_t block[64])
164 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
165 int tmp10, tmp11, tmp12, tmp13;
166 int z5, z10, z11, z12, z13;
170 for (i = 0; i < 8; i++) {
171 tmp10 = block[8 * 0 + i] + block[8 * 4 + i];
172 tmp11 = block[8 * 0 + i] - block[8 * 4 + i];
174 tmp13 = block[8 * 2 + i] + block[8 * 6 + i];
175 tmp12 = MULTIPLY(block[8 * 2 + i] - block[8 * 6 + i], FIX_1_414213562) - tmp13;
177 tmp0 = tmp10 + tmp13;
178 tmp3 = tmp10 - tmp13;
179 tmp1 = tmp11 + tmp12;
180 tmp2 = tmp11 - tmp12;
182 z13 = block[8 * 5 + i] + block[8 * 3 + i];
183 z10 = block[8 * 5 + i] - block[8 * 3 + i];
184 z11 = block[8 * 1 + i] + block[8 * 7 + i];
185 z12 = block[8 * 1 + i] - block[8 * 7 + i];
188 tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
190 z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
191 tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
192 tmp12 = MULTIPLY(z10, -FIX_2_613125930) + z5;
198 temp[8 * 0 + i] = tmp0 + tmp7;
199 temp[8 * 7 + i] = tmp0 - tmp7;
200 temp[8 * 1 + i] = tmp1 + tmp6;
201 temp[8 * 6 + i] = tmp1 - tmp6;
202 temp[8 * 2 + i] = tmp2 + tmp5;
203 temp[8 * 5 + i] = tmp2 - tmp5;
204 temp[8 * 4 + i] = tmp3 + tmp4;
205 temp[8 * 3 + i] = tmp3 - tmp4;
208 for (i = 0; i < 8 * 8; i += 8) {
209 tmp10 = temp[0 + i] + temp[4 + i];
210 tmp11 = temp[0 + i] - temp[4 + i];
212 tmp13 = temp[2 + i] + temp[6 + i];
213 tmp12 = MULTIPLY(temp[2 + i] - temp[6 + i], FIX_1_414213562) - tmp13;
215 tmp0 = tmp10 + tmp13;
216 tmp3 = tmp10 - tmp13;
217 tmp1 = tmp11 + tmp12;
218 tmp2 = tmp11 - tmp12;
220 z13 = temp[5 + i] + temp[3 + i];
221 z10 = temp[5 + i] - temp[3 + i];
222 z11 = temp[1 + i] + temp[7 + i];
223 z12 = temp[1 + i] - temp[7 + i];
226 tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
228 z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
229 tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
230 tmp12 = MULTIPLY(z10, -FIX_2_613125930) + z5;
236 block[0 + i] = (tmp0 + tmp7) >> 6;
237 block[7 + i] = (tmp0 - tmp7) >> 6;
238 block[1 + i] = (tmp1 + tmp6) >> 6;
239 block[6 + i] = (tmp1 - tmp6) >> 6;
240 block[2 + i] = (tmp2 + tmp5) >> 6;
241 block[5 + i] = (tmp2 - tmp5) >> 6;
242 block[4 + i] = (tmp3 + tmp4) >> 6;
243 block[3 + i] = (tmp3 - tmp4) >> 6;
247 static av_cold void init_vlcs(FourXContext *f)
249 static VLC_TYPE table[2][4][32][2];
252 for (i = 0; i < 2; i++) {
253 for (j = 0; j < 4; j++) {
254 block_type_vlc[i][j].table = table[i][j];
255 block_type_vlc[i][j].table_allocated = 32;
256 init_vlc(&block_type_vlc[i][j], BLOCK_TYPE_VLC_BITS, 7,
257 &block_type_tab[i][j][0][1], 2, 1,
258 &block_type_tab[i][j][0][0], 2, 1,
259 INIT_VLC_USE_NEW_STATIC);
264 static void init_mv(FourXContext *f, int linesize)
268 for (i = 0; i < 256; i++) {
270 f->mv[i] = mv[i][0] + mv[i][1] * linesize / 2;
272 f->mv[i] = (i & 15) - 8 + ((i >> 4) - 8) * linesize / 2;
277 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
279 unsigned tmpval = AV_RN32(src); \
280 tmpval = (tmpval << 16) | (tmpval >> 16); \
281 tmpval = tmpval * (scale) + (dc); \
282 tmpval = (tmpval << 16) | (tmpval >> 16); \
283 AV_WN32A(dst, tmpval); \
286 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
288 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
289 AV_WN32A(dst, tmpval); \
293 static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w,
294 int h, int stride, int scale, unsigned dc)
301 for (i = 0; i < h; i++) {
302 dst[0] = scale * src[0] + dc;
309 for (i = 0; i < h; i++) {
310 LE_CENTRIC_MUL(dst, src, scale, dc);
317 for (i = 0; i < h; i++) {
318 LE_CENTRIC_MUL(dst, src, scale, dc);
319 LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc);
326 for (i = 0; i < h; i++) {
327 LE_CENTRIC_MUL(dst, src, scale, dc);
328 LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc);
329 LE_CENTRIC_MUL(dst + 4, src + 4, scale, dc);
330 LE_CENTRIC_MUL(dst + 6, src + 6, scale, dc);
341 static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src,
342 int log2w, int log2h, int stride)
344 int index, h, code, ret, scale = 1;
345 uint16_t *start, *end;
348 if (log2h < 0 || log2w < 0)
349 return AVERROR_INVALIDDATA;
351 index = size2index[log2h][log2w];
353 return AVERROR_INVALIDDATA;
356 code = bitstream_read_vlc(&f->bc, block_type_vlc[1 - (f->version > 1)][index].table,
357 BLOCK_TYPE_VLC_BITS, 1);
358 if (code < 0 || code > 6)
359 return AVERROR_INVALIDDATA;
361 start = f->last_frame_buffer;
362 end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
366 return AVERROR_INVALIDDATA;
367 if ((ret = decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
369 return decode_p_block(f, dst + (stride << log2h),
370 src + (stride << log2h),
371 log2w, log2h, stride);
372 } else if (code == 2) {
374 if ((ret = decode_p_block(f, dst , src, log2w, log2h, stride)) < 0)
376 return decode_p_block(f, dst + (1 << log2w),
378 log2w, log2h, stride);
379 } else if (code == 6) {
381 dst[0] = bytestream2_get_le16(&f->g2);
382 dst[1] = bytestream2_get_le16(&f->g2);
384 dst[0] = bytestream2_get_le16(&f->g2);
385 dst[stride] = bytestream2_get_le16(&f->g2);
391 src += f->mv[bytestream2_get_byte(&f->g)];
392 } else if (code == 3 && f->version >= 2) {
394 } else if (code == 4) {
395 src += f->mv[bytestream2_get_byte(&f->g)];
396 dc = bytestream2_get_le16(&f->g2);
397 } else if (code == 5) {
399 dc = bytestream2_get_le16(&f->g2);
402 if (start > src || src > end) {
403 av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
404 return AVERROR_INVALIDDATA;
407 mcdc(dst, src, log2w, h, stride, scale, dc);
412 static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length)
415 const int width = f->avctx->width;
416 const int height = f->avctx->height;
417 uint16_t *dst = f->frame_buffer;
419 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
420 bytestream_offset, wordstream_offset;
423 src = f->last_frame_buffer;
425 if (f->version > 1) {
427 return AVERROR_INVALIDDATA;
429 bitstream_size = AV_RL32(buf + 8);
430 wordstream_size = AV_RL32(buf + 12);
431 bytestream_size = AV_RL32(buf + 16);
434 bitstream_size = AV_RL16(buf - 4);
435 wordstream_size = AV_RL16(buf - 2);
436 bytestream_size = FFMAX(length - bitstream_size - wordstream_size, 0);
439 if (bitstream_size + bytestream_size + wordstream_size + extra != length
440 || bitstream_size > (1 << 26)
441 || bytestream_size > (1 << 26)
442 || wordstream_size > (1 << 26)) {
443 av_log(f->avctx, AV_LOG_ERROR, "lengths %d %d %d %d\n",
444 bitstream_size, bytestream_size, wordstream_size,
445 bitstream_size + bytestream_size + wordstream_size - length);
446 return AVERROR_INVALIDDATA;
449 av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
450 bitstream_size + AV_INPUT_BUFFER_PADDING_SIZE);
451 if (!f->bitstream_buffer)
452 return AVERROR(ENOMEM);
453 f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) (buf + extra),
455 memset((uint8_t*)f->bitstream_buffer + bitstream_size,
456 0, AV_INPUT_BUFFER_PADDING_SIZE);
457 bitstream_init(&f->bc, f->bitstream_buffer, 8 * bitstream_size);
459 wordstream_offset = extra + bitstream_size;
460 bytestream_offset = extra + bitstream_size + wordstream_size;
461 bytestream2_init(&f->g2, buf + wordstream_offset,
462 length - wordstream_offset);
463 bytestream2_init(&f->g, buf + bytestream_offset,
464 length - bytestream_offset);
466 init_mv(f, width * 2);
468 for (y = 0; y < height; y += 8) {
469 for (x = 0; x < width; x += 8)
470 if ((ret = decode_p_block(f, dst + x, src + x, 3, 3, width)) < 0)
480 * decode block and dequantize.
481 * Note this is almost identical to MJPEG.
483 static int decode_i_block(FourXContext *f, int16_t *block)
485 int code, i, j, level, val;
488 val = bitstream_read_vlc(&f->pre_bc, f->pre_vlc.table, ACDC_VLC_BITS, 3);
490 av_log(f->avctx, AV_LOG_ERROR, "error dc run != 0\n");
493 val = bitstream_read_xbits(&f->bc, val);
495 val = val * dequant_table[0] + f->last_dc;
496 f->last_dc = block[0] = val;
500 code = bitstream_read_vlc(&f->pre_bc, f->pre_vlc.table, ACDC_VLC_BITS, 3);
508 level = bitstream_read_xbits(&f->bc, code & 0xf);
511 av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
515 j = ff_zigzag_direct[i];
516 block[j] = level * dequant_table[j];
526 static inline void idct_put(FourXContext *f, int x, int y)
528 int16_t (*block)[64] = f->block;
529 int stride = f->avctx->width;
531 uint16_t *dst = f->frame_buffer + y * stride + x;
533 for (i = 0; i < 4; i++) {
534 block[i][0] += 0x80 * 8 * 8;
538 if (!(f->avctx->flags & AV_CODEC_FLAG_GRAY)) {
539 for (i = 4; i < 6; i++)
543 /* Note transform is:
544 * y = ( 1b + 4g + 2r) / 14
545 * cb = ( 3b - 2g - 1r) / 14
546 * cr = (-1b - 4g + 5r) / 14 */
547 for (y = 0; y < 8; y++) {
548 for (x = 0; x < 8; x++) {
549 int16_t *temp = block[(x >> 2) + 2 * (y >> 2)] +
550 2 * (x & 3) + 2 * 8 * (y & 3); // FIXME optimize
551 int cb = block[4][x + 8 * y];
552 int cr = block[5][x + 8 * y];
553 int cg = (cb + cr) >> 1;
559 dst[0] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
561 dst[1] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
563 dst[stride] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
565 dst[1 + stride] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
568 dst += 2 * stride - 2 * 8;
572 static int decode_i_mb(FourXContext *f)
577 f->bdsp.clear_blocks(f->block[0]);
579 for (i = 0; i < 6; i++)
580 if ((ret = decode_i_block(f, f->block[i])) < 0)
586 static const uint8_t *read_huffman_tables(FourXContext *f,
587 const uint8_t * const buf,
590 int frequency[512] = { 0 };
593 uint8_t len_tab[257];
596 const uint8_t *ptr = buf;
599 memset(up, -1, sizeof(up));
606 len -= end - start + 1;
608 if (end < start || len < 0)
611 for (i = start; i <= end; i++)
612 frequency[i] = *ptr++;
624 while ((ptr - buf) & 3)
625 ptr++; // 4byte align
627 for (j = 257; j < 512; j++) {
628 int min_freq[2] = { 256 * 256, 256 * 256 };
629 int smallest[2] = { 0, 0 };
631 for (i = 0; i < j; i++) {
632 if (frequency[i] == 0)
634 if (frequency[i] < min_freq[1]) {
635 if (frequency[i] < min_freq[0]) {
636 min_freq[1] = min_freq[0];
637 smallest[1] = smallest[0];
638 min_freq[0] = frequency[i];
641 min_freq[1] = frequency[i];
646 if (min_freq[1] == 256 * 256)
649 frequency[j] = min_freq[0] + min_freq[1];
650 flag[smallest[0]] = 0;
651 flag[smallest[1]] = 1;
654 frequency[smallest[0]] = frequency[smallest[1]] = 0;
657 for (j = 0; j < 257; j++) {
658 int node, len = 0, bits = 0;
660 for (node = j; up[node] != -1; node = up[node]) {
661 bits += flag[node] << len;
664 // can this happen at all ?
665 av_log(f->avctx, AV_LOG_ERROR,
666 "vlc length overflow\n");
673 if (init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257, len_tab, 1, 1,
680 static int mix(int c0, int c1)
682 int blue = 2 * (c0 & 0x001F) + (c1 & 0x001F);
683 int green = (2 * (c0 & 0x03E0) + (c1 & 0x03E0)) >> 5;
684 int red = 2 * (c0 >> 10) + (c1 >> 10);
685 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
688 static int decode_i2_frame(FourXContext *f, const uint8_t *buf, int length)
691 const int width = f->avctx->width;
692 const int height = f->avctx->height;
693 const int mbs = (FFALIGN(width, 16) >> 4) * (FFALIGN(height, 16) >> 4);
694 uint16_t *dst = f->frame_buffer;
697 if (length < mbs * 8) {
698 av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
699 return AVERROR_INVALIDDATA;
701 bytestream2_init(&g3, buf, length);
703 for (y = 0; y < height; y += 16) {
704 for (x = 0; x < width; x += 16) {
705 unsigned int color[4] = { 0 }, bits;
706 // warning following is purely guessed ...
707 color[0] = bytestream2_get_le16u(&g3);
708 color[1] = bytestream2_get_le16u(&g3);
710 if (color[0] & 0x8000)
711 av_log(f->avctx, AV_LOG_ERROR, "unk bit 1\n");
712 if (color[1] & 0x8000)
713 av_log(f->avctx, AV_LOG_ERROR, "unk bit 2\n");
715 color[2] = mix(color[0], color[1]);
716 color[3] = mix(color[1], color[0]);
718 bits = bytestream2_get_le32u(&g3);
719 for (y2 = 0; y2 < 16; y2++) {
720 for (x2 = 0; x2 < 16; x2++) {
721 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
722 dst[y2 * width + x2] = color[(bits >> index) & 3];
727 dst += 16 * width - x;
733 static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length)
736 const int width = f->avctx->width;
737 const int height = f->avctx->height;
738 const unsigned int bitstream_size = AV_RL32(buf);
739 int token_count av_unused;
740 unsigned int prestream_size;
741 const uint8_t *prestream;
743 if (bitstream_size > (1 << 26))
744 return AVERROR_INVALIDDATA;
746 if (length < bitstream_size + 12) {
747 av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
748 return AVERROR_INVALIDDATA;
751 token_count = AV_RL32(buf + bitstream_size + 8);
752 prestream_size = 4 * AV_RL32(buf + bitstream_size + 4);
753 prestream = buf + bitstream_size + 12;
755 if (prestream_size + bitstream_size + 12 != length
756 || prestream_size > (1 << 26)) {
757 av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d %d\n",
758 prestream_size, bitstream_size, length);
759 return AVERROR_INVALIDDATA;
762 prestream = read_huffman_tables(f, prestream, prestream_size);
764 av_log(f->avctx, AV_LOG_ERROR, "Error reading Huffman tables.\n");
765 return AVERROR_INVALIDDATA;
768 bitstream_init(&f->bc, buf + 4, 8 * bitstream_size);
770 prestream_size = length + buf - prestream;
772 av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
773 prestream_size + AV_INPUT_BUFFER_PADDING_SIZE);
774 if (!f->bitstream_buffer)
775 return AVERROR(ENOMEM);
776 f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) prestream,
778 memset((uint8_t*)f->bitstream_buffer + prestream_size,
779 0, AV_INPUT_BUFFER_PADDING_SIZE);
780 bitstream_init(&f->pre_bc, f->bitstream_buffer, 8 * prestream_size);
782 f->last_dc = 0 * 128 * 8 * 8;
784 for (y = 0; y < height; y += 16) {
785 for (x = 0; x < width; x += 16) {
786 if ((ret = decode_i_mb(f)) < 0)
793 if (bitstream_read_vlc(&f->pre_bc, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
794 av_log(f->avctx, AV_LOG_ERROR, "end mismatch\n");
799 static int decode_frame(AVCodecContext *avctx, void *data,
800 int *got_frame, AVPacket *avpkt)
802 const uint8_t *buf = avpkt->data;
803 int buf_size = avpkt->size;
804 FourXContext *const f = avctx->priv_data;
805 AVFrame *picture = data;
806 int i, frame_4cc, frame_size, ret;
809 return AVERROR_INVALIDDATA;
811 if (avctx->width % 16 || avctx->height % 16) {
812 av_log(avctx, AV_LOG_ERROR,
813 "Dimensions non-multiple of 16 are invalid.\n");
814 return AVERROR_INVALIDDATA;
817 if (buf_size < AV_RL32(buf + 4) + 8) {
818 av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %"PRIu32"\n",
819 buf_size, AV_RL32(buf + 4));
820 return AVERROR_INVALIDDATA;
823 frame_4cc = AV_RL32(buf);
825 if (frame_4cc == AV_RL32("cfrm")) {
828 const int data_size = buf_size - 20;
831 id = AV_RL32(buf + 12);
832 whole_size = AV_RL32(buf + 16);
834 for (i = 0; i < CFRAME_BUFFER_COUNT; i++)
835 if (f->cfrm[i].id && f->cfrm[i].id < avctx->frame_number)
836 av_log(f->avctx, AV_LOG_ERROR, "lost c frame %d\n",
839 for (i = 0; i < CFRAME_BUFFER_COUNT; i++) {
840 if (f->cfrm[i].id == id)
842 if (f->cfrm[i].size == 0)
846 if (i >= CFRAME_BUFFER_COUNT) {
852 cfrm->data = av_fast_realloc(cfrm->data, &cfrm->allocated_size,
853 cfrm->size + data_size + AV_INPUT_BUFFER_PADDING_SIZE);
854 // explicit check needed as memcpy below might not catch a NULL
856 av_log(f->avctx, AV_LOG_ERROR, "realloc failure");
857 return AVERROR(ENOMEM);
860 memcpy(cfrm->data + cfrm->size, buf + 20, data_size);
861 cfrm->size += data_size;
863 if (cfrm->size >= whole_size) {
865 frame_size = cfrm->size;
867 if (id != avctx->frame_number)
868 av_log(f->avctx, AV_LOG_ERROR, "cframe id mismatch %d %d\n",
869 id, avctx->frame_number);
872 return AVERROR_INVALIDDATA;
874 cfrm->size = cfrm->id = 0;
875 frame_4cc = AV_RL32("pfrm");
880 frame_size = buf_size - 12;
884 if ((ret = ff_get_buffer(avctx, picture, 0)) < 0) {
885 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
889 if (frame_4cc == AV_RL32("ifr2")) {
890 picture->pict_type = AV_PICTURE_TYPE_I;
891 if ((ret = decode_i2_frame(f, buf - 4, frame_size + 4)) < 0)
893 } else if (frame_4cc == AV_RL32("ifrm")) {
894 picture->pict_type = AV_PICTURE_TYPE_I;
895 if ((ret = decode_i_frame(f, buf, frame_size)) < 0)
897 } else if (frame_4cc == AV_RL32("pfrm") || frame_4cc == AV_RL32("pfr2")) {
898 picture->pict_type = AV_PICTURE_TYPE_P;
899 if ((ret = decode_p_frame(f, buf, frame_size)) < 0)
901 } else if (frame_4cc == AV_RL32("snd_")) {
902 av_log(avctx, AV_LOG_ERROR, "ignoring snd_ chunk length:%d\n",
905 av_log(avctx, AV_LOG_ERROR, "ignoring unknown chunk length:%d\n",
909 picture->key_frame = picture->pict_type == AV_PICTURE_TYPE_I;
911 av_image_copy_plane(picture->data[0], picture->linesize[0],
912 (const uint8_t*)f->frame_buffer, avctx->width * 2,
913 avctx->width * 2, avctx->height);
914 FFSWAP(uint16_t *, f->frame_buffer, f->last_frame_buffer);
923 static av_cold int decode_end(AVCodecContext *avctx)
925 FourXContext * const f = avctx->priv_data;
928 av_freep(&f->frame_buffer);
929 av_freep(&f->last_frame_buffer);
930 av_freep(&f->bitstream_buffer);
931 f->bitstream_buffer_size = 0;
932 for (i = 0; i < CFRAME_BUFFER_COUNT; i++) {
933 av_freep(&f->cfrm[i].data);
934 f->cfrm[i].allocated_size = 0;
936 ff_free_vlc(&f->pre_vlc);
941 static av_cold int decode_init(AVCodecContext *avctx)
943 FourXContext * const f = avctx->priv_data;
946 if (avctx->extradata_size != 4 || !avctx->extradata) {
947 av_log(avctx, AV_LOG_ERROR, "extradata wrong or missing\n");
948 return AVERROR_INVALIDDATA;
951 ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
955 f->frame_buffer = av_mallocz(avctx->width * avctx->height * 2);
956 f->last_frame_buffer = av_mallocz(avctx->width * avctx->height * 2);
957 if (!f->frame_buffer || !f->last_frame_buffer) {
959 return AVERROR(ENOMEM);
962 f->version = AV_RL32(avctx->extradata) >> 16;
963 ff_blockdsp_init(&f->bdsp, avctx);
964 ff_bswapdsp_init(&f->bbdsp);
969 avctx->pix_fmt = AV_PIX_FMT_RGB565;
971 avctx->pix_fmt = AV_PIX_FMT_BGR555;
976 AVCodec ff_fourxm_decoder = {
978 .long_name = NULL_IF_CONFIG_SMALL("4X Movie"),
979 .type = AVMEDIA_TYPE_VIDEO,
980 .id = AV_CODEC_ID_4XM,
981 .priv_data_size = sizeof(FourXContext),
984 .decode = decode_frame,
985 .capabilities = AV_CODEC_CAP_DR1,