1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "blockd.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan 16233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_intra4x4_predict_c(unsigned char *Above, 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *yleft, int left_stride, 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan int _b_mode, 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst, int dst_stride, 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char top_left) 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, r, c; 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan B_PREDICTION_MODE b_mode = (B_PREDICTION_MODE)_b_mode; 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char Left[4]; 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan Left[0] = yleft[0]; 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan Left[1] = yleft[left_stride]; 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan Left[2] = yleft[2 * left_stride]; 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan Left[3] = yleft[3 * left_stride]; 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (b_mode) 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_DC_PRED: 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan int expected_dc = 0; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 4; i++) 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan expected_dc += Above[i]; 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan expected_dc += Left[i]; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan expected_dc = (expected_dc + 4) >> 3; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 4; r++) 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (c = 0; c < 4; c++) 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[c] = expected_dc; 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_TM_PRED: 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* prediction similar to true_motion prediction */ 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 4; r++) 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (c = 0; c < 4; c++) 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pred = Above[c] - top_left + Left[r]; 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pred < 0) 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred = 0; 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pred > 255) 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred = 255; 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[c] = pred; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_VE_PRED: 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int ap[4]; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan ap[0] = (top_left + 2 * Above[0] + Above[1] + 2) >> 2; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2; 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2; 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 4; r++) 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (c = 0; c < 4; c++) 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[c] = ap[c]; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_HE_PRED: 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int lp[4]; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2; 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2; 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < 4; r++) 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (c = 0; c < 4; c++) 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[c] = lp[r]; 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst += dst_stride; 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_LD_PRED: 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ptr = Above; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 1] = 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 2] = 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 1] = 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 3] = 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 2] = 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 1] = 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2; 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 3] = 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 2] = 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2; 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 3] = 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2; 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2; 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_RD_PRED: 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char pp[9]; 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[0] = Left[3]; 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[1] = Left[2]; 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[2] = Left[1]; 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[3] = Left[0]; 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[4] = top_left; 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[5] = Above[0]; 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[6] = Above[1]; 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[7] = Above[2]; 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[8] = Above[3]; 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 1] = 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 2] = 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 1] = 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 3] = 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 2] = 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 1] = 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 3] = 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 2] = 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 3] = 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2; 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_VR_PRED: 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char pp[9]; 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[0] = Left[3]; 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[1] = Left[2]; 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[2] = Left[1]; 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[3] = Left[0]; 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[4] = top_left; 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[5] = Above[0]; 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[6] = Above[1]; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[7] = Above[2]; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[8] = Above[3]; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 1] = 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 1] = 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 0] = (pp[4] + pp[5] + 1) >> 1; 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 2] = 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 2] = 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 1] = (pp[5] + pp[6] + 1) >> 1; 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 3] = 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 3] = 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 2] = (pp[6] + pp[7] + 1) >> 1; 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2; 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 3] = (pp[7] + pp[8] + 1) >> 1; 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_VL_PRED: 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *pp = Above; 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1; 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 0] = 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 1] = (pp[1] + pp[2] + 1) >> 1; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 1] = 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 1] = 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 2] = (pp[2] + pp[3] + 1) >> 1; 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 1] = 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 3] = 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 2] = (pp[3] + pp[4] + 1) >> 1; 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 3] = 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_HD_PRED: 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char pp[9]; 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[0] = Left[3]; 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[1] = Left[2]; 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[2] = Left[1]; 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[3] = Left[0]; 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[4] = top_left; 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[5] = Above[0]; 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[6] = Above[1]; 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[7] = Above[2]; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan pp[8] = Above[3]; 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1; 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 0] = 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 2] = (pp[1] + pp[2] + 1) >> 1; 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 1] = 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 2] = 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1; 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 3] = 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2; 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 2] = 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 0] = (pp[3] + pp[4] + 1) >> 1; 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 3] = 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2; 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2; 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2; 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 268233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_HU_PRED: 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *pp = Left; 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1; 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2; 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 2] = 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 0] = (pp[1] + pp[2] + 1) >> 1; 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[0 * dst_stride + 3] = 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2; 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 2] = 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1; 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[1 * dst_stride + 3] = 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2; 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 2] = 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[2 * dst_stride + 3] = 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 0] = 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 1] = 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 2] = 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst[3 * dst_stride + 3] = pp[3]; 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 298