shithub: libvpx

Download patch

ref: ce328b855f951e5a9fd0d9d92df09d65ea0d8be9
parent: aab70f4d7af44c1d1fdbc716aa63baff9f4789cc
parent: bcba86e2e9c03da484addb984db40ff61bd21569
author: Scott LaVarnway <slavarnway@google.com>
date: Tue Feb 28 06:42:45 EST 2012

Merge changes Ifb450710,I61c4a132

* changes:
  Eliminated reconintra_mt.c
  Eliminated vp8mt_build_intra_predictors_mbuv_s

--- a/vp8/common/reconintra.c
+++ b/vp8/common/reconintra.c
@@ -136,21 +136,21 @@
     }
 }
 
-void vp8_build_intra_predictors_mby_s_c(MACROBLOCKD *x)
+void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x,
+                                          unsigned char * yabove_row,
+                                          unsigned char * yleft,
+                                          int left_stride,
+                                          unsigned char * ypred_ptr)
 {
-
-    unsigned char *yabove_row = x->dst.y_buffer - x->dst.y_stride;
     unsigned char yleft_col[16];
     unsigned char ytop_left = yabove_row[-1];
-    unsigned char *ypred_ptr = x->predictor;
     int r, c, i;
 
     int y_stride = x->dst.y_stride;
-    ypred_ptr = x->dst.y_buffer; /*x->predictor;*/
 
     for (i = 0; i < 16; i++)
     {
-        yleft_col[i] = x->dst.y_buffer [i* x->dst.y_stride -1];
+        yleft_col[i] = yleft[i* left_stride];
     }
 
     /* for Y */
@@ -400,16 +400,19 @@
     }
 }
 
