[svn] / branches / dev-api-4 / xvidcore / src / bitstream / mbcoding.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/src/bitstream/mbcoding.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/xvidcore/src/bitstream/mbcoding.c revision 114, Wed Apr 10 07:43:25 2002 UTC branches/dev-api-4/xvidcore/src/bitstream/mbcoding.c revision 995, Sun Apr 27 19:47:48 2003 UTC
# Line 1  Line 1 
1     /******************************************************************************
2      *                                                                            *
3      *  This file is part of XviD, a free MPEG-4 video encoder/decoder            *
4      *                                                                            *
5      *  XviD is an implementation of a part of one or more MPEG-4 Video tools     *
6      *  as specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
7      *  software module in hardware or software products are advised that its     *
8      *  use may infringe existing patents or copyrights, and any such use         *
9      *  would be at such party's own risk.  The original developer of this        *
10      *  software module and his/her company, and subsequent editors and their     *
11      *  companies, will have no liability for use of this software or             *
12      *  modifications or derivatives thereof.                                     *
13      *                                                                            *
14      *  XviD is free software; you can redistribute it and/or modify it           *
15      *  under the terms of the GNU General Public License as published by         *
16      *  the Free Software Foundation; either version 2 of the License, or         *
17      *  (at your option) any later version.                                       *
18      *                                                                            *
19      *  XviD is distributed in the hope that it will be useful, but               *
20      *  WITHOUT ANY WARRANTY; without even the implied warranty of                *
21      *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
22      *  GNU General Public License for more details.                              *
23      *                                                                            *
24      *  You should have received a copy of the GNU General Public License         *
25      *  along with this program; if not, write to the Free Software               *
26      *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *
27      *                                                                            *
28      ******************************************************************************/
29    
30     /******************************************************************************
31      *                                                                            *
32      *  mbcoding.c                                                                *
33      *                                                                            *
34      *  Copyright (C) 2002 - Michael Militzer <isibaar@xvid.org>                  *
35      *                                                                            *
36      *  For more information visit the XviD homepage: http://www.xvid.org         *
37      *                                                                            *
38      ******************************************************************************/
39    
40     /******************************************************************************
41      *                                                                                                                                                        *
42      *  Revision history:                                                         *
43      *                                                                            *
44      *  28.10.2002 GMC support - gruel                                                                                        *
45      *  28.06.2002 added check_resync_marker()                                    *
46      *  14.04.2002 bframe encoding                                                                                            *
47      *  08.03.2002 initial version; isibaar                                                           *
48      *                                                                                                                                                        *
49      ******************************************************************************/
50    
51    
52    #include <stdio.h>
53  #include <stdlib.h>  #include <stdlib.h>
54    #include <string.h>
55    
56  #include "../portab.h"  #include "../portab.h"
57    #include "../global.h"
58  #include "bitstream.h"  #include "bitstream.h"
59  #include "zigzag.h"  #include "zigzag.h"
60  #include "vlc_codes.h"  #include "vlc_codes.h"
# Line 7  Line 62 
62    
63  #include "../utils/mbfunctions.h"  #include "../utils/mbfunctions.h"
64    
65  #define ABS(X) (((X)>0)?(X):-(X))  /* #define BIGLUT */
 #define CLIP(X,A) (X > A) ? (A) : (X)  
66    
67  VLC intra_table[65536];  #ifdef BIGLUT
68  VLC inter_table[65536];  #define LEVELOFFSET 2048
69    #else
70    #define LEVELOFFSET 32
71    #endif
72    
73  VLC DCT3Dintra[4096];  static REVERSE_EVENT DCT3D[2][4096];
 VLC DCT3Dinter[4096];  
