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

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

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

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

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

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

Fabrice Bellard's avatar
Fabrice Bellard committed
51 52 53
    /* select sub codec */
    switch(avctx->codec->id) {
    case CODEC_ID_H263:
Michael Niedermayer's avatar
Michael Niedermayer committed
54
        s->unrestricted_mv= 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
55
        break;
Fabrice Bellard's avatar
Fabrice Bellard committed
56
    case CODEC_ID_MPEG4:
57
        s->decode_mb= ff_mpeg4_decode_mb;
Fabrice Bellard's avatar
Fabrice Bellard committed
58 59
        s->time_increment_bits = 4; /* default value for broken headers */
        s->h263_pred = 1;
Michael Niedermayer's avatar
Michael Niedermayer committed
60
        s->low_delay = 0; //default, might be overriden in the vol header during header parsing
Fabrice Bellard's avatar
Fabrice Bellard committed
61
        break;
62
    case CODEC_ID_MSMPEG4V1:
Fabrice Bellard's avatar
Fabrice Bellard committed
63 64
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
65 66 67 68 69 70 71 72 73 74 75
        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
76
        break;
77 78 79 80 81
    case CODEC_ID_WMV1:
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->msmpeg4_version=4;
        break;
82 83 84 85 86
    case CODEC_ID_WMV2:
        s->h263_msmpeg4 = 1;
        s->h263_pred = 1;
        s->msmpeg4_version=5;
        break;
Fabrice Bellard's avatar
Fabrice Bellard committed
87 88 89
    case CODEC_ID_H263I:
        s->h263_intel = 1;
        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
retry:
    
430
    if(s->bitstream_buffer_size && buf_size<20){ //divx 5.01+ frame reorder
431
        init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size*8);
Michael Niedermayer's avatar
Michael Niedermayer committed
432
    }else
433
        init_get_bits(&s->gb, buf, buf_size*8);
434
    s->bitstream_buffer_size=0;
Fabrice Bellard's avatar
Fabrice Bellard committed
435

436
    if (!s->context_initialized) {
437
        if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
438 439
            return -1;
    }
440 441 442 443 444 445
    
    //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
446
      
Fabrice Bellard's avatar
Fabrice Bellard committed
447
    /* let's go :-) */
Michael Niedermayer's avatar
Michael Niedermayer committed
448 449 450
    if (s->msmpeg4_version==5) {
        ret= ff_wmv2_decode_picture_header(s);
    } else if (s->msmpeg4_version) {
Fabrice Bellard's avatar
Fabrice Bellard committed
451 452
        ret = msmpeg4_decode_picture_header(s);
    } else if (s->h263_pred) {
453 454 455
        if(s->avctx->extradata_size && s->picture_number==0){
            GetBitContext gb;
            
456
            init_get_bits(&gb, s->avctx->extradata, s->avctx->extradata_size*8);
457 458 459 460
            ret = ff_mpeg4_decode_picture_header(s, &gb);
        }
        ret = ff_mpeg4_decode_picture_header(s, &s->gb);

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

    /* skip if the header was thrashed */
    if (ret < 0){
475
        av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
476 477 478
        return -1;
    }
    
Michael Niedermayer's avatar
Michael Niedermayer committed
479
    avctx->has_b_frames= !s->low_delay;
480 481
    
    if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
482 483
        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"))
484
            s->xvid_build= -1;
485
#if 0
486 487 488
        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;
489 490
#endif
    }
491

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

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

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

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

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

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

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

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

Michael Niedermayer's avatar
Michael Niedermayer committed
527 528 529 530 531 532 533 534
#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;
        
535 536 537
        if(s->lavc_build && s->lavc_build<4655)
            s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;

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

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

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

        /* 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;
565
#endif
566 567
    }
    
Michael Niedermayer's avatar
Michael Niedermayer committed
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
    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)
    }
583

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

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

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

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

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

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

644
    ff_er_frame_start(s);
645
    
Michael Niedermayer's avatar
Michael Niedermayer committed
646 647 648 649 650 651 652
    //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
653
    /* decode each macroblock */
654 655 656 657
    s->mb_x=0; 
    s->mb_y=0;
    
    decode_slice(s);
Michael Niedermayer's avatar
Michael Niedermayer committed
658
    while(s->mb_y<s->mb_height){
659
        if(s->msmpeg4_version){
Michael Niedermayer's avatar
Michael Niedermayer committed
660
            if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits)
661 662 663 664
                break;
        }else{
            if(ff_h263_resync(s)<0)
                break;
665 666
        }
        
Michael Niedermayer's avatar
Michael Niedermayer committed
667
        if(s->msmpeg4_version<4 && s->h263_pred)
668
            ff_mpeg4_clean_buffers(s);
669

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

673
    if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
Michael Niedermayer's avatar
cleanup  
Michael Niedermayer committed
674 675 676
        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
677 678
    
    /* divx 5.01+ bistream reorder stuff */
