xref: /btstack/3rd-party/bluedroid/decoder/include/oi_codec_sbc_private.h (revision fcb08cdb2a5cc54dab8235c104507f6c1550b708)
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