h263dec.c 25.4 KB
Newer Older
Fabrice Bellard's avatar
Fabrice Bellard committed
1
/*
Michael Niedermayer's avatar
Michael Niedermayer committed
2
 * H.263 decoder
Fabrice Bellard's avatar
Fabrice Bellard committed
3
 * Copyright (c) 2001 Fabrice Bellard.
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
Fabrice Bellard's avatar
Fabrice Bellard committed
5
 *
Fabrice Bellard's avatar
Fabrice Bellard committed
6 7 8 9
 * 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.
Fabrice Bellard's avatar
Fabrice Bellard committed
10
 *
Fabrice Bellard's avatar
Fabrice Bellard committed
11
 * This library is distributed in the hope that it will be useful,
Fabrice Bellard's avatar
Fabrice Bellard committed
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Fabrice Bellard's avatar
Fabrice Bellard committed
13 14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
Fabrice Bellard's avatar
Fabrice Bellard committed
15
 *
Fabrice Bellard's avatar
Fabrice Bellard committed
16 17 18
 * 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
Fabrice Bellard's avatar
Fabrice Bellard committed
19
 */
Michael Niedermayer's avatar
Michael Niedermayer committed
20 21 22 23 24 25
 
/**
 * @file h263dec.c
 * H.263 decoder.
 */
 
Fabrice Bellard's avatar
Fabrice Bellard committed
26
#include "avcodec.h"
27
#include "dsputil.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
28 29 30
#include "mpegvideo.h"

//#define DEBUG
31
//#define PRINT_FRAME_TIME
Fabrice Bellard's avatar
Fabrice Bellard committed
32

Michael Niedermayer's avatar
Michael Niedermayer committed
33
int ff_h263_decode_init(AVCodecContext *avctx)
Fabrice Bellard's avatar
Fabrice Bellard committed
34 35
{
    MpegEncContext *s = avctx->priv_data;
36

Fabrice Bellard's avatar
Fabrice Bellard committed
37
    s->avctx = avctx;
Fabrice Bellard's avatar
Fabrice Bellard committed
38 39 40 41
    s->out_format = FMT_H263;

    s->width = avctx->width;
    s->height = avctx->height;
42
    s->workaround_bugs= avctx->workaround_bugs;
Fabrice Bellard's avatar
Fabrice Bellard committed
43

44 45 46 47
    // set defaults
    s->quant_precision=5;
    s->progressive_sequence=1;
    s->decode_mb= ff_h263_decode_mb;
Michael Niedermayer's avatar
Michael Niedermayer committed
48
    s->low_delay= 1;
49
    avctx->pix_fmt= PIX_FMT_YUV420P;
50
    s->unrestricted_mv= 1;
51

Fabrice Bellard's avatar
Fabrice Bellard committed
52 53 54
    /* select sub codec */
    switch(avctx->codec->id) {
    case CODEC_ID_H263:
Michael Niedermayer's avatar
Michael Niedermayer committed
55
        s->unrestricted_mv= 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
56
        break;
Fabrice Bellard's avatar
Fabrice Bellard committed
57
    case CODEC_ID_MPEG4:
58
        s->decode_mb= ff_mpeg4_decode_mb;
Fabrice Bellard's avatar
Fabrice Bellard committed
59 60
        s->time_increment_bits = 4; /* default value for broken headers */
        s->h263_pred = 1;
Michael Niedermayer's avatar
Michael Niedermayer committed
61
        s->low_delay = 0; //default, might be overriden in the vol header during header parsing
Fabrice Bellard's avatar
Fabrice Bellard committed
62
        break;
63
    case CODEC_ID_MSMPEG4V1:
Fabrice Bellard's avatar
Fabrice Bellard committed
64 65
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
66 67 68 69 70 71 72 73 74 75 76
        s->msmpeg4_version=1;
        break;
    case CODEC_ID_MSMPEG4V2:
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->msmpeg4_version=2;
        break;
    case CODEC_ID_MSMPEG4V3:
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->msmpeg4_version=3;
Fabrice Bellard's avatar
Fabrice Bellard committed
77
        break;
78 79 80 81 82
    case CODEC_ID_WMV1:
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->msmpeg4_version=4;
        break;
83 84 85 86 87
    case CODEC_ID_WMV2:
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->msmpeg4_version=5;
        break;
Fabrice Bellard's avatar
Fabrice Bellard committed
88 89
    case CODEC_ID_H263I:
        break;
90 91 92
    case CODEC_ID_FLV1:
        s->h263_flv = 1;
        break;
Fabrice Bellard's avatar
Fabrice Bellard committed
93 94 95
    default:
        return -1;
    }
96
    s->codec_id= avctx->codec->id;
97

Fabrice Bellard's avatar
Fabrice Bellard committed
98
    /* for h263, we allocate the images after having read the header */
99
    if (avctx->codec->id != CODEC_ID_H263 && avctx->codec->id != CODEC_ID_MPEG4)
100 101
        if (MPV_common_init(s) < 0)
            return -1;
Fabrice Bellard's avatar
Fabrice Bellard committed
102 103

    if (s->h263_msmpeg4)
104
        ff_msmpeg4_decode_init(s);
Fabrice Bellard's avatar
Fabrice Bellard committed
105 106 107 108 109 110
    else
        h263_decode_init_vlc(s);
    
    return 0;
}

