1ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/******************************************************************************
2ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 2014 The Android Open Source Project
49ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights
59ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                        reserved.
6ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
7ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  Licensed under the Apache License, Version 2.0 (the "License");
8ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  you may not use this file except in compliance with the License.
9ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  You may obtain a copy of the License at:
10ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
11ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  http://www.apache.org/licenses/LICENSE-2.0
12ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
13ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  Unless required by applicable law or agreed to in writing, software
14ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  distributed under the License is distributed on an "AS IS" BASIS,
15ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  See the License for the specific language governing permissions and
17ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  limitations under the License.
18ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
19ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta ******************************************************************************/
20ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
21ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
22ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta  $Revision: #1 $
23ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
24ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
25ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**
26ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@file
27ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
28ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaThe functions in this file relate to the allocation of available bits to
29ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptasubbands within the SBC/eSBC frame, along with support functions for computing
30ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaframe length and bitrate.
31ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
32ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@ingroup codec_internal
33ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta*/
34ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
35ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**
36ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@addtogroup codec_internal
37ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@{
38ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta*/
39ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
40ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#include <oi_codec_sbc_private.h>
41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "oi_utils.h"
42ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint32_t OI_SBC_MaxBitpool(OI_CODEC_SBC_FRAME_INFO* frame) {
44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  switch (frame->mode) {
45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SBC_MONO:
46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SBC_DUAL_CHANNEL:
47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return 16 * frame->nrof_subbands;
48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SBC_STEREO:
49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    case SBC_JOINT_STEREO:
50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return 32 * frame->nrof_subbands;
51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ERROR(("Invalid frame mode %d", frame->mode));
54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_ASSERT(false);
55911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return 0; /* Should never be reached */
56ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
57ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
58911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonPRIVATE uint16_t internal_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO* frame) {
59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t nbits = frame->nrof_blocks * frame->bitpool;
60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t nrof_subbands = frame->nrof_subbands;
61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t result = nbits;
62ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (frame->mode == SBC_JOINT_STEREO) {
64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    result += nrof_subbands + (8 * nrof_subbands);
65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (frame->mode == SBC_DUAL_CHANNEL) {
67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      result += nbits;
68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (frame->mode == SBC_MONO) {
70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      result += 4 * nrof_subbands;
71ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    } else {
72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      result += 8 * nrof_subbands;
73ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return SBC_HEADER_LEN + (result + 7) / 8;
76ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
77ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
78911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonPRIVATE uint32_t internal_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO* frame) {
79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT blocksbands;
80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  blocksbands = frame->nrof_subbands * frame->nrof_blocks;
81ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return DIVIDE(8 * internal_CalculateFramelen(frame) * frame->frequency,
83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                blocksbands);
84ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
85ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
86911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonINLINE uint16_t OI_SBC_CalculateFrameAndHeaderlen(
87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    OI_CODEC_SBC_FRAME_INFO* frame, OI_UINT* headerLen_) {
88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT headerLen =
89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      SBC_HEADER_LEN + frame->nrof_subbands * frame->nrof_channels / 2;
90ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (frame->mode == SBC_JOINT_STEREO) {
92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    headerLen++;
93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
94ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *headerLen_ = headerLen;
96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return internal_CalculateFramelen(frame);
97ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
98ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define MIN(x, y) ((x) < (y) ? (x) : (y))
100ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
101ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/*
1029ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Computes the bit need for each sample and as also returns a counts of bit
1039ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * needs that are greater than one. This count is used in the first phase of bit
1049ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * allocation.
105ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
1069ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * We also compute a preferred bitpool value that this is the minimum bitpool
1079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * needed to guarantee lossless representation of the audio data. The preferred
1089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * bitpool may be larger than the bits actually required but the only input we
1099ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * have are the scale factors. For example, it takes 2 bits to represent values
1109ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * in the range -1 .. +1 but the scale factor is 0. To guarantee lossless
1119ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * representation we add 2 to each scale factor and sum them to come up with the
1129ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * preferred bitpool. This is not ideal because 0 requires 0 bits but we
1139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * currently have no way of knowing this.
114ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
115ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @param bitneed       Array to return bitneeds for each subband
116ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
117ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @param ch            Channel 0 or 1
118ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
119ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @param preferredBitpool  Returns the number of reserved bits
120ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
121ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @return              The SBC bit need
122ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
123ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */
124911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonOI_UINT computeBitneed(OI_CODEC_SBC_COMMON_CONTEXT* common, uint8_t* bitneeds,
125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                       OI_UINT ch, OI_UINT* preferredBitpool) {
126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  static const int8_t offset4[4][4] = {
127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      {-1, 0, 0, 0}, {-2, 0, 0, 1}, {-2, 0, 0, 1}, {-2, 0, 0, 1}};
128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  static const int8_t offset8[4][8] = {{-2, 0, 0, 0, 0, 0, 0, 1},
130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       {-3, 0, 0, 0, 0, 0, 1, 2},
131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       {-4, 0, 0, 0, 0, 0, 1, 2},
132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       {-4, 0, 0, 0, 0, 0, 1, 2}};
133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT sb;
136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  int8_t* scale_factor = &common->scale_factor[ch ? nrof_subbands : 0];
137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT bitcount = 0;
138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t maxBits = 0;
139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t prefBits = 0;
140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (common->frameInfo.alloc == SBC_SNR) {
142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    for (sb = 0; sb < nrof_subbands; sb++) {
143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      OI_INT bits = scale_factor[sb];
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (bits > maxBits) {
145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        maxBits = bits;
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
147f9c5752344ec459def74765f512d28fa0f402168Marie Janssen      bitneeds[sb] = bits;
148f9c5752344ec459def74765f512d28fa0f402168Marie Janssen      if (bitneeds[sb] > 1) {
149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        bitcount += bits;
150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      prefBits += 2 + bits;
152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    const int8_t* offset;
155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (nrof_subbands == 4) {
156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      offset = offset4[common->frameInfo.freqIndex];
157ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    } else {
158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      offset = offset8[common->frameInfo.freqIndex];
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    for (sb = 0; sb < nrof_subbands; sb++) {
161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      OI_INT bits = scale_factor[sb];
162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (bits > maxBits) {
163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        maxBits = bits;
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      prefBits += 2 + bits;
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (bits) {
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        bits -= offset[sb];
168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (bits > 0) {
169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          bits /= 2;
170ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        }
171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        bits += 5;
172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
173f9c5752344ec459def74765f512d28fa0f402168Marie Janssen      bitneeds[sb] = bits;
174f9c5752344ec459def74765f512d28fa0f402168Marie Janssen      if (bitneeds[sb] > 1) {
175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        bitcount += bits;
176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
177ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  common->maxBitneed = OI_MAX(maxBits, common->maxBitneed);
180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *preferredBitpool += prefBits;
181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return bitcount;
182ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
183ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
184ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/*
185ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Explanation of the adjustToFitBitpool inner loop.
186ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
187ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * The inner loop computes the effect of adjusting the bit allocation up or
188ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * down. Allocations must be 0 or in the range 2..16. This is accomplished by
189ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * the following code:
190ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
191ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *           for (s = bands - 1; s >= 0; --s) {
192ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *              OI_INT bits = bitadjust + bitneeds[s];
193ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *              bits = bits < 2 ? 0 : bits;
194ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *              bits = bits > 16 ? 16 : bits;
195ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *              count += bits;
196ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *          }
197ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
198ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * This loop can be optimized to perform 4 operations at a time as follows:
199ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
200ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Adjustment is computed as a 7 bit signed value and added to the bitneed.
201ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
202ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Negative allocations are zeroed by masking. (n & 0x40) >> 6 puts the
203ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * sign bit into bit 0, adding this to 0x7F give us a mask of 0x80
204ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * for -ve values and 0x7F for +ve values.
205ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
206ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * n &= 0x7F + (n & 0x40) >> 6)
207ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
208ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Allocations greater than 16 are truncated to 16. Adjusted allocations are in
209ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * the range 0..31 so we know that bit 4 indicates values >= 16. We use this bit
210ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * to create a mask that zeroes bits 0 .. 3 if bit 4 is set.
211ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
212ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * n &= (15 + (n >> 4))
213ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
214ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Allocations of 1 are disallowed. Add and shift creates a mask that
215ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * eliminates the illegal value
216ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
217ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * n &= ((n + 14) >> 4) | 0x1E
218ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
219ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * These operations can be performed in 8 bits without overflowing so we can
220ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * operate on 4 values at once.
221ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */
222ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
223ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/*
224ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Encoder/Decoder
225ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
226ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Computes adjustment +/- of bitneeds to fill bitpool and returns overall
227ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * adjustment and excess bits.
228ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
229ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @param bitpool   The bitpool we have to work within
230ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
2319ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * @param bitneeds  An array of bit needs (more acturately allocation
2329ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  prioritities) for each subband across all blocks in the SBC
2339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  frame
234ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
2359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * @param subbands  The number of subbands over which the adkustment is
2369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  calculated. For mono and dual mode this is 4 or 8, for
2379ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  stereo or joint stereo this is 8 or 16.
238ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
239ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @param bitcount  A starting point for the adjustment
240ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
241ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @param excess    Returns the excess bits after the adjustment
242ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
243ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * @return   The adjustment.
244ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */
245911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonOI_INT adjustToFitBitpool(const OI_UINT bitpool, uint32_t* bitneeds,
246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                          const OI_UINT subbands, OI_UINT bitcount,
247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                          OI_UINT* excess) {
248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_INT maxBitadjust = 0;
249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_INT bitadjust = (bitcount > bitpool) ? -8 : 8;
250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_INT chop = 8;
251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /*
253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   * This is essentially a binary search for the optimal adjustment value.
254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   */
255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while ((bitcount != bitpool) && chop) {
256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint32_t total = 0;
257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    OI_UINT count;
258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint32_t adjust4;
259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    OI_INT i;
260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    adjust4 = bitadjust & 0x7F;
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    adjust4 |= (adjust4 << 8);
263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    adjust4 |= (adjust4 << 16);
264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    for (i = (subbands / 4 - 1); i >= 0; --i) {
266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      uint32_t mask;
267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      uint32_t n = bitneeds[i] + adjust4;
268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      mask = 0x7F7F7F7F + ((n & 0x40404040) >> 6);
269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      n &= mask;
270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      mask = 0x0F0F0F0F + ((n & 0x10101010) >> 4);
271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      n &= mask;
272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      mask = (((n + 0x0E0E0E0E) >> 4) | 0x1E1E1E1E);
273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      n &= mask;
274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      total += n;
275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
276ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    count = (total & 0xFFFF) + (total >> 16);
278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    count = (count & 0xFF) + (count >> 8);
279ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    chop >>= 1;
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (count > bitpool) {
282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      bitadjust -= chop;
283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      maxBitadjust = bitadjust;
285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      bitcount = count;
286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      bitadjust += chop;
287ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
289ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *excess = bitpool - bitcount;
291ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return maxBitadjust;
293ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
294ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
295ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/*
2969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * The bit allocator trys to avoid single bit allocations except as a last
2979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * resort. So in the case where a bitneed of 1 was passed over during the
2989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * adsjustment phase 2 bits are now allocated.
299ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */
300911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonINLINE OI_INT allocAdjustedBits(uint8_t* dest, OI_INT bits, OI_INT excess) {
301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (bits < 16) {
302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (bits > 1) {
303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (excess) {
304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        ++bits;
305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        --excess;
306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else if ((bits == 1) && (excess > 1)) {
308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      bits = 2;
309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      excess -= 2;
310ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    } else {
311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      bits = 0;
312ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bits = 16;
315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *dest = (uint8_t)bits;
317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return excess;
318ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
319ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
320ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/*
321ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Excess bits not allocated by allocaAdjustedBits are allocated round-robin.
322ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */
323911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonINLINE OI_INT allocExcessBits(uint8_t* dest, OI_INT excess) {
324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (*dest < 16) {
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    *dest += 1;
326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return excess - 1;
327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return excess;
329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
330ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
331ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid oneChannelBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT* common,
333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                             BITNEED_UNION1* bitneeds, OI_UINT ch,
334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                             OI_UINT bitcount) {
335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  const uint8_t nrof_subbands = common->frameInfo.nrof_subbands;
336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT excess;
337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT sb;
338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_INT bitadjust;
339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t RESTRICT* allocBits;
340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    OI_UINT ex;
343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds->uint32,
344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                   nrof_subbands, bitcount, &ex);
345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* We want the compiler to put excess into a register */
346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    excess = ex;
347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /*
350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   * Allocate adjusted bits
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson   */
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  allocBits = &common->bits.uint8[ch ? nrof_subbands : 0];
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  sb = 0;
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while (sb < nrof_subbands) {
356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    excess = allocAdjustedBits(&allocBits[sb], bitneeds->uint8[sb] + bitadjust,
357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                               excess);
358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ++sb;
359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  sb = 0;
361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while (excess) {
362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    excess = allocExcessBits(&allocBits[sb], excess);
363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ++sb;
364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
365ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
366ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid monoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT* common) {
368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BITNEED_UNION1 bitneeds;
369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT bitcount;
370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  OI_UINT bitpoolPreference = 0;
371ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bitcount = computeBitneed(common, bitneeds.uint8, 0, &bitpoolPreference);
373ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  oneChannelBitAllocation(common, &bitneeds, 0, bitcount);
375ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
376ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
377ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**
378ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@}
379ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta*/
380