libavcodec/h263.c
de6d9b64
 /*
  * H263/MPEG4 backend for ffmpeg encoder and decoder
406792e7
  * Copyright (c) 2000,2001 Fabrice Bellard
6dbd39fe
  * H263+ support.
406792e7
  * Copyright (c) 2001 Juan J. Sierralta P
8f2ab833
  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
de6d9b64
  *
7b94177e
  * ac prediction encoding, B-frame support, error resilience, optimizations,
  * qpel decoding, gmc decoding, interlaced decoding
  * 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
  */
2ba8f6b8
 
 /**
bad5537e
  * @file libavcodec/h263.c
983e3246
  * h263/mpeg4 codec.
2ba8f6b8
  */
115329f1
 
1e209222
 //#define DEBUG
f2f6134b
 #include <limits.h>
 
de6d9b64
 #include "dsputil.h"
 #include "avcodec.h"
 #include "mpegvideo.h"
 #include "h263data.h"
 #include "mpeg4data.h"
199436b9
 #include "mathops.h"
de6d9b64
 
c5d309f2
 //#undef NDEBUG
 //#include <assert.h>
 
edcf9890
 #define INTRA_MCBPC_VLC_BITS 6
7af75e6c
 #define INTER_MCBPC_VLC_BITS 7
edcf9890
 #define CBPY_VLC_BITS 6
 #define MV_VLC_BITS 9
 #define DC_VLC_BITS 9
 #define SPRITE_TRAJ_VLC_BITS 6
 #define MB_TYPE_B_VLC_BITS 4
 #define TEX_VLC_BITS 9
b40cd4e0
 #define H263_MBTYPE_B_VLC_BITS 6
 #define CBPC_B_VLC_BITS 3
edcf9890
 
de6d9b64
 static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
d4f5d74a
                               int n);
6dbd39fe
 static void h263p_encode_umotion(MpegEncContext * s, int val);
3db48188
 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
115329f1
                                int n, int dc, uint8_t *scan_table,
92073d01
                                PutBitContext *dc_pb, PutBitContext *ac_pb);
62bb489b
 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
                                   uint8_t *scan_table);
bbed9259
 
6f91bcd1
 static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
6dbd39fe
 static int h263p_decode_umotion(MpegEncContext * s, int pred);
de6d9b64
 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
                              int n, int coded);
92073d01
 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
a4e8b587
                               int n, int coded, int intra, int rvlc);
c7f03f4e
 
b86216de
 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr);
22ddd60b
 static void mpeg4_encode_visual_object_header(MpegEncContext * s);
 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number);
c7f03f4e
 
3f9d89c6
 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb);
a7137a04
 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding);
4d2858de
 
b250f9c6
 #if CONFIG_ENCODERS
0c1a9eda
 static uint8_t uni_DCtab_lum_len[512];
 static uint8_t uni_DCtab_chrom_len[512];
 static uint16_t uni_DCtab_lum_bits[512];
 static uint16_t uni_DCtab_chrom_bits[512];
bbed9259
 
5ac09151
 static uint8_t mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
0c1a9eda
 static uint8_t fcode_tab[MAX_MV*2+1];
 static uint8_t umv_fcode_tab[MAX_MV*2+1];
45870f57
 
477ab036
 static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
 static uint8_t  uni_mpeg4_intra_rl_len [64*64*2*2];
 static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
 static uint8_t  uni_mpeg4_inter_rl_len [64*64*2*2];
15c5fa7b
 static uint8_t  uni_h263_intra_aic_rl_len [64*64*2*2];
 static uint8_t  uni_h263_inter_rl_len [64*64*2*2];
477ab036
 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
3db48188
 //#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
477ab036
 #define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
3db48188
 
 /* mpeg4
 inter
 max level: 24/6
 max run: 53/63
 
 intra
 max level: 53/16
 max run: 29/41
 */
bbed9259
 #endif
 
7ca6cc09
 static uint8_t static_rl_table_store[5][2][2*MAX_RUN + MAX_LEVEL + 3];
 
893bc624
 #if 0 //3IV1 is quite rare and it slows things down a tiny bit
2bb6eba2
 #define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
115329f1
 #else
6d71b382
 #define IS_3IV1 0
 #endif
2a164b25
 
de6d9b64
 int h263_get_picture_format(int width, int height)
 {
     int format;
 
     if (width == 128 && height == 96)
1e209222
         format = 1;
de6d9b64
     else if (width == 176 && height == 144)
1e209222
         format = 2;
de6d9b64
     else if (width == 352 && height == 288)
1e209222
         format = 3;
de6d9b64
     else if (width == 704 && height == 576)
1e209222
         format = 4;
de6d9b64
     else if (width == 1408 && height == 1152)
1e209222
         format = 5;
de6d9b64
     else
         format = 7;
     return format;
 }
 
1be7c87f
 static void show_pict_info(MpegEncContext *s){
     av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n",
          s->qscale, av_get_pict_type_char(s->pict_type),
          s->gb.size_in_bits, 1-s->no_rounding,
          s->obmc ? " AP" : "",
          s->umvplus ? " UMV" : "",
          s->h263_long_vectors ? " LONG" : "",
          s->h263_plus ? " +" : "",
          s->h263_aic ? " AIC" : "",
          s->alt_inter_vlc ? " AIV" : "",
          s->modified_quant ? " MQ" : "",
          s->loop_filter ? " LOOP" : "",
          s->h263_slice_structured ? " SS" : "",
          s->avctx->time_base.den, s->avctx->time_base.num
     );
 }
 
b250f9c6
 #if CONFIG_ENCODERS
7604246d
 
5ff85f1d
 static void aspect_to_info(MpegEncContext * s, AVRational aspect){
58b0b0dd
     int i;
 
5ff85f1d
     if(aspect.num==0) aspect= (AVRational){1,1};
58b0b0dd
 
     for(i=1; i<6; i++){
5ff85f1d
         if(av_cmp_q(pixel_aspect[i], aspect) == 0){
58b0b0dd
             s->aspect_ratio_info=i;
             return;
         }
     }
115329f1
 
58b0b0dd
     s->aspect_ratio_info= FF_ASPECT_EXTENDED;
5d3cea3a
 }
 
44a2950f
 void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number)
de6d9b64
 {
44a2950f
       int format;
de6d9b64
 
44a2950f
       align_put_bits(&s->pb);
81401c1f
 
d4f5d74a
       put_bits(&s->pb, 17, 1);
       put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
c0df9d75
       put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
                            s->avctx->time_base.den) & 0xff); /* TemporalReference */
d4f5d74a
       if (s->width == 352 && s->height == 288)
         format = 2;
       else if (s->width == 176 && s->height == 144)
         format = 3;
       else if (s->width == 128 && s->height == 96)
         format = 4;
       else if (s->width == 320 && s->height == 240)
         format = 5;
       else if (s->width == 160 && s->height == 120)
         format = 6;
       else if (s->width <= 255 && s->height <= 255)
         format = 0; /* use 1 byte width & height */
       else
         format = 1; /* use 2 bytes width & height */
       put_bits(&s->pb, 3, format); /* PictureSize */
       if (format == 0) {
         put_bits(&s->pb, 8, s->width);
         put_bits(&s->pb, 8, s->height);
       } else if (format == 1) {
         put_bits(&s->pb, 16, s->width);
         put_bits(&s->pb, 16, s->height);
       }
9701840b
       put_bits(&s->pb, 2, s->pict_type == FF_P_TYPE); /* PictureType */
f5ea4461
       put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
d4f5d74a
       put_bits(&s->pb, 5, s->qscale); /* Quantizer */
       put_bits(&s->pb, 1, 0); /* ExtraInformation */
 
       if(s->h263_aic){
115329f1
         s->y_dc_scale_table=
68b94c35
           s->c_dc_scale_table= ff_aic_dc_scale_table;
d4f5d74a
       }else{
         s->y_dc_scale_table=
           s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
       }
44a2950f
 }
 
 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
 {
b056e73c
     int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
     int best_clock_code=1;
     int best_divisor=60;
     int best_error= INT_MAX;
115329f1
 
b056e73c
     if(s->h263_plus){
         for(i=0; i<2; i++){
             int div, error;
c0df9d75
             div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
f1edd8ef
             div= av_clip(div, 1, 127);
c26abfa5
             error= FFABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
b056e73c
             if(error < best_error){
                 best_error= error;
                 best_divisor= div;
                 best_clock_code= i;
             }
         }
     }
     s->custom_pcf= best_clock_code!=1 || best_divisor!=60;
     coded_frame_rate= 1800000;
     coded_frame_rate_base= (1000+best_clock_code)*best_divisor;
44a2950f
 
     align_put_bits(&s->pb);
d4f5d74a
 
81401c1f
     /* Update the pointer to last GOB */
17592475
     s->ptr_lastgob = pbBufPtr(&s->pb);
81401c1f
     put_bits(&s->pb, 22, 0x20); /* PSC */
c0df9d75
     temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
                          (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
6647ab80
     put_sbits(&s->pb, 8, temp_ref); /* TemporalReference */
de6d9b64
 
bb270c08
     put_bits(&s->pb, 1, 1);     /* marker */
     put_bits(&s->pb, 1, 0);     /* h263 id */
     put_bits(&s->pb, 1, 0);     /* split screen off */
     put_bits(&s->pb, 1, 0);     /* camera  off */
     put_bits(&s->pb, 1, 0);     /* freeze picture release off */
115329f1
 
6dbd39fe
     format = h263_get_picture_format(s->width, s->height);
de6d9b64
     if (!s->h263_plus) {
         /* H.263v1 */
         put_bits(&s->pb, 3, format);
9701840b
         put_bits(&s->pb, 1, (s->pict_type == FF_P_TYPE));
de6d9b64
         /* By now UMV IS DISABLED ON H.263v1, since the restrictions
         of H.263v1 UMV implies to check the predicted MV after
         calculation of the current MB to see if we're on the limits */
bb270c08
         put_bits(&s->pb, 1, 0);         /* Unrestricted Motion Vector: off */
         put_bits(&s->pb, 1, 0);         /* SAC: off */
         put_bits(&s->pb, 1, s->obmc);   /* Advanced Prediction */
         put_bits(&s->pb, 1, 0);         /* only I/P frames, no PB frame */
de6d9b64
         put_bits(&s->pb, 5, s->qscale);
bb270c08
         put_bits(&s->pb, 1, 0);         /* Continuous Presence Multipoint mode: off */
de6d9b64
     } else {
b056e73c
         int ufep=1;
de6d9b64
         /* H.263v2 */
         /* H.263 Plus PTYPE */
115329f1
 
de6d9b64
         put_bits(&s->pb, 3, 7);
b056e73c
         put_bits(&s->pb,3,ufep); /* Update Full Extended PTYPE */
6dbd39fe
         if (format == 7)
             put_bits(&s->pb,3,6); /* Custom Source Format */
         else
             put_bits(&s->pb, 3, format);
115329f1
 
b056e73c
         put_bits(&s->pb,1, s->custom_pcf);
ba58dabc
         put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
de6d9b64
         put_bits(&s->pb,1,0); /* SAC: off */
f7190f73
         put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
ef5b1b5a
         put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
332f9ac4
         put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
ba58dabc
         put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
de6d9b64
         put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
         put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
dba019da
         put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
332f9ac4
         put_bits(&s->pb,1,s->modified_quant); /* Modified Quantization: */
de6d9b64
         put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
         put_bits(&s->pb,3,0); /* Reserved */
115329f1
 
9701840b
         put_bits(&s->pb, 3, s->pict_type == FF_P_TYPE);
115329f1
 
de6d9b64
         put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
         put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
ef5b1b5a
         put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
de6d9b64
         put_bits(&s->pb,2,0); /* Reserved */
         put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
115329f1
 
de6d9b64
         /* This should be here if PLUSPTYPE */
bb270c08
         put_bits(&s->pb, 1, 0); /* Continuous Presence Multipoint mode: off */
115329f1
 
bb270c08
                 if (format == 7) {
6dbd39fe
             /* Custom Picture Format (CPFMT) */
5ff85f1d
             aspect_to_info(s, s->avctx->sample_aspect_ratio);
5d3cea3a
 
             put_bits(&s->pb,4,s->aspect_ratio_info);
6dbd39fe
             put_bits(&s->pb,9,(s->width >> 2) - 1);
             put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
             put_bits(&s->pb,9,(s->height >> 2));
5ff85f1d
             if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
                 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
                 put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
bb270c08
             }
6dbd39fe
         }
b056e73c
         if(s->custom_pcf){
             if(ufep){
                 put_bits(&s->pb, 1, best_clock_code);
                 put_bits(&s->pb, 7, best_divisor);
             }
6647ab80
             put_sbits(&s->pb, 2, temp_ref>>8);
b056e73c
         }
115329f1
 
de6d9b64
         /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
544286b3
         if (s->umvplus)
e51d6d27
 //            put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
332f9ac4
 //FIXME check actual requested range
e51d6d27
             put_bits(&s->pb,2,1); /* unlimited */
ba58dabc
         if(s->h263_slice_structured)
             put_bits(&s->pb,2,0); /* no weird submodes */
e51d6d27
 
de6d9b64
         put_bits(&s->pb, 5, s->qscale);
     }
 
bb270c08
     put_bits(&s->pb, 1, 0);     /* no PEI */
8f8402e4
 
0ed714a7
     if(s->h263_slice_structured){
         put_bits(&s->pb, 1, 1);
115329f1
 
0ed714a7
         assert(s->mb_x == 0 && s->mb_y == 0);
         ff_h263_encode_mba(s);
 
         put_bits(&s->pb, 1, 1);
     }
 
8f8402e4
     if(s->h263_aic){
115329f1
          s->y_dc_scale_table=
68b94c35
          s->c_dc_scale_table= ff_aic_dc_scale_table;
8f8402e4
     }else{
         s->y_dc_scale_table=
         s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
     }
de6d9b64
 }
 
945eeee1
 /**
  * Encodes a group of blocks header.
  */
ba58dabc
 void h263_encode_gob_header(MpegEncContext * s, int mb_line)
644d98a4
 {
ba58dabc
     put_bits(&s->pb, 17, 1); /* GBSC */
 
     if(s->h263_slice_structured){
         put_bits(&s->pb, 1, 1);
 
         ff_h263_encode_mba(s);
 
         if(s->mb_num > 1583)
             put_bits(&s->pb, 1, 1);
         put_bits(&s->pb, 5, s->qscale); /* GQUANT */
         put_bits(&s->pb, 1, 1);
9701840b
         put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
ba58dabc
     }else{
         int gob_number= mb_line / s->gob_index;
 
         put_bits(&s->pb, 5, gob_number); /* GN */
9701840b
         put_bits(&s->pb, 2, s->pict_type == FF_I_TYPE); /* GFID */
ba58dabc
         put_bits(&s->pb, 5, s->qscale); /* GQUANT */
     }
644d98a4
 }
d6231b9e
 
8d8c0294
 static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
     int last=0;
     int j;
     int rate=0;
 
     for(j=1; j<=block_last_index; j++){
         const int index= scantable[j];
         int level= block[index];
         if(level){
             level+= 64;
             if((level&(~127)) == 0){
                 if(j<block_last_index) rate+= s->intra_ac_vlc_length     [UNI_AC_ENC_INDEX(j-last-1, level)];
                 else                   rate+= s->intra_ac_vlc_last_length[UNI_AC_ENC_INDEX(j-last-1, level)];
             }else
                 rate += s->ac_esc_length;
             level-= 64;
 
             last= j;
         }
     }
115329f1
 
8d8c0294
     return rate;
 }
 
 static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
d6231b9e
 {
8d8c0294
     int score= 0;
d6231b9e
     int i, n;
1e491e29
     int8_t * const qscale_table= s->current_picture.qscale_table;
d6231b9e
 
8d8c0294
     memcpy(zigzag_last_index, s->block_last_index, sizeof(int)*6);
115329f1
 
d6231b9e
     for(n=0; n<6; n++){
0c1a9eda
         int16_t *ac_val, *ac_val1;
115329f1
 
8d8c0294
         score -= get_block_rate(s, block[n], s->block_last_index[n], s->intra_scantable.permutated);
d6231b9e
 
4278e7a6
         ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
d6231b9e
         ac_val1= ac_val;
         if(dir[n]){
7bc9090a
             const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
99609036
             /* top prediction */
4278e7a6
             ac_val-= s->block_wrap[n]*16;
1e491e29
             if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
99609036
                 /* same qscale */
                 for(i=1; i<8; i++){
b0368839
                     const int level= block[n][s->dsp.idct_permutation[i   ]];
8d8c0294
                     block[n][s->dsp.idct_permutation[i   ]] = level - ac_val[i+8];
b0368839
                     ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
99609036
                     ac_val1[i+8]= level;
                 }
             }else{
                 /* different qscale, we must rescale */
                 for(i=1; i<8; i++){
b0368839
                     const int level= block[n][s->dsp.idct_permutation[i   ]];
8d8c0294
                     block[n][s->dsp.idct_permutation[i   ]] = level - ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
b0368839
                     ac_val1[i  ]=    block[n][s->dsp.idct_permutation[i<<3]];
99609036
                     ac_val1[i+8]= level;
                 }
d6231b9e
             }
8d8c0294
             st[n]= s->intra_h_scantable.permutated;
d6231b9e
         }else{
7bc9090a
             const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
99609036
             /* left prediction */
d6231b9e
             ac_val-= 16;
1e491e29
             if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
99609036
                 /* same qscale */
                 for(i=1; i<8; i++){
b0368839
                     const int level= block[n][s->dsp.idct_permutation[i<<3]];
8d8c0294
                     block[n][s->dsp.idct_permutation[i<<3]]= level - ac_val[i];
99609036
                     ac_val1[i  ]= level;
b0368839
                     ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
99609036
                 }
             }else{
                 /* different qscale, we must rescale */
                 for(i=1; i<8; i++){
b0368839
                     const int level= block[n][s->dsp.idct_permutation[i<<3]];
8d8c0294
                     block[n][s->dsp.idct_permutation[i<<3]]= level - ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
99609036
                     ac_val1[i  ]= level;
b0368839
                     ac_val1[i+8]=    block[n][s->dsp.idct_permutation[i   ]];
99609036
                 }
d6231b9e
             }
8d8c0294
             st[n]= s->intra_v_scantable.permutated;
d6231b9e
         }
8d8c0294
 
         for(i=63; i>0; i--) //FIXME optimize
             if(block[n][ st[n][i] ]) break;
         s->block_last_index[n]= i;
 
         score += get_block_rate(s, block[n], s->block_last_index[n], st[n]);
d6231b9e
     }
 
8d8c0294
     return score < 0;
 }
 
 static inline void restore_ac_coeffs(MpegEncContext * s, DCTELEM block[6][64], int dir[6], uint8_t *st[6], int zigzag_last_index[6])
 {
     int i, n;
     memcpy(s->block_last_index, zigzag_last_index, sizeof(int)*6);
 
     for(n=0; n<6; n++){
         int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
 
         st[n]= s->intra_scantable.permutated;
         if(dir[n]){
             /* top prediction */
             for(i=1; i<8; i++){
                 block[n][s->dsp.idct_permutation[i   ]] = ac_val[i+8];
             }
         }else{
             /* left prediction */
             for(i=1; i<8; i++){
                 block[n][s->dsp.idct_permutation[i<<3]]= ac_val[i  ];
             }
         }
     }
d6231b9e
 }
 
4d2858de
 /**
59743d16
  * init s->current_picture.qscale_table from s->lambda_table
  */
 static void ff_init_qscale_tab(MpegEncContext *s){
     int8_t * const qscale_table= s->current_picture.qscale_table;
     int i;
 
     for(i=0; i<s->mb_num; i++){
         unsigned int lam= s->lambda_table[ s->mb_index2xy[i] ];
         int qp= (lam*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
f66e4f5f
         qscale_table[ s->mb_index2xy[i] ]= av_clip(qp, s->avctx->qmin, s->avctx->qmax);
59743d16
     }
 }
 
 /**
4d2858de
  * modify qscale so that encoding is acually possible in h263 (limit difference to -2..2)
  */
9e4c6948
 void ff_clean_h263_qscales(MpegEncContext *s){
c5d309f2
     int i;
1e491e29
     int8_t * const qscale_table= s->current_picture.qscale_table;
115329f1
 
59743d16
     ff_init_qscale_tab(s);
 
c5d309f2
     for(i=1; i<s->mb_num; i++){
7bc9090a
         if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i-1] ] >2)
             qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i-1] ]+2;
c5d309f2
     }
     for(i=s->mb_num-2; i>=0; i--){
7bc9090a
         if(qscale_table[ s->mb_index2xy[i] ] - qscale_table[ s->mb_index2xy[i+1] ] >2)
             qscale_table[ s->mb_index2xy[i] ]= qscale_table[ s->mb_index2xy[i+1] ]+2;
c5d309f2
     }
ae4b7d59
 
     if(s->codec_id != CODEC_ID_H263P){
         for(i=1; i<s->mb_num; i++){
             int mb_xy= s->mb_index2xy[i];
115329f1
 
ae4b7d59
             if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_INTER4V)){
                 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_INTER;
             }
         }
     }
9e4c6948
 }
 
4d2858de
 /**
  * modify mb_type & qscale so that encoding is acually possible in mpeg4
  */
9e4c6948
 void ff_clean_mpeg4_qscales(MpegEncContext *s){
     int i;
1e491e29
     int8_t * const qscale_table= s->current_picture.qscale_table;
 
9e4c6948
     ff_clean_h263_qscales(s);
115329f1
 
9701840b
     if(s->pict_type== FF_B_TYPE){
c5d309f2
         int odd=0;
893bc624
         /* ok, come on, this isn't funny anymore, there's more code for handling this mpeg4 mess than for the actual adaptive quantization */
115329f1
 
c5d309f2
         for(i=0; i<s->mb_num; i++){
7bc9090a
             int mb_xy= s->mb_index2xy[i];
             odd += qscale_table[mb_xy]&1;
c5d309f2
         }
115329f1
 
c5d309f2
         if(2*odd > s->mb_num) odd=1;
         else                  odd=0;
115329f1
 
c5d309f2
         for(i=0; i<s->mb_num; i++){
7bc9090a
             int mb_xy= s->mb_index2xy[i];
             if((qscale_table[mb_xy]&1) != odd)
                 qscale_table[mb_xy]++;
             if(qscale_table[mb_xy] > 31)
                 qscale_table[mb_xy]= 31;
115329f1
         }
 
c5d309f2
         for(i=1; i<s->mb_num; i++){
7bc9090a
             int mb_xy= s->mb_index2xy[i];
bb198e19
             if(qscale_table[mb_xy] != qscale_table[s->mb_index2xy[i-1]] && (s->mb_type[mb_xy]&CANDIDATE_MB_TYPE_DIRECT)){
                 s->mb_type[mb_xy]|= CANDIDATE_MB_TYPE_BIDIR;
c5d309f2
             }
         }
     }
 }
 
7604246d
 #endif //CONFIG_ENCODERS
841f65f2
 
37d3e066
 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0]))
c4e2a535
 #define tab_bias (tab_size/2)
 
6d312496
 void ff_mpeg4_init_direct_mv(MpegEncContext *s){
841f65f2
     int i;
     for(i=0; i<tab_size; i++){
         s->direct_scale_mv[0][i] = (i-tab_bias)*s->pb_time/s->pp_time;
         s->direct_scale_mv[1][i] = (i-tab_bias)*(s->pb_time-s->pp_time)/s->pp_time;
     }
 }
 
 static inline void ff_mpeg4_set_one_direct_mv(MpegEncContext *s, int mx, int my, int i){
     int xy= s->block_index[i];
     uint16_t time_pp= s->pp_time;
     uint16_t time_pb= s->pb_time;
     int p_mx, p_my;
 
     p_mx= s->next_picture.motion_val[0][xy][0];
     if((unsigned)(p_mx + tab_bias) < tab_size){
         s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias] + mx;
         s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
                             : s->direct_scale_mv[1][p_mx + tab_bias];
     }else{
         s->mv[0][i][0] = p_mx*time_pb/time_pp + mx;
         s->mv[1][i][0] = mx ? s->mv[0][i][0] - p_mx
                             : p_mx*(time_pb - time_pp)/time_pp;
     }
     p_my= s->next_picture.motion_val[0][xy][1];
     if((unsigned)(p_my + tab_bias) < tab_size){
         s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias] + my;
         s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
                             : s->direct_scale_mv[1][p_my + tab_bias];
     }else{
         s->mv[0][i][1] = p_my*time_pb/time_pp + my;
         s->mv[1][i][1] = my ? s->mv[0][i][1] - p_my
                             : p_my*(time_pb - time_pp)/time_pp;
     }
 }
 
c4e2a535
 #undef tab_size
 #undef tab_bias
 
7bc9090a
 /**
  *
  * @return the mb_type
  */
 int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my){
     const int mb_index= s->mb_x + s->mb_y*s->mb_stride;
bb198e19
     const int colocated_mb_type= s->next_picture.mb_type[mb_index];
1457ab52
     uint16_t time_pp= s->pp_time;
     uint16_t time_pb= s->pb_time;
     int i;
115329f1
 
1457ab52
     //FIXME avoid divides
841f65f2
     // try special case with shifts for 1 and 3 B-frames?
115329f1
 
7bc9090a
     if(IS_8X8(colocated_mb_type)){
1457ab52
         s->mv_type = MV_TYPE_8X8;
         for(i=0; i<4; i++){
841f65f2
             ff_mpeg4_set_one_direct_mv(s, mx, my, i);
1457ab52
         }
7bc9090a
         return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
     } else if(IS_INTERLACED(colocated_mb_type)){
1457ab52
         s->mv_type = MV_TYPE_FIELD;
         for(i=0; i<2; i++){
7c4f71c4
             int field_select= s->next_picture.ref_index[0][s->block_index[2*i]];
1956e166
             s->field_select[0][i]= field_select;
             s->field_select[1][i]= i;
1457ab52
             if(s->top_field_first){
7c4f71c4
                 time_pp= s->pp_field_time - field_select + i;
                 time_pb= s->pb_field_time - field_select + i;
1457ab52
             }else{
7c4f71c4
                 time_pp= s->pp_field_time + field_select - i;
                 time_pb= s->pb_field_time + field_select - i;
1457ab52
             }
bb198e19
             s->mv[0][i][0] = s->p_field_mv_table[i][0][mb_index][0]*time_pb/time_pp + mx;
             s->mv[0][i][1] = s->p_field_mv_table[i][0][mb_index][1]*time_pb/time_pp + my;
             s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->p_field_mv_table[i][0][mb_index][0]
                                 : s->p_field_mv_table[i][0][mb_index][0]*(time_pb - time_pp)/time_pp;
115329f1
             s->mv[1][i][1] = my ? s->mv[0][i][1] - s->p_field_mv_table[i][0][mb_index][1]
bb198e19
                                 : s->p_field_mv_table[i][0][mb_index][1]*(time_pb - time_pp)/time_pp;
1457ab52
         }
7bc9090a
         return MB_TYPE_DIRECT2 | MB_TYPE_16x8 | MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
     }else{
841f65f2
         ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
         s->mv[0][1][0] = s->mv[0][2][0] = s->mv[0][3][0] = s->mv[0][0][0];
         s->mv[0][1][1] = s->mv[0][2][1] = s->mv[0][3][1] = s->mv[0][0][1];
         s->mv[1][1][0] = s->mv[1][2][0] = s->mv[1][3][0] = s->mv[1][0][0];
         s->mv[1][1][1] = s->mv[1][2][1] = s->mv[1][3][1] = s->mv[1][0][1];
7bc9090a
         if((s->avctx->workaround_bugs & FF_BUG_DIRECT_BLOCKSIZE) || !s->quarter_sample)
             s->mv_type= MV_TYPE_16X16;
         else
             s->mv_type= MV_TYPE_8X8;
         return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1; //Note see prev line
1457ab52
     }
 }
 
7d1c3fc1
 void ff_h263_update_motion_val(MpegEncContext * s){
     const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
893bc624
                //FIXME a lot of that is only needed for !low_delay
137c8468
     const int wrap = s->b8_stride;
7d1c3fc1
     const int xy = s->block_index[0];
115329f1
 
     s->current_picture.mbskip_table[mb_xy]= s->mb_skipped;
7d1c3fc1
 
     if(s->mv_type != MV_TYPE_8X8){
         int motion_x, motion_y;
         if (s->mb_intra) {
             motion_x = 0;
             motion_y = 0;
         } else if (s->mv_type == MV_TYPE_16X16) {
             motion_x = s->mv[0][0][0];
             motion_y = s->mv[0][0][1];
         } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
             int i;
             motion_x = s->mv[0][0][0] + s->mv[0][1][0];
             motion_y = s->mv[0][0][1] + s->mv[0][1][1];
             motion_x = (motion_x>>1) | (motion_x&1);
             for(i=0; i<2; i++){
bb198e19
                 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
                 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
7d1c3fc1
             }
7c4f71c4
             s->current_picture.ref_index[0][xy           ]=
             s->current_picture.ref_index[0][xy        + 1]= s->field_select[0][0];
             s->current_picture.ref_index[0][xy + wrap    ]=
             s->current_picture.ref_index[0][xy + wrap + 1]= s->field_select[0][1];
7d1c3fc1
         }
7c4f71c4
 
7d1c3fc1
         /* no update if 8X8 because it has been done during parsing */
8d7ec294
         s->current_picture.motion_val[0][xy][0] = motion_x;
         s->current_picture.motion_val[0][xy][1] = motion_y;
         s->current_picture.motion_val[0][xy + 1][0] = motion_x;
         s->current_picture.motion_val[0][xy + 1][1] = motion_y;
         s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
         s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
         s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
         s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
7d1c3fc1
     }
 
     if(s->encoding){ //FIXME encoding MUST be cleaned up
115329f1
         if (s->mv_type == MV_TYPE_8X8)
7d1c3fc1
             s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_8x8;
f7190f73
         else if(s->mb_intra)
             s->current_picture.mb_type[mb_xy]= MB_TYPE_INTRA;
7d1c3fc1
         else
             s->current_picture.mb_type[mb_xy]= MB_TYPE_L0 | MB_TYPE_16x16;
     }
 }
 
b250f9c6
 #if CONFIG_ENCODERS
f2f6134b
 
1b781f82
 static inline int h263_get_motion_length(MpegEncContext * s, int val, int f_code){
     int l, bit_size, code;
 
     if (val == 0) {
         return mvtab[0][1];
     } else {
         bit_size = f_code - 1;
         /* modulo encoding */
         l= INT_BIT - 6 - bit_size;
         val = (val<<l)>>l;
         val--;
         code = (val >> bit_size) + 1;
 
         return mvtab[code][1] + 1 + bit_size;
     }
 }
 
 static inline void ff_h263_encode_motion_vector(MpegEncContext * s, int x, int y, int f_code){
     if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
115329f1
         skip_put_bits(&s->pb,
1b781f82
             h263_get_motion_length(s, x, f_code)
            +h263_get_motion_length(s, y, f_code));
     }else{
         ff_h263_encode_motion(s, x, f_code);
         ff_h263_encode_motion(s, y, f_code);
     }
 }
 