Michael Niedermayer's avatar
Michael Niedermayer committed
111
int ff_h263_decode_end(AVCodecContext *avctx)
Fabrice Bellard's avatar
Fabrice Bellard committed
112 113 114 115 116 117 118
{
    MpegEncContext *s = avctx->priv_data;

    MPV_common_end(s);
    return 0;
}

Michael Niedermayer's avatar
Michael Niedermayer committed
119 120 121 122 123
/**
 * retunrs the number of bytes consumed for building the current frame
 */
static int get_consumed_bytes(MpegEncContext *s, int buf_size){
    int pos= (get_bits_count(&s->gb)+7)>>3;
124
    
125
    if(s->divx_packed){
Michael Niedermayer's avatar
Michael Niedermayer committed
126 127
        //we would have to scan through the whole buf to handle the weird reordering ...
        return buf_size; 
128 129 130 131
    }else if(s->flags&CODEC_FLAG_TRUNCATED){
        pos -= s->parse_context.last_index;
        if(pos<0) pos=0; // padding is not really read so this might be -1
        return pos;
Michael Niedermayer's avatar
Michael Niedermayer committed
132 133
    }else{
        if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...)
134
        if(pos+10>buf_size) pos=buf_size; // oops ;)
Michael Niedermayer's avatar
Michael Niedermayer committed
135 136 137 138 139

        return pos;
    }
}

140
static int decode_slice(MpegEncContext *s){
141
    const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
142 143 144 145 146 147
    s->last_resync_gb= s->gb;
    s->first_slice_line= 1;
        
    s->resync_mb_x= s->mb_x;
    s->resync_mb_y= s->mb_y;

Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
148
    ff_set_qscale(s, s->qscale);
149 150 151 152 153 154 155 156 157
    
    if(s->partitioned_frame){
        const int qscale= s->qscale;

        if(s->codec_id==CODEC_ID_MPEG4){
            if(ff_mpeg4_decode_partitions(s) < 0)
                return -1; 
        }
        
Fabrice Bellard's avatar
Fabrice Bellard committed
158
        /* restore variables which were modified */
159 160 161
        s->first_slice_line=1;
        s->mb_x= s->resync_mb_x;
        s->mb_y= s->resync_mb_y;
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
162
        ff_set_qscale(s, qscale);
163 164 165 166 167 168
    }

    for(; s->mb_y < s->mb_height; s->mb_y++) {
        /* per-row end of slice checks */
        if(s->msmpeg4_version){
            if(s->resync_mb_y + s->slice_height == s->mb_y){
169 170
                ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
                return 0;
            }
        }
        
        if(s->msmpeg4_version==1){
            s->last_dc[0]=
            s->last_dc[1]=
            s->last_dc[2]= 128;
        }
    
        ff_init_block_index(s);
        for(; s->mb_x < s->mb_width; s->mb_x++) {
            int ret;

            ff_update_block_index(s);

            if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
                s->first_slice_line=0; 
            }

            /* DCT & quantize */
192
	    s->dsp.clear_blocks(s->block[0]);
193 194 195
            
            s->mv_dir = MV_DIR_FORWARD;
            s->mv_type = MV_TYPE_16X16;
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
196
//            s->mb_skiped = 0;
197 198 199
//printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
            ret= s->decode_mb(s, s->block);

200 201 202
            if (s->pict_type!=B_TYPE)
                ff_h263_update_motion_val(s);

203
            if(ret<0){
204
                const int xy= s->mb_x + s->mb_y*s->mb_stride;
205
                if(ret==SLICE_END){
206
                    MPV_decode_mb(s, s->block);
Michael Niedermayer's avatar
Michael Niedermayer committed
207 208
                    if(s->loop_filter)
                        ff_h263_loop_filter(s);
209

210
//printf("%d %d %d %06X\n", s->mb_x, s->mb_y, s->gb.size*8 - get_bits_count(&s->gb), show_bits(&s->gb, 24));
211
                    ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
212 213 214

                    s->padding_bug_score--;
                        
215 216
                    if(++s->mb_x >= s->mb_width){
                        s->mb_x=0;
217
                        ff_draw_horiz_band(s, s->mb_y*16, 16);
218 219 220 221
                        s->mb_y++;
                    }
                    return 0; 
                }else if(ret==SLICE_NOEND){
222
                    av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy);
223
                    ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
224 225
                    return -1;
                }
226
                av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy);
227
                ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
228 229 230
    
                return -1;
            }
