summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Cohen <bencoh@notk.org>2013-05-20 16:12:00 +0200
committerBenjamin Cohen <bencoh@notk.org>2013-05-21 16:49:09 +0200
commit9cad3c0c01d5b4add093472748e02233afdd072a (patch)
tree5c97c27ed48de74104fb2a4b4cd4f3b5b584ebed
parent409ff00fcc58bab8c414b92c00ae380b046dafce (diff)
uref_filter_kernel: optimconvol
-rw-r--r--include/upipe-filters/uref_filter_kernel.h28
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++) {