libavcodec/msmpeg4.c
de6d9b64
 /*
124e2884
  * MSMPEG4 backend for encoder and decoder
406792e7
  * Copyright (c) 2001 Fabrice Bellard
8f2ab833
  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
de6d9b64
  *
7b94177e
  * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
  *
b78e7197
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
ff4ec49e
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
b78e7197
  * version 2.1 of the License, or (at your option) any later version.
de6d9b64
  *
b78e7197
  * FFmpeg is distributed in the hope that it will be useful,
de6d9b64
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
ff4ec49e
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
de6d9b64
  *
ff4ec49e
  * You should have received a copy of the GNU Lesser General Public
b78e7197
  * License along with FFmpeg; if not, write to the Free Software
5509bffa
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
de6d9b64
  */
983e3246
 
 /**
ba87f080
  * @file
124e2884
  * MSMPEG4 backend for encoder and decoder
983e3246
  */
 
6000abfa
 #include "avcodec.h"
de6d9b64
 #include "dsputil.h"
 #include "mpegvideo.h"
cc6de104
 #include "msmpeg4.h"
c318626c
 #include "libavutil/x86/asm.h"
ca334dd1
 #include "h263.h"
 #include "mpeg4video.h"
2f4b476e
 #include "msmpeg4data.h"
bd7a647c
 #include "vc1data.h"
33181975
 #include "libavutil/imgutils.h"
92ba5ffb
 
de6d9b64
 /*
115329f1
  * You can also call this codec : MPEG4 with a twist !
de6d9b64
  *
115329f1
  * TODO:
de6d9b64
  *        - (encoding) select best mv table (two choices)
115329f1
  *        - (encoding) select best vlc/dc table
de6d9b64
  */
 //#define DEBUG
 
08dce7b0
 #define DC_VLC_BITS 9
 #define V2_INTRA_CBPC_VLC_BITS 3
 #define V2_MB_TYPE_VLC_BITS 7
 #define MV_VLC_BITS 9
 #define V2_MV_VLC_BITS 9
 #define TEX_VLC_BITS 9
 
1457ab52
 #define DEFAULT_INTER_INDEX 3
 
8380edd9
 /* This table is practically identical to the one from h263
  * except that it is inverted. */
 static av_cold void init_h263_dc_for_msmpeg4(void)
 {
         int level, uni_code, uni_len;
 
6c8d259a
         if(ff_v2_dc_chroma_table[255 + 256][1])
             return;
 
8380edd9
         for(level=-256; level<256; level++){
             int size, v, l;
             /* find number of bits */
             size = 0;
             v = abs(level);
             while (v) {
                 v >>= 1;
                     size++;
             }
 
             if (level < 0)
                 l= (-level) ^ ((1 << size) - 1);
             else
                 l= level;
 
             /* luminance h263 */
05b858b0
             uni_code= ff_mpeg4_DCtab_lum[size][0];
             uni_len = ff_mpeg4_DCtab_lum[size][1];
8380edd9
             uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
 
             if (size > 0) {
                 uni_code<<=size; uni_code|=l;
                 uni_len+=size;
                 if (size > 8){
                     uni_code<<=1; uni_code|=1;
                     uni_len++;
                 }
             }
2f4b476e
             ff_v2_dc_lum_table[level + 256][0] = uni_code;
             ff_v2_dc_lum_table[level + 256][1] = uni_len;
8380edd9
 
             /* chrominance h263 */
05b858b0
             uni_code= ff_mpeg4_DCtab_chrom[size][0];
             uni_len = ff_mpeg4_DCtab_chrom[size][1];
8380edd9
             uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
 
             if (size > 0) {
                 uni_code<<=size; uni_code|=l;
                 uni_len+=size;
                 if (size > 8){
                     uni_code<<=1; uni_code|=1;
                     uni_len++;
                 }
             }
2f4b476e
             ff_v2_dc_chroma_table[level + 256][0] = uni_code;
             ff_v2_dc_chroma_table[level + 256][1] = uni_len;
8380edd9
 
         }
 }
 
2f4b476e
 av_cold void ff_msmpeg4_common_init(MpegEncContext *s)
f5957f3f
 {
     switch(s->msmpeg4_version){
     case 1:
     case 2:
         s->y_dc_scale_table=
         s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
         break;
     case 3:
         if(s->workaround_bugs){
1fec0550
             s->y_dc_scale_table= ff_old_ff_y_dc_scale_table;
             s->c_dc_scale_table= ff_wmv1_c_dc_scale_table;
f5957f3f
         } else{
             s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
             s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
         }
         break;
     case 4:
1457ab52
     case 5:
1fec0550
         s->y_dc_scale_table= ff_wmv1_y_dc_scale_table;
         s->c_dc_scale_table= ff_wmv1_c_dc_scale_table;
f5957f3f
         break;
9be6f0d2
 #if CONFIG_VC1_DECODER
0d33db8a
     case 6:
5f2c159c
         s->y_dc_scale_table= ff_wmv3_dc_scale_table;
         s->c_dc_scale_table= ff_wmv3_dc_scale_table;
0d33db8a
         break;
8b975b7c
 #endif
0d33db8a
 
f5957f3f
     }
 
115329f1
 
1457ab52
     if(s->msmpeg4_version>=4){
1fec0550
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_wmv1_scantable[1]);
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_wmv1_scantable[2]);
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_wmv1_scantable[3]);
         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_wmv1_scantable[0]);
f5957f3f
     }
2ad1516a
     //Note the default tables are set in common_init in mpegvideo.c
115329f1
 
6c8d259a
     init_h263_dc_for_msmpeg4();
f5957f3f
 }
 
de6d9b64
 /* predict coded block */
85f601ee
 int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
