diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 62743b3ef6a22206741197d7a18fbbdfea23f260..909dec15454aa24daa49449c9b9983a6c9076f55 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -840,6 +840,7 @@ typedef struct AVCodecContext {
 #define FF_BUG_QPEL_CHROMA2     256
 #define FF_BUG_DIRECT_BLOCKSIZE 512
 #define FF_BUG_EDGE             1024
+#define FF_BUG_HPEL_CHROMA      2048
 //#define FF_BUG_FAKE_SCALABILITY 16 //autodetection should work 100%
         
     /**
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index b934db3c8707b312a06cf4e614d184e1951c96af..bff4435a8ce5dd579ac446023d672a55b81da8e1 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -551,6 +551,8 @@ retry:
             s->workaround_bugs|= FF_BUG_EDGE;
         }
         
+        if(s->divx_version)
+            s->workaround_bugs|= FF_BUG_HPEL_CHROMA;
 #if 0
         if(s->divx_version==500)
             s->padding_bug_score= 256*256*256*64;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 07d16e8e69cbad25f4730172c5efa0e0f7dab27f..50aa254009699cf1de66f800243ef9653f3bd194 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -2430,9 +2430,17 @@ if(s->quarter_sample)
     src_y = s->mb_y*(16>>field_based) + (motion_y >> 1);
 
     if (s->out_format == FMT_H263) {
-        uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
-        uvsrc_x = src_x>>1;
-        uvsrc_y = src_y>>1;
+        if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
+            mx = (motion_x>>1)|(motion_x&1);
+            my = motion_y >>1;
+            uvdxy = ((my & 1) << 1) | (mx & 1);
+            uvsrc_x = s->mb_x* 8               + (mx >> 1);
+            uvsrc_y = s->mb_y*(8>>field_based) + (my >> 1);
+        }else{
+            uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
+            uvsrc_x = src_x>>1;
+            uvsrc_y = src_y>>1;
+        }
     } else {
         mx = motion_x / 2;
         my = motion_y / 2;