summaryrefslogtreecommitdiff
path: root/vp8/common/reconintra.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/common/reconintra.c')
-rw-r--r--vp8/common/reconintra.c184
1 files changed, 45 insertions, 139 deletions
diff --git a/vp8/common/reconintra.c b/vp8/common/reconintra.c
index 13da4b6bb..ad2aaeaa2 100644
--- a/vp8/common/reconintra.c
+++ b/vp8/common/reconintra.c
@@ -17,22 +17,32 @@
#include "blockd.h"
#include "vp8/common/reconintra.h"
+enum {
+ SIZE_16,
+ SIZE_8,
+ NUM_SIZES,
+};
+
typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride,
const uint8_t *above, const uint8_t *left);
-static intra_pred_fn pred[4];
-static intra_pred_fn dc_pred[2][2];
+static intra_pred_fn pred[4][NUM_SIZES];
+static intra_pred_fn dc_pred[2][2][NUM_SIZES];
static void vp8_init_intra_predictors_internal(void)
{
- pred[V_PRED] = vpx_v_predictor_16x16;
- pred[H_PRED] = vpx_h_predictor_16x16;
- pred[TM_PRED] = vpx_tm_predictor_16x16;
-
- dc_pred[0][0] = vpx_dc_128_predictor_16x16;
- dc_pred[0][1] = vpx_dc_top_predictor_16x16;
- dc_pred[1][0] = vpx_dc_left_predictor_16x16;
- dc_pred[1][1] = vpx_dc_predictor_16x16;
+#define INIT_SIZE(sz) \
+ pred[V_PRED][SIZE_##sz] = vpx_v_predictor_##sz##x##sz; \
+ pred[H_PRED][SIZE_##sz] = vpx_h_predictor_##sz##x##sz; \
+ pred[TM_PRED][SIZE_##sz] = vpx_tm_predictor_##sz##x##sz; \
+ \
+ dc_pred[0][0][SIZE_##sz] = vpx_dc_128_predictor_##sz##x##sz; \
+ dc_pred[0][1][SIZE_##sz] = vpx_dc_top_predictor_##sz##x##sz; \
+ dc_pred[1][0][SIZE_##sz] = vpx_dc_left_predictor_##sz##x##sz; \
+ dc_pred[1][1][SIZE_##sz] = vpx_dc_predictor_##sz##x##sz
+
+ INIT_SIZE(16);
+ INIT_SIZE(8);
}
void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x,
@@ -45,6 +55,7 @@ void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x,
MB_PREDICTION_MODE mode = x->mode_info_context->mbmi.mode;
unsigned char yleft_col[16];
int i;
+ intra_pred_fn fn;
for (i = 0; i < 16; i++)
{
@@ -53,154 +64,49 @@ void vp8_build_intra_predictors_mby_s(MACROBLOCKD *x,
if (mode == DC_PRED)
{
- dc_pred[x->left_available][x->up_available](ypred_ptr, y_stride,
- yabove_row, yleft_col);
+ fn = dc_pred[x->left_available][x->up_available][SIZE_16];
}
else
{
- pred[mode](ypred_ptr, y_stride, yabove_row, yleft_col);
+ fn = pred[mode][SIZE_16];
}
+
+ fn(ypred_ptr, y_stride, yabove_row, yleft_col);
}
-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,
- int pred_stride)
+void vp8_build_intra_predictors_mbuv_s(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,
+ int pred_stride)
{
+ MB_PREDICTION_MODE uvmode = x->mode_info_context->mbmi.uv_mode;
unsigned char uleft_col[8];
- unsigned char utop_left = uabove_row[-1];
unsigned char vleft_col[8];
- unsigned char vtop_left = vabove_row[-1];
-
- int i, j;
+ int i;
+ intra_pred_fn fn;
for (i = 0; i < 8; i++)
{
- uleft_col[i] = uleft [i* left_stride];
- vleft_col[i] = vleft [i* left_stride];
+ uleft_col[i] = uleft[i * left_stride];
+ vleft_col[i] = vleft[i * left_stride];
}
- switch (x->mode_info_context->mbmi.uv_mode)
- {
- case DC_PRED:
+ if (uvmode == DC_PRED)
{
- int expected_udc;
- int expected_vdc;
- 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;
- }
-
-
- /*memset(upred_ptr,expected_udc,64);*/
- /*memset(vpred_ptr,expected_vdc,64);*/
- for (i = 0; i < 8; i++)
- {
- memset(upred_ptr, expected_udc, 8);
- memset(vpred_ptr, expected_vdc, 8);
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
+ fn = dc_pred[x->left_available][x->up_available][SIZE_8];
}
- break;
- case V_PRED:
- {
- for (i = 0; i < 8; i++)
- {
- memcpy(upred_ptr, uabove_row, 8);
- memcpy(vpred_ptr, vabove_row, 8);
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
-
- }
- break;
- case H_PRED:
+ else
{
- for (i = 0; i < 8; i++)
- {
- memset(upred_ptr, uleft_col[i], 8);
- memset(vpred_ptr, vleft_col[i], 8);
- upred_ptr += pred_stride;
- vpred_ptr += pred_stride;
- }
+ fn = pred[uvmode][SIZE_8];
}
- break;
- case TM_PRED:
- {
- 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 += pred_stride;
- vpred_ptr += pred_stride;
- }
-
- }
- break;
- case B_PRED:
- case NEARESTMV:
- case NEARMV:
- case ZEROMV:
- case NEWMV:
- case SPLITMV:
- case MB_MODE_COUNT:
- break;
- }
+ fn(upred_ptr, pred_stride, uabove_row, uleft_col);
+ fn(vpred_ptr, pred_stride, vabove_row, vleft_col);
}
void vp8_init_intra_predictors(void)