231 232

            MPV_decode_mb(s, s->block);
Michael Niedermayer's avatar
Michael Niedermayer committed
233 234
            if(s->loop_filter)
                ff_h263_loop_filter(s);
235 236
        }
        
237
        ff_draw_horiz_band(s, s->mb_y*16, 16);
238 239 240 241 242 243
        
        s->mb_x= 0;
    }
    
    assert(s->mb_x==0 && s->mb_y==s->mb_height);

244 245 246
    /* try to detect the padding bug */
    if(      s->codec_id==CODEC_ID_MPEG4
       &&   (s->workaround_bugs&FF_BUG_AUTODETECT) 
247 248
       &&    s->gb.size_in_bits - get_bits_count(&s->gb) >=0
       &&    s->gb.size_in_bits - get_bits_count(&s->gb) < 48
249
//       &&   !s->resync_marker
250 251 252
       &&   !s->data_partitioning){
        
        const int bits_count= get_bits_count(&s->gb);
253
        const int bits_left = s->gb.size_in_bits - bits_count;
254
        
255 256 257
        if(bits_left==0){
            s->padding_bug_score+=16;
        }else if(bits_left>8){
258
            s->padding_bug_score++;
259
        } else if(bits_left != 1){
260 261
            int v= show_bits(&s->gb, 8);
            v|= 0x7F >> (7-(bits_count&7));
262

263 264 265 266
            if(v==0x7F)
                s->padding_bug_score--;
            else
                s->padding_bug_score++;            
267
        }                          
268 269
    }

270
    // handle formats which dont have unique end markers
271
    if(s->msmpeg4_version || (s->workaround_bugs&FF_BUG_NO_PADDING)){ //FIXME perhaps solve this more cleanly
272
        int left= s->gb.size_in_bits - get_bits_count(&s->gb);
273 274 275 276 277 278 279
        int max_extra=7;
        
        /* no markers in M$ crap */
        if(s->msmpeg4_version && s->pict_type==I_TYPE)
            max_extra+= 17;
        
        /* buggy padding but the frame should still end approximately at the bitstream end */
280
        if((s->workaround_bugs&FF_BUG_NO_PADDING) && s->error_resilience>=3)
281
            max_extra+= 48;
282
        else if((s->workaround_bugs&FF_BUG_NO_PADDING))
283 284 285
            max_extra+= 256*256*256*64;
        
        if(left>max_extra){
286
            av_log(s->avctx, AV_LOG_ERROR, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24));
287 288
        }
        else if(left<0){
289
            av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left);
290
        }else
291
            ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);
292 293 294
        
        return 0;
    }
295

296
    av_log(s->avctx, AV_LOG_ERROR, "slice end not reached but screenspace end (%d left %06X, score= %d)\n", 
297
            s->gb.size_in_bits - get_bits_count(&s->gb),
298
            show_bits(&s->gb, 24), s->padding_bug_score);
299 300 301
            
    ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);

302 303 304
    return -1;
}

305 306 307 308
/**
 * finds the end of the current frame in the bitstream.
 * @return the position of the first byte of the next frame, or -1
 */
