#include "mem.h" #include #include "wavelet.h" static void fwd_analyze_1 (const TYPE *x, TYPE *d, int stride, int n) { int i, k=n/2; for (i=0; i 1) d[k-1] = x[(2*k-1)*stride] - (x[(2*k-2)*stride] + x[2*k*stride]) / 2; } else { for (i=1; i 2) d[k-2] = x[(2*k-3)*stride] - (x[(2*k-4)*stride] + x[(2*k-2)*stride]) / 2; if (k > 1) d[k-1] = x[(n-1)*stride] - x[(n-2)*stride]; } } static void fwd_synthesize_4 (const TYPE *x, TYPE *s, const TYPE *d, int stride, int n) { int i, k=n/2; s[0] = x[0] + d[1] / 2; if (k > 1) s[stride] = x[2*stride] + (d[0] + d[1]) / 4; for (i=2; i 2) s[(k-1)*stride] = x[(2*k-2)*stride] + (d[k-2] + d[k-1]) / 4; if (n & 1) s[k*stride] = x[2*k*stride] + d[k-1] / 2; } static void inv_analyze_4 (TYPE *x, const TYPE *d, int stride, int n) { int i, k=n/2; x[stride] = d[0] + (x[0] + x[2*stride]) / 2; if (n & 1) { for (i=1; i 1) x[(2*k-1)*stride] = d[k-1] + (x[(2*k-2)*stride] + x[2*k*stride]) / 2; } else { for (i=1; i 2) x[(2*k-3)*stride] = d[k-2] + (x[(2*k-4)*stride] + x[(2*k-2)*stride]) / 2; if (k > 1) x[(n-1)*stride] = d[k-1] + x[(n-2)*stride]; } } static void inv_synthesize_4 (TYPE *x, const TYPE *s, const TYPE *d, int stride, int n) { int i, k=n/2; x[0] = s[0] - d[1] / 2; if (k > 1) x[2*stride] = s[1] - (d[0] + d[1]) / 4; for (i=2; i 2) x[(2*k-2)*stride] = s[k-1] - (d[k-2] + d[k-1]) / 4; if (n & 1) x[2*k*stride] = s[k] - d[k-1] / 2; } static inline void copyback_d (TYPE *x, const TYPE *d, int stride, int n) { int i, j, k=n/2; for (i=n-k, j=0; iscales-1; level>0; level--) { uint32_t w = buf->w[level]; uint32_t h = buf->h[level]; uint32_t f = buf->f[level]; if (w > 1) { int row, frame; for (frame=0; framedata + (frame * buf->height + row) * buf->width; fwd_xform (buf->scratchbuf, data, 1, w, a_moments, s_moments); } } } if (h > 1) { int col, frame; for (frame=0; framedata + frame * buf->width * buf->height + col; fwd_xform (buf->scratchbuf, data, buf->width, h, a_moments, s_moments); } } } if (f > 1) { int i, j; for (j=0; jdata + j*buf->width + i; fwd_xform (buf->scratchbuf, data, buf->width * buf->height, f, a_moments, s_moments); } } } } } void wavelet_3d_buf_inv_xform (Wavelet3DBuf* buf, int a_moments, int s_moments) { int level; for (level=1; levelscales; level++) { uint32_t w = buf->w[level]; uint32_t h = buf->h[level]; uint32_t f = buf->f[level]; if (f > 1) { int i, j; for (j=0; jdata + j*buf->width + i; inv_xform (buf->scratchbuf, data, buf->width * buf->height, f, a_moments, s_moments); } } } if (h > 1) { int col, frame; for (frame=0; framedata + frame * buf->width * buf->height + col; inv_xform (buf->scratchbuf, data, buf->width, h, a_moments, s_moments); } } } if (w > 1) { int row, frame; for (frame=0; framedata + (frame * buf->height + row) * buf->width; inv_xform (buf->scratchbuf, data, 1, w, a_moments, s_moments); } } } } }