de6d9b64
 {
dbbe8999
     int xy, wrap, pred, a, b, c;
de6d9b64
 
dbbe8999
     xy = s->block_index[n];
137c8468
     wrap = s->b8_stride;
de6d9b64
 
     /* B C
115329f1
      * A X
de6d9b64
      */
dbbe8999
     a = s->coded_block[xy - 1       ];
     b = s->coded_block[xy - 1 - wrap];
     c = s->coded_block[xy     - wrap];
115329f1
 
de6d9b64
     if (b == c) {
         pred = a;
     } else {
         pred = c;
     }
115329f1
 
de6d9b64
     /* store value */
dbbe8999
     *coded_block_ptr = &s->coded_block[xy];
de6d9b64
 
     return pred;
 }
 
115329f1
 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
0c1a9eda
                                     int32_t **dc_val_ptr)
287229e5
 {
     int i;
 
     if (n < 4) {
         i= 0;
     } else {
         i= n-3;
     }
115329f1
 
287229e5
     *dc_val_ptr= &s->last_dc[i];
115329f1
     return s->last_dc[i];
287229e5
 }
 
de0f2f4c
 static int get_dc(uint8_t *src, int stride, int scale)
 {
     int y;
     int sum=0;
     for(y=0; y<8; y++){
         int x;
         for(x=0; x<8; x++){
             sum+=src[x + y*stride];
         }
     }
d4961b35
     return FASTDIV((sum + (scale>>1)), scale);
de0f2f4c
 }
 
de6d9b64
 /* dir = 0: left, dir = 1: top prediction */
2f4b476e
 int ff_msmpeg4_pred_dc(MpegEncContext *s, int n,
                        int16_t **dc_val_ptr, int *dir_ptr)
de6d9b64
 {
dbbe8999
     int a, b, c, wrap, pred, scale;
b86216de
     int16_t *dc_val;
de6d9b64
 
     /* find prediction */
     if (n < 4) {
bb270c08
         scale = s->y_dc_scale;
de6d9b64
     } else {
bb270c08
         scale = s->c_dc_scale;
de6d9b64
     }
115329f1
 
dbbe8999
     wrap = s->block_wrap[n];
     dc_val= s->dc_val[0] + s->block_index[n];
de6d9b64
 
     /* B C
115329f1
      * A X
de6d9b64
      */
dbbe8999
     a = dc_val[ - 1];
     b = dc_val[ - 1 - wrap];
     c = dc_val[ - wrap];
115329f1
 
28269849
     if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
4d2858de
         b=c=1024;
     }
de6d9b64
 
     /* XXX: the following solution consumes divisions, but it does not
        necessitate to modify mpegvideo.c. The problem comes from the
        fact they decided to store the quantized DC (which would lead
        to problems if Q could vary !) */
f2d702e1
 #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE
be449fca
     __asm__ volatile(
bb270c08
         "movl %3, %%eax         \n\t"
         "shrl $1, %%eax         \n\t"
         "addl %%eax, %2         \n\t"
         "addl %%eax, %1         \n\t"
         "addl %0, %%eax         \n\t"
         "mull %4                \n\t"
         "movl %%edx, %0         \n\t"
         "movl %1, %%eax         \n\t"
         "mull %4                \n\t"
         "movl %%edx, %1         \n\t"
         "movl %2, %%eax         \n\t"
         "mull %4                \n\t"
         "movl %%edx, %2         \n\t"
         : "+b" (a), "+c" (b), "+D" (c)
36cd3069
         : "g" (scale), "S" (ff_inverse[scale])
bb270c08
         : "%eax", "%edx"
6f903d8e
     );
320680d4
 #else
b250f9c6
     /* #elif ARCH_ALPHA */
1e98dffb
     /* Divisions are extremely costly on Alpha; optimize the most
320680d4
        common case. But they are costly everywhere...
      */
1e98dffb
     if (scale == 8) {
bb270c08
         a = (a + (8 >> 1)) / 8;
         b = (b + (8 >> 1)) / 8;
         c = (c + (8 >> 1)) / 8;
1e98dffb
     } else {
bb270c08
         a = FASTDIV((a + (scale >> 1)), scale);
         b = FASTDIV((b + (scale >> 1)), scale);
         c = FASTDIV((c + (scale >> 1)), scale);
1e98dffb
     }
6f903d8e
 #endif
de6d9b64
     /* XXX: WARNING: they did not choose the same test as MPEG4. This
        is very important ! */
bd5e1c72
     if(s->msmpeg4_version>3){
de0f2f4c
         if(s->inter_intra_pred){
             uint8_t *dest;
             int wrap;
115329f1
 
de0f2f4c
             if(n==1){
                 pred=a;
                 *dir_ptr = 0;
             }else if(n==2){
                 pred=c;
                 *dir_ptr = 1;
             }else if(n==3){
                 if (abs(a - b) < abs(b - c)) {
                     pred = c;
                     *dir_ptr = 1;
                 } else {
                     pred = a;
                     *dir_ptr = 0;
                 }
             }else{
                 if(n<4){
                     wrap= s->linesize;
657ccb5a
                     dest= s->current_picture.f.data[0] + (((n >> 1) + 2*s->mb_y) * 8*  wrap ) + ((n & 1) + 2*s->mb_x) * 8;
de0f2f4c
                 }else{
0fd90455
                     wrap= s->uvlinesize;
657ccb5a
                     dest= s->current_picture.f.data[n - 3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
de0f2f4c
                 }
                 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
                 else           a= get_dc(dest-8, wrap, scale*8);
                 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
                 else           c= get_dc(dest-8*wrap, wrap, scale*8);
115329f1
 
de0f2f4c
                 if (s->h263_aic_dir==0) {
                     pred= a;
                     *dir_ptr = 0;
                 }else if (s->h263_aic_dir==1) {
                     if(n==0){
                         pred= c;
                         *dir_ptr = 1;
                     }else{
                         pred= a;
                         *dir_ptr = 0;
                     }
                 }else if (s->h263_aic_dir==2) {
                     if(n==0){
                         pred= a;
                         *dir_ptr = 0;
                     }else{
                         pred= c;
                         *dir_ptr = 1;
                     }
                 } else {
                     pred= c;
                     *dir_ptr = 1;
                 }
             }
         }else{
             if (abs(a - b) < abs(b - c)) {
                 pred = c;
                 *dir_ptr = 1;
             } else {
                 pred = a;
                 *dir_ptr = 0;
             }
bd5e1c72
         }
     }else{
         if (abs(a - b) <= abs(b - c)) {
             pred = c;
             *dir_ptr = 1;
         } else {
             pred = a;
             *dir_ptr = 0;
         }
de6d9b64
     }
 
     /* update predictor */
dbbe8999
     *dc_val_ptr = &dc_val[0];
de6d9b64
     return pred;
 }
 
 /****************************************/
 /* decoding stuff */
 
