h263.c 148.6 KB
Newer Older
F
Fabrice Bellard 已提交
1 2
/*
 * H263/MPEG4 backend for ffmpeg encoder and decoder
F
Fabrice Bellard 已提交
3
 * Copyright (c) 2000,2001 Fabrice Bellard.
4
 * H263+ support.
F
Fabrice Bellard 已提交
5 6
 * Copyright (c) 2001 Juan J. Sierralta P.
 *
F
Fabrice Bellard 已提交
7 8 9 10
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
F
Fabrice Bellard 已提交
11
 *
F
Fabrice Bellard 已提交
12
 * This library is distributed in the hope that it will be useful,
F
Fabrice Bellard 已提交
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
F
Fabrice Bellard 已提交
14 15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
F
Fabrice Bellard 已提交
16
 *
F
Fabrice Bellard 已提交
17 18 19
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
 *
21 22 23
 * ac prediction encoding, b-frame support, error resilience, optimizations,
 * qpel decoding, gmc decoding, interlaced decoding, 
 * by Michael Niedermayer <michaelni@gmx.at>
F
Fabrice Bellard 已提交
24
 */
J
Juanjo 已提交
25 26
 
//#define DEBUG
F
Fabrice Bellard 已提交
27 28 29 30 31 32 33
#include "common.h"
#include "dsputil.h"
#include "avcodec.h"
#include "mpegvideo.h"
#include "h263data.h"
#include "mpeg4data.h"

M
Michael Niedermayer 已提交
34 35 36
//rounded divison & shift
#define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))

F
Felix Bünemann 已提交
37 38
#define PRINT_MB_TYPE(a) {}
//#define PRINT_MB_TYPE(a) printf(a)
M
Michael Niedermayer 已提交
39

40 41 42 43 44 45 46 47 48
#define INTRA_MCBPC_VLC_BITS 6
#define INTER_MCBPC_VLC_BITS 6
#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

F
Fabrice Bellard 已提交
49 50
static void h263_encode_block(MpegEncContext * s, DCTELEM * block,
			      int n);
51
static void h263_encode_motion(MpegEncContext * s, int val, int fcode);
52
static void h263p_encode_umotion(MpegEncContext * s, int val);
53
static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block,
54 55
			       int n, int dc, UINT8 *scan_table, 
                               PutBitContext *dc_pb, PutBitContext *ac_pb);
M
Michael Niedermayer 已提交
56
static int h263_decode_motion(MpegEncContext * s, int pred, int fcode);
57
static int h263p_decode_umotion(MpegEncContext * s, int pred);
F
Fabrice Bellard 已提交
58 59
static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
                             int n, int coded);
60 61
static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
M
Michael Niedermayer 已提交
62
                              int n, int coded, int intra);
63
static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr);
64 65
static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
                              int dir);
66 67
static void mpeg4_decode_sprite_trajectory(MpegEncContext * s);

68
extern UINT32 inverse[256];
F
Fabrice Bellard 已提交
69

70
static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
71
static UINT8 fcode_tab[MAX_MV*2+1];
72
static UINT8 umv_fcode_tab[MAX_MV*2+1];
73

M
Michael Niedermayer 已提交
74 75
static UINT16 uni_DCtab_lum  [512][2];
static UINT16 uni_DCtab_chrom[512][2];
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
static UINT32 uni_mpeg4_intra_rl_bits[64*64*2*2];
static UINT8  uni_mpeg4_intra_rl_len [64*64*2*2];
static UINT32 uni_mpeg4_inter_rl_bits[64*64*2*2];
static UINT8  uni_mpeg4_inter_rl_len [64*64*2*2];
#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)

/* mpeg4
inter
max level: 24/6
max run: 53/63

intra
max level: 53/16
max run: 29/41
*/
M
Michael Niedermayer 已提交
92

F
Fabrice Bellard 已提交
93 94 95 96 97
int h263_get_picture_format(int width, int height)
{
    int format;

    if (width == 128 && height == 96)
J
Juanjo 已提交
98
        format = 1;
F
Fabrice Bellard 已提交
99
    else if (width == 176 && height == 144)
J
Juanjo 已提交
100
        format = 2;
F
Fabrice Bellard 已提交
101
    else if (width == 352 && height == 288)
J
Juanjo 已提交
102
        format = 3;
F
Fabrice Bellard 已提交
103
    else if (width == 704 && height == 576)
J
Juanjo 已提交
104
        format = 4;
F
Fabrice Bellard 已提交
105
    else if (width == 1408 && height == 1152)
J
Juanjo 已提交
106
        format = 5;
F
Fabrice Bellard 已提交
107 108 109 110 111 112 113
    else
        format = 7;
    return format;
}

void h263_encode_picture_header(MpegEncContext * s, int picture_number)
{
114
    int format;
F
Fabrice Bellard 已提交
115 116

    align_put_bits(&s->pb);
117 118

    /* Update the pointer to last GOB */
119
    s->ptr_lastgob = pbBufPtr(&s->pb);
120 121 122
    s->gob_number = 0;

    put_bits(&s->pb, 22, 0x20); /* PSC */
123
    put_bits(&s->pb, 8, (((INT64)s->picture_number * 30 * FRAME_RATE_BASE) / 
F
Fabrice Bellard 已提交
124 125 126 127 128 129 130
                         s->frame_rate) & 0xff);

    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 */
131 132
    
    format = h263_get_picture_format(s->width, s->height);
F
Fabrice Bellard 已提交
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
    if (!s->h263_plus) {
        /* H.263v1 */
        put_bits(&s->pb, 3, format);
        put_bits(&s->pb, 1, (s->pict_type == P_TYPE));
        /* 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 */
        put_bits(&s->pb, 1, 0);	/* unrestricted motion vector: off */
        put_bits(&s->pb, 1, 0);	/* SAC: off */
        put_bits(&s->pb, 1, 0);	/* advanced prediction mode: off */
        put_bits(&s->pb, 1, 0);	/* not PB frame */
        put_bits(&s->pb, 5, s->qscale);
        put_bits(&s->pb, 1, 0);	/* Continuous Presence Multipoint mode: off */
    } else {
        /* H.263v2 */
        /* H.263 Plus PTYPE */
        put_bits(&s->pb, 3, 7);
        put_bits(&s->pb,3,1); /* Update Full Extended PTYPE */
151 152 153 154 155
        if (format == 7)
            put_bits(&s->pb,3,6); /* Custom Source Format */
        else
            put_bits(&s->pb, 3, format);
            
F
Fabrice Bellard 已提交
156
        put_bits(&s->pb,1,0); /* Custom PCF: off */
157 158
        s->umvplus = (s->pict_type == P_TYPE) && s->unrestricted_mv;
        put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */
F
Fabrice Bellard 已提交
159 160
        put_bits(&s->pb,1,0); /* SAC: off */
        put_bits(&s->pb,1,0); /* Advanced Prediction Mode: off */
161
        put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
F
Fabrice Bellard 已提交
162 163 164 165 166 167 168 169 170 171 172 173 174
        put_bits(&s->pb,1,0); /* Deblocking Filter: off */
        put_bits(&s->pb,1,0); /* Slice Structured: off */
        put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
        put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
        put_bits(&s->pb,1,0); /* Alternative Inter VLC: off */
        put_bits(&s->pb,1,0); /* Modified Quantization: off */
        put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
        put_bits(&s->pb,3,0); /* Reserved */
		
        put_bits(&s->pb, 3, s->pict_type == P_TYPE);
		
        put_bits(&s->pb,1,0); /* Reference Picture Resampling: off */
        put_bits(&s->pb,1,0); /* Reduced-Resolution Update: off */
175 176 177 178 179
        if (s->pict_type == I_TYPE)
            s->no_rounding = 0;
        else
            s->no_rounding ^= 1;
        put_bits(&s->pb,1,s->no_rounding); /* Rounding Type */
F
Fabrice Bellard 已提交
180 181 182 183 184 185
        put_bits(&s->pb,2,0); /* Reserved */
        put_bits(&s->pb,1,1); /* "1" to prevent start code emulation */
		
        /* This should be here if PLUSPTYPE */
        put_bits(&s->pb, 1, 0);	/* Continuous Presence Multipoint mode: off */
		
186 187
		if (format == 7) {
            /* Custom Picture Format (CPFMT) */
F
Fabrice Bellard 已提交
188
		
J
Juanjo 已提交
189
	    if (s->aspect_ratio_info)
190
        	put_bits(&s->pb,4,s->aspect_ratio_info);
J
Juanjo 已提交
191
	    else
192
        	put_bits(&s->pb,4,2); /* Aspect ratio: CIF 12:11 (4:3) picture */
193 194 195
            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));
196 197 198 199 200
	    if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
	    {
		put_bits(&s->pb, 8, s->aspected_width);
		put_bits(&s->pb, 8, s->aspected_height);
	    }
201 202
        }
        
F
Fabrice Bellard 已提交
203
        /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
204
        if (s->umvplus)
F
Fabrice Bellard 已提交
205 206 207 208 209
            put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
        put_bits(&s->pb, 5, s->qscale);
    }

    put_bits(&s->pb, 1, 0);	/* no PEI */
210 211 212 213 214 215 216 217

    if(s->h263_aic){
         s->y_dc_scale_table= 
         s->c_dc_scale_table= h263_aic_dc_scale_table;
    }else{
        s->y_dc_scale_table=
        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
    }
F
Fabrice Bellard 已提交
218 219
}

220 221 222 223 224 225 226
int h263_encode_gob_header(MpegEncContext * s, int mb_line)
{
    int pdif=0;
    
    /* Check to see if we need to put a new GBSC */
    /* for RTP packetization                    */
    if (s->rtp_mode) {
227
        pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
228 229 230
        if (pdif >= s->rtp_payload_size) {
            /* Bad luck, packet must be cut before */
            align_put_bits(&s->pb);
231 232 233
            flush_put_bits(&s->pb);
            /* Call the RTP callback to send the last GOB */
            if (s->rtp_callback) {
234
                pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
235 236
                s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
            }
237
            s->ptr_lastgob = pbBufPtr(&s->pb);
238
            put_bits(&s->pb, 17, 1); /* GBSC */
239
            s->gob_number = mb_line / s->gob_index;
240
            put_bits(&s->pb, 5, s->gob_number); /* GN */
241
            put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
242
            put_bits(&s->pb, 5, s->qscale); /* GQUANT */
243
            //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
244 245 246 247
            return pdif;
       } else if (pdif + s->mb_line_avgsize >= s->rtp_payload_size) {
           /* Cut the packet before we can't */
           align_put_bits(&s->pb);
248 249 250
           flush_put_bits(&s->pb);
           /* Call the RTP callback to send the last GOB */
           if (s->rtp_callback) {
251
               pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
252 253
               s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
           }
254
           s->ptr_lastgob = pbBufPtr(&s->pb);
255
           put_bits(&s->pb, 17, 1); /* GBSC */
256
           s->gob_number = mb_line / s->gob_index;
257
           put_bits(&s->pb, 5, s->gob_number); /* GN */
258
           put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
259
           put_bits(&s->pb, 5, s->qscale); /* GQUANT */
260
           //fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif);
261 262 263 264 265
           return pdif;
       }
   }
   return 0;
}
266 267 268 269 270 271 272 273 274

static inline int decide_ac_pred(MpegEncContext * s, DCTELEM block[6][64], int dir[6])
{
    int score0=0, score1=0;
    int i, n;

    for(n=0; n<6; n++){
        INT16 *ac_val, *ac_val1;

M
Michael Niedermayer 已提交
275
        ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
276 277
        ac_val1= ac_val;
        if(dir[n]){
M
Michael Niedermayer 已提交
278
            ac_val-= s->block_wrap[n]*16;
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
            for(i=1; i<8; i++){
                const int level= block[n][block_permute_op(i   )];
                score0+= ABS(level);
                score1+= ABS(level - ac_val[i+8]);
                ac_val1[i  ]=    block[n][block_permute_op(i<<3)];
                ac_val1[i+8]= level;
            }
        }else{
            ac_val-= 16;
            for(i=1; i<8; i++){
                const int level= block[n][block_permute_op(i<<3)];
                score0+= ABS(level);
                score1+= ABS(level - ac_val[i]);
                ac_val1[i  ]= level;
                ac_val1[i+8]=    block[n][block_permute_op(i   )];
            }
        }
    }

    return score0 > score1 ? 1 : 0;    
}

void mpeg4_encode_mb(MpegEncContext * s,
		    DCTELEM block[6][64],
		    int motion_x, int motion_y)
{
305
    int cbpc, cbpy, i, pred_x, pred_y;
306
    int bits;
307 308 309 310
    PutBitContext * const pb2    = s->data_partitioning                         ? &s->pb2    : &s->pb;
    PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
    PutBitContext * const dc_pb  = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2    : &s->pb;
    const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
311
    
312 313 314
    //    printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
    if (!s->mb_intra) {
        /* compute cbp */
315
        int cbp = 0;
316
        for (i = 0; i < 6; i++) {
317 318
            if (s->block_last_index[i] >= 0)
                cbp |= 1 << (5 - i);
319
        }
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338

        if(s->pict_type==B_TYPE){
            static const int mb_type_table[8]= {-1, 2, 3, 1,-1,-1,-1, 0}; /* convert from mv_dir to type */
            int mb_type=  mb_type_table[s->mv_dir];
            
            if(s->mb_x==0){
                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;
            }

            /* nothing to do if this MB was skiped in the next P Frame */
            if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){
                s->skip_count++;
                s->mv[0][0][0]= 
                s->mv[0][0][1]= 
                s->mv[1][0][0]= 
                s->mv[1][0][1]= 0;
339
                s->mv_dir= MV_DIR_FORWARD; //doesnt matter
340 341 342 343 344 345
                return;
            }

            if ((cbp | motion_x | motion_y | mb_type) ==0) {
                /* direct MB with MV={0,0} */
                put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
346 347 348 349 350

                if(interleaved_stats){
                    s->misc_bits++;
                    s->last_bits++;
                }
351 352 353 354 355 356 357 358 359 360 361
                s->skip_count++;
                return;
            }
            put_bits(&s->pb, 1, 0);	/* mb coded modb1=0 */
            put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
            put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
            if(cbp) put_bits(&s->pb, 6, cbp);
            
            if(cbp && mb_type)
                put_bits(&s->pb, 1, 0); /* no q-scale change */

362 363 364 365 366
            if(interleaved_stats){
                bits= get_bit_count(&s->pb);
                s->misc_bits+= bits - s->last_bits;
                s->last_bits=bits;
            }
M
Michael Niedermayer 已提交
367

368 369 370 371 372
            switch(mb_type)
            {
            case 0: /* direct */
                h263_encode_motion(s, motion_x, 1);
                h263_encode_motion(s, motion_y, 1);                
373 374
                s->b_count++;
                s->f_count++;
375 376 377 378 379 380 381 382 383 384
                break;
            case 1: /* bidir */
                h263_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code);
                h263_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code);
                h263_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code);
                h263_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code);
                s->last_mv[0][0][0]= s->mv[0][0][0];
                s->last_mv[0][0][1]= s->mv[0][0][1];
                s->last_mv[1][0][0]= s->mv[1][0][0];
                s->last_mv[1][0][1]= s->mv[1][0][1];
385 386
                s->b_count++;
                s->f_count++;
387 388 389 390 391 392
                break;
            case 2: /* backward */
                h263_encode_motion(s, motion_x - s->last_mv[1][0][0], s->b_code);
                h263_encode_motion(s, motion_y - s->last_mv[1][0][1], s->b_code);
                s->last_mv[1][0][0]= motion_x;
                s->last_mv[1][0][1]= motion_y;
393
                s->b_count++;
394 395 396 397 398 399
                break;
            case 3: /* forward */
                h263_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code);
                h263_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code);
                s->last_mv[0][0][0]= motion_x;
                s->last_mv[0][0][1]= motion_y;
400
                s->f_count++;
401
                break;
402 403
            default:
                printf("unknown mb type\n");
404 405
                return;
            }
406 407 408 409 410 411

            if(interleaved_stats){
                bits= get_bit_count(&s->pb);
                s->mv_bits+= bits - s->last_bits;
                s->last_bits=bits;
            }
412

413 414
            /* encode each block */
            for (i = 0; i < 6; i++) {
415 416 417 418 419 420 421
                mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, &s->pb);
            }

            if(interleaved_stats){
                bits= get_bit_count(&s->pb);
                s->p_tex_bits+= bits - s->last_bits;
                s->last_bits=bits;
422 423 424
            }
        }else{ /* s->pict_type==B_TYPE */
            if ((cbp | motion_x | motion_y) == 0 && s->mv_type==MV_TYPE_16X16) {
M
Michael Niedermayer 已提交
425 426 427 428
                /* check if the B frames can skip it too, as we must skip it if we skip here 
                   why didnt they just compress the skip-mb bits instead of reusing them ?! */
                if(s->max_b_frames>0){
                    int i;
429 430 431 432 433 434 435 436 437 438 439
                    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;
                    p_pic= s->new_picture[0] + offset;
                    
M
Michael Niedermayer 已提交
440 441
                    s->mb_skiped=1;
                    for(i=0; i<s->max_b_frames; i++){
M
Michael Niedermayer 已提交
442 443 444 445 446 447 448
                        uint8_t *b_pic;
                        int diff;

                        if(s->coded_order[i+1].pict_type!=B_TYPE) break;

                        b_pic= s->coded_order[i+1].picture[0] + offset;
                        diff= pix_abs16x16(p_pic, b_pic, s->linesize);
449
                        if(diff>s->qscale*70){ //FIXME check that 70 is optimal
M
Michael Niedermayer 已提交
450 451 452 453 454 455 456 457 458 459
                            s->mb_skiped=0;
                            break;
                        }
                    }
                }else
                    s->mb_skiped=1; 

                if(s->mb_skiped==1){
                    /* skip macroblock */
                    put_bits(&s->pb, 1, 1);
460 461 462 463 464

                    if(interleaved_stats){
                        s->misc_bits++;
                        s->last_bits++;
                    }
M
Michael Niedermayer 已提交
465 466 467
                    s->skip_count++;
                    return;
                }
468
            }
469

470 471 472 473 474 475 476 477
            put_bits(&s->pb, 1, 0);	/* mb coded */
            if(s->mv_type==MV_TYPE_16X16){
                cbpc = cbp & 3;
                put_bits(&s->pb,
                        inter_MCBPC_bits[cbpc],
                        inter_MCBPC_code[cbpc]);
                cbpy = cbp >> 2;
                cbpy ^= 0xf;
478
                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
479
                    
480 481 482 483 484
                if(interleaved_stats){
                    bits= get_bit_count(&s->pb);
                    s->misc_bits+= bits - s->last_bits;
                    s->last_bits=bits;
                }
485

486 487 488 489 490 491 492 493 494 495 496 497
                /* motion vectors: 16x16 mode */
                h263_pred_motion(s, 0, &pred_x, &pred_y);
            
                h263_encode_motion(s, motion_x - pred_x, s->f_code);
                h263_encode_motion(s, motion_y - pred_y, s->f_code);
            }else{
                cbpc = (cbp & 3)+16;
                put_bits(&s->pb,
                        inter_MCBPC_bits[cbpc],
                        inter_MCBPC_code[cbpc]);
                cbpy = cbp >> 2;
                cbpy ^= 0xf;
498
                put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
499

500 501 502 503 504
                if(interleaved_stats){
                    bits= get_bit_count(&s->pb);
                    s->misc_bits+= bits - s->last_bits;
                    s->last_bits=bits;
                }
505 506 507 508 509 510 511 512

                for(i=0; i<4; i++){
                    /* motion vectors: 8x8 mode*/
                    h263_pred_motion(s, i, &pred_x, &pred_y);

                    h263_encode_motion(s, s->motion_val[ s->block_index[i] ][0] - pred_x, s->f_code);
                    h263_encode_motion(s, s->motion_val[ s->block_index[i] ][1] - pred_y, s->f_code);
                }
M
Michael Niedermayer 已提交
513
            }
514 515 516 517 518 519

            if(interleaved_stats){ 
                bits= get_bit_count(&s->pb);
                s->mv_bits+= bits - s->last_bits;
                s->last_bits=bits;
            }
520

521 522
            /* encode each block */
            for (i = 0; i < 6; i++) {
523 524 525 526 527 528 529
                mpeg4_encode_block(s, block[i], i, 0, zigzag_direct, NULL, tex_pb);
            }

            if(interleaved_stats){
                bits= get_bit_count(&s->pb);
                s->p_tex_bits+= bits - s->last_bits;
                s->last_bits=bits;
530
            }
531
            s->f_count++;
532 533
        }
    } else {
534
        int cbp;
535 536 537 538 539 540 541 542 543
        int dc_diff[6];   //dc values with the dc prediction subtracted 
        int dir[6];  //prediction direction
        int zigzag_last_index[6];
        UINT8 *scan_table[6];

        for(i=0; i<6; i++){
            const int level= block[i][0];
            UINT16 *dc_ptr;

544
            dc_diff[i]= level - ff_mpeg4_pred_dc(s, i, &dc_ptr, &dir[i]);
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
            if (i < 4) {
                *dc_ptr = level * s->y_dc_scale;
            } else {
                *dc_ptr = level * s->c_dc_scale;
            }
        }

        s->ac_pred= decide_ac_pred(s, block, dir);

        if(s->ac_pred){
            for(i=0; i<6; i++){
                UINT8 *st;
                int last_index;

                mpeg4_inv_pred_ac(s, block[i], i, dir[i]);
                if (dir[i]==0) st = ff_alternate_vertical_scan; /* left */
                else           st = ff_alternate_horizontal_scan; /* top */

                for(last_index=63; last_index>=0; last_index--) //FIXME optimize
                    if(block[i][st[last_index]]) break;
                zigzag_last_index[i]= s->block_last_index[i];
                s->block_last_index[i]= last_index;
                scan_table[i]= st;
            }
        }else{
            for(i=0; i<6; i++)
                scan_table[i]= zigzag_direct;
        }

        /* compute cbp */
        cbp = 0;
        for (i = 0; i < 6; i++) {
            if (s->block_last_index[i] >= 1)
                cbp |= 1 << (5 - i);
        }

        cbpc = cbp & 3;
        if (s->pict_type == I_TYPE) {
            put_bits(&s->pb,
                intra_MCBPC_bits[cbpc],
                intra_MCBPC_code[cbpc]);
        } else {
            put_bits(&s->pb, 1, 0);	/* mb coded */
            put_bits(&s->pb,
                inter_MCBPC_bits[cbpc + 4],
                inter_MCBPC_code[cbpc + 4]);
        }
592
        put_bits(pb2, 1, s->ac_pred);
593
        cbpy = cbp >> 2;
594
        put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
595

596 597 598 599 600
        if(interleaved_stats){
            bits= get_bit_count(&s->pb);
            s->misc_bits+= bits - s->last_bits;
            s->last_bits=bits;
        }
601

602 603
        /* encode each block */
        for (i = 0; i < 6; i++) {
604
            mpeg4_encode_block(s, block[i], i, dc_diff[i], scan_table[i], dc_pb, tex_pb);
605 606
        }

607 608 609 610 611
        if(interleaved_stats){
            bits= get_bit_count(&s->pb);
            s->i_tex_bits+= bits - s->last_bits;
            s->last_bits=bits;
        }
612 613
        s->i_count++;

614 615 616 617 618 619
        /* restore ac coeffs & last_index stuff if we messed them up with the prediction */
        if(s->ac_pred){
            for(i=0; i<6; i++){
                int j;    
                INT16 *ac_val;

M
Michael Niedermayer 已提交
620
                ac_val = s->ac_val[0][0] + s->block_index[i] * 16;
621 622 623 624 625 626 627 628 629 630 631 632 633 634

                if(dir[i]){
                    for(j=1; j<8; j++) 
                        block[i][block_permute_op(j   )]= ac_val[j+8];
                }else{
                    for(j=1; j<8; j++) 
                        block[i][block_permute_op(j<<3)]= ac_val[j  ];
                }
                s->block_last_index[i]= zigzag_last_index[i];
            }
        }
    }
}

