libavcodec/msmpeg4.c
de6d9b64
 /*
  * MSMPEG4 backend for ffmpeg 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
983e3246
  * MSMPEG4 backend for ffmpeg encoder and decoder.
  */
 
6000abfa
 #include "avcodec.h"
de6d9b64
 #include "dsputil.h"
 #include "mpegvideo.h"
cc6de104
 #include "msmpeg4.h"
f2d702e1
 #include "libavutil/x86_cpu.h"
ca334dd1
 #include "h263.h"
 #include "mpeg4video.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
 
05174fd4
 #define II_BITRATE 128*1024
 #define MBAC_BITRATE 50*1024
 
1457ab52
 #define DEFAULT_INTER_INDEX 3
 
0c1a9eda
 static uint32_t v2_dc_lum_table[512][2];
 static uint32_t v2_dc_chroma_table[512][2];
84afee34
 
10b9c374
 /* vc1 externs */
9ad5675f
 extern const uint8_t wmv3_dc_scale_table[32];
62959862
 
de6d9b64
 #ifdef DEBUG
 int frame_count = 0;
 #endif
 
 #include "msmpeg4data.h"
 
b250f9c6
 #if CONFIG_ENCODERS //strangely gcc includes this even if it is not referenced
0c1a9eda
 static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
2a250222
 #endif //CONFIG_ENCODERS
62959862
 
3502a54f
 static uint8_t static_rl_table_store[NB_RL_TABLES][2][2*MAX_RUN + MAX_LEVEL + 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;
 
         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++;
                 }
             }
             v2_dc_lum_table[level+256][0]= uni_code;
             v2_dc_lum_table[level+256][1]= uni_len;
 
             /* 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++;
                 }
             }
             v2_dc_chroma_table[level+256][0]= uni_code;
             v2_dc_chroma_table[level+256][1]= uni_len;
 
         }
 }
 
5ef251e5
 static av_cold void common_init(MpegEncContext * s)
f5957f3f
 {
5e534865
     static int initialized=0;
115329f1
 
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){
             s->y_dc_scale_table= old_ff_y_dc_scale_table;
5a893969
             s->c_dc_scale_table= 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:
f5957f3f
         s->y_dc_scale_table= wmv1_y_dc_scale_table;
         s->c_dc_scale_table= wmv1_c_dc_scale_table;
         break;
9be6f0d2
 #if CONFIG_VC1_DECODER
0d33db8a
     case 6:
         s->y_dc_scale_table= wmv3_dc_scale_table;
         s->c_dc_scale_table= wmv3_dc_scale_table;
         break;
8b975b7c
 #endif
0d33db8a
 
f5957f3f
     }
 
115329f1
 
1457ab52
     if(s->msmpeg4_version>=4){
3d2e8cce
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , wmv1_scantable[1]);
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , wmv1_scantable[0]);
f5957f3f
     }
2ad1516a
     //Note the default tables are set in common_init in mpegvideo.c
115329f1
 
5e534865
     if(!initialized){
         initialized=1;
f5957f3f
 
         init_h263_dc_for_msmpeg4();
     }
 }
 
b250f9c6
 #if CONFIG_ENCODERS
7604246d
 
de6d9b64
 /* build the table which associate a (x,y) motion vector to a vlc */
 static void init_mv_table(MVTable *tab)
 {
     int i, x, y;
 
0c1a9eda
     tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
de6d9b64
     /* mark all entries as not used */
     for(i=0;i<4096;i++)
         tab->table_mv_index[i] = tab->n;
115329f1
 
de6d9b64
     for(i=0;i<tab->n;i++) {
         x = tab->table_mvx[i];
         y = tab->table_mvy[i];
         tab->table_mv_index[(x << 6) | y] = i;
     }
 }
 
85f601ee
 void ff_msmpeg4_code012(PutBitContext *pb, int n)
de6d9b64
 {
     if (n == 0) {
         put_bits(pb, 1, 0);
     } else {
         put_bits(pb, 1, 1);
         put_bits(pb, 1, (n >= 2));
     }
 }
 
f5957f3f
 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
     int size=0;
     int code;
     int run_diff= intra ? 0 : 1;
115329f1
 