f2f6134b
 static inline int get_p_cbp(MpegEncContext * s,
                       DCTELEM block[6][64],
                       int motion_x, int motion_y){
     int cbp, i;
 
     if(s->flags & CODEC_FLAG_CBP_RD){
         int best_cbpy_score= INT_MAX;
         int best_cbpc_score= INT_MAX;
9b879566
         int cbpc = (-1), cbpy= (-1);
f2f6134b
         const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
158c7f05
         const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
f2f6134b
 
         for(i=0; i<4; i++){
             int score= inter_MCBPC_bits[i + offset] * lambda;
             if(i&1) score += s->coded_score[5];
             if(i&2) score += s->coded_score[4];
 
             if(score < best_cbpc_score){
                 best_cbpc_score= score;
                 cbpc= i;
             }
         }
 
         for(i=0; i<16; i++){
             int score= cbpy_tab[i ^ 0xF][1] * lambda;
             if(i&1) score += s->coded_score[3];
             if(i&2) score += s->coded_score[2];
             if(i&4) score += s->coded_score[1];
             if(i&8) score += s->coded_score[0];
 
             if(score < best_cbpy_score){
                 best_cbpy_score= score;
                 cbpy= i;
             }
         }
         cbp= cbpc + 4*cbpy;
         if ((motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16){
             if(best_cbpy_score + best_cbpc_score + 2*lambda >= 0)
                 cbp= 0;
         }
 
         for (i = 0; i < 6; i++) {
             if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
                 s->block_last_index[i]= -1;
5fecfb7d
                 s->dsp.clear_block(s->block[i]);
f2f6134b
             }
         }
     }else{
         cbp= 0;
         for (i = 0; i < 6; i++) {
             if (s->block_last_index[i] >= 0)
                 cbp |= 1 << (5 - i);
         }
     }
     return cbp;
 }
 
 static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64],
                             int motion_x, int motion_y, int mb_type){
     int cbp=0, i;
 
     if(s->flags & CODEC_FLAG_CBP_RD){
         int score=0;
158c7f05
         const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
115329f1
 
f2f6134b
         for(i=0; i<6; i++){
             if(s->coded_score[i] < 0){
                 score += s->coded_score[i];
                 cbp |= 1 << (5 - i);
             }
         }
115329f1
 
f2f6134b
         if(cbp){
             int zero_score= -6;
             if ((motion_x | motion_y | s->dquant | mb_type) == 0){
                 zero_score-= 4; //2*MV + mb_type + cbp bit
             }
 
             zero_score*= lambda;
             if(zero_score <= score){
                 cbp=0;
             }
         }
 
         for (i = 0; i < 6; i++) {
             if (s->block_last_index[i] >= 0 && ((cbp >> (5 - i))&1)==0 ){
                 s->block_last_index[i]= -1;
5fecfb7d
                 s->dsp.clear_block(s->block[i]);
f2f6134b
             }
         }
     }else{
         for (i = 0; i < 6; i++) {
             if (s->block_last_index[i] >= 0)
                 cbp |= 1 << (5 - i);
         }
     }
     return cbp;
 }
 
115329f1
 static inline void mpeg4_encode_blocks(MpegEncContext * s, DCTELEM block[6][64], int intra_dc[6],
1b781f82
                                uint8_t **scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb){
     int i;
115329f1
 
1b781f82
     if(scan_table){
         if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
             for (i = 0; i < 6; i++) {
                 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, intra_dc[i], scan_table[i]));
             }
         }else{
             /* encode each block */
             for (i = 0; i < 6; i++) {
                 mpeg4_encode_block(s, block[i], i, intra_dc[i], scan_table[i], dc_pb, ac_pb);
             }
         }
     }else{
         if(s->flags2 & CODEC_FLAG2_NO_OUTPUT){
             for (i = 0; i < 6; i++) {
                 skip_put_bits(&s->pb, mpeg4_get_block_length(s, block[i], i, 0, s->intra_scantable.permutated));
             }
         }else{
             /* encode each block */
             for (i = 0; i < 6; i++) {
                 mpeg4_encode_block(s, block[i], i, 0, s->intra_scantable.permutated, dc_pb, ac_pb);
             }
         }
     }
 }
 
fa79489f
 static const int dquant_code[5]= {1,0,9,2,3};
 
d6231b9e
 void mpeg4_encode_mb(MpegEncContext * s,
bb270c08
                     DCTELEM block[6][64],
                     int motion_x, int motion_y)
d6231b9e
 {
5c91a675
     int cbpc, cbpy, pred_x, pred_y;
92073d01
     PutBitContext * const pb2    = s->data_partitioning                         ? &s->pb2    : &s->pb;
9701840b
     PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=FF_B_TYPE ? &s->tex_pb : &s->pb;
     PutBitContext * const dc_pb  = s->data_partitioning && s->pict_type!=FF_I_TYPE ? &s->pb2    : &s->pb;
92073d01
     const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
115329f1
 
d6231b9e
     //    printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
     if (!s->mb_intra) {
f2f6134b
         int i, cbp;
115329f1
 
9701840b
         if(s->pict_type==FF_B_TYPE){
653f7387
             static const int mb_type_table[8]= {-1, 3, 2, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
9dbcbd92
             int mb_type=  mb_type_table[s->mv_dir];
bb198e19
 
9dbcbd92
             if(s->mb_x==0){
bb198e19
                 for(i=0; i<2; i++){
115329f1
                     s->last_mv[i][0][0]=
                     s->last_mv[i][0][1]=
                     s->last_mv[i][1][0]=
bb198e19
                     s->last_mv[i][1][1]= 0;
                 }
9dbcbd92
             }
115329f1
 
c5d309f2
             assert(s->dquant>=-2 && s->dquant<=2);
             assert((s->dquant&1)==0);
             assert(mb_type>=0);
9dbcbd92
 
160d679c
             /* nothing to do if this MB was skipped in the next P Frame */
7bc9090a
             if(s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]){ //FIXME avoid DCT & ...
9dbcbd92
                 s->skip_count++;
115329f1
                 s->mv[0][0][0]=
                 s->mv[0][0][1]=
                 s->mv[1][0][0]=
9dbcbd92
                 s->mv[1][0][1]= 0;
893bc624
                 s->mv_dir= MV_DIR_FORWARD; //doesn't matter
c5d309f2
                 s->qscale -= s->dquant;
160d679c
 //                s->mb_skipped=1;
1e491e29
 
9dbcbd92
                 return;
             }
115329f1
 
f2f6134b
             cbp= get_b_cbp(s, block, motion_x, motion_y, mb_type);
115329f1
 
9dbcbd92
             if ((cbp | motion_x | motion_y | mb_type) ==0) {
                 /* direct MB with MV={0,0} */
c5d309f2
                 assert(s->dquant==0);
115329f1
 
9dbcbd92
                 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
92073d01
 
                 if(interleaved_stats){
                     s->misc_bits++;
                     s->last_bits++;
                 }
9dbcbd92
                 s->skip_count++;
                 return;
             }
115329f1
 
bb270c08
             put_bits(&s->pb, 1, 0);     /* mb coded modb1=0 */
9dbcbd92
             put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
893bc624
             put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we don't need it :)
9dbcbd92
             if(cbp) put_bits(&s->pb, 6, cbp);
115329f1
 
c5d309f2
             if(cbp && mb_type){
                 if(s->dquant)
                     put_bits(&s->pb, 2, (s->dquant>>2)+3);
                 else
                     put_bits(&s->pb, 1, 0);
             }else
                 s->qscale -= s->dquant;
115329f1
 
fcb48651
             if(!s->progressive_sequence){
                 if(cbp)
                     put_bits(&s->pb, 1, s->interlaced_dct);
893bc624
                 if(mb_type) // not direct mode
bb198e19
                     put_bits(&s->pb, 1, s->mv_type == MV_TYPE_FIELD);
fcb48651
             }
9dbcbd92
 
92073d01
             if(interleaved_stats){
4d2a4834
                 s->misc_bits+= get_bits_diff(s);
92073d01
             }
cf8039b2
 
bb198e19
             if(mb_type == 0){
                 assert(s->mv_dir & MV_DIRECT);
1b781f82
                 ff_h263_encode_motion_vector(s, motion_x, motion_y, 1);
66370d3f
                 s->b_count++;
                 s->f_count++;
bb198e19
             }else{
                 assert(mb_type > 0 && mb_type < 4);
                 if(s->mv_type != MV_TYPE_FIELD){
                     if(s->mv_dir & MV_DIR_FORWARD){
1b781f82
                         ff_h263_encode_motion_vector(s, s->mv[0][0][0] - s->last_mv[0][0][0],
                                                         s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
bb198e19
                         s->last_mv[0][0][0]= s->last_mv[0][1][0]= s->mv[0][0][0];
                         s->last_mv[0][0][1]= s->last_mv[0][1][1]= s->mv[0][0][1];
                         s->f_count++;
                     }
                     if(s->mv_dir & MV_DIR_BACKWARD){
1b781f82
                         ff_h263_encode_motion_vector(s, s->mv[1][0][0] - s->last_mv[1][0][0],
                                                         s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
bb198e19
                         s->last_mv[1][0][0]= s->last_mv[1][1][0]= s->mv[1][0][0];
                         s->last_mv[1][0][1]= s->last_mv[1][1][1]= s->mv[1][0][1];
                         s->b_count++;
                     }
                 }else{
                     if(s->mv_dir & MV_DIR_FORWARD){
                         put_bits(&s->pb, 1, s->field_select[0][0]);
                         put_bits(&s->pb, 1, s->field_select[0][1]);
                     }
                     if(s->mv_dir & MV_DIR_BACKWARD){
                         put_bits(&s->pb, 1, s->field_select[1][0]);
                         put_bits(&s->pb, 1, s->field_select[1][1]);
                     }
                     if(s->mv_dir & MV_DIR_FORWARD){
                         for(i=0; i<2; i++){
1b781f82
                             ff_h263_encode_motion_vector(s, s->mv[0][i][0] - s->last_mv[0][i][0]  ,
                                                             s->mv[0][i][1] - s->last_mv[0][i][1]/2, s->f_code);
bb198e19
                             s->last_mv[0][i][0]= s->mv[0][i][0];
                             s->last_mv[0][i][1]= s->mv[0][i][1]*2;
                         }
                         s->f_count++;
                     }
                     if(s->mv_dir & MV_DIR_BACKWARD){
                         for(i=0; i<2; i++){
1b781f82
                             ff_h263_encode_motion_vector(s, s->mv[1][i][0] - s->last_mv[1][i][0]  ,
                                                             s->mv[1][i][1] - s->last_mv[1][i][1]/2, s->b_code);
bb198e19
                             s->last_mv[1][i][0]= s->mv[1][i][0];
                             s->last_mv[1][i][1]= s->mv[1][i][1]*2;
                         }
                         s->b_count++;
                     }
                 }
9dbcbd92
             }
92073d01
 
             if(interleaved_stats){
4d2a4834
                 s->mv_bits+= get_bits_diff(s);
92073d01
             }
d6231b9e
 
1b781f82
             mpeg4_encode_blocks(s, block, NULL, NULL, NULL, &s->pb);
92073d01
 
             if(interleaved_stats){
4d2a4834
                 s->p_tex_bits+= get_bits_diff(s);
9dbcbd92
             }
bb198e19
 
9701840b
         }else{ /* s->pict_type==FF_B_TYPE */
f2f6134b
             cbp= get_p_cbp(s, block, motion_x, motion_y);
115329f1
 
c5d309f2
             if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
115329f1
                 /* check if the B frames can skip it too, as we must skip it if we skip here
893bc624
                    why didn't they just compress the skip-mb bits instead of reusing them ?! */
ee6f7861
                 if(s->max_b_frames>0){
                     int i;
e71a4f74
                     int x,y, offset;
                     uint8_t *p_pic;
 
                     x= s->mb_x*16;
                     y= s->mb_y*16;
                     if(x+16 > s->width)  x= s->width-16;
                     if(y+16 > s->height) y= s->height-16;
 
                     offset= x + y*s->linesize;
1e491e29
                     p_pic= s->new_picture.data[0] + offset;
115329f1
 
160d679c
                     s->mb_skipped=1;
ee6f7861
                     for(i=0; i<s->max_b_frames; i++){
d697b89b
                         uint8_t *b_pic;
                         int diff;
1e491e29
                         Picture *pic= s->reordered_input_picture[i+1];
d697b89b
 
9701840b
                         if(pic==NULL || pic->pict_type!=FF_B_TYPE) break;
d697b89b
 
07fc2b82
                         b_pic= pic->data[0] + offset;
                         if(pic->type != FF_BUFFER_TYPE_SHARED)
                             b_pic+= INPLACE_OFFSET;
bb270c08
                         diff= s->dsp.sad[0](NULL, p_pic, b_pic, s->linesize, 16);
e71a4f74
                         if(diff>s->qscale*70){ //FIXME check that 70 is optimal
160d679c
                             s->mb_skipped=0;
ee6f7861
                             break;
                         }
                     }
                 }else
115329f1
                     s->mb_skipped=1;
ee6f7861
 
160d679c
                 if(s->mb_skipped==1){
ee6f7861
                     /* skip macroblock */
                     put_bits(&s->pb, 1, 1);
92073d01
 
                     if(interleaved_stats){
                         s->misc_bits++;
                         s->last_bits++;
                     }
ee6f7861
                     s->skip_count++;
115329f1
 
ee6f7861
                     return;
                 }
9dbcbd92
             }
e71a4f74
 
bb270c08
             put_bits(&s->pb, 1, 0);     /* mb coded */
f7190f73
             cbpc = cbp & 3;
             cbpy = cbp >> 2;
             cbpy ^= 0xf;
9dbcbd92
             if(s->mv_type==MV_TYPE_16X16){
c5d309f2
                 if(s->dquant) cbpc+= 8;
9dbcbd92
                 put_bits(&s->pb,
                         inter_MCBPC_bits[cbpc],
                         inter_MCBPC_code[cbpc]);
c5d309f2
 
92073d01
                 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
c5d309f2
                 if(s->dquant)
                     put_bits(pb2, 2, dquant_code[s->dquant+2]);
fcb48651
 
                 if(!s->progressive_sequence){
                     if(cbp)
                         put_bits(pb2, 1, s->interlaced_dct);
bb198e19
                     put_bits(pb2, 1, 0);
fcb48651
                 }
115329f1
 
92073d01
                 if(interleaved_stats){
4d2a4834
                     s->misc_bits+= get_bits_diff(s);
92073d01
                 }
d6231b9e
 
9dbcbd92
                 /* motion vectors: 16x16 mode */
137c8468
                 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
115329f1
 
1b781f82
                 ff_h263_encode_motion_vector(s, motion_x - pred_x,
                                                 motion_y - pred_y, s->f_code);
bb198e19
             }else if(s->mv_type==MV_TYPE_FIELD){
                 if(s->dquant) cbpc+= 8;
                 put_bits(&s->pb,
                         inter_MCBPC_bits[cbpc],
                         inter_MCBPC_code[cbpc]);
 
                 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
                 if(s->dquant)
                     put_bits(pb2, 2, dquant_code[s->dquant+2]);
 
                 assert(!s->progressive_sequence);
                 if(cbp)
                     put_bits(pb2, 1, s->interlaced_dct);
                 put_bits(pb2, 1, 1);
115329f1
 
bb198e19
                 if(interleaved_stats){
                     s->misc_bits+= get_bits_diff(s);
                 }
 
                 /* motion vectors: 16x8 interlaced mode */
137c8468
                 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
bb198e19
                 pred_y /=2;
115329f1
 
bb198e19
                 put_bits(&s->pb, 1, s->field_select[0][0]);
                 put_bits(&s->pb, 1, s->field_select[0][1]);
115329f1
 
1b781f82
                 ff_h263_encode_motion_vector(s, s->mv[0][0][0] - pred_x,
                                                 s->mv[0][0][1] - pred_y, s->f_code);
                 ff_h263_encode_motion_vector(s, s->mv[0][1][0] - pred_x,
                                                 s->mv[0][1][1] - pred_y, s->f_code);
9dbcbd92
             }else{
bb198e19
                 assert(s->mv_type==MV_TYPE_8X8);
9dbcbd92
                 put_bits(&s->pb,
f7190f73
                         inter_MCBPC_bits[cbpc+16],
                         inter_MCBPC_code[cbpc+16]);
92073d01
                 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
9dbcbd92
 
49943a18
                 if(!s->progressive_sequence){
                     if(cbp)
                         put_bits(pb2, 1, s->interlaced_dct);
                 }
115329f1
 
92073d01
                 if(interleaved_stats){
4d2a4834
                     s->misc_bits+= get_bits_diff(s);
92073d01
                 }
9dbcbd92
 
                 for(i=0; i<4; i++){
                     /* motion vectors: 8x8 mode*/
137c8468
                     h263_pred_motion(s, i, 0, &pred_x, &pred_y);
9dbcbd92
 
1b781f82
                     ff_h263_encode_motion_vector(s, s->current_picture.motion_val[0][ s->block_index[i] ][0] - pred_x,
                                                     s->current_picture.motion_val[0][ s->block_index[i] ][1] - pred_y, s->f_code);
9dbcbd92
                 }
cf8039b2
             }
92073d01
 
115329f1
             if(interleaved_stats){
4d2a4834
                 s->mv_bits+= get_bits_diff(s);
92073d01
             }
098eefe1
 
1b781f82
             mpeg4_encode_blocks(s, block, NULL, NULL, NULL, tex_pb);
92073d01
 
             if(interleaved_stats){
4d2a4834
                 s->p_tex_bits+= get_bits_diff(s);
9dbcbd92
             }
66370d3f
             s->f_count++;
d6231b9e
         }
     } else {
9dbcbd92
         int cbp;
115329f1
         int dc_diff[6];   //dc values with the dc prediction subtracted
d6231b9e
         int dir[6];  //prediction direction
         int zigzag_last_index[6];
bb270c08
         uint8_t *scan_table[6];
5c91a675
         int i;
d6231b9e
 
         for(i=0; i<6; i++){
a7137a04
             dc_diff[i]= ff_mpeg4_pred_dc(s, i, block[i][0], &dir[i], 1);
d6231b9e
         }
 
8d8c0294
         if(s->flags & CODEC_FLAG_AC_PRED){
             s->ac_pred= decide_ac_pred(s, block, dir, scan_table, zigzag_last_index);
             if(!s->ac_pred)
                 restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
d6231b9e
         }else{
             for(i=0; i<6; i++)
2ad1516a
                 scan_table[i]= s->intra_scantable.permutated;
d6231b9e
         }
 
         /* compute cbp */
         cbp = 0;
         for (i = 0; i < 6; i++) {
             if (s->block_last_index[i] >= 1)
                 cbp |= 1 << (5 - i);
         }
 
         cbpc = cbp & 3;
9701840b
         if (s->pict_type == FF_I_TYPE) {
c5d309f2
             if(s->dquant) cbpc+=4;
d6231b9e
             put_bits(&s->pb,
                 intra_MCBPC_bits[cbpc],
                 intra_MCBPC_code[cbpc]);
         } else {
c5d309f2
             if(s->dquant) cbpc+=8;
bb270c08
             put_bits(&s->pb, 1, 0);     /* mb coded */
d6231b9e
             put_bits(&s->pb,
                 inter_MCBPC_bits[cbpc + 4],
                 inter_MCBPC_code[cbpc + 4]);
         }
92073d01
         put_bits(pb2, 1, s->ac_pred);
d6231b9e
         cbpy = cbp >> 2;
92073d01
         put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
c5d309f2
         if(s->dquant)
             put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
d6231b9e
 
fcb48651
         if(!s->progressive_sequence){
             put_bits(dc_pb, 1, s->interlaced_dct);
         }
 
92073d01
         if(interleaved_stats){
4d2a4834
             s->misc_bits+= get_bits_diff(s);
92073d01
         }
098eefe1
 
1b781f82
         mpeg4_encode_blocks(s, block, dc_diff, scan_table, dc_pb, tex_pb);
d6231b9e
 
92073d01
         if(interleaved_stats){
4d2a4834
             s->i_tex_bits+= get_bits_diff(s);
92073d01
         }
098eefe1
         s->i_count++;
 
d6231b9e
         /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
8d8c0294
         if(s->ac_pred)
             restore_ac_coeffs(s, block, dir, scan_table, zigzag_last_index);
d6231b9e
     }
 }
 
de6d9b64
 void h263_encode_mb(MpegEncContext * s,
bb270c08
                     DCTELEM block[6][64],
                     int motion_x, int motion_y)
de6d9b64
 {
     int cbpc, cbpy, i, cbp, pred_x, pred_y;
0c1a9eda
     int16_t pred_dc;
     int16_t rec_intradc[6];
b86216de
     int16_t *dc_ptr[6];
d4f5d74a
     const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1);
115329f1
 
ef5b1b5a
     //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
9dbcbd92
     if (!s->mb_intra) {
ef5b1b5a
         /* compute cbp */
f2f6134b
         cbp= get_p_cbp(s, block, motion_x, motion_y);
 
8cb5d4c0
         if ((cbp | motion_x | motion_y | s->dquant | (s->mv_type - MV_TYPE_16X16)) == 0) {
9dbcbd92
             /* skip macroblock */
             put_bits(&s->pb, 1, 1);
d4f5d74a
             if(interleaved_stats){
                 s->misc_bits++;
                 s->last_bits++;
             }
65a24d0b
             s->skip_count++;
 
9dbcbd92
             return;
         }
bb270c08
         put_bits(&s->pb, 1, 0);         /* mb coded */
115329f1
 
9dbcbd92
         cbpc = cbp & 3;
         cbpy = cbp >> 2;
dba019da
         if(s->alt_inter_vlc==0 || cbpc!=3)
             cbpy ^= 0xF;
         if(s->dquant) cbpc+= 8;
f7190f73
         if(s->mv_type==MV_TYPE_16X16){
             put_bits(&s->pb,
                     inter_MCBPC_bits[cbpc],
                     inter_MCBPC_code[cbpc]);
9dbcbd92
 
f7190f73
             put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
             if(s->dquant)
                 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
115329f1
 
f7190f73
             if(interleaved_stats){
                 s->misc_bits+= get_bits_diff(s);
             }
d4f5d74a
 
f7190f73
             /* motion vectors: 16x16 mode */
137c8468
             h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
115329f1
 
             if (!s->umvplus) {
1b781f82
                 ff_h263_encode_motion_vector(s, motion_x - pred_x,
                                                 motion_y - pred_y, 1);
f7190f73
             }
             else {
                 h263p_encode_umotion(s, motion_x - pred_x);
                 h263p_encode_umotion(s, motion_y - pred_y);
                 if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
                     /* To prevent Start Code emulation */
                     put_bits(&s->pb,1,1);
             }
         }else{
             put_bits(&s->pb,
                     inter_MCBPC_bits[cbpc+16],
                     inter_MCBPC_code[cbpc+16]);
             put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
             if(s->dquant)
                 put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
 
             if(interleaved_stats){
                 s->misc_bits+= get_bits_diff(s);
             }
 
             for(i=0; i<4; i++){
                 /* motion vectors: 8x8 mode*/
137c8468
                 h263_pred_motion(s, i, 0, &pred_x, &pred_y);
f7190f73
 
8d7ec294
                 motion_x= s->current_picture.motion_val[0][ s->block_index[i] ][0];
                 motion_y= s->current_picture.motion_val[0][ s->block_index[i] ][1];
115329f1
                 if (!s->umvplus) {
1b781f82
                     ff_h263_encode_motion_vector(s, motion_x - pred_x,
                                                     motion_y - pred_y, 1);
f7190f73
                 }
                 else {
                     h263p_encode_umotion(s, motion_x - pred_x);
                     h263p_encode_umotion(s, motion_y - pred_y);
                     if (((motion_x - pred_x) == 1) && ((motion_y - pred_y) == 1))
                         /* To prevent Start Code emulation */
                         put_bits(&s->pb,1,1);
                 }
             }
9dbcbd92
         }
d4f5d74a
 
         if(interleaved_stats){
             s->mv_bits+= get_bits_diff(s);
         }
ef5b1b5a
     } else {
68b94c35
         assert(s->mb_intra);
115329f1
 
ef5b1b5a
         cbp = 0;
fb079883
         if (s->h263_aic) {
ef5b1b5a
             /* Predict DC */
fb079883
             for(i=0; i<6; i++) {
0c1a9eda
                 int16_t level = block[i][0];
fb079883
                 int scale;
115329f1
 
fb079883
                 if(i<4) scale= s->y_dc_scale;
                 else    scale= s->c_dc_scale;
 
ef5b1b5a
                 pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
                 level -= pred_dc;
                 /* Quant */
fb079883
                 if (level >= 0)
                     level = (level + (scale>>1))/scale;
ef5b1b5a
                 else
fb079883
                     level = (level - (scale>>1))/scale;
115329f1
 
ef5b1b5a
                 /* AIC can change CBP */
                 if (level == 0 && s->block_last_index[i] == 0)
                     s->block_last_index[i] = -1;
fb079883
 
                 if(!s->modified_quant){
                     if (level < -127)
                         level = -127;
                     else if (level > 127)
                         level = 127;
                 }
 
ef5b1b5a
                 block[i][0] = level;
115329f1
                 /* Reconstruction */
fb079883
                 rec_intradc[i] = scale*level + pred_dc;
ef5b1b5a
                 /* Oddify */
                 rec_intradc[i] |= 1;
                 //if ((rec_intradc[i] % 2) == 0)
                 //    rec_intradc[i]++;
                 /* Clipping */
                 if (rec_intradc[i] < 0)
                     rec_intradc[i] = 0;
                 else if (rec_intradc[i] > 2047)
                     rec_intradc[i] = 2047;
115329f1
 
ef5b1b5a
                 /* Update AC/DC tables */
                 *dc_ptr[i] = rec_intradc[i];
fb079883
                 if (s->block_last_index[i] >= 0)
                     cbp |= 1 << (5 - i);
             }
         }else{
             for(i=0; i<6; i++) {
                 /* compute cbp */
                 if (s->block_last_index[i] >= 1)
                     cbp |= 1 << (5 - i);
ef5b1b5a
             }
         }
de6d9b64
 
ef5b1b5a
         cbpc = cbp & 3;
9701840b
         if (s->pict_type == FF_I_TYPE) {
9e4c6948
             if(s->dquant) cbpc+=4;
ef5b1b5a
             put_bits(&s->pb,
                 intra_MCBPC_bits[cbpc],
                 intra_MCBPC_code[cbpc]);
         } else {
9e4c6948
             if(s->dquant) cbpc+=8;
bb270c08
             put_bits(&s->pb, 1, 0);     /* mb coded */
ef5b1b5a
             put_bits(&s->pb,
                 inter_MCBPC_bits[cbpc + 4],
                 inter_MCBPC_code[cbpc + 4]);
         }
         if (s->h263_aic) {
             /* XXX: currently, we do not try to use ac prediction */
bb270c08
             put_bits(&s->pb, 1, 0);     /* no AC prediction */
ef5b1b5a
         }
         cbpy = cbp >> 2;
         put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
9e4c6948
         if(s->dquant)
             put_bits(&s->pb, 2, dquant_code[s->dquant+2]);
d4f5d74a
 
         if(interleaved_stats){
             s->misc_bits+= get_bits_diff(s);
         }
de6d9b64
     }
 
ef5b1b5a
     for(i=0; i<6; i++) {
         /* encode each block */
44a2950f
         h263_encode_block(s, block[i], i);
115329f1
 
ef5b1b5a
         /* Update INTRADC for decoding */
         if (s->h263_aic && s->mb_intra) {
             block[i][0] = rec_intradc[i];
115329f1
 
ef5b1b5a
         }
     }
d4f5d74a
 
     if(interleaved_stats){
         if (!s->mb_intra) {
             s->p_tex_bits+= get_bits_diff(s);
             s->f_count++;
         }else{
             s->i_tex_bits+= get_bits_diff(s);
             s->i_count++;
         }
     }
ef5b1b5a
 }
bbed9259
 #endif
ef5b1b5a
 
cdb4e730
 void ff_h263_loop_filter(MpegEncContext * s){
332f9ac4
     int qp_c;
     const int linesize  = s->linesize;
     const int uvlinesize= s->uvlinesize;
     const int xy = s->mb_y * s->mb_stride + s->mb_x;
     uint8_t *dest_y = s->dest[0];
     uint8_t *dest_cb= s->dest[1];
     uint8_t *dest_cr= s->dest[2];
115329f1
 
9701840b
 //    if(s->pict_type==FF_B_TYPE && !s->readable) return;
332f9ac4
 
     /*
        Diag Top
        Left Center
     */
     if(!IS_SKIP(s->current_picture.mb_type[xy])){
         qp_c= s->qscale;
         s->dsp.h263_v_loop_filter(dest_y+8*linesize  , linesize, qp_c);
         s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
     }else
         qp_c= 0;
 
     if(s->mb_y){
aaf0e267
         int qp_dt, qp_tt, qp_tc;
332f9ac4
 
         if(IS_SKIP(s->current_picture.mb_type[xy-s->mb_stride]))
aaf0e267
             qp_tt=0;
115329f1
         else
aaf0e267
             qp_tt= s->current_picture.qscale_table[xy-s->mb_stride];
332f9ac4
 
115329f1
         if(qp_c)
332f9ac4
             qp_tc= qp_c;
         else
aaf0e267
             qp_tc= qp_tt;
115329f1
 
332f9ac4
         if(qp_tc){
             const int chroma_qp= s->chroma_qscale_table[qp_tc];
             s->dsp.h263_v_loop_filter(dest_y  ,   linesize, qp_tc);
             s->dsp.h263_v_loop_filter(dest_y+8,   linesize, qp_tc);
115329f1
 
332f9ac4
             s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
             s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
         }
115329f1
 
aaf0e267
         if(qp_tt)
             s->dsp.h263_h_loop_filter(dest_y-8*linesize+8  ,   linesize, qp_tt);
115329f1
 
332f9ac4
         if(s->mb_x){
aaf0e267
             if(qp_tt || IS_SKIP(s->current_picture.mb_type[xy-1-s->mb_stride]))
                 qp_dt= qp_tt;
332f9ac4
             else
                 qp_dt= s->current_picture.qscale_table[xy-1-s->mb_stride];
115329f1
 
332f9ac4
             if(qp_dt){
                 const int chroma_qp= s->chroma_qscale_table[qp_dt];
                 s->dsp.h263_h_loop_filter(dest_y -8*linesize  ,   linesize, qp_dt);
                 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
b1114f18
                 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
332f9ac4
             }
         }
     }
 
     if(qp_c){
         s->dsp.h263_h_loop_filter(dest_y +8,   linesize, qp_c);
         if(s->mb_y + 1 == s->mb_height)
             s->dsp.h263_h_loop_filter(dest_y+8*linesize+8,   linesize, qp_c);
     }
115329f1
 
332f9ac4
     if(s->mb_x){
         int qp_lc;
         if(qp_c || IS_SKIP(s->current_picture.mb_type[xy-1]))
             qp_lc= qp_c;
         else
             qp_lc= s->current_picture.qscale_table[xy-1];
115329f1
 
332f9ac4
         if(qp_lc){
             s->dsp.h263_h_loop_filter(dest_y,   linesize, qp_lc);
             if(s->mb_y + 1 == s->mb_height){
                 const int chroma_qp= s->chroma_qscale_table[qp_lc];
                 s->dsp.h263_h_loop_filter(dest_y +8*  linesize,   linesize, qp_lc);
                 s->dsp.h263_h_loop_filter(dest_cb             , uvlinesize, chroma_qp);
                 s->dsp.h263_h_loop_filter(dest_cr             , uvlinesize, chroma_qp);
             }
         }
     }
 }
 
