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 the code for bit allocation algorithm. It calculates
22  *  the number of bits required for the encoded stream of data.
23  *
24  ******************************************************************************/
25 
26 /*Includes*/
27 #include "sbc_encoder.h"
28 #include "sbc_enc_func_declare.h"
29 
30 /*global arrays*/
31 extern const SINT16 sbc_enc_as16Offset4[4][4];
32 extern const SINT16 sbc_enc_as16Offset8[4][8];
33 
34 /****************************************************************************
35 * BitAlloc - Calculates the required number of bits for the given scale factor
36 * and the number of subbands.
37 *
38 * RETURNS : N/A
39 */
40 
sbc_enc_bit_alloc_ste(SBC_ENC_PARAMS * pstrCodecParams)41 void sbc_enc_bit_alloc_ste(SBC_ENC_PARAMS *pstrCodecParams)
42 {
43 	/* CAUTIOM -> mips optim for arm 32 require to use SINT32 instead of SINT16 */
44 	/* Do not change variable type or name */
45     SINT32 s32MaxBitNeed;   /*to store the max bits needed per sb*/
46     SINT32 s32BitCount;     /*the used number of bits*/
47     SINT32 s32SliceCount;   /*to store hwo many slices can be put in bitpool*/
48     SINT32 s32BitSlice;     /*number of bitslices in bitpool*/
49     SINT32 s32Sb;           /*counter for sub-band*/
50     SINT32 s32Ch;           /*counter for channel*/
51     SINT16 *ps16BitNeed;    /*temp memory to store required number of bits*/
52     SINT32 s32Loudness;     /*used in Loudness calculation*/
53     SINT16 *ps16GenBufPtr,*pas16ScaleFactor;
54     SINT16 *ps16GenArrPtr;
55     SINT16 *ps16GenTabPtr;
56     SINT32  s32NumOfSubBands = pstrCodecParams->s16NumOfSubBands;
57     SINT32  s32BitPool       = pstrCodecParams->s16BitPool;
58 
59     /* bitneed values are derived from scale factor */
60     if (pstrCodecParams->s16AllocationMethod == SBC_SNR)
61     {
62         ps16BitNeed   = pstrCodecParams->as16ScaleFactor;
63         s32MaxBitNeed = pstrCodecParams->s16MaxBitNeed;
64     }
65     else
66     {
67         ps16BitNeed   = pstrCodecParams->s16ScartchMemForBitAlloc;
68         pas16ScaleFactor=pstrCodecParams->as16ScaleFactor;
69         s32MaxBitNeed = 0;
70         ps16GenBufPtr = ps16BitNeed;
71         for (s32Ch = 0; s32Ch < 2; s32Ch++)
72         {
73             if (s32NumOfSubBands == 4)
74             {
75                 ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset4[pstrCodecParams->s16SamplingFreq];
76             }
77             else
78             {
79                 ps16GenTabPtr = (SINT16 *)sbc_enc_as16Offset8[pstrCodecParams->s16SamplingFreq];
80             }
81 
82             for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++)
83             {
84                 if (*pas16ScaleFactor == 0)
85                     *ps16GenBufPtr = -5;
86                 else
87                 {
88                     s32Loudness = (SINT32)(*pas16ScaleFactor - *ps16GenTabPtr);
89 
90                     if (s32Loudness > 0)
91                         *ps16GenBufPtr = (SINT16)(s32Loudness >> 1);
92                     else
93                         *ps16GenBufPtr = (SINT16)s32Loudness;
94                 }
95 
96                 if (*ps16GenBufPtr > s32MaxBitNeed)
97                     s32MaxBitNeed = *ps16GenBufPtr;
98                 pas16ScaleFactor++;
99                 ps16GenBufPtr++;
100                 ps16GenTabPtr++;
101             }
102         }
103     }
104 
105     /* iterative process to find out hwo many bitslices fit into the bitpool */
106     s32BitSlice = s32MaxBitNeed + 1;
107     s32BitCount = s32BitPool;
108     s32SliceCount = 0;
109     do
110     {
111         s32BitSlice --;
112         s32BitCount -= s32SliceCount;
113         s32SliceCount = 0;
114         ps16GenBufPtr = ps16BitNeed;
115 
116         for (s32Sb = 0; s32Sb < 2*s32NumOfSubBands; s32Sb++)
117         {
118             if ( (*ps16GenBufPtr >= s32BitSlice + 1) && (*ps16GenBufPtr < s32BitSlice + 16) )
119             {
120                 if (*(ps16GenBufPtr) == s32BitSlice+1)
121                     s32SliceCount += 2;
122                 else
123                     s32SliceCount++;
124             }
125             ps16GenBufPtr++;
126         }
127     } while (s32BitCount-s32SliceCount>0);
128 
129     if (s32BitCount-s32SliceCount == 0)
130     {
131         s32BitCount -= s32SliceCount;
132         s32BitSlice --;
133     }
134 
135     /* Bits are distributed until the last bitslice is reached */
136     ps16GenBufPtr = ps16BitNeed;
137     ps16GenArrPtr = pstrCodecParams->as16Bits;
138     for (s32Ch = 0; s32Ch < 2; s32Ch++)
139     {
140         for (s32Sb = 0; s32Sb < s32NumOfSubBands; s32Sb++)
141         {
142             if (*ps16GenBufPtr < s32BitSlice+2)
143                 *ps16GenArrPtr = 0;
144             else
145                 *ps16GenArrPtr = ((*(ps16GenBufPtr)-s32BitSlice) < 16) ?
146                                         (SINT16)(*(ps16GenBufPtr)-s32BitSlice):16;
147             ps16GenBufPtr++;
148             ps16GenArrPtr++;
149         }
150     }
151 
152     /* the remaining bits are allocated starting at subband 0 */
153     s32Ch=0;
154     s32Sb=0;
155     ps16GenBufPtr = ps16BitNeed;
156     ps16GenArrPtr -= 2*s32NumOfSubBands;
157 
158     while ( (s32BitCount > 0) && (s32Sb < s32NumOfSubBands) )
159     {
160         if ( (*(ps16GenArrPtr) >= 2) && (*(ps16GenArrPtr) < 16) )
161         {
162             (*(ps16GenArrPtr))++;
163             s32BitCount--;
164         }
165         else if ((*ps16GenBufPtr == s32BitSlice+1) && (s32BitCount > 1))
166         {
167             *(ps16GenArrPtr) = 2;
168             s32BitCount -= 2;
169         }
170         if(s32Ch == 1)
171         {
172             s32Ch = 0;
173             s32Sb++;
174             ps16GenBufPtr = ps16BitNeed+s32Sb;
175             ps16GenArrPtr = pstrCodecParams->as16Bits+s32Sb;
176 
177         }
178         else
179         {
180             s32Ch =1;
181             ps16GenBufPtr = ps16BitNeed+s32NumOfSubBands+s32Sb;
182             ps16GenArrPtr = pstrCodecParams->as16Bits+s32NumOfSubBands+s32Sb;
183         }
184     }
185 
186     s32Ch=0;
187     s32Sb=0;
188     ps16GenArrPtr = pstrCodecParams->as16Bits;
189 
190     while ((s32BitCount >0) && (s32Sb < s32NumOfSubBands))
191     {
192         if(*(ps16GenArrPtr) < 16)
193         {
194             (*(ps16GenArrPtr))++;
195             s32BitCount--;
196         }
197         if (s32Ch == 1)
198         {
199             s32Ch = 0;
200             s32Sb++;
201             ps16GenArrPtr = pstrCodecParams->as16Bits+s32Sb;
202         }
203         else
204         {
205             s32Ch = 1;
206             ps16GenArrPtr = pstrCodecParams->as16Bits+s32NumOfSubBands+s32Sb;
207         }
208     }
209 }
210 
211 /*End of BitAlloc() function*/
212 
213