309
static int mpeg4_find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
    ParseContext *pc= &s->parse_context;
    int vop_found, i;
    uint32_t state;
    
    vop_found= pc->frame_start_found;
    state= pc->state;
    
    i=0;
    if(!vop_found){
        for(i=0; i<buf_size; i++){
            state= (state<<8) | buf[i];
            if(state == 0x1B6){
                i++;
                vop_found=1;
                break;
            }
        }
    }
328 329 330

    if(vop_found){    
      for(; i<buf_size; i++){
331 332 333 334 335 336
        state= (state<<8) | buf[i];
        if((state&0xFFFFFF00) == 0x100){
            pc->frame_start_found=0;
            pc->state=-1; 
            return i-3;
        }
337
      }
338 339 340
    }
    pc->frame_start_found= vop_found;
    pc->state= state;
Michael Niedermayer's avatar
tired  
Michael Niedermayer committed
341
    return END_NOT_FOUND;
342 343
}

344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
static int h263_find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){
    ParseContext *pc= &s->parse_context;
    int vop_found, i;
    uint32_t state;
    
    vop_found= pc->frame_start_found;
    state= pc->state;
    
    i=0;
    if(!vop_found){
        for(i=0; i<buf_size; i++){
            state= (state<<8) | buf[i];
            if(state>>(32-22) == 0x20){
                i++;
                vop_found=1;
                break;
            }
        }
    }

    if(vop_found){    
      for(; i<buf_size; i++){
        state= (state<<8) | buf[i];
        if(state>>(32-22) == 0x20){
            pc->frame_start_found=0;
            pc->state=-1; 
            return i-3;
        }
      }
    }
    pc->frame_start_found= vop_found;
    pc->state= state;
    
    return END_NOT_FOUND;
}

Michael Niedermayer's avatar
Michael Niedermayer committed
380
int ff_h263_decode_frame(AVCodecContext *avctx, 
Fabrice Bellard's avatar
Fabrice Bellard committed
381
                             void *data, int *data_size,
382
                             uint8_t *buf, int buf_size)
Fabrice Bellard's avatar
Fabrice Bellard committed
383 384
{
    MpegEncContext *s = avctx->priv_data;
Fabrice Bellard's avatar
Fabrice Bellard committed
385
    int ret;
Michael Niedermayer's avatar
Michael Niedermayer committed
386
    AVFrame *pict = data; 
Michael Niedermayer's avatar
Michael Niedermayer committed
387
    
388 389 390
#ifdef PRINT_FRAME_TIME
uint64_t time= rdtsc();
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
391 392 393 394
#ifdef DEBUG
    printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
    printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]);
#endif
Michael Niedermayer's avatar
Michael Niedermayer committed
395
    s->flags= avctx->flags;
396

Michael Niedermayer's avatar
Michael Niedermayer committed
397
    *data_size = 0;
Michael Niedermayer's avatar
Michael Niedermayer committed
398 399

    /* no supplementary picture */
Fabrice Bellard's avatar
Fabrice Bellard committed
400
    if (buf_size == 0) {
Michael Niedermayer's avatar
Michael Niedermayer committed
401 402 403 404 405 406 407 408
        /* special case for last picture */
        if (s->low_delay==0 && s->next_picture_ptr) {
            *pict= *(AVFrame*)s->next_picture_ptr;
            s->next_picture_ptr= NULL;

            *data_size = sizeof(AVFrame);
        }

Fabrice Bellard's avatar
Fabrice Bellard committed
409 410
        return 0;
    }
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
411

412 413 414 415 416
    if(s->flags&CODEC_FLAG_TRUNCATED){
        int next;
        
        if(s->codec_id==CODEC_ID_MPEG4){
            next= mpeg4_find_frame_end(s, buf, buf_size);
417 418
        }else if(s->codec_id==CODEC_ID_H263){
            next= h263_find_frame_end(s, buf, buf_size);
419
        }else{
420
            av_log(s->avctx, AV_LOG_ERROR, "this codec doesnt support truncated bitstreams\n");
421 422
            return -1;
        }
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
423 424
        
        if( ff_combine_frame(s, next, &buf, &buf_size) < 0 )
425 426
            return buf_size;
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
427

428
    
429 430
retry:
    
431
    if(s->bitstream_buffer_size && (s->divx_packed || buf_size<20)){ //divx 5.01+/xvid frame reorder
432
        init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size*8);
Michael Niedermayer's avatar
Michael Niedermayer committed
433
    }else
434
        init_get_bits(&s->gb, buf, buf_size*8);
