From 96e4db2660b67e84dc4ff52e9d6a2e9f397a20cd Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Wed, 17 Jul 2013 18:21:41 -0700 Subject: [PATCH] Add best_rd breakout to keyframe partition selection also. Change-Id: I96b8058f6dfecf8aa3e152cdcbfd7e10071fbbc9 --- vp9/encoder/vp9_rdopt.c | 72 +++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 44 deletions(-) diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index aea8cf0..4ff23ff 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -1384,22 +1384,17 @@ static int64_t rd_pick_intra_sby_mode(VP9_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_tokenonly, int64_t *distortion, int *skippable, BLOCK_SIZE_TYPE bsize, - int64_t txfm_cache[NB_TXFM_MODES]) { + int64_t txfm_cache[NB_TXFM_MODES], + int64_t best_rd) { MB_PREDICTION_MODE mode; MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); MACROBLOCKD *const xd = &x->e_mbd; int this_rate, this_rate_tokenonly, s; - int64_t this_distortion; - int64_t best_rd = INT64_MAX, this_rd; + int64_t this_distortion, this_rd; TX_SIZE UNINITIALIZED_IS_SAFE(best_tx); int i; int *bmode_costs = x->mbmode_cost; - if (bsize < BLOCK_SIZE_SB8X8) { - x->e_mbd.mode_info_context->mbmi.txfm_size = TX_4X4; - return best_rd; - } - if (cpi->sf.tx_size_search_method == USE_FULL_RD) { for (i = 0; i < NB_TXFM_MODES; i++) txfm_cache[i] = INT64_MAX; @@ -3040,50 +3035,41 @@ void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, int *returnrate, int64_t *returndist, BLOCK_SIZE_TYPE bsize, PICK_MODE_CONTEXT *ctx, int64_t best_rd) { - VP9_COMMON *cm = &cpi->common; - MACROBLOCKD *xd = &x->e_mbd; - int rate_y = 0, rate_uv = 0; - int rate_y_tokenonly = 0, rate_uv_tokenonly = 0; - int64_t dist_y = 0, dist_uv = 0; - int y_skip = 0, uv_skip = 0; - int64_t txfm_cache[NB_TXFM_MODES], err; - MB_PREDICTION_MODE mode; - TX_SIZE txfm_size; - int rate4x4_y, rate4x4_y_tokenonly; - int64_t dist4x4_y; - int64_t err4x4 = INT64_MAX; + VP9_COMMON *const cm = &cpi->common; + MACROBLOCKD *const xd = &x->e_mbd; + int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0; + int y_skip = 0, uv_skip; + int64_t dist_y = 0, dist_uv = 0, txfm_cache[NB_TXFM_MODES]; x->skip_encode = 0; - vpx_memset(&txfm_cache,0,sizeof(txfm_cache)); + vpx_memset(&txfm_cache, 0, sizeof(txfm_cache)); ctx->skip = 0; - xd->mode_info_context->mbmi.mode = DC_PRED; xd->mode_info_context->mbmi.ref_frame[0] = INTRA_FRAME; - err = rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly, - &dist_y, &y_skip, bsize, txfm_cache); - mode = xd->mode_info_context->mbmi.mode; - txfm_size = xd->mode_info_context->mbmi.txfm_size; - rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly, - &dist_uv, &uv_skip, - (bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : - bsize); - if (bsize < BLOCK_SIZE_SB8X8) - err4x4 = rd_pick_intra4x4mby_modes(cpi, x, &rate4x4_y, - &rate4x4_y_tokenonly, - &dist4x4_y, err); + if (bsize >= BLOCK_SIZE_SB8X8) { + if (rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly, + &dist_y, &y_skip, bsize, txfm_cache, + best_rd) >= best_rd) { + *returnrate = INT_MAX; + return; + } + rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly, + &dist_uv, &uv_skip, bsize); + } else { + y_skip = 0; + if (rd_pick_intra4x4mby_modes(cpi, x, &rate_y, &rate_y_tokenonly, + &dist_y, best_rd) >= best_rd) { + *returnrate = INT_MAX; + return; + } + rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly, + &dist_uv, &uv_skip, BLOCK_SIZE_SB8X8); + } if (y_skip && uv_skip) { *returnrate = rate_y + rate_uv - rate_y_tokenonly - rate_uv_tokenonly + vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1); *returndist = dist_y + (dist_uv >> 2); memset(ctx->txfm_rd_diff, 0, sizeof(ctx->txfm_rd_diff)); - xd->mode_info_context->mbmi.mode = mode; - xd->mode_info_context->mbmi.txfm_size = txfm_size; - } else if (bsize < BLOCK_SIZE_SB8X8 && err4x4 < err) { - *returnrate = rate4x4_y + rate_uv + - vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 0); - *returndist = dist4x4_y + (dist_uv >> 2); - vpx_memset(ctx->txfm_rd_diff, 0, sizeof(ctx->txfm_rd_diff)); - xd->mode_info_context->mbmi.txfm_size = TX_4X4; } else { int i; *returnrate = rate_y + rate_uv + @@ -3094,8 +3080,6 @@ void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, ctx->txfm_rd_diff[i] = txfm_cache[i] - txfm_cache[cm->txfm_mode]; } } - xd->mode_info_context->mbmi.txfm_size = txfm_size; - xd->mode_info_context->mbmi.mode = mode; } ctx->mic = *xd->mode_info_context; -- 2.7.4