85f601ee
 VLC ff_mb_non_intra_vlc[4];
84afee34
 static VLC v2_dc_lum_vlc;
 static VLC v2_dc_chroma_vlc;
 static VLC v2_intra_cbpc_vlc;
 static VLC v2_mb_type_vlc;
 static VLC v2_mv_vlc;
85f601ee
 VLC ff_inter_intra_vlc;
84afee34
 
8380edd9
 /* This is identical to h263 except that its range is multiplied by 2. */
 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
84afee34
 {
8380edd9
     int code, val, sign, shift;
84afee34
 
8380edd9
     code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
1218777f
     av_dlog(s, "MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
8380edd9
     if (code < 0)
         return 0xffff;
 
     if (code == 0)
         return pred;
     sign = get_bits1(&s->gb);
     shift = f_code - 1;
     val = code;
     if (shift) {
         val = (val - 1) << shift;
         val |= get_bits(&s->gb, shift);
         val++;
     }
     if (sign)
         val = -val;
 
     val += pred;
     if (val <= -64)
         val += 64;
     else if (val >= 64)
         val -= 64;
 
     return val;
 }
 
 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 {
     int cbp, code, i;
aee7b88c
     uint32_t * const mb_type_ptr = &s->current_picture.f.mb_type[s->mb_x + s->mb_y*s->mb_stride];
8380edd9
 
ce5e49b0
     if (s->pict_type == AV_PICTURE_TYPE_P) {
8380edd9
         if (s->use_skip_mb_code) {
             if (get_bits1(&s->gb)) {
                 /* skip mb */
                 s->mb_intra = 0;
                 for(i=0;i<6;i++)
                     s->block_last_index[i] = -1;
                 s->mv_dir = MV_DIR_FORWARD;
                 s->mv_type = MV_TYPE_16X16;
                 s->mv[0][0][0] = 0;
                 s->mv[0][0][1] = 0;
                 s->mb_skipped = 1;
aee7b88c
                 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
8380edd9
                 return 0;
84afee34
             }
8380edd9
         }
84afee34
 
8380edd9
         if(s->msmpeg4_version==2)
             code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
         else
7213abf6
             code = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
8380edd9
         if(code<0 || code>7){
             av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
             return -1;
         }
84afee34
 
8380edd9
         s->mb_intra = code >>2;
84afee34
 
8380edd9
         cbp = code & 0x3;
     } else {
         s->mb_intra = 1;
         if(s->msmpeg4_version==2)
             cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
         else
7213abf6
             cbp= get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
8380edd9
         if(cbp<0 || cbp>3){
             av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
             return -1;
         }
     }
 
     if (!s->mb_intra) {
         int mx, my, cbpy;
 
101ada9a
         cbpy= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
8380edd9
         if(cbpy<0){
             av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
             return -1;
         }
 
         cbp|= cbpy<<2;
         if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
 
ddce8953
         ff_h263_pred_motion(s, 0, 0, &mx, &my);
8380edd9
         mx= msmpeg4v2_decode_motion(s, mx, 1);
         my= msmpeg4v2_decode_motion(s, my, 1);
 
         s->mv_dir = MV_DIR_FORWARD;
         s->mv_type = MV_TYPE_16X16;
         s->mv[0][0][0] = mx;
         s->mv[0][0][1] = my;
aee7b88c
         *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
8380edd9
     } else {
         if(s->msmpeg4_version==2){
             s->ac_pred = get_bits1(&s->gb);
101ada9a
             cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
8380edd9
         } else{
             s->ac_pred = 0;
101ada9a
             cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
ce5e49b0
             if(s->pict_type==AV_PICTURE_TYPE_P) cbp^=0x3C;
8380edd9
         }
aee7b88c
         *mb_type_ptr = MB_TYPE_INTRA;
8380edd9
     }
 
     s->dsp.clear_blocks(s->block[0]);
     for (i = 0; i < 6; i++) {
         if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
         {
              av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
              return -1;
         }
     }
     return 0;
 }
 
 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 {
     int cbp, code, i;
     uint8_t *coded_val;
657ccb5a
     uint32_t * const mb_type_ptr = &s->current_picture.f.mb_type[s->mb_x + s->mb_y*s->mb_stride];
8380edd9
 
ce5e49b0
     if (s->pict_type == AV_PICTURE_TYPE_P) {
8380edd9
         if (s->use_skip_mb_code) {
             if (get_bits1(&s->gb)) {
                 /* skip mb */
                 s->mb_intra = 0;
                 for(i=0;i<6;i++)
                     s->block_last_index[i] = -1;
                 s->mv_dir = MV_DIR_FORWARD;
                 s->mv_type = MV_TYPE_16X16;
                 s->mv[0][0][0] = 0;
                 s->mv[0][0][1] = 0;
                 s->mb_skipped = 1;
                 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
 
                 return 0;
84afee34
             }
8380edd9
         }
84afee34
 
8380edd9
         code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
         if (code < 0)
             return -1;
         //s->mb_intra = (code & 0x40) ? 0 : 1;
         s->mb_intra = (~code & 0x40) >> 6;
115329f1
 
8380edd9
         cbp = code & 0x3f;
     } else {
         s->mb_intra = 1;
         code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
         if (code < 0)
             return -1;
         /* predict coded block pattern */
         cbp = 0;
         for(i=0;i<6;i++) {
             int val = ((code >> (5 - i)) & 1);
             if (i < 4) {
                 int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val);
                 val = val ^ pred;
                 *coded_val = val;
84afee34
             }
8380edd9
             cbp |= val << (5 - i);
         }
     }
84afee34
 
8380edd9
     if (!s->mb_intra) {
         int mx, my;
         if(s->per_mb_rl_table && cbp){
             s->rl_table_index = decode012(&s->gb);
             s->rl_chroma_table_index = s->rl_table_index;
84afee34
         }
ddce8953
         ff_h263_pred_motion(s, 0, 0, &mx, &my);
8380edd9
         if (ff_msmpeg4_decode_motion(s, &mx, &my) < 0)
             return -1;
         s->mv_dir = MV_DIR_FORWARD;
         s->mv_type = MV_TYPE_16X16;
         s->mv[0][0][0] = mx;
         s->mv[0][0][1] = my;
         *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
     } else {
1218777f
         av_dlog(s, "I at %d %d %d %06X\n", s->mb_x, s->mb_y,
                 ((cbp & 3) ? 1 : 0) +((cbp & 0x3C)? 2 : 0),
                 show_bits(&s->gb, 24));
8380edd9
         s->ac_pred = get_bits1(&s->gb);
         *mb_type_ptr = MB_TYPE_INTRA;
         if(s->inter_intra_pred){
             s->h263_aic_dir= get_vlc2(&s->gb, ff_inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
1218777f
             av_dlog(s, "%d%d %d %d/",
                     s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
8380edd9
         }
         if(s->per_mb_rl_table && cbp){
             s->rl_table_index = decode012(&s->gb);
             s->rl_chroma_table_index = s->rl_table_index;
         }
     }
 
     s->dsp.clear_blocks(s->block[0]);
     for (i = 0; i < 6; i++) {
         if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
         {
             av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
             return -1;
         }
     }
 
     return 0;
84afee34
 }
de6d9b64
 
 /* init all vlc decoding tables */
261a3c2d
 av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
de6d9b64
 {
261a3c2d
     MpegEncContext *s = avctx->priv_data;
6c8d259a
     static volatile int done = 0;
33181975
     int i, ret;
de6d9b64
     MVTable *mv;
 
33181975
     if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
         return ret;
b7b7e234
 
d2940155
     if (ff_h263_decode_init(avctx) < 0)
         return -1;
261a3c2d
 
2f4b476e
     ff_msmpeg4_common_init(s);
de6d9b64
 
d81c5983
     if (!done) {
         for(i=0;i<NB_RL_TABLES;i++) {
2f4b476e
             ff_init_rl(&ff_rl_table[i], ff_static_rl_table_store[i]);
d81c5983
         }
1fec0550
         INIT_VLC_RL(ff_rl_table[0], 642);
         INIT_VLC_RL(ff_rl_table[1], 1104);
         INIT_VLC_RL(ff_rl_table[2], 554);
         INIT_VLC_RL(ff_rl_table[3], 940);
         INIT_VLC_RL(ff_rl_table[4], 962);
         INIT_VLC_RL(ff_rl_table[5], 554);
 
         mv = &ff_mv_tables[0];
5cf4331b
         INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
                     mv->table_mv_bits, 1, 1,
                     mv->table_mv_code, 2, 2, 3714);
1fec0550
         mv = &ff_mv_tables[1];
5cf4331b
         INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
                     mv->table_mv_bits, 1, 1,
                     mv->table_mv_code, 2, 2, 2694);
 
         INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
0c040aac
                  &ff_table0_dc_lum[0][1], 8, 4,
5cf4331b
                  &ff_table0_dc_lum[0][0], 8, 4, 1158);
         INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
0c040aac
                  &ff_table0_dc_chroma[0][1], 8, 4,
5cf4331b
                  &ff_table0_dc_chroma[0][0], 8, 4, 1118);
         INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
