Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Timothy Gu authored on 2015/11/02 03:20:58... | ... |
@@ -204,75 +204,53 @@ static int config_input(AVFilterLink *inlink) |
204 | 204 |
return 0; |
205 | 205 |
} |
206 | 206 |
|
207 |
-static inline void blur8(uint8_t *dst, int dst_step, const uint8_t *src, int src_step, |
|
208 |
- int len, int radius) |
|
209 |
-{ |
|
210 |
- /* Naive boxblur would sum source pixels from x-radius .. x+radius |
|
211 |
- * for destination pixel x. That would be O(radius*width). |
|
212 |
- * If you now look at what source pixels represent 2 consecutive |
|
213 |
- * output pixels, then you see they are almost identical and only |
|
214 |
- * differ by 2 pixels, like: |
|
215 |
- * src0 111111111 |
|
216 |
- * dst0 1 |
|
217 |
- * src1 111111111 |
|
218 |
- * dst1 1 |
|
219 |
- * src0-src1 1 -1 |
|
220 |
- * so when you know one output pixel you can find the next by just adding |
|
221 |
- * and subtracting 1 input pixel. |
|
222 |
- * The following code adopts this faster variant. |
|
223 |
- */ |
|
224 |
- const int length = radius*2 + 1; |
|
225 |
- const int inv = ((1<<16) + length/2)/length; |
|
226 |
- int x, sum = src[radius*src_step]; |
|
227 |
- |
|
228 |
- for (x = 0; x < radius; x++) |
|
229 |
- sum += src[x*src_step]<<1; |
|
230 |
- |
|
231 |
- sum = sum*inv + (1<<15); |
|
232 |
- |
|
233 |
- for (x = 0; x <= radius; x++) { |
|
234 |
- sum += (src[(radius+x)*src_step] - src[(radius-x)*src_step])*inv; |
|
235 |
- dst[x*dst_step] = sum>>16; |
|
236 |
- } |
|
237 |
- |
|
238 |
- for (; x < len-radius; x++) { |
|
239 |
- sum += (src[(radius+x)*src_step] - src[(x-radius-1)*src_step])*inv; |
|
240 |
- dst[x*dst_step] = sum >>16; |
|
241 |
- } |
|
242 |
- |
|
243 |
- for (; x < len; x++) { |
|
244 |
- sum += (src[(2*len-radius-x-1)*src_step] - src[(x-radius-1)*src_step])*inv; |
|
245 |
- dst[x*dst_step] = sum>>16; |
|
246 |
- } |
|
207 |
+/* Naive boxblur would sum source pixels from x-radius .. x+radius |
|
208 |
+ * for destination pixel x. That would be O(radius*width). |
|
209 |
+ * If you now look at what source pixels represent 2 consecutive |
|
210 |
+ * output pixels, then you see they are almost identical and only |
|
211 |
+ * differ by 2 pixels, like: |
|
212 |
+ * src0 111111111 |
|
213 |
+ * dst0 1 |
|
214 |
+ * src1 111111111 |
|
215 |
+ * dst1 1 |
|
216 |
+ * src0-src1 1 -1 |
|
217 |
+ * so when you know one output pixel you can find the next by just adding |
|
218 |
+ * and subtracting 1 input pixel. |
|
219 |
+ * The following code adopts this faster variant. |
|
220 |
+ */ |
|
221 |
+#define BLUR(type, depth) \ |
|
222 |
+static inline void blur ## depth(type *dst, int dst_step, const type *src, \ |
|
223 |
+ int src_step, int len, int radius) \ |
|
224 |
+{ \ |
|
225 |
+ const int length = radius*2 + 1; \ |
|
226 |
+ const int inv = ((1<<16) + length/2)/length; \ |
|
227 |
+ int x, sum = src[radius*src_step]; \ |
|
228 |
+ \ |
|
229 |
+ for (x = 0; x < radius; x++) \ |
|
230 |
+ sum += src[x*src_step]<<1; \ |
|
231 |
+ \ |
|
232 |
+ sum = sum*inv + (1<<15); \ |
|
233 |
+ \ |
|
234 |
+ for (x = 0; x <= radius; x++) { \ |
|
235 |
+ sum += (src[(radius+x)*src_step] - src[(radius-x)*src_step])*inv; \ |
|
236 |
+ dst[x*dst_step] = sum>>16; \ |
|
237 |
+ } \ |
|
238 |
+ \ |
|
239 |
+ for (; x < len-radius; x++) { \ |
|
240 |
+ sum += (src[(radius+x)*src_step] - src[(x-radius-1)*src_step])*inv; \ |
|
241 |
+ dst[x*dst_step] = sum >>16; \ |
|
242 |
+ } \ |
|
243 |
+ \ |
|
244 |
+ for (; x < len; x++) { \ |
|
245 |
+ sum += (src[(2*len-radius-x-1)*src_step] - src[(x-radius-1)*src_step])*inv; \ |
|
246 |
+ dst[x*dst_step] = sum>>16; \ |
|
247 |
+ } \ |
|
247 | 248 |
} |
248 | 249 |
|
249 |
-static inline void blur16(uint16_t *dst, int dst_step, const uint16_t *src, int src_step, |
|
250 |
- int len, int radius) |
|
251 |
-{ |
|
252 |
- const int length = radius*2 + 1; |
|
253 |
- const int inv = ((1<<16) + length/2)/length; |
|
254 |
- int x, sum = src[radius*src_step]; |
|
255 |
- |
|
256 |
- for (x = 0; x < radius; x++) |
|
257 |
- sum += src[x*src_step]<<1; |
|
258 |
- |
|
259 |
- sum = sum*inv + (1<<15); |
|
260 |
- |
|
261 |
- for (x = 0; x <= radius; x++) { |
|
262 |
- sum += (src[(radius+x)*src_step] - src[(radius-x)*src_step])*inv; |
|
263 |
- dst[x*dst_step] = sum>>16; |
|
264 |
- } |
|
265 |
- |
|
266 |
- for (; x < len-radius; x++) { |
|
267 |
- sum += (src[(radius+x)*src_step] - src[(x-radius-1)*src_step])*inv; |
|
268 |
- dst[x*dst_step] = sum >>16; |
|
269 |
- } |
|
250 |
+BLUR(uint8_t, 8) |
|
251 |
+BLUR(uint16_t, 16) |
|
270 | 252 |
|
271 |
- for (; x < len; x++) { |
|
272 |
- sum += (src[(2*len-radius-x-1)*src_step] - src[(x-radius-1)*src_step])*inv; |
|
273 |
- dst[x*dst_step] = sum>>16; |
|
274 |
- } |
|
275 |
-} |
|
253 |
+#undef BLUR |
|
276 | 254 |
|
277 | 255 |
static inline void blur(uint8_t *dst, int dst_step, const uint8_t *src, int src_step, |
278 | 256 |
int len, int radius, int pixsize) |