Commit 1f4646f0 authored by michaelni's avatar michaelni

divx503 decoding fix


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@1538 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 0a3caa41
#ifndef AVCODEC_H #ifndef AVCODEC_H
#define AVCODEC_H #define AVCODEC_H
/**
* @file avcodec.h
* @brief
* external api header
*/
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
...@@ -523,6 +530,7 @@ typedef struct AVCodecContext { ...@@ -523,6 +530,7 @@ typedef struct AVCodecContext {
#define FF_BUG_AC_VLC 32 #define FF_BUG_AC_VLC 32
#define FF_BUG_QPEL_CHROMA 64 #define FF_BUG_QPEL_CHROMA 64
#define FF_BUG_STD_QPEL 128 #define FF_BUG_STD_QPEL 128
#define FF_BUG_QPEL_CHROMA2 256
//#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100% //#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
/** /**
......
...@@ -20,12 +20,6 @@ ...@@ -20,12 +20,6 @@
#include "dsputil.h" #include "dsputil.h"
#include "mpegvideo.h" #include "mpegvideo.h"
#if 1
#define PRINT_QP(a, b) {}
#else
#define PRINT_QP(a, b) printf(a, b)
#endif
//#define DEBUG //#define DEBUG
//#define PRINT_FRAME_TIME //#define PRINT_FRAME_TIME
#ifdef PRINT_FRAME_TIME #ifdef PRINT_FRAME_TIME
...@@ -205,7 +199,6 @@ static int decode_slice(MpegEncContext *s){ ...@@ -205,7 +199,6 @@ static int decode_slice(MpegEncContext *s){
//printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24)); //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
ret= s->decode_mb(s, s->block); ret= s->decode_mb(s, s->block);
PRINT_QP("%2d", s->qscale);
MPV_decode_mb(s, s->block); MPV_decode_mb(s, s->block);
if(ret<0){ if(ret<0){
...@@ -239,8 +232,6 @@ static int decode_slice(MpegEncContext *s){ ...@@ -239,8 +232,6 @@ static int decode_slice(MpegEncContext *s){
ff_draw_horiz_band(s); ff_draw_horiz_band(s);
PRINT_QP("%s", "\n");
s->mb_x= 0; s->mb_x= 0;
} }
...@@ -495,6 +486,10 @@ retry: ...@@ -495,6 +486,10 @@ retry:
s->workaround_bugs|= FF_BUG_QPEL_CHROMA; s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
} }
if(s->divx_version>502){
s->workaround_bugs|= FF_BUG_QPEL_CHROMA2;
}
if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0) if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0)
s->workaround_bugs|= FF_BUG_QPEL_CHROMA; s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
......
...@@ -1680,6 +1680,10 @@ static inline void qpel_motion(MpegEncContext *s, ...@@ -1680,6 +1680,10 @@ static inline void qpel_motion(MpegEncContext *s,
if(field_based){ if(field_based){
mx= motion_x/2; mx= motion_x/2;
my= motion_y>>1; my= motion_y>>1;
}else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
static const int rtab[8]= {0,0,1,1,0,0,0,1};
mx= (motion_x>>1) + rtab[motion_x&7];
my= (motion_y>>1) + rtab[motion_y&7];
}else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){ }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
mx= (motion_x>>1)|(motion_x&1); mx= (motion_x>>1)|(motion_x&1);
my= (motion_y>>1)|(motion_y&1); my= (motion_y>>1)|(motion_y&1);
...@@ -1689,6 +1693,7 @@ static inline void qpel_motion(MpegEncContext *s, ...@@ -1689,6 +1693,7 @@ static inline void qpel_motion(MpegEncContext *s,
} }
mx= (mx>>1)|(mx&1); mx= (mx>>1)|(mx&1);
my= (my>>1)|(my&1); my= (my>>1)|(my&1);
dxy= (mx&1) | ((my&1)<<1); dxy= (mx&1) | ((my&1)<<1);
mx>>=1; mx>>=1;
my>>=1; my>>=1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment