ref: 8c3f18efa175be5ee6b26efcba5fdb5611e5119a
parent: af3cab7b245fd8f60ed6a0699f6321ac19986515
author: Marco <[email protected]>
date: Thu Jul 6 09:06:39 EDT 2017
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
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1166,7 +1166,7 @@
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);
--- a/vp9/encoder/vp9_pickmode.c
+++ b/vp9/encoder/vp9_pickmode.c
@@ -1928,9 +1928,14 @@
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 &&