f5957f3f
     code = get_rl_index(rl, last, run, level);
     size+= rl->table_vlc[code][1];
     if (code == rl->n) {
         int level1, run1;
 
         level1 = level - rl->max_level[last][run];
115329f1
         if (level1 < 1)
f5957f3f
             goto esc2;
         code = get_rl_index(rl, last, run, level1);
         if (code == rl->n) {
             esc2:
             size++;
             if (level > MAX_LEVEL)
                 goto esc3;
             run1 = run - rl->max_run[last][level] - run_diff;
             if (run1 < 0)
                 goto esc3;
             code = get_rl_index(rl, last, run1, level);
             if (code == rl->n) {
             esc3:
                 /* third escape */
                 size+=1+1+6+8;
             } else {
                 /* second escape */
                 size+= 1+1+ rl->table_vlc[code][1];
             }
         } else {
             /* first escape */
             size+= 1+1+ rl->table_vlc[code][1];
         }
     } else {
         size++;
     }
     return size;
 }
 
8380edd9
 av_cold void ff_msmpeg4_encode_init(MpegEncContext *s)
 {
     static int init_done=0;
     int i;
 
     common_init(s);
     if(s->msmpeg4_version>=4){
         s->min_qcoeff= -255;
         s->max_qcoeff=  255;
     }
 
     if (!init_done) {
         /* init various encoding tables */
         init_done = 1;
         init_mv_table(&mv_tables[0]);
         init_mv_table(&mv_tables[1]);
         for(i=0;i<NB_RL_TABLES;i++)
             init_rl(&rl_table[i], static_rl_table_store[i]);
 
         for(i=0; i<NB_RL_TABLES; i++){
             int level;
             for(level=0; level<=MAX_LEVEL; level++){
                 int run;
                 for(run=0; run<=MAX_RUN; run++){
                     int last;
                     for(last=0; last<2; last++){
                         rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[  i], last, run, level, 0);
                     }
                 }
             }
         }
     }
 }
 
cb92c528
 static void find_best_tables(MpegEncContext * s)
f5957f3f
 {
     int i;
     int best       =-1, best_size       =9999999;
     int chroma_best=-1, best_chroma_size=9999999;
62959862
 
f5957f3f
     for(i=0; i<3; i++){
         int level;
         int chroma_size=0;
         int size=0;
 
         if(i>0){// ;)
115329f1
             size++;
f5957f3f
             chroma_size++;
         }
         for(level=0; level<=MAX_LEVEL; level++){
             int run;
             for(run=0; run<=MAX_RUN; run++){
                 int last;
62959862
                 const int last_size= size + chroma_size;
f5957f3f
                 for(last=0; last<2; last++){
                     int inter_count       = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
                     int intra_luma_count  = s->ac_stats[1][0][level][run][last];
                     int intra_chroma_count= s->ac_stats[1][1][level][run][last];
115329f1
 
ce5e49b0
                     if(s->pict_type==AV_PICTURE_TYPE_I){
060f89b3
                         size       += intra_luma_count  *rl_length[i  ][level][run][last];
                         chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
f5957f3f
                     }else{
060f89b3
                         size+=        intra_luma_count  *rl_length[i  ][level][run][last]
                                      +intra_chroma_count*rl_length[i+3][level][run][last]
                                      +inter_count       *rl_length[i+3][level][run][last];
115329f1
                     }
f5957f3f
                 }
62959862
                 if(last_size == size+chroma_size) break;
f5957f3f
             }
         }
         if(size<best_size){
             best_size= size;
             best= i;
         }
         if(chroma_size<best_chroma_size){
             best_chroma_size= chroma_size;
             chroma_best= i;
         }
     }
62959862
 
115329f1
 //    printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
f5957f3f
 //           s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
115329f1
 
ce5e49b0
     if(s->pict_type==AV_PICTURE_TYPE_P) chroma_best= best;
f5957f3f
 
     memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
 
     s->rl_table_index       =        best;
     s->rl_chroma_table_index= chroma_best;
115329f1
 
f5957f3f
     if(s->pict_type != s->last_non_b_pict_type){
         s->rl_table_index= 2;
ce5e49b0
         if(s->pict_type==AV_PICTURE_TYPE_I)
f5957f3f
             s->rl_chroma_table_index= 1;
         else
             s->rl_chroma_table_index= 2;
     }
 
 }
 
