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