Unified · Split
| @@ -186,6 +186,17 @@ double vp9_log_block_var(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) { · 185 unmodified lines | ||
| 186 | 186 | return log(var + 1.0); |
| 187 | 187 | } |
| 188 | 188 | |
| 189 | +#define DEFAULT_E_MIDPOINT 10.0 | |
| 190 | +static 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 | 200 | // Get the range of sub block energy values; |
| 190 | 201 | void vp9_get_sub_block_energy(VP9_COMP *cpi, MACROBLOCK *mb, int mi_row, |
| 191 | 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 | 213 | *min_e = vp9_block_energy(cpi, mb, bsize); |
| 203 | 214 | *max_e = *min_e; |
| 204 | 215 | } else { |
| 205 | − int energy; | |
| 206 | − *min_e = ENERGY_MAX; | |
| 207 | − *max_e = ENERGY_MIN; | |
| 216 | + unsigned int var; | |
| 217 | + // Because scale_block_energy is non-decreasing, we can find the min/max | |
| 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 | 223 | for (y = 0; y < ymis; ++y) { |
| 210 | 224 | for (x = 0; x < xmis; ++x) { |
| 211 | 225 | vp9_setup_src_planes(mb, cpi->Source, mi_row + y, mi_col + x); |
| 212 | − energy = vp9_block_energy(cpi, mb, BLOCK_8X8); | |
| 213 | − *min_e = VPXMIN(*min_e, energy); | |
| 214 | − *max_e = VPXMAX(*max_e, energy); | |
| 226 | + vpx_clear_system_state(); | |
| 227 | + var = block_variance(cpi, mb, BLOCK_8X8); | |
| 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 | 237 | // Re-instate source pointers back to what they should have been on entry. |
| 220 | 238 | vp9_setup_src_planes(mb, cpi->Source, mi_row, mi_col); |
| 221 | 239 | } |
| 222 | 240 | |
| 223 | −#define DEFAULT_E_MIDPOINT 10.0 | |
| 224 | 241 | int vp9_block_energy(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) { |
| 225 | − double energy; | |
| 226 | − double energy_midpoint; | |
| 242 | + unsigned int var; | |
| 227 | 243 | vpx_clear_system_state(); |
| 228 | − energy_midpoint = | |
| 229 | − (cpi->oxcf.pass == 2) ? cpi->twopass.mb_av_energy : DEFAULT_E_MIDPOINT; | |
| 230 | − energy = vp9_log_block_var(cpi, x, bs) - energy_midpoint; | |
| 231 | − return clamp((int)round(energy), ENERGY_MIN, ENERGY_MAX); | |
| 244 | + var = block_variance(cpi, x, bs); | |
| 245 | + vpx_clear_system_state(); | |
| 246 | + return scale_block_energy(cpi, var); | |
| 232 | 247 | } |