74    
75  static int16_t clip_table[4096];  #ifdef BIGLUT
76    static VLC coeff_VLC[2][2][4096][64];
77    VLC *intra_table;
78    static VLC *inter_table;
79    #else
80    static VLC coeff_VLC[2][2][64][64];
81    #endif
82    
83  void init_vlc_tables(void)  /* not really MB related, but VLCs are only available here */
84    void bs_put_spritetrajectory(Bitstream * bs, const int val)
85  {  {
86            const int code = sprite_trajectory_code[val+16384].code;
87            const int len = sprite_trajectory_code[val+16384].len;
88            const int code2 = sprite_trajectory_len[len].code;
89            const int len2 = sprite_trajectory_len[len].len;
90    
91          int32_t k, l, i, intra, last;  //      printf("GMC=%d Code/Len  = %d / %d ",val, code,len);
92          VLC *vlc[2];  //      printf("Code2 / Len2 = %d / %d \n",code2,len2);
         VLC **coeff_ptr;  
         VLC *vlc1, *vlc2;  
93    
94          vlc1 = DCT3Dintra;          BitstreamPutBits(bs, code2, len2);
95          vlc2 = DCT3Dinter;          if (len) BitstreamPutBits(bs, code, len);
   
         vlc[0] = intra_table;  
         vlc[1] = inter_table;  
   
         // initialize the clipping table  
         for(i = -2048; i < 2048; i++) {  
                 clip_table[i + 2048] = i;  
                 if(i < -255)  
                         clip_table[i + 2048] = -255;  
                 if(i > 255)  
                         clip_table[i + 2048] = 255;  
96          }          }
97    
98          // generate encoding vlc lookup tables  int bs_get_spritetrajectory(Bitstream * bs)
99          for(i = 0; i < 4; i++) {  {
100                  intra = i % 2;          int i;
101                  last = i / 2;          for (i = 0; i < 12; i++)
102            {
103                    if (BitstreamShowBits(bs, sprite_trajectory_len[i].len) == sprite_trajectory_len[i].code)
104                    {
105                            BitstreamSkip(bs, sprite_trajectory_len[i].len);
106                            return i;
107                    }
108            }
109            return -1;
110    }
111    
112                  coeff_ptr = coeff_vlc[last + 2 * intra];  void
113    init_vlc_tables(void)
114    {
115            uint32_t i, j, k, intra, last, run,  run_esc, level, level_esc, escape, escape_len, offset;
116            int32_t l;
117    
118                  for(k = -255; k < 256; k++) { // level  #ifdef BIGLUT
119                          int8_t *max_level_ptr = max_level[last + 2 * intra];          intra_table = coeff_VLC[1];
120                          int8_t *max_run_ptr = max_run[last + 2 * intra];          inter_table = coeff_VLC[0];
121    #endif
122    
                         for(l = 0; l < 64; l++) { // run  
                                 int32_t level = k;  
                                 uint32_t run = l;  
123    
124                                  if((abs(level) <= max_level_ptr[run]) &&          for (intra = 0; intra < 2; intra++)
125                                     (run <= max_run_ptr[abs(level)])) { // level < max_level and run < max_run                  for (i = 0; i < 4096; i++)
126                            DCT3D[intra][i].event.level = 0;
127    
128                                                  vlc[intra]->code = 0;          for (intra = 0; intra < 2; intra++)
129                                                  vlc[intra]->len = 0;                  for (last = 0; last < 2; last++)
130                                                  goto loop_end;                  {
131                            for (run = 0; run < 63 + last; run++)
132                                    for (level = 0; level < (uint32_t)(32 << intra); level++)
133                                    {
134    #ifdef BIGLUT
135                                            offset = LEVELOFFSET;
136    #else
137                                            offset = !intra * LEVELOFFSET;
138    #endif
139                                            coeff_VLC[intra][last][level + offset][run].len = 128;
140                                  }                                  }
                                 else {  
                                         if(level > 0)                                        // correct level  
                                                 level -= max_level_ptr[run];  
                                         else  
                                                 level += max_level_ptr[run];  
   
                                         if((abs(level) <= max_level_ptr[run]) &&  
                                            (run <= max_run_ptr[abs(level)])) {  
   
                                                 vlc[intra]->code = 0x06;  
                                                 vlc[intra]->len = 8;  
                                                 goto loop_end;  
141                                          }                                          }
142    
143                                          if(level > 0)                                       // still here?          for (intra = 0; intra < 2; intra++)
144                                                  level += max_level_ptr[run];    // restore level                  for (i = 0; i < 102; i++)
145                                          else                  {
146                                                  level -= max_level_ptr[run];  #ifdef BIGLUT
147                            offset = LEVELOFFSET;
148                                          run -= max_run_ptr[abs(level)] + 1; // and change run  #else
149                            offset = !intra * LEVELOFFSET;
150                                          if((abs(level) <= max_level_ptr[run]) &&  #endif
151                                             (run <= max_run_ptr[abs(level)])) {                          for (j = 0; j < (uint32_t)(1 << (12 - coeff_tab[intra][i].vlc.len)); j++)
152                            {
153                                    DCT3D[intra][(coeff_tab[intra][i].vlc.code << (12 - coeff_tab[intra][i].vlc.len)) | j].len       = coeff_tab[intra][i].vlc.len;
154                                    DCT3D[intra][(coeff_tab[intra][i].vlc.code << (12 - coeff_tab[intra][i].vlc.len)) | j].event = coeff_tab[intra][i].event;
155                            }
156    
157                                                  vlc[intra]->code = 0x0e;                          coeff_VLC[intra][coeff_tab[intra][i].event.last][coeff_tab[intra][i].event.level + offset][coeff_tab[intra][i].event.run].code
158                                                  vlc[intra]->len = 9;                                  = coeff_tab[intra][i].vlc.code << 1;
159                                                  goto loop_end;                          coeff_VLC[intra][coeff_tab[intra][i].event.last][coeff_tab[intra][i].event.level + offset][coeff_tab[intra][i].event.run].len
160                                    = coeff_tab[intra][i].vlc.len + 1;
161    #ifndef BIGLUT
162                            if (!intra)
163    #endif
164                            {
165                                    coeff_VLC[intra][coeff_tab[intra][i].event.last][offset - coeff_tab[intra][i].event.level][coeff_tab[intra][i].event.run].code
166                                            = (coeff_tab[intra][i].vlc.code << 1) | 1;
167                                    coeff_VLC[intra][coeff_tab[intra][i].event.last][offset - coeff_tab[intra][i].event.level][coeff_tab[intra][i].event.run].len
168                                            = coeff_tab[intra][i].vlc.len + 1;
169                                          }                                          }
                                         run += max_run_ptr[abs(level)] + 1;  
170                                  }                                  }
171    
172                                  vlc[intra]->code = (uint32_t) ((l << 14) | (0x1e + last) << 20) |          for (intra = 0; intra < 2; intra++)
173                                                                                            (1 << 13) | ((k & 0xfff) << 1) | 1;                  for (last = 0; last < 2; last++)
174                            for (run = 0; run < 63 + last; run++)
175                                  vlc[intra]->len = 30;                          {
176                                  vlc[intra]++;                                  for (level = 1; level < (uint32_t)(32 << intra); level++)
177                                    {
178                                            if (level <= max_level[intra][last][run] && run <= max_run[intra][last][level])
179                                  continue;                                  continue;
180    
181  loop_end:  #ifdef BIGLUT
182                                  if(level != 0) {                                          offset = LEVELOFFSET;
183                                          vlc[intra]->code = (vlc[intra]->code << (coeff_ptr[run][abs(level) - 1].len + 1)) |  #else
184                                                                             (coeff_ptr[run][abs(level) - 1].code << 1);                                          offset = !intra * LEVELOFFSET;
185                                          vlc[intra]->len = (coeff_ptr[run][abs(level) - 1].len + 1) + vlc[intra]->len;  #endif
186                        level_esc = level - max_level[intra][last][run];
187                                          if(level < 0)                                          run_esc = run - 1 - max_run[intra][last][level];
188                                                  vlc[intra]->code += 1;                                          /*use this test to use shorter esc2 codes when possible
189                                            if (level_esc <= max_level[intra][last][run] && run <= max_run[intra][last][level_esc]
190                                                    && !(coeff_VLC[intra][last][level_esc + offset][run].len + 7 + 1
191                                                             > coeff_VLC[intra][last][level + offset][run_esc].code + 7 + 2))*/
192    
193                                            if (level_esc <= max_level[intra][last][run] && run <= max_run[intra][last][level_esc])
194                                            {
195                                                    escape     = ESCAPE1;
196                                                    escape_len = 7 + 1;
197                                                    run_esc    = run;
198                                  }                                  }
199                                            else
200                                  vlc[intra]++;                                          {
201                                                    if (run_esc <= max_run[intra][last][level] && level <= max_level[intra][last][run_esc])
202                                                    {
203                                                            escape     = ESCAPE2;
204                                                            escape_len = 7 + 2;
205                                                            level_esc  = level;
206                          }                          }
207                                                    else
208                                                    {
209    #ifndef BIGLUT
210                                                            if (!intra)
211    #endif
212                                                            {
213                                                                    coeff_VLC[intra][last][level + offset][run].code
214                                                                            = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((level & 0xfff) << 1) | 1;
215                                                                    coeff_VLC[intra][last][level + offset][run].len = 30;
216                                                                            coeff_VLC[intra][last][offset - level][run].code
217                                                                            = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((-(int32_t)level & 0xfff) << 1) | 1;
218                                                                    coeff_VLC[intra][last][offset - level][run].len = 30;
219                                                            }
220                                                            continue;
221                  }                  }
222          }          }
223    
224          for(i = 0; i < 4096; i++) {                                          coeff_VLC[intra][last][level + offset][run].code
225                  if(i >= 512) {                                                  = (escape << coeff_VLC[intra][last][level_esc + offset][run_esc].len)
226                          *vlc1 = DCT3Dtab3[(i >> 5) - 16];                                                  |  coeff_VLC[intra][last][level_esc + offset][run_esc].code;
227                          *vlc2 = DCT3Dtab0[(i >> 5) - 16];                                          coeff_VLC[intra][last][level + offset][run].len
228                                                    = coeff_VLC[intra][last][level_esc + offset][run_esc].len + escape_len;
229    #ifndef BIGLUT
230                                            if (!intra)
231    #endif
232                                            {
233                                                    coeff_VLC[intra][last][offset - level][run].code
234                                                            = (escape << coeff_VLC[intra][last][level_esc + offset][run_esc].len)
235                                                            |  coeff_VLC[intra][last][level_esc + offset][run_esc].code | 1;
236                                                    coeff_VLC[intra][last][offset - level][run].len
237                                                            = coeff_VLC[intra][last][level_esc + offset][run_esc].len + escape_len;
238                                            }
239                  }                  }
240                  else if(i >= 128) {  
241                          *vlc1 = DCT3Dtab4[(i >> 2) - 32];  #ifdef BIGLUT
242                          *vlc2 = DCT3Dtab1[(i >> 2) - 32];                                  for (level = 32 << intra; level < 2048; level++)
243                                    {
244                                            coeff_VLC[intra][last][level + offset][run].code
245                                                    = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((level & 0xfff) << 1) | 1;
246                                            coeff_VLC[intra][last][level + offset][run].len = 30;
247    
248                                            coeff_VLC[intra][last][offset - level][run].code
249                                                    = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((-level & 0xfff) << 1) | 1;
250                                            coeff_VLC[intra][last][offset - level][run].len = 30;
251                  }                  }
252                  else if(i >= 8) {  #else
253                          *vlc1 = DCT3Dtab5[i - 8];                                  if (!intra)
254                          *vlc2 = DCT3Dtab2[i - 8];                                  {
255                                            coeff_VLC[intra][last][0][run].code
256                                                    = (ESCAPE3 << 21) | (last << 20) | (run << 14) | (1 << 13) | ((-32 & 0xfff) << 1) | 1;
257                                            coeff_VLC[intra][last][0][run].len = 30;
258                  }                  }
259                  else {  #endif
                         *vlc1 = ERRtab[i];  
                         *vlc2 = ERRtab[i];  
260                  }                  }
261    /* init sprite_trajectory tables */
262    /* even if GMC is not specified (it might be used later...) */
263    
264                  vlc1++;          sprite_trajectory_code[0+16384].code = 0;
265                  vlc2++;          sprite_trajectory_code[0+16384].len = 0;
266            for (k=0;k<14;k++)
267            {
268                    int limit = (1<<k);
269    
270                    for (l=-(2*limit-1); l <= -limit; l++)
271                    {
272                            sprite_trajectory_code[l+16384].code = (2*limit-1)+l;
273                            sprite_trajectory_code[l+16384].len = k+1;
274          }          }
         DCT3D[0] = DCT3Dinter;  
         DCT3D[1] = DCT3Dintra;  
275    
276                    for (l=limit; l<= 2*limit-1; l++)
277                    {
278                            sprite_trajectory_code[l+16384].code = l;
279                            sprite_trajectory_code[l+16384].len = k+1;
280                    }
281            }
282  }  }
283    
284  static __inline void CodeVector(Bitstream *bs,  static __inline void
285                                  int16_t value,  CodeVector(Bitstream * bs,
286                                  int16_t f_code,                     int32_t value,
287                       int32_t f_code,
288                                  Statistics *pStat)                                  Statistics *pStat)
289  {  {
290    
# Line 161  Line 301 
301          pStat->iMvCount++;          pStat->iMvCount++;
302    
303          if (value == 0) {          if (value == 0) {
304                  BitstreamPutBits(bs, mb_motion_table[32].code, mb_motion_table[32].len);                  BitstreamPutBits(bs, mb_motion_table[32].code,
305                                                     mb_motion_table[32].len);
306          } else {          } else {
307                  uint16_t length, code, mv_res, sign;                  uint16_t length, code, mv_res, sign;
308    
# Line 186  Line 327 
327                          code = -code;                          code = -code;
328    
329                  code += 32;                  code += 32;
330                  BitstreamPutBits(bs, mb_motion_table[code].code, mb_motion_table[code].len);                  BitstreamPutBits(bs, mb_motion_table[code].code,
331                                                     mb_motion_table[code].len);
332    
333                  if(f_code)                  if(f_code)
334                          BitstreamPutBits(bs, mv_res, f_code);                          BitstreamPutBits(bs, mv_res, f_code);
# Line 194  Line 336 
336    
337  }  }
338    
339    #ifdef BIGLUT
340    
341  static __inline void CodeCoeff(Bitstream *bs,  static __inline void
342                                 int16_t qcoeff[64],  CodeCoeff(Bitstream * bs,
343                      const int16_t qcoeff[64],
344                                 VLC *table,                                 VLC *table,
345                                 const uint16_t *zigzag,                                 const uint16_t *zigzag,
346                                 uint16_t intra)                                 uint16_t intra)
# Line 207  Line 351 
351          VLC *vlc;          VLC *vlc;
352    
353          j = intra;          j = intra;
354          last = 1 + intra;          last = intra;
355    
356          while((v = qcoeff[zigzag[j++]]) == 0);          while (j < 64 && (v = qcoeff[zigzag[j]]) == 0)
357                    j++;
358    
359          do {          do {
360                  // count zeroes                  vlc = table + 64 * 2048 + (v << 6) + j - last;
361                  vlc = table + 64*255 + (clip_table[2048+v] << 6) + j - last;                  last = ++j;
                 last = j + 1;  
                 while(j < 64 && (v = qcoeff[zigzag[j++]]) == 0);  
362    
363                  // write code                  /* count zeroes */
364                    while (j < 64 && (v = qcoeff[zigzag[j]]) == 0)
365                            j++;
366    
367                    /* write code */
368                  if(j != 64) {                  if(j != 64) {
369                          BitstreamPutBits(bs, vlc->code, vlc->len);                          BitstreamPutBits(bs, vlc->code, vlc->len);
370                  } else {                  } else {
371                          vlc += 64*511;                          vlc += 64 * 4096;
372                          BitstreamPutBits(bs, vlc->code, vlc->len);                          BitstreamPutBits(bs, vlc->code, vlc->len);
373                          break;                          break;
374                  }                  }
# Line 230  Line 377 
377  }  }
378    
379    
380  static void CodeBlockIntra(const MBParam * pParam,  
381    /* returns the number of bits required to encode qcoeff */
382    int
383    CodeCoeff_CalcBits(const int16_t qcoeff[64],
384                      VLC * table,
385                      const uint16_t * zigzag,
386                      uint16_t intra)
387    {
388            int bits = 0;
389            uint32_t j, last;
390            short v;
391            VLC *vlc;
392    
393            j = intra;
394            last = intra;
395    
396            while (j < 64 && (v = qcoeff[zigzag[j]]) == 0)
397                    j++;
398    
399            if (j >= 64) return 0;  /* empty block */
400    
401            do {
402                    vlc = table + 64 * 2048 + (v << 6) + j - last;
403                    last = ++j;
404    
405                    /* count zeroes */
406                    while (j < 64 && (v = qcoeff[zigzag[j]]) == 0)
407                            j++;
408    
409                    /* write code */
410                    if (j != 64) {
411                            bits += vlc->len;
412                    } else {
413                            vlc += 64 * 4096;
414                            bits += vlc->len;
415                            break;
416                    }
417            } while (1);
418    
419            return bits;
420    }
421    
422    
423    #else
424    
425    static __inline void
426    CodeCoeffInter(Bitstream * bs,
427                      const int16_t qcoeff[64],
428                      const uint16_t * zigzag)
429    {
430            uint32_t i, run, prev_run, code, len;
431            int32_t level, prev_level, level_shifted;
432    
433            i       = 0;
434            run = 0;
435    
436            while (!(level = qcoeff[zigzag[i++]]))
437                    run++;
438    
439            prev_level = level;
440            prev_run   = run;
441            run = 0;
442    
443            while (i < 64)
444            {
445                    if ((level = qcoeff[zigzag[i++]]) != 0)
446                    {
447                            level_shifted = prev_level + 32;
448                            if (!(level_shifted & -64))
449                            {
450                                    code = coeff_VLC[0][0][level_shifted][prev_run].code;
451                                    len      = coeff_VLC[0][0][level_shifted][prev_run].len;
452                            }
453                            else
454                            {
455                                    code = (ESCAPE3 << 21) | (prev_run << 14) | (1 << 13) | ((prev_level & 0xfff) << 1) | 1;
456                                    len  = 30;
457                            }
458                            BitstreamPutBits(bs, code, len);
459                            prev_level = level;
460                            prev_run   = run;
461                            run = 0;
462                    }
463                    else
464                            run++;
465            }
466    
467            level_shifted = prev_level + 32;
468            if (!(level_shifted & -64))
469            {
470                    code = coeff_VLC[0][1][level_shifted][prev_run].code;
471                    len      = coeff_VLC[0][1][level_shifted][prev_run].len;
472            }
473            else
474            {
475                    code = (ESCAPE3 << 21) | (1 << 20) | (prev_run << 14) | (1 << 13) | ((prev_level & 0xfff) << 1) | 1;
476                    len  = 30;
477            }
478            BitstreamPutBits(bs, code, len);
479    }
480    
481    static __inline void
482    CodeCoeffIntra(Bitstream * bs,
483                      const int16_t qcoeff[64],
484                      const uint16_t * zigzag)
485    {
486            uint32_t i, abs_level, run, prev_run, code, len;
487            int32_t level, prev_level;
488    
489            i       = 1;
490            run = 0;
491    
492            while (i<64 && !(level = qcoeff[zigzag[i++]]))
493                    run++;
494    
495            prev_level = level;
496            prev_run   = run;
497            run = 0;
498    
499            while (i < 64)
500            {
501                    if ((level = qcoeff[zigzag[i++]]) != 0)
502                    {
503                            abs_level = abs(prev_level);
504                            abs_level = abs_level < 64 ? abs_level : 0;
505                            code      = coeff_VLC[1][0][abs_level][prev_run].code;
506                            len               = coeff_VLC[1][0][abs_level][prev_run].len;
507                            if (len != 128)
508                                    code |= (prev_level < 0);
509                            else
510                            {
511                            code = (ESCAPE3 << 21) | (prev_run << 14) | (1 << 13) | ((prev_level & 0xfff) << 1) | 1;
512                                    len  = 30;
513                            }
514                            BitstreamPutBits(bs, code, len);
515                            prev_level = level;
516                            prev_run   = run;
517                            run = 0;
518                    }
519                    else
520                            run++;
521            }
522    
523            abs_level = abs(prev_level);
524            abs_level = abs_level < 64 ? abs_level : 0;
525            code      = coeff_VLC[1][1][abs_level][prev_run].code;
526            len               = coeff_VLC[1][1][abs_level][prev_run].len;
527            if (len != 128)
528                    code |= (prev_level < 0);
529            else
530            {
531                    code = (ESCAPE3 << 21) | (1 << 20) | (prev_run << 14) | (1 << 13) | ((prev_level & 0xfff) << 1) | 1;
532                    len  = 30;
533            }
534            BitstreamPutBits(bs, code, len);
535    }
536    
537    
538    
539    /* returns the number of bits required to encode qcoeff */
540    
541    int
542    CodeCoeffIntra_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag)
543    {
544            int bits = 0;
545            uint32_t i, abs_level, run, prev_run, len;
546            int32_t level, prev_level;
547    
548            i       = 1;
549            run = 0;
550    
551            while (i<64 && !(level = qcoeff[zigzag[i++]]))
552                    run++;
553    
554            if (i >= 64) return 0;  /* empty block */
555    
556            prev_level = level;
557            prev_run   = run;
558            run = 0;
559    
560            while (i < 64)
561            {
562                    if ((level = qcoeff[zigzag[i++]]) != 0)
563                    {
564                            abs_level = abs(prev_level);
565                            abs_level = abs_level < 64 ? abs_level : 0;
566                            len               = coeff_VLC[1][0][abs_level][prev_run].len;
567                            bits      += len!=128 ? len : 30;
568    
569                            prev_level = level;
570                            prev_run   = run;
571                            run = 0;
572                    }
573                    else
574                            run++;
575            }
576    
577            abs_level = abs(prev_level);
578            abs_level = abs_level < 64 ? abs_level : 0;
579            len               = coeff_VLC[1][1][abs_level][prev_run].len;
580            bits      += len!=128 ? len : 30;
581    
582            return bits;
583    }
584    
585    int
586    CodeCoeffInter_CalcBits(const int16_t qcoeff[64], const uint16_t * zigzag)
587    {
588            uint32_t i, run, prev_run, len;
589            int32_t level, prev_level, level_shifted;
590            int bits = 0;
591    
592            i       = 0;
593            run = 0;
594    
595            while (!(level = qcoeff[zigzag[i++]]))
596                    run++;
597    
598            prev_level = level;
599            prev_run   = run;
600            run = 0;
601    
602            while (i < 64) {
603                    if ((level = qcoeff[zigzag[i++]]) != 0) {
604                            level_shifted = prev_level + 32;
605                            if (!(level_shifted & -64))
606                                    len      = coeff_VLC[0][0][level_shifted][prev_run].len;
607                            else
608                                    len  = 30;
609    
610                            bits += len;
611                            prev_level = level;
612                            prev_run   = run;
613                            run = 0;
614                    }
615                    else
616                            run++;
617            }
618    
619            level_shifted = prev_level + 32;
620            if (!(level_shifted & -64))
621                    len      = coeff_VLC[0][1][level_shifted][prev_run].len;
622            else
623                    len  = 30;
624            bits += len;
625    
626            return bits;
627    }
628    
629    
630    #endif
631    
632    
633    static int iDQtab[5] = {
634            1, 0, -1 /* no change */, 2, 3
635    };
636    #define DQ_VALUE2INDEX(value)  iDQtab[(value)+2]
637    
638    
639    static __inline void
640    CodeBlockIntra(const FRAMEINFO * const frame,
641                             const MACROBLOCK *pMB,                             const MACROBLOCK *pMB,
642                             int16_t qcoeff[6*64],                             int16_t qcoeff[6*64],
643                             Bitstream * bs,                             Bitstream * bs,
# Line 242  Line 649 
649          cbpy = pMB->cbp >> 2;          cbpy = pMB->cbp >> 2;
650    
651          // write mcbpc          // write mcbpc
652          if(pParam->coding_type == I_VOP) {          if (frame->coding_type == I_VOP) {
653                  mcbpc = ((pMB->mode >> 1) & 3) | ((pMB->cbp & 3) << 2);                  mcbpc = ((pMB->mode >> 1) & 3) | ((pMB->cbp & 3) << 2);
654                  BitstreamPutBits(bs, mcbpc_intra_tab[mcbpc].code, mcbpc_intra_tab[mcbpc].len);                  BitstreamPutBits(bs, mcbpc_intra_tab[mcbpc].code,
655          }                                                   mcbpc_intra_tab[mcbpc].len);
656          else {          } else {
657                  mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3);                  mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3);
658                  BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code, mcbpc_inter_tab[mcbpc].len);                  BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code,
659                                                     mcbpc_inter_tab[mcbpc].len);
660          }          }
661    
662          // ac prediction flag          // ac prediction flag
# Line 258  Line 666 
666                  BitstreamPutBits(bs, 0, 1);                  BitstreamPutBits(bs, 0, 1);
667    
668          // write cbpy          // write cbpy
669          BitstreamPutBits (bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);          BitstreamPutBits(bs, xvid_cbpy_tab[cbpy].code, xvid_cbpy_tab[cbpy].len);
670    
671          // write dquant          // write dquant
672          if(pMB->mode == MODE_INTRA_Q)          if(pMB->mode == MODE_INTRA_Q)
673                  BitstreamPutBits(bs, pMB->dquant, 2);                  BitstreamPutBits(bs, DQ_VALUE2INDEX(pMB->dquant), 2);
674    
675          // write interlacing          // write interlacing
676          if (pParam->global_flags & XVID_INTERLACING)          if (frame->vol_flags & XVID_VOL_INTERLACING) {
         {  
677                  BitstreamPutBit(bs, pMB->field_dct);                  BitstreamPutBit(bs, pMB->field_dct);
678          }          }
   
