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