Merge "Add best_rd breakout to keyframe partition selection also."

This commit is contained in:
Yaowu Xu
2013-07-18 17:50:39 -07:00
committed by Gerrit Code Review

View File

@@ -1384,22 +1384,17 @@ static int64_t rd_pick_intra_sby_mode(VP9_COMP *cpi, MACROBLOCK *x,
int *rate, int *rate_tokenonly, int *rate, int *rate_tokenonly,
int64_t *distortion, int *skippable, int64_t *distortion, int *skippable,
BLOCK_SIZE_TYPE bsize, 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 mode;
MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected);
MACROBLOCKD *const xd = &x->e_mbd; MACROBLOCKD *const xd = &x->e_mbd;
int this_rate, this_rate_tokenonly, s; int this_rate, this_rate_tokenonly, s;
int64_t this_distortion; int64_t this_distortion, this_rd;
int64_t best_rd = INT64_MAX, this_rd;
TX_SIZE UNINITIALIZED_IS_SAFE(best_tx); TX_SIZE UNINITIALIZED_IS_SAFE(best_tx);
int i; int i;
int *bmode_costs = x->mbmode_cost; 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) { if (cpi->sf.tx_size_search_method == USE_FULL_RD) {
for (i = 0; i < NB_TXFM_MODES; i++) for (i = 0; i < NB_TXFM_MODES; i++)
txfm_cache[i] = INT64_MAX; 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, int *returnrate, int64_t *returndist,
BLOCK_SIZE_TYPE bsize, BLOCK_SIZE_TYPE bsize,
PICK_MODE_CONTEXT *ctx, int64_t best_rd) { PICK_MODE_CONTEXT *ctx, int64_t best_rd) {
VP9_COMMON *cm = &cpi->common; VP9_COMMON *const cm = &cpi->common;
MACROBLOCKD *xd = &x->e_mbd; MACROBLOCKD *const xd = &x->e_mbd;
int rate_y = 0, rate_uv = 0; int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0;
int rate_y_tokenonly = 0, rate_uv_tokenonly = 0; int y_skip = 0, uv_skip;
int64_t dist_y = 0, dist_uv = 0; int64_t dist_y = 0, dist_uv = 0, txfm_cache[NB_TXFM_MODES];
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;
x->skip_encode = 0; x->skip_encode = 0;
vpx_memset(&txfm_cache,0,sizeof(txfm_cache)); vpx_memset(&txfm_cache, 0, sizeof(txfm_cache));
ctx->skip = 0; ctx->skip = 0;
xd->mode_info_context->mbmi.mode = DC_PRED;
xd->mode_info_context->mbmi.ref_frame[0] = INTRA_FRAME; xd->mode_info_context->mbmi.ref_frame[0] = INTRA_FRAME;
err = rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly, if (bsize >= BLOCK_SIZE_SB8X8) {
&dist_y, &y_skip, bsize, txfm_cache); if (rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly,
mode = xd->mode_info_context->mbmi.mode; &dist_y, &y_skip, bsize, txfm_cache,
txfm_size = xd->mode_info_context->mbmi.txfm_size; best_rd) >= best_rd) {
rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly, *returnrate = INT_MAX;
&dist_uv, &uv_skip, return;
(bsize < BLOCK_SIZE_SB8X8) ? BLOCK_SIZE_SB8X8 : }
bsize); rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly,
if (bsize < BLOCK_SIZE_SB8X8) &dist_uv, &uv_skip, bsize);
err4x4 = rd_pick_intra4x4mby_modes(cpi, x, &rate4x4_y, } else {
&rate4x4_y_tokenonly, y_skip = 0;
&dist4x4_y, err); 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) { if (y_skip && uv_skip) {
*returnrate = rate_y + rate_uv - rate_y_tokenonly - rate_uv_tokenonly + *returnrate = rate_y + rate_uv - rate_y_tokenonly - rate_uv_tokenonly +
vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1); vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1);
*returndist = dist_y + (dist_uv >> 2); *returndist = dist_y + (dist_uv >> 2);
memset(ctx->txfm_rd_diff, 0, sizeof(ctx->txfm_rd_diff)); 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 { } else {
int i; int i;
*returnrate = rate_y + rate_uv + *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]; 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; ctx->mic = *xd->mode_info_context;