]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - libavcodec/svq1dec.c
split SVQ1 decoder and encoder in their own files
[frescor/ffmpeg.git] / libavcodec / svq1dec.c
1 /*
2  * SVQ1 decoder
3  * ported to MPlayer by Arpi <arpi@thot.banki.hu>
4  * ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
5  *
6  * Copyright (C) 2002 the xine project
7  * Copyright (C) 2002 the ffmpeg project
8  *
9  * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
10  *
11  * This file is part of FFmpeg.
12  *
13  * FFmpeg is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Lesser General Public
15  * License as published by the Free Software Foundation; either
16  * version 2.1 of the License, or (at your option) any later version.
17  *
18  * FFmpeg is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * Lesser General Public License for more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public
24  * License along with FFmpeg; if not, write to the Free Software
25  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26  */
27
28 /**
29  * @file svq1.c
30  * Sorenson Vector Quantizer #1 (SVQ1) video codec.
31  * For more information of the SVQ1 algorithm, visit:
32  *   http://www.pcisys.net/~melanson/codecs/
33  */
34
35
36 //#define DEBUG_SVQ1
37 #include "avcodec.h"
38 #include "dsputil.h"
39 #include "mpegvideo.h"
40
41 #include "svq1.h"
42
43 #undef NDEBUG
44 #include <assert.h>
45
46 extern const uint8_t mvtab[33][2];
47
48 static VLC svq1_block_type;
49 static VLC svq1_motion_component;
50 static VLC svq1_intra_multistage[6];
51 static VLC svq1_inter_multistage[6];
52 static VLC svq1_intra_mean;
53 static VLC svq1_inter_mean;
54
55 /* motion vector (prediction) */
56 typedef struct svq1_pmv_s {
57   int           x;
58   int           y;
59 } svq1_pmv_t;
60
61 static const uint16_t checksum_table[256] = {
62   0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
63   0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
64   0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
65   0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
66   0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
67   0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
68   0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
69   0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
70   0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
71   0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
72   0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
73   0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
74   0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
75   0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
76   0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
77   0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
78   0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
79   0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
80   0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
81   0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
82   0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
83   0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
84   0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
85   0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
86   0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
87   0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
88   0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
89   0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
90   0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
91   0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
92   0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
93   0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
94 };
95
96 static const uint8_t string_table[256] = {
97   0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
98   0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
99   0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
100   0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
101   0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
102   0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
103   0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
104   0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
105   0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
106   0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
107   0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
108   0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
109   0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
110   0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
111   0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
112   0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
113   0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
114   0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
115   0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
116   0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
117   0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
118   0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
119   0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
120   0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
121   0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
122   0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
123   0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
124   0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
125   0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
126   0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
127   0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
128   0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
129 };
130
131 #define SVQ1_PROCESS_VECTOR()\
132     for (; level > 0; i++) {\
133       /* process next depth */\
134       if (i == m) {\
135         m = n;\
136         if (--level == 0)\
137           break;\
138       }\
139       /* divide block if next bit set */\
140       if (get_bits (bitbuf, 1) == 0)\
141         break;\
142       /* add child nodes */\
143       list[n++] = list[i];\
144       list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
145     }
146
147 #define SVQ1_ADD_CODEBOOK()\
148           /* add codebook entries to vector */\
149           for (j=0; j < stages; j++) {\
150             n3  = codebook[entries[j]] ^ 0x80808080;\
151             n1 += ((n3 & 0xFF00FF00) >> 8);\
152             n2 +=  (n3 & 0x00FF00FF);\
153           }\
154 \
155           /* clip to [0..255] */\
156           if (n1 & 0xFF00FF00) {\
157             n3  = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
158             n1 += 0x7F007F00;\
159             n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
160             n1 &= (n3 & 0x00FF00FF);\
161           }\
162 \
163           if (n2 & 0xFF00FF00) {\
164             n3  = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
165             n2 += 0x7F007F00;\
166             n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
167             n2 &= (n3 & 0x00FF00FF);\
168           }
169
170 #define SVQ1_DO_CODEBOOK_INTRA()\
171       for (y=0; y < height; y++) {\
172         for (x=0; x < (width / 4); x++, codebook++) {\
173         n1 = n4;\
174         n2 = n4;\
175         SVQ1_ADD_CODEBOOK()\
176         /* store result */\
177         dst[x] = (n1 << 8) | n2;\
178         }\
179         dst += (pitch / 4);\
180       }
181
182 #define SVQ1_DO_CODEBOOK_NONINTRA()\
183       for (y=0; y < height; y++) {\
184         for (x=0; x < (width / 4); x++, codebook++) {\
185         n3 = dst[x];\
186         /* add mean value to vector */\
187         n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
188         n2 =  (n3 & 0x00FF00FF)          + n4;\
189         SVQ1_ADD_CODEBOOK()\
190         /* store result */\
191         dst[x] = (n1 << 8) | n2;\
192         }\
193         dst += (pitch / 4);\
194       }
195
196 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
197       codebook = (const uint32_t *) cbook[level];\
198       bit_cache = get_bits (bitbuf, 4*stages);\
199       /* calculate codebook entries for this vector */\
200       for (j=0; j < stages; j++) {\
201         entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
202       }\
203       mean -= (stages * 128);\
204       n4    = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
205
206 static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
207   uint32_t    bit_cache;
208   uint8_t    *list[63];
209   uint32_t   *dst;
210   const uint32_t *codebook;
211   int         entries[6];
212   int         i, j, m, n;
213   int         mean, stages;
214   unsigned    x, y, width, height, level;
215   uint32_t    n1, n2, n3, n4;
216
217   /* initialize list for breadth first processing of vectors */
218   list[0] = pixels;
219
220   /* recursively process vector */
221   for (i=0, m=1, n=1, level=5; i < n; i++) {
222     SVQ1_PROCESS_VECTOR();
223
224     /* destination address and vector size */
225     dst = (uint32_t *) list[i];
226     width = 1 << ((4 + level) /2);
227     height = 1 << ((3 + level) /2);
228
229     /* get number of stages (-1 skips vector, 0 for mean only) */
230     stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
231
232     if (stages == -1) {
233         for (y=0; y < height; y++) {
234           memset (&dst[y*(pitch / 4)], 0, width);
235         }
236       continue;                 /* skip vector */
237     }
238
239     if ((stages > 0) && (level >= 4)) {
240 #ifdef DEBUG_SVQ1
241     av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
242 #endif
243       return -1;        /* invalid vector */
244     }
245
246     mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
247
248     if (stages == 0) {
249       for (y=0; y < height; y++) {
250         memset (&dst[y*(pitch / 4)], mean, width);
251       }
252     } else {
253       SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
254       SVQ1_DO_CODEBOOK_INTRA()
255     }
256   }
257
258   return 0;
259 }
260
261 static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
262   uint32_t    bit_cache;
263   uint8_t    *list[63];
264   uint32_t   *dst;
265   const uint32_t *codebook;
266   int         entries[6];
267   int         i, j, m, n;
268   int         mean, stages;
269   int         x, y, width, height, level;
270   uint32_t    n1, n2, n3, n4;
271
272   /* initialize list for breadth first processing of vectors */
273   list[0] = pixels;
274
275   /* recursively process vector */
276   for (i=0, m=1, n=1, level=5; i < n; i++) {
277     SVQ1_PROCESS_VECTOR();
278
279     /* destination address and vector size */
280     dst = (uint32_t *) list[i];
281     width = 1 << ((4 + level) /2);
282     height = 1 << ((3 + level) /2);
283
284     /* get number of stages (-1 skips vector, 0 for mean only) */
285     stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
286
287     if (stages == -1) continue; /* skip vector */
288
289     if ((stages > 0) && (level >= 4)) {
290 #ifdef DEBUG_SVQ1
291     av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
292 #endif
293       return -1;        /* invalid vector */
294     }
295
296     mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
297
298     SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
299     SVQ1_DO_CODEBOOK_NONINTRA()
300   }
301   return 0;
302 }
303
304 static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
305   int        diff;
306   int        i;
307
308   for (i=0; i < 2; i++) {
309
310     /* get motion code */
311     diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
312     if(diff<0)
313         return -1;
314     else if(diff){
315         if(get_bits1(bitbuf)) diff= -diff;
316     }
317
318     /* add median of motion vector predictors and clip result */
319     if (i == 1)
320       mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
321     else
322       mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
323   }
324
325   return 0;
326 }
327
328 static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
329   uint8_t *src;
330   uint8_t *dst;
331   int      i;
332
333   src = &previous[x + y*pitch];
334   dst = current;
335
336   for (i=0; i < 16; i++) {
337     memcpy (dst, src, 16);
338     src += pitch;
339     dst += pitch;
340   }
341 }
342
343 static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
344                                uint8_t *current, uint8_t *previous, int pitch,
345                                svq1_pmv_t *motion, int x, int y) {
346   uint8_t    *src;
347   uint8_t    *dst;
348   svq1_pmv_t  mv;
349   svq1_pmv_t *pmv[3];
350   int         result;
351
352   /* predict and decode motion vector */
353   pmv[0] = &motion[0];
354   if (y == 0) {
355     pmv[1] =
356     pmv[2] = pmv[0];
357   }
358   else {
359     pmv[1] = &motion[(x / 8) + 2];
360     pmv[2] = &motion[(x / 8) + 4];
361   }
362
363   result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
364
365   if (result != 0)
366     return result;
367
368   motion[0].x                =
369   motion[(x / 8) + 2].x      =
370   motion[(x / 8) + 3].x      = mv.x;
371   motion[0].y                =
372   motion[(x / 8) + 2].y      =
373   motion[(x / 8) + 3].y      = mv.y;
374
375   if(y + (mv.y >> 1)<0)
376      mv.y= 0;
377   if(x + (mv.x >> 1)<0)
378      mv.x= 0;
379
380 #if 0
381   int w= (s->width+15)&~15;
382   int h= (s->height+15)&~15;
383   if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
384       av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
385 #endif
386
387   src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
388   dst = current;
389
390   s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
391
392   return 0;
393 }
394
395 static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
396                                   uint8_t *current, uint8_t *previous, int pitch,
397                                   svq1_pmv_t *motion,int x, int y) {
398   uint8_t    *src;
399   uint8_t    *dst;
400   svq1_pmv_t  mv;
401   svq1_pmv_t *pmv[4];
402   int         i, result;
403
404   /* predict and decode motion vector (0) */
405   pmv[0] = &motion[0];
406   if (y == 0) {
407     pmv[1] =
408     pmv[2] = pmv[0];
409   }
410   else {
411     pmv[1] = &motion[(x / 8) + 2];
412     pmv[2] = &motion[(x / 8) + 4];
413   }
414
415   result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
416
417   if (result != 0)
418     return result;
419
420   /* predict and decode motion vector (1) */
421   pmv[0] = &mv;
422   if (y == 0) {
423     pmv[1] =
424     pmv[2] = pmv[0];
425   }
426   else {
427     pmv[1] = &motion[(x / 8) + 3];
428   }
429   result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
430
431   if (result != 0)
432     return result;
433
434   /* predict and decode motion vector (2) */
435   pmv[1] = &motion[0];
436   pmv[2] = &motion[(x / 8) + 1];
437
438   result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
439
440   if (result != 0)
441     return result;
442
443   /* predict and decode motion vector (3) */
444   pmv[2] = &motion[(x / 8) + 2];
445   pmv[3] = &motion[(x / 8) + 3];
446
447   result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
448
449   if (result != 0)
450     return result;
451
452   /* form predictions */
453   for (i=0; i < 4; i++) {
454     int mvx= pmv[i]->x + (i&1)*16;
455     int mvy= pmv[i]->y + (i>>1)*16;
456
457     ///XXX /FIXME clipping or padding?
458     if(y + (mvy >> 1)<0)
459        mvy= 0;
460     if(x + (mvx >> 1)<0)
461        mvx= 0;
462
463 #if 0
464   int w= (s->width+15)&~15;
465   int h= (s->height+15)&~15;
466   if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
467       av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
468 #endif
469     src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
470     dst = current;
471
472     s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
473
474     /* select next block */
475     if (i & 1) {
476       current  += 8*(pitch - 1);
477     } else {
478       current  += 8;
479     }
480   }
481
482   return 0;
483 }
484
485 static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
486                         uint8_t *current, uint8_t *previous, int pitch,
487                         svq1_pmv_t *motion, int x, int y) {
488   uint32_t block_type;
489   int      result = 0;
490
491   /* get block type */
492   block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
493
494   /* reset motion vectors */
495   if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
496     motion[0].x                 =
497     motion[0].y                 =
498     motion[(x / 8) + 2].x =
499     motion[(x / 8) + 2].y =
500     motion[(x / 8) + 3].x =
501     motion[(x / 8) + 3].y = 0;
502   }
503
504   switch (block_type) {
505   case SVQ1_BLOCK_SKIP:
506     svq1_skip_block (current, previous, pitch, x, y);
507     break;
508
509   case SVQ1_BLOCK_INTER:
510     result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
511
512     if (result != 0)
513     {
514 #ifdef DEBUG_SVQ1
515     av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
516 #endif
517       break;
518     }
519     result = svq1_decode_block_non_intra (bitbuf, current, pitch);
520     break;
521
522   case SVQ1_BLOCK_INTER_4V:
523     result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
524
525     if (result != 0)
526     {
527 #ifdef DEBUG_SVQ1
528     av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
529 #endif
530       break;
531     }
532     result = svq1_decode_block_non_intra (bitbuf, current, pitch);
533     break;
534
535   case SVQ1_BLOCK_INTRA:
536     result = svq1_decode_block_intra (bitbuf, current, pitch);
537     break;
538   }
539
540   return result;
541 }
542
543 static uint16_t svq1_packet_checksum (uint8_t *data, int length, int value) {
544   int i;
545
546   for (i=0; i < length; i++) {
547     value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
548   }
549
550   return value;
551 }
552
553 static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
554   uint8_t seed;
555   int     i;
556
557   out[0] = get_bits (bitbuf, 8);
558
559   seed = string_table[out[0]];
560
561   for (i=1; i <= out[0]; i++) {
562     out[i] = get_bits (bitbuf, 8) ^ seed;
563     seed   = string_table[out[i] ^ seed];
564   }
565 }
566
567 static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
568   int frame_size_code;
569   int temporal_reference;
570
571   temporal_reference = get_bits (bitbuf, 8);
572
573   /* frame type */
574   s->pict_type= get_bits (bitbuf, 2)+1;
575   if(s->pict_type==4)
576       return -1;
577
578   if (s->pict_type == I_TYPE) {
579
580     /* unknown fields */
581     if (s->f_code == 0x50 || s->f_code == 0x60) {
582       int csum = get_bits (bitbuf, 16);
583
584       csum = svq1_packet_checksum ((uint8_t *)bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
585
586 //      av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
587 //              (csum == 0) ? "correct" : "incorrect", csum);
588     }
589
590     if ((s->f_code ^ 0x10) >= 0x50) {
591       uint8_t msg[256];
592
593       svq1_parse_string (bitbuf, msg);
594
595       av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
596     }
597
598     skip_bits (bitbuf, 2);
599     skip_bits (bitbuf, 2);
600     skip_bits1 (bitbuf);
601
602     /* load frame size */
603     frame_size_code = get_bits (bitbuf, 3);
604
605     if (frame_size_code == 7) {
606       /* load width, height (12 bits each) */
607       s->width = get_bits (bitbuf, 12);
608       s->height = get_bits (bitbuf, 12);
609
610       if (!s->width || !s->height)
611         return -1;
612     } else {
613       /* get width, height from table */
614       s->width = ff_svq1_frame_size_table[frame_size_code].width;
615       s->height = ff_svq1_frame_size_table[frame_size_code].height;
616     }
617   }
618
619   /* unknown fields */
620   if (get_bits (bitbuf, 1) == 1) {
621     skip_bits1 (bitbuf);       /* use packet checksum if (1) */
622     skip_bits1 (bitbuf);       /* component checksums after image data if (1) */
623
624     if (get_bits (bitbuf, 2) != 0)
625       return -1;
626   }
627
628   if (get_bits (bitbuf, 1) == 1) {
629     skip_bits1 (bitbuf);
630     skip_bits (bitbuf, 4);
631     skip_bits1 (bitbuf);
632     skip_bits (bitbuf, 2);
633
634     while (get_bits (bitbuf, 1) == 1) {
635       skip_bits (bitbuf, 8);
636     }
637   }
638
639   return 0;
640 }
641
642 static int svq1_decode_frame(AVCodecContext *avctx,
643                              void *data, int *data_size,
644                              uint8_t *buf, int buf_size)
645 {
646   MpegEncContext *s=avctx->priv_data;
647   uint8_t        *current, *previous;
648   int             result, i, x, y, width, height;
649   AVFrame *pict = data;
650
651   /* initialize bit buffer */
652   init_get_bits(&s->gb,buf,buf_size*8);
653
654   /* decode frame header */
655   s->f_code = get_bits (&s->gb, 22);
656
657   if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
658     return -1;
659
660   /* swap some header bytes (why?) */
661   if (s->f_code != 0x20) {
662     uint32_t *src = (uint32_t *) (buf + 4);
663
664     for (i=0; i < 4; i++) {
665       src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
666     }
667   }
668
669   result = svq1_decode_frame_header (&s->gb, s);
670
671   if (result != 0)
672   {
673 #ifdef DEBUG_SVQ1
674     av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
675 #endif
676     return result;
677   }
678
679   //FIXME this avoids some confusion for "B frames" without 2 references
680   //this should be removed after libavcodec can handle more flexible picture types & ordering
681   if(s->pict_type==B_TYPE && s->last_picture_ptr==NULL) return buf_size;
682
683   if(avctx->hurry_up && s->pict_type==B_TYPE) return buf_size;
684   if(  (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
685      ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
686      || avctx->skip_frame >= AVDISCARD_ALL)
687       return buf_size;
688
689   if(MPV_frame_start(s, avctx) < 0)
690       return -1;
691
692   /* decode y, u and v components */
693   for (i=0; i < 3; i++) {
694     int linesize;
695     if (i == 0) {
696       width  = (s->width+15)&~15;
697       height = (s->height+15)&~15;
698       linesize= s->linesize;
699     } else {
700       if(s->flags&CODEC_FLAG_GRAY) break;
701       width  = (s->width/4+15)&~15;
702       height = (s->height/4+15)&~15;
703       linesize= s->uvlinesize;
704     }
705
706     current  = s->current_picture.data[i];
707
708     if(s->pict_type==B_TYPE){
709         previous = s->next_picture.data[i];
710     }else{
711         previous = s->last_picture.data[i];
712     }
713
714     if (s->pict_type == I_TYPE) {
715       /* keyframe */
716       for (y=0; y < height; y+=16) {
717         for (x=0; x < width; x+=16) {
718           result = svq1_decode_block_intra (&s->gb, &current[x], linesize);
719           if (result != 0)
720           {
721 //#ifdef DEBUG_SVQ1
722             av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
723 //#endif
724             return result;
725           }
726         }
727         current += 16*linesize;
728       }
729     } else {
730       svq1_pmv_t pmv[width/8+3];
731       /* delta frame */
732       memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv_t));
733
734       for (y=0; y < height; y+=16) {
735         for (x=0; x < width; x+=16) {
736           result = svq1_decode_delta_block (s, &s->gb, &current[x], previous,
737                                             linesize, pmv, x, y);
738           if (result != 0)
739           {
740 #ifdef DEBUG_SVQ1
741     av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
742 #endif
743             return result;
744           }
745         }
746
747         pmv[0].x =
748         pmv[0].y = 0;
749
750         current += 16*linesize;
751       }
752     }
753   }
754
755   *pict = *(AVFrame*)&s->current_picture;
756
757
758   MPV_frame_end(s);
759
760   *data_size=sizeof(AVFrame);
761   return buf_size;
762 }
763
764 static int svq1_decode_init(AVCodecContext *avctx)
765 {
766     MpegEncContext *s = avctx->priv_data;
767     int i;
768
769     MPV_decode_defaults(s);
770
771     s->avctx = avctx;
772     s->width = (avctx->width+3)&~3;
773     s->height = (avctx->height+3)&~3;
774     s->codec_id= avctx->codec->id;
775     avctx->pix_fmt = PIX_FMT_YUV410P;
776     avctx->has_b_frames= 1; // not true, but DP frames and these behave like unidirectional b frames
777     s->flags= avctx->flags;
778     if (MPV_common_init(s) < 0) return -1;
779
780     init_vlc(&svq1_block_type, 2, 4,
781         &ff_svq1_block_type_vlc[0][1], 2, 1,
782         &ff_svq1_block_type_vlc[0][0], 2, 1, 1);
783
784     init_vlc(&svq1_motion_component, 7, 33,
785         &mvtab[0][1], 2, 1,
786         &mvtab[0][0], 2, 1, 1);
787
788     for (i = 0; i < 6; i++) {
789         init_vlc(&svq1_intra_multistage[i], 3, 8,
790             &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
791             &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1, 1);
792         init_vlc(&svq1_inter_multistage[i], 3, 8,
793             &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
794             &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1, 1);
795     }
796
797     init_vlc(&svq1_intra_mean, 8, 256,
798         &ff_svq1_intra_mean_vlc[0][1], 4, 2,
799         &ff_svq1_intra_mean_vlc[0][0], 4, 2, 1);
800
801     init_vlc(&svq1_inter_mean, 9, 512,
802         &ff_svq1_inter_mean_vlc[0][1], 4, 2,
803         &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1);
804
805     return 0;
806 }
807
808 static int svq1_decode_end(AVCodecContext *avctx)
809 {
810     MpegEncContext *s = avctx->priv_data;
811
812     MPV_common_end(s);
813     return 0;
814 }
815
816
817 AVCodec svq1_decoder = {
818     "svq1",
819     CODEC_TYPE_VIDEO,
820     CODEC_ID_SVQ1,
821     sizeof(MpegEncContext),
822     svq1_decode_init,
823     NULL,
824     svq1_decode_end,
825     svq1_decode_frame,
826     CODEC_CAP_DR1,
827     .flush= ff_mpeg_flush,
828     .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
829 };