b250f9c6
 #if CONFIG_ENCODERS
b86216de
 static int h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
ef5b1b5a
 {
     int x, y, wrap, a, c, pred_dc, scale;
b86216de
     int16_t *dc_val;
ef5b1b5a
 
     /* find prediction */
     if (n < 4) {
137c8468
         x = 2 * s->mb_x + (n & 1);
         y = 2 * s->mb_y + ((n & 2) >> 1);
         wrap = s->b8_stride;
ef5b1b5a
         dc_val = s->dc_val[0];
         scale = s->y_dc_scale;
     } else {
137c8468
         x = s->mb_x;
         y = s->mb_y;
         wrap = s->mb_stride;
ef5b1b5a
         dc_val = s->dc_val[n - 4 + 1];
         scale = s->c_dc_scale;
de6d9b64
     }
ef5b1b5a
     /* B C
115329f1
      * A X
ef5b1b5a
      */
     a = dc_val[(x - 1) + (y) * wrap];
     c = dc_val[(x) + (y - 1) * wrap];
115329f1
 
ef5b1b5a
     /* No prediction outside GOB boundary */
204b5c9e
     if(s->first_slice_line && n!=3){
         if(n!=2) c= 1024;
         if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
     }
ef5b1b5a
     pred_dc = 1024;
     /* just DC prediction */
     if (a != 1024 && c != 1024)
         pred_dc = (a + c) >> 1;
     else if (a != 1024)
         pred_dc = a;
     else
         pred_dc = c;
115329f1
 
ef5b1b5a
     /* we assume pred is positive */
     //pred_dc = (pred_dc + (scale >> 1)) / scale;
     *dc_val_ptr = &dc_val[x + y * wrap];
     return pred_dc;
de6d9b64
 }
62bb489b
 #endif /* CONFIG_ENCODERS */
de6d9b64
 
5c91a675
 static void h263_pred_acdc(MpegEncContext * s, DCTELEM *block, int n)
d140623f
 {
9e15ad28
     int x, y, wrap, a, c, pred_dc, scale, i;
b86216de
     int16_t *dc_val, *ac_val, *ac_val1;
d140623f
 
     /* find prediction */
     if (n < 4) {
137c8468
         x = 2 * s->mb_x + (n & 1);
         y = 2 * s->mb_y + (n>> 1);
         wrap = s->b8_stride;
d140623f
         dc_val = s->dc_val[0];
9e15ad28
         ac_val = s->ac_val[0][0];
d140623f
         scale = s->y_dc_scale;
     } else {
137c8468
         x = s->mb_x;
         y = s->mb_y;
         wrap = s->mb_stride;
d140623f
         dc_val = s->dc_val[n - 4 + 1];
9e15ad28
         ac_val = s->ac_val[n - 4 + 1][0];
d140623f
         scale = s->c_dc_scale;
     }
115329f1
 
9e15ad28
     ac_val += ((y) * wrap + (x)) * 16;
     ac_val1 = ac_val;
115329f1
 
d140623f
     /* B C
115329f1
      * A X
d140623f
      */
     a = dc_val[(x - 1) + (y) * wrap];
     c = dc_val[(x) + (y - 1) * wrap];
115329f1
 
ef5b1b5a
     /* No prediction outside GOB boundary */
68b94c35
     if(s->first_slice_line && n!=3){
         if(n!=2) c= 1024;
         if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
     }
115329f1
 
d140623f
     if (s->ac_pred) {
68b94c35
         pred_dc = 1024;
d140623f
         if (s->h263_aic_dir) {
             /* left prediction */
9e15ad28
             if (a != 1024) {
                 ac_val -= 16;
                 for(i=1;i<8;i++) {
b0368839
                     block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
9e15ad28
                 }
                 pred_dc = a;
d140623f
             }
         } else {
             /* top prediction */
9e15ad28
             if (c != 1024) {
                 ac_val -= 16 * wrap;
                 for(i=1;i<8;i++) {
b0368839
                     block[s->dsp.idct_permutation[i   ]] += ac_val[i + 8];
9e15ad28
                 }
                 pred_dc = c;
d140623f
             }
         }
9e15ad28
     } else {
         /* just DC prediction */
         if (a != 1024 && c != 1024)
             pred_dc = (a + c) >> 1;
         else if (a != 1024)
             pred_dc = a;
         else
             pred_dc = c;
d140623f
     }
115329f1
 
9e15ad28
     /* we assume pred is positive */
     block[0]=block[0]*scale + pred_dc;
115329f1
 
9e15ad28
     if (block[0] < 0)
         block[0] = 0;
115329f1
     else
68b94c35
         block[0] |= 1;
115329f1
 
9e15ad28
     /* Update AC/DC tables */
     dc_val[(x) + (y) * wrap] = block[0];
115329f1
 
d140623f
     /* left copy */
     for(i=1;i<8;i++)
b0368839
         ac_val1[i    ] = block[s->dsp.idct_permutation[i<<3]];
d140623f
     /* top copy */
     for(i=1;i<8;i++)
b0368839
         ac_val1[8 + i] = block[s->dsp.idct_permutation[i   ]];
d140623f
 }
 
137c8468
 int16_t *h263_pred_motion(MpegEncContext * s, int block, int dir,
de6d9b64
                         int *px, int *py)
 {
137c8468
     int wrap;
b40cd4e0
     int16_t *A, *B, *C, (*mot_val)[2];
     static const int off[4]= {2, 1, 1, -1};
 
     wrap = s->b8_stride;
137c8468
     mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
b40cd4e0
 
     A = mot_val[ - 1];
     /* special case for first (slice) line */
     if (s->first_slice_line && block<3) {
893bc624
         // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
b40cd4e0
         // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
         if(block==0){ //most common case
             if(s->mb_x  == s->resync_mb_x){ //rare
                 *px= *py = 0;
             }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
                 C = mot_val[off[block] - wrap];
                 if(s->mb_x==0){
                     *px = C[0];
                     *py = C[1];
                 }else{
                     *px = mid_pred(A[0], 0, C[0]);
                     *py = mid_pred(A[1], 0, C[1]);
                 }
             }else{
                 *px = A[0];
                 *py = A[1];
             }
         }else if(block==1){
             if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
                 C = mot_val[off[block] - wrap];
                 *px = mid_pred(A[0], 0, C[0]);
                 *py = mid_pred(A[1], 0, C[1]);
             }else{
                 *px = A[0];
                 *py = A[1];
             }
         }else{ /* block==2*/
             B = mot_val[ - wrap];
             C = mot_val[off[block] - wrap];
             if(s->mb_x == s->resync_mb_x) //rare
                 A[0]=A[1]=0;
115329f1
 
b40cd4e0
             *px = mid_pred(A[0], B[0], C[0]);
             *py = mid_pred(A[1], B[1], C[1]);
         }
     } else {
         B = mot_val[ - wrap];
         C = mot_val[off[block] - wrap];
         *px = mid_pred(A[0], B[0], C[0]);
         *py = mid_pred(A[1], B[1], C[1]);
     }
     return *mot_val;
 }
 
b250f9c6
 #if CONFIG_ENCODERS
5e13a730
 void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code)
de6d9b64
 {
a9c68306
     int range, l, bit_size, sign, code, bits;
de6d9b64
 
     if (val == 0) {
         /* zero vector */
         code = 0;
         put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
     } else {
9dbcbd92
         bit_size = f_code - 1;
de6d9b64
         range = 1 << bit_size;
         /* modulo encoding */
0ff93477
         l= INT_BIT - 6 - bit_size;
         val = (val<<l)>>l;
a9c68306
         sign = val>>31;
         val= (val^sign)-sign;
         sign&=1;
de6d9b64
 
3bf43d42
         val--;
         code = (val >> bit_size) + 1;
         bits = val & (range - 1);
de6d9b64
 
115329f1
         put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
de6d9b64
         if (bit_size > 0) {
             put_bits(&s->pb, bit_size, bits);
         }
     }
 }
 
6dbd39fe
 /* Encode MV differences on H.263+ with Unrestricted MV mode */
 static void h263p_encode_umotion(MpegEncContext * s, int val)
 {
115329f1
     short sval = 0;
6dbd39fe
     short i = 0;
     short n_bits = 0;
     short temp_val;
     int code = 0;
     int tcode;
115329f1
 
6dbd39fe
     if ( val == 0)
         put_bits(&s->pb, 1, 1);
     else if (val == 1)
         put_bits(&s->pb, 3, 0);
     else if (val == -1)
         put_bits(&s->pb, 3, 2);
     else {
115329f1
 
6dbd39fe
         sval = ((val < 0) ? (short)(-val):(short)val);
         temp_val = sval;
115329f1
 
6dbd39fe
         while (temp_val != 0) {
             temp_val = temp_val >> 1;
             n_bits++;
         }
115329f1
 
6dbd39fe
         i = n_bits - 1;
         while (i > 0) {
             tcode = (sval & (1 << (i-1))) >> (i-1);
             tcode = (tcode << 1) | 1;
             code = (code << 2) | tcode;
             i--;
         }
         code = ((code << 1) | (val < 0)) << 1;
         put_bits(&s->pb, (2*n_bits)+1, code);
         //printf("\nVal = %d\tCode = %d", sval, code);
     }
 }
 
45870f57
 static void init_mv_penalty_and_fcode(MpegEncContext *s)
 {
     int f_code;
     int mv;
115329f1
 
45870f57
     for(f_code=1; f_code<=MAX_FCODE; f_code++){
         for(mv=-MAX_MV; mv<=MAX_MV; mv++){
             int len;
 
             if(mv==0) len= mvtab[0][1];
             else{
                 int val, bit_size, range, code;
 
7813d6a3
                 bit_size = f_code - 1;
45870f57
                 range = 1 << bit_size;
 
                 val=mv;
115329f1
                 if (val < 0)
45870f57
                     val = -val;
                 val--;
                 code = (val >> bit_size) + 1;
                 if(code<33){
                     len= mvtab[code][1] + 1 + bit_size;
                 }else{
b7c51ebc
                     len= mvtab[32][1] + av_log2(code>>5) + 2 + bit_size;
45870f57
                 }
             }
 
             mv_penalty[f_code][mv+MAX_MV]= len;
         }
     }
 
     for(f_code=MAX_FCODE; f_code>0; f_code--){
         for(mv=-(16<<f_code); mv<(16<<f_code); mv++){
             fcode_tab[mv+MAX_MV]= f_code;
         }
     }
9d2a0355
 
     for(mv=0; mv<MAX_MV*2+1; mv++){
         umv_fcode_tab[mv]= 1;
     }
45870f57
 }
7604246d
 
20695ec9
 static void init_uni_dc_tab(void)
2a164b25
 {
     int level, uni_code, uni_len;
 
3bf43d42
     for(level=-256; level<256; level++){
2a164b25
         int size, v, l;
         /* find number of bits */
         size = 0;
         v = abs(level);
         while (v) {
             v >>= 1;
bb270c08
             size++;
2a164b25
         }
 
         if (level < 0)
             l= (-level) ^ ((1 << size) - 1);
         else
             l= level;
 
         /* luminance */
         uni_code= DCtab_lum[size][0];
         uni_len = DCtab_lum[size][1];
 
         if (size > 0) {
             uni_code<<=size; uni_code|=l;
             uni_len+=size;
             if (size > 8){
                 uni_code<<=1; uni_code|=1;
                 uni_len++;
             }
         }
67725183
         uni_DCtab_lum_bits[level+256]= uni_code;
         uni_DCtab_lum_len [level+256]= uni_len;
2a164b25
 
         /* chrominance */
         uni_code= DCtab_chrom[size][0];
         uni_len = DCtab_chrom[size][1];
115329f1
 
2a164b25
         if (size > 0) {
             uni_code<<=size; uni_code|=l;
             uni_len+=size;
             if (size > 8){
                 uni_code<<=1; uni_code|=1;
                 uni_len++;
             }
         }
67725183
         uni_DCtab_chrom_bits[level+256]= uni_code;
         uni_DCtab_chrom_len [level+256]= uni_len;
2a164b25
 
     }
 }
 
0c1a9eda
 static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
3db48188
     int slevel, run, last;
115329f1
 
3db48188
     assert(MAX_LEVEL >= 64);
     assert(MAX_RUN   >= 63);
 
     for(slevel=-64; slevel<64; slevel++){
         if(slevel==0) continue;
         for(run=0; run<64; run++){
             for(last=0; last<=1; last++){
                 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
                 int level= slevel < 0 ? -slevel : slevel;
                 int sign= slevel < 0 ? 1 : 0;
                 int bits, len, code;
                 int level1, run1;
115329f1
 
3db48188
                 len_tab[index]= 100;
115329f1
 
3db48188
                 /* ESC0 */
                 code= get_rl_index(rl, last, run, level);
                 bits= rl->table_vlc[code][0];
                 len=  rl->table_vlc[code][1];
                 bits=bits*2+sign; len++;
115329f1
 
3db48188
                 if(code!=rl->n && len < len_tab[index]){
                     bits_tab[index]= bits;
                     len_tab [index]= len;
                 }
 #if 1
                 /* ESC1 */
                 bits= rl->table_vlc[rl->n][0];
                 len=  rl->table_vlc[rl->n][1];
                 bits=bits*2;    len++; //esc1
                 level1= level - rl->max_level[last][run];
                 if(level1>0){
                     code= get_rl_index(rl, last, run, level1);
                     bits<<= rl->table_vlc[code][1];
                     len  += rl->table_vlc[code][1];
                     bits += rl->table_vlc[code][0];
                     bits=bits*2+sign; len++;
115329f1
 
3db48188
                     if(code!=rl->n && len < len_tab[index]){
                         bits_tab[index]= bits;
                         len_tab [index]= len;
                     }
                 }
115329f1
 #endif
3db48188
 #if 1
                 /* ESC2 */
                 bits= rl->table_vlc[rl->n][0];
                 len=  rl->table_vlc[rl->n][1];
                 bits=bits*4+2;    len+=2; //esc2
                 run1 = run - rl->max_run[last][level] - 1;
                 if(run1>=0){
                     code= get_rl_index(rl, last, run1, level);
                     bits<<= rl->table_vlc[code][1];
                     len  += rl->table_vlc[code][1];
                     bits += rl->table_vlc[code][0];
                     bits=bits*2+sign; len++;
115329f1
 
3db48188
                     if(code!=rl->n && len < len_tab[index]){
                         bits_tab[index]= bits;
                         len_tab [index]= len;
                     }
                 }
115329f1
 #endif
                 /* ESC3 */
3db48188
                 bits= rl->table_vlc[rl->n][0];
                 len = rl->table_vlc[rl->n][1];
                 bits=bits*4+3;    len+=2; //esc3
                 bits=bits*2+last; len++;
                 bits=bits*64+run; len+=6;
                 bits=bits*2+1;    len++;  //marker
                 bits=bits*4096+(slevel&0xfff); len+=12;
                 bits=bits*2+1;    len++;  //marker
115329f1
 
3db48188
                 if(len < len_tab[index]){
                     bits_tab[index]= bits;
                     len_tab [index]= len;
                 }
             }
         }
     }
 }
 
15c5fa7b
 static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
     int slevel, run, last;
115329f1
 
15c5fa7b
     assert(MAX_LEVEL >= 64);
     assert(MAX_RUN   >= 63);
 
     for(slevel=-64; slevel<64; slevel++){
         if(slevel==0) continue;
         for(run=0; run<64; run++){
             for(last=0; last<=1; last++){
                 const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
                 int level= slevel < 0 ? -slevel : slevel;
                 int sign= slevel < 0 ? 1 : 0;
                 int bits, len, code;
115329f1
 
15c5fa7b
                 len_tab[index]= 100;
115329f1
 
15c5fa7b
                 /* ESC0 */
                 code= get_rl_index(rl, last, run, level);
                 bits= rl->table_vlc[code][0];
                 len=  rl->table_vlc[code][1];
                 bits=bits*2+sign; len++;
115329f1
 
15c5fa7b
                 if(code!=rl->n && len < len_tab[index]){
                     if(bits_tab) bits_tab[index]= bits;
                     len_tab [index]= len;
                 }
                 /* ESC */
                 bits= rl->table_vlc[rl->n][0];
                 len = rl->table_vlc[rl->n][1];
                 bits=bits*2+last; len++;
                 bits=bits*64+run; len+=6;
                 bits=bits*256+(level&0xff); len+=8;
115329f1
 
15c5fa7b
                 if(len < len_tab[index]){
                     if(bits_tab) bits_tab[index]= bits;
                     len_tab [index]= len;
                 }
             }
         }
     }
 }
 
45870f57
 void h263_encode_init(MpegEncContext *s)
de6d9b64
 {
     static int done = 0;
 
     if (!done) {
         done = 1;
2a164b25
 
         init_uni_dc_tab();
 
3502a54f
         init_rl(&rl_inter, static_rl_table_store[0]);
         init_rl(&rl_intra, static_rl_table_store[1]);
         init_rl(&rl_intra_aic, static_rl_table_store[2]);
115329f1
 
3db48188
         init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
         init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
45870f57
 
15c5fa7b
         init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
         init_uni_h263_rl_tab(&rl_inter    , NULL, uni_h263_inter_rl_len);
 
45870f57
         init_mv_penalty_and_fcode(s);
de6d9b64
     }
1457ab52
     s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
115329f1
 
15c5fa7b
     s->intra_ac_vlc_length     =s->inter_ac_vlc_length     = uni_h263_inter_rl_len;
     s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
     if(s->h263_aic){
         s->intra_ac_vlc_length     = uni_h263_intra_aic_rl_len;
         s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
     }
     s->ac_esc_length= 7+1+6+8;
 
9d2a0355
     // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
d7e9533a
     switch(s->codec_id){
     case CODEC_ID_MPEG4:
         s->fcode_tab= fcode_tab;
         s->min_qcoeff= -2048;
         s->max_qcoeff=  2047;
477ab036
         s->intra_ac_vlc_length     = uni_mpeg4_intra_rl_len;
         s->intra_ac_vlc_last_length= uni_mpeg4_intra_rl_len + 128*64;
         s->inter_ac_vlc_length     = uni_mpeg4_inter_rl_len;
         s->inter_ac_vlc_last_length= uni_mpeg4_inter_rl_len + 128*64;
67725183
         s->luma_dc_vlc_length= uni_DCtab_lum_len;
         s->chroma_dc_vlc_length= uni_DCtab_chrom_len;
477ab036
         s->ac_esc_length= 7+2+1+6+1+12+1;
9c3d33d6
         s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
         s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
 
22ddd60b
         if(s->flags & CODEC_FLAG_GLOBAL_HEADER){
8b76418a
 
22ddd60b
             s->avctx->extradata= av_malloc(1024);
ed7debda
             init_put_bits(&s->pb, s->avctx->extradata, 1024);
115329f1
 
59fa3f96
             if(!(s->workaround_bugs & FF_BUG_MS))
                 mpeg4_encode_visual_object_header(s);
22ddd60b
             mpeg4_encode_vol_header(s, 0, 0);
 
 //            ff_mpeg4_stuffing(&s->pb); ?
             flush_put_bits(&s->pb);
fe455f33
             s->avctx->extradata_size= (put_bits_count(&s->pb)+7)>>3;
22ddd60b
         }
115329f1
 
d7e9533a
         break;
     case CODEC_ID_H263P:
fb079883
         if(s->umvplus)
             s->fcode_tab= umv_fcode_tab;
         if(s->modified_quant){
             s->min_qcoeff= -2047;
             s->max_qcoeff=  2047;
         }else{
             s->min_qcoeff= -127;
             s->max_qcoeff=  127;
         }
d7e9533a
         break;
115329f1
         //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later
d4f5d74a
     case CODEC_ID_FLV1:
         if (s->h263_flv > 1) {
             s->min_qcoeff= -1023;
             s->max_qcoeff=  1023;
         } else {
             s->min_qcoeff= -127;
             s->max_qcoeff=  127;
         }
         s->y_dc_scale_table=
         s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
         break;
893bc624
     default: //nothing needed - default table already set in mpegvideo.c
e51d6d27
         s->min_qcoeff= -127;
d7e9533a
         s->max_qcoeff=  127;
8f8402e4
         s->y_dc_scale_table=
         s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
d7e9533a
     }
de6d9b64
 }
 
2ba8f6b8
 /**
  * encodes a 8x8 block.
  * @param block the 8x8 block
  * @param n block index (0-3 are luma, 4-5 are chroma)
  */
de6d9b64
 static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
 {
ef5b1b5a
     int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
     RLTable *rl;
de6d9b64
 
ef5b1b5a
     rl = &rl_inter;
     if (s->mb_intra && !s->h263_aic) {
81401c1f
         /* DC coef */
e51d6d27
         level = block[0];
de6d9b64
         /* 255 cannot be represented, so we clamp */
         if (level > 254) {
             level = 254;
             block[0] = 254;
         }
81401c1f
         /* 0 cannot be represented also */
e51d6d27
         else if (level < 1) {
81401c1f
             level = 1;
             block[0] = 1;
         }
17938602
         if (level == 128) //FIXME check rv10
e51d6d27
             put_bits(&s->pb, 8, 0xff);
         else
65a24d0b
             put_bits(&s->pb, 8, level);
e51d6d27
         i = 1;
de6d9b64
     } else {
e51d6d27
         i = 0;
         if (s->h263_aic && s->mb_intra)
             rl = &rl_intra_aic;
115329f1
 
dba019da
         if(s->alt_inter_vlc && !s->mb_intra){
             int aic_vlc_bits=0;
             int inter_vlc_bits=0;
             int wrong_pos=-1;
             int aic_code;
115329f1
 
dba019da
             last_index = s->block_last_index[n];
             last_non_zero = i - 1;
             for (; i <= last_index; i++) {
                 j = s->intra_scantable.permutated[i];
                 level = block[j];
                 if (level) {
                     run = i - last_non_zero - 1;
                     last = (i == last_index);
115329f1
 
ecfc44e6
                     if(level<0) level= -level;
115329f1
 
dba019da
                     code = get_rl_index(rl, last, run, level);
                     aic_code = get_rl_index(&rl_intra_aic, last, run, level);
                     inter_vlc_bits += rl->table_vlc[code][1]+1;
                     aic_vlc_bits   += rl_intra_aic.table_vlc[aic_code][1]+1;
 
                     if (code == rl->n) {
ecfc44e6
                         inter_vlc_bits += 1+6+8-1;
115329f1
                     }
dba019da
                     if (aic_code == rl_intra_aic.n) {
ecfc44e6
                         aic_vlc_bits += 1+6+8-1;
dba019da
                         wrong_pos += run + 1;
                     }else
                         wrong_pos += wrong_run[aic_code];
                     last_non_zero = i;
115329f1
                 }
dba019da
             }
             i = 0;
             if(aic_vlc_bits < inter_vlc_bits && wrong_pos > 63)
                 rl = &rl_intra_aic;
         }
de6d9b64
     }
115329f1
 
de6d9b64
     /* AC coefs */
     last_index = s->block_last_index[n];
     last_non_zero = i - 1;
     for (; i <= last_index; i++) {
2ad1516a
         j = s->intra_scantable.permutated[i];
ef5b1b5a
         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;
             }
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) {
44a2950f
               if(s->h263_flv <= 1){
de6d9b64
                 put_bits(&s->pb, 1, last);
                 put_bits(&s->pb, 6, run);
115329f1
 
e51d6d27
                 assert(slevel != 0);
 
115329f1
                 if(level < 128)
6647ab80
                     put_sbits(&s->pb, 8, slevel);
e51d6d27
                 else{
                     put_bits(&s->pb, 8, 128);
6647ab80
                     put_sbits(&s->pb, 5, slevel);
                     put_sbits(&s->pb, 6, slevel>>5);
e51d6d27
                 }
44a2950f
               }else{
65a24d0b
                 if(level < 64) { // 7-bit level
44a2950f
                         put_bits(&s->pb, 1, 0);
                         put_bits(&s->pb, 1, last);
                         put_bits(&s->pb, 6, run);
 
6647ab80
                         put_sbits(&s->pb, 7, slevel);
44a2950f
                     } else {
                         /* 11-bit level */
                         put_bits(&s->pb, 1, 1);
                         put_bits(&s->pb, 1, last);
                         put_bits(&s->pb, 6, run);
 
6647ab80
                         put_sbits(&s->pb, 11, slevel);
44a2950f
                     }
               }
d4f5d74a
             } else {
                 put_bits(&s->pb, 1, sign);
             }
             last_non_zero = i;
         }
     }
 }
7604246d
 
de6d9b64
 /***************************************************/
4d2858de
 /**
  * add mpeg4 stuffing bits (01...1)
  */
92073d01
 void ff_mpeg4_stuffing(PutBitContext * pbc)
6f91bcd1
 {
     int length;
     put_bits(pbc, 1, 0);
fe455f33
     length= (-put_bits_count(pbc))&7;
92073d01
     if(length) put_bits(pbc, length, (1<<length)-1);
6f91bcd1
 }
 
91029be7
 /* must be called before writing the header */
7da31a80
 void ff_set_mpeg4_time(MpegEncContext * s){
9701840b
     if(s->pict_type==FF_B_TYPE){
841f65f2
         ff_mpeg4_init_direct_mv(s);
91029be7
     }else{
         s->last_time_base= s->time_base;
7da31a80
         s->time_base= s->time/s->avctx->time_base.den;
91029be7
     }
 }
 
41773b73
 static void mpeg4_encode_gop_header(MpegEncContext * s){
     int hours, minutes, seconds;
6ff6cff2
     int64_t time;
115329f1
 
41773b73
     put_bits(&s->pb, 16, 0);
     put_bits(&s->pb, 16, GOP_STARTCODE);
115329f1
 
9740beff
     time= s->current_picture_ptr->pts;
     if(s->reordered_input_picture[1])
         time= FFMIN(time, s->reordered_input_picture[1]->pts);
c0df9d75
     time= time*s->avctx->time_base.num;
6ff6cff2
 
c0df9d75
     seconds= time/s->avctx->time_base.den;
41773b73
     minutes= seconds/60; seconds %= 60;
     hours= minutes/60; minutes %= 60;
     hours%=24;
 
     put_bits(&s->pb, 5, hours);
     put_bits(&s->pb, 6, minutes);
     put_bits(&s->pb, 1, 1);
     put_bits(&s->pb, 6, seconds);
115329f1
 
     put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
41773b73
     put_bits(&s->pb, 1, 0); //broken link == NO
115329f1
 
     s->last_time_base= time / s->avctx->time_base.den;
41773b73
 
     ff_mpeg4_stuffing(&s->pb);
 }
 
 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
     int profile_and_level_indication;
     int vo_ver_id;
115329f1
 
baced9f5
     if(s->avctx->profile != FF_PROFILE_UNKNOWN){
         profile_and_level_indication = s->avctx->profile << 4;
     }else if(s->max_b_frames || s->quarter_sample){
         profile_and_level_indication= 0xF0; // adv simple
     }else{
         profile_and_level_indication= 0x00; // simple
     }
 
     if(s->avctx->level != FF_LEVEL_UNKNOWN){
         profile_and_level_indication |= s->avctx->level;
     }else{
         profile_and_level_indication |= 1; //level 1
     }
 
     if(profile_and_level_indication>>4 == 0xF){
41773b73
         vo_ver_id= 5;
     }else{
         vo_ver_id= 1;
     }
baced9f5
 
41773b73
     //FIXME levels
 
     put_bits(&s->pb, 16, 0);
     put_bits(&s->pb, 16, VOS_STARTCODE);
3f6f76af
 
41773b73
     put_bits(&s->pb, 8, profile_and_level_indication);
3f6f76af
 
41773b73
     put_bits(&s->pb, 16, 0);
     put_bits(&s->pb, 16, VISUAL_OBJ_STARTCODE);
115329f1
 
41773b73
     put_bits(&s->pb, 1, 1);
         put_bits(&s->pb, 4, vo_ver_id);
         put_bits(&s->pb, 3, 1); //priority
115329f1
 
41773b73
     put_bits(&s->pb, 4, 1); //visual obj type== video obj
115329f1
 
41773b73
     put_bits(&s->pb, 1, 0); //video signal type == no clue //FIXME
 
     ff_mpeg4_stuffing(&s->pb);
 }
 
 static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
de6d9b64
 {
41773b73
     int vo_ver_id;
1ff662cc
 
49fb20cb
     if (!CONFIG_MPEG4_ENCODER)  return;
99439cb7
 
41773b73
     if(s->max_b_frames || s->quarter_sample){
         vo_ver_id= 5;
f8af5cb5
         s->vo_type= ADV_SIMPLE_VO_TYPE;
     }else{
41773b73
         vo_ver_id= 1;
f8af5cb5
         s->vo_type= SIMPLE_VO_TYPE;
     }
1ff662cc
 
10cd5815
     put_bits(&s->pb, 16, 0);
41773b73
     put_bits(&s->pb, 16, 0x100 + vo_number);        /* video obj */
10cd5815
     put_bits(&s->pb, 16, 0);
41773b73
     put_bits(&s->pb, 16, 0x120 + vol_number);       /* video obj layer */
10cd5815
 
bb270c08
     put_bits(&s->pb, 1, 0);             /* random access vol */
     put_bits(&s->pb, 8, s->vo_type);    /* video obj type indication */
59fa3f96
     if(s->workaround_bugs & FF_BUG_MS) {
bb270c08
         put_bits(&s->pb, 1, 0);         /* is obj layer id= no */
59fa3f96
     } else {
bb270c08
         put_bits(&s->pb, 1, 1);         /* is obj layer id= yes */
         put_bits(&s->pb, 4, vo_ver_id); /* is obj layer ver id */
         put_bits(&s->pb, 3, 1);         /* is obj layer priority */
59fa3f96
     }
115329f1
 
5ff85f1d
     aspect_to_info(s, s->avctx->sample_aspect_ratio);
5d3cea3a
 
     put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
5ff85f1d
     if (s->aspect_ratio_info == FF_ASPECT_EXTENDED){
         put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.num);
         put_bits(&s->pb, 8, s->avctx->sample_aspect_ratio.den);
050fe8ba
     }