435
    s->bitstream_buffer_size=0;
Fabrice Bellard's avatar
Fabrice Bellard committed
436

437
    if (!s->context_initialized) {
438
        if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
439 440
            return -1;
    }
441 442 443 444 445 446
    
    //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
    if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
        int i= ff_find_unused_picture(s, 0);
        s->current_picture_ptr= &s->picture[i];
    }
Michael Niedermayer's avatar
Michael Niedermayer committed
447
      
Fabrice Bellard's avatar
Fabrice Bellard committed
448
    /* let's go :-) */
Michael Niedermayer's avatar
Michael Niedermayer committed
449 450 451
    if (s->msmpeg4_version==5) {
        ret= ff_wmv2_decode_picture_header(s);
    } else if (s->msmpeg4_version) {
Fabrice Bellard's avatar
Fabrice Bellard committed
452 453
        ret = msmpeg4_decode_picture_header(s);
    } else if (s->h263_pred) {
454 455 456
        if(s->avctx->extradata_size && s->picture_number==0){
            GetBitContext gb;
            
457
            init_get_bits(&gb, s->avctx->extradata, s->avctx->extradata_size*8);
458 459 460 461
            ret = ff_mpeg4_decode_picture_header(s, &gb);
        }
        ret = ff_mpeg4_decode_picture_header(s, &s->gb);

462 463
        if(s->flags& CODEC_FLAG_LOW_DELAY)
            s->low_delay=1;
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
464
    } else if (s->codec_id == CODEC_ID_H263I) {
Fabrice Bellard's avatar
Fabrice Bellard committed
465
        ret = intel_h263_decode_picture_header(s);
466 467
    } else if (s->h263_flv) {
        ret = flv_h263_decode_picture_header(s);
Fabrice Bellard's avatar
Fabrice Bellard committed
468 469
    } else {
        ret = h263_decode_picture_header(s);
470
    }
471 472 473 474 475
    
    if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_size);

    /* skip if the header was thrashed */
    if (ret < 0){
476
        av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
477 478 479
        return -1;
    }
    
Michael Niedermayer's avatar
Michael Niedermayer committed
480
    avctx->has_b_frames= !s->low_delay;
481 482
    
    if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
483 484
        if(s->avctx->stream_codec_tag == ff_get_fourcc("XVID") || 
           s->avctx->codec_tag == ff_get_fourcc("XVID") || s->avctx->codec_tag == ff_get_fourcc("XVIX"))
485
            s->xvid_build= -1;
486
#if 0
487 488 489
        if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==1
           && s->padding_bug_score > 0 && s->low_delay) // XVID with modified fourcc 
            s->xvid_build= -1;
490 491
#endif
    }
492

493
    if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
494 495 496
        if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==0)
            s->divx_version= 400; //divx 4
    }