F
Fabrice Bellard 已提交
635 636 637 638 639
void h263_encode_mb(MpegEncContext * s,
		    DCTELEM block[6][64],
		    int motion_x, int motion_y)
{
    int cbpc, cbpy, i, cbp, pred_x, pred_y;
640 641 642 643 644
    INT16 pred_dc;
    INT16 rec_intradc[6];
    UINT16 *dc_ptr[6];
           
    //printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
645
    if (!s->mb_intra) {
646
        /* compute cbp */
647 648 649 650 651 652 653 654 655 656
        cbp = 0;
        for (i = 0; i < 6; i++) {
            if (s->block_last_index[i] >= 0)
                cbp |= 1 << (5 - i);
        }
        if ((cbp | motion_x | motion_y) == 0) {
            /* skip macroblock */
            put_bits(&s->pb, 1, 1);
            return;
        }
657
        put_bits(&s->pb, 1, 0);	/* mb coded */
658 659
        cbpc = cbp & 3;
        put_bits(&s->pb,
660 661
		    inter_MCBPC_bits[cbpc],
		    inter_MCBPC_code[cbpc]);
662 663 664 665
        cbpy = cbp >> 2;
        cbpy ^= 0xf;
        put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);

666
        /* motion vectors: 16x16 mode only now */
667
        h263_pred_motion(s, 0, &pred_x, &pred_y);
668
      
669 670 671 672 673 674 675 676
        if (!s->umvplus) {  
            h263_encode_motion(s, motion_x - pred_x, s->f_code);
            h263_encode_motion(s, motion_y - pred_y, s->f_code);
        }
        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))
677
                /* To prevent Start Code emulation */
678 679
                put_bits(&s->pb,1,1);
        }
680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
    } else {
        int li = s->h263_aic ? 0 : 1;
        
        cbp = 0;
        for(i=0; i<6; i++) {
            /* Predict DC */
            if (s->h263_aic && s->mb_intra) {
                INT16 level = block[i][0];
            
                pred_dc = h263_pred_dc(s, i, &dc_ptr[i]);
                level -= pred_dc;
                /* Quant */
                if (level < 0)
                    level = (level + (s->qscale >> 1))/(s->y_dc_scale);
                else
                    level = (level - (s->qscale >> 1))/(s->y_dc_scale);
                    
                /* AIC can change CBP */
                if (level == 0 && s->block_last_index[i] == 0)
                    s->block_last_index[i] = -1;
                else if (level < -127)
                    level = -127;
                else if (level > 127)
                    level = 127;
                
                block[i][0] = level;
                /* Reconstruction */ 
                rec_intradc[i] = (s->y_dc_scale*level) + pred_dc;
                /* 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;
                                
                /* Update AC/DC tables */
                *dc_ptr[i] = rec_intradc[i];
            }
            /* compute cbp */
            if (s->block_last_index[i] >= li)
                cbp |= 1 << (5 - i);
        }
F
Fabrice Bellard 已提交
725

726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
        cbpc = cbp & 3;
        if (s->pict_type == I_TYPE) {
            put_bits(&s->pb,
                intra_MCBPC_bits[cbpc],
                intra_MCBPC_code[cbpc]);
        } else {
            put_bits(&s->pb, 1, 0);	/* mb coded */
            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 */
            put_bits(&s->pb, 1, 0);	/* no AC prediction */
        }
        cbpy = cbp >> 2;
        put_bits(&s->pb, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
F
Fabrice Bellard 已提交
743 744
    }

745 746
    for(i=0; i<6; i++) {
        /* encode each block */
747
        h263_encode_block(s, block[i], i);
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776
    
        /* Update INTRADC for decoding */
        if (s->h263_aic && s->mb_intra) {
            block[i][0] = rec_intradc[i];
            
        }
    }
}

static int h263_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr)
{
    int x, y, wrap, a, c, pred_dc, scale;
    INT16 *dc_val, *ac_val;

    /* find prediction */
    if (n < 4) {
        x = 2 * s->mb_x + 1 + (n & 1);
        y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
        wrap = s->mb_width * 2 + 2;
        dc_val = s->dc_val[0];
        ac_val = s->ac_val[0][0];
        scale = s->y_dc_scale;
    } else {
        x = s->mb_x + 1;
        y = s->mb_y + 1;
        wrap = s->mb_width + 2;
        dc_val = s->dc_val[n - 4 + 1];
        ac_val = s->ac_val[n - 4 + 1][0];
        scale = s->c_dc_scale;
F
Fabrice Bellard 已提交
777
    }
778 779 780 781 782 783 784
    /* B C
     * A X 
     */
    a = dc_val[(x - 1) + (y) * wrap];
    c = dc_val[(x) + (y - 1) * wrap];
    
    /* No prediction outside GOB boundary */
785
    if (s->first_slice_line && ((n < 2) || (n > 3)))
786 787 788 789 790 791 792 793 794 795 796 797 798 799
        c = 1024;
    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;
    
    /* we assume pred is positive */
    //pred_dc = (pred_dc + (scale >> 1)) / scale;
    *dc_val_ptr = &dc_val[x + y * wrap];
    return pred_dc;
F
Fabrice Bellard 已提交
800 801
}

802

803
void h263_pred_acdc(MpegEncContext * s, INT16 *block, int n)
804
{
805 806
    int x, y, wrap, a, c, pred_dc, scale, i;
    INT16 *dc_val, *ac_val, *ac_val1;
807 808 809 810 811 812 813

    /* find prediction */
    if (n < 4) {
        x = 2 * s->mb_x + 1 + (n & 1);
        y = 2 * s->mb_y + 1 + ((n & 2) >> 1);
        wrap = s->mb_width * 2 + 2;
        dc_val = s->dc_val[0];
814
        ac_val = s->ac_val[0][0];
815 816 817 818 819 820
        scale = s->y_dc_scale;
    } else {
        x = s->mb_x + 1;
        y = s->mb_y + 1;
        wrap = s->mb_width + 2;
        dc_val = s->dc_val[n - 4 + 1];
821
        ac_val = s->ac_val[n - 4 + 1][0];
822 823
        scale = s->c_dc_scale;
    }
824 825 826 827
    
    ac_val += ((y) * wrap + (x)) * 16;
    ac_val1 = ac_val;
    
828 829 830 831 832 833
    /* B C
     * A X 
     */
    a = dc_val[(x - 1) + (y) * wrap];
    c = dc_val[(x) + (y - 1) * wrap];
    
834
    /* No prediction outside GOB boundary */
835
    if (s->first_slice_line && ((n < 2) || (n > 3)))
836
        c = 1024;
837
    pred_dc = 1024;
838 839 840
    if (s->ac_pred) {
        if (s->h263_aic_dir) {
            /* left prediction */
841 842 843 844 845 846
            if (a != 1024) {
                ac_val -= 16;
                for(i=1;i<8;i++) {
                    block[block_permute_op(i*8)] += ac_val[i];
                }
                pred_dc = a;
847 848 849
            }
        } else {
            /* top prediction */
850 851 852 853 854 855
            if (c != 1024) {
                ac_val -= 16 * wrap;
                for(i=1;i<8;i++) {
                    block[block_permute_op(i)] += ac_val[i + 8];
                }
                pred_dc = c;
856 857
            }
        }
858 859 860 861 862 863 864 865
    } 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;
866
    }
867 868 869 870 871 872 873 874 875 876 877 878
    
    /* we assume pred is positive */
    block[0]=block[0]*scale + pred_dc;
    
    if (block[0] < 0)
        block[0] = 0;
    else if (!(block[0] & 1))
        block[0]++;
    
    /* Update AC/DC tables */
    dc_val[(x) + (y) * wrap] = block[0];
    
879 880 881 882 883 884 885 886
    /* left copy */
    for(i=1;i<8;i++)
        ac_val1[i] = block[block_permute_op(i * 8)];
    /* top copy */
    for(i=1;i<8;i++)
        ac_val1[8 + i] = block[block_permute_op(i)];
}

F
Fabrice Bellard 已提交
887 888 889
INT16 *h263_pred_motion(MpegEncContext * s, int block, 
                        int *px, int *py)
{
M
Michael Niedermayer 已提交
890
    int xy, wrap;
F
Fabrice Bellard 已提交
891
    INT16 *A, *B, *C, *mot_val;
892
    static const int off[4]= {2, 1, 1, -1};
F
Fabrice Bellard 已提交
893

M
Michael Niedermayer 已提交
894 895
    wrap = s->block_wrap[0];
    xy = s->block_index[block];
F
Fabrice Bellard 已提交
896

Z
Zdenek Kabelac 已提交
897
    mot_val = s->motion_val[xy];
F
Fabrice Bellard 已提交
898

899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937
    A = s->motion_val[xy - 1];
    /* special case for first (slice) line */
    if ((s->mb_y == 0 || s->first_slice_line) && block<3) {
        // we cant just change some MVs to simulate that as we need them for the B frames (and ME)
        // 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){ //rare
                C = s->motion_val[xy + 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){ //rare
                C = s->motion_val[xy + 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 = s->motion_val[xy - wrap];
            C = s->motion_val[xy + off[block] - wrap];
            if(s->mb_x == s->resync_mb_x) //rare
                A[0]=A[1]=0;
    
            *px = mid_pred(A[0], B[0], C[0]);
            *py = mid_pred(A[1], B[1], C[1]);
        }
F
Fabrice Bellard 已提交
938
    } else {
939 940
        B = s->motion_val[xy - wrap];
        C = s->motion_val[xy + off[block] - wrap];
F
Fabrice Bellard 已提交
941 942 943 944 945 946
        *px = mid_pred(A[0], B[0], C[0]);
        *py = mid_pred(A[1], B[1], C[1]);
    }
    return mot_val;
}

947
static void h263_encode_motion(MpegEncContext * s, int val, int f_code)
F
Fabrice Bellard 已提交
948 949 950 951 952 953 954 955
{
    int range, l, m, bit_size, sign, code, bits;

    if (val == 0) {
        /* zero vector */
        code = 0;
        put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
    } else {
956
        bit_size = f_code - 1;
F
Fabrice Bellard 已提交
957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
        range = 1 << bit_size;
        /* modulo encoding */
        l = range * 32;
        m = 2 * l;
        if (val < -l) {
            val += m;
        } else if (val >= l) {
            val -= m;
        }

        if (val >= 0) {
            sign = 0;
        } else {
            val = -val;
            sign = 1;
        }
973 974 975
        val--;
        code = (val >> bit_size) + 1;
        bits = val & (range - 1);
F
Fabrice Bellard 已提交
976 977 978 979 980 981 982 983

        put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); 
        if (bit_size > 0) {
            put_bits(&s->pb, bit_size, bits);
        }
    }
}

984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
/* Encode MV differences on H.263+ with Unrestricted MV mode */
static void h263p_encode_umotion(MpegEncContext * s, int val)
{
    short sval = 0; 
    short i = 0;
    short n_bits = 0;
    short temp_val;
    int code = 0;
    int tcode;
    
    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 {
        
        sval = ((val < 0) ? (short)(-val):(short)val);
        temp_val = sval;
        
        while (temp_val != 0) {
            temp_val = temp_val >> 1;
            n_bits++;
        }
        
        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);
    }
}

1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
static void init_mv_penalty_and_fcode(MpegEncContext *s)
{
    int f_code;
    int mv;
    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;

                bit_size = s->f_code - 1;
                range = 1 << bit_size;

                val=mv;
                if (val < 0) 
                    val = -val;
                val--;
                code = (val >> bit_size) + 1;
                if(code<33){
                    len= mvtab[code][1] + 1 + bit_size;
                }else{
                    len= mvtab[32][1] + 2 + bit_size;
                }
            }

            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;
        }
    }
1059 1060 1061 1062

    for(mv=0; mv<MAX_MV*2+1; mv++){
        umv_fcode_tab[mv]= 1;
    }
1063 1064
}

F
Falk Hüffner 已提交
1065
static void init_uni_dc_tab(void)
M
Michael Niedermayer 已提交
1066 1067 1068
{
    int level, uni_code, uni_len;

1069
    for(level=-256; level<256; level++){
M
Michael Niedermayer 已提交
1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
        int size, v, l;
        /* find number of bits */
        size = 0;
        v = abs(level);
        while (v) {
            v >>= 1;
	    size++;
        }

        if (level < 0)
            l= (-level) ^ ((1 << size) - 1);
        else
            l= level;

        /* luminance */
        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++;
            }
        }
        uni_DCtab_lum[level+256][0]= uni_code;
        uni_DCtab_lum[level+256][1]= uni_len;

        /* chrominance */
        uni_code= DCtab_chrom[size][0];
        uni_len = DCtab_chrom[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++;
            }
        }
        uni_DCtab_chrom[level+256][0]= uni_code;
        uni_DCtab_chrom[level+256][1]= uni_len;

    }
}

1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
static void init_uni_mpeg4_rl_tab(RLTable *rl, UINT32 *bits_tab, UINT8 *len_tab){
    int slevel, run, last;
    
    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;
                
                len_tab[index]= 100;
                     
                /* 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++;
                
                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++;
                
                    if(code!=rl->n && len < len_tab[index]){
                        bits_tab[index]= bits;
                        len_tab [index]= len;
                    }
                }
#endif 
#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++;
                
                    if(code!=rl->n && len < len_tab[index]){
                        bits_tab[index]= bits;
                        len_tab [index]= len;
                    }
                }
#endif           
                /* ESC3 */        
                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
                
                if(len < len_tab[index]){
                    bits_tab[index]= bits;
                    len_tab [index]= len;
                }
            }
        }
    }
}

1202
void h263_encode_init(MpegEncContext *s)
F
Fabrice Bellard 已提交
1203 1204 1205 1206 1207
{
    static int done = 0;

    if (!done) {
        done = 1;
M
Michael Niedermayer 已提交
1208 1209 1210

        init_uni_dc_tab();

F
Fabrice Bellard 已提交
1211 1212
        init_rl(&rl_inter);
        init_rl(&rl_intra);
1213
        init_rl(&rl_intra_aic);
1214 1215 1216
        
        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);
1217 1218

        init_mv_penalty_and_fcode(s);
F
Fabrice Bellard 已提交
1219
    }
1220
    s->mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
1221
    
1222
    // use fcodes >1 only for mpeg4 & h263 & h263p FIXME
1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233
    switch(s->codec_id){
    case CODEC_ID_MPEG4:
        s->fcode_tab= fcode_tab;
        s->min_qcoeff= -2048;
        s->max_qcoeff=  2047;
        break;
    case CODEC_ID_H263P:
        s->fcode_tab= umv_fcode_tab;
        s->min_qcoeff= -128;
        s->max_qcoeff=  127;
        break;
1234
        //Note for mpeg4 & h263 the dc-scale table will be set per frame as needed later 
1235 1236 1237
    default: //nothing needed default table allready set in mpegvideo.c
        s->min_qcoeff= -128;
        s->max_qcoeff=  127;
1238 1239
        s->y_dc_scale_table=
        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
1240 1241
    }

1242 1243 1244 1245 1246 1247 1248
    if(s->mpeg_quant){
        s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
        s->inter_quant_bias= 0;
    }else{
        s->intra_quant_bias=0;
        s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
    }
F
Fabrice Bellard 已提交
1249 1250 1251 1252
}

static void h263_encode_block(MpegEncContext * s, DCTELEM * block, int n)
{
1253 1254
    int level, run, last, i, j, last_index, last_non_zero, sign, slevel, code;
    RLTable *rl;
F
Fabrice Bellard 已提交
1255

1256 1257
    rl = &rl_inter;
    if (s->mb_intra && !s->h263_aic) {
1258 1259
        /* DC coef */
	    level = block[0];
F
Fabrice Bellard 已提交
1260 1261 1262 1263 1264
        /* 255 cannot be represented, so we clamp */
        if (level > 254) {
            level = 254;
            block[0] = 254;
        }
1265 1266 1267 1268 1269 1270 1271 1272 1273 1274
        /* 0 cannot be represented also */
        else if (!level) {
            level = 1;
            block[0] = 1;
        }
	    if (level == 128)
	        put_bits(&s->pb, 8, 0xff);
	    else
	        put_bits(&s->pb, 8, level & 0xff);
	    i = 1;
F
Fabrice Bellard 已提交
1275
    } else {
1276
	    i = 0;
1277 1278
	    if (s->h263_aic && s->mb_intra)
	        rl = &rl_intra_aic;
F
Fabrice Bellard 已提交
1279
    }
1280
   
F
Fabrice Bellard 已提交
1281 1282 1283 1284
    /* AC coefs */
    last_index = s->block_last_index[n];
    last_non_zero = i - 1;
    for (; i <= last_index; i++) {
1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
        j = zigzag_direct[i];
        level = block[j];
        if (level) {
            run = i - last_non_zero - 1;
            last = (i == last_index);
            sign = 0;
            slevel = level;
            if (level < 0) {
                sign = 1;
                level = -level;
            }
F
Fabrice Bellard 已提交
1296 1297 1298 1299 1300 1301 1302 1303 1304
            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) {
                put_bits(&s->pb, 1, last);
                put_bits(&s->pb, 6, run);
                put_bits(&s->pb, 8, slevel & 0xff);
            } else {
                put_bits(&s->pb, 1, sign);
            }
1305 1306
	        last_non_zero = i;
	    }
F
Fabrice Bellard 已提交
1307 1308 1309 1310 1311
    }
}