287229e5
 /* write MSMPEG4 compatible frame header */
de6d9b64
 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
 {
cb92c528
     find_best_tables(s);
de6d9b64
 
     align_put_bits(&s->pb);
     put_bits(&s->pb, 2, s->pict_type - 1);
 
     put_bits(&s->pb, 5, s->qscale);
f5957f3f
     if(s->msmpeg4_version<=2){
         s->rl_table_index = 2;
         s->rl_chroma_table_index = 2;
     }
3825cd1d
 
de6d9b64
     s->dc_table_index = 1;
     s->mv_table_index = 1; /* only if P frame */
     s->use_skip_mb_code = 1; /* only if P frame */
f5957f3f
     s->per_mb_rl_table = 0;
fc48cbad
     if(s->msmpeg4_version==4)
ce5e49b0
         s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==AV_PICTURE_TYPE_P);
1457ab52
 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
f5957f3f
 
ce5e49b0
     if (s->pict_type == AV_PICTURE_TYPE_I) {
de0f2f4c
         s->slice_height= s->mb_height/1;
         put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
115329f1
 
f5957f3f
         if(s->msmpeg4_version==4){
             msmpeg4_encode_ext_header(s);
05174fd4
             if(s->bit_rate>MBAC_BITRATE)
de0f2f4c
                 put_bits(&s->pb, 1, s->per_mb_rl_table);
f5957f3f
         }
de6d9b64
 
287229e5
         if(s->msmpeg4_version>2){
f5957f3f
             if(!s->per_mb_rl_table){
85f601ee
                 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index);
                 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
f5957f3f
             }
de6d9b64
 
3825cd1d
             put_bits(&s->pb, 1, s->dc_table_index);
         }
de6d9b64
     } else {
         put_bits(&s->pb, 1, s->use_skip_mb_code);
115329f1
 
05174fd4
         if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
f5957f3f
             put_bits(&s->pb, 1, s->per_mb_rl_table);
 
287229e5
         if(s->msmpeg4_version>2){
f5957f3f
             if(!s->per_mb_rl_table)
85f601ee
                 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
de6d9b64
 
3825cd1d
             put_bits(&s->pb, 1, s->dc_table_index);
 
             put_bits(&s->pb, 1, s->mv_table_index);
         }
de6d9b64
     }
 
f5957f3f
     s->esc3_level_length= 0;
     s->esc3_run_length= 0;
de6d9b64
 }
 
ae40484c
 void msmpeg4_encode_ext_header(MpegEncContext * s)
 {
c0df9d75
         put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29
ae40484c
 
b8a78f41
         put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
ae40484c
 
1f9aea9b
         if(s->msmpeg4_version>=3)
287229e5
             put_bits(&s->pb, 1, s->flipflop_rounding);
1f9aea9b
         else
             assert(s->flipflop_rounding==0);
ae40484c
 }
 
7604246d
 #endif //CONFIG_ENCODERS
 
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;
 }
 
b250f9c6
 #if CONFIG_ENCODERS
7604246d
 
85f601ee
 void ff_msmpeg4_encode_motion(MpegEncContext * s,
de6d9b64
                                   int mx, int my)
 {
     int code;
     MVTable *mv;
 
     /* modulo encoding */
     /* WARNING : you cannot reach all the MVs even with the modulo
        encoding. This is a somewhat strange compromise they took !!!  */
     if (mx <= -64)
         mx += 64;
     else if (mx >= 64)
         mx -= 64;
     if (my <= -64)
         my += 64;
     else if (my >= 64)
         my -= 64;
115329f1
 
de6d9b64
     mx += 32;
     my += 32;
 #if 0
     if ((unsigned)mx >= 64 ||
115329f1
         (unsigned)my >= 64)
267f7edc
         av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my);
de6d9b64
 #endif
     mv = &mv_tables[s->mv_table_index];
 
     code = mv->table_mv_index[(mx << 6) | my];
