reconintra_mt.c 23.01 KiB
/*
 *  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 vp8_build_intra_predictors_mby_s(MACROBLOCKD *xd)
 * and vp8_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;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
} 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;
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
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++) {
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
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];
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
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;
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
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: {
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
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++) {
491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
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];
561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
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;
631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
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];
701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
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] =
771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
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;
841842843844
*dst_ptr1 = *src_ptr; *dst_ptr2 = *src_ptr; }