Detect skippable blocks in splitmv RD loop case.

Change-Id: Id8a7265dc721e5cdcaa144e0041beeb32a98f51c
This commit is contained in:
Ronald S. Bultje 2012-10-17 14:32:17 -07:00
parent 3182ab619d
commit b276efd002

View File

@ -1839,7 +1839,7 @@ static int64_t rd_inter16x16_uv_8x8(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
static int64_t rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
int *distortion, int fullpixel) {
int *distortion, int *skippable, int fullpixel) {
vp8_build_inter4x4_predictors_mbuv(&x->e_mbd);
ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), submbuv)(x->src_diff,
x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, x->src.uv_stride);
@ -1849,6 +1849,7 @@ static int64_t rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
*rate = rd_cost_mbuv(x);
*distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4;
*skippable = mbuv_is_skippable_4x4(&x->e_mbd);
return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
}
@ -2320,7 +2321,7 @@ int mv_check_bounds(MACROBLOCK *x, int_mv *mv) {
static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
BEST_SEG_INFO *bsi, unsigned int segmentation,
int_mv seg_mvs[16 /* n_blocks */][MAX_REF_FRAMES - 1]) {
int i;
int i, j;
int const *labels;
int br = 0, bd = 0;
B_PREDICTION_MODE this_mode;
@ -2332,6 +2333,7 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
int rate = 0;
int sbr = 0, sbd = 0;
int segmentyrate = 0;
uint8_t best_eobs[16];
vp8_variance_fn_ptr_t *v_fn_ptr;
@ -2508,6 +2510,9 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
bestlabelyrate = labelyrate;
mode_selected = this_mode;
best_label_rd = this_rd;
for (j = 0; j < 16; j++)
if (labels[j] == i)
best_eobs[j] = x->e_mbd.block[j].eob;
vpx_memcpy(ta_b, ta_s, sizeof(ENTROPY_CONTEXT_PLANES));
vpx_memcpy(tl_b, tl_s, sizeof(ENTROPY_CONTEXT_PLANES));
@ -2548,7 +2553,7 @@ static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
if (mbmi->second_ref_frame)
bsi->second_mvs[i].as_mv = x->partition_info->bmi[i].second_mv.as_mv;
bsi->modes[i] = x->partition_info->bmi[i].mode;
bsi->eobs[i] = bd->eob;
bsi->eobs[i] = best_eobs[i];
}
}
}
@ -2570,7 +2575,7 @@ static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
int_mv *best_ref_mv, int_mv *second_best_ref_mv, int64_t best_rd,
int *mdcounts, int *returntotrate,
int *returnyrate, int *returndistortion,
int mvthresh,
int *skippable, int mvthresh,
int_mv seg_mvs[BLOCK_MAX_SEGMENTS - 1][16 /* n_blocks */][MAX_REF_FRAMES - 1]) {
int i;
BEST_SEG_INFO bsi;
@ -2666,6 +2671,7 @@ static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
*returntotrate = bsi.r;
*returndistortion = bsi.d;
*returnyrate = bsi.segment_yrate;
*skippable = mby_is_skippable_4x4(&x->e_mbd, 0);
/* save partitions */
mbmi->partitioning = bsi.segment_num;
@ -3748,6 +3754,7 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv,
second_ref, best_yrd, mdcounts,
&rate, &rate_y, &distortion,
&skippable,
this_rd_thresh, seg_mvs);
rate2 += rate;
distortion2 += distortion;
@ -3761,9 +3768,13 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
// If even the 'Y' rd value of split is higher than best so far
// then dont bother looking at UV
if (tmp_rd < best_yrd) {
rd_inter4x4_uv(cpi, x, &rate_uv, &distortion_uv, cpi->common.full_pixel);
int uv_skippable;
rd_inter4x4_uv(cpi, x, &rate_uv, &distortion_uv, &uv_skippable,
cpi->common.full_pixel);
rate2 += rate_uv;
distortion2 += distortion_uv;
skippable = skippable && uv_skippable;
} else {
this_rd = INT64_MAX;
disable_skip = 1;