0c040aac
                  &ff_table1_dc_lum[0][1], 8, 4,
5cf4331b
                  &ff_table1_dc_lum[0][0], 8, 4, 1476);
         INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
0c040aac
                  &ff_table1_dc_chroma[0][1], 8, 4,
5cf4331b
                  &ff_table1_dc_chroma[0][0], 8, 4, 1216);
115329f1
 
5cf4331b
         INIT_VLC_STATIC(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
2f4b476e
                  &ff_v2_dc_lum_table[0][1], 8, 4,
                  &ff_v2_dc_lum_table[0][0], 8, 4, 1472);
5cf4331b
         INIT_VLC_STATIC(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
2f4b476e
                  &ff_v2_dc_chroma_table[0][1], 8, 4,
                  &ff_v2_dc_chroma_table[0][0], 8, 4, 1506);
115329f1
 
5cf4331b
         INIT_VLC_STATIC(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
1fec0550
                  &ff_v2_intra_cbpc[0][1], 2, 1,
                  &ff_v2_intra_cbpc[0][0], 2, 1, 8);
5cf4331b
         INIT_VLC_STATIC(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
1fec0550
                  &ff_v2_mb_type[0][1], 2, 1,
                  &ff_v2_mb_type[0][0], 2, 1, 128);
5cf4331b
         INIT_VLC_STATIC(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
ddce8953
                  &ff_mvtab[0][1], 2, 1,
                  &ff_mvtab[0][0], 2, 1, 538);
