xref: /btstack/3rd-party/bluedroid/encoder/srce/sbc_enc_bit_alloc_ste.c (revision c1ab6cc1beb14b16b46e74a3723644016d8c3cc7)
1df25739fSMilanka Ringwald /******************************************************************************
2df25739fSMilanka Ringwald  *
3df25739fSMilanka Ringwald  *  Copyright (C) 1999-2012 Broadcom Corporation
4df25739fSMilanka Ringwald  *
5df25739fSMilanka Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
6df25739fSMilanka Ringwald  *  you may not use this file except in compliance with the License.
7df25739fSMilanka Ringwald  *  You may obtain a copy of the License at:
8df25739fSMilanka Ringwald  *
9df25739fSMilanka Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
10df25739fSMilanka Ringwald  *
11df25739fSMilanka Ringwald  *  Unless required by applicable law or agreed to in writing, software
12df25739fSMilanka Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
13df25739fSMilanka Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14df25739fSMilanka Ringwald  *  See the License for the specific language governing permissions and
15df25739fSMilanka Ringwald  *  limitations under the License.
16df25739fSMilanka Ringwald  *
17df25739fSMilanka Ringwald  ******************************************************************************/
18df25739fSMilanka Ringwald 
19df25739fSMilanka Ringwald /******************************************************************************
20df25739fSMilanka Ringwald  *
21df25739fSMilanka Ringwald  *  This file contains the code for bit allocation algorithm. It calculates
22df25739fSMilanka Ringwald  *  the number of bits required for the encoded stream of data.
23df25739fSMilanka Ringwald  *
24df25739fSMilanka Ringwald  ******************************************************************************/
25df25739fSMilanka Ringwald 
26df25739fSMilanka Ringwald /*Includes*/
27df25739fSMilanka Ringwald #include "sbc_encoder.h"
28df25739fSMilanka Ringwald #include "sbc_enc_func_declare.h"
29df25739fSMilanka Ringwald 
30df25739fSMilanka Ringwald /*global arrays*/
31df25739fSMilanka Ringwald extern const SINT16 sbc_enc_as16Offset4[4][4];
32df25739fSMilanka Ringwald extern const SINT16 sbc_enc_as16Offset8[4][8];
33df25739fSMilanka Ringwald 
34df25739fSMilanka Ringwald /****************************************************************************
35df25739fSMilanka Ringwald * BitAlloc - Calculates the required number of bits for the given scale factor
36df25739fSMilanka Ringwald * and the number of subbands.
37df25739fSMilanka Ringwald *
38df25739fSMilanka Ringwald * RETURNS : N/A
39df25739fSMilanka Ringwald */
40df25739fSMilanka Ringwald 
sbc_enc_bit_alloc_ste(SBC_ENC_PARAMS * pstrCodecParams)41df25739fSMilanka Ringwald void sbc_enc_bit_alloc_ste(SBC_ENC_PARAMS *pstrCodecParams)
42df25739fSMilanka Ringwald {
43df25739fSMilanka Ringwald 	/* CAUTIOM -> mips optim for arm 32 require to use SINT32 instead of SINT16 */
44df25739fSMilanka Ringwald 	/* Do not change variable type or name */
45df25739fSMilanka Ringwald     SINT32 s32MaxBitNeed;   /*to store the max bits needed per sb*/
46df25739fSMilanka Ringwald     SINT32 s32BitCount;     /*the used number of bits*/
47df25739fSMilanka Ringwald     SINT32 s32SliceCount;   /*to store hwo many slices can be put in bitpool*/
48df25739fSMilanka Ringwald     SINT32 s32BitSlice;     /*number of bitslices in bitpool*/
49df25739fSMilanka Ringwald     SINT32 s32Sb;           /*counter for sub-band*/
50df25739fSMilanka Ringwald     SINT32 s32Ch;           /*counter for channel*/
51df25739fSMilanka Ringwald     SINT16 *ps16BitNeed;    /*temp memory to store required number of bits*/
52df25739fSMilanka Ringwald     SINT32 s32Loudness;     /*used in Loudness calculation*/
53df25739fSMilanka Ringwald     SINT16 *ps16GenBufPtr,*pas16ScaleFactor;
54df25739fSMilanka Ringwald     SINT16 *ps16GenArrPtr;
55df25739fSMilanka Ringwald     SINT16 *ps16GenTabPtr;
56df25739fSMilanka Ringwald     SINT32  s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands;
57df25739fSMilanka Ringwald     SINT32  s32BitPool       = pstrCodecParams->s16BitPool;
58df25739fSMilanka Ringwald 
59df25739fSMilanka Ringwald     /* bitneed values are derived from scale factor */
60df25739fSMilanka Ringwald     if (pstrCodecParams->s16AllocationMethod == SBC_SNR)
61df25739fSMilanka Ringwald     {
62df25739fSMilanka Ringwald         ps16BitNeed   = pstrCodecParams->as16ScaleFactor;
63df25739fSMilanka Ringwald         s32MaxBitNeed = pstrCodecParams->s16MaxBitNeed;
64df25739fSMilanka Ringwald     }
65df25739fSMilanka Ringwald     else
66df25739fSMilanka Ringwald     {
67df25739fSMilanka Ringwald         ps16BitNeed   = pstrCodecParams->s16ScartchMemForBitAlloc;
68df25739fSMilanka Ringwald         pas16ScaleFactor=pstrCodecParams->as16ScaleFactor;
69df25739fSMilanka Ringwald         s32MaxBitNeed = 0;
70df25739fSMilanka Ringwald         ps16GenBufPtr = ps16BitNeed;
71df25739fSMilanka Ringwald         for (s32Ch = 0; s32Ch < 2; s32Ch++)
72df25739fSMilanka Ringwald         {
73df25739fSMilanka Ringwald             if (s32NumOfSubBands == 4)
74df25739fSMilanka Ringwald             {
75df25739fSMilanka Ringwald                 ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq];
76df25739fSMilanka Ringwald             }
77df25739fSMilanka Ringwald             else
78df25739fSMilanka Ringwald             {
79df25739fSMilanka Ringwald                 ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq];
80df25739fSMilanka Ringwald             }
81df25739fSMilanka Ringwald 
82df25739fSMilanka Ringwald             for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++)
83df25739fSMilanka Ringwald             {
84df25739fSMilanka Ringwald                 if (*pas16ScaleFactor == 0)
85df25739fSMilanka Ringwald                     *ps16GenBufPtr = -5;
86df25739fSMilanka Ringwald                 else
87df25739fSMilanka Ringwald                 {
88df25739fSMilanka Ringwald                     s32Loudness = (SINT32)(*pas16ScaleFactor - *ps16GenTabPtr);
89df25739fSMilanka Ringwald 
90df25739fSMilanka Ringwald                     if (s32Loudness > 0)
91df25739fSMilanka Ringwald                         *ps16GenBufPtr = (SINT16)(s32Loudness >> 1);
92df25739fSMilanka Ringwald                     else
93df25739fSMilanka Ringwald                         *ps16GenBufPtr = (SINT16)s32Loudness;
94df25739fSMilanka Ringwald                 }
95df25739fSMilanka Ringwald 
96df25739fSMilanka Ringwald                 if (*ps16GenBufPtr > s32MaxBitNeed)
97df25739fSMilanka Ringwald                     s32MaxBitNeed = *ps16GenBufPtr;
98df25739fSMilanka Ringwald                 pas16ScaleFactor++;
99df25739fSMilanka Ringwald                 ps16GenBufPtr++;
100df25739fSMilanka Ringwald                 ps16GenTabPtr++;
101df25739fSMilanka Ringwald             }
102df25739fSMilanka Ringwald         }
103df25739fSMilanka Ringwald     }
104df25739fSMilanka Ringwald 
105df25739fSMilanka Ringwald     /* iterative process to find out hwo many bitslices fit into the bitpool */
106df25739fSMilanka Ringwald     s32BitSlice = s32MaxBitNeed + 1;
107df25739fSMilanka Ringwald     s32BitCount = s32BitPool;
108df25739fSMilanka Ringwald     s32SliceCount = 0;
109df25739fSMilanka Ringwald     do
110df25739fSMilanka Ringwald     {
111df25739fSMilanka Ringwald         s32BitSlice --;
112df25739fSMilanka Ringwald         s32BitCount -= s32SliceCount;
113df25739fSMilanka Ringwald         s32SliceCount = 0;
114df25739fSMilanka Ringwald         ps16GenBufPtr = ps16BitNeed;
115df25739fSMilanka Ringwald 
116*c1ab6cc1SMatthias Ringwald         for (s32Sb = 0; s32Sb < (2*s32NumOfSubBands); s32Sb++)
117df25739fSMilanka Ringwald         {
118*c1ab6cc1SMatthias Ringwald             if ( (*ps16GenBufPtr >= (s32BitSlice + 1)) && (*ps16GenBufPtr < (s32BitSlice + 16)) )
119df25739fSMilanka Ringwald             {
120*c1ab6cc1SMatthias Ringwald                 if (*(ps16GenBufPtr) == (s32BitSlice+1))
121df25739fSMilanka Ringwald                     s32SliceCount += 2;
122df25739fSMilanka Ringwald                 else
123df25739fSMilanka Ringwald                     s32SliceCount++;
124df25739fSMilanka Ringwald             }
125df25739fSMilanka Ringwald             ps16GenBufPtr++;
126df25739fSMilanka Ringwald         }
127*c1ab6cc1SMatthias Ringwald     } while ((s32BitCount-s32SliceCount)>0);
128df25739fSMilanka Ringwald 
129*c1ab6cc1SMatthias Ringwald     if ((s32BitCount-s32SliceCount) == 0)
130df25739fSMilanka Ringwald     {
131df25739fSMilanka Ringwald         s32BitCount -= s32SliceCount;
132df25739fSMilanka Ringwald         s32BitSlice --;
133df25739fSMilanka Ringwald     }
134df25739fSMilanka Ringwald 
135df25739fSMilanka Ringwald     /* Bits are distributed until the last bitslice is reached */
136df25739fSMilanka Ringwald     ps16GenBufPtr = ps16BitNeed;
137df25739fSMilanka Ringwald     ps16GenArrPtr = pstrCodecParams->as16Bits;
138df25739fSMilanka Ringwald     for (s32Ch = 0; s32Ch < 2; s32Ch++)
139df25739fSMilanka Ringwald     {
140df25739fSMilanka Ringwald         for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++)
141df25739fSMilanka Ringwald         {
142*c1ab6cc1SMatthias Ringwald             if (*ps16GenBufPtr < (s32BitSlice+2))
143df25739fSMilanka Ringwald                 *ps16GenArrPtr = 0;
144df25739fSMilanka Ringwald             else
145df25739fSMilanka Ringwald                 *ps16GenArrPtr = ((*(ps16GenBufPtr)-s32BitSlice) < 16) ?
146df25739fSMilanka Ringwald                                         (SINT16)(*(ps16GenBufPtr)-s32BitSlice):16;
147df25739fSMilanka Ringwald             ps16GenBufPtr++;
148df25739fSMilanka Ringwald             ps16GenArrPtr++;
149df25739fSMilanka Ringwald         }
150df25739fSMilanka Ringwald     }
151df25739fSMilanka Ringwald 
152df25739fSMilanka Ringwald     /* the remaining bits are allocated starting at subband 0 */
153df25739fSMilanka Ringwald     s32Ch=0;
154df25739fSMilanka Ringwald     s32Sb=0;
155df25739fSMilanka Ringwald     ps16GenBufPtr = ps16BitNeed;
156df25739fSMilanka Ringwald     ps16GenArrPtr -= 2*s32NumOfSubBands;
157df25739fSMilanka Ringwald 
158df25739fSMilanka Ringwald     while ( (s32BitCount > 0) && (s32Sb < s32NumOfSubBands) )
159df25739fSMilanka Ringwald     {
160df25739fSMilanka Ringwald         if ( (*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16) )
161df25739fSMilanka Ringwald         {
162df25739fSMilanka Ringwald             (*(ps16GenArrPtr))++;
163df25739fSMilanka Ringwald             s32BitCount--;
164df25739fSMilanka Ringwald         }
165*c1ab6cc1SMatthias Ringwald         else if ((*ps16GenBufPtr == (s32BitSlice+1)) && (s32BitCount > 1))
166df25739fSMilanka Ringwald         {
167df25739fSMilanka Ringwald             *(ps16GenArrPtr) = 2;
168df25739fSMilanka Ringwald             s32BitCount -= 2;
169df25739fSMilanka Ringwald         }
170df25739fSMilanka Ringwald         if(s32Ch == 1)
171df25739fSMilanka Ringwald         {
172df25739fSMilanka Ringwald             s32Ch = 0;
173df25739fSMilanka Ringwald             s32Sb++;
174df25739fSMilanka Ringwald             ps16GenBufPtr = ps16BitNeed+s32Sb;
175df25739fSMilanka Ringwald             ps16GenArrPtr = pstrCodecParams->as16Bits+s32Sb;
176df25739fSMilanka Ringwald 
177df25739fSMilanka Ringwald         }
178df25739fSMilanka Ringwald         else
179df25739fSMilanka Ringwald         {
180df25739fSMilanka Ringwald             s32Ch =1;
181df25739fSMilanka Ringwald             ps16GenBufPtr = ps16BitNeed+s32NumOfSubBands+s32Sb;
182df25739fSMilanka Ringwald             ps16GenArrPtr = pstrCodecParams->as16Bits+s32NumOfSubBands+s32Sb;
183df25739fSMilanka Ringwald         }
184df25739fSMilanka Ringwald     }
185df25739fSMilanka Ringwald 
186df25739fSMilanka Ringwald     s32Ch=0;
187df25739fSMilanka Ringwald     s32Sb=0;
188df25739fSMilanka Ringwald     ps16GenArrPtr = pstrCodecParams->as16Bits;
189df25739fSMilanka Ringwald 
190df25739fSMilanka Ringwald     while ((s32BitCount >0) && (s32Sb < s32NumOfSubBands))
191df25739fSMilanka Ringwald     {
192df25739fSMilanka Ringwald         if(*(ps16GenArrPtr) < 16)
193df25739fSMilanka Ringwald         {
194df25739fSMilanka Ringwald             (*(ps16GenArrPtr))++;
195df25739fSMilanka Ringwald             s32BitCount--;
196df25739fSMilanka Ringwald         }
197df25739fSMilanka Ringwald         if (s32Ch == 1)
198df25739fSMilanka Ringwald         {
199df25739fSMilanka Ringwald             s32Ch = 0;
200df25739fSMilanka Ringwald             s32Sb++;
201df25739fSMilanka Ringwald             ps16GenArrPtr = pstrCodecParams->as16Bits+s32Sb;
202df25739fSMilanka Ringwald         }
203df25739fSMilanka Ringwald         else
204df25739fSMilanka Ringwald         {
205df25739fSMilanka Ringwald             s32Ch = 1;
206df25739fSMilanka Ringwald             ps16GenArrPtr = pstrCodecParams->as16Bits+s32NumOfSubBands+s32Sb;
207df25739fSMilanka Ringwald         }
208df25739fSMilanka Ringwald     }
209df25739fSMilanka Ringwald }
210df25739fSMilanka Ringwald 
211df25739fSMilanka Ringwald /*End of BitAlloc() function*/
212df25739fSMilanka Ringwald 
213