]> git.sesse.net Git - ffmpeg/blob - libavcodec/4xm.c
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / libavcodec / 4xm.c
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 "libavutil/intreadwrite.h"
28 #include "avcodec.h"
29 #include "dsputil.h"
30 #include "get_bits.h"
31 #include "bytestream.h"
32
33 //#undef NDEBUG
34 //#include <assert.h>
35
36 #define BLOCK_TYPE_VLC_BITS 5
37 #define ACDC_VLC_BITS 9
38
39 #define CFRAME_BUFFER_COUNT 100
40
41 static const uint8_t block_type_tab[2][4][8][2]={
42  {
43   {   //{8,4,2}x{8,4,2}
44     { 0,1}, { 2,2}, { 6,3}, {14,4}, {30,5}, {31,5}, { 0,0}
45   },{ //{8,4}x1
46     { 0,1}, { 0,0}, { 2,2}, { 6,3}, {14,4}, {15,4}, { 0,0}
47   },{ //1x{8,4}
48     { 0,1}, { 2,2}, { 0,0}, { 6,3}, {14,4}, {15,4}, { 0,0}
49   },{ //1x2, 2x1
50     { 0,1}, { 0,0}, { 0,0}, { 2,2}, { 6,3}, {14,4}, {15,4}
51   }
52  },{
53   {  //{8,4,2}x{8,4,2}
54     { 1,2}, { 4,3}, { 5,3}, {0,2}, {6,3}, {7,3}, {0,0}
55   },{//{8,4}x1
56     { 1,2}, { 0,0}, { 2,2}, {0,2}, {6,3}, {7,3}, {0,0}
57   },{//1x{8,4}
58     { 1,2}, { 2,2}, { 0,0}, {0,2}, {6,3}, {7,3}, {0,0}
59   },{//1x2, 2x1
60     { 1,2}, { 0,0}, { 0,0}, {0,2}, {2,2}, {6,3}, {7,3}
61   }
62  }
63 };
64
65 static const uint8_t size2index[4][4]={
66   {-1, 3, 1, 1},
67   { 3, 0, 0, 0},
68   { 2, 0, 0, 0},
69   { 2, 0, 0, 0},
70 };
71
72 static const int8_t mv[256][2]={
73 {  0,  0},{  0, -1},{ -1,  0},{  1,  0},{  0,  1},{ -1, -1},{  1, -1},{ -1,  1},
74 {  1,  1},{  0, -2},{ -2,  0},{  2,  0},{  0,  2},{ -1, -2},{  1, -2},{ -2, -1},
75 {  2, -1},{ -2,  1},{  2,  1},{ -1,  2},{  1,  2},{ -2, -2},{  2, -2},{ -2,  2},
76 {  2,  2},{  0, -3},{ -3,  0},{  3,  0},{  0,  3},{ -1, -3},{  1, -3},{ -3, -1},
77 {  3, -1},{ -3,  1},{  3,  1},{ -1,  3},{  1,  3},{ -2, -3},{  2, -3},{ -3, -2},
78 {  3, -2},{ -3,  2},{  3,  2},{ -2,  3},{  2,  3},{  0, -4},{ -4,  0},{  4,  0},
79 {  0,  4},{ -1, -4},{  1, -4},{ -4, -1},{  4, -1},{  4,  1},{ -1,  4},{  1,  4},
80 { -3, -3},{ -3,  3},{  3,  3},{ -2, -4},{ -4, -2},{  4, -2},{ -4,  2},{ -2,  4},
81 {  2,  4},{ -3, -4},{  3, -4},{  4, -3},{ -5,  0},{ -4,  3},{ -3,  4},{  3,  4},
82 { -1, -5},{ -5, -1},{ -5,  1},{ -1,  5},{ -2, -5},{  2, -5},{  5, -2},{  5,  2},
83 { -4, -4},{ -4,  4},{ -3, -5},{ -5, -3},{ -5,  3},{  3,  5},{ -6,  0},{  0,  6},
84 { -6, -1},{ -6,  1},{  1,  6},{  2, -6},{ -6,  2},{  2,  6},{ -5, -4},{  5,  4},
85 {  4,  5},{ -6, -3},{  6,  3},{ -7,  0},{ -1, -7},{  5, -5},{ -7,  1},{ -1,  7},
86 {  4, -6},{  6,  4},{ -2, -7},{ -7,  2},{ -3, -7},{  7, -3},{  3,  7},{  6, -5},
87 {  0, -8},{ -1, -8},{ -7, -4},{ -8,  1},{  4,  7},{  2, -8},{ -2,  8},{  6,  6},
88 { -8,  3},{  5, -7},{ -5,  7},{  8, -4},{  0, -9},{ -9, -1},{  1,  9},{  7, -6},
89 { -7,  6},{ -5, -8},{ -5,  8},{ -9,  3},{  9, -4},{  7, -7},{  8, -6},{  6,  8},
90 { 10,  1},{-10,  2},{  9, -5},{ 10, -3},{ -8, -7},{-10, -4},{  6, -9},{-11,  0},
91 { 11,  1},{-11, -2},{ -2, 11},{  7, -9},{ -7,  9},{ 10,  6},{ -4, 11},{  8, -9},
92 {  8,  9},{  5, 11},{  7,-10},{ 12, -3},{ 11,  6},{ -9, -9},{  8, 10},{  5, 12},
93 {-11,  7},{ 13,  2},{  6,-12},{ 10,  9},{-11,  8},{ -7, 12},{  0, 14},{ 14, -2},
94 { -9, 11},{ -6, 13},{-14, -4},{ -5,-14},{  5, 14},{-15, -1},{-14, -6},{  3,-15},
95 { 11,-11},{ -7, 14},{ -5, 15},{  8,-14},{ 15,  6},{  3, 16},{  7,-15},{-16,  5},
96 {  0, 17},{-16, -6},{-10, 14},{-16,  7},{ 12, 13},{-16,  8},{-17,  6},{-18,  3},
97 { -7, 17},{ 15, 11},{ 16, 10},{  2,-19},{  3,-19},{-11,-16},{-18,  8},{-19, -6},
98 {  2,-20},{-17,-11},{-10,-18},{  8, 19},{-21, -1},{-20,  7},{ -4, 21},{ 21,  5},
99 { 15, 16},{  2,-22},{-10,-20},{-22,  5},{ 20,-11},{ -7,-22},{-12, 20},{ 23, -5},
100 { 13,-20},{ 24, -2},{-15, 19},{-11, 22},{ 16, 19},{ 23,-10},{-18,-18},{ -9,-24},
101 { 24,-10},{ -3, 26},{-23, 13},{-18,-20},{ 17, 21},{ -4, 27},{ 27,  6},{  1,-28},
102 {-11, 26},{-17,-23},{  7, 28},{ 11,-27},{ 29,  5},{-23,-19},{-28,-11},{-21, 22},
103 {-30,  7},{-17, 26},{-27, 16},{ 13, 29},{ 19,-26},{ 10,-31},{-14,-30},{ 20,-27},
104 {-29, 18},{-16,-31},{-28,-22},{ 21,-30},{-25, 28},{ 26,-29},{ 25,-32},{-32,-32}
105 };
106
107 // this is simply the scaled down elementwise product of the standard jpeg 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,
117 };
118
119 static VLC block_type_vlc[2][4];
120
121
122 typedef struct CFrameBuffer{
123     unsigned int allocated_size;
124     unsigned int size;
125     int id;
126     uint8_t *data;
127 }CFrameBuffer;
128
129 typedef struct FourXContext{
130     AVCodecContext *avctx;
131     DSPContext dsp;
132     AVFrame current_picture, last_picture;
133     GetBitContext pre_gb;          ///< ac/dc prefix
134     GetBitContext gb;
135     GetByteContext g;
136     GetByteContext g2;
137     int mv[256];
138     VLC pre_vlc;
139     int last_dc;
140     DECLARE_ALIGNED(16, DCTELEM, block)[6][64];
141     void *bitstream_buffer;
142     unsigned int bitstream_buffer_size;
143     int version;
144     CFrameBuffer cfrm[CFRAME_BUFFER_COUNT];
145 } FourXContext;
146
147
148 #define FIX_1_082392200  70936
149 #define FIX_1_414213562  92682
150 #define FIX_1_847759065 121095
151 #define FIX_2_613125930 171254
152
153 #define MULTIPLY(var,const)  (((var)*(const)) >> 16)
154
155 static void idct(DCTELEM block[64]){
156     int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
157     int tmp10, tmp11, tmp12, tmp13;
158     int z5, z10, z11, z12, z13;
159     int i;
160     int temp[64];
161
162     for(i=0; i<8; i++){
163         tmp10 = block[8*0 + i] + block[8*4 + i];
164         tmp11 = block[8*0 + i] - block[8*4 + i];
165
166         tmp13 =          block[8*2 + i] + block[8*6 + i];
167         tmp12 = MULTIPLY(block[8*2 + i] - block[8*6 + i], FIX_1_414213562) - tmp13;
168
169         tmp0 = tmp10 + tmp13;
170         tmp3 = tmp10 - tmp13;
171         tmp1 = tmp11 + tmp12;
172         tmp2 = tmp11 - tmp12;
173
174         z13 = block[8*5 + i] + block[8*3 + i];
175         z10 = block[8*5 + i] - block[8*3 + i];
176         z11 = block[8*1 + i] + block[8*7 + i];
177         z12 = block[8*1 + i] - block[8*7 + i];
178
179         tmp7  =          z11 + z13;
180         tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
181
182         z5    = MULTIPLY(z10 + z12, FIX_1_847759065);
183         tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
184         tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
185
186         tmp6 = tmp12 - tmp7;
187         tmp5 = tmp11 - tmp6;
188         tmp4 = tmp10 + tmp5;
189
190         temp[8*0 + i] = tmp0 + tmp7;
191         temp[8*7 + i] = tmp0 - tmp7;
192         temp[8*1 + i] = tmp1 + tmp6;
193         temp[8*6 + i] = tmp1 - tmp6;
194         temp[8*2 + i] = tmp2 + tmp5;
195         temp[8*5 + i] = tmp2 - tmp5;
196         temp[8*4 + i] = tmp3 + tmp4;
197         temp[8*3 + i] = tmp3 - tmp4;
198     }
199
200     for(i=0; i<8*8; i+=8){
201         tmp10 = temp[0 + i] + temp[4 + i];
202         tmp11 = temp[0 + i] - temp[4 + i];
203
204         tmp13 = temp[2 + i] + temp[6 + i];
205         tmp12 = MULTIPLY(temp[2 + i] - temp[6 + i], FIX_1_414213562) - tmp13;
206
207         tmp0 = tmp10 + tmp13;
208         tmp3 = tmp10 - tmp13;
209         tmp1 = tmp11 + tmp12;
210         tmp2 = tmp11 - tmp12;
211
212         z13 = temp[5 + i] + temp[3 + i];
213         z10 = temp[5 + i] - temp[3 + i];
214         z11 = temp[1 + i] + temp[7 + i];
215         z12 = temp[1 + i] - temp[7 + i];
216
217         tmp7 = z11 + z13;
218         tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562);
219
220         z5 = MULTIPLY(z10 + z12, FIX_1_847759065);
221         tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5;
222         tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5;
223
224         tmp6 = tmp12 - tmp7;
225         tmp5 = tmp11 - tmp6;
226         tmp4 = tmp10 + tmp5;
227
228         block[0 + i] = (tmp0 + tmp7)>>6;
229         block[7 + i] = (tmp0 - tmp7)>>6;
230         block[1 + i] = (tmp1 + tmp6)>>6;
231         block[6 + i] = (tmp1 - tmp6)>>6;
232         block[2 + i] = (tmp2 + tmp5)>>6;
233         block[5 + i] = (tmp2 - tmp5)>>6;
234         block[4 + i] = (tmp3 + tmp4)>>6;
235         block[3 + i] = (tmp3 - tmp4)>>6;
236     }
237 }
238
239 static av_cold void init_vlcs(FourXContext *f){
240     static VLC_TYPE table[8][32][2];
241     int i;
242
243     for(i=0; i<8; i++){
244         block_type_vlc[0][i].table= table[i];
245         block_type_vlc[0][i].table_allocated= 32;
246         init_vlc(&block_type_vlc[0][i], BLOCK_TYPE_VLC_BITS, 7,
247                  &block_type_tab[0][i][0][1], 2, 1,
248                  &block_type_tab[0][i][0][0], 2, 1, INIT_VLC_USE_NEW_STATIC);
249     }
250 }
251
252 static void init_mv(FourXContext *f){
253     int i;
254
255     for(i=0; i<256; i++){
256         if(f->version>1)
257             f->mv[i] = mv[i][0]   + mv[i][1]  *f->current_picture.linesize[0]/2;
258         else
259             f->mv[i] = (i&15) - 8 + ((i>>4)-8)*f->current_picture.linesize[0]/2;
260     }
261 }
262
263 #if HAVE_BIGENDIAN
264 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
265     { \
266         unsigned tmpval = AV_RN32(src);                 \
267         tmpval = (tmpval <<  16) | (tmpval >>  16);     \
268         tmpval = tmpval * (scale) + (dc);               \
269         tmpval = (tmpval <<  16) | (tmpval >>  16);     \
270         AV_WN32A(dst, tmpval);                          \
271     }
272 #else
273 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
274     { \
275         unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
276         AV_WN32A(dst, tmpval);                           \
277     }
278 #endif
279
280 static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stride, int scale, unsigned dc){
281    int i;
282    dc*= 0x10001;
283
284    switch(log2w){
285    case 0:
286         for(i=0; i<h; i++){
287             dst[0] = scale*src[0] + dc;
288             if(scale) src += stride;
289             dst += stride;
290         }
291         break;
292     case 1:
293         for(i=0; i<h; i++){
294             LE_CENTRIC_MUL(dst, src, scale, dc);
295             if(scale) src += stride;
296             dst += stride;
297         }
298         break;
299     case 2:
300         for(i=0; i<h; i++){
301             LE_CENTRIC_MUL(dst,     src,     scale, dc);
302             LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc);
303             if(scale) src += stride;
304             dst += stride;
305         }
306         break;
307     case 3:
308         for(i=0; i<h; i++){
309             LE_CENTRIC_MUL(dst,     src,     scale, dc);
310             LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc);
311             LE_CENTRIC_MUL(dst + 4, src + 4, scale, dc);
312             LE_CENTRIC_MUL(dst + 6, src + 6, scale, dc);
313             if(scale) src += stride;
314             dst += stride;
315         }
316         break;
317     default: assert(0);
318     }
319 }
320
321 static void decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src, int log2w, int log2h, int stride){
322     const int index= size2index[log2h][log2w];
323     const int h= 1<<log2h;
324     int code= get_vlc2(&f->gb, block_type_vlc[1-(f->version>1)][index].table, BLOCK_TYPE_VLC_BITS, 1);
325     uint16_t *start= (uint16_t*)f->last_picture.data[0];
326     uint16_t *end= start + stride*(f->avctx->height-h+1) - (1<<log2w);
327
328     assert(code>=0 && code<=6);
329
330     if(code == 0){
331         if (f->g.buffer_end - f->g.buffer < 1){
332             av_log(f->avctx, AV_LOG_ERROR, "bytestream overread\n");
333             return;
334         }
335         src += f->mv[ *f->g.buffer++ ];
336         if(start > src || src > end){
337             av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
338             return;
339         }
340         mcdc(dst, src, log2w, h, stride, 1, 0);
341     }else if(code == 1){
342         log2h--;
343         decode_p_block(f, dst                  , src                  , log2w, log2h, stride);
344         decode_p_block(f, dst + (stride<<log2h), src + (stride<<log2h), log2w, log2h, stride);
345     }else if(code == 2){
346         log2w--;
347         decode_p_block(f, dst             , src             , log2w, log2h, stride);
348         decode_p_block(f, dst + (1<<log2w), src + (1<<log2w), log2w, log2h, stride);
349     }else if(code == 3 && f->version<2){
350         mcdc(dst, src, log2w, h, stride, 1, 0);
351     }else if(code == 4){
352         if (f->g.buffer_end - f->g.buffer < 1){
353             av_log(f->avctx, AV_LOG_ERROR, "bytestream overread\n");
354             return;
355         }
356         src += f->mv[ *f->g.buffer++ ];
357         if(start > src || src > end){
358             av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
359             return;
360         }
361         if (f->g2.buffer_end - f->g2.buffer < 1){
362             av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
363             return;
364         }
365         mcdc(dst, src, log2w, h, stride, 1, bytestream2_get_le16(&f->g2));
366     }else if(code == 5){
367         if (f->g2.buffer_end - f->g2.buffer < 1){
368             av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
369             return;
370         }
371         mcdc(dst, src, log2w, h, stride, 0, bytestream2_get_le16(&f->g2));
372     }else if(code == 6){
373         if (f->g2.buffer_end - f->g2.buffer < 2){
374             av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
375             return;
376         }
377         if(log2w){
378             dst[0] = bytestream2_get_le16(&f->g2);
379             dst[1] = bytestream2_get_le16(&f->g2);
380         }else{
381             dst[0     ] = bytestream2_get_le16(&f->g2);
382             dst[stride] = bytestream2_get_le16(&f->g2);
383         }
384     }
385 }
386
387 static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length){
388     int x, y;
389     const int width= f->avctx->width;
390     const int height= f->avctx->height;
391     uint16_t *src= (uint16_t*)f->last_picture.data[0];
392     uint16_t *dst= (uint16_t*)f->current_picture.data[0];
393     const int stride= f->current_picture.linesize[0]>>1;
394     unsigned int bitstream_size, bytestream_size, wordstream_size, extra, bytestream_offset, wordstream_offset;
395
396     if(f->version>1){
397         extra=20;
398         if (length < extra)
399             return -1;
400         bitstream_size= AV_RL32(buf+8);
401         wordstream_size= AV_RL32(buf+12);
402         bytestream_size= AV_RL32(buf+16);
403     }else{
404         extra=0;
405         bitstream_size = AV_RL16(buf-4);
406         wordstream_size= AV_RL16(buf-2);
407         bytestream_size= FFMAX(length - bitstream_size - wordstream_size, 0);
408     }
409
410     if (bitstream_size > length ||
411         bytestream_size > length - bitstream_size ||
412         wordstream_size > length - bytestream_size - bitstream_size ||
413         extra > length - bytestream_size - bitstream_size - wordstream_size){
414         av_log(f->avctx, AV_LOG_ERROR, "lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
415         bitstream_size+ bytestream_size+ wordstream_size - length);
416         return -1;
417     }
418
419     av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
420     if (!f->bitstream_buffer)
421         return AVERROR(ENOMEM);
422     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra), bitstream_size/4);
423     memset((uint8_t*)f->bitstream_buffer + bitstream_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
424     init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size);
425
426     wordstream_offset = extra + bitstream_size;
427     bytestream_offset = extra + bitstream_size + wordstream_size;
428     bytestream2_init(&f->g2, buf + wordstream_offset, length - wordstream_offset);
429     bytestream2_init(&f->g,  buf + bytestream_offset, length - bytestream_offset);
430
431     init_mv(f);
432
433     for(y=0; y<height; y+=8){
434         for(x=0; x<width; x+=8){
435             decode_p_block(f, dst + x, src + x, 3, 3, stride);
436         }
437         src += 8*stride;
438         dst += 8*stride;
439     }
440
441     return 0;
442 }
443
444 /**
445  * decode block and dequantize.
446  * Note this is almost identical to MJPEG.
447  */
448 static int decode_i_block(FourXContext *f, DCTELEM *block){
449     int code, i, j, level, val;
450
451     if(get_bits_left(&f->gb) < 2){
452         av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->gb));
453         return -1;
454     }
455
456     /* DC coef */
457     val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
458     if (val>>4){
459         av_log(f->avctx, AV_LOG_ERROR, "error dc run != 0\n");
460     }
461
462     if(val)
463         val = get_xbits(&f->gb, val);
464
465     val = val * dequant_table[0] + f->last_dc;
466     f->last_dc =
467     block[0] = val;
468     /* AC coefs */
469     i = 1;
470     for(;;) {
471         code = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
472
473         /* EOB */
474         if (code == 0)
475             break;
476         if (code == 0xf0) {
477             i += 16;
478         } else {
479             level = get_xbits(&f->gb, code & 0xf);
480             i += code >> 4;
481             if (i >= 64) {
482                 av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
483                 return 0;
484             }
485
486             j= ff_zigzag_direct[i];
487             block[j] = level * dequant_table[j];
488             i++;
489             if (i >= 64)
490                 break;
491         }
492     }
493
494     return 0;
495 }
496
497 static inline void idct_put(FourXContext *f, int x, int y){
498     DCTELEM (*block)[64]= f->block;
499     int stride= f->current_picture.linesize[0]>>1;
500     int i;
501     uint16_t *dst = ((uint16_t*)f->current_picture.data[0]) + y * stride + x;
502
503     for(i=0; i<4; i++){
504         block[i][0] += 0x80*8*8;
505         idct(block[i]);
506     }
507
508     if(!(f->avctx->flags&CODEC_FLAG_GRAY)){
509         for(i=4; i<6; i++) idct(block[i]);
510     }
511
512 /* Note transform is:
513 y= ( 1b + 4g + 2r)/14
514 cb=( 3b - 2g - 1r)/14
515 cr=(-1b - 4g + 5r)/14
516 */
517     for(y=0; y<8; y++){
518         for(x=0; x<8; x++){
519             DCTELEM *temp= block[(x>>2) + 2*(y>>2)] + 2*(x&3) + 2*8*(y&3); //FIXME optimize
520             int cb= block[4][x + 8*y];
521             int cr= block[5][x + 8*y];
522             int cg= (cb + cr)>>1;
523             int y;
524
525             cb+=cb;
526
527             y = temp[0];
528             dst[0       ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
529             y = temp[1];
530             dst[1       ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
531             y = temp[8];
532             dst[  stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
533             y = temp[9];
534             dst[1+stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
535             dst += 2;
536         }
537         dst += 2*stride - 2*8;
538     }
539 }
540
541 static int decode_i_mb(FourXContext *f){
542     int i;
543
544     f->dsp.clear_blocks(f->block[0]);
545
546     for(i=0; i<6; i++){
547         if(decode_i_block(f, f->block[i]) < 0)
548             return -1;
549     }
550
551     return 0;
552 }
553
554 static const uint8_t *read_huffman_tables(FourXContext *f, const uint8_t * const buf, int buf_size){
555     int frequency[512];
556     uint8_t flag[512];
557     int up[512];
558     uint8_t len_tab[257];
559     int bits_tab[257];
560     int start, end;
561     const uint8_t *ptr= buf;
562     const uint8_t *ptr_end = buf + buf_size;
563     int j;
564
565     memset(frequency, 0, sizeof(frequency));
566     memset(up, -1, sizeof(up));
567
568     start= *ptr++;
569     end= *ptr++;
570     for(;;){
571         int i;
572
573         if (start <= end && ptr_end - ptr < end - start + 1 + 1)
574             return NULL;
575         for(i=start; i<=end; i++){
576             frequency[i]= *ptr++;
577         }
578         start= *ptr++;
579         if(start==0) break;
580
581         end= *ptr++;
582     }
583     frequency[256]=1;
584
585     while((ptr - buf)&3) ptr++; // 4byte align
586
587     for(j=257; j<512; j++){
588         int min_freq[2]= {256*256, 256*256};
589         int smallest[2]= {0, 0};
590         int i;
591         for(i=0; i<j; i++){
592             if(frequency[i] == 0) continue;
593             if(frequency[i] < min_freq[1]){
594                 if(frequency[i] < min_freq[0]){
595                     min_freq[1]= min_freq[0]; smallest[1]= smallest[0];
596                     min_freq[0]= frequency[i];smallest[0]= i;
597                 }else{
598                     min_freq[1]= frequency[i];smallest[1]= i;
599                 }
600             }
601         }
602         if(min_freq[1] == 256*256) break;
603
604         frequency[j]= min_freq[0] + min_freq[1];
605         flag[ smallest[0] ]= 0;
606         flag[ smallest[1] ]= 1;
607         up[ smallest[0] ]=
608         up[ smallest[1] ]= j;
609         frequency[ smallest[0] ]= frequency[ smallest[1] ]= 0;
610     }
611
612     for(j=0; j<257; j++){
613         int node;
614         int len=0;
615         int bits=0;
616
617         for(node= j; up[node] != -1; node= up[node]){
618             bits += flag[node]<<len;
619             len++;
620             if(len > 31) av_log(f->avctx, AV_LOG_ERROR, "vlc length overflow\n"); //can this happen at all ?
621         }
622
623         bits_tab[j]= bits;
624         len_tab[j]= len;
625     }
626
627     if (init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257,
628                  len_tab , 1, 1,
629                  bits_tab, 4, 4, 0))
630         return NULL;
631
632     return ptr;
633 }
634
635 static int mix(int c0, int c1){
636     int blue = 2*(c0&0x001F) + (c1&0x001F);
637     int green= (2*(c0&0x03E0) + (c1&0x03E0))>>5;
638     int red  = 2*(c0>>10) + (c1>>10);
639     return red/3*1024 + green/3*32 + blue/3;
640 }
641
642 static int decode_i2_frame(FourXContext *f, const uint8_t *buf, int length){
643     int x, y, x2, y2;
644     const int width= f->avctx->width;
645     const int height= f->avctx->height;
646     uint16_t *dst= (uint16_t*)f->current_picture.data[0];
647     const int stride= f->current_picture.linesize[0]>>1;
648     const uint8_t *buf_end = buf + length;
649
650     for(y=0; y<height; y+=16){
651         for(x=0; x<width; x+=16){
652             unsigned int color[4], bits;
653             if (buf_end - buf < 8)
654                 return -1;
655             memset(color, 0, sizeof(color));
656 //warning following is purely guessed ...
657             color[0]= bytestream_get_le16(&buf);
658             color[1]= bytestream_get_le16(&buf);
659
660             if(color[0]&0x8000) av_log(NULL, AV_LOG_ERROR, "unk bit 1\n");
661             if(color[1]&0x8000) av_log(NULL, AV_LOG_ERROR, "unk bit 2\n");
662
663             color[2]= mix(color[0], color[1]);
664             color[3]= mix(color[1], color[0]);
665
666             bits= bytestream_get_le32(&buf);
667             for(y2=0; y2<16; y2++){
668                 for(x2=0; x2<16; x2++){
669                     int index= 2*(x2>>2) + 8*(y2>>2);
670                     dst[y2*stride+x2]= color[(bits>>index)&3];
671                 }
672             }
673             dst+=16;
674         }
675         dst += 16*stride - width;
676     }
677
678     return 0;
679 }
680
681 static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){
682     int x, y;
683     const int width= f->avctx->width;
684     const int height= f->avctx->height;
685     uint16_t *dst= (uint16_t*)f->current_picture.data[0];
686     const int stride= f->current_picture.linesize[0]>>1;
687     const unsigned int bitstream_size= AV_RL32(buf);
688     unsigned int prestream_size;
689     const uint8_t *prestream;
690
691     if (bitstream_size > (1<<26) || length < bitstream_size + 12) {
692         av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
693         return AVERROR_INVALIDDATA;
694     }
695
696     prestream_size = 4 * AV_RL32(buf + bitstream_size + 4);
697     prestream      = buf + bitstream_size + 12;
698
699     if (prestream_size > (1<<26) ||
700         prestream_size != length - (bitstream_size + 12)){
701         av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d %d\n", prestream_size, bitstream_size, length);
702         return -1;
703     }
704
705     prestream= read_huffman_tables(f, prestream, buf + length - prestream);
706     if (!prestream)
707         return -1;
708
709     init_get_bits(&f->gb, buf + 4, 8*bitstream_size);
710
711     prestream_size= length + buf - prestream;
712
713     av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
714     if (!f->bitstream_buffer)
715         return AVERROR(ENOMEM);
716     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream, prestream_size/4);
717     memset((uint8_t*)f->bitstream_buffer + prestream_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
718     init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size);
719
720     f->last_dc= 0*128*8*8;
721
722     for(y=0; y<height; y+=16){
723         for(x=0; x<width; x+=16){
724             if(decode_i_mb(f) < 0)
725                 return -1;
726
727             idct_put(f, x, y);
728         }
729         dst += 16*stride;
730     }
731
732     if(get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
733         av_log(f->avctx, AV_LOG_ERROR, "end mismatch\n");
734
735     return 0;
736 }
737
738 static int decode_frame(AVCodecContext *avctx,
739                         void *data, int *data_size,
740                         AVPacket *avpkt)
741 {
742     const uint8_t *buf = avpkt->data;
743     int buf_size = avpkt->size;
744     FourXContext * const f = avctx->priv_data;
745     AVFrame *picture = data;
746     AVFrame *p, temp;
747     int i, frame_4cc, frame_size;
748
749     if (buf_size < 12)
750         return AVERROR_INVALIDDATA;
751     frame_4cc= AV_RL32(buf);
752     if(buf_size != AV_RL32(buf+4)+8 || buf_size < 20){
753         av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d\n", buf_size, AV_RL32(buf+4));
754     }
755
756     if(frame_4cc == AV_RL32("cfrm")){
757         int free_index=-1;
758         const int data_size= buf_size - 20;
759         const int id= AV_RL32(buf+12);
760         const int whole_size= AV_RL32(buf+16);
761         CFrameBuffer *cfrm;
762
763         if (data_size < 0 || whole_size < 0){
764             av_log(f->avctx, AV_LOG_ERROR, "sizes invalid\n");
765             return AVERROR_INVALIDDATA;
766         }
767
768         for(i=0; i<CFRAME_BUFFER_COUNT; i++){
769             if(f->cfrm[i].id && f->cfrm[i].id < avctx->frame_number)
770                 av_log(f->avctx, AV_LOG_ERROR, "lost c frame %d\n", f->cfrm[i].id);
771         }
772
773         for(i=0; i<CFRAME_BUFFER_COUNT; i++){
774             if(f->cfrm[i].id   == id) break;
775             if(f->cfrm[i].size == 0 ) free_index= i;
776         }
777
778         if(i>=CFRAME_BUFFER_COUNT){
779             i= free_index;
780             f->cfrm[i].id= id;
781         }
782         cfrm= &f->cfrm[i];
783
784         if (data_size > UINT_MAX -  cfrm->size - FF_INPUT_BUFFER_PADDING_SIZE)
785             return AVERROR_INVALIDDATA;
786         cfrm->data= av_fast_realloc(cfrm->data, &cfrm->allocated_size, cfrm->size + data_size + FF_INPUT_BUFFER_PADDING_SIZE);
787         if(!cfrm->data){ //explicit check needed as memcpy below might not catch a NULL
788             av_log(f->avctx, AV_LOG_ERROR, "realloc falure");
789             return -1;
790         }
791
792         memcpy(cfrm->data + cfrm->size, buf+20, data_size);
793         cfrm->size += data_size;
794
795         if(cfrm->size >= whole_size){
796             buf= cfrm->data;
797             frame_size= cfrm->size;
798
799             if(id != avctx->frame_number){
800                 av_log(f->avctx, AV_LOG_ERROR, "cframe id mismatch %d %d\n", id, avctx->frame_number);
801             }
802
803             cfrm->size= cfrm->id= 0;
804             frame_4cc= AV_RL32("pfrm");
805         }else
806             return buf_size;
807     }else{
808         buf= buf + 12;
809         frame_size= buf_size - 12;
810     }
811
812     temp= f->current_picture;
813     f->current_picture= f->last_picture;
814     f->last_picture= temp;
815
816     p= &f->current_picture;
817     avctx->coded_frame= p;
818
819     avctx->flags |= CODEC_FLAG_EMU_EDGE; // alternatively we would have to use our own buffer management
820
821     p->reference= 3;
822     if (avctx->reget_buffer(avctx, p) < 0) {
823         av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
824         return -1;
825     }
826
827     if(frame_4cc == AV_RL32("ifr2")){
828         p->pict_type= AV_PICTURE_TYPE_I;
829         if(decode_i2_frame(f, buf-4, frame_size+4) < 0){
830             av_log(f->avctx, AV_LOG_ERROR, "decode i2 frame failed\n");
831             return -1;
832         }
833     }else if(frame_4cc == AV_RL32("ifrm")){
834         p->pict_type= AV_PICTURE_TYPE_I;
835         if(decode_i_frame(f, buf, frame_size) < 0){
836             av_log(f->avctx, AV_LOG_ERROR, "decode i frame failed\n");
837             return -1;
838         }
839     }else if(frame_4cc == AV_RL32("pfrm") || frame_4cc == AV_RL32("pfr2")){
840         if(!f->last_picture.data[0]){
841             f->last_picture.reference= 3;
842             if(avctx->get_buffer(avctx, &f->last_picture) < 0){
843                 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
844                 return -1;
845             }
846         }
847
848         p->pict_type= AV_PICTURE_TYPE_P;
849         if(decode_p_frame(f, buf, frame_size) < 0){
850             av_log(f->avctx, AV_LOG_ERROR, "decode p frame failed\n");
851             return -1;
852         }
853     }else if(frame_4cc == AV_RL32("snd_")){
854         av_log(avctx, AV_LOG_ERROR, "ignoring snd_ chunk length:%d\n", buf_size);
855     }else{
856         av_log(avctx, AV_LOG_ERROR, "ignoring unknown chunk length:%d\n", buf_size);
857     }
858
859     p->key_frame= p->pict_type == AV_PICTURE_TYPE_I;
860
861     *picture= *p;
862     *data_size = sizeof(AVPicture);
863
864     emms_c();
865
866     return buf_size;
867 }
868
869
870 static av_cold void common_init(AVCodecContext *avctx){
871     FourXContext * const f = avctx->priv_data;
872
873     dsputil_init(&f->dsp, avctx);
874
875     f->avctx= avctx;
876 }
877
878 static av_cold int decode_init(AVCodecContext *avctx){
879     FourXContext * const f = avctx->priv_data;
880
881     if(avctx->extradata_size != 4 || !avctx->extradata) {
882         av_log(avctx, AV_LOG_ERROR, "extradata wrong or missing\n");
883         return 1;
884     }
885     if((avctx->width % 16) || (avctx->height % 16)) {
886         av_log(avctx, AV_LOG_ERROR, "unsupported width/height\n");
887         return AVERROR_INVALIDDATA;
888     }
889
890     avcodec_get_frame_defaults(&f->current_picture);
891     avcodec_get_frame_defaults(&f->last_picture);
892     f->version= AV_RL32(avctx->extradata)>>16;
893     common_init(avctx);
894     init_vlcs(f);
895
896     if(f->version>2) avctx->pix_fmt= PIX_FMT_RGB565;
897     else             avctx->pix_fmt= PIX_FMT_BGR555;
898
899     return 0;
900 }
901
902
903 static av_cold int decode_end(AVCodecContext *avctx){
904     FourXContext * const f = avctx->priv_data;
905     int i;
906
907     av_freep(&f->bitstream_buffer);
908     f->bitstream_buffer_size=0;
909     for(i=0; i<CFRAME_BUFFER_COUNT; i++){
910         av_freep(&f->cfrm[i].data);
911         f->cfrm[i].allocated_size= 0;
912     }
913     free_vlc(&f->pre_vlc);
914     if(f->current_picture.data[0])
915         avctx->release_buffer(avctx, &f->current_picture);
916     if(f->last_picture.data[0])
917         avctx->release_buffer(avctx, &f->last_picture);
918
919     return 0;
920 }
921
922 AVCodec ff_fourxm_decoder = {
923     .name           = "4xm",
924     .type           = AVMEDIA_TYPE_VIDEO,
925     .id             = CODEC_ID_4XM,
926     .priv_data_size = sizeof(FourXContext),
927     .init           = decode_init,
928     .close          = decode_end,
929     .decode         = decode_frame,
930     .capabilities   = CODEC_CAP_DR1,
931     .long_name = NULL_IF_CONFIG_SMALL("4X Movie"),
932 };
933