497 498

    if(s->workaround_bugs&FF_BUG_AUTODETECT){
499 500 501
        s->workaround_bugs &= ~FF_BUG_NO_PADDING;
        
        if(s->padding_bug_score > -2 && !s->data_partitioning && (s->divx_version || !s->resync_marker))
502 503
            s->workaround_bugs |=  FF_BUG_NO_PADDING;

504
        if(s->avctx->codec_tag == ff_get_fourcc("XVIX")) 
505
            s->workaround_bugs|= FF_BUG_XVID_ILACE;
506

507
        if(s->avctx->codec_tag == ff_get_fourcc("UMP4")){
508 509
            s->workaround_bugs|= FF_BUG_UMP4;
        }
Michael Niedermayer's avatar
Michael Niedermayer committed
510

511
        if(s->divx_version>=500){
Michael Niedermayer's avatar
Michael Niedermayer committed
512 513
            s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
        }
Michael Niedermayer's avatar
Michael Niedermayer committed
514

Michael Niedermayer's avatar
Michael Niedermayer committed
515 516 517 518
        if(s->divx_version>502){
            s->workaround_bugs|= FF_BUG_QPEL_CHROMA2;
        }

519 520 521
        if(s->xvid_build && s->xvid_build<=3)
            s->padding_bug_score= 256*256*256*64;
        
Michael Niedermayer's avatar
Michael Niedermayer committed
522 523 524
        if(s->xvid_build && s->xvid_build<=1)
            s->workaround_bugs|= FF_BUG_QPEL_CHROMA;

525 526 527
        if(s->xvid_build && s->xvid_build<=12)
            s->workaround_bugs|= FF_BUG_EDGE;

Michael Niedermayer's avatar
Michael Niedermayer committed
528 529 530 531 532 533 534 535
#define SET_QPEL_FUNC(postfix1, postfix2) \
    s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
    s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
    s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;

        if(s->lavc_build && s->lavc_build<4653)
            s->workaround_bugs|= FF_BUG_STD_QPEL;
        
536 537 538
        if(s->lavc_build && s->lavc_build<4655)
            s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;

Michael Niedermayer's avatar
10l ?  
Michael Niedermayer committed
539
        if(s->lavc_build && s->lavc_build<4670){
540 541 542
            s->workaround_bugs|= FF_BUG_EDGE;
        }

543 544
        if(s->divx_version)
            s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
545
//printf("padding_bug_score: %d\n", s->padding_bug_score);
546 547
        if(s->divx_version==501 && s->divx_build==20020416)
            s->padding_bug_score= 256*256*256*64;
548

549
        if(s->divx_version && s->divx_version<500){
550 551
            s->workaround_bugs|= FF_BUG_EDGE;
        }
552
        
553
#if 0
554
        if(s->divx_version==500)
555
            s->padding_bug_score= 256*256*256*64;
556 557 558 559 560 561 562 563 564 565

        /* very ugly XVID padding bug detection FIXME/XXX solve this differently
         * lets hope this at least works
         */
        if(   s->resync_marker==0 && s->data_partitioning==0 && s->divx_version==0
           && s->codec_id==CODEC_ID_MPEG4 && s->vo_type==0)
            s->workaround_bugs|= FF_BUG_NO_PADDING;
        
        if(s->lavc_build && s->lavc_build<4609) //FIXME not sure about the version num but a 4609 file seems ok
            s->workaround_bugs|= FF_BUG_NO_PADDING;
566
#endif
567 568
    }
    
Michael Niedermayer's avatar
Michael Niedermayer committed
569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
    if(s->workaround_bugs& FF_BUG_STD_QPEL){
        SET_QPEL_FUNC(qpel_pixels_tab[0][ 5], qpel16_mc11_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[0][ 7], qpel16_mc31_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[0][ 9], qpel16_mc12_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c)

        SET_QPEL_FUNC(qpel_pixels_tab[1][ 5], qpel8_mc11_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[1][ 7], qpel8_mc31_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[1][ 9], qpel8_mc12_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c)
        SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
    }
584

585
    if(avctx->debug & FF_DEBUG_BUGS)
586
        av_log(s->avctx, AV_LOG_DEBUG, "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n", 
587 588 589
               s->workaround_bugs, s->lavc_build, s->xvid_build, s->divx_version, s->divx_build,
               s->divx_packed ? "p" : "");
    
590 591 592 593
#if 0 // dump bits per frame / qp / complexity
{
    static FILE *f=NULL;
    if(!f) f=fopen("rate_qp_cplx.txt", "w");
594
    fprintf(f, "%d %d %f\n", buf_size, s->qscale, buf_size*(double)s->qscale);
595 596
}
#endif
597
       
598
        /* After H263 & mpeg4 header decode we have the height, width,*/
599 600 601
        /* and other parameters. So then we could init the picture   */
        /* FIXME: By the way H263 decoder is evolving it should have */
        /* an H263EncContext                                         */
Michael Niedermayer's avatar
Michael Niedermayer committed
602
    
Michael Niedermayer's avatar
Michael Niedermayer committed
603
    if (   s->width != avctx->width || s->height != avctx->height) {
604
        /* H.263 could change picture size any time */
605 606
        ParseContext pc= s->parse_context; //FIXME move these demuxng hack to avformat
        s->parse_context.buffer=0;
607
        MPV_common_end(s);
608
        s->parse_context= pc;
609
    }
610
    if (!s->context_initialized) {
Michael Niedermayer's avatar
10l  
Michael Niedermayer committed
611 612
        avctx->width = s->width;
        avctx->height = s->height;
613

614
        goto retry;
Fabrice Bellard's avatar
Fabrice Bellard committed
615
    }
616 617 618

    if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
        s->gob_index = ff_h263_get_gob_height(s);
619
    
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
620 621 622
    // for hurry_up==5
    s->current_picture.pict_type= s->pict_type;
    s->current_picture.key_frame= s->pict_type == I_TYPE;
