divx503 decoding fix
Originally committed as revision 1538 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
fa7773216a
commit
36df880581
@ -1,6 +1,13 @@
|
|||||||
#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 {
|
|||||||
#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 @@
|
|||||||
#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){
|
|||||||
//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){
|
|||||||
|
|
||||||
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:
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user