5cf4331b
 
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[0], MB_NON_INTRA_VLC_BITS, 128,
1fec0550
                      &ff_wmv2_inter_table[0][0][1], 8, 4,
                      &ff_wmv2_inter_table[0][0][0], 8, 4, 1636);
5cf4331b
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[1], MB_NON_INTRA_VLC_BITS, 128,
1fec0550
                      &ff_wmv2_inter_table[1][0][1], 8, 4,
                      &ff_wmv2_inter_table[1][0][0], 8, 4, 2648);
5cf4331b
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[2], MB_NON_INTRA_VLC_BITS, 128,
1fec0550
                      &ff_wmv2_inter_table[2][0][1], 8, 4,
                      &ff_wmv2_inter_table[2][0][0], 8, 4, 1532);
5cf4331b
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[3], MB_NON_INTRA_VLC_BITS, 128,
1fec0550
                      &ff_wmv2_inter_table[3][0][1], 8, 4,
                      &ff_wmv2_inter_table[3][0][0], 8, 4, 2488);
5cf4331b
 
         INIT_VLC_STATIC(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
0d33db8a
                  &ff_msmp4_mb_i_table[0][1], 4, 2,
5cf4331b
                  &ff_msmp4_mb_i_table[0][0], 4, 2, 536);
115329f1
 
5cf4331b
         INIT_VLC_STATIC(&ff_inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
1fec0550
                  &ff_table_inter_intra[0][1], 2, 1,
                  &ff_table_inter_intra[0][0], 2, 1, 8);
6c8d259a
         done = 1;
d81c5983
     }
115329f1
 
4d2858de
     switch(s->msmpeg4_version){
     case 1:
     case 2:
         s->decode_mb= msmpeg4v12_decode_mb;
         break;
     case 3:
     case 4:
         s->decode_mb= msmpeg4v34_decode_mb;
         break;
1457ab52
     case 5:
49fb20cb
         if (CONFIG_WMV2_DECODER)
c16d6c50
             s->decode_mb= ff_wmv2_decode_mb;
0d33db8a
     case 6:
10b9c374
         //FIXME + TODO VC1 decode mb
1457ab52
         break;
4d2858de
     }
115329f1
 
755bfeab
     s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe
115329f1
 
de6d9b64
     return 0;
 }
 
04d38225
 int ff_msmpeg4_decode_picture_header(MpegEncContext * s)
de6d9b64
 {
f5957f3f
     int code;
de6d9b64
 
287229e5
     if(s->msmpeg4_version==1){
b3c1652b
         int start_code = get_bits_long(&s->gb, 32);
287229e5
         if(start_code!=0x00000100){
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
287229e5
             return -1;
         }
 
03d5ea54
         skip_bits(&s->gb, 5); // frame number */
287229e5
     }
 
de6d9b64
     s->pict_type = get_bits(&s->gb, 2) + 1;
ce5e49b0
     if (s->pict_type != AV_PICTURE_TYPE_I &&
         s->pict_type != AV_PICTURE_TYPE_P){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
de6d9b64
         return -1;
287229e5
     }
de0f2f4c
 #if 0
 {
     static int had_i=0;
ce5e49b0
     if(s->pict_type == AV_PICTURE_TYPE_I) had_i=1;
de0f2f4c
     if(!had_i) return -1;
 }
 #endif
6beeb962
     s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
ae2d2d6c
     if(s->qscale==0){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
ae2d2d6c
         return -1;
     }
de6d9b64
 
ce5e49b0
     if (s->pict_type == AV_PICTURE_TYPE_I) {
115329f1
         code = get_bits(&s->gb, 5);
287229e5
         if(s->msmpeg4_version==1){
             if(code==0 || code>s->mb_height){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
287229e5
                 return -1;
             }
 
             s->slice_height = code;
         }else{
             /* 0x17: one slice, 0x18: two slices, ... */
de0f2f4c
             if (code < 0x17){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
287229e5
                 return -1;
de0f2f4c
             }
287229e5
 
             s->slice_height = s->mb_height / (code - 0x16);
         }
e1a9dbff
 
         switch(s->msmpeg4_version){
287229e5
         case 1:
e1a9dbff
         case 2:
84afee34
             s->rl_chroma_table_index = 2;
             s->rl_table_index = 2;
7f89b6fb
 
84afee34
             s->dc_table_index = 0; //not used
e1a9dbff
             break;
         case 3:
84afee34
             s->rl_chroma_table_index = decode012(&s->gb);
             s->rl_table_index = decode012(&s->gb);
7f89b6fb
 
84afee34
             s->dc_table_index = get_bits1(&s->gb);
e1a9dbff
             break;
         case 4:
04d38225
             ff_msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
f5957f3f
 
05174fd4
             if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
             else                           s->per_mb_rl_table= 0;
115329f1
 
f5957f3f
             if(!s->per_mb_rl_table){
                 s->rl_chroma_table_index = decode012(&s->gb);
                 s->rl_table_index = decode012(&s->gb);
e1a9dbff
             }
 
f5957f3f
             s->dc_table_index = get_bits1(&s->gb);
de0f2f4c
             s->inter_intra_pred= 0;
e1a9dbff
             break;
84afee34
         }
de6d9b64
         s->no_rounding = 1;
80adda8e
         if(s->avctx->debug&FF_DEBUG_PICT_INFO)
bb270c08
             av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d   \n",
                 s->qscale,
                 s->rl_chroma_table_index,
                 s->rl_table_index,
                 s->dc_table_index,
de0f2f4c
                 s->per_mb_rl_table,
80adda8e
                 s->slice_height);
de6d9b64
     } else {
287229e5
         switch(s->msmpeg4_version){
         case 1:
         case 2:
             if(s->msmpeg4_version==1)
                 s->use_skip_mb_code = 1;
             else
                 s->use_skip_mb_code = get_bits1(&s->gb);
84afee34
             s->rl_table_index = 2;
             s->rl_chroma_table_index = s->rl_table_index;
             s->dc_table_index = 0; //not used
             s->mv_table_index = 0;
287229e5
             break;
         case 3:
             s->use_skip_mb_code = get_bits1(&s->gb);
84afee34
             s->rl_table_index = decode012(&s->gb);
             s->rl_chroma_table_index = s->rl_table_index;
de6d9b64
 
84afee34
             s->dc_table_index = get_bits1(&s->gb);
de6d9b64
 
84afee34
             s->mv_table_index = get_bits1(&s->gb);
287229e5
             break;
f5957f3f
         case 4:
             s->use_skip_mb_code = get_bits1(&s->gb);
de0f2f4c
 
05174fd4
             if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
             else                           s->per_mb_rl_table= 0;
de0f2f4c
 
f5957f3f
             if(!s->per_mb_rl_table){
                 s->rl_table_index = decode012(&s->gb);
                 s->rl_chroma_table_index = s->rl_table_index;
             }
 
             s->dc_table_index = get_bits1(&s->gb);
 
             s->mv_table_index = get_bits1(&s->gb);
05174fd4
             s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
f5957f3f
             break;
84afee34
         }
115329f1
 
80adda8e
         if(s->avctx->debug&FF_DEBUG_PICT_INFO)
bb270c08
             av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d   \n",
                 s->use_skip_mb_code,
                 s->rl_table_index,
                 s->rl_chroma_table_index,
                 s->dc_table_index,
                 s->mv_table_index,
de0f2f4c
                 s->per_mb_rl_table,
80adda8e
                 s->qscale);
 
