diff options
Diffstat (limited to 'vp9/common/vp9_reconintra.c')
-rw-r--r-- | vp9/common/vp9_reconintra.c | 222 |
1 files changed, 43 insertions, 179 deletions
diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c index 6caebd784..4e786b0f8 100644 --- a/vp9/common/vp9_reconintra.c +++ b/vp9/common/vp9_reconintra.c @@ -227,61 +227,6 @@ static void d153_predictor(uint8_t *ypred_ptr, int y_stride, } } -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]; - mh = mv = 0; - maxgradh = yabove_row[1] - top_left; - maxgradv = yleft_col[1] - top_left; - for (i = 2; i < n; ++i) { - int gh = yabove_row[i] - yabove_row[i - 2]; - int gv = yleft_col[i] - yleft_col[i - 2]; - if (gh > maxgradh) { - maxgradh = gh; - mh = i - 1; - } - if (gv > maxgradv) { - maxgradv = gv; - mv = i - 1; - } - } - nx = mh + mv + 3; - ny = 2 * n + 1 - nx; - - x = top_left; - for (i = 0; i <= mh; ++i) x += yabove_row[i]; - for (i = 0; i <= mv; ++i) x += yleft_col[i]; - x += (nx >> 1); - x /= nx; - y = 0; - for (i = mh + 1; i < n; ++i) y += yabove_row[i]; - for (i = mv + 1; i < n; ++i) y += yleft_col[i]; - y += (ny >> 1); - y /= ny; - - for (i = 0; i < n; ++i) { - for (j = 0; j < n; ++j) - ypred_ptr[j] = (i <= mh && j <= mv ? x : y); - ypred_ptr += y_stride; - } -} - -static INLINE int log2_minus_1(int n) { - switch (n) { - case 4: return 1; - case 8: return 2; - case 16: return 3; - case 32: return 4; - case 64: return 5; - default: - assert(0); - return 0; - } -} - void vp9_build_intra_predictors(uint8_t *src, int src_stride, uint8_t *ypred_ptr, int y_stride, int mode, @@ -465,7 +410,7 @@ static void combine_interintra(MB_PREDICTION_MODE mode, int interstride, uint8_t *intrapred, int intrastride, - int size) { + int bw, int bh) { // TODO(debargha): Explore different ways of combining predictors // or designing the tables below static const int scale_bits = 8; @@ -483,6 +428,7 @@ static void combine_interintra(MB_PREDICTION_MODE mode, 68, 68, 68, 67, 67, 67, 67, 67, }; + int size = MAX(bw, bh); int size_scale = (size >= 64 ? 1: size == 32 ? 2 : size == 16 ? 4 : @@ -490,8 +436,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode, int i, j; switch (mode) { case V_PRED: - for (i = 0; i < size; ++i) { - for (j = 0; j < size; ++j) { + for (i = 0; i < bh; ++i) { + for (j = 0; j < bw; ++j) { int k = i * interstride + j; int scale = weights1d[i * size_scale]; interpred[k] = @@ -503,8 +449,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode, break; case H_PRED: - for (i = 0; i < size; ++i) { - for (j = 0; j < size; ++j) { + for (i = 0; i < bh; ++i) { + for (j = 0; j < bw; ++j) { int k = i * interstride + j; int scale = weights1d[j * size_scale]; interpred[k] = @@ -517,8 +463,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode, case D63_PRED: case D117_PRED: - for (i = 0; i < size; ++i) { - for (j = 0; j < size; ++j) { + for (i = 0; i < bh; ++i) { + for (j = 0; j < bw; ++j) { int k = i * interstride + j; int scale = (weights1d[i * size_scale] * 3 + weights1d[j * size_scale]) >> 2; @@ -532,8 +478,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode, case D27_PRED: case D153_PRED: - for (i = 0; i < size; ++i) { - for (j = 0; j < size; ++j) { + for (i = 0; i < bh; ++i) { + for (j = 0; j < bw; ++j) { int k = i * interstride + j; int scale = (weights1d[j * size_scale] * 3 + weights1d[i * size_scale]) >> 2; @@ -546,8 +492,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode, break; case D135_PRED: - for (i = 0; i < size; ++i) { - for (j = 0; j < size; ++j) { + for (i = 0; i < bh; ++i) { + for (j = 0; j < bw; ++j) { int k = i * interstride + j; int scale = weights1d[(i < j ? i : j) * size_scale]; interpred[k] = @@ -559,8 +505,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode, break; case D45_PRED: - for (i = 0; i < size; ++i) { - for (j = 0; j < size; ++j) { + for (i = 0; i < bh; ++i) { + for (j = 0; j < bw; ++j) { int k = i * interstride + j; int scale = (weights1d[i * size_scale] + weights1d[j * size_scale]) >> 1; @@ -576,8 +522,8 @@ static void combine_interintra(MB_PREDICTION_MODE mode, case DC_PRED: default: // simple average - for (i = 0; i < size; ++i) { - for (j = 0; j < size; ++j) { + for (i = 0; i < bh; ++i) { + for (j = 0; j < bw; ++j) { int k = i * interstride + j; interpred[k] = (interpred[k] + intrapred[i * intrastride + j]) >> 1; } @@ -586,137 +532,55 @@ static void combine_interintra(MB_PREDICTION_MODE mode, } } -void vp9_build_interintra_16x16_predictors_mb(MACROBLOCKD *xd, +void vp9_build_interintra_predictors(MACROBLOCKD *xd, 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); + int ystride, int uvstride, + BLOCK_SIZE_TYPE bsize) { + vp9_build_interintra_predictors_sby(xd, ypred, ystride, bsize); + vp9_build_interintra_predictors_sbuv(xd, upred, vpred, uvstride, bsize); } -void vp9_build_interintra_16x16_predictors_mby(MACROBLOCKD *xd, +void vp9_build_interintra_predictors_sby(MACROBLOCKD *xd, uint8_t *ypred, - int ystride) { - uint8_t intrapredictor[256]; - vp9_build_intra_predictors( - xd->plane[0].dst.buf, xd->plane[0].dst.stride, - intrapredictor, 16, - xd->mode_info_context->mbmi.interintra_mode, 16, 16, - xd->up_available, xd->left_available, xd->right_available); - combine_interintra(xd->mode_info_context->mbmi.interintra_mode, - ypred, ystride, intrapredictor, 16, 16); -} - -void vp9_build_interintra_16x16_predictors_mbuv(MACROBLOCKD *xd, - uint8_t *upred, - uint8_t *vpred, - int uvstride) { - uint8_t uintrapredictor[64]; - uint8_t vintrapredictor[64]; - vp9_build_intra_predictors( - xd->plane[1].dst.buf, xd->plane[1].dst.stride, - uintrapredictor, 8, - xd->mode_info_context->mbmi.interintra_uv_mode, 8, 8, - xd->up_available, xd->left_available, xd->right_available); - vp9_build_intra_predictors( - xd->plane[2].dst.buf, xd->plane[1].dst.stride, - vintrapredictor, 8, - xd->mode_info_context->mbmi.interintra_uv_mode, 8, 8, - xd->up_available, xd->left_available, xd->right_available); - combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode, - upred, uvstride, uintrapredictor, 8, 8); - combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode, - vpred, uvstride, vintrapredictor, 8, 8); -} - -void vp9_build_interintra_32x32_predictors_sby(MACROBLOCKD *xd, - uint8_t *ypred, - int ystride) { - uint8_t intrapredictor[1024]; + int ystride, + BLOCK_SIZE_TYPE bsize) { + int bwl = mb_width_log2(bsize), bw = 16 << bwl; + int bhl = mb_height_log2(bsize), bh = 16 << bhl; + uint8_t intrapredictor[4096]; vp9_build_intra_predictors( xd->plane[0].dst.buf, xd->plane[0].dst.stride, - intrapredictor, 32, - xd->mode_info_context->mbmi.interintra_mode, 32, 32, + intrapredictor, bw, + xd->mode_info_context->mbmi.interintra_mode, bw, bh, xd->up_available, xd->left_available, xd->right_available); combine_interintra(xd->mode_info_context->mbmi.interintra_mode, - ypred, ystride, intrapredictor, 32, 32); + ypred, ystride, intrapredictor, bw, bw, bh); } -void vp9_build_interintra_32x32_predictors_sbuv(MACROBLOCKD *xd, +void vp9_build_interintra_predictors_sbuv(MACROBLOCKD *xd, uint8_t *upred, uint8_t *vpred, - int uvstride) { - uint8_t uintrapredictor[256]; - uint8_t vintrapredictor[256]; + int uvstride, + BLOCK_SIZE_TYPE bsize) { + int bwl = mb_width_log2(bsize), bw = 8 << bwl; + int bhl = mb_height_log2(bsize), bh = 8 << bhl; + uint8_t uintrapredictor[1024]; + uint8_t vintrapredictor[1024]; vp9_build_intra_predictors( xd->plane[1].dst.buf, xd->plane[1].dst.stride, - uintrapredictor, 16, - xd->mode_info_context->mbmi.interintra_uv_mode, 16, 16, + uintrapredictor, bw, + xd->mode_info_context->mbmi.interintra_uv_mode, bw, bh, xd->up_available, xd->left_available, xd->right_available); vp9_build_intra_predictors( xd->plane[2].dst.buf, xd->plane[1].dst.stride, - vintrapredictor, 16, - xd->mode_info_context->mbmi.interintra_uv_mode, 16, 16, + vintrapredictor, bw, + xd->mode_info_context->mbmi.interintra_uv_mode, bw, bh, xd->up_available, xd->left_available, xd->right_available); combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode, - upred, uvstride, uintrapredictor, 16, 16); + upred, uvstride, uintrapredictor, bw, bw, bh); combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode, - vpred, uvstride, vintrapredictor, 16, 16); -} - -void vp9_build_interintra_32x32_predictors_sb(MACROBLOCKD *xd, - 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); -} - -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(xd->plane[0].dst.buf, xd->plane[0].dst.stride, - intrapredictor, 64, mode, 64, 64, - xd->up_available, xd->left_available, - xd->right_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(xd->plane[1].dst.buf, xd->plane[1].dst.stride, - uintrapredictor, 32, mode, 32, 32, - xd->up_available, xd->left_available, - xd->right_available); - vp9_build_intra_predictors(xd->plane[2].dst.buf, xd->plane[1].dst.stride, - vintrapredictor, 32, mode, 32, 32, - xd->up_available, xd->left_available, - xd->right_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); + vpred, uvstride, vintrapredictor, bw, bw, bh); } #endif // CONFIG_COMP_INTERINTRA_PRED |