/***************************************************/

1312
void ff_mpeg4_stuffing(PutBitContext * pbc)
M
Michael Niedermayer 已提交
1313 1314 1315 1316
{
    int length;
    put_bits(pbc, 1, 0);
    length= (-get_bit_count(pbc))&7;
1317
    if(length) put_bits(pbc, length, (1<<length)-1);
M
Michael Niedermayer 已提交
1318 1319
}

1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
/* must be called before writing the header */
void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
    int time_div, time_mod;

    if(s->pict_type==I_TYPE){ //we will encode a vol header
        s->time_increment_resolution= s->frame_rate/ff_gcd(s->frame_rate, FRAME_RATE_BASE);
        if(s->time_increment_resolution>=256*256) s->time_increment_resolution= 256*128;

        s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
    }
1330 1331 1332 1333 1334
    
    if(s->avctx->pts)
        s->time= (s->avctx->pts*s->time_increment_resolution + 500*1000)/(1000*1000);
    else
        s->time= picture_number*(INT64)FRAME_RATE_BASE*s->time_increment_resolution/s->frame_rate;
1335 1336 1337 1338
    time_div= s->time/s->time_increment_resolution;
    time_mod= s->time%s->time_increment_resolution;

    if(s->pict_type==B_TYPE){
1339
        s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
1340 1341 1342 1343 1344 1345 1346 1347
    }else{
        s->last_time_base= s->time_base;
        s->time_base= time_div;
        s->pp_time= s->time - s->last_non_b_time;
        s->last_non_b_time= s->time;
    }
}

1348
static void mpeg4_encode_vol_header(MpegEncContext * s)
F
Fabrice Bellard 已提交
1349
{
1350
    int vo_ver_id=1; //must be 2 if we want GMC or q-pel
1351
    char buf[255];
M
Michael Niedermayer 已提交
1352 1353 1354

    s->vo_type= s->has_b_frames ? CORE_VO_TYPE : SIMPLE_VO_TYPE;

1355 1356 1357 1358 1359 1360
    put_bits(&s->pb, 16, 0);
    put_bits(&s->pb, 16, 0x100);        /* video obj */
    put_bits(&s->pb, 16, 0);
    put_bits(&s->pb, 16, 0x120);        /* video obj layer */

    put_bits(&s->pb, 1, 0);		/* random access vol */
M
Michael Niedermayer 已提交
1361
    put_bits(&s->pb, 8, s->vo_type);	/* video obj type indication */
1362 1363 1364
    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 */
1365 1366 1367 1368
    if(s->aspect_ratio_info) 
        put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
    else
        put_bits(&s->pb, 4, 1);		/* aspect ratio info= sqare pixel */
1369 1370 1371 1372 1373
    if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
    {
	put_bits(&s->pb, 8, s->aspected_width);
	put_bits(&s->pb, 8, s->aspected_height);
    }
M
Michael Niedermayer 已提交
1374 1375 1376

    if(s->low_delay){
        put_bits(&s->pb, 1, 1);		/* vol control parameters= yes */
M
Michael Niedermayer 已提交
1377
        put_bits(&s->pb, 2, 1);		/* chroma format YUV 420/YV12 */
M
Michael Niedermayer 已提交
1378 1379 1380 1381 1382 1383
        put_bits(&s->pb, 1, s->low_delay);
        put_bits(&s->pb, 1, 0);		/* vbv parameters= no */
    }else{
        put_bits(&s->pb, 1, 0);		/* vol control parameters= no */
    }

1384 1385
    put_bits(&s->pb, 2, RECT_SHAPE);	/* vol shape= rectangle */
    put_bits(&s->pb, 1, 1);		/* marker bit */
1386 1387
    
    put_bits(&s->pb, 16, s->time_increment_resolution);
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404
    if (s->time_increment_bits < 1)
        s->time_increment_bits = 1;
    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 */
    put_bits(&s->pb, 1, 0);		/* interlace */
    put_bits(&s->pb, 1, 1);		/* obmc disable */
    if (vo_ver_id == 1) {
        put_bits(&s->pb, 1, s->vol_sprite_usage=0);		/* sprite enable */
    }else{ /* vo_ver_id == 2 */
        put_bits(&s->pb, 2, s->vol_sprite_usage=0);		/* sprite enable */
    }
    put_bits(&s->pb, 1, 0);		/* not 8 bit */
1405 1406 1407
    put_bits(&s->pb, 1, s->mpeg_quant);	/* quant type= (0=h263 style)*/
    if(s->mpeg_quant) put_bits(&s->pb, 2, 0); /* no custom matrixes */

1408 1409 1410
    if (vo_ver_id != 1)
        put_bits(&s->pb, 1, s->quarter_sample=0);
    put_bits(&s->pb, 1, 1);		/* complexity estimation disable */
1411 1412 1413 1414 1415 1416 1417
    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){
        put_bits(&s->pb, 1, 0);		/* no rvlc */
    }

1418 1419 1420 1421 1422 1423
    if (vo_ver_id != 1){
        put_bits(&s->pb, 1, 0);		/* newpred */
        put_bits(&s->pb, 1, 0);		/* reduced res vop */
    }
    put_bits(&s->pb, 1, 0);		/* scalability */

1424
    ff_mpeg4_stuffing(&s->pb);
M
Michael Niedermayer 已提交
1425 1426
    put_bits(&s->pb, 16, 0);
    put_bits(&s->pb, 16, 0x1B2);	/* user_data */
1427
    sprintf(buf, "FFmpeg%sb%s", FFMPEG_VERSION, LIBAVCODEC_BUILD_STR);
1428
    put_string(&s->pb, buf);
1429

1430
    ff_mpeg4_stuffing(&s->pb);
1431 1432 1433 1434 1435
}

/* write mpeg4 VOP header */
void mpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
{
1436 1437 1438
    int time_incr;
    int time_div, time_mod;
    
1439 1440 1441 1442 1443
    if(s->pict_type==I_TYPE){
        s->no_rounding=0;
        if(picture_number==0 || !s->strict_std_compliance)
            mpeg4_encode_vol_header(s);
    }
1444 1445 1446
    
//printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE);
    
1447 1448
    put_bits(&s->pb, 16, 0);	        /* vop header */
    put_bits(&s->pb, 16, 0x1B6);	/* vop header */
F
Fabrice Bellard 已提交
1449
    put_bits(&s->pb, 2, s->pict_type - 1);	/* pict type: I = 0 , P = 1 */
1450

1451 1452
    time_div= s->time/s->time_increment_resolution;
    time_mod= s->time%s->time_increment_resolution;
1453 1454 1455 1456
    time_incr= time_div - s->last_time_base;
    while(time_incr--)
        put_bits(&s->pb, 1, 1);
        
F
Fabrice Bellard 已提交
1457 1458 1459
    put_bits(&s->pb, 1, 0);

    put_bits(&s->pb, 1, 1);	/* marker */
1460
    put_bits(&s->pb, s->time_increment_bits, time_mod);	/* time increment */
F
Fabrice Bellard 已提交
1461 1462
    put_bits(&s->pb, 1, 1);	/* marker */
    put_bits(&s->pb, 1, 1);	/* vop coded */
1463 1464 1465
    if (    s->pict_type == P_TYPE 
        || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE)) {
        s->no_rounding ^= 1;
F
Fabrice Bellard 已提交
1466 1467 1468
	put_bits(&s->pb, 1, s->no_rounding);	/* rounding type */
    }
    put_bits(&s->pb, 3, 0);	/* intra dc VLC threshold */
1469
    //FIXME sprite stuff
F
Fabrice Bellard 已提交
1470 1471 1472 1473 1474

    put_bits(&s->pb, 5, s->qscale);

    if (s->pict_type != I_TYPE)
	put_bits(&s->pb, 3, s->f_code);	/* fcode_for */
1475 1476
    if (s->pict_type == B_TYPE)
	put_bits(&s->pb, 3, s->b_code);	/* fcode_back */
F
Fabrice Bellard 已提交
1477
    //    printf("****frame %d\n", picture_number);
1478 1479 1480

     s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support 
     s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
1481 1482
     s->h_edge_pos= s->width;
     s->v_edge_pos= s->height;
F
Fabrice Bellard 已提交
1483 1484
}

1485
static void h263_dc_scale(MpegEncContext * s)
F
Fabrice Bellard 已提交
1486
{
1487 1488
    s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
    s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
F
Fabrice Bellard 已提交
1489 1490
}

1491
inline int ff_mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr)
F
Fabrice Bellard 已提交
1492
{
M
Michael Niedermayer 已提交
1493
    int a, b, c, wrap, pred, scale;
F
Fabrice Bellard 已提交
1494
    UINT16 *dc_val;
1495
    int dummy;
F
Fabrice Bellard 已提交
1496 1497 1498 1499 1500 1501 1502

    /* find prediction */
    if (n < 4) {
	scale = s->y_dc_scale;
    } else {
	scale = s->c_dc_scale;
    }
M
Michael Niedermayer 已提交
1503 1504
    wrap= s->block_wrap[n];
    dc_val = s->dc_val[0] + s->block_index[n];
F
Fabrice Bellard 已提交
1505 1506 1507 1508

    /* B C
     * A X 
     */
M
Michael Niedermayer 已提交
1509 1510 1511
    a = dc_val[ - 1];
    b = dc_val[ - 1 - wrap];
    c = dc_val[ - wrap];
F
Fabrice Bellard 已提交
1512 1513 1514 1515 1516 1517 1518 1519 1520

    if (abs(a - b) < abs(b - c)) {
	pred = c;
        *dir_ptr = 1; /* top */
    } else {
	pred = a;
        *dir_ptr = 0; /* left */
    }
    /* we assume pred is positive */
1521 1522 1523 1524 1525 1526 1527 1528
#ifdef ARCH_X86
	asm volatile (
		"xorl %%edx, %%edx	\n\t"
		"mul %%ecx		\n\t"
		: "=d" (pred), "=a"(dummy)
		: "a" (pred + (scale >> 1)), "c" (inverse[scale])
	);
#else
F
Fabrice Bellard 已提交
1529
    pred = (pred + (scale >> 1)) / scale;
1530
#endif
F
Fabrice Bellard 已提交
1531 1532

    /* prepare address for prediction update */
M
Michael Niedermayer 已提交
1533
    *dc_val_ptr = &dc_val[0];
F
Fabrice Bellard 已提交
1534 1535 1536 1537

    return pred;
}

1538
void mpeg4_pred_ac(MpegEncContext * s, INT16 *block, int n,
F
Fabrice Bellard 已提交
1539 1540
                   int dir)
{
M
Michael Niedermayer 已提交
1541
    int i;
F
Fabrice Bellard 已提交
1542 1543 1544
    INT16 *ac_val, *ac_val1;

    /* find prediction */
M
Michael Niedermayer 已提交
1545
    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
F
Fabrice Bellard 已提交
1546 1547 1548
    ac_val1 = ac_val;
    if (s->ac_pred) {
        if (dir == 0) {
M
Michael Niedermayer 已提交
1549
            const int xy= s->mb_x-1 + s->mb_y*s->mb_width;
F
Fabrice Bellard 已提交
1550 1551
            /* left prediction */
            ac_val -= 16;
M
Michael Niedermayer 已提交
1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
            
            if(s->mb_x==0 || s->qscale == s->qscale_table[xy] || n==1 || n==3){
                /* same qscale */
                for(i=1;i<8;i++) {
                    block[block_permute_op(i*8)] += ac_val[i];
                }
            }else{
                /* different qscale, we must rescale */
                for(i=1;i<8;i++) {
                    block[block_permute_op(i*8)] += ROUNDED_DIV(ac_val[i]*s->qscale_table[xy], s->qscale);
                }
F
Fabrice Bellard 已提交
1563 1564
            }
        } else {
M
Michael Niedermayer 已提交
1565
            const int xy= s->mb_x + s->mb_y*s->mb_width - s->mb_width;
F
Fabrice Bellard 已提交
1566
            /* top prediction */
M
Michael Niedermayer 已提交
1567
            ac_val -= 16 * s->block_wrap[n];
M
Michael Niedermayer 已提交
1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578

            if(s->mb_y==0 || s->qscale == s->qscale_table[xy] || n==2 || n==3){
                /* same qscale */
                for(i=1;i<8;i++) {
                    block[block_permute_op(i)] += ac_val[i + 8];
                }
            }else{
                /* different qscale, we must rescale */
                for(i=1;i<8;i++) {
                    block[block_permute_op(i)] += ROUNDED_DIV(ac_val[i + 8]*s->qscale_table[xy], s->qscale);
                }
F
Fabrice Bellard 已提交
1579 1580 1581 1582 1583
            }
        }
    }
    /* left copy */
    for(i=1;i<8;i++)
1584
        ac_val1[i] = block[block_permute_op(i * 8)];
1585

F
Fabrice Bellard 已提交
1586 1587
    /* top copy */
    for(i=1;i<8;i++)
1588
        ac_val1[8 + i] = block[block_permute_op(i)];
1589

F
Fabrice Bellard 已提交
1590 1591
}

1592 1593
static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
                              int dir)
F
Fabrice Bellard 已提交
1594
{
M
Michael Niedermayer 已提交
1595
    int i;
1596
    INT16 *ac_val;
F
Fabrice Bellard 已提交
1597

1598
    /* find prediction */
M
Michael Niedermayer 已提交
1599
    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
1600 1601 1602 1603 1604 1605 1606 1607 1608
 
    if (dir == 0) {
        /* left prediction */
        ac_val -= 16;
        for(i=1;i<8;i++) {
            block[block_permute_op(i*8)] -= ac_val[i];
        }
    } else {
        /* top prediction */
M
Michael Niedermayer 已提交
1609
        ac_val -= 16 * s->block_wrap[n];
1610 1611 1612
        for(i=1;i<8;i++) {
            block[block_permute_op(i)] -= ac_val[i + 8];
        }
F
Fabrice Bellard 已提交
1613
    }
1614 1615
}

1616
static inline void mpeg4_encode_dc(PutBitContext * s, int level, int n)
1617
{
M
Michael Niedermayer 已提交
1618
#if 1
1619
//    if(level<-255 || level>255) printf("dc overflow\n");
M
Michael Niedermayer 已提交
1620 1621 1622
    level+=256;
    if (n < 4) {
	/* luminance */
1623
	put_bits(s, uni_DCtab_lum[level][1], uni_DCtab_lum[level][0]);
M
Michael Niedermayer 已提交
1624 1625
    } else {
	/* chrominance */
1626
	put_bits(s, uni_DCtab_chrom[level][1], uni_DCtab_chrom[level][0]);
M
Michael Niedermayer 已提交
1627 1628
    }
#else
1629
    int size, v;
F
Fabrice Bellard 已提交
1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653
    /* find number of bits */
    size = 0;
    v = abs(level);
    while (v) {
	v >>= 1;
	size++;
    }

    if (n < 4) {
	/* luminance */
	put_bits(&s->pb, DCtab_lum[size][1], DCtab_lum[size][0]);
    } else {
	/* chrominance */
	put_bits(&s->pb, DCtab_chrom[size][1], DCtab_chrom[size][0]);
    }

    /* encode remaining bits */
    if (size > 0) {
	if (level < 0)
	    level = (-level) ^ ((1 << size) - 1);
	put_bits(&s->pb, size, level);
	if (size > 8)
	    put_bits(&s->pb, 1, 1);
    }
M
Michael Niedermayer 已提交
1654
#endif
F
Fabrice Bellard 已提交
1655 1656
}

1657
static inline void mpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n, int intra_dc, 
1658
                               UINT8 *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
F
Fabrice Bellard 已提交
1659
{
1660
    int last, i, last_non_zero, sign;
1661
    int code;
F
Fabrice Bellard 已提交
1662
    const RLTable *rl;
1663 1664 1665
    UINT32 *bits_tab;
    UINT8 *len_tab;
    const int last_index = s->block_last_index[n];
F
Fabrice Bellard 已提交
1666

1667
    if (s->mb_intra) { //Note gcc (3.2.1 at least) will optimize this away
F
Fabrice Bellard 已提交
1668
	/* mpeg4 based DC predictor */
1669
	mpeg4_encode_dc(dc_pb, intra_dc, n);
1670
        if(last_index<1) return;
F
Fabrice Bellard 已提交
1671 1672
	i = 1;
        rl = &rl_intra;
1673 1674
        bits_tab= uni_mpeg4_intra_rl_bits;
        len_tab = uni_mpeg4_intra_rl_len;
F
Fabrice Bellard 已提交
1675
    } else {
1676
        if(last_index<0) return;
F
Fabrice Bellard 已提交
1677 1678
	i = 0;
        rl = &rl_inter;
1679 1680
        bits_tab= uni_mpeg4_inter_rl_bits;
        len_tab = uni_mpeg4_inter_rl_len;
F
Fabrice Bellard 已提交
1681 1682 1683 1684
    }

    /* AC coefs */
    last_non_zero = i - 1;
1685 1686 1687
#if 1
    for (; i < last_index; i++) {
	int level = block[ scan_table[i] ];
F
Fabrice Bellard 已提交
1688
	if (level) {
1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716
	    int run = i - last_non_zero - 1;
            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);
            }
	    last_non_zero = i;
	}
    }
    /*if(i<=last_index)*/{
	int level = block[ scan_table[i] ];
        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++) {
	const int slevel = block[ scan_table[i] ];
	if (slevel) {
            int level;
	    int run = i - last_non_zero - 1;
F
Fabrice Bellard 已提交
1717 1718
	    last = (i == last_index);
	    sign = 0;
1719
	    level = slevel;
F
Fabrice Bellard 已提交
1720 1721 1722 1723 1724
	    if (level < 0) {
		sign = 1;
		level = -level;
	    }
            code = get_rl_index(rl, last, run, level);
1725
            put_bits(ac_pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
F
Fabrice Bellard 已提交
1726 1727 1728 1729 1730 1731 1732 1733
            if (code == rl->n) {
                int level1, run1;
                level1 = level - rl->max_level[last][run];
                if (level1 < 1) 
                    goto esc2;
                code = get_rl_index(rl, last, run, level1);
                if (code == rl->n) {
                esc2:
1734
                    put_bits(ac_pb, 1, 1);
F
Fabrice Bellard 已提交
1735 1736 1737 1738 1739 1740 1741 1742 1743
                    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 */
1744 1745 1746 1747 1748 1749
                        put_bits(ac_pb, 1, 1);
                        put_bits(ac_pb, 1, last);
                        put_bits(ac_pb, 6, run);
                        put_bits(ac_pb, 1, 1);
                        put_bits(ac_pb, 12, slevel & 0xfff);
                        put_bits(ac_pb, 1, 1);
F
Fabrice Bellard 已提交
1750 1751
                    } else {
                        /* second escape */
1752 1753 1754
                        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);
F
Fabrice Bellard 已提交
1755 1756 1757
                    }
                } else {
                    /* first escape */
1758 1759 1760
                    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);
F
Fabrice Bellard 已提交
1761 1762
                }
            } else {
1763
                put_bits(ac_pb, 1, sign);
F
Fabrice Bellard 已提交
1764 1765 1766 1767
            }
	    last_non_zero = i;
	}
    }
1768
#endif
F
Fabrice Bellard 已提交
1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
}



