summaryrefslogtreecommitdiff
path: root/vp8/common/idctllm.c
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2012-08-06 14:48:11 -0700
committerJingning Han <jingning@google.com>2012-08-06 17:26:21 -0700
commit66f440f1ee6c993eff908da9c75cc2ae9de08775 (patch)
tree9acba48b175763d24a3597cd042e866d2f290909 /vp8/common/idctllm.c
parent106815f830c9874ee9c663124b3ff41f095219ab (diff)
downloadlibvpx-66f440f1ee6c993eff908da9c75cc2ae9de08775.tar
libvpx-66f440f1ee6c993eff908da9c75cc2ae9de08775.tar.gz
libvpx-66f440f1ee6c993eff908da9c75cc2ae9de08775.tar.bz2
libvpx-66f440f1ee6c993eff908da9c75cc2ae9de08775.zip
Refactoring hybrid transform coding
The forward and inverse hybrid transforms are now performed using single function modules, where the dimension is sent as argument. Added an inline function clip8b to clip the reconstruction pixels into range of 0-255. Change-Id: Id7d870b3e1aefc092721c80c0af6f641eb5f3747
Diffstat (limited to 'vp8/common/idctllm.c')
-rw-r--r--vp8/common/idctllm.c168
1 files changed, 33 insertions, 135 deletions
diff --git a/vp8/common/idctllm.c b/vp8/common/idctllm.c
index 616e4938e..5c7bf78d2 100644
--- a/vp8/common/idctllm.c
+++ b/vp8/common/idctllm.c
@@ -93,120 +93,17 @@ float iadst_8[64] = {
};
#endif
-#if CONFIG_HYBRIDTRANSFORM
-void vp8_iht4x4llm_c(short *input, short *output, int pitch, TX_TYPE tx_type) {
- int i, j, k;
- float bufa[16], bufb[16]; // buffers are for floating-point test purpose
- // the implementation could be simplified in
- // conjunction with integer transform
- short *ip = input;
- short *op = output;
- int shortpitch = pitch >> 1;
-
- float *pfa = &bufa[0];
- float *pfb = &bufb[0];
-
- // pointers to vertical and horizontal transforms
- float *ptv, *pth;
-
- // load and convert residual array into floating-point
- for(j = 0; j < 4; j++) {
- for(i = 0; i < 4; i++) {
- pfa[i] = (float)ip[i];
- }
- pfa += 4;
- ip += 4;
- }
-
- // vertical transformation
- pfa = &bufa[0];
- pfb = &bufb[0];
-
- switch(tx_type) {
- case ADST_ADST :
- case ADST_DCT :
- ptv = &iadst_4[0];
- break;
-
- default :
- ptv = &idct_4[0];
- break;
- }
-
- for(j = 0; j < 4; j++) {
- for(i = 0; i < 4; i++) {
- pfb[i] = 0 ;
- for(k = 0; k < 4; k++) {
- pfb[i] += ptv[k] * pfa[(k<<2)];
- }
- pfa += 1;
- }
-
- pfb += 4;
- ptv += 4;
- pfa = &bufa[0];
- }
-
- // horizontal transformation
- pfa = &bufa[0];
- pfb = &bufb[0];
-
- switch(tx_type) {
- case ADST_ADST :
- case DCT_ADST :
- pth = &iadst_4[0];
- break;
-
- default :
- pth = &idct_4[0];
- break;
- }
-
- for(j = 0; j < 4; j++) {
- for(i = 0; i < 4; i++) {
- pfa[i] = 0;
- for(k = 0; k < 4; k++) {
- pfa[i] += pfb[k] * pth[k];
- }
- pth += 4;
- }
-
- pfa += 4;
- pfb += 4;
-
- switch(tx_type) {
- case ADST_ADST :
- case DCT_ADST :
- pth = &iadst_4[0];
- break;
-
- default :
- pth = &idct_4[0];
- break;
- }
- }
-
- // convert to short integer format and load BLOCKD buffer
- op = output;
- pfa = &bufa[0];
-
- for(j = 0; j < 4; j++) {
- for(i = 0; i < 4; i++) {
- op[i] = (pfa[i] > 0 ) ? (short)( pfa[i] / 8 + 0.49) :
- -(short)( - pfa[i] / 8 + 0.49);
- }
- op += shortpitch;
- pfa += 4;
- }
-}
-#endif
-
-#if CONFIG_HYBRIDTRANSFORM8X8
-void vp8_iht8x8llm_c(short *input, short *output, int pitch, TX_TYPE tx_type) {
+#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM
+void vp8_ihtllm_c(short *input, short *output, int pitch,
+ TX_TYPE tx_type, int tx_dim) {
int i, j, k;
float bufa[64], bufb[64]; // buffers are for floating-point test purpose
// the implementation could be simplified in
// conjunction with integer transform
+
+ // further notice, since we are thinking to use one
+ // function for both 4x4 and 8x8 transforms, the
+ // temporary buffers are simply initialized with 64.
short *ip = input;
short *op = output;
int shortpitch = pitch >> 1;
@@ -218,12 +115,12 @@ void vp8_iht8x8llm_c(short *input, short *output, int pitch, TX_TYPE tx_type) {
float *ptv, *pth;
// load and convert residual array into floating-point
- for(j = 0; j < 8; j++) {
- for(i = 0; i < 8; i++) {
+ for(j = 0; j < tx_dim; j++) {
+ for(i = 0; i < tx_dim; i++) {
pfa[i] = (float)ip[i];
}
- pfa += 8;
- ip += 8;
+ pfa += tx_dim;
+ ip += tx_dim;
}
// vertical transformation
@@ -233,25 +130,25 @@ void vp8_iht8x8llm_c(short *input, short *output, int pitch, TX_TYPE tx_type) {
switch(tx_type) {
case ADST_ADST :
case ADST_DCT :
- ptv = &iadst_8[0];
+ ptv = (tx_dim == 4) ? &iadst_4[0] : &iadst_8[0];
break;
default :
- ptv = &idct_8[0];
+ ptv = (tx_dim == 4) ? &idct_4[0] : &idct_8[0];
break;
}
- for(j = 0; j < 8; j++) {
- for(i = 0; i < 8; i++) {
+ for(j = 0; j < tx_dim; j++) {
+ for(i = 0; i < tx_dim; i++) {
pfb[i] = 0 ;
- for(k = 0; k < 8; k++) {
- pfb[i] += ptv[k] * pfa[(k<<3)];
+ for(k = 0; k < tx_dim; k++) {
+ pfb[i] += ptv[k] * pfa[(k * tx_dim)];
}
pfa += 1;
}
- pfb += 8;
- ptv += 8;
+ pfb += tx_dim;
+ ptv += tx_dim;
pfa = &bufa[0];
}
@@ -262,34 +159,34 @@ void vp8_iht8x8llm_c(short *input, short *output, int pitch, TX_TYPE tx_type) {
switch(tx_type) {
case ADST_ADST :
case DCT_ADST :
- pth = &iadst_8[0];
+ pth = (tx_dim == 4) ? &iadst_4[0] : &iadst_8[0];
break;
default :
- pth = &idct_8[0];
+ pth = (tx_dim == 4) ? &idct_4[0] : &idct_8[0];
break;
}
- for(j = 0; j < 8; j++) {
- for(i = 0; i < 8; i++) {
+ for(j = 0; j < tx_dim; j++) {
+ for(i = 0; i < tx_dim; i++) {
pfa[i] = 0;
- for(k = 0; k < 8; k++) {
+ for(k = 0; k < tx_dim; k++) {
pfa[i] += pfb[k] * pth[k];
}
- pth += 8;
+ pth += tx_dim;
}
- pfa += 8;
- pfb += 8;
+ pfa += tx_dim;
+ pfb += tx_dim;
switch(tx_type) {
case ADST_ADST :
case DCT_ADST :
- pth = &iadst_8[0];
+ pth = (tx_dim == 4) ? &iadst_4[0] : &iadst_8[0];
break;
default :
- pth = &idct_8[0];
+ pth = (tx_dim == 4) ? &idct_4[0] : &idct_8[0];
break;
}
}
@@ -298,13 +195,14 @@ void vp8_iht8x8llm_c(short *input, short *output, int pitch, TX_TYPE tx_type) {
op = output;
pfa = &bufa[0];
- for(j = 0; j < 8; j++) {
- for(i = 0; i < 8; i++) {
+ for(j = 0; j < tx_dim; j++) {
+ for(i = 0; i < tx_dim; i++) {
op[i] = (pfa[i] > 0 ) ? (short)( pfa[i] / 8 + 0.49) :
-(short)( - pfa[i] / 8 + 0.49);
}
+
op += shortpitch;
- pfa += 8;
+ pfa += tx_dim;
}
}
#endif