xref: /btstack/3rd-party/bluedroid/decoder/srce/readsamplesjoint.inc (revision df25739fc3ea5a0a90f0f5925e6461d653697d2e)
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 * @file readsamplesjoint.inc
22*df25739fSMilanka Ringwald *
23*df25739fSMilanka Ringwald * This is the body of the generic version of OI_SBC_ReadSamplesJoint().
24*df25739fSMilanka Ringwald * It is designed to be \#included into a function as follows:
25*df25739fSMilanka Ringwald    \code
26*df25739fSMilanka Ringwald    void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
27*df25739fSMilanka Ringwald    {
28*df25739fSMilanka Ringwald        #define NROF_SUBBANDS 4
29*df25739fSMilanka Ringwald        #include "readsamplesjoint.inc"
30*df25739fSMilanka Ringwald        #undef NROF_SUBBANDS
31*df25739fSMilanka Ringwald    }
32*df25739fSMilanka Ringwald
33*df25739fSMilanka Ringwald    void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
34*df25739fSMilanka Ringwald    {
35*df25739fSMilanka Ringwald        #define NROF_SUBBANDS 8
36*df25739fSMilanka Ringwald        #include "readsamplesjoint.inc"
37*df25739fSMilanka Ringwald        #undef NROF_SUBBANDS
38*df25739fSMilanka Ringwald    }
39*df25739fSMilanka Ringwald    \endcode
40*df25739fSMilanka Ringwald * Or to make a generic version:
41*df25739fSMilanka Ringwald    \code
42*df25739fSMilanka Ringwald    void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_COMMON_CONTEXT *common, OI_BITSTREAM *global_bs)
43*df25739fSMilanka Ringwald    {
44*df25739fSMilanka Ringwald        OI_UINT nrof_subbands = common->frameInfo.nrof_subbands;
45*df25739fSMilanka Ringwald
46*df25739fSMilanka Ringwald        #define NROF_SUBBANDS nrof_subbands
47*df25739fSMilanka Ringwald        #include "readsamplesjoint.inc"
48*df25739fSMilanka Ringwald        #undef NROF_SUBBANDS
49*df25739fSMilanka Ringwald    }
50*df25739fSMilanka Ringwald    \endcode
51*df25739fSMilanka Ringwald * @ingroup codec_internal
52*df25739fSMilanka Ringwald *******************************************************************************/
53*df25739fSMilanka Ringwald
54*df25739fSMilanka Ringwald/**********************************************************************************
55*df25739fSMilanka Ringwald  $Revision: #1 $
56*df25739fSMilanka Ringwald***********************************************************************************/
57*df25739fSMilanka Ringwald
58*df25739fSMilanka Ringwald{
59*df25739fSMilanka Ringwald    OI_CODEC_SBC_COMMON_CONTEXT *common = &context->common;
60*df25739fSMilanka Ringwald    OI_UINT bl = common->frameInfo.nrof_blocks;
61*df25739fSMilanka Ringwald    OI_INT32 * RESTRICT s = common->subdata;
62*df25739fSMilanka Ringwald    OI_UINT8 *ptr = global_bs->ptr.w;
63*df25739fSMilanka Ringwald    OI_UINT32 value = global_bs->value;
64*df25739fSMilanka Ringwald    OI_UINT bitPtr = global_bs->bitPtr;
65*df25739fSMilanka Ringwald    OI_UINT8 jmask = common->frameInfo.join << (8 - NROF_SUBBANDS);
66*df25739fSMilanka Ringwald
67*df25739fSMilanka Ringwald    do {
68*df25739fSMilanka Ringwald        OI_INT8 *sf_array = &common->scale_factor[0];
69*df25739fSMilanka Ringwald        OI_UINT8 *bits_array = &common->bits.uint8[0];
70*df25739fSMilanka Ringwald        OI_UINT8 joint = jmask;
71*df25739fSMilanka Ringwald        OI_UINT sb;
72*df25739fSMilanka Ringwald        /*
73*df25739fSMilanka Ringwald         * Left channel
74*df25739fSMilanka Ringwald         */
75*df25739fSMilanka Ringwald        sb = NROF_SUBBANDS;
76*df25739fSMilanka Ringwald        do {
77*df25739fSMilanka Ringwald            OI_UINT32 raw;
78*df25739fSMilanka Ringwald            OI_INT32 dequant;
79*df25739fSMilanka Ringwald            OI_UINT8 bits = *bits_array++;
80*df25739fSMilanka Ringwald            OI_INT sf = *sf_array++;
81*df25739fSMilanka Ringwald
82*df25739fSMilanka Ringwald            OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
83*df25739fSMilanka Ringwald            dequant = OI_SBC_Dequant(raw, sf, bits);
84*df25739fSMilanka Ringwald            *s++ = dequant;
85*df25739fSMilanka Ringwald        } while (--sb);
86*df25739fSMilanka Ringwald        /*
87*df25739fSMilanka Ringwald         * Right channel
88*df25739fSMilanka Ringwald         */
89*df25739fSMilanka Ringwald        sb = NROF_SUBBANDS;
90*df25739fSMilanka Ringwald        do {
91*df25739fSMilanka Ringwald            OI_UINT32 raw;
92*df25739fSMilanka Ringwald            OI_INT32 dequant;
93*df25739fSMilanka Ringwald            OI_UINT8 bits = *bits_array++;
94*df25739fSMilanka Ringwald            OI_INT sf = *sf_array++;
95*df25739fSMilanka Ringwald
96*df25739fSMilanka Ringwald            OI_BITSTREAM_READUINT(raw, bits, ptr, value, bitPtr);
97*df25739fSMilanka Ringwald            dequant = OI_SBC_Dequant(raw, sf, bits);
98*df25739fSMilanka Ringwald            /*
99*df25739fSMilanka Ringwald             * Check if we need to do mid/side
100*df25739fSMilanka Ringwald             */
101*df25739fSMilanka Ringwald            if (joint & 0x80) {
102*df25739fSMilanka Ringwald                OI_INT32 mid = *(s - NROF_SUBBANDS);
103*df25739fSMilanka Ringwald                OI_INT32 side = dequant;
104*df25739fSMilanka Ringwald                *(s - NROF_SUBBANDS) = mid + side;
105*df25739fSMilanka Ringwald                dequant = mid - side;
106*df25739fSMilanka Ringwald            }
107*df25739fSMilanka Ringwald            joint <<= 1;
108*df25739fSMilanka Ringwald            *s++ = dequant;
109*df25739fSMilanka Ringwald        } while (--sb);
110*df25739fSMilanka Ringwald    } while (--bl);
111*df25739fSMilanka Ringwald}
112