From 83c7e13a6bcd1535d9547ef3c89816bf993b458b Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Wed, 10 Jul 2013 15:18:52 -0700 Subject: [PATCH] Do a skip-block check for sub8x8 partitions also. +0.2% SSIM and glbPSNR on derfraw300. Change-Id: I9cba0bca55e606a22f557c7732b064f738efe84d --- vp9/encoder/vp9_rdopt.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index eac7b2a19..6df17018e 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -1659,7 +1659,7 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi, int64_t best_yrd, int i, int *labelyrate, - int64_t *distortion, + int64_t *distortion, int64_t *sse, ENTROPY_CONTEXT *ta, ENTROPY_CONTEXT *tl) { int k; @@ -1684,7 +1684,7 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi, uint8_t* const dst = raster_block_offset_uint8(xd, BLOCK_SIZE_SB8X8, 0, i, xd->plane[0].dst.buf, xd->plane[0].dst.stride); - int64_t thisdistortion = 0; + int64_t thisdistortion = 0, thissse = 0; int thisrate = 0; vp9_build_inter_predictor(pre, @@ -1728,6 +1728,7 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi, thisdistortion += vp9_block_error(coeff, BLOCK_OFFSET(xd->plane[0].dqcoeff, k, 16), 16, &ssz); + thissse += ssz; thisrate += cost_coeffs(cm, x, 0, k, PLANE_TYPE_Y_WITH_DC, ta + (k & 1), tl + (k >> 1), TX_4X4, 16); @@ -1735,6 +1736,7 @@ static int64_t encode_inter_mb_segment(VP9_COMP *cpi, } *distortion += thisdistortion; *labelyrate += thisrate; + *sse = thissse >> 2; *distortion >>= 2; return RDCOST(x->rdmult, x->rddiv, *labelyrate, *distortion); @@ -1747,6 +1749,7 @@ typedef struct { int64_t segment_rd; int r; int64_t d; + int64_t sse; int segment_yrate; MB_PREDICTION_MODE modes[4]; int_mv mvs[4], second_mvs[4]; @@ -1795,7 +1798,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x, int_mv seg_mvs[4][MAX_REF_FRAMES], int mi_row, int mi_col) { int i, j, br = 0, rate = 0, sbr = 0, idx, idy; - int64_t bd = 0, sbd = 0; + int64_t bd = 0, sbd = 0, subblock_sse = 0, block_sse = 0; MB_PREDICTION_MODE this_mode; MB_MODE_INFO * mbmi = &x->e_mbd.mode_info_context->mbmi; const int label_count = 4; @@ -1848,7 +1851,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x, // search for the best motion vector on this segment for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { int64_t this_rd; - int64_t distortion; + int64_t distortion, sse; int labelyrate; ENTROPY_CONTEXT t_above_s[4], t_left_s[4]; const struct buf_2d orig_src = x->plane[0].src; @@ -1975,14 +1978,15 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x, this_rd = encode_inter_mb_segment(cpi, x, bsi->segment_rd - this_segment_rd, - i, &labelyrate, - &distortion, t_above_s, t_left_s); + i, &labelyrate, &distortion, &sse, + t_above_s, t_left_s); this_rd += RDCOST(x->rdmult, x->rddiv, rate, 0); rate += labelyrate; if (this_rd < best_label_rd) { sbr = rate; sbd = distortion; + subblock_sse = sse; bestlabelyrate = labelyrate; mode_selected = this_mode; best_label_rd = this_rd; @@ -2002,6 +2006,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x, br += sbr; bd += sbd; + block_sse += subblock_sse; segmentyrate += bestlabelyrate; this_segment_rd += best_label_rd; @@ -2025,6 +2030,7 @@ static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x, bsi->d = bd; bsi->segment_yrate = segmentyrate; bsi->segment_rd = this_segment_rd; + bsi->sse = block_sse; // store everything needed to come back to this!! for (i = 0; i < 4; i++) { @@ -2043,7 +2049,8 @@ static int64_t rd_pick_best_mbsegmentation(VP9_COMP *cpi, MACROBLOCK *x, int *returntotrate, int *returnyrate, int64_t *returndistortion, - int *skippable, int mvthresh, + int *skippable, int64_t *psse, + int mvthresh, int_mv seg_mvs[4][MAX_REF_FRAMES], int mi_row, int mi_col) { int i; @@ -2092,6 +2099,7 @@ static int64_t rd_pick_best_mbsegmentation(VP9_COMP *cpi, MACROBLOCK *x, *returndistortion = bsi.d; *returnyrate = bsi.segment_yrate; *skippable = vp9_sby_is_skippable(&x->e_mbd, BLOCK_SIZE_SB8X8); + *psse = bsi.sse; mbmi->mode = bsi.modes[3]; return bsi.segment_rd; @@ -3413,7 +3421,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, int64_t this_rd_thresh; int64_t tmp_rd, tmp_best_rd = INT64_MAX, tmp_best_rdu = INT64_MAX; int tmp_best_rate = INT_MAX, tmp_best_ratey = INT_MAX; - int64_t tmp_best_distortion = INT_MAX; + int64_t tmp_best_distortion = INT_MAX, tmp_best_sse, uv_sse; int tmp_best_skippable = 0; int switchable_filter_index; int_mv *second_ref = is_comp_pred ? @@ -3456,7 +3464,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, second_ref, best_yrd, &rate, &rate_y, &distortion, - &skippable, + &skippable, &total_sse, (int)this_rd_thresh, seg_mvs, mi_row, mi_col); if (tmp_rd == INT64_MAX) { @@ -3482,6 +3490,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, tmp_best_rate = rate; tmp_best_ratey = rate_y; tmp_best_distortion = distortion; + tmp_best_sse = total_sse; tmp_best_skippable = skippable; tmp_best_mbmode = *mbmi; tmp_best_partition = *x->partition_info; @@ -3515,7 +3524,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, second_ref, best_yrd, &rate, &rate_y, &distortion, - &skippable, + &skippable, &total_sse, (int)this_rd_thresh, seg_mvs, mi_row, mi_col); if (tmp_rd == INT64_MAX) @@ -3526,6 +3535,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, tmp_best_rdu -= RDCOST(x->rdmult, x->rddiv, rs, 0); } tmp_rd = tmp_best_rdu; + total_sse = tmp_best_sse; rate = tmp_best_rate; rate_y = tmp_best_ratey; distortion = tmp_best_distortion; @@ -3558,11 +3568,12 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE_SB8X8); vp9_subtract_sbuv(x, BLOCK_SIZE_SB8X8); super_block_uvrd_for_txfm(cm, x, &rate_uv, &distortion_uv, - &uv_skippable, NULL, + &uv_skippable, &uv_sse, BLOCK_SIZE_SB8X8, TX_4X4); rate2 += rate_uv; distortion2 += distortion_uv; skippable = skippable && uv_skippable; + total_sse += uv_sse; txfm_cache[ONLY_4X4] = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); for (i = 0; i < NB_TXFM_MODES; ++i) @@ -3624,7 +3635,7 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, } } } else if (mb_skip_allowed && ref_frame != INTRA_FRAME && - this_mode != SPLITMV && !xd->lossless) { + !xd->lossless) { if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) < RDCOST(x->rdmult, x->rddiv, 0, total_sse)) { // Add in the cost of the no skip flag. -- 2.40.0