4xm: remove unused variables.
[ffmpeg.git] / libavcodec / 4xm.c
1 /*
2  * 4XM codec
3  * Copyright (c) 2003 Michael Niedermayer
4  *
5  * This file is part of Libav.
6  *
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.
11  *
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.
16  *
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
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         src += f->mv[bytestream2_get_byte(&f->g)];
332         if(start > src || src > end){
333             av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
334             return;
335         }
336         mcdc(dst, src, log2w, h, stride, 1, 0);
337     }else if(code == 1){
338         log2h--;
339         decode_p_block(f, dst                  , src                  , log2w, log2h, stride);
340         decode_p_block(f, dst + (stride<<log2h), src + (stride<<log2h), log2w, log2h, stride);
341     }else if(code == 2){
342         log2w--;
343         decode_p_block(f, dst             , src             , log2w, log2h, stride);
344         decode_p_block(f, dst + (1<<log2w), src + (1<<log2w), log2w, log2h, stride);
345     }else if(code == 3 && f->version<2){
346         mcdc(dst, src, log2w, h, stride, 1, 0);
347     }else if(code == 4){
348         src += f->mv[bytestream2_get_byte(&f->g)];
349         if(start > src || src > end){
350             av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
351             return;
352         }
353         mcdc(dst, src, log2w, h, stride, 1, bytestream2_get_le16(&f->g2));
354     }else if(code == 5){
355         mcdc(dst, src, log2w, h, stride, 0, bytestream2_get_le16(&f->g2));
356     }else if(code == 6){
357         if(log2w){
358             dst[0] = bytestream2_get_le16(&f->g2);
359             dst[1] = bytestream2_get_le16(&f->g2);
360         }else{
361             dst[0     ] = bytestream2_get_le16(&f->g2);
362             dst[stride] = bytestream2_get_le16(&f->g2);
363         }
364     }
365 }
366
367 static int decode_p_frame(FourXContext *f, const uint8_t *buf, int length){
368     int x, y;
369     const int width= f->avctx->width;
370     const int height= f->avctx->height;
371     uint16_t *src= (uint16_t*)f->last_picture.data[0];
372     uint16_t *dst= (uint16_t*)f->current_picture.data[0];
373     const int stride= f->current_picture.linesize[0]>>1;
374     unsigned int bitstream_size, bytestream_size, wordstream_size, extra, bytestream_offset, wordstream_offset;
375
376     if(f->version>1){
377         extra=20;
378         bitstream_size= AV_RL32(buf+8);
379         wordstream_size= AV_RL32(buf+12);
380         bytestream_size= AV_RL32(buf+16);
381     }else{
382         extra=0;
383         bitstream_size = AV_RL16(buf-4);
384         wordstream_size= AV_RL16(buf-2);
385         bytestream_size= FFMAX(length - bitstream_size - wordstream_size, 0);
386     }
387
388     if(bitstream_size+ bytestream_size+ wordstream_size + extra != length
389        || bitstream_size  > (1<<26)
390        || bytestream_size > (1<<26)
391        || wordstream_size > (1<<26)
392        ){
393         av_log(f->avctx, AV_LOG_ERROR, "lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
394         bitstream_size+ bytestream_size+ wordstream_size - length);
395         return -1;
396     }
397
398     av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE);
399     if (!f->bitstream_buffer)
400         return AVERROR(ENOMEM);
401     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)(buf + extra), bitstream_size/4);
402     memset((uint8_t*)f->bitstream_buffer + bitstream_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
403     init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size);
404
405     wordstream_offset = extra + bitstream_size;
406     bytestream_offset = extra + bitstream_size + wordstream_size;
407     bytestream2_init(&f->g2, buf + wordstream_offset, length - wordstream_offset);
408     bytestream2_init(&f->g,  buf + bytestream_offset, length - bytestream_offset);
409
410     init_mv(f);
411
412     for(y=0; y<height; y+=8){
413         for(x=0; x<width; x+=8){
414             decode_p_block(f, dst + x, src + x, 3, 3, stride);
415         }
416         src += 8*stride;
417         dst += 8*stride;
418     }
419
420     return 0;
421 }
422
423 /**
424  * decode block and dequantize.
425  * Note this is almost identical to MJPEG.
426  */
427 static int decode_i_block(FourXContext *f, DCTELEM *block){
428     int code, i, j, level, val;
429
430     /* DC coef */
431     val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
432     if (val>>4){
433         av_log(f->avctx, AV_LOG_ERROR, "error dc run != 0\n");
434     }
435
436     if(val)
437         val = get_xbits(&f->gb, val);
438
439     val = val * dequant_table[0] + f->last_dc;
440     f->last_dc =
441     block[0] = val;
442     /* AC coefs */
443     i = 1;
444     for(;;) {
445         code = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3);
446
447         /* EOB */
448         if (code == 0)
449             break;
450         if (code == 0xf0) {
451             i += 16;
452         } else {
453             level = get_xbits(&f->gb, code & 0xf);
454             i += code >> 4;
455             if (i >= 64) {
456                 av_log(f->avctx, AV_LOG_ERROR, "run %d oveflow\n", i);
457                 return 0;
458             }
459
460             j= ff_zigzag_direct[i];
461             block[j] = level * dequant_table[j];
462             i++;
463             if (i >= 64)
464                 break;
465         }
466     }
467
468     return 0;
469 }
470
471 static inline void idct_put(FourXContext *f, int x, int y){
472     DCTELEM (*block)[64]= f->block;
473     int stride= f->current_picture.linesize[0]>>1;
474     int i;
475     uint16_t *dst = ((uint16_t*)f->current_picture.data[0]) + y * stride + x;
476
477     for(i=0; i<4; i++){
478         block[i][0] += 0x80*8*8;
479         idct(block[i]);
480     }
481
482     if(!(f->avctx->flags&CODEC_FLAG_GRAY)){
483         for(i=4; i<6; i++) idct(block[i]);
484     }
485
486 /* Note transform is:
487 y= ( 1b + 4g + 2r)/14
488 cb=( 3b - 2g - 1r)/14
489 cr=(-1b - 4g + 5r)/14
490 */
491     for(y=0; y<8; y++){
492         for(x=0; x<8; x++){
493             DCTELEM *temp= block[(x>>2) + 2*(y>>2)] + 2*(x&3) + 2*8*(y&3); //FIXME optimize
494             int cb= block[4][x + 8*y];
495             int cr= block[5][x + 8*y];
496             int cg= (cb + cr)>>1;
497             int y;
498
499             cb+=cb;
500
501             y = temp[0];
502             dst[0       ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
503             y = temp[1];
504             dst[1       ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
505             y = temp[8];
506             dst[  stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
507             y = temp[9];
508             dst[1+stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8);
509             dst += 2;
510         }
511         dst += 2*stride - 2*8;
512     }
513 }
514
515 static int decode_i_mb(FourXContext *f){
516     int i;
517
518     f->dsp.clear_blocks(f->block[0]);
519
520     for(i=0; i<6; i++){
521         if(decode_i_block(f, f->block[i]) < 0)
522             return -1;
523     }
524
525     return 0;
526 }
527
528 static const uint8_t *read_huffman_tables(FourXContext *f, const uint8_t * const buf){
529     int frequency[512];
530     uint8_t flag[512];
531     int up[512];
532     uint8_t len_tab[257];
533     int bits_tab[257];
534     int start, end;
535     const uint8_t *ptr= buf;
536     int j;
537
538     memset(frequency, 0, sizeof(frequency));
539     memset(up, -1, sizeof(up));
540
541     start= *ptr++;
542     end= *ptr++;
543     for(;;){
544         int i;
545
546         for(i=start; i<=end; i++){
547             frequency[i]= *ptr++;
548         }
549         start= *ptr++;
550         if(start==0) break;
551
552         end= *ptr++;
553     }
554     frequency[256]=1;
555
556     while((ptr - buf)&3) ptr++; // 4byte align
557
558     for(j=257; j<512; j++){
559         int min_freq[2]= {256*256, 256*256};
560         int smallest[2]= {0, 0};
561         int i;
562         for(i=0; i<j; i++){
563             if(frequency[i] == 0) continue;
564             if(frequency[i] < min_freq[1]){
565                 if(frequency[i] < min_freq[0]){
566                     min_freq[1]= min_freq[0]; smallest[1]= smallest[0];
567                     min_freq[0]= frequency[i];smallest[0]= i;
568                 }else{
569                     min_freq[1]= frequency[i];smallest[1]= i;
570                 }
571             }
572         }
573         if(min_freq[1] == 256*256) break;
574
575         frequency[j]= min_freq[0] + min_freq[1];
576         flag[ smallest[0] ]= 0;
577         flag[ smallest[1] ]= 1;
578         up[ smallest[0] ]=
579         up[ smallest[1] ]= j;
580         frequency[ smallest[0] ]= frequency[ smallest[1] ]= 0;
581     }
582
583     for(j=0; j<257; j++){
584         int node;
585         int len=0;
586         int bits=0;
587
588         for(node= j; up[node] != -1; node= up[node]){
589             bits += flag[node]<<len;
590             len++;
591             if(len > 31) av_log(f->avctx, AV_LOG_ERROR, "vlc length overflow\n"); //can this happen at all ?
592         }
593
594         bits_tab[j]= bits;
595         len_tab[j]= len;
596     }
597
598     if (init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257,
599                  len_tab , 1, 1,
600                  bits_tab, 4, 4, 0))
601         return NULL;
602
603     return ptr;
604 }
605
606 static int mix(int c0, int c1){
607     int blue = 2*(c0&0x001F) + (c1&0x001F);
608     int green= (2*(c0&0x03E0) + (c1&0x03E0))>>5;
609     int red  = 2*(c0>>10) + (c1>>10);
610     return red/3*1024 + green/3*32 + blue/3;
611 }
612
613 static int decode_i2_frame(FourXContext *f, const uint8_t *buf, int length){
614     int x, y, x2, y2;
615     const int width= f->avctx->width;
616     const int height= f->avctx->height;
617     uint16_t *dst= (uint16_t*)f->current_picture.data[0];
618     const int stride= f->current_picture.linesize[0]>>1;
619
620     for(y=0; y<height; y+=16){
621         for(x=0; x<width; x+=16){
622             unsigned int color[4], bits;
623             memset(color, 0, sizeof(color));
624 //warning following is purely guessed ...
625             color[0]= bytestream_get_le16(&buf);
626             color[1]= bytestream_get_le16(&buf);
627
628             if(color[0]&0x8000) av_log(NULL, AV_LOG_ERROR, "unk bit 1\n");
629             if(color[1]&0x8000) av_log(NULL, AV_LOG_ERROR, "unk bit 2\n");
630
631             color[2]= mix(color[0], color[1]);
632             color[3]= mix(color[1], color[0]);
633
634             bits= bytestream_get_le32(&buf);
635             for(y2=0; y2<16; y2++){
636                 for(x2=0; x2<16; x2++){
637                     int index= 2*(x2>>2) + 8*(y2>>2);
638                     dst[y2*stride+x2]= color[(bits>>index)&3];
639                 }
640             }
641             dst+=16;
642         }
643         dst += 16*stride - width;
644     }
645
646     return 0;
647 }
648
649 static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){
650     int x, y;
651     const int width= f->avctx->width;
652     const int height= f->avctx->height;
653     const unsigned int bitstream_size= AV_RL32(buf);
654     int token_count av_unused;
655     unsigned int prestream_size;
656     const uint8_t *prestream;
657
658     if (length < bitstream_size + 12) {
659         av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
660         return AVERROR_INVALIDDATA;
661     }
662
663     token_count    = AV_RL32(buf + bitstream_size + 8);
664     prestream_size = 4 * AV_RL32(buf + bitstream_size + 4);
665     prestream      = buf + bitstream_size + 12;
666
667     if(prestream_size + bitstream_size + 12 != length
668        || bitstream_size > (1<<26)
669        || prestream_size > (1<<26)){
670         av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d %d\n", prestream_size, bitstream_size, length);
671         return -1;
672     }
673
674     prestream= read_huffman_tables(f, prestream);
675
676     init_get_bits(&f->gb, buf + 4, 8*bitstream_size);
677
678     prestream_size= length + buf - prestream;
679
680     av_fast_malloc(&f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE);
681     if (!f->bitstream_buffer)
682         return AVERROR(ENOMEM);
683     f->dsp.bswap_buf(f->bitstream_buffer, (const uint32_t*)prestream, prestream_size/4);
684     memset((uint8_t*)f->bitstream_buffer + prestream_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
685     init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size);
686
687     f->last_dc= 0*128*8*8;
688
689     for(y=0; y<height; y+=16){
690         for(x=0; x<width; x+=16){
691             if(decode_i_mb(f) < 0)
692                 return -1;
693
694             idct_put(f, x, y);
695         }
696     }
697
698     if(get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256)
699         av_log(f->avctx, AV_LOG_ERROR, "end mismatch\n");
700
701     return 0;
702 }
703
704 static int decode_frame(AVCodecContext *avctx,
705                         void *data, int *data_size,
706                         AVPacket *avpkt)
707 {
708     const uint8_t *buf = avpkt->data;
709     int buf_size = avpkt->size;
710     FourXContext * const f = avctx->priv_data;
711     AVFrame *picture = data;
712     AVFrame *p, temp;
713     int i, frame_4cc, frame_size;
714
715     frame_4cc= AV_RL32(buf);
716     if(buf_size != AV_RL32(buf+4)+8 || buf_size < 20){
717         av_log(f->avctx, AV_LOG_ERROR, "size mismatch %d %d\n", buf_size, AV_RL32(buf+4));
718     }
719
720     if(frame_4cc == AV_RL32("cfrm")){
721         int free_index=-1;
722         const int data_size= buf_size - 20;
723         const int id= AV_RL32(buf+12);
724         const int whole_size= AV_RL32(buf+16);
725         CFrameBuffer *cfrm;
726
727         for(i=0; i<CFRAME_BUFFER_COUNT; i++){
728             if(f->cfrm[i].id && f->cfrm[i].id < avctx->frame_number)
729                 av_log(f->avctx, AV_LOG_ERROR, "lost c frame %d\n", f->cfrm[i].id);
730         }
731
732         for(i=0; i<CFRAME_BUFFER_COUNT; i++){
733             if(f->cfrm[i].id   == id) break;
734             if(f->cfrm[i].size == 0 ) free_index= i;
735         }
736
737         if(i>=CFRAME_BUFFER_COUNT){
738             i= free_index;
739             f->cfrm[i].id= id;
740         }
741         cfrm= &f->cfrm[i];
742
743         cfrm->data= av_fast_realloc(cfrm->data, &cfrm->allocated_size, cfrm->size + data_size + FF_INPUT_BUFFER_PADDING_SIZE);
744         if(!cfrm->data){ //explicit check needed as memcpy below might not catch a NULL
745             av_log(f->avctx, AV_LOG_ERROR, "realloc falure");
746             return -1;
747         }
748
749         memcpy(cfrm->data + cfrm->size, buf+20, data_size);
750         cfrm->size += data_size;
751
752         if(cfrm->size >= whole_size){
753             buf= cfrm->data;
754             frame_size= cfrm->size;
755
756             if(id != avctx->frame_number){
757                 av_log(f->avctx, AV_LOG_ERROR, "cframe id mismatch %d %d\n", id, avctx->frame_number);
758             }
759
760             cfrm->size= cfrm->id= 0;
761             frame_4cc= AV_RL32("pfrm");
762         }else
763             return buf_size;
764     }else{
765         buf= buf + 12;
766         frame_size= buf_size - 12;
767     }
768
769     temp= f->current_picture;
770     f->current_picture= f->last_picture;
771     f->last_picture= temp;
772
773     p= &f->current_picture;
774     avctx->coded_frame= p;
775
776     avctx->flags |= CODEC_FLAG_EMU_EDGE; // alternatively we would have to use our own buffer management
777
778     if(p->data[0])
779         avctx->release_buffer(avctx, p);
780
781     p->reference= 1;
782     if(avctx->get_buffer(avctx, p) < 0){
783         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
784         return -1;
785     }
786
787     if(frame_4cc == AV_RL32("ifr2")){
788         p->pict_type= AV_PICTURE_TYPE_I;
789         if(decode_i2_frame(f, buf-4, frame_size) < 0)
790             return -1;
791     }else if(frame_4cc == AV_RL32("ifrm")){
792         p->pict_type= AV_PICTURE_TYPE_I;
793         if(decode_i_frame(f, buf, frame_size) < 0)
794             return -1;
795     }else if(frame_4cc == AV_RL32("pfrm") || frame_4cc == AV_RL32("pfr2")){
796         if(!f->last_picture.data[0]){
797             f->last_picture.reference= 1;
798             if(avctx->get_buffer(avctx, &f->last_picture) < 0){
799                 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
800                 return -1;
801             }
802         }
803
804         p->pict_type= AV_PICTURE_TYPE_P;
805         if(decode_p_frame(f, buf, frame_size) < 0)
806             return -1;
807     }else if(frame_4cc == AV_RL32("snd_")){
808         av_log(avctx, AV_LOG_ERROR, "ignoring snd_ chunk length:%d\n", buf_size);
809     }else{
810         av_log(avctx, AV_LOG_ERROR, "ignoring unknown chunk length:%d\n", buf_size);
811     }
812
813     p->key_frame= p->pict_type == AV_PICTURE_TYPE_I;
814
815     *picture= *p;
816     *data_size = sizeof(AVPicture);
817
818     emms_c();
819
820     return buf_size;
821 }
822
823
824 static av_cold void common_init(AVCodecContext *avctx){
825     FourXContext * const f = avctx->priv_data;
826
827     dsputil_init(&f->dsp, avctx);
828
829     f->avctx= avctx;
830 }
831
832 static av_cold int decode_init(AVCodecContext *avctx){
833     FourXContext * const f = avctx->priv_data;
834
835     if(avctx->extradata_size != 4 || !avctx->extradata) {
836         av_log(avctx, AV_LOG_ERROR, "extradata wrong or missing\n");
837         return 1;
838     }
839
840     f->version= AV_RL32(avctx->extradata)>>16;
841     common_init(avctx);
842     init_vlcs(f);
843
844     if(f->version>2) avctx->pix_fmt= PIX_FMT_RGB565;
845     else             avctx->pix_fmt= PIX_FMT_BGR555;
846
847     return 0;
848 }
849
850
851 static av_cold int decode_end(AVCodecContext *avctx){
852     FourXContext * const f = avctx->priv_data;
853     int i;
854
855     av_freep(&f->bitstream_buffer);
856     f->bitstream_buffer_size=0;
857     for(i=0; i<CFRAME_BUFFER_COUNT; i++){
858         av_freep(&f->cfrm[i].data);
859         f->cfrm[i].allocated_size= 0;
860     }
861     free_vlc(&f->pre_vlc);
862     if(f->current_picture.data[0])
863         avctx->release_buffer(avctx, &f->current_picture);
864     if(f->last_picture.data[0])
865         avctx->release_buffer(avctx, &f->last_picture);
866
867     return 0;
868 }
869
870 AVCodec ff_fourxm_decoder = {
871     .name           = "4xm",
872     .type           = AVMEDIA_TYPE_VIDEO,
873     .id             = CODEC_ID_4XM,
874     .priv_data_size = sizeof(FourXContext),
875     .init           = decode_init,
876     .close          = decode_end,
877     .decode         = decode_frame,
878     .capabilities   = CODEC_CAP_DR1,
879     .long_name = NULL_IF_CONFIG_SMALL("4X Movie"),
880 };
881