diff options
author | Benjamin Cohen <bencoh@notk.org> | 2013-05-20 16:12:00 +0200 |
---|---|---|
committer | Benjamin Cohen <bencoh@notk.org> | 2013-05-21 16:49:09 +0200 |
commit | 9cad3c0c01d5b4add093472748e02233afdd072a (patch) | |
tree | 5c97c27ed48de74104fb2a4b4cd4f3b5b584ebed | |
parent | 409ff00fcc58bab8c414b92c00ae380b046dafce (diff) |
uref_filter_kernel: optimconvol
-rw-r--r-- | include/upipe-filters/uref_filter_kernel.h | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/include/upipe-filters/uref_filter_kernel.h b/include/upipe-filters/uref_filter_kernel.h index 5556470..ffeff5d 100644 --- a/include/upipe-filters/uref_filter_kernel.h +++ b/include/upipe-filters/uref_filter_kernel.h @@ -28,11 +28,11 @@ static inline void uref_filter_kernel_plane(const uint8_t *src, uint8_t *dst, int sstride, int dstride, int hsize, int vsize, const int8_t *kern, int khsize, int kvsize) { - int i, j, m, n; + int i, j, m, n, kh, kv, maxh, maxv; int norm; - register int sum; - register const uint8_t *line; - register const int8_t *kline; + int sum; + const uint8_t *line, *zone; + const int8_t *kline; norm = 0; for (n=0; n < kvsize*khsize; n++) { @@ -41,19 +41,28 @@ static inline void uref_filter_kernel_plane(const uint8_t *src, uint8_t *dst, assert(khsize < hsize && kvsize < vsize); + /* ignore borders */ + kh = khsize/2; + kv = kvsize/2; + maxh = hsize - kh; + maxv = vsize - kv; + + /* align source with kernel center */ + zone = src - sstride * kv - kh; + #if 1 - for (i=kvsize/2; i < (vsize - kvsize/2); i++) { - for (j=khsize/2; j < (hsize - khsize/2); j++) { + for (i=kv; i < maxv; i++) { + for (j=kh; j < maxh; j++) { sum = 0; - line = src + sstride * (i - kvsize / 2); + line = zone + j; kline = kern; for (m = 0; m < kvsize; m++) { for (n = 0; n < khsize; n++) { - sum += kline[n] * line[j+n-khsize/2]; + sum += *kline++ * *line++; } line += sstride; - kline += khsize; + line -= khsize; } if (norm) { @@ -64,6 +73,7 @@ static inline void uref_filter_kernel_plane(const uint8_t *src, uint8_t *dst, } dst += dstride; + zone += sstride; } #else for (i=0; i < vsize; i++) { |