OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ |
| 10 |
| 11 |
| 12 #include "vp9/encoder/vp9_variance.h" |
| 13 #include "vp9/common/vp9_filter.h" |
| 14 #include "vp9/common/vp9_subpelvar.h" |
| 15 #include "vpx/vpx_integer.h" |
| 16 |
| 17 unsigned int vp9_get_mb_ss_c(const short *src_ptr) { |
| 18 unsigned int i, sum = 0; |
| 19 |
| 20 for (i = 0; i < 256; i++) { |
| 21 sum += (src_ptr[i] * src_ptr[i]); |
| 22 } |
| 23 |
| 24 return sum; |
| 25 } |
| 26 |
| 27 |
| 28 |
| 29 #if CONFIG_SUPERBLOCKS |
| 30 unsigned int vp9_variance32x32_c(const unsigned char *src_ptr, |
| 31 int source_stride, |
| 32 const unsigned char *ref_ptr, |
| 33 int recon_stride, |
| 34 unsigned int *sse) { |
| 35 unsigned int var; |
| 36 int avg; |
| 37 |
| 38 variance(src_ptr, source_stride, ref_ptr, recon_stride, 32, 32, &var, &avg); |
| 39 *sse = var; |
| 40 return (var - (((int64_t)avg * avg) >> 10)); |
| 41 } |
| 42 #endif |
| 43 |
| 44 unsigned int vp9_variance16x16_c(const unsigned char *src_ptr, |
| 45 int source_stride, |
| 46 const unsigned char *ref_ptr, |
| 47 int recon_stride, |
| 48 unsigned int *sse) { |
| 49 unsigned int var; |
| 50 int avg; |
| 51 |
| 52 variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); |
| 53 *sse = var; |
| 54 return (var - (((unsigned int)avg * avg) >> 8)); |
| 55 } |
| 56 |
| 57 unsigned int vp9_variance8x16_c(const unsigned char *src_ptr, |
| 58 int source_stride, |
| 59 const unsigned char *ref_ptr, |
| 60 int recon_stride, |
| 61 unsigned int *sse) { |
| 62 unsigned int var; |
| 63 int avg; |
| 64 |
| 65 variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 16, &var, &avg); |
| 66 *sse = var; |
| 67 return (var - (((unsigned int)avg * avg) >> 7)); |
| 68 } |
| 69 |
| 70 unsigned int vp9_variance16x8_c(const unsigned char *src_ptr, |
| 71 int source_stride, |
| 72 const unsigned char *ref_ptr, |
| 73 int recon_stride, |
| 74 unsigned int *sse) { |
| 75 unsigned int var; |
| 76 int avg; |
| 77 |
| 78 variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 8, &var, &avg); |
| 79 *sse = var; |
| 80 return (var - (((unsigned int)avg * avg) >> 7)); |
| 81 } |
| 82 |
| 83 |
| 84 unsigned int vp9_variance8x8_c(const unsigned char *src_ptr, |
| 85 int source_stride, |
| 86 const unsigned char *ref_ptr, |
| 87 int recon_stride, |
| 88 unsigned int *sse) { |
| 89 unsigned int var; |
| 90 int avg; |
| 91 |
| 92 variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 8, &var, &avg); |
| 93 *sse = var; |
| 94 return (var - (((unsigned int)avg * avg) >> 6)); |
| 95 } |
| 96 |
| 97 unsigned int vp9_variance4x4_c(const unsigned char *src_ptr, |
| 98 int source_stride, |
| 99 const unsigned char *ref_ptr, |
| 100 int recon_stride, |
| 101 unsigned int *sse) { |
| 102 unsigned int var; |
| 103 int avg; |
| 104 |
| 105 variance(src_ptr, source_stride, ref_ptr, recon_stride, 4, 4, &var, &avg); |
| 106 *sse = var; |
| 107 return (var - (((unsigned int)avg * avg) >> 4)); |
| 108 } |
| 109 |
| 110 |
| 111 unsigned int vp9_mse16x16_c(const unsigned char *src_ptr, |
| 112 int source_stride, |
| 113 const unsigned char *ref_ptr, |
| 114 int recon_stride, |
| 115 unsigned int *sse) { |
| 116 unsigned int var; |
| 117 int avg; |
| 118 |
| 119 variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); |
| 120 *sse = var; |
| 121 return var; |
| 122 } |
| 123 |
| 124 |
| 125 unsigned int vp9_sub_pixel_variance4x4_c(const unsigned char *src_ptr, |
| 126 int src_pixels_per_line, |
| 127 int xoffset, |
| 128 int yoffset, |
| 129 const unsigned char *dst_ptr, |
| 130 int dst_pixels_per_line, |
| 131 unsigned int *sse) { |
| 132 unsigned char temp2[20 * 16]; |
| 133 const short *HFilter, *VFilter; |
| 134 unsigned short FData3[5 * 4]; // Temp data bufffer used in filtering |
| 135 |
| 136 HFilter = vp9_bilinear_filters[xoffset]; |
| 137 VFilter = vp9_bilinear_filters[yoffset]; |
| 138 |
| 139 // First filter 1d Horizontal |
| 140 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 5,
4, HFilter); |
| 141 |
| 142 // Now filter Verticaly |
| 143 var_filter_block2d_bil_second_pass(FData3, temp2, 4, 4, 4, 4, VFilter); |
| 144 |
| 145 return vp9_variance4x4_c(temp2, 4, dst_ptr, dst_pixels_per_line, sse); |
| 146 } |
| 147 |
| 148 |
| 149 unsigned int vp9_sub_pixel_variance8x8_c(const unsigned char *src_ptr, |
| 150 int src_pixels_per_line, |
| 151 int xoffset, |
| 152 int yoffset, |
| 153 const unsigned char *dst_ptr, |
| 154 int dst_pixels_per_line, |
| 155 unsigned int *sse) { |
| 156 unsigned short FData3[9 * 8]; // Temp data bufffer used in filtering |
| 157 unsigned char temp2[20 * 16]; |
| 158 const short *HFilter, *VFilter; |
| 159 |
| 160 HFilter = vp9_bilinear_filters[xoffset]; |
| 161 VFilter = vp9_bilinear_filters[yoffset]; |
| 162 |
| 163 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9,
8, HFilter); |
| 164 var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 8, 8, VFilter); |
| 165 |
| 166 return vp9_variance8x8_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); |
| 167 } |
| 168 |
| 169 unsigned int vp9_sub_pixel_variance16x16_c(const unsigned char *src_ptr, |
| 170 int src_pixels_per_line, |
| 171 int xoffset, |
| 172 int yoffset, |
| 173 const unsigned char *dst_ptr, |
| 174 int dst_pixels_per_line, |
| 175 unsigned int *sse) { |
| 176 unsigned short FData3[17 * 16]; // Temp data bufffer used in filtering |
| 177 unsigned char temp2[20 * 16]; |
| 178 const short *HFilter, *VFilter; |
| 179 |
| 180 HFilter = vp9_bilinear_filters[xoffset]; |
| 181 VFilter = vp9_bilinear_filters[yoffset]; |
| 182 |
| 183 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 17,
16, HFilter); |
| 184 var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 16, 16, VFilter); |
| 185 |
| 186 return vp9_variance16x16_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); |
| 187 } |
| 188 |
| 189 #if CONFIG_SUPERBLOCKS |
| 190 unsigned int vp9_sub_pixel_variance32x32_c(const unsigned char *src_ptr, |
| 191 int src_pixels_per_line, |
| 192 int xoffset, |
| 193 int yoffset, |
| 194 const unsigned char *dst_ptr, |
| 195 int dst_pixels_per_line, |
| 196 unsigned int *sse) { |
| 197 unsigned short FData3[33 * 32]; // Temp data bufffer used in filtering |
| 198 unsigned char temp2[36 * 32]; |
| 199 const short *HFilter, *VFilter; |
| 200 |
| 201 HFilter = vp9_bilinear_filters[xoffset]; |
| 202 VFilter = vp9_bilinear_filters[yoffset]; |
| 203 |
| 204 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 33,
32, HFilter); |
| 205 var_filter_block2d_bil_second_pass(FData3, temp2, 32, 32, 32, 32, VFilter); |
| 206 |
| 207 return vp9_variance32x32_c(temp2, 32, dst_ptr, dst_pixels_per_line, sse); |
| 208 } |
| 209 #endif |
| 210 |
| 211 unsigned int vp9_variance_halfpixvar16x16_h_c(const unsigned char *src_ptr, |
| 212 int source_stride, |
| 213 const unsigned char *ref_ptr, |
| 214 int recon_stride, |
| 215 unsigned int *sse) { |
| 216 return vp9_sub_pixel_variance16x16_c(src_ptr, source_stride, 8, 0, |
| 217 ref_ptr, recon_stride, sse); |
| 218 } |
| 219 |
| 220 #if CONFIG_SUPERBLOCKS |
| 221 unsigned int vp9_variance_halfpixvar32x32_h_c(const unsigned char *src_ptr, |
| 222 int source_stride, |
| 223 const unsigned char *ref_ptr, |
| 224 int recon_stride, |
| 225 unsigned int *sse) { |
| 226 return vp9_sub_pixel_variance32x32_c(src_ptr, source_stride, 8, 0, |
| 227 ref_ptr, recon_stride, sse); |
| 228 } |
| 229 #endif |
| 230 |
| 231 |
| 232 unsigned int vp9_variance_halfpixvar16x16_v_c(const unsigned char *src_ptr, |
| 233 int source_stride, |
| 234 const unsigned char *ref_ptr, |
| 235 int recon_stride, |
| 236 unsigned int *sse) { |
| 237 return vp9_sub_pixel_variance16x16_c(src_ptr, source_stride, 0, 8, |
| 238 ref_ptr, recon_stride, sse); |
| 239 } |
| 240 |
| 241 #if CONFIG_SUPERBLOCKS |
| 242 unsigned int vp9_variance_halfpixvar32x32_v_c(const unsigned char *src_ptr, |
| 243 int source_stride, |
| 244 const unsigned char *ref_ptr, |
| 245 int recon_stride, |
| 246 unsigned int *sse) { |
| 247 return vp9_sub_pixel_variance32x32_c(src_ptr, source_stride, 0, 8, |
| 248 ref_ptr, recon_stride, sse); |
| 249 } |
| 250 #endif |
| 251 |
| 252 unsigned int vp9_variance_halfpixvar16x16_hv_c(const unsigned char *src_ptr, |
| 253 int source_stride, |
| 254 const unsigned char *ref_ptr, |
| 255 int recon_stride, |
| 256 unsigned int *sse) { |
| 257 return vp9_sub_pixel_variance16x16_c(src_ptr, source_stride, 8, 8, |
| 258 ref_ptr, recon_stride, sse); |
| 259 } |
| 260 |
| 261 #if CONFIG_SUPERBLOCKS |
| 262 unsigned int vp9_variance_halfpixvar32x32_hv_c(const unsigned char *src_ptr, |
| 263 int source_stride, |
| 264 const unsigned char *ref_ptr, |
| 265 int recon_stride, |
| 266 unsigned int *sse) { |
| 267 return vp9_sub_pixel_variance32x32_c(src_ptr, source_stride, 8, 8, |
| 268 ref_ptr, recon_stride, sse); |
| 269 } |
| 270 #endif |
| 271 |
| 272 unsigned int vp9_sub_pixel_mse16x16_c(const unsigned char *src_ptr, |
| 273 int src_pixels_per_line, |
| 274 int xoffset, |
| 275 int yoffset, |
| 276 const unsigned char *dst_ptr, |
| 277 int dst_pixels_per_line, |
| 278 unsigned int *sse) { |
| 279 vp9_sub_pixel_variance16x16_c(src_ptr, src_pixels_per_line, |
| 280 xoffset, yoffset, dst_ptr, |
| 281 dst_pixels_per_line, sse); |
| 282 return *sse; |
| 283 } |
| 284 |
| 285 #if CONFIG_SUPERBLOCKS |
| 286 unsigned int vp9_sub_pixel_mse32x32_c(const unsigned char *src_ptr, |
| 287 int src_pixels_per_line, |
| 288 int xoffset, |
| 289 int yoffset, |
| 290 const unsigned char *dst_ptr, |
| 291 int dst_pixels_per_line, |
| 292 unsigned int *sse) { |
| 293 vp9_sub_pixel_variance32x32_c(src_ptr, src_pixels_per_line, |
| 294 xoffset, yoffset, dst_ptr, |
| 295 dst_pixels_per_line, sse); |
| 296 return *sse; |
| 297 } |
| 298 #endif |
| 299 |
| 300 unsigned int vp9_sub_pixel_variance16x8_c(const unsigned char *src_ptr, |
| 301 int src_pixels_per_line, |
| 302 int xoffset, |
| 303 int yoffset, |
| 304 const unsigned char *dst_ptr, |
| 305 int dst_pixels_per_line, |
| 306 unsigned int *sse) { |
| 307 unsigned short FData3[16 * 9]; // Temp data bufffer used in filtering |
| 308 unsigned char temp2[20 * 16]; |
| 309 const short *HFilter, *VFilter; |
| 310 |
| 311 HFilter = vp9_bilinear_filters[xoffset]; |
| 312 VFilter = vp9_bilinear_filters[yoffset]; |
| 313 |
| 314 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9,
16, HFilter); |
| 315 var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 8, 16, VFilter); |
| 316 |
| 317 return vp9_variance16x8_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); |
| 318 } |
| 319 |
| 320 unsigned int vp9_sub_pixel_variance8x16_c(const unsigned char *src_ptr, |
| 321 int src_pixels_per_line, |
| 322 int xoffset, |
| 323 int yoffset, |
| 324 const unsigned char *dst_ptr, |
| 325 int dst_pixels_per_line, |
| 326 unsigned int *sse) { |
| 327 unsigned short FData3[9 * 16]; // Temp data bufffer used in filtering |
| 328 unsigned char temp2[20 * 16]; |
| 329 const short *HFilter, *VFilter; |
| 330 |
| 331 HFilter = vp9_bilinear_filters[xoffset]; |
| 332 VFilter = vp9_bilinear_filters[yoffset]; |
| 333 |
| 334 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, |
| 335 1, 17, 8, HFilter); |
| 336 var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 16, 8, VFilter); |
| 337 |
| 338 return vp9_variance8x16_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); |
| 339 } |
| 340 |
OLD | NEW |