/* * 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_ports/config.h" #include "vp8/common/reconintra.h" #include "vpx_mem/vpx_mem.h" #include "onyxd_int.h" /* For skip_recon_mb(), add vp9_build_intra_predictors_mby_s(MACROBLOCKD *xd) * and vp9_build_intra_predictors_mbuv_s(MACROBLOCKD *xd). */ void vp8mt_build_intra_predictors_mby(VP8D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb_col) { unsigned char *yabove_row; /* = xd->dst.y_buffer - xd->dst.y_stride; */ unsigned char *yleft_col; unsigned char yleft_buf[16]; unsigned char ytop_left; /* = yabove_row[-1]; */ unsigned char *ypred_ptr = xd->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 = xd->dst.y_buffer - xd->dst.y_stride; for (i = 0; i < 16; i++) yleft_buf[i] = xd->dst.y_buffer [i * xd->dst.y_stride - 1]; yleft_col = yleft_buf; } ytop_left = yabove_row[-1]; /* for Y */ switch (xd->mode_info_context->mbmi.mode) { case DC_PRED: { int expected_dc; int i; int shift; int average = 0; if (xd->up_available || xd->left_available) { if (xd->up_available) { for (i = 0; i < 16; i++) { average += yabove_row[i]; } } if (xd->left_available) { for (i = 0; i < 16; i++) { average += yleft_col[i]; } } shift = 3 + xd->up_available + xd->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 *xd, int mb_row, int mb_col) { unsigned char *yabove_row; /* = xd->dst.y_buffer - xd->dst.y_stride; */ unsigned char *yleft_col; unsigned char yleft_buf[16]; unsigned char ytop_left; /* = yabove_row[-1]; */ unsigned char *ypred_ptr = xd->predictor; int r, c, i; int y_stride = xd->dst.y_stride; ypred_ptr = xd->dst.y_buffer; /*xd->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 = xd->dst.y_buffer - xd->dst.y_stride; for (i = 0; i < 16; i++) yleft_buf[i] = xd->dst.y_buffer [i * xd->dst.y_stride - 1]; yleft_col = yleft_buf; } ytop_left = yabove_row[-1]; /* for Y */ switch (xd->mode_info_context->mbmi.mode) { case DC_PRED: { int expected_dc; int i; int shift; int average = 0; if (xd->up_available || xd->left_available) { if (xd->up_available) { for (i = 0; i < 16; i++) { average += yabove_row[i]; } } if (xd->left_available) { for (i = 0; i < 16; i++) { average += yleft_col[i]; } } shift = 3 + xd->up_available + xd->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 *xd, int mb_row, int mb_col) { unsigned char *uabove_row; /* = xd->dst.u_buffer - xd->dst.uv_stride; */ unsigned char *uleft_col; /*[16];*/ unsigned char uleft_buf[8]; unsigned char utop_left; /* = uabove_row[-1]; */ unsigned char *vabove_row; /* = xd->dst.v_buffer - xd->dst.uv_stride; */ unsigned char *vleft_col; /*[20];*/ unsigned char vleft_buf[8]; unsigned char vtop_left; /* = vabove_row[-1]; */ unsigned char *upred_ptr = &xd->predictor[256]; unsigned char *vpred_ptr = &xd->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 = xd->dst.u_buffer - xd->dst.uv_stride; vabove_row = xd->dst.v_buffer - xd->dst.uv_stride; for (i = 0; i < 8; i++) { uleft_buf[i] = xd->dst.u_buffer [i * xd->dst.uv_stride - 1]; vleft_buf[i] = xd->dst.v_buffer [i * xd->dst.uv_stride - 1]; } uleft_col = uleft_buf; vleft_col = vleft_buf; } utop_left = uabove_row[-1]; vtop_left = vabove_row[-1]; switch (xd->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 (xd->up_available) { for (i = 0; i < 8; i++) { Uaverage += uabove_row[i]; Vaverage += vabove_row[i]; } } if (xd->left_available) { for (i = 0; i < 8; i++) { Uaverage += uleft_col[i]; Vaverage += vleft_col[i]; } } if (!xd->up_available && !xd->left_available) { expected_udc = 128; expected_vdc = 128; } else { shift = 2 + xd->up_available + xd->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 *xd, int mb_row, int mb_col) { unsigned char *uabove_row; /* = xd->dst.u_buffer - xd->dst.uv_stride; */ unsigned char *uleft_col; /*[16];*/ unsigned char uleft_buf[8]; unsigned char utop_left; /* = uabove_row[-1]; */ unsigned char *vabove_row; /* = xd->dst.v_buffer - xd->dst.uv_stride; */ unsigned char *vleft_col; /*[20];*/ unsigned char vleft_buf[8]; unsigned char vtop_left; /* = vabove_row[-1]; */ unsigned char *upred_ptr = xd->dst.u_buffer; /*&xd->predictor[256];*/ unsigned char *vpred_ptr = xd->dst.v_buffer; /*&xd->predictor[320];*/ int uv_stride = xd->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 = xd->dst.u_buffer - xd->dst.uv_stride; vabove_row = xd->dst.v_buffer - xd->dst.uv_stride; for (i = 0; i < 8; i++) { uleft_buf[i] = xd->dst.u_buffer [i * xd->dst.uv_stride - 1]; vleft_buf[i] = xd->dst.v_buffer [i * xd->dst.uv_stride - 1]; } uleft_col = uleft_buf; vleft_col = vleft_buf; } utop_left = uabove_row[-1]; vtop_left = vabove_row[-1]; switch (xd->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 (xd->up_available) { for (i = 0; i < 8; i++) { Uaverage += uabove_row[i]; Vaverage += vabove_row[i]; } } if (xd->left_available) { for (i = 0; i < 8; i++) { Uaverage += uleft_col[i]; Vaverage += vleft_col[i]; } } if (!xd->up_available && !xd->left_available) { expected_udc = 128; expected_vdc = 128; } else { shift = 2 + xd->up_available + xd->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 mb_row, int mb_col, int num) { int i, r, c; unsigned char *Above; /* = *(xd->base_dst) + xd->dst - xd->dst_stride; */ unsigned char Left[4]; unsigned char top_left; /* = Above[-1]; */ BLOCKD *blockd = &xd->block[num]; /*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 = *(blockd->base_dst) + blockd->dst - blockd->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] = (*(blockd->base_dst))[blockd->dst - 1]; Left[1] = (*(blockd->base_dst))[blockd->dst - 1 + blockd->dst_stride]; Left[2] = (*(blockd->base_dst))[blockd->dst - 1 + 2 * blockd->dst_stride]; Left[3] = (*(blockd->base_dst))[blockd->dst - 1 + 3 * blockd->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 += 16; } } 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 += 16; } } 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 += 16; } } 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 += 16; } } break; case B_LD_PRED: { unsigned char *ptr = Above; predictor[0 * 16 + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2; predictor[0 * 16 + 1] = predictor[1 * 16 + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2; predictor[0 * 16 + 2] = predictor[1 * 16 + 1] = predictor[2 * 16 + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2; predictor[0 * 16 + 3] = predictor[1 * 16 + 2] = predictor[2 * 16 + 1] = predictor[3 * 16 + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2; predictor[1 * 16 + 3] = predictor[2 * 16 + 2] = predictor[3 * 16 + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2; predictor[2 * 16 + 3] = predictor[3 * 16 + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2; predictor[3 * 16 + 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 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; predictor[3 * 16 + 1] = predictor[2 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; predictor[3 * 16 + 2] = predictor[2 * 16 + 1] = predictor[1 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; predictor[3 * 16 + 3] = predictor[2 * 16 + 2] = predictor[1 * 16 + 1] = predictor[0 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; predictor[2 * 16 + 3] = predictor[1 * 16 + 2] = predictor[0 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; predictor[1 * 16 + 3] = predictor[0 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; predictor[0 * 16 + 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 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; predictor[2 * 16 + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; predictor[3 * 16 + 1] = predictor[1 * 16 + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; predictor[2 * 16 + 1] = predictor[0 * 16 + 0] = (pp[4] + pp[5] + 1) >> 1; predictor[3 * 16 + 2] = predictor[1 * 16 + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; predictor[2 * 16 + 2] = predictor[0 * 16 + 1] = (pp[5] + pp[6] + 1) >> 1; predictor[3 * 16 + 3] = predictor[1 * 16 + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; predictor[2 * 16 + 3] = predictor[0 * 16 + 2] = (pp[6] + pp[7] + 1) >> 1; predictor[1 * 16 + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2; predictor[0 * 16 + 3] = (pp[7] + pp[8] + 1) >> 1; } break; case B_VL_PRED: { unsigned char *pp = Above; predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; predictor[1 * 16 + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; predictor[2 * 16 + 0] = predictor[0 * 16 + 1] = (pp[1] + pp[2] + 1) >> 1; predictor[1 * 16 + 1] = predictor[3 * 16 + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; predictor[2 * 16 + 1] = predictor[0 * 16 + 2] = (pp[2] + pp[3] + 1) >> 1; predictor[3 * 16 + 1] = predictor[1 * 16 + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; predictor[0 * 16 + 3] = predictor[2 * 16 + 2] = (pp[3] + pp[4] + 1) >> 1; predictor[1 * 16 + 3] = predictor[3 * 16 + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; predictor[2 * 16 + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; predictor[3 * 16 + 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 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; predictor[3 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; predictor[2 * 16 + 0] = predictor[3 * 16 + 2] = (pp[1] + pp[2] + 1) >> 1; predictor[2 * 16 + 1] = predictor[3 * 16 + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; predictor[2 * 16 + 2] = predictor[1 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1; predictor[2 * 16 + 3] = predictor[1 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; predictor[1 * 16 + 2] = predictor[0 * 16 + 0] = (pp[3] + pp[4] + 1) >> 1; predictor[1 * 16 + 3] = predictor[0 * 16 + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; predictor[0 * 16 + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; predictor[0 * 16 + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; } break; case B_HU_PRED: { unsigned char *pp = Left; predictor[0 * 16 + 0] = (pp[0] + pp[1] + 1) >> 1; predictor[0 * 16 + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; predictor[0 * 16 + 2] = predictor[1 * 16 + 0] = (pp[1] + pp[2] + 1) >> 1; predictor[0 * 16 + 3] = predictor[1 * 16 + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; predictor[1 * 16 + 2] = predictor[2 * 16 + 0] = (pp[2] + pp[3] + 1) >> 1; predictor[1 * 16 + 3] = predictor[2 * 16 + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2; predictor[2 * 16 + 2] = predictor[2 * 16 + 3] = predictor[3 * 16 + 0] = predictor[3 * 16 + 1] = predictor[3 * 16 + 2] = predictor[3 * 16 + 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 *xd, int mb_row, int mb_col) { unsigned char *above_right; // = *(xd->block[0].base_dst) + // xd->block[0].dst - // xd->block[0].dst_stride + 16; */ unsigned int *src_ptr; unsigned int *dst_ptr0; unsigned int *dst_ptr1; unsigned int *dst_ptr2; if (pbi->common.filter_level) above_right = pbi->mt_yabove_row[mb_row] + mb_col * 16 + 32 + 16; else above_right = *(xd->block[0].base_dst) + xd->block[0].dst - xd->block[0].dst_stride + 16; src_ptr = (unsigned int *)above_right; /*dst_ptr0 = (unsigned int *)(above_right + 4 * xd->block[0].dst_stride); dst_ptr1 = (unsigned int *)(above_right + 8 * xd->block[0].dst_stride); dst_ptr2 = (unsigned int *)(above_right + 12 * xd->block[0].dst_stride);*/ dst_ptr0 = (unsigned int *)(*(xd->block[0].base_dst) + xd->block[0].dst + 16 + 3 * xd->block[0].dst_stride); dst_ptr1 = (unsigned int *)(*(xd->block[0].base_dst) + xd->block[0].dst + 16 + 7 * xd->block[0].dst_stride); dst_ptr2 = (unsigned int *)(*(xd->block[0].base_dst) + xd->block[0].dst + 16 + 11 * xd->block[0].dst_stride); *dst_ptr0 = *src_ptr; *dst_ptr1 = *src_ptr; *dst_ptr2 = *src_ptr; }