115329f1
     put_bits(&s->pb,
              mv->table_mv_bits[code],
de6d9b64
              mv->table_mv_code[code]);
     if (code == mv->n) {
90b5b51e
         /* escape : code literally */
de6d9b64
         put_bits(&s->pb, 6, mx);
         put_bits(&s->pb, 6, my);
     }
 }
 
85f601ee
 void ff_msmpeg4_handle_slices(MpegEncContext *s){
de0f2f4c
     if (s->mb_x == 0) {
         if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
28269849
             if(s->msmpeg4_version < 4){
4d2858de
                 ff_mpeg4_clean_buffers(s);
de0f2f4c
             }
             s->first_slice_line = 1;
         } else {
115329f1
             s->first_slice_line = 0;
de0f2f4c
         }
     }
 }
 
8380edd9
 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
 {
     int range, bit_size, sign, code, bits;
 
     if (val == 0) {
         /* zero vector */
         code = 0;
         put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
     } else {
         bit_size = s->f_code - 1;
         range = 1 << bit_size;
         if (val <= -64)
             val += 64;
         else if (val >= 64)
             val -= 64;
 
         if (val >= 0) {
             sign = 0;
         } else {
             val = -val;
             sign = 1;
         }
         val--;
         code = (val >> bit_size) + 1;
         bits = val & (range - 1);
 
         put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
         if (bit_size > 0) {
             put_bits(&s->pb, bit_size, bits);
         }
     }
 }
 