679          // code block coeffs          // code block coeffs
680          for(i = 0; i < 6; i++)          for (i = 0; i < 6; i++) {
         {  
681                  if(i < 4)                  if(i < 4)
682                          BitstreamPutBits(bs,                          BitstreamPutBits(bs, dcy_tab[qcoeff[i * 64 + 0] + 255].code,
                                          dcy_tab[qcoeff[i*64 + 0] + 255].code,  
683                                           dcy_tab[qcoeff[i*64 + 0] + 255].len);                                           dcy_tab[qcoeff[i*64 + 0] + 255].len);
684                  else                  else
685                          BitstreamPutBits(bs,                          BitstreamPutBits(bs, dcc_tab[qcoeff[i * 64 + 0] + 255].code,
                                          dcc_tab[qcoeff[i*64 + 0] + 255].code,  
686                                           dcc_tab[qcoeff[i*64 + 0] + 255].len);                                           dcc_tab[qcoeff[i*64 + 0] + 255].len);
687    
688                  if(pMB->cbp & (1 << (5 - i)))                  if (pMB->cbp & (1 << (5 - i))) {
689                  {                          const uint16_t *scan_table =
690                                    frame->vop_flags & XVID_VOP_ALTERNATESCAN ?
691                                    scan_tables[2] : scan_tables[pMB->acpred_directions[i]];
692    
693                          bits = BitstreamPos(bs);                          bits = BitstreamPos(bs);
694    
695                          CodeCoeff(bs,  #ifdef BIGLUT
696                                    &qcoeff[i*64],                          CodeCoeff(bs, &qcoeff[i * 64], intra_table, scan_table, 1);
697                                    intra_table,  #else
698                                    scan_tables[pMB->acpred_directions[i]],                          CodeCoeffIntra(bs, &qcoeff[i * 64], scan_table);
699                                    1);  #endif
700    
701                          bits = BitstreamPos(bs) - bits;                          bits = BitstreamPos(bs) - bits;
702                          pStat->iTextBits += bits;                          pStat->iTextBits += bits;
# Line 300  Line 706 
706  }  }
707    
708    
709  static void CodeBlockInter(const MBParam * pParam,  static void
710    CodeBlockInter(const FRAMEINFO * const frame,
711                             const MACROBLOCK *pMB,                             const MACROBLOCK *pMB,
712                             int16_t qcoeff[6*64],                             int16_t qcoeff[6*64],
713                             Bitstream * bs,                             Bitstream * bs,
# Line 314  Line 721 
721          cbpy = 15 - (pMB->cbp >> 2);          cbpy = 15 - (pMB->cbp >> 2);
722    
723          // write mcbpc          // write mcbpc
724          BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code, mcbpc_inter_tab[mcbpc].len);          BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code,
725                                             mcbpc_inter_tab[mcbpc].len);
726    
727            if ( (frame->coding_type == S_VOP) && (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) )
728                    BitstreamPutBit(bs, pMB->mcsel);                // mcsel: '0'=local motion, '1'=GMC
729    
730          // write cbpy          // write cbpy
731          BitstreamPutBits(bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);          BitstreamPutBits(bs, xvid_cbpy_tab[cbpy].code, xvid_cbpy_tab[cbpy].len);
732    
733          // write dquant          // write dquant
734          if(pMB->mode == MODE_INTER_Q)          if(pMB->mode == MODE_INTER_Q)
735                  BitstreamPutBits(bs, pMB->dquant, 2);                  BitstreamPutBits(bs, DQ_VALUE2INDEX(pMB->dquant), 2);
736    
737          // interlacing          // interlacing
738          if (pParam->global_flags & XVID_INTERLACING)          if (frame->vol_flags & XVID_VOL_INTERLACING) {
739          {                  if (pMB->cbp) {
740                  BitstreamPutBit(bs, pMB->field_dct);                  BitstreamPutBit(bs, pMB->field_dct);
741                  DEBUG1("codep: field_dct: ", pMB->field_dct);                          DPRINTF(DPRINTF_MB,"codep: field_dct: %i", pMB->field_dct);
742                    }
743    
744                  // if inter block, write field ME flag                  // if inter block, write field ME flag
745                  if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q)                  if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) {
                 {  
746                          BitstreamPutBit(bs, pMB->field_pred);                          BitstreamPutBit(bs, pMB->field_pred);
747                          DEBUG1("codep: field_pred: ", pMB->field_pred);                          DPRINTF(DPRINTF_MB,"codep: field_pred: %i", pMB->field_pred);
748    
749                          // write field prediction references                          // write field prediction references
750                          if (pMB->field_pred)                          if (pMB->field_pred) {
                         {  
751                                  BitstreamPutBit(bs, pMB->field_for_top);                                  BitstreamPutBit(bs, pMB->field_for_top);
752                                  BitstreamPutBit(bs, pMB->field_for_bot);                                  BitstreamPutBit(bs, pMB->field_for_bot);
753                          }                          }
754                  }                  }
755          }          }
756            // code motion vector(s) if motion is local
757          // code motion vector(s)          if (!pMB->mcsel)
758          for(i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++)                  for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {
759          {                          CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat);
760                  CodeVector(bs, pMB->pmvs[i].x, pParam->fixed_code, pStat);                          CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat);
                 CodeVector(bs, pMB->pmvs[i].y, pParam->fixed_code, pStat);  
761          }          }
762    
763          bits = BitstreamPos(bs);          bits = BitstreamPos(bs);
# Line 356  Line 765 
765          // code block coeffs          // code block coeffs
766          for(i = 0; i < 6; i++)          for(i = 0; i < 6; i++)
767                  if(pMB->cbp & (1 << (5 - i)))                  if(pMB->cbp & (1 << (5 - i)))
768                          CodeCoeff(bs, &qcoeff[i*64], inter_table, scan_tables[0], 0);                  {
769                            const uint16_t *scan_table =
770                                    frame->vop_flags & XVID_VOP_ALTERNATESCAN ?
771                                    scan_tables[2] : scan_tables[0];
772    
773    #ifdef BIGLUT
774                            CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_table, 0);
775    #else
776                            CodeCoeffInter(bs, &qcoeff[i * 64], scan_table);
777    #endif
778                    }
779    
780          bits = BitstreamPos(bs) - bits;          bits = BitstreamPos(bs) - bits;
781          pStat->iTextBits += bits;          pStat->iTextBits += bits;
   
782  }  }
783    
784    
785  void MBCoding(const MBParam * pParam,  void
786    MBCoding(const FRAMEINFO * const frame,
787                MACROBLOCK *pMB,                MACROBLOCK *pMB,
788                int16_t qcoeff[6*64],                int16_t qcoeff[6*64],
789                Bitstream * bs,                Bitstream * bs,
790                Statistics * pStat)                Statistics * pStat)
791  {  {
792            if (frame->coding_type != I_VOP)
793                            BitstreamPutBit(bs, 0); // not_coded
794    
795          int intra = (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q);          if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q)
796                    CodeBlockIntra(frame, pMB, qcoeff, bs, pStat);
797            else
798                    CodeBlockInter(frame, pMB, qcoeff, bs, pStat);
799    
800    }
801    
802          if(pParam->coding_type == P_VOP) {  /*
803                  if(pMB->cbp == 0 && pMB->mode == MODE_INTER &&  // moved to mbcoding.h so that in can be 'static __inline'
804                     pMB->mvs[0].x == 0 && pMB->mvs[0].y == 0)  void
805    MBSkip(Bitstream * bs)
806                  {                  {
807                          BitstreamPutBit(bs, 1);         // not_coded          BitstreamPutBit(bs, 1); // not coded
808    }
809    */
810    
811    /***************************************************************
812     * bframe encoding start
813     ***************************************************************/
814    
815    /*
816            mbtype
817            0       1b              direct(h263)            mvdb
818            1       01b             interpolate mc+q        dbquant, mvdf, mvdb
819            2       001b    backward mc+q           dbquant, mvdb
820            3       0001b   forward mc+q            dbquant, mvdf
821    */
822    
823    static __inline void
824    put_bvop_mbtype(Bitstream * bs,
825                                    int value)
826    {
827            switch (value) {
828                    case MODE_FORWARD:
829                            BitstreamPutBit(bs, 0);
830                    case MODE_BACKWARD:
831                            BitstreamPutBit(bs, 0);
832                    case MODE_INTERPOLATE:
833                            BitstreamPutBit(bs, 0);
834                    case MODE_DIRECT:
835                            BitstreamPutBit(bs, 1);
836                    default:
837                            break;
838            }
839    }
840    
841    /*
842            dbquant
843            -2      10b
844            0       0b
845            +2      11b
846    */
847    
848    static __inline void
849    put_bvop_dbquant(Bitstream * bs,
850                                     int value)
851    {
852            switch (value) {
853            case 0:
854                    BitstreamPutBit(bs, 0);
855                          return;                          return;
856    
857            case -2:
858                    BitstreamPutBit(bs, 1);
859                    BitstreamPutBit(bs, 0);
860                    return;
861    
862            case 2:
863                    BitstreamPutBit(bs, 1);
864                    BitstreamPutBit(bs, 1);
865                    return;
866    
867            default:;                                       // invalid
868                  }                  }
                 else  
                         BitstreamPutBit(bs, 0);         // coded  
869          }          }
870    
         if(intra)  
                 CodeBlockIntra(pParam, pMB, qcoeff, bs, pStat);  
         else  
                 CodeBlockInter(pParam, pMB, qcoeff, bs, pStat);  
