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