1ff662cc
 
59fa3f96
     if(s->workaround_bugs & FF_BUG_MS) { //
bb270c08
         put_bits(&s->pb, 1, 0);         /* vol control parameters= no @@@ */
59fa3f96
     } else {
bb270c08
         put_bits(&s->pb, 1, 1);         /* vol control parameters= yes */
         put_bits(&s->pb, 2, 1);         /* chroma format YUV 420/YV12 */
59fa3f96
         put_bits(&s->pb, 1, s->low_delay);
bb270c08
         put_bits(&s->pb, 1, 0);         /* vbv parameters= no */
59fa3f96
     }
1ff662cc
 
bb270c08
     put_bits(&s->pb, 2, RECT_SHAPE);    /* vol shape= rectangle */
     put_bits(&s->pb, 1, 1);             /* marker bit */
115329f1
 
c0df9d75
     put_bits(&s->pb, 16, s->avctx->time_base.den);
10cd5815
     if (s->time_increment_bits < 1)
         s->time_increment_bits = 1;
bb270c08
     put_bits(&s->pb, 1, 1);             /* marker bit */
     put_bits(&s->pb, 1, 0);             /* fixed vop rate=no */
     put_bits(&s->pb, 1, 1);             /* marker bit */
     put_bits(&s->pb, 13, s->width);     /* vol width */
     put_bits(&s->pb, 1, 1);             /* marker bit */
     put_bits(&s->pb, 13, s->height);    /* vol height */
     put_bits(&s->pb, 1, 1);             /* marker bit */
fcb48651
     put_bits(&s->pb, 1, s->progressive_sequence ? 0 : 1);
bb270c08
     put_bits(&s->pb, 1, 1);             /* obmc disable */
10cd5815
     if (vo_ver_id == 1) {
bb270c08
         put_bits(&s->pb, 1, s->vol_sprite_usage);       /* sprite enable */
41773b73
     }else{
bb270c08
         put_bits(&s->pb, 2, s->vol_sprite_usage);       /* sprite enable */
10cd5815
     }
115329f1
 
bb270c08
     put_bits(&s->pb, 1, 0);             /* not 8 bit == false */
     put_bits(&s->pb, 1, s->mpeg_quant); /* quant type= (0=h263 style)*/
d6eb3c50
 
     if(s->mpeg_quant){
         ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix);
         ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix);
     }
87f8cab4
 
10cd5815
     if (vo_ver_id != 1)
1457ab52
         put_bits(&s->pb, 1, s->quarter_sample);
bb270c08
     put_bits(&s->pb, 1, 1);             /* complexity estimation disable */
92073d01
     s->resync_marker= s->rtp_mode;
     put_bits(&s->pb, 1, s->resync_marker ? 0 : 1);/* resync marker disable */
     put_bits(&s->pb, 1, s->data_partitioning ? 1 : 0);
     if(s->data_partitioning){
bb270c08
         put_bits(&s->pb, 1, 0);         /* no rvlc */
92073d01
     }
 
10cd5815
     if (vo_ver_id != 1){
bb270c08
         put_bits(&s->pb, 1, 0);         /* newpred */
         put_bits(&s->pb, 1, 0);         /* reduced res vop */
10cd5815
     }
bb270c08
     put_bits(&s->pb, 1, 0);             /* scalability */
115329f1
 
92073d01
     ff_mpeg4_stuffing(&s->pb);
49c9325f
 
5596c60c
     /* user data */
b0368839
     if(!(s->flags & CODEC_FLAG_BITEXACT)){
5596c60c
         put_bits(&s->pb, 16, 0);
bb270c08
         put_bits(&s->pb, 16, 0x1B2);    /* user_data */
         ff_put_string(&s->pb, LIBAVCODEC_IDENT, 0);
5596c60c
     }
10cd5815
 }
 
 /* write mpeg4 VOP header */
 void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
 {
9dbcbd92
     int time_incr;
     int time_div, time_mod;
115329f1
 
9701840b
     if(s->pict_type==FF_I_TYPE){
70ac76c0
         if(!(s->flags&CODEC_FLAG_GLOBAL_HEADER)){
9cd81798
             if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT) //HACK, the reference sw is buggy
3f6f76af
                 mpeg4_encode_visual_object_header(s);
9cd81798
             if(s->strict_std_compliance < FF_COMPLIANCE_VERY_STRICT || picture_number==0) //HACK, the reference sw is buggy
3f6f76af
                 mpeg4_encode_vol_header(s, 0, 0);
41773b73
         }
59fa3f96
         if(!(s->workaround_bugs & FF_BUG_MS))
             mpeg4_encode_gop_header(s);
92073d01
     }
115329f1
 
9701840b
     s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
4d2858de
 
c0df9d75
 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->time_base.den, FRAME_RATE_BASE);
115329f1
 
bb270c08
     put_bits(&s->pb, 16, 0);                /* vop header */
     put_bits(&s->pb, 16, VOP_STARTCODE);    /* vop header */
     put_bits(&s->pb, 2, s->pict_type - 1);  /* pict type: I = 0 , P = 1 */
9dbcbd92
 
cf5c5c8f
     assert(s->time>=0);
c0df9d75
     time_div= s->time/s->avctx->time_base.den;
     time_mod= s->time%s->avctx->time_base.den;
9dbcbd92
     time_incr= time_div - s->last_time_base;
6c205de2
     assert(time_incr >= 0);
9dbcbd92
     while(time_incr--)
         put_bits(&s->pb, 1, 1);
115329f1
 
de6d9b64
     put_bits(&s->pb, 1, 0);
 
bb270c08
     put_bits(&s->pb, 1, 1);                             /* marker */
     put_bits(&s->pb, s->time_increment_bits, time_mod); /* time increment */
     put_bits(&s->pb, 1, 1);                             /* marker */
     put_bits(&s->pb, 1, 1);                             /* vop coded */
9701840b
     if (    s->pict_type == FF_P_TYPE
         || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
bb270c08
         put_bits(&s->pb, 1, s->no_rounding);    /* rounding type */
de6d9b64
     }
bb270c08
     put_bits(&s->pb, 3, 0);     /* intra dc VLC threshold */
fcb48651
     if(!s->progressive_sequence){
2be9f03a
          put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first);
fcb48651
          put_bits(&s->pb, 1, s->alternate_scan);
     }
10cd5815
     //FIXME sprite stuff
de6d9b64
 
     put_bits(&s->pb, 5, s->qscale);
 
9701840b
     if (s->pict_type != FF_I_TYPE)
bb270c08
         put_bits(&s->pb, 3, s->f_code); /* fcode_for */
9701840b
     if (s->pict_type == FF_B_TYPE)
bb270c08
         put_bits(&s->pb, 3, s->b_code); /* fcode_back */
de6d9b64
     //    printf("****frame %d\n", picture_number);
 }
 
7604246d
 #endif //CONFIG_ENCODERS
 
4d2858de
 /**
2ba8f6b8
  * predicts the dc.
a7137a04
  * encoding quantized level -> quantized diff
115329f1
  * decoding quantized diff -> quantized level
2ba8f6b8
  * @param n block index (0-3 are luma, 4-5 are chroma)
  * @param dir_ptr pointer to an integer where the prediction direction will be stored
  */
a7137a04
 static inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, int level, int *dir_ptr, int encoding)
de6d9b64
 {
a7137a04
     int a, b, c, wrap, pred, scale, ret;
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
     }
6d71b382
     if(IS_3IV1)
         scale= 8;
 
4278e7a6
     wrap= s->block_wrap[n];
     dc_val = s->dc_val[0] + s->block_index[n];
de6d9b64
 
     /* B C
115329f1
      * A X
de6d9b64
      */
4278e7a6
     a = dc_val[ - 1];
     b = dc_val[ - 1 - wrap];
     c = dc_val[ - wrap];
de6d9b64
 
893bc624
     /* outside slice handling (we can't do that by memset as we need the dc for error resilience) */
4d2858de
     if(s->first_slice_line && n!=3){
         if(n!=2) b=c= 1024;
         if(n!=1 && s->mb_x == s->resync_mb_x) b=a= 1024;
     }
     if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1){
         if(n==0 || n==4 || n==5)
             b=1024;
     }
 
de6d9b64
     if (abs(a - b) < abs(b - c)) {
bb270c08
         pred = c;
de6d9b64
         *dir_ptr = 1; /* top */
     } else {
bb270c08
         pred = a;
de6d9b64
         *dir_ptr = 0; /* left */
     }
     /* we assume pred is positive */
d4961b35
     pred = FASTDIV((pred + (scale >> 1)), scale);
de6d9b64
 
a7137a04
     if(encoding){
         ret = level - pred;
     }else{
         level += pred;
         ret= level;
047599a4
         if(s->error_recognition>=3){
a7137a04
             if(level<0){
                 av_log(s->avctx, AV_LOG_ERROR, "dc<0 at %dx%d\n", s->mb_x, s->mb_y);
                 return -1;
             }
             if(level*scale > 2048 + scale){
                 av_log(s->avctx, AV_LOG_ERROR, "dc overflow at %dx%d\n", s->mb_x, s->mb_y);
                 return -1;
             }
         }
     }
     level *=scale;
4ccde216
     if(level&(~2047)){
115329f1
         if(level<0)
4ccde216
             level=0;
         else if(!(s->workaround_bugs&FF_BUG_DC_CLIP))
             level=2047;
     }
a7137a04
     dc_val[0]= level;
de6d9b64
 
a7137a04
     return ret;
de6d9b64
 }
 
2ba8f6b8
 /**
  * predicts the ac.
  * @param n block index (0-3 are luma, 4-5 are chroma)
  * @param dir the ac prediction direction
  */
0e15384d
 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
de6d9b64
                    int dir)
 {
4278e7a6
     int i;
0c1a9eda
     int16_t *ac_val, *ac_val1;
1e491e29
     int8_t * const qscale_table= s->current_picture.qscale_table;
de6d9b64
 
     /* find prediction */
4278e7a6
     ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
de6d9b64
     ac_val1 = ac_val;
     if (s->ac_pred) {
         if (dir == 0) {
7bc9090a
             const int xy= s->mb_x-1 + s->mb_y*s->mb_stride;
de6d9b64
             /* left prediction */
             ac_val -= 16;
115329f1
 
1e491e29
             if(s->mb_x==0 || s->qscale == qscale_table[xy] || n==1 || n==3){
3e6a20a0
                 /* same qscale */
                 for(i=1;i<8;i++) {
b0368839
                     block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
3e6a20a0
                 }
             }else{
                 /* different qscale, we must rescale */
                 for(i=1;i<8;i++) {
b0368839
                     block[s->dsp.idct_permutation[i<<3]] += ROUNDED_DIV(ac_val[i]*qscale_table[xy], s->qscale);
3e6a20a0
                 }
de6d9b64
             }
         } else {
7bc9090a
             const int xy= s->mb_x + s->mb_y*s->mb_stride - s->mb_stride;
de6d9b64
             /* top prediction */
4278e7a6
             ac_val -= 16 * s->block_wrap[n];
3e6a20a0
 
1e491e29
             if(s->mb_y==0 || s->qscale == qscale_table[xy] || n==2 || n==3){
3e6a20a0
                 /* same qscale */
                 for(i=1;i<8;i++) {
b0368839
                     block[s->dsp.idct_permutation[i]] += ac_val[i + 8];
3e6a20a0
                 }
             }else{
                 /* different qscale, we must rescale */
                 for(i=1;i<8;i++) {
b0368839
                     block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8]*qscale_table[xy], s->qscale);
3e6a20a0
                 }
de6d9b64
             }
         }
     }
     /* left copy */
     for(i=1;i<8;i++)
b0368839
         ac_val1[i    ] = block[s->dsp.idct_permutation[i<<3]];
d930ef19
 
de6d9b64
     /* top copy */
     for(i=1;i<8;i++)
b0368839
         ac_val1[8 + i] = block[s->dsp.idct_permutation[i   ]];
d930ef19
 
de6d9b64
 }
 
b250f9c6
 #if CONFIG_ENCODERS
7604246d
 
2ba8f6b8
 /**
  * encodes the dc value.
  * @param n block index (0-3 are luma, 4-5 are chroma)
  */
92073d01
 static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
d6231b9e
 {
2a164b25
 #if 1
92073d01
 //    if(level<-255 || level>255) printf("dc overflow\n");
2a164b25
     level+=256;
     if (n < 4) {
bb270c08
         /* luminance */
         put_bits(s, uni_DCtab_lum_len[level], uni_DCtab_lum_bits[level]);
2a164b25
     } else {
bb270c08
         /* chrominance */
         put_bits(s, uni_DCtab_chrom_len[level], uni_DCtab_chrom_bits[level]);
2a164b25
     }
 #else
d6231b9e
     int size, v;
de6d9b64
     /* find number of bits */
     size = 0;
     v = abs(level);
     while (v) {
bb270c08
         v >>= 1;
         size++;
de6d9b64
     }
 
     if (n < 4) {
bb270c08
         /* luminance */
         put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
de6d9b64
     } else {
bb270c08
         /* chrominance */
         put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
de6d9b64
     }
 
     /* encode remaining bits */
     if (size > 0) {
bb270c08
         if (level < 0)
             level = (-level) ^ ((1 << size) - 1);
         put_bits(&s->pb, size, level);
         if (size > 8)
             put_bits(&s->pb, 1, 1);
de6d9b64
     }
2a164b25
 #endif
de6d9b64
 }
7604246d
 
1b781f82
 static inline int mpeg4_get_dc_length(int level, int n){
     if (n < 4) {
         return uni_DCtab_lum_len[level + 256];
     } else {
         return uni_DCtab_chrom_len[level + 256];
     }
 }
 
2ba8f6b8
 /**
  * encodes a 8x8 block
  * @param n block index (0-3 are luma, 4-5 are chroma)
  */
115329f1
 static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
0c1a9eda
                                uint8_t *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
de6d9b64
 {
d2975f8d
     int i, last_non_zero;
 #if 0 //variables for the outcommented version
     int code, sign, last;
 #endif
de6d9b64
     const RLTable *rl;
0c1a9eda
     uint32_t *bits_tab;
     uint8_t *len_tab;
3db48188
     const int last_index = s->block_last_index[n];
de6d9b64
 
3db48188
     if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
bb270c08
         /* mpeg4 based DC predictor */
         mpeg4_encode_dc(dc_pb, intra_dc, n);
3db48188
         if(last_index<1) return;
bb270c08
         i = 1;
de6d9b64
         rl = &rl_intra;
3db48188
         bits_tab= uni_mpeg4_intra_rl_bits;
         len_tab = uni_mpeg4_intra_rl_len;
de6d9b64
     } else {
3db48188
         if(last_index<0) return;
bb270c08
         i = 0;
de6d9b64
         rl = &rl_inter;
3db48188
         bits_tab= uni_mpeg4_inter_rl_bits;
         len_tab = uni_mpeg4_inter_rl_len;
de6d9b64
     }
 
     /* AC coefs */
     last_non_zero = i - 1;
3db48188
 #if 1
     for (; i < last_index; i++) {
bb270c08
         int level = block[ scan_table[i] ];
         if (level) {
             int run = i - last_non_zero - 1;
3db48188
             level+=64;
             if((level&(~127)) == 0){
                 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
                 put_bits(ac_pb, len_tab[index], bits_tab[index]);
             }else{ //ESC3
                 put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(0<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
             }
bb270c08
             last_non_zero = i;
         }
3db48188
     }
     /*if(i<=last_index)*/{
bb270c08
         int level = block[ scan_table[i] ];
3db48188
         int run = i - last_non_zero - 1;
         level+=64;
         if((level&(~127)) == 0){
             const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
             put_bits(ac_pb, len_tab[index], bits_tab[index]);
         }else{ //ESC3
             put_bits(ac_pb, 7+2+1+6+1+12+1, (3<<23)+(3<<21)+(1<<20)+(run<<14)+(1<<13)+(((level-64)&0xfff)<<1)+1);
         }
     }
 #else
     for (; i <= last_index; i++) {
bb270c08
         const int slevel = block[ scan_table[i] ];
         if (slevel) {
3db48188
             int level;
bb270c08
             int run = i - last_non_zero - 1;
             last = (i == last_index);
             sign = 0;
             level = slevel;
             if (level < 0) {
                 sign = 1;
                 level = -level;
             }
de6d9b64
             code = get_rl_index(rl, last, run, level);
92073d01
             put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
de6d9b64
             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:
92073d01
                     put_bits(ac_pb, 1, 1);
de6d9b64
                     if (level > MAX_LEVEL)
                         goto esc3;
                     run1 = run - rl->max_run[last][level] - 1;
                     if (run1 < 0)
                         goto esc3;
                     code = get_rl_index(rl, last, run1, level);
                     if (code == rl->n) {
                     esc3:
                         /* third escape */
92073d01
                         put_bits(ac_pb, 1, 1);
                         put_bits(ac_pb, 1, last);
                         put_bits(ac_pb, 6, run);
                         put_bits(ac_pb, 1, 1);
6647ab80
                         put_sbits(ac_pb, 12, slevel);
92073d01
                         put_bits(ac_pb, 1, 1);
de6d9b64
                     } else {
                         /* second escape */
92073d01
                         put_bits(ac_pb, 1, 0);
                         put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
                         put_bits(ac_pb, 1, sign);
de6d9b64
                     }
                 } else {
                     /* first escape */
92073d01
                     put_bits(ac_pb, 1, 0);
                     put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
                     put_bits(ac_pb, 1, sign);
de6d9b64
                 }
             } else {
92073d01
                 put_bits(ac_pb, 1, sign);
de6d9b64
             }
bb270c08
             last_non_zero = i;
         }
de6d9b64
     }
3db48188
 #endif
de6d9b64
 }
1457ab52
 
115329f1
 static int mpeg4_get_block_length(MpegEncContext * s, DCTELEM * block, int n, int intra_dc,
0c1a9eda
                                uint8_t *scan_table)
1457ab52
 {
     int i, last_non_zero;
     const RLTable *rl;
0c1a9eda
     uint8_t *len_tab;
1457ab52
     const int last_index = s->block_last_index[n];
     int len=0;
 
     if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
bb270c08
         /* mpeg4 based DC predictor */
         len += mpeg4_get_dc_length(intra_dc, n);
1457ab52
         if(last_index<1) return len;
bb270c08
         i = 1;
1457ab52
         rl = &rl_intra;
         len_tab = uni_mpeg4_intra_rl_len;
     } else {
         if(last_index<0) return 0;
bb270c08
         i = 0;
1457ab52
         rl = &rl_inter;
         len_tab = uni_mpeg4_inter_rl_len;
     }
 
     /* AC coefs */
     last_non_zero = i - 1;
     for (; i < last_index; i++) {
bb270c08
         int level = block[ scan_table[i] ];
         if (level) {
             int run = i - last_non_zero - 1;
1457ab52
             level+=64;
             if((level&(~127)) == 0){
                 const int index= UNI_MPEG4_ENC_INDEX(0, run, level);
                 len += len_tab[index];
             }else{ //ESC3
                 len += 7+2+1+6+1+12+1;
             }
bb270c08
             last_non_zero = i;
         }
1457ab52
     }
     /*if(i<=last_index)*/{
bb270c08
         int level = block[ scan_table[i] ];
1457ab52
         int run = i - last_non_zero - 1;
         level+=64;
         if((level&(~127)) == 0){
             const int index= UNI_MPEG4_ENC_INDEX(1, run, level);
             len += len_tab[index];
         }else{ //ESC3
             len += 7+2+1+6+1+12+1;
         }
     }
115329f1
 
1457ab52
     return len;
 }
 
bbed9259
 #endif
de6d9b64
 
 
 /***********************************************/
 /* decoding */
 
 static VLC intra_MCBPC_vlc;
 static VLC inter_MCBPC_vlc;
 static VLC cbpy_vlc;
 static VLC mv_vlc;
 static VLC dc_lum, dc_chrom;
73c8e514
 static VLC sprite_trajectory;
6f91bcd1
 static VLC mb_type_b_vlc;
b40cd4e0
 static VLC h263_mbtype_b_vlc;
 static VLC cbpc_b_vlc;
de6d9b64
 
 /* init vlcs */
 
 /* XXX: find a better solution to handle static init */
 void h263_decode_init_vlc(MpegEncContext *s)
 {
     static int done = 0;
 
     if (!done) {
         done = 1;
 
51f90867
         INIT_VLC_STATIC(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
de6d9b64
                  intra_MCBPC_bits, 1, 1,
51f90867
                  intra_MCBPC_code, 1, 1, 72);
         INIT_VLC_STATIC(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
de6d9b64
                  inter_MCBPC_bits, 1, 1,
51f90867
                  inter_MCBPC_code, 1, 1, 198);
         INIT_VLC_STATIC(&cbpy_vlc, CBPY_VLC_BITS, 16,
de6d9b64
                  &cbpy_tab[0][1], 2, 1,
51f90867
                  &cbpy_tab[0][0], 2, 1, 64);
         INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
de6d9b64
                  &mvtab[0][1], 2, 1,
51f90867
                  &mvtab[0][0], 2, 1, 538);
3502a54f
         init_rl(&rl_inter, static_rl_table_store[0]);
         init_rl(&rl_intra, static_rl_table_store[1]);
         init_rl(&rvlc_rl_inter, static_rl_table_store[3]);
         init_rl(&rvlc_rl_intra, static_rl_table_store[4]);
         init_rl(&rl_intra_aic, static_rl_table_store[2]);
ceaaf78b
         INIT_VLC_RL(rl_inter, 554);
         INIT_VLC_RL(rl_intra, 554);
         INIT_VLC_RL(rvlc_rl_inter, 1072);
         INIT_VLC_RL(rvlc_rl_intra, 1072);
         INIT_VLC_RL(rl_intra_aic, 554);
51f90867
         INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
de6d9b64
                  &DCtab_lum[0][1], 2, 1,
51f90867
                  &DCtab_lum[0][0], 2, 1, 512);
         INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
de6d9b64
                  &DCtab_chrom[0][1], 2, 1,
51f90867
                  &DCtab_chrom[0][0], 2, 1, 512);
         INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
73c8e514
                  &sprite_trajectory_tab[0][1], 4, 2,
51f90867
                  &sprite_trajectory_tab[0][0], 4, 2, 128);
         INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
6f91bcd1
                  &mb_type_b_tab[0][1], 2, 1,
51f90867
                  &mb_type_b_tab[0][0], 2, 1, 16);
         INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
b40cd4e0
                  &h263_mbtype_b_tab[0][1], 2, 1,
51f90867
                  &h263_mbtype_b_tab[0][0], 2, 1, 80);
         INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
b40cd4e0
                  &cbpc_b_tab[0][1], 2, 1,
51f90867
                  &cbpc_b_tab[0][0], 2, 1, 8);
de6d9b64
     }
4d2858de
 }
fd7db0fd
 
4d2858de
 /**
  * Get the GOB height based on picture height.
  */
 int ff_h263_get_gob_height(MpegEncContext *s){
     if (s->height <= 400)
         return 1;
     else if (s->height <= 800)
         return  2;
     else
         return 4;
de6d9b64
 }
 
ba58dabc
 int ff_h263_decode_mba(MpegEncContext *s)
 {
     int i, mb_pos;
 
     for(i=0; i<6; i++){
0ed714a7
         if(s->mb_num-1 <= ff_mba_max[i]) break;
ba58dabc
     }
     mb_pos= get_bits(&s->gb, ff_mba_length[i]);
     s->mb_x= mb_pos % s->mb_width;
     s->mb_y= mb_pos / s->mb_width;
 
     return mb_pos;
 }
 
 void ff_h263_encode_mba(MpegEncContext *s)
 {
     int i, mb_pos;
 
     for(i=0; i<6; i++){
0ed714a7
         if(s->mb_num-1 <= ff_mba_max[i]) break;
ba58dabc
     }
     mb_pos= s->mb_x + s->mb_width*s->mb_y;
     put_bits(&s->pb, ff_mba_length[i], mb_pos);
 }
 
4d2858de
 /**
ba58dabc
  * decodes the group of blocks header or slice header.
d9526386
  * @return <0 if an error occurred
4d2858de
  */
 static int h263_decode_gob_header(MpegEncContext *s)
de6d9b64
 {
ba58dabc
     unsigned int val, gfid, gob_number;
4d2858de
     int left;
115329f1
 
4949028f
     /* Check for GOB Start Code */
644d98a4
     val = show_bits(&s->gb, 16);
4d2858de
     if(val)
         return -1;
 
644d98a4
         /* We have a GBSC probably with GSTUFF */
4d2858de
     skip_bits(&s->gb, 16); /* Drop the zeros */
68f593b4
     left= s->gb.size_in_bits - get_bits_count(&s->gb);
4d2858de
     //MN: we must check the bits left or we might end in a infinite loop (or segfault)
     for(;left>13; left--){
         if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
     }
115329f1
     if(left<=13)
4d2858de
         return -1;
 
ba58dabc
     if(s->h263_slice_structured){
         if(get_bits1(&s->gb)==0)
             return -1;
332f9ac4
 
ba58dabc
         ff_h263_decode_mba(s);
 
         if(s->mb_num > 1583)
             if(get_bits1(&s->gb)==0)
                 return -1;
115329f1
 
ba58dabc
         s->qscale = get_bits(&s->gb, 5); /* SQUANT */
         if(get_bits1(&s->gb)==0)
             return -1;
         gfid = get_bits(&s->gb, 2); /* GFID */
     }else{
         gob_number = get_bits(&s->gb, 5); /* GN */
         s->mb_x= 0;
         s->mb_y= s->gob_index* gob_number;
         gfid = get_bits(&s->gb, 2); /* GFID */
         s->qscale = get_bits(&s->gb, 5); /* GQUANT */
     }
115329f1
 
     if(s->mb_y >= s->mb_height)
ffba1dc0
         return -1;
ba58dabc
 
115329f1
     if(s->qscale==0)
ba58dabc
         return -1;
 
644d98a4
     return 0;
 }
 
49092244
 static inline void memsetw(short *tab, int val, int n)
 {
     int i;
     for(i=0;i<n;i++)
         tab[i] = val;
 }
 
b250f9c6
 #if CONFIG_ENCODERS
7604246d
 
92073d01
 void ff_mpeg4_init_partitions(MpegEncContext *s)
 {
9c3d33d6
     uint8_t *start= pbBufPtr(&s->pb);
     uint8_t *end= s->pb.buf_end;
     int size= end - start;
2c656386
     int pb_size = (((long)start + size/3)&(~3)) - (long)start;
58c2182d
     int tex_size= (size - 2*pb_size)&(~3);
115329f1
 
9c3d33d6
     set_put_bits_buffer_size(&s->pb, pb_size);
     init_put_bits(&s->tex_pb, start + pb_size           , tex_size);
5cce4dd7
     init_put_bits(&s->pb2   , start + pb_size + tex_size, pb_size);
92073d01
 }
 
 void ff_mpeg4_merge_partitions(MpegEncContext *s)
 {
fe455f33
     const int pb2_len   = put_bits_count(&s->pb2   );
     const int tex_pb_len= put_bits_count(&s->tex_pb);
     const int bits= put_bits_count(&s->pb);
92073d01
 
9701840b
     if(s->pict_type==FF_I_TYPE){
92073d01
         put_bits(&s->pb, 19, DC_MARKER);
         s->misc_bits+=19 + pb2_len + bits - s->last_bits;
         s->i_tex_bits+= tex_pb_len;
     }else{
         put_bits(&s->pb, 17, MOTION_MARKER);
4d2858de
         s->misc_bits+=17 + pb2_len;
92073d01
         s->mv_bits+= bits - s->last_bits;
         s->p_tex_bits+= tex_pb_len;
     }
 
     flush_put_bits(&s->pb2);
     flush_put_bits(&s->tex_pb);
 
9c3d33d6
     set_put_bits_buffer_size(&s->pb, s->pb2.buf_end - s->pb.buf);
     ff_copy_bits(&s->pb, s->pb2.buf   , pb2_len);
     ff_copy_bits(&s->pb, s->tex_pb.buf, tex_pb_len);
fe455f33
     s->last_bits= put_bits_count(&s->pb);
92073d01
 }
 
7604246d
 #endif //CONFIG_ENCODERS
 
4d2858de
 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s){
     switch(s->pict_type){
9701840b
         case FF_I_TYPE:
4d2858de
             return 16;
9701840b
         case FF_P_TYPE:
         case FF_S_TYPE:
4d2858de
             return s->f_code+15;
9701840b
         case FF_B_TYPE:
159ef4b0
             return FFMAX3(s->f_code, s->b_code, 2) + 15;
4d2858de
         default:
             return -1;
     }
 }
 
b250f9c6
 #if CONFIG_ENCODERS
7604246d
 
92073d01
 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
49092244
 {
     int mb_num_bits= av_log2(s->mb_num - 1) + 1;
 
4d2858de
     put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
92073d01
     put_bits(&s->pb, 1, 1);
115329f1
 
92073d01
     put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
4d2858de
     put_bits(&s->pb, s->quant_precision, s->qscale);
92073d01
     put_bits(&s->pb, 1, 0); /* no HEC */
 }
49092244
 
7604246d
 #endif //CONFIG_ENCODERS
 
92073d01
 /**
4d2858de
  * check if the next stuff is a resync marker or the end.
  * @return 0 if not
92073d01
  */
4d2858de
 static inline int mpeg4_is_resync(MpegEncContext *s){
b5ca0c6f
     int bits_count= get_bits_count(&s->gb);
     int v= show_bits(&s->gb, 16);
115329f1
 
4d2858de
     if(s->workaround_bugs&FF_BUG_NO_PADDING){
         return 0;
     }
 
b5ca0c6f
     while(v<=0xFF){
9701840b
         if(s->pict_type==FF_B_TYPE || (v>>(8-s->pict_type)!=1) || s->partitioned_frame)
b5ca0c6f
             break;
         skip_bits(&s->gb, 8+s->pict_type);
         bits_count+= 8+s->pict_type;
         v= show_bits(&s->gb, 16);
     }
 
68f593b4
     if(bits_count + 8 >= s->gb.size_in_bits){
b5ca0c6f
         v>>=8;
4d2858de
         v|= 0x7F >> (7-(bits_count&7));
115329f1
 
4d2858de
         if(v==0x7F)
             return 1;
     }else{
b5ca0c6f
         if(v == ff_mpeg4_resync_prefix[bits_count&7]){
4d2858de
             int len;
             GetBitContext gb= s->gb;
115329f1
 
4d2858de
             skip_bits(&s->gb, 1);
             align_get_bits(&s->gb);
115329f1
 
4d2858de
             for(len=0; len<32; len++){
                 if(get_bits1(&s->gb)) break;
             }
 
             s->gb= gb;
 
             if(len>=ff_mpeg4_get_video_packet_prefix_length(s))
                 return 1;
         }
     }
     return 0;
 }
 
 /**
  * decodes the next video packet.
  * @return <0 if something went wrong
  */
 static int mpeg4_decode_video_packet_header(MpegEncContext *s)
