Browse code

vf_boxblur: Templatize blur{8,16}

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>

Timothy Gu authored on 2015/11/02 03:20:58
Showing 1 changed files
... ...
@@ -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)