623

Michael Niedermayer's avatar
Michael Niedermayer committed
624
    /* skip b frames if we dont have reference frames */
625
    if(s->last_picture_ptr==NULL && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
626
    /* skip b frames if we are in a hurry */
627
    if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
628
    /* skip everything if we are in a hurry>=5 */
629
    if(avctx->hurry_up>=5) return get_consumed_bytes(s, buf_size);
630 631 632
    
    if(s->next_p_frame_damaged){
        if(s->pict_type==B_TYPE)
Michael Niedermayer's avatar
Michael Niedermayer committed
633
            return get_consumed_bytes(s, buf_size);
634 635 636 637
        else
            s->next_p_frame_damaged=0;
    }

638 639
    if(MPV_frame_start(s, avctx) < 0)
        return -1;
Fabrice Bellard's avatar
Fabrice Bellard committed
640 641 642 643 644

#ifdef DEBUG
    printf("qscale=%d\n", s->qscale);
#endif

645
    ff_er_frame_start(s);
646
    
Michael Niedermayer's avatar
Michael Niedermayer committed
647 648 649 650 651 652 653
    //the second part of the wmv2 header contains the MB skip bits which are stored in current_picture->mb_type
    //which isnt available before MPV_frame_start()
    if (s->msmpeg4_version==5){
        if(ff_wmv2_decode_secondary_picture_header(s) < 0)
            return -1;
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
654
    /* decode each macroblock */
655 656 657 658
    s->mb_x=0; 
    s->mb_y=0;
    
    decode_slice(s);
Michael Niedermayer's avatar
Michael Niedermayer committed
659
    while(s->mb_y<s->mb_height){
660
        if(s->msmpeg4_version){
Michael Niedermayer's avatar
Michael Niedermayer committed
661
            if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits)
662 663 664 665
                break;
        }else{
            if(ff_h263_resync(s)<0)
                break;
666 667
        }
        
Michael Niedermayer's avatar
Michael Niedermayer committed
668
        if(s->msmpeg4_version<4 && s->h263_pred)
669
            ff_mpeg4_clean_buffers(s);
670

671
        decode_slice(s);
Fabrice Bellard's avatar
Fabrice Bellard committed
672
    }
673

674
    if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
675 676 677
        if(msmpeg4_decode_ext_header(s, buf_size) < 0){
            s->error_status_table[s->mb_num-1]= AC_ERROR|DC_ERROR|MV_ERROR;
        }
Michael Niedermayer's avatar
Michael Niedermayer committed
678 679
    
    /* divx 5.01+ bistream reorder stuff */
680
    if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_packed){
681
        int current_pos= get_bits_count(&s->gb)>>3;
682
        int startcode_found=0;
683

Michael Niedermayer's avatar
Michael Niedermayer committed
684 685
        if(   buf_size - current_pos > 5 
           && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){
686
            int i;
Michael Niedermayer's avatar
Michael Niedermayer committed
687
            for(i=current_pos; i<buf_size-3; i++){
688 689 690 691 692
                if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
                    startcode_found=1;
                    break;
                }
            }
693 694 695 696 697 698 699 700 701
        }
        if(s->gb.buffer == s->bitstream_buffer && buf_size>20){ //xvid style
            startcode_found=1;
            current_pos=0;
        }

        if(startcode_found){
            memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
            s->bitstream_buffer_size= buf_size - current_pos;
702 703 704
        }
    }

705
    ff_er_frame_end(s);
706

Fabrice Bellard's avatar
Fabrice Bellard committed
707
    MPV_frame_end(s);
Michael Niedermayer's avatar
Michael Niedermayer committed
708

709 710
assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
assert(s->current_picture.pict_type == s->pict_type);
Michael Niedermayer's avatar
Michael Niedermayer committed
711
    if(s->pict_type==B_TYPE || s->low_delay){
Michael Niedermayer's avatar
Michael Niedermayer committed
712
        *pict= *(AVFrame*)&s->current_picture;
713
        ff_print_debug_info(s, pict);
Michael Niedermayer's avatar
Michael Niedermayer committed
714
    } else {
Michael Niedermayer's avatar
Michael Niedermayer committed
715
        *pict= *(AVFrame*)&s->last_picture;
716
        ff_print_debug_info(s, pict);
Michael Niedermayer's avatar
Michael Niedermayer committed
717
    }
718

