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
27 #include "libavutil/frame.h"
28 #include "libavutil/intreadwrite.h"
30 #include "bytestream.h"
35 #define BLOCK_TYPE_VLC_BITS 5
36 #define ACDC_VLC_BITS 9
38 #define CFRAME_BUFFER_COUNT 100
40 static const uint8_t block_type_tab[2][4][8][2] = {
42 { // { 8, 4, 2 } x { 8, 4, 2}
43 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
45 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
47 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
49 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
52 { // { 8, 4, 2 } x { 8, 4, 2}
53 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
55 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
57 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
59 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
64 static const uint8_t size2index[4][4] = {
71 static const int8_t mv[256][2] = {
72 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
73 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
74 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
75 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
76 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
77 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
78 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
79 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
80 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
81 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
82 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
83 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
84 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
85 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
86 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
87 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
88 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
89 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
90 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
91 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
92 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
93 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
94 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
95 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
96 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
97 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
98 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
99 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
100 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
101 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
102 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
103 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
106 /* This is simply the scaled down elementwise product of the standard JPEG
107 * quantizer table and the AAN premul table. */
108 static const uint8_t dequant_table[64] = {
109 16, 15, 13, 19, 24, 31, 28, 17,
110 17, 23, 25, 31, 36, 63, 45, 21,
111 18, 24, 27, 37, 52, 59, 49, 20,
112 16, 28, 34, 40, 60, 80, 51, 20,
113 18, 31, 48, 66, 68, 86, 56, 21,
114 19, 38, 56, 59, 64, 64, 48, 20,
115 27, 48, 55, 55, 56, 51, 35, 15,
116 20, 35, 34, 32, 31, 22, 15, 8,
119 static VLC block_type_vlc[2][4];
122 typedef struct CFrameBuffer {
123 unsigned int allocated_size;
129 typedef struct FourXContext {
130 AVCodecContext *avctx;
132 AVFrame *last_picture;
133 GetBitContext pre_gb; ///< ac/dc prefix
140 DECLARE_ALIGNED(16, int16_t, block)[6][64];
141 void *bitstream_buffer;
142 unsigned int bitstream_buffer_size;
144 CFrameBuffer cfrm[CFRAME_BUFFER_COUNT];
148 #define FIX_1_082392200 70936
149 #define FIX_1_414213562 92682
150 #define FIX_1_847759065 121095
151 #define FIX_2_613125930 171254
153 #define MULTIPLY(var, const) (((var) * (const)) >> 16)
155 static void idct(int16_t block[64])
157 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
158 int tmp10, tmp11, tmp12, tmp13;
159 int z5, z10, z11, z12, z13;
163 for (i = 0; i < 8; i++) {
164 tmp10 = block[8 * 0 + i] + block[8 * 4 + i];
165 tmp11 = block[8 * 0 + i] - block[8 * 4 + i];
167 tmp13 = block[8 * 2 + i] + block[8 * 6 + i];
168 tmp12 = MULTIPLY(block[8 * 2 + i] - block[8 * 6 + i], FIX_1_414213562) - tmp13;
170 tmp0 = tmp10 + tmp13;
171 tmp3 = tmp10 - tmp13;
172 tmp1 = tmp11 + tmp12;
173 tmp2 = tmp11 - tmp12;
175 z13 = block[8 * 5 + i] + block[8 * 3 + i];
176 z10 = block[8 * 5 + i] - block[8 * 3 + i];
177 z11 = block[8 * 1 + i] + block[8 * 7 + i];
178 z12 = block[8 * 1 + i] - block[8 * 7 + i];
181 tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
183 z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
184 tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
185 tmp12 = MULTIPLY(z10, -FIX_2_613125930) + z5;
191 temp[8 * 0 + i] = tmp0 + tmp7;
192 temp[8 * 7 + i] = tmp0 - tmp7;
193 temp[8 * 1 + i] = tmp1 + tmp6;
194 temp[8 * 6 + i] = tmp1 - tmp6;
195 temp[8 * 2 + i] = tmp2 + tmp5;
196 temp[8 * 5 + i] = tmp2 - tmp5;
197 temp[8 * 4 + i] = tmp3 + tmp4;
198 temp[8 * 3 + i] = tmp3 - tmp4;
201 for (i = 0; i < 8 * 8; i += 8) {
202 tmp10 = temp[0 + i] + temp[4 + i];
203 tmp11 = temp[0 + i] - temp[4 + i];
205 tmp13 = temp[2 + i] + temp[6 + i];
206 tmp12 = MULTIPLY(temp[2 + i] - temp[6 + i], FIX_1_414213562) - tmp13;
208 tmp0 = tmp10 + tmp13;
209 tmp3 = tmp10 - tmp13;
210 tmp1 = tmp11 + tmp12;
211 tmp2 = tmp11 - tmp12;
213 z13 = temp[5 + i] + temp[3 + i];
214 z10 = temp[5 + i] - temp[3 + i];
215 z11 = temp[1 + i] + temp[7 + i];
216 z12 = temp[1 + i] - temp[7 + i];
219 tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
221 z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
222 tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
223 tmp12 = MULTIPLY(z10, -FIX_2_613125930) + z5;
229 block[0 + i] = (tmp0 + tmp7) >> 6;
230 block[7 + i] = (tmp0 - tmp7) >> 6;
231 block[1 + i] = (tmp1 + tmp6) >> 6;
232 block[6 + i] = (tmp1 - tmp6) >> 6;
233 block[2 + i] = (tmp2 + tmp5) >> 6;
234 block[5 + i] = (tmp2 - tmp5) >> 6;
235 block[4 + i] = (tmp3 + tmp4) >> 6;
236 block[3 + i] = (tmp3 - tmp4) >> 6;
240 static av_cold void init_vlcs(FourXContext *f)
242 static VLC_TYPE table[2][4][32][2];
245 for (i = 0; i < 2; i++) {
246 for (j = 0; j < 4; j++) {
247 block_type_vlc[i][j].table = table[i][j];
248 block_type_vlc[i][j].table_allocated = 32;
249 init_vlc(&block_type_vlc[i][j], BLOCK_TYPE_VLC_BITS, 7,
250 &block_type_tab[i][j][0][1], 2, 1,
251 &block_type_tab[i][j][0][0], 2, 1,
252 INIT_VLC_USE_NEW_STATIC);
257 static void init_mv(FourXContext *f, int linesize)
261 for (i = 0; i < 256; i++) {
263 f->mv[i] = mv[i][0] + mv[i][1] * linesize / 2;
265 f->mv[i] = (i & 15) - 8 + ((i >> 4) - 8) * linesize / 2;
270 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
272 unsigned tmpval = AV_RN32(src); \
273 tmpval = (tmpval << 16) | (tmpval >> 16); \
274 tmpval = tmpval * (scale) + (dc); \
275 tmpval = (tmpval << 16) | (tmpval >> 16); \
276 AV_WN32A(dst, tmpval); \
279 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
281 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
282 AV_WN32A(dst, tmpval); \
286 static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w,
287 int h, int stride, int scale, unsigned dc)
294 for (i = 0; i < h; i++) {
295 dst[0] = scale * src[0] + dc;
302 for (i = 0; i < h; i++) {
303 LE_CENTRIC_MUL(dst, src, scale, dc);
310 for (i = 0; i < h; i++) {
311 LE_CENTRIC_MUL(dst, src, scale, dc);
312 LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc);
319 for (i = 0; i < h; i++) {
320 LE_CENTRIC_MUL(dst, src, scale, dc);
321 LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc);
322 LE_CENTRIC_MUL(dst + 4, src + 4, scale, dc);
323 LE_CENTRIC_MUL(dst + 6, src + 6, scale, dc);
334 static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src,
335 int log2w, int log2h, int stride)
337 const int index = size2index[log2h][log2w];
338 const int h = 1 << log2h;
339 int code = get_vlc2(&f->gb,
340 block_type_vlc[1 - (f->version > 1)][index].table,
341 BLOCK_TYPE_VLC_BITS, 1);
342 uint16_t *start = (uint16_t *)f->last_picture->data[0];
343 uint16_t *end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
346 if (code < 0 || code > 6 || log2w < 0)
347 return AVERROR_INVALIDDATA;
350 src += f->mv[bytestream2_get_byte(&f->g)];
351 if (start > src || src > end) {
352 av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
353 return AVERROR_INVALIDDATA;
355 mcdc(dst, src, log2w, h, stride, 1, 0);
356 } else if (code == 1) {
358 if ((ret = decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
360 if ((ret = decode_p_block(f, dst + (stride << log2h),
361 src + (stride << log2h),
362 log2w, log2h, stride)) < 0)
364 } else if (code == 2) {
366 if ((ret = decode_p_block(f, dst , src, log2w, log2h, stride)) < 0)
368 if ((ret = decode_p_block(f, dst + (1 << log2w),
370 log2w, log2h, stride)) < 0)
372 } else if (code == 3 && f->version < 2) {
373 mcdc(dst, src, log2w, h, stride, 1, 0);
374 } else if (code == 4) {
375 src += f->mv[bytestream2_get_byte(&f->g)];
376 if (start > src || src > end) {
377 av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
378 return AVERROR_INVALIDDATA;
380 mcdc(dst, src, log2w, h, stride, 1, bytestream2_get_le16(&f->g2));
381 } else if (code == 5) {
382 mcdc(dst, src, log2w, h, stride, 0, bytestream2_get_le16(&f->g2));
383 } else if (code == 6) {
385 dst[0] = bytestream2_get_le16(&f->g2);
386 dst[1] = bytestream2_get_le16(&f->g2);
388 dst[0] = bytestream2_get_le16(&f->g2);
389 dst[stride] = bytestream2_get_le16(&f->g2);
395 static int decode_p_frame(FourXContext *f, AVFrame *frame,
396 const uint8_t *buf, int length)
399 const int width = f->avctx->width;
400 const int height = f->avctx->height;
401 uint16_t *dst = (uint16_t *)frame->data[0];
402 const int stride = frame->linesize[0] >> 1;
404 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
405 bytestream_offset, wordstream_offset;
408 if (!f->last_picture->data[0]) {
409 if ((ret = ff_get_buffer(f->avctx, f->last_picture,
410 AV_GET_BUFFER_FLAG_REF)) < 0) {
411 av_log(f->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
414 memset(f->last_picture->data[0], 0,
415 f->avctx->height * FFABS(f->last_picture->linesize[0]));
418 src = (uint16_t *)f->last_picture->data[0];
420 if (f->version > 1) {
422 return AVERROR_INVALIDDATA;
424 bitstream_size = AV_RL32(buf + 8);
425 wordstream_size = AV_RL32(buf + 12);
426 bytestream_size = AV_RL32(buf + 16);
429 bitstream_size = AV_RL16(buf - 4);
430 wordstream_size = AV_RL16(buf - 2);
431 bytestream_size = FFMAX(length - bitstream_size - wordstream_size, 0);
434 if (bitstream_size + bytestream_size + wordstream_size + extra != length
435 || bitstream_size > (1 << 26)
436 || bytestream_size > (1 << 26)
437 || wordstream_size > (1 << 26)) {
438 av_log(f->avctx, AV_LOG_ERROR, "lengths %d %d %d %d\n",
439 bitstream_size, bytestream_size, wordstream_size,
440 bitstream_size + bytestream_size + wordstream_size - length);
441 return AVERROR_INVALIDDATA;
444 av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
445 bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
446 if (!f->bitstream_buffer)
447 return AVERROR(ENOMEM);
448 f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra),
450 memset((uint8_t*)f->bitstream_buffer + bitstream_size,
451 0, FF_INPUT_BUFFER_PADDING_SIZE);
452 init_get_bits(&f->gb, f->bitstream_buffer, 8 * bitstream_size);
454 wordstream_offset = extra + bitstream_size;
455 bytestream_offset = extra + bitstream_size + wordstream_size;
456 bytestream2_init(&f->g2, buf + wordstream_offset,
457 length - wordstream_offset);
458 bytestream2_init(&f->g, buf + bytestream_offset,
459 length - bytestream_offset);
461 init_mv(f, frame->linesize[0]);
463 for (y = 0; y < height; y += 8) {
464 for (x = 0; x < width; x += 8)
465 if ((ret = decode_p_block(f, dst + x, src + x, 3, 3, stride)) < 0)
475 * decode block and dequantize.
476 * Note this is almost identical to MJPEG.
478 static int decode_i_block(FourXContext *f, int16_t *block)
480 int code, i, j, level, val;
483 val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
485 av_log(f->avctx, AV_LOG_ERROR, "error dc run != 0\n");
488 val = get_xbits(&f->gb, val);
490 val = val * dequant_table[0] + f->last_dc;
491 f->last_dc = block[0] = val;
495 code = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
503 level = get_xbits(&f->gb, code & 0xf);
506 av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
510 j = ff_zigzag_direct[i];
511 block[j] = level * dequant_table[j];
521 static inline void idct_put(FourXContext *f, AVFrame *frame, int x, int y)
523 int16_t (*block)[64] = f->block;
524 int stride = frame->linesize[0] >> 1;
526 uint16_t *dst = ((uint16_t*)frame->data[0]) + y * stride + x;
528 for (i = 0; i < 4; i++) {
529 block[i][0] += 0x80 * 8 * 8;
533 if (!(f->avctx->flags & CODEC_FLAG_GRAY)) {
534 for (i = 4; i < 6; i++)
538 /* Note transform is:
539 * y = ( 1b + 4g + 2r) / 14
540 * cb = ( 3b - 2g - 1r) / 14
541 * cr = (-1b - 4g + 5r) / 14 */
542 for (y = 0; y < 8; y++) {
543 for (x = 0; x < 8; x++) {
544 int16_t *temp = block[(x >> 2) + 2 * (y >> 2)] +
545 2 * (x & 3) + 2 * 8 * (y & 3); // FIXME optimize
546 int cb = block[4][x + 8 * y];
547 int cr = block[5][x + 8 * y];
548 int cg = (cb + cr) >> 1;
554 dst[0] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
556 dst[1] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
558 dst[stride] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
560 dst[1 + stride] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
563 dst += 2 * stride - 2 * 8;
567 static int decode_i_mb(FourXContext *f)
572 f->dsp.clear_blocks(f->block[0]);
574 for (i = 0; i < 6; i++)
575 if ((ret = decode_i_block(f, f->block[i])) < 0)
581 static const uint8_t *read_huffman_tables(FourXContext *f,
582 const uint8_t * const buf,
585 int frequency[512] = { 0 };
588 uint8_t len_tab[257];
591 const uint8_t *ptr = buf;
594 memset(up, -1, sizeof(up));
601 len -= end - start + 1;
603 if (end < start || len < 0)
606 for (i = start; i <= end; i++)
607 frequency[i] = *ptr++;
619 while ((ptr - buf) & 3)
620 ptr++; // 4byte align
622 for (j = 257; j < 512; j++) {
623 int min_freq[2] = { 256 * 256, 256 * 256 };
624 int smallest[2] = { 0, 0 };
626 for (i = 0; i < j; i++) {
627 if (frequency[i] == 0)
629 if (frequency[i] < min_freq[1]) {
630 if (frequency[i] < min_freq[0]) {
631 min_freq[1] = min_freq[0];
632 smallest[1] = smallest[0];
633 min_freq[0] = frequency[i];
636 min_freq[1] = frequency[i];
641 if (min_freq[1] == 256 * 256)
644 frequency[j] = min_freq[0] + min_freq[1];
645 flag[smallest[0]] = 0;
646 flag[smallest[1]] = 1;
649 frequency[smallest[0]] = frequency[smallest[1]] = 0;
652 for (j = 0; j < 257; j++) {
653 int node, len = 0, bits = 0;
655 for (node = j; up[node] != -1; node = up[node]) {
656 bits += flag[node] << len;
659 // can this happen at all ?
660 av_log(f->avctx, AV_LOG_ERROR,
661 "vlc length overflow\n");
668 if (init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257, len_tab, 1, 1,
675 static int mix(int c0, int c1)
677 int blue = 2 * (c0 & 0x001F) + (c1 & 0x001F);
678 int green = (2 * (c0 & 0x03E0) + (c1 & 0x03E0)) >> 5;
679 int red = 2 * (c0 >> 10) + (c1 >> 10);
680 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
683 static int decode_i2_frame(FourXContext *f, AVFrame *frame, const uint8_t *buf, int length)
686 const int width = f->avctx->width;
687 const int height = f->avctx->height;
688 const int mbs = (FFALIGN(width, 16) >> 4) * (FFALIGN(height, 16) >> 4);
689 uint16_t *dst = (uint16_t*)frame->data[0];
690 const int stride = frame->linesize[0]>>1;
693 if (length < mbs * 8) {
694 av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
695 return AVERROR_INVALIDDATA;
697 bytestream2_init(&g3, buf, length);
699 for (y = 0; y < height; y += 16) {
700 for (x = 0; x < width; x += 16) {
701 unsigned int color[4] = { 0 }, bits;
702 // warning following is purely guessed ...
703 color[0] = bytestream2_get_le16u(&g3);
704 color[1] = bytestream2_get_le16u(&g3);
706 if (color[0] & 0x8000)
707 av_log(f->avctx, AV_LOG_ERROR, "unk bit 1\n");
708 if (color[1] & 0x8000)
709 av_log(f->avctx, AV_LOG_ERROR, "unk bit 2\n");
711 color[2] = mix(color[0], color[1]);
712 color[3] = mix(color[1], color[0]);
714 bits = bytestream2_get_le32u(&g3);
715 for (y2 = 0; y2 < 16; y2++) {
716 for (x2 = 0; x2 < 16; x2++) {
717 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
718 dst[y2 * stride + x2] = color[(bits >> index) & 3];
723 dst += 16 * stride - x;
729 static int decode_i_frame(FourXContext *f, AVFrame *frame, const uint8_t *buf, int length)
732 const int width = f->avctx->width;
733 const int height = f->avctx->height;
734 const unsigned int bitstream_size = AV_RL32(buf);
735 int token_count av_unused;
736 unsigned int prestream_size;
737 const uint8_t *prestream;
739 if (length < bitstream_size + 12) {
740 av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
741 return AVERROR_INVALIDDATA;
744 token_count = AV_RL32(buf + bitstream_size + 8);
745 prestream_size = 4 * AV_RL32(buf + bitstream_size + 4);
746 prestream = buf + bitstream_size + 12;
748 if (prestream_size + bitstream_size + 12 != length
749 || bitstream_size > (1 << 26)
750 || prestream_size > (1 << 26)) {
751 av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d %d\n",
752 prestream_size, bitstream_size, length);
753 return AVERROR_INVALIDDATA;
756 prestream = read_huffman_tables(f, prestream, prestream_size);
758 av_log(f->avctx, AV_LOG_ERROR, "Error reading Huffman tables.\n");
759 return AVERROR_INVALIDDATA;
762 init_get_bits(&f->gb, buf + 4, 8 * bitstream_size);
764 prestream_size = length + buf - prestream;
766 av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
767 prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
768 if (!f->bitstream_buffer)
769 return AVERROR(ENOMEM);
770 f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream,
772 memset((uint8_t*)f->bitstream_buffer + prestream_size,
773 0, FF_INPUT_BUFFER_PADDING_SIZE);
774 init_get_bits(&f->pre_gb, f->bitstream_buffer, 8 * prestream_size);
776 f->last_dc = 0 * 128 * 8 * 8;
778 for (y = 0; y < height; y += 16) {
779 for (x = 0; x < width; x += 16) {
780 if ((ret = decode_i_mb(f)) < 0)
783 idct_put(f, frame, x, y);
787 if (get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
788 av_log(f->avctx, AV_LOG_ERROR, "end mismatch\n");
793 static int decode_frame(AVCodecContext *avctx, void *data,
794 int *got_frame, AVPacket *avpkt)
796 const uint8_t *buf = avpkt->data;
797 int buf_size = avpkt->size;
798 FourXContext *const f = avctx->priv_data;
799 AVFrame *picture = data;
800 int i, frame_4cc, frame_size, ret;
803 return AVERROR_INVALIDDATA;
805 if (buf_size < AV_RL32(buf + 4) + 8) {
806 av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d\n",
807 buf_size, AV_RL32(buf + 4));
808 return AVERROR_INVALIDDATA;
811 frame_4cc = AV_RL32(buf);
813 if (frame_4cc == AV_RL32("cfrm")) {
816 const int data_size = buf_size - 20;
820 return AVERROR_INVALIDDATA;
822 id = AV_RL32(buf + 12);
823 whole_size = AV_RL32(buf + 16);
825 for (i = 0; i < CFRAME_BUFFER_COUNT; i++)
826 if (f->cfrm[i].id && f->cfrm[i].id < avctx->frame_number)
827 av_log(f->avctx, AV_LOG_ERROR, "lost c frame %d\n",
830 for (i = 0; i < CFRAME_BUFFER_COUNT; i++) {
831 if (f->cfrm[i].id == id)
833 if (f->cfrm[i].size == 0)
837 if (i >= CFRAME_BUFFER_COUNT) {
843 cfrm->data = av_fast_realloc(cfrm->data, &cfrm->allocated_size,
844 cfrm->size + data_size + FF_INPUT_BUFFER_PADDING_SIZE);
845 // explicit check needed as memcpy below might not catch a NULL
847 av_log(f->avctx, AV_LOG_ERROR, "realloc failure");
848 return AVERROR(ENOMEM);
851 memcpy(cfrm->data + cfrm->size, buf + 20, data_size);
852 cfrm->size += data_size;
854 if (cfrm->size >= whole_size) {
856 frame_size = cfrm->size;
858 if (id != avctx->frame_number)
859 av_log(f->avctx, AV_LOG_ERROR, "cframe id mismatch %d %d\n",
860 id, avctx->frame_number);
863 return AVERROR_INVALIDDATA;
865 cfrm->size = cfrm->id = 0;
866 frame_4cc = AV_RL32("pfrm");
871 frame_size = buf_size - 12;
874 // alternatively we would have to use our own buffer management
875 avctx->flags |= CODEC_FLAG_EMU_EDGE;
877 if ((ret = ff_get_buffer(avctx, picture, AV_GET_BUFFER_FLAG_REF)) < 0) {
878 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
882 if (frame_4cc == AV_RL32("ifr2")) {
883 picture->pict_type = AV_PICTURE_TYPE_I;
884 if ((ret = decode_i2_frame(f, picture, buf - 4, frame_size + 4)) < 0)
886 } else if (frame_4cc == AV_RL32("ifrm")) {
887 picture->pict_type = AV_PICTURE_TYPE_I;
888 if ((ret = decode_i_frame(f, picture, buf, frame_size)) < 0)
890 } else if (frame_4cc == AV_RL32("pfrm") || frame_4cc == AV_RL32("pfr2")) {
891 picture->pict_type = AV_PICTURE_TYPE_P;
892 if ((ret = decode_p_frame(f, picture, buf, frame_size)) < 0)
894 } else if (frame_4cc == AV_RL32("snd_")) {
895 av_log(avctx, AV_LOG_ERROR, "ignoring snd_ chunk length:%d\n",
898 av_log(avctx, AV_LOG_ERROR, "ignoring unknown chunk length:%d\n",
902 picture->key_frame = picture->pict_type == AV_PICTURE_TYPE_I;
904 av_frame_unref(f->last_picture);
905 if ((ret = av_frame_ref(f->last_picture, picture)) < 0)
914 static av_cold int decode_init(AVCodecContext *avctx)
916 FourXContext * const f = avctx->priv_data;
918 if (avctx->extradata_size != 4 || !avctx->extradata) {
919 av_log(avctx, AV_LOG_ERROR, "extradata wrong or missing\n");
923 f->version = AV_RL32(avctx->extradata) >> 16;
924 ff_dsputil_init(&f->dsp, avctx);
929 avctx->pix_fmt = AV_PIX_FMT_RGB565;
931 avctx->pix_fmt = AV_PIX_FMT_BGR555;
933 f->last_picture = av_frame_alloc();
934 if (!f->last_picture)
935 return AVERROR(ENOMEM);
941 static av_cold int decode_end(AVCodecContext *avctx)
943 FourXContext * const f = avctx->priv_data;
946 av_freep(&f->bitstream_buffer);
947 f->bitstream_buffer_size = 0;
948 for (i = 0; i < CFRAME_BUFFER_COUNT; i++) {
949 av_freep(&f->cfrm[i].data);
950 f->cfrm[i].allocated_size = 0;
952 ff_free_vlc(&f->pre_vlc);
953 av_frame_free(&f->last_picture);
958 AVCodec ff_fourxm_decoder = {
960 .type = AVMEDIA_TYPE_VIDEO,
961 .id = AV_CODEC_ID_4XM,
962 .priv_data_size = sizeof(FourXContext),
965 .decode = decode_frame,
966 .capabilities = CODEC_CAP_DR1,
967 .long_name = NULL_IF_CONFIG_SMALL("4X Movie"),