bb270c08
         if(s->flipflop_rounding){
             s->no_rounding ^= 1;
         }else{
             s->no_rounding = 0;
         }
de6d9b64
     }
1218777f
     av_dlog(s->avctx, "%d %d %d %d %d\n", s->pict_type, s->bit_rate,
             s->inter_intra_pred, s->width, s->height);
f5957f3f
 
     s->esc3_level_length= 0;
     s->esc3_run_length= 0;
84afee34
 
de6d9b64
     return 0;
 }
 
04d38225
 int ff_msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
ae40484c
 {
287229e5
     int left= buf_size*8 - get_bits_count(&s->gb);
     int length= s->msmpeg4_version>=3 ? 17 : 16;
ae40484c
     /* the alt_bitstream reader could read over the end so we need to check it */
287229e5
     if(left>=length && left<length+8)
ae40484c
     {
e65ab9d9
         skip_bits(&s->gb, 5); /* fps */
05174fd4
         s->bit_rate= get_bits(&s->gb, 11)*1024;
287229e5
         if(s->msmpeg4_version>=3)
             s->flipflop_rounding= get_bits1(&s->gb);
         else
             s->flipflop_rounding= 0;
ae40484c
     }
287229e5
     else if(left<length+8)
ae40484c
     {
2b9ab1d5
         s->flipflop_rounding= 0;
62563c38
         if(s->msmpeg4_version != 2)
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
287229e5
     }
     else
     {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
ae40484c
     }
2b9ab1d5
 
ae40484c
     return 0;
 }
 
8380edd9
 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
3825cd1d
 {
8380edd9
     int level, pred;
3825cd1d
 
8380edd9
     if(s->msmpeg4_version<=2){
         if (n < 4) {
             level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
3825cd1d
         } else {
8380edd9
             level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
287229e5
         }
8380edd9
         if (level < 0)
287229e5
             return -1;
8380edd9
         level-=256;
     }else{  //FIXME optimize use unified tables & index
         if (n < 4) {
             level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
         } else {
             level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
287229e5
         }
8380edd9
         if (level < 0){
             av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
287229e5
             return -1;
         }
84afee34
 
8380edd9
         if (level == DC_MAX) {
             level = get_bits(&s->gb, 8);
             if (get_bits1(&s->gb))
                 level = -level;
         } else if (level != 0) {
             if (get_bits1(&s->gb))
                 level = -level;
bb270c08
         }
84afee34
     }
115329f1
 
8380edd9
     if(s->msmpeg4_version==1){
         int32_t *dc_val;
         pred = msmpeg4v1_pred_dc(s, n, &dc_val);
         level += pred;
de6d9b64
 
8380edd9
         /* update predictor */
         *dc_val= level;
     }else{
         int16_t *dc_val;
2f4b476e
         pred   = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
8380edd9
         level += pred;
de6d9b64
 
8380edd9
         /* update predictor */
         if (n < 4) {
             *dc_val = level * s->y_dc_scale;
         } else {
             *dc_val = level * s->c_dc_scale;
bb270c08
         }
de6d9b64
     }
115329f1
 
8380edd9
     return level;
de6d9b64
 }
8380edd9
 
1a013246
 //#define ERROR_DETAILS
85f601ee
 int ff_msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
1457ab52
                               int n, int coded, const uint8_t *scan_table)