92073d01
 {
     int mb_num_bits= av_log2(s->mb_num - 1) + 1;
4d2858de
     int header_extension=0, mb_num, len;
115329f1
 
92073d01
     /* is there enough space left for a video packet + header */
68f593b4
     if( get_bits_count(&s->gb) > s->gb.size_in_bits-20) return -1;
92073d01
 
4d2858de
     for(len=0; len<32; len++){
         if(get_bits1(&s->gb)) break;
49092244
     }
92073d01
 
4d2858de
     if(len!=ff_mpeg4_get_video_packet_prefix_length(s)){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "marker does not match f_code\n");
92073d01
         return -1;
     }
115329f1
 
49092244
     if(s->shape != RECT_SHAPE){
4d2858de
         header_extension= get_bits1(&s->gb);
49092244
         //FIXME more stuff here
     }
 
4d2858de
     mb_num= get_bits(&s->gb, mb_num_bits);
     if(mb_num>=s->mb_num){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_num);
92073d01
         return -1;
     }
9701840b
     if(s->pict_type == FF_B_TYPE){
7bc9090a
         while(s->next_picture.mbskip_table[ s->mb_index2xy[ mb_num ] ]) mb_num++;
bd107136
         if(mb_num >= s->mb_num) return -1; // slice contains just skipped MBs which where already decoded
84876d36
     }
115329f1
 
4d2858de
     s->mb_x= mb_num % s->mb_width;
     s->mb_y= mb_num / s->mb_width;
49092244
 
     if(s->shape != BIN_ONLY_SHAPE){
115329f1
         int qscale= get_bits(&s->gb, s->quant_precision);
4d2858de
         if(qscale)
332f9ac4
             s->chroma_qscale=s->qscale= qscale;
49092244
     }
 
     if(s->shape == RECT_SHAPE){
4d2858de
         header_extension= get_bits1(&s->gb);
49092244
     }
     if(header_extension){
92073d01
         int time_increment;
49092244
         int time_incr=0;
92073d01
 
115329f1
         while (get_bits1(&s->gb) != 0)
49092244
             time_incr++;
 
4d2858de
         check_marker(&s->gb, "before time_increment in video packed header");
         time_increment= get_bits(&s->gb, s->time_increment_bits);
         check_marker(&s->gb, "before vop_coding_type in video packed header");
115329f1
 
4d2858de
         skip_bits(&s->gb, 2); /* vop coding type */
49092244
         //FIXME not rect stuff here
 
         if(s->shape != BIN_ONLY_SHAPE){
4d2858de
             skip_bits(&s->gb, 3); /* intra dc vlc threshold */
893bc624
 //FIXME don't just ignore everything
9701840b
             if(s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
3f9d89c6
                 mpeg4_decode_sprite_trajectory(s, &s->gb);
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "untested\n");
49092244
             }
 
             //FIXME reduced res stuff here
115329f1
 
9701840b
             if (s->pict_type != FF_I_TYPE) {
bb270c08
                 int f_code = get_bits(&s->gb, 3);       /* fcode_for */
f3cfadd5
                 if(f_code==0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (f_code=0)\n");
49092244
                 }
             }
9701840b
             if (s->pict_type == FF_B_TYPE) {
4d2858de
                 int b_code = get_bits(&s->gb, 3);
f3cfadd5
                 if(b_code==0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "Error, video packet header damaged (b_code=0)\n");
f3cfadd5
                 }
115329f1
             }
49092244
         }
     }
     //FIXME new-pred stuff
115329f1
 
92073d01
 //printf("parse ok %d %d %d %d\n", mb_num, s->mb_x + s->mb_y*s->mb_width, get_bits_count(gb), get_bits_count(&s->gb));
 
4d2858de
     return 0;
92073d01
 }
 
 void ff_mpeg4_clean_buffers(MpegEncContext *s)
 {
     int c_wrap, c_xy, l_wrap, l_xy;
49092244
 
137c8468
     l_wrap= s->b8_stride;
     l_xy= (2*s->mb_y-1)*l_wrap + s->mb_x*2 - 1;
     c_wrap= s->mb_stride;
     c_xy= (s->mb_y-1)*c_wrap + s->mb_x - 1;
49092244
 
4d2858de
 #if 0
49092244
     /* clean DC */
92073d01
     memsetw(s->dc_val[0] + l_xy, 1024, l_wrap*2+1);
     memsetw(s->dc_val[1] + c_xy, 1024, c_wrap+1);
     memsetw(s->dc_val[2] + c_xy, 1024, c_wrap+1);
4d2858de
 #endif
49092244
 
     /* clean AC */
0c1a9eda
     memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(int16_t));
     memset(s->ac_val[1] + c_xy, 0, (c_wrap  +1)*16*sizeof(int16_t));
     memset(s->ac_val[2] + c_xy, 0, (c_wrap  +1)*16*sizeof(int16_t));
49092244
 
     /* clean MV */
893bc624
     // we can't clear the MVs as they might be needed by a b frame
0c1a9eda
 //    memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(int16_t));
 //    memset(s->motion_val, 0, 2*sizeof(int16_t)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
92073d01
     s->last_mv[0][0][0]=
     s->last_mv[0][0][1]=
     s->last_mv[1][0][0]=
     s->last_mv[1][0][1]= 0;
 }
 
4d2858de
 /**
ee3e3631
  * finds the next resync_marker
  * @param p pointer to buffer to scan
  * @param end pointer to the end of the buffer
  * @return pointer to the next resync_marker, or \p end if none was found
  */
 const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end)
 {
     assert(p < end);
 
     end-=2;
     p++;
     for(;p<end; p+=2){
         if(!*p){
             if     (!p[-1] && p[1]) return p - 1;
             else if(!p[ 1] && p[2]) return p;
         }
     }
     return end+2;
 }
 
 /**
4d2858de
  * decodes the group of blocks / video packet header.
3021a8a7
  * @return bit position of the resync_marker, or <0 if none was found
4d2858de
  */
 int ff_h263_resync(MpegEncContext *s){
3021a8a7
     int left, pos, ret;
115329f1
 
bba3a09b
     if(s->codec_id==CODEC_ID_MPEG4){
4d2858de
         skip_bits1(&s->gb);
bba3a09b
         align_get_bits(&s->gb);
     }
92073d01
 
4d2858de
     if(show_bits(&s->gb, 16)==0){
3021a8a7
         pos= get_bits_count(&s->gb);
4d2858de
         if(s->codec_id==CODEC_ID_MPEG4)
             ret= mpeg4_decode_video_packet_header(s);
         else
             ret= h263_decode_gob_header(s);
         if(ret>=0)
3021a8a7
             return pos;
92073d01
     }
90b5b51e
     //OK, it's not where it is supposed to be ...
4d2858de
     s->gb= s->last_resync_gb;
     align_get_bits(&s->gb);
68f593b4
     left= s->gb.size_in_bits - get_bits_count(&s->gb);
115329f1
 
     for(;left>16+1+5+5; left-=8){
4d2858de
         if(show_bits(&s->gb, 16)==0){
             GetBitContext bak= s->gb;
92073d01
 
3021a8a7
             pos= get_bits_count(&s->gb);
4d2858de
             if(s->codec_id==CODEC_ID_MPEG4)
                 ret= mpeg4_decode_video_packet_header(s);
             else
                 ret= h263_decode_gob_header(s);
             if(ret>=0)
3021a8a7
                 return pos;
92073d01
 
4d2858de
             s->gb= bak;
         }
         skip_bits(&s->gb, 8);
     }
115329f1
 
4d2858de
     return -1;
92073d01
 }
 
 /**
2ba8f6b8
  * gets the average motion vector for a GMC MB.
073b013d
  * @param n either 0 for the x component or 1 for y
  * @returns the average MV for a GMC MB
  */
 static inline int get_amv(MpegEncContext *s, int n){
     int x, y, mb_v, sum, dx, dy, shift;
     int len = 1 << (s->f_code + 4);
     const int a= s->sprite_warping_accuracy;
115329f1
 
3116cb14
     if(s->workaround_bugs & FF_BUG_AMV)
         len >>= s->quarter_sample;
073b013d
 
     if(s->real_sprite_warping_points==1){
         if(s->divx_version==500 && s->divx_build==413)
             sum= s->sprite_offset[0][n] / (1<<(a - s->quarter_sample));
         else
             sum= RSHIFT(s->sprite_offset[0][n]<<s->quarter_sample, a);
     }else{
         dx= s->sprite_delta[n][0];
         dy= s->sprite_delta[n][1];
         shift= s->sprite_shift[0];
         if(n) dy -= 1<<(shift + a + 1);
         else  dx -= 1<<(shift + a + 1);
         mb_v= s->sprite_offset[0][n] + dx*s->mb_x*16 + dy*s->mb_y*16;
 
         sum=0;
         for(y=0; y<16; y++){
             int v;
115329f1
 
073b013d
             v= mb_v + dy*y;
             //XXX FIXME optimize
             for(x=0; x<16; x++){
                 sum+= v>>shift;
                 v+= dx;
             }
         }
92148550
         sum= RSHIFT(sum, a+8-s->quarter_sample);
073b013d
     }
 
     if      (sum < -len) sum= -len;
     else if (sum >= len) sum= len-1;
 
     return sum;
 }
 
 /**
4d2858de
  * decodes first partition.
d9526386
  * @return number of MBs decoded or <0 if an error occurred
92073d01
  */
4d2858de
 static int mpeg4_decode_partition_a(MpegEncContext *s){
92073d01
     int mb_num;
0c1a9eda
     static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
115329f1
 
92073d01
     /* decode first partition */
     mb_num=0;
49092244
     s->first_slice_line=1;
4d2858de
     for(; s->mb_y<s->mb_height; s->mb_y++){
         ff_init_block_index(s);
         for(; s->mb_x<s->mb_width; s->mb_x++){
7bc9090a
             const int xy= s->mb_x + s->mb_y*s->mb_stride;
92073d01
             int cbpc;
             int dir=0;
115329f1
 
92073d01
             mb_num++;
4d2858de
             ff_update_block_index(s);
92073d01
             if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
                 s->first_slice_line=0;
115329f1
 
9701840b
             if(s->pict_type==FF_I_TYPE){
92073d01
                 int i;
 
7af75e6c
                 do{
b98202a4
                     if(show_bits_long(&s->gb, 19)==DC_MARKER){
                         return mb_num-1;
                     }
 
7af75e6c
                     cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
                     if (cbpc < 0){
9b879566
                         av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
7af75e6c
                         return -1;
                     }
                 }while(cbpc == 8);
115329f1
 
92073d01
                 s->cbp_table[xy]= cbpc & 3;
7bc9090a
                 s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
92073d01
                 s->mb_intra = 1;
 
                 if(cbpc & 4) {
554daa24
                     ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
92073d01
                 }
1e491e29
                 s->current_picture.qscale_table[xy]= s->qscale;
92073d01
 
                 s->mbintra_table[xy]= 1;
                 for(i=0; i<6; i++){
                     int dc_pred_dir;
115329f1
                     int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
92073d01
                     if(dc < 0){
9b879566
                         av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
4d2858de
                         return -1;
92073d01
                     }
                     dir<<=1;
                     if(dc_pred_dir) dir|=1;
                 }
                 s->pred_dir_table[xy]= dir;
             }else{ /* P/S_TYPE */
4d2858de
                 int mx, my, pred_x, pred_y, bits;
8d7ec294
                 int16_t * const mot_val= s->current_picture.motion_val[0][s->block_index[0]];
137c8468
                 const int stride= s->b8_stride*2;
92073d01
 
b98202a4
 try_again:
4d2858de
                 bits= show_bits(&s->gb, 17);
                 if(bits==MOTION_MARKER){
                     return mb_num-1;
                 }
                 skip_bits1(&s->gb);
                 if(bits&0x10000){
92073d01
                     /* skip mb */
9701840b
                     if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
7bc9090a
                         s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
073b013d
                         mx= get_amv(s, 0);
                         my= get_amv(s, 1);
92073d01
                     }else{
7bc9090a
                         s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
073b013d
                         mx=my=0;
92073d01
                     }
                     mot_val[0       ]= mot_val[2       ]=
                     mot_val[0+stride]= mot_val[2+stride]= mx;
                     mot_val[1       ]= mot_val[3       ]=
                     mot_val[1+stride]= mot_val[3+stride]= my;
 
                     if(s->mbintra_table[xy])
                         ff_clean_intra_table_entries(s);
                     continue;
                 }
7af75e6c
 
edcf9890
                 cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
92073d01
                 if (cbpc < 0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
4d2858de
                     return -1;
92073d01
                 }
b98202a4
                 if(cbpc == 20)
                     goto try_again;
7af75e6c
 
92073d01
                 s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
115329f1
 
92073d01
                 s->mb_intra = ((cbpc & 4) != 0);
115329f1
 
92073d01
                 if(s->mb_intra){
7bc9090a
                     s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
92073d01
                     s->mbintra_table[xy]= 1;
115329f1
                     mot_val[0       ]= mot_val[2       ]=
92073d01
                     mot_val[0+stride]= mot_val[2+stride]= 0;
                     mot_val[1       ]= mot_val[3       ]=
                     mot_val[1+stride]= mot_val[3+stride]= 0;
                 }else{
                     if(s->mbintra_table[xy])
                         ff_clean_intra_table_entries(s);
 
9701840b
                     if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
92073d01
                         s->mcsel= get_bits1(&s->gb);
                     else s->mcsel= 0;
115329f1
 
92073d01
                     if ((cbpc & 16) == 0) {
                         /* 16x16 motion prediction */
 
137c8468
                         h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
073b013d
                         if(!s->mcsel){
                             mx = h263_decode_motion(s, pred_x, s->f_code);
                             if (mx >= 0xffff)
                                 return -1;
 
                             my = h263_decode_motion(s, pred_y, s->f_code);
                             if (my >= 0xffff)
                                 return -1;
7bc9090a
                             s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
073b013d
                         } else {
                             mx = get_amv(s, 0);
                             my = get_amv(s, 1);
7bc9090a
                             s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_GMC | MB_TYPE_L0;
92073d01
                         }
073b013d
 
92073d01
                         mot_val[0       ]= mot_val[2       ] =
                         mot_val[0+stride]= mot_val[2+stride]= mx;
                         mot_val[1       ]= mot_val[3       ]=
                         mot_val[1+stride]= mot_val[3+stride]= my;
                     } else {
                         int i;
7bc9090a
                         s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
92073d01
                         for(i=0;i<4;i++) {
137c8468
                             int16_t *mot_val= h263_pred_motion(s, i, 0, &pred_x, &pred_y);
92073d01
                             mx = h263_decode_motion(s, pred_x, s->f_code);
                             if (mx >= 0xffff)
4d2858de
                                 return -1;
115329f1
 
92073d01
                             my = h263_decode_motion(s, pred_y, s->f_code);
                             if (my >= 0xffff)
4d2858de
                                 return -1;
92073d01
                             mot_val[0] = mx;
                             mot_val[1] = my;
                         }
                     }
                 }
             }
         }
         s->mb_x= 0;
     }
 
4d2858de
     return mb_num;
 }
 
 /**
  * decode second partition.
d9526386
  * @return <0 if an error occurred
4d2858de
  */
 static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
     int mb_num=0;
0c1a9eda
     static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
92073d01
 
     s->mb_x= s->resync_mb_x;
4d2858de
     s->first_slice_line=1;
     for(s->mb_y= s->resync_mb_y; mb_num < mb_count; s->mb_y++){
         ff_init_block_index(s);
         for(; mb_num < mb_count && s->mb_x<s->mb_width; s->mb_x++){
7bc9090a
             const int xy= s->mb_x + s->mb_y*s->mb_stride;
92073d01
 
             mb_num++;
4d2858de
             ff_update_block_index(s);
             if(s->mb_x == s->resync_mb_x && s->mb_y == s->resync_mb_y+1)
                 s->first_slice_line=0;
115329f1
 
9701840b
             if(s->pict_type==FF_I_TYPE){
92073d01
                 int ac_pred= get_bits1(&s->gb);
edcf9890
                 int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
92073d01
                 if(cbpy<0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
4d2858de
                     return -1;
92073d01
                 }
115329f1
 
92073d01
                 s->cbp_table[xy]|= cbpy<<2;
115329f1
                 s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
92073d01
             }else{ /* P || S_TYPE */
115329f1
                 if(IS_INTRA(s->current_picture.mb_type[xy])){
92073d01
                     int dir=0,i;
                     int ac_pred = get_bits1(&s->gb);
edcf9890
                     int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
92073d01
 
                     if(cbpy<0){
9b879566
                         av_log(s->avctx, AV_LOG_ERROR, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
4d2858de
                         return -1;
92073d01
                     }
115329f1
 
92073d01
                     if(s->cbp_table[xy] & 8) {
554daa24
                         ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
92073d01
                     }
1e491e29
                     s->current_picture.qscale_table[xy]= s->qscale;
92073d01
 
                     for(i=0; i<6; i++){
                         int dc_pred_dir;
115329f1
                         int dc= mpeg4_decode_dc(s, i, &dc_pred_dir);
92073d01
                         if(dc < 0){
9b879566
                             av_log(s->avctx, AV_LOG_ERROR, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
4d2858de
                             return -1;
92073d01
                         }
                         dir<<=1;
                         if(dc_pred_dir) dir|=1;
                     }
                     s->cbp_table[xy]&= 3; //remove dquant
                     s->cbp_table[xy]|= cbpy<<2;
115329f1
                     s->current_picture.mb_type[xy] |= ac_pred*MB_TYPE_ACPRED;
7bc9090a
                     s->pred_dir_table[xy]= dir;
                 }else if(IS_SKIP(s->current_picture.mb_type[xy])){
1e491e29
                     s->current_picture.qscale_table[xy]= s->qscale;
92073d01
                     s->cbp_table[xy]= 0;
                 }else{
edcf9890
                     int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
92073d01
 
                     if(cbpy<0){
9b879566
                         av_log(s->avctx, AV_LOG_ERROR, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
4d2858de
                         return -1;
92073d01
                     }
115329f1
 
92073d01
                     if(s->cbp_table[xy] & 8) {
554daa24
                         ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
92073d01
                     }
1e491e29
                     s->current_picture.qscale_table[xy]= s->qscale;
92073d01
 
                     s->cbp_table[xy]&= 3; //remove dquant
                     s->cbp_table[xy]|= (cbpy^0xf)<<2;
                 }
             }
         }
4d2858de
         if(mb_num >= mb_count) return 0;
92073d01
         s->mb_x= 0;
     }
4d2858de
     return 0;
 }
 
 /**
  * decodes the first & second partition
  * @return <0 if error (and sets error type in the error_status_table)
  */
 int ff_mpeg4_decode_partitions(MpegEncContext *s)
 {
     int mb_num;
9701840b
     const int part_a_error= s->pict_type==FF_I_TYPE ? (DC_ERROR|MV_ERROR) : MV_ERROR;
     const int part_a_end  = s->pict_type==FF_I_TYPE ? (DC_END  |MV_END)   : MV_END;
115329f1
 
     mb_num= mpeg4_decode_partition_a(s);
46b4feec
     if(mb_num<0){
         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
4d2858de
         return -1;
46b4feec
     }
115329f1
 
4d2858de
     if(s->resync_mb_x + s->resync_mb_y*s->mb_width + mb_num > s->mb_num){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "slice below monitor ...\n");
46b4feec
         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, part_a_error);
4d2858de
         return -1;
     }
 
     s->mb_num_left= mb_num;
115329f1
 
9701840b
     if(s->pict_type==FF_I_TYPE){
b98202a4
         while(show_bits(&s->gb, 9) == 1)
             skip_bits(&s->gb, 9);
17fb5fd3
         if(get_bits_long(&s->gb, 19)!=DC_MARKER){
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "marker missing after first I partition at %d %d\n", s->mb_x, s->mb_y);
4d2858de
             return -1;
46b4feec
         }
4d2858de
     }else{
b98202a4
         while(show_bits(&s->gb, 10) == 1)
             skip_bits(&s->gb, 10);
4d2858de
         if(get_bits(&s->gb, 17)!=MOTION_MARKER){
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "marker missing after first P partition at %d %d\n", s->mb_x, s->mb_y);
4d2858de
             return -1;
46b4feec
         }
4d2858de
     }
46b4feec
     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, part_a_end);
115329f1
 
4d2858de
     if( mpeg4_decode_partition_b(s, mb_num) < 0){
9701840b
         if(s->pict_type==FF_P_TYPE)
46b4feec
             ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR);
4d2858de
         return -1;
46b4feec
     }else{
9701840b
         if(s->pict_type==FF_P_TYPE)
46b4feec
             ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END);
4d2858de
     }
92073d01
 
115329f1
     return 0;
92073d01
 }
 
4d2858de
 /**
  * decode partition C of one MB.
d9526386
  * @return <0 if an error occurred
4d2858de
  */
 static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64])
92073d01
 {
     int cbp, mb_type;
7bc9090a
     const int xy= s->mb_x + s->mb_y*s->mb_stride;
92073d01
 
7bc9090a
     mb_type= s->current_picture.mb_type[xy];
4d2858de
     cbp = s->cbp_table[xy];
92073d01
 
7f12a978
     s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
 
1e491e29
     if(s->current_picture.qscale_table[xy] != s->qscale){
554daa24
         ff_set_qscale(s, s->current_picture.qscale_table[xy] );
92073d01
     }
115329f1
 
9701840b
     if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
92073d01
         int i;
         for(i=0; i<4; i++){
8d7ec294
             s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0];
             s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1];
92073d01
         }
7bc9090a
         s->mb_intra = IS_INTRA(mb_type);
92073d01
 
7bc9090a
         if (IS_SKIP(mb_type)) {
92073d01
             /* skip mb */
             for(i=0;i<6;i++)
                 s->block_last_index[i] = -1;
             s->mv_dir = MV_DIR_FORWARD;
             s->mv_type = MV_TYPE_16X16;
9701840b
             if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
92073d01
                 s->mcsel=1;
160d679c
                 s->mb_skipped = 0;
92073d01
             }else{
                 s->mcsel=0;
160d679c
                 s->mb_skipped = 1;
92073d01
             }
4d2858de
         }else if(s->mb_intra){
7bc9090a
             s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
92073d01
         }else if(!s->mb_intra){
 //            s->mcsel= 0; //FIXME do we need to init that
115329f1
 
92073d01
             s->mv_dir = MV_DIR_FORWARD;
7bc9090a
             if (IS_8X8(mb_type)) {
92073d01
                 s->mv_type = MV_TYPE_8X8;
             } else {
                 s->mv_type = MV_TYPE_16X16;
             }
         }
     } else { /* I-Frame */
         s->mb_intra = 1;
7bc9090a
         s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]);
a4e8b587
     }
 
7bc9090a
     if (!IS_SKIP(mb_type)) {
a4e8b587
         int i;
dee6dde6
         s->dsp.clear_blocks(s->block[0]);
92073d01
         /* decode each block */
         for (i = 0; i < 6; i++) {
a4e8b587
             if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra);
92073d01
                 return -1;
             }
3a3d3a42
             cbp+=cbp;
92073d01
         }
     }
49092244
 
4d2858de
     /* per-MB end of slice check */
fd7db0fd
 
4d2858de
     if(--s->mb_num_left <= 0){
68f593b4
 //printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb));
4d2858de
         if(mpeg4_is_resync(s))
             return SLICE_END;
         else
115329f1
             return SLICE_NOEND;
4d2858de
     }else{
7bc9090a
         if(mpeg4_is_resync(s)){
             const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
             if(s->cbp_table[xy+delta])
                 return SLICE_END;
         }
         return SLICE_OK;
fd7db0fd
     }
 }
92073d01
 
f7190f73
 /**
  * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
  */
 static void preview_obmc(MpegEncContext *s){
     GetBitContext gb= s->gb;
115329f1
 
f7190f73
     int cbpc, i, pred_x, pred_y, mx, my;
     int16_t *mot_val;
     const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
137c8468
     const int stride= s->b8_stride*2;
115329f1
 
f7190f73
     for(i=0; i<4; i++)
         s->block_index[i]+= 2;
     for(i=4; i<6; i++)
         s->block_index[i]+= 1;
     s->mb_x++;
115329f1
 
9701840b
     assert(s->pict_type == FF_P_TYPE);
f7190f73
 
     do{
         if (get_bits1(&s->gb)) {
             /* skip mb */
8d7ec294
             mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
115329f1
             mot_val[0       ]= mot_val[2       ]=
f7190f73
             mot_val[0+stride]= mot_val[2+stride]= 0;
             mot_val[1       ]= mot_val[3       ]=
             mot_val[1+stride]= mot_val[3+stride]= 0;
115329f1
 
f7190f73
             s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
             goto end;
         }
         cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
     }while(cbpc == 20);
115329f1
 
f7190f73
     if(cbpc & 4){
         s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
     }else{
         get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
         if (cbpc & 8) {
cdb4e730
             if(s->modified_quant){
                 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
                 else                  skip_bits(&s->gb, 5);
             }else
                 skip_bits(&s->gb, 2);
f7190f73
         }
115329f1
 
f7190f73
         if ((cbpc & 16) == 0) {
115329f1
                 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
f7190f73
                 /* 16x16 motion prediction */
137c8468
                 mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
f7190f73
                 if (s->umvplus)
                    mx = h263p_decode_umotion(s, pred_x);
                 else
b40cd4e0
                    mx = h263_decode_motion(s, pred_x, 1);
115329f1
 
f7190f73
                 if (s->umvplus)
                    my = h263p_decode_umotion(s, pred_y);
                 else
b40cd4e0
                    my = h263_decode_motion(s, pred_y, 1);
115329f1
 
                 mot_val[0       ]= mot_val[2       ]=
f7190f73
                 mot_val[0+stride]= mot_val[2+stride]= mx;
                 mot_val[1       ]= mot_val[3       ]=
                 mot_val[1+stride]= mot_val[3+stride]= my;
         } else {
115329f1
             s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
f7190f73
             for(i=0;i<4;i++) {
137c8468
                 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
f7190f73
                 if (s->umvplus)
                   mx = h263p_decode_umotion(s, pred_x);
                 else
b40cd4e0
                   mx = h263_decode_motion(s, pred_x, 1);
115329f1
 
f7190f73
                 if (s->umvplus)
                   my = h263p_decode_umotion(s, pred_y);
115329f1
                 else
b40cd4e0
                   my = h263_decode_motion(s, pred_y, 1);
f7190f73
                 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
                   skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
                 mot_val[0] = mx;
                 mot_val[1] = my;
             }
         }
     }
 end:
115329f1
 
f7190f73
     for(i=0; i<4; i++)
         s->block_index[i]-= 2;
     for(i=4; i<6; i++)
         s->block_index[i]-= 1;
     s->mb_x--;
 
     s->gb= gb;
 }
 
cdb4e730
 static void h263_decode_dquant(MpegEncContext *s){
     static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
 
     if(s->modified_quant){
         if(get_bits1(&s->gb))
             s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
         else
             s->qscale= get_bits(&s->gb, 5);
     }else
         s->qscale += quant_tab[get_bits(&s->gb, 2)];
     ff_set_qscale(s, s->qscale);
 }
 
4d2858de
 int ff_h263_decode_mb(MpegEncContext *s,
                       DCTELEM block[6][64])
