1*df25739fSMilanka Ringwald /****************************************************************************** 2*df25739fSMilanka Ringwald * 3*df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4*df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5*df25739fSMilanka Ringwald * 6*df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7*df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8*df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9*df25739fSMilanka Ringwald * 10*df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11*df25739fSMilanka Ringwald * 12*df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13*df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14*df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16*df25739fSMilanka Ringwald * limitations under the License. 17*df25739fSMilanka Ringwald * 18*df25739fSMilanka Ringwald ******************************************************************************/ 19*df25739fSMilanka Ringwald 20*df25739fSMilanka Ringwald /********************************************************************************** 21*df25739fSMilanka Ringwald $Revision: #1 $ 22*df25739fSMilanka Ringwald ***********************************************************************************/ 23*df25739fSMilanka Ringwald 24*df25739fSMilanka Ringwald /** 25*df25739fSMilanka Ringwald @file 26*df25739fSMilanka Ringwald 27*df25739fSMilanka Ringwald The functions in this file relate to the allocation of available bits to 28*df25739fSMilanka Ringwald subbands within the SBC/eSBC frame, along with support functions for computing 29*df25739fSMilanka Ringwald frame length and bitrate. 30*df25739fSMilanka Ringwald 31*df25739fSMilanka Ringwald @ingroup codec_internal 32*df25739fSMilanka Ringwald */ 33*df25739fSMilanka Ringwald 34*df25739fSMilanka Ringwald /** 35*df25739fSMilanka Ringwald @addtogroup codec_internal 36*df25739fSMilanka Ringwald @{ 37*df25739fSMilanka Ringwald */ 38*df25739fSMilanka Ringwald 39*df25739fSMilanka Ringwald #include "oi_utils.h" 40*df25739fSMilanka Ringwald #include <oi_codec_sbc_private.h> 41*df25739fSMilanka Ringwald 42*df25739fSMilanka Ringwald OI_UINT32 OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO *frame) 43*df25739fSMilanka Ringwald { 44*df25739fSMilanka Ringwald switch (frame->mode) { 45*df25739fSMilanka Ringwald case SBC_MONO: 46*df25739fSMilanka Ringwald case SBC_DUAL_CHANNEL: 47*df25739fSMilanka Ringwald return 16 * frame->nrof_subbands; 48*df25739fSMilanka Ringwald case SBC_STEREO: 49*df25739fSMilanka Ringwald case SBC_JOINT_STEREO: 50*df25739fSMilanka Ringwald return 32 * frame->nrof_subbands; 51*df25739fSMilanka Ringwald } 52*df25739fSMilanka Ringwald 53*df25739fSMilanka Ringwald ERROR(("Invalid frame mode %d", frame->mode)); 54*df25739fSMilanka Ringwald OI_ASSERT(FALSE); 55*df25739fSMilanka Ringwald return 0; /* Should never be reached */ 56*df25739fSMilanka Ringwald } 57*df25739fSMilanka Ringwald 58*df25739fSMilanka Ringwald 59*df25739fSMilanka Ringwald PRIVATE OI_UINT16 internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame) 60*df25739fSMilanka Ringwald { 61*df25739fSMilanka Ringwald OI_UINT16 nbits = frame->nrof_blocks * frame->bitpool; 62*df25739fSMilanka Ringwald OI_UINT16 nrof_subbands = frame->nrof_subbands; 63*df25739fSMilanka Ringwald OI_UINT16 result = nbits; 64*df25739fSMilanka Ringwald 65*df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO) { 66*df25739fSMilanka Ringwald result += nrof_subbands + (8 * nrof_subbands); 67*df25739fSMilanka Ringwald } else { 68*df25739fSMilanka Ringwald if (frame->mode == SBC_DUAL_CHANNEL) { result += nbits; } 69*df25739fSMilanka Ringwald if (frame->mode == SBC_MONO) { result += 4*nrof_subbands; } else { result += 8*nrof_subbands; } 70*df25739fSMilanka Ringwald } 71*df25739fSMilanka Ringwald return SBC_HEADER_LEN + (result + 7) / 8; 72*df25739fSMilanka Ringwald } 73*df25739fSMilanka Ringwald 74*df25739fSMilanka Ringwald 75*df25739fSMilanka Ringwald PRIVATE OI_UINT32 internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame) 76*df25739fSMilanka Ringwald { 77*df25739fSMilanka Ringwald OI_UINT blocksbands; 78*df25739fSMilanka Ringwald blocksbands = frame->nrof_subbands * frame->nrof_blocks; 79*df25739fSMilanka Ringwald 80*df25739fSMilanka Ringwald return DIVIDE(8 * internal_CalculateFramelen(frame) * frame->frequency, blocksbands); 81*df25739fSMilanka Ringwald } 82*df25739fSMilanka Ringwald 83*df25739fSMilanka Ringwald 84*df25739fSMilanka Ringwald INLINE OI_UINT16 OI_SBC_CalculateFrameAndHeaderlen(OI_CODEC_SBC_FRAME_INFO *frame, OI_UINT *headerLen_) 85*df25739fSMilanka Ringwald { 86*df25739fSMilanka Ringwald OI_UINT headerLen = SBC_HEADER_LEN + frame->nrof_subbands * frame->nrof_channels/2; 87*df25739fSMilanka Ringwald 88*df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO) { headerLen++; } 89*df25739fSMilanka Ringwald 90*df25739fSMilanka Ringwald *headerLen_ = headerLen; 91*df25739fSMilanka Ringwald return internal_CalculateFramelen(frame); 92*df25739fSMilanka Ringwald } 93*df25739fSMilanka Ringwald 94*df25739fSMilanka Ringwald 95*df25739fSMilanka Ringwald #define MIN(x, y) ((x) < (y) ? (x) : (y)) 96*df25739fSMilanka Ringwald 97*df25739fSMilanka Ringwald 98*df25739fSMilanka Ringwald /* 99*df25739fSMilanka Ringwald * Computes the bit need for each sample and as also returns a counts of bit needs that are greater 100*df25739fSMilanka Ringwald * than one. This count is used in the first phase of bit allocation. 101*df25739fSMilanka Ringwald * 102*df25739fSMilanka Ringwald * We also compute a preferred bitpool value that this is the minimum bitpool needed to guarantee 103*df25739fSMilanka Ringwald * lossless representation of the audio data. The preferred bitpool may be larger than the bits 104*df25739fSMilanka Ringwald * actually required but the only input we have are the scale factors. For example, it takes 2 bits 105*df25739fSMilanka Ringwald * to represent values in the range -1 .. +1 but the scale factor is 0. To guarantee lossless 106*df25739fSMilanka Ringwald * representation we add 2 to each scale factor and sum them to come up with the preferred bitpool. 107*df25739fSMilanka Ringwald * This is not ideal because 0 requires 0 bits but we currently have no way of knowing this. 108*df25739fSMilanka Ringwald * 109*df25739fSMilanka Ringwald * @param bitneed Array to return bitneeds for each subband 110*df25739fSMilanka Ringwald * 111*df25739fSMilanka Ringwald * @param ch Channel 0 or 1 112*df25739fSMilanka Ringwald * 113*df25739fSMilanka Ringwald * @param preferredBitpool Returns the number of reserved bits 114*df25739fSMilanka Ringwald * 115*df25739fSMilanka Ringwald * @return The SBC bit need 116*df25739fSMilanka Ringwald * 117*df25739fSMilanka Ringwald */ 118*df25739fSMilanka Ringwald OI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common, 119*df25739fSMilanka Ringwald OI_UINT8 *bitneeds, 120*df25739fSMilanka Ringwald OI_UINT ch, 121*df25739fSMilanka Ringwald OI_UINT *preferredBitpool) 122*df25739fSMilanka Ringwald { 123*df25739fSMilanka Ringwald static const OI_INT8 offset4[4][4] = { 124*df25739fSMilanka Ringwald { -1, 0, 0, 0 }, 125*df25739fSMilanka Ringwald { -2, 0, 0, 1 }, 126*df25739fSMilanka Ringwald { -2, 0, 0, 1 }, 127*df25739fSMilanka Ringwald { -2, 0, 0, 1 } 128*df25739fSMilanka Ringwald }; 129*df25739fSMilanka Ringwald 130*df25739fSMilanka Ringwald static const OI_INT8 offset8[4][8] = { 131*df25739fSMilanka Ringwald { -2, 0, 0, 0, 0, 0, 0, 1 }, 132*df25739fSMilanka Ringwald { -3, 0, 0, 0, 0, 0, 1, 2 }, 133*df25739fSMilanka Ringwald { -4, 0, 0, 0, 0, 0, 1, 2 }, 134*df25739fSMilanka Ringwald { -4, 0, 0, 0, 0, 0, 1, 2 } 135*df25739fSMilanka Ringwald }; 136*df25739fSMilanka Ringwald 137*df25739fSMilanka Ringwald const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands; 138*df25739fSMilanka Ringwald OI_UINT sb; 139*df25739fSMilanka Ringwald OI_INT8 *scale_factor = &common->scale_factor[ch ? nrof_subbands : 0]; 140*df25739fSMilanka Ringwald OI_UINT bitcount = 0; 141*df25739fSMilanka Ringwald OI_UINT8 maxBits = 0; 142*df25739fSMilanka Ringwald OI_UINT8 prefBits = 0; 143*df25739fSMilanka Ringwald 144*df25739fSMilanka Ringwald if (common->frameInfo.alloc == SBC_SNR) { 145*df25739fSMilanka Ringwald for (sb = 0; sb < nrof_subbands; sb++) { 146*df25739fSMilanka Ringwald OI_INT bits = scale_factor[sb]; 147*df25739fSMilanka Ringwald if (bits > maxBits) { 148*df25739fSMilanka Ringwald maxBits = bits; 149*df25739fSMilanka Ringwald } 150*df25739fSMilanka Ringwald if ((bitneeds[sb] = bits) > 1) { 151*df25739fSMilanka Ringwald bitcount += bits; 152*df25739fSMilanka Ringwald } 153*df25739fSMilanka Ringwald prefBits += 2 + bits; 154*df25739fSMilanka Ringwald } 155*df25739fSMilanka Ringwald } else { 156*df25739fSMilanka Ringwald const OI_INT8 *offset; 157*df25739fSMilanka Ringwald if (nrof_subbands == 4) { 158*df25739fSMilanka Ringwald offset = offset4[common->frameInfo.freqIndex]; 159*df25739fSMilanka Ringwald } else { 160*df25739fSMilanka Ringwald offset = offset8[common->frameInfo.freqIndex]; 161*df25739fSMilanka Ringwald } 162*df25739fSMilanka Ringwald for (sb = 0; sb < nrof_subbands; sb++) { 163*df25739fSMilanka Ringwald OI_INT bits = scale_factor[sb]; 164*df25739fSMilanka Ringwald if (bits > maxBits) { 165*df25739fSMilanka Ringwald maxBits = bits; 166*df25739fSMilanka Ringwald } 167*df25739fSMilanka Ringwald prefBits += 2 + bits; 168*df25739fSMilanka Ringwald if (bits) { 169*df25739fSMilanka Ringwald bits -= offset[sb]; 170*df25739fSMilanka Ringwald if (bits > 0) { 171*df25739fSMilanka Ringwald bits /= 2; 172*df25739fSMilanka Ringwald } 173*df25739fSMilanka Ringwald bits += 5; 174*df25739fSMilanka Ringwald } 175*df25739fSMilanka Ringwald if ((bitneeds[sb] = bits) > 1) { 176*df25739fSMilanka Ringwald bitcount += bits; 177*df25739fSMilanka Ringwald } 178*df25739fSMilanka Ringwald } 179*df25739fSMilanka Ringwald } 180*df25739fSMilanka Ringwald common->maxBitneed = OI_MAX(maxBits, common->maxBitneed); 181*df25739fSMilanka Ringwald *preferredBitpool += prefBits; 182*df25739fSMilanka Ringwald return bitcount; 183*df25739fSMilanka Ringwald } 184*df25739fSMilanka Ringwald 185*df25739fSMilanka Ringwald 186*df25739fSMilanka Ringwald /* 187*df25739fSMilanka Ringwald * Explanation of the adjustToFitBitpool inner loop. 188*df25739fSMilanka Ringwald * 189*df25739fSMilanka Ringwald * The inner loop computes the effect of adjusting the bit allocation up or 190*df25739fSMilanka Ringwald * down. Allocations must be 0 or in the range 2..16. This is accomplished by 191*df25739fSMilanka Ringwald * the following code: 192*df25739fSMilanka Ringwald * 193*df25739fSMilanka Ringwald * for (s = bands - 1; s >= 0; --s) { 194*df25739fSMilanka Ringwald * OI_INT bits = bitadjust + bitneeds[s]; 195*df25739fSMilanka Ringwald * bits = bits < 2 ? 0 : bits; 196*df25739fSMilanka Ringwald * bits = bits > 16 ? 16 : bits; 197*df25739fSMilanka Ringwald * count += bits; 198*df25739fSMilanka Ringwald * } 199*df25739fSMilanka Ringwald * 200*df25739fSMilanka Ringwald * This loop can be optimized to perform 4 operations at a time as follows: 201*df25739fSMilanka Ringwald * 202*df25739fSMilanka Ringwald * Adjustment is computed as a 7 bit signed value and added to the bitneed. 203*df25739fSMilanka Ringwald * 204*df25739fSMilanka Ringwald * Negative allocations are zeroed by masking. (n & 0x40) >> 6 puts the 205*df25739fSMilanka Ringwald * sign bit into bit 0, adding this to 0x7F give us a mask of 0x80 206*df25739fSMilanka Ringwald * for -ve values and 0x7F for +ve values. 207*df25739fSMilanka Ringwald * 208*df25739fSMilanka Ringwald * n &= 0x7F + (n & 0x40) >> 6) 209*df25739fSMilanka Ringwald * 210*df25739fSMilanka Ringwald * Allocations greater than 16 are truncated to 16. Adjusted allocations are in 211*df25739fSMilanka Ringwald * the range 0..31 so we know that bit 4 indicates values >= 16. We use this bit 212*df25739fSMilanka Ringwald * to create a mask that zeroes bits 0 .. 3 if bit 4 is set. 213*df25739fSMilanka Ringwald * 214*df25739fSMilanka Ringwald * n &= (15 + (n >> 4)) 215*df25739fSMilanka Ringwald * 216*df25739fSMilanka Ringwald * Allocations of 1 are disallowed. Add and shift creates a mask that 217*df25739fSMilanka Ringwald * eliminates the illegal value 218*df25739fSMilanka Ringwald * 219*df25739fSMilanka Ringwald * n &= ((n + 14) >> 4) | 0x1E 220*df25739fSMilanka Ringwald * 221*df25739fSMilanka Ringwald * These operations can be performed in 8 bits without overflowing so we can 222*df25739fSMilanka Ringwald * operate on 4 values at once. 223*df25739fSMilanka Ringwald */ 224*df25739fSMilanka Ringwald 225*df25739fSMilanka Ringwald 226*df25739fSMilanka Ringwald /* 227*df25739fSMilanka Ringwald * Encoder/Decoder 228*df25739fSMilanka Ringwald * 229*df25739fSMilanka Ringwald * Computes adjustment +/- of bitneeds to fill bitpool and returns overall 230*df25739fSMilanka Ringwald * adjustment and excess bits. 231*df25739fSMilanka Ringwald * 232*df25739fSMilanka Ringwald * @param bitpool The bitpool we have to work within 233*df25739fSMilanka Ringwald * 234*df25739fSMilanka Ringwald * @param bitneeds An array of bit needs (more acturately allocation prioritities) for each 235*df25739fSMilanka Ringwald * subband across all blocks in the SBC frame 236*df25739fSMilanka Ringwald * 237*df25739fSMilanka Ringwald * @param subbands The number of subbands over which the adkustment is calculated. For mono and 238*df25739fSMilanka Ringwald * dual mode this is 4 or 8, for stereo or joint stereo this is 8 or 16. 239*df25739fSMilanka Ringwald * 240*df25739fSMilanka Ringwald * @param bitcount A starting point for the adjustment 241*df25739fSMilanka Ringwald * 242*df25739fSMilanka Ringwald * @param excess Returns the excess bits after the adjustment 243*df25739fSMilanka Ringwald * 244*df25739fSMilanka Ringwald * @return The adjustment. 245*df25739fSMilanka Ringwald */ 246*df25739fSMilanka Ringwald OI_INT adjustToFitBitpool(const OI_UINT bitpool, 247*df25739fSMilanka Ringwald OI_UINT32 *bitneeds, 248*df25739fSMilanka Ringwald const OI_UINT subbands, 249*df25739fSMilanka Ringwald OI_UINT bitcount, 250*df25739fSMilanka Ringwald OI_UINT *excess) 251*df25739fSMilanka Ringwald { 252*df25739fSMilanka Ringwald OI_INT maxBitadjust = 0; 253*df25739fSMilanka Ringwald OI_INT bitadjust = (bitcount > bitpool) ? -8 : 8; 254*df25739fSMilanka Ringwald OI_INT chop = 8; 255*df25739fSMilanka Ringwald 256*df25739fSMilanka Ringwald /* 257*df25739fSMilanka Ringwald * This is essentially a binary search for the optimal adjustment value. 258*df25739fSMilanka Ringwald */ 259*df25739fSMilanka Ringwald while ((bitcount != bitpool) && chop) { 260*df25739fSMilanka Ringwald OI_UINT32 total = 0; 261*df25739fSMilanka Ringwald OI_UINT count; 262*df25739fSMilanka Ringwald OI_UINT32 adjust4; 263*df25739fSMilanka Ringwald OI_INT i; 264*df25739fSMilanka Ringwald 265*df25739fSMilanka Ringwald adjust4 = bitadjust & 0x7F; 266*df25739fSMilanka Ringwald adjust4 |= (adjust4 << 8); 267*df25739fSMilanka Ringwald adjust4 |= (adjust4 << 16); 268*df25739fSMilanka Ringwald 269*df25739fSMilanka Ringwald for (i = (subbands / 4 - 1); i >= 0; --i) { 270*df25739fSMilanka Ringwald OI_UINT32 mask; 271*df25739fSMilanka Ringwald OI_UINT32 n = bitneeds[i] + adjust4; 272*df25739fSMilanka Ringwald mask = 0x7F7F7F7F + ((n & 0x40404040) >> 6); 273*df25739fSMilanka Ringwald n &= mask; 274*df25739fSMilanka Ringwald mask = 0x0F0F0F0F + ((n & 0x10101010) >> 4); 275*df25739fSMilanka Ringwald n &= mask; 276*df25739fSMilanka Ringwald mask = (((n + 0x0E0E0E0E) >> 4) | 0x1E1E1E1E); 277*df25739fSMilanka Ringwald n &= mask; 278*df25739fSMilanka Ringwald total += n; 279*df25739fSMilanka Ringwald } 280*df25739fSMilanka Ringwald 281*df25739fSMilanka Ringwald count = (total & 0xFFFF) + (total >> 16); 282*df25739fSMilanka Ringwald count = (count & 0xFF) + (count >> 8); 283*df25739fSMilanka Ringwald 284*df25739fSMilanka Ringwald chop >>= 1; 285*df25739fSMilanka Ringwald if (count > bitpool) { 286*df25739fSMilanka Ringwald bitadjust -= chop; 287*df25739fSMilanka Ringwald } else { 288*df25739fSMilanka Ringwald maxBitadjust = bitadjust; 289*df25739fSMilanka Ringwald bitcount = count; 290*df25739fSMilanka Ringwald bitadjust += chop; 291*df25739fSMilanka Ringwald } 292*df25739fSMilanka Ringwald } 293*df25739fSMilanka Ringwald 294*df25739fSMilanka Ringwald *excess = bitpool - bitcount; 295*df25739fSMilanka Ringwald 296*df25739fSMilanka Ringwald return maxBitadjust; 297*df25739fSMilanka Ringwald } 298*df25739fSMilanka Ringwald 299*df25739fSMilanka Ringwald 300*df25739fSMilanka Ringwald /* 301*df25739fSMilanka Ringwald * The bit allocator trys to avoid single bit allocations except as a last resort. So in the case 302*df25739fSMilanka Ringwald * where a bitneed of 1 was passed over during the adsjustment phase 2 bits are now allocated. 303*df25739fSMilanka Ringwald */ 304*df25739fSMilanka Ringwald INLINE OI_INT allocAdjustedBits(OI_UINT8 *dest, 305*df25739fSMilanka Ringwald OI_INT bits, 306*df25739fSMilanka Ringwald OI_INT excess) 307*df25739fSMilanka Ringwald { 308*df25739fSMilanka Ringwald if (bits < 16) { 309*df25739fSMilanka Ringwald if (bits > 1) { 310*df25739fSMilanka Ringwald if (excess) { 311*df25739fSMilanka Ringwald ++bits; 312*df25739fSMilanka Ringwald --excess; 313*df25739fSMilanka Ringwald } 314*df25739fSMilanka Ringwald } else if ((bits == 1) && (excess > 1)) { 315*df25739fSMilanka Ringwald bits = 2; 316*df25739fSMilanka Ringwald excess -= 2; 317*df25739fSMilanka Ringwald } else { 318*df25739fSMilanka Ringwald bits = 0; 319*df25739fSMilanka Ringwald } 320*df25739fSMilanka Ringwald } else { 321*df25739fSMilanka Ringwald bits = 16; 322*df25739fSMilanka Ringwald } 323*df25739fSMilanka Ringwald *dest = (OI_UINT8)bits; 324*df25739fSMilanka Ringwald return excess; 325*df25739fSMilanka Ringwald } 326*df25739fSMilanka Ringwald 327*df25739fSMilanka Ringwald 328*df25739fSMilanka Ringwald /* 329*df25739fSMilanka Ringwald * Excess bits not allocated by allocaAdjustedBits are allocated round-robin. 330*df25739fSMilanka Ringwald */ 331*df25739fSMilanka Ringwald INLINE OI_INT allocExcessBits(OI_UINT8 *dest, 332*df25739fSMilanka Ringwald OI_INT excess) 333*df25739fSMilanka Ringwald { 334*df25739fSMilanka Ringwald if (*dest < 16) { 335*df25739fSMilanka Ringwald *dest += 1; 336*df25739fSMilanka Ringwald return excess - 1; 337*df25739fSMilanka Ringwald } else { 338*df25739fSMilanka Ringwald return excess; 339*df25739fSMilanka Ringwald } 340*df25739fSMilanka Ringwald } 341*df25739fSMilanka Ringwald 342*df25739fSMilanka Ringwald void oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common, 343*df25739fSMilanka Ringwald BITNEED_UNION1 *bitneeds, 344*df25739fSMilanka Ringwald OI_UINT ch, 345*df25739fSMilanka Ringwald OI_UINT bitcount) 346*df25739fSMilanka Ringwald { 347*df25739fSMilanka Ringwald const OI_UINT8 nrof_subbands = common->frameInfo.nrof_subbands; 348*df25739fSMilanka Ringwald OI_UINT excess; 349*df25739fSMilanka Ringwald OI_UINT sb; 350*df25739fSMilanka Ringwald OI_INT bitadjust; 351*df25739fSMilanka Ringwald OI_UINT8 RESTRICT *allocBits; 352*df25739fSMilanka Ringwald 353*df25739fSMilanka Ringwald 354*df25739fSMilanka Ringwald { 355*df25739fSMilanka Ringwald OI_UINT ex; 356*df25739fSMilanka Ringwald bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds->uint32, nrof_subbands, bitcount, &ex); 357*df25739fSMilanka Ringwald /* We want the compiler to put excess into a register */ 358*df25739fSMilanka Ringwald excess = ex; 359*df25739fSMilanka Ringwald } 360*df25739fSMilanka Ringwald 361*df25739fSMilanka Ringwald /* 362*df25739fSMilanka Ringwald * Allocate adjusted bits 363*df25739fSMilanka Ringwald */ 364*df25739fSMilanka Ringwald allocBits = &common->bits.uint8[ch ? nrof_subbands : 0]; 365*df25739fSMilanka Ringwald 366*df25739fSMilanka Ringwald sb = 0; 367*df25739fSMilanka Ringwald while (sb < nrof_subbands) { 368*df25739fSMilanka Ringwald excess = allocAdjustedBits(&allocBits[sb], bitneeds->uint8[sb] + bitadjust, excess); 369*df25739fSMilanka Ringwald ++sb; 370*df25739fSMilanka Ringwald } 371*df25739fSMilanka Ringwald sb = 0; 372*df25739fSMilanka Ringwald while (excess) { 373*df25739fSMilanka Ringwald excess = allocExcessBits(&allocBits[sb], excess); 374*df25739fSMilanka Ringwald ++sb; 375*df25739fSMilanka Ringwald } 376*df25739fSMilanka Ringwald } 377*df25739fSMilanka Ringwald 378*df25739fSMilanka Ringwald 379*df25739fSMilanka Ringwald void monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common) 380*df25739fSMilanka Ringwald { 381*df25739fSMilanka Ringwald BITNEED_UNION1 bitneeds; 382*df25739fSMilanka Ringwald OI_UINT bitcount; 383*df25739fSMilanka Ringwald OI_UINT bitpoolPreference = 0; 384*df25739fSMilanka Ringwald 385*df25739fSMilanka Ringwald bitcount = computeBitneed(common, bitneeds.uint8, 0, &bitpoolPreference); 386*df25739fSMilanka Ringwald 387*df25739fSMilanka Ringwald oneChannelBitAllocation(common, &bitneeds, 0, bitcount); 388*df25739fSMilanka Ringwald } 389*df25739fSMilanka Ringwald 390*df25739fSMilanka Ringwald /** 391*df25739fSMilanka Ringwald @} 392*df25739fSMilanka Ringwald */ 393