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 |