/***********************************************/
/* 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;
1781
static VLC sprite_trajectory;
M
Michael Niedermayer 已提交
1782
static VLC mb_type_b_vlc;
F
Fabrice Bellard 已提交
1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812

void init_rl(RLTable *rl)
{
    INT8 max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
    UINT8 index_run[MAX_RUN+1];
    int last, run, level, start, end, i;

    /* compute max_level[], max_run[] and index_run[] */
    for(last=0;last<2;last++) {
        if (last == 0) {
            start = 0;
            end = rl->last;
        } else {
            start = rl->last;
            end = rl->n;
        }

        memset(max_level, 0, MAX_RUN + 1);
        memset(max_run, 0, MAX_LEVEL + 1);
        memset(index_run, rl->n, MAX_RUN + 1);
        for(i=start;i<end;i++) {
            run = rl->table_run[i];
            level = rl->table_level[i];
            if (index_run[run] == rl->n)
                index_run[run] = i;
            if (level > max_level[run])
                max_level[run] = level;
            if (run > max_run[level])
                max_run[level] = run;
        }
1813
        rl->max_level[last] = av_malloc(MAX_RUN + 1);
F
Fabrice Bellard 已提交
1814
        memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1815
        rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
F
Fabrice Bellard 已提交
1816
        memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1817
        rl->index_run[last] = av_malloc(MAX_RUN + 1);
F
Fabrice Bellard 已提交
1818 1819 1820 1821 1822 1823
        memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
    }
}

void init_vlc_rl(RLTable *rl)
{
1824 1825
    int i, q;
    
F
Fabrice Bellard 已提交
1826 1827 1828
    init_vlc(&rl->vlc, 9, rl->n + 1, 
             &rl->table_vlc[0][1], 4, 2,
             &rl->table_vlc[0][0], 4, 2);
1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846

    
    for(q=0; q<32; q++){
        int qmul= q*2;
        int qadd= (q-1)|1;
        
        if(q==0){
            qmul=1;
            qadd=0;
        }
        
        rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
        for(i=0; i<rl->vlc.table_size; i++){
            int code= rl->vlc.table[i][0];
            int len = rl->vlc.table[i][1];
            int level, run;
        
            if(len==0){ // illegal code
1847
                run= 66;
1848 1849 1850 1851 1852 1853
                level= MAX_LEVEL;
            }else if(len<0){ //more bits needed
                run= 0;
                level= code;
            }else{
                if(code==rl->n){ //esc
1854
                    run= 66;
1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866
                    level= 0;
                }else{
                    run=   rl->table_run  [code] + 1;
                    level= rl->table_level[code] * qmul + qadd;
                    if(code >= rl->last) run+=192;
                }
            }
            rl->rl_vlc[q][i].len= len;
            rl->rl_vlc[q][i].level= level;
            rl->rl_vlc[q][i].run= run;
        }
    }
F
Fabrice Bellard 已提交
1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878
}

/* 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;

1879
        init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 8, 
F
Fabrice Bellard 已提交
1880 1881
                 intra_MCBPC_bits, 1, 1,
                 intra_MCBPC_code, 1, 1);
1882
        init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 25, 
F
Fabrice Bellard 已提交
1883 1884
                 inter_MCBPC_bits, 1, 1,
                 inter_MCBPC_code, 1, 1);
1885
        init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
F
Fabrice Bellard 已提交
1886 1887
                 &cbpy_tab[0][1], 2, 1,
                 &cbpy_tab[0][0], 2, 1);
1888
        init_vlc(&mv_vlc, MV_VLC_BITS, 33,
F
Fabrice Bellard 已提交
1889 1890 1891 1892
                 &mvtab[0][1], 2, 1,
                 &mvtab[0][0], 2, 1);
        init_rl(&rl_inter);
        init_rl(&rl_intra);
1893
        init_rl(&rl_intra_aic);
F
Fabrice Bellard 已提交
1894 1895
        init_vlc_rl(&rl_inter);
        init_vlc_rl(&rl_intra);
1896
        init_vlc_rl(&rl_intra_aic);
M
Michael Niedermayer 已提交
1897
        init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
F
Fabrice Bellard 已提交
1898 1899
                 &DCtab_lum[0][1], 2, 1,
                 &DCtab_lum[0][0], 2, 1);
M
Michael Niedermayer 已提交
1900
        init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
F
Fabrice Bellard 已提交
1901 1902
                 &DCtab_chrom[0][1], 2, 1,
                 &DCtab_chrom[0][0], 2, 1);
1903
        init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
1904 1905
                 &sprite_trajectory_tab[0][1], 4, 2,
                 &sprite_trajectory_tab[0][0], 4, 2);
1906
        init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
M
Michael Niedermayer 已提交
1907 1908
                 &mb_type_b_tab[0][1], 2, 1,
                 &mb_type_b_tab[0][0], 2, 1);
F
Fabrice Bellard 已提交
1909
    }
1910 1911

    s->progressive_sequence=1; // set to most likely for the case of incomplete headers
F
Fabrice Bellard 已提交
1912 1913
}

1914
int h263_decode_gob_header(MpegEncContext *s)
F
Fabrice Bellard 已提交
1915
{
1916
    unsigned int val, gfid;
1917
    
1918
    /* Check for GOB Start Code */
1919 1920 1921 1922 1923
    val = show_bits(&s->gb, 16);
    if (val == 0) {
        /* We have a GBSC probably with GSTUFF */
        skip_bits(&s->gb, 16); /* Drop the zeros */
        while (get_bits1(&s->gb) == 0); /* Seek the '1' bit */
1924
#ifdef DEBUG
1925
        fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x);
1926
#endif
1927 1928 1929
        s->gob_number = get_bits(&s->gb, 5); /* GN */
        gfid = get_bits(&s->gb, 2); /* GFID */
        s->qscale = get_bits(&s->gb, 5); /* GQUANT */
1930
#ifdef DEBUG
1931
        fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
1932
#endif
1933
        return 1;
1934
    }
1935 1936 1937 1938
    return 0;
            
}

1939 1940 1941 1942 1943 1944 1945
static inline void memsetw(short *tab, int val, int n)
{
    int i;
    for(i=0;i<n;i++)
        tab[i] = val;
}

1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977
void ff_mpeg4_init_partitions(MpegEncContext *s)
{
    init_put_bits(&s->tex_pb, s->tex_pb_buffer, PB_BUFFER_SIZE, NULL, NULL);
    init_put_bits(&s->pb2   , s->pb2_buffer   , PB_BUFFER_SIZE, NULL, NULL);
}

void ff_mpeg4_merge_partitions(MpegEncContext *s)
{
    const int pb2_len   = get_bit_count(&s->pb2   );
    const int tex_pb_len= get_bit_count(&s->tex_pb);
    const int bits= get_bit_count(&s->pb);

    if(s->pict_type==I_TYPE){
        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);
        s->misc_bits+=17 + pb2_len;;
        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);

    ff_copy_bits(&s->pb, s->pb2_buffer   , pb2_len);
    ff_copy_bits(&s->pb, s->tex_pb_buffer, tex_pb_len);
    s->last_bits= get_bit_count(&s->pb);
}

void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
1978 1979 1980
{
    int mb_num_bits= av_log2(s->mb_num - 1) + 1;

1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993
    ff_mpeg4_stuffing(&s->pb);
    if(s->pict_type==I_TYPE)
        put_bits(&s->pb, 16, 0);
    else if(s->pict_type==B_TYPE)
        put_bits(&s->pb, MAX(MAX(s->f_code, s->b_code)+15, 17), 0);
    else /* S/P_TYPE */
        put_bits(&s->pb, s->f_code+15, 0);
    put_bits(&s->pb, 1, 1);
    
    put_bits(&s->pb, mb_num_bits, s->mb_x + s->mb_y*s->mb_width);
    put_bits(&s->pb, 5, s->qscale);
    put_bits(&s->pb, 1, 0); /* no HEC */
}
1994

1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
/**
 * decodes the next video packet and sets s->next_qscale 
 * returns mb_num of the next packet or <0 if something went wrong
 */
static int decode_video_packet_header(MpegEncContext *s, GetBitContext *gb)
{
    int bits;
    int mb_num_bits= av_log2(s->mb_num - 1) + 1;
    int header_extension=0, mb_num;
//printf("%X\n", show_bits(&gb, 24));
//printf("parse_video_packet_header\n");
//    if(show_aligned_bits(gb, 1, 16) != 0) return -1;
    
    /* is there enough space left for a video packet + header */
    if( get_bits_count(gb) > gb->size*8-20) return -1;

//printf("resync at %d %d\n", s->mb_x, s->mb_y);
//    skip_bits(gb, 1);
//    align_get_bits(gb);
    if(get_bits(gb, 16)!=0){
        printf("internal error while decoding video packet header\n");
2016
    }
2017 2018

//printf("%X\n", show_bits(gb, 24));
2019
    bits=0;
2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032
    while(!get_bits1(gb) && bits<30) bits++;
    if((s->pict_type == P_TYPE || s->pict_type == S_TYPE) && bits != s->f_code-1){
        printf("marker does not match f_code (is: %d should be: %d pos: %d end %d x: %d y: %d)\n", 
               bits+1, s->f_code, get_bits_count(gb), gb->size*8, s->mb_x, s->mb_y);
        return -1;
    }else if(s->pict_type == I_TYPE && bits != 0){
        printf("marker too long\n");
        return -1;
    }else if(s->pict_type == B_TYPE && bits != MAX(MAX(s->f_code, s->b_code)-1, 1)){
        printf("marker does not match f/b_code\n");
        return -1;
    }
//printf("%X\n", show_bits(gb, 24));
2033 2034

    if(s->shape != RECT_SHAPE){
2035
        header_extension= get_bits1(gb);
2036 2037 2038
        //FIXME more stuff here
    }

2039 2040 2041 2042 2043
    mb_num= get_bits(gb, mb_num_bits);
    if(mb_num < s->mb_x + s->mb_y*s->mb_width || mb_num>=s->mb_num){
        fprintf(stderr, "illegal mb_num in video packet (%d %d) \n", mb_num, s->mb_x + s->mb_y*s->mb_width);
        return -1;
    }
2044 2045

    if(s->shape != BIN_ONLY_SHAPE){
2046 2047 2048 2049 2050 2051 2052
        s->next_resync_qscale= get_bits(gb, 5);
        if(s->next_resync_qscale==0)
            s->next_resync_qscale= s->qscale;
        if(s->next_resync_qscale==0){
            fprintf(stderr, "qscale==0\n");
            return -1;
        }
2053 2054 2055
    }

    if(s->shape == RECT_SHAPE){
2056
        header_extension= get_bits1(gb);
2057 2058
    }
    if(header_extension){
2059
        int time_increment;
2060
        int time_incr=0;
2061 2062

        while (get_bits1(gb) != 0) 
2063 2064
            time_incr++;

2065 2066 2067
        check_marker(gb, "before time_increment in video packed header");
        time_increment= get_bits(gb, s->time_increment_bits);
        check_marker(gb, "before vop_coding_type in video packed header");
2068
        
2069
        skip_bits(gb, 2); /* vop coding type */
2070 2071 2072
        //FIXME not rect stuff here

        if(s->shape != BIN_ONLY_SHAPE){
2073
            skip_bits(gb, 3); /* intra dc vlc threshold */
2074 2075 2076

            if(s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE && s->num_sprite_warping_points){
                mpeg4_decode_sprite_trajectory(s);
2077
                fprintf(stderr, "untested\n");
2078 2079 2080 2081 2082
            }

            //FIXME reduced res stuff here
            
            if (s->pict_type != I_TYPE) {
2083 2084 2085
                int f_code = get_bits(gb, 3);	/* fcode_for */
                if(f_code==0){
                    printf("Error, video packet header damaged (f_code=0)\n");
2086 2087 2088
                }
            }
            if (s->pict_type == B_TYPE) {
2089 2090 2091 2092
                int b_code = get_bits(gb, 3);
                if(b_code==0){
                    printf("Error, video packet header damaged (b_code=0)\n");
                }
2093 2094 2095 2096
            }       
        }
    }
    //FIXME new-pred stuff
2097 2098 2099 2100 2101 2102 2103 2104 2105
    
//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));

    return mb_num;
}

void ff_mpeg4_clean_buffers(MpegEncContext *s)
{
    int c_wrap, c_xy, l_wrap, l_xy;
2106 2107

    l_wrap= s->block_wrap[0];
2108
    l_xy= s->mb_y*l_wrap*2 + s->mb_x*2;
2109
    c_wrap= s->block_wrap[4];
2110
    c_xy= s->mb_y*c_wrap + s->mb_x;
2111 2112

    /* clean DC */
2113 2114 2115
    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);
2116 2117

    /* clean AC */
2118 2119 2120
    memset(s->ac_val[0] + l_xy, 0, (l_wrap*2+1)*16*sizeof(INT16));
    memset(s->ac_val[1] + c_xy, 0, (c_wrap  +1)*16*sizeof(INT16));
    memset(s->ac_val[2] + c_xy, 0, (c_wrap  +1)*16*sizeof(INT16));
2121 2122

    /* clean MV */
2123 2124
    // we cant clear the MVs as they might be needed by a b frame
//    memset(s->motion_val + l_xy, 0, (l_wrap*2+1)*2*sizeof(INT16));
2125
//    memset(s->motion_val, 0, 2*sizeof(INT16)*(2 + s->mb_width*2)*(2 + s->mb_height*2));
2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198
    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;
}

/* searches for the next resync marker clears ac,dc,mc, and sets s->next_resync_gb, s->mb_num_left */
int ff_mpeg4_resync(MpegEncContext *s)
{
    GetBitContext gb;
    
    /* search & parse next resync marker */
    
    gb= s->next_resync_gb;
    align_get_bits(&gb);
//printf("mpeg4_resync %d next:%d \n", get_bits_count(&gb), get_bits_count(&s->next_resync_gb));
    for(;;) {
        int v= show_bits(&gb, 24);
        if( get_bits_count(&gb) >= gb.size*8-24 || v == 1 /* start-code */){
            s->mb_num_left= s->mb_num - s->mb_x - s->mb_y*s->mb_width;
//printf("mpeg4_resync end\n");
            s->gb= s->next_resync_gb; //continue at the next resync marker
            return -1;
        }else if(v>>8 == 0){
            int next;
            s->next_resync_pos= get_bits_count(&gb);
            
            next= decode_video_packet_header(s, &gb);
            if(next >= 0){
                s->mb_num_left= next - s->mb_x - s->mb_y*s->mb_width;
                break;
            }

            align_get_bits(&gb);
        }
        skip_bits(&gb, 8);
    }
    s->next_resync_gb=gb;
    
    return 0;
}

static inline void init_block_index(MpegEncContext *s)
{
    s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
    s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1)     + s->mb_x*2;
    s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
    s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2)     + s->mb_x*2;
    s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1)                    + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
    s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
}

static inline void update_block_index(MpegEncContext *s)
{
    s->block_index[0]+=2;
    s->block_index[1]+=2;
    s->block_index[2]+=2;
    s->block_index[3]+=2;
    s->block_index[4]++;
    s->block_index[5]++;
}

/**
 * decodes the first & second partition
 * returns error type or 0 if no error
 */
int ff_mpeg4_decode_partitions(MpegEncContext *s)
{
    static const INT8 quant_tab[4] = { -1, -2, 1, 2 };
    int mb_num;
    
    /* decode first partition */
    mb_num=0;
2199
    s->first_slice_line=1;
2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218
    s->mb_x= s->resync_mb_x;
    for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
        init_block_index(s);
        for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
            const int xy= s->mb_x + s->mb_y*s->mb_width;
            int cbpc;
            int dir=0;
            
            mb_num++;
            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;
            
            if(s->mb_x==0) PRINT_MB_TYPE("\n");

            if(s->pict_type==I_TYPE){
                int i;

                PRINT_MB_TYPE("I");
2219
                cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283
                if (cbpc < 0){
                    fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
                    return DECODING_DESYNC;
                }
                s->cbp_table[xy]= cbpc & 3;
                s->mb_type[xy]= MB_TYPE_INTRA;
                s->mb_intra = 1;

                if(cbpc & 4) {
                    s->qscale += quant_tab[get_bits(&s->gb, 2)];
                    if (s->qscale < 1)
                        s->qscale = 1;
                    else if (s->qscale > 31)
                        s->qscale = 31;
                    h263_dc_scale(s);
                }
                s->qscale_table[xy]= s->qscale;

                s->mbintra_table[xy]= 1;
                for(i=0; i<6; i++){
                    int dc_pred_dir;
                    int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); 
                    if(dc < 0){
                        fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
                        return DECODING_DESYNC;
                    }
                    dir<<=1;
                    if(dc_pred_dir) dir|=1;
                }
                s->pred_dir_table[xy]= dir;
            }else{ /* P/S_TYPE */
                int mx, my, pred_x, pred_y;
                INT16 * const mot_val= s->motion_val[s->block_index[0]];
                const int stride= s->block_wrap[0]*2;

                if(get_bits1(&s->gb)){
                    /* skip mb */
                    s->mb_type[xy]= MB_TYPE_SKIPED;
                    if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
                        const int a= s->sprite_warping_accuracy;
                        PRINT_MB_TYPE("G");
                        if(s->divx_version==500 && s->divx_build==413){
                            mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
                            my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
                        }else{
                            mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
                            my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
                            s->mb_type[xy]= MB_TYPE_GMC | MB_TYPE_SKIPED;
                        }
                    }else{
                        PRINT_MB_TYPE("S");
                        mx = 0;
                        my = 0;
                    }
                    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;
                }
