1df25739fSMilanka Ringwald /****************************************************************************** 2df25739fSMilanka Ringwald * 3df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5df25739fSMilanka Ringwald * 6df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9df25739fSMilanka Ringwald * 10df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11df25739fSMilanka Ringwald * 12df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16df25739fSMilanka Ringwald * limitations under the License. 17df25739fSMilanka Ringwald * 18df25739fSMilanka Ringwald ******************************************************************************/ 19df25739fSMilanka Ringwald #ifndef _OI_CODEC_SBC_PRIVATE_H 20df25739fSMilanka Ringwald #define _OI_CODEC_SBC_PRIVATE_H 21df25739fSMilanka Ringwald 22df25739fSMilanka Ringwald /********************************************************************************** 23df25739fSMilanka Ringwald $Revision: #1 $ 24df25739fSMilanka Ringwald ***********************************************************************************/ 25df25739fSMilanka Ringwald 26df25739fSMilanka Ringwald /** 27df25739fSMilanka Ringwald @file 28df25739fSMilanka Ringwald Function prototypes and macro definitions used internally by the codec. 29df25739fSMilanka Ringwald 30df25739fSMilanka Ringwald @ingroup codec_internal 31df25739fSMilanka Ringwald */ 32df25739fSMilanka Ringwald 33df25739fSMilanka Ringwald /** 34df25739fSMilanka Ringwald @addtogroup codec_internal 35df25739fSMilanka Ringwald @{ 36df25739fSMilanka Ringwald */ 37df25739fSMilanka Ringwald 38df25739fSMilanka Ringwald #ifdef USE_RESTRICT_KEYWORD 39df25739fSMilanka Ringwald #define RESTRICT restrict 40df25739fSMilanka Ringwald #else 41df25739fSMilanka Ringwald #define RESTRICT 42df25739fSMilanka Ringwald #endif 43df25739fSMilanka Ringwald 44df25739fSMilanka Ringwald #ifdef CODEC_DEBUG 45df25739fSMilanka Ringwald #include <stdio.h> 46df25739fSMilanka Ringwald #define ERROR(x) do { printf x; printf("\n"); } while (0) 47df25739fSMilanka Ringwald #else 48df25739fSMilanka Ringwald #define ERROR(x) 49df25739fSMilanka Ringwald #endif 50df25739fSMilanka Ringwald 51df25739fSMilanka Ringwald #ifdef TRACE_EXECUTION 52df25739fSMilanka Ringwald #include <stdio.h> 53df25739fSMilanka Ringwald #define TRACE(x) do { printf x; printf("\n"); } while (0) 54df25739fSMilanka Ringwald #else 55df25739fSMilanka Ringwald #define TRACE(x) 56df25739fSMilanka Ringwald #endif 57df25739fSMilanka Ringwald 58df25739fSMilanka Ringwald #ifndef PRIVATE 59df25739fSMilanka Ringwald #define PRIVATE 60df25739fSMilanka Ringwald #endif 61df25739fSMilanka Ringwald 62df25739fSMilanka Ringwald #ifndef INLINE 63df25739fSMilanka Ringwald #define INLINE 64df25739fSMilanka Ringwald #endif 65df25739fSMilanka Ringwald 66df25739fSMilanka Ringwald #include "oi_assert.h" 67df25739fSMilanka Ringwald #include "oi_codec_sbc.h" 68df25739fSMilanka Ringwald 69435e3c4eSMilanka Ringwald /* BK4BTSTACK_CHANGE START */ 70435e3c4eSMilanka Ringwald #ifndef OI_mSBC_SYNCWORD 71435e3c4eSMilanka Ringwald #define OI_mSBC_SYNCWORD 0xad 72435e3c4eSMilanka Ringwald #endif 73435e3c4eSMilanka Ringwald /* BK4BTSTACK_CHANGE END */ 74435e3c4eSMilanka Ringwald 75df25739fSMilanka Ringwald #ifndef OI_SBC_SYNCWORD 76df25739fSMilanka Ringwald #define OI_SBC_SYNCWORD 0x9c 77df25739fSMilanka Ringwald #endif 78df25739fSMilanka Ringwald 79df25739fSMilanka Ringwald #ifndef DIVIDE 80df25739fSMilanka Ringwald #define DIVIDE(a, b) ((a) / (b)) 81df25739fSMilanka Ringwald #endif 82df25739fSMilanka Ringwald 83df25739fSMilanka Ringwald typedef union { 84df25739fSMilanka Ringwald OI_UINT8 uint8[SBC_MAX_BANDS]; 85df25739fSMilanka Ringwald OI_UINT32 uint32[SBC_MAX_BANDS / 4]; 86df25739fSMilanka Ringwald } BITNEED_UNION1; 87df25739fSMilanka Ringwald 88df25739fSMilanka Ringwald typedef union { 89df25739fSMilanka Ringwald OI_UINT8 uint8[2 * SBC_MAX_BANDS]; 90df25739fSMilanka Ringwald OI_UINT32 uint32[2 * SBC_MAX_BANDS / 4]; 91df25739fSMilanka Ringwald } BITNEED_UNION2; 92df25739fSMilanka Ringwald 93df25739fSMilanka Ringwald static const OI_UINT16 freq_values[] = { 16000, 32000, 44100, 48000 }; 94df25739fSMilanka Ringwald static const OI_UINT8 block_values[] = { 4, 8, 12, 16 }; 95df25739fSMilanka Ringwald static const OI_UINT8 channel_values[] = { 1, 2, 2, 2 }; 96df25739fSMilanka Ringwald static const OI_UINT8 band_values[] = { 4, 8 }; 97df25739fSMilanka Ringwald 98df25739fSMilanka Ringwald 99df25739fSMilanka Ringwald #define TEST_MODE_SENTINEL "OINA" 100df25739fSMilanka Ringwald #define TEST_MODE_SENTINEL_LENGTH 4 101df25739fSMilanka Ringwald 102df25739fSMilanka Ringwald /** Used internally. */ 103df25739fSMilanka Ringwald typedef struct { 104df25739fSMilanka Ringwald union { 105df25739fSMilanka Ringwald const OI_UINT8 *r; 106df25739fSMilanka Ringwald OI_UINT8 *w; 107df25739fSMilanka Ringwald } ptr; 108df25739fSMilanka Ringwald OI_UINT32 value; 109df25739fSMilanka Ringwald OI_UINT bitPtr; 110df25739fSMilanka Ringwald } OI_BITSTREAM; 111df25739fSMilanka Ringwald 112df25739fSMilanka Ringwald 113df25739fSMilanka Ringwald #define VALID_INT16(x) (((x) >= OI_INT16_MIN) && ((x) <= OI_INT16_MAX)) 114df25739fSMilanka Ringwald #define VALID_INT32(x) (((x) >= OI_INT32_MIN) && ((x) <= OI_INT32_MAX)) 115df25739fSMilanka Ringwald 116df25739fSMilanka Ringwald #define DCTII_8_SHIFT_IN 0 117df25739fSMilanka Ringwald #define DCTII_8_SHIFT_OUT 16-DCTII_8_SHIFT_IN 118df25739fSMilanka Ringwald 119df25739fSMilanka Ringwald #define DCTII_8_SHIFT_0 (DCTII_8_SHIFT_OUT) 120df25739fSMilanka Ringwald #define DCTII_8_SHIFT_1 (DCTII_8_SHIFT_OUT) 121df25739fSMilanka Ringwald #define DCTII_8_SHIFT_2 (DCTII_8_SHIFT_OUT) 122df25739fSMilanka Ringwald #define DCTII_8_SHIFT_3 (DCTII_8_SHIFT_OUT) 123df25739fSMilanka Ringwald #define DCTII_8_SHIFT_4 (DCTII_8_SHIFT_OUT) 124df25739fSMilanka Ringwald #define DCTII_8_SHIFT_5 (DCTII_8_SHIFT_OUT) 125df25739fSMilanka Ringwald #define DCTII_8_SHIFT_6 (DCTII_8_SHIFT_OUT-1) 126df25739fSMilanka Ringwald #define DCTII_8_SHIFT_7 (DCTII_8_SHIFT_OUT-2) 127df25739fSMilanka Ringwald 128df25739fSMilanka Ringwald #define DCT_SHIFT 15 129df25739fSMilanka Ringwald 130df25739fSMilanka Ringwald #define DCTIII_4_SHIFT_IN 2 131df25739fSMilanka Ringwald #define DCTIII_4_SHIFT_OUT 15 132df25739fSMilanka Ringwald 133df25739fSMilanka Ringwald #define DCTIII_8_SHIFT_IN 3 134df25739fSMilanka Ringwald #define DCTIII_8_SHIFT_OUT 14 135df25739fSMilanka Ringwald 136df25739fSMilanka Ringwald OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common, 137df25739fSMilanka Ringwald OI_UINT8 *bitneeds, 138df25739fSMilanka Ringwald OI_UINT ch, 139df25739fSMilanka Ringwald OI_UINT *preferredBitpool); 140df25739fSMilanka Ringwald 141df25739fSMilanka Ringwald void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common, 142df25739fSMilanka Ringwald BITNEED_UNION1 *bitneeds, 143df25739fSMilanka Ringwald OI_UINT ch, 144df25739fSMilanka Ringwald OI_UINT bitcount); 145df25739fSMilanka Ringwald 146df25739fSMilanka Ringwald 147df25739fSMilanka Ringwald OI_INT adjustToFitBitpool(const OI_UINT bitpool, 148df25739fSMilanka Ringwald OI_UINT32 *bitneeds, 149df25739fSMilanka Ringwald const OI_UINT subbands, 150df25739fSMilanka Ringwald OI_UINT bitcount, 151df25739fSMilanka Ringwald OI_UINT *excess); 152df25739fSMilanka Ringwald 153df25739fSMilanka Ringwald INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest, 154df25739fSMilanka Ringwald OI_INT bits, 155df25739fSMilanka Ringwald OI_INT excess); 156df25739fSMilanka Ringwald 157df25739fSMilanka Ringwald INLINE OI_INT allocExcessBits(OI_UINT8 *dest, 158df25739fSMilanka Ringwald OI_INT excess); 159df25739fSMilanka Ringwald 160df25739fSMilanka Ringwald PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame); 161df25739fSMilanka Ringwald 162df25739fSMilanka Ringwald PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame); 163df25739fSMilanka Ringwald 164df25739fSMilanka Ringwald void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common); 165df25739fSMilanka Ringwald 166df25739fSMilanka Ringwald typedef void (*BIT_ALLOC)(OI_CODEC_SBC_COMMON_CONTEXT *common); 167df25739fSMilanka Ringwald 168df25739fSMilanka Ringwald PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context, 169df25739fSMilanka Ringwald OI_UINT8 bitpool, 170df25739fSMilanka Ringwald const OI_BYTE **frameData, 171df25739fSMilanka Ringwald OI_UINT32 *frameBytes, 172df25739fSMilanka Ringwald OI_INT16 *pcmData, 173df25739fSMilanka Ringwald OI_UINT32 *pcmBytes); 174df25739fSMilanka Ringwald 175df25739fSMilanka Ringwald INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context, 176df25739fSMilanka Ringwald OI_UINT32 *decoderData, 177df25739fSMilanka Ringwald OI_UINT32 decoderDataBytes, 178df25739fSMilanka Ringwald OI_BYTE maxChannels, 179df25739fSMilanka Ringwald OI_BYTE pcmStride, 180df25739fSMilanka Ringwald OI_BOOL enhanced); 181df25739fSMilanka Ringwald 182df25739fSMilanka Ringwald INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_); 183df25739fSMilanka Ringwald 184df25739fSMilanka Ringwald PRIVATE OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame); 185df25739fSMilanka Ringwald 186df25739fSMilanka Ringwald PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *frame); 187df25739fSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data); 188*fcb08cdbSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum_mSBC(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data); 189df25739fSMilanka Ringwald 190df25739fSMilanka Ringwald /* Transform functions */ 191df25739fSMilanka Ringwald PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount); 192df25739fSMilanka Ringwald PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in); 193df25739fSMilanka Ringwald PRIVATE void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift); 194df25739fSMilanka Ringwald 195df25739fSMilanka Ringwald INLINE void dct3_4(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in); 196df25739fSMilanka Ringwald PRIVATE void analyze4_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 40], 197df25739fSMilanka Ringwald OI_INT16 *pcm, 198df25739fSMilanka Ringwald OI_UINT strideShift, 199df25739fSMilanka Ringwald OI_INT32 subband[4]); 200df25739fSMilanka Ringwald 201df25739fSMilanka Ringwald INLINE void dct3_8(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in); 202df25739fSMilanka Ringwald 203df25739fSMilanka Ringwald PRIVATE void analyze8_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 80], 204df25739fSMilanka Ringwald OI_INT16 *pcm, 205df25739fSMilanka Ringwald OI_UINT strideShift, 206df25739fSMilanka Ringwald OI_INT32 subband[8]); 207df25739fSMilanka Ringwald 208df25739fSMilanka Ringwald #ifdef SBC_ENHANCED 209df25739fSMilanka Ringwald PRIVATE void analyze8_enhanced_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 112], 210df25739fSMilanka Ringwald OI_INT16 *pcm, 211df25739fSMilanka Ringwald OI_UINT strideShift, 212df25739fSMilanka Ringwald OI_INT32 subband[8]); 213df25739fSMilanka Ringwald #endif 214df25739fSMilanka Ringwald 215df25739fSMilanka Ringwald /* Decoder functions */ 216*fcb08cdbSMilanka Ringwald INLINE void OI_SBC_ReadHeader_mSBC(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data); 217df25739fSMilanka Ringwald INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data); 218df25739fSMilanka Ringwald PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *b, OI_BITSTREAM *bs); 219df25739fSMilanka Ringwald PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *ob); 220df25739fSMilanka Ringwald PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *global_bs); 221df25739fSMilanka Ringwald PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks); 222df25739fSMilanka Ringwald INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits); 223df25739fSMilanka Ringwald PRIVATE OI_BOOL OI_SBC_ExamineCommandPacket(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE *data, OI_UINT32 len); 224df25739fSMilanka Ringwald PRIVATE void OI_SBC_GenerateTestSignal(OI_INT16 pcmData[][2], OI_UINT32 sampleCount); 225df25739fSMilanka Ringwald 226df25739fSMilanka Ringwald PRIVATE void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame); 227df25739fSMilanka Ringwald PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common, 228df25739fSMilanka Ringwald OI_UINT32 *codecDataAligned, 229df25739fSMilanka Ringwald OI_UINT32 codecDataBytes, 230df25739fSMilanka Ringwald OI_UINT8 maxChannels, 231df25739fSMilanka Ringwald OI_UINT8 pcmStride); 232df25739fSMilanka Ringwald /** 233df25739fSMilanka Ringwald @} 234df25739fSMilanka Ringwald */ 235df25739fSMilanka Ringwald 236df25739fSMilanka Ringwald #endif /* _OI_CODEC_SBC_PRIVATE_H */ 237df25739fSMilanka Ringwald 238