679
    if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_packed){
680 681
        int current_pos= get_bits_count(&s->gb)>>3;

Michael Niedermayer's avatar
Michael Niedermayer committed
682 683
        if(   buf_size - current_pos > 5 
           && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){
684 685
            int i;
            int startcode_found=0;
Michael Niedermayer's avatar
Michael Niedermayer committed
686
            for(i=current_pos; i<buf_size-3; i++){
687 688 689 690 691 692 693 694 695 696 697 698
                if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
                    startcode_found=1;
                    break;
                }
            }
            if(startcode_found){
                memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
                s->bitstream_buffer_size= buf_size - current_pos;
            }
        }
    }

699
    ff_er_frame_end(s);
700

Fabrice Bellard's avatar
Fabrice Bellard committed
701
    MPV_frame_end(s);
Michael Niedermayer's avatar
Michael Niedermayer committed
702

703 704
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
705
    if(s->pict_type==B_TYPE || s->low_delay){
Michael Niedermayer's avatar
Michael Niedermayer committed
706
        *pict= *(AVFrame*)&s->current_picture;
707
        ff_print_debug_info(s, s->current_picture_ptr);
Michael Niedermayer's avatar
Michael Niedermayer committed
708
    } else {
Michael Niedermayer's avatar
Michael Niedermayer committed
709
        *pict= *(AVFrame*)&s->last_picture;
710
        ff_print_debug_info(s, s->last_picture_ptr);
Michael Niedermayer's avatar
Michael Niedermayer committed
711
    }
712

713 714 715 716
    /* 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
717
    /* dont output the last pic after seeking */
718
    if(s->last_picture_ptr || s->low_delay)
Michael Niedermayer's avatar
Michael Niedermayer committed
719
        *data_size = sizeof(AVFrame);
720 721 722
#ifdef PRINT_FRAME_TIME
printf("%Ld\n", rdtsc()-time);
#endif
723

Michael Niedermayer's avatar
Michael Niedermayer committed
724
    return get_consumed_bytes(s, buf_size);
Fabrice Bellard's avatar
Fabrice Bellard committed
725 726
}

727 728 729 730 731 732
static const AVOption mpeg4_decoptions[] =
{
    AVOPTION_SUB(avoptions_workaround_bug),
    AVOPTION_END()
};

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

AVCodec h263_decoder = {
    "h263",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H263,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
752
    ff_h263_decode_init,
Fabrice Bellard's avatar
Fabrice Bellard committed
753
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
754 755
    ff_h263_decode_end,
    ff_h263_decode_frame,
756
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
Michael Niedermayer's avatar
Michael Niedermayer committed
757
    .flush= ff_mpeg_flush,
Fabrice Bellard's avatar
Fabrice Bellard committed
758 759
};

760 761 762 763 764
AVCodec msmpeg4v1_decoder = {
    "msmpeg4v1",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MSMPEG4V1,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
765
    ff_h263_decode_init,
766
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
767 768
    ff_h263_decode_end,
    ff_h263_decode_frame,
769
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
770
    mpeg4_decoptions,
771 772 773 774 775 776 777
};

AVCodec msmpeg4v2_decoder = {
    "msmpeg4v2",
    CODEC_TYPE_VIDEO,
    CODEC_ID_MSMPEG4V2,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
778
    ff_h263_decode_init,
779
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
780 781
    ff_h263_decode_end,
    ff_h263_decode_frame,
782
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
783
    mpeg4_decoptions,
784 785 786
};

AVCodec msmpeg4v3_decoder = {
Fabrice Bellard's avatar
Fabrice Bellard committed
787 788
    "msmpeg4",
    CODEC_TYPE_VIDEO,
789
    CODEC_ID_MSMPEG4V3,
Fabrice Bellard's avatar
Fabrice Bellard committed
790
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
791
    ff_h263_decode_init,
Fabrice Bellard's avatar
Fabrice Bellard committed
792
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
793 794
    ff_h263_decode_end,
    ff_h263_decode_frame,
795
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
796
    .options = mpeg4_decoptions,
Fabrice Bellard's avatar
Fabrice Bellard committed
797 798
};

799 800 801 802 803
AVCodec wmv1_decoder = {
    "wmv1",
    CODEC_TYPE_VIDEO,
    CODEC_ID_WMV1,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
804
    ff_h263_decode_init,
805
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
806 807
    ff_h263_decode_end,
    ff_h263_decode_frame,
808
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
809
    mpeg4_decoptions,
810 811
};

Fabrice Bellard's avatar
Fabrice Bellard committed
812 813 814 815 816
AVCodec h263i_decoder = {
    "h263i",
    CODEC_TYPE_VIDEO,
    CODEC_ID_H263I,
    sizeof(MpegEncContext),
Michael Niedermayer's avatar
Michael Niedermayer committed
817
    ff_h263_decode_init,
Fabrice Bellard's avatar
Fabrice Bellard committed
818
    NULL,
Michael Niedermayer's avatar
Michael Niedermayer committed
819 820
    ff_h263_decode_end,
    ff_h263_decode_frame,
821
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,