bitalloc-sbc.c revision ce24765fe7620c34e8d88ed4f826c8a6917582b2
1ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/******************************************************************************
2ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
3ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  Copyright (C) 2014 The Android Open Source Project
4ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved.
5ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
6ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  Licensed under the Apache License, Version 2.0 (the "License");
7ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  you may not use this file except in compliance with the License.
8ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  You may obtain a copy of the License at:
9ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
10ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  http://www.apache.org/licenses/LICENSE-2.0
11ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
12ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  Unless required by applicable law or agreed to in writing, software
13ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  distributed under the License is distributed on an "AS IS" BASIS,
14ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  See the License for the specific language governing permissions and
16ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *  limitations under the License.
17ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *
18ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta ******************************************************************************/
19ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
20ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**********************************************************************************
21ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta  $Revision: #1 $
22ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta***********************************************************************************/
23ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
24ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/** @file
25ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@ingroup codec_internal
26ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta*/
27ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
28ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**@addgroup codec_internal*/
29ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**@{*/
30ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
31ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#include <oi_codec_sbc_private.h>
32ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
33ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptastatic void dualBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
34ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
35ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT bitcountL;
36ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT bitcountR;
37ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT bitpoolPreferenceL = 0;
38ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT bitpoolPreferenceR = 0;
39ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    BITNEED_UNION1 bitneedsL;
40ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    BITNEED_UNION1 bitneedsR;
41ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
42ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    bitcountL = computeBitneed(common, bitneedsL.uint8, 0, &bitpoolPreferenceL);
43ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    bitcountR = computeBitneed(common, bitneedsR.uint8, 1, &bitpoolPreferenceR);
44ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
45ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    oneChannelBitAllocation(common, &bitneedsL, 0, bitcountL);
46ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    oneChannelBitAllocation(common, &bitneedsR, 1, bitcountR);
47ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
48ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
49ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptastatic void stereoBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
50ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
51ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    const OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
52ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    BITNEED_UNION2 bitneeds;
53ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT excess;
54ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_INT bitadjust;
55ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT bitcount;
56ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT sbL;
57ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT sbR;
58ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT bitpoolPreference = 0;
59ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
60ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    bitcount = computeBitneed(common, &bitneeds.uint8[0], 0, &bitpoolPreference);
61ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    bitcount += computeBitneed(common, &bitneeds.uint8[nrof_subbands], 1, &bitpoolPreference);
62ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
63ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    {
64ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        OI_UINT ex;
65ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        bitadjust = adjustToFitBitpool(common->frameInfo.bitpool, bitneeds.uint32, 2 * nrof_subbands, bitcount, &ex);
66ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        /* We want the compiler to put excess into a register */
67ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        excess = ex;
68ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
69ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    sbL = 0;
70ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    sbR = nrof_subbands;
71ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    while (sbL < nrof_subbands) {
72ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        excess = allocAdjustedBits(&common->bits.uint8[sbL], bitneeds.uint8[sbL] + bitadjust, excess);
73ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        ++sbL;
74ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        excess = allocAdjustedBits(&common->bits.uint8[sbR], bitneeds.uint8[sbR] + bitadjust, excess);
75ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        ++sbR;
76ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
77ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    sbL = 0;
78ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    sbR = nrof_subbands;
79ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    while (excess) {
80ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        excess = allocExcessBits(&common->bits.uint8[sbL], excess);
81ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        ++sbL;
82ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        if (!excess) {
83ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta            break;
84ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        }
85ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        excess = allocExcessBits(&common->bits.uint8[sbR], excess);
86ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        ++sbR;
87ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
88ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
89ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
90ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
91ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptastatic const BIT_ALLOC balloc[] = {
92ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    monoBitAllocation,    /* SBC_MONO */
93ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    dualBitAllocation,    /* SBC_DUAL_CHANNEL */
94ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    stereoBitAllocation,  /* SBC_STEREO */
95ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    stereoBitAllocation   /* SBC_JOINT_STEREO */
96ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta};
97ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
98ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
99ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaPRIVATE void OI_SBC_ComputeBitAllocation(OI_CODEC_SBC_COMMON_CONTEXT *common)
100ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
101ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_ASSERT(common->frameInfo.bitpool <= OI_SBC_MaxBitpool(&common->frameInfo));
102ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_ASSERT(common->frameInfo.mode < OI_ARRAYSIZE(balloc));
103ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
104ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    /*
105ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta     * Using an array of function pointers prevents the compiler from creating a suboptimal
106ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta     * monolithic inlined bit allocation function.
107ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta     */
108ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    balloc[common->frameInfo.mode](common);
109ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
110ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
111ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaOI_UINT32 OI_CODEC_SBC_CalculateBitrate(OI_CODEC_SBC_FRAME_INFO *frame)
112ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
113ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    return internal_CalculateBitrate(frame);
114ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
115ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
116ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/*
117ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Return the current maximum bitneed and clear it.
118ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */
119ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaOI_UINT8 OI_CODEC_SBC_GetMaxBitneed(OI_CODEC_SBC_COMMON_CONTEXT *common)
120ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
121ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT8 max = common->maxBitneed;
122ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
123ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    common->maxBitneed = 0;
124ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    return max;
125ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
126ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
127ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/*
128ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Calculates the bitpool size for a given frame length
129ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */
130ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaOI_UINT16 OI_CODEC_SBC_CalculateBitpool(OI_CODEC_SBC_FRAME_INFO *frame,
131ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                        OI_UINT16 frameLen)
132ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
133ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT16 nrof_subbands = frame->nrof_subbands;
134ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT16 nrof_blocks = frame->nrof_blocks;
135ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT16 hdr;
136ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_UINT16 bits;
137ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
138ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    if (frame->mode == SBC_JOINT_STEREO) {
139ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        hdr = 9 * nrof_subbands;
140ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    } else {
141ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        if (frame->mode == SBC_MONO) {
142ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta            hdr = 4 * nrof_subbands;
143ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        } else {
144ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta            hdr = 8 * nrof_subbands;
145ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        }
146ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        if (frame->mode == SBC_DUAL_CHANNEL) {
147ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta            nrof_blocks *= 2;
148ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        }
149ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
150ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    bits = 8 * (frameLen - SBC_HEADER_LEN) - hdr;
151ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    return DIVIDE(bits, nrof_blocks);
152ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
153ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
154ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaOI_UINT16 OI_CODEC_SBC_CalculatePcmBytes(OI_CODEC_SBC_COMMON_CONTEXT *common)
155ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
156ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    return sizeof(OI_INT16) * common->pcmStride * common->frameInfo.nrof_subbands * common->frameInfo.nrof_blocks;
157ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
158ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
159ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
160ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaOI_UINT16 OI_CODEC_SBC_CalculateFramelen(OI_CODEC_SBC_FRAME_INFO *frame)
161ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
162ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    return internal_CalculateFramelen(frame);
163ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
164ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
165ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**@}*/
166