644d98a4
 {
     int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
0c1a9eda
     int16_t *mot_val;
7bc9090a
     const int xy= s->mb_x + s->mb_y * s->mb_stride;
115329f1
 
fcfee63b
     assert(!s->h263_pred);
115329f1
 
9701840b
     if (s->pict_type == FF_P_TYPE) {
fcfee63b
         do{
             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;
7bc9090a
                 s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
44eb4951
                 s->mv[0][0][0] = 0;
                 s->mv[0][0][1] = 0;
160d679c
                 s->mb_skipped = !(s->obmc | s->loop_filter);
fcfee63b
                 goto end;
44eb4951
             }
fcfee63b
             cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
             //fprintf(stderr, "\tCBPC: %d", cbpc);
             if (cbpc < 0){
                 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
                 return -1;
             }
         }while(cbpc == 20);
115329f1
 
dee6dde6
         s->dsp.clear_blocks(s->block[0]);
115329f1
 
de6d9b64
         dquant = cbpc & 8;
         s->mb_intra = ((cbpc & 4) != 0);
6f91bcd1
         if (s->mb_intra) goto intra;
115329f1
 
edcf9890
         cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
115329f1
 
dba019da
         if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
             cbpy ^= 0xF;
115329f1
 
dba019da
         cbp = (cbpc & 3) | (cbpy << 2);
de6d9b64
         if (dquant) {
cdb4e730
             h263_decode_dquant(s);
de6d9b64
         }
115329f1
 
fcfee63b
         s->mv_dir = MV_DIR_FORWARD;
         if ((cbpc & 16) == 0) {
115329f1
             s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
fcfee63b
             /* 16x16 motion prediction */
             s->mv_type = MV_TYPE_16X16;
137c8468
             h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
fcfee63b
             if (s->umvplus)
                mx = h263p_decode_umotion(s, pred_x);
             else
b40cd4e0
                mx = h263_decode_motion(s, pred_x, 1);
115329f1
 
fcfee63b
             if (mx >= 0xffff)
                 return -1;
115329f1
 
fcfee63b
             if (s->umvplus)
                my = h263p_decode_umotion(s, pred_y);
             else
b40cd4e0
                my = h263_decode_motion(s, pred_y, 1);
115329f1
 
fcfee63b
             if (my >= 0xffff)
                 return -1;
             s->mv[0][0][0] = mx;
             s->mv[0][0][1] = my;
 
             if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
115329f1
                skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
fcfee63b
         } else {
115329f1
             s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
fcfee63b
             s->mv_type = MV_TYPE_8X8;
             for(i=0;i<4;i++) {
137c8468
                 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
fcfee63b
                 if (s->umvplus)
                   mx = h263p_decode_umotion(s, pred_x);
                 else
b40cd4e0
                   mx = h263_decode_motion(s, pred_x, 1);
fcfee63b
                 if (mx >= 0xffff)
                     return -1;
115329f1
 
fcfee63b
                 if (s->umvplus)
                   my = h263p_decode_umotion(s, pred_y);
115329f1
                 else
b40cd4e0
                   my = h263_decode_motion(s, pred_y, 1);
fcfee63b
                 if (my >= 0xffff)
                     return -1;
                 s->mv[0][i][0] = mx;
                 s->mv[0][i][1] = my;
                 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
                   skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
                 mot_val[0] = mx;
                 mot_val[1] = my;
             }
         }
b40cd4e0
 
8a36717a
         /* decode each block */
         for (i = 0; i < 6; i++) {
             if (h263_decode_block(s, block[i], i, cbp&32) < 0)
                 return -1;
             cbp+=cbp;
         }
 
b40cd4e0
         if(s->obmc){
9701840b
             if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
b40cd4e0
                 preview_obmc(s);
         }
9701840b
     } else if(s->pict_type==FF_B_TYPE) {
b40cd4e0
         int mb_type;
         const int stride= s->b8_stride;
8135f8df
         int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
         int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
b40cd4e0
 //        const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
 
115329f1
         //FIXME ugly
         mot_val0[0       ]= mot_val0[2       ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
         mot_val0[1       ]= mot_val0[3       ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
         mot_val1[0       ]= mot_val1[2       ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
8135f8df
         mot_val1[1       ]= mot_val1[3       ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
b40cd4e0
 
         do{
             mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
             if (mb_type < 0){
                 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
                 return -1;
             }
 
             mb_type= h263_mb_type_b_map[ mb_type ];
         }while(!mb_type);
 
         s->mb_intra = IS_INTRA(mb_type);
         if(HAS_CBP(mb_type)){
dee6dde6
             s->dsp.clear_blocks(s->block[0]);
b40cd4e0
             cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
             if(s->mb_intra){
                 dquant = IS_QUANT(mb_type);
                 goto intra;
             }
 
             cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
 
             if (cbpy < 0){
                 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
                 return -1;
             }
115329f1
 
b40cd4e0
             if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
                 cbpy ^= 0xF;
115329f1
 
b40cd4e0
             cbp = (cbpc & 3) | (cbpy << 2);
         }else
             cbp=0;
115329f1
 
b40cd4e0
         assert(!s->mb_intra);
 
         if(IS_QUANT(mb_type)){
cdb4e730
             h263_decode_dquant(s);
b40cd4e0
         }
 
         if(IS_DIRECT(mb_type)){
             s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
             mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
         }else{
             s->mv_dir = 0;
             s->mv_type= MV_TYPE_16X16;
 //FIXME UMV
 
             if(USES_LIST(mb_type, 0)){
137c8468
                 int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
b40cd4e0
                 s->mv_dir = MV_DIR_FORWARD;
 
                 mx = h263_decode_motion(s, mx, 1);
                 my = h263_decode_motion(s, my, 1);
115329f1
 
b40cd4e0
                 s->mv[0][0][0] = mx;
                 s->mv[0][0][1] = my;
8135f8df
                 mot_val[0       ]= mot_val[2       ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
                 mot_val[1       ]= mot_val[3       ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
b40cd4e0
             }
115329f1
 
b40cd4e0
             if(USES_LIST(mb_type, 1)){
137c8468
                 int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
b40cd4e0
                 s->mv_dir |= MV_DIR_BACKWARD;
115329f1
 
b40cd4e0
                 mx = h263_decode_motion(s, mx, 1);
                 my = h263_decode_motion(s, my, 1);
8135f8df
 
b40cd4e0
                 s->mv[1][0][0] = mx;
                 s->mv[1][0][1] = my;
8135f8df
                 mot_val[0       ]= mot_val[2       ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
                 mot_val[1       ]= mot_val[3       ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
b40cd4e0
             }
         }
115329f1
 
b40cd4e0
         s->current_picture.mb_type[xy]= mb_type;
8a36717a
 
         /* decode each block */
         for (i = 0; i < 6; i++) {
             if (h263_decode_block(s, block[i], i, cbp&32) < 0)
                 return -1;
             cbp+=cbp;
         }
fcfee63b
     } else { /* I-Frame */
         do{
             cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
             if (cbpc < 0){
                 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
                 return -1;
             }
         }while(cbpc == 8);
 
dee6dde6
         s->dsp.clear_blocks(s->block[0]);
 
fcfee63b
         dquant = cbpc & 4;
         s->mb_intra = 1;
 intra:
         s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
         if (s->h263_aic) {
             s->ac_pred = get_bits1(&s->gb);
             if(s->ac_pred){
                 s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
115329f1
 
fcfee63b
                 s->h263_aic_dir = get_bits1(&s->gb);
             }
         }else
             s->ac_pred = 0;
115329f1
 
fcfee63b
         cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
         if(cbpy<0){
             av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
             return -1;
         }
         cbp = (cbpc & 3) | (cbpy << 2);
         if (dquant) {
cdb4e730
             h263_decode_dquant(s);
fcfee63b
         }
 
8a36717a
         /* decode each block */
         for (i = 0; i < 6; i++) {
             if (h263_decode_block(s, block[i], i, cbp&32) < 0)
                 return -1;
             cbp+=cbp;
         }
fcfee63b
     }
 end:
 
         /* per-MB end of slice check */
     {
         int v= show_bits(&s->gb, 16);
115329f1
 
fcfee63b
         if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
             v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
         }
 
         if(v==0)
             return SLICE_END;
     }
 
115329f1
     return SLICE_OK;
fcfee63b
 }
 
 int ff_mpeg4_decode_mb(MpegEncContext *s,
                       DCTELEM block[6][64])
 {
     int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
     int16_t *mot_val;
     static int8_t quant_tab[4] = { -1, -2, 1, 2 };
     const int xy= s->mb_x + s->mb_y * s->mb_stride;
115329f1
 
fcfee63b
     assert(s->h263_pred);
115329f1
 
9701840b
     if (s->pict_type == FF_P_TYPE || s->pict_type==FF_S_TYPE) {
fcfee63b
         do{
             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;
9701840b
                 if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
fcfee63b
                     s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
                     s->mcsel=1;
                     s->mv[0][0][0]= get_amv(s, 0);
                     s->mv[0][0][1]= get_amv(s, 1);
 
160d679c
                     s->mb_skipped = 0;
fcfee63b
                 }else{
                     s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
                     s->mcsel=0;
                     s->mv[0][0][0] = 0;
                     s->mv[0][0][1] = 0;
160d679c
                     s->mb_skipped = 1;
fcfee63b
                 }
                 goto end;
             }
             cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
             //fprintf(stderr, "\tCBPC: %d", cbpc);
             if (cbpc < 0){
                 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
                 return -1;
             }
         }while(cbpc == 20);
115329f1
 
dee6dde6
         s->dsp.clear_blocks(s->block[0]);
fcfee63b
         dquant = cbpc & 8;
         s->mb_intra = ((cbpc & 4) != 0);
         if (s->mb_intra) goto intra;
115329f1
 
9701840b
         if(s->pict_type==FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
fcfee63b
             s->mcsel= get_bits1(&s->gb);
         else s->mcsel= 0;
         cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1) ^ 0x0F;
115329f1
 
fcfee63b
         cbp = (cbpc & 3) | (cbpy << 2);
         if (dquant) {
554daa24
             ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
fcfee63b
         }
4d2858de
         if((!s->progressive_sequence) && (cbp || (s->workaround_bugs&FF_BUG_XVID_ILACE)))
fd7db0fd
             s->interlaced_dct= get_bits1(&s->gb);
115329f1
 
de6d9b64
         s->mv_dir = MV_DIR_FORWARD;
         if ((cbpc & 16) == 0) {
fd7db0fd
             if(s->mcsel){
7bc9090a
                 s->current_picture.mb_type[xy]= MB_TYPE_GMC | MB_TYPE_16x16 | MB_TYPE_L0;
fd7db0fd
                 /* 16x16 global motion prediction */
                 s->mv_type = MV_TYPE_16X16;
073b013d
                 mx= get_amv(s, 0);
                 my= get_amv(s, 1);
fd7db0fd
                 s->mv[0][0][0] = mx;
                 s->mv[0][0][1] = my;
             }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
115329f1
                 s->current_picture.mb_type[xy]= MB_TYPE_16x8 | MB_TYPE_L0 | MB_TYPE_INTERLACED;
fd7db0fd
                 /* 16x8 field motion prediction */
                 s->mv_type= MV_TYPE_FIELD;
 
                 s->field_select[0][0]= get_bits1(&s->gb);
                 s->field_select[0][1]= get_bits1(&s->gb);
 
137c8468
                 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
115329f1
 
fd7db0fd
                 for(i=0; i<2; i++){
                     mx = h263_decode_motion(s, pred_x, s->f_code);
                     if (mx >= 0xffff)
                         return -1;
115329f1
 
fd7db0fd
                     my = h263_decode_motion(s, pred_y/2, s->f_code);
                     if (my >= 0xffff)
                         return -1;
 
                     s->mv[0][i][0] = mx;
b9d2bb5b
                     s->mv[0][i][1] = my;
14ae07d8
                 }
fd7db0fd
             }else{
115329f1
                 s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
fd7db0fd
                 /* 16x16 motion prediction */
                 s->mv_type = MV_TYPE_16X16;
137c8468
                 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
fcfee63b
                 mx = h263_decode_motion(s, pred_x, s->f_code);
115329f1
 
fd7db0fd
                 if (mx >= 0xffff)
                     return -1;
115329f1
 
fcfee63b
                 my = h263_decode_motion(s, pred_y, s->f_code);
115329f1
 
fd7db0fd
                 if (my >= 0xffff)
                     return -1;
                 s->mv[0][0][0] = mx;
                 s->mv[0][0][1] = my;
44eb4951
             }
de6d9b64
         } else {
115329f1
             s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
de6d9b64
             s->mv_type = MV_TYPE_8X8;
             for(i=0;i<4;i++) {
137c8468
                 mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
fcfee63b
                 mx = h263_decode_motion(s, pred_x, s->f_code);
de6d9b64
                 if (mx >= 0xffff)
                     return -1;
115329f1
 
fcfee63b
                 my = h263_decode_motion(s, pred_y, s->f_code);
de6d9b64
                 if (my >= 0xffff)
                     return -1;
                 s->mv[0][i][0] = mx;
                 s->mv[0][i][1] = my;
                 mot_val[0] = mx;
                 mot_val[1] = my;
             }
         }
9701840b
     } else if(s->pict_type==FF_B_TYPE) {
6f91bcd1
         int modb1; // first bit of modb
         int modb2; // second bit of modb
         int mb_type;
 
         s->mb_intra = 0; //B-frames never contain intra blocks
         s->mcsel=0;      //     ...               true gmc blocks
 
         if(s->mb_x==0){
a172cae6
             for(i=0; i<2; i++){
115329f1
                 s->last_mv[i][0][0]=
                 s->last_mv[i][0][1]=
                 s->last_mv[i][1][0]=
a172cae6
                 s->last_mv[i][1][1]= 0;
             }
6f91bcd1
         }
 
         /* if we skipped it in the future P Frame than skip it now too */
160d679c
         s->mb_skipped= s->next_picture.mbskip_table[s->mb_y * s->mb_stride + s->mb_x]; // Note, skiptab=0 if last was GMC
6f91bcd1
 
160d679c
         if(s->mb_skipped){
6f91bcd1
                 /* skip mb */
             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->mv[1][0][0] = 0;
             s->mv[1][0][1] = 0;
115329f1
             s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
4d2858de
             goto end;
6f91bcd1
         }
 
115329f1
         modb1= get_bits1(&s->gb);
fc97db64
         if(modb1){
7bc9090a
             mb_type= MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1; //like MB_TYPE_B_DIRECT but no vectors coded
fc97db64
             cbp=0;
         }else{
6f91bcd1
             modb2= get_bits1(&s->gb);
edcf9890
             mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
7bc9090a
             if(mb_type<0){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "illegal MB_type\n");
7bc9090a
                 return -1;
             }
             mb_type= mb_type_b_map[ mb_type ];
fc97db64
             if(modb2) cbp= 0;
dee6dde6
             else{
                 s->dsp.clear_blocks(s->block[0]);
                 cbp= get_bits(&s->gb, 6);
             }
fc97db64
 
7bc9090a
             if ((!IS_DIRECT(mb_type)) && cbp) {
6f91bcd1
                 if(get_bits1(&s->gb)){
554daa24
                     ff_set_qscale(s, s->qscale + get_bits1(&s->gb)*4 - 2);
6f91bcd1
                 }
             }
bea669e5
 
             if(!s->progressive_sequence){
                 if(cbp)
                     s->interlaced_dct= get_bits1(&s->gb);
 
7bc9090a
                 if(!IS_DIRECT(mb_type) && get_bits1(&s->gb)){
                     mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
                     mb_type &= ~MB_TYPE_16x16;
e3bd83f8
 
7bc9090a
                     if(USES_LIST(mb_type, 0)){
e3bd83f8
                         s->field_select[0][0]= get_bits1(&s->gb);
                         s->field_select[0][1]= get_bits1(&s->gb);
                     }
7bc9090a
                     if(USES_LIST(mb_type, 1)){
e3bd83f8
                         s->field_select[1][0]= get_bits1(&s->gb);
                         s->field_select[1][1]= get_bits1(&s->gb);
                     }
                 }
bea669e5
             }
 
e3bd83f8
             s->mv_dir = 0;
7bc9090a
             if((mb_type & (MB_TYPE_DIRECT2|MB_TYPE_INTERLACED)) == 0){
fc97db64
                 s->mv_type= MV_TYPE_16X16;
7bc9090a
 
                 if(USES_LIST(mb_type, 0)){
fc97db64
                     s->mv_dir = MV_DIR_FORWARD;
 
                     mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
                     my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
                     s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->mv[0][0][0] = mx;
                     s->last_mv[0][1][1]= s->last_mv[0][0][1]= s->mv[0][0][1] = my;
e3bd83f8
                 }
115329f1
 
7bc9090a
                 if(USES_LIST(mb_type, 1)){
fc97db64
                     s->mv_dir |= MV_DIR_BACKWARD;
 
                     mx = h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
                     my = h263_decode_motion(s, s->last_mv[1][0][1], s->b_code);
                     s->last_mv[1][1][0]= s->last_mv[1][0][0]= s->mv[1][0][0] = mx;
                     s->last_mv[1][1][1]= s->last_mv[1][0][1]= s->mv[1][0][1] = my;
                 }
7bc9090a
             }else if(!IS_DIRECT(mb_type)){
fc97db64
                 s->mv_type= MV_TYPE_FIELD;
e3bd83f8
 
7bc9090a
                 if(USES_LIST(mb_type, 0)){
fc97db64
                     s->mv_dir = MV_DIR_FORWARD;
115329f1
 
fc97db64
                     for(i=0; i<2; i++){
                         mx = h263_decode_motion(s, s->last_mv[0][i][0]  , s->f_code);
                         my = h263_decode_motion(s, s->last_mv[0][i][1]/2, s->f_code);
                         s->last_mv[0][i][0]=  s->mv[0][i][0] = mx;
                         s->last_mv[0][i][1]= (s->mv[0][i][1] = my)*2;
                     }
e3bd83f8
                 }
115329f1
 
7bc9090a
                 if(USES_LIST(mb_type, 1)){
fc97db64
                     s->mv_dir |= MV_DIR_BACKWARD;
 
                     for(i=0; i<2; i++){
                         mx = h263_decode_motion(s, s->last_mv[1][i][0]  , s->b_code);
                         my = h263_decode_motion(s, s->last_mv[1][i][1]/2, s->b_code);
                         s->last_mv[1][i][0]=  s->mv[1][i][0] = mx;
                         s->last_mv[1][i][1]= (s->mv[1][i][1] = my)*2;
                     }
bea669e5
                 }
             }
         }
115329f1
 
7bc9090a
         if(IS_DIRECT(mb_type)){
             if(IS_SKIP(mb_type))
fc97db64
                 mx=my=0;
             else{
                 mx = h263_decode_motion(s, 0, 1);
                 my = h263_decode_motion(s, 0, 1);
             }
115329f1
 
6f91bcd1
             s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
7bc9090a
             mb_type |= ff_mpeg4_set_direct_mv(s, mx, my);
6f91bcd1
         }
7bc9090a
         s->current_picture.mb_type[xy]= mb_type;
6f91bcd1
     } else { /* I-Frame */
7af75e6c
         do{
             cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
             if (cbpc < 0){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
7af75e6c
                 return -1;
             }
         }while(cbpc == 8);
 
6f91bcd1
         dquant = cbpc & 4;
         s->mb_intra = 1;
 intra:
fcfee63b
         s->ac_pred = get_bits1(&s->gb);
         if(s->ac_pred)
             s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
         else
             s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
115329f1
 
edcf9890
         cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
7af75e6c
         if(cbpy<0){
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
7af75e6c
             return -1;
         }
de6d9b64
         cbp = (cbpc & 3) | (cbpy << 2);
7f12a978
 
         s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold;
 
de6d9b64
         if (dquant) {
554daa24
             ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]);
de6d9b64
         }
115329f1
 
fd7db0fd
         if(!s->progressive_sequence)
             s->interlaced_dct= get_bits1(&s->gb);
3e6a20a0
 
dee6dde6
         s->dsp.clear_blocks(s->block[0]);
3e6a20a0
         /* decode each block */
fcfee63b
         for (i = 0; i < 6; i++) {
             if (mpeg4_decode_block(s, block[i], i, cbp&32, 1, 0) < 0)
                 return -1;
             cbp+=cbp;
3e6a20a0
         }
4d2858de
         goto end;
de6d9b64
     }
 
     /* decode each block */
fcfee63b
     for (i = 0; i < 6; i++) {
         if (mpeg4_decode_block(s, block[i], i, cbp&32, 0, 0) < 0)
             return -1;
         cbp+=cbp;
de6d9b64
     }
4d2858de
 end:
 
         /* per-MB end of slice check */
     if(s->codec_id==CODEC_ID_MPEG4){
         if(mpeg4_is_resync(s)){
7bc9090a
             const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1;
9701840b
             if(s->pict_type==FF_B_TYPE && s->next_picture.mbskip_table[xy + delta])
4d2858de
                 return SLICE_OK;
             return SLICE_END;
         }
     }
 
115329f1
     return SLICE_OK;
de6d9b64
 }
 
6f91bcd1
 static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
de6d9b64
 {
66370d3f
     int code, val, sign, shift, l;
edcf9890
     code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
de6d9b64
 
     if (code == 0)
         return pred;
7bc9090a
     if (code < 0)
         return 0xffff;
2ad1516a
 
612476ef
     sign = get_bits1(&s->gb);
6f91bcd1
     shift = f_code - 1;
05858889
     val = code;
     if (shift) {
         val = (val - 1) << shift;
de6d9b64
         val |= get_bits(&s->gb, shift);
05858889
         val++;
     }
de6d9b64
     if (sign)
         val = -val;
     val += pred;
dd536160
 
de6d9b64
     /* modulo decoding */
     if (!s->h263_long_vectors) {
0ff93477
         l = INT_BIT - 5 - f_code;
         val = (val<<l)>>l;
de6d9b64
     } else {
         /* horrible h263 long vector mode */
         if (pred < -31 && val < -63)
             val += 64;
         if (pred > 32 && val > 63)
             val -= 64;
115329f1
 
de6d9b64
     }
     return val;
 }
 
6dbd39fe
 /* Decodes RVLC of H.263+ UMV */
 static int h263p_decode_umotion(MpegEncContext * s, int pred)
 {
    int code = 0, sign;
115329f1
 
6dbd39fe
    if (get_bits1(&s->gb)) /* Motion difference = 0 */
       return pred;
115329f1
 
6dbd39fe
    code = 2 + get_bits1(&s->gb);
115329f1
 
6dbd39fe
    while (get_bits1(&s->gb))
    {
       code <<= 1;
       code += get_bits1(&s->gb);
    }
    sign = code & 1;
    code >>= 1;
115329f1
 
6dbd39fe
    code = (sign) ? (pred - code) : (pred + code);
 #ifdef DEBUG
95ae72b7
    av_log( s->avctx, AV_LOG_DEBUG,"H.263+ UMV Motion = %d\n", code);
6dbd39fe
 #endif
115329f1
    return code;
6dbd39fe
 
 }
 
de6d9b64
 static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
                              int n, int coded)
 {
     int code, level, i, j, last, run;
     RLTable *rl = &rl_inter;
0c1a9eda
     const uint8_t *scan_table;
dba019da
     GetBitContext gb= s->gb;
de6d9b64
 
2ad1516a
     scan_table = s->intra_scantable.permutated;
9e15ad28
     if (s->h263_aic && s->mb_intra) {
d140623f
         rl = &rl_intra_aic;
         i = 0;
         if (s->ac_pred) {
115329f1
             if (s->h263_aic_dir)
2ad1516a
                 scan_table = s->intra_v_scantable.permutated; /* left */
d140623f
             else
2ad1516a
                 scan_table = s->intra_h_scantable.permutated; /* top */
d140623f
         }
     } else if (s->mb_intra) {
         /* DC coef */
43dc0bfd
         if(s->codec_id == CODEC_ID_RV10){
b250f9c6
 #if CONFIG_RV10_DECODER
9701840b
           if (s->rv10_version == 3 && s->pict_type == FF_I_TYPE) {
de6d9b64
             int component, diff;
             component = (n <= 3 ? 0 : n - 4 + 1);
             level = s->last_dc[component];
             if (s->rv10_first_dc_coded[component]) {
                 diff = rv_decode_dc(s, n);
                 if (diff == 0xffff)
                     return -1;
                 level += diff;
                 level = level & 0xff; /* handle wrap round */
                 s->last_dc[component] = level;
             } else {
                 s->rv10_first_dc_coded[component] = 1;
             }
17938602
           } else {
                 level = get_bits(&s->gb, 8);
49f3806d
                 if (level == 255)
                     level = 128;
17938602
           }
8b975b7c
 #endif
17938602
         }else{
de6d9b64
             level = get_bits(&s->gb, 8);
e51d6d27
             if((level&0x7F) == 0){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
047599a4
                 if(s->error_recognition >= FF_ER_COMPLIANT)
403f1099
                     return -1;
e51d6d27
             }
de6d9b64
             if (level == 255)
                 level = 128;
         }
         block[0] = level;
d140623f
         i = 1;
de6d9b64
     } else {
d140623f
         i = 0;
de6d9b64
     }
     if (!coded) {
9e15ad28
         if (s->mb_intra && s->h263_aic)
             goto not_coded;
de6d9b64
         s->block_last_index[n] = i - 1;
         return 0;
     }
dba019da
 retry:
de6d9b64
     for(;;) {
edcf9890
         code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
4d2858de
         if (code < 0){
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
de6d9b64
             return -1;
4d2858de
         }
de6d9b64
         if (code == rl->n) {
             /* escape */
d4f5d74a
             if (s->h263_flv > 1) {
                 int is11 = get_bits1(&s->gb);
                 last = get_bits1(&s->gb);
                 run = get_bits(&s->gb, 6);
                 if(is11){
e4748d63
                     level = get_sbits(&s->gb, 11);
d4f5d74a
                 } else {
e4748d63
                     level = get_sbits(&s->gb, 7);
d4f5d74a
                 }
             } else {
                 last = get_bits1(&s->gb);
                 run = get_bits(&s->gb, 6);
                 level = (int8_t)get_bits(&s->gb, 8);
                 if(level == -128){
43dc0bfd
                     if (s->codec_id == CODEC_ID_RV10) {
d4f5d74a
                         /* XXX: should patch encoder too */
                         level = get_sbits(&s->gb, 12);
                     }else{
                         level = get_bits(&s->gb, 5);
                         level |= get_sbits(&s->gb, 6)<<5;
                     }
e51d6d27
                 }
de6d9b64
             }
         } else {
             run = rl->table_run[code];
             level = rl->table_level[code];
             last = code >= rl->last;
612476ef
             if (get_bits1(&s->gb))
de6d9b64
                 level = -level;
         }
         i += run;
4d2858de
         if (i >= 64){
dba019da
             if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){
90b5b51e
                 //Looks like a hack but no, it's the way it is supposed to work ...
dba019da
                 rl = &rl_intra_aic;
                 i = 0;
                 s->gb= gb;
5fecfb7d
                 s->dsp.clear_block(block);
dba019da
                 goto retry;
             }
2d2651f8
             av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
de6d9b64
             return -1;
4d2858de
         }
d140623f
         j = scan_table[i];
de6d9b64
         block[j] = level;
         if (last)
             break;
         i++;
     }
115329f1
 not_coded:
9e15ad28
     if (s->mb_intra && s->h263_aic) {
         h263_pred_acdc(s, block, n);
d6231b9e
         i = 63;
d140623f
     }
de6d9b64
     s->block_last_index[n] = i;
     return 0;
 }
 
2ba8f6b8
 /**
  * decodes the dc value.
  * @param n block index (0-3 are luma, 4-5 are chroma)
  * @param dir_ptr the prediction direction will be stored here
  * @return the quantized dc
  */
92073d01
 static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
de6d9b64
 {
a7137a04
     int level, code;
de6d9b64
 
115329f1
     if (n < 4)
edcf9890
         code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
115329f1
     else
edcf9890
         code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
92073d01
     if (code < 0 || code > 9 /* && s->nbit<9 */){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
de6d9b64
         return -1;
92073d01
     }
de6d9b64
     if (code == 0) {
         level = 0;
     } else {
6d71b382
         if(IS_3IV1){
             if(code==1)
                 level= 2*get_bits1(&s->gb)-1;
             else{
                 if(get_bits1(&s->gb))
                     level = get_bits(&s->gb, code-1) + (1<<(code-1));
                 else
                     level = -get_bits(&s->gb, code-1) - (1<<(code-1));
             }
         }else{
             level = get_xbits(&s->gb, code);
         }
 
92073d01
         if (code > 8){
             if(get_bits1(&s->gb)==0){ /* marker */
047599a4
                 if(s->error_recognition>=2){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n");
4d2858de
                     return -1;
                 }
92073d01
             }
         }
de6d9b64
     }
a7137a04
 
     return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0);
de6d9b64
 }
 
92073d01
 /**
4d2858de
  * decodes a block.
d9526386
  * @return <0 if an error occurred
92073d01
  */
 static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
a4e8b587
                               int n, int coded, int intra, int rvlc)
de6d9b64
 {
c03a7172
     int level, i, last, run;
3485b9cd
     int dc_pred_dir;
3e6a20a0
     RLTable * rl;
     RL_VLC_ELEM * rl_vlc;
0c1a9eda
     const uint8_t * scan_table;
c03a7172
     int qmul, qadd;
de6d9b64
 
a4e8b587
     //Note intra & rvlc should be optimized away if this is inlined
115329f1
 
3e6a20a0
     if(intra) {
7f12a978
       if(s->use_intra_dc_vlc){
bb270c08
         /* DC coef */
4d2858de
         if(s->partitioned_frame){
92073d01
             level = s->dc_val[0][ s->block_index[n] ];
d4961b35
             if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale);
             else    level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale);
7bc9090a
             dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32;
92073d01
         }else{
             level = mpeg4_decode_dc(s, n, &dc_pred_dir);
             if (level < 0)
4d2858de
                 return -1;
92073d01
         }
de6d9b64
         block[0] = level;
c03a7172
         i = 0;
34790165
       }else{
             i = -1;
cb666260
             ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0);
115329f1
       }
d83085cd
       if (!coded)
           goto not_coded;
115329f1
 
d83085cd
       if(rvlc){
           rl = &rvlc_rl_intra;
           rl_vlc = rvlc_rl_intra.rl_vlc[0];
       }else{
           rl = &rl_intra;
           rl_vlc = rl_intra.rl_vlc[0];
       }
       if (s->ac_pred) {
           if (dc_pred_dir == 0)
               scan_table = s->intra_v_scantable.permutated; /* left */
           else
               scan_table = s->intra_h_scantable.permutated; /* top */
       } else {
2ad1516a
             scan_table = s->intra_scantable.permutated;
d83085cd
       }
       qmul=1;
       qadd=0;
de6d9b64
     } else {
c03a7172
         i = -1;
de6d9b64
         if (!coded) {
c03a7172
             s->block_last_index[n] = i;
de6d9b64
             return 0;
         }
a4e8b587
         if(rvlc) rl = &rvlc_rl_inter;
         else     rl = &rl_inter;
115329f1
 
3a3d3a42
         scan_table = s->intra_scantable.permutated;
b9d2bb5b
 
d930ef19
         if(s->mpeg_quant){
             qmul=1;
             qadd=0;
115329f1
             if(rvlc){
                 rl_vlc = rvlc_rl_inter.rl_vlc[0];
a4e8b587
             }else{
115329f1
                 rl_vlc = rl_inter.rl_vlc[0];
a4e8b587
             }
d930ef19
         }else{
             qmul = s->qscale << 1;
             qadd = (s->qscale - 1) | 1;
115329f1
             if(rvlc){
                 rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale];
a4e8b587
             }else{
115329f1
                 rl_vlc = rl_inter.rl_vlc[s->qscale];
a4e8b587
             }
d930ef19
         }
de6d9b64
     }
c03a7172
   {
     OPEN_READER(re, &s->gb);
de6d9b64
     for(;;) {
c03a7172
         UPDATE_CACHE(re, &s->gb);
e91f4bf1
         GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
c03a7172
         if (level==0) {
115329f1
           /* escape */
a4e8b587
           if(rvlc){
                 if(SHOW_UBITS(re, &s->gb, 1)==0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n");
a4e8b587
                     return -1;
                 }; SKIP_CACHE(re, &s->gb, 1);
115329f1
 
a4e8b587
                 last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
                 run=   SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
                 SKIP_COUNTER(re, &s->gb, 1+1+6);
                 UPDATE_CACHE(re, &s->gb);
115329f1
 
a4e8b587
                 if(SHOW_UBITS(re, &s->gb, 1)==0){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n");
a4e8b587
                     return -1;
                 }; SKIP_CACHE(re, &s->gb, 1);
115329f1
 
a4e8b587
                 level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11);
115329f1
 
a4e8b587
                 if(SHOW_UBITS(re, &s->gb, 5)!=0x10){
9b879566
                     av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n");
a4e8b587
                     return -1;
                 }; SKIP_CACHE(re, &s->gb, 5);
 
                 level=  level * qmul + qadd;
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1);
                 SKIP_COUNTER(re, &s->gb, 1+11+5+1);
 
                 i+= run + 1;
6d71b382
                 if(last) i+=192;
a4e8b587
           }else{
c03a7172
             int cache;
             cache= GET_CACHE(re, &s->gb);
6d71b382
 
115329f1
             if(IS_3IV1)
6d71b382
                 cache ^= 0xC0000000;
 
c03a7172
             if (cache&0x80000000) {
                 if (cache&0x40000000) {
de6d9b64
                     /* third escape */
c03a7172
                     SKIP_CACHE(re, &s->gb, 2);
                     last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
                     run=   SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6);
                     SKIP_COUNTER(re, &s->gb, 2+1+6);
                     UPDATE_CACHE(re, &s->gb);
 
6d71b382
                     if(IS_3IV1){
                         level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12);
                     }else{
                         if(SHOW_UBITS(re, &s->gb, 1)==0){
9b879566
                             av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n");
6d71b382
                             return -1;
                         }; SKIP_CACHE(re, &s->gb, 1);
 
                         level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12);
 
                         if(SHOW_UBITS(re, &s->gb, 1)==0){
9b879566
                             av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n");
6d71b382
                             return -1;
                         }; LAST_SKIP_CACHE(re, &s->gb, 1);
 
                         SKIP_COUNTER(re, &s->gb, 1+12+1);
                     }
115329f1
 
ac0c6638
 #if 0
047599a4
                     if(s->error_recognition >= FF_ER_COMPLIANT){
c26abfa5
                         const int abs_level= FFABS(level);
ac0c6638
                         if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
8f8402e4
                             const int run1= run - rl->max_run[last][abs_level] - 1;
92073d01
                             if(abs_level <= rl->max_level[last][run]){
9b879566
                                 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
4d2858de
                                 return -1;
92073d01
                             }
047599a4
                             if(s->error_recognition > FF_ER_COMPLIANT){
ce3bcaed
                                 if(abs_level <= rl->max_level[last][run]*2){
95ae72b7
                                     av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
ce3bcaed
                                     return -1;
                                 }
                                 if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
95ae72b7
                                     av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
ce3bcaed
                                     return -1;
                                 }
92073d01
                             }
                         }
                     }
 #endif
