comparison h263dec.c @ 1420:ff0220970711 libavcodec

xvid edge bug (if i understand the mpeg4 spec correctly) autodetection improved edge & padding bug detection for old files tested with *.avi *.mp4 on my HD
author michaelni
date Mon, 25 Aug 2003 12:50:15 +0000
parents ba99a78bcb37
children 3a6d613c88d8
comparison
equal deleted inserted replaced
1419:a7a9df478e46 1420:ff0220970711
299 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); 299 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);
300 300
301 return 0; 301 return 0;
302 } 302 }
303 303
304 fprintf(stderr, "slice end not reached but screenspace end (%d left %06X)\n", 304 fprintf(stderr, "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
305 s->gb.size_in_bits - get_bits_count(&s->gb), 305 s->gb.size_in_bits - get_bits_count(&s->gb),
306 show_bits(&s->gb, 24)); 306 show_bits(&s->gb, 24), s->padding_bug_score);
307 307
308 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); 308 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);
309 309
310 return -1; 310 return -1;
311 } 311 }
478 fprintf(stderr, "header damaged\n"); 478 fprintf(stderr, "header damaged\n");
479 return -1; 479 return -1;
480 } 480 }
481 481
482 avctx->has_b_frames= !s->low_delay; 482 avctx->has_b_frames= !s->low_delay;
483
484 if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
485 if(s->avctx->codec_tag == ff_get_fourcc("XVID") || s->avctx->codec_tag == ff_get_fourcc("XVIX"))
486 s->xvid_build= -1;
487
488 if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==0)
489 s->divx_version= 400; //divx 4
490 }
483 491
484 if(s->workaround_bugs&FF_BUG_AUTODETECT){ 492 if(s->workaround_bugs&FF_BUG_AUTODETECT){
485 if(s->padding_bug_score > -2 && !s->data_partitioning && !s->resync_marker) 493 s->workaround_bugs &= ~FF_BUG_NO_PADDING;
494
495 if(s->padding_bug_score > -2 && !s->data_partitioning && (s->divx_version || !s->resync_marker))
486 s->workaround_bugs |= FF_BUG_NO_PADDING; 496 s->workaround_bugs |= FF_BUG_NO_PADDING;
487 else
488 s->workaround_bugs &= ~FF_BUG_NO_PADDING;
489 497
490 if(s->avctx->codec_tag == ff_get_fourcc("XVIX")) 498 if(s->avctx->codec_tag == ff_get_fourcc("XVIX"))
491 s->workaround_bugs|= FF_BUG_XVID_ILACE; 499 s->workaround_bugs|= FF_BUG_XVID_ILACE;
492 #if 0 500
493 if(s->avctx->codec_tag == ff_get_fourcc("MP4S"))
494 s->workaround_bugs|= FF_BUG_AC_VLC;
495
496 if(s->avctx->codec_tag == ff_get_fourcc("M4S2"))
497 s->workaround_bugs|= FF_BUG_AC_VLC;
498 #endif
499 if(s->avctx->codec_tag == ff_get_fourcc("UMP4")){ 501 if(s->avctx->codec_tag == ff_get_fourcc("UMP4")){
500 s->workaround_bugs|= FF_BUG_UMP4; 502 s->workaround_bugs|= FF_BUG_UMP4;
501 s->workaround_bugs|= FF_BUG_AC_VLC; 503 s->workaround_bugs|= FF_BUG_AC_VLC;
502 } 504 }
503 505
504 if(s->divx_version){ 506 if(s->divx_version>=500){
505 s->workaround_bugs|= FF_BUG_QPEL_CHROMA; 507 s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
506 } 508 }
507 509
508 if(s->divx_version>502){ 510 if(s->divx_version>502){
509 s->workaround_bugs|= FF_BUG_QPEL_CHROMA2; 511 s->workaround_bugs|= FF_BUG_QPEL_CHROMA2;
510 } 512 }
511 513
512 if(s->avctx->codec_tag == ff_get_fourcc("XVID") && s->xvid_build==0)
513 s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
514
515 if(s->avctx->codec_tag == ff_get_fourcc("XVID") && s->xvid_build==0)
516 s->padding_bug_score= 256*256*256*64;
517
518 if(s->xvid_build && s->xvid_build<=3) 514 if(s->xvid_build && s->xvid_build<=3)
519 s->padding_bug_score= 256*256*256*64; 515 s->padding_bug_score= 256*256*256*64;
520 516
521 if(s->xvid_build && s->xvid_build<=1) 517 if(s->xvid_build && s->xvid_build<=1)
522 s->workaround_bugs|= FF_BUG_QPEL_CHROMA; 518 s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
519
520 if(s->xvid_build && s->xvid_build<=12)
521 s->workaround_bugs|= FF_BUG_EDGE;
523 522
524 #define SET_QPEL_FUNC(postfix1, postfix2) \ 523 #define SET_QPEL_FUNC(postfix1, postfix2) \
525 s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\ 524 s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
526 s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\ 525 s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
527 s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2; 526 s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
544 543
545 if(s->divx_version && s->divx_version<500){ 544 if(s->divx_version && s->divx_version<500){
546 s->workaround_bugs|= FF_BUG_EDGE; 545 s->workaround_bugs|= FF_BUG_EDGE;
547 } 546 }
548 547
549 if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->divx_version==0 && s->lavc_build==0 && s->xvid_build==0 && s->vo_type==0 && s->vol_control_parameters==0 && s->low_delay)
550 s->workaround_bugs|= FF_BUG_EDGE;
551
552 #if 0 548 #if 0
553 if(s->divx_version==500) 549 if(s->divx_version==500)
554 s->padding_bug_score= 256*256*256*64; 550 s->padding_bug_score= 256*256*256*64;
555 551
556 /* very ugly XVID padding bug detection FIXME/XXX solve this differently 552 /* very ugly XVID padding bug detection FIXME/XXX solve this differently