ref: 7a89d4c3d4e5470be8f1eae25e08a90ab47e16a3
parent: 0ba32632cd0ba6a11248141acb9747279c71679d
parent: b62d093efa8bc100462995ffd8d067fe1f49612c
author: Yaowu Xu <yaowu@google.com>
date: Mon Jul 19 03:50:26 EDT 2010
Merge "Improve the accuracy of forward walsh-hadamard transform"
--- a/vp8/encoder/dct.c
+++ b/vp8/encoder/dct.c
@@ -69,17 +69,18 @@
short *ip = input;
short *op = output;
+
for (i = 0; i < 4; i++)
{
- a1 = ip[0] + ip[3];
- b1 = ip[1] + ip[2];
- c1 = ip[1] - ip[2];
- d1 = ip[0] - ip[3];
+ a1 = ((ip[0] + ip[2])<<2);
+ d1 = ((ip[1] + ip[3])<<2);
+ c1 = ((ip[1] - ip[3])<<2);
+ b1 = ((ip[0] - ip[2])<<2);
- op[0] = a1 + b1;
- op[1] = c1 + d1;
- op[2] = a1 - b1;
- op[3] = d1 - c1;
+ op[0] = a1 + d1 + (a1!=0);
+ op[1] = b1 + c1;
+ op[2] = b1 - c1;
+ op[3] = a1 - d1;
ip += pitch / 2;
op += 4;
}
@@ -89,25 +90,25 @@
for (i = 0; i < 4; i++)
{
- a1 = ip[0] + ip[12];
- b1 = ip[4] + ip[8];
- c1 = ip[4] - ip[8];
- d1 = ip[0] - ip[12];
+ a1 = ip[0] + ip[8];
+ d1 = ip[4] + ip[12];
+ c1 = ip[4] - ip[12];
+ b1 = ip[0] - ip[8];
- a2 = a1 + b1;
- b2 = c1 + d1;
- c2 = a1 - b1;
- d2 = d1 - c1;
+ a2 = a1 + d1;
+ b2 = b1 + c1;
+ c2 = b1 - c1;
+ d2 = a1 - d1;
- a2 += (a2 > 0);
- b2 += (b2 > 0);
- c2 += (c2 > 0);
- d2 += (d2 > 0);
+ a2 += a2<0;
+ b2 += b2<0;
+ c2 += c2<0;
+ d2 += d2<0;
- op[0] = (a2) >> 1;
- op[4] = (b2) >> 1;
- op[8] = (c2) >> 1;
- op[12] = (d2) >> 1;
+ op[0] = (a2+3) >> 3;
+ op[4] = (b2+3) >> 3;
+ op[8] = (c2+3) >> 3;
+ op[12]= (d2+3) >> 3;
ip++;
op++;
--- a/vp8/encoder/x86/x86_csystemdependent.c
+++ b/vp8/encoder/x86/x86_csystemdependent.c
@@ -278,7 +278,7 @@
cpi->rtcd.fdct.fast4x4 = vp8_short_fdct4x4_sse2;
cpi->rtcd.fdct.fast8x4 = vp8_short_fdct8x4_sse2;
- cpi->rtcd.fdct.walsh_short4x4 = vp8_short_walsh4x4_sse2;
+ cpi->rtcd.fdct.walsh_short4x4 = vp8_short_walsh4x4_c ;
cpi->rtcd.encodemb.berr = vp8_block_error_xmm;
cpi->rtcd.encodemb.mberr = vp8_mbblock_error_xmm;