OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 <assert.h> | 11 #include <assert.h> |
12 | 12 |
13 #include "./vpx_config.h" | 13 #include "./vpx_config.h" |
14 #include "./vp9_rtcd.h" | 14 #include "./vp9_rtcd.h" |
15 #include "vp9/common/vp9_common.h" | 15 #include "vp9/common/vp9_common.h" |
16 #include "vp9/common/vp9_convolve.h" | 16 #include "vp9/common/vp9_convolve.h" |
17 #include "vp9/common/vp9_filter.h" | 17 #include "vp9/common/vp9_filter.h" |
18 #include "vpx/vpx_integer.h" | 18 #include "vpx/vpx_integer.h" |
19 #include "vpx_ports/mem.h" | 19 #include "vpx_ports/mem.h" |
20 | 20 |
21 static void convolve_horiz_c(const uint8_t *src, ptrdiff_t src_stride, | 21 static void convolve_horiz(const uint8_t *src, ptrdiff_t src_stride, |
22 uint8_t *dst, ptrdiff_t dst_stride, | 22 uint8_t *dst, ptrdiff_t dst_stride, |
23 const int16_t *filter_x0, int x_step_q4, | 23 const subpel_kernel *x_filters, |
24 const int16_t *filter_y, int y_step_q4, | 24 int x0_q4, int x_step_q4, int w, int h) { |
25 int w, int h, int taps) { | 25 int x, y; |
26 int x, y, k; | 26 src -= SUBPEL_TAPS / 2 - 1; |
27 | |
28 /* NOTE: This assumes that the filter table is 256-byte aligned. */ | |
29 /* TODO(agrange) Modify to make independent of table alignment. */ | |
30 const int16_t *const filter_x_base = | |
31 (const int16_t *)(((intptr_t)filter_x0) & ~(intptr_t)0xff); | |
32 | |
33 /* Adjust base pointer address for this source line */ | |
34 src -= taps / 2 - 1; | |
35 | |
36 for (y = 0; y < h; ++y) { | 27 for (y = 0; y < h; ++y) { |
37 /* Initial phase offset */ | 28 int x_q4 = x0_q4; |
38 int x_q4 = (int)(filter_x0 - filter_x_base) / taps; | |
39 | |
40 for (x = 0; x < w; ++x) { | 29 for (x = 0; x < w; ++x) { |
41 /* Per-pixel src offset */ | 30 const uint8_t *const src_x = &src[x_q4 >> SUBPEL_BITS]; |
42 const int src_x = x_q4 >> SUBPEL_BITS; | 31 const int16_t *const x_filter = x_filters[x_q4 & SUBPEL_MASK]; |
43 int sum = 0; | 32 int k, sum = 0; |
44 | 33 for (k = 0; k < SUBPEL_TAPS; ++k) |
45 /* Pointer to filter to use */ | 34 sum += src_x[k] * x_filter[k]; |
46 const int16_t *const filter_x = filter_x_base + | |
47 (x_q4 & SUBPEL_MASK) * taps; | |
48 | |
49 for (k = 0; k < taps; ++k) | |
50 sum += src[src_x + k] * filter_x[k]; | |
51 | |
52 dst[x] = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)); | 35 dst[x] = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)); |
53 | |
54 /* Move to the next source pixel */ | |
55 x_q4 += x_step_q4; | 36 x_q4 += x_step_q4; |
56 } | 37 } |
57 src += src_stride; | 38 src += src_stride; |
58 dst += dst_stride; | 39 dst += dst_stride; |
59 } | 40 } |
60 } | 41 } |
61 | 42 |
62 static void convolve_avg_horiz_c(const uint8_t *src, ptrdiff_t src_stride, | 43 static void convolve_avg_horiz(const uint8_t *src, ptrdiff_t src_stride, |
63 uint8_t *dst, ptrdiff_t dst_stride, | 44 uint8_t *dst, ptrdiff_t dst_stride, |
64 const int16_t *filter_x0, int x_step_q4, | 45 const subpel_kernel *x_filters, |
65 const int16_t *filter_y, int y_step_q4, | 46 int x0_q4, int x_step_q4, int w, int h) { |
66 int w, int h, int taps) { | 47 int x, y; |
67 int x, y, k; | 48 src -= SUBPEL_TAPS / 2 - 1; |
68 | |
69 /* NOTE: This assumes that the filter table is 256-byte aligned. */ | |
70 /* TODO(agrange) Modify to make independent of table alignment. */ | |
71 const int16_t *const filter_x_base = | |
72 (const int16_t *)(((intptr_t)filter_x0) & ~(intptr_t)0xff); | |
73 | |
74 /* Adjust base pointer address for this source line */ | |
75 src -= taps / 2 - 1; | |
76 | |
77 for (y = 0; y < h; ++y) { | 49 for (y = 0; y < h; ++y) { |
78 /* Initial phase offset */ | 50 int x_q4 = x0_q4; |
79 int x_q4 = (int)(filter_x0 - filter_x_base) / taps; | |
80 | |
81 for (x = 0; x < w; ++x) { | 51 for (x = 0; x < w; ++x) { |
82 /* Per-pixel src offset */ | 52 const uint8_t *const src_x = &src[x_q4 >> SUBPEL_BITS]; |
83 const int src_x = x_q4 >> SUBPEL_BITS; | 53 const int16_t *const x_filter = x_filters[x_q4 & SUBPEL_MASK]; |
84 int sum = 0; | 54 int k, sum = 0; |
85 | 55 for (k = 0; k < SUBPEL_TAPS; ++k) |
86 /* Pointer to filter to use */ | 56 sum += src_x[k] * x_filter[k]; |
87 const int16_t *const filter_x = filter_x_base + | |
88 (x_q4 & SUBPEL_MASK) * taps; | |
89 | |
90 for (k = 0; k < taps; ++k) | |
91 sum += src[src_x + k] * filter_x[k]; | |
92 | |
93 dst[x] = ROUND_POWER_OF_TWO(dst[x] + | 57 dst[x] = ROUND_POWER_OF_TWO(dst[x] + |
94 clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)), 1); | 58 clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)), 1); |
95 | |
96 /* Move to the next source pixel */ | |
97 x_q4 += x_step_q4; | 59 x_q4 += x_step_q4; |
98 } | 60 } |
99 src += src_stride; | 61 src += src_stride; |
100 dst += dst_stride; | 62 dst += dst_stride; |
101 } | 63 } |
102 } | 64 } |
103 | 65 |
104 static void convolve_vert_c(const uint8_t *src, ptrdiff_t src_stride, | 66 static void convolve_vert(const uint8_t *src, ptrdiff_t src_stride, |
105 uint8_t *dst, ptrdiff_t dst_stride, | 67 uint8_t *dst, ptrdiff_t dst_stride, |
106 const int16_t *filter_x, int x_step_q4, | 68 const subpel_kernel *y_filters, |
107 const int16_t *filter_y0, int y_step_q4, | 69 int y0_q4, int y_step_q4, int w, int h) { |
108 int w, int h, int taps) { | 70 int x, y; |
109 int x, y, k; | 71 src -= src_stride * (SUBPEL_TAPS / 2 - 1); |
110 | |
111 /* NOTE: This assumes that the filter table is 256-byte aligned. */ | |
112 /* TODO(agrange) Modify to make independent of table alignment. */ | |
113 const int16_t *const filter_y_base = | |
114 (const int16_t *)(((intptr_t)filter_y0) & ~(intptr_t)0xff); | |
115 | |
116 /* Adjust base pointer address for this source column */ | |
117 src -= src_stride * (taps / 2 - 1); | |
118 | 72 |
119 for (x = 0; x < w; ++x) { | 73 for (x = 0; x < w; ++x) { |
120 /* Initial phase offset */ | 74 int y_q4 = y0_q4; |
121 int y_q4 = (int)(filter_y0 - filter_y_base) / taps; | |
122 | |
123 for (y = 0; y < h; ++y) { | 75 for (y = 0; y < h; ++y) { |
124 /* Per-pixel src offset */ | 76 const unsigned char *src_y = &src[(y_q4 >> SUBPEL_BITS) * src_stride]; |
125 const int src_y = y_q4 >> SUBPEL_BITS; | 77 const int16_t *const y_filter = y_filters[y_q4 & SUBPEL_MASK]; |
126 int sum = 0; | 78 int k, sum = 0; |
127 | 79 for (k = 0; k < SUBPEL_TAPS; ++k) |
128 /* Pointer to filter to use */ | 80 sum += src_y[k * src_stride] * y_filter[k]; |
129 const int16_t *const filter_y = filter_y_base + | 81 dst[y * dst_stride] = clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)); |
130 (y_q4 & SUBPEL_MASK) * taps; | |
131 | |
132 for (k = 0; k < taps; ++k) | |
133 sum += src[(src_y + k) * src_stride] * filter_y[k]; | |
134 | |
135 dst[y * dst_stride] = | |
136 clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)); | |
137 | |
138 /* Move to the next source pixel */ | |
139 y_q4 += y_step_q4; | 82 y_q4 += y_step_q4; |
140 } | 83 } |
141 ++src; | 84 ++src; |
142 ++dst; | 85 ++dst; |
143 } | 86 } |
144 } | 87 } |
145 | 88 |
146 static void convolve_avg_vert_c(const uint8_t *src, ptrdiff_t src_stride, | 89 static void convolve_avg_vert(const uint8_t *src, ptrdiff_t src_stride, |
147 uint8_t *dst, ptrdiff_t dst_stride, | 90 uint8_t *dst, ptrdiff_t dst_stride, |
148 const int16_t *filter_x, int x_step_q4, | 91 const subpel_kernel *y_filters, |
149 const int16_t *filter_y0, int y_step_q4, | 92 int y0_q4, int y_step_q4, int w, int h) { |
150 int w, int h, int taps) { | 93 int x, y; |
151 int x, y, k; | 94 src -= src_stride * (SUBPEL_TAPS / 2 - 1); |
152 | |
153 /* NOTE: This assumes that the filter table is 256-byte aligned. */ | |
154 /* TODO(agrange) Modify to make independent of table alignment. */ | |
155 const int16_t *const filter_y_base = | |
156 (const int16_t *)(((intptr_t)filter_y0) & ~(intptr_t)0xff); | |
157 | |
158 /* Adjust base pointer address for this source column */ | |
159 src -= src_stride * (taps / 2 - 1); | |
160 | 95 |
161 for (x = 0; x < w; ++x) { | 96 for (x = 0; x < w; ++x) { |
162 /* Initial phase offset */ | 97 int y_q4 = y0_q4; |
163 int y_q4 = (int)(filter_y0 - filter_y_base) / taps; | |
164 | |
165 for (y = 0; y < h; ++y) { | 98 for (y = 0; y < h; ++y) { |
166 /* Per-pixel src offset */ | 99 const unsigned char *src_y = &src[(y_q4 >> SUBPEL_BITS) * src_stride]; |
167 const int src_y = y_q4 >> SUBPEL_BITS; | 100 const int16_t *const y_filter = y_filters[y_q4 & SUBPEL_MASK]; |
168 int sum = 0; | 101 int k, sum = 0; |
169 | 102 for (k = 0; k < SUBPEL_TAPS; ++k) |
170 /* Pointer to filter to use */ | 103 sum += src_y[k * src_stride] * y_filter[k]; |
171 const int16_t *const filter_y = filter_y_base + | |
172 (y_q4 & SUBPEL_MASK) * taps; | |
173 | |
174 for (k = 0; k < taps; ++k) | |
175 sum += src[(src_y + k) * src_stride] * filter_y[k]; | |
176 | |
177 dst[y * dst_stride] = ROUND_POWER_OF_TWO(dst[y * dst_stride] + | 104 dst[y * dst_stride] = ROUND_POWER_OF_TWO(dst[y * dst_stride] + |
178 clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)), 1); | 105 clip_pixel(ROUND_POWER_OF_TWO(sum, FILTER_BITS)), 1); |
179 | |
180 /* Move to the next source pixel */ | |
181 y_q4 += y_step_q4; | 106 y_q4 += y_step_q4; |
182 } | 107 } |
183 ++src; | 108 ++src; |
184 ++dst; | 109 ++dst; |
185 } | 110 } |
186 } | 111 } |
187 | 112 |
188 static void convolve_c(const uint8_t *src, ptrdiff_t src_stride, | 113 static void convolve(const uint8_t *src, ptrdiff_t src_stride, |
189 uint8_t *dst, ptrdiff_t dst_stride, | 114 uint8_t *dst, ptrdiff_t dst_stride, |
190 const int16_t *filter_x, int x_step_q4, | 115 const subpel_kernel *const x_filters, |
191 const int16_t *filter_y, int y_step_q4, | 116 int x0_q4, int x_step_q4, |
192 int w, int h, int taps) { | 117 const subpel_kernel *const y_filters, |
193 /* Fixed size intermediate buffer places limits on parameters. | 118 int y0_q4, int y_step_q4, |
194 * Maximum intermediate_height is 324, for y_step_q4 == 80, | 119 int w, int h) { |
195 * h == 64, taps == 8. | 120 // Fixed size intermediate buffer places limits on parameters. |
196 * y_step_q4 of 80 allows for 1/10 scale for 5 layer svc | 121 // Maximum intermediate_height is 324, for y_step_q4 == 80, |
197 */ | 122 // h == 64, taps == 8. |
| 123 // y_step_q4 of 80 allows for 1/10 scale for 5 layer svc |
198 uint8_t temp[64 * 324]; | 124 uint8_t temp[64 * 324]; |
199 int intermediate_height = (((h - 1) * y_step_q4 + 15) >> 4) + taps; | 125 int intermediate_height = (((h - 1) * y_step_q4 + 15) >> 4) + SUBPEL_TAPS; |
200 | 126 |
201 assert(w <= 64); | 127 assert(w <= 64); |
202 assert(h <= 64); | 128 assert(h <= 64); |
203 assert(taps <= 8); | |
204 assert(y_step_q4 <= 80); | 129 assert(y_step_q4 <= 80); |
205 assert(x_step_q4 <= 80); | 130 assert(x_step_q4 <= 80); |
206 | 131 |
207 if (intermediate_height < h) | 132 if (intermediate_height < h) |
208 intermediate_height = h; | 133 intermediate_height = h; |
209 | 134 |
210 convolve_horiz_c(src - src_stride * (taps / 2 - 1), src_stride, temp, 64, | 135 convolve_horiz(src - src_stride * (SUBPEL_TAPS / 2 - 1), src_stride, temp, 64, |
211 filter_x, x_step_q4, filter_y, y_step_q4, w, | 136 x_filters, x0_q4, x_step_q4, w, intermediate_height); |
212 intermediate_height, taps); | 137 convolve_vert(temp + 64 * (SUBPEL_TAPS / 2 - 1), 64, dst, dst_stride, |
213 convolve_vert_c(temp + 64 * (taps / 2 - 1), 64, dst, dst_stride, filter_x, | 138 y_filters, y0_q4, y_step_q4, w, h); |
214 x_step_q4, filter_y, y_step_q4, w, h, taps); | 139 } |
| 140 |
| 141 static const subpel_kernel *get_filter_base(const int16_t *filter) { |
| 142 // NOTE: This assumes that the filter table is 256-byte aligned. |
| 143 // TODO(agrange) Modify to make independent of table alignment. |
| 144 return (const subpel_kernel *)(((intptr_t)filter) & ~((intptr_t)0xFF)); |
| 145 } |
| 146 |
| 147 static int get_filter_offset(const int16_t *f, const subpel_kernel *base) { |
| 148 return (const subpel_kernel *)(intptr_t)f - base; |
215 } | 149 } |
216 | 150 |
217 void vp9_convolve8_horiz_c(const uint8_t *src, ptrdiff_t src_stride, | 151 void vp9_convolve8_horiz_c(const uint8_t *src, ptrdiff_t src_stride, |
218 uint8_t *dst, ptrdiff_t dst_stride, | 152 uint8_t *dst, ptrdiff_t dst_stride, |
219 const int16_t *filter_x, int x_step_q4, | 153 const int16_t *filter_x, int x_step_q4, |
220 const int16_t *filter_y, int y_step_q4, | 154 const int16_t *filter_y, int y_step_q4, |
221 int w, int h) { | 155 int w, int h) { |
222 convolve_horiz_c(src, src_stride, dst, dst_stride, | 156 const subpel_kernel *const filters_x = get_filter_base(filter_x); |
223 filter_x, x_step_q4, filter_y, y_step_q4, w, h, 8); | 157 const int x0_q4 = get_filter_offset(filter_x, filters_x); |
| 158 |
| 159 convolve_horiz(src, src_stride, dst, dst_stride, filters_x, |
| 160 x0_q4, x_step_q4, w, h); |
224 } | 161 } |
225 | 162 |
226 void vp9_convolve8_avg_horiz_c(const uint8_t *src, ptrdiff_t src_stride, | 163 void vp9_convolve8_avg_horiz_c(const uint8_t *src, ptrdiff_t src_stride, |
227 uint8_t *dst, ptrdiff_t dst_stride, | 164 uint8_t *dst, ptrdiff_t dst_stride, |
228 const int16_t *filter_x, int x_step_q4, | 165 const int16_t *filter_x, int x_step_q4, |
229 const int16_t *filter_y, int y_step_q4, | 166 const int16_t *filter_y, int y_step_q4, |
230 int w, int h) { | 167 int w, int h) { |
231 convolve_avg_horiz_c(src, src_stride, dst, dst_stride, | 168 const subpel_kernel *const filters_x = get_filter_base(filter_x); |
232 filter_x, x_step_q4, filter_y, y_step_q4, w, h, 8); | 169 const int x0_q4 = get_filter_offset(filter_x, filters_x); |
| 170 |
| 171 convolve_avg_horiz(src, src_stride, dst, dst_stride, filters_x, |
| 172 x0_q4, x_step_q4, w, h); |
233 } | 173 } |
234 | 174 |
235 void vp9_convolve8_vert_c(const uint8_t *src, ptrdiff_t src_stride, | 175 void vp9_convolve8_vert_c(const uint8_t *src, ptrdiff_t src_stride, |
236 uint8_t *dst, ptrdiff_t dst_stride, | 176 uint8_t *dst, ptrdiff_t dst_stride, |
237 const int16_t *filter_x, int x_step_q4, | 177 const int16_t *filter_x, int x_step_q4, |
238 const int16_t *filter_y, int y_step_q4, | 178 const int16_t *filter_y, int y_step_q4, |
239 int w, int h) { | 179 int w, int h) { |
240 convolve_vert_c(src, src_stride, dst, dst_stride, | 180 const subpel_kernel *const filters_y = get_filter_base(filter_y); |
241 filter_x, x_step_q4, filter_y, y_step_q4, w, h, 8); | 181 const int y0_q4 = get_filter_offset(filter_y, filters_y); |
| 182 convolve_vert(src, src_stride, dst, dst_stride, filters_y, |
| 183 y0_q4, y_step_q4, w, h); |
242 } | 184 } |
243 | 185 |
244 void vp9_convolve8_avg_vert_c(const uint8_t *src, ptrdiff_t src_stride, | 186 void vp9_convolve8_avg_vert_c(const uint8_t *src, ptrdiff_t src_stride, |
245 uint8_t *dst, ptrdiff_t dst_stride, | 187 uint8_t *dst, ptrdiff_t dst_stride, |
246 const int16_t *filter_x, int x_step_q4, | 188 const int16_t *filter_x, int x_step_q4, |
247 const int16_t *filter_y, int y_step_q4, | 189 const int16_t *filter_y, int y_step_q4, |
248 int w, int h) { | 190 int w, int h) { |
249 convolve_avg_vert_c(src, src_stride, dst, dst_stride, | 191 const subpel_kernel *const filters_y = get_filter_base(filter_y); |
250 filter_x, x_step_q4, filter_y, y_step_q4, w, h, 8); | 192 const int y0_q4 = get_filter_offset(filter_y, filters_y); |
| 193 convolve_avg_vert(src, src_stride, dst, dst_stride, filters_y, |
| 194 y0_q4, y_step_q4, w, h); |
251 } | 195 } |
252 | 196 |
253 void vp9_convolve8_c(const uint8_t *src, ptrdiff_t src_stride, | 197 void vp9_convolve8_c(const uint8_t *src, ptrdiff_t src_stride, |
254 uint8_t *dst, ptrdiff_t dst_stride, | 198 uint8_t *dst, ptrdiff_t dst_stride, |
255 const int16_t *filter_x, int x_step_q4, | 199 const int16_t *filter_x, int x_step_q4, |
256 const int16_t *filter_y, int y_step_q4, | 200 const int16_t *filter_y, int y_step_q4, |
257 int w, int h) { | 201 int w, int h) { |
258 convolve_c(src, src_stride, dst, dst_stride, | 202 const subpel_kernel *const filters_x = get_filter_base(filter_x); |
259 filter_x, x_step_q4, filter_y, y_step_q4, w, h, 8); | 203 const int x0_q4 = get_filter_offset(filter_x, filters_x); |
| 204 |
| 205 const subpel_kernel *const filters_y = get_filter_base(filter_y); |
| 206 const int y0_q4 = get_filter_offset(filter_y, filters_y); |
| 207 |
| 208 convolve(src, src_stride, dst, dst_stride, |
| 209 filters_x, x0_q4, x_step_q4, |
| 210 filters_y, y0_q4, y_step_q4, w, h); |
260 } | 211 } |
261 | 212 |
262 void vp9_convolve8_avg_c(const uint8_t *src, ptrdiff_t src_stride, | 213 void vp9_convolve8_avg_c(const uint8_t *src, ptrdiff_t src_stride, |
263 uint8_t *dst, ptrdiff_t dst_stride, | 214 uint8_t *dst, ptrdiff_t dst_stride, |
264 const int16_t *filter_x, int x_step_q4, | 215 const int16_t *filter_x, int x_step_q4, |
265 const int16_t *filter_y, int y_step_q4, | 216 const int16_t *filter_y, int y_step_q4, |
266 int w, int h) { | 217 int w, int h) { |
267 /* Fixed size intermediate buffer places limits on parameters. */ | 218 /* Fixed size intermediate buffer places limits on parameters. */ |
268 DECLARE_ALIGNED_ARRAY(16, uint8_t, temp, 64 * 64); | 219 DECLARE_ALIGNED_ARRAY(16, uint8_t, temp, 64 * 64); |
269 assert(w <= 64); | 220 assert(w <= 64); |
270 assert(h <= 64); | 221 assert(h <= 64); |
271 | 222 |
272 vp9_convolve8(src, src_stride, temp, 64, | 223 vp9_convolve8_c(src, src_stride, temp, 64, |
273 filter_x, x_step_q4, filter_y, y_step_q4, w, h); | 224 filter_x, x_step_q4, filter_y, y_step_q4, w, h); |
274 vp9_convolve_avg(temp, 64, dst, dst_stride, NULL, 0, NULL, 0, w, h); | 225 vp9_convolve_avg_c(temp, 64, dst, dst_stride, NULL, 0, NULL, 0, w, h); |
275 } | 226 } |
276 | 227 |
277 void vp9_convolve_copy_c(const uint8_t *src, ptrdiff_t src_stride, | 228 void vp9_convolve_copy_c(const uint8_t *src, ptrdiff_t src_stride, |
278 uint8_t *dst, ptrdiff_t dst_stride, | 229 uint8_t *dst, ptrdiff_t dst_stride, |
279 const int16_t *filter_x, int filter_x_stride, | 230 const int16_t *filter_x, int filter_x_stride, |
280 const int16_t *filter_y, int filter_y_stride, | 231 const int16_t *filter_y, int filter_y_stride, |
281 int w, int h) { | 232 int w, int h) { |
282 int r; | 233 int r; |
283 | 234 |
284 for (r = h; r > 0; --r) { | 235 for (r = h; r > 0; --r) { |
(...skipping 11 matching lines...) Expand all Loading... |
296 int x, y; | 247 int x, y; |
297 | 248 |
298 for (y = 0; y < h; ++y) { | 249 for (y = 0; y < h; ++y) { |
299 for (x = 0; x < w; ++x) | 250 for (x = 0; x < w; ++x) |
300 dst[x] = ROUND_POWER_OF_TWO(dst[x] + src[x], 1); | 251 dst[x] = ROUND_POWER_OF_TWO(dst[x] + src[x], 1); |
301 | 252 |
302 src += src_stride; | 253 src += src_stride; |
303 dst += dst_stride; | 254 dst += dst_stride; |
304 } | 255 } |
305 } | 256 } |
OLD | NEW |