| Index: source/libvpx/vp9/common/vp9_reconintra.c
|
| ===================================================================
|
| --- source/libvpx/vp9/common/vp9_reconintra.c (revision 177019)
|
| +++ source/libvpx/vp9/common/vp9_reconintra.c (working copy)
|
| @@ -9,7 +9,7 @@
|
| */
|
|
|
| #include <stdio.h>
|
| -#include "vpx_ports/config.h"
|
| +#include "./vpx_config.h"
|
| #include "vp9_rtcd.h"
|
| #include "vp9/common/vp9_reconintra.h"
|
| #include "vpx_mem/vpx_mem.h"
|
| @@ -124,18 +124,20 @@
|
| }
|
| }
|
| for (c = 0; c <= r; ++c) {
|
| - int yabove_ext = yabove_row[r]; // 2*yabove_row[r] - yabove_row[r-1];
|
| - int yleft_ext = yleft_col[r]; // 2*yleft_col[r] - yleft_col[r-1];
|
| - yabove_ext = (yabove_ext > 255 ? 255 : (yabove_ext < 0 ? 0 : yabove_ext));
|
| - yleft_ext = (yleft_ext > 255 ? 255 : (yleft_ext < 0 ? 0 : yleft_ext));
|
| + int yabove_ext = yabove_row[r]; // clip_pixel(2 * yabove_row[r] -
|
| + // yabove_row[r - 1]);
|
| + int yleft_ext = yleft_col[r]; // clip_pixel(2 * yleft_col[r] -
|
| + // yleft_col[r-1]);
|
| ypred_ptr[(r - c) * y_stride + c] =
|
| (yabove_ext * (c + 1) +
|
| yleft_ext * (r - c + 1) + r / 2 + 1) / (r + 2);
|
| }
|
| for (r = 1; r < n; ++r) {
|
| - for (c = n - r; c < n; ++c)
|
| - ypred_ptr[r * y_stride + c] = (ypred_ptr[(r - 1) * y_stride + c] +
|
| - ypred_ptr[r * y_stride + c - 1] + 1) >> 1;
|
| + for (c = n - r; c < n; ++c) {
|
| + const int yabove_ext = ypred_ptr[(r - 1) * y_stride + c];
|
| + const int yleft_ext = ypred_ptr[r * y_stride + c - 1];
|
| + ypred_ptr[r * y_stride + c] = (yabove_ext + yleft_ext + 1) >> 1;
|
| + }
|
| }
|
| }
|
|
|
| @@ -196,9 +198,9 @@
|
| }
|
| }
|
|
|
| -static void corner_predictor(unsigned char *ypred_ptr, int y_stride, int n,
|
| - unsigned char *yabove_row,
|
| - unsigned char *yleft_col) {
|
| +static void corner_predictor(uint8_t *ypred_ptr, int y_stride, int n,
|
| + uint8_t *yabove_row,
|
| + uint8_t *yleft_col) {
|
| int mh, mv, maxgradh, maxgradv, x, y, nx, ny;
|
| int i, j;
|
| int top_left = yabove_row[-1];
|
| @@ -246,14 +248,14 @@
|
| }
|
| }
|
|
|
| -void vp9_build_intra_predictors_internal(unsigned char *src, int src_stride,
|
| - unsigned char *ypred_ptr,
|
| +void vp9_build_intra_predictors_internal(uint8_t *src, int src_stride,
|
| + uint8_t *ypred_ptr,
|
| int y_stride, int mode, int bsize,
|
| int up_available, int left_available) {
|
|
|
| - unsigned char *yabove_row = src - src_stride;
|
| - unsigned char yleft_col[32];
|
| - unsigned char ytop_left = yabove_row[-1];
|
| + uint8_t *yabove_row = src - src_stride;
|
| + uint8_t yleft_col[64];
|
| + uint8_t ytop_left = yabove_row[-1];
|
| int r, c, i;
|
|
|
| for (i = 0; i < bsize; i++) {
|
| @@ -269,15 +271,19 @@
|
| int average = 0;
|
| int log2_bsize_minus_1;
|
|
|
| - assert(bsize == 4 || bsize == 8 || bsize == 16 || bsize == 32);
|
| + assert(bsize == 4 || bsize == 8 || bsize == 16 || bsize == 32 ||
|
| + bsize == 64);
|
| if (bsize == 4) {
|
| log2_bsize_minus_1 = 1;
|
| } else if (bsize == 8) {
|
| log2_bsize_minus_1 = 2;
|
| } else if (bsize == 16) {
|
| log2_bsize_minus_1 = 3;
|
| - } else /* bsize == 32 */ {
|
| + } else if (bsize == 32) {
|
| log2_bsize_minus_1 = 4;
|
| + } else {
|
| + assert(bsize == 64);
|
| + log2_bsize_minus_1 = 5;
|
| }
|
|
|
| if (up_available || left_available) {
|
| @@ -321,15 +327,7 @@
|
| case TM_PRED: {
|
| for (r = 0; r < bsize; r++) {
|
| for (c = 0; c < bsize; 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[c] = clip_pixel(yleft_col[r] + yabove_row[c] - ytop_left);
|
| }
|
|
|
| ypred_ptr += y_stride;
|
| @@ -374,9 +372,9 @@
|
|
|
| #if CONFIG_COMP_INTERINTRA_PRED
|
| static void combine_interintra(MB_PREDICTION_MODE mode,
|
| - unsigned char *interpred,
|
| + uint8_t *interpred,
|
| int interstride,
|
| - unsigned char *intrapred,
|
| + uint8_t *intrapred,
|
| int intrastride,
|
| int size) {
|
| // TODO(debargha): Explore different ways of combining predictors
|
| @@ -523,16 +521,17 @@
|
| 71, 70, 70, 70, 69, 69, 69, 68,
|
| 68, 68, 68, 68, 67, 67, 67, 67,
|
| };
|
| - int size_scale = (size == 32 ? 1 :
|
| + int size_scale = (size >= 32 ? 1 :
|
| size == 16 ? 2 :
|
| size == 8 ? 4 : 8);
|
| + int size_shift = size == 64 ? 1 : 0;
|
| int i, j;
|
| switch (mode) {
|
| case V_PRED:
|
| for (i = 0; i < size; ++i) {
|
| for (j = 0; j < size; ++j) {
|
| int k = i * interstride + j;
|
| - int scale = weights1d[i * size_scale];
|
| + int scale = weights1d[i * size_scale >> size_shift];
|
| interpred[k] =
|
| ((scale_max - scale) * interpred[k] +
|
| scale * intrapred[i * intrastride + j] + scale_round)
|
| @@ -545,7 +544,7 @@
|
| for (i = 0; i < size; ++i) {
|
| for (j = 0; j < size; ++j) {
|
| int k = i * interstride + j;
|
| - int scale = weights1d[j * size_scale];
|
| + int scale = weights1d[j * size_scale >> size_shift];
|
| interpred[k] =
|
| ((scale_max - scale) * interpred[k] +
|
| scale * intrapred[i * intrastride + j] + scale_round)
|
| @@ -559,8 +558,9 @@
|
| for (i = 0; i < size; ++i) {
|
| for (j = 0; j < size; ++j) {
|
| int k = i * interstride + j;
|
| - int scale = (weights2d[i * size_scale * 32 + j * size_scale] +
|
| - weights1d[i * size_scale]) >> 1;
|
| + int scale = (weights2d[(i * size_scale * 32 +
|
| + j * size_scale) >> size_shift] +
|
| + weights1d[i * size_scale >> size_shift]) >> 1;
|
| interpred[k] =
|
| ((scale_max - scale) * interpred[k] +
|
| scale * intrapred[i * intrastride + j] + scale_round)
|
| @@ -574,8 +574,9 @@
|
| for (i = 0; i < size; ++i) {
|
| for (j = 0; j < size; ++j) {
|
| int k = i * interstride + j;
|
| - int scale = (weights2d[i * size_scale * 32 + j * size_scale] +
|
| - weights1d[j * size_scale]) >> 1;
|
| + int scale = (weights2d[(i * size_scale * 32 +
|
| + j * size_scale) >> size_shift] +
|
| + weights1d[j * size_scale >> size_shift]) >> 1;
|
| interpred[k] =
|
| ((scale_max - scale) * interpred[k] +
|
| scale * intrapred[i * intrastride + j] + scale_round)
|
| @@ -588,7 +589,8 @@
|
| for (i = 0; i < size; ++i) {
|
| for (j = 0; j < size; ++j) {
|
| int k = i * interstride + j;
|
| - int scale = weights2d[i * size_scale * 32 + j * size_scale];
|
| + int scale = weights2d[(i * size_scale * 32 +
|
| + j * size_scale) >> size_shift];
|
| interpred[k] =
|
| ((scale_max - scale) * interpred[k] +
|
| scale * intrapred[i * intrastride + j] + scale_round)
|
| @@ -613,18 +615,18 @@
|
| }
|
|
|
| void vp9_build_interintra_16x16_predictors_mb(MACROBLOCKD *xd,
|
| - unsigned char *ypred,
|
| - unsigned char *upred,
|
| - unsigned char *vpred,
|
| + uint8_t *ypred,
|
| + uint8_t *upred,
|
| + uint8_t *vpred,
|
| int ystride, int uvstride) {
|
| vp9_build_interintra_16x16_predictors_mby(xd, ypred, ystride);
|
| vp9_build_interintra_16x16_predictors_mbuv(xd, upred, vpred, uvstride);
|
| }
|
|
|
| void vp9_build_interintra_16x16_predictors_mby(MACROBLOCKD *xd,
|
| - unsigned char *ypred,
|
| + uint8_t *ypred,
|
| int ystride) {
|
| - unsigned char intrapredictor[256];
|
| + uint8_t intrapredictor[256];
|
| vp9_build_intra_predictors_internal(
|
| xd->dst.y_buffer, xd->dst.y_stride,
|
| intrapredictor, 16,
|
| @@ -635,11 +637,11 @@
|
| }
|
|
|
| void vp9_build_interintra_16x16_predictors_mbuv(MACROBLOCKD *xd,
|
| - unsigned char *upred,
|
| - unsigned char *vpred,
|
| + uint8_t *upred,
|
| + uint8_t *vpred,
|
| int uvstride) {
|
| - unsigned char uintrapredictor[64];
|
| - unsigned char vintrapredictor[64];
|
| + uint8_t uintrapredictor[64];
|
| + uint8_t vintrapredictor[64];
|
| vp9_build_intra_predictors_internal(
|
| xd->dst.u_buffer, xd->dst.uv_stride,
|
| uintrapredictor, 8,
|
| @@ -656,11 +658,10 @@
|
| vpred, uvstride, vintrapredictor, 8, 8);
|
| }
|
|
|
| -#if CONFIG_SUPERBLOCKS
|
| void vp9_build_interintra_32x32_predictors_sby(MACROBLOCKD *xd,
|
| - unsigned char *ypred,
|
| + uint8_t *ypred,
|
| int ystride) {
|
| - unsigned char intrapredictor[1024];
|
| + uint8_t intrapredictor[1024];
|
| vp9_build_intra_predictors_internal(
|
| xd->dst.y_buffer, xd->dst.y_stride,
|
| intrapredictor, 32,
|
| @@ -671,11 +672,11 @@
|
| }
|
|
|
| void vp9_build_interintra_32x32_predictors_sbuv(MACROBLOCKD *xd,
|
| - unsigned char *upred,
|
| - unsigned char *vpred,
|
| + uint8_t *upred,
|
| + uint8_t *vpred,
|
| int uvstride) {
|
| - unsigned char uintrapredictor[256];
|
| - unsigned char vintrapredictor[256];
|
| + uint8_t uintrapredictor[256];
|
| + uint8_t vintrapredictor[256];
|
| vp9_build_intra_predictors_internal(
|
| xd->dst.u_buffer, xd->dst.uv_stride,
|
| uintrapredictor, 16,
|
| @@ -693,17 +694,57 @@
|
| }
|
|
|
| void vp9_build_interintra_32x32_predictors_sb(MACROBLOCKD *xd,
|
| - unsigned char *ypred,
|
| - unsigned char *upred,
|
| - unsigned char *vpred,
|
| + uint8_t *ypred,
|
| + uint8_t *upred,
|
| + uint8_t *vpred,
|
| int ystride,
|
| int uvstride) {
|
| vp9_build_interintra_32x32_predictors_sby(xd, ypred, ystride);
|
| vp9_build_interintra_32x32_predictors_sbuv(xd, upred, vpred, uvstride);
|
| }
|
| -#endif
|
| -#endif
|
|
|
| +void vp9_build_interintra_64x64_predictors_sby(MACROBLOCKD *xd,
|
| + uint8_t *ypred,
|
| + int ystride) {
|
| + uint8_t intrapredictor[4096];
|
| + const int mode = xd->mode_info_context->mbmi.interintra_mode;
|
| + vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
|
| + intrapredictor, 64, mode, 64,
|
| + xd->up_available, xd->left_available);
|
| + combine_interintra(xd->mode_info_context->mbmi.interintra_mode,
|
| + ypred, ystride, intrapredictor, 64, 64);
|
| +}
|
| +
|
| +void vp9_build_interintra_64x64_predictors_sbuv(MACROBLOCKD *xd,
|
| + uint8_t *upred,
|
| + uint8_t *vpred,
|
| + int uvstride) {
|
| + uint8_t uintrapredictor[1024];
|
| + uint8_t vintrapredictor[1024];
|
| + const int mode = xd->mode_info_context->mbmi.interintra_uv_mode;
|
| + vp9_build_intra_predictors_internal(xd->dst.u_buffer, xd->dst.uv_stride,
|
| + uintrapredictor, 32, mode, 32,
|
| + xd->up_available, xd->left_available);
|
| + vp9_build_intra_predictors_internal(xd->dst.v_buffer, xd->dst.uv_stride,
|
| + vintrapredictor, 32, mode, 32,
|
| + xd->up_available, xd->left_available);
|
| + combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode,
|
| + upred, uvstride, uintrapredictor, 32, 32);
|
| + combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode,
|
| + vpred, uvstride, vintrapredictor, 32, 32);
|
| +}
|
| +
|
| +void vp9_build_interintra_64x64_predictors_sb(MACROBLOCKD *xd,
|
| + uint8_t *ypred,
|
| + uint8_t *upred,
|
| + uint8_t *vpred,
|
| + int ystride,
|
| + int uvstride) {
|
| + vp9_build_interintra_64x64_predictors_sby(xd, ypred, ystride);
|
| + vp9_build_interintra_64x64_predictors_sbuv(xd, upred, vpred, uvstride);
|
| +}
|
| +#endif // CONFIG_COMP_INTERINTRA_PRED
|
| +
|
| void vp9_build_intra_predictors_mby(MACROBLOCKD *xd) {
|
| vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
|
| xd->predictor, 16,
|
| @@ -718,40 +759,23 @@
|
| xd->up_available, xd->left_available);
|
| }
|
|
|
| -#if CONFIG_SUPERBLOCKS
|
| void vp9_build_intra_predictors_sby_s(MACROBLOCKD *xd) {
|
| vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
|
| xd->dst.y_buffer, xd->dst.y_stride,
|
| xd->mode_info_context->mbmi.mode, 32,
|
| xd->up_available, xd->left_available);
|
| }
|
| -#endif
|
|
|
| -#if CONFIG_COMP_INTRA_PRED
|
| -void vp9_build_comp_intra_predictors_mby(MACROBLOCKD *xd) {
|
| - unsigned char predictor[2][256];
|
| - int i;
|
| -
|
| +void vp9_build_intra_predictors_sb64y_s(MACROBLOCKD *xd) {
|
| vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
|
| - predictor[0], 16,
|
| - xd->mode_info_context->mbmi.mode,
|
| - 16, xd->up_available,
|
| - xd->left_available);
|
| - vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
|
| - predictor[1], 16,
|
| - xd->mode_info_context->mbmi.second_mode,
|
| - 16, xd->up_available,
|
| - xd->left_available);
|
| -
|
| - for (i = 0; i < 256; i++) {
|
| - xd->predictor[i] = (predictor[0][i] + predictor[1][i] + 1) >> 1;
|
| - }
|
| + xd->dst.y_buffer, xd->dst.y_stride,
|
| + xd->mode_info_context->mbmi.mode, 64,
|
| + xd->up_available, xd->left_available);
|
| }
|
| -#endif
|
|
|
| void vp9_build_intra_predictors_mbuv_internal(MACROBLOCKD *xd,
|
| - unsigned char *upred_ptr,
|
| - unsigned char *vpred_ptr,
|
| + uint8_t *upred_ptr,
|
| + uint8_t *vpred_ptr,
|
| int uv_stride,
|
| int mode, int bsize) {
|
| vp9_build_intra_predictors_internal(xd->dst.u_buffer, xd->dst.uv_stride,
|
| @@ -777,86 +801,36 @@
|
| 8);
|
| }
|
|
|
| -#if CONFIG_SUPERBLOCKS
|
| void vp9_build_intra_predictors_sbuv_s(MACROBLOCKD *xd) {
|
| vp9_build_intra_predictors_mbuv_internal(xd, xd->dst.u_buffer,
|
| xd->dst.v_buffer, xd->dst.uv_stride,
|
| xd->mode_info_context->mbmi.uv_mode,
|
| 16);
|
| }
|
| -#endif
|
|
|
| -#if CONFIG_COMP_INTRA_PRED
|
| -void vp9_build_comp_intra_predictors_mbuv(MACROBLOCKD *xd) {
|
| - unsigned char predictor[2][2][64];
|
| - int i;
|
| -
|
| - vp9_build_intra_predictors_mbuv_internal(
|
| - xd, predictor[0][0], predictor[1][0], 8,
|
| - xd->mode_info_context->mbmi.uv_mode, 8);
|
| - vp9_build_intra_predictors_mbuv_internal(
|
| - xd, predictor[0][1], predictor[1][1], 8,
|
| - xd->mode_info_context->mbmi.second_uv_mode, 8);
|
| - for (i = 0; i < 64; i++) {
|
| - xd->predictor[256 + i] = (predictor[0][0][i] + predictor[0][1][i] + 1) >> 1;
|
| - xd->predictor[256 + 64 + i] = (predictor[1][0][i] +
|
| - predictor[1][1][i] + 1) >> 1;
|
| - }
|
| +void vp9_build_intra_predictors_sb64uv_s(MACROBLOCKD *xd) {
|
| + vp9_build_intra_predictors_mbuv_internal(xd, xd->dst.u_buffer,
|
| + xd->dst.v_buffer, xd->dst.uv_stride,
|
| + xd->mode_info_context->mbmi.uv_mode,
|
| + 32);
|
| }
|
| -#endif
|
|
|
| void vp9_intra8x8_predict(BLOCKD *xd,
|
| int mode,
|
| - unsigned char *predictor) {
|
| + uint8_t *predictor) {
|
| vp9_build_intra_predictors_internal(*(xd->base_dst) + xd->dst,
|
| xd->dst_stride, predictor, 16,
|
| mode, 8, 1, 1);
|
| }
|
|
|
| -#if CONFIG_COMP_INTRA_PRED
|
| -void vp9_comp_intra8x8_predict(BLOCKD *xd,
|
| - int mode, int second_mode,
|
| - unsigned char *out_predictor) {
|
| - unsigned char predictor[2][8 * 16];
|
| - int i, j;
|
| -
|
| - vp9_intra8x8_predict(xd, mode, predictor[0]);
|
| - vp9_intra8x8_predict(xd, second_mode, predictor[1]);
|
| -
|
| - for (i = 0; i < 8 * 16; i += 16) {
|
| - for (j = i; j < i + 8; j++) {
|
| - out_predictor[j] = (predictor[0][j] + predictor[1][j] + 1) >> 1;
|
| - }
|
| - }
|
| -}
|
| -#endif
|
| -
|
| void vp9_intra_uv4x4_predict(BLOCKD *xd,
|
| int mode,
|
| - unsigned char *predictor) {
|
| + uint8_t *predictor) {
|
| vp9_build_intra_predictors_internal(*(xd->base_dst) + xd->dst,
|
| xd->dst_stride, predictor, 8,
|
| mode, 4, 1, 1);
|
| }
|
|
|
| -#if CONFIG_COMP_INTRA_PRED
|
| -void vp9_comp_intra_uv4x4_predict(BLOCKD *xd,
|
| - int mode, int mode2,
|
| - unsigned char *out_predictor) {
|
| - unsigned char predictor[2][8 * 4];
|
| - int i, j;
|
| -
|
| - vp9_intra_uv4x4_predict(xd, mode, predictor[0]);
|
| - vp9_intra_uv4x4_predict(xd, mode2, predictor[1]);
|
| -
|
| - for (i = 0; i < 4 * 8; i += 8) {
|
| - for (j = i; j < i + 4; j++) {
|
| - out_predictor[j] = (predictor[0][j] + predictor[1][j] + 1) >> 1;
|
| - }
|
| - }
|
| -}
|
| -#endif
|
| -
|
| /* TODO: try different ways of use Y-UV mode correlation
|
| Current code assumes that a uv 4x4 block use same mode
|
| as corresponding Y 8x8 area
|
|
|