OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
| 11 #include "./vp8_rtcd.h" |
| 12 #include "filter.h" |
| 13 #include "variance.h" |
11 | 14 |
12 #include "variance.h" | 15 /* This is a bad idea. |
13 #include "filter.h" | 16 * ctz = count trailing zeros */ |
14 | 17 static int ctz(int a) { |
15 | 18 int b = 0; |
16 unsigned int vp8_get_mb_ss_c | 19 while (a != 1) { |
17 ( | 20 a >>= 1; |
18 const short *src_ptr | 21 b++; |
19 ) | 22 } |
20 { | 23 return b; |
21 unsigned int i = 0, sum = 0; | |
22 | |
23 do | |
24 { | |
25 sum += (src_ptr[i] * src_ptr[i]); | |
26 i++; | |
27 } | |
28 while (i < 256); | |
29 | |
30 return sum; | |
31 } | 24 } |
32 | 25 |
33 | 26 static unsigned int variance( |
34 static void variance( | |
35 const unsigned char *src_ptr, | 27 const unsigned char *src_ptr, |
36 int source_stride, | 28 int source_stride, |
37 const unsigned char *ref_ptr, | 29 const unsigned char *ref_ptr, |
38 int recon_stride, | 30 int recon_stride, |
39 int w, | 31 int w, |
40 int h, | 32 int h, |
41 unsigned int *sse, | 33 unsigned int *sse) |
42 int *sum) | |
43 { | 34 { |
44 int i, j; | 35 int i, j; |
45 int diff; | 36 int diff, sum; |
46 | 37 |
47 *sum = 0; | 38 sum = 0; |
48 *sse = 0; | 39 *sse = 0; |
49 | 40 |
50 for (i = 0; i < h; i++) | 41 for (i = 0; i < h; i++) |
51 { | 42 { |
52 for (j = 0; j < w; j++) | 43 for (j = 0; j < w; j++) |
53 { | 44 { |
54 diff = src_ptr[j] - ref_ptr[j]; | 45 diff = src_ptr[j] - ref_ptr[j]; |
55 *sum += diff; | 46 sum += diff; |
56 *sse += diff * diff; | 47 *sse += diff * diff; |
57 } | 48 } |
58 | 49 |
59 src_ptr += source_stride; | 50 src_ptr += source_stride; |
60 ref_ptr += recon_stride; | 51 ref_ptr += recon_stride; |
61 } | 52 } |
| 53 |
| 54 return (*sse - (((unsigned int)sum * sum) >> (int)((ctz(w) + ctz(h))))); |
62 } | 55 } |
63 | 56 |
64 | |
65 unsigned int vp8_variance16x16_c( | |
66 const unsigned char *src_ptr, | |
67 int source_stride, | |
68 const unsigned char *ref_ptr, | |
69 int recon_stride, | |
70 unsigned int *sse) | |
71 { | |
72 unsigned int var; | |
73 int avg; | |
74 | |
75 | |
76 variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); | |
77 *sse = var; | |
78 return (var - (((unsigned int)avg * avg) >> 8)); | |
79 } | |
80 | |
81 unsigned int vp8_variance8x16_c( | |
82 const unsigned char *src_ptr, | |
83 int source_stride, | |
84 const unsigned char *ref_ptr, | |
85 int recon_stride, | |
86 unsigned int *sse) | |
87 { | |
88 unsigned int var; | |
89 int avg; | |
90 | |
91 | |
92 variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 16, &var, &avg); | |
93 *sse = var; | |
94 return (var - (((unsigned int)avg * avg) >> 7)); | |
95 } | |
96 | |
97 unsigned int vp8_variance16x8_c( | |
98 const unsigned char *src_ptr, | |
99 int source_stride, | |
100 const unsigned char *ref_ptr, | |
101 int recon_stride, | |
102 unsigned int *sse) | |
103 { | |
104 unsigned int var; | |
105 int avg; | |
106 | |
107 | |
108 variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 8, &var, &avg); | |
109 *sse = var; | |
110 return (var - (((unsigned int)avg * avg) >> 7)); | |
111 } | |
112 | |
113 | |
114 unsigned int vp8_variance8x8_c( | |
115 const unsigned char *src_ptr, | |
116 int source_stride, | |
117 const unsigned char *ref_ptr, | |
118 int recon_stride, | |
119 unsigned int *sse) | |
120 { | |
121 unsigned int var; | |
122 int avg; | |
123 | |
124 | |
125 variance(src_ptr, source_stride, ref_ptr, recon_stride, 8, 8, &var, &avg); | |
126 *sse = var; | |
127 return (var - (((unsigned int)avg * avg) >> 6)); | |
128 } | |
129 | |
130 unsigned int vp8_variance4x4_c( | |
131 const unsigned char *src_ptr, | |
132 int source_stride, | |
133 const unsigned char *ref_ptr, | |
134 int recon_stride, | |
135 unsigned int *sse) | |
136 { | |
137 unsigned int var; | |
138 int avg; | |
139 | |
140 | |
141 variance(src_ptr, source_stride, ref_ptr, recon_stride, 4, 4, &var, &avg); | |
142 *sse = var; | |
143 return (var - (((unsigned int)avg * avg) >> 4)); | |
144 } | |
145 | |
146 | |
147 unsigned int vp8_mse16x16_c( | |
148 const unsigned char *src_ptr, | |
149 int source_stride, | |
150 const unsigned char *ref_ptr, | |
151 int recon_stride, | |
152 unsigned int *sse) | |
153 { | |
154 unsigned int var; | |
155 int avg; | |
156 | |
157 variance(src_ptr, source_stride, ref_ptr, recon_stride, 16, 16, &var, &avg); | |
158 *sse = var; | |
159 return var; | |
160 } | |
161 | |
162 | |
163 /**************************************************************************** | 57 /**************************************************************************** |
164 * | 58 * |
165 * ROUTINE : filter_block2d_bil_first_pass | 59 * ROUTINE : filter_block2d_bil_first_pass |
166 * | 60 * |
167 * INPUTS : UINT8 *src_ptr : Pointer to source block. | 61 * INPUTS : UINT8 *src_ptr : Pointer to source block. |
168 * UINT32 src_pixels_per_line : Stride of input block. | 62 * UINT32 src_pixels_per_line : Stride of input block. |
169 * UINT32 pixel_step : Offset between filter input sampl
es (see notes). | 63 * UINT32 pixel_step : Offset between filter input sampl
es (see notes). |
170 * UINT32 output_height : Input block height. | 64 * UINT32 output_height : Input block height. |
171 * UINT32 output_width : Input block width. | 65 * UINT32 output_width : Input block width. |
172 * INT32 *vp8_filter : Array of 2 bi-linear filter ta
ps. | 66 * INT32 *vp8_filter : Array of 2 bi-linear filter ta
ps. |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 | 190 |
297 HFilter = vp8_bilinear_filters[xoffset]; | 191 HFilter = vp8_bilinear_filters[xoffset]; |
298 VFilter = vp8_bilinear_filters[yoffset]; | 192 VFilter = vp8_bilinear_filters[yoffset]; |
299 | 193 |
300 /* First filter 1d Horizontal */ | 194 /* First filter 1d Horizontal */ |
301 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 5
, 4, HFilter); | 195 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 5
, 4, HFilter); |
302 | 196 |
303 /* Now filter Verticaly */ | 197 /* Now filter Verticaly */ |
304 var_filter_block2d_bil_second_pass(FData3, temp2, 4, 4, 4, 4, VFilter); | 198 var_filter_block2d_bil_second_pass(FData3, temp2, 4, 4, 4, 4, VFilter); |
305 | 199 |
306 return vp8_variance4x4_c(temp2, 4, dst_ptr, dst_pixels_per_line, sse); | 200 return variance(temp2, 4, dst_ptr, dst_pixels_per_line, 4, 4, sse); |
307 } | 201 } |
308 | 202 |
309 | 203 |
310 unsigned int vp8_sub_pixel_variance8x8_c | 204 unsigned int vp8_sub_pixel_variance8x8_c |
311 ( | 205 ( |
312 const unsigned char *src_ptr, | 206 const unsigned char *src_ptr, |
313 int src_pixels_per_line, | 207 int src_pixels_per_line, |
314 int xoffset, | 208 int xoffset, |
315 int yoffset, | 209 int yoffset, |
316 const unsigned char *dst_ptr, | 210 const unsigned char *dst_ptr, |
317 int dst_pixels_per_line, | 211 int dst_pixels_per_line, |
318 unsigned int *sse | 212 unsigned int *sse |
319 ) | 213 ) |
320 { | 214 { |
321 unsigned short FData3[9*8]; /* Temp data bufffer used in filtering */ | 215 unsigned short FData3[9*8]; /* Temp data bufffer used in filtering */ |
322 unsigned char temp2[20*16]; | 216 unsigned char temp2[20*16]; |
323 const short *HFilter, *VFilter; | 217 const short *HFilter, *VFilter; |
324 | 218 |
325 HFilter = vp8_bilinear_filters[xoffset]; | 219 HFilter = vp8_bilinear_filters[xoffset]; |
326 VFilter = vp8_bilinear_filters[yoffset]; | 220 VFilter = vp8_bilinear_filters[yoffset]; |
327 | 221 |
328 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9
, 8, HFilter); | 222 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9
, 8, HFilter); |
329 var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 8, 8, VFilter); | 223 var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 8, 8, VFilter); |
330 | 224 |
331 return vp8_variance8x8_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); | 225 return variance(temp2, 8, dst_ptr, dst_pixels_per_line, 8, 8, sse); |
332 } | 226 } |
333 | 227 |
334 unsigned int vp8_sub_pixel_variance16x16_c | 228 unsigned int vp8_sub_pixel_variance16x16_c |
335 ( | 229 ( |
336 const unsigned char *src_ptr, | 230 const unsigned char *src_ptr, |
337 int src_pixels_per_line, | 231 int src_pixels_per_line, |
338 int xoffset, | 232 int xoffset, |
339 int yoffset, | 233 int yoffset, |
340 const unsigned char *dst_ptr, | 234 const unsigned char *dst_ptr, |
341 int dst_pixels_per_line, | 235 int dst_pixels_per_line, |
342 unsigned int *sse | 236 unsigned int *sse |
343 ) | 237 ) |
344 { | 238 { |
345 unsigned short FData3[17*16]; /* Temp data bufffer used in filtering */ | 239 unsigned short FData3[17*16]; /* Temp data bufffer used in filtering */ |
346 unsigned char temp2[20*16]; | 240 unsigned char temp2[20*16]; |
347 const short *HFilter, *VFilter; | 241 const short *HFilter, *VFilter; |
348 | 242 |
349 HFilter = vp8_bilinear_filters[xoffset]; | 243 HFilter = vp8_bilinear_filters[xoffset]; |
350 VFilter = vp8_bilinear_filters[yoffset]; | 244 VFilter = vp8_bilinear_filters[yoffset]; |
351 | 245 |
352 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 1
7, 16, HFilter); | 246 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 1
7, 16, HFilter); |
353 var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 16, 16, VFilter); | 247 var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 16, 16, VFilter); |
354 | 248 |
355 return vp8_variance16x16_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); | 249 return variance(temp2, 16, dst_ptr, dst_pixels_per_line, 16, 16, sse); |
356 } | 250 } |
357 | 251 |
358 | 252 |
359 unsigned int vp8_variance_halfpixvar16x16_h_c( | 253 unsigned int vp8_variance_halfpixvar16x16_h_c( |
360 const unsigned char *src_ptr, | 254 const unsigned char *src_ptr, |
361 int source_stride, | 255 int source_stride, |
362 const unsigned char *ref_ptr, | 256 const unsigned char *ref_ptr, |
363 int recon_stride, | 257 int recon_stride, |
364 unsigned int *sse) | 258 unsigned int *sse) |
365 { | 259 { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 unsigned short FData3[16*9]; /* Temp data bufffer used in filtering */ | 315 unsigned short FData3[16*9]; /* Temp data bufffer used in filtering */ |
422 unsigned char temp2[20*16]; | 316 unsigned char temp2[20*16]; |
423 const short *HFilter, *VFilter; | 317 const short *HFilter, *VFilter; |
424 | 318 |
425 HFilter = vp8_bilinear_filters[xoffset]; | 319 HFilter = vp8_bilinear_filters[xoffset]; |
426 VFilter = vp8_bilinear_filters[yoffset]; | 320 VFilter = vp8_bilinear_filters[yoffset]; |
427 | 321 |
428 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9
, 16, HFilter); | 322 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 9
, 16, HFilter); |
429 var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 8, 16, VFilter); | 323 var_filter_block2d_bil_second_pass(FData3, temp2, 16, 16, 8, 16, VFilter); |
430 | 324 |
431 return vp8_variance16x8_c(temp2, 16, dst_ptr, dst_pixels_per_line, sse); | 325 return variance(temp2, 16, dst_ptr, dst_pixels_per_line, 16, 8, sse); |
432 } | 326 } |
433 | 327 |
434 unsigned int vp8_sub_pixel_variance8x16_c | 328 unsigned int vp8_sub_pixel_variance8x16_c |
435 ( | 329 ( |
436 const unsigned char *src_ptr, | 330 const unsigned char *src_ptr, |
437 int src_pixels_per_line, | 331 int src_pixels_per_line, |
438 int xoffset, | 332 int xoffset, |
439 int yoffset, | 333 int yoffset, |
440 const unsigned char *dst_ptr, | 334 const unsigned char *dst_ptr, |
441 int dst_pixels_per_line, | 335 int dst_pixels_per_line, |
442 unsigned int *sse | 336 unsigned int *sse |
443 ) | 337 ) |
444 { | 338 { |
445 unsigned short FData3[9*16]; /* Temp data bufffer used in filtering */ | 339 unsigned short FData3[9*16]; /* Temp data bufffer used in filtering */ |
446 unsigned char temp2[20*16]; | 340 unsigned char temp2[20*16]; |
447 const short *HFilter, *VFilter; | 341 const short *HFilter, *VFilter; |
448 | 342 |
449 | 343 |
450 HFilter = vp8_bilinear_filters[xoffset]; | 344 HFilter = vp8_bilinear_filters[xoffset]; |
451 VFilter = vp8_bilinear_filters[yoffset]; | 345 VFilter = vp8_bilinear_filters[yoffset]; |
452 | 346 |
453 | 347 |
454 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 1
7, 8, HFilter); | 348 var_filter_block2d_bil_first_pass(src_ptr, FData3, src_pixels_per_line, 1, 1
7, 8, HFilter); |
455 var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 16, 8, VFilter); | 349 var_filter_block2d_bil_second_pass(FData3, temp2, 8, 8, 16, 8, VFilter); |
456 | 350 |
457 return vp8_variance8x16_c(temp2, 8, dst_ptr, dst_pixels_per_line, sse); | 351 return variance(temp2, 8, dst_ptr, dst_pixels_per_line, 8, 16, sse); |
458 } | 352 } |
OLD | NEW |