2284
                cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390
                if (cbpc < 0){
                    fprintf(stderr, "cbpc corrupted at %d %d\n", s->mb_x, s->mb_y);
                    return DECODING_DESYNC;
                }
                if (cbpc > 20)
                    cbpc+=3;
                else if (cbpc == 20)
                    fprintf(stderr, "Stuffing !");
                s->cbp_table[xy]= cbpc&(8+3); //8 is dquant
    
                s->mb_intra = ((cbpc & 4) != 0);
        
                if(s->mb_intra){
                    PRINT_MB_TYPE("I");
                    s->mbintra_table[xy]= 1;
                    s->mb_type[xy]= MB_TYPE_INTRA;
                    mot_val[0       ]= mot_val[2       ]= 
                    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);

                    if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
                        s->mcsel= get_bits1(&s->gb);
                    else s->mcsel= 0;
        
                    if ((cbpc & 16) == 0) {
                        PRINT_MB_TYPE("P");
                        /* 16x16 motion prediction */
                        s->mb_type[xy]= MB_TYPE_INTER;

                        h263_pred_motion(s, 0, &pred_x, &pred_y);
                        if(!s->mcsel)
                           mx = h263_decode_motion(s, pred_x, s->f_code);
                        else {
                            const int a= s->sprite_warping_accuracy;
                            if(s->divx_version==500 && s->divx_build==413){
                                mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
                            }else{
                                mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
                            }
                        }
                        if (mx >= 0xffff)
                            return DECODING_DESYNC;
            
                        if(!s->mcsel)
                           my = h263_decode_motion(s, pred_y, s->f_code);
                        else{
                           const int a= s->sprite_warping_accuracy;
                            if(s->divx_version==500 && s->divx_build==413){
                                my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
                            }else{
                                my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
                            }
                        }
                        if (my >= 0xffff)
                            return DECODING_DESYNC;
                        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;
                        PRINT_MB_TYPE("4");
                        s->mb_type[xy]= MB_TYPE_INTER4V;
                        for(i=0;i<4;i++) {
                            INT16 *mot_val= h263_pred_motion(s, i, &pred_x, &pred_y);
                            mx = h263_decode_motion(s, pred_x, s->f_code);
                            if (mx >= 0xffff)
                                return DECODING_DESYNC;
                
                            my = h263_decode_motion(s, pred_y, s->f_code);
                            if (my >= 0xffff)
                                return DECODING_DESYNC;
                            mot_val[0] = mx;
                            mot_val[1] = my;
                        }
                    }
                }
            }
        }
        s->mb_x= 0;
    }

    if     (s->pict_type==I_TYPE && get_bits(&s->gb, 19)!=DC_MARKER    ) s->decoding_error= DECODING_DESYNC;
    else if(s->pict_type!=I_TYPE && get_bits(&s->gb, 17)!=MOTION_MARKER) s->decoding_error= DECODING_DESYNC;
    if(s->decoding_error== DECODING_DESYNC){
        fprintf(stderr, "marker missing after first partition at %d %d\n", s->mb_x, s->mb_y);
        return DECODING_DESYNC;
    }

    /* decode second partition */
    mb_num=0;
    s->mb_x= s->resync_mb_x;
    for(s->mb_y= s->resync_mb_y; mb_num < s->mb_num_left; s->mb_y++){
        init_block_index(s);
        for(; mb_num < s->mb_num_left && s->mb_x<s->mb_width; s->mb_x++){
            const int xy= s->mb_x + s->mb_y*s->mb_width;

            mb_num++;
            update_block_index(s);
            
            if(s->pict_type==I_TYPE){
                int ac_pred= get_bits1(&s->gb);
2391
                int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402
                if(cbpy<0){
                    fprintf(stderr, "cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
                    return DECODING_AC_LOST;
                }
                
                s->cbp_table[xy]|= cbpy<<2;
                s->pred_dir_table[xy]|= ac_pred<<7;
            }else{ /* P || S_TYPE */
                if(s->mb_type[xy]&MB_TYPE_INTRA){          
                    int dir=0,i;
                    int ac_pred = get_bits1(&s->gb);
2403
                    int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436

                    if(cbpy<0){
                        fprintf(stderr, "I cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
                        return DECODING_ACDC_LOST;
                    }
                    
                    if(s->cbp_table[xy] & 8) {
                        s->qscale += quant_tab[get_bits(&s->gb, 2)];
                        if (s->qscale < 1)
                            s->qscale = 1;
                        else if (s->qscale > 31)
                            s->qscale = 31;
                        h263_dc_scale(s);
                    }
                    s->qscale_table[xy]= s->qscale;

                    for(i=0; i<6; i++){
                        int dc_pred_dir;
                        int dc= mpeg4_decode_dc(s, i, &dc_pred_dir); 
                        if(dc < 0){
                            fprintf(stderr, "DC corrupted at %d %d\n", s->mb_x, s->mb_y);
                            return DECODING_ACDC_LOST;
                        }
                        dir<<=1;
                        if(dc_pred_dir) dir|=1;
                    }
                    s->cbp_table[xy]&= 3; //remove dquant
                    s->cbp_table[xy]|= cbpy<<2;
                    s->pred_dir_table[xy]= dir | (ac_pred<<7);
                }else if(s->mb_type[xy]&MB_TYPE_SKIPED){
                    s->qscale_table[xy]= s->qscale;
                    s->cbp_table[xy]= 0;
                }else{
2437
                    int cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529

                    if(cbpy<0){
                        fprintf(stderr, "P cbpy corrupted at %d %d\n", s->mb_x, s->mb_y);
                        return DECODING_ACDC_LOST;
                    }
                    
                    if(s->cbp_table[xy] & 8) {
//fprintf(stderr, "dquant\n");
                        s->qscale += quant_tab[get_bits(&s->gb, 2)];
                        if (s->qscale < 1)
                            s->qscale = 1;
                        else if (s->qscale > 31)
                            s->qscale = 31;
                        h263_dc_scale(s);
                    }
                    s->qscale_table[xy]= s->qscale;

                    s->cbp_table[xy]&= 3; //remove dquant
                    s->cbp_table[xy]|= (cbpy^0xf)<<2;
                }
            }
        }
        s->mb_x= 0;
    }
    

    return 0;        
}

static int mpeg4_decode_partitioned_mb(MpegEncContext *s,
                   DCTELEM block[6][64])
{
    int cbp, mb_type;
    const int xy= s->mb_x + s->mb_y*s->mb_width;

    if(s->mb_x==s->resync_mb_x && s->mb_y==s->resync_mb_y){ //Note resync_mb_{x,y}==0 at the start
        int i;
        int block_index_backup[6];
        int qscale= s->qscale;
        
        for(i=0; i<6; i++) block_index_backup[i]= s->block_index[i];
        
        s->decoding_error= ff_mpeg4_decode_partitions(s);
        
        for(i=0; i<6; i++) s->block_index[i]= block_index_backup[i];
        s->first_slice_line=1;
        s->mb_x= s->resync_mb_x;
        s->mb_y= s->resync_mb_y;
        s->qscale= qscale;
        h263_dc_scale(s);

        if(s->decoding_error==DECODING_DESYNC) return -1;
    }
    
    mb_type= s->mb_type[xy];
    if(s->decoding_error)
        cbp=0;
    else 
        cbp = s->cbp_table[xy];

    if(s->decoding_error!=DECODING_ACDC_LOST && s->qscale_table[xy] != s->qscale){
        s->qscale= s->qscale_table[xy];
        h263_dc_scale(s);
    }

    if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
        int i;
        for(i=0; i<4; i++){
            s->mv[0][i][0] = s->motion_val[ s->block_index[i] ][0];
            s->mv[0][i][1] = s->motion_val[ s->block_index[i] ][1];
        }
        s->mb_intra = mb_type&MB_TYPE_INTRA;

        if (mb_type&MB_TYPE_SKIPED) {
            /* 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;
            if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
                s->mcsel=1;
                s->mb_skiped = 0;
            }else{
                s->mcsel=0;
                s->mb_skiped = 1;
            }
            return 0;
        }else if(s->mb_intra && s->decoding_error!=DECODING_ACDC_LOST){
            s->ac_pred = s->pred_dir_table[xy]>>7;

            /* decode each block */
            for (i = 0; i < 6; i++) {
M
Michael Niedermayer 已提交
2530
                int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1);
2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552
                if(ret==DECODING_AC_LOST){
                    fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
                    s->decoding_error=DECODING_AC_LOST;
                    cbp=0;
                }else if(ret==DECODING_ACDC_LOST){
                    fprintf(stderr, "dc corrupted at %d %d (trying to continue with mc only)\n", s->mb_x, s->mb_y);
                    s->decoding_error=DECODING_ACDC_LOST;
                    break;
                }
            }
        }else if(!s->mb_intra){
//            s->mcsel= 0; //FIXME do we need to init that
            
            s->mv_dir = MV_DIR_FORWARD;
            if (mb_type&MB_TYPE_INTER4V) {
                s->mv_type = MV_TYPE_8X8;
            } else {
                s->mv_type = MV_TYPE_16X16;
            }
            if(s->decoding_error==0 && cbp){
                /* decode each block */
                for (i = 0; i < 6; i++) {
M
Michael Niedermayer 已提交
2553
                    int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0);
2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
                    if(ret==DECODING_AC_LOST){
                        fprintf(stderr, "texture corrupted at %d %d (trying to continue with mc/dc only)\n", s->mb_x, s->mb_y);
                        s->decoding_error=DECODING_AC_LOST;
                        break;
                    }
                }
            }
        }
    } else { /* I-Frame */
        int i;
        s->mb_intra = 1;
        s->ac_pred = s->pred_dir_table[xy]>>7;
        
        /* decode each block */
        for (i = 0; i < 6; i++) {
M
Michael Niedermayer 已提交
2569
            int ret= mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1);
2570 2571 2572 2573 2574 2575 2576 2577 2578 2579
            if(ret==DECODING_AC_LOST){
                fprintf(stderr, "texture corrupted at %d %d (trying to continue with dc only)\n", s->mb_x, s->mb_y);
                s->decoding_error=DECODING_AC_LOST;
                cbp=0;
            }else if(ret==DECODING_ACDC_LOST){
                fprintf(stderr, "dc corrupted at %d %d\n", s->mb_x, s->mb_y);
                return -1;
            }
        }
    }
2580 2581 2582

    return 0;
}
2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593
#if 0
static inline void decode_interlaced_info(MpegEncContext *s, int cbp, int mb_type){
    s->mv_type= 0;            
    if(!s->progressive_sequence){
        if(cbp || s->mb_intra)
            s->interlaced_dct= get_bits1(&s->gb);
        
        if(!s->mb_intra){
            if(   s->pict_type==P_TYPE //FIXME check that 4MV is forbidden
               || (s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && !s->mcsel)
               || (s->pict_type==B_TYPE && mb_type!=0) ){
2594

2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613
                if(get_bits1(&s->gb)){
                    s->mv_type= MV_TYPE_FIELD;

                    if(   s->pict_type==P_TYPE
                       || (s->pict_type==B_TYPE && mb_type!=2)){
                        s->field_select[0][0]= get_bits1(&s->gb);
                        s->field_select[0][1]= get_bits1(&s->gb);
                    }
                    if(s->pict_type==B_TYPE && mb_type!=3){
                        s->field_select[1][0]= get_bits1(&s->gb);
                        s->field_select[1][1]= get_bits1(&s->gb);
                    }
                }else
                    s->mv_type= 0;            
            }
        }   
    }
}
#endif
2614

2615 2616 2617 2618 2619 2620
int h263_decode_mb(MpegEncContext *s,
                   DCTELEM block[6][64])
{
    int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
    INT16 *mot_val;
    static INT8 quant_tab[4] = { -1, -2, 1, 2 };
2621

F
Felix Bünemann 已提交
2622
    if(s->mb_x==0) PRINT_MB_TYPE("\n");
M
Michael Niedermayer 已提交
2623

2624
    if(s->resync_marker){
2625
        if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
2626 2627 2628 2629
            s->first_slice_line=0; 
        }
    }

2630 2631 2632
    if(s->data_partitioning && s->pict_type!=B_TYPE)
        return mpeg4_decode_partitioned_mb(s, block);

2633
    if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) {
2634
        if (get_bits1(&s->gb)) {
F
Fabrice Bellard 已提交
2635 2636 2637 2638 2639 2640
            /* 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;
M
Michael Niedermayer 已提交
2641 2642 2643
            if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){
                const int a= s->sprite_warping_accuracy;
//                int l = (1 << (s->f_code - 1)) * 32;
M
Michael Niedermayer 已提交
2644
                PRINT_MB_TYPE("G");
M
Michael Niedermayer 已提交
2645
                s->mcsel=1;
M
Michael Niedermayer 已提交
2646 2647 2648 2649 2650 2651 2652
                if(s->divx_version==500 && s->divx_build==413){
                    s->mv[0][0][0] = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
                    s->mv[0][0][1] = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
                }else{
                    s->mv[0][0][0] = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
                    s->mv[0][0][1] = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
                }
M
Michael Niedermayer 已提交
2653 2654 2655 2656 2657 2658 2659
/*                if (s->mv[0][0][0] < -l) s->mv[0][0][0]= -l;
                else if (s->mv[0][0][0] >= l) s->mv[0][0][0]= l-1;
                if (s->mv[0][0][1] < -l) s->mv[0][0][1]= -l;
                else if (s->mv[0][0][1] >= l) s->mv[0][0][1]= l-1;*/

                s->mb_skiped = 0;
            }else{
M
Michael Niedermayer 已提交
2660
                PRINT_MB_TYPE("S");
M
Michael Niedermayer 已提交
2661 2662 2663 2664 2665
                s->mcsel=0;
                s->mv[0][0][0] = 0;
                s->mv[0][0][1] = 0;
                s->mb_skiped = 1;
            }
F
Fabrice Bellard 已提交
2666 2667
            return 0;
        }
2668
        cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
2669
        //fprintf(stderr, "\tCBPC: %d", cbpc);
F
Fabrice Bellard 已提交
2670 2671
        if (cbpc < 0)
            return -1;
2672 2673 2674 2675
        if (cbpc > 20)
            cbpc+=3;
        else if (cbpc == 20)
            fprintf(stderr, "Stuffing !");
2676
        
F
Fabrice Bellard 已提交
2677 2678
        dquant = cbpc & 8;
        s->mb_intra = ((cbpc & 4) != 0);
M
Michael Niedermayer 已提交
2679 2680
        if (s->mb_intra) goto intra;
        
2681 2682 2683
        if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE && (cbpc & 16) == 0)
            s->mcsel= get_bits1(&s->gb);
        else s->mcsel= 0;
2684
        cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
F
Fabrice Bellard 已提交
2685 2686 2687 2688 2689 2690 2691
        cbp = (cbpc & 3) | ((cbpy ^ 0xf) << 2);
        if (dquant) {
            s->qscale += quant_tab[get_bits(&s->gb, 2)];
            if (s->qscale < 1)
                s->qscale = 1;
            else if (s->qscale > 31)
                s->qscale = 31;
2692
            h263_dc_scale(s);
F
Fabrice Bellard 已提交
2693
        }
2694 2695 2696
        if((!s->progressive_sequence) && (cbp || s->workaround_bugs==2))
            s->interlaced_dct= get_bits1(&s->gb);
        
F
Fabrice Bellard 已提交
2697 2698
        s->mv_dir = MV_DIR_FORWARD;
        if ((cbpc & 16) == 0) {
2699 2700 2701 2702 2703
            if(s->mcsel){
                const int a= s->sprite_warping_accuracy;
                PRINT_MB_TYPE("G");
                /* 16x16 global motion prediction */
                s->mv_type = MV_TYPE_16X16;
M
Michael Niedermayer 已提交
2704
//        int l = (1 << (s->f_code - 1)) * 32;
M
Michael Niedermayer 已提交
2705 2706
                if(s->divx_version==500 && s->divx_build==413){
                    mx = s->sprite_offset[0][0] / (1<<(a-s->quarter_sample));
2707
                    my = s->sprite_offset[0][1] / (1<<(a-s->quarter_sample));
M
Michael Niedermayer 已提交
2708 2709
                }else{
                    mx = RSHIFT(s->sprite_offset[0][0], a-s->quarter_sample);
2710
                    my = RSHIFT(s->sprite_offset[0][1], a-s->quarter_sample);
M
Michael Niedermayer 已提交
2711
                }
M
Michael Niedermayer 已提交
2712
//       int l = (1 << (s->f_code - 1)) * 32;
2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734
                s->mv[0][0][0] = mx;
                s->mv[0][0][1] = my;
            }else if((!s->progressive_sequence) && get_bits1(&s->gb)){
                PRINT_MB_TYPE("f");
                /* 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);

                h263_pred_motion(s, 0, &pred_x, &pred_y);
                
                for(i=0; i<2; i++){
                    mx = h263_decode_motion(s, pred_x, s->f_code);
                    if (mx >= 0xffff)
                        return -1;
            
                    my = h263_decode_motion(s, pred_y/2, s->f_code);
                    if (my >= 0xffff)
                        return -1;

                    s->mv[0][i][0] = mx;
2735
                    s->mv[0][i][1] = my;
M
Michael Niedermayer 已提交
2736
                }
2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761
            }else{
                PRINT_MB_TYPE("P");
                /* 16x16 motion prediction */
                s->mv_type = MV_TYPE_16X16;
                h263_pred_motion(s, 0, &pred_x, &pred_y);
                if (s->umvplus_dec)
                   mx = h263p_decode_umotion(s, pred_x);
                else
                   mx = h263_decode_motion(s, pred_x, s->f_code);
            
                if (mx >= 0xffff)
                    return -1;
            
                if (s->umvplus_dec)
                   my = h263p_decode_umotion(s, pred_y);
                else
                   my = h263_decode_motion(s, pred_y, s->f_code);
            
                if (my >= 0xffff)
                    return -1;
                s->mv[0][0][0] = mx;
                s->mv[0][0][1] = my;

                if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
                   skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */                   
M
Michael Niedermayer 已提交
2762
            }
F
Fabrice Bellard 已提交
2763
        } else {
M
Michael Niedermayer 已提交
2764
            PRINT_MB_TYPE("4");
F
Fabrice Bellard 已提交
2765 2766 2767
            s->mv_type = MV_TYPE_8X8;
            for(i=0;i<4;i++) {
                mot_val = h263_pred_motion(s, i, &pred_x, &pred_y);
2768
                if (s->umvplus_dec)
2769 2770
                  mx = h263p_decode_umotion(s, pred_x);
                else
M
Michael Niedermayer 已提交
2771
                  mx = h263_decode_motion(s, pred_x, s->f_code);
F
Fabrice Bellard 已提交
2772 2773
                if (mx >= 0xffff)
                    return -1;
2774
                
2775
                if (s->umvplus_dec)
2776 2777
                  my = h263p_decode_umotion(s, pred_y);
                else    
M
Michael Niedermayer 已提交
2778
                  my = h263_decode_motion(s, pred_y, s->f_code);
F
Fabrice Bellard 已提交
2779 2780 2781 2782
                if (my >= 0xffff)
                    return -1;
                s->mv[0][i][0] = mx;
                s->mv[0][i][1] = my;
2783
                if (s->umvplus_dec && (mx - pred_x) == 1 && (my - pred_y) == 1)
2784
                  skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
F
Fabrice Bellard 已提交
2785 2786 2787 2788
                mot_val[0] = mx;
                mot_val[1] = my;
            }
        }
