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 * This file contains constants and structures used by Encoder. 22*df25739fSMilanka Ringwald * 23*df25739fSMilanka Ringwald ******************************************************************************/ 24*df25739fSMilanka Ringwald 25*df25739fSMilanka Ringwald #ifndef SBC_ENCODER_H 26*df25739fSMilanka Ringwald #define SBC_ENCODER_H 27*df25739fSMilanka Ringwald 28*df25739fSMilanka Ringwald #define ENCODER_VERSION "0025" 29*df25739fSMilanka Ringwald 30*df25739fSMilanka Ringwald #ifdef BUILDCFG 31*df25739fSMilanka Ringwald #include "bt_target.h" 32*df25739fSMilanka Ringwald #endif 33*df25739fSMilanka Ringwald 34*df25739fSMilanka Ringwald /*DEFINES*/ 35*df25739fSMilanka Ringwald #ifndef FALSE 36*df25739fSMilanka Ringwald #define FALSE 0 37*df25739fSMilanka Ringwald #endif 38*df25739fSMilanka Ringwald 39*df25739fSMilanka Ringwald #ifndef TRUE 40*df25739fSMilanka Ringwald #define TRUE (!FALSE) 41*df25739fSMilanka Ringwald #endif 42*df25739fSMilanka Ringwald 43*df25739fSMilanka Ringwald #define SBC_MAX_NUM_OF_SUBBANDS 8 44*df25739fSMilanka Ringwald #define SBC_MAX_NUM_OF_CHANNELS 2 45*df25739fSMilanka Ringwald #define SBC_MAX_NUM_OF_BLOCKS 16 46*df25739fSMilanka Ringwald 47*df25739fSMilanka Ringwald #define SBC_LOUDNESS 0 48*df25739fSMilanka Ringwald #define SBC_SNR 1 49*df25739fSMilanka Ringwald 50*df25739fSMilanka Ringwald #define SUB_BANDS_8 8 51*df25739fSMilanka Ringwald #define SUB_BANDS_4 4 52*df25739fSMilanka Ringwald 53*df25739fSMilanka Ringwald #define SBC_sf16000 0 54*df25739fSMilanka Ringwald #define SBC_sf32000 1 55*df25739fSMilanka Ringwald #define SBC_sf44100 2 56*df25739fSMilanka Ringwald #define SBC_sf48000 3 57*df25739fSMilanka Ringwald 58*df25739fSMilanka Ringwald #define SBC_MONO 0 59*df25739fSMilanka Ringwald #define SBC_DUAL 1 60*df25739fSMilanka Ringwald #define SBC_STEREO 2 61*df25739fSMilanka Ringwald #define SBC_JOINT_STEREO 3 62*df25739fSMilanka Ringwald 63*df25739fSMilanka Ringwald #define SBC_BLOCK_0 4 64*df25739fSMilanka Ringwald #define SBC_BLOCK_1 8 65*df25739fSMilanka Ringwald #define SBC_BLOCK_2 12 66*df25739fSMilanka Ringwald #define SBC_BLOCK_3 16 67*df25739fSMilanka Ringwald 68*df25739fSMilanka Ringwald #define SBC_NULL 0 69*df25739fSMilanka Ringwald 70*df25739fSMilanka Ringwald #ifndef SBC_MAX_NUM_FRAME 71*df25739fSMilanka Ringwald #define SBC_MAX_NUM_FRAME 1 72*df25739fSMilanka Ringwald #endif 73*df25739fSMilanka Ringwald 74*df25739fSMilanka Ringwald #ifndef SBC_DSP_OPT 75*df25739fSMilanka Ringwald #define SBC_DSP_OPT FALSE 76*df25739fSMilanka Ringwald #endif 77*df25739fSMilanka Ringwald 78*df25739fSMilanka Ringwald /* Set SBC_USE_ARM_PRAGMA to TRUE to use "#pragma arm section zidata" */ 79*df25739fSMilanka Ringwald #ifndef SBC_USE_ARM_PRAGMA 80*df25739fSMilanka Ringwald #define SBC_USE_ARM_PRAGMA FALSE 81*df25739fSMilanka Ringwald #endif 82*df25739fSMilanka Ringwald 83*df25739fSMilanka Ringwald /* Set SBC_ARM_ASM_OPT to TRUE in case the target is an ARM */ 84*df25739fSMilanka Ringwald /* this will replace all the 32 and 64 bit mult by in line assembly code */ 85*df25739fSMilanka Ringwald #ifndef SBC_ARM_ASM_OPT 86*df25739fSMilanka Ringwald #define SBC_ARM_ASM_OPT FALSE 87*df25739fSMilanka Ringwald #endif 88*df25739fSMilanka Ringwald 89*df25739fSMilanka Ringwald /* green hill compiler option -> Used to distinguish the syntax for inline assembly code*/ 90*df25739fSMilanka Ringwald #ifndef SBC_GHS_COMPILER 91*df25739fSMilanka Ringwald #define SBC_GHS_COMPILER FALSE 92*df25739fSMilanka Ringwald #endif 93*df25739fSMilanka Ringwald 94*df25739fSMilanka Ringwald /* ARM compiler option -> Used to distinguish the syntax for inline assembly code */ 95*df25739fSMilanka Ringwald #ifndef SBC_ARM_COMPILER 96*df25739fSMilanka Ringwald #define SBC_ARM_COMPILER TRUE 97*df25739fSMilanka Ringwald #endif 98*df25739fSMilanka Ringwald 99*df25739fSMilanka Ringwald /* Set SBC_IPAQ_OPT to TRUE in case the target is an ARM */ 100*df25739fSMilanka Ringwald /* 32 and 64 bit mult will be performed using SINT64 ( usualy __int64 ) cast that usualy give optimal performance if supported */ 101*df25739fSMilanka Ringwald #ifndef SBC_IPAQ_OPT 102*df25739fSMilanka Ringwald #define SBC_IPAQ_OPT TRUE 103*df25739fSMilanka Ringwald #endif 104*df25739fSMilanka Ringwald 105*df25739fSMilanka Ringwald /* Debug only: set SBC_IS_64_MULT_IN_WINDOW_ACCU to TRUE to use 64 bit multiplication in the windowing */ 106*df25739fSMilanka Ringwald /* -> not recomended, more MIPS for the same restitution. */ 107*df25739fSMilanka Ringwald #ifndef SBC_IS_64_MULT_IN_WINDOW_ACCU 108*df25739fSMilanka Ringwald #define SBC_IS_64_MULT_IN_WINDOW_ACCU FALSE 109*df25739fSMilanka Ringwald #endif /*SBC_IS_64_MULT_IN_WINDOW_ACCU */ 110*df25739fSMilanka Ringwald 111*df25739fSMilanka Ringwald /* Set SBC_IS_64_MULT_IN_IDCT to TRUE to use 64 bits multiplication in the DCT of Matrixing */ 112*df25739fSMilanka Ringwald /* -> more MIPS required for a better audio quality. comparasion with the SIG utilities shows a division by 10 of the RMS */ 113*df25739fSMilanka Ringwald /* CAUTION: It only apply in the if SBC_FAST_DCT is set to TRUE */ 114*df25739fSMilanka Ringwald #ifndef SBC_IS_64_MULT_IN_IDCT 115*df25739fSMilanka Ringwald #define SBC_IS_64_MULT_IN_IDCT FALSE 116*df25739fSMilanka Ringwald #endif /*SBC_IS_64_MULT_IN_IDCT */ 117*df25739fSMilanka Ringwald 118*df25739fSMilanka Ringwald /* set SBC_IS_64_MULT_IN_QUANTIZER to TRUE to use 64 bits multiplication in the quantizer */ 119*df25739fSMilanka Ringwald /* setting this flag to FALSE add whistling noise at 5.5 and 11 KHz usualy not perceptible by human's hears. */ 120*df25739fSMilanka Ringwald #ifndef SBC_IS_64_MULT_IN_QUANTIZER 121*df25739fSMilanka Ringwald #define SBC_IS_64_MULT_IN_QUANTIZER TRUE 122*df25739fSMilanka Ringwald #endif /*SBC_IS_64_MULT_IN_IDCT */ 123*df25739fSMilanka Ringwald 124*df25739fSMilanka Ringwald /* Debug only: set this flag to FALSE to disable fast DCT algorithm */ 125*df25739fSMilanka Ringwald #ifndef SBC_FAST_DCT 126*df25739fSMilanka Ringwald #define SBC_FAST_DCT TRUE 127*df25739fSMilanka Ringwald #endif /*SBC_FAST_DCT */ 128*df25739fSMilanka Ringwald 129*df25739fSMilanka Ringwald /* In case we do not use joint stereo mode the flag save some RAM and ROM in case it is set to FALSE */ 130*df25739fSMilanka Ringwald #ifndef SBC_JOINT_STE_INCLUDED 131*df25739fSMilanka Ringwald #define SBC_JOINT_STE_INCLUDED TRUE 132*df25739fSMilanka Ringwald #endif 133*df25739fSMilanka Ringwald 134*df25739fSMilanka Ringwald /* TRUE -> application should provide PCM buffer, FALSE PCM buffer reside in SBC_ENC_PARAMS */ 135*df25739fSMilanka Ringwald #ifndef SBC_NO_PCM_CPY_OPTION 136*df25739fSMilanka Ringwald #define SBC_NO_PCM_CPY_OPTION FALSE 137*df25739fSMilanka Ringwald #endif 138*df25739fSMilanka Ringwald 139*df25739fSMilanka Ringwald #define MINIMUM_ENC_VX_BUFFER_SIZE (8*10*2) 140*df25739fSMilanka Ringwald #ifndef ENC_VX_BUFFER_SIZE 141*df25739fSMilanka Ringwald #define ENC_VX_BUFFER_SIZE (MINIMUM_ENC_VX_BUFFER_SIZE + 64) 142*df25739fSMilanka Ringwald /*#define ENC_VX_BUFFER_SIZE MINIMUM_ENC_VX_BUFFER_SIZE + 1024*/ 143*df25739fSMilanka Ringwald #endif 144*df25739fSMilanka Ringwald 145*df25739fSMilanka Ringwald #ifndef SBC_FOR_EMBEDDED_LINUX 146*df25739fSMilanka Ringwald #define SBC_FOR_EMBEDDED_LINUX FALSE 147*df25739fSMilanka Ringwald #endif 148*df25739fSMilanka Ringwald 149*df25739fSMilanka Ringwald /*constants used for index calculation*/ 150*df25739fSMilanka Ringwald #define SBC_BLK (SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS) 151*df25739fSMilanka Ringwald 152*df25739fSMilanka Ringwald #include "sbc_types.h" 153*df25739fSMilanka Ringwald 154*df25739fSMilanka Ringwald typedef struct SBC_ENC_PARAMS_TAG 155*df25739fSMilanka Ringwald { 156*df25739fSMilanka Ringwald SINT16 s16SamplingFreq; /* 16k, 32k, 44.1k or 48k*/ 157*df25739fSMilanka Ringwald SINT16 s16ChannelMode; /* mono, dual, streo or joint streo*/ 158*df25739fSMilanka Ringwald SINT16 s16NumOfSubBands; /* 4 or 8 */ 159*df25739fSMilanka Ringwald SINT16 s16NumOfChannels; 160*df25739fSMilanka Ringwald SINT16 s16NumOfBlocks; /* 4, 8, 12 or 16*/ 161*df25739fSMilanka Ringwald SINT16 s16AllocationMethod; /* loudness or SNR*/ 162*df25739fSMilanka Ringwald SINT16 s16BitPool; /* 16*numOfSb for mono & dual; 163*df25739fSMilanka Ringwald 32*numOfSb for stereo & joint stereo */ 164*df25739fSMilanka Ringwald UINT16 u16BitRate; 165*df25739fSMilanka Ringwald UINT8 u8NumPacketToEncode; /* number of sbc frame to encode. Default is 1 */ 166*df25739fSMilanka Ringwald #if (SBC_JOINT_STE_INCLUDED == TRUE) 167*df25739fSMilanka Ringwald SINT16 as16Join[SBC_MAX_NUM_OF_SUBBANDS]; /*1 if JS, 0 otherwise*/ 168*df25739fSMilanka Ringwald #endif 169*df25739fSMilanka Ringwald 170*df25739fSMilanka Ringwald SINT16 s16MaxBitNeed; 171*df25739fSMilanka Ringwald SINT16 as16ScaleFactor[SBC_MAX_NUM_OF_CHANNELS*SBC_MAX_NUM_OF_SUBBANDS]; 172*df25739fSMilanka Ringwald 173*df25739fSMilanka Ringwald SINT16 *ps16NextPcmBuffer; 174*df25739fSMilanka Ringwald #if (SBC_NO_PCM_CPY_OPTION == TRUE) 175*df25739fSMilanka Ringwald SINT16 *ps16PcmBuffer; 176*df25739fSMilanka Ringwald #else 177*df25739fSMilanka Ringwald SINT16 as16PcmBuffer[SBC_MAX_NUM_FRAME*SBC_MAX_NUM_OF_BLOCKS * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; 178*df25739fSMilanka Ringwald #endif 179*df25739fSMilanka Ringwald 180*df25739fSMilanka Ringwald SINT16 s16ScartchMemForBitAlloc[16]; 181*df25739fSMilanka Ringwald 182*df25739fSMilanka Ringwald SINT32 s32SbBuffer[SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * SBC_MAX_NUM_OF_BLOCKS]; 183*df25739fSMilanka Ringwald 184*df25739fSMilanka Ringwald SINT16 as16Bits[SBC_MAX_NUM_OF_CHANNELS*SBC_MAX_NUM_OF_SUBBANDS]; 185*df25739fSMilanka Ringwald 186*df25739fSMilanka Ringwald UINT8 *pu8Packet; 187*df25739fSMilanka Ringwald UINT8 *pu8NextPacket; 188*df25739fSMilanka Ringwald UINT16 FrameHeader; 189*df25739fSMilanka Ringwald UINT16 u16PacketLength; 190*df25739fSMilanka Ringwald 191*df25739fSMilanka Ringwald }SBC_ENC_PARAMS; 192*df25739fSMilanka Ringwald 193*df25739fSMilanka Ringwald #ifdef __cplusplus 194*df25739fSMilanka Ringwald extern "C" 195*df25739fSMilanka Ringwald { 196*df25739fSMilanka Ringwald #endif 197*df25739fSMilanka Ringwald SBC_API extern void SBC_Encoder(SBC_ENC_PARAMS *strEncParams); 198*df25739fSMilanka Ringwald SBC_API extern void SBC_Encoder_Init(SBC_ENC_PARAMS *strEncParams); 199*df25739fSMilanka Ringwald #ifdef __cplusplus 200*df25739fSMilanka Ringwald } 201*df25739fSMilanka Ringwald #endif 202*df25739fSMilanka Ringwald #endif 203