bb270c08
                     if (level>0) level= level * qmul + qadd;
c03a7172
                     else         level= level * qmul - qadd;
 
caacc47f
                     if((unsigned)(level + 2048) > 4095){
047599a4
                         if(s->error_recognition > FF_ER_COMPLIANT){
caacc47f
                             if(level > 2560 || level<-2560){
                                 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
                                 return -1;
                             }
                         }
                         level= level<0 ? -2048 : 2047;
                     }
 
c03a7172
                     i+= run + 1;
                     if(last) i+=192;
de6d9b64
                 } else {
                     /* second escape */
c03a7172
 #if MIN_CACHE_BITS < 20
                     LAST_SKIP_BITS(re, &s->gb, 2);
                     UPDATE_CACHE(re, &s->gb);
 #else
                     SKIP_BITS(re, &s->gb, 2);
 #endif
e91f4bf1
                     GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
c03a7172
                     i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing
                     level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
                     LAST_SKIP_BITS(re, &s->gb, 1);
de6d9b64
                 }
             } else {
                 /* first escape */
c03a7172
 #if MIN_CACHE_BITS < 19
                 LAST_SKIP_BITS(re, &s->gb, 1);
                 UPDATE_CACHE(re, &s->gb);
 #else
                 SKIP_BITS(re, &s->gb, 1);
 #endif
e91f4bf1
                 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
c03a7172
                 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);
de6d9b64
             }
a4e8b587
           }
de6d9b64
         } else {
c03a7172
             i+= run;
             level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
             LAST_SKIP_BITS(re, &s->gb, 1);
         }
         if (i > 62){
             i-= 192;
             if(i&(~63)){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
4d2858de
                 return -1;
c03a7172
             }
 
             block[scan_table[i]] = level;
de6d9b64
             break;
c03a7172
         }
 
         block[scan_table[i]] = level;
de6d9b64
     }
c03a7172
     CLOSE_READER(re, &s->gb);
   }
de6d9b64
  not_coded:
34790165
     if (intra) {
7f12a978
         if(!s->use_intra_dc_vlc){
a7137a04
             block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0);
115329f1
 
9e801ee2
             i -= i>>31; //if(i == -1) i=0;
34790165
         }
 
de6d9b64
         mpeg4_pred_ac(s, block, n, dc_pred_dir);
         if (s->ac_pred) {
c03a7172
             i = 63; /* XXX: not optimal */
de6d9b64
         }
     }
c03a7172
     s->block_last_index[n] = i;
de6d9b64
     return 0;
 }
 
 /* most is hardcoded. should extend to handle all h263 streams */
 int h263_decode_picture_header(MpegEncContext *s)
 {
d07f9043
     int format, width, height, i;
     uint32_t startcode;
115329f1
 
d07f9043
     align_get_bits(&s->gb);
 
     startcode= get_bits(&s->gb, 22-8);
de6d9b64
 
ffba1dc0
     for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
d07f9043
         startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
115329f1
 
d07f9043
         if(startcode == 0x20)
             break;
     }
115329f1
 
d07f9043
     if (startcode != 0x20) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
de6d9b64
         return -1;
1e209222
     }
     /* temporal reference */
e82d912d
     i = get_bits(&s->gb, 8); /* picture timestamp */
     if( (s->picture_number&~0xFF)+i < s->picture_number)
         i+= 256;
0f884070
     s->current_picture_ptr->pts=
e82d912d
     s->picture_number= (s->picture_number&~0xFF) + i;
1e209222
 
115329f1
     /* PTYPE starts here */
1e209222
     if (get_bits1(&s->gb) != 1) {
         /* marker */
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
1e209222
         return -1;
     }
     if (get_bits1(&s->gb) != 0) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
bb270c08
         return -1;      /* h263 id */
1e209222
     }
bb270c08
     skip_bits1(&s->gb);         /* split screen off */
     skip_bits1(&s->gb);         /* camera  off */
     skip_bits1(&s->gb);         /* freeze picture release off */
de6d9b64
 
     format = get_bits(&s->gb, 3);
1e209222
     /*
         0    forbidden
         1    sub-QCIF
         10   QCIF
bb270c08
         7       extended PTYPE (PLUSPTYPE)
1e209222
     */
de6d9b64
 
96815ce9
     if (format != 7 && format != 6) {
de6d9b64
         s->h263_plus = 0;
         /* H.263v1 */
         width = h263_format[format][0];
         height = h263_format[format][1];
         if (!width)
             return -1;
115329f1
 
9701840b
         s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
de6d9b64
 
115329f1
         s->h263_long_vectors = get_bits1(&s->gb);
de6d9b64
 
1e209222
         if (get_bits1(&s->gb) != 0) {
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
bb270c08
             return -1; /* SAC: off */
1e209222
         }
f7190f73
         s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
         s->unrestricted_mv = s->h263_long_vectors || s->obmc;
115329f1
 
1e209222
         if (get_bits1(&s->gb) != 0) {
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "H263 PB frame not supported\n");
bb270c08
             return -1; /* not PB frame */
1e209222
         }
332f9ac4
         s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
bb270c08
         skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
ffba1dc0
 
         s->width = width;
         s->height = height;
e82d912d
         s->avctx->sample_aspect_ratio= (AVRational){12,11};
c0df9d75
         s->avctx->time_base= (AVRational){1001, 30000};
de6d9b64
     } else {
96815ce9
         int ufep;
115329f1
 
de6d9b64
         /* H.263v2 */
96815ce9
         s->h263_plus = 1;
         ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
1e209222
 
115329f1
         /* ufep other than 0 and 1 are reserved */
96815ce9
         if (ufep == 1) {
115329f1
             /* OPPTYPE */
96815ce9
             format = get_bits(&s->gb, 3);
318c5e05
             dprintf(s->avctx, "ufep=1, format: %d\n", format);
b056e73c
             s->custom_pcf= get_bits1(&s->gb);
5fc32c27
             s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
d07f9043
             if (get_bits1(&s->gb) != 0) {
332f9ac4
                 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
d07f9043
             }
332f9ac4
             s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
             s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
             s->loop_filter= get_bits1(&s->gb);
             s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
115329f1
 
ba58dabc
             s->h263_slice_structured= get_bits1(&s->gb);
d07f9043
             if (get_bits1(&s->gb) != 0) {
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
d07f9043
             }
             if (get_bits1(&s->gb) != 0) {
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
d07f9043
             }
dba019da
             s->alt_inter_vlc= get_bits1(&s->gb);
68b94c35
             s->modified_quant= get_bits1(&s->gb);
332f9ac4
             if(s->modified_quant)
                 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
115329f1
 
d07f9043
             skip_bits(&s->gb, 1); /* Prevent start code emulation */
1e209222
 
96815ce9
             skip_bits(&s->gb, 3); /* Reserved */
1e209222
         } else if (ufep != 0) {
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
96815ce9
             return -1;
1e209222
         }
115329f1
 
6dbd39fe
         /* MPPTYPE */
b40cd4e0
         s->pict_type = get_bits(&s->gb, 3);
         switch(s->pict_type){
9701840b
         case 0: s->pict_type= FF_I_TYPE;break;
         case 1: s->pict_type= FF_P_TYPE;break;
         case 3: s->pict_type= FF_B_TYPE;break;
         case 7: s->pict_type= FF_I_TYPE;break; //ZYGO
b40cd4e0
         default:
de6d9b64
             return -1;
b40cd4e0
         }
e7774f11
         skip_bits(&s->gb, 2);
         s->no_rounding = get_bits1(&s->gb);
         skip_bits(&s->gb, 4);
115329f1
 
6dbd39fe
         /* Get the picture dimensions */
96815ce9
         if (ufep) {
             if (format == 6) {
                 /* Custom Picture Format (CPFMT) */
1e209222
                 s->aspect_ratio_info = get_bits(&s->gb, 4);
318c5e05
                 dprintf(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
1e209222
                 /* aspect ratios:
                 0 - forbidden
                 1 - 1:1
                 2 - 12:11 (CIF 4:3)
                 3 - 10:11 (525-type 4:3)
                 4 - 16:11 (CIF 16:9)
                 5 - 40:33 (525-type 16:9)
                 6-14 - reserved
                 */
96815ce9
                 width = (get_bits(&s->gb, 9) + 1) * 4;
                 skip_bits1(&s->gb);
                 height = get_bits(&s->gb, 9) * 4;
318c5e05
                 dprintf(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
050fe8ba
                 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
1e209222
                     /* aspected dimensions */
5ff85f1d
                     s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
                     s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
58b0b0dd
                 }else{
5ff85f1d
                     s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
1e209222
                 }
             } else {
96815ce9
                 width = h263_format[format][0];
                 height = h263_format[format][1];
e82d912d
                 s->avctx->sample_aspect_ratio= (AVRational){12,11};
96815ce9
             }
             if ((width == 0) || (height == 0))
                 return -1;
             s->width = width;
             s->height = height;
b056e73c
 
             if(s->custom_pcf){
                 int gcd;
c0df9d75
                 s->avctx->time_base.den= 1800000;
                 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
                 s->avctx->time_base.num*= get_bits(&s->gb, 7);
                 if(s->avctx->time_base.num == 0){
b056e73c
                     av_log(s, AV_LOG_ERROR, "zero framerate\n");
                     return -1;
                 }
9ce6c138
                 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
c0df9d75
                 s->avctx->time_base.den /= gcd;
                 s->avctx->time_base.num /= gcd;
 //                av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->time_base.den, s->avctx->time_base.num);
b056e73c
             }else{
c0df9d75
                 s->avctx->time_base= (AVRational){1001, 30000};
b056e73c
             }
         }
115329f1
 
b056e73c
         if(s->custom_pcf){
             skip_bits(&s->gb, 2); //extended Temporal reference
         }
 
         if (ufep) {
e51d6d27
             if (s->umvplus) {
                 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
115329f1
                     skip_bits1(&s->gb);
96815ce9
             }
ba58dabc
             if(s->h263_slice_structured){
                 if (get_bits1(&s->gb) != 0) {
                     av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
                 }
                 if (get_bits1(&s->gb) != 0) {
                     av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
                 }
             }
6dbd39fe
         }
115329f1
 
de6d9b64
         s->qscale = get_bits(&s->gb, 5);
     }
0ed714a7
 
204b5c9e
     s->mb_width = (s->width  + 15) / 16;
     s->mb_height = (s->height  + 15) / 16;
     s->mb_num = s->mb_width * s->mb_height;
 
de6d9b64
     /* PEI */
612476ef
     while (get_bits1(&s->gb) != 0) {
         skip_bits(&s->gb, 8);
de6d9b64
     }
204b5c9e
 
0ed714a7
     if(s->h263_slice_structured){
         if (get_bits1(&s->gb) != 1) {
             av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
             return -1;
         }
 
         ff_h263_decode_mba(s);
 
         if (get_bits1(&s->gb) != 1) {
             av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
             return -1;
         }
     }
de6d9b64
     s->f_code = 1;
115329f1
 
8f8402e4
     if(s->h263_aic){
115329f1
          s->y_dc_scale_table=
68b94c35
          s->c_dc_scale_table= ff_aic_dc_scale_table;
8f8402e4
     }else{
         s->y_dc_scale_table=
         s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
     }
 
d07f9043
      if(s->avctx->debug&FF_DEBUG_PICT_INFO){
1be7c87f
         show_pict_info(s);
d07f9043
      }
9df1d249
 #if 1
2bb6eba2
     if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){
9df1d249
         int i,j;
9b879566
         for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
         av_log(s->avctx, AV_LOG_DEBUG, "\n");
9df1d249
         for(i=0; i<13; i++){
             for(j=0; j<3; j++){
                 int v= get_bits(&s->gb, 8);
                 v |= get_sbits(&s->gb, 8)<<8;
9b879566
                 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
9df1d249
             }
9b879566
             av_log(s->avctx, AV_LOG_DEBUG, "\n");
9df1d249
         }
9b879566
         for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
9df1d249
     }
 #endif
d07f9043
 
de6d9b64
     return 0;
 }
 
3f9d89c6
 static void mpeg4_decode_sprite_trajectory(MpegEncContext * s, GetBitContext *gb)
73c8e514
 {
     int i;
     int a= 2<<s->sprite_warping_accuracy;
     int rho= 3-s->sprite_warping_accuracy;
     int r=16/a;
     const int vop_ref[4][2]= {{0,0}, {s->width,0}, {0, s->height}, {s->width, s->height}}; // only true for rectangle shapes
     int d[4][2]={{0,0}, {0,0}, {0,0}, {0,0}};
     int sprite_ref[4][2];
     int virtual_ref[2][2];
073b013d
     int w2, h2, w3, h3;
73c8e514
     int alpha=0, beta=0;
     int w= s->width;
     int h= s->height;
073b013d
     int min_ab;
 
73c8e514
     for(i=0; i<s->num_sprite_warping_points; i++){
         int length;
         int x=0, y=0;
 
946c1130
         length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
73c8e514
         if(length){
3f9d89c6
             x= get_xbits(gb, length);
73c8e514
         }
3f9d89c6
         if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(gb); /* marker bit */
115329f1
 
946c1130
         length= get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);
73c8e514
         if(length){
3f9d89c6
             y=get_xbits(gb, length);
73c8e514
         }
3f9d89c6
         skip_bits1(gb); /* marker bit */
44eb4951
 //printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
73c8e514
         d[i][0]= x;
         d[i][1]= y;
     }
 
     while((1<<alpha)<w) alpha++;
     while((1<<beta )<h) beta++; // there seems to be a typo in the mpeg4 std for the definition of w' and h'
     w2= 1<<alpha;
     h2= 1<<beta;
 
893bc624
 // Note, the 4th point isn't used for GMC
6f91bcd1
     if(s->divx_version==500 && s->divx_build==413){
         sprite_ref[0][0]= a*vop_ref[0][0] + d[0][0];
         sprite_ref[0][1]= a*vop_ref[0][1] + d[0][1];
         sprite_ref[1][0]= a*vop_ref[1][0] + d[0][0] + d[1][0];
         sprite_ref[1][1]= a*vop_ref[1][1] + d[0][1] + d[1][1];
         sprite_ref[2][0]= a*vop_ref[2][0] + d[0][0] + d[2][0];
         sprite_ref[2][1]= a*vop_ref[2][1] + d[0][1] + d[2][1];
     } else {
         sprite_ref[0][0]= (a>>1)*(2*vop_ref[0][0] + d[0][0]);
         sprite_ref[0][1]= (a>>1)*(2*vop_ref[0][1] + d[0][1]);
         sprite_ref[1][0]= (a>>1)*(2*vop_ref[1][0] + d[0][0] + d[1][0]);
         sprite_ref[1][1]= (a>>1)*(2*vop_ref[1][1] + d[0][1] + d[1][1]);
         sprite_ref[2][0]= (a>>1)*(2*vop_ref[2][0] + d[0][0] + d[2][0]);
         sprite_ref[2][1]= (a>>1)*(2*vop_ref[2][1] + d[0][1] + d[2][1]);
     }
73c8e514
 /*    sprite_ref[3][0]= (a>>1)*(2*vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);
     sprite_ref[3][1]= (a>>1)*(2*vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */
115329f1
 
73c8e514
 // this is mostly identical to the mpeg4 std (and is totally unreadable because of that ...)
 // perhaps it should be reordered to be more readable ...
 // the idea behind this virtual_ref mess is to be able to use shifts later per pixel instead of divides
 // so the distance between points is converted from w&h based to w2&h2 based which are of the 2^x form
115329f1
     virtual_ref[0][0]= 16*(vop_ref[0][0] + w2)
32cd20de
         + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + w2*(r*sprite_ref[1][0] - 16*vop_ref[1][0])),w);
115329f1
     virtual_ref[0][1]= 16*vop_ref[0][1]
32cd20de
         + ROUNDED_DIV(((w - w2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + w2*(r*sprite_ref[1][1] - 16*vop_ref[1][1])),w);
115329f1
     virtual_ref[1][0]= 16*vop_ref[0][0]
32cd20de
         + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][0] - 16*vop_ref[0][0]) + h2*(r*sprite_ref[2][0] - 16*vop_ref[2][0])),h);
115329f1
     virtual_ref[1][1]= 16*(vop_ref[0][1] + h2)
32cd20de
         + ROUNDED_DIV(((h - h2)*(r*sprite_ref[0][1] - 16*vop_ref[0][1]) + h2*(r*sprite_ref[2][1] - 16*vop_ref[2][1])),h);
115329f1
 
73c8e514
     switch(s->num_sprite_warping_points)
     {
         case 0:
             s->sprite_offset[0][0]= 0;
             s->sprite_offset[0][1]= 0;
             s->sprite_offset[1][0]= 0;
             s->sprite_offset[1][1]= 0;
073b013d
             s->sprite_delta[0][0]= a;
             s->sprite_delta[0][1]= 0;
             s->sprite_delta[1][0]= 0;
             s->sprite_delta[1][1]= a;
             s->sprite_shift[0]= 0;
             s->sprite_shift[1]= 0;
73c8e514
             break;
         case 1: //GMC only
             s->sprite_offset[0][0]= sprite_ref[0][0] - a*vop_ref[0][0];
             s->sprite_offset[0][1]= sprite_ref[0][1] - a*vop_ref[0][1];
             s->sprite_offset[1][0]= ((sprite_ref[0][0]>>1)|(sprite_ref[0][0]&1)) - a*(vop_ref[0][0]/2);
             s->sprite_offset[1][1]= ((sprite_ref[0][1]>>1)|(sprite_ref[0][1]&1)) - a*(vop_ref[0][1]/2);
073b013d
             s->sprite_delta[0][0]= a;
             s->sprite_delta[0][1]= 0;
             s->sprite_delta[1][0]= 0;
             s->sprite_delta[1][1]= a;
             s->sprite_shift[0]= 0;
             s->sprite_shift[1]= 0;
73c8e514
             break;
         case 2:
             s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
073b013d
                                                   + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][0])
                                                   + ( r*sprite_ref[0][1] - virtual_ref[0][1])*(-vop_ref[0][1])
                                                   + (1<<(alpha+rho-1));
73c8e514
             s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
073b013d
                                                   + (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-vop_ref[0][0])
                                                   + (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-vop_ref[0][1])
                                                   + (1<<(alpha+rho-1));
             s->sprite_offset[1][0]= ( (-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][0] + 1)
                                      +( r*sprite_ref[0][1] - virtual_ref[0][1])*(-2*vop_ref[0][1] + 1)
115329f1
                                      +2*w2*r*sprite_ref[0][0]
                                      - 16*w2
073b013d
                                      + (1<<(alpha+rho+1)));
115329f1
             s->sprite_offset[1][1]= ( (-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1)
073b013d
                                      +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
115329f1
                                      +2*w2*r*sprite_ref[0][1]
073b013d
                                      - 16*w2
                                      + (1<<(alpha+rho+1)));
             s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
             s->sprite_delta[0][1]=   (+r*sprite_ref[0][1] - virtual_ref[0][1]);
             s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1]);
             s->sprite_delta[1][1]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
115329f1
 
073b013d
             s->sprite_shift[0]= alpha+rho;
             s->sprite_shift[1]= alpha+rho+2;
73c8e514
             break;
073b013d
         case 3:
b8a78f41
             min_ab= FFMIN(alpha, beta);
073b013d
             w3= w2>>min_ab;
             h3= h2>>min_ab;
             s->sprite_offset[0][0]=  (sprite_ref[0][0]<<(alpha+beta+rho-min_ab))
                                    + (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-vop_ref[0][0])
                                    + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-vop_ref[0][1])
                                    + (1<<(alpha+beta+rho-min_ab-1));
             s->sprite_offset[0][1]=  (sprite_ref[0][1]<<(alpha+beta+rho-min_ab))
                                    + (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-vop_ref[0][0])
                                    + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-vop_ref[0][1])
                                    + (1<<(alpha+beta+rho-min_ab-1));
             s->sprite_offset[1][0]=  (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3*(-2*vop_ref[0][0] + 1)
                                    + (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3*(-2*vop_ref[0][1] + 1)
                                    + 2*w2*h3*r*sprite_ref[0][0]
                                    - 16*w2*h3
                                    + (1<<(alpha+beta+rho-min_ab+1));
             s->sprite_offset[1][1]=  (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3*(-2*vop_ref[0][0] + 1)
                                    + (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3*(-2*vop_ref[0][1] + 1)
                                    + 2*w2*h3*r*sprite_ref[0][1]
                                    - 16*w2*h3
                                    + (1<<(alpha+beta+rho-min_ab+1));
             s->sprite_delta[0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0])*h3;
             s->sprite_delta[0][1]=   (-r*sprite_ref[0][0] + virtual_ref[1][0])*w3;
             s->sprite_delta[1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1])*h3;
             s->sprite_delta[1][1]=   (-r*sprite_ref[0][1] + virtual_ref[1][1])*w3;
115329f1
 
073b013d
             s->sprite_shift[0]= alpha + beta + rho - min_ab;
             s->sprite_shift[1]= alpha + beta + rho - min_ab + 2;
73c8e514
             break;
     }
115329f1
     /* try to simplify the situation */
073b013d
     if(   s->sprite_delta[0][0] == a<<s->sprite_shift[0]
        && s->sprite_delta[0][1] == 0
        && s->sprite_delta[1][0] == 0
        && s->sprite_delta[1][1] == a<<s->sprite_shift[0])
44eb4951
     {
073b013d
         s->sprite_offset[0][0]>>=s->sprite_shift[0];
         s->sprite_offset[0][1]>>=s->sprite_shift[0];
         s->sprite_offset[1][0]>>=s->sprite_shift[1];
         s->sprite_offset[1][1]>>=s->sprite_shift[1];
         s->sprite_delta[0][0]= a;
         s->sprite_delta[0][1]= 0;
         s->sprite_delta[1][0]= 0;
         s->sprite_delta[1][1]= a;
         s->sprite_shift[0]= 0;
         s->sprite_shift[1]= 0;
44eb4951
         s->real_sprite_warping_points=1;
     }
073b013d
     else{
         int shift_y= 16 - s->sprite_shift[0];
         int shift_c= 16 - s->sprite_shift[1];
 //printf("shifts %d %d\n", shift_y, shift_c);
         for(i=0; i<2; i++){
             s->sprite_offset[0][i]<<= shift_y;
             s->sprite_offset[1][i]<<= shift_c;
             s->sprite_delta[0][i]<<= shift_y;
             s->sprite_delta[1][i]<<= shift_y;
             s->sprite_shift[i]= 16;
         }
44eb4951
         s->real_sprite_warping_points= s->num_sprite_warping_points;
073b013d
     }
 #if 0
 printf("vop:%d:%d %d:%d %d:%d, sprite:%d:%d %d:%d %d:%d, virtual: %d:%d %d:%d\n",
     vop_ref[0][0], vop_ref[0][1],
     vop_ref[1][0], vop_ref[1][1],
     vop_ref[2][0], vop_ref[2][1],
115329f1
     sprite_ref[0][0], sprite_ref[0][1],
     sprite_ref[1][0], sprite_ref[1][1],
     sprite_ref[2][0], sprite_ref[2][1],
     virtual_ref[0][0], virtual_ref[0][1],
073b013d
     virtual_ref[1][0], virtual_ref[1][1]
     );
115329f1
 
073b013d
 printf("offset: %d:%d , delta: %d %d %d %d, shift %d\n",
     s->sprite_offset[0][0], s->sprite_offset[0][1],
     s->sprite_delta[0][0], s->sprite_delta[0][1],
     s->sprite_delta[1][0], s->sprite_delta[1][1],
     s->sprite_shift[0]
     );
 #endif
73c8e514
 }
 
41773b73
 static int mpeg4_decode_gop_header(MpegEncContext * s, GetBitContext *gb){
     int hours, minutes, seconds;
 
     hours= get_bits(gb, 5);
     minutes= get_bits(gb, 6);
     skip_bits1(gb);
     seconds= get_bits(gb, 6);
 
     s->time_base= seconds + 60*(minutes + 60*hours);
 
     skip_bits1(gb);
     skip_bits1(gb);
115329f1
 
41773b73
     return 0;
 }
 
b704e742
 static int decode_vol_header(MpegEncContext *s, GetBitContext *gb){
     int width, height, vo_ver_id;
 
     /* vol header */
     skip_bits(gb, 1); /* random access */
     s->vo_type= get_bits(gb, 8);
     if (get_bits1(gb) != 0) { /* is_ol_id */
         vo_ver_id = get_bits(gb, 4); /* vo_ver_id */
         skip_bits(gb, 3); /* vo_priority */
     } else {
         vo_ver_id = 1;
     }
 //printf("vo type:%d\n",s->vo_type);
     s->aspect_ratio_info= get_bits(gb, 4);
115329f1
     if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){
5ff85f1d
         s->avctx->sample_aspect_ratio.num= get_bits(gb, 8); // par_width
         s->avctx->sample_aspect_ratio.den= get_bits(gb, 8); // par_height
58b0b0dd
     }else{
5ff85f1d
         s->avctx->sample_aspect_ratio= pixel_aspect[s->aspect_ratio_info];
b704e742
     }
de6d9b64
 
b704e742
     if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
         int chroma_format= get_bits(gb, 2);
73f18493
         if(chroma_format!=CHROMA_420){
9b879566
             av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n");
de6d9b64
         }
b704e742
         s->low_delay= get_bits1(gb);
         if(get_bits1(gb)){ /* vbv parameters */
bb270c08
             get_bits(gb, 15);   /* first_half_bitrate */
             skip_bits1(gb);     /* marker */
             get_bits(gb, 15);   /* latter_half_bitrate */
             skip_bits1(gb);     /* marker */
             get_bits(gb, 15);   /* first_half_vbv_buffer_size */
             skip_bits1(gb);     /* marker */
             get_bits(gb, 3);    /* latter_half_vbv_buffer_size */
             get_bits(gb, 11);   /* first_half_vbv_occupancy */
             skip_bits1(gb);     /* marker */
             get_bits(gb, 15);   /* latter_half_vbv_occupancy */
             skip_bits1(gb);     /* marker */
10cd5815
         }
b704e742
     }else{
893bc624
         // set low delay flag only once the smartest? low delay detection won't be overriden
b704e742
         if(s->picture_number==0)
             s->low_delay=0;
de6d9b64
     }
11ce8834
 
b704e742
     s->shape = get_bits(gb, 2); /* vol shape */
9b879566
     if(s->shape != RECT_SHAPE) av_log(s->avctx, AV_LOG_ERROR, "only rectangular vol supported\n");
b704e742
     if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Gray shape not supported\n");
b704e742
         skip_bits(gb, 4);  //video_object_layer_shape_extension
     }
1ff662cc
 
d6eb3c50
     check_marker(gb, "before time_increment_resolution");
115329f1
 
c0df9d75
     s->avctx->time_base.den = get_bits(gb, 16);
efbc614d
     if(!s->avctx->time_base.den){
         av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n");
         return -1;
     }
115329f1
 
c0df9d75
     s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
b704e742
     if (s->time_increment_bits < 1)
         s->time_increment_bits = 1;
115329f1
 
d6eb3c50
     check_marker(gb, "before fixed_vop_rate");
b704e742
 
     if (get_bits1(gb) != 0) {   /* fixed_vop_rate  */
c0df9d75
         s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
     }else
         s->avctx->time_base.num = 1;
 
b876b5c5
     s->t_frame=0;
cc9ba006
 
b704e742
     if (s->shape != BIN_ONLY_SHAPE) {
         if (s->shape == RECT_SHAPE) {
             skip_bits1(gb);   /* marker */
             width = get_bits(gb, 13);
             skip_bits1(gb);   /* marker */
             height = get_bits(gb, 13);
             skip_bits1(gb);   /* marker */
2bb6eba2
             if(width && height && !(s->width && s->codec_tag == AV_RL32("MP4S"))){ /* they should be non zero but who knows ... */
b704e742
                 s->width = width;
                 s->height = height;
 //                printf("width/height: %d %d\n", width, height);
             }
         }
115329f1
 
         s->progressive_sequence=
2be9f03a
         s->progressive_frame= get_bits1(gb)^1;
c1341a57
         s->interlaced_dct=0;
115329f1
         if(!get_bits1(gb) && (s->avctx->debug & FF_DEBUG_PICT_INFO))
332f9ac4
             av_log(s->avctx, AV_LOG_INFO, "MPEG4 OBMC not supported (very likely buggy encoder)\n");   /* OBMC Disable */
b704e742
         if (vo_ver_id == 1) {
             s->vol_sprite_usage = get_bits1(gb); /* vol_sprite_usage */
         } else {
             s->vol_sprite_usage = get_bits(gb, 2); /* vol_sprite_usage */
         }
9b879566
         if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "Static Sprites not supported\n");
b704e742
         if(s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE){
             if(s->vol_sprite_usage==STATIC_SPRITE){
                 s->sprite_width = get_bits(gb, 13);
                 skip_bits1(gb); /* marker */
                 s->sprite_height= get_bits(gb, 13);
                 skip_bits1(gb); /* marker */
                 s->sprite_left  = get_bits(gb, 13);
                 skip_bits1(gb); /* marker */
                 s->sprite_top   = get_bits(gb, 13);
                 skip_bits1(gb); /* marker */
             }
             s->num_sprite_warping_points= get_bits(gb, 6);
beac8235
             if(s->num_sprite_warping_points > 3){
                 av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", s->num_sprite_warping_points);
                 s->num_sprite_warping_points= 0;
                 return -1;
             }
b704e742
             s->sprite_warping_accuracy = get_bits(gb, 2);
             s->sprite_brightness_change= get_bits1(gb);
             if(s->vol_sprite_usage==STATIC_SPRITE)
115329f1
                 s->low_latency_sprite= get_bits1(gb);
b704e742
         }
         // FIXME sadct disable bit if verid!=1 && shape not rect
