Unified · Split
| @@ -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 | ||
| 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 | // Get the range of sub block energy values; | 200 | // Get the range of sub block energy values; |
| 190 | void vp9_get_sub_block_energy(VP9_COMP *cpi, MACROBLOCK *mb, int mi_row, | 201 | void 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 | ||
| 224 | int vp9_block_energy(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) { | 241 | int 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 | } |