15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski * Copyright 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * source file for fast dct operations 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_dct.h" 26911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "sbc_enc_func_declare.h" 27911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "sbc_encoder.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 31ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SBC_FastIDCT8 32ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 33ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description implementation of fast DCT algorithm by Feig and Winograd 34ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 35ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 36ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns y = dct(pInVect) 37ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 38ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 39ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_IS_64_MULT_IN_IDCT == FALSE) 42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_PI_SUR_4 \ 43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x00005a82) /* ((0x8000) * 0.7071) = cos(pi/4) \ 44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_PI_SUR_8 \ 46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x00007641) /* ((0x8000) * 0.9239) = (cos(pi/8)) */ 47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_3PI_SUR_8 \ 48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x000030fb) /* ((0x8000) * 0.3827) = (cos(3*pi/8)) */ 49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_PI_SUR_16 \ 50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x00007d8a) /* ((0x8000) * 0.9808)) = (cos(pi/16)) */ 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_3PI_SUR_16 \ 52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x00006a6d) /* ((0x8000) * 0.8315)) = (cos(3*pi/16)) */ 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_5PI_SUR_16 \ 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x0000471c) /* ((0x8000) * 0.5556)) = (cos(5*pi/16)) */ 55911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_7PI_SUR_16 \ 56911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x000018f8) /* ((0x8000) * 0.1951)) = (cos(7*pi/16)) */ 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_IDCT_MULT(a, b, c) SBC_MULT_32_16_SIMPLIFIED(a, b, c) 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_PI_SUR_4 \ 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x5A827999) /* ((0x80000000) * 0.707106781) = (cos(pi/4) ) */ 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_PI_SUR_8 \ 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x7641AF3C) /* ((0x80000000) * 0.923879533) = (cos(pi/8) ) */ 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_3PI_SUR_8 \ 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x30FBC54D) /* ((0x80000000) * 0.382683432) = (cos(3*pi/8) ) */ 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_PI_SUR_16 \ 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x7D8A5F3F) /* ((0x80000000) * 0.98078528 )) = (cos(pi/16) ) */ 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_3PI_SUR_16 \ 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x6A6D98A4) /* ((0x80000000) * 0.831469612)) = (cos(3*pi/16)) */ 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_5PI_SUR_16 \ 70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x471CECE6) /* ((0x80000000) * 0.555570233)) = (cos(5*pi/16)) */ 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_COS_7PI_SUR_16 \ 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (0x18F8B83C) /* ((0x80000000) * 0.195090322)) = (cos(7*pi/16)) */ 73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define SBC_IDCT_MULT(a, b, c) SBC_MULT_32_32(a, b, c) 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* SBC_IS_64_MULT_IN_IDCT */ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_FAST_DCT == FALSE) 7786828cbfe9e1d8bb7fc30fe5b65505306355a106Jakub Pawlowskiextern const int16_t gas16AnalDCTcoeff8[]; 7886828cbfe9e1d8bb7fc30fe5b65505306355a106Jakub Pawlowskiextern const int16_t gas16AnalDCTcoeff4[]; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid SBC_FastIDCT8(int32_t* pInVect, int32_t* pOutVect) { 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_FAST_DCT == TRUE) 83d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SBC_ARM_ASM_OPT == TRUE) 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 85d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SBC_IPAQ_OPT == TRUE) 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_IS_64_MULT_IN_IDCT == TRUE) 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int64_t s64Temp; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_IS_64_MULT_IN_IDCT == TRUE) 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t s32HiTemp; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t s32In2Temp; 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson register int32_t s32In1Temp; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson register int32_t x0, x1, x2, x3, x4, x5, x6, x7, temp; 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t res_even[4], res_odd[4]; 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*x0= (pInVect[4])/2 ;*/ 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_4, pInVect[4], x0); 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*printf("x0 0x%x = %d = %d * %d\n", x0, x0, SBC_COS_PI_SUR_4, pInVect[4]);*/ 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x1 = (pInVect[3] + pInVect[5]) >> 1; 106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x2 = (pInVect[2] + pInVect[6]) >> 1; 107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x3 = (pInVect[1] + pInVect[7]) >> 1; 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x4 = (pInVect[0] + pInVect[8]) >> 1; 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x5 = (pInVect[9] - pInVect[15]) >> 1; 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x6 = (pInVect[10] - pInVect[14]) >> 1; 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x7 = (pInVect[11] - pInVect[13]) >> 1; 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 2-point IDCT of x0 and x4 as in (11) */ 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = x0; 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_4, (x0 + x4), 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x0); /*x0 = ( x0 + x4 ) * cos(1*pi/4) ; */ 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_4, (temp - x4), 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x4); /*x4 = ( temp - x4 ) * cos(1*pi/4) ; */ 119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* rearrangement of x2 and x6 as in (15) */ 121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x2 -= x6; 122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x6 <<= 1; 123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 2-point IDCT of x2 and x6 and post-multiplication as in (15) */ 125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_4, x6, x6); /*x6 = x6 * cos(1*pi/4) ; */ 126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = x2; 127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_8, (x2 + x6), 128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x2); /*x2 = ( x2 + x6 ) * cos(1*pi/8) ; */ 129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_3PI_SUR_8, (temp - x6), 130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x6); /*x6 = ( temp - x6 ) * cos(3*pi/8) ;*/ 131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 4-point IDCT of x0,x2,x4 and x6 as in (11) */ 133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_even[0] = x0 + x2; 134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_even[1] = x4 + x6; 135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_even[2] = x4 - x6; 136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_even[3] = x0 - x2; 137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* rearrangement of x1,x3,x5,x7 as in (15) */ 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x7 <<= 1; 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x5 = (x5 << 1) - x7; 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x3 = (x3 << 1) - x5; 142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x1 -= x3 >> 1; 143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* two-dimensional IDCT of x1 and x5 */ 145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_4, x5, x5); /*x5 = x5 * cos(1*pi/4) ; */ 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = x1; 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x1 = x1 + x5; 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x5 = temp - x5; 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* rearrangement of x3 and x7 as in (15) */ 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x3 -= x7; 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x7 <<= 1; 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_4, x7, x7); /*x7 = x7 * cos(1*pi/4) ; */ 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 2-point IDCT of x3 and x7 and post-multiplication as in (15) */ 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = x3; 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_PI_SUR_8, (x3 + x7), 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x3); /*x3 = ( x3 + x7 ) * cos(1*pi/8) ; */ 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT(SBC_COS_3PI_SUR_8, (temp - x7), 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x7); /*x7 = ( temp - x7 ) * cos(3*pi/8) ;*/ 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 4-point IDCT of x1,x3,x5 and x7 and post multiplication by diagonal matrix 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * as in (14) */ 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_PI_SUR_16), (x1 + x3), 165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_odd[0]); /*res_odd[ 0 ] = ( x1 + x3 ) * cos(1*pi/16) ; */ 166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_3PI_SUR_16), (x5 + x7), 167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_odd[1]); /*res_odd[ 1 ] = ( x5 + x7 ) * cos(3*pi/16) ; */ 168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_5PI_SUR_16), (x5 - x7), 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_odd[2]); /*res_odd[ 2 ] = ( x5 - x7 ) * cos(5*pi/16) ; */ 170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_7PI_SUR_16), (x1 - x3), 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson res_odd[3]); /*res_odd[ 3 ] = ( x1 - x3 ) * cos(7*pi/16) ; */ 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* additions and subtractions as in (9) */ 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[0] = (res_even[0] + res_odd[0]); 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[1] = (res_even[1] + res_odd[1]); 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[2] = (res_even[2] + res_odd[2]); 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[3] = (res_even[3] + res_odd[3]); 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[7] = (res_even[0] - res_odd[0]); 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[6] = (res_even[1] - res_odd[1]); 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[5] = (res_even[2] - res_odd[2]); 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[4] = (res_even[3] - res_odd[3]); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t Index, k; 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t temp; 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*Calculate 4 subband samples by matrixing*/ 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (Index = 0; Index < 8; Index++) { 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = 0; 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (k = 0; k < 16; k++) { 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*temp += (int32_t)(((int64_t)M[(Index*strEncParams->numOfSubBands*2)+k] * 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Y[k]) >> 16 );*/ 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp += (gas16AnalDCTcoeff8[(Index * 8 * 2) + k] * (pInVect[k] >> 16)); 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp += 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((gas16AnalDCTcoeff8[(Index * 8 * 2) + k] * (pInVect[k] & 0xFFFF)) >> 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 16); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[Index] = temp; 197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* printf("pOutVect: 0x%x;0x%x;0x%x;0x%x;0x%x;0x%x;0x%x;0x%x\n",\ 200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[0],pOutVect[1],pOutVect[2],pOutVect[3],pOutVect[4],pOutVect[5],pOutVect[6],pOutVect[7]);*/ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function SBC_FastIDCT4 206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description implementation of fast DCT algorithm by Feig and Winograd 208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 209ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 210ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns y = dct(x0) 211ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 212ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid SBC_FastIDCT4(int32_t* pInVect, int32_t* pOutVect) { 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_FAST_DCT == TRUE) 216d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SBC_ARM_ASM_OPT == TRUE) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 218d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (SBC_IPAQ_OPT == TRUE) 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_IS_64_MULT_IN_IDCT == TRUE) 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int64_t s64Temp; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_IS_64_MULT_IN_IDCT == TRUE) 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t s32HiTemp; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t s32In2Temp; 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t s32In1Temp; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t temp, x2; 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t tmp[8]; 233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson x2 = pInVect[2] >> 1; 235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = (pInVect[0] + pInVect[4]); 236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_PI_SUR_4 >> 1), temp, tmp[0]); 237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tmp[1] = x2 - tmp[0]; 238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tmp[0] += x2; 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = (pInVect[1] + pInVect[3]); 240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_3PI_SUR_8 >> 1), temp, tmp[3]); 241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_PI_SUR_8 >> 1), temp, tmp[2]); 242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = (pInVect[5] - pInVect[7]); 243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_3PI_SUR_8 >> 1), temp, tmp[5]); 244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson SBC_IDCT_MULT((SBC_COS_PI_SUR_8 >> 1), temp, tmp[4]); 245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tmp[6] = tmp[2] + tmp[5]; 246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tmp[7] = tmp[3] - tmp[4]; 247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[0] = (tmp[0] + tmp[6]); 248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[1] = (tmp[1] + tmp[7]); 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[2] = (tmp[1] - tmp[7]); 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[3] = (tmp[0] - tmp[6]); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t Index, k; 253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int32_t temp; 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*Calculate 4 subband samples by matrixing*/ 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (Index = 0; Index < 4; Index++) { 256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp = 0; 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (k = 0; k < 8; k++) { 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*temp += (int32_t)(((int64_t)M[(Index*strEncParams->numOfSubBands*2)+k] * 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * Y[k]) >> 16 ); */ 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp += (gas16AnalDCTcoeff4[(Index * 4 * 2) + k] * (pInVect[k] >> 16)); 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp += 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((gas16AnalDCTcoeff4[(Index * 4 * 2) + k] * (pInVect[k] & 0xFFFF)) >> 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 16); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pOutVect[Index] = temp; 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 269