xref: /btstack/3rd-party/bluedroid/encoder/include/sbc_dct.h (revision df25739fc3ea5a0a90f0f5925e6461d653697d2e)
1*df25739fSMilanka Ringwald /******************************************************************************
2*df25739fSMilanka Ringwald  *
3*df25739fSMilanka Ringwald  *  Copyright (C) 1999-2012 Broadcom Corporation
4*df25739fSMilanka Ringwald  *
5*df25739fSMilanka Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
6*df25739fSMilanka Ringwald  *  you may not use this file except in compliance with the License.
7*df25739fSMilanka Ringwald  *  You may obtain a copy of the License at:
8*df25739fSMilanka Ringwald  *
9*df25739fSMilanka Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
10*df25739fSMilanka Ringwald  *
11*df25739fSMilanka Ringwald  *  Unless required by applicable law or agreed to in writing, software
12*df25739fSMilanka Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
13*df25739fSMilanka Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*df25739fSMilanka Ringwald  *  See the License for the specific language governing permissions and
15*df25739fSMilanka Ringwald  *  limitations under the License.
16*df25739fSMilanka Ringwald  *
17*df25739fSMilanka Ringwald  ******************************************************************************/
18*df25739fSMilanka Ringwald 
19*df25739fSMilanka Ringwald /******************************************************************************
20*df25739fSMilanka Ringwald  *
21*df25739fSMilanka Ringwald  *  Definitions for the fast DCT.
22*df25739fSMilanka Ringwald  *
23*df25739fSMilanka Ringwald  ******************************************************************************/
24*df25739fSMilanka Ringwald 
25*df25739fSMilanka Ringwald #ifndef SBC_DCT_H
26*df25739fSMilanka Ringwald #define SBC_DCT_H
27*df25739fSMilanka Ringwald 
28*df25739fSMilanka Ringwald #if (SBC_ARM_ASM_OPT==TRUE)
29*df25739fSMilanka Ringwald #define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1, s32OutLow)					\
30*df25739fSMilanka Ringwald {																			    \
31*df25739fSMilanka Ringwald     __asm																		\
32*df25739fSMilanka Ringwald {																				\
33*df25739fSMilanka Ringwald     MUL s32OutLow,(SINT32)s16In2, (s32In1>>15)        \
34*df25739fSMilanka Ringwald }																				\
35*df25739fSMilanka Ringwald }
36*df25739fSMilanka Ringwald #else
37*df25739fSMilanka Ringwald #if (SBC_DSP_OPT==TRUE)
38*df25739fSMilanka Ringwald #define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1 , s32OutLow) s32OutLow = SBC_Multiply_32_16_Simplified((SINT32)s16In2,s32In1);
39*df25739fSMilanka Ringwald #else
40*df25739fSMilanka Ringwald #if (SBC_IPAQ_OPT==TRUE)
41*df25739fSMilanka Ringwald /*#define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1 , s32OutLow) s32OutLow=(SINT32)((SINT32)(s16In2)*(SINT32)(s32In1>>15)); */
42*df25739fSMilanka Ringwald #define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1 , s32OutLow) s32OutLow=(SINT32)(((SINT64)s16In2*(SINT64)s32In1)>>15);
43*df25739fSMilanka Ringwald #if (SBC_IS_64_MULT_IN_IDCT == TRUE)
44*df25739fSMilanka Ringwald #define SBC_MULT_32_32(s32In2, s32In1, s32OutLow)                           \
45*df25739fSMilanka Ringwald {                                                                           \
46*df25739fSMilanka Ringwald     s64Temp = ((SINT64) s32In2) * ((SINT64) s32In1)>>31;            \
47*df25739fSMilanka Ringwald     s32OutLow = (SINT32) s64Temp;                                                    \
48*df25739fSMilanka Ringwald }
49*df25739fSMilanka Ringwald #endif
50*df25739fSMilanka Ringwald #else
51*df25739fSMilanka Ringwald #define SBC_MULT_32_16_SIMPLIFIED(s16In2, s32In1 , s32OutLow)                   \
52*df25739fSMilanka Ringwald {                                                                               \
53*df25739fSMilanka Ringwald     s32In1Temp = s32In1;                                                        \
54*df25739fSMilanka Ringwald     s32In2Temp = (SINT32)s16In2;                                                \
55*df25739fSMilanka Ringwald                                                                                 \
56*df25739fSMilanka Ringwald     /* Multiply one +ve and the other -ve number */                             \
57*df25739fSMilanka Ringwald     if (s32In1Temp < 0)                                                         \
58*df25739fSMilanka Ringwald     {                                                                           \
59*df25739fSMilanka Ringwald         s32In1Temp ^= 0xFFFFFFFF;                                               \
60*df25739fSMilanka Ringwald         s32In1Temp++;                                                           \
61*df25739fSMilanka Ringwald         s32OutLow  = (s32In2Temp * (s32In1Temp >> 16));                         \
62*df25739fSMilanka Ringwald         s32OutLow += (( s32In2Temp * (s32In1Temp & 0xFFFF)) >> 16);             \
63*df25739fSMilanka Ringwald         s32OutLow ^= 0xFFFFFFFF;                                                \
64*df25739fSMilanka Ringwald         s32OutLow++;                                                            \
65*df25739fSMilanka Ringwald     }                                                                           \
66*df25739fSMilanka Ringwald     else                                                                        \
67*df25739fSMilanka Ringwald     {                                                                           \
68*df25739fSMilanka Ringwald         s32OutLow  = (s32In2Temp * (s32In1Temp >> 16));                         \
69*df25739fSMilanka Ringwald         s32OutLow += (( s32In2Temp * (s32In1Temp & 0xFFFF)) >> 16);             \
70*df25739fSMilanka Ringwald     }                                                                           \
71*df25739fSMilanka Ringwald     s32OutLow <<= 1;                                                            \
72*df25739fSMilanka Ringwald }
73*df25739fSMilanka Ringwald #if (SBC_IS_64_MULT_IN_IDCT == TRUE)
74*df25739fSMilanka Ringwald #define SBC_MULT_64(s32In1, s32In2, s32OutLow, s32OutHi)  \
75*df25739fSMilanka Ringwald {\
76*df25739fSMilanka Ringwald         s32OutLow=(SINT32)(((SINT64)s32In1*(SINT64)s32In2)& 0x00000000FFFFFFFF);\
77*df25739fSMilanka Ringwald         s32OutHi=(SINT32)(((SINT64)s32In1*(SINT64)s32In2)>>32);\
78*df25739fSMilanka Ringwald }
79*df25739fSMilanka Ringwald #define SBC_MULT_32_32(s32In2, s32In1, s32OutLow)                           \
80*df25739fSMilanka Ringwald {                                                                           \
81*df25739fSMilanka Ringwald     s32HiTemp = 0;                                                          \
82*df25739fSMilanka Ringwald     SBC_MULT_64(s32In2,s32In1 , s32OutLow, s32HiTemp);                      \
83*df25739fSMilanka Ringwald     s32OutLow   = (((s32OutLow>>15)&0x1FFFF) | (s32HiTemp << 17));          \
84*df25739fSMilanka Ringwald }
85*df25739fSMilanka Ringwald #endif
86*df25739fSMilanka Ringwald 
87*df25739fSMilanka Ringwald #endif
88*df25739fSMilanka Ringwald #endif
89*df25739fSMilanka Ringwald #endif
90*df25739fSMilanka Ringwald 
91*df25739fSMilanka Ringwald #endif
92