1 /******************************************************************************
2  *
3  *  Copyright (C) 2014 The Android Open Source Project
4  *  Copyright 2006 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   $Revision: #1 $
22  ***********************************************************************************/
23 
24 /**
25 @file
26 This file exposes OINA-specific interfaces to decoder functions.
27 
28 @ingroup codec_internal
29 */
30 
31 /**
32 @addtogroup codec_internal
33 @{
34 */
35 
36 
37 #include <oi_codec_sbc_private.h>
38 
OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT * context,OI_BOOL enhanced,OI_UINT8 frequency,OI_UINT8 mode,OI_UINT8 subbands,OI_UINT8 blocks,OI_UINT8 alloc,OI_UINT8 maxBitpool)39 OI_STATUS OI_CODEC_SBC_DecoderConfigureRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
40                                            OI_BOOL enhanced,
41                                            OI_UINT8 frequency,
42                                            OI_UINT8 mode,
43                                            OI_UINT8 subbands,
44                                            OI_UINT8 blocks,
45                                            OI_UINT8 alloc,
46                                            OI_UINT8 maxBitpool)
47 {
48     if (frequency > SBC_FREQ_48000) {
49         return OI_STATUS_INVALID_PARAMETERS;
50     }
51 
52     if (enhanced) {
53 #ifdef SBC_ENHANCED
54         if (subbands != SBC_SUBBANDS_8) {
55             return OI_STATUS_INVALID_PARAMETERS;
56         }
57 #else
58         return OI_STATUS_INVALID_PARAMETERS;
59 #endif
60     }
61 
62     if (mode > SBC_JOINT_STEREO) {
63         return OI_STATUS_INVALID_PARAMETERS;
64     }
65 
66     if (subbands > SBC_SUBBANDS_8) {
67         return OI_STATUS_INVALID_PARAMETERS;
68     }
69 
70     if (blocks > SBC_BLOCKS_16) {
71         return OI_STATUS_INVALID_PARAMETERS;
72     }
73 
74     if (alloc > SBC_SNR) {
75         return OI_STATUS_INVALID_PARAMETERS;
76     }
77 
78 #ifdef SBC_ENHANCED
79     context->common.frameInfo.enhanced = enhanced;
80 #else
81     context->common.frameInfo.enhanced = FALSE;
82 #endif
83     context->common.frameInfo.freqIndex = frequency;
84     context->common.frameInfo.mode = mode;
85     context->common.frameInfo.subbands = subbands;
86     context->common.frameInfo.blocks = blocks;
87     context->common.frameInfo.alloc = alloc;
88     context->common.frameInfo.bitpool = maxBitpool;
89 
90     OI_SBC_ExpandFrameFields(&context->common.frameInfo);
91 
92     if (context->common.frameInfo.nrof_channels >= context->common.pcmStride) {
93         return OI_STATUS_INVALID_PARAMETERS;
94     }
95 
96     return OI_OK;
97 }
98 
99 
100 
OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT * context,OI_UINT8 bitpool,const OI_BYTE ** frameData,OI_UINT32 * frameBytes,OI_INT16 * pcmData,OI_UINT32 * pcmBytes)101 OI_STATUS OI_CODEC_SBC_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT *context,
102                                  OI_UINT8 bitpool,
103                                  const OI_BYTE **frameData,
104                                  OI_UINT32 *frameBytes,
105                                  OI_INT16 *pcmData,
106                                  OI_UINT32 *pcmBytes)
107 {
108     return internal_DecodeRaw(context,
109                               bitpool,
110                               frameData,
111                               frameBytes,
112                               pcmData,
113                               pcmBytes);
114 }
115 
OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT * context,OI_BOOL enhanced,OI_UINT8 subbands)116 OI_STATUS OI_CODEC_SBC_DecoderLimit(OI_CODEC_SBC_DECODER_CONTEXT *context,
117                                     OI_BOOL                       enhanced,
118                                     OI_UINT8                      subbands)
119 {
120 	if (enhanced)
121 	{
122 #ifdef SBC_ENHANCED
123         context->enhancedEnabled = TRUE;
124 #else
125         context->enhancedEnabled = FALSE;
126 #endif
127 	}
128 	else
129 	{
130         context->enhancedEnabled = FALSE;
131 	}
132     context->restrictSubbands = subbands;
133     context->limitFrameFormat = TRUE;
134     return OI_OK;
135 }
136 
137 
138 /**
139 @}
140 */
141