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"
41 #define BLOCK_TYPE_VLC_BITS 5
42 #define ACDC_VLC_BITS 9
44 #define CFRAME_BUFFER_COUNT 100
46 static const uint8_t block_type_tab
[2][4][8][2] = {
48 { // { 8, 4, 2 } x { 8, 4, 2}
49 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
51 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
53 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
55 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
58 { // { 8, 4, 2 } x { 8, 4, 2}
59 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
61 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
63 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
65 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
70 static const uint8_t size2index
[4][4] = {
77 static const int8_t mv
[256][2] = {
78 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
79 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
80 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
81 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
82 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
83 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
84 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
85 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
86 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
87 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
88 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
89 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
90 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
91 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
92 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
93 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
94 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
95 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
96 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
97 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
98 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
99 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
100 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
101 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
102 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
103 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
104 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
105 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
106 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
107 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
108 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
109 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
112 /* This is simply the scaled down elementwise product of the standard JPEG
113 * quantizer table and the AAN premul table. */
114 static const uint8_t dequant_table
[64] = {
115 16, 15, 13, 19, 24, 31, 28, 17,
116 17, 23, 25, 31, 36, 63, 45, 21,
117 18, 24, 27, 37, 52, 59, 49, 20,
118 16, 28, 34, 40, 60, 80, 51, 20,
119 18, 31, 48, 66, 68, 86, 56, 21,
120 19, 38, 56, 59, 64, 64, 48, 20,
121 27, 48, 55, 55, 56, 51, 35, 15,
122 20, 35, 34, 32, 31, 22, 15, 8,
125 static VLC block_type_vlc
[2][4];
128 typedef struct CFrameBuffer
{
129 unsigned int allocated_size
;
135 typedef struct FourXContext
{
136 AVCodecContext
*avctx
;
137 BlockDSPContext bdsp
;
138 BswapDSPContext bbdsp
;
139 uint16_t *frame_buffer
;
140 uint16_t *last_frame_buffer
;
141 BitstreamContext pre_bc
; // ac/dc prefix
148 DECLARE_ALIGNED(16, int16_t, block
)[6][64];
149 void *bitstream_buffer
;
150 unsigned int bitstream_buffer_size
;
152 CFrameBuffer cfrm
[CFRAME_BUFFER_COUNT
];
156 #define FIX_1_082392200 70936
157 #define FIX_1_414213562 92682
158 #define FIX_1_847759065 121095
159 #define FIX_2_613125930 171254
161 #define MULTIPLY(var, const) (((var) * (const)) >> 16)
163 static void idct(int16_t block
[64])
165 int tmp0
, tmp1
, tmp2
, tmp3
, tmp4
, tmp5
, tmp6
, tmp7
;
166 int tmp10
, tmp11
, tmp12
, tmp13
;
167 int z5
, z10
, z11
, z12
, z13
;
171 for (i
= 0; i
< 8; i
++) {
172 tmp10
= block
[8 * 0 + i
] + block
[8 * 4 + i
];
173 tmp11
= block
[8 * 0 + i
] - block
[8 * 4 + i
];
175 tmp13
= block
[8 * 2 + i
] + block
[8 * 6 + i
];
176 tmp12
= MULTIPLY(block
[8 * 2 + i
] - block
[8 * 6 + i
], FIX_1_414213562
) - tmp13
;
178 tmp0
= tmp10
+ tmp13
;
179 tmp3
= tmp10
- tmp13
;
180 tmp1
= tmp11
+ tmp12
;
181 tmp2
= tmp11
- tmp12
;
183 z13
= block
[8 * 5 + i
] + block
[8 * 3 + i
];
184 z10
= block
[8 * 5 + i
] - block
[8 * 3 + i
];
185 z11
= block
[8 * 1 + i
] + block
[8 * 7 + i
];
186 z12
= block
[8 * 1 + i
] - block
[8 * 7 + i
];
189 tmp11
= MULTIPLY(z11
- z13
, FIX_1_414213562
);
191 z5
= MULTIPLY(z10
+ z12
, FIX_1_847759065
);
192 tmp10
= MULTIPLY(z12
, FIX_1_082392200
) - z5
;
193 tmp12
= MULTIPLY(z10
, -FIX_2_613125930
) + z5
;
199 temp
[8 * 0 + i
] = tmp0
+ tmp7
;
200 temp
[8 * 7 + i
] = tmp0
- tmp7
;
201 temp
[8 * 1 + i
] = tmp1
+ tmp6
;
202 temp
[8 * 6 + i
] = tmp1
- tmp6
;
203 temp
[8 * 2 + i
] = tmp2
+ tmp5
;
204 temp
[8 * 5 + i
] = tmp2
- tmp5
;
205 temp
[8 * 4 + i
] = tmp3
+ tmp4
;
206 temp
[8 * 3 + i
] = tmp3
- tmp4
;
209 for (i
= 0; i
< 8 * 8; i
+= 8) {
210 tmp10
= temp
[0 + i
] + temp
[4 + i
];
211 tmp11
= temp
[0 + i
] - temp
[4 + i
];
213 tmp13
= temp
[2 + i
] + temp
[6 + i
];
214 tmp12
= MULTIPLY(temp
[2 + i
] - temp
[6 + i
], FIX_1_414213562
) - tmp13
;
216 tmp0
= tmp10
+ tmp13
;
217 tmp3
= tmp10
- tmp13
;
218 tmp1
= tmp11
+ tmp12
;
219 tmp2
= tmp11
- tmp12
;
221 z13
= temp
[5 + i
] + temp
[3 + i
];
222 z10
= temp
[5 + i
] - temp
[3 + i
];
223 z11
= temp
[1 + i
] + temp
[7 + i
];
224 z12
= temp
[1 + i
] - temp
[7 + i
];
227 tmp11
= MULTIPLY(z11
- z13
, FIX_1_414213562
);
229 z5
= MULTIPLY(z10
+ z12
, FIX_1_847759065
);
230 tmp10
= MULTIPLY(z12
, FIX_1_082392200
) - z5
;
231 tmp12
= MULTIPLY(z10
, -FIX_2_613125930
) + z5
;
237 block
[0 + i
] = (tmp0
+ tmp7
) >> 6;
238 block
[7 + i
] = (tmp0
- tmp7
) >> 6;
239 block
[1 + i
] = (tmp1
+ tmp6
) >> 6;
240 block
[6 + i
] = (tmp1
- tmp6
) >> 6;
241 block
[2 + i
] = (tmp2
+ tmp5
) >> 6;
242 block
[5 + i
] = (tmp2
- tmp5
) >> 6;
243 block
[4 + i
] = (tmp3
+ tmp4
) >> 6;
244 block
[3 + i
] = (tmp3
- tmp4
) >> 6;
248 static av_cold
void init_vlcs(FourXContext
*f
)
250 static VLC_TYPE table
[2][4][32][2];
253 for (i
= 0; i
< 2; i
++) {
254 for (j
= 0; j
< 4; j
++) {
255 block_type_vlc
[i
][j
].table
= table
[i
][j
];
256 block_type_vlc
[i
][j
].table_allocated
= 32;
257 init_vlc(&block_type_vlc
[i
][j
], BLOCK_TYPE_VLC_BITS
, 7,
258 &block_type_tab
[i
][j
][0][1], 2, 1,
259 &block_type_tab
[i
][j
][0][0], 2, 1,
260 INIT_VLC_USE_NEW_STATIC
);
265 static void init_mv(FourXContext
*f
, int linesize
)
269 for (i
= 0; i
< 256; i
++) {
271 f
->mv
[i
] = mv
[i
][0] + mv
[i
][1] * linesize
/ 2;
273 f
->mv
[i
] = (i
& 15) - 8 + ((i
>> 4) - 8) * linesize
/ 2;
278 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
280 unsigned tmpval = AV_RN32(src); \
281 tmpval = (tmpval << 16) | (tmpval >> 16); \
282 tmpval = tmpval * (scale) + (dc); \
283 tmpval = (tmpval << 16) | (tmpval >> 16); \
284 AV_WN32A(dst, tmpval); \
287 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
289 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
290 AV_WN32A(dst, tmpval); \
294 static inline void mcdc(uint16_t *dst
, uint16_t *src
, int log2w
,
295 int h
, int stride
, int scale
, unsigned dc
)
302 for (i
= 0; i
< h
; i
++) {
303 dst
[0] = scale
* src
[0] + dc
;
310 for (i
= 0; i
< h
; i
++) {
311 LE_CENTRIC_MUL(dst
, src
, scale
, dc
);
318 for (i
= 0; i
< h
; i
++) {
319 LE_CENTRIC_MUL(dst
, src
, scale
, dc
);
320 LE_CENTRIC_MUL(dst
+ 2, src
+ 2, scale
, dc
);
327 for (i
= 0; i
< h
; i
++) {
328 LE_CENTRIC_MUL(dst
, src
, scale
, dc
);
329 LE_CENTRIC_MUL(dst
+ 2, src
+ 2, scale
, dc
);
330 LE_CENTRIC_MUL(dst
+ 4, src
+ 4, scale
, dc
);
331 LE_CENTRIC_MUL(dst
+ 6, src
+ 6, scale
, dc
);
342 static int decode_p_block(FourXContext
*f
, uint16_t *dst
, uint16_t *src
,
343 int log2w
, int log2h
, int stride
)
345 int index
, h
, code
, ret
, scale
= 1;
346 uint16_t *start
, *end
;
349 if (log2h
< 0 || log2w
< 0)
350 return AVERROR_INVALIDDATA
;
352 index
= size2index
[log2h
][log2w
];
354 return AVERROR_INVALIDDATA
;
357 code
= bitstream_read_vlc(&f
->bc
, block_type_vlc
[1 - (f
->version
> 1)][index
].table
,
358 BLOCK_TYPE_VLC_BITS
, 1);
359 if (code
< 0 || code
> 6)
360 return AVERROR_INVALIDDATA
;
362 start
= f
->last_frame_buffer
;
363 end
= start
+ stride
* (f
->avctx
->height
- h
+ 1) - (1 << log2w
);
367 return AVERROR_INVALIDDATA
;
368 if ((ret
= decode_p_block(f
, dst
, src
, log2w
, log2h
, stride
)) < 0)
370 return decode_p_block(f
, dst
+ (stride
<< log2h
),
371 src
+ (stride
<< log2h
),
372 log2w
, log2h
, stride
);
373 } else if (code
== 2) {
375 if ((ret
= decode_p_block(f
, dst
, src
, log2w
, log2h
, stride
)) < 0)
377 return decode_p_block(f
, dst
+ (1 << log2w
),
379 log2w
, log2h
, stride
);
380 } else if (code
== 6) {
382 dst
[0] = bytestream2_get_le16(&f
->g2
);
383 dst
[1] = bytestream2_get_le16(&f
->g2
);
385 dst
[0] = bytestream2_get_le16(&f
->g2
);
386 dst
[stride
] = bytestream2_get_le16(&f
->g2
);
392 src
+= f
->mv
[bytestream2_get_byte(&f
->g
)];
393 } else if (code
== 3 && f
->version
>= 2) {
395 } else if (code
== 4) {
396 src
+= f
->mv
[bytestream2_get_byte(&f
->g
)];
397 dc
= bytestream2_get_le16(&f
->g2
);
398 } else if (code
== 5) {
400 dc
= bytestream2_get_le16(&f
->g2
);
403 if (start
> src
|| src
> end
) {
404 av_log(f
->avctx
, AV_LOG_ERROR
, "mv out of pic\n");
405 return AVERROR_INVALIDDATA
;
408 mcdc(dst
, src
, log2w
, h
, stride
, scale
, dc
);
413 static int decode_p_frame(FourXContext
*f
, const uint8_t *buf
, int length
)
416 const int width
= f
->avctx
->width
;
417 const int height
= f
->avctx
->height
;
418 uint16_t *dst
= f
->frame_buffer
;
420 unsigned int bitstream_size
, bytestream_size
, wordstream_size
, extra
,
421 bytestream_offset
, wordstream_offset
;
424 src
= f
->last_frame_buffer
;
426 if (f
->version
> 1) {
428 return AVERROR_INVALIDDATA
;
430 bitstream_size
= AV_RL32(buf
+ 8);
431 wordstream_size
= AV_RL32(buf
+ 12);
432 bytestream_size
= AV_RL32(buf
+ 16);
435 bitstream_size
= AV_RL16(buf
- 4);
436 wordstream_size
= AV_RL16(buf
- 2);
437 bytestream_size
= FFMAX(length
- bitstream_size
- wordstream_size
, 0);
440 if (bitstream_size
+ bytestream_size
+ wordstream_size
+ extra
!= length
441 || bitstream_size
> (1 << 26)
442 || bytestream_size
> (1 << 26)
443 || wordstream_size
> (1 << 26)) {
444 av_log(f
->avctx
, AV_LOG_ERROR
, "lengths %d %d %d %d\n",
445 bitstream_size
, bytestream_size
, wordstream_size
,
446 bitstream_size
+ bytestream_size
+ wordstream_size
- length
);
447 return AVERROR_INVALIDDATA
;
450 av_fast_malloc(&f
->bitstream_buffer
, &f
->bitstream_buffer_size
,
451 bitstream_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
452 if (!f
->bitstream_buffer
)
453 return AVERROR(ENOMEM
);
454 f
->bbdsp
.bswap_buf(f
->bitstream_buffer
, (const uint32_t *) (buf
+ extra
),
456 memset((uint8_t*)f
->bitstream_buffer
+ bitstream_size
,
457 0, AV_INPUT_BUFFER_PADDING_SIZE
);
458 bitstream_init8(&f
->bc
, f
->bitstream_buffer
, bitstream_size
);
460 wordstream_offset
= extra
+ bitstream_size
;
461 bytestream_offset
= extra
+ bitstream_size
+ wordstream_size
;
462 bytestream2_init(&f
->g2
, buf
+ wordstream_offset
,
463 length
- wordstream_offset
);
464 bytestream2_init(&f
->g
, buf
+ bytestream_offset
,
465 length
- bytestream_offset
);
467 init_mv(f
, width
* 2);
469 for (y
= 0; y
< height
; y
+= 8) {
470 for (x
= 0; x
< width
; x
+= 8)
471 if ((ret
= decode_p_block(f
, dst
+ x
, src
+ x
, 3, 3, width
)) < 0)
481 * decode block and dequantize.
482 * Note this is almost identical to MJPEG.
484 static int decode_i_block(FourXContext
*f
, int16_t *block
)
486 int code
, i
, j
, level
, val
;
489 val
= bitstream_read_vlc(&f
->pre_bc
, f
->pre_vlc
.table
, ACDC_VLC_BITS
, 3);
491 av_log(f
->avctx
, AV_LOG_ERROR
, "error dc run != 0\n");
494 val
= bitstream_read_xbits(&f
->bc
, val
);
496 val
= val
* dequant_table
[0] + f
->last_dc
;
497 f
->last_dc
= block
[0] = val
;
501 code
= bitstream_read_vlc(&f
->pre_bc
, f
->pre_vlc
.table
, ACDC_VLC_BITS
, 3);
509 level
= bitstream_read_xbits(&f
->bc
, code
& 0xf);
512 av_log(f
->avctx
, AV_LOG_ERROR
, "run %d oveflow\n", i
);
516 j
= ff_zigzag_direct
[i
];
517 block
[j
] = level
* dequant_table
[j
];
527 static inline void idct_put(FourXContext
*f
, int x
, int y
)
529 int16_t (*block
)[64] = f
->block
;
530 int stride
= f
->avctx
->width
;
532 uint16_t *dst
= f
->frame_buffer
+ y
* stride
+ x
;
534 for (i
= 0; i
< 4; i
++) {
535 block
[i
][0] += 0x80 * 8 * 8;
539 if (!(f
->avctx
->flags
& AV_CODEC_FLAG_GRAY
)) {
540 for (i
= 4; i
< 6; i
++)
544 /* Note transform is:
545 * y = ( 1b + 4g + 2r) / 14
546 * cb = ( 3b - 2g - 1r) / 14
547 * cr = (-1b - 4g + 5r) / 14 */
548 for (y
= 0; y
< 8; y
++) {
549 for (x
= 0; x
< 8; x
++) {
550 int16_t *temp
= block
[(x
>> 2) + 2 * (y
>> 2)] +
551 2 * (x
& 3) + 2 * 8 * (y
& 3); // FIXME optimize
552 int cb
= block
[4][x
+ 8 * y
];
553 int cr
= block
[5][x
+ 8 * y
];
554 int cg
= (cb
+ cr
) >> 1;
560 dst
[0] = ((y
+ cb
) >> 3) + (((y
- cg
) & 0xFC) << 3) + (((y
+ cr
) & 0xF8) << 8);
562 dst
[1] = ((y
+ cb
) >> 3) + (((y
- cg
) & 0xFC) << 3) + (((y
+ cr
) & 0xF8) << 8);
564 dst
[stride
] = ((y
+ cb
) >> 3) + (((y
- cg
) & 0xFC) << 3) + (((y
+ cr
) & 0xF8) << 8);
566 dst
[1 + stride
] = ((y
+ cb
) >> 3) + (((y
- cg
) & 0xFC) << 3) + (((y
+ cr
) & 0xF8) << 8);
569 dst
+= 2 * stride
- 2 * 8;
573 static int decode_i_mb(FourXContext
*f
)
578 f
->bdsp
.clear_blocks(f
->block
[0]);
580 for (i
= 0; i
< 6; i
++)
581 if ((ret
= decode_i_block(f
, f
->block
[i
])) < 0)
587 static const uint8_t *read_huffman_tables(FourXContext
*f
,
588 const uint8_t * const buf
,
591 int frequency
[512] = { 0 };
594 uint8_t len_tab
[257];
597 const uint8_t *ptr
= buf
;
600 memset(up
, -1, sizeof(up
));
607 len
-= end
- start
+ 1;
609 if (end
< start
|| len
< 0)
612 for (i
= start
; i
<= end
; i
++)
613 frequency
[i
] = *ptr
++;
625 while ((ptr
- buf
) & 3)
626 ptr
++; // 4byte align
628 for (j
= 257; j
< 512; j
++) {
629 int min_freq
[2] = { 256 * 256, 256 * 256 };
630 int smallest
[2] = { 0, 0 };
632 for (i
= 0; i
< j
; i
++) {
633 if (frequency
[i
] == 0)
635 if (frequency
[i
] < min_freq
[1]) {
636 if (frequency
[i
] < min_freq
[0]) {
637 min_freq
[1] = min_freq
[0];
638 smallest
[1] = smallest
[0];
639 min_freq
[0] = frequency
[i
];
642 min_freq
[1] = frequency
[i
];
647 if (min_freq
[1] == 256 * 256)
650 frequency
[j
] = min_freq
[0] + min_freq
[1];
651 flag
[smallest
[0]] = 0;
652 flag
[smallest
[1]] = 1;
655 frequency
[smallest
[0]] = frequency
[smallest
[1]] = 0;
658 for (j
= 0; j
< 257; j
++) {
659 int node
, len
= 0, bits
= 0;
661 for (node
= j
; up
[node
] != -1; node
= up
[node
]) {
662 bits
+= flag
[node
] << len
;
665 // can this happen at all ?
666 av_log(f
->avctx
, AV_LOG_ERROR
,
667 "vlc length overflow\n");
674 if (init_vlc(&f
->pre_vlc
, ACDC_VLC_BITS
, 257, len_tab
, 1, 1,
681 static int mix(int c0
, int c1
)
683 int blue
= 2 * (c0
& 0x001F) + (c1
& 0x001F);
684 int green
= (2 * (c0
& 0x03E0) + (c1
& 0x03E0)) >> 5;
685 int red
= 2 * (c0
>> 10) + (c1
>> 10);
686 return red
/ 3 * 1024 + green
/ 3 * 32 + blue
/ 3;
689 static int decode_i2_frame(FourXContext
*f
, const uint8_t *buf
, int length
)
692 const int width
= f
->avctx
->width
;
693 const int height
= f
->avctx
->height
;
694 const int mbs
= (FFALIGN(width
, 16) >> 4) * (FFALIGN(height
, 16) >> 4);
695 uint16_t *dst
= f
->frame_buffer
;
698 if (length
< mbs
* 8) {
699 av_log(f
->avctx
, AV_LOG_ERROR
, "packet size too small\n");
700 return AVERROR_INVALIDDATA
;
702 bytestream2_init(&g3
, buf
, length
);
704 for (y
= 0; y
< height
; y
+= 16) {
705 for (x
= 0; x
< width
; x
+= 16) {
706 unsigned int color
[4] = { 0 }, bits
;
707 // warning following is purely guessed ...
708 color
[0] = bytestream2_get_le16u(&g3
);
709 color
[1] = bytestream2_get_le16u(&g3
);
711 if (color
[0] & 0x8000)
712 av_log(f
->avctx
, AV_LOG_ERROR
, "unk bit 1\n");
713 if (color
[1] & 0x8000)
714 av_log(f
->avctx
, AV_LOG_ERROR
, "unk bit 2\n");
716 color
[2] = mix(color
[0], color
[1]);
717 color
[3] = mix(color
[1], color
[0]);
719 bits
= bytestream2_get_le32u(&g3
);
720 for (y2
= 0; y2
< 16; y2
++) {
721 for (x2
= 0; x2
< 16; x2
++) {
722 int index
= 2 * (x2
>> 2) + 8 * (y2
>> 2);
723 dst
[y2
* width
+ x2
] = color
[(bits
>> index
) & 3];
728 dst
+= 16 * width
- x
;
734 static int decode_i_frame(FourXContext
*f
, const uint8_t *buf
, int length
)
737 const int width
= f
->avctx
->width
;
738 const int height
= f
->avctx
->height
;
739 const unsigned int bitstream_size
= AV_RL32(buf
);
740 int token_count av_unused
;
741 unsigned int prestream_size
;
742 const uint8_t *prestream
;
744 if (bitstream_size
> (1 << 26))
745 return AVERROR_INVALIDDATA
;
747 if (length
< bitstream_size
+ 12) {
748 av_log(f
->avctx
, AV_LOG_ERROR
, "packet size too small\n");
749 return AVERROR_INVALIDDATA
;
752 token_count
= AV_RL32(buf
+ bitstream_size
+ 8);
753 prestream_size
= 4 * AV_RL32(buf
+ bitstream_size
+ 4);
754 prestream
= buf
+ bitstream_size
+ 12;
756 if (prestream_size
+ bitstream_size
+ 12 != length
757 || prestream_size
> (1 << 26)) {
758 av_log(f
->avctx
, AV_LOG_ERROR
, "size mismatch %d %d %d\n",
759 prestream_size
, bitstream_size
, length
);
760 return AVERROR_INVALIDDATA
;
763 prestream
= read_huffman_tables(f
, prestream
, prestream_size
);
765 av_log(f
->avctx
, AV_LOG_ERROR
, "Error reading Huffman tables.\n");
766 return AVERROR_INVALIDDATA
;
769 bitstream_init8(&f
->bc
, buf
+ 4, bitstream_size
);
771 prestream_size
= length
+ buf
- prestream
;
773 av_fast_malloc(&f
->bitstream_buffer
, &f
->bitstream_buffer_size
,
774 prestream_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
775 if (!f
->bitstream_buffer
)
776 return AVERROR(ENOMEM
);
777 f
->bbdsp
.bswap_buf(f
->bitstream_buffer
, (const uint32_t *) prestream
,
779 memset((uint8_t*)f
->bitstream_buffer
+ prestream_size
,
780 0, AV_INPUT_BUFFER_PADDING_SIZE
);
781 bitstream_init8(&f
->pre_bc
, f
->bitstream_buffer
, prestream_size
);
783 f
->last_dc
= 0 * 128 * 8 * 8;
785 for (y
= 0; y
< height
; y
+= 16) {
786 for (x
= 0; x
< width
; x
+= 16) {
787 if ((ret
= decode_i_mb(f
)) < 0)
794 if (bitstream_read_vlc(&f
->pre_bc
, f
->pre_vlc
.table
, ACDC_VLC_BITS
, 3) != 256)
795 av_log(f
->avctx
, AV_LOG_ERROR
, "end mismatch\n");
800 static int decode_frame(AVCodecContext
*avctx
, void *data
,
801 int *got_frame
, AVPacket
*avpkt
)
803 const uint8_t *buf
= avpkt
->data
;
804 int buf_size
= avpkt
->size
;
805 FourXContext
*const f
= avctx
->priv_data
;
806 AVFrame
*picture
= data
;
807 int i
, frame_4cc
, frame_size
, ret
;
810 return AVERROR_INVALIDDATA
;
812 if (avctx
->width
% 16 || avctx
->height
% 16) {
813 av_log(avctx
, AV_LOG_ERROR
,
814 "Dimensions non-multiple of 16 are invalid.\n");
815 return AVERROR_INVALIDDATA
;
818 if (buf_size
< AV_RL32(buf
+ 4) + 8) {
819 av_log(f
->avctx
, AV_LOG_ERROR
, "size mismatch %d %"PRIu32
"\n",
820 buf_size
, AV_RL32(buf
+ 4));
821 return AVERROR_INVALIDDATA
;
824 frame_4cc
= AV_RL32(buf
);
826 if (frame_4cc
== AV_RL32("cfrm")) {
829 const int data_size
= buf_size
- 20;
832 id
= AV_RL32(buf
+ 12);
833 whole_size
= AV_RL32(buf
+ 16);
835 for (i
= 0; i
< CFRAME_BUFFER_COUNT
; i
++)
836 if (f
->cfrm
[i
].id
&& f
->cfrm
[i
].id
< avctx
->frame_number
)
837 av_log(f
->avctx
, AV_LOG_ERROR
, "lost c frame %d\n",
840 for (i
= 0; i
< CFRAME_BUFFER_COUNT
; i
++) {
841 if (f
->cfrm
[i
].id
== id
)
843 if (f
->cfrm
[i
].size
== 0)
847 if (i
>= CFRAME_BUFFER_COUNT
) {
853 cfrm
->data
= av_fast_realloc(cfrm
->data
, &cfrm
->allocated_size
,
854 cfrm
->size
+ data_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
855 // explicit check needed as memcpy below might not catch a NULL
857 av_log(f
->avctx
, AV_LOG_ERROR
, "realloc failure");
858 return AVERROR(ENOMEM
);
861 memcpy(cfrm
->data
+ cfrm
->size
, buf
+ 20, data_size
);
862 cfrm
->size
+= data_size
;
864 if (cfrm
->size
>= whole_size
) {
866 frame_size
= cfrm
->size
;
868 if (id
!= avctx
->frame_number
)
869 av_log(f
->avctx
, AV_LOG_ERROR
, "cframe id mismatch %d %d\n",
870 id
, avctx
->frame_number
);
873 return AVERROR_INVALIDDATA
;
875 cfrm
->size
= cfrm
->id
= 0;
876 frame_4cc
= AV_RL32("pfrm");
881 frame_size
= buf_size
- 12;
885 if ((ret
= ff_get_buffer(avctx
, picture
, 0)) < 0) {
886 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
890 if (frame_4cc
== AV_RL32("ifr2")) {
891 picture
->pict_type
= AV_PICTURE_TYPE_I
;
892 if ((ret
= decode_i2_frame(f
, buf
- 4, frame_size
+ 4)) < 0)
894 } else if (frame_4cc
== AV_RL32("ifrm")) {
895 picture
->pict_type
= AV_PICTURE_TYPE_I
;
896 if ((ret
= decode_i_frame(f
, buf
, frame_size
)) < 0)
898 } else if (frame_4cc
== AV_RL32("pfrm") || frame_4cc
== AV_RL32("pfr2")) {
899 picture
->pict_type
= AV_PICTURE_TYPE_P
;
900 if ((ret
= decode_p_frame(f
, buf
, frame_size
)) < 0)
902 } else if (frame_4cc
== AV_RL32("snd_")) {
903 av_log(avctx
, AV_LOG_ERROR
, "ignoring snd_ chunk length:%d\n",
906 av_log(avctx
, AV_LOG_ERROR
, "ignoring unknown chunk length:%d\n",
910 picture
->key_frame
= picture
->pict_type
== AV_PICTURE_TYPE_I
;
912 av_image_copy_plane(picture
->data
[0], picture
->linesize
[0],
913 (const uint8_t*)f
->frame_buffer
, avctx
->width
* 2,
914 avctx
->width
* 2, avctx
->height
);
915 FFSWAP(uint16_t *, f
->frame_buffer
, f
->last_frame_buffer
);
924 static av_cold
int decode_end(AVCodecContext
*avctx
)
926 FourXContext
* const f
= avctx
->priv_data
;
929 av_freep(&f
->frame_buffer
);
930 av_freep(&f
->last_frame_buffer
);
931 av_freep(&f
->bitstream_buffer
);
932 f
->bitstream_buffer_size
= 0;
933 for (i
= 0; i
< CFRAME_BUFFER_COUNT
; i
++) {
934 av_freep(&f
->cfrm
[i
].data
);
935 f
->cfrm
[i
].allocated_size
= 0;
937 ff_free_vlc(&f
->pre_vlc
);
942 static av_cold
int decode_init(AVCodecContext
*avctx
)
944 FourXContext
* const f
= avctx
->priv_data
;
947 if (avctx
->extradata_size
!= 4 || !avctx
->extradata
) {
948 av_log(avctx
, AV_LOG_ERROR
, "extradata wrong or missing\n");
949 return AVERROR_INVALIDDATA
;
952 ret
= av_image_check_size(avctx
->width
, avctx
->height
, 0, avctx
);
956 f
->frame_buffer
= av_mallocz(avctx
->width
* avctx
->height
* 2);
957 f
->last_frame_buffer
= av_mallocz(avctx
->width
* avctx
->height
* 2);
958 if (!f
->frame_buffer
|| !f
->last_frame_buffer
) {
960 return AVERROR(ENOMEM
);
963 f
->version
= AV_RL32(avctx
->extradata
) >> 16;
964 ff_blockdsp_init(&f
->bdsp
);
965 ff_bswapdsp_init(&f
->bbdsp
);
970 avctx
->pix_fmt
= AV_PIX_FMT_RGB565
;
972 avctx
->pix_fmt
= AV_PIX_FMT_BGR555
;
977 AVCodec ff_fourxm_decoder
= {
979 .long_name
= NULL_IF_CONFIG_SMALL("4X Movie"),
980 .type
= AVMEDIA_TYPE_VIDEO
,
981 .id
= AV_CODEC_ID_4XM
,
982 .priv_data_size
= sizeof(FourXContext
),
985 .decode
= decode_frame
,
986 .capabilities
= AV_CODEC_CAP_DR1
,