115329f1
 void msmpeg4_encode_mb(MpegEncContext * s,
de6d9b64
                        DCTELEM block[6][64],
                        int motion_x, int motion_y)
 {
     int cbp, coded_cbp, i;
     int pred_x, pred_y;
0c1a9eda
     uint8_t *coded_block;
de6d9b64
 
85f601ee
     ff_msmpeg4_handle_slices(s);
115329f1
 
de6d9b64
     if (!s->mb_intra) {
bb270c08
         /* compute cbp */
         cbp = 0;
         for (i = 0; i < 6; i++) {
             if (s->block_last_index[i] >= 0)
                 cbp |= 1 << (5 - i);
         }
         if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
             /* skip macroblock */
             put_bits(&s->pb, 1, 1);
4d2a4834
             s->last_bits++;
bb270c08
             s->misc_bits++;
a0c83173
             s->skip_count++;
4d2a4834
 
bb270c08
             return;
         }
de6d9b64
         if (s->use_skip_mb_code)
bb270c08
             put_bits(&s->pb, 1, 0);     /* mb coded */
115329f1
 
287229e5
         if(s->msmpeg4_version<=2){
115329f1
             put_bits(&s->pb,
                      v2_mb_type[cbp&3][1],
3825cd1d
                      v2_mb_type[cbp&3][0]);
             if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
             else             coded_cbp= cbp;
 
115329f1
             put_bits(&s->pb,
101ada9a
                      ff_h263_cbpy_tab[coded_cbp>>2][1],
                      ff_h263_cbpy_tab[coded_cbp>>2][0]);
4d2a4834
 
             s->misc_bits += get_bits_diff(s);
 
137c8468
             h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
3825cd1d
             msmpeg4v2_encode_motion(s, motion_x - pred_x);
             msmpeg4v2_encode_motion(s, motion_y - pred_y);
         }else{
115329f1
             put_bits(&s->pb,
                      table_mb_non_intra[cbp + 64][1],
3825cd1d
                      table_mb_non_intra[cbp + 64][0]);
 
4d2a4834
             s->misc_bits += get_bits_diff(s);
 
3825cd1d
             /* motion vector */
137c8468
             h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
85f601ee
             ff_msmpeg4_encode_motion(s, motion_x - pred_x,
3825cd1d
                                   motion_y - pred_y);
         }
4d2a4834
 
         s->mv_bits += get_bits_diff(s);
 
         for (i = 0; i < 6; i++) {
c68a173e
             ff_msmpeg4_encode_block(s, block[i], i);
4d2a4834
         }
         s->p_tex_bits += get_bits_diff(s);
de6d9b64
     } else {
bb270c08
         /* compute cbp */
         cbp = 0;
de6d9b64
         coded_cbp = 0;
bb270c08
         for (i = 0; i < 6; i++) {
de6d9b64
             int val, pred;
             val = (s->block_last_index[i] >= 1);
             cbp |= val << (5 - i);
             if (i < 4) {
                 /* predict value for close blocks only for luma */
85f601ee
                 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
de6d9b64
                 *coded_block = val;
                 val = val ^ pred;
             }
             coded_cbp |= val << (5 - i);
bb270c08
         }
de6d9b64
 
287229e5
         if(s->msmpeg4_version<=2){
ce5e49b0
             if (s->pict_type == AV_PICTURE_TYPE_I) {
115329f1
                 put_bits(&s->pb,
3825cd1d
                          v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
             } else {
                 if (s->use_skip_mb_code)
bb270c08
                     put_bits(&s->pb, 1, 0);     /* mb coded */
115329f1
                 put_bits(&s->pb,
                          v2_mb_type[(cbp&3) + 4][1],
3825cd1d
                          v2_mb_type[(cbp&3) + 4][0]);
             }
bb270c08
             put_bits(&s->pb, 1, 0);             /* no AC prediction yet */
115329f1
             put_bits(&s->pb,
101ada9a
                      ff_h263_cbpy_tab[cbp>>2][1],
                      ff_h263_cbpy_tab[cbp>>2][0]);
3825cd1d
         }else{
ce5e49b0
             if (s->pict_type == AV_PICTURE_TYPE_I) {
115329f1
                 put_bits(&s->pb,
0d33db8a
                          ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
3825cd1d
             } else {
                 if (s->use_skip_mb_code)
bb270c08
                     put_bits(&s->pb, 1, 0);     /* mb coded */
115329f1
                 put_bits(&s->pb,
                          table_mb_non_intra[cbp][1],
3825cd1d
                          table_mb_non_intra[cbp][0]);
             }
bb270c08
             put_bits(&s->pb, 1, 0);             /* no AC prediction yet */
05174fd4
             if(s->inter_intra_pred){
                 s->h263_aic_dir=0;
                 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
             }
de6d9b64
         }
4d2a4834
         s->misc_bits += get_bits_diff(s);
de6d9b64
 
4d2a4834
         for (i = 0; i < 6; i++) {
c68a173e
             ff_msmpeg4_encode_block(s, block[i], i);
4d2a4834
         }
         s->i_tex_bits += get_bits_diff(s);
a0c83173
         s->i_count++;
de6d9b64
     }
 }
 
7604246d
 #endif //CONFIG_ENCODERS
 
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 */
115329f1
 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
b86216de
                              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;
1e491e29
                     dest= s->current_picture.data[0] + (((n>>1) + 2*s->mb_y) * 8*  wrap ) + ((n&1) + 2*s->mb_x) * 8;
de0f2f4c
                 }else{
0fd90455
                     wrap= s->uvlinesize;
1e491e29
                     dest= s->current_picture.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;
 }
 
 #define DC_MAX 119
 
 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
 {
     int sign, code;
b05b1931
     int pred, extquant;
     int extrabits = 0;
de6d9b64
 
b2893ee2
     int16_t *dc_val;
     pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
de6d9b64
 
b2893ee2
     /* update predictor */
     if (n < 4) {
         *dc_val = level * s->y_dc_scale;
     } else {
         *dc_val = level * s->c_dc_scale;
de6d9b64
     }
 
     /* do the prediction */
     level -= pred;
 
287229e5
     if(s->msmpeg4_version<=2){
de6d9b64
         if (n < 4) {
115329f1
             put_bits(&s->pb,
3825cd1d
                      v2_dc_lum_table[level+256][1],
                      v2_dc_lum_table[level+256][0]);
         }else{
115329f1
             put_bits(&s->pb,
3825cd1d
                      v2_dc_chroma_table[level+256][1],
                      v2_dc_chroma_table[level+256][0]);
de6d9b64
         }
3825cd1d
     }else{
         sign = 0;
         if (level < 0) {
             level = -level;
             sign = 1;
         }
         code = level;
115329f1
         if (code > DC_MAX)
3825cd1d
             code = DC_MAX;
b05b1931
         else if( s->msmpeg4_version>=6 ) {
             if( s->qscale == 1 ) {
                 extquant = (level + 3) & 0x3;
                 code  = ((level+3)>>2);
             } else if( s->qscale == 2 ) {
                 extquant = (level + 1) & 0x1;
                 code  = ((level+1)>>1);
             }
         }
3825cd1d
 
         if (s->dc_table_index == 0) {
             if (n < 4) {
0c040aac
                 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
3825cd1d
             } else {
0c040aac
                 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
3825cd1d
             }
de6d9b64
         } else {
3825cd1d
             if (n < 4) {
0c040aac
                 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
3825cd1d
             } else {
0c040aac
                 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
3825cd1d
             }
         }
115329f1
 
b05b1931
         if(s->msmpeg4_version>=6 && s->qscale<=2)
             extrabits = 3 - s->qscale;
 
3825cd1d
         if (code == DC_MAX)
b05b1931
             put_bits(&s->pb, 8 + extrabits, level);
         else if(extrabits > 0)//== VC1 && s->qscale<=2
             put_bits(&s->pb, extrabits, extquant);
115329f1
 
3825cd1d
         if (level != 0) {
             put_bits(&s->pb, 1, sign);
de6d9b64
         }
     }
 }
 
 /* Encoding of a block. Very similar to MPEG4 except for a different
    escape coding (same as H263) and more vlc tables.
  */