M
Michael Niedermayer 已提交
2789 2790 2791 2792
    } else if(s->pict_type==B_TYPE) {
        int modb1; // first bit of modb
        int modb2; // second bit of modb
        int mb_type;
2793 2794
        uint16_t time_pp;
        uint16_t time_pb;
M
Michael Niedermayer 已提交
2795 2796 2797 2798 2799 2800
        int xy;

        s->mb_intra = 0; //B-frames never contain intra blocks
        s->mcsel=0;      //     ...               true gmc blocks

        if(s->mb_x==0){
M
Michael Niedermayer 已提交
2801 2802 2803 2804 2805 2806
            for(i=0; i<2; i++){
                s->last_mv[i][0][0]= 
                s->last_mv[i][0][1]= 
                s->last_mv[i][1][0]= 
                s->last_mv[i][1][1]= 0;
            }
M
Michael Niedermayer 已提交
2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822
        }

        /* if we skipped it in the future P Frame than skip it now too */
        s->mb_skiped= s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]; // Note, skiptab=0 if last was GMC

        if(s->mb_skiped){
                /* 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;
F
Felix Bünemann 已提交
2823
            PRINT_MB_TYPE("s");
M
Michael Niedermayer 已提交
2824 2825 2826
            return 0;
        }

2827 2828 2829 2830 2831 2832 2833
        modb1= get_bits1(&s->gb); 
        if(modb1){
            mb_type=4; //like MB_TYPE_B_DIRECT but no vectors coded
            cbp=0;
        }else{
            int field_mv;
        
M
Michael Niedermayer 已提交
2834
            modb2= get_bits1(&s->gb);
2835
            mb_type= get_vlc2(&s->gb, mb_type_b_vlc.table, MB_TYPE_B_VLC_BITS, 1);
2836 2837 2838 2839
            if(modb2) cbp= 0;
            else      cbp= get_bits(&s->gb, 6);

            if (mb_type!=MB_TYPE_B_DIRECT && cbp) {
M
Michael Niedermayer 已提交
2840 2841 2842 2843 2844 2845
                if(get_bits1(&s->gb)){
                    s->qscale +=get_bits1(&s->gb)*4 - 2;
                    if (s->qscale < 1)
                        s->qscale = 1;
                    else if (s->qscale > 31)
                        s->qscale = 31;
2846
                    h263_dc_scale(s);
M
Michael Niedermayer 已提交
2847 2848
                }
            }
2849
            field_mv=0;
2850 2851 2852 2853 2854

            if(!s->progressive_sequence){
                if(cbp)
                    s->interlaced_dct= get_bits1(&s->gb);

2855
                if(mb_type!=MB_TYPE_B_DIRECT && get_bits1(&s->gb)){
2856
                    field_mv=1;
2857 2858 2859 2860 2861 2862 2863 2864 2865 2866

                    if(mb_type!=MB_TYPE_B_BACKW){
                        s->field_select[0][0]= get_bits1(&s->gb);
                        s->field_select[0][1]= get_bits1(&s->gb);
                    }
                    if(mb_type!=MB_TYPE_B_FORW){
                        s->field_select[1][0]= get_bits1(&s->gb);
                        s->field_select[1][1]= get_bits1(&s->gb);
                    }
                }
2867 2868
            }

2869
            s->mv_dir = 0;
2870 2871 2872 2873 2874 2875 2876 2877 2878
            if(mb_type!=MB_TYPE_B_DIRECT && !field_mv){
                s->mv_type= MV_TYPE_16X16;
                if(mb_type!=MB_TYPE_B_BACKW){
                    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;
2879
                }
2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892
    
                if(mb_type!=MB_TYPE_B_FORW){
                    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;
                }
                if(mb_type!=MB_TYPE_B_DIRECT)
                    PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "F" : (mb_type==MB_TYPE_B_BACKW ? "B" : "T"));
            }else if(mb_type!=MB_TYPE_B_DIRECT){
                s->mv_type= MV_TYPE_FIELD;
2893

2894 2895 2896 2897 2898 2899 2900 2901 2902
                if(mb_type!=MB_TYPE_B_BACKW){
                    s->mv_dir = MV_DIR_FORWARD;
                
                    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;
                    }
2903
                }
2904 2905 2906 2907 2908 2909 2910 2911 2912 2913
    
                if(mb_type!=MB_TYPE_B_FORW){
                    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;
                    }
2914
                }
2915 2916
                if(mb_type!=MB_TYPE_B_DIRECT)
                    PRINT_MB_TYPE(mb_type==MB_TYPE_B_FORW ? "f" : (mb_type==MB_TYPE_B_BACKW ? "b" : "t"));
2917 2918
            }
        }
2919
          
2920 2921 2922
        if(mb_type==4 || mb_type==MB_TYPE_B_DIRECT){
            int mb_index= s->mb_x + s->mb_y*s->mb_width;
            int i;
2923 2924 2925 2926 2927 2928 2929
            
            if(mb_type==4)
                mx=my=0;
            else{
                mx = h263_decode_motion(s, 0, 1);
                my = h263_decode_motion(s, 0, 1);
            }
2930
 
M
Michael Niedermayer 已提交
2931
            s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
M
Michael Niedermayer 已提交
2932
            xy= s->block_index[0];
2933
            time_pp= s->pp_time;
2934 2935
            time_pb= s->pb_time;
            
M
Michael Niedermayer 已提交
2936
            //FIXME avoid divides
2937 2938
            switch(s->co_located_type_table[mb_index]){
            case 0:
2939
                s->mv_type= MV_TYPE_16X16;
2940 2941 2942 2943 2944 2945 2946 2947 2948
                s->mv[0][0][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
                s->mv[0][0][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
                s->mv[1][0][0] = mx ? s->mv[0][0][0] - s->motion_val[xy][0]
                                    : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
                s->mv[1][0][1] = my ? s->mv[0][0][1] - s->motion_val[xy][1] 
                                    : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
                PRINT_MB_TYPE(mb_type==4 ? "D" : "S");
                break;
            case CO_LOCATED_TYPE_4MV:
2949
                s->mv_type = MV_TYPE_8X8;
2950
                for(i=0; i<4; i++){
2951 2952 2953 2954
                    xy= s->block_index[i];
                    s->mv[0][i][0] = s->motion_val[xy][0]*time_pb/time_pp + mx;
                    s->mv[0][i][1] = s->motion_val[xy][1]*time_pb/time_pp + my;
                    s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->motion_val[xy][0]
2955
                                        : s->motion_val[xy][0]*(time_pb - time_pp)/time_pp;
2956
                    s->mv[1][i][1] = my ? s->mv[0][i][1] - s->motion_val[xy][1] 
2957
                                        : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp;
2958 2959
                }
                PRINT_MB_TYPE("4");
2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979
                break;
            case CO_LOCATED_TYPE_FIELDMV:
                s->mv_type = MV_TYPE_FIELD;
                for(i=0; i<2; i++){
                    if(s->top_field_first){
                        time_pp= s->pp_field_time - s->field_select_table[mb_index][i] + i;
                        time_pb= s->pb_field_time - s->field_select_table[mb_index][i] + i;
                    }else{
                        time_pp= s->pp_field_time + s->field_select_table[mb_index][i] - i;
                        time_pb= s->pb_field_time + s->field_select_table[mb_index][i] - i;
                    }
                    s->mv[0][i][0] = s->field_mv_table[mb_index][i][0]*time_pb/time_pp + mx;
                    s->mv[0][i][1] = s->field_mv_table[mb_index][i][1]*time_pb/time_pp + my;
                    s->mv[1][i][0] = mx ? s->mv[0][i][0] - s->field_mv_table[mb_index][i][0]
                                        : s->field_mv_table[mb_index][i][0]*(time_pb - time_pp)/time_pp;
                    s->mv[1][i][1] = my ? s->mv[0][i][1] - s->field_mv_table[mb_index][i][1] 
                                        : s->field_mv_table[mb_index][i][1]*(time_pb - time_pp)/time_pp;
                }
                PRINT_MB_TYPE("=");
                break;
2980
            }
2981 2982 2983
        }
        
        if(mb_type<0 || mb_type>4){
2984 2985
            printf("illegal MB_type\n");
            return -1;
M
Michael Niedermayer 已提交
2986 2987
        }
    } else { /* I-Frame */
2988
        cbpc = get_vlc2(&s->gb, intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
M
Michael Niedermayer 已提交
2989 2990 2991 2992 2993
        if (cbpc < 0)
            return -1;
        dquant = cbpc & 4;
        s->mb_intra = 1;
intra:
F
Fabrice Bellard 已提交
2994
        s->ac_pred = 0;
2995
        if (s->h263_pred || s->h263_aic) {
2996
            s->ac_pred = get_bits1(&s->gb);
2997 2998
            if (s->ac_pred && s->h263_aic)
                s->h263_aic_dir = get_bits1(&s->gb);
F
Fabrice Bellard 已提交
2999
        }
3000 3001
        PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
        
3002
        cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3003
        if(cbpy<0) return -1;
F
Fabrice Bellard 已提交
3004 3005 3006 3007 3008 3009 3010
        cbp = (cbpc & 3) | (cbpy << 2);
        if (dquant) {
            s->qscale += quant_tab[get_bits(&s->gb, 2)];
            if (s->qscale < 1)
                s->qscale = 1;
            else if (s->qscale > 31)
                s->qscale = 31;
3011
            h263_dc_scale(s);
F
Fabrice Bellard 已提交
3012
        }
3013 3014
        if(!s->progressive_sequence)
            s->interlaced_dct= get_bits1(&s->gb);
M
Michael Niedermayer 已提交
3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028

        /* decode each block */
        if (s->h263_pred) {
            for (i = 0; i < 6; i++) {
                if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 1) < 0)
                    return -1;
            }
        } else {
            for (i = 0; i < 6; i++) {
                if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
                    return -1;
            }
        }
        return 0;
F
Fabrice Bellard 已提交
3029 3030 3031 3032
    }

    /* decode each block */
    if (s->h263_pred) {
M
Michael Niedermayer 已提交
3033 3034
        for (i = 0; i < 6; i++) {
            if (mpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, 0) < 0)
F
Fabrice Bellard 已提交
3035
                return -1;
M
Michael Niedermayer 已提交
3036
        }
F
Fabrice Bellard 已提交
3037
    } else {
M
Michael Niedermayer 已提交
3038 3039
        for (i = 0; i < 6; i++) {
            if (h263_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1) < 0)
F
Fabrice Bellard 已提交
3040
                return -1;
M
Michael Niedermayer 已提交
3041
        }
F
Fabrice Bellard 已提交
3042 3043 3044 3045
    }
    return 0;
}

M
Michael Niedermayer 已提交
3046
static int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
F
Fabrice Bellard 已提交
3047
{
3048
    int code, val, sign, shift, l;
F
Fabrice Bellard 已提交
3049

3050
    code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
F
Fabrice Bellard 已提交
3051 3052 3053 3054 3055
    if (code < 0)
        return 0xffff;

    if (code == 0)
        return pred;
3056
    sign = get_bits1(&s->gb);
M
Michael Niedermayer 已提交
3057
    shift = f_code - 1;
F
Fabrice Bellard 已提交
3058 3059 3060 3061 3062 3063 3064
    val = (code - 1) << shift;
    if (shift > 0)
        val |= get_bits(&s->gb, shift);
    val++;
    if (sign)
        val = -val;
    val += pred;
3065

F
Fabrice Bellard 已提交
3066 3067
    /* modulo decoding */
    if (!s->h263_long_vectors) {
M
Michael Niedermayer 已提交
3068
        l = (1 << (f_code - 1)) * 32;
F
Fabrice Bellard 已提交
3069
        if (val < -l) {
3070
            val += l<<1;
F
Fabrice Bellard 已提交
3071
        } else if (val >= l) {
3072
            val -= l<<1;
F
Fabrice Bellard 已提交
3073 3074 3075 3076 3077 3078 3079
        }
    } else {
        /* horrible h263 long vector mode */
        if (pred < -31 && val < -63)
            val += 64;
        if (pred > 32 && val > 63)
            val -= 64;
3080
        
F
Fabrice Bellard 已提交
3081 3082 3083 3084
    }
    return val;
}

3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110
/* Decodes RVLC of H.263+ UMV */
static int h263p_decode_umotion(MpegEncContext * s, int pred)
{
   int code = 0, sign;
   
   if (get_bits1(&s->gb)) /* Motion difference = 0 */
      return pred;
   
   code = 2 + get_bits1(&s->gb);
   
   while (get_bits1(&s->gb))
   {
      code <<= 1;
      code += get_bits1(&s->gb);
   }
   sign = code & 1;
   code >>= 1;
   
   code = (sign) ? (pred - code) : (pred + code);
#ifdef DEBUG
   fprintf(stderr,"H.263+ UMV Motion = %d\n", code);
#endif
   return code;   

}

F
Fabrice Bellard 已提交
3111 3112 3113 3114 3115
static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
                             int n, int coded)
{
    int code, level, i, j, last, run;
    RLTable *rl = &rl_inter;
3116
    const UINT8 *scan_table;
F
Fabrice Bellard 已提交
3117

3118
    scan_table = zigzag_direct;
3119
    if (s->h263_aic && s->mb_intra) {
3120 3121 3122 3123 3124 3125 3126 3127 3128 3129
        rl = &rl_intra_aic;
        i = 0;
        if (s->ac_pred) {
            if (s->h263_aic_dir) 
                scan_table = ff_alternate_vertical_scan; /* left */
            else
                scan_table = ff_alternate_horizontal_scan; /* top */
        }
    } else if (s->mb_intra) {
        /* DC coef */
F
Fabrice Bellard 已提交
3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149
        if (s->h263_rv10 && s->rv10_version == 3 && s->pict_type == I_TYPE) {
            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;
            }
        } else {
            level = get_bits(&s->gb, 8);
            if (level == 255)
                level = 128;
        }
        block[0] = level;
3150
        i = 1;
F
Fabrice Bellard 已提交
3151
    } else {
3152
        i = 0;
F
Fabrice Bellard 已提交
3153 3154
    }
    if (!coded) {
3155 3156
        if (s->mb_intra && s->h263_aic)
            goto not_coded;
F
Fabrice Bellard 已提交
3157 3158 3159 3160 3161
        s->block_last_index[n] = i - 1;
        return 0;
    }

    for(;;) {
3162
        code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
F
Fabrice Bellard 已提交
3163 3164 3165 3166
        if (code < 0)
            return -1;
        if (code == rl->n) {
            /* escape */
3167
            last = get_bits1(&s->gb);
F
Fabrice Bellard 已提交
3168 3169 3170 3171 3172
            run = get_bits(&s->gb, 6);
            level = (INT8)get_bits(&s->gb, 8);
            if (s->h263_rv10 && level == -128) {
                /* XXX: should patch encoder too */
                level = get_bits(&s->gb, 12);
3173
		level= (level + ((-1)<<11)) ^ ((-1)<<11); //sign extension
F
Fabrice Bellard 已提交
3174 3175 3176 3177 3178
            }
        } else {
            run = rl->table_run[code];
            level = rl->table_level[code];
            last = code >= rl->last;
3179
            if (get_bits1(&s->gb))
F
Fabrice Bellard 已提交
3180 3181 3182 3183 3184
                level = -level;
        }
        i += run;
        if (i >= 64)
            return -1;
3185
        j = scan_table[i];
F
Fabrice Bellard 已提交
3186 3187 3188 3189 3190
        block[j] = level;
        if (last)
            break;
        i++;
    }
3191 3192 3193
not_coded:    
    if (s->mb_intra && s->h263_aic) {
        h263_pred_acdc(s, block, n);
3194
        i = 63;
3195
    }
F
Fabrice Bellard 已提交
3196 3197 3198 3199
    s->block_last_index[n] = i;
    return 0;
}

3200
static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
F
Fabrice Bellard 已提交
3201 3202 3203 3204 3205
{
    int level, pred, code;
    UINT16 *dc_val;

    if (n < 4) 
3206
        code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1);
F
Fabrice Bellard 已提交
3207
    else 
3208
        code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1);
3209 3210
    if (code < 0 || code > 9 /* && s->nbit<9 */){
        fprintf(stderr, "illegal dc vlc\n");
F
Fabrice Bellard 已提交
3211
        return -1;
3212
    }
F
Fabrice Bellard 已提交
3213 3214 3215 3216 3217 3218
    if (code == 0) {
        level = 0;
    } else {
        level = get_bits(&s->gb, code);
        if ((level >> (code - 1)) == 0) /* if MSB not set it is negative*/
            level = - (level ^ ((1 << code) - 1));
3219 3220 3221 3222 3223 3224
        if (code > 8){
            if(get_bits1(&s->gb)==0){ /* marker */
                fprintf(stderr, "dc marker bit missing\n");
                return -1;
            }
        }
F
Fabrice Bellard 已提交
3225 3226
    }

3227
    pred = ff_mpeg4_pred_dc(s, n, &dc_val, dir_ptr);
F
Fabrice Bellard 已提交
3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238
    level += pred;
    if (level < 0)
        level = 0;
    if (n < 4) {
        *dc_val = level * s->y_dc_scale;
    } else {
        *dc_val = level * s->c_dc_scale;
    }
    return level;
}

3239 3240 3241 3242 3243 3244 3245
/**
 * decode a block
 * returns 0 if everything went ok
 * returns DECODING_AC_LOST   if an error was detected during AC decoding
 * returns DECODING_ACDC_LOST if an error was detected during DC decoding
 */
static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
M
Michael Niedermayer 已提交
3246
                              int n, int coded, int intra)
F
Fabrice Bellard 已提交
3247
{
M
Michael Niedermayer 已提交
3248
    int level, i, last, run;
F
Fabrice Bellard 已提交
3249
    int dc_pred_dir;
M
Michael Niedermayer 已提交
3250 3251 3252
    RLTable * rl;
    RL_VLC_ELEM * rl_vlc;
    const UINT8 * scan_table;
M
Michael Niedermayer 已提交
3253
    int qmul, qadd;
F
Fabrice Bellard 已提交
3254

M
Michael Niedermayer 已提交
3255
    if(intra) {
F
Fabrice Bellard 已提交
3256
	/* DC coef */
3257 3258 3259 3260 3261 3262 3263 3264 3265 3266
        if(s->data_partitioning && s->pict_type!=B_TYPE){
            level = s->dc_val[0][ s->block_index[n] ];
            if(n<4) level= (level + (s->y_dc_scale>>1))/s->y_dc_scale; //FIXME optimizs
            else    level= (level + (s->c_dc_scale>>1))/s->c_dc_scale;
            dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_width]<<n)&32;
        }else{
            level = mpeg4_decode_dc(s, n, &dc_pred_dir);
            if (level < 0)
                return DECODING_ACDC_LOST;
        }
F
Fabrice Bellard 已提交
3267
        block[0] = level;
M
Michael Niedermayer 已提交
3268
        i = 0;
F
Fabrice Bellard 已提交
3269 3270 3271
        if (!coded) 
            goto not_coded;
        rl = &rl_intra;
M
Michael Niedermayer 已提交
3272
        rl_vlc = rl_intra.rl_vlc[0];
3273 3274 3275
        if(s->alternate_scan)
            scan_table = ff_alternate_vertical_scan; /* left */
        else if (s->ac_pred) {
F
Fabrice Bellard 已提交
3276 3277 3278 3279 3280 3281 3282
            if (dc_pred_dir == 0) 
                scan_table = ff_alternate_vertical_scan; /* left */
            else
                scan_table = ff_alternate_horizontal_scan; /* top */
        } else {
            scan_table = zigzag_direct;
        }
M
Michael Niedermayer 已提交
3283 3284
        qmul=1;
        qadd=0;
F
Fabrice Bellard 已提交
3285
    } else {
M
Michael Niedermayer 已提交
3286
        i = -1;
F
Fabrice Bellard 已提交
3287
        if (!coded) {
M
Michael Niedermayer 已提交
3288
            s->block_last_index[n] = i;
F
Fabrice Bellard 已提交
3289 3290 3291
            return 0;
        }
        rl = &rl_inter;
3292 3293 3294 3295 3296 3297
   
        if(s->alternate_scan)
            scan_table = ff_alternate_vertical_scan; /* left */
        else
            scan_table = zigzag_direct;

3298 3299 3300 3301 3302 3303 3304 3305 3306
        if(s->mpeg_quant){
            qmul=1;
            qadd=0;
            rl_vlc = rl_inter.rl_vlc[0];        
        }else{
            qmul = s->qscale << 1;
            qadd = (s->qscale - 1) | 1;
            rl_vlc = rl_inter.rl_vlc[s->qscale];
        }
F
Fabrice Bellard 已提交
3307
    }
M
Michael Niedermayer 已提交
3308 3309
  {
    OPEN_READER(re, &s->gb);
F
Fabrice Bellard 已提交
3310
    for(;;) {
M
Michael Niedermayer 已提交
3311 3312 3313 3314 3315
        UPDATE_CACHE(re, &s->gb);
        GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
        if (level==0) {
            int cache;
            cache= GET_CACHE(re, &s->gb);
F
Fabrice Bellard 已提交
3316
            /* escape */
M
Michael Niedermayer 已提交
3317 3318
            if (cache&0x80000000) {
                if (cache&0x40000000) {
F
Fabrice Bellard 已提交
3319
                    /* third escape */
M
Michael Niedermayer 已提交
3320 3321 3322 3323 3324 3325 3326
                    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);

                    if(SHOW_UBITS(re, &s->gb, 1)==0){
3327 3328
                        fprintf(stderr, "1. marker bit missing in 3. esc\n");
                        return DECODING_AC_LOST;
M
Michael Niedermayer 已提交
3329 3330 3331 3332 3333
                    }; 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){
3334 3335
                        fprintf(stderr, "2. marker bit missing in 3. esc\n");
                        return DECODING_AC_LOST;
M
Michael Niedermayer 已提交
3336 3337 3338 3339
                    }; LAST_SKIP_CACHE(re, &s->gb, 1);
                    
                    SKIP_COUNTER(re, &s->gb, 1+12+1);
                    
3340 3341
                    if(level*s->qscale>1024 || level*s->qscale<-1024){
                        fprintf(stderr, "|level| overflow in 3. esc, qp=%d\n", s->qscale);
3342 3343 3344 3345 3346 3347
                        return DECODING_AC_LOST;
                    }
#if 1 
                    {
                        const int abs_level= ABS(level);
                        if(abs_level<=MAX_LEVEL && run<=MAX_RUN && s->error_resilience>=0){
3348
                            const int run1= run - rl->max_run[last][abs_level] - 1;
3349 3350 3351 3352 3353 3354 3355 3356
                            if(abs_level <= rl->max_level[last][run]){
                                fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
                                return DECODING_AC_LOST;
                            }
                            if(abs_level <= rl->max_level[last][run]*2){
                                fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
                                return DECODING_AC_LOST;
                            }
3357
                            if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){
3358 3359 3360 3361 3362 3363
                                fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
                                return DECODING_AC_LOST;
                            }
                        }
                    }
#endif
M
Michael Niedermayer 已提交
3364 3365 3366 3367 3368
		    if (level>0) level= level * qmul + qadd;
                    else         level= level * qmul - qadd;

                    i+= run + 1;
                    if(last) i+=192;
F
Fabrice Bellard 已提交
3369 3370
                } else {
                    /* second escape */
M
Michael Niedermayer 已提交
3371 3372 3373 3374 3375 3376 3377 3378 3379 3380
#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
                    GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
                    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);
F
Fabrice Bellard 已提交
3381 3382 3383
                }
            } else {
                /* first escape */
M
Michael Niedermayer 已提交
3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394
#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
                GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
                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);
F
Fabrice Bellard 已提交
3395 3396
            }
        } else {
M
Michael Niedermayer 已提交
3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408
            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)){
                fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
                return DECODING_AC_LOST;
            }

            block[scan_table[i]] = level;
F
Fabrice Bellard 已提交
3409
            break;
M
Michael Niedermayer 已提交
3410 3411 3412
        }

        block[scan_table[i]] = level;
F
Fabrice Bellard 已提交
3413
    }
M
Michael Niedermayer 已提交
3414 3415
    CLOSE_READER(re, &s->gb);
  }
F
Fabrice Bellard 已提交
3416 3417 3418 3419
 not_coded:
    if (s->mb_intra) {
        mpeg4_pred_ac(s, block, n, dc_pred_dir);
        if (s->ac_pred) {
M
Michael Niedermayer 已提交
3420
            i = 63; /* XXX: not optimal */
F
Fabrice Bellard 已提交
3421 3422
        }
    }
M
Michael Niedermayer 已提交
3423
    s->block_last_index[n] = i;
F
Fabrice Bellard 已提交
3424 3425 3426 3427 3428 3429 3430 3431
    return 0;
}