115329f1
 
b704e742
         if (get_bits1(gb) == 1) {   /* not_8_bit */
             s->quant_precision = get_bits(gb, 4); /* quant_precision */
9b879566
             if(get_bits(gb, 4)!=8) av_log(s->avctx, AV_LOG_ERROR, "N-bit not supported\n"); /* bits_per_pixel */
160d679c
             if(s->quant_precision!=5) av_log(s->avctx, AV_LOG_ERROR, "quant precision %d\n", s->quant_precision);
b704e742
         } else {
             s->quant_precision = 5;
d95ecd05
         }
115329f1
 
b704e742
         // FIXME a bunch of grayscale shape things
d95ecd05
 
b704e742
         if((s->mpeg_quant=get_bits1(gb))){ /* vol_quant_type */
5c91a675
             int i, v;
115329f1
 
b704e742
             /* load default matrixes */
             for(i=0; i<64; i++){
b0368839
                 int j= s->dsp.idct_permutation[i];
b704e742
                 v= ff_mpeg4_default_intra_matrix[i];
                 s->intra_matrix[j]= v;
                 s->chroma_intra_matrix[j]= v;
115329f1
 
b704e742
                 v= ff_mpeg4_default_non_intra_matrix[i];
                 s->inter_matrix[j]= v;
                 s->chroma_inter_matrix[j]= v;
d95ecd05
             }
3bf43d42
 
b704e742
             /* load custom intra matrix */
             if(get_bits1(gb)){
                 int last=0;
bb270c08
                 for(i=0; i<64; i++){
5c91a675
                     int j;
b704e742
                     v= get_bits(gb, 8);
                     if(v==0) break;
115329f1
 
b704e742
                     last= v;
b0368839
                     j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
2ad1516a
                     s->intra_matrix[j]= v;
                     s->chroma_intra_matrix[j]= v;
3bf43d42
                 }
 
b704e742
                 /* replicate last value */
                 for(; i<64; i++){
bb270c08
                     int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
d6eb3c50
                     s->intra_matrix[j]= last;
                     s->chroma_intra_matrix[j]= last;
3bf43d42
                 }
b704e742
             }
3bf43d42
 
b704e742
             /* load custom non intra matrix */
             if(get_bits1(gb)){
                 int last=0;
bb270c08
                 for(i=0; i<64; i++){
5c91a675
                     int j;
b704e742
                     v= get_bits(gb, 8);
                     if(v==0) break;
3bf43d42
 
b704e742
                     last= v;
b0368839
                     j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
b704e742
                     s->inter_matrix[j]= v;
                     s->chroma_inter_matrix[j]= v;
3bf43d42
                 }
 
b704e742
                 /* replicate last value */
                 for(; i<64; i++){
bb270c08
                     int j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
b704e742
                     s->inter_matrix[j]= last;
                     s->chroma_inter_matrix[j]= last;
                 }
d930ef19
             }
3bf43d42
 
b704e742
             // FIXME a bunch of grayscale shape things
         }
49c9325f
 
b704e742
         if(vo_ver_id != 1)
              s->quarter_sample= get_bits1(gb);
         else s->quarter_sample=0;
49092244
 
289e8fd0
         if(!get_bits1(gb)){
             int pos= get_bits_count(gb);
             int estimation_method= get_bits(gb, 2);
             if(estimation_method<2){
                 if(!get_bits1(gb)){
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //opaque
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //transparent
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_cae
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //inter_cae
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //no_update
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //upampling
                 }
                 if(!get_bits1(gb)){
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //intra_blocks
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter_blocks
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //inter4v_blocks
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //not coded blocks
                 }
                 if(!check_marker(gb, "in complexity estimation part 1")){
                     skip_bits_long(gb, pos - get_bits_count(gb));
                     goto no_cplx_est;
                 }
                 if(!get_bits1(gb)){
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_coeffs
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //dct_lines
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //vlc_syms
                     s->cplx_estimation_trash_i += 4*get_bits1(gb); //vlc_bits
                 }
                 if(!get_bits1(gb)){
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //apm
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //npm
                     s->cplx_estimation_trash_b += 8*get_bits1(gb); //interpolate_mc_q
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //forwback_mc_q
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel2
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //halfpel4
                 }
                 if(!check_marker(gb, "in complexity estimation part 2")){
                     skip_bits_long(gb, pos - get_bits_count(gb));
                     goto no_cplx_est;
                 }
                 if(estimation_method==1){
                     s->cplx_estimation_trash_i += 8*get_bits1(gb); //sadct
                     s->cplx_estimation_trash_p += 8*get_bits1(gb); //qpel
                 }
             }else
                 av_log(s->avctx, AV_LOG_ERROR, "Invalid Complexity estimation method %d\n", estimation_method);
         }else{
 no_cplx_est:
             s->cplx_estimation_trash_i=
             s->cplx_estimation_trash_p=
             s->cplx_estimation_trash_b= 0;
         }
49092244
 
b704e742
         s->resync_marker= !get_bits1(gb); /* resync_marker_disabled */
cc9ba006
 
b704e742
         s->data_partitioning= get_bits1(gb);
         if(s->data_partitioning){
             s->rvlc= get_bits1(gb);
d95ecd05
         }
115329f1
 
b704e742
         if(vo_ver_id != 1) {
             s->new_pred= get_bits1(gb);
             if(s->new_pred){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "new pred not supported\n");
b704e742
                 skip_bits(gb, 2); /* requested upstream message type */
                 skip_bits1(gb); /* newpred segment type */
44eb4951
             }
b704e742
             s->reduced_res_vop= get_bits1(gb);
9b879566
             if(s->reduced_res_vop) av_log(s->avctx, AV_LOG_ERROR, "reduced resolution VOP not supported\n");
b704e742
         }
         else{
             s->new_pred=0;
             s->reduced_res_vop= 0;
         }
 
         s->scalability= get_bits1(gb);
 
         if (s->scalability) {
             GetBitContext bak= *gb;
d2975f8d
             int ref_layer_id;
             int ref_layer_sampling_dir;
             int h_sampling_factor_n;
             int h_sampling_factor_m;
             int v_sampling_factor_n;
             int v_sampling_factor_m;
115329f1
 
d2975f8d
             s->hierachy_type= get_bits1(gb);
             ref_layer_id= get_bits(gb, 4);
             ref_layer_sampling_dir= get_bits1(gb);
             h_sampling_factor_n= get_bits(gb, 5);
             h_sampling_factor_m= get_bits(gb, 5);
             v_sampling_factor_n= get_bits(gb, 5);
             v_sampling_factor_m= get_bits(gb, 5);
b704e742
             s->enhancement_type= get_bits1(gb);
115329f1
 
             if(   h_sampling_factor_n==0 || h_sampling_factor_m==0
b704e742
                || v_sampling_factor_n==0 || v_sampling_factor_m==0){
115329f1
 
b704e742
 //                fprintf(stderr, "illegal scalability header (VERY broken encoder), trying to workaround\n");
                 s->scalability=0;
115329f1
 
b704e742
                 *gb= bak;
             }else
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "scalability not supported\n");
115329f1
 
b704e742
             // bin shape stuff FIXME
44eb4951
         }
b704e742
     }
     return 0;
 }
 
2ba8f6b8
 /**
  * decodes the user data stuff in the header.
9c852bcf
  * Also initializes divx/xvid/lavc_version/build.
2ba8f6b8
  */
b704e742
 static int decode_user_data(MpegEncContext *s, GetBitContext *gb){
     char buf[256];
     int i;
     int e;
63d33cf4
     int ver = 0, build = 0, ver2 = 0, ver3 = 0;
d5a21172
     char last;
b704e742
 
25be48eb
     for(i=0; i<255 && get_bits_count(gb) < gb->size_in_bits; i++){
d9dd7a0d
         if(show_bits(gb, 23) == 0) break;
         buf[i]= get_bits(gb, 8);
b704e742
     }
d9dd7a0d
     buf[i]=0;
d5a21172
 
7da71a5c
     /* divx detection */
d5a21172
     e=sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
     if(e<2)
         e=sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
     if(e>=2){
b704e742
         s->divx_version= ver;
         s->divx_build= build;
d5a21172
         s->divx_packed= e==3 && last=='p';
9f0a705d
         if(s->divx_packed && !s->showed_packed_warning) {
bc545029
             av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
9f0a705d
             s->showed_packed_warning=1;
         }
b704e742
     }
115329f1
 
7da71a5c
     /* ffmpeg detection */
91d44ffc
     e=sscanf(buf, "FFmpe%*[^b]b%d", &build)+3;
b704e742
     if(e!=4)
115329f1
         e=sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
b704e742
     if(e!=4){
5aa083ee
         e=sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3)+1;
63d33cf4
         if (e>1)
             build= (ver<<16) + (ver2<<8) + ver3;
5aa083ee
     }
     if(e!=4){
b704e742
         if(strcmp(buf, "ffmpeg")==0){
             s->lavc_build= 4600;
4d2858de
         }
de6d9b64
     }
b704e742
     if(e==4){
         s->lavc_build= build;
     }
115329f1
 
842eabc5
     /* Xvid detection */
7da71a5c
     e=sscanf(buf, "XviD%d", &build);
     if(e==1){
         s->xvid_build= build;
     }
 
b704e742
 //printf("User Data: %s\n", buf);
     return 0;
 }
 
 static int decode_vop_header(MpegEncContext *s, GetBitContext *gb){
     int time_incr, time_increment;
 
9701840b
     s->pict_type = get_bits(gb, 2) + FF_I_TYPE;        /* pict type: I = 0 , P = 1 */
     if(s->pict_type==FF_B_TYPE && s->low_delay && s->vol_control_parameters==0 && !(s->flags & CODEC_FLAG_LOW_DELAY)){
160d679c
         av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n");
7aaf3b98
         s->low_delay=0;
     }
115329f1
 
9701840b
     s->partitioned_frame= s->data_partitioning && s->pict_type!=FF_B_TYPE;
4d2858de
     if(s->partitioned_frame)
         s->decode_mb= mpeg4_decode_partitioned_mb;
     else
fcfee63b
         s->decode_mb= ff_mpeg4_decode_mb;
4d2858de
 
6f91bcd1
     time_incr=0;
115329f1
     while (get_bits1(gb) != 0)
de6d9b64
         time_incr++;
 
b704e742
     check_marker(gb, "before time_increment");
160147cc
 
     if(s->time_increment_bits==0 || !(show_bits(gb, s->time_increment_bits+1)&1)){
160d679c
         av_log(s->avctx, AV_LOG_ERROR, "hmm, seems the headers are not complete, trying to guess time_increment_bits\n");
7d67e968
 
         for(s->time_increment_bits=1 ;s->time_increment_bits<16; s->time_increment_bits++){
             if(show_bits(gb, s->time_increment_bits+1)&1) break;
         }
59c673d5
 
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "my guess is %d bits ;)\n",s->time_increment_bits);
7d67e968
     }
115329f1
 
d6eb3c50
     if(IS_3IV1) time_increment= get_bits1(gb); //FIXME investigate further
     else time_increment= get_bits(gb, s->time_increment_bits);
115329f1
 
d6eb3c50
 //    printf("%d %X\n", s->time_increment_bits, time_increment);
b876b5c5
 //av_log(s->avctx, AV_LOG_DEBUG, " type:%d modulo_time_base:%d increment:%d t_frame %d\n", s->pict_type, time_incr, time_increment, s->t_frame);
9701840b
     if(s->pict_type!=FF_B_TYPE){
9dbcbd92
         s->last_time_base= s->time_base;
6f91bcd1
         s->time_base+= time_incr;
c0df9d75
         s->time= s->time_base*s->avctx->time_base.den + time_increment;
4d2858de
         if(s->workaround_bugs&FF_BUG_UMP4){
0c2dd16e
             if(s->time < s->last_non_b_time){
 //                fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
                 s->time_base++;
c0df9d75
                 s->time+= s->avctx->time_base.den;
0c2dd16e
             }
bea669e5
         }
9dbcbd92
         s->pp_time= s->time - s->last_non_b_time;
         s->last_non_b_time= s->time;
6f91bcd1
     }else{
c0df9d75
         s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
bea669e5
         s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
         if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
160d679c
 //            printf("messed up order, maybe after seeking? skipping current b frame\n");
             return FRAME_SKIPPED;
8d4c65d1
         }
841f65f2
         ff_mpeg4_init_direct_mv(s);
115329f1
 
b876b5c5
         if(s->t_frame==0) s->t_frame= s->pb_time;
bea669e5
         if(s->t_frame==0) s->t_frame=1; // 1/0 protection
115329f1
         s->pp_field_time= (  ROUNDED_DIV(s->last_non_b_time, s->t_frame)
bea669e5
                            - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
115329f1
         s->pb_field_time= (  ROUNDED_DIV(s->time, s->t_frame)
bea669e5
                            - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
2d0bcfb4
         if(!s->progressive_sequence){
             if(s->pp_field_time <= s->pb_field_time || s->pb_field_time <= 1)
                 return FRAME_SKIPPED;
         }
6f91bcd1
     }
949b1a13
 //av_log(s->avctx, AV_LOG_DEBUG, "last nonb %"PRId64" last_base %d time %"PRId64" pp %d pb %d t %d ppf %d pbf %d\n", s->last_non_b_time, s->last_time_base, s->time, s->pp_time, s->pb_time, s->t_frame, s->pp_field_time, s->pb_field_time);
115329f1
 
e53222d1
     if(s->avctx->time_base.num)
         s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
     else
         s->current_picture_ptr->pts= AV_NOPTS_VALUE;
41773b73
     if(s->avctx->debug&FF_DEBUG_PTS)
4733abcb
         av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n", s->current_picture_ptr->pts);
b876b5c5
 
7d67e968
     check_marker(gb, "before vop_coded");
115329f1
 
de6d9b64
     /* vop coded */
b704e742
     if (get_bits1(gb) != 1){
40028f8f
         if(s->avctx->debug&FF_DEBUG_PICT_INFO)
             av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
160d679c
         return FRAME_SKIPPED;
b704e742
     }
949b1a13
 //printf("time %d %d %d || %"PRId64" %"PRId64" %"PRId64"\n", s->time_increment_bits, s->avctx->time_base.den, s->time_base,
115329f1
 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
9701840b
     if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == FF_P_TYPE
                           || (s->pict_type == FF_S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
de6d9b64
         /* rounding type for motion estimation */
bb270c08
         s->no_rounding = get_bits1(gb);
d95ecd05
     } else {
bb270c08
         s->no_rounding = 0;
de6d9b64
     }
cc9ba006
 //FIXME reduced res stuff
 
      if (s->shape != RECT_SHAPE) {
9701840b
          if (s->vol_sprite_usage != 1 || s->pict_type != FF_I_TYPE) {
d95ecd05
              int width, height, hor_spat_ref, ver_spat_ref;
115329f1
 
b704e742
              width = get_bits(gb, 13);
              skip_bits1(gb);   /* marker */
              height = get_bits(gb, 13);
              skip_bits1(gb);   /* marker */
              hor_spat_ref = get_bits(gb, 13); /* hor_spat_ref */
              skip_bits1(gb);   /* marker */
              ver_spat_ref = get_bits(gb, 13); /* ver_spat_ref */
d95ecd05
          }
b704e742
          skip_bits1(gb); /* change_CR_disable */
115329f1
 
b704e742
          if (get_bits1(gb) != 0) {
              skip_bits(gb, 8); /* constant_alpha_value */
d95ecd05
          }
      }
cc9ba006
 //FIXME complexity estimation stuff
115329f1
 
cc9ba006
      if (s->shape != BIN_ONLY_SHAPE) {
289e8fd0
          skip_bits_long(gb, s->cplx_estimation_trash_i);
          if(s->pict_type != FF_I_TYPE)
             skip_bits_long(gb, s->cplx_estimation_trash_p);
          if(s->pict_type == FF_B_TYPE)
             skip_bits_long(gb, s->cplx_estimation_trash_b);
 
34790165
          s->intra_dc_threshold= mpeg4_dc_threshold[ get_bits(gb, 3) ];
fd7db0fd
          if(!s->progressive_sequence){
b704e742
              s->top_field_first= get_bits1(gb);
              s->alternate_scan= get_bits1(gb);
b9d2bb5b
          }else
              s->alternate_scan= 0;
cc9ba006
      }
73c8e514
 
3a3d3a42
      if(s->alternate_scan){
3d2e8cce
          ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_alternate_vertical_scan);
          ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_alternate_vertical_scan);
          ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan);
          ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
3a3d3a42
      } else{
3d2e8cce
          ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , ff_zigzag_direct);
          ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , ff_zigzag_direct);
          ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
          ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
3a3d3a42
      }
115329f1
 
9701840b
      if(s->pict_type == FF_S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
3f9d89c6
          mpeg4_decode_sprite_trajectory(s, gb);
9b879566
          if(s->sprite_brightness_change) av_log(s->avctx, AV_LOG_ERROR, "sprite_brightness_change not supported\n");
          if(s->vol_sprite_usage==STATIC_SPRITE) av_log(s->avctx, AV_LOG_ERROR, "static sprite not supported\n");
cc9ba006
      }
73c8e514
 
cc9ba006
      if (s->shape != BIN_ONLY_SHAPE) {
332f9ac4
          s->chroma_qscale= s->qscale = get_bits(gb, s->quant_precision);
49c9325f
          if(s->qscale==0){
9b879566
              av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (qscale=0)\n");
49c9325f
              return -1; // makes no sense to continue, as there is nothing left from the image then
          }
115329f1
 
9701840b
          if (s->pict_type != FF_I_TYPE) {
bb270c08
              s->f_code = get_bits(gb, 3);       /* fcode_for */
49c9325f
              if(s->f_code==0){
9b879566
                  av_log(s->avctx, AV_LOG_ERROR, "Error, header damaged or not MPEG4 header (f_code=0)\n");
49c9325f
                  return -1; // makes no sense to continue, as the MV decoding will break very quickly
              }
b5a093b3
          }else
              s->f_code=1;
115329f1
 
9701840b
          if (s->pict_type == FF_B_TYPE) {
b704e742
              s->b_code = get_bits(gb, 3);
b5a093b3
          }else
              s->b_code=1;
c8c437bc
 
          if(s->avctx->debug&FF_DEBUG_PICT_INFO){
289e8fd0
              av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%d,%d %s size:%d pro:%d alt:%d top:%d %spel part:%d resync:%d w:%d a:%d rnd:%d vot:%d%s dc:%d ce:%d/%d/%d\n",
115329f1
                  s->qscale, s->f_code, s->b_code,
9701840b
                  s->pict_type == FF_I_TYPE ? "I" : (s->pict_type == FF_P_TYPE ? "P" : (s->pict_type == FF_B_TYPE ? "B" : "S")),
115329f1
                  gb->size_in_bits,s->progressive_sequence, s->alternate_scan, s->top_field_first,
59b571c1
                  s->quarter_sample ? "q" : "h", s->data_partitioning, s->resync_marker, s->num_sprite_warping_points,
289e8fd0
                  s->sprite_warping_accuracy, 1-s->no_rounding, s->vo_type, s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, s->cplx_estimation_trash_i, s->cplx_estimation_trash_p, s->cplx_estimation_trash_b);
c8c437bc
          }
 
cc9ba006
          if(!s->scalability){
9701840b
              if (s->shape!=RECT_SHAPE && s->pict_type!=FF_I_TYPE) {
b704e742
                  skip_bits1(gb); // vop shape coding type
cc9ba006
              }
3e6a20a0
          }else{
              if(s->enhancement_type){
b704e742
                  int load_backward_shape= get_bits1(gb);
3e6a20a0
                  if(load_backward_shape){
893bc624
                      av_log(s->avctx, AV_LOG_ERROR, "load backward shape isn't supported\n");
3e6a20a0
                  }
              }
b704e742
              skip_bits(gb, 2); //ref_select_code
d95ecd05
          }
      }
893bc624
      /* detect buggy encoders which don't set the low_delay flag (divx4/xvid/opendivx)*/
      // note we cannot detect divx5 without b-frames easily (although it's buggy too)
7aaf3b98
      if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
9b879566
          av_log(s->avctx, AV_LOG_ERROR, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
f94985d0
          s->low_delay=1;
      }
 
893bc624
      s->picture_number++; // better than pic number==0 always ;)
f94985d0
 
115329f1
      s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support
8f8402e4
      s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
 
6674a126
      if(s->workaround_bugs&FF_BUG_EDGE){
b5a093b3
          s->h_edge_pos= s->width;
          s->v_edge_pos= s->height;
      }
d95ecd05
      return 0;
de6d9b64
 }
 
b704e742
 /**
  * decode mpeg4 headers
  * @return <0 if no VOP found (or a damaged one)
  *         FRAME_SKIPPED if a not coded VOP is found
  *         0 if a VOP is found
  */
 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb)
 {
     int startcode, v;
 
     /* search next start code */
     align_get_bits(gb);
2d2651f8
 
2bb6eba2
     if(s->codec_tag == AV_RL32("WV1F") && show_bits(gb, 24) == 0x575630){
2d2651f8
         skip_bits(gb, 24);
         if(get_bits(gb, 8) == 0xF0)
c62da797
             goto end;
2d2651f8
     }
 
b704e742
     startcode = 0xff;
     for(;;) {
68f593b4
         if(get_bits_count(gb) >= gb->size_in_bits){
c1e292ea
             if(gb->size_in_bits==8 && (s->divx_version || s->xvid_build)){
9b879566
                 av_log(s->avctx, AV_LOG_ERROR, "frame skip %d\n", gb->size_in_bits);
160d679c
                 return FRAME_SKIPPED; //divx bug
b704e742
             }else
                 return -1; //end of stream
         }
 
63d33cf4
         /* use the bits after the test */
         v = get_bits(gb, 8);
         startcode = ((startcode << 8) | v) & 0xffffffff;
 
b704e742
         if((startcode&0xFFFFFF00) != 0x100)
             continue; //no startcode
115329f1
 
41773b73
         if(s->avctx->debug&FF_DEBUG_STARTCODE){
9b879566
             av_log(s->avctx, AV_LOG_DEBUG, "startcode: %3X ", startcode);
             if     (startcode<=0x11F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Start");
             else if(startcode<=0x12F) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Layer Start");
             else if(startcode<=0x13F) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
             else if(startcode<=0x15F) av_log(s->avctx, AV_LOG_DEBUG, "FGS bp start");
             else if(startcode<=0x1AF) av_log(s->avctx, AV_LOG_DEBUG, "Reserved");
             else if(startcode==0x1B0) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq Start");
             else if(startcode==0x1B1) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Seq End");
             else if(startcode==0x1B2) av_log(s->avctx, AV_LOG_DEBUG, "User Data");
             else if(startcode==0x1B3) av_log(s->avctx, AV_LOG_DEBUG, "Group of VOP start");
             else if(startcode==0x1B4) av_log(s->avctx, AV_LOG_DEBUG, "Video Session Error");
             else if(startcode==0x1B5) av_log(s->avctx, AV_LOG_DEBUG, "Visual Object Start");
             else if(startcode==0x1B6) av_log(s->avctx, AV_LOG_DEBUG, "Video Object Plane start");
             else if(startcode==0x1B7) av_log(s->avctx, AV_LOG_DEBUG, "slice start");
             else if(startcode==0x1B8) av_log(s->avctx, AV_LOG_DEBUG, "extension start");
             else if(startcode==0x1B9) av_log(s->avctx, AV_LOG_DEBUG, "fgs start");
             else if(startcode==0x1BA) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object start");
             else if(startcode==0x1BB) av_log(s->avctx, AV_LOG_DEBUG, "FBA Object Plane start");
             else if(startcode==0x1BC) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object start");
             else if(startcode==0x1BD) av_log(s->avctx, AV_LOG_DEBUG, "Mesh Object Plane start");
160d679c
             else if(startcode==0x1BE) av_log(s->avctx, AV_LOG_DEBUG, "Still Texture Object start");
             else if(startcode==0x1BF) av_log(s->avctx, AV_LOG_DEBUG, "Texture Spatial Layer start");
             else if(startcode==0x1C0) av_log(s->avctx, AV_LOG_DEBUG, "Texture SNR Layer start");
             else if(startcode==0x1C1) av_log(s->avctx, AV_LOG_DEBUG, "Texture Tile start");
             else if(startcode==0x1C2) av_log(s->avctx, AV_LOG_DEBUG, "Texture Shape Layer start");
9b879566
             else if(startcode==0x1C3) av_log(s->avctx, AV_LOG_DEBUG, "stuffing start");
             else if(startcode<=0x1C5) av_log(s->avctx, AV_LOG_DEBUG, "reserved");
             else if(startcode<=0x1FF) av_log(s->avctx, AV_LOG_DEBUG, "System start");
             av_log(s->avctx, AV_LOG_DEBUG, " at %d\n", get_bits_count(gb));
41773b73
         }
 
11417def
         if(startcode >= 0x120 && startcode <= 0x12F){
115329f1
             if(decode_vol_header(s, gb) < 0)
59c673d5
                 return -1;
11417def
         }
         else if(startcode == USER_DATA_STARTCODE){
b704e742
             decode_user_data(s, gb);
11417def
         }
         else if(startcode == GOP_STARTCODE){
41773b73
             mpeg4_decode_gop_header(s, gb);
11417def
         }
         else if(startcode == VOP_STARTCODE){
c62da797
             break;
b704e742
         }
 
         align_get_bits(gb);
         startcode = 0xff;
     }
c62da797
 end:
     if(s->flags& CODEC_FLAG_LOW_DELAY)
         s->low_delay=1;
ed4c638a
     s->avctx->has_b_frames= !s->low_delay;
c62da797
     return decode_vop_header(s, gb);
b704e742
 }
 
de6d9b64
 /* don't understand why they choose a different header ! */
 int intel_h263_decode_picture_header(MpegEncContext *s)
 {
     int format;
 
     /* picture header */
17fb5fd3
     if (get_bits_long(&s->gb, 22) != 0x20) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
de6d9b64
         return -1;
1e209222
     }
     s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
de6d9b64
 
1e209222
     if (get_bits1(&s->gb) != 1) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
bb270c08
         return -1;      /* marker */
1e209222
     }
     if (get_bits1(&s->gb) != 0) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
bb270c08
         return -1;      /* h263 id */
1e209222
     }
bb270c08
     skip_bits1(&s->gb);         /* split screen off */
     skip_bits1(&s->gb);         /* camera  off */
     skip_bits1(&s->gb);         /* freeze picture release off */
de6d9b64
 
     format = get_bits(&s->gb, 3);
1e209222
     if (format != 7) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
de6d9b64
         return -1;
1e209222
     }
de6d9b64
     s->h263_plus = 0;
 
9701840b
     s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
115329f1
 
     s->unrestricted_mv = get_bits1(&s->gb);
de6d9b64
     s->h263_long_vectors = s->unrestricted_mv;
 
1e209222
     if (get_bits1(&s->gb) != 0) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
bb270c08
         return -1;      /* SAC: off */
1e209222
     }
0eb7d780
     s->obmc= get_bits1(&s->gb);
91ba181a
     s->pb_frame = get_bits1(&s->gb);
de6d9b64
 
91ba181a
     if(format == 7){
         format = get_bits(&s->gb, 3);
         if(format == 0 || format == 7){
             av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
             return -1;
         }
         if(get_bits(&s->gb, 2))
             av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
         s->loop_filter = get_bits1(&s->gb);
         if(get_bits1(&s->gb))
             av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
         if(get_bits1(&s->gb))
             s->pb_frame = 2;
         if(get_bits(&s->gb, 5))
             av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
         if(get_bits(&s->gb, 5) != 1)
             av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
     }
     if(format == 6){
         int ar = get_bits(&s->gb, 4);
         skip_bits(&s->gb, 9); // display width
         skip_bits1(&s->gb);
         skip_bits(&s->gb, 9); // display height
         if(ar == 15){
             skip_bits(&s->gb, 8); // aspect ratio - width
             skip_bits(&s->gb, 8); // aspect ratio - height
         }
     }
de6d9b64
 
332f9ac4
     s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
bb270c08
     skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
de6d9b64
 
91ba181a
     if(s->pb_frame){
         skip_bits(&s->gb, 3); //temporal reference for B-frame
         skip_bits(&s->gb, 2); //dbquant
     }
 
de6d9b64
     /* PEI */
612476ef
     while (get_bits1(&s->gb) != 0) {
         skip_bits(&s->gb, 8);
de6d9b64
     }
     s->f_code = 1;
384855ee
 
     s->y_dc_scale_table=
     s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
 
59ba3fd0
     if(s->avctx->debug&FF_DEBUG_PICT_INFO)
         show_pict_info(s);
 
91ba181a
     if(s->pb_frame){
         av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n");
         return -1;      /* PB frame mode */
     }
de6d9b64
     return 0;
 }
4949028f
 
d4f5d74a
 int flv_h263_decode_picture_header(MpegEncContext *s)
 {
     int format, width, height;
 
     /* picture header */
     if (get_bits_long(&s->gb, 17) != 1) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
d4f5d74a
         return -1;
     }
     format = get_bits(&s->gb, 5);
     if (format != 0 && format != 1) {
9b879566
         av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
d4f5d74a
         return -1;
     }
     s->h263_flv = format+1;
     s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
     format = get_bits(&s->gb, 3);
     switch (format) {
     case 0:
         width = get_bits(&s->gb, 8);
         height = get_bits(&s->gb, 8);
         break;
     case 1:
         width = get_bits(&s->gb, 16);
         height = get_bits(&s->gb, 16);
         break;
     case 2:
         width = 352;
         height = 288;
         break;
     case 3:
         width = 176;
         height = 144;
         break;
     case 4:
         width = 128;
         height = 96;
         break;
     case 5:
         width = 320;
         height = 240;
         break;
     case 6:
         width = 160;
         height = 120;
         break;
     default:
         width = height = 0;
         break;
     }
0ecca7a4
     if(avcodec_check_dimensions(s->avctx, width, height))
d4f5d74a
         return -1;
     s->width = width;
     s->height = height;
 
9701840b
     s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
     s->dropable= s->pict_type > FF_P_TYPE;
14e2a940
     if (s->dropable)
9701840b
         s->pict_type = FF_P_TYPE;
115329f1
 
bb270c08
     skip_bits1(&s->gb); /* deblocking flag */
332f9ac4
     s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
d4f5d74a
 
     s->h263_plus = 0;
 
     s->unrestricted_mv = 1;
e11530e7
     s->h263_long_vectors = 0;
d4f5d74a
 
     /* PEI */
     while (get_bits1(&s->gb) != 0) {
         skip_bits(&s->gb, 8);
     }
     s->f_code = 1;
 
e11530e7
     if(s->avctx->debug & FF_DEBUG_PICT_INFO){
9b879566
         av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
85df8f7c
                s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
e11530e7
     }
115329f1
 
d4f5d74a
     s->y_dc_scale_table=
     s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
 
     return 0;
 }