c68a173e
 void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
de6d9b64
 {
     int level, run, last, i, j, last_index;
     int last_non_zero, sign, slevel;
     int code, run_diff, dc_pred_dir;
     const RLTable *rl;
0c1a9eda
     const uint8_t *scantable;
de6d9b64
 
     if (s->mb_intra) {
         msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
         i = 1;
         if (n < 4) {
             rl = &rl_table[s->rl_table_index];
         } else {
             rl = &rl_table[3 + s->rl_chroma_table_index];
         }
d7826b58
         run_diff = s->msmpeg4_version>=4;
2ad1516a
         scantable= s->intra_scantable.permutated;
de6d9b64
     } else {
         i = 0;
         rl = &rl_table[3 + s->rl_table_index];
287229e5
         if(s->msmpeg4_version<=2)
3825cd1d
             run_diff = 0;
         else
             run_diff = 1;
2ad1516a
         scantable= s->inter_scantable.permutated;
de6d9b64
     }
 
f5957f3f
     /* recalculate block_last_index for M$ wmv1 */
b05b1931
     if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
f5957f3f
         for(last_index=63; last_index>=0; last_index--){
             if(block[scantable[last_index]]) break;
         }
4d2858de
         s->block_last_index[n]= last_index;
f5957f3f
     }else
         last_index = s->block_last_index[n];
