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#include <stdlib.h>
21ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#include <oi_codec_sbc_private.h>
22ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
23ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/**********************************************************************************
24ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta  $Revision: #1 $
25ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta***********************************************************************************/
26ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
27ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaPRIVATE OI_STATUS OI_CODEC_SBC_Alloc(OI_CODEC_SBC_COMMON_CONTEXT *common,
28ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                     OI_UINT32 *codecDataAligned,
29ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                     OI_UINT32 codecDataBytes,
30ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                     OI_UINT8 maxChannels,
31ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                     OI_UINT8 pcmStride)
32ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{
33ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    int i;
34ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    size_t filterBufferCount;
35ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    size_t subdataSize;
36ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_BYTE *codecData = (OI_BYTE*)codecDataAligned;
37ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
38ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    if (maxChannels < 1 || maxChannels > 2) {
39ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        return OI_STATUS_INVALID_PARAMETERS;
40ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
41ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
42ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    if (pcmStride < 1 || pcmStride > maxChannels) {
43ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        return OI_STATUS_INVALID_PARAMETERS;
44ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
45ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
46ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    common->maxChannels = maxChannels;
47ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    common->pcmStride = pcmStride;
48ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
49ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    /* Compute sizes needed for the memory regions, and bail if we don't have
50ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta     * enough memory for them. */
51ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    subdataSize = maxChannels * sizeof(common->subdata[0]) * SBC_MAX_BANDS * SBC_MAX_BLOCKS;
52ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    if (subdataSize > codecDataBytes) {
53ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        return OI_STATUS_OUT_OF_MEMORY;
54ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
55ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
56ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    filterBufferCount = (codecDataBytes - subdataSize) / (sizeof(common->filterBuffer[0][0]) * SBC_MAX_BANDS * maxChannels);
57ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    if (filterBufferCount < SBC_CODEC_MIN_FILTER_BUFFERS) {
58ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        return OI_STATUS_OUT_OF_MEMORY;
59ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
60ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    common->filterBufferLen = filterBufferCount * SBC_MAX_BANDS;
61ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
62ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    /* Allocate memory for the subband data */
63ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    common->subdata = (OI_INT32*)codecData;
64ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    codecData += subdataSize;
65ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    OI_ASSERT(codecDataBytes >= subdataSize);
66ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    codecDataBytes -= subdataSize;
67ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
68ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    /* Allocate memory for the synthesis buffers */
69ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    for (i = 0; i < maxChannels; ++i) {
70ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        size_t allocSize = common->filterBufferLen * sizeof(common->filterBuffer[0][0]);
71ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        common->filterBuffer[i] = (SBC_BUFFER_T*)codecData;
72ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        OI_ASSERT(codecDataBytes >= allocSize);
73ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        codecData += allocSize;
74ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        codecDataBytes -= allocSize;
75ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    }
76ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta
77ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    return OI_OK;
78ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}
79