diff options
author | James Zern <jzern@google.com> | 2020-03-25 00:56:41 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2020-03-25 00:56:41 +0000 |
commit | eda6b925495ee975314f2f5bfcbfea614f5df330 (patch) | |
tree | 865278fa5034a66f8c4d7f315e9d49d35ac9894d /vp9/encoder | |
parent | 5e065cf9d3c622b37eaaebf701d0be6371b890c3 (diff) | |
parent | 81374532905b376cead0958c543c431bac530620 (diff) | |
download | libvpx-eda6b925495ee975314f2f5bfcbfea614f5df330.tar libvpx-eda6b925495ee975314f2f5bfcbfea614f5df330.tar.gz libvpx-eda6b925495ee975314f2f5bfcbfea614f5df330.tar.bz2 libvpx-eda6b925495ee975314f2f5bfcbfea614f5df330.zip |
Merge "Optimize vp9_get_sub_block_energy."
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_aq_variance.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/vp9/encoder/vp9_aq_variance.c b/vp9/encoder/vp9_aq_variance.c index 1f9ce2354..9e5f3bfb2 100644 --- a/vp9/encoder/vp9_aq_variance.c +++ b/vp9/encoder/vp9_aq_variance.c @@ -186,6 +186,17 @@ double vp9_log_block_var(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) { return log(var + 1.0); } +#define DEFAULT_E_MIDPOINT 10.0 +static int scale_block_energy(VP9_COMP *cpi, unsigned int block_var) { + double energy; + double energy_midpoint; + energy_midpoint = + (cpi->oxcf.pass == 2) ? cpi->twopass.mb_av_energy : DEFAULT_E_MIDPOINT; + energy = log(block_var + 1.0) - energy_midpoint; + return clamp((int)round(energy), ENERGY_MIN, ENERGY_MAX); +} +#undef DEFAULT_E_MIDPOINT + // Get the range of sub block energy values; void vp9_get_sub_block_energy(VP9_COMP *cpi, MACROBLOCK *mb, int mi_row, int mi_col, BLOCK_SIZE bsize, int *min_e, @@ -202,31 +213,35 @@ void vp9_get_sub_block_energy(VP9_COMP *cpi, MACROBLOCK *mb, int mi_row, *min_e = vp9_block_energy(cpi, mb, bsize); *max_e = *min_e; } else { - int energy; - *min_e = ENERGY_MAX; - *max_e = ENERGY_MIN; + unsigned int var; + // Because scale_block_energy is non-decreasing, we can find the min/max + // block variance and scale afterwards. This avoids a costly scaling at + // every iteration. + unsigned int min_var = UINT_MAX; + unsigned int max_var = 0; for (y = 0; y < ymis; ++y) { for (x = 0; x < xmis; ++x) { vp9_setup_src_planes(mb, cpi->Source, mi_row + y, mi_col + x); - energy = vp9_block_energy(cpi, mb, BLOCK_8X8); - *min_e = VPXMIN(*min_e, energy); - *max_e = VPXMAX(*max_e, energy); + vpx_clear_system_state(); + var = block_variance(cpi, mb, BLOCK_8X8); + vpx_clear_system_state(); + min_var = VPXMIN(min_var, var); + max_var = VPXMAX(max_var, var); } } + *min_e = scale_block_energy(cpi, min_var); + *max_e = scale_block_energy(cpi, max_var); } // Re-instate source pointers back to what they should have been on entry. vp9_setup_src_planes(mb, cpi->Source, mi_row, mi_col); } -#define DEFAULT_E_MIDPOINT 10.0 int vp9_block_energy(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) { - double energy; - double energy_midpoint; + unsigned int var; vpx_clear_system_state(); - energy_midpoint = - (cpi->oxcf.pass == 2) ? cpi->twopass.mb_av_energy : DEFAULT_E_MIDPOINT; - energy = vp9_log_block_var(cpi, x, bs) - energy_midpoint; - return clamp((int)round(energy), ENERGY_MIN, ENERGY_MAX); + var = block_variance(cpi, x, bs); + vpx_clear_system_state(); + return scale_block_energy(cpi, var); } |