summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorJames Zern <jzern@google.com>2020-03-25 00:56:41 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2020-03-25 00:56:41 +0000
commiteda6b925495ee975314f2f5bfcbfea614f5df330 (patch)
tree865278fa5034a66f8c4d7f315e9d49d35ac9894d /vp9/encoder
parent5e065cf9d3c622b37eaaebf701d0be6371b890c3 (diff)
parent81374532905b376cead0958c543c431bac530620 (diff)
downloadlibvpx-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.c41
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);
}