719 720 721 722
    /* Return the Picture timestamp as the frame number */
    /* we substract 1 because it is added on utils.c    */
    avctx->frame_number = s->picture_number - 1;

Michael Niedermayer's avatar
Michael Niedermayer committed
723
    /* dont output the last pic after seeking */
724
    if(s->last_picture_ptr || s->low_delay)
Michael Niedermayer's avatar
Michael Niedermayer committed
725
        *data_size = sizeof(AVFrame);
726 727 728
#ifdef PRINT_FRAME_TIME
printf("%Ld\n", rdtsc()-time);
#endif
729

Michael Niedermayer's avatar
Michael Niedermayer committed
730
    return get_consumed_bytes(s, buf_size);
Fabrice Bellard's avatar
Fabrice Bellard committed
731 732
}

733 734 735 736 737 738
static const AVOption mpeg4_decoptions[] =
{
    AVOPTION_SUB(avoptions_workaround_bug),
    AVOPTION_END()
};

Fabrice Bellard's avatar
Fabrice Bellard committed
739 740
AVCodec mpeg4_decoder = {
    "mpeg4",
Fabrice Bellard's avatar
Fabrice Bellard committed
741
    CODEC_TYPE_VIDEO,
Fabrice Bellard's avatar
Fabrice Bellard committed
742
    CODEC_ID_MPEG4,
Fabrice Bellard's avatar
Fabrice Bellard committed
743
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
744
    ff_h263_decode_init,
Fabrice Bellard's avatar
Fabrice Bellard committed
745
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
746 747
    ff_h263_decode_end,
    ff_h263_decode_frame,
748
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
749
    .options = mpeg4_decoptions,
Michael Niedermayer's avatar
Michael Niedermayer committed
750
    .flush= ff_mpeg_flush,
Fabrice Bellard's avatar
Fabrice Bellard committed
751 752 753 754 755 756 757
};

AVCodec h263_decoder = {
    "h263",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H263,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
758
    ff_h263_decode_init,
Fabrice Bellard's avatar
Fabrice Bellard committed
759
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
760 761
    ff_h263_decode_end,
    ff_h263_decode_frame,
762
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
Michael Niedermayer's avatar
Michael Niedermayer committed
763
    .flush= ff_mpeg_flush,
Fabrice Bellard's avatar
Fabrice Bellard committed
764 765
};

766 767 768 769 770
AVCodec msmpeg4v1_decoder = {
    "msmpeg4v1",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MSMPEG4V1,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
771
    ff_h263_decode_init,
772
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
773 774
    ff_h263_decode_end,
    ff_h263_decode_frame,
775
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
776
    mpeg4_decoptions,
777 778 779 780 781 782 783
};

AVCodec msmpeg4v2_decoder = {
    "msmpeg4v2",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MSMPEG4V2,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
784
    ff_h263_decode_init,
785
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
786 787
    ff_h263_decode_end,
    ff_h263_decode_frame,
788
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
789
    mpeg4_decoptions,
790 791 792
};

AVCodec msmpeg4v3_decoder = {
Fabrice Bellard's avatar
Fabrice Bellard committed
793 794
    "msmpeg4",
    CODEC_TYPE_VIDEO,
795
    CODEC_ID_MSMPEG4V3,
Fabrice Bellard's avatar
Fabrice Bellard committed
796
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
797
    ff_h263_decode_init,
Fabrice Bellard's avatar
Fabrice Bellard committed
798
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
799 800
    ff_h263_decode_end,
    ff_h263_decode_frame,
801
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
802
    .options = mpeg4_decoptions,
Fabrice Bellard's avatar
Fabrice Bellard committed
803 804
};

805 806 807 808 809
AVCodec wmv1_decoder = {
    "wmv1",
    CODEC_TYPE_VIDEO,
    CODEC_ID_WMV1,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
810
    ff_h263_decode_init,
811
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
812 813
    ff_h263_decode_end,
    ff_h263_decode_frame,
814
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
815
    mpeg4_decoptions,
816 817
};

Fabrice Bellard's avatar
Fabrice Bellard committed
818 819 820 821 822
AVCodec h263i_decoder = {
    "h263i",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H263I,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
823
    ff_h263_decode_init,
Fabrice Bellard's avatar
Fabrice Bellard committed
824
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
825 826
    ff_h263_decode_end,
    ff_h263_decode_frame,
827
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
828