/* most is hardcoded. should extend to handle all h263 streams */
int h263_decode_picture_header(MpegEncContext *s)
{
    int format, width, height;

J
Juanjo 已提交
3432 3433 3434
    /* picture start code */
    if (get_bits(&s->gb, 22) != 0x20) {
        fprintf(stderr, "Bad picture start code\n");
F
Fabrice Bellard 已提交
3435
        return -1;
J
Juanjo 已提交
3436 3437
    }
    /* temporal reference */
3438
    s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
J
Juanjo 已提交
3439 3440 3441 3442 3443 3444 3445 3446 3447

    /* PTYPE starts here */    
    if (get_bits1(&s->gb) != 1) {
        /* marker */
        fprintf(stderr, "Bad marker\n");
        return -1;
    }
    if (get_bits1(&s->gb) != 0) {
        fprintf(stderr, "Bad H263 id\n");
F
Fabrice Bellard 已提交
3448
        return -1;	/* h263 id */
J
Juanjo 已提交
3449
    }
3450 3451 3452
    skip_bits1(&s->gb);	/* split screen off */
    skip_bits1(&s->gb);	/* camera  off */
    skip_bits1(&s->gb);	/* freeze picture release off */
F
Fabrice Bellard 已提交
3453

3454
    /* Reset GOB number */
3455
    s->gob_number = 0;
3456
        
F
Fabrice Bellard 已提交
3457
    format = get_bits(&s->gb, 3);
J
Juanjo 已提交
3458 3459 3460 3461 3462 3463
    /*
        0    forbidden
        1    sub-QCIF
        10   QCIF
        7	extended PTYPE (PLUSPTYPE)
    */
F
Fabrice Bellard 已提交
3464

3465
    if (format != 7 && format != 6) {
F
Fabrice Bellard 已提交
3466 3467 3468 3469 3470 3471
        s->h263_plus = 0;
        /* H.263v1 */
        width = h263_format[format][0];
        height = h263_format[format][1];
        if (!width)
            return -1;
3472 3473 3474
        
        s->width = width;
        s->height = height;
3475
        s->pict_type = I_TYPE + get_bits1(&s->gb);
F
Fabrice Bellard 已提交
3476

3477
        s->unrestricted_mv = get_bits1(&s->gb); 
F
Fabrice Bellard 已提交
3478 3479
        s->h263_long_vectors = s->unrestricted_mv;

J
Juanjo 已提交
3480 3481
        if (get_bits1(&s->gb) != 0) {
            fprintf(stderr, "H263 SAC not supported\n");
F
Fabrice Bellard 已提交
3482
            return -1;	/* SAC: off */
J
Juanjo 已提交
3483
        }
3484 3485 3486 3487
        if (get_bits1(&s->gb) != 0) {
            s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
        }   
        
J
Juanjo 已提交
3488 3489
        if (get_bits1(&s->gb) != 0) {
            fprintf(stderr, "H263 PB frame not supported\n");
F
Fabrice Bellard 已提交
3490
            return -1;	/* not PB frame */
J
Juanjo 已提交
3491
        }
F
Fabrice Bellard 已提交
3492
        s->qscale = get_bits(&s->gb, 5);
3493
        skip_bits1(&s->gb);	/* Continuous Presence Multipoint mode: off */
F
Fabrice Bellard 已提交
3494
    } else {
3495 3496
        int ufep;
        
F
Fabrice Bellard 已提交
3497
        /* H.263v2 */
3498 3499
        s->h263_plus = 1;
        ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
J
Juanjo 已提交
3500 3501

        /* ufep other than 0 and 1 are reserved */        
3502 3503 3504
        if (ufep == 1) {
            /* OPPTYPE */       
            format = get_bits(&s->gb, 3);
J
Juanjo 已提交
3505
            dprintf("ufep=1, format: %d\n", format);
3506 3507 3508 3509 3510 3511
            skip_bits(&s->gb,1); /* Custom PCF */
            s->umvplus_dec = get_bits(&s->gb, 1); /* Unrestricted Motion Vector */
            skip_bits1(&s->gb); /* Syntax-based Arithmetic Coding (SAC) */
            if (get_bits1(&s->gb) != 0) {
                s->mv_type = MV_TYPE_8X8; /* Advanced prediction mode */
            }
3512 3513 3514
            if (get_bits1(&s->gb) != 0) { /* Advanced Intra Coding (AIC) */
                s->h263_aic = 1;
            }
J
Juanjo 已提交
3515
	    
3516
            skip_bits(&s->gb, 7);
J
Juanjo 已提交
3517 3518 3519 3520 3521 3522 3523 3524 3525
            /* these are the 7 bits: (in order of appearence  */
            /* Deblocking Filter */
            /* Slice Structured */
            /* Reference Picture Selection */
            /* Independent Segment Decoding */
            /* Alternative Inter VLC */
            /* Modified Quantization */
            /* Prevent start code emulation */

3526
            skip_bits(&s->gb, 3); /* Reserved */
J
Juanjo 已提交
3527 3528
        } else if (ufep != 0) {
            fprintf(stderr, "Bad UFEP type (%d)\n", ufep);
3529
            return -1;
J
Juanjo 已提交
3530
        }
3531
            
3532
        /* MPPTYPE */
J
Juanjo 已提交
3533 3534
        s->pict_type = get_bits(&s->gb, 3) + I_TYPE;
        dprintf("pict_type: %d\n", s->pict_type);
F
Fabrice Bellard 已提交
3535 3536 3537
        if (s->pict_type != I_TYPE &&
            s->pict_type != P_TYPE)
            return -1;
3538 3539
        skip_bits(&s->gb, 2);
        s->no_rounding = get_bits1(&s->gb);
J
Juanjo 已提交
3540
        dprintf("RTYPE: %d\n", s->no_rounding);
3541
        skip_bits(&s->gb, 4);
3542 3543
        
        /* Get the picture dimensions */
3544 3545 3546
        if (ufep) {
            if (format == 6) {
                /* Custom Picture Format (CPFMT) */
J
Juanjo 已提交
3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557
                s->aspect_ratio_info = get_bits(&s->gb, 4);
                dprintf("aspect: %d\n", s->aspect_ratio_info);
                /* 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
                */
3558 3559 3560
                width = (get_bits(&s->gb, 9) + 1) * 4;
                skip_bits1(&s->gb);
                height = get_bits(&s->gb, 9) * 4;
J
Juanjo 已提交
3561
                dprintf("\nH.263+ Custom picture: %dx%d\n",width,height);
3562
                if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
J
Juanjo 已提交
3563
                    /* aspected dimensions */
3564 3565
		    s->aspected_width = get_bits(&s->gb, 8);
		    s->aspected_height = get_bits(&s->gb, 8);
J
Juanjo 已提交
3566 3567
                }
            } else {
3568 3569 3570 3571 3572 3573 3574 3575 3576 3577
                width = h263_format[format][0];
                height = h263_format[format][1];
            }
            if ((width == 0) || (height == 0))
                return -1;
            s->width = width;
            s->height = height;
            if (s->umvplus_dec) {
                skip_bits1(&s->gb); /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
            }
3578 3579
        }
            
F
Fabrice Bellard 已提交
3580 3581 3582
        s->qscale = get_bits(&s->gb, 5);
    }
    /* PEI */
3583 3584
    while (get_bits1(&s->gb) != 0) {
        skip_bits(&s->gb, 8);
F
Fabrice Bellard 已提交
3585 3586
    }
    s->f_code = 1;
3587 3588 3589 3590 3591 3592 3593 3594 3595
    
    if(s->h263_aic){
         s->y_dc_scale_table= 
         s->c_dc_scale_table= h263_aic_dc_scale_table;
    }else{
        s->y_dc_scale_table=
        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
    }

F
Fabrice Bellard 已提交
3596 3597 3598
    return 0;
}

3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612
static void mpeg4_decode_sprite_trajectory(MpegEncContext * s)
{
    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];
    int w2, h2;
    int alpha=0, beta=0;
    int w= s->width;
    int h= s->height;
M
Michael Niedermayer 已提交
3613
//printf("SP %d\n", s->sprite_warping_accuracy);
3614 3615 3616 3617 3618 3619 3620
    for(i=0; i<s->num_sprite_warping_points; i++){
        int length;
        int x=0, y=0;

        length= get_vlc(&s->gb, &sprite_trajectory);
        if(length){
            x= get_bits(&s->gb, length);
M
Michael Niedermayer 已提交
3621
//printf("lx %d %d\n", length, x);
3622 3623 3624
            if ((x >> (length - 1)) == 0) /* if MSB not set it is negative*/
                x = - (x ^ ((1 << length) - 1));
        }
M
Michael Niedermayer 已提交
3625
        if(!(s->divx_version==500 && s->divx_build==413)) skip_bits1(&s->gb); /* marker bit */
3626 3627 3628 3629
        
        length= get_vlc(&s->gb, &sprite_trajectory);
        if(length){
            y=get_bits(&s->gb, length);
M
Michael Niedermayer 已提交
3630
//printf("ly %d %d\n", length, y);
3631 3632 3633 3634
            if ((y >> (length - 1)) == 0) /* if MSB not set it is negative*/
                y = - (y ^ ((1 << length) - 1));
        }
        skip_bits1(&s->gb); /* marker bit */
M
Michael Niedermayer 已提交
3635
//printf("%d %d %d %d\n", x, y, i, s->sprite_warping_accuracy);
3636
//if(i>0 && (x!=0 || y!=0)) printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
M
Michael Niedermayer 已提交
3637
//x=y=0;
3638 3639 3640 3641 3642 3643 3644 3645 3646 3647
        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;

// Note, the 4th point isnt used for GMC
M
Michael Niedermayer 已提交
3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662
    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]);
    }
3663 3664 3665 3666 3667 3668 3669 3670
/*    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]); */
    
// 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
    virtual_ref[0][0]= 16*(vop_ref[0][0] + w2) 
M
Michael Niedermayer 已提交
3671
        + 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);
3672
    virtual_ref[0][1]= 16*vop_ref[0][1] 
M
Michael Niedermayer 已提交
3673
        + 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);
3674
    virtual_ref[1][0]= 16*vop_ref[0][0] 
M
Michael Niedermayer 已提交
3675
        + 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);
3676
    virtual_ref[1][1]= 16*(vop_ref[0][1] + h2) 
M
Michael Niedermayer 已提交
3677
        + 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);
3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746

    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;
            s->sprite_delta[0][0][0]= a;
            s->sprite_delta[0][0][1]= 0;
            s->sprite_delta[0][1][0]= 0;
            s->sprite_delta[0][1][1]= a;
            s->sprite_delta[1][0][0]= a;
            s->sprite_delta[1][0][1]= 0;
            s->sprite_delta[1][1][0]= 0;
            s->sprite_delta[1][1][1]= a;
            s->sprite_shift[0][0]= 0;
            s->sprite_shift[0][1]= 0;
            s->sprite_shift[1][0]= 0;
            s->sprite_shift[1][1]= 0;
            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);
            s->sprite_delta[0][0][0]= a;
            s->sprite_delta[0][0][1]= 0;
            s->sprite_delta[0][1][0]= 0;
            s->sprite_delta[0][1][1]= a;
            s->sprite_delta[1][0][0]= a;
            s->sprite_delta[1][0][1]= 0;
            s->sprite_delta[1][1][0]= 0;
            s->sprite_delta[1][1][1]= a;
            s->sprite_shift[0][0]= 0;
            s->sprite_shift[0][1]= 0;
            s->sprite_shift[1][0]= 0;
            s->sprite_shift[1][1]= 0;
            break;
        case 2:
        case 3: //FIXME
            s->sprite_offset[0][0]= (sprite_ref[0][0]<<(alpha+rho))
                                                  + ((-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]));
            s->sprite_offset[0][1]= (sprite_ref[0][1]<<(alpha+rho))
                                                  + ((-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]));
            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)
                                 +2*w2*r*sprite_ref[0][0] - 16*w2);
            s->sprite_offset[1][1]= ((-r*sprite_ref[0][1] + virtual_ref[0][1])*(-2*vop_ref[0][0] + 1) 
                                 +(-r*sprite_ref[0][0] + virtual_ref[0][0])*(-2*vop_ref[0][1] + 1)
                                 +2*w2*r*sprite_ref[0][1] - 16*w2);
            s->sprite_delta[0][0][0]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
            s->sprite_delta[0][0][1]=   ( r*sprite_ref[0][1] - virtual_ref[0][1]);
            s->sprite_delta[0][1][0]=   (-r*sprite_ref[0][1] + virtual_ref[0][1]);
            s->sprite_delta[0][1][1]=   (-r*sprite_ref[0][0] + virtual_ref[0][0]);
            s->sprite_delta[1][0][0]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
            s->sprite_delta[1][0][1]= 4*( r*sprite_ref[0][1] - virtual_ref[0][1]);
            s->sprite_delta[1][1][0]= 4*(-r*sprite_ref[0][1] + virtual_ref[0][1]);
            s->sprite_delta[1][1][1]= 4*(-r*sprite_ref[0][0] + virtual_ref[0][0]);
            s->sprite_shift[0][0]= alpha+rho;
            s->sprite_shift[0][1]= alpha+rho;
            s->sprite_shift[1][0]= alpha+rho+2;
            s->sprite_shift[1][1]= alpha+rho+2;
            break;
//        case 3:
            break;
    }
M
Michael Niedermayer 已提交
3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784
/*printf("%d %d\n", s->sprite_delta[0][0][0], a<<s->sprite_shift[0][0]);
printf("%d %d\n", s->sprite_delta[0][0][1], 0);
printf("%d %d\n", s->sprite_delta[0][1][0], 0);
printf("%d %d\n", s->sprite_delta[0][1][1], a<<s->sprite_shift[0][1]);
printf("%d %d\n", s->sprite_delta[1][0][0], a<<s->sprite_shift[1][0]);
printf("%d %d\n", s->sprite_delta[1][0][1], 0);
printf("%d %d\n", s->sprite_delta[1][1][0], 0);
printf("%d %d\n", s->sprite_delta[1][1][1], a<<s->sprite_shift[1][1]);*/
    /* try to simplify the situation */ 
    if(   s->sprite_delta[0][0][0] == a<<s->sprite_shift[0][0]
       && s->sprite_delta[0][0][1] == 0
       && s->sprite_delta[0][1][0] == 0
       && s->sprite_delta[0][1][1] == a<<s->sprite_shift[0][1]
       && s->sprite_delta[1][0][0] == a<<s->sprite_shift[1][0]
       && s->sprite_delta[1][0][1] == 0
       && s->sprite_delta[1][1][0] == 0
       && s->sprite_delta[1][1][1] == a<<s->sprite_shift[1][1])
    {
        s->sprite_offset[0][0]>>=s->sprite_shift[0][0];
        s->sprite_offset[0][1]>>=s->sprite_shift[0][1];
        s->sprite_offset[1][0]>>=s->sprite_shift[1][0];
        s->sprite_offset[1][1]>>=s->sprite_shift[1][1];
        s->sprite_delta[0][0][0]= a;
        s->sprite_delta[0][0][1]= 0;
        s->sprite_delta[0][1][0]= 0;
        s->sprite_delta[0][1][1]= a;
        s->sprite_delta[1][0][0]= a;
        s->sprite_delta[1][0][1]= 0;
        s->sprite_delta[1][1][0]= 0;
        s->sprite_delta[1][1][1]= a;
        s->sprite_shift[0][0]= 0;
        s->sprite_shift[0][1]= 0;
        s->sprite_shift[1][0]= 0;
        s->sprite_shift[1][1]= 0;
        s->real_sprite_warping_points=1;
    }
    else
        s->real_sprite_warping_points= s->num_sprite_warping_points;
3785

M
Michael Niedermayer 已提交
3786
//printf("%d %d %d %d\n", d[0][0], d[0][1], s->sprite_offset[0][0], s->sprite_offset[0][1]);
3787 3788
}

F
Fabrice Bellard 已提交
3789 3790 3791 3792
/* decode mpeg4 VOP header */
int mpeg4_decode_picture_header(MpegEncContext * s)
{
    int time_incr, startcode, state, v;
3793
    int time_increment;
F
Fabrice Bellard 已提交
3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806

 redo:
    /* search next start code */
    align_get_bits(&s->gb);
    state = 0xff;
    for(;;) {
        v = get_bits(&s->gb, 8);
        if (state == 0x000001) {
            state = ((state << 8) | v) & 0xffffff;
            startcode = state;
            break;
        }
        state = ((state << 8) | v) & 0xffffff;
M
oops  
Michael Niedermayer 已提交
3807
        if( get_bits_count(&s->gb) > s->gb.size*8-32){
M
Michael Niedermayer 已提交
3808 3809 3810 3811 3812 3813 3814
            if(s->gb.size>50){
                printf("no VOP startcode found, frame size was=%d\n", s->gb.size);
                return -1;
            }else{
                printf("frame skip\n");
                return FRAME_SKIPED;
            }
3815
        }
F
Fabrice Bellard 已提交
3816
    }
3817 3818
//printf("startcode %X %d\n", startcode, get_bits_count(&s->gb));
    if (startcode == 0x120) { // Video Object Layer
M
Michael Niedermayer 已提交
3819
        int width, height, vo_ver_id;
F
Fabrice Bellard 已提交
3820 3821

        /* vol header */
3822
        skip_bits(&s->gb, 1); /* random access */
M
Michael Niedermayer 已提交
3823
        s->vo_type= get_bits(&s->gb, 8);
3824 3825 3826 3827 3828 3829
        if (get_bits1(&s->gb) != 0) { /* is_ol_id */
            vo_ver_id = get_bits(&s->gb, 4); /* vo_ver_id */
            skip_bits(&s->gb, 3); /* vo_priority */
        } else {
            vo_ver_id = 1;
        }
M
Michael Niedermayer 已提交
3830
//printf("vo type:%d\n",s->vo_type);
3831
        s->aspect_ratio_info= get_bits(&s->gb, 4);
3832 3833 3834
	if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){	    
	    s->aspected_width = get_bits(&s->gb, 8); // par_width
	    s->aspected_height = get_bits(&s->gb, 8); // par_height
3835
        }
3836

3837
        if ((s->vol_control_parameters=get_bits1(&s->gb))) { /* vol control parameter */
M
Michael Niedermayer 已提交
3838 3839 3840 3841 3842 3843
            int chroma_format= get_bits(&s->gb, 2);
            if(chroma_format!=1){
                printf("illegal chroma format\n");
            }
            s->low_delay= get_bits1(&s->gb);
            if(get_bits1(&s->gb)){ /* vbv parameters */
3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854
                get_bits(&s->gb, 15);	/* first_half_bitrate */
                skip_bits1(&s->gb);	/* marker */
                get_bits(&s->gb, 15);	/* latter_half_bitrate */
                skip_bits1(&s->gb);	/* marker */
                get_bits(&s->gb, 15);	/* first_half_vbv_buffer_size */
                skip_bits1(&s->gb);	/* marker */
                get_bits(&s->gb, 3);	/* latter_half_vbv_buffer_size */
                get_bits(&s->gb, 11);	/* first_half_vbv_occupancy */
                skip_bits1(&s->gb);	/* marker */
                get_bits(&s->gb, 15);	/* latter_half_vbv_occupancy */
                skip_bits1(&s->gb);	/* marker */               
M
Michael Niedermayer 已提交
3855 3856
            }
        }else{
3857 3858 3859
            // set low delay flag only once so the smart? low delay detection wont be overriden
            if(s->picture_number==0)
                s->low_delay=0;
3860
        }
M
Michael Niedermayer 已提交
3861

3862
        s->shape = get_bits(&s->gb, 2); /* vol shape */
3863
        if(s->shape != RECT_SHAPE) printf("only rectangular vol supported\n");
3864 3865 3866 3867 3868
        if(s->shape == GRAY_SHAPE && vo_ver_id != 1){
            printf("Gray shape not supported\n");
            skip_bits(&s->gb, 4);  //video_object_layer_shape_extension
        }

3869
        skip_bits1(&s->gb);   /* marker */
F
Fabrice Bellard 已提交
3870
        
M
Michael Niedermayer 已提交
3871
        s->time_increment_resolution = get_bits(&s->gb, 16);
3872
        
M
Michael Niedermayer 已提交
3873
        s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
3874 3875
        if (s->time_increment_bits < 1)
            s->time_increment_bits = 1;
3876
        skip_bits1(&s->gb);   /* marker */
F
Fabrice Bellard 已提交
3877

3878 3879 3880 3881
        if (get_bits1(&s->gb) != 0) {   /* fixed_vop_rate  */
            skip_bits(&s->gb, s->time_increment_bits);
        }

3882 3883
        if (s->shape != BIN_ONLY_SHAPE) {
            if (s->shape == RECT_SHAPE) {
3884 3885 3886 3887 3888
                skip_bits1(&s->gb);   /* marker */
                width = get_bits(&s->gb, 13);
                skip_bits1(&s->gb);   /* marker */
                height = get_bits(&s->gb, 13);
                skip_bits1(&s->gb);   /* marker */
3889 3890 3891
                if(width && height){ /* they should be non zero but who knows ... */
                    s->width = width;
                    s->height = height;
M
Michael Niedermayer 已提交
3892
//                    printf("width/height: %d %d\n", width, height);
3893
                }
3894 3895
            }
            
3896
            s->progressive_sequence= get_bits1(&s->gb)^1;
3897
            if(!get_bits1(&s->gb)) printf("OBMC not supported (very likely buggy encoder)\n");   /* OBMC Disable */
3898 3899 3900 3901 3902
            if (vo_ver_id == 1) {
                s->vol_sprite_usage = get_bits1(&s->gb); /* vol_sprite_usage */
            } else {
                s->vol_sprite_usage = get_bits(&s->gb, 2); /* vol_sprite_usage */
            }
3903
            if(s->vol_sprite_usage==STATIC_SPRITE) printf("Static Sprites not supported\n");
3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914
            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(&s->gb, 13);
                    skip_bits1(&s->gb); /* marker */
                    s->sprite_height= get_bits(&s->gb, 13);
                    skip_bits1(&s->gb); /* marker */
                    s->sprite_left  = get_bits(&s->gb, 13);
                    skip_bits1(&s->gb); /* marker */
                    s->sprite_top   = get_bits(&s->gb, 13);
                    skip_bits1(&s->gb); /* marker */
                }
3915
                s->num_sprite_warping_points= get_bits(&s->gb, 6);
3916 3917 3918 3919 3920 3921 3922
                s->sprite_warping_accuracy = get_bits(&s->gb, 2);
                s->sprite_brightness_change= get_bits1(&s->gb);
                if(s->vol_sprite_usage==STATIC_SPRITE)
                    s->low_latency_sprite= get_bits1(&s->gb);            
            }
            // FIXME sadct disable bit if verid!=1 && shape not rect
            