-void vp8_build_intra_predictors_mbuv_s_c(MACROBLOCKD *x)
+void vp8_build_intra_predictors_mbuv_s_c(MACROBLOCKD *x,
+                                         unsigned char * uabove_row,
+                                         unsigned char * vabove_row,
+                                         unsigned char * uleft,
+                                         unsigned char * vleft,
+                                         int left_stride,
+                                         unsigned char * upred_ptr,
+                                         unsigned char * vpred_ptr)
 {
-    unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride;
-    unsigned char uleft_col[16];
+    unsigned char uleft_col[8];
     unsigned char utop_left = uabove_row[-1];
-    unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride;
-    unsigned char vleft_col[20];
+    unsigned char vleft_col[8];
     unsigned char vtop_left = vabove_row[-1];
-    unsigned char *upred_ptr = x->dst.u_buffer; /*&x->predictor[256];*/
-    unsigned char *vpred_ptr = x->dst.v_buffer; /*&x->predictor[320];*/
     int uv_stride = x->dst.uv_stride;
 
     int i, j;
@@ -416,8 +419,8 @@
 
     for (i = 0; i < 8; i++)
     {
-        uleft_col[i] = x->dst.u_buffer [i* x->dst.uv_stride -1];
-        vleft_col[i] = x->dst.v_buffer [i* x->dst.uv_stride -1];
+        uleft_col[i] = uleft [i* left_stride];
+        vleft_col[i] = vleft [i* left_stride];
     }
 
     switch (x->mode_info_context->mbmi.uv_mode)
--- a/vp8/common/reconintra4x4.c
+++ b/vp8/common/reconintra4x4.c
@@ -13,21 +13,20 @@
 #include "vpx_rtcd.h"
 #include "blockd.h"
 
-void vp8_intra4x4_predict_c(unsigned char *src, int src_stride,
-                            int b_mode,
-                            unsigned char *dst, int dst_stride)
+void vp8_intra4x4_predict_d_c(unsigned char *Above,
+                              unsigned char *yleft, int left_stride,
+                              int b_mode,
+                              unsigned char *dst, int dst_stride,
+                              unsigned char top_left)
 {
     int i, r, c;
 
-    unsigned char *Above = src - src_stride;
     unsigned char Left[4];
-    unsigned char top_left = Above[-1];
+    Left[0] = yleft[0];
+    Left[1] = yleft[left_stride];
+    Left[2] = yleft[2 * left_stride];
+    Left[3] = yleft[3 * left_stride];
 
-    Left[0] = src[-1];
-    Left[1] = src[-1 + src_stride];
-    Left[2] = src[-1 + 2 * src_stride];
-    Left[3] = src[-1 + 3 * src_stride];
-
     switch (b_mode)
     {
     case B_DC_PRED:
@@ -295,24 +294,15 @@
     }
 }
 
-
-
-
-
-/* copy 4 bytes from the above right down so that the 4x4 prediction modes using pixels above and
- * to the right prediction have filled in pixels to use.
- */
-void vp8_intra_prediction_down_copy(MACROBLOCKD *x)
+void vp8_intra4x4_predict_c(unsigned char *src, int src_stride,
+                            int b_mode,
+                            unsigned char *dst, int dst_stride)
 {
-    int dst_stride = x->dst.y_stride;
-    unsigned char *above_right = x->dst.y_buffer - dst_stride + 16;
+    unsigned char *Above = src - src_stride;
 
-    unsigned int *src_ptr = (unsigned int *)above_right;
-    unsigned int *dst_ptr0 = (unsigned int *)(above_right + 4 * dst_stride);
-    unsigned int *dst_ptr1 = (unsigned int *)(above_right + 8 * dst_stride);
-    unsigned int *dst_ptr2 = (unsigned int *)(above_right + 12 * dst_stride);
-
-    *dst_ptr0 = *src_ptr;
-    *dst_ptr1 = *src_ptr;
-    *dst_ptr2 = *src_ptr;
+    vp8_intra4x4_predict_d_c(Above,
+                             src - 1, src_stride,
+                             b_mode,
+                             dst, dst_stride,
+                             Above[-1]);
 }
--- a/vp8/common/reconintra4x4.h
+++ b/vp8/common/reconintra4x4.h
@@ -11,9 +11,22 @@
 
 #ifndef __INC_RECONINTRA4x4_H
 #define __INC_RECONINTRA4x4_H
+#include "vp8/common/blockd.h"
 
-struct macroblockd;
+static void intra_prediction_down_copy(MACROBLOCKD *xd,
+                                             unsigned char *above_right_src)
+{
+    int dst_stride = xd->dst.y_stride;
+    unsigned char *above_right_dst = xd->dst.y_buffer - dst_stride + 16;
 
-extern void vp8_intra_prediction_down_copy(struct macroblockd *x);
+    unsigned int *src_ptr = (unsigned int *)above_right_src;
+    unsigned int *dst_ptr0 = (unsigned int *)(above_right_dst + 4 * dst_stride);
+    unsigned int *dst_ptr1 = (unsigned int *)(above_right_dst + 8 * dst_stride);
+    unsigned int *dst_ptr2 = (unsigned int *)(above_right_dst + 12 * dst_stride);
+
+    *dst_ptr0 = *src_ptr;
+    *dst_ptr1 = *src_ptr;
+    *dst_ptr2 = *src_ptr;
+}
 
 #endif
--- a/vp8/common/rtcd_defs.sh
+++ b/vp8/common/rtcd_defs.sh
@@ -125,14 +125,14 @@
 prototype void vp8_build_intra_predictors_mby "struct macroblockd *x"
 specialize vp8_build_intra_predictors_mby sse2 ssse3 neon
 
-prototype void vp8_build_intra_predictors_mby_s "struct macroblockd *x"
-specialize vp8_build_intra_predictors_mby_s sse2 ssse3 neon
+prototype void vp8_build_intra_predictors_mby_s "struct macroblockd *x, unsigned char * yabove_row, unsigned char * yleft, int left_stride, unsigned char * ypred_ptr"
+#TODO: fix assembly --- specialize vp8_build_intra_predictors_mby_s sse2 ssse3 neon
 
 prototype void vp8_build_intra_predictors_mbuv "struct macroblockd *x"
 specialize vp8_build_intra_predictors_mbuv sse2 ssse3
 
-prototype void vp8_build_intra_predictors_mbuv_s "struct macroblockd *x"
-specialize vp8_build_intra_predictors_mbuv_s sse2 ssse3
+prototype void vp8_build_intra_predictors_mbuv_s "struct macroblockd *x, unsigned char * uabove_row, unsigned char * vabove_row,  unsigned char *uleft, unsigned char *vleft, int left_stride, unsigned char * upred_ptr, unsigned char * vpred_ptr"
+#TODO: fix assembly --- specialize vp8_build_intra_predictors_mbuv_s sse2 ssse3
 
 prototype void vp8_intra4x4_predict "unsigned char *src, int src_stride, int b_mode, unsigned char *dst, int dst_stride"
 specialize vp8_intra4x4_predict media
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -156,11 +156,21 @@
     /* do prediction */
     if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
     {
-        vp8_build_intra_predictors_mbuv_s(xd);
+        vp8_build_intra_predictors_mbuv_s(xd,
+                                          xd->dst.u_buffer - xd->dst.uv_stride,
+                                          xd->dst.v_buffer - xd->dst.uv_stride,
+                                          xd->dst.u_buffer - 1,
+                                          xd->dst.v_buffer - 1,
+                                          xd->dst.uv_stride,
+                                          xd->dst.u_buffer, xd->dst.v_buffer);
 
         if (mode != B_PRED)
         {
-            vp8_build_intra_predictors_mby_s(xd);
+            vp8_build_intra_predictors_mby_s(xd,
+                                                 xd->dst.y_buffer - xd->dst.y_stride,
+                                                 xd->dst.y_buffer - 1,
+                                                 xd->dst.y_stride,
+                                                 xd->dst.y_buffer);
         }
         else
         {
@@ -172,16 +182,28 @@
             if(xd->mode_info_context->mbmi.mb_skip_coeff)
                 vpx_memset(xd->eobs, 0, 25);
 
-            vp8_intra_prediction_down_copy(xd);
+            intra_prediction_down_copy(xd, xd->dst.y_buffer - dst_stride + 16);
 
             for (i = 0; i < 16; i++)
             {
                 BLOCKD *b = &xd->block[i];
                 int b_mode = xd->mode_info_context->bmi[i].as_mode;
+                unsigned char *yabove;
+                unsigned char *yleft;
+                int left_stride;
+                unsigned char top_left;
 
+                yabove = base_dst + b->offset - dst_stride;
+                yleft = base_dst + b->offset - 1;
+                left_stride = dst_stride;
+                top_left = yabove[-1];
 
-                vp8_intra4x4_predict (base_dst + b->offset, dst_stride, b_mode,
-                                      base_dst + b->offset, dst_stride );
+                //                vp8_intra4x4_predict (base_dst + b->offset, dst_stride, b_mode,
+                  //                                    base_dst + b->offset, dst_stride );
+                vp8_intra4x4_predict_d_c(yabove, yleft, left_stride,
+                                       b_mode,
+                                       base_dst + b->offset, dst_stride,
+                                       top_left);
 
                 if (xd->eobs[i])
                 {
--- a/vp8/decoder/reconintra_mt.c
+++ /dev/null
@@ -1,943 +1,0 @@
-/*
- *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#include "vpx_config.h"
-#include "vpx_rtcd.h"
-#include "vpx_mem/vpx_mem.h"
-#include "onyxd_int.h"
-
-/* For skip_recon_mb(), add vp8_build_intra_predictors_mby_s(MACROBLOCKD *x) and
- * vp8_build_intra_predictors_mbuv_s(MACROBLOCKD *x).
- */
-
-void vp8mt_build_intra_predictors_mby(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col)
-{
-    unsigned char *yabove_row;    /* = x->dst.y_buffer - x->dst.y_stride; */
-    unsigned char *yleft_col;
-    unsigned char yleft_buf[16];
-    unsigned char ytop_left;      /* = yabove_row[-1]; */
-    unsigned char *ypred_ptr = x->predictor;
-    int r, c, i;
-
-    if (pbi->common.filter_level)
-    {
-        yabove_row = pbi->mt_yabove_row[mb_row] + mb_col*16 +32;
-        yleft_col = pbi->mt_yleft_col[mb_row];
-    } else
-    {
-        yabove_row = x->dst.y_buffer - x->dst.y_stride;
-
-        for (i = 0; i < 16; i++)
-            yleft_buf[i] = x->dst.y_buffer [i* x->dst.y_stride -1];
-        yleft_col = yleft_buf;
-    }
-
-    ytop_left = yabove_row[-1];
-
-    /* for Y */
-    switch (x->mode_info_context->mbmi.mode)
-    {
-    case DC_PRED:
-    {
-        int expected_dc;
-        int i;
-        int shift;
-        int average = 0;
-
-
-        if (x->up_available || x->left_available)
-        {
-            if (x->up_available)
-            {
-                for (i = 0; i < 16; i++)
-                {
-                    average += yabove_row[i];
-                }
-            }
-
-            if (x->left_available)
-            {
-
-                for (i = 0; i < 16; i++)
-                {
-                    average += yleft_col[i];
-                }
-
-            }
-
-
-
-            shift = 3 + x->up_available + x->left_available;
-            expected_dc = (average + (1 << (shift - 1))) >> shift;
-        }
-        else
-        {
-            expected_dc = 128;
-        }
-
-        vpx_memset(ypred_ptr, expected_dc, 256);
-    }
-    break;
-    case V_PRED:
-    {
-
-        for (r = 0; r < 16; r++)
-        {
-
-            ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0];
-            ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
-            ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
-            ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
-            ypred_ptr += 16;
-        }
-    }
-    break;
-    case H_PRED:
-    {
-
-        for (r = 0; r < 16; r++)
-        {
-
-            vpx_memset(ypred_ptr, yleft_col[r], 16);
-            ypred_ptr += 16;
-        }
-
-    }
-    break;
-    case TM_PRED:
-    {
-
-        for (r = 0; r < 16; r++)
-        {
-            for (c = 0; c < 16; c++)
-            {
-                int pred =  yleft_col[r] + yabove_row[ c] - ytop_left;
-
-                if (pred < 0)
-                    pred = 0;
-
-                if (pred > 255)
-                    pred = 255;
-
-                ypred_ptr[c] = pred;
-            }
-
-            ypred_ptr += 16;
-        }
-
-    }
-    break;
-    case B_PRED:
-    case NEARESTMV:
-    case NEARMV:
-    case ZEROMV:
-    case NEWMV:
-    case SPLITMV:
-    case MB_MODE_COUNT:
-        break;
-    }
-}
-
-void vp8mt_build_intra_predictors_mby_s(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col)
-{
-    unsigned char *yabove_row;    /* = x->dst.y_buffer - x->dst.y_stride; */
-    unsigned char *yleft_col;
-    unsigned char yleft_buf[16];
-    unsigned char ytop_left;      /* = yabove_row[-1]; */
-    unsigned char *ypred_ptr = x->predictor;
-    int r, c, i;
-
-    int y_stride = x->dst.y_stride;
-    ypred_ptr = x->dst.y_buffer; /*x->predictor;*/
-
-    if (pbi->common.filter_level)
-    {
-        yabove_row = pbi->mt_yabove_row[mb_row] + mb_col*16 +32;
-        yleft_col = pbi->mt_yleft_col[mb_row];
-    } else
-    {
-        yabove_row = x->dst.y_buffer - x->dst.y_stride;
-
-        for (i = 0; i < 16; i++)
-            yleft_buf[i] = x->dst.y_buffer [i* x->dst.y_stride -1];
-        yleft_col = yleft_buf;
-    }
-
-    ytop_left = yabove_row[-1];
-
-    /* for Y */
-    switch (x->mode_info_context->mbmi.mode)
-    {
-    case DC_PRED:
-    {
-        int expected_dc;
-        int i;
-        int shift;
-        int average = 0;
-
-
-        if (x->up_available || x->left_available)
-        {
-            if (x->up_available)
-            {
-                for (i = 0; i < 16; i++)
-                {
-                    average += yabove_row[i];
-                }
-            }
-
-            if (x->left_available)
-            {
-
-                for (i = 0; i < 16; i++)
-                {
-                    average += yleft_col[i];
-                }
-
-            }
-
-
-
-            shift = 3 + x->up_available + x->left_available;
-            expected_dc = (average + (1 << (shift - 1))) >> shift;
-        }
-        else
-        {
-            expected_dc = 128;
-        }
-
-        /*vpx_memset(ypred_ptr, expected_dc, 256);*/
-        for (r = 0; r < 16; r++)
-        {
-            vpx_memset(ypred_ptr, expected_dc, 16);
-            ypred_ptr += y_stride; /*16;*/
-        }
-    }
-    break;
-    case V_PRED:
-    {
-
-        for (r = 0; r < 16; r++)
-        {
-
-            ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0];
-            ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
-            ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
-            ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
-            ypred_ptr += y_stride; /*16;*/
-        }
-    }
-    break;
-    case H_PRED:
-    {
-
-        for (r = 0; r < 16; r++)
-        {
-
-            vpx_memset(ypred_ptr, yleft_col[r], 16);
-            ypred_ptr += y_stride;  /*16;*/
-        }
-
-    }
-    break;
-    case TM_PRED:
-    {
-
-        for (r = 0; r < 16; r++)
-        {
-            for (c = 0; c < 16; c++)
-            {
-                int pred =  yleft_col[r] + yabove_row[ c] - ytop_left;
-
-                if (pred < 0)
-                    pred = 0;
-
-                if (pred > 255)
-                    pred = 255;
-
-                ypred_ptr[c] = pred;
-            }
-
-            ypred_ptr += y_stride;  /*16;*/
-        }
-
-    }
-    break;
-    case B_PRED:
-    case NEARESTMV:
-    case NEARMV:
-    case ZEROMV:
-    case NEWMV:
-    case SPLITMV:
-    case MB_MODE_COUNT:
-        break;
-    }
-}
-
-void vp8mt_build_intra_predictors_mbuv(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col)
-{
-    unsigned char *uabove_row;   /* = x->dst.u_buffer - x->dst.uv_stride; */
-    unsigned char *uleft_col;    /*[16];*/
-    unsigned char uleft_buf[8];
-    unsigned char utop_left;     /* = uabove_row[-1]; */
-    unsigned char *vabove_row;   /* = x->dst.v_buffer - x->dst.uv_stride; */
-    unsigned char *vleft_col;    /*[20];*/
-    unsigned char vleft_buf[8];
-    unsigned char vtop_left;     /* = vabove_row[-1]; */
-    unsigned char *upred_ptr = &x->predictor[256];
-    unsigned char *vpred_ptr = &x->predictor[320];
-    int i, j;
-
-    if (pbi->common.filter_level)
-    {
-        uabove_row = pbi->mt_uabove_row[mb_row] + mb_col*8 +16;
-        vabove_row = pbi->mt_vabove_row[mb_row] + mb_col*8 +16;
-        uleft_col = pbi->mt_uleft_col[mb_row];
-        vleft_col = pbi->mt_vleft_col[mb_row];
-    } else
-    {
-        uabove_row = x->dst.u_buffer - x->dst.uv_stride;
-        vabove_row = x->dst.v_buffer - x->dst.uv_stride;
-
-        for (i = 0; i < 8; i++)
-        {
-            uleft_buf[i] = x->dst.u_buffer [i* x->dst.uv_stride -1];
-            vleft_buf[i] = x->dst.v_buffer [i* x->dst.uv_stride -1];
-        }
-        uleft_col = uleft_buf;
-        vleft_col = vleft_buf;
-    }
-    utop_left = uabove_row[-1];
-    vtop_left = vabove_row[-1];
-
-    switch (x->mode_info_context->mbmi.uv_mode)
-    {
-    case DC_PRED:
-    {
-        int expected_udc;
-        int expected_vdc;
-        int i;
-        int shift;
-        int Uaverage = 0;
-        int Vaverage = 0;
-
-        if (x->up_available)
-        {
-            for (i = 0; i < 8; i++)
-            {
-                Uaverage += uabove_row[i];
-                Vaverage += vabove_row[i];
-            }
-        }
-
-        if (x->left_available)
-        {
-            for (i = 0; i < 8; i++)
-            {
-                Uaverage += uleft_col[i];
-                Vaverage += vleft_col[i];
-            }
-        }
-
-        if (!x->up_available && !x->left_available)
-        {
-            expected_udc = 128;
-            expected_vdc = 128;
-        }
-        else
-        {
-            shift = 2 + x->up_available + x->left_available;
-            expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
-            expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
-        }
-
-
-        vpx_memset(upred_ptr, expected_udc, 64);
-        vpx_memset(vpred_ptr, expected_vdc, 64);
-
-
-    }
-    break;
-    case V_PRED:
-    {
-        int i;
-
-        for (i = 0; i < 8; i++)
-        {
-            vpx_memcpy(upred_ptr, uabove_row, 8);
-            vpx_memcpy(vpred_ptr, vabove_row, 8);
-            upred_ptr += 8;
-            vpred_ptr += 8;
-        }
-
-    }
-    break;
-    case H_PRED:
-    {
-        int i;
-
-        for (i = 0; i < 8; i++)
-        {
-            vpx_memset(upred_ptr, uleft_col[i], 8);
-            vpx_memset(vpred_ptr, vleft_col[i], 8);
-            upred_ptr += 8;
-            vpred_ptr += 8;
-        }
-    }
-
-    break;
-    case TM_PRED:
-    {
-        int i;
-
-        for (i = 0; i < 8; i++)
-        {
-            for (j = 0; j < 8; j++)
-            {
-                int predu = uleft_col[i] + uabove_row[j] - utop_left;
-                int predv = vleft_col[i] + vabove_row[j] - vtop_left;
-
-                if (predu < 0)
-                    predu = 0;
-
-                if (predu > 255)
-                    predu = 255;
-
-                if (predv < 0)
-                    predv = 0;
-
-                if (predv > 255)
-                    predv = 255;
-
-                upred_ptr[j] = predu;
-                vpred_ptr[j] = predv;
-            }
-
-            upred_ptr += 8;
-            vpred_ptr += 8;
-        }
-
-    }
-    break;
-    case B_PRED:
-    case NEARESTMV:
-    case NEARMV:
-    case ZEROMV:
-    case NEWMV:
-    case SPLITMV:
-    case MB_MODE_COUNT:
-        break;
-    }
-}
-
-void vp8mt_build_intra_predictors_mbuv_s(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col)
-{
-    unsigned char *uabove_row;  /* = x->dst.u_buffer - x->dst.uv_stride; */
-    unsigned char *uleft_col;   /*[16];*/
-    unsigned char uleft_buf[8];
-    unsigned char utop_left;    /* = uabove_row[-1]; */
-    unsigned char *vabove_row;  /* = x->dst.v_buffer - x->dst.uv_stride; */
-    unsigned char *vleft_col;   /*[20];*/
-    unsigned char vleft_buf[8];
-    unsigned char vtop_left;    /* = vabove_row[-1]; */
-    unsigned char *upred_ptr = x->dst.u_buffer; /*&x->predictor[256];*/
-    unsigned char *vpred_ptr = x->dst.v_buffer; /*&x->predictor[320];*/
-    int uv_stride = x->dst.uv_stride;
-    int i, j;
-
-    if (pbi->common.filter_level)
-    {
-        uabove_row = pbi->mt_uabove_row[mb_row] + mb_col*8 +16;
-        vabove_row = pbi->mt_vabove_row[mb_row] + mb_col*8 +16;
-        uleft_col = pbi->mt_uleft_col[mb_row];
-        vleft_col = pbi->mt_vleft_col[mb_row];
-    } else
-    {
-        uabove_row = x->dst.u_buffer - x->dst.uv_stride;
-        vabove_row = x->dst.v_buffer - x->dst.uv_stride;
-
-        for (i = 0; i < 8; i++)
-        {
-            uleft_buf[i] = x->dst.u_buffer [i* x->dst.uv_stride -1];
-            vleft_buf[i] = x->dst.v_buffer [i* x->dst.uv_stride -1];
-        }
-        uleft_col = uleft_buf;
-        vleft_col = vleft_buf;
-    }
-    utop_left = uabove_row[-1];
-    vtop_left = vabove_row[-1];
-
-    switch (x->mode_info_context->mbmi.uv_mode)
-    {
-    case DC_PRED:
-    {
-        int expected_udc;
-        int expected_vdc;
-        int i;
-        int shift;
-        int Uaverage = 0;
-        int Vaverage = 0;
-
-        if (x->up_available)
-        {
-            for (i = 0; i < 8; i++)
-            {
-                Uaverage += uabove_row[i];
-                Vaverage += vabove_row[i];
-            }
-        }
-
-        if (x->left_available)
-        {
-            for (i = 0; i < 8; i++)
-            {
-                Uaverage += uleft_col[i];
-                Vaverage += vleft_col[i];
-            }
-        }
-
-        if (!x->up_available && !x->left_available)
-        {
-            expected_udc = 128;
-            expected_vdc = 128;
-        }
-        else
-        {
-            shift = 2 + x->up_available + x->left_available;
-            expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
-            expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
-        }
-
-
-        /*vpx_memset(upred_ptr,expected_udc,64);
-        vpx_memset(vpred_ptr,expected_vdc,64);*/
-        for (i = 0; i < 8; i++)
-        {
-            vpx_memset(upred_ptr, expected_udc, 8);
-            vpx_memset(vpred_ptr, expected_vdc, 8);
-            upred_ptr += uv_stride; /*8;*/
-            vpred_ptr += uv_stride; /*8;*/
-        }
-    }
-    break;
-    case V_PRED:
-    {
-        int i;
-
-        for (i = 0; i < 8; i++)
-        {
-            vpx_memcpy(upred_ptr, uabove_row, 8);
-            vpx_memcpy(vpred_ptr, vabove_row, 8);
-            upred_ptr += uv_stride; /*8;*/
-            vpred_ptr += uv_stride; /*8;*/
-        }
-
-    }
-    break;
-    case H_PRED:
-    {
-        int i;
-
-        for (i = 0; i < 8; i++)
-        {
-            vpx_memset(upred_ptr, uleft_col[i], 8);
-            vpx_memset(vpred_ptr, vleft_col[i], 8);
-            upred_ptr += uv_stride; /*8;*/
-            vpred_ptr += uv_stride; /*8;*/
-        }
-    }
-
-    break;
-    case TM_PRED:
-    {
-        int i;
-
-        for (i = 0; i < 8; i++)
-        {
-            for (j = 0; j < 8; j++)
-            {
-                int predu = uleft_col[i] + uabove_row[j] - utop_left;
-                int predv = vleft_col[i] + vabove_row[j] - vtop_left;
-
-                if (predu < 0)
-                    predu = 0;
-
-                if (predu > 255)
-                    predu = 255;
-
-                if (predv < 0)
-                    predv = 0;
-
-                if (predv > 255)
-                    predv = 255;
-
-                upred_ptr[j] = predu;
-                vpred_ptr[j] = predv;
-            }
-
-            upred_ptr += uv_stride; /*8;*/
-            vpred_ptr += uv_stride; /*8;*/
-        }
-
-    }
-    break;
-    case B_PRED:
-    case NEARESTMV:
-    case NEARMV:
-    case ZEROMV:
-    case NEWMV:
-    case SPLITMV:
-    case MB_MODE_COUNT:
-        break;
-    }
-}
-
-
-void vp8mt_predict_intra4x4(VP8D_COMP *pbi,
-                          MACROBLOCKD *xd,
-                          int b_mode,
-                          unsigned char *predictor,
-                          int stride,
-                          int mb_row,
-                          int mb_col,
-                          int num)
-{
-    int i, r, c;
-
-    unsigned char *Above;   /* = *(x->base_dst) + x->dst - x->dst_stride; */
-    unsigned char Left[4];
-    unsigned char top_left; /* = Above[-1]; */
-
-    BLOCKD *x = &xd->block[num];
-    int dst_stride = xd->dst.y_stride;
-    unsigned char *base_dst = xd->dst.y_buffer;
-
-
-    /*Caution: For some b_mode, it needs 8 pixels (4 above + 4 above-right).*/
-    if (num < 4 && pbi->common.filter_level)
-        Above = pbi->mt_yabove_row[mb_row] + mb_col*16 + num*4 + 32;
-    else
-        Above = base_dst + x->offset - dst_stride;
-
-    if (num%4==0 && pbi->common.filter_level)
-    {
-        for (i=0; i<4; i++)
-            Left[i] = pbi->mt_yleft_col[mb_row][num + i];
-    }else
-    {
-        Left[0] = (base_dst)[x->offset - 1];
-        Left[1] = (base_dst)[x->offset - 1 + dst_stride];
-        Left[2] = (base_dst)[x->offset - 1 + 2 * dst_stride];
-        Left[3] = (base_dst)[x->offset - 1 + 3 * dst_stride];
-    }
-
-    if ((num==4 || num==8 || num==12) && pbi->common.filter_level)
-        top_left = pbi->mt_yleft_col[mb_row][num-1];
-    else
-        top_left = Above[-1];
-
-     switch (b_mode)
-    {
-    case B_DC_PRED:
-    {
-        int expected_dc = 0;
-
-        for (i = 0; i < 4; i++)
-        {
-            expected_dc += Above[i];
-            expected_dc += Left[i];
-        }
-
-        expected_dc = (expected_dc + 4) >> 3;
-
-        for (r = 0; r < 4; r++)
-        {
-            for (c = 0; c < 4; c++)
-            {
-                predictor[c] = expected_dc;
-            }
-
-            predictor += stride;
-        }
-    }
-    break;
-    case B_TM_PRED:
-    {
-        /* prediction similar to true_motion prediction */
-        for (r = 0; r < 4; r++)
-        {
-            for (c = 0; c < 4; c++)
-            {
-                int pred = Above[c] - top_left + Left[r];
-
-                if (pred < 0)
-                    pred = 0;
-
-                if (pred > 255)
-                    pred = 255;
-
-                predictor[c] = pred;
-            }
-
-            predictor += stride;
-        }
-    }
-    break;
-
-    case B_VE_PRED:
-    {
-
-        unsigned int ap[4];
-        ap[0] = (top_left  + 2 * Above[0] + Above[1] + 2) >> 2;
-        ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2;
-        ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2;
-        ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2;
-
-        for (r = 0; r < 4; r++)
-        {
-            for (c = 0; c < 4; c++)
-            {
-
-                predictor[c] = ap[c];
-            }
-
-            predictor += stride;
-        }
-
-    }
-    break;
-
-
-    case B_HE_PRED:
-    {
-
-        unsigned int lp[4];
-        lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2;
-        lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2;
-        lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2;
-        lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2;
-
-        for (r = 0; r < 4; r++)
-        {
-            for (c = 0; c < 4; c++)
-            {
-                predictor[c] = lp[r];
-            }
-
-            predictor += stride;
-        }
-    }
-    break;
-    case B_LD_PRED:
-    {
-        unsigned char *ptr = Above;
-        predictor[0 * stride + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2;
-        predictor[0 * stride + 1] =
-            predictor[1 * stride + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2;
-        predictor[0 * stride + 2] =
-            predictor[1 * stride + 1] =
-                predictor[2 * stride + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2;
-        predictor[0 * stride + 3] =
-            predictor[1 * stride + 2] =
-                predictor[2 * stride + 1] =
-                    predictor[3 * stride + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2;
-        predictor[1 * stride + 3] =
-            predictor[2 * stride + 2] =
-                predictor[3 * stride + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2;
-        predictor[2 * stride + 3] =
-            predictor[3 * stride + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2;
-        predictor[3 * stride + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2;
-
-    }
-    break;
-    case B_RD_PRED:
-    {
-
-        unsigned char pp[9];
-
-        pp[0] = Left[3];
-        pp[1] = Left[2];
-        pp[2] = Left[1];
-        pp[3] = Left[0];
-        pp[4] = top_left;
-        pp[5] = Above[0];
-        pp[6] = Above[1];
-        pp[7] = Above[2];
-        pp[8] = Above[3];
-
-        predictor[3 * stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
-        predictor[3 * stride + 1] =
-            predictor[2 * stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
-        predictor[3 * stride + 2] =
-            predictor[2 * stride + 1] =
-                predictor[1 * stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
-        predictor[3 * stride + 3] =
-            predictor[2 * stride + 2] =
-                predictor[1 * stride + 1] =
-                    predictor[0 * stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
-        predictor[2 * stride + 3] =
-            predictor[1 * stride + 2] =
-                predictor[0 * stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
-        predictor[1 * stride + 3] =
-            predictor[0 * stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
-        predictor[0 * stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
-
-    }
-    break;
-    case B_VR_PRED:
-    {
-
-        unsigned char pp[9];
-
-        pp[0] = Left[3];
-        pp[1] = Left[2];
-        pp[2] = Left[1];
-        pp[3] = Left[0];
-        pp[4] = top_left;
-        pp[5] = Above[0];
-        pp[6] = Above[1];
-        pp[7] = Above[2];
-        pp[8] = Above[3];
-
-
-        predictor[3 * stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
-        predictor[2 * stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
-        predictor[3 * stride + 1] =
-            predictor[1 * stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
-        predictor[2 * stride + 1] =
-            predictor[0 * stride + 0] = (pp[4] + pp[5] + 1) >> 1;
-        predictor[3 * stride + 2] =
-            predictor[1 * stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
-        predictor[2 * stride + 2] =
-            predictor[0 * stride + 1] = (pp[5] + pp[6] + 1) >> 1;
-        predictor[3 * stride + 3] =
-            predictor[1 * stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
-        predictor[2 * stride + 3] =
-            predictor[0 * stride + 2] = (pp[6] + pp[7] + 1) >> 1;
-        predictor[1 * stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
-        predictor[0 * stride + 3] = (pp[7] + pp[8] + 1) >> 1;
-
-    }
-    break;
-    case B_VL_PRED:
-    {
-
-        unsigned char *pp = Above;
-
-        predictor[0 * stride + 0] = (pp[0] + pp[1] + 1) >> 1;
-        predictor[1 * stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
-        predictor[2 * stride + 0] =
-            predictor[0 * stride + 1] = (pp[1] + pp[2] + 1) >> 1;
-        predictor[1 * stride + 1] =
-            predictor[3 * stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
-        predictor[2 * stride + 1] =
-            predictor[0 * stride + 2] = (pp[2] + pp[3] + 1) >> 1;
-        predictor[3 * stride + 1] =
-            predictor[1 * stride + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
-        predictor[0 * stride + 3] =
-            predictor[2 * stride + 2] = (pp[3] + pp[4] + 1) >> 1;
-        predictor[1 * stride + 3] =
-            predictor[3 * stride + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
-        predictor[2 * stride + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
-        predictor[3 * stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
-    }
-    break;
-
-    case B_HD_PRED:
-    {
-        unsigned char pp[9];
-        pp[0] = Left[3];
-        pp[1] = Left[2];
-        pp[2] = Left[1];
-        pp[3] = Left[0];
-        pp[4] = top_left;
-        pp[5] = Above[0];
-        pp[6] = Above[1];
-        pp[7] = Above[2];
-        pp[8] = Above[3];
-
-
-        predictor[3 * stride + 0] = (pp[0] + pp[1] + 1) >> 1;
-        predictor[3 * stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
-        predictor[2 * stride + 0] =
-            predictor[3 * stride + 2] = (pp[1] + pp[2] + 1) >> 1;
-        predictor[2 * stride + 1] =
-            predictor[3 * stride + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
-        predictor[2 * stride + 2] =
-            predictor[1 * stride + 0] = (pp[2] + pp[3] + 1) >> 1;
-        predictor[2 * stride + 3] =
-            predictor[1 * stride + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
-        predictor[1 * stride + 2] =
-            predictor[0 * stride + 0] = (pp[3] + pp[4] + 1) >> 1;
-        predictor[1 * stride + 3] =
-            predictor[0 * stride + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
-        predictor[0 * stride + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
-        predictor[0 * stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
-    }
-    break;
-
-
-    case B_HU_PRED:
-    {
-        unsigned char *pp = Left;
-        predictor[0 * stride + 0] = (pp[0] + pp[1] + 1) >> 1;
-        predictor[0 * stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
-        predictor[0 * stride + 2] =
-            predictor[1 * stride + 0] = (pp[1] + pp[2] + 1) >> 1;
-        predictor[0 * stride + 3] =
-            predictor[1 * stride + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
-        predictor[1 * stride + 2] =
-            predictor[2 * stride + 0] = (pp[2] + pp[3] + 1) >> 1;
-        predictor[1 * stride + 3] =
-            predictor[2 * stride + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2;
-        predictor[2 * stride + 2] =
-            predictor[2 * stride + 3] =
-                predictor[3 * stride + 0] =
-                    predictor[3 * stride + 1] =
-                        predictor[3 * stride + 2] =
-                            predictor[3 * stride + 3] = pp[3];
-    }
-    break;
-
-
-    }
-}
-
-/* copy 4 bytes from the above right down so that the 4x4 prediction modes using pixels above and
- * to the right prediction have filled in pixels to use.
- */
-void vp8mt_intra_prediction_down_copy(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col)
-{
-    unsigned char *above_right;   /* = *(x->block[0].base_dst) + x->block[0].dst - x->block[0].dst_stride + 16; */
-    unsigned int *src_ptr;
-    unsigned int *dst_ptr0;
-    unsigned int *dst_ptr1;
-    unsigned int *dst_ptr2;
-    int dst_stride = x->dst.y_stride;
-    unsigned char *base_dst = x->dst.y_buffer;
-
-
-    if (pbi->common.filter_level)
-        above_right = pbi->mt_yabove_row[mb_row] + mb_col*16 + 32 +16;
-    else
-        above_right = base_dst + x->block[0].offset - dst_stride + 16;
-
-    src_ptr = (unsigned int *)above_right;
-    /*dst_ptr0 = (unsigned int *)(above_right + 4 * x->block[0].dst_stride);
-    dst_ptr1 = (unsigned int *)(above_right + 8 * x->block[0].dst_stride);
-    dst_ptr2 = (unsigned int *)(above_right + 12 * x->block[0].dst_stride);*/
-    dst_ptr0 = (unsigned int *)(base_dst + x->block[0].offset + 16 + 3 * dst_stride);
-    dst_ptr1 = (unsigned int *)(base_dst + x->block[0].offset + 16 + 7 * dst_stride);
-    dst_ptr2 = (unsigned int *)(base_dst + x->block[0].offset + 16 + 11 * dst_stride);
-    *dst_ptr0 = *src_ptr;
-    *dst_ptr1 = *src_ptr;
-    *dst_ptr2 = *src_ptr;
-}
--- a/vp8/decoder/reconintra_mt.h
+++ /dev/null
@@ -1,26 +1,0 @@
-/*
- *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef __INC_RECONINTRA_MT_H
-#define __INC_RECONINTRA_MT_H
-
-/* reconintra functions used in multi-threaded decoder */
-#if CONFIG_MULTITHREAD
-extern void vp8mt_build_intra_predictors_mby(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col);
-extern void vp8mt_build_intra_predictors_mby_s(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col);
-extern void vp8mt_build_intra_predictors_mbuv(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col);
-extern void vp8mt_build_intra_predictors_mbuv_s(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col);
-
-extern void vp8mt_predict_intra4x4(VP8D_COMP *pbi, MACROBLOCKD *x, int b_mode, unsigned char *predictor, int stride, int mb_row, int mb_col, int num);
-extern void vp8mt_intra_prediction_down_copy(VP8D_COMP *pbi, MACROBLOCKD *x, int mb_row, int mb_col);
-#endif
-
-#endif
--- a/vp8/decoder/threading.c
+++ b/vp8/decoder/threading.c
@@ -22,8 +22,8 @@
 #include "vp8/common/extend.h"
 #include "vpx_ports/vpx_timer.h"
 #include "detokenize.h"
+#include "vp8/common/reconintra4x4.h"
 #include "vp8/common/reconinter.h"
-#include "reconintra_mt.h"
 #if CONFIG_ERROR_CONCEALMENT
 #include "error_concealment.h"
 #endif
@@ -85,7 +85,6 @@
 
 static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb_col)
 {
-    int eobtotal = 0;
     int throw_residual = 0;
     int i;
 
@@ -95,31 +94,11 @@
     }
     else if (!vp8dx_bool_error(xd->current_bc))
     {
+        int eobtotal;
         eobtotal = vp8_decode_mb_tokens(pbi, xd);
-    }
 
-    eobtotal |= (xd->mode_info_context->mbmi.mode == B_PRED ||
-                  xd->mode_info_context->mbmi.mode == SPLITMV);
-    if (!eobtotal && !vp8dx_bool_error(xd->current_bc))
-    {
-        /* Special case:  Force the loopfilter to skip when eobtotal and
-         * mb_skip_coeff are zero.
-         * */
-        xd->mode_info_context->mbmi.mb_skip_coeff = 1;
-
-        /*mt_skip_recon_mb(pbi, xd, mb_row, mb_col);*/
-        if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
-        {
-            vp8mt_build_intra_predictors_mbuv_s(pbi, xd, mb_row, mb_col);
-            vp8mt_build_intra_predictors_mby_s(pbi, xd, mb_row, mb_col);
-        }
-        else
-        {
-            vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer,
-                                               xd->dst.u_buffer, xd->dst.v_buffer,
-                                               xd->dst.y_stride, xd->dst.uv_stride);
-        }
-        return;
+        /* Special case:  Force the loopfilter to skip when eobtotal is zero */
+        xd->mode_info_context->mbmi.mb_skip_coeff = (eobtotal==0);
     }
 
     if (xd->segmentation_enabled)
@@ -128,14 +107,58 @@
     /* do prediction */
     if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
     {
-        vp8mt_build_intra_predictors_mbuv_s(pbi, xd, mb_row, mb_col);
+        if (pbi->common.filter_level)
+        {
+            unsigned char *uabove_row;
+            unsigned char *vabove_row;
+            unsigned char * uleft_col;
+            unsigned char * vleft_col;
+            uabove_row = pbi->mt_uabove_row[mb_row] + mb_col*8 +16;
+            vabove_row = pbi->mt_vabove_row[mb_row] + mb_col*8 +16;
+            uleft_col = pbi->mt_uleft_col[mb_row];
+            vleft_col = pbi->mt_vleft_col[mb_row];
+            vp8_build_intra_predictors_mbuv_s(xd, uabove_row,
+                                            vabove_row,
+                                            uleft_col,
+                                            vleft_col,
+                                            1,
+                                            xd->dst.u_buffer, xd->dst.v_buffer);
 
-        if (xd->mode_info_context->mbmi.mode != B_PRED)
+            if (xd->mode_info_context->mbmi.mode != B_PRED)
+            {
+                unsigned char *yabove_row;
+                unsigned char *yleft_col;
+
+                yabove_row = pbi->mt_yabove_row[mb_row] + mb_col*16 +32;
+                yleft_col = pbi->mt_yleft_col[mb_row];
+
+                vp8_build_intra_predictors_mby_s(xd,
+                                                     yabove_row,
+                                                     yleft_col,
+                                                     1,
+                                                     xd->dst.y_buffer);
+            }
+        }
+        else
         {
-            vp8mt_build_intra_predictors_mby_s(pbi, xd, mb_row, mb_col);
-        } else {
-            vp8mt_intra_prediction_down_copy(pbi, xd, mb_row, mb_col);
+            vp8_build_intra_predictors_mbuv_s(xd,
+                                        xd->dst.u_buffer - xd->dst.uv_stride,
+                                        xd->dst.v_buffer - xd->dst.uv_stride,
+                                        xd->dst.u_buffer - 1,
+                                        xd->dst.v_buffer - 1,
+                                        xd->dst.uv_stride,
+                                        xd->dst.u_buffer, xd->dst.v_buffer);
+
+            if (xd->mode_info_context->mbmi.mode != B_PRED)
+            {
+                vp8_build_intra_predictors_mby_s(xd,
+                                                     xd->dst.y_buffer - xd->dst.y_stride,
+                                                     xd->dst.y_buffer - 1,
+                                                     xd->dst.y_stride,
+                                                     xd->dst.y_buffer);
+            }
         }
+
     }
     else
     {
@@ -170,14 +193,51 @@
         short *DQC = xd->dequant_y1;
         int dst_stride = xd->dst.y_stride;
         unsigned char *base_dst = xd->dst.y_buffer;
+        unsigned char *above_right_src;
 
+        if (pbi->common.filter_level)
+            above_right_src = pbi->mt_yabove_row[mb_row] + mb_col*16 + 32 +16;
+        else
+            above_right_src = xd->dst.y_buffer - dst_stride + 16;
+
+        intra_prediction_down_copy(xd, above_right_src);
+
+
         for (i = 0; i < 16; i++)
         {
             BLOCKD *b = &xd->block[i];
             int b_mode = xd->mode_info_context->bmi[i].as_mode;
+            unsigned char *yabove;
+            unsigned char *yleft;
+            int left_stride;
+            unsigned char top_left;
 
-            vp8mt_predict_intra4x4(pbi, xd, b_mode, base_dst + b->offset,
-                                   dst_stride, mb_row, mb_col, i);
+            /*Caution: For some b_mode, it needs 8 pixels (4 above + 4 above-right).*/
+            if (i < 4 && pbi->common.filter_level)
+                yabove = pbi->mt_yabove_row[mb_row] + mb_col*16 + i*4 + 32;
+            else
+                yabove = base_dst + b->offset - dst_stride;
+
+            if (i%4==0 && pbi->common.filter_level)
+            {
+                yleft = pbi->mt_yleft_col[mb_row] + i;
+                left_stride = 1;
+            }
+            else
+            {
+                yleft = base_dst + b->offset - 1;
+                left_stride = dst_stride;
+            }
+
+            if ((i==4 || i==8 || i==12) && pbi->common.filter_level)
+                top_left = pbi->mt_yleft_col[mb_row][i-1];
+            else
+                top_left = yabove[-1];
+
+            vp8_intra4x4_predict_d_c(yabove, yleft, left_stride,
+                                   b_mode,
+                                   base_dst + b->offset, dst_stride,
+                                   top_left);
 
             if (xd->eobs[i] )
             {
--- a/vp8/encoder/encodeintra.c
+++ b/vp8/encoder/encodeintra.c
@@ -82,8 +82,8 @@
 {
     int i;
 
-    MACROBLOCKD *x = &mb->e_mbd;
-    vp8_intra_prediction_down_copy(x);
+    MACROBLOCKD *xd = &mb->e_mbd;
+    intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
 
     for (i = 0; i < 16; i++)
         vp8_encode_intra4x4block(mb, i);
@@ -95,7 +95,11 @@
     BLOCK *b = &x->block[0];
     MACROBLOCKD *xd = &x->e_mbd;
 
-    vp8_build_intra_predictors_mby_s(&x->e_mbd);
+    vp8_build_intra_predictors_mby_s(xd,
+                                         xd->dst.y_buffer - xd->dst.y_stride,
+                                         xd->dst.y_buffer - 1,
+                                         xd->dst.y_stride,
+                                         xd->dst.y_buffer);
 
     vp8_subtract_mby(x->src_diff, *(b->base_src),
         b->src_stride, xd->dst.y_buffer, xd->dst.y_stride);
@@ -112,7 +116,12 @@
 {
     MACROBLOCKD *xd = &x->e_mbd;
 
-    vp8_build_intra_predictors_mbuv_s(&x->e_mbd);
+    vp8_build_intra_predictors_mbuv_s(xd, xd->dst.u_buffer - xd->dst.uv_stride,
+                                      xd->dst.v_buffer - xd->dst.uv_stride,
+                                      xd->dst.u_buffer - 1,
+                                      xd->dst.v_buffer - 1,
+                                      xd->dst.uv_stride,
+                                      xd->dst.u_buffer, xd->dst.v_buffer);
 
     vp8_subtract_mbuv(x->src_diff, x->src.u_buffer,
         x->src.v_buffer, x->src.uv_stride, xd->dst.u_buffer,
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -184,7 +184,7 @@
     int distortion = 0;
     unsigned int *bmode_costs;
 
-    vp8_intra_prediction_down_copy(xd);
+    intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
 
     bmode_costs = mb->inter_bmode_costs;
 
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -701,7 +701,7 @@
     ta = (ENTROPY_CONTEXT *)&t_above;
     tl = (ENTROPY_CONTEXT *)&t_left;
 
-    vp8_intra_prediction_down_copy(xd);
+    intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
 
     bmode_costs = mb->inter_bmode_costs;
 
--- a/vp8/vp8dx.mk
+++ b/vp8/vp8dx.mk
@@ -60,7 +60,5 @@
 VP8_DX_SRCS-yes += decoder/treereader.h
 VP8_DX_SRCS-yes += decoder/onyxd_if.c
 VP8_DX_SRCS-$(CONFIG_MULTITHREAD) += decoder/threading.c
-VP8_DX_SRCS-$(CONFIG_MULTITHREAD) += decoder/reconintra_mt.h
-VP8_DX_SRCS-$(CONFIG_MULTITHREAD) += decoder/reconintra_mt.c
 
 VP8_DX_SRCS-yes := $(filter-out $(VP8_DX_SRCS_REMOVE-yes),$(VP8_DX_SRCS-yes))