de6d9b64
     /* AC coefs */
     last_non_zero = i - 1;
     for (; i <= last_index; i++) {
bb270c08
         j = scantable[i];
         level = block[j];
         if (level) {
             run = i - last_non_zero - 1;
             last = (i == last_index);
             sign = 0;
             slevel = level;
             if (level < 0) {
                 sign = 1;
                 level = -level;
             }
62959862
 
f5957f3f
             if(level<=MAX_LEVEL && run<=MAX_RUN){
                 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
             }
e6ff0648
 
             s->ac_stats[s->mb_intra][n > 3][40][63][0]++; //esc3 like
 
de6d9b64
             code = get_rl_index(rl, last, run, level);
             put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
             if (code == rl->n) {
                 int level1, run1;
 
                 level1 = level - rl->max_level[last][run];
115329f1
                 if (level1 < 1)
de6d9b64
                     goto esc2;
                 code = get_rl_index(rl, last, run, level1);
                 if (code == rl->n) {
                 esc2:
                     put_bits(&s->pb, 1, 0);
                     if (level > MAX_LEVEL)
                         goto esc3;
                     run1 = run - rl->max_run[last][level] - run_diff;
                     if (run1 < 0)
                         goto esc3;
d7826b58
                     code = get_rl_index(rl, last, run1+1, level);
                     if (s->msmpeg4_version == 4 && code == rl->n)
                         goto esc3;
de6d9b64
                     code = get_rl_index(rl, last, run1, level);
                     if (code == rl->n) {
                     esc3:
                         /* third escape */
                         put_bits(&s->pb, 1, 0);
                         put_bits(&s->pb, 1, last);
1457ab52
                         if(s->msmpeg4_version>=4){
f5957f3f
                             if(s->esc3_level_length==0){
                                 s->esc3_level_length=8;
                                 s->esc3_run_length= 6;
b05b1931
                                 //ESCLVLSZ + ESCRUNSZ
f5957f3f
                                 if(s->qscale<8)
b05b1931
                                     put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
f5957f3f
                                 else
                                     put_bits(&s->pb, 8, 3);
                             }
                             put_bits(&s->pb, s->esc3_run_length, run);
                             put_bits(&s->pb, 1, sign);
                             put_bits(&s->pb, s->esc3_level_length, level);
                         }else{
                             put_bits(&s->pb, 6, run);
6647ab80
                             put_sbits(&s->pb, 8, slevel);
f5957f3f
                         }
de6d9b64
                     } else {
                         /* second escape */
                         put_bits(&s->pb, 1, 1);
                         put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
                         put_bits(&s->pb, 1, sign);
                     }
                 } else {
                     /* first escape */
                     put_bits(&s->pb, 1, 1);
                     put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
                     put_bits(&s->pb, 1, sign);
                 }
             } else {
                 put_bits(&s->pb, 1, sign);
             }
bb270c08
             last_non_zero = i;
         }
de6d9b64
     }
 }
 
 /****************************************/
 /* 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);
 //     printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
     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;
 
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;
                 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;
 
         h263_pred_motion(s, 0, 0, &mx, &my);
         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;
     } 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
         }
     }
 
     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;
     uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ];
 
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;
 //printf("P at %d %d\n", s->mb_x, s->mb_y);
         if(s->per_mb_rl_table && cbp){
             s->rl_table_index = decode012(&s->gb);
             s->rl_chroma_table_index = s->rl_table_index;
84afee34
         }
8380edd9
         h263_pred_motion(s, 0, 0, &mx, &my);
         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 {
 //printf("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));
         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);
 //            printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
         }
         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;
d81c5983
     static int done = 0;
de6d9b64
     int i;
     MVTable *mv;
 
d2940155
     if (ff_h263_decode_init(avctx) < 0)
         return -1;
261a3c2d
 
f5957f3f
     common_init(s);
de6d9b64
 
d81c5983
     if (!done) {
         done = 1;
 
         for(i=0;i<NB_RL_TABLES;i++) {
3502a54f
             init_rl(&rl_table[i], static_rl_table_store[i]);
d81c5983
         }
ceaaf78b
         INIT_VLC_RL(rl_table[0], 642);
         INIT_VLC_RL(rl_table[1], 1104);
         INIT_VLC_RL(rl_table[2], 554);
         INIT_VLC_RL(rl_table[3], 940);
         INIT_VLC_RL(rl_table[4], 962);
         INIT_VLC_RL(rl_table[5], 554);
d81c5983
 
5cf4331b
         mv = &mv_tables[0];
         INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
                     mv->table_mv_bits, 1, 1,
                     mv->table_mv_code, 2, 2, 3714);
         mv = &mv_tables[1];
         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,
d81c5983
                  &v2_dc_lum_table[0][1], 8, 4,
5cf4331b
                  &v2_dc_lum_table[0][0], 8, 4, 1472);
         INIT_VLC_STATIC(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
d81c5983
                  &v2_dc_chroma_table[0][1], 8, 4,
5cf4331b
                  &v2_dc_chroma_table[0][0], 8, 4, 1506);
115329f1
 
5cf4331b
         INIT_VLC_STATIC(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
d81c5983
                  &v2_intra_cbpc[0][1], 2, 1,
5cf4331b
                  &v2_intra_cbpc[0][0], 2, 1, 8);
         INIT_VLC_STATIC(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
d81c5983
                  &v2_mb_type[0][1], 2, 1,
5cf4331b
                  &v2_mb_type[0][0], 2, 1, 128);
         INIT_VLC_STATIC(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
d81c5983
                  &mvtab[0][1], 2, 1,
5cf4331b
                  &mvtab[0][0], 2, 1, 538);
 
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[0], MB_NON_INTRA_VLC_BITS, 128,
                      &wmv2_inter_table[0][0][1], 8, 4,
                      &wmv2_inter_table[0][0][0], 8, 4, 1636);
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[1], MB_NON_INTRA_VLC_BITS, 128,
                      &wmv2_inter_table[1][0][1], 8, 4,
                      &wmv2_inter_table[1][0][0], 8, 4, 2648);
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[2], MB_NON_INTRA_VLC_BITS, 128,
                      &wmv2_inter_table[2][0][1], 8, 4,
                      &wmv2_inter_table[2][0][0], 8, 4, 1532);
         INIT_VLC_STATIC(&ff_mb_non_intra_vlc[3], MB_NON_INTRA_VLC_BITS, 128,
                      &wmv2_inter_table[3][0][1], 8, 4,
                      &wmv2_inter_table[3][0][0], 8, 4, 2488);
 
         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,
de0f2f4c
                  &table_inter_intra[0][1], 2, 1,
5cf4331b
                  &table_inter_intra[0][0], 2, 1, 8);
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;
 }
 
84afee34
 int 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:
f5957f3f
             msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
 
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
     }
1457ab52
 //printf("%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;
 }
 
ae40484c
 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
 {
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;
2b9ab1d5
 
05174fd4
 //        printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
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;
         pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
         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) {
             rl = &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 {
             rl = &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;
de6d9b64
         rl = &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);
                         level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
                         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;
                             //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
                             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);
f5957f3f
 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
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;
                     }
 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
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);
047599a4
                 if(((i+192 == 64 && level/qmul==-1) || s->error_recognition<=1) && left>=0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
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) {
         mpeg4_pred_ac(s, block, n, dc_pred_dir);
         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;
 
     mv = &mv_tables[s->mv_table_index];
 
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) {
f5957f3f
 //printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
de6d9b64
         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 = {
261a3c2d
     "msmpeg4v1",
72415b2a
     AVMEDIA_TYPE_VIDEO,
261a3c2d
     CODEC_ID_MSMPEG4V1,
     sizeof(MpegEncContext),
     ff_msmpeg4_decode_init,
     NULL,
     ff_h263_decode_end,
     ff_h263_decode_frame,
dca85c84
     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_EXPERIMENTAL,
0fd0ef79
     .max_lowres= 3,
261a3c2d
     .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
     .pix_fmts= ff_pixfmt_list_420,
 };
 
e7e2df27
 AVCodec ff_msmpeg4v2_decoder = {
261a3c2d
     "msmpeg4v2",
72415b2a
     AVMEDIA_TYPE_VIDEO,
261a3c2d
     CODEC_ID_MSMPEG4V2,
     sizeof(MpegEncContext),
     ff_msmpeg4_decode_init,
     NULL,
     ff_h263_decode_end,
     ff_h263_decode_frame,
     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
0fd0ef79
     .max_lowres= 3,
261a3c2d
     .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
     .pix_fmts= ff_pixfmt_list_420,
 };
 
e7e2df27
 AVCodec ff_msmpeg4v3_decoder = {
261a3c2d
     "msmpeg4",
72415b2a
     AVMEDIA_TYPE_VIDEO,
261a3c2d
     CODEC_ID_MSMPEG4V3,
     sizeof(MpegEncContext),
     ff_msmpeg4_decode_init,
     NULL,
     ff_h263_decode_end,
     ff_h263_decode_frame,
     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
0fd0ef79
     .max_lowres= 3,
261a3c2d
     .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
     .pix_fmts= ff_pixfmt_list_420,
 };
 
e7e2df27
 AVCodec ff_wmv1_decoder = {
261a3c2d
     "wmv1",
72415b2a
     AVMEDIA_TYPE_VIDEO,
261a3c2d
     CODEC_ID_WMV1,
     sizeof(MpegEncContext),
     ff_msmpeg4_decode_init,
     NULL,
     ff_h263_decode_end,
     ff_h263_decode_frame,
     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
0fd0ef79
     .max_lowres= 3,
261a3c2d
     .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
     .pix_fmts= ff_pixfmt_list_420,
 };