de6d9b64
 {
45a82edb
     int level, i, last, run, run_diff;
a5037227
     int av_uninit(dc_pred_dir);
de6d9b64
     RLTable *rl;
45a82edb
     RL_VLC_ELEM *rl_vlc;
badaf88e
     int qmul, qadd;
de6d9b64
 
     if (s->mb_intra) {
badaf88e
         qmul=1;
         qadd=0;
 
bb270c08
         /* DC coef */
de6d9b64
         level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
115329f1
 
287229e5
         if (level < 0){
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
de0f2f4c
             if(s->inter_intra_pred) level=0;
             else                    return -1;
287229e5
         }
de6d9b64
         if (n < 4) {
1fec0550
             rl = &ff_rl_table[s->rl_table_index];
287229e5
             if(level > 256*s->y_dc_scale){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
de0f2f4c
                 if(!s->inter_intra_pred) return -1;
287229e5
             }
de6d9b64
         } else {
1fec0550
             rl = &ff_rl_table[3 + s->rl_chroma_table_index];
287229e5
             if(level > 256*s->c_dc_scale){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
de0f2f4c
                 if(!s->inter_intra_pred) return -1;
287229e5
             }
de6d9b64
         }
287229e5
         block[0] = level;
badaf88e
 
d7826b58
         run_diff = s->msmpeg4_version >= 4;
45a82edb
         i = 0;
de6d9b64
         if (!coded) {
             goto not_coded;
         }
         if (s->ac_pred) {
115329f1
             if (dc_pred_dir == 0)
2ad1516a
                 scan_table = s->intra_v_scantable.permutated; /* left */
de6d9b64
             else
2ad1516a
                 scan_table = s->intra_h_scantable.permutated; /* top */
de6d9b64
         } else {
2ad1516a
             scan_table = s->intra_scantable.permutated;
de6d9b64
         }
45a82edb
         rl_vlc= rl->rl_vlc[0];
de6d9b64
     } else {
badaf88e
         qmul = s->qscale << 1;
         qadd = (s->qscale - 1) | 1;
45a82edb
         i = -1;
1fec0550
         rl = &ff_rl_table[3 + s->rl_table_index];
84afee34
 
         if(s->msmpeg4_version==2)
             run_diff = 0;
         else
             run_diff = 1;
 
de6d9b64
         if (!coded) {
45a82edb
             s->block_last_index[n] = i;
de6d9b64
             return 0;
         }
1457ab52
         if(!scan_table)
             scan_table = s->inter_scantable.permutated;
45a82edb
         rl_vlc= rl->rl_vlc[s->qscale];
de6d9b64
     }
45a82edb
   {
     OPEN_READER(re, &s->gb);
de6d9b64
     for(;;) {
45a82edb
         UPDATE_CACHE(re, &s->gb);
e91f4bf1
         GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
45a82edb
         if (level==0) {
             int cache;
             cache= GET_CACHE(re, &s->gb);
de6d9b64
             /* escape */
45a82edb
             if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
                 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
de6d9b64
                     /* third escape */
45a82edb
                     if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
                     UPDATE_CACHE(re, &s->gb);
f5957f3f
                     if(s->msmpeg4_version<=3){
45a82edb
                         last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
                         run=   SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
86a10281
                         level= SHOW_SBITS(re, &s->gb, 8);
45a82edb
                         SKIP_COUNTER(re, &s->gb, 1+6+8);
115329f1
                     }else{
f5957f3f
                         int sign;
45a82edb
                         last=  SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
f5957f3f
                         if(!s->esc3_level_length){
                             int ll;
1218777f
                             av_dlog(s->avctx, "ESC-3 %X at %d %d\n",
                                     show_bits(&s->gb, 24), s->mb_x, s->mb_y);
f5957f3f
                             if(s->qscale<8){
45a82edb
                                 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
f5957f3f
                                 if(ll==0){
ed3e9148
                                     ll= 8+SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
f5957f3f
                                 }
                             }else{
                                 ll=2;
45a82edb
                                 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
                                     ll++;
                                     SKIP_BITS(re, &s->gb, 1);
                                 }
05174fd4
                                 if(ll<8) SKIP_BITS(re, &s->gb, 1);
f5957f3f
                             }
 
                             s->esc3_level_length= ll;
45a82edb
                             s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
05174fd4
                             UPDATE_CACHE(re, &s->gb);
f5957f3f
                         }
115329f1
                         run=   SHOW_UBITS(re, &s->gb, s->esc3_run_length);
45a82edb
                         SKIP_BITS(re, &s->gb, s->esc3_run_length);
115329f1
 
                         sign=  SHOW_UBITS(re, &s->gb, 1);
45a82edb
                         SKIP_BITS(re, &s->gb, 1);
115329f1
 
                         level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
45a82edb
                         SKIP_BITS(re, &s->gb, s->esc3_level_length);
f5957f3f
                         if(sign) level= -level;
                     }
9c6cf7f2
 
287229e5
 #if 0 // waste of time / this will detect very few errors
                     {
c26abfa5
                         const int abs_level= FFABS(level);
287229e5
                         const int run1= run - rl->max_run[last][abs_level] - run_diff;
                         if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
                             if(abs_level <= rl->max_level[last][run]){
267f7edc
                                 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
287229e5
                                 return DECODING_AC_LOST;
                             }
                             if(abs_level <= rl->max_level[last][run]*2){
267f7edc
                                 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
287229e5
                                 return DECODING_AC_LOST;
                             }
f5957f3f
                             if(run1>=0 && abs_level <= rl->max_level[last][run1]){
267f7edc
                                 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
287229e5
                                 return DECODING_AC_LOST;
                             }
                         }
                     }
 #endif
bb270c08
                     //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
                     if (level>0) level= level * qmul + qadd;
287229e5
                     else         level= level * qmul - qadd;
 #if 0 // waste of time too :(
                     if(level>2048 || level<-2048){
267f7edc
                         av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
287229e5
                         return DECODING_AC_LOST;
                     }
 #endif
45a82edb
                     i+= run + 1;
                     if(last) i+=192;
1a013246
 #ifdef ERROR_DETAILS
                 if(run==66)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
1a013246
                 else if((i>62 && i<192) || i>192+63)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
1a013246
 #endif
de6d9b64
                 } else {
                     /* second escape */
45a82edb
                     SKIP_BITS(re, &s->gb, 2);
e91f4bf1
                     GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
45a82edb
                     i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
                     level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
                     LAST_SKIP_BITS(re, &s->gb, 1);
1a013246
 #ifdef ERROR_DETAILS
                 if(run==66)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
1a013246
                 else if((i>62 && i<192) || i>192+63)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
1a013246
 #endif
de6d9b64
                 }
             } else {
                 /* first escape */
45a82edb
                 SKIP_BITS(re, &s->gb, 1);
e91f4bf1
                 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
45a82edb
                 i+= run;
                 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
                 LAST_SKIP_BITS(re, &s->gb, 1);
1a013246
 #ifdef ERROR_DETAILS
                 if(run==66)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
1a013246
                 else if((i>62 && i<192) || i>192+63)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
1a013246
 #endif
de6d9b64
             }
         } else {
45a82edb
             i+= run;
             level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
             LAST_SKIP_BITS(re, &s->gb, 1);
1a013246
 #ifdef ERROR_DETAILS
                 if(run==66)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
1a013246
                 else if((i>62 && i<192) || i>192+63)
95ae72b7
                     av_log(s->avctx, AV_LOG_ERROR, "run overflow i=%d run=%d level=%d\n", i, run, level);
1a013246
 #endif
f5957f3f
         }
