diff options
author | Jingning Han <jingning@google.com> | 2015-07-14 16:22:19 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-07-14 16:22:21 +0000 |
commit | d5975b733b77400aae60a59bc6650fbef1d38ba8 (patch) | |
tree | 3f0239f7ce76774a00511e6abfeb3bf88394c97d | |
parent | e03b8b78b2f358b90a053d08eebdb2c69816516e (diff) | |
parent | 81452cf0b7e97643452c2129bdbab27335d0f386 (diff) | |
download | libvpx-d5975b733b77400aae60a59bc6650fbef1d38ba8.tar libvpx-d5975b733b77400aae60a59bc6650fbef1d38ba8.tar.gz libvpx-d5975b733b77400aae60a59bc6650fbef1d38ba8.tar.bz2 libvpx-d5975b733b77400aae60a59bc6650fbef1d38ba8.zip |
Merge "Refactor intra block prediction function"
-rw-r--r-- | vp9/common/vp9_reconintra.c | 13 | ||||
-rw-r--r-- | vp9/common/vp9_reconintra.h | 2 | ||||
-rw-r--r-- | vp9/decoder/vp9_decodeframe.c | 3 | ||||
-rw-r--r-- | vp9/encoder/vp9_encodemb.c | 16 | ||||
-rw-r--r-- | vp9/encoder/vp9_mbgraph.c | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_pickmode.c | 3 | ||||
-rw-r--r-- | vp9/encoder/vp9_rdopt.c | 34 |
7 files changed, 32 insertions, 41 deletions
diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c index 1e9acb8d5..f969ff1a8 100644 --- a/vp9/common/vp9_reconintra.c +++ b/vp9/common/vp9_reconintra.c @@ -1059,20 +1059,19 @@ static void build_intra_predictors(const MACROBLOCKD *xd, const uint8_t *ref, } } -void vp9_predict_intra_block(const MACROBLOCKD *xd, int block_idx, int bwl_in, +void vp9_predict_intra_block(const MACROBLOCKD *xd, int bwl_in, TX_SIZE tx_size, PREDICTION_MODE mode, const uint8_t *ref, int ref_stride, uint8_t *dst, int dst_stride, int aoff, int loff, int plane) { - const int bwl = bwl_in - tx_size; - const int wmask = (1 << bwl) - 1; - const int have_top = (block_idx >> bwl) || xd->up_available; - const int have_left = (block_idx & wmask) || xd->left_available; - const int have_right = ((block_idx & wmask) != wmask); + const int bw = (1 << bwl_in); + const int txw = (1 << tx_size); + const int have_top = loff || xd->up_available; + const int have_left = aoff || xd->left_available; + const int have_right = (aoff + txw) < bw; const int x = aoff * 4; const int y = loff * 4; - assert(bwl >= 0); #if CONFIG_VP9_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { build_intra_predictors_high(xd, ref, ref_stride, dst, dst_stride, mode, diff --git a/vp9/common/vp9_reconintra.h b/vp9/common/vp9_reconintra.h index da5e435b1..de453808b 100644 --- a/vp9/common/vp9_reconintra.h +++ b/vp9/common/vp9_reconintra.h @@ -20,7 +20,7 @@ extern "C" { void vp9_init_intra_predictors(void); -void vp9_predict_intra_block(const MACROBLOCKD *xd, int block_idx, int bwl_in, +void vp9_predict_intra_block(const MACROBLOCKD *xd, int bwl_in, TX_SIZE tx_size, PREDICTION_MODE mode, const uint8_t *ref, int ref_stride, uint8_t *dst, int dst_stride, diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c index b3cf3fd4f..aeca7e857 100644 --- a/vp9/decoder/vp9_decodeframe.c +++ b/vp9/decoder/vp9_decodeframe.c @@ -391,8 +391,7 @@ static void predict_and_reconstruct_intra_block(int plane, int block, dec_txfrm_block_to_raster_xy(bwl, tx_size, block, &x, &y); dst = &pd->dst.buf[4 * y * pd->dst.stride + 4 * x]; - vp9_predict_intra_block(xd, block >> (tx_size << 1), - bwl, tx_size, mode, + vp9_predict_intra_block(xd, bwl, tx_size, mode, dst, pd->dst.stride, dst, pd->dst.stride, x, y, plane); diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c index 659ce72b6..f74cdd8aa 100644 --- a/vp9/encoder/vp9_encodemb.c +++ b/vp9/encoder/vp9_encodemb.c @@ -795,7 +795,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, case TX_32X32: scan_order = &vp9_default_scan_orders[TX_32X32]; mode = plane == 0 ? mbmi->mode : mbmi->uv_mode; - vp9_predict_intra_block(xd, block >> 6, bwl, TX_32X32, mode, + vp9_predict_intra_block(xd, bwl, TX_32X32, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); @@ -816,7 +816,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, tx_type = get_tx_type(pd->plane_type, xd); scan_order = &vp9_scan_orders[TX_16X16][tx_type]; mode = plane == 0 ? mbmi->mode : mbmi->uv_mode; - vp9_predict_intra_block(xd, block >> 4, bwl, TX_16X16, mode, + vp9_predict_intra_block(xd, bwl, TX_16X16, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); @@ -838,7 +838,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, tx_type = get_tx_type(pd->plane_type, xd); scan_order = &vp9_scan_orders[TX_8X8][tx_type]; mode = plane == 0 ? mbmi->mode : mbmi->uv_mode; - vp9_predict_intra_block(xd, block >> 2, bwl, TX_8X8, mode, + vp9_predict_intra_block(xd, bwl, TX_8X8, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); @@ -860,7 +860,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, tx_type = get_tx_type_4x4(pd->plane_type, xd, block); scan_order = &vp9_scan_orders[TX_4X4][tx_type]; mode = plane == 0 ? get_y_mode(xd->mi[0], block) : mbmi->uv_mode; - vp9_predict_intra_block(xd, block, bwl, TX_4X4, mode, + vp9_predict_intra_block(xd, bwl, TX_4X4, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); @@ -903,7 +903,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, case TX_32X32: scan_order = &vp9_default_scan_orders[TX_32X32]; mode = plane == 0 ? mbmi->mode : mbmi->uv_mode; - vp9_predict_intra_block(xd, block >> 6, bwl, TX_32X32, mode, + vp9_predict_intra_block(xd, bwl, TX_32X32, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); @@ -923,7 +923,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, tx_type = get_tx_type(pd->plane_type, xd); scan_order = &vp9_scan_orders[TX_16X16][tx_type]; mode = plane == 0 ? mbmi->mode : mbmi->uv_mode; - vp9_predict_intra_block(xd, block >> 4, bwl, TX_16X16, mode, + vp9_predict_intra_block(xd, bwl, TX_16X16, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); @@ -943,7 +943,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, tx_type = get_tx_type(pd->plane_type, xd); scan_order = &vp9_scan_orders[TX_8X8][tx_type]; mode = plane == 0 ? mbmi->mode : mbmi->uv_mode; - vp9_predict_intra_block(xd, block >> 2, bwl, TX_8X8, mode, + vp9_predict_intra_block(xd, bwl, TX_8X8, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); @@ -963,7 +963,7 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, tx_type = get_tx_type_4x4(pd->plane_type, xd, block); scan_order = &vp9_scan_orders[TX_4X4][tx_type]; mode = plane == 0 ? get_y_mode(xd->mi[0], block) : mbmi->uv_mode; - vp9_predict_intra_block(xd, block, bwl, TX_4X4, mode, + vp9_predict_intra_block(xd, bwl, TX_4X4, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, dst, dst_stride, i, j, plane); diff --git a/vp9/encoder/vp9_mbgraph.c b/vp9/encoder/vp9_mbgraph.c index d5eeb9cc5..acbd7dd43 100644 --- a/vp9/encoder/vp9_mbgraph.c +++ b/vp9/encoder/vp9_mbgraph.c @@ -145,7 +145,7 @@ static int find_best_16x16_intra(VP9_COMP *cpi, PREDICTION_MODE *pbest_mode) { unsigned int err; xd->mi[0]->mbmi.mode = mode; - vp9_predict_intra_block(xd, 0, 2, TX_16X16, mode, + vp9_predict_intra_block(xd, 2, TX_16X16, mode, x->plane[0].src.buf, x->plane[0].src.stride, xd->plane[0].dst.buf, xd->plane[0].dst.stride, 0, 0, 0); diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index e99cbc7a0..9bc5629c0 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -902,8 +902,7 @@ static void estimate_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; // Use source buffer as an approximation for the fully reconstructed buffer. - vp9_predict_intra_block(xd, block >> (2 * tx_size), - b_width_log2_lookup[plane_bsize], + vp9_predict_intra_block(xd, b_width_log2_lookup[plane_bsize], tx_size, args->mode, x->skip_encode ? p->src.buf : pd->dst.buf, x->skip_encode ? src_stride : dst_stride, diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 9985f8947..09cff00d9 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -760,7 +760,8 @@ static int conditional_skipintra(PREDICTION_MODE mode, return 0; } -static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, int ib, +static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, + int row, int col, PREDICTION_MODE *best_mode, const int *bmode_costs, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l, @@ -770,18 +771,14 @@ static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, int ib, PREDICTION_MODE mode; MACROBLOCKD *const xd = &x->e_mbd; int64_t best_rd = rd_thresh; - struct macroblock_plane *p = &x->plane[0]; struct macroblockd_plane *pd = &xd->plane[0]; const int src_stride = p->src.stride; const int dst_stride = pd->dst.stride; - const uint8_t *src_init = &p->src.buf[vp9_raster_block_offset(BLOCK_8X8, ib, - src_stride)]; - uint8_t *dst_init = &pd->dst.buf[vp9_raster_block_offset(BLOCK_8X8, ib, - dst_stride)]; + const uint8_t *src_init = &p->src.buf[row * 4 * src_stride + col * 4]; + uint8_t *dst_init = &pd->dst.buf[row * 4 * src_stride + col * 4]; ENTROPY_CONTEXT ta[2], tempa[2]; ENTROPY_CONTEXT tl[2], templ[2]; - const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; int idx, idy; @@ -790,8 +787,6 @@ static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, int ib, uint16_t best_dst16[8 * 8]; #endif - assert(ib < 4); - memcpy(ta, a, sizeof(ta)); memcpy(tl, l, sizeof(tl)); xd->mi[0]->mbmi.tx_size = TX_4X4; @@ -819,7 +814,7 @@ static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, int ib, for (idy = 0; idy < num_4x4_blocks_high; ++idy) { for (idx = 0; idx < num_4x4_blocks_wide; ++idx) { - const int block = ib + idy * 2 + idx; + const int block = (row + idy) * 2 + (col + idx); const uint8_t *const src = &src_init[idx * 4 + idy * 4 * src_stride]; uint8_t *const dst = &dst_init[idx * 4 + idy * 4 * dst_stride]; int16_t *const src_diff = vp9_raster_block_offset_int16(BLOCK_8X8, @@ -827,11 +822,11 @@ static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, int ib, p->src_diff); tran_low_t *const coeff = BLOCK_OFFSET(x->plane[0].coeff, block); xd->mi[0]->bmi[block].as_mode = mode; - vp9_predict_intra_block(xd, block, 1, - TX_4X4, mode, + vp9_predict_intra_block(xd, 1, TX_4X4, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, - dst, dst_stride, idx, idy, 0); + dst, dst_stride, + col + idx, row + idy, 0); vpx_highbd_subtract_block(4, 4, src_diff, 8, src, src_stride, dst, dst_stride, xd->bd); if (xd->lossless) { @@ -920,18 +915,17 @@ static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, int ib, for (idy = 0; idy < num_4x4_blocks_high; ++idy) { for (idx = 0; idx < num_4x4_blocks_wide; ++idx) { - const int block = ib + idy * 2 + idx; + const int block = (row + idy) * 2 + (col + idx); const uint8_t *const src = &src_init[idx * 4 + idy * 4 * src_stride]; uint8_t *const dst = &dst_init[idx * 4 + idy * 4 * dst_stride]; int16_t *const src_diff = vp9_raster_block_offset_int16(BLOCK_8X8, block, p->src_diff); tran_low_t *const coeff = BLOCK_OFFSET(x->plane[0].coeff, block); xd->mi[0]->bmi[block].as_mode = mode; - vp9_predict_intra_block(xd, block, 1, - TX_4X4, mode, + vp9_predict_intra_block(xd, 1, TX_4X4, mode, x->skip_encode ? src : dst, x->skip_encode ? src_stride : dst_stride, - dst, dst_stride, idx, idy, 0); + dst, dst_stride, col + idx, row + idy, 0); vpx_subtract_block(4, 4, src_diff, 8, src, src_stride, dst, dst_stride); if (xd->lossless) { @@ -1030,9 +1024,9 @@ static int64_t rd_pick_intra_sub_8x8_y_mode(VP9_COMP *cpi, MACROBLOCK *mb, bmode_costs = cpi->y_mode_costs[A][L]; } - this_rd = rd_pick_intra4x4block(cpi, mb, i, &best_mode, bmode_costs, - t_above + idx, t_left + idy, &r, &ry, &d, - bsize, best_rd - total_rd); + this_rd = rd_pick_intra4x4block(cpi, mb, idy, idx, &best_mode, + bmode_costs, t_above + idx, t_left + idy, + &r, &ry, &d, bsize, best_rd - total_rd); if (this_rd >= best_rd - total_rd) return INT64_MAX; |