Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52867 views
1
/*
2
* 4XM codec
3
* Copyright (c) 2003 Michael Niedermayer
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg 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.
11
*
12
* FFmpeg 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.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
/**
23
* @file
24
* 4XM codec.
25
*/
26
27
#include <inttypes.h>
28
29
#include "libavutil/avassert.h"
30
#include "libavutil/frame.h"
31
#include "libavutil/imgutils.h"
32
#include "libavutil/intreadwrite.h"
33
#include "avcodec.h"
34
#include "blockdsp.h"
35
#include "bswapdsp.h"
36
#include "bytestream.h"
37
#include "get_bits.h"
38
#include "internal.h"
39
40
41
#define BLOCK_TYPE_VLC_BITS 5
42
#define ACDC_VLC_BITS 9
43
44
#define CFRAME_BUFFER_COUNT 100
45
46
static const uint8_t block_type_tab[2][4][8][2] = {
47
{
48
{ // { 8, 4, 2 } x { 8, 4, 2}
49
{ 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
50
}, { // { 8, 4 } x 1
51
{ 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
52
}, { // 1 x { 8, 4 }
53
{ 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
54
}, { // 1 x 2, 2 x 1
55
{ 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
56
}
57
}, {
58
{ // { 8, 4, 2 } x { 8, 4, 2}
59
{ 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
60
}, {// { 8, 4 } x 1
61
{ 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
62
}, {// 1 x { 8, 4 }
63
{ 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
64
}, {// 1 x 2, 2 x 1
65
{ 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
66
}
67
}
68
};
69
70
static const uint8_t size2index[4][4] = {
71
{ -1, 3, 1, 1 },
72
{ 3, 0, 0, 0 },
73
{ 2, 0, 0, 0 },
74
{ 2, 0, 0, 0 },
75
};
76
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 }
110
};
111
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,
123
};
124
125
static VLC block_type_vlc[2][4];
126
127
128
typedef struct CFrameBuffer {
129
unsigned int allocated_size;
130
unsigned int size;
131
int id;
132
uint8_t *data;
133
} CFrameBuffer;
134
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
GetBitContext pre_gb; ///< ac/dc prefix
142
GetBitContext gb;
143
GetByteContext g;
144
GetByteContext g2;
145
int mv[256];
146
VLC pre_vlc;
147
int last_dc;
148
DECLARE_ALIGNED(16, int16_t, block)[6][64];
149
void *bitstream_buffer;
150
unsigned int bitstream_buffer_size;
151
int version;
152
CFrameBuffer cfrm[CFRAME_BUFFER_COUNT];
153
} FourXContext;
154
155
156
#define FIX_1_082392200 70936
157
#define FIX_1_414213562 92682
158
#define FIX_1_847759065 121095
159
#define FIX_2_613125930 171254
160
161
#define MULTIPLY(var, const) (((var) * (const)) >> 16)
162
163
static void idct(int16_t block[64])
164
{
165
int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
166
int tmp10, tmp11, tmp12, tmp13;
167
int z5, z10, z11, z12, z13;
168
int i;
169
int temp[64];
170
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];
174
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;
177
178
tmp0 = tmp10 + tmp13;
179
tmp3 = tmp10 - tmp13;
180
tmp1 = tmp11 + tmp12;
181
tmp2 = tmp11 - tmp12;
182
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];
187
188
tmp7 = z11 + z13;
189
tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
190
191
z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
192
tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
193
tmp12 = MULTIPLY(z10, -FIX_2_613125930) + z5;
194
195
tmp6 = tmp12 - tmp7;
196
tmp5 = tmp11 - tmp6;
197
tmp4 = tmp10 + tmp5;
198
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;
207
}
208
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];
212
213
tmp13 = temp[2 + i] + temp[6 + i];
214
tmp12 = MULTIPLY(temp[2 + i] - temp[6 + i], FIX_1_414213562) - tmp13;
215
216
tmp0 = tmp10 + tmp13;
217
tmp3 = tmp10 - tmp13;
218
tmp1 = tmp11 + tmp12;
219
tmp2 = tmp11 - tmp12;
220
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];
225
226
tmp7 = z11 + z13;
227
tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
228
229
z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
230
tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
231
tmp12 = MULTIPLY(z10, -FIX_2_613125930) + z5;
232
233
tmp6 = tmp12 - tmp7;
234
tmp5 = tmp11 - tmp6;
235
tmp4 = tmp10 + tmp5;
236
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;
245
}
246
}
247
248
static av_cold void init_vlcs(FourXContext *f)
249
{
250
static VLC_TYPE table[2][4][32][2];
251
int i, j;
252
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);
261
}
262
}
263
}
264
265
static void init_mv(FourXContext *f, int linesize)
266
{
267
int i;
268
269
for (i = 0; i < 256; i++) {
270
if (f->version > 1)
271
f->mv[i] = mv[i][0] + mv[i][1] * linesize / 2;
272
else
273
f->mv[i] = (i & 15) - 8 + ((i >> 4) - 8) * linesize / 2;
274
}
275
}
276
277
#if HAVE_BIGENDIAN
278
#define LE_CENTRIC_MUL(dst, src, scale, dc) \
279
{ \
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); \
285
}
286
#else
287
#define LE_CENTRIC_MUL(dst, src, scale, dc) \
288
{ \
289
unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
290
AV_WN32A(dst, tmpval); \
291
}
292
#endif
293
294
static inline void mcdc(uint16_t *dst, const uint16_t *src, int log2w,
295
int h, int stride, int scale, unsigned dc)
296
{
297
int i;
298
dc *= 0x10001;
299
300
switch (log2w) {
301
case 0:
302
for (i = 0; i < h; i++) {
303
dst[0] = scale * src[0] + dc;
304
if (scale)
305
src += stride;
306
dst += stride;
307
}
308
break;
309
case 1:
310
for (i = 0; i < h; i++) {
311
LE_CENTRIC_MUL(dst, src, scale, dc);
312
if (scale)
313
src += stride;
314
dst += stride;
315
}
316
break;
317
case 2:
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);
321
if (scale)
322
src += stride;
323
dst += stride;
324
}
325
break;
326
case 3:
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);
332
if (scale)
333
src += stride;
334
dst += stride;
335
}
336
break;
337
default:
338
av_assert0(0);
339
}
340
}
341
342
static int decode_p_block(FourXContext *f, uint16_t *dst, const uint16_t *src,
343
int log2w, int log2h, int stride)
344
{
345
int index, h, code, ret, scale = 1;
346
uint16_t *start, *end;
347
unsigned dc = 0;
348
349
av_assert0(log2w >= 0 && log2h >= 0);
350
351
index = size2index[log2h][log2w];
352
av_assert0(index >= 0);
353
354
h = 1 << log2h;
355
code = get_vlc2(&f->gb, block_type_vlc[1 - (f->version > 1)][index].table,
356
BLOCK_TYPE_VLC_BITS, 1);
357
av_assert0(code >= 0 && code <= 6);
358
359
start = f->last_frame_buffer;
360
end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
361
362
if (code == 1) {
363
log2h--;
364
if ((ret = decode_p_block(f, dst, src, log2w, log2h, stride)) < 0)
365
return ret;
366
return decode_p_block(f, dst + (stride << log2h),
367
src + (stride << log2h),
368
log2w, log2h, stride);
369
} else if (code == 2) {
370
log2w--;
371
if ((ret = decode_p_block(f, dst , src, log2w, log2h, stride)) < 0)
372
return ret;
373
return decode_p_block(f, dst + (1 << log2w),
374
src + (1 << log2w),
375
log2w, log2h, stride);
376
} else if (code == 6) {
377
if (bytestream2_get_bytes_left(&f->g2) < 4) {
378
av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
379
return AVERROR_INVALIDDATA;
380
}
381
if (log2w) {
382
dst[0] = bytestream2_get_le16u(&f->g2);
383
dst[1] = bytestream2_get_le16u(&f->g2);
384
} else {
385
dst[0] = bytestream2_get_le16u(&f->g2);
386
dst[stride] = bytestream2_get_le16u(&f->g2);
387
}
388
return 0;
389
}
390
391
if ((code&3)==0 && bytestream2_get_bytes_left(&f->g) < 1) {
392
av_log(f->avctx, AV_LOG_ERROR, "bytestream overread\n");
393
return AVERROR_INVALIDDATA;
394
}
395
396
if (code == 0) {
397
src += f->mv[bytestream2_get_byte(&f->g)];
398
} else if (code == 3 && f->version >= 2) {
399
return 0;
400
} else if (code == 4) {
401
src += f->mv[bytestream2_get_byte(&f->g)];
402
if (bytestream2_get_bytes_left(&f->g2) < 2){
403
av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
404
return AVERROR_INVALIDDATA;
405
}
406
dc = bytestream2_get_le16(&f->g2);
407
} else if (code == 5) {
408
if (bytestream2_get_bytes_left(&f->g2) < 2){
409
av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
410
return AVERROR_INVALIDDATA;
411
}
412
av_assert0(start <= src && src <= end);
413
scale = 0;
414
dc = bytestream2_get_le16(&f->g2);
415
}
416
417
if (start > src || src > end) {
418
av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
419
return AVERROR_INVALIDDATA;
420
}
421
422
mcdc(dst, src, log2w, h, stride, scale, dc);
423
424
return 0;
425
}
426
427
static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length)
428
{
429
int x, y;
430
const int width = f->avctx->width;
431
const int height = f->avctx->height;
432
uint16_t *dst = f->frame_buffer;
433
uint16_t *src;
434
unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
435
bytestream_offset, wordstream_offset;
436
int ret;
437
438
src = f->last_frame_buffer;
439
440
if (f->version > 1) {
441
extra = 20;
442
if (length < extra)
443
return AVERROR_INVALIDDATA;
444
bitstream_size = AV_RL32(buf + 8);
445
wordstream_size = AV_RL32(buf + 12);
446
bytestream_size = AV_RL32(buf + 16);
447
} else {
448
extra = 0;
449
bitstream_size = AV_RL16(buf - 4);
450
wordstream_size = AV_RL16(buf - 2);
451
bytestream_size = FFMAX(length - bitstream_size - wordstream_size, 0);
452
}
453
454
if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
455
bytestream_size > length - bitstream_size ||
456
wordstream_size > length - bytestream_size - bitstream_size ||
457
extra > length - bytestream_size - bitstream_size - wordstream_size) {
458
av_log(f->avctx, AV_LOG_ERROR, "lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
459
bitstream_size+ bytestream_size+ wordstream_size - length);
460
return AVERROR_INVALIDDATA;
461
}
462
463
av_fast_padded_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
464
bitstream_size);
465
if (!f->bitstream_buffer)
466
return AVERROR(ENOMEM);
467
f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) (buf + extra),
468
bitstream_size / 4);
469
init_get_bits(&f->gb, f->bitstream_buffer, 8 * bitstream_size);
470
471
wordstream_offset = extra + bitstream_size;
472
bytestream_offset = extra + bitstream_size + wordstream_size;
473
bytestream2_init(&f->g2, buf + wordstream_offset,
474
length - wordstream_offset);
475
bytestream2_init(&f->g, buf + bytestream_offset,
476
length - bytestream_offset);
477
478
init_mv(f, width * 2);
479
480
for (y = 0; y < height; y += 8) {
481
for (x = 0; x < width; x += 8)
482
if ((ret = decode_p_block(f, dst + x, src + x, 3, 3, width)) < 0)
483
return ret;
484
src += 8 * width;
485
dst += 8 * width;
486
}
487
488
return 0;
489
}
490
491
/**
492
* decode block and dequantize.
493
* Note this is almost identical to MJPEG.
494
*/
495
static int decode_i_block(FourXContext *f, int16_t *block)
496
{
497
int code, i, j, level, val;
498
499
if (get_bits_left(&f->gb) < 2){
500
av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->gb));
501
return -1;
502
}
503
504
/* DC coef */
505
val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
506
if (val >> 4) {
507
av_log(f->avctx, AV_LOG_ERROR, "error dc run != 0\n");
508
return AVERROR_INVALIDDATA;
509
}
510
511
if (val)
512
val = get_xbits(&f->gb, val);
513
514
val = val * dequant_table[0] + f->last_dc;
515
f->last_dc = block[0] = val;
516
/* AC coefs */
517
i = 1;
518
for (;;) {
519
code = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
520
521
/* EOB */
522
if (code == 0)
523
break;
524
if (code == 0xf0) {
525
i += 16;
526
} else {
527
if (code & 0xf) {
528
level = get_xbits(&f->gb, code & 0xf);
529
} else {
530
av_log(f->avctx, AV_LOG_ERROR, "0 coeff\n");
531
return AVERROR_INVALIDDATA;
532
}
533
i += code >> 4;
534
if (i >= 64) {
535
av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
536
return 0;
537
}
538
539
j = ff_zigzag_direct[i];
540
block[j] = level * dequant_table[j];
541
i++;
542
if (i >= 64)
543
break;
544
}
545
}
546
547
return 0;
548
}
549
550
static inline void idct_put(FourXContext *f, int x, int y)
551
{
552
int16_t (*block)[64] = f->block;
553
int stride = f->avctx->width;
554
int i;
555
uint16_t *dst = f->frame_buffer + y * stride + x;
556
557
for (i = 0; i < 4; i++) {
558
block[i][0] += 0x80 * 8 * 8;
559
idct(block[i]);
560
}
561
562
if (!(f->avctx->flags & AV_CODEC_FLAG_GRAY)) {
563
for (i = 4; i < 6; i++)
564
idct(block[i]);
565
}
566
567
/* Note transform is:
568
* y = ( 1b + 4g + 2r) / 14
569
* cb = ( 3b - 2g - 1r) / 14
570
* cr = (-1b - 4g + 5r) / 14 */
571
for (y = 0; y < 8; y++) {
572
for (x = 0; x < 8; x++) {
573
int16_t *temp = block[(x >> 2) + 2 * (y >> 2)] +
574
2 * (x & 3) + 2 * 8 * (y & 3); // FIXME optimize
575
int cb = block[4][x + 8 * y];
576
int cr = block[5][x + 8 * y];
577
int cg = (cb + cr) >> 1;
578
int y;
579
580
cb += cb;
581
582
y = temp[0];
583
dst[0] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
584
y = temp[1];
585
dst[1] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
586
y = temp[8];
587
dst[stride] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
588
y = temp[9];
589
dst[1 + stride] = ((y + cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y + cr) & 0xF8) << 8);
590
dst += 2;
591
}
592
dst += 2 * stride - 2 * 8;
593
}
594
}
595
596
static int decode_i_mb(FourXContext *f)
597
{
598
int ret;
599
int i;
600
601
f->bdsp.clear_blocks(f->block[0]);
602
603
for (i = 0; i < 6; i++)
604
if ((ret = decode_i_block(f, f->block[i])) < 0)
605
return ret;
606
607
return 0;
608
}
609
610
static const uint8_t *read_huffman_tables(FourXContext *f,
611
const uint8_t * const buf,
612
int buf_size)
613
{
614
int frequency[512] = { 0 };
615
uint8_t flag[512];
616
int up[512];
617
uint8_t len_tab[257];
618
int bits_tab[257];
619
int start, end;
620
const uint8_t *ptr = buf;
621
const uint8_t *ptr_end = buf + buf_size;
622
int j;
623
624
memset(up, -1, sizeof(up));
625
626
start = *ptr++;
627
end = *ptr++;
628
for (;;) {
629
int i;
630
631
if (ptr_end - ptr < FFMAX(end - start + 1, 0) + 1) {
632
av_log(f->avctx, AV_LOG_ERROR, "invalid data in read_huffman_tables\n");
633
return NULL;
634
}
635
636
for (i = start; i <= end; i++)
637
frequency[i] = *ptr++;
638
start = *ptr++;
639
if (start == 0)
640
break;
641
642
end = *ptr++;
643
}
644
frequency[256] = 1;
645
646
while ((ptr - buf) & 3)
647
ptr++; // 4byte align
648
649
if (ptr > ptr_end) {
650
av_log(f->avctx, AV_LOG_ERROR, "ptr overflow in read_huffman_tables\n");
651
return NULL;
652
}
653
654
for (j = 257; j < 512; j++) {
655
int min_freq[2] = { 256 * 256, 256 * 256 };
656
int smallest[2] = { 0, 0 };
657
int i;
658
for (i = 0; i < j; i++) {
659
if (frequency[i] == 0)
660
continue;
661
if (frequency[i] < min_freq[1]) {
662
if (frequency[i] < min_freq[0]) {
663
min_freq[1] = min_freq[0];
664
smallest[1] = smallest[0];
665
min_freq[0] = frequency[i];
666
smallest[0] = i;
667
} else {
668
min_freq[1] = frequency[i];
669
smallest[1] = i;
670
}
671
}
672
}
673
if (min_freq[1] == 256 * 256)
674
break;
675
676
frequency[j] = min_freq[0] + min_freq[1];
677
flag[smallest[0]] = 0;
678
flag[smallest[1]] = 1;
679
up[smallest[0]] =
680
up[smallest[1]] = j;
681
frequency[smallest[0]] = frequency[smallest[1]] = 0;
682
}
683
684
for (j = 0; j < 257; j++) {
685
int node, len = 0, bits = 0;
686
687
for (node = j; up[node] != -1; node = up[node]) {
688
bits += flag[node] << len;
689
len++;
690
if (len > 31)
691
// can this happen at all ?
692
av_log(f->avctx, AV_LOG_ERROR,
693
"vlc length overflow\n");
694
}
695
696
bits_tab[j] = bits;
697
len_tab[j] = len;
698
}
699
700
if (init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257, len_tab, 1, 1,
701
bits_tab, 4, 4, 0))
702
return NULL;
703
704
return ptr;
705
}
706
707
static int mix(int c0, int c1)
708
{
709
int blue = 2 * (c0 & 0x001F) + (c1 & 0x001F);
710
int green = (2 * (c0 & 0x03E0) + (c1 & 0x03E0)) >> 5;
711
int red = 2 * (c0 >> 10) + (c1 >> 10);
712
return red / 3 * 1024 + green / 3 * 32 + blue / 3;
713
}
714
715
static int decode_i2_frame(FourXContext *f, const uint8_t *buf, int length)
716
{
717
int x, y, x2, y2;
718
const int width = f->avctx->width;
719
const int height = f->avctx->height;
720
const int mbs = (FFALIGN(width, 16) >> 4) * (FFALIGN(height, 16) >> 4);
721
uint16_t *dst = f->frame_buffer;
722
const uint8_t *buf_end = buf + length;
723
GetByteContext g3;
724
725
if (length < mbs * 8) {
726
av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
727
return AVERROR_INVALIDDATA;
728
}
729
bytestream2_init(&g3, buf, length);
730
731
for (y = 0; y < height; y += 16) {
732
for (x = 0; x < width; x += 16) {
733
unsigned int color[4] = { 0 }, bits;
734
if (buf_end - buf < 8)
735
return -1;
736
// warning following is purely guessed ...
737
color[0] = bytestream2_get_le16u(&g3);
738
color[1] = bytestream2_get_le16u(&g3);
739
740
if (color[0] & 0x8000)
741
av_log(f->avctx, AV_LOG_ERROR, "unk bit 1\n");
742
if (color[1] & 0x8000)
743
av_log(f->avctx, AV_LOG_ERROR, "unk bit 2\n");
744
745
color[2] = mix(color[0], color[1]);
746
color[3] = mix(color[1], color[0]);
747
748
bits = bytestream2_get_le32u(&g3);
749
for (y2 = 0; y2 < 16; y2++) {
750
for (x2 = 0; x2 < 16; x2++) {
751
int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
752
dst[y2 * width + x2] = color[(bits >> index) & 3];
753
}
754
}
755
dst += 16;
756
}
757
dst += 16 * width - x;
758
}
759
760
return 0;
761
}
762
763
static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length)
764
{
765
int x, y, ret;
766
const int width = f->avctx->width;
767
const int height = f->avctx->height;
768
const unsigned int bitstream_size = AV_RL32(buf);
769
unsigned int prestream_size;
770
const uint8_t *prestream;
771
772
if (bitstream_size > (1 << 26))
773
return AVERROR_INVALIDDATA;
774
775
if (length < bitstream_size + 12) {
776
av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
777
return AVERROR_INVALIDDATA;
778
}
779
780
prestream_size = 4 * AV_RL32(buf + bitstream_size + 4);
781
prestream = buf + bitstream_size + 12;
782
783
if (prestream_size + bitstream_size + 12 != length
784
|| prestream_size > (1 << 26)) {
785
av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d %d\n",
786
prestream_size, bitstream_size, length);
787
return AVERROR_INVALIDDATA;
788
}
789
790
prestream = read_huffman_tables(f, prestream, prestream_size);
791
if (!prestream) {
792
av_log(f->avctx, AV_LOG_ERROR, "Error reading Huffman tables.\n");
793
return AVERROR_INVALIDDATA;
794
}
795
796
av_assert0(prestream <= buf + length);
797
798
init_get_bits(&f->gb, buf + 4, 8 * bitstream_size);
799
800
prestream_size = length + buf - prestream;
801
802
av_fast_padded_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size,
803
prestream_size);
804
if (!f->bitstream_buffer)
805
return AVERROR(ENOMEM);
806
f->bbdsp.bswap_buf(f->bitstream_buffer, (const uint32_t *) prestream,
807
prestream_size / 4);
808
init_get_bits(&f->pre_gb, f->bitstream_buffer, 8 * prestream_size);
809
810
f->last_dc = 0 * 128 * 8 * 8;
811
812
for (y = 0; y < height; y += 16) {
813
for (x = 0; x < width; x += 16) {
814
if ((ret = decode_i_mb(f)) < 0)
815
return ret;
816
817
idct_put(f, x, y);
818
}
819
}
820
821
if (get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
822
av_log(f->avctx, AV_LOG_ERROR, "end mismatch\n");
823
824
return 0;
825
}
826
827
static int decode_frame(AVCodecContext *avctx, void *data,
828
int *got_frame, AVPacket *avpkt)
829
{
830
const uint8_t *buf = avpkt->data;
831
int buf_size = avpkt->size;
832
FourXContext *const f = avctx->priv_data;
833
AVFrame *picture = data;
834
int i, frame_4cc, frame_size, ret;
835
836
if (buf_size < 20)
837
return AVERROR_INVALIDDATA;
838
839
av_assert0(avctx->width % 16 == 0 && avctx->height % 16 == 0);
840
841
if (buf_size < AV_RL32(buf + 4) + 8) {
842
av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %"PRIu32"\n",
843
buf_size, AV_RL32(buf + 4));
844
return AVERROR_INVALIDDATA;
845
}
846
847
frame_4cc = AV_RL32(buf);
848
849
if (frame_4cc == AV_RL32("cfrm")) {
850
int free_index = -1;
851
int id, whole_size;
852
const int data_size = buf_size - 20;
853
CFrameBuffer *cfrm;
854
855
if (f->version <= 1) {
856
av_log(f->avctx, AV_LOG_ERROR, "cfrm in version %d\n", f->version);
857
return AVERROR_INVALIDDATA;
858
}
859
860
id = AV_RL32(buf + 12);
861
whole_size = AV_RL32(buf + 16);
862
863
if (data_size < 0 || whole_size < 0) {
864
av_log(f->avctx, AV_LOG_ERROR, "sizes invalid\n");
865
return AVERROR_INVALIDDATA;
866
}
867
868
for (i = 0; i < CFRAME_BUFFER_COUNT; i++)
869
if (f->cfrm[i].id && f->cfrm[i].id < avctx->frame_number)
870
av_log(f->avctx, AV_LOG_ERROR, "lost c frame %d\n",
871
f->cfrm[i].id);
872
873
for (i = 0; i < CFRAME_BUFFER_COUNT; i++) {
874
if (f->cfrm[i].id == id)
875
break;
876
if (f->cfrm[i].size == 0)
877
free_index = i;
878
}
879
880
if (i >= CFRAME_BUFFER_COUNT) {
881
i = free_index;
882
f->cfrm[i].id = id;
883
}
884
cfrm = &f->cfrm[i];
885
886
if (data_size > UINT_MAX - cfrm->size - AV_INPUT_BUFFER_PADDING_SIZE)
887
return AVERROR_INVALIDDATA;
888
889
cfrm->data = av_fast_realloc(cfrm->data, &cfrm->allocated_size,
890
cfrm->size + data_size + AV_INPUT_BUFFER_PADDING_SIZE);
891
// explicit check needed as memcpy below might not catch a NULL
892
if (!cfrm->data) {
893
av_log(f->avctx, AV_LOG_ERROR, "realloc failure\n");
894
return AVERROR(ENOMEM);
895
}
896
897
memcpy(cfrm->data + cfrm->size, buf + 20, data_size);
898
cfrm->size += data_size;
899
900
if (cfrm->size >= whole_size) {
901
buf = cfrm->data;
902
frame_size = cfrm->size;
903
904
if (id != avctx->frame_number)
905
av_log(f->avctx, AV_LOG_ERROR, "cframe id mismatch %d %d\n",
906
id, avctx->frame_number);
907
908
if (f->version <= 1)
909
return AVERROR_INVALIDDATA;
910
911
cfrm->size = cfrm->id = 0;
912
frame_4cc = AV_RL32("pfrm");
913
} else
914
return buf_size;
915
} else {
916
buf = buf + 12;
917
frame_size = buf_size - 12;
918
}
919
920
if ((ret = ff_get_buffer(avctx, picture, 0)) < 0)
921
return ret;
922
923
if (frame_4cc == AV_RL32("ifr2")) {
924
picture->pict_type = AV_PICTURE_TYPE_I;
925
if ((ret = decode_i2_frame(f, buf - 4, frame_size + 4)) < 0) {
926
av_log(f->avctx, AV_LOG_ERROR, "decode i2 frame failed\n");
927
return ret;
928
}
929
} else if (frame_4cc == AV_RL32("ifrm")) {
930
picture->pict_type = AV_PICTURE_TYPE_I;
931
if ((ret = decode_i_frame(f, buf, frame_size)) < 0) {
932
av_log(f->avctx, AV_LOG_ERROR, "decode i frame failed\n");
933
return ret;
934
}
935
} else if (frame_4cc == AV_RL32("pfrm") || frame_4cc == AV_RL32("pfr2")) {
936
picture->pict_type = AV_PICTURE_TYPE_P;
937
if ((ret = decode_p_frame(f, buf, frame_size)) < 0) {
938
av_log(f->avctx, AV_LOG_ERROR, "decode p frame failed\n");
939
return ret;
940
}
941
} else if (frame_4cc == AV_RL32("snd_")) {
942
av_log(avctx, AV_LOG_ERROR, "ignoring snd_ chunk length:%d\n",
943
buf_size);
944
} else {
945
av_log(avctx, AV_LOG_ERROR, "ignoring unknown chunk length:%d\n",
946
buf_size);
947
}
948
949
picture->key_frame = picture->pict_type == AV_PICTURE_TYPE_I;
950
951
av_image_copy_plane(picture->data[0], picture->linesize[0],
952
(const uint8_t*)f->frame_buffer, avctx->width * 2,
953
avctx->width * 2, avctx->height);
954
FFSWAP(uint16_t *, f->frame_buffer, f->last_frame_buffer);
955
956
*got_frame = 1;
957
958
emms_c();
959
960
return buf_size;
961
}
962
963
static av_cold int decode_end(AVCodecContext *avctx)
964
{
965
FourXContext * const f = avctx->priv_data;
966
int i;
967
968
av_freep(&f->frame_buffer);
969
av_freep(&f->last_frame_buffer);
970
av_freep(&f->bitstream_buffer);
971
f->bitstream_buffer_size = 0;
972
for (i = 0; i < CFRAME_BUFFER_COUNT; i++) {
973
av_freep(&f->cfrm[i].data);
974
f->cfrm[i].allocated_size = 0;
975
}
976
ff_free_vlc(&f->pre_vlc);
977
978
return 0;
979
}
980
981
static av_cold int decode_init(AVCodecContext *avctx)
982
{
983
FourXContext * const f = avctx->priv_data;
984
int ret;
985
986
if (avctx->extradata_size != 4 || !avctx->extradata) {
987
av_log(avctx, AV_LOG_ERROR, "extradata wrong or missing\n");
988
return AVERROR_INVALIDDATA;
989
}
990
if((avctx->width % 16) || (avctx->height % 16)) {
991
av_log(avctx, AV_LOG_ERROR, "unsupported width/height\n");
992
return AVERROR_INVALIDDATA;
993
}
994
995
ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
996
if (ret < 0)
997
return ret;
998
999
f->frame_buffer = av_mallocz(avctx->width * avctx->height * 2);
1000
f->last_frame_buffer = av_mallocz(avctx->width * avctx->height * 2);
1001
if (!f->frame_buffer || !f->last_frame_buffer) {
1002
decode_end(avctx);
1003
return AVERROR(ENOMEM);
1004
}
1005
1006
f->version = AV_RL32(avctx->extradata) >> 16;
1007
ff_blockdsp_init(&f->bdsp, avctx);
1008
ff_bswapdsp_init(&f->bbdsp);
1009
f->avctx = avctx;
1010
init_vlcs(f);
1011
1012
if (f->version > 2)
1013
avctx->pix_fmt = AV_PIX_FMT_RGB565;
1014
else
1015
avctx->pix_fmt = AV_PIX_FMT_BGR555;
1016
1017
return 0;
1018
}
1019
1020
AVCodec ff_fourxm_decoder = {
1021
.name = "4xm",
1022
.long_name = NULL_IF_CONFIG_SMALL("4X Movie"),
1023
.type = AVMEDIA_TYPE_VIDEO,
1024
.id = AV_CODEC_ID_4XM,
1025
.priv_data_size = sizeof(FourXContext),
1026
.init = decode_init,
1027
.close = decode_end,
1028
.decode = decode_frame,
1029
.capabilities = AV_CODEC_CAP_DR1,
1030
};
1031
1032