871    
872    
873    void
874    MBCodingBVOP(const MACROBLOCK * mb,
875                             const int16_t qcoeff[6 * 64],
876                             const int32_t fcode,
877                             const int32_t bcode,
878                             Bitstream * bs,
879                             Statistics * pStat,
880                             int direction)
881    {
882            int vcode = fcode;
883            unsigned int i;
884    
885    /*      ------------------------------------------------------------------
886                    when a block is skipped it is decoded DIRECT(0,0)
887                    hence is interpolated from forward & backward frames
888            ------------------------------------------------------------------ */
889    
890            if (mb->mode == MODE_DIRECT_NONE_MV) {
891                    BitstreamPutBit(bs, 1); // skipped
892                    return;
893            }
894    
895            BitstreamPutBit(bs, 0);         // not skipped
896    
897            if (mb->cbp == 0) {
898                    BitstreamPutBit(bs, 1); // cbp == 0
899            } else {
900                    BitstreamPutBit(bs, 0); // cbp == xxx
901            }
902    
903            put_bvop_mbtype(bs, mb->mode);
904    
905            if (mb->cbp) {
906                    BitstreamPutBits(bs, mb->cbp, 6);
907            }
908    
909            if (mb->mode != MODE_DIRECT && mb->cbp != 0) {
910                    put_bvop_dbquant(bs, 0);        // todo: mb->dquant = 0
911            }
912    
913            switch (mb->mode) {
914                    case MODE_INTERPOLATE:
915                            CodeVector(bs, mb->pmvs[1].x, vcode, pStat); //forward vector of interpolate mode
916                            CodeVector(bs, mb->pmvs[1].y, vcode, pStat);
917                    case MODE_BACKWARD:
918                            vcode = bcode;
919                    case MODE_FORWARD:
920                            CodeVector(bs, mb->pmvs[0].x, vcode, pStat);
921                            CodeVector(bs, mb->pmvs[0].y, vcode, pStat);
922                            break;
923                    case MODE_DIRECT:
924                            CodeVector(bs, mb->pmvs[3].x, 1, pStat);        // fcode is always 1 for delta vector
925                            CodeVector(bs, mb->pmvs[3].y, 1, pStat);        // prediction is always (0,0)
926                    default: break;
927            }
928    
929            for (i = 0; i < 6; i++) {
930                    if (mb->cbp & (1 << (5 - i))) {
931    #ifdef BIGLUT
932                            CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0);
933    #else
934                            CodeCoeffInter(bs, &qcoeff[i * 64], scan_tables[0]);
935    #endif
936                    }
937            }
938  }  }
939    
940    
941    
942  /***************************************************************  /***************************************************************
943   * decoding stuff starts here                                  *   * decoding stuff starts here                                  *
944   ***************************************************************/   ***************************************************************/
945    
946  int get_mcbpc_intra(Bitstream * bs)  
947    // for IVOP addbits == 0
948    // for PVOP addbits == fcode - 1
949    // for BVOP addbits == max(fcode,bcode) - 1
950    // returns true or false
951    int
952    check_resync_marker(Bitstream * bs, int addbits)
953    {
954            uint32_t nbits;
955            uint32_t code;
956            uint32_t nbitsresyncmarker = NUMBITS_VP_RESYNC_MARKER + addbits;
957    
958            nbits = BitstreamNumBitsToByteAlign(bs);
959            code = BitstreamShowBits(bs, nbits);
960    
961            if (code == (((uint32_t)1 << (nbits - 1)) - 1))
962  {  {
963                    return BitstreamShowBitsFromByteAlign(bs, nbitsresyncmarker) == RESYNC_MARKER;
964            }
965    
966          uint32_t index;          return 0;
967    }
968    
969    
970    
971    int
972    get_mcbpc_intra(Bitstream * bs)
973    {
974    
975          while((index = BitstreamShowBits(bs, 9)) == 1)          uint32_t index;
                 BitstreamSkip(bs, 9);  
976    
977            index = BitstreamShowBits(bs, 9);
978          index >>= 3;          index >>= 3;
979    
980          BitstreamSkip(bs, mcbpc_intra_table[index].len);          BitstreamSkip(bs, mcbpc_intra_table[index].len);
# Line 412  Line 983 
983    
984  }  }
985    
986  int get_mcbpc_inter(Bitstream * bs)  int
987    get_mcbpc_inter(Bitstream * bs)
988  {  {
989    
990          uint32_t index;          uint32_t index;
991    
992          while((index = CLIP(BitstreamShowBits(bs, 9), 256)) == 1)          index = MIN(BitstreamShowBits(bs, 9), 256);
                 BitstreamSkip(bs, 9);  
993    
994          BitstreamSkip(bs,  mcbpc_inter_table[index].len);          BitstreamSkip(bs,  mcbpc_inter_table[index].len);
995    
# Line 426  Line 997 
997    
998  }  }
999    
1000  int get_cbpy(Bitstream * bs, int intra)  int
1001    get_cbpy(Bitstream * bs,
1002                     int intra)
1003  {  {
1004    
1005          int cbpy;          int cbpy;
# Line 442  Line 1015 
1015    
1016  }  }
1017    
1018  int get_mv_data(Bitstream * bs)  static __inline int
1019    get_mv_data(Bitstream * bs)
1020  {  {
1021    
1022          uint32_t index;          uint32_t index;
# Line 452  Line 1026 
1026    
1027          index = BitstreamShowBits(bs, 12);          index = BitstreamShowBits(bs, 12);
1028    
1029          if(index >= 512)          if (index >= 512) {
         {  
1030                  index = (index >> 8) - 2;                  index = (index >> 8) - 2;
1031                  BitstreamSkip(bs, TMNMVtab0[index].len);                  BitstreamSkip(bs, TMNMVtab0[index].len);
1032                  return TMNMVtab0[index].code;                  return TMNMVtab0[index].code;
1033          }          }
1034    
1035          if(index >= 128)          if (index >= 128) {
         {  
1036                  index = (index >> 2) - 32;                  index = (index >> 2) - 32;
1037                  BitstreamSkip(bs, TMNMVtab1[index].len);                  BitstreamSkip(bs, TMNMVtab1[index].len);
1038                  return TMNMVtab1[index].code;                  return TMNMVtab1[index].code;
# Line 473  Line 1045 
1045    
1046  }  }
1047    
1048  int get_mv(Bitstream * bs, int fcode)  int
1049    get_mv(Bitstream * bs,
1050               int fcode)
1051  {  {
1052    
1053          int data;          int data;
# Line 487  Line 1061 
1061                  return data;                  return data;
1062    
1063          res = BitstreamGetBits(bs, fcode - 1);          res = BitstreamGetBits(bs, fcode - 1);
1064          mv = ((ABS(data) - 1) * scale_fac) + res + 1;          mv = ((abs(data) - 1) * scale_fac) + res + 1;
1065    
1066          return data < 0 ? -mv : mv;          return data < 0 ? -mv : mv;
1067    
1068  }  }
1069    
1070  int get_dc_dif(Bitstream * bs, uint32_t dc_size)  int
1071    get_dc_dif(Bitstream * bs,
1072                       uint32_t dc_size)
1073  {  {
1074    
1075          int code = BitstreamGetBits(bs, dc_size);          int code = BitstreamGetBits(bs, dc_size);
# Line 506  Line 1082 
1082    
1083  }  }
1084    
1085  int get_dc_size_lum(Bitstream * bs)  int
1086    get_dc_size_lum(Bitstream * bs)
1087  {  {
1088    
1089          int code, i;          int code, i;
1090    
1091          code = BitstreamShowBits(bs, 11);          code = BitstreamShowBits(bs, 11);
1092    
1093          for(i = 11; i > 3; i--) {          for(i = 11; i > 3; i--) {
# Line 526  Line 1104 
1104  }  }
1105    
1106    
1107  int get_dc_size_chrom(Bitstream * bs)  int
1108    get_dc_size_chrom(Bitstream * bs)
1109  {  {
1110    
1111          uint32_t code, i;          uint32_t code, i;
1112    
1113          code = BitstreamShowBits(bs, 12);          code = BitstreamShowBits(bs, 12);
1114    
1115          for(i = 12; i > 2; i--) {          for(i = 12; i > 2; i--) {
# Line 544  Line 1124 
1124    
1125  }  }
1126    
1127  void get_intra_block(Bitstream * bs, int16_t * block, int direction, int coeff)  static __inline int
1128    get_coeff(Bitstream * bs,
1129                      int *run,
1130                      int *last,
1131                      int intra,
1132                      int short_video_header)
1133  {  {
1134    
1135          const uint16_t * scan = scan_tables[ direction ];          uint32_t mode;
1136          int level;          int32_t level;
1137          int run;          REVERSE_EVENT *reverse_event;
1138          int last;  
1139            if (short_video_header)         /* inter-VLCs will be used for both intra and inter blocks */
1140                    intra = 0;
1141    
1142            if (BitstreamShowBits(bs, 7) != ESCAPE) {
1143                    reverse_event = &DCT3D[intra][BitstreamShowBits(bs, 12)];
1144    
1145                    if ((level = reverse_event->event.level) == 0)
1146                            goto error;
1147    
1148                    *last = reverse_event->event.last;
1149                    *run  = reverse_event->event.run;
1150    
1151                    BitstreamSkip(bs, reverse_event->len);
1152    
1153                    return BitstreamGetBits(bs, 1) ? -level : level;
1154            }
1155    
1156            BitstreamSkip(bs, 7);
1157    
1158            if (short_video_header) {
1159                    /* escape mode 4 - H.263 type, only used if short_video_header = 1  */
1160                    *last = BitstreamGetBit(bs);
1161                    *run = BitstreamGetBits(bs, 6);
1162                    level = BitstreamGetBits(bs, 8);
1163    
1164                    if (level == 0 || level == 128)
1165                            DPRINTF(DPRINTF_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d", level);
1166    
1167                    return (level << 24) >> 24;
1168            }
1169    
1170            mode = BitstreamShowBits(bs, 2);
1171    
1172            if (mode < 3) {
1173                    BitstreamSkip(bs, (mode == 2) ? 2 : 1);
1174    
1175                    reverse_event = &DCT3D[intra][BitstreamShowBits(bs, 12)];
1176    
1177                    if ((level = reverse_event->event.level) == 0)
1178                            goto error;
1179    
1180                    *last = reverse_event->event.last;
1181                    *run  = reverse_event->event.run;
1182    
1183                    BitstreamSkip(bs, reverse_event->len);
1184    
1185                    if (mode < 2)                   /* first escape mode, level is offset */
1186                            level += max_level[intra][*last][*run];
1187                    else                                    /* second escape mode, run is offset */
1188                            *run += max_run[intra][*last][level] + 1;
1189    
1190                    return BitstreamGetBits(bs, 1) ? -level : level;
1191            }
1192    
1193            /* third escape mode - fixed length codes */
1194            BitstreamSkip(bs, 2);
1195            *last = BitstreamGetBits(bs, 1);
1196            *run = BitstreamGetBits(bs, 6);
1197            BitstreamSkip(bs, 1);           /* marker */
1198            level = BitstreamGetBits(bs, 12);
1199            BitstreamSkip(bs, 1);           /* marker */
1200    
1201            return (level << 20) >> 20;
1202    
1203          do    error:
1204            *run = VLC_ERROR;
1205            return 0;
1206    }
1207    
1208    void
1209    get_intra_block(Bitstream * bs,
1210                                    int16_t * block,
1211                                    int direction,
1212                                    int coeff)
1213          {          {
1214    
1215            const uint16_t *scan = scan_tables[direction];
1216            int level, run, last;
1217    
1218            do {
1219                  level = get_coeff(bs, &run, &last, 1, 0);                  level = get_coeff(bs, &run, &last, 1, 0);
1220                  if (run == -1)                  if (run == -1) {
1221                  {                          DPRINTF(DPRINTF_ERROR,"fatal: invalid run");
                         DEBUG("fatal: invalid run");  
1222                          break;                          break;
1223                  }                  }
1224                  coeff += run;                  coeff += run;
1225                  block[ scan[coeff] ] = level;                  block[ scan[coeff] ] = level;
1226                  if (level < -127 || level > 127)  
1227                  {                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level);
1228                          DEBUG1("warning: intra_overflow", level);                  //DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32));
1229    
1230                    if (level < -2047 || level > 2047) {
1231                            DPRINTF(DPRINTF_ERROR,"warning: intra_overflow %i", level);
1232                  }                  }
1233                  coeff++;                  coeff++;
1234          } while (!last);          } while (!last);
1235    
1236  }  }
1237    
1238  void get_inter_block(Bitstream * bs, int16_t * block)  void
1239    get_inter_block(Bitstream * bs,
1240                                    int16_t * block,
1241                                    int direction)
1242  {  {
1243    
1244          const uint16_t * scan = scan_tables[0];          const uint16_t *scan = scan_tables[direction];
1245          int p;          int p;
1246          int level;          int level;
1247          int run;          int run;
1248          int last;          int last;
1249    
1250          p = 0;          p = 0;
1251          do          do {
         {  
1252                  level = get_coeff(bs, &run, &last, 0, 0);                  level = get_coeff(bs, &run, &last, 0, 0);
1253                  if (run == -1)                  if (run == -1) {
1254                  {                          DPRINTF(DPRINTF_ERROR,"fatal: invalid run");
                         DEBUG("fatal: invalid run");  
1255                          break;                          break;
1256                  }                  }
1257                  p += run;                  p += run;
1258    
1259                  block[ scan[p] ] = level;                  block[ scan[p] ] = level;
1260                  if (level < -127 || level > 127)  
1261                  {                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level);
1262                          DEBUG1("warning: inter_overflow", level);                  // DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32));
1263    
1264                    if (level < -2047 || level > 2047) {
1265                            DPRINTF(DPRINTF_ERROR,"warning: inter overflow %i", level);
1266                  }                  }
1267                  p++;                  p++;
1268          } while (!last);          } while (!last);
1269    
1270  }  }
1271    
1272    
1273    
1274    
1275    
1276    
1277    
1278    /************************************************************************
1279     *               Trellis based R-D optimal quantization                 *
1280     *  not really "bitstream" or "mbcoding" related, but needs VLC tables  *
1281     *                                                                      *
1282     ************************************************************************/
1283    
1284    
1285    int __inline
1286    RunLevel_CalcBits_inter(const int16_t run, int16_t level)
1287    {
1288            const int esc_length = 30;
1289    
1290            if (!((level+32) & -64))
1291                    return coeff_VLC[0][0][level+32][run].len;
1292            else
1293                    return esc_length;
1294    }
1295    
1296    int __inline
1297    RunLevelLast_CalcBits_inter(const int16_t run, const int16_t level)
1298    {
1299            const int esc_length = 30;
1300    
1301            if (!((level+32) & -64))
1302                    return coeff_VLC[0][1][level+32][run].len;
1303            else
1304                    return esc_length;
1305    }
1306    
1307    
1308    int __inline
1309    RunLevel_CalcBits_intra(const int16_t run, int16_t level)
1310    {
1311            const int esc_length = 30;
1312            int bits;
1313    
1314            level = abs(level);
1315            if (!(level & -64)) {
1316                    bits = coeff_VLC[1][0][level][run].len;
1317                    if (bits!=128)
1318                            return bits;
1319            }
1320            return esc_length;
1321    }
1322    
1323    int __inline
1324    RunLevelLast_CalcBits_intra(const int16_t run, int16_t level)
1325    {
1326            const int esc_length = 30;
1327            int bits;
1328    
1329            level = abs(level);
1330            if (!(level & -64)) {
1331                    bits = coeff_VLC[1][1][level][run].len;
1332                    if (bits!=128)
1333                            return bits;
1334            }
1335            return esc_length;
1336    }
1337    
1338    /* based on ffmpeg's trellis quant, thanks! */
1339    /* (C) 2003 Michael Niedermayer <michaelni@gmx.at> */
1340    
1341    int
1342    dct_quantize_trellis_inter_h263_c (int16_t *qcoeff, const int16_t *data, int quant)
1343    {
1344    
1345    /* input: original quantized DCT coefficients (to calc distorion)*/
1346    /*                already quantized DCT coefficients */
1347    /*                quantizer */
1348    /* output: modified table of quantized DCT coefficients */
1349    
1350    /* maybe combining quantize&Trellis would be faster (even that it disables MMX quant) */
1351    
1352      int run_tab[65];
1353      int level_tab[65];
1354      int score_tab[65];
1355      int last_run = 0;
1356      int last_level = 0;
1357      int last_score = 0;
1358      int last_i = 0;
1359      int coeff[64];
1360      int coeff_count[64];  /* is a table useful for this 0-1 (or 1-2) table? */
1361      int last_non_zero, i;
1362    
1363      const uint16_t *const zigzag = &scan_tables[0][0];
1364            /* ordinary zigzag order, so it's not INTERLACE compatible, yet  */
1365    
1366      const int qmul = 2*quant;
1367      const int qadd = ((quant-1)|1);
1368    
1369    /* quant is not needed anymore after this */
1370    
1371      int score_limit = 0;
1372      int left_limit = 0;
1373    
1374      const int lambda = (quant * quant * 123 + 64) >> 7;   // default lagrangian
1375    
1376    /*  control lambda through a ENVIRONMENT variable (for automatic optmization) */
1377    
1378    /*
1379      const int lfact=123;  // better control of the lagrangian lambda
1380      int lambda = (quant * quant * 123 + 64) >> 7; // default lagrangian
1381    
1382      const char * const trellis_lambda = getenv("TRELLIS_LAMBDA");
1383      if(trellis_lambda)
1384                    lfact = atoi(trellis_lambda);
1385      if (lfact < 1)
1386            lfact = 123;    // why this value? Who knows? But 123 seems better than 109 = 0.85<<7
1387    
1388      lambda = (quant * quant * lfact + 64) >> 7;   // lagrangian
1389    */
1390    
1391      last_non_zero = -1;
1392      for (i = 0; i < 64; i++)
1393        {
1394          const int level = qcoeff[zigzag[i]];
1395    
1396                    if (level) {
1397                            last_non_zero = i;
1398    
1399                            if (level>0) {
1400                                    if (level==1) {
1401                                            coeff[i] = 1;
1402                                            coeff_count[i] = 0;
1403                                    } else {
1404                                            coeff[i] = level;
1405                                            coeff_count[i] = 1;
1406                                    }
1407                            } else {
1408                                    if (level==-1) {
1409                                            coeff[i] = -1;
1410                                            coeff_count[i] = 0;
1411                                    } else {
1412                                            coeff[i] = level+1;     // because we check coeff[i] and coeff[i]-1
1413                                            coeff_count[i] = 1;
1414                                    }
1415                            }
1416                } else {
1417                            coeff[i] = ((data[zigzag[i]]>>31)|1); /* +- 1 because of gap */
1418                            coeff_count[i] = 0;
1419                    }
1420        }
1421    
1422      if (last_non_zero < 0)
1423          return last_non_zero;
1424    
1425      score_tab[0] = 0;
1426    
1427      for (i = 0; i <= last_non_zero; i++) {
1428        int level, run, j;
1429        const int dct_coeff = data[zigzag[i]];
1430        const int zero_distortion = dct_coeff * dct_coeff;
1431        int best_score = 256 * 256 * 256 * 120;
1432    
1433            int distortion;
1434            int dequant_err;
1435    
1436            last_score += zero_distortion;
1437    
1438    
1439    /****************** level loop unrolled: first check coeff[i] *********/
1440        level = coeff[i];
1441    
1442            if (level > 0)  // coeff[i]==0 is not possible here
1443                    dequant_err = level * qmul + qadd - dct_coeff;
1444            else
1445                    dequant_err = level * qmul - qadd - dct_coeff;
1446    
1447            distortion = dequant_err*dequant_err;
1448    
1449            for (run = 0; run <= i - left_limit; run++) {
1450    
1451              int score = distortion + lambda*RunLevel_CalcBits_inter(run, level) + score_tab[i - run];
1452    
1453              if (score < best_score)
1454                {
1455                  best_score = score_tab[i + 1] = score;
1456                  run_tab[i + 1] = run;
1457                  level_tab[i + 1] = level;
1458                }
1459            }
1460    
1461            for (run = 0; run <= i - left_limit; run++) {
1462              int score = distortion + lambda*RunLevelLast_CalcBits_inter(run, level) + score_tab[i - run];
1463    
1464          if (score < last_score)
1465                    {
1466                      last_score = score;
1467                      last_run = run;
1468                      last_level = level;
1469                      last_i = i + 1;
1470                    }
1471        }
1472    
1473    /****************** level loop unrolled: if possible, check coeff[i]-1 *********/
1474    
1475        if (coeff_count[i]) {
1476    
1477                    level--;
1478                    dequant_err -= qmul;
1479                    distortion = dequant_err*dequant_err;
1480    
1481                    for (run = 0; run <= i - left_limit; run++) {
1482                      int score = distortion + lambda*RunLevel_CalcBits_inter(run, level) + score_tab[i-run];
1483    
1484                      if (score < best_score)
1485                        {
1486                          best_score = score_tab[i + 1] = score;
1487                          run_tab[i + 1] = run;
1488                          level_tab[i + 1] = level;
1489                        }
1490                    }
1491    
1492              for (run = 0; run <= i - left_limit; run++) {
1493                      int score = distortion + lambda*RunLevelLast_CalcBits_inter(run, level) + score_tab[i-run];
1494    
1495                  if (score < last_score)
1496                            {
1497                              last_score = score;
1498                              last_run = run;
1499                              last_level = level;
1500                              last_i = i + 1;
1501                            }
1502    
1503                }
1504            } // of check coeff[i]-1
1505    
1506    
1507    /****************** checking coeff[i]-2 doesn't isn't supported  *********/
1508    
1509    /****************** add distorsion for higher RUN (-> coeff[i]==0) *******/
1510        for (j = left_limit; j <= i; j++)
1511              score_tab[j] += zero_distortion;
1512    
1513        score_limit += zero_distortion;
1514    
1515        if (score_tab[i + 1] < score_limit)
1516              score_limit = score_tab[i + 1];
1517    
1518     // there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
1519     // so we finalize only if we have no chance of getting lower than  score_limit + 1*lambda   anymore
1520    
1521            while (score_tab[left_limit] > score_limit + lambda)
1522              left_limit++;
1523    
1524    
1525      } // end of (i=0;i<=last_non_zero;i++)
1526    
1527    
1528      last_score = 256 * 256 * 256 * 120;
1529      for (i = left_limit; i <= last_non_zero + 1; i++)
1530            {
1531              int score = score_tab[i];
1532              if (i)
1533                score += 2*lambda;  /* coded block means 2 extra bits (roughly) */
1534    
1535              if (score < last_score)
1536                {
1537                  last_score = score;
1538                  last_i = i;
1539                  last_level = level_tab[i];
1540                  last_run = run_tab[i];
1541                }
1542            }
1543    
1544      last_non_zero = last_i - 1;
1545      if (last_non_zero < 0)
1546        return last_non_zero;
1547    
1548      i = last_i;
1549    
1550      memset(qcoeff,0x00,64*sizeof(int16_t));
1551    
1552      qcoeff[zigzag[last_non_zero]] = last_level;
1553      i -= last_run + 1;
1554    
1555      for (; i > 0; i -= run_tab[i] + 1)
1556        {
1557          qcoeff[zigzag[i-1]] = level_tab[i];
1558        }
1559    
1560      return last_non_zero;
1561    }
1562    
1563    int
1564    dct_quantize_trellis_inter_mpeg_c (int16_t *qcoeff, const int16_t *data, int quant)
1565    { return 64; }
1566    
1567    
1568    
1569    
1570    
1571    /*****************************************************************************
1572     * VLC tables and other constant arrays
1573     ****************************************************************************/
1574    
1575    VLC_TABLE const coeff_tab[2][102] =
1576    {
1577            /* intra = 0 */
1578            {
1579                    {{ 2,  2}, {0, 0, 1}},
1580                    {{15,  4}, {0, 0, 2}},
1581                    {{21,  6}, {0, 0, 3}},
1582                    {{23,  7}, {0, 0, 4}},
1583                    {{31,  8}, {0, 0, 5}},
1584                    {{37,  9}, {0, 0, 6}},
1585                    {{36,  9}, {0, 0, 7}},
1586                    {{33, 10}, {0, 0, 8}},
1587                    {{32, 10}, {0, 0, 9}},
1588                    {{ 7, 11}, {0, 0, 10}},
1589                    {{ 6, 11}, {0, 0, 11}},
1590                    {{32, 11}, {0, 0, 12}},
1591                    {{ 6,  3}, {0, 1, 1}},
1592                    {{20,  6}, {0, 1, 2}},
1593                    {{30,  8}, {0, 1, 3}},
1594                    {{15, 10}, {0, 1, 4}},
1595                    {{33, 11}, {0, 1, 5}},
1596                    {{80, 12}, {0, 1, 6}},
1597                    {{14,  4}, {0, 2, 1}},
1598                    {{29,  8}, {0, 2, 2}},
1599                    {{14, 10}, {0, 2, 3}},
1600                    {{81, 12}, {0, 2, 4}},
1601                    {{13,  5}, {0, 3, 1}},
1602                    {{35,  9}, {0, 3, 2}},
1603                    {{13, 10}, {0, 3, 3}},
1604                    {{12,  5}, {0, 4, 1}},
1605                    {{34,  9}, {0, 4, 2}},
1606                    {{82, 12}, {0, 4, 3}},
1607                    {{11,  5}, {0, 5, 1}},
1608                    {{12, 10}, {0, 5, 2}},
1609                    {{83, 12}, {0, 5, 3}},
1610                    {{19,  6}, {0, 6, 1}},
1611                    {{11, 10}, {0, 6, 2}},
1612                    {{84, 12}, {0, 6, 3}},
1613                    {{18,  6}, {0, 7, 1}},
1614                    {{10, 10}, {0, 7, 2}},
1615                    {{17,  6}, {0, 8, 1}},
1616                    {{ 9, 10}, {0, 8, 2}},
1617                    {{16,  6}, {0, 9, 1}},
1618                    {{ 8, 10}, {0, 9, 2}},
1619                    {{22,  7}, {0, 10, 1}},
1620                    {{85, 12}, {0, 10, 2}},
1621                    {{21,  7}, {0, 11, 1}},
1622                    {{20,  7}, {0, 12, 1}},
1623                    {{28,  8}, {0, 13, 1}},
1624                    {{27,  8}, {0, 14, 1}},
1625                    {{33,  9}, {0, 15, 1}},
1626                    {{32,  9}, {0, 16, 1}},
1627                    {{31,  9}, {0, 17, 1}},
1628                    {{30,  9}, {0, 18, 1}},
1629                    {{29,  9}, {0, 19, 1}},
1630                    {{28,  9}, {0, 20, 1}},
1631                    {{27,  9}, {0, 21, 1}},
1632                    {{26,  9}, {0, 22, 1}},
1633                    {{34, 11}, {0, 23, 1}},
1634                    {{35, 11}, {0, 24, 1}},
1635                    {{86, 12}, {0, 25, 1}},
1636                    {{87, 12}, {0, 26, 1}},
1637                    {{ 7,  4}, {1, 0, 1}},
1638                    {{25,  9}, {1, 0, 2}},
1639                    {{ 5, 11}, {1, 0, 3}},
1640                    {{15,  6}, {1, 1, 1}},
1641                    {{ 4, 11}, {1, 1, 2}},
1642                    {{14,  6}, {1, 2, 1}},
1643                    {{13,  6}, {1, 3, 1}},
1644                    {{12,  6}, {1, 4, 1}},
1645                    {{19,  7}, {1, 5, 1}},
1646                    {{18,  7}, {1, 6, 1}},
1647                    {{17,  7}, {1, 7, 1}},
1648                    {{16,  7}, {1, 8, 1}},
1649                    {{26,  8}, {1, 9, 1}},
1650                    {{25,  8}, {1, 10, 1}},
1651                    {{24,  8}, {1, 11, 1}},
1652                    {{23,  8}, {1, 12, 1}},
1653                    {{22,  8}, {1, 13, 1}},
1654                    {{21,  8}, {1, 14, 1}},
1655                    {{20,  8}, {1, 15, 1}},
1656                    {{19,  8}, {1, 16, 1}},
1657                    {{24,  9}, {1, 17, 1}},
1658                    {{23,  9}, {1, 18, 1}},
1659                    {{22,  9}, {1, 19, 1}},
1660                    {{21,  9}, {1, 20, 1}},
1661                    {{20,  9}, {1, 21, 1}},
1662                    {{19,  9}, {1, 22, 1}},
1663                    {{18,  9}, {1, 23, 1}},
1664                    {{17,  9}, {1, 24, 1}},
1665                    {{ 7, 10}, {1, 25, 1}},
1666                    {{ 6, 10}, {1, 26, 1}},
1667                    {{ 5, 10}, {1, 27, 1}},
1668                    {{ 4, 10}, {1, 28, 1}},
1669                    {{36, 11}, {1, 29, 1}},
1670                    {{37, 11}, {1, 30, 1}},
1671                    {{38, 11}, {1, 31, 1}},
1672                    {{39, 11}, {1, 32, 1}},
1673                    {{88, 12}, {1, 33, 1}},
1674                    {{89, 12}, {1, 34, 1}},
1675                    {{90, 12}, {1, 35, 1}},
1676                    {{91, 12}, {1, 36, 1}},
1677                    {{92, 12}, {1, 37, 1}},
1678                    {{93, 12}, {1, 38, 1}},
1679                    {{94, 12}, {1, 39, 1}},
1680                    {{95, 12}, {1, 40, 1}}
1681            },
1682            /* intra = 1 */
1683            {
1684                    {{ 2,  2}, {0, 0, 1}},
1685                    {{15,  4}, {0, 0, 3}},
1686                    {{21,  6}, {0, 0, 6}},
1687                    {{23,  7}, {0, 0, 9}},
1688                    {{31,  8}, {0, 0, 10}},
1689                    {{37,  9}, {0, 0, 13}},
1690                    {{36,  9}, {0, 0, 14}},
1691                    {{33, 10}, {0, 0, 17}},
1692                    {{32, 10}, {0, 0, 18}},
1693                    {{ 7, 11}, {0, 0, 21}},
1694                    {{ 6, 11}, {0, 0, 22}},
1695                    {{32, 11}, {0, 0, 23}},
1696                    {{ 6,  3}, {0, 0, 2}},
1697                    {{20,  6}, {0, 1, 2}},
1698                    {{30,  8}, {0, 0, 11}},
1699                    {{15, 10}, {0, 0, 19}},
1700                    {{33, 11}, {0, 0, 24}},
1701                    {{80, 12}, {0, 0, 25}},
1702                    {{14,  4}, {0, 1, 1}},
1703                    {{29,  8}, {0, 0, 12}},
1704                    {{14, 10}, {0, 0, 20}},
1705                    {{81, 12}, {0, 0, 26}},
1706                    {{13,  5}, {0, 0, 4}},
1707                    {{35,  9}, {0, 0, 15}},
1708                    {{13, 10}, {0, 1, 7}},
1709                    {{12,  5}, {0, 0, 5}},
1710                    {{34,  9}, {0, 4, 2}},
1711                    {{82, 12}, {0, 0, 27}},
1712                    {{11,  5}, {0, 2, 1}},
1713                    {{12, 10}, {0, 2, 4}},
1714                    {{83, 12}, {0, 1, 9}},
1715                    {{19,  6}, {0, 0, 7}},
1716                    {{11, 10}, {0, 3, 4}},
1717                    {{84, 12}, {0, 6, 3}},
1718                    {{18,  6}, {0, 0, 8}},
1719                    {{10, 10}, {0, 4, 3}},
1720                    {{17,  6}, {0, 3, 1}},
1721                    {{ 9, 10}, {0, 8, 2}},
1722                    {{16,  6}, {0, 4, 1}},
1723                    {{ 8, 10}, {0, 5, 3}},
1724                    {{22,  7}, {0, 1, 3}},
1725                    {{85, 12}, {0, 1, 10}},
1726                    {{21,  7}, {0, 2, 2}},
1727                    {{20,  7}, {0, 7, 1}},
1728                    {{28,  8}, {0, 1, 4}},
1729                    {{27,  8}, {0, 3, 2}},
1730                    {{33,  9}, {0, 0, 16}},
1731                    {{32,  9}, {0, 1, 5}},
1732                    {{31,  9}, {0, 1, 6}},
1733                    {{30,  9}, {0, 2, 3}},
1734                    {{29,  9}, {0, 3, 3}},
1735                    {{28,  9}, {0, 5, 2}},
1736                    {{27,  9}, {0, 6, 2}},
1737                    {{26,  9}, {0, 7, 2}},
1738                    {{34, 11}, {0, 1, 8}},
1739                    {{35, 11}, {0, 9, 2}},
1740                    {{86, 12}, {0, 2, 5}},
1741                    {{87, 12}, {0, 7, 3}},
1742                    {{ 7,  4}, {1, 0, 1}},
1743                    {{25,  9}, {0, 11, 1}},
1744                    {{ 5, 11}, {1, 0, 6}},
1745                    {{15,  6}, {1, 1, 1}},
1746                    {{ 4, 11}, {1, 0, 7}},
1747                    {{14,  6}, {1, 2, 1}},
1748                    {{13,  6}, {0, 5, 1}},
1749                    {{12,  6}, {1, 0, 2}},
1750                    {{19,  7}, {1, 5, 1}},
1751                    {{18,  7}, {0, 6, 1}},
1752                    {{17,  7}, {1, 3, 1}},
1753                    {{16,  7}, {1, 4, 1}},
1754                    {{26,  8}, {1, 9, 1}},
1755                    {{25,  8}, {0, 8, 1}},
1756                    {{24,  8}, {0, 9, 1}},
1757                    {{23,  8}, {0, 10, 1}},
1758                    {{22,  8}, {1, 0, 3}},
1759                    {{21,  8}, {1, 6, 1}},
1760                    {{20,  8}, {1, 7, 1}},
1761                    {{19,  8}, {1, 8, 1}},
1762                    {{24,  9}, {0, 12, 1}},
1763                    {{23,  9}, {1, 0, 4}},
1764                    {{22,  9}, {1, 1, 2}},
1765                    {{21,  9}, {1, 10, 1}},
1766                    {{20,  9}, {1, 11, 1}},
1767                    {{19,  9}, {1, 12, 1}},
1768                    {{18,  9}, {1, 13, 1}},
1769                    {{17,  9}, {1, 14, 1}},
1770                    {{ 7, 10}, {0, 13, 1}},
1771                    {{ 6, 10}, {1, 0, 5}},
1772                    {{ 5, 10}, {1, 1, 3}},
1773                    {{ 4, 10}, {1, 2, 2}},
1774                    {{36, 11}, {1, 3, 2}},
1775                    {{37, 11}, {1, 4, 2}},
1776                    {{38, 11}, {1, 15, 1}},
1777                    {{39, 11}, {1, 16, 1}},
1778                    {{88, 12}, {0, 14, 1}},
1779                    {{89, 12}, {1, 0, 8}},
1780                    {{90, 12}, {1, 5, 2}},
1781                    {{91, 12}, {1, 6, 2}},
1782                    {{92, 12}, {1, 17, 1}},
1783                    {{93, 12}, {1, 18, 1}},
1784                    {{94, 12}, {1, 19, 1}},
1785                    {{95, 12}, {1, 20, 1}}
1786            }
1787    };
1788    
1789    /* constants taken from momusys/vm_common/inlcude/max_level.h */
1790    uint8_t const max_level[2][2][64] = {
1791            {
1792                    /* intra = 0, last = 0 */
1793                    {
1794                            12, 6, 4, 3, 3, 3, 3, 2,
1795                            2, 2, 2, 1, 1, 1, 1, 1,
1796                            1, 1, 1, 1, 1, 1, 1, 1,
1797                            1, 1, 1, 0, 0, 0, 0, 0,
1798                            0, 0, 0, 0, 0, 0, 0, 0,
1799                            0, 0, 0, 0, 0, 0, 0, 0,
1800                            0, 0, 0, 0, 0, 0, 0, 0,
1801                            0, 0, 0, 0, 0, 0, 0, 0
1802                    },
1803                    /* intra = 0, last = 1 */
1804                    {
1805                            3, 2, 1, 1, 1, 1, 1, 1,
1806                            1, 1, 1, 1, 1, 1, 1, 1,
1807                            1, 1, 1, 1, 1, 1, 1, 1,
1808                            1, 1, 1, 1, 1, 1, 1, 1,
1809                            1, 1, 1, 1, 1, 1, 1, 1,
1810                            1, 0, 0, 0, 0, 0, 0, 0,
1811                            0, 0, 0, 0, 0, 0, 0, 0,
1812                            0, 0, 0, 0, 0, 0, 0, 0
1813                    }
1814            },
1815            {
1816                    /* intra = 1, last = 0 */
1817                    {
1818                            27, 10, 5, 4, 3, 3, 3, 3,
1819                            2, 2, 1, 1, 1, 1, 1, 0,
1820                            0, 0, 0, 0, 0, 0, 0, 0,
1821                            0, 0, 0, 0, 0, 0, 0, 0,
1822                            0, 0, 0, 0, 0, 0, 0, 0,
1823                            0, 0, 0, 0, 0, 0, 0, 0,
1824                            0, 0, 0, 0, 0, 0, 0, 0,
1825                            0, 0, 0, 0, 0, 0, 0, 0
1826                    },
1827                    /* intra = 1, last = 1 */
1828                    {
1829                            8, 3, 2, 2, 2, 2, 2, 1,
1830                            1, 1, 1, 1, 1, 1, 1, 1,
1831                            1, 1, 1, 1, 1, 0, 0, 0,
1832                            0, 0, 0, 0, 0, 0, 0, 0,
1833                            0, 0, 0, 0, 0, 0, 0, 0,
1834                            0, 0, 0, 0, 0, 0, 0, 0,
1835                            0, 0, 0, 0, 0, 0, 0, 0,
1836                            0, 0, 0, 0, 0, 0, 0, 0
1837                    }
1838            }
1839    };
1840    
1841    uint8_t const max_run[2][2][64] = {
1842            {
1843                    /* intra = 0, last = 0 */
1844                    {
1845                            0, 26, 10, 6, 2, 1, 1, 0,
1846                            0, 0, 0, 0, 0, 0, 0, 0,
1847                            0, 0, 0, 0, 0, 0, 0, 0,
1848                            0, 0, 0, 0, 0, 0, 0, 0,
1849                            0, 0, 0, 0, 0, 0, 0, 0,
1850                            0, 0, 0, 0, 0, 0, 0, 0,
1851                            0, 0, 0, 0, 0, 0, 0, 0,
1852                            0, 0, 0, 0, 0, 0, 0, 0,
1853                    },
1854                    /* intra = 0, last = 1 */
1855                    {
1856                            0, 40, 1, 0, 0, 0, 0, 0,
1857                            0, 0, 0, 0, 0, 0, 0, 0,
1858                            0, 0, 0, 0, 0, 0, 0, 0,
1859                            0, 0, 0, 0, 0, 0, 0, 0,
1860                            0, 0, 0, 0, 0, 0, 0, 0,
1861                            0, 0, 0, 0, 0, 0, 0, 0,
1862                            0, 0, 0, 0, 0, 0, 0, 0,
1863                            0, 0, 0, 0, 0, 0, 0, 0,
1864                    }
1865            },
1866            {
1867                    /* intra = 1, last = 0 */
1868                    {
1869                            0, 14, 9, 7, 3, 2, 1, 1,
1870                            1, 1, 1, 0, 0, 0, 0, 0,
1871                            0, 0, 0, 0, 0, 0, 0, 0,
1872                            0, 0, 0, 0, 0, 0, 0, 0,
1873                            0, 0, 0, 0, 0, 0, 0, 0,
1874                            0, 0, 0, 0, 0, 0, 0, 0,
1875                            0, 0, 0, 0, 0, 0, 0, 0,
1876                            0, 0, 0, 0, 0, 0, 0, 0,
1877                    },
1878                    /* intra = 1, last = 1 */
1879                    {
1880                            0, 20, 6, 1, 0, 0, 0, 0,
1881                            0, 0, 0, 0, 0, 0, 0, 0,
1882                            0, 0, 0, 0, 0, 0, 0, 0,
1883                            0, 0, 0, 0, 0, 0, 0, 0,
1884                            0, 0, 0, 0, 0, 0, 0, 0,
1885                            0, 0, 0, 0, 0, 0, 0, 0,
1886                            0, 0, 0, 0, 0, 0, 0, 0,
1887                            0, 0, 0, 0, 0, 0, 0, 0,
1888                    }
1889            }
1890    };
1891    
1892    /******************************************************************
1893     * encoder tables                                                 *
1894     ******************************************************************/
1895    
1896    VLC sprite_trajectory_code[32768];
1897    
1898    VLC sprite_trajectory_len[15] = {
1899            { 0x00 , 2},
1900            { 0x02 , 3}, { 0x03, 3}, { 0x04, 3}, { 0x05, 3}, { 0x06, 3},
1901            { 0x0E , 4}, { 0x1E, 5}, { 0x3E, 6}, { 0x7F, 7}, { 0xFE, 8},
1902            { 0x1FE, 9}, {0x3FE,10}, {0x7FE,11}, {0xFFE,12} };
1903    
1904    
1905    /* DCT coefficients. Four tables, two for last = 0, two for last = 1.
1906       the sign bit must be added afterwards. */
1907    
1908    /* MCBPC Indexing by cbpc in first two bits, mode in last two.
1909     CBPC as in table 4/H.263, MB type (mode): 3 = 01, 4 = 10.
1910     Example: cbpc = 01 and mode = 4 gives index = 0110 = 6. */
1911    
1912    VLC mcbpc_intra_tab[15] = {
1913            {0x01, 9}, {0x01, 1}, {0x01, 4}, {0x00, 0},
1914            {0x00, 0}, {0x01, 3}, {0x01, 6}, {0x00, 0},
1915            {0x00, 0}, {0x02, 3}, {0x02, 6}, {0x00, 0},
1916            {0x00, 0}, {0x03, 3}, {0x03, 6}
1917    };
1918    
1919    /* MCBPC inter.
1920       Addressing: 5 bit ccmmm (cc = CBPC, mmm = mode (1-4 binary)) */
1921    
1922    VLC mcbpc_inter_tab[29] = {
1923            {1, 1}, {3, 3}, {2, 3}, {3, 5}, {4, 6}, {1, 9}, {0, 0}, {0, 0},
1924            {3, 4}, {7, 7}, {5, 7}, {4, 8}, {4, 9}, {0, 0}, {0, 0}, {0, 0},
1925            {2, 4}, {6, 7}, {4, 7}, {3, 8}, {3, 9}, {0, 0}, {0, 0}, {0, 0},
1926            {5, 6}, {5, 9}, {5, 8}, {3, 7}, {2, 9}
1927    };
1928    
1929    const VLC xvid_cbpy_tab[16] = {
1930            {3, 4}, {5, 5}, {4, 5}, {9, 4}, {3, 5}, {7, 4}, {2, 6}, {11, 4},
1931            {2, 5}, {3, 6}, {5, 4}, {10, 4}, {4, 4}, {8, 4}, {6, 4}, {3, 2}
1932    };
1933    
1934    const VLC dcy_tab[511] = {
1935            {0x100, 15}, {0x101, 15}, {0x102, 15}, {0x103, 15},
1936            {0x104, 15}, {0x105, 15}, {0x106, 15}, {0x107, 15},
1937            {0x108, 15}, {0x109, 15}, {0x10a, 15}, {0x10b, 15},
1938            {0x10c, 15}, {0x10d, 15}, {0x10e, 15}, {0x10f, 15},
1939            {0x110, 15}, {0x111, 15}, {0x112, 15}, {0x113, 15},
1940            {0x114, 15}, {0x115, 15}, {0x116, 15}, {0x117, 15},
1941            {0x118, 15}, {0x119, 15}, {0x11a, 15}, {0x11b, 15},
1942            {0x11c, 15}, {0x11d, 15}, {0x11e, 15}, {0x11f, 15},
1943            {0x120, 15}, {0x121, 15}, {0x122, 15}, {0x123, 15},
1944            {0x124, 15}, {0x125, 15}, {0x126, 15}, {0x127, 15},
1945            {0x128, 15}, {0x129, 15}, {0x12a, 15}, {0x12b, 15},
1946            {0x12c, 15}, {0x12d, 15}, {0x12e, 15}, {0x12f, 15},
1947            {0x130, 15}, {0x131, 15}, {0x132, 15}, {0x133, 15},
1948            {0x134, 15}, {0x135, 15}, {0x136, 15}, {0x137, 15},
1949            {0x138, 15}, {0x139, 15}, {0x13a, 15}, {0x13b, 15},
1950            {0x13c, 15}, {0x13d, 15}, {0x13e, 15}, {0x13f, 15},
1951            {0x140, 15}, {0x141, 15}, {0x142, 15}, {0x143, 15},
1952            {0x144, 15}, {0x145, 15}, {0x146, 15}, {0x147, 15},
1953            {0x148, 15}, {0x149, 15}, {0x14a, 15}, {0x14b, 15},
1954            {0x14c, 15}, {0x14d, 15}, {0x14e, 15}, {0x14f, 15},
1955            {0x150, 15}, {0x151, 15}, {0x152, 15}, {0x153, 15},
1956            {0x154, 15}, {0x155, 15}, {0x156, 15}, {0x157, 15},
1957            {0x158, 15}, {0x159, 15}, {0x15a, 15}, {0x15b, 15},
1958            {0x15c, 15}, {0x15d, 15}, {0x15e, 15}, {0x15f, 15},
1959            {0x160, 15}, {0x161, 15}, {0x162, 15}, {0x163, 15},
1960            {0x164, 15}, {0x165, 15}, {0x166, 15}, {0x167, 15},
1961            {0x168, 15}, {0x169, 15}, {0x16a, 15}, {0x16b, 15},
1962            {0x16c, 15}, {0x16d, 15}, {0x16e, 15}, {0x16f, 15},
1963            {0x170, 15}, {0x171, 15}, {0x172, 15}, {0x173, 15},
1964            {0x174, 15}, {0x175, 15}, {0x176, 15}, {0x177, 15},
1965            {0x178, 15}, {0x179, 15}, {0x17a, 15}, {0x17b, 15},
1966            {0x17c, 15}, {0x17d, 15}, {0x17e, 15}, {0x17f, 15},
1967            {0x80, 13}, {0x81, 13}, {0x82, 13}, {0x83, 13},
1968            {0x84, 13}, {0x85, 13}, {0x86, 13}, {0x87, 13},
1969            {0x88, 13}, {0x89, 13}, {0x8a, 13}, {0x8b, 13},
1970            {0x8c, 13}, {0x8d, 13}, {0x8e, 13}, {0x8f, 13},
1971            {0x90, 13}, {0x91, 13}, {0x92, 13}, {0x93, 13},
1972            {0x94, 13}, {0x95, 13}, {0x96, 13}, {0x97, 13},
1973            {0x98, 13}, {0x99, 13}, {0x9a, 13}, {0x9b, 13},
1974            {0x9c, 13}, {0x9d, 13}, {0x9e, 13}, {0x9f, 13},
1975            {0xa0, 13}, {0xa1, 13}, {0xa2, 13}, {0xa3, 13},
1976            {0xa4, 13}, {0xa5, 13}, {0xa6, 13}, {0xa7, 13},
1977            {0xa8, 13}, {0xa9, 13}, {0xaa, 13}, {0xab, 13},
1978            {0xac, 13}, {0xad, 13}, {0xae, 13}, {0xaf, 13},
1979            {0xb0, 13}, {0xb1, 13}, {0xb2, 13}, {0xb3, 13},
1980            {0xb4, 13}, {0xb5, 13}, {0xb6, 13}, {0xb7, 13},
1981            {0xb8, 13}, {0xb9, 13}, {0xba, 13}, {0xbb, 13},
1982            {0xbc, 13}, {0xbd, 13}, {0xbe, 13}, {0xbf, 13},
1983            {0x40, 11}, {0x41, 11}, {0x42, 11}, {0x43, 11},
1984            {0x44, 11}, {0x45, 11}, {0x46, 11}, {0x47, 11},
1985            {0x48, 11}, {0x49, 11}, {0x4a, 11}, {0x4b, 11},
1986            {0x4c, 11}, {0x4d, 11}, {0x4e, 11}, {0x4f, 11},
1987            {0x50, 11}, {0x51, 11}, {0x52, 11}, {0x53, 11},
1988            {0x54, 11}, {0x55, 11}, {0x56, 11}, {0x57, 11},
1989            {0x58, 11}, {0x59, 11}, {0x5a, 11}, {0x5b, 11},
1990            {0x5c, 11}, {0x5d, 11}, {0x5e, 11}, {0x5f, 11},
1991            {0x20, 9}, {0x21, 9}, {0x22, 9}, {0x23, 9},
1992            {0x24, 9}, {0x25, 9}, {0x26, 9}, {0x27, 9},
1993            {0x28, 9}, {0x29, 9}, {0x2a, 9}, {0x2b, 9},
1994            {0x2c, 9}, {0x2d, 9}, {0x2e, 9}, {0x2f, 9},
1995            {0x10, 7}, {0x11, 7}, {0x12, 7}, {0x13, 7},
1996            {0x14, 7}, {0x15, 7}, {0x16, 7}, {0x17, 7},
1997            {0x10, 6}, {0x11, 6}, {0x12, 6}, {0x13, 6},
1998            {0x08, 4}, {0x09, 4}, {0x06, 3}, {0x03, 3},
1999            {0x07, 3}, {0x0a, 4}, {0x0b, 4}, {0x14, 6},
2000            {0x15, 6}, {0x16, 6}, {0x17, 6}, {0x18, 7},
2001            {0x19, 7}, {0x1a, 7}, {0x1b, 7}, {0x1c, 7},
2002            {0x1d, 7}, {0x1e, 7}, {0x1f, 7}, {0x30, 9},
2003            {0x31, 9}, {0x32, 9}, {0x33, 9}, {0x34, 9},
2004            {0x35, 9}, {0x36, 9}, {0x37, 9}, {0x38, 9},
2005            {0x39, 9}, {0x3a, 9}, {0x3b, 9}, {0x3c, 9},
2006            {0x3d, 9}, {0x3e, 9}, {0x3f, 9}, {0x60, 11},
2007            {0x61, 11}, {0x62, 11}, {0x63, 11}, {0x64, 11},
2008            {0x65, 11}, {0x66, 11}, {0x67, 11}, {0x68, 11},
2009            {0x69, 11}, {0x6a, 11}, {0x6b, 11}, {0x6c, 11},
2010            {0x6d, 11}, {0x6e, 11}, {0x6f, 11}, {0x70, 11},
2011            {0x71, 11}, {0x72, 11}, {0x73, 11}, {0x74, 11},
2012            {0x75, 11}, {0x76, 11}, {0x77, 11}, {0x78, 11},
2013            {0x79, 11}, {0x7a, 11}, {0x7b, 11}, {0x7c, 11},
2014            {0x7d, 11}, {0x7e, 11}, {0x7f, 11}, {0xc0, 13},
2015            {0xc1, 13}, {0xc2, 13}, {0xc3, 13}, {0xc4, 13},
2016            {0xc5, 13}, {0xc6, 13}, {0xc7, 13}, {0xc8, 13},
2017            {0xc9, 13}, {0xca, 13}, {0xcb, 13}, {0xcc, 13},
2018            {0xcd, 13}, {0xce, 13}, {0xcf, 13}, {0xd0, 13},
2019            {0xd1, 13}, {0xd2, 13}, {0xd3, 13}, {0xd4, 13},
2020            {0xd5, 13}, {0xd6, 13}, {0xd7, 13}, {0xd8, 13},
2021            {0xd9, 13}, {0xda, 13}, {0xdb, 13}, {0xdc, 13},
2022            {0xdd, 13}, {0xde, 13}, {0xdf, 13}, {0xe0, 13},
2023            {0xe1, 13}, {0xe2, 13}, {0xe3, 13}, {0xe4, 13},
2024            {0xe5, 13}, {0xe6, 13}, {0xe7, 13}, {0xe8, 13},
2025            {0xe9, 13}, {0xea, 13}, {0xeb, 13}, {0xec, 13},
2026            {0xed, 13}, {0xee, 13}, {0xef, 13}, {0xf0, 13},
2027            {0xf1, 13}, {0xf2, 13}, {0xf3, 13}, {0xf4, 13},
2028            {0xf5, 13}, {0xf6, 13}, {0xf7, 13}, {0xf8, 13},
2029            {0xf9, 13}, {0xfa, 13}, {0xfb, 13}, {0xfc, 13},
2030            {0xfd, 13}, {0xfe, 13}, {0xff, 13}, {0x180, 15},
2031            {0x181, 15}, {0x182, 15}, {0x183, 15}, {0x184, 15},
2032            {0x185, 15}, {0x186, 15}, {0x187, 15}, {0x188, 15},
2033            {0x189, 15}, {0x18a, 15}, {0x18b, 15}, {0x18c, 15},
2034            {0x18d, 15}, {0x18e, 15}, {0x18f, 15}, {0x190, 15},
2035            {0x191, 15}, {0x192, 15}, {0x193, 15}, {0x194, 15},
2036            {0x195, 15}, {0x196, 15}, {0x197, 15}, {0x198, 15},
2037            {0x199, 15}, {0x19a, 15}, {0x19b, 15}, {0x19c, 15},
2038            {0x19d, 15}, {0x19e, 15}, {0x19f, 15}, {0x1a0, 15},
2039            {0x1a1, 15}, {0x1a2, 15}, {0x1a3, 15}, {0x1a4, 15},
2040            {0x1a5, 15}, {0x1a6, 15}, {0x1a7, 15}, {0x1a8, 15},
2041            {0x1a9, 15}, {0x1aa, 15}, {0x1ab, 15}, {0x1ac, 15},
2042            {0x1ad, 15}, {0x1ae, 15}, {0x1af, 15}, {0x1b0, 15},
2043            {0x1b1, 15}, {0x1b2, 15}, {0x1b3, 15}, {0x1b4, 15},
2044            {0x1b5, 15}, {0x1b6, 15}, {0x1b7, 15}, {0x1b8, 15},
2045            {0x1b9, 15}, {0x1ba, 15}, {0x1bb, 15}, {0x1bc, 15},
2046            {0x1bd, 15}, {0x1be, 15}, {0x1bf, 15}, {0x1c0, 15},
2047            {0x1c1, 15}, {0x1c2, 15}, {0x1c3, 15}, {0x1c4, 15},
2048            {0x1c5, 15}, {0x1c6, 15}, {0x1c7, 15}, {0x1c8, 15},
2049            {0x1c9, 15}, {0x1ca, 15}, {0x1cb, 15}, {0x1cc, 15},
2050            {0x1cd, 15}, {0x1ce, 15}, {0x1cf, 15}, {0x1d0, 15},
2051            {0x1d1, 15}, {0x1d2, 15}, {0x1d3, 15}, {0x1d4, 15},
2052            {0x1d5, 15}, {0x1d6, 15}, {0x1d7, 15}, {0x1d8, 15},
2053            {0x1d9, 15}, {0x1da, 15}, {0x1db, 15}, {0x1dc, 15},
2054            {0x1dd, 15}, {0x1de, 15}, {0x1df, 15}, {0x1e0, 15},
2055            {0x1e1, 15}, {0x1e2, 15}, {0x1e3, 15}, {0x1e4, 15},
2056            {0x1e5, 15}, {0x1e6, 15}, {0x1e7, 15}, {0x1e8, 15},
2057            {0x1e9, 15}, {0x1ea, 15}, {0x1eb, 15}, {0x1ec, 15},
2058            {0x1ed, 15}, {0x1ee, 15}, {0x1ef, 15}, {0x1f0, 15},
2059            {0x1f1, 15}, {0x1f2, 15}, {0x1f3, 15}, {0x1f4, 15},
2060            {0x1f5, 15}, {0x1f6, 15}, {0x1f7, 15}, {0x1f8, 15},
2061            {0x1f9, 15}, {0x1fa, 15}, {0x1fb, 15}, {0x1fc, 15},
2062            {0x1fd, 15}, {0x1fe, 15}, {0x1ff, 15},
2063    };
2064    
2065    const VLC dcc_tab[511] = {
2066            {0x100, 16}, {0x101, 16}, {0x102, 16}, {0x103, 16},
2067            {0x104, 16}, {0x105, 16}, {0x106, 16}, {0x107, 16},
2068            {0x108, 16}, {0x109, 16}, {0x10a, 16}, {0x10b, 16},
2069            {0x10c, 16}, {0x10d, 16}, {0x10e, 16}, {0x10f, 16},
2070            {0x110, 16}, {0x111, 16}, {0x112, 16}, {0x113, 16},
2071            {0x114, 16}, {0x115, 16}, {0x116, 16}, {0x117, 16},
2072            {0x118, 16}, {0x119, 16}, {0x11a, 16}, {0x11b, 16},
2073            {0x11c, 16}, {0x11d, 16}, {0x11e, 16}, {0x11f, 16},
2074            {0x120, 16}, {0x121, 16}, {0x122, 16}, {0x123, 16},
2075            {0x124, 16}, {0x125, 16}, {0x126, 16}, {0x127, 16},
2076            {0x128, 16}, {0x129, 16}, {0x12a, 16}, {0x12b, 16},
2077            {0x12c, 16}, {0x12d, 16}, {0x12e, 16}, {0x12f, 16},
2078            {0x130, 16}, {0x131, 16}, {0x132, 16}, {0x133, 16},
2079            {0x134, 16}, {0x135, 16}, {0x136, 16}, {0x137, 16},
2080            {0x138, 16}, {0x139, 16}, {0x13a, 16}, {0x13b, 16},
2081            {0x13c, 16}, {0x13d, 16}, {0x13e, 16}, {0x13f, 16},
2082            {0x140, 16}, {0x141, 16}, {0x142, 16}, {0x143, 16},
2083            {0x144, 16}, {0x145, 16}, {0x146, 16}, {0x147, 16},
2084            {0x148, 16}, {0x149, 16}, {0x14a, 16}, {0x14b, 16},
2085            {0x14c, 16}, {0x14d, 16}, {0x14e, 16}, {0x14f, 16},
2086            {0x150, 16}, {0x151, 16}, {0x152, 16}, {0x153, 16},
2087            {0x154, 16}, {0x155, 16}, {0x156, 16}, {0x157, 16},
2088            {0x158, 16}, {0x159, 16}, {0x15a, 16}, {0x15b, 16},
2089            {0x15c, 16}, {0x15d, 16}, {0x15e, 16}, {0x15f, 16},
2090            {0x160, 16}, {0x161, 16}, {0x162, 16}, {0x163, 16},
2091            {0x164, 16}, {0x165, 16}, {0x166, 16}, {0x167, 16},
2092            {0x168, 16}, {0x169, 16}, {0x16a, 16}, {0x16b, 16},
2093            {0x16c, 16}, {0x16d, 16}, {0x16e, 16}, {0x16f, 16},
2094            {0x170, 16}, {0x171, 16}, {0x172, 16}, {0x173, 16},
2095            {0x174, 16}, {0x175, 16}, {0x176, 16}, {0x177, 16},
2096            {0x178, 16}, {0x179, 16}, {0x17a, 16}, {0x17b, 16},
2097            {0x17c, 16}, {0x17d, 16}, {0x17e, 16}, {0x17f, 16},
2098            {0x80, 14}, {0x81, 14}, {0x82, 14}, {0x83, 14},
2099            {0x84, 14}, {0x85, 14}, {0x86, 14}, {0x87, 14},
2100            {0x88, 14}, {0x89, 14}, {0x8a, 14}, {0x8b, 14},
2101            {0x8c, 14}, {0x8d, 14}, {0x8e, 14}, {0x8f, 14},
2102            {0x90, 14}, {0x91, 14}, {0x92, 14}, {0x93, 14},
2103            {0x94, 14}, {0x95, 14}, {0x96, 14}, {0x97, 14},
2104            {0x98, 14}, {0x99, 14}, {0x9a, 14}, {0x9b, 14},
2105            {0x9c, 14}, {0x9d, 14}, {0x9e, 14}, {0x9f, 14},
2106            {0xa0, 14}, {0xa1, 14}, {0xa2, 14}, {0xa3, 14},
2107            {0xa4, 14}, {0xa5, 14}, {0xa6, 14}, {0xa7, 14},
2108            {0xa8, 14}, {0xa9, 14}, {0xaa, 14}, {0xab, 14},
2109            {0xac, 14}, {0xad, 14}, {0xae, 14}, {0xaf, 14},
2110            {0xb0, 14}, {0xb1, 14}, {0xb2, 14}, {0xb3, 14},
2111            {0xb4, 14}, {0xb5, 14}, {0xb6, 14}, {0xb7, 14},
2112            {0xb8, 14}, {0xb9, 14}, {0xba, 14}, {0xbb, 14},
2113            {0xbc, 14}, {0xbd, 14}, {0xbe, 14}, {0xbf, 14},
2114            {0x40, 12}, {0x41, 12}, {0x42, 12}, {0x43, 12},
2115            {0x44, 12}, {0x45, 12}, {0x46, 12}, {0x47, 12},
2116            {0x48, 12}, {0x49, 12}, {0x4a, 12}, {0x4b, 12},
2117            {0x4c, 12}, {0x4d, 12}, {0x4e, 12}, {0x4f, 12},
2118            {0x50, 12}, {0x51, 12}, {0x52, 12}, {0x53, 12},
2119            {0x54, 12}, {0x55, 12}, {0x56, 12}, {0x57, 12},
2120            {0x58, 12}, {0x59, 12}, {0x5a, 12}, {0x5b, 12},
2121            {0x5c, 12}, {0x5d, 12}, {0x5e, 12}, {0x5f, 12},
2122            {0x20, 10}, {0x21, 10}, {0x22, 10}, {0x23, 10},
2123            {0x24, 10}, {0x25, 10}, {0x26, 10}, {0x27, 10},
2124            {0x28, 10}, {0x29, 10}, {0x2a, 10}, {0x2b, 10},
2125            {0x2c, 10}, {0x2d, 10}, {0x2e, 10}, {0x2f, 10},
2126            {0x10, 8}, {0x11, 8}, {0x12, 8}, {0x13, 8},
2127            {0x14, 8}, {0x15, 8}, {0x16, 8}, {0x17, 8},
2128            {0x08, 6}, {0x09, 6}, {0x0a, 6}, {0x0b, 6},
2129            {0x04, 4}, {0x05, 4}, {0x04, 3}, {0x03, 2},
2130            {0x05, 3}, {0x06, 4}, {0x07, 4}, {0x0c, 6},
2131            {0x0d, 6}, {0x0e, 6}, {0x0f, 6}, {0x18, 8},
2132            {0x19, 8}, {0x1a, 8}, {0x1b, 8}, {0x1c, 8},
2133            {0x1d, 8}, {0x1e, 8}, {0x1f, 8}, {0x30, 10},
2134            {0x31, 10}, {0x32, 10}, {0x33, 10}, {0x34, 10},
2135            {0x35, 10}, {0x36, 10}, {0x37, 10}, {0x38, 10},
2136            {0x39, 10}, {0x3a, 10}, {0x3b, 10}, {0x3c, 10},
2137            {0x3d, 10}, {0x3e, 10}, {0x3f, 10}, {0x60, 12},
2138            {0x61, 12}, {0x62, 12}, {0x63, 12}, {0x64, 12},
2139            {0x65, 12}, {0x66, 12}, {0x67, 12}, {0x68, 12},
2140            {0x69, 12}, {0x6a, 12}, {0x6b, 12}, {0x6c, 12},
2141            {0x6d, 12}, {0x6e, 12}, {0x6f, 12}, {0x70, 12},
2142            {0x71, 12}, {0x72, 12}, {0x73, 12}, {0x74, 12},
2143            {0x75, 12}, {0x76, 12}, {0x77, 12}, {0x78, 12},
2144            {0x79, 12}, {0x7a, 12}, {0x7b, 12}, {0x7c, 12},
2145            {0x7d, 12}, {0x7e, 12}, {0x7f, 12}, {0xc0, 14},
2146            {0xc1, 14}, {0xc2, 14}, {0xc3, 14}, {0xc4, 14},
2147            {0xc5, 14}, {0xc6, 14}, {0xc7, 14}, {0xc8, 14},
2148            {0xc9, 14}, {0xca, 14}, {0xcb, 14}, {0xcc, 14},
2149            {0xcd, 14}, {0xce, 14}, {0xcf, 14}, {0xd0, 14},
2150            {0xd1, 14}, {0xd2, 14}, {0xd3, 14}, {0xd4, 14},
2151            {0xd5, 14}, {0xd6, 14}, {0xd7, 14}, {0xd8, 14},
2152            {0xd9, 14}, {0xda, 14}, {0xdb, 14}, {0xdc, 14},
2153            {0xdd, 14}, {0xde, 14}, {0xdf, 14}, {0xe0, 14},
2154            {0xe1, 14}, {0xe2, 14}, {0xe3, 14}, {0xe4, 14},
2155            {0xe5, 14}, {0xe6, 14}, {0xe7, 14}, {0xe8, 14},
2156            {0xe9, 14}, {0xea, 14}, {0xeb, 14}, {0xec, 14},
2157            {0xed, 14}, {0xee, 14}, {0xef, 14}, {0xf0, 14},
2158            {0xf1, 14}, {0xf2, 14}, {0xf3, 14}, {0xf4, 14},
2159            {0xf5, 14}, {0xf6, 14}, {0xf7, 14}, {0xf8, 14},
2160            {0xf9, 14}, {0xfa, 14}, {0xfb, 14}, {0xfc, 14},
2161            {0xfd, 14}, {0xfe, 14}, {0xff, 14}, {0x180, 16},
2162            {0x181, 16}, {0x182, 16}, {0x183, 16}, {0x184, 16},
2163            {0x185, 16}, {0x186, 16}, {0x187, 16}, {0x188, 16},
2164            {0x189, 16}, {0x18a, 16}, {0x18b, 16}, {0x18c, 16},
2165            {0x18d, 16}, {0x18e, 16}, {0x18f, 16}, {0x190, 16},
2166            {0x191, 16}, {0x192, 16}, {0x193, 16}, {0x194, 16},
2167            {0x195, 16}, {0x196, 16}, {0x197, 16}, {0x198, 16},
2168            {0x199, 16}, {0x19a, 16}, {0x19b, 16}, {0x19c, 16},
2169            {0x19d, 16}, {0x19e, 16}, {0x19f, 16}, {0x1a0, 16},
2170            {0x1a1, 16}, {0x1a2, 16}, {0x1a3, 16}, {0x1a4, 16},
2171            {0x1a5, 16}, {0x1a6, 16}, {0x1a7, 16}, {0x1a8, 16},
2172            {0x1a9, 16}, {0x1aa, 16}, {0x1ab, 16}, {0x1ac, 16},
2173            {0x1ad, 16}, {0x1ae, 16}, {0x1af, 16}, {0x1b0, 16},
2174            {0x1b1, 16}, {0x1b2, 16}, {0x1b3, 16}, {0x1b4, 16},
2175            {0x1b5, 16}, {0x1b6, 16}, {0x1b7, 16}, {0x1b8, 16},
2176            {0x1b9, 16}, {0x1ba, 16}, {0x1bb, 16}, {0x1bc, 16},
2177            {0x1bd, 16}, {0x1be, 16}, {0x1bf, 16}, {0x1c0, 16},
2178            {0x1c1, 16}, {0x1c2, 16}, {0x1c3, 16}, {0x1c4, 16},
2179            {0x1c5, 16}, {0x1c6, 16}, {0x1c7, 16}, {0x1c8, 16},
2180            {0x1c9, 16}, {0x1ca, 16}, {0x1cb, 16}, {0x1cc, 16},
2181            {0x1cd, 16}, {0x1ce, 16}, {0x1cf, 16}, {0x1d0, 16},
2182            {0x1d1, 16}, {0x1d2, 16}, {0x1d3, 16}, {0x1d4, 16},
2183            {0x1d5, 16}, {0x1d6, 16}, {0x1d7, 16}, {0x1d8, 16},
2184            {0x1d9, 16}, {0x1da, 16}, {0x1db, 16}, {0x1dc, 16},
2185            {0x1dd, 16}, {0x1de, 16}, {0x1df, 16}, {0x1e0, 16},
2186            {0x1e1, 16}, {0x1e2, 16}, {0x1e3, 16}, {0x1e4, 16},
2187            {0x1e5, 16}, {0x1e6, 16}, {0x1e7, 16}, {0x1e8, 16},
2188            {0x1e9, 16}, {0x1ea, 16}, {0x1eb, 16}, {0x1ec, 16},
2189            {0x1ed, 16}, {0x1ee, 16}, {0x1ef, 16}, {0x1f0, 16},
2190            {0x1f1, 16}, {0x1f2, 16}, {0x1f3, 16}, {0x1f4, 16},
2191            {0x1f5, 16}, {0x1f6, 16}, {0x1f7, 16}, {0x1f8, 16},
2192            {0x1f9, 16}, {0x1fa, 16}, {0x1fb, 16}, {0x1fc, 16},
2193            {0x1fd, 16}, {0x1fe, 16}, {0x1ff, 16},
2194    };
2195    
2196    
2197    const VLC mb_motion_table[65] = {
2198            {0x05, 13}, {0x07, 13}, {0x05, 12}, {0x07, 12},
2199            {0x09, 12}, {0x0b, 12}, {0x0d, 12}, {0x0f, 12},
2200            {0x09, 11}, {0x0b, 11}, {0x0d, 11}, {0x0f, 11},
2201            {0x11, 11}, {0x13, 11}, {0x15, 11}, {0x17, 11},
2202            {0x19, 11}, {0x1b, 11}, {0x1d, 11}, {0x1f, 11},
2203            {0x21, 11}, {0x23, 11}, {0x13, 10}, {0x15, 10},
2204            {0x17, 10}, {0x07, 8}, {0x09, 8}, {0x0b, 8},
2205            {0x07, 7}, {0x03, 5}, {0x03, 4}, {0x03, 3},
2206            {0x01, 1}, {0x02, 3}, {0x02, 4}, {0x02, 5},
2207            {0x06, 7}, {0x0a, 8}, {0x08, 8}, {0x06, 8},
2208            {0x16, 10}, {0x14, 10}, {0x12, 10}, {0x22, 11},
2209            {0x20, 11}, {0x1e, 11}, {0x1c, 11}, {0x1a, 11},
2210            {0x18, 11}, {0x16, 11}, {0x14, 11}, {0x12, 11},
2211            {0x10, 11}, {0x0e, 11}, {0x0c, 11}, {0x0a, 11},
2212            {0x08, 11}, {0x0e, 12}, {0x0c, 12}, {0x0a, 12},
2213            {0x08, 12}, {0x06, 12}, {0x04, 12}, {0x06, 13},
2214            {0x04, 13}
2215    };
2216    
2217    
2218    /******************************************************************
2219     * decoder tables                                                 *
2220     ******************************************************************/
2221    
2222    VLC const mcbpc_intra_table[64] = {
2223            {-1, 0}, {20, 6}, {36, 6}, {52, 6}, {4, 4},  {4, 4},  {4, 4},  {4, 4},
2224            {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3}, {19, 3},
2225            {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3}, {35, 3},
2226            {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3}, {51, 3},
2227            {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},
2228            {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},
2229            {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},
2230            {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1},  {3, 1}
2231    };
2232    
2233    VLC const mcbpc_inter_table[257] = {
2234            {VLC_ERROR, 0}, {255, 9}, {52, 9}, {36, 9}, {20, 9}, {49, 9}, {35, 8}, {35, 8},
2235            {19, 8}, {19, 8}, {50, 8}, {50, 8}, {51, 7}, {51, 7}, {51, 7}, {51, 7},
2236            {34, 7}, {34, 7}, {34, 7}, {34, 7}, {18, 7}, {18, 7}, {18, 7}, {18, 7},
2237            {33, 7}, {33, 7}, {33, 7}, {33, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
2238            {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6}, {4, 6},
2239            {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6}, {48, 6},
2240            {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5},
2241            {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5},
2242            {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
2243            {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
2244            {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
2245            {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
2246            {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
2247            {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
2248            {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
2249            {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
2250            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2251            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2252            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2253            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2254            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2255            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2256            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2257            {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3}, {2, 3},
2258            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2259            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2260            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2261            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2262            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2263            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2264            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2265            {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3}, {1, 3},
2266            {0, 1}
2267    };
2268    
2269    VLC const cbpy_table[64] = {
2270            {-1, 0}, {-1, 0}, {6, 6},  {9, 6},  {8, 5},  {8, 5},  {4, 5},  {4, 5},
2271            {2, 5},  {2, 5},  {1, 5},  {1, 5},  {0, 4},  {0, 4},  {0, 4},  {0, 4},
2272            {12, 4}, {12, 4}, {12, 4}, {12, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
2273            {14, 4}, {14, 4}, {14, 4}, {14, 4}, {5, 4},  {5, 4},  {5, 4},  {5, 4},
2274            {13, 4}, {13, 4}, {13, 4}, {13, 4}, {3, 4},  {3, 4},  {3, 4},  {3, 4},
2275            {11, 4}, {11, 4}, {11, 4}, {11, 4}, {7, 4},  {7, 4},  {7, 4},  {7, 4},
2276            {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2},
2277            {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}, {15, 2}
2278    };
2279    
2280    VLC const TMNMVtab0[] = {
2281            {3, 4}, {-3, 4}, {2, 3}, {2, 3}, {-2, 3}, {-2, 3}, {1, 2},
2282            {1, 2}, {1, 2}, {1, 2}, {-1, 2}, {-1, 2}, {-1, 2}, {-1, 2}
2283    };
2284    
2285    VLC const TMNMVtab1[] = {
2286            {12, 10}, {-12, 10}, {11, 10}, {-11, 10},
2287            {10, 9}, {10, 9}, {-10, 9}, {-10, 9},
2288            {9, 9}, {9, 9}, {-9, 9}, {-9, 9},
2289            {8, 9}, {8, 9}, {-8, 9}, {-8, 9},
2290            {7, 7}, {7, 7}, {7, 7}, {7, 7},
2291            {7, 7}, {7, 7}, {7, 7}, {7, 7},
2292            {-7, 7}, {-7, 7}, {-7, 7}, {-7, 7},
2293            {-7, 7}, {-7, 7}, {-7, 7}, {-7, 7},
2294            {6, 7}, {6, 7}, {6, 7}, {6, 7},
2295            {6, 7}, {6, 7}, {6, 7}, {6, 7},
2296            {-6, 7}, {-6, 7}, {-6, 7}, {-6, 7},
2297            {-6, 7}, {-6, 7}, {-6, 7}, {-6, 7},
2298            {5, 7}, {5, 7}, {5, 7}, {5, 7},
2299            {5, 7}, {5, 7}, {5, 7}, {5, 7},
2300            {-5, 7}, {-5, 7}, {-5, 7}, {-5, 7},
2301            {-5, 7}, {-5, 7}, {-5, 7}, {-5, 7},
2302            {4, 6}, {4, 6}, {4, 6}, {4, 6},
2303            {4, 6}, {4, 6}, {4, 6}, {4, 6},
2304            {4, 6}, {4, 6}, {4, 6}, {4, 6},
2305            {4, 6}, {4, 6}, {4, 6}, {4, 6},
2306            {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6},
2307            {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6},
2308            {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6},
2309            {-4, 6}, {-4, 6}, {-4, 6}, {-4, 6}
2310    };
2311    
2312    VLC const TMNMVtab2[] = {
2313            {32, 12}, {-32, 12}, {31, 12}, {-31, 12},
2314            {30, 11}, {30, 11}, {-30, 11}, {-30, 11},
2315            {29, 11}, {29, 11}, {-29, 11}, {-29, 11},
2316            {28, 11}, {28, 11}, {-28, 11}, {-28, 11},
2317            {27, 11}, {27, 11}, {-27, 11}, {-27, 11},
2318            {26, 11}, {26, 11}, {-26, 11}, {-26, 11},
2319            {25, 11}, {25, 11}, {-25, 11}, {-25, 11},
2320            {24, 10}, {24, 10}, {24, 10}, {24, 10},
2321            {-24, 10}, {-24, 10}, {-24, 10}, {-24, 10},
2322            {23, 10}, {23, 10}, {23, 10}, {23, 10},
2323            {-23, 10}, {-23, 10}, {-23, 10}, {-23, 10},
2324            {22, 10}, {22, 10}, {22, 10}, {22, 10},
2325            {-22, 10}, {-22, 10}, {-22, 10}, {-22, 10},
2326            {21, 10}, {21, 10}, {21, 10}, {21, 10},
2327            {-21, 10}, {-21, 10}, {-21, 10}, {-21, 10},
2328            {20, 10}, {20, 10}, {20, 10}, {20, 10},
2329            {-20, 10}, {-20, 10}, {-20, 10}, {-20, 10},
2330            {19, 10}, {19, 10}, {19, 10}, {19, 10},
2331            {-19, 10}, {-19, 10}, {-19, 10}, {-19, 10},
2332            {18, 10}, {18, 10}, {18, 10}, {18, 10},
2333            {-18, 10}, {-18, 10}, {-18, 10}, {-18, 10},
2334            {17, 10}, {17, 10}, {17, 10}, {17, 10},
2335            {-17, 10}, {-17, 10}, {-17, 10}, {-17, 10},
2336            {16, 10}, {16, 10}, {16, 10}, {16, 10},
2337            {-16, 10}, {-16, 10}, {-16, 10}, {-16, 10},
2338            {15, 10}, {15, 10}, {15, 10}, {15, 10},
2339            {-15, 10}, {-15, 10}, {-15, 10}, {-15, 10},
2340            {14, 10}, {14, 10}, {14, 10}, {14, 10},
2341            {-14, 10}, {-14, 10}, {-14, 10}, {-14, 10},
2342            {13, 10}, {13, 10}, {13, 10}, {13, 10},
2343            {-13, 10}, {-13, 10}, {-13, 10}, {-13, 10}
2344    };
2345    
2346    short const dc_threshold[] = {
2347            21514, 26984,  8307, 28531, 29798, 24951, 25970, 26912,
2348             8307, 25956, 26994, 25974,  8292, 29286, 28015, 29728,
2349            25960, 18208, 21838, 18208, 19536, 22560, 26998,  8260,
2350            28515, 25956,  8291, 25640, 30309, 27749, 11817, 22794,
2351            30063,  8306, 28531, 29798, 24951, 25970, 25632, 29545,
2352            29300, 25193, 29813, 29295, 26656, 29537, 29728,  8303,
2353            26983, 25974, 24864, 25443, 29541,  8307, 28532, 26912,
2354            29556, 29472, 30063, 25458,  8293, 28515, 25956,  2606
2355    };
2356    
2357    VLC const dc_lum_tab[] = {
2358            {0, 0}, {4, 3}, {3, 3}, {0, 3},
2359            {2, 2}, {2, 2}, {1, 2}, {1, 2},
2360    };

Legend:
Removed from v.114  
changed lines
  Added in v.995

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4