45a82edb
         if (i > 62){
             i-= 192;
             if(i&(~63)){
6e44ba15
                 const int left= get_bits_left(&s->gb);
b9556507
                 if(((i+192 == 64 && level/qmul==-1) || !(s->err_recognition&(AV_EF_BITSTREAM|AV_EF_COMPLIANT))) && left>=0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
03b9d4a7
                     i = 63;
1a013246
                     break;
                 }else{
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
1a013246
                     return -1;
                 }
45a82edb
             }
287229e5
 
45a82edb
             block[scan_table[i]] = level;
de6d9b64
             break;
45a82edb
         }
 
         block[scan_table[i]] = level;
de6d9b64
     }
45a82edb
     CLOSE_READER(re, &s->gb);
   }
de6d9b64
  not_coded:
     if (s->mb_intra) {
6f13a371
         ff_mpeg4_pred_ac(s, block, n, dc_pred_dir);
de6d9b64
         if (s->ac_pred) {
45a82edb
             i = 63; /* XXX: not optimal */
de6d9b64
         }
     }
1457ab52
     if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
45a82edb
     s->block_last_index[n] = i;
115329f1
 
de6d9b64
     return 0;
 }
 
85f601ee
 int ff_msmpeg4_decode_motion(MpegEncContext * s,
de6d9b64
                                  int *mx_ptr, int *my_ptr)
 {
     MVTable *mv;
     int code, mx, my;
 
1fec0550
     mv = &ff_mv_tables[s->mv_table_index];
de6d9b64
 
08dce7b0
     code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
f5957f3f
     if (code < 0){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
de6d9b64
         return -1;
f5957f3f
     }
de6d9b64
     if (code == mv->n) {
         mx = get_bits(&s->gb, 6);
         my = get_bits(&s->gb, 6);
     } else {
         mx = mv->table_mvx[code];
         my = mv->table_mvy[code];
     }
 
     mx += *mx_ptr - 32;
     my += *my_ptr - 32;
     /* WARNING : they do not do exactly modulo encoding */
     if (mx <= -64)
         mx += 64;
     else if (mx >= 64)
         mx -= 64;
 
     if (my <= -64)
         my += 64;
     else if (my >= 64)
         my -= 64;
     *mx_ptr = mx;
     *my_ptr = my;
     return 0;
 }
261a3c2d
 
e7e2df27
 AVCodec ff_msmpeg4v1_decoder = {
ec6402b7
     .name           = "msmpeg4v1",
     .type           = AVMEDIA_TYPE_VIDEO,
36ef5369
     .id             = AV_CODEC_ID_MSMPEG4V1,
ec6402b7
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_msmpeg4_decode_init,
     .close          = ff_h263_decode_end,
     .decode         = ff_h263_decode_frame,
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
5e50a572
     .max_lowres     = 3,
00c3b67b
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
     .pix_fmts       = ff_pixfmt_list_420,
261a3c2d
 };
 
e7e2df27
 AVCodec ff_msmpeg4v2_decoder = {
ec6402b7
     .name           = "msmpeg4v2",
     .type           = AVMEDIA_TYPE_VIDEO,
36ef5369
     .id             = AV_CODEC_ID_MSMPEG4V2,
ec6402b7
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_msmpeg4_decode_init,
     .close          = ff_h263_decode_end,
     .decode         = ff_h263_decode_frame,
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
5e50a572
     .max_lowres     = 3,
00c3b67b
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
     .pix_fmts       = ff_pixfmt_list_420,
261a3c2d
 };
 
e7e2df27
 AVCodec ff_msmpeg4v3_decoder = {
ec6402b7
     .name           = "msmpeg4",
     .type           = AVMEDIA_TYPE_VIDEO,
36ef5369
     .id             = AV_CODEC_ID_MSMPEG4V3,
ec6402b7
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_msmpeg4_decode_init,
     .close          = ff_h263_decode_end,
     .decode         = ff_h263_decode_frame,
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
5e50a572
     .max_lowres     = 3,
00c3b67b
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
     .pix_fmts       = ff_pixfmt_list_420,
261a3c2d
 };
 
e7e2df27
 AVCodec ff_wmv1_decoder = {
ec6402b7
     .name           = "wmv1",
     .type           = AVMEDIA_TYPE_VIDEO,
36ef5369
     .id             = AV_CODEC_ID_WMV1,
ec6402b7
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_msmpeg4_decode_init,
     .close          = ff_h263_decode_end,
     .decode         = ff_h263_decode_frame,
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
5e50a572
     .max_lowres     = 3,
00c3b67b
     .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
     .pix_fmts       = ff_pixfmt_list_420,
261a3c2d
 };