diff options
author | Yaowu Xu <yaowu@google.com> | 2012-05-09 17:19:16 -0700 |
---|---|---|
committer | Yaowu Xu <yaowu@google.com> | 2012-05-10 16:32:47 -0700 |
commit | 7968d29fedfda970bf49b20c5ef1a227df2b745a (patch) | |
tree | 04034191a9d9c32f0969d05c31e90cc0e2c7c000 /vp8/encoder | |
parent | 54cf1d9ad3fe7ee3d0ce843b2a640f3fcf361887 (diff) | |
download | libvpx-7968d29fedfda970bf49b20c5ef1a227df2b745a.tar libvpx-7968d29fedfda970bf49b20c5ef1a227df2b745a.tar.gz libvpx-7968d29fedfda970bf49b20c5ef1a227df2b745a.tar.bz2 libvpx-7968d29fedfda970bf49b20c5ef1a227df2b745a.zip |
Reversible WHT pair
This commit changed the forward and the inverse 4x4 Walsh Hadamard
transform to a new pair, where the inverse transform can pefectly
reconstuct the input to forward transform. It also does so without
changing the input and output value range. Even more, it does not
change the complexity of the transforms.
While it was not expected to improve the results of our current test,
it does improve std-hd set by 0.2% on all metrics. No change on derf.
Change-Id: Ie4f23ddd3a0f3c5fbe97fb58399f860031f99337
Diffstat (limited to 'vp8/encoder')
-rw-r--r-- | vp8/encoder/dct.c | 63 |
1 files changed, 24 insertions, 39 deletions
diff --git a/vp8/encoder/dct.c b/vp8/encoder/dct.c index c2f2d1117..e7505619a 100644 --- a/vp8/encoder/dct.c +++ b/vp8/encoder/dct.c @@ -13,10 +13,6 @@ #include "vpx_ports/config.h" - - - - void vp8_short_fdct8x8_c(short *block, short *coefs, int pitch) { int j1, i, j, k; @@ -181,52 +177,41 @@ void vp8_short_walsh4x4_c(short *input, short *output, int pitch) { int i; int a1, b1, c1, d1; - int a2, b2, c2, d2; short *ip = input; short *op = output; - + int pitch_short = pitch >>1; for (i = 0; i < 4; i++) { - a1 = ((ip[0] + ip[2])); - d1 = ((ip[1] + ip[3])); - c1 = ((ip[1] - ip[3])); - b1 = ((ip[0] - ip[2])); - - op[0] = a1 + d1; - op[1] = b1 + c1; - op[2] = b1 - c1; - op[3] = a1 - d1; - ip += pitch / 2; - op += 4; - } + a1 = ip[0 * pitch_short] + ip[3 * pitch_short]; + b1 = ip[1 * pitch_short] + ip[2 * pitch_short]; + c1 = ip[1 * pitch_short] - ip[2 * pitch_short]; + d1 = ip[0 * pitch_short] - ip[3 * pitch_short]; + op[0] = (a1 + b1 + 1)>>1; + op[4] = (c1 + d1)>>1; + op[8] = (a1 - b1)>>1; + op[12]= (d1 - c1)>>1; + + ip++; + op++; + } ip = output; op = output; for (i = 0; i < 4; i++) { - a1 = ip[0] + ip[8]; - d1 = ip[4] + ip[12]; - c1 = ip[4] - ip[12]; - b1 = ip[0] - ip[8]; - - a2 = a1 + d1; - b2 = b1 + c1; - c2 = b1 - c1; - d2 = a1 - d1; - - a2 += a2<0; - b2 += b2<0; - c2 += c2<0; - d2 += d2<0; - - op[0] = (a2+1) >> 2; - op[4] = (b2+1) >> 2; - op[8] = (c2+1) >> 2; - op[12]= (d2+1) >> 2; + a1 = ip[0] + ip[3]; + b1 = ip[1] + ip[2]; + c1 = ip[1] - ip[2]; + d1 = ip[0] - ip[3]; - ip++; - op++; + op[0] = (a1 + b1 + 1)>>1; + op[1] = (c1 + d1)>>1; + op[2] = (a1 - b1)>>1; + op[3] = (d1 - c1)>>1; + + ip += 4; + op += 4; } } |