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