From 8c3f18efa175be5ee6b26efcba5fdb5611e5119a Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 6 Jul 2017 13:06:39 -0700 Subject: [PATCH] vp9: Nonrd mode: use content_state_sb for high motion. In the content_state for a superblock is set to HighSad, use that to bias some decisions in variance partition and nonrd pickmde: use int_pro_motion for sad computation in choose_partitioning, and set large_block in pickmode based on the content_state_sb. Only affects speed >= 7. Immprovement for high motion content. Small gain (~1%) in RTC metrics. Speedup of ~5 for high motion clip on android (speed 8, 1 thread). Change-Id: I5774c4854f012b89c8e969f6129b60988c2ce11c --- vp9/encoder/vp9_encodeframe.c | 2 +- vp9/encoder/vp9_pickmode.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 0601eacfa..1ca3ccc2b 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -1166,7 +1166,7 @@ static int choose_partitioning(VP9_COMP *cpi, const TileInfo *const tile, mi->mv[0].as_int = 0; mi->interp_filter = BILINEAR; - if (cpi->oxcf.speed >= 8 && !low_res) + if (cpi->oxcf.speed >= 8 && !low_res && x->content_state_sb != kVeryHighSad) y_sad = cpi->fn_ptr[bsize].sdf( x->plane[0].src.buf, x->plane[0].src.stride, xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride); diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 46b6b3561..f340ef208 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -1928,9 +1928,14 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data, pd->dst.stride = this_mode_pred->stride; } } else { - const int large_block = (x->sb_is_skin || cpi->oxcf.speed < 7) - ? bsize > BLOCK_32X32 - : bsize >= BLOCK_32X32; + // For low motion content use x->sb_is_skin in addition to VeryHighSad + // for setting large_block. + const int large_block = + (x->content_state_sb == kVeryHighSad || + (x->sb_is_skin && cpi->rc.avg_frame_low_motion > 70) || + cpi->oxcf.speed < 7) + ? bsize > BLOCK_32X32 + : bsize >= BLOCK_32X32; mi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP : filter_ref; if (cpi->use_svc && ref_frame == GOLDEN_FRAME && -- 2.40.0