aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2003-02-02 23:34:30 +0000
committerMichael Niedermayer <michaelni@gmx.at>2003-02-02 23:34:30 +0000
commit36df88058135607162d25b73cab93e19b0a8cb76 (patch)
treeef1e8fa9fc8e4427d9684439e262ee6245040dad
parentfa7773216ad6091edbabfc2d3d2a3ef4f6128094 (diff)
downloadffmpeg-36df88058135607162d25b73cab93e19b0a8cb76.tar.gz
divx503 decoding fix
Originally committed as revision 1538 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/avcodec.h8
-rw-r--r--libavcodec/h263dec.c13
-rw-r--r--libavcodec/mpegvideo.c5
3 files changed, 17 insertions, 9 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 6ee2b84cdf..6e7b0d4837 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1,6 +1,13 @@
#ifndef AVCODEC_H
#define AVCODEC_H
+/**
+ * @file avcodec.h
+ * @brief
+ * external api header
+ */
+
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -523,6 +530,7 @@ typedef struct AVCodecContext {
#define FF_BUG_AC_VLC 32
#define FF_BUG_QPEL_CHROMA 64
#define FF_BUG_STD_QPEL 128
+#define FF_BUG_QPEL_CHROMA2 256
//#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
/**
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index a5dadeec4a..89f606b216 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -20,12 +20,6 @@
#include "dsputil.h"
#include "mpegvideo.h"
-#if 1
-#define PRINT_QP(a, b) {}
-#else
-#define PRINT_QP(a, b) printf(a, b)
-#endif
-
//#define DEBUG
//#define 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));
ret= s->decode_mb(s, s->block);
- PRINT_QP("%2d", s->qscale);
MPV_decode_mb(s, s->block);
if(ret<0){
@@ -239,8 +232,6 @@ static int decode_slice(MpegEncContext *s){
ff_draw_horiz_band(s);
- PRINT_QP("%s", "\n");
-
s->mb_x= 0;
}
@@ -495,6 +486,10 @@ retry:
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)
s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index d721647a57..15bd0249b0 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -1680,6 +1680,10 @@ static inline void qpel_motion(MpegEncContext *s,
if(field_based){
mx= motion_x/2;
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){
mx= (motion_x>>1)|(motion_x&1);
my= (motion_y>>1)|(motion_y&1);
@@ -1689,6 +1693,7 @@ static inline void qpel_motion(MpegEncContext *s,
}
mx= (mx>>1)|(mx&1);
my= (my>>1)|(my&1);
+
dxy= (mx&1) | ((my&1)<<1);
mx>>=1;
my>>=1;