3923 3924
            if (get_bits1(&s->gb) == 1) {   /* not_8_bit */
                s->quant_precision = get_bits(&s->gb, 4); /* quant_precision */
3925
                if(get_bits(&s->gb, 4)!=8) printf("N-bit not supported\n"); /* bits_per_pixel */
3926
                if(s->quant_precision!=5) printf("quant precission %d\n", s->quant_precision);
3927 3928 3929 3930
            } else {
                s->quant_precision = 5;
            }
            
3931
            // FIXME a bunch of grayscale shape things
3932

3933
            if((s->mpeg_quant=get_bits1(&s->gb))){ /* vol_quant_type */
3934
                int i, j, v;
3935
                
3936 3937 3938 3939 3940 3941 3942
                /* load default matrixes */
                for(i=0; i<64; i++){
                    v= ff_mpeg4_default_intra_matrix[i];
                    s->intra_matrix[i]= v;
                    s->chroma_intra_matrix[i]= v;
                    
                    v= ff_mpeg4_default_non_intra_matrix[i];
3943 3944
                    s->inter_matrix[i]= v;
                    s->chroma_inter_matrix[i]= v;
3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965
                }

                /* load custom intra matrix */
                if(get_bits1(&s->gb)){
                    for(i=0; i<64; i++){
                        v= get_bits(&s->gb, 8);
                        if(v==0) break;

                        j= zigzag_direct[i];
                        s->intra_matrix[j]= v;
                        s->chroma_intra_matrix[j]= v;
                    }
                }

                /* load custom non intra matrix */
                if(get_bits1(&s->gb)){
                    for(i=0; i<64; i++){
                        v= get_bits(&s->gb, 8);
                        if(v==0) break;

                        j= zigzag_direct[i];
3966 3967
                        s->inter_matrix[j]= v;
                        s->chroma_inter_matrix[j]= v;
3968 3969 3970 3971 3972
                    }

                    /* replicate last value */
                    for(; i<64; i++){
                        j= zigzag_direct[i];
3973 3974
                        s->inter_matrix[j]= v;
                        s->chroma_inter_matrix[j]= v;
3975 3976 3977 3978
                    }
                }

                // FIXME a bunch of grayscale shape things
3979
            }
3980

3981 3982 3983
            if(vo_ver_id != 1)
                 s->quarter_sample= get_bits1(&s->gb);
            else s->quarter_sample=0;
3984 3985

            if(!get_bits1(&s->gb)) printf("Complexity estimation not supported\n");
3986 3987 3988

            s->resync_marker= !get_bits1(&s->gb); /* resync_marker_disabled */

3989 3990 3991 3992 3993 3994
            s->data_partitioning= get_bits1(&s->gb);
            if(s->data_partitioning){
                s->rvlc= get_bits1(&s->gb);
                if(s->rvlc){
                    printf("reversible vlc not supported\n");
                }
3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012
            }
            
            if(vo_ver_id != 1) {
                s->new_pred= get_bits1(&s->gb);
                if(s->new_pred){
                    printf("new pred not supported\n");
                    skip_bits(&s->gb, 2); /* requested upstream message type */
                    skip_bits1(&s->gb); /* newpred segment type */
                }
                s->reduced_res_vop= get_bits1(&s->gb);
                if(s->reduced_res_vop) printf("reduced resolution VOP not supported\n");
            }
            else{
                s->new_pred=0;
                s->reduced_res_vop= 0;
            }

            s->scalability= get_bits1(&s->gb);
M
Michael Niedermayer 已提交
4013
            if(s->workaround_bugs==1) s->scalability=0;
4014
            if (s->scalability) {
M
Michael Niedermayer 已提交
4015 4016 4017 4018 4019 4020 4021 4022 4023
                int dummy= s->hierachy_type= get_bits1(&s->gb);
                int ref_layer_id= get_bits(&s->gb, 4);
                int ref_layer_sampling_dir= get_bits1(&s->gb);
                int h_sampling_factor_n= get_bits(&s->gb, 5);
                int h_sampling_factor_m= get_bits(&s->gb, 5);
                int v_sampling_factor_n= get_bits(&s->gb, 5);
                int v_sampling_factor_m= get_bits(&s->gb, 5);
                s->enhancement_type= get_bits1(&s->gb);
                // bin shape stuff FIXME
4024
                printf("scalability not supported\n");
4025 4026
            }
        }
4027
//printf("end Data %X %d\n", show_bits(&s->gb, 32), get_bits_count(&s->gb)&0x7);
F
Fabrice Bellard 已提交
4028
        goto redo;
4029
    } else if (startcode == 0x1b2) { //userdata
M
Michael Niedermayer 已提交
4030 4031 4032 4033 4034
        char buf[256];
        int i;
        int e;
        int ver, build;

4035
//printf("user Data %X\n", show_bits(&s->gb, 32));
M
Michael Niedermayer 已提交
4036 4037 4038 4039 4040 4041 4042 4043
        buf[0]= show_bits(&s->gb, 8);
        for(i=1; i<256; i++){
            buf[i]= show_bits(&s->gb, 16)&0xFF;
            if(buf[i]==0) break;
            skip_bits(&s->gb, 8);
        }
        buf[255]=0;
        e=sscanf(buf, "DivX%dBuild%d", &ver, &build);
M
Michael Niedermayer 已提交
4044 4045
        if(e!=2)
            e=sscanf(buf, "DivX%db%d", &ver, &build);
M
Michael Niedermayer 已提交
4046 4047 4048 4049 4050
        if(e==2){
            s->divx_version= ver;
            s->divx_build= build;
            if(s->picture_number==0){
                printf("This file was encoded with DivX%d Build%d\n", ver, build);
M
Michael Niedermayer 已提交
4051
                if(ver==500 && build==413){
M
Michael Niedermayer 已提交
4052 4053 4054 4055 4056
                    printf("WARNING: this version of DivX is not MPEG4 compatible, trying to workaround these bugs...\n");
                }
            }
        }
//printf("User Data: %s\n", buf);
4057 4058
        goto redo;
    } else if (startcode != 0x1b6) { //VOP
F
Fabrice Bellard 已提交
4059 4060 4061
        goto redo;
    }

J
Juanjo 已提交
4062
    s->pict_type = get_bits(&s->gb, 2) + I_TYPE;	/* pict type: I = 0 , P = 1 */
4063
//if(s->pict_type!=I_TYPE) return FRAME_SKIPED;
4064 4065 4066 4067
    if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
        printf("low_delay flag set, but shouldnt, clearing it\n");
        s->low_delay=0;
    }
4068
// printf("pic: %d, qpel:%d part:%d resync:%d\n", s->pict_type, s->quarter_sample, s->data_partitioning, s->resync_marker); 
4069 4070 4071 4072 4073
    
    if(s->time_increment_resolution==0){
        s->time_increment_resolution=1;
//        fprintf(stderr, "time_increment_resolution is illegal\n");
    }
M
Michael Niedermayer 已提交
4074
    time_incr=0;
4075
    while (get_bits1(&s->gb) != 0) 
F
Fabrice Bellard 已提交
4076 4077
        time_incr++;

4078
    check_marker(&s->gb, "before time_increment");
4079 4080
    time_increment= get_bits(&s->gb, s->time_increment_bits);
//printf(" type:%d incr:%d increment:%d\n", s->pict_type, time_incr, time_increment);
M
Michael Niedermayer 已提交
4081
    if(s->pict_type!=B_TYPE){
4082
        s->last_time_base= s->time_base;
M
Michael Niedermayer 已提交
4083
        s->time_base+= time_incr;
4084
        s->time= s->time_base*s->time_increment_resolution + time_increment;
4085 4086 4087 4088 4089
        if(s->time < s->last_non_b_time && s->workaround_bugs==3){
            fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
            s->time_base++;
            s->time+= s->time_increment_resolution;
        }
4090 4091
        s->pp_time= s->time - s->last_non_b_time;
        s->last_non_b_time= s->time;
M
Michael Niedermayer 已提交
4092
    }else{
4093
        s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment;
4094 4095
        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){
4096 4097 4098
//            printf("messed up order, seeking?, skiping current b frame\n");
            return FRAME_SKIPED;
        }
4099 4100 4101 4102 4103 4104 4105 4106
        
        if(s->t_frame==0) s->t_frame= s->time - s->last_time_base;
        if(s->t_frame==0) s->t_frame=1; // 1/0 protection
//printf("%Ld %Ld %d %d\n", s->last_non_b_time, s->time, s->pp_time, s->t_frame); fflush(stdout);
        s->pp_field_time= (  ROUNDED_DIV(s->last_non_b_time, s->t_frame) 
                           - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
        s->pb_field_time= (  ROUNDED_DIV(s->time, s->t_frame) 
                           - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
M
Michael Niedermayer 已提交
4107
    }
4108 4109 4110
    
    s->avctx->pts= s->time*1000LL*1000LL / s->time_increment_resolution;
    
4111 4112 4113 4114 4115 4116 4117
    if(check_marker(&s->gb, "before vop_coded")==0 && s->picture_number==0){
        printf("hmm, seems the headers arnt complete, trying to guess time_increment_bits\n");
        for(s->time_increment_bits++ ;s->time_increment_bits<16; s->time_increment_bits++){
            if(get_bits1(&s->gb)) break;
        }
        printf("my guess is %d bits ;)\n",s->time_increment_bits);
    }
F
Fabrice Bellard 已提交
4118
    /* vop coded */
4119
    if (get_bits1(&s->gb) != 1)
4120
        goto redo;
4121 4122
//printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base,
//s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);  
4123 4124
    if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
                          || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
F
Fabrice Bellard 已提交
4125
        /* rounding type for motion estimation */
4126
	s->no_rounding = get_bits1(&s->gb);
4127 4128
    } else {
	s->no_rounding = 0;
F
Fabrice Bellard 已提交
4129
    }
4130 4131 4132
//FIXME reduced res stuff

     if (s->shape != RECT_SHAPE) {
4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149
         if (s->vol_sprite_usage != 1 || s->pict_type != I_TYPE) {
             int width, height, hor_spat_ref, ver_spat_ref;
 
             width = get_bits(&s->gb, 13);
             skip_bits1(&s->gb);   /* marker */
             height = get_bits(&s->gb, 13);
             skip_bits1(&s->gb);   /* marker */
             hor_spat_ref = get_bits(&s->gb, 13); /* hor_spat_ref */
             skip_bits1(&s->gb);   /* marker */
             ver_spat_ref = get_bits(&s->gb, 13); /* ver_spat_ref */
         }
         skip_bits1(&s->gb); /* change_CR_disable */
 
         if (get_bits1(&s->gb) != 0) {
             skip_bits(&s->gb, 8); /* constant_alpha_value */
         }
     }
4150 4151 4152
//FIXME complexity estimation stuff
     
     if (s->shape != BIN_ONLY_SHAPE) {
4153 4154 4155
         int t;
         t=get_bits(&s->gb, 3); /* intra dc VLC threshold */
//printf("threshold %d\n", t);
4156 4157 4158
         if(!s->progressive_sequence){
             s->top_field_first= get_bits1(&s->gb);
             s->alternate_scan= get_bits1(&s->gb);
4159 4160
         }else
             s->alternate_scan= 0;
4161
     }
4162

4163
     if(s->pict_type == S_TYPE && (s->vol_sprite_usage==STATIC_SPRITE || s->vol_sprite_usage==GMC_SPRITE)){
4164 4165 4166
         if(s->num_sprite_warping_points){
             mpeg4_decode_sprite_trajectory(s);
         }
4167 4168 4169
         if(s->sprite_brightness_change) printf("sprite_brightness_change not supported\n");
         if(s->vol_sprite_usage==STATIC_SPRITE) printf("static sprite not supported\n");
     }
4170

4171
     if (s->shape != BIN_ONLY_SHAPE) {
4172 4173 4174 4175
         /* note: we do not use quant_precision to avoid problem if no
            MPEG4 vol header as it is found on some old opendivx
            movies */
         s->qscale = get_bits(&s->gb, 5);
4176 4177 4178 4179
         if(s->qscale==0){
             printf("Error, header damaged or not MPEG4 header (qscale=0)\n");
             return -1; // makes no sense to continue, as there is nothing left from the image then
         }
4180 4181 4182
  
         if (s->pict_type != I_TYPE) {
             s->f_code = get_bits(&s->gb, 3);	/* fcode_for */
4183 4184 4185 4186
             if(s->f_code==0){
                 printf("Error, header damaged or not MPEG4 header (f_code=0)\n");
                 return -1; // makes no sense to continue, as the MV decoding will break very quickly
             }
4187 4188 4189
         }else
             s->f_code=1;
     
4190 4191
         if (s->pict_type == B_TYPE) {
             s->b_code = get_bits(&s->gb, 3);
4192 4193
         }else
             s->b_code=1;
4194
#if 0
M
Michael Niedermayer 已提交
4195
printf("qp:%d fc:%d bc:%d type:%s size:%d pro:%d alt:%d top:%d qpel:%d part:%d resync:%d\n", 
4196 4197
    s->qscale, s->f_code, s->b_code, 
    s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")), 
M
Michael Niedermayer 已提交
4198 4199
    s->gb.size,s->progressive_sequence, s->alternate_scan, s->top_field_first, 
    s->quarter_sample, s->data_partitioning, s->resync_marker); 
4200
#endif
4201 4202 4203 4204
         if(!s->scalability){
             if (s->shape!=RECT_SHAPE && s->pict_type!=I_TYPE) {
                 skip_bits1(&s->gb); // vop shape coding type
             }
M
Michael Niedermayer 已提交
4205 4206 4207 4208 4209 4210 4211 4212
         }else{
             if(s->enhancement_type){
                 int load_backward_shape= get_bits1(&s->gb);
                 if(load_backward_shape){
                     printf("load backward shape isnt supported\n");
                 }
             }
             skip_bits(&s->gb, 2); //ref_select_code
4213 4214
         }
     }
4215 4216
     /* detect buggy encoders which dont set the low_delay flag (divx4/xvid/opendivx)*/
     // note we cannot detect divx5 without b-frames easyly (allthough its buggy too)
4217 4218
     if(s->vo_type==0 && s->vol_control_parameters==0 && s->divx_version==0 && s->picture_number==0){
         printf("looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n");
4219 4220 4221
         s->low_delay=1;
     }

M
Michael Niedermayer 已提交
4222
     s->picture_number++; // better than pic number==0 allways ;)
4223

4224 4225 4226
     s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; //FIXME add short header support 
     s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;

4227 4228 4229 4230
     if(s->divx_version==0 || s->divx_version < 500){
         s->h_edge_pos= s->width;
         s->v_edge_pos= s->height;
     }
4231
     return 0;
F
Fabrice Bellard 已提交
4232 4233 4234 4235 4236 4237 4238 4239
}

/* don't understand why they choose a different header ! */
int intel_h263_decode_picture_header(MpegEncContext *s)
{
    int format;

    /* picture header */
J
Juanjo 已提交
4240 4241
    if (get_bits(&s->gb, 22) != 0x20) {
        fprintf(stderr, "Bad picture start code\n");
F
Fabrice Bellard 已提交
4242
        return -1;
J
Juanjo 已提交
4243 4244
    }
    s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
F
Fabrice Bellard 已提交
4245

J
Juanjo 已提交
4246 4247
    if (get_bits1(&s->gb) != 1) {
        fprintf(stderr, "Bad marker\n");
F
Fabrice Bellard 已提交
4248
        return -1;	/* marker */
J
Juanjo 已提交
4249 4250 4251
    }
    if (get_bits1(&s->gb) != 0) {
        fprintf(stderr, "Bad H263 id\n");
F
Fabrice Bellard 已提交
4252
        return -1;	/* h263 id */
J
Juanjo 已提交
4253
    }
4254 4255 4256
    skip_bits1(&s->gb);	/* split screen off */
    skip_bits1(&s->gb);	/* camera  off */
    skip_bits1(&s->gb);	/* freeze picture release off */
F
Fabrice Bellard 已提交
4257 4258

    format = get_bits(&s->gb, 3);
J
Juanjo 已提交
4259 4260
    if (format != 7) {
        fprintf(stderr, "Intel H263 free format not supported\n");
F
Fabrice Bellard 已提交
4261
        return -1;
J
Juanjo 已提交
4262
    }
F
Fabrice Bellard 已提交
4263 4264
    s->h263_plus = 0;

4265
    s->pict_type = I_TYPE + get_bits1(&s->gb);
F
Fabrice Bellard 已提交
4266
    
4267
    s->unrestricted_mv = get_bits1(&s->gb); 
F
Fabrice Bellard 已提交
4268 4269
    s->h263_long_vectors = s->unrestricted_mv;

J
Juanjo 已提交
4270 4271
    if (get_bits1(&s->gb) != 0) {
        fprintf(stderr, "SAC not supported\n");
F
Fabrice Bellard 已提交
4272
        return -1;	/* SAC: off */
J
Juanjo 已提交
4273 4274 4275
    }
    if (get_bits1(&s->gb) != 0) {
        fprintf(stderr, "Advanced Prediction Mode not supported\n");
F
Fabrice Bellard 已提交
4276
        return -1;	/* advanced prediction mode: off */
J
Juanjo 已提交
4277 4278 4279 4280 4281
    }
    if (get_bits1(&s->gb) != 0) {
        fprintf(stderr, "PB frame mode no supported\n");
        return -1;	/* PB frame mode */
    }
F
Fabrice Bellard 已提交
4282 4283

    /* skip unknown header garbage */
4284
    skip_bits(&s->gb, 41);
F
Fabrice Bellard 已提交
4285 4286

    s->qscale = get_bits(&s->gb, 5);
4287
    skip_bits1(&s->gb);	/* Continuous Presence Multipoint mode: off */
F
Fabrice Bellard 已提交
4288 4289

    /* PEI */
4290 4291
    while (get_bits1(&s->gb) != 0) {
        skip_bits(&s->gb, 8);
F
Fabrice Bellard 已提交
4292 4293 4294 4295
    }
    s->f_code = 1;
    return 0;
}
4296