| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- /******************************************************************************
- *
- * Copyright (C) 2014 The Android Open Source Project
- * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
- #ifndef _OI_CODEC_SBC_PRIVATE_H
- #define _OI_CODEC_SBC_PRIVATE_H
- /**********************************************************************************
- $Revision: #1 $
- ***********************************************************************************/
- /**
- @file
- Function prototypes and macro definitions used internally by the codec.
- @ingroup codec_internal
- */
- /**
- @addtogroup codec_internal
- @{
- */
- #ifdef USE_RESTRICT_KEYWORD
- #define RESTRICT restrict
- #else
- #define RESTRICT
- #endif
- #ifdef CODEC_DEBUG
- #include <stdio.h>
- #define ERROR(x) do { printf x; printf("\n"); } while (0)
- #else
- #define ERROR(x)
- #endif
- #ifdef TRACE_EXECUTION
- #include <stdio.h>
- #define TRACE(x) do { printf x; printf("\n"); } while (0)
- #else
- #define TRACE(x)
- #endif
- #ifndef PRIVATE
- #define PRIVATE
- #endif
- #ifndef INLINE
- #define INLINE
- #endif
- #include "oi_assert.h"
- #include "oi_codec_sbc.h"
- /* BK4BTSTACK_CHANGE START */
- #ifndef OI_mSBC_SYNCWORD
- #define OI_mSBC_SYNCWORD 0xad
- #endif
- /* BK4BTSTACK_CHANGE END */
- #ifndef OI_SBC_SYNCWORD
- #define OI_SBC_SYNCWORD 0x9c
- #endif
- #ifndef DIVIDE
- #define DIVIDE(a, b) ((a) / (b))
- #endif
- typedef union {
- OI_UINT8 uint8[SBC_MAX_BANDS];
- OI_UINT32 uint32[SBC_MAX_BANDS / 4];
- } BITNEED_UNION1;
- typedef union {
- OI_UINT8 uint8[2 * SBC_MAX_BANDS];
- OI_UINT32 uint32[2 * SBC_MAX_BANDS / 4];
- } BITNEED_UNION2;
- static const OI_UINT16 freq_values[] = { 16000, 32000, 44100, 48000 };
- static const OI_UINT8 block_values[] = { 4, 8, 12, 16 };
- static const OI_UINT8 channel_values[] = { 1, 2, 2, 2 };
- static const OI_UINT8 band_values[] = { 4, 8 };
- #define TEST_MODE_SENTINEL "OINA"
- #define TEST_MODE_SENTINEL_LENGTH 4
- /** Used internally. */
- typedef struct {
- union {
- const OI_UINT8 *r;
- OI_UINT8 *w;
- } ptr;
- OI_UINT32 value;
- OI_UINT bitPtr;
- } OI_BITSTREAM;
- #define VALID_INT16(x) (((x) >= OI_INT16_MIN) && ((x) <= OI_INT16_MAX))
- #define VALID_INT32(x) (((x) >= OI_INT32_MIN) && ((x) <= OI_INT32_MAX))
- #define DCTII_8_SHIFT_IN 0
- #define DCTII_8_SHIFT_OUT 16-DCTII_8_SHIFT_IN
- #define DCTII_8_SHIFT_0 (DCTII_8_SHIFT_OUT)
- #define DCTII_8_SHIFT_1 (DCTII_8_SHIFT_OUT)
- #define DCTII_8_SHIFT_2 (DCTII_8_SHIFT_OUT)
- #define DCTII_8_SHIFT_3 (DCTII_8_SHIFT_OUT)
- #define DCTII_8_SHIFT_4 (DCTII_8_SHIFT_OUT)
- #define DCTII_8_SHIFT_5 (DCTII_8_SHIFT_OUT)
- #define DCTII_8_SHIFT_6 (DCTII_8_SHIFT_OUT-1)
- #define DCTII_8_SHIFT_7 (DCTII_8_SHIFT_OUT-2)
- #define DCT_SHIFT 15
- #define DCTIII_4_SHIFT_IN 2
- #define DCTIII_4_SHIFT_OUT 15
- #define DCTIII_8_SHIFT_IN 3
- #define DCTIII_8_SHIFT_OUT 14
- OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common,
- OI_UINT8 *bitneeds,
- OI_UINT ch,
- OI_UINT *preferredBitpool);
- void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common,
- BITNEED_UNION1 *bitneeds,
- OI_UINT ch,
- OI_UINT bitcount);
- OI_INT adjustToFitBitpool(const OI_UINT bitpool,
- OI_UINT32 *bitneeds,
- const OI_UINT subbands,
- OI_UINT bitcount,
- OI_UINT *excess);
- INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest,
- OI_INT bits,
- OI_INT excess);
- INLINE OI_INT allocExcessBits(OI_UINT8 *dest,
- OI_INT excess);
- PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame);
- PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame);
- void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common);
- typedef void (*BIT_ALLOC)(OI_CODEC_SBC_COMMON_CONTEXT *common);
- PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
- OI_UINT8 bitpool,
- const OI_BYTE **frameData,
- OI_UINT32 *frameBytes,
- OI_INT16 *pcmData,
- OI_UINT32 *pcmBytes);
- INLINE OI_STATUS internal_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
- OI_UINT32 *decoderData,
- OI_UINT32 decoderDataBytes,
- OI_BYTE maxChannels,
- OI_BYTE pcmStride,
- OI_BOOL enhanced);
- INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_);
- PRIVATE OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame);
- PRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *frame);
- PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data);
- PRIVATE OI_UINT8 OI_SBC_CalculateChecksum_mSBC(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data);
- /* Transform functions */
- PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount);
- PRIVATE void cosineModulateSynth4(SBC_BUFFER_T * RESTRICT out, OI_INT32 const * RESTRICT in);
- PRIVATE void SynthWindow40_int32_int32_symmetry_with_sum(OI_INT16 *pcm, SBC_BUFFER_T buffer[80], OI_UINT strideShift);
- INLINE void dct3_4(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
- PRIVATE void analyze4_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 40],
- OI_INT16 *pcm,
- OI_UINT strideShift,
- OI_INT32 subband[4]);
- INLINE void dct3_8(OI_INT32 * RESTRICT out, OI_INT32 const * RESTRICT in);
- PRIVATE void analyze8_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 80],
- OI_INT16 *pcm,
- OI_UINT strideShift,
- OI_INT32 subband[8]);
- #ifdef SBC_ENHANCED
- PRIVATE void analyze8_enhanced_generated(SBC_BUFFER_T analysisBuffer[RESTRICT 112],
- OI_INT16 *pcm,
- OI_UINT strideShift,
- OI_INT32 subband[8]);
- #endif
- /* Decoder functions */
- INLINE void OI_SBC_ReadHeader_mSBC(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data);
- INLINE void OI_SBC_ReadHeader(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *data);
- PRIVATE void OI_SBC_ReadScalefactors(OI_CODEC_SBC_COMMON_CONTEXT *common, const OI_BYTE *b, OI_BITSTREAM *bs);
- PRIVATE void OI_SBC_ReadSamples(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *ob);
- PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT *common, OI_BITSTREAM *global_bs);
- PRIVATE void OI_SBC_SynthFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, OI_INT16 *pcm, OI_UINT start_block, OI_UINT nrof_blocks);
- INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits);
- PRIVATE OI_BOOL OI_SBC_ExamineCommandPacket(OI_CODEC_SBC_DECODER_CONTEXT *context, const OI_BYTE *data, OI_UINT32 len);
- PRIVATE void OI_SBC_GenerateTestSignal(OI_INT16 pcmData[][2], OI_UINT32 sampleCount);
- PRIVATE void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame);
- PRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
- OI_UINT32 *codecDataAligned,
- OI_UINT32 codecDataBytes,
- OI_UINT8 maxChannels,
- OI_UINT8 pcmStride);
- /**
- @}
- */
- #endif /* _OI_CODEC_SBC_PRIVATE_H */
|