History

Merge "Optimize vp9_get_sub_block_energy."

James Zern committed 6 years ago

Commit eda6b922 parents 5e065cf 81374531 file · +28 −13Browse files

Unified · Split

vp9/encoder/vp9_aq_variance.c+28−13
@@ -186,6 +186,17 @@ double vp9_log_block_var(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) { · 185 unmodified lines
186 return log(var + 1.0);186 return log(var + 1.0);
187}187}
188 188
189#define DEFAULT_E_MIDPOINT 10.0
190static int scale_block_energy(VP9_COMP *cpi, unsigned int block_var) {
191 double energy;
192 double energy_midpoint;
193 energy_midpoint =
194 (cpi->oxcf.pass == 2) ? cpi->twopass.mb_av_energy : DEFAULT_E_MIDPOINT;
195 energy = log(block_var + 1.0) - energy_midpoint;
196 return clamp((int)round(energy), ENERGY_MIN, ENERGY_MAX);
197}
198#undef DEFAULT_E_MIDPOINT
199
189// Get the range of sub block energy values;200// Get the range of sub block energy values;
190void vp9_get_sub_block_energy(VP9_COMP *cpi, MACROBLOCK *mb, int mi_row,201void vp9_get_sub_block_energy(VP9_COMP *cpi, MACROBLOCK *mb, int mi_row,
191 int mi_col, BLOCK_SIZE bsize, int *min_e,202 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, · 10 unmodified lines
202 *min_e = vp9_block_energy(cpi, mb, bsize);213 *min_e = vp9_block_energy(cpi, mb, bsize);
203 *max_e = *min_e;214 *max_e = *min_e;
204 } else {215 } else {
205 int energy;216 unsigned int var;
206 *min_e = ENERGY_MAX;217 // Because scale_block_energy is non-decreasing, we can find the min/max
207 *max_e = ENERGY_MIN;218 // block variance and scale afterwards. This avoids a costly scaling at
219 // every iteration.
220 unsigned int min_var = UINT_MAX;
221 unsigned int max_var = 0;
208 222
209 for (y = 0; y < ymis; ++y) {223 for (y = 0; y < ymis; ++y) {
210 for (x = 0; x < xmis; ++x) {224 for (x = 0; x < xmis; ++x) {
211 vp9_setup_src_planes(mb, cpi->Source, mi_row + y, mi_col + x);225 vp9_setup_src_planes(mb, cpi->Source, mi_row + y, mi_col + x);
212 energy = vp9_block_energy(cpi, mb, BLOCK_8X8);226 vpx_clear_system_state();
213 *min_e = VPXMIN(*min_e, energy);227 var = block_variance(cpi, mb, BLOCK_8X8);
214 *max_e = VPXMAX(*max_e, energy);228 vpx_clear_system_state();
229 min_var = VPXMIN(min_var, var);
230 max_var = VPXMAX(max_var, var);
215 }231 }
216 }232 }
233 *min_e = scale_block_energy(cpi, min_var);
234 *max_e = scale_block_energy(cpi, max_var);
217 }235 }
218 236
219 // Re-instate source pointers back to what they should have been on entry.237 // Re-instate source pointers back to what they should have been on entry.
220 vp9_setup_src_planes(mb, cpi->Source, mi_row, mi_col);238 vp9_setup_src_planes(mb, cpi->Source, mi_row, mi_col);
221}239}
222 240
223#define DEFAULT_E_MIDPOINT 10.0
224int vp9_block_energy(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) {241int vp9_block_energy(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) {
225 double energy;242 unsigned int var;
226 double energy_midpoint;
227 vpx_clear_system_state();243 vpx_clear_system_state();
228 energy_midpoint =244 var = block_variance(cpi, x, bs);
229 (cpi->oxcf.pass == 2) ? cpi->twopass.mb_av_energy : DEFAULT_E_MIDPOINT;245 vpx_clear_system_state();
230 energy = vp9_log_block_var(cpi, x, bs) - energy_midpoint;246 return scale_block_energy(cpi, var);
231 return clamp((int)round(energy), ENERGY_MIN, ENERGY_MAX);
232}247}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t