ref: bcba86e2e9c03da484addb984db40ff61bd21569
parent: f2bd11faa40cd55b3a8a02fea6f64ff0a9124df8
author: Scott LaVarnway <slavarnway@google.com>
date: Tue Feb 28 09:12:30 EST 2012
Eliminated reconintra_mt.c Reworked the code to use vp8_build_intra_predictors_mby_s, vp8_intra_prediction_down_copy, and vp8_intra4x4_predict_d_c functions instead. vp8_intra4x4_predict_d_c is a decoder-only version of vp8_intra4x4_predict. Future commits will fix this code duplication. Change-Id: Ifb4507103b7c83f8b94a872345191c49240154f5
--- 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 */
--- 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,8 +125,8 @@
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
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -166,7 +166,11 @@
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
{
@@ -178,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,492 +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"
-
-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_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,23 +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_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;
@@ -124,6 +123,21 @@
vleft_col,
1,
xd->dst.u_buffer, xd->dst.v_buffer);
+
+ 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
{
@@ -134,14 +148,17 @@
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)
- {
- vp8mt_build_intra_predictors_mby_s(pbi, xd, mb_row, mb_col);
- } else {
- vp8mt_intra_prediction_down_copy(pbi, xd, mb_row, mb_col);
+ 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
{
@@ -176,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);
--- 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))
--
⑨