Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Unified Diff: source/libvpx/vp9/common/vp9_reconintra.c

Issue 11974002: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « source/libvpx/vp9/common/vp9_reconintra.h ('k') | source/libvpx/vp9/common/vp9_reconintra4x4.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « source/libvpx/vp9/common/vp9_reconintra.h ('k') | source/libvpx/vp9/common/vp9_reconintra4x4.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698