1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker
21*15dc779aSAndroid Build Coastguard Worker #include <stddef.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdint.h>
23*15dc779aSAndroid Build Coastguard Worker #include <stdio.h>
24*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
25*15dc779aSAndroid Build Coastguard Worker #include <string.h>
26*15dc779aSAndroid Build Coastguard Worker
27*15dc779aSAndroid Build Coastguard Worker #include <vector>
28*15dc779aSAndroid Build Coastguard Worker
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_handler.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_apicmd_standards.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_config.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "impd_apicmd_standards.h"
37*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_config_params.h"
38*15dc779aSAndroid Build Coastguard Worker
39*15dc779aSAndroid Build Coastguard Worker /* 64*-0.25dB = -16 dB below full scale for mobile conf */
40*15dc779aSAndroid Build Coastguard Worker #define DRC_DEFAULT_MOBILE_REF_LEVEL 64
41*15dc779aSAndroid Build Coastguard Worker /* maximum compression of dynamic range for mobile conf */
42*15dc779aSAndroid Build Coastguard Worker #define DRC_DEFAULT_MOBILE_DRC_CUT 127
43*15dc779aSAndroid Build Coastguard Worker /* maximum compression of dynamic range for mobile conf */
44*15dc779aSAndroid Build Coastguard Worker #define DRC_DEFAULT_MOBILE_DRC_BOOST 127
45*15dc779aSAndroid Build Coastguard Worker /* switch for heavy compression for mobile conf */
46*15dc779aSAndroid Build Coastguard Worker #define DRC_DEFAULT_MOBILE_DRC_HEAVY 1
47*15dc779aSAndroid Build Coastguard Worker /* encoder target level; -1 => the value is unknown, otherwise dB \
48*15dc779aSAndroid Build Coastguard Worker step value (e.g. 64 for -16 dB) */
49*15dc779aSAndroid Build Coastguard Worker #define DRC_DEFAULT_MOBILE_ENC_LEVEL (-1)
50*15dc779aSAndroid Build Coastguard Worker
51*15dc779aSAndroid Build Coastguard Worker #define MAX_CHANNEL_COUNT 8
52*15dc779aSAndroid Build Coastguard Worker
53*15dc779aSAndroid Build Coastguard Worker #define MAX_MEM_ALLOCS 100
54*15dc779aSAndroid Build Coastguard Worker
55*15dc779aSAndroid Build Coastguard Worker #define IA_MAX_OUTPUT_PCM_SIZE (3)
56*15dc779aSAndroid Build Coastguard Worker #define IA_MAX_USAC_CH (2)
57*15dc779aSAndroid Build Coastguard Worker #define IA_MAX_OUT_SAMPLES_PER_FRAME (4096)
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker #define IA_DRC_DEC_IN_OUT_BUF_SIZE \
60*15dc779aSAndroid Build Coastguard Worker (IA_MAX_USAC_CH * IA_MAX_OUT_SAMPLES_PER_FRAME * IA_MAX_OUTPUT_PCM_SIZE)
61*15dc779aSAndroid Build Coastguard Worker
62*15dc779aSAndroid Build Coastguard Worker class Codec {
63*15dc779aSAndroid Build Coastguard Worker public:
64*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE initDecoder(const uint8_t* data, size_t size, bool isADTS);
65*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE initXAACDecoder(bool isADTS);
66*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE initXAACDrc(const uint8_t* data, size_t size);
67*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE deInitXAACDecoder();
68*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE deInitMPEGDDDrc();
69*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE configXAACDecoder(uint8_t* inBuffer, uint32_t inBufferLength,
70*15dc779aSAndroid Build Coastguard Worker int32_t* bytesConsumed);
71*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE initMPEGDDDrc();
72*15dc779aSAndroid Build Coastguard Worker int configMPEGDDrc();
73*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE decodeXAACStream(uint8_t* inBuffer, uint32_t inBufferLength,
74*15dc779aSAndroid Build Coastguard Worker int32_t* bytesConsumed, int32_t* outBytes);
75*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE getXAACStreamInfo();
76*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE setXAACDRCInfo(int32_t drcCut, int32_t drcBoost,
77*15dc779aSAndroid Build Coastguard Worker int32_t drcRefLevel, int32_t drcHeavyCompression,
78*15dc779aSAndroid Build Coastguard Worker int32_t drEffectType);
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker private:
81*15dc779aSAndroid Build Coastguard Worker void* mXheaacCodecHandle;
82*15dc779aSAndroid Build Coastguard Worker void* mMpegDDrcHandle;
83*15dc779aSAndroid Build Coastguard Worker uint32_t mInputBufferSize;
84*15dc779aSAndroid Build Coastguard Worker uint32_t mOutputFrameLength;
85*15dc779aSAndroid Build Coastguard Worker int8_t* mInputBuffer;
86*15dc779aSAndroid Build Coastguard Worker int8_t* mOutputBuffer;
87*15dc779aSAndroid Build Coastguard Worker int32_t mSampFreq;
88*15dc779aSAndroid Build Coastguard Worker int32_t mNumChannels;
89*15dc779aSAndroid Build Coastguard Worker int32_t mPcmWdSz;
90*15dc779aSAndroid Build Coastguard Worker int32_t mChannelMask;
91*15dc779aSAndroid Build Coastguard Worker bool mIsCodecInitialized;
92*15dc779aSAndroid Build Coastguard Worker bool mIsCodecConfigFlushRequired;
93*15dc779aSAndroid Build Coastguard Worker int8_t* mDrcInBuf;
94*15dc779aSAndroid Build Coastguard Worker int8_t* mDrcOutBuf;
95*15dc779aSAndroid Build Coastguard Worker int32_t mMpegDDRCPresent;
96*15dc779aSAndroid Build Coastguard Worker int32_t mDRCFlag;
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker std::vector<void*> mMemoryVec;
99*15dc779aSAndroid Build Coastguard Worker std::vector<void*> mDrcMemoryVec;
100*15dc779aSAndroid Build Coastguard Worker };
101*15dc779aSAndroid Build Coastguard Worker
102*15dc779aSAndroid Build Coastguard Worker extern "C" IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_module_obj, WORD32 i_cmd,
103*15dc779aSAndroid Build Coastguard Worker WORD32 i_idx, pVOID pv_value);
104*15dc779aSAndroid Build Coastguard Worker extern "C" IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_module_obj, WORD32 i_cmd,
105*15dc779aSAndroid Build Coastguard Worker WORD32 i_idx, pVOID pv_value);
106*15dc779aSAndroid Build Coastguard Worker extern "C" IA_ERRORCODE ixheaacd_get_config_param(pVOID p_ia_process_api_obj,
107*15dc779aSAndroid Build Coastguard Worker pWORD32 pi_samp_freq,
108*15dc779aSAndroid Build Coastguard Worker pWORD32 pi_num_chan,
109*15dc779aSAndroid Build Coastguard Worker pWORD32 pi_pcm_wd_sz,
110*15dc779aSAndroid Build Coastguard Worker pWORD32 pi_channel_mask);
111*15dc779aSAndroid Build Coastguard Worker
initXAACDecoder(bool isADTS)112*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::initXAACDecoder(bool isADTS) {
113*15dc779aSAndroid Build Coastguard Worker /* First part */
114*15dc779aSAndroid Build Coastguard Worker /* Error Handler Init */
115*15dc779aSAndroid Build Coastguard Worker /* Get Library Name, Library Version and API Version */
116*15dc779aSAndroid Build Coastguard Worker /* Initialize API structure + Default config set */
117*15dc779aSAndroid Build Coastguard Worker /* Set config params from user */
118*15dc779aSAndroid Build Coastguard Worker /* Initialize memory tables */
119*15dc779aSAndroid Build Coastguard Worker /* Get memory information and allocate memory */
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker mInputBufferSize = 0;
122*15dc779aSAndroid Build Coastguard Worker mInputBuffer = nullptr;
123*15dc779aSAndroid Build Coastguard Worker mOutputBuffer = nullptr;
124*15dc779aSAndroid Build Coastguard Worker /* Process struct initing end */
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
127*15dc779aSAndroid Build Coastguard Worker /* Initialize API structure and set config params to default */
128*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
129*15dc779aSAndroid Build Coastguard Worker /* API size */
130*15dc779aSAndroid Build Coastguard Worker uint32_t pui_api_size;
131*15dc779aSAndroid Build Coastguard Worker /* Get the API size */
132*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code =
133*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(nullptr, IA_API_CMD_GET_API_SIZE, 0, &pui_api_size);
134*15dc779aSAndroid Build Coastguard Worker
135*15dc779aSAndroid Build Coastguard Worker /* Allocate memory for API */
136*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle = malloc(pui_api_size);
137*15dc779aSAndroid Build Coastguard Worker if (!mXheaacCodecHandle) {
138*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
139*15dc779aSAndroid Build Coastguard Worker }
140*15dc779aSAndroid Build Coastguard Worker mMemoryVec.push_back(mXheaacCodecHandle);
141*15dc779aSAndroid Build Coastguard Worker
142*15dc779aSAndroid Build Coastguard Worker /* Set the config params to default values */
143*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_INIT,
144*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS, nullptr);
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker /* Get the API size */
147*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(nullptr, IA_API_CMD_GET_API_SIZE, 0, &pui_api_size);
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker /* Allocate memory for API */
150*15dc779aSAndroid Build Coastguard Worker mMpegDDrcHandle = malloc(pui_api_size);
151*15dc779aSAndroid Build Coastguard Worker if (!mMpegDDrcHandle) {
152*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker mMemoryVec.push_back(mMpegDDrcHandle);
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker /* Set the config params to default values */
157*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
158*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS, nullptr);
159*15dc779aSAndroid Build Coastguard Worker
160*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
161*15dc779aSAndroid Build Coastguard Worker /* Set config parameters */
162*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
163*15dc779aSAndroid Build Coastguard Worker uint32_t ui_mp4_flag = isADTS ? 0 : 1;
164*15dc779aSAndroid Build Coastguard Worker err_code =
165*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
166*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISMP4, &ui_mp4_flag);
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
169*15dc779aSAndroid Build Coastguard Worker /* Initialize Memory info tables */
170*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
171*15dc779aSAndroid Build Coastguard Worker uint32_t ui_proc_mem_tabs_size;
172*15dc779aSAndroid Build Coastguard Worker pVOID pv_alloc_ptr;
173*15dc779aSAndroid Build Coastguard Worker /* Get memory info tables size */
174*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_MEMTABS_SIZE,
175*15dc779aSAndroid Build Coastguard Worker 0, &ui_proc_mem_tabs_size);
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr = malloc(ui_proc_mem_tabs_size);
178*15dc779aSAndroid Build Coastguard Worker if (!pv_alloc_ptr) {
179*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker mMemoryVec.push_back(pv_alloc_ptr);
182*15dc779aSAndroid Build Coastguard Worker
183*15dc779aSAndroid Build Coastguard Worker /* Set pointer for process memory tables */
184*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_MEMTABS_PTR, 0,
185*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr);
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker /* initialize the API, post config, fill memory tables */
188*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_INIT,
189*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS, nullptr);
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
192*15dc779aSAndroid Build Coastguard Worker /* Allocate Memory with info from library */
193*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
194*15dc779aSAndroid Build Coastguard Worker /* There are four different types of memories, that needs to be allocated */
195*15dc779aSAndroid Build Coastguard Worker /* persistent,scratch,input and output */
196*15dc779aSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++) {
197*15dc779aSAndroid Build Coastguard Worker int ui_size = 0, ui_alignment = 0, ui_type = 0;
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker /* Get memory size */
200*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle,
201*15dc779aSAndroid Build Coastguard Worker IA_API_CMD_GET_MEM_INFO_SIZE, i, &ui_size);
202*15dc779aSAndroid Build Coastguard Worker
203*15dc779aSAndroid Build Coastguard Worker /* Get memory alignment */
204*15dc779aSAndroid Build Coastguard Worker err_code =
205*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_MEM_INFO_ALIGNMENT,
206*15dc779aSAndroid Build Coastguard Worker i, &ui_alignment);
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker /* Get memory type */
209*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle,
210*15dc779aSAndroid Build Coastguard Worker IA_API_CMD_GET_MEM_INFO_TYPE, i, &ui_type);
211*15dc779aSAndroid Build Coastguard Worker
212*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr = NULL;
213*15dc779aSAndroid Build Coastguard Worker ui_alignment = (ui_alignment + sizeof(void *) - 1) / sizeof(void *);
214*15dc779aSAndroid Build Coastguard Worker ui_alignment = ui_alignment * sizeof(void *);
215*15dc779aSAndroid Build Coastguard Worker if (0 != posix_memalign(&pv_alloc_ptr, ui_alignment, ui_size)) {
216*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
217*15dc779aSAndroid Build Coastguard Worker }
218*15dc779aSAndroid Build Coastguard Worker if (!pv_alloc_ptr) {
219*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker mMemoryVec.push_back(pv_alloc_ptr);
222*15dc779aSAndroid Build Coastguard Worker
223*15dc779aSAndroid Build Coastguard Worker /* Set the buffer pointer */
224*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_MEM_PTR, i,
225*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr);
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker if (ui_type == IA_MEMTYPE_INPUT) {
228*15dc779aSAndroid Build Coastguard Worker mInputBuffer = (pWORD8)pv_alloc_ptr;
229*15dc779aSAndroid Build Coastguard Worker mInputBufferSize = ui_size;
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker if (ui_type == IA_MEMTYPE_OUTPUT) mOutputBuffer = (pWORD8)pv_alloc_ptr;
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker /* End first part */
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
236*15dc779aSAndroid Build Coastguard Worker }
237*15dc779aSAndroid Build Coastguard Worker enum {
238*15dc779aSAndroid Build Coastguard Worker DRC_TARGET_LEVEL_OFFSET = 6,
239*15dc779aSAndroid Build Coastguard Worker DRC_ATTENUATION_OFFSET,
240*15dc779aSAndroid Build Coastguard Worker DRC_BOOST_OFFSET,
241*15dc779aSAndroid Build Coastguard Worker DRC_COMPRESS_OFFSET,
242*15dc779aSAndroid Build Coastguard Worker DRC_EFFECT_OFFSET
243*15dc779aSAndroid Build Coastguard Worker };
244*15dc779aSAndroid Build Coastguard Worker
initXAACDrc(const uint8_t * data,size_t size)245*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::initXAACDrc(const uint8_t* data, size_t size) {
246*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
247*15dc779aSAndroid Build Coastguard Worker unsigned int ui_drc_val;
248*15dc779aSAndroid Build Coastguard Worker // DRC_PRES_MODE_WRAP_DESIRED_TARGET
249*15dc779aSAndroid Build Coastguard Worker size_t targetLevelOffset =
250*15dc779aSAndroid Build Coastguard Worker std::min((size_t)DRC_TARGET_LEVEL_OFFSET, size - 1);
251*15dc779aSAndroid Build Coastguard Worker int32_t targetRefLevel = data[targetLevelOffset];
252*15dc779aSAndroid Build Coastguard Worker
253*15dc779aSAndroid Build Coastguard Worker ui_drc_val = (unsigned int)targetRefLevel;
254*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
255*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL,
256*15dc779aSAndroid Build Coastguard Worker &ui_drc_val);
257*15dc779aSAndroid Build Coastguard Worker
258*15dc779aSAndroid Build Coastguard Worker /* Use ui_drc_val from PROP_DRC_OVERRIDE_REF_LEVEL or
259*15dc779aSAndroid Build Coastguard Worker * DRC_DEFAULT_MOBILE_REF_LEVEL
260*15dc779aSAndroid Build Coastguard Worker * for IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS too */
261*15dc779aSAndroid Build Coastguard Worker err_code =
262*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
263*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS, &ui_drc_val);
264*15dc779aSAndroid Build Coastguard Worker
265*15dc779aSAndroid Build Coastguard Worker size_t attenuationOffset = std::min((size_t)DRC_ATTENUATION_OFFSET, size - 1);
266*15dc779aSAndroid Build Coastguard Worker int32_t attenuationFactor = data[attenuationOffset];
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker ui_drc_val = (unsigned int)attenuationFactor;
269*15dc779aSAndroid Build Coastguard Worker err_code =
270*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
271*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT, &ui_drc_val);
272*15dc779aSAndroid Build Coastguard Worker
273*15dc779aSAndroid Build Coastguard Worker // DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR
274*15dc779aSAndroid Build Coastguard Worker size_t boostOffset = std::min((size_t)DRC_BOOST_OFFSET, size - 1);
275*15dc779aSAndroid Build Coastguard Worker int32_t boostFactor = data[boostOffset];
276*15dc779aSAndroid Build Coastguard Worker
277*15dc779aSAndroid Build Coastguard Worker ui_drc_val = (unsigned int)boostFactor;
278*15dc779aSAndroid Build Coastguard Worker err_code =
279*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
280*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST, &ui_drc_val);
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker // DRC_PRES_MODE_WRAP_DESIRED_HEAVY
283*15dc779aSAndroid Build Coastguard Worker size_t compressOffset = std::min((size_t)DRC_COMPRESS_OFFSET, size - 1);
284*15dc779aSAndroid Build Coastguard Worker int32_t compressMode = data[compressOffset];
285*15dc779aSAndroid Build Coastguard Worker ui_drc_val = (unsigned int)compressMode;
286*15dc779aSAndroid Build Coastguard Worker
287*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
288*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP,
289*15dc779aSAndroid Build Coastguard Worker &ui_drc_val);
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker // AAC_UNIDRC_SET_EFFECT
292*15dc779aSAndroid Build Coastguard Worker size_t effectOffset = std::min((size_t)DRC_EFFECT_OFFSET, size - 1);
293*15dc779aSAndroid Build Coastguard Worker int32_t effectType = data[effectOffset];
294*15dc779aSAndroid Build Coastguard Worker ui_drc_val = (unsigned int)effectType;
295*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
296*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE, &ui_drc_val);
297*15dc779aSAndroid Build Coastguard Worker
298*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
299*15dc779aSAndroid Build Coastguard Worker }
300*15dc779aSAndroid Build Coastguard Worker
deInitXAACDecoder()301*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::deInitXAACDecoder() {
302*15dc779aSAndroid Build Coastguard Worker /* Error code */
303*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
304*15dc779aSAndroid Build Coastguard Worker
305*15dc779aSAndroid Build Coastguard Worker if (mXheaacCodecHandle) {
306*15dc779aSAndroid Build Coastguard Worker /* Tell that the input is over in this buffer */
307*15dc779aSAndroid Build Coastguard Worker err_code =
308*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_INPUT_OVER, 0, nullptr);
309*15dc779aSAndroid Build Coastguard Worker }
310*15dc779aSAndroid Build Coastguard Worker
311*15dc779aSAndroid Build Coastguard Worker /* Irrespective of error returned in IA_API_CMD_INPUT_OVER, free allocated
312*15dc779aSAndroid Build Coastguard Worker * memory */
313*15dc779aSAndroid Build Coastguard Worker for (void* buf : mMemoryVec) {
314*15dc779aSAndroid Build Coastguard Worker if (buf) free(buf);
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker mMemoryVec.clear();
317*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle = nullptr;
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker return err_code;
320*15dc779aSAndroid Build Coastguard Worker }
321*15dc779aSAndroid Build Coastguard Worker
deInitMPEGDDDrc()322*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::deInitMPEGDDDrc() {
323*15dc779aSAndroid Build Coastguard Worker for (void* buf : mDrcMemoryVec) {
324*15dc779aSAndroid Build Coastguard Worker if (buf) free(buf);
325*15dc779aSAndroid Build Coastguard Worker }
326*15dc779aSAndroid Build Coastguard Worker mDrcMemoryVec.clear();
327*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
328*15dc779aSAndroid Build Coastguard Worker }
329*15dc779aSAndroid Build Coastguard Worker
configXAACDecoder(uint8_t * inBuffer,uint32_t inBufferLength,int32_t * bytesConsumed)330*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::configXAACDecoder(uint8_t* inBuffer,
331*15dc779aSAndroid Build Coastguard Worker uint32_t inBufferLength,
332*15dc779aSAndroid Build Coastguard Worker int32_t* bytesConsumed) {
333*15dc779aSAndroid Build Coastguard Worker if (mInputBufferSize < inBufferLength) {
334*15dc779aSAndroid Build Coastguard Worker inBufferLength = mInputBufferSize;
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker /* Copy the buffer passed by Android plugin to codec input buffer */
337*15dc779aSAndroid Build Coastguard Worker memcpy(mInputBuffer, inBuffer, inBufferLength);
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker /* Set number of bytes to be processed */
340*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = ixheaacd_dec_api(
341*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle, IA_API_CMD_SET_INPUT_BYTES, 0, &inBufferLength);
342*15dc779aSAndroid Build Coastguard Worker
343*15dc779aSAndroid Build Coastguard Worker if (mIsCodecConfigFlushRequired) {
344*15dc779aSAndroid Build Coastguard Worker /* If codec is already initialized, then GA header is passed again */
345*15dc779aSAndroid Build Coastguard Worker /* Need to call the Flush API instead of INIT_PROCESS */
346*15dc779aSAndroid Build Coastguard Worker mIsCodecInitialized =
347*15dc779aSAndroid Build Coastguard Worker false; /* Codec needs to be Reinitialized after flush */
348*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_INIT,
349*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_GA_HDR, nullptr);
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker } else {
352*15dc779aSAndroid Build Coastguard Worker /* Initialize the process */
353*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_INIT,
354*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_PROCESS, nullptr);
355*15dc779aSAndroid Build Coastguard Worker }
356*15dc779aSAndroid Build Coastguard Worker
357*15dc779aSAndroid Build Coastguard Worker uint32_t ui_init_done;
358*15dc779aSAndroid Build Coastguard Worker /* Checking for end of initialization */
359*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_INIT,
360*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_DONE_QUERY, &ui_init_done);
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker /* How much buffer is used in input buffers */
363*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(
364*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle, IA_API_CMD_GET_CURIDX_INPUT_BUF, 0, bytesConsumed);
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker if (ui_init_done) {
367*15dc779aSAndroid Build Coastguard Worker err_code = getXAACStreamInfo();
368*15dc779aSAndroid Build Coastguard Worker
369*15dc779aSAndroid Build Coastguard Worker mIsCodecInitialized = true;
370*15dc779aSAndroid Build Coastguard Worker
371*15dc779aSAndroid Build Coastguard Worker err_code = configMPEGDDrc();
372*15dc779aSAndroid Build Coastguard Worker }
373*15dc779aSAndroid Build Coastguard Worker
374*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
375*15dc779aSAndroid Build Coastguard Worker }
initMPEGDDDrc()376*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::initMPEGDDDrc() {
377*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
378*15dc779aSAndroid Build Coastguard Worker
379*15dc779aSAndroid Build Coastguard Worker for (int i = 0; i < (WORD32)2; i++) {
380*15dc779aSAndroid Build Coastguard Worker WORD32 ui_size, ui_alignment, ui_type;
381*15dc779aSAndroid Build Coastguard Worker pVOID pv_alloc_ptr;
382*15dc779aSAndroid Build Coastguard Worker
383*15dc779aSAndroid Build Coastguard Worker /* Get memory size */
384*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_MEM_INFO_SIZE, i,
385*15dc779aSAndroid Build Coastguard Worker &ui_size);
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker /* Get memory alignment */
388*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(
389*15dc779aSAndroid Build Coastguard Worker mMpegDDrcHandle, IA_API_CMD_GET_MEM_INFO_ALIGNMENT, i, &ui_alignment);
390*15dc779aSAndroid Build Coastguard Worker
391*15dc779aSAndroid Build Coastguard Worker /* Get memory type */
392*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_MEM_INFO_TYPE, i,
393*15dc779aSAndroid Build Coastguard Worker &ui_type);
394*15dc779aSAndroid Build Coastguard Worker
395*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr = malloc(ui_size);
396*15dc779aSAndroid Build Coastguard Worker if (pv_alloc_ptr == nullptr) {
397*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
398*15dc779aSAndroid Build Coastguard Worker }
399*15dc779aSAndroid Build Coastguard Worker mDrcMemoryVec.push_back(pv_alloc_ptr);
400*15dc779aSAndroid Build Coastguard Worker
401*15dc779aSAndroid Build Coastguard Worker /* Set the buffer pointer */
402*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_MEM_PTR, i,
403*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr);
404*15dc779aSAndroid Build Coastguard Worker }
405*15dc779aSAndroid Build Coastguard Worker
406*15dc779aSAndroid Build Coastguard Worker mDrcInBuf = (int8_t*)malloc(IA_DRC_DEC_IN_OUT_BUF_SIZE);
407*15dc779aSAndroid Build Coastguard Worker if (mDrcInBuf == nullptr) {
408*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
409*15dc779aSAndroid Build Coastguard Worker }
410*15dc779aSAndroid Build Coastguard Worker mDrcMemoryVec.push_back(mDrcInBuf);
411*15dc779aSAndroid Build Coastguard Worker
412*15dc779aSAndroid Build Coastguard Worker err_code =
413*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_MEM_PTR, 2, mDrcInBuf);
414*15dc779aSAndroid Build Coastguard Worker
415*15dc779aSAndroid Build Coastguard Worker mDrcOutBuf = (int8_t*)malloc(IA_DRC_DEC_IN_OUT_BUF_SIZE);
416*15dc779aSAndroid Build Coastguard Worker if (mDrcOutBuf == nullptr) {
417*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
418*15dc779aSAndroid Build Coastguard Worker }
419*15dc779aSAndroid Build Coastguard Worker mDrcMemoryVec.push_back(mDrcOutBuf);
420*15dc779aSAndroid Build Coastguard Worker
421*15dc779aSAndroid Build Coastguard Worker err_code =
422*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_MEM_PTR, 3, mDrcOutBuf);
423*15dc779aSAndroid Build Coastguard Worker
424*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
425*15dc779aSAndroid Build Coastguard Worker }
configMPEGDDrc()426*15dc779aSAndroid Build Coastguard Worker int Codec::configMPEGDDrc() {
427*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
428*15dc779aSAndroid Build Coastguard Worker int i_effect_type;
429*15dc779aSAndroid Build Coastguard Worker int i_loud_norm;
430*15dc779aSAndroid Build Coastguard Worker int i_target_loudness;
431*15dc779aSAndroid Build Coastguard Worker unsigned int i_sbr_mode;
432*15dc779aSAndroid Build Coastguard Worker uint32_t ui_proc_mem_tabs_size = 0;
433*15dc779aSAndroid Build Coastguard Worker pVOID pv_alloc_ptr = NULL;
434*15dc779aSAndroid Build Coastguard Worker
435*15dc779aSAndroid Build Coastguard Worker /* Sampling Frequency */
436*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
437*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ, &mSampFreq);
438*15dc779aSAndroid Build Coastguard Worker
439*15dc779aSAndroid Build Coastguard Worker /* Total Number of Channels */
440*15dc779aSAndroid Build Coastguard Worker err_code =
441*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
442*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS, &mNumChannels);
443*15dc779aSAndroid Build Coastguard Worker
444*15dc779aSAndroid Build Coastguard Worker /* PCM word size */
445*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
446*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ, &mPcmWdSz);
447*15dc779aSAndroid Build Coastguard Worker
448*15dc779aSAndroid Build Coastguard Worker /*Set Effect Type*/
449*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
450*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE,
451*15dc779aSAndroid Build Coastguard Worker &i_effect_type);
452*15dc779aSAndroid Build Coastguard Worker
453*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
454*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE, &i_effect_type);
455*15dc779aSAndroid Build Coastguard Worker
456*15dc779aSAndroid Build Coastguard Worker /*Set target loudness */
457*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(
458*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
459*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS, &i_target_loudness);
460*15dc779aSAndroid Build Coastguard Worker
461*15dc779aSAndroid Build Coastguard Worker err_code =
462*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
463*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS, &i_target_loudness);
464*15dc779aSAndroid Build Coastguard Worker
465*15dc779aSAndroid Build Coastguard Worker /*Set loud_norm_flag*/
466*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
467*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM,
468*15dc779aSAndroid Build Coastguard Worker &i_loud_norm);
469*15dc779aSAndroid Build Coastguard Worker
470*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
471*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_DRC_LOUD_NORM, &i_loud_norm);
472*15dc779aSAndroid Build Coastguard Worker
473*15dc779aSAndroid Build Coastguard Worker err_code =
474*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
475*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE, &i_sbr_mode);
476*15dc779aSAndroid Build Coastguard Worker
477*15dc779aSAndroid Build Coastguard Worker /* Get memory info tables size */
478*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_MEMTABS_SIZE, 0,
479*15dc779aSAndroid Build Coastguard Worker &ui_proc_mem_tabs_size);
480*15dc779aSAndroid Build Coastguard Worker
481*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr = malloc(ui_proc_mem_tabs_size);
482*15dc779aSAndroid Build Coastguard Worker if (pv_alloc_ptr == NULL) {
483*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
484*15dc779aSAndroid Build Coastguard Worker }
485*15dc779aSAndroid Build Coastguard Worker memset(pv_alloc_ptr, 0, ui_proc_mem_tabs_size);
486*15dc779aSAndroid Build Coastguard Worker mMemoryVec.push_back(pv_alloc_ptr);
487*15dc779aSAndroid Build Coastguard Worker
488*15dc779aSAndroid Build Coastguard Worker /* Set pointer for process memory tables */
489*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_MEMTABS_PTR, 0,
490*15dc779aSAndroid Build Coastguard Worker pv_alloc_ptr);
491*15dc779aSAndroid Build Coastguard Worker
492*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
493*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS, nullptr);
494*15dc779aSAndroid Build Coastguard Worker
495*15dc779aSAndroid Build Coastguard Worker /* Free any memory that is allocated for MPEG D Drc so far */
496*15dc779aSAndroid Build Coastguard Worker deInitMPEGDDDrc();
497*15dc779aSAndroid Build Coastguard Worker
498*15dc779aSAndroid Build Coastguard Worker err_code = initMPEGDDDrc();
499*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
500*15dc779aSAndroid Build Coastguard Worker deInitMPEGDDDrc();
501*15dc779aSAndroid Build Coastguard Worker return err_code;
502*15dc779aSAndroid Build Coastguard Worker }
503*15dc779aSAndroid Build Coastguard Worker
504*15dc779aSAndroid Build Coastguard Worker /* DRC buffers
505*15dc779aSAndroid Build Coastguard Worker buf[0] - contains extension element pay load loudness related
506*15dc779aSAndroid Build Coastguard Worker buf[1] - contains extension element pay load*/
507*15dc779aSAndroid Build Coastguard Worker {
508*15dc779aSAndroid Build Coastguard Worker VOID* p_array[2][16];
509*15dc779aSAndroid Build Coastguard Worker WORD32 ii;
510*15dc779aSAndroid Build Coastguard Worker WORD32 buf_sizes[2][16];
511*15dc779aSAndroid Build Coastguard Worker WORD32 num_elements;
512*15dc779aSAndroid Build Coastguard Worker WORD32 num_config_ext;
513*15dc779aSAndroid Build Coastguard Worker WORD32 bit_str_fmt = 1;
514*15dc779aSAndroid Build Coastguard Worker
515*15dc779aSAndroid Build Coastguard Worker WORD32 uo_num_chan;
516*15dc779aSAndroid Build Coastguard Worker
517*15dc779aSAndroid Build Coastguard Worker memset(buf_sizes, 0, 32 * sizeof(WORD32));
518*15dc779aSAndroid Build Coastguard Worker
519*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
520*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_BUF_SIZES,
521*15dc779aSAndroid Build Coastguard Worker &buf_sizes[0][0]);
522*15dc779aSAndroid Build Coastguard Worker
523*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
524*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR, &p_array);
525*15dc779aSAndroid Build Coastguard Worker
526*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
527*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_SET_BUFF_PTR, nullptr);
528*15dc779aSAndroid Build Coastguard Worker
529*15dc779aSAndroid Build Coastguard Worker err_code =
530*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
531*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE, &num_elements);
532*15dc779aSAndroid Build Coastguard Worker
533*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
534*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_NUM_CONFIG_EXT,
535*15dc779aSAndroid Build Coastguard Worker &num_config_ext);
536*15dc779aSAndroid Build Coastguard Worker
537*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < num_config_ext; ii++) {
538*15dc779aSAndroid Build Coastguard Worker /*copy loudness bitstream*/
539*15dc779aSAndroid Build Coastguard Worker if (buf_sizes[0][ii] > 0) {
540*15dc779aSAndroid Build Coastguard Worker memcpy(mDrcInBuf, p_array[0][ii], buf_sizes[0][ii]);
541*15dc779aSAndroid Build Coastguard Worker
542*15dc779aSAndroid Build Coastguard Worker /*Set bitstream_split_format */
543*15dc779aSAndroid Build Coastguard Worker err_code =
544*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
545*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
546*15dc779aSAndroid Build Coastguard Worker
547*15dc779aSAndroid Build Coastguard Worker /* Set number of bytes to be processed */
548*15dc779aSAndroid Build Coastguard Worker err_code =
549*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES_IL_BS, 0,
550*15dc779aSAndroid Build Coastguard Worker &buf_sizes[0][ii]);
551*15dc779aSAndroid Build Coastguard Worker
552*15dc779aSAndroid Build Coastguard Worker /* Execute process */
553*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
554*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF, nullptr);
555*15dc779aSAndroid Build Coastguard Worker
556*15dc779aSAndroid Build Coastguard Worker mDRCFlag = 1;
557*15dc779aSAndroid Build Coastguard Worker }
558*15dc779aSAndroid Build Coastguard Worker }
559*15dc779aSAndroid Build Coastguard Worker
560*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < num_elements; ii++) {
561*15dc779aSAndroid Build Coastguard Worker /*copy config bitstream*/
562*15dc779aSAndroid Build Coastguard Worker if (buf_sizes[1][ii] > 0) {
563*15dc779aSAndroid Build Coastguard Worker memcpy(mDrcInBuf, p_array[1][ii], buf_sizes[1][ii]);
564*15dc779aSAndroid Build Coastguard Worker /* Set number of bytes to be processed */
565*15dc779aSAndroid Build Coastguard Worker
566*15dc779aSAndroid Build Coastguard Worker /*Set bitstream_split_format */
567*15dc779aSAndroid Build Coastguard Worker err_code =
568*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
569*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
570*15dc779aSAndroid Build Coastguard Worker
571*15dc779aSAndroid Build Coastguard Worker err_code =
572*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES_IC_BS, 0,
573*15dc779aSAndroid Build Coastguard Worker &buf_sizes[1][ii]);
574*15dc779aSAndroid Build Coastguard Worker
575*15dc779aSAndroid Build Coastguard Worker /* Execute process */
576*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
577*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF, nullptr);
578*15dc779aSAndroid Build Coastguard Worker
579*15dc779aSAndroid Build Coastguard Worker mDRCFlag = 1;
580*15dc779aSAndroid Build Coastguard Worker }
581*15dc779aSAndroid Build Coastguard Worker }
582*15dc779aSAndroid Build Coastguard Worker
583*15dc779aSAndroid Build Coastguard Worker if (mDRCFlag == 1) {
584*15dc779aSAndroid Build Coastguard Worker mMpegDDRCPresent = 1;
585*15dc779aSAndroid Build Coastguard Worker } else {
586*15dc779aSAndroid Build Coastguard Worker mMpegDDRCPresent = 0;
587*15dc779aSAndroid Build Coastguard Worker }
588*15dc779aSAndroid Build Coastguard Worker
589*15dc779aSAndroid Build Coastguard Worker /*Read interface buffer config file bitstream*/
590*15dc779aSAndroid Build Coastguard Worker if (mMpegDDRCPresent == 1) {
591*15dc779aSAndroid Build Coastguard Worker WORD32 interface_is_present = 1;
592*15dc779aSAndroid Build Coastguard Worker
593*15dc779aSAndroid Build Coastguard Worker if (i_sbr_mode != 0) {
594*15dc779aSAndroid Build Coastguard Worker if (i_sbr_mode == 1) {
595*15dc779aSAndroid Build Coastguard Worker mOutputFrameLength = 2048;
596*15dc779aSAndroid Build Coastguard Worker } else if (i_sbr_mode == 3) {
597*15dc779aSAndroid Build Coastguard Worker mOutputFrameLength = 4096;
598*15dc779aSAndroid Build Coastguard Worker } else {
599*15dc779aSAndroid Build Coastguard Worker mOutputFrameLength = 1024;
600*15dc779aSAndroid Build Coastguard Worker }
601*15dc779aSAndroid Build Coastguard Worker } else {
602*15dc779aSAndroid Build Coastguard Worker mOutputFrameLength = 4096;
603*15dc779aSAndroid Build Coastguard Worker }
604*15dc779aSAndroid Build Coastguard Worker
605*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
606*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE,
607*15dc779aSAndroid Build Coastguard Worker (WORD32*)&mOutputFrameLength);
608*15dc779aSAndroid Build Coastguard Worker
609*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
610*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT,
611*15dc779aSAndroid Build Coastguard Worker &interface_is_present);
612*15dc779aSAndroid Build Coastguard Worker
613*15dc779aSAndroid Build Coastguard Worker /* Execute process */
614*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
615*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF, nullptr);
616*15dc779aSAndroid Build Coastguard Worker
617*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
618*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_PROCESS, nullptr);
619*15dc779aSAndroid Build Coastguard Worker
620*15dc779aSAndroid Build Coastguard Worker err_code =
621*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_GET_CONFIG_PARAM,
622*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS, &uo_num_chan);
623*15dc779aSAndroid Build Coastguard Worker }
624*15dc779aSAndroid Build Coastguard Worker }
625*15dc779aSAndroid Build Coastguard Worker
626*15dc779aSAndroid Build Coastguard Worker return err_code;
627*15dc779aSAndroid Build Coastguard Worker }
initDecoder(const uint8_t * data,size_t size,bool isADTS)628*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::initDecoder(const uint8_t* data, size_t size, bool isADTS) {
629*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
630*15dc779aSAndroid Build Coastguard Worker
631*15dc779aSAndroid Build Coastguard Worker err_code = initXAACDecoder(isADTS);
632*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
633*15dc779aSAndroid Build Coastguard Worker /* Call deInit to free any allocated memory */
634*15dc779aSAndroid Build Coastguard Worker deInitXAACDecoder();
635*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
636*15dc779aSAndroid Build Coastguard Worker }
637*15dc779aSAndroid Build Coastguard Worker
638*15dc779aSAndroid Build Coastguard Worker err_code = initXAACDrc(data, size);
639*15dc779aSAndroid Build Coastguard Worker
640*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
641*15dc779aSAndroid Build Coastguard Worker }
decodeXAACStream(uint8_t * inBuffer,uint32_t inBufferLength,int32_t * bytesConsumed,int32_t * outBytes)642*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::decodeXAACStream(uint8_t* inBuffer, uint32_t inBufferLength,
643*15dc779aSAndroid Build Coastguard Worker int32_t* bytesConsumed,
644*15dc779aSAndroid Build Coastguard Worker int32_t* outBytes) {
645*15dc779aSAndroid Build Coastguard Worker if (mInputBufferSize < inBufferLength) {
646*15dc779aSAndroid Build Coastguard Worker inBufferLength = mInputBufferSize;
647*15dc779aSAndroid Build Coastguard Worker }
648*15dc779aSAndroid Build Coastguard Worker /* If codec is not initialized, call configXAACDecoder decoder again */
649*15dc779aSAndroid Build Coastguard Worker if (!mIsCodecInitialized) {
650*15dc779aSAndroid Build Coastguard Worker configXAACDecoder(inBuffer, inBufferLength, bytesConsumed);
651*15dc779aSAndroid Build Coastguard Worker }
652*15dc779aSAndroid Build Coastguard Worker /* Copy the buffer passed by Android plugin to codec input buffer */
653*15dc779aSAndroid Build Coastguard Worker memcpy(mInputBuffer, inBuffer, inBufferLength);
654*15dc779aSAndroid Build Coastguard Worker
655*15dc779aSAndroid Build Coastguard Worker /* Set number of bytes to be processed */
656*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = ixheaacd_dec_api(
657*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle, IA_API_CMD_SET_INPUT_BYTES, 0, &inBufferLength);
658*15dc779aSAndroid Build Coastguard Worker
659*15dc779aSAndroid Build Coastguard Worker /* Execute process */
660*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_EXECUTE,
661*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_DO_EXECUTE, nullptr);
662*15dc779aSAndroid Build Coastguard Worker
663*15dc779aSAndroid Build Coastguard Worker /* Checking for end of processing */
664*15dc779aSAndroid Build Coastguard Worker uint32_t ui_exec_done;
665*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_EXECUTE,
666*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_DONE_QUERY, &ui_exec_done);
667*15dc779aSAndroid Build Coastguard Worker
668*15dc779aSAndroid Build Coastguard Worker if (ui_exec_done != 1) {
669*15dc779aSAndroid Build Coastguard Worker VOID* p_array; // ITTIAM:buffer to handle gain payload
670*15dc779aSAndroid Build Coastguard Worker WORD32 buf_size = 0; // ITTIAM:gain payload length
671*15dc779aSAndroid Build Coastguard Worker WORD32 bit_str_fmt = 1;
672*15dc779aSAndroid Build Coastguard Worker WORD32 gain_stream_flag = 1;
673*15dc779aSAndroid Build Coastguard Worker
674*15dc779aSAndroid Build Coastguard Worker err_code =
675*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
676*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_LEN, &buf_size);
677*15dc779aSAndroid Build Coastguard Worker
678*15dc779aSAndroid Build Coastguard Worker err_code =
679*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
680*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF, &p_array);
681*15dc779aSAndroid Build Coastguard Worker
682*15dc779aSAndroid Build Coastguard Worker if (buf_size > 0) {
683*15dc779aSAndroid Build Coastguard Worker /*Set bitstream_split_format */
684*15dc779aSAndroid Build Coastguard Worker err_code =
685*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
686*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
687*15dc779aSAndroid Build Coastguard Worker
688*15dc779aSAndroid Build Coastguard Worker memcpy(mDrcInBuf, p_array, buf_size);
689*15dc779aSAndroid Build Coastguard Worker /* Set number of bytes to be processed */
690*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES_BS,
691*15dc779aSAndroid Build Coastguard Worker 0, &buf_size);
692*15dc779aSAndroid Build Coastguard Worker
693*15dc779aSAndroid Build Coastguard Worker err_code =
694*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
695*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG, &gain_stream_flag);
696*15dc779aSAndroid Build Coastguard Worker
697*15dc779aSAndroid Build Coastguard Worker /* Execute process */
698*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_INIT,
699*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_INIT_CPY_BSF_BUFF, nullptr);
700*15dc779aSAndroid Build Coastguard Worker
701*15dc779aSAndroid Build Coastguard Worker mMpegDDRCPresent = 1;
702*15dc779aSAndroid Build Coastguard Worker }
703*15dc779aSAndroid Build Coastguard Worker }
704*15dc779aSAndroid Build Coastguard Worker
705*15dc779aSAndroid Build Coastguard Worker /* How much buffer is used in input buffers */
706*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(
707*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle, IA_API_CMD_GET_CURIDX_INPUT_BUF, 0, bytesConsumed);
708*15dc779aSAndroid Build Coastguard Worker
709*15dc779aSAndroid Build Coastguard Worker /* Get the output bytes */
710*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_OUTPUT_BYTES,
711*15dc779aSAndroid Build Coastguard Worker 0, outBytes);
712*15dc779aSAndroid Build Coastguard Worker
713*15dc779aSAndroid Build Coastguard Worker if (mMpegDDRCPresent == 1) {
714*15dc779aSAndroid Build Coastguard Worker memcpy(mDrcInBuf, mOutputBuffer, *outBytes);
715*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_INPUT_BYTES, 0,
716*15dc779aSAndroid Build Coastguard Worker outBytes);
717*15dc779aSAndroid Build Coastguard Worker
718*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_EXECUTE,
719*15dc779aSAndroid Build Coastguard Worker IA_CMD_TYPE_DO_EXECUTE, nullptr);
720*15dc779aSAndroid Build Coastguard Worker
721*15dc779aSAndroid Build Coastguard Worker memcpy(mOutputBuffer, mDrcOutBuf, *outBytes);
722*15dc779aSAndroid Build Coastguard Worker }
723*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
724*15dc779aSAndroid Build Coastguard Worker }
725*15dc779aSAndroid Build Coastguard Worker
getXAACStreamInfo()726*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::getXAACStreamInfo() {
727*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
728*15dc779aSAndroid Build Coastguard Worker
729*15dc779aSAndroid Build Coastguard Worker /* Sampling frequency */
730*15dc779aSAndroid Build Coastguard Worker err_code =
731*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
732*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ, &mSampFreq);
733*15dc779aSAndroid Build Coastguard Worker
734*15dc779aSAndroid Build Coastguard Worker /* Total Number of Channels */
735*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
736*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS,
737*15dc779aSAndroid Build Coastguard Worker &mNumChannels);
738*15dc779aSAndroid Build Coastguard Worker
739*15dc779aSAndroid Build Coastguard Worker if (mNumChannels > MAX_CHANNEL_COUNT) {
740*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
741*15dc779aSAndroid Build Coastguard Worker }
742*15dc779aSAndroid Build Coastguard Worker
743*15dc779aSAndroid Build Coastguard Worker /* PCM word size */
744*15dc779aSAndroid Build Coastguard Worker err_code =
745*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
746*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ, &mPcmWdSz);
747*15dc779aSAndroid Build Coastguard Worker
748*15dc779aSAndroid Build Coastguard Worker if ((mPcmWdSz / 8) != 2) {
749*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
750*15dc779aSAndroid Build Coastguard Worker }
751*15dc779aSAndroid Build Coastguard Worker
752*15dc779aSAndroid Build Coastguard Worker /* channel mask to tell the arrangement of channels in bit stream */
753*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
754*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK,
755*15dc779aSAndroid Build Coastguard Worker &mChannelMask);
756*15dc779aSAndroid Build Coastguard Worker
757*15dc779aSAndroid Build Coastguard Worker /* Channel mode to tell MONO/STEREO/DUAL-MONO/NONE_OF_THESE */
758*15dc779aSAndroid Build Coastguard Worker uint32_t ui_channel_mode;
759*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
760*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE,
761*15dc779aSAndroid Build Coastguard Worker &ui_channel_mode);
762*15dc779aSAndroid Build Coastguard Worker
763*15dc779aSAndroid Build Coastguard Worker /* Channel mode to tell SBR PRESENT/NOT_PRESENT */
764*15dc779aSAndroid Build Coastguard Worker uint32_t ui_sbr_mode;
765*15dc779aSAndroid Build Coastguard Worker err_code =
766*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
767*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE, &ui_sbr_mode);
768*15dc779aSAndroid Build Coastguard Worker
769*15dc779aSAndroid Build Coastguard Worker /* mOutputFrameLength = 1024 * (1 + SBR_MODE) for AAC */
770*15dc779aSAndroid Build Coastguard Worker /* For USAC it could be 1024 * 3 , support to query */
771*15dc779aSAndroid Build Coastguard Worker /* not yet added in codec */
772*15dc779aSAndroid Build Coastguard Worker mOutputFrameLength = 1024 * (1 + ui_sbr_mode);
773*15dc779aSAndroid Build Coastguard Worker
774*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
775*15dc779aSAndroid Build Coastguard Worker }
776*15dc779aSAndroid Build Coastguard Worker
setXAACDRCInfo(int32_t drcCut,int32_t drcBoost,int32_t drcRefLevel,int32_t drcHeavyCompression,int32_t drEffectType)777*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE Codec::setXAACDRCInfo(int32_t drcCut, int32_t drcBoost,
778*15dc779aSAndroid Build Coastguard Worker int32_t drcRefLevel,
779*15dc779aSAndroid Build Coastguard Worker int32_t drcHeavyCompression,
780*15dc779aSAndroid Build Coastguard Worker int32_t drEffectType) {
781*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
782*15dc779aSAndroid Build Coastguard Worker
783*15dc779aSAndroid Build Coastguard Worker int32_t ui_drc_enable = 1;
784*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
785*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_ENABLE,
786*15dc779aSAndroid Build Coastguard Worker &ui_drc_enable);
787*15dc779aSAndroid Build Coastguard Worker
788*15dc779aSAndroid Build Coastguard Worker if (drcCut != -1) {
789*15dc779aSAndroid Build Coastguard Worker err_code =
790*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
791*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT, &drcCut);
792*15dc779aSAndroid Build Coastguard Worker }
793*15dc779aSAndroid Build Coastguard Worker
794*15dc779aSAndroid Build Coastguard Worker if (drcBoost != -1) {
795*15dc779aSAndroid Build Coastguard Worker err_code =
796*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
797*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST, &drcBoost);
798*15dc779aSAndroid Build Coastguard Worker }
799*15dc779aSAndroid Build Coastguard Worker
800*15dc779aSAndroid Build Coastguard Worker if (drcRefLevel != -1) {
801*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
802*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL,
803*15dc779aSAndroid Build Coastguard Worker &drcRefLevel);
804*15dc779aSAndroid Build Coastguard Worker }
805*15dc779aSAndroid Build Coastguard Worker
806*15dc779aSAndroid Build Coastguard Worker if (drcRefLevel != -1) {
807*15dc779aSAndroid Build Coastguard Worker err_code =
808*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
809*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS, &drcRefLevel);
810*15dc779aSAndroid Build Coastguard Worker }
811*15dc779aSAndroid Build Coastguard Worker
812*15dc779aSAndroid Build Coastguard Worker if (drcHeavyCompression != -1) {
813*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
814*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP,
815*15dc779aSAndroid Build Coastguard Worker &drcHeavyCompression);
816*15dc779aSAndroid Build Coastguard Worker }
817*15dc779aSAndroid Build Coastguard Worker
818*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM,
819*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE, &drEffectType);
820*15dc779aSAndroid Build Coastguard Worker
821*15dc779aSAndroid Build Coastguard Worker int32_t i_effect_type, i_target_loudness, i_loud_norm;
822*15dc779aSAndroid Build Coastguard Worker /*Set Effect Type*/
823*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
824*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE,
825*15dc779aSAndroid Build Coastguard Worker &i_effect_type);
826*15dc779aSAndroid Build Coastguard Worker
827*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
828*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE, &i_effect_type);
829*15dc779aSAndroid Build Coastguard Worker
830*15dc779aSAndroid Build Coastguard Worker /*Set target loudness */
831*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(
832*15dc779aSAndroid Build Coastguard Worker mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
833*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS, &i_target_loudness);
834*15dc779aSAndroid Build Coastguard Worker
835*15dc779aSAndroid Build Coastguard Worker err_code =
836*15dc779aSAndroid Build Coastguard Worker ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
837*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS, &i_target_loudness);
838*15dc779aSAndroid Build Coastguard Worker
839*15dc779aSAndroid Build Coastguard Worker /*Set loud_norm_flag*/
840*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_GET_CONFIG_PARAM,
841*15dc779aSAndroid Build Coastguard Worker IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM,
842*15dc779aSAndroid Build Coastguard Worker &i_loud_norm);
843*15dc779aSAndroid Build Coastguard Worker
844*15dc779aSAndroid Build Coastguard Worker err_code = ia_drc_dec_api(mMpegDDrcHandle, IA_API_CMD_SET_CONFIG_PARAM,
845*15dc779aSAndroid Build Coastguard Worker IA_DRC_DEC_CONFIG_DRC_LOUD_NORM, &i_loud_norm);
846*15dc779aSAndroid Build Coastguard Worker
847*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
848*15dc779aSAndroid Build Coastguard Worker }
849*15dc779aSAndroid Build Coastguard Worker
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)850*15dc779aSAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
851*15dc779aSAndroid Build Coastguard Worker int status;
852*15dc779aSAndroid Build Coastguard Worker int num_proc_iterations = 0;
853*15dc779aSAndroid Build Coastguard Worker if (size < 1) return 0;
854*15dc779aSAndroid Build Coastguard Worker Codec* codec = new Codec();
855*15dc779aSAndroid Build Coastguard Worker bool isADTS = false;
856*15dc779aSAndroid Build Coastguard Worker if (size >= 2) {
857*15dc779aSAndroid Build Coastguard Worker if ((data[0] == 0xFF) && ((data[1] & 0xF0) == 0xF0)) {
858*15dc779aSAndroid Build Coastguard Worker isADTS = true;
859*15dc779aSAndroid Build Coastguard Worker }
860*15dc779aSAndroid Build Coastguard Worker }
861*15dc779aSAndroid Build Coastguard Worker status = codec->initDecoder(data, size, isADTS);
862*15dc779aSAndroid Build Coastguard Worker if (0 == status) {
863*15dc779aSAndroid Build Coastguard Worker int32_t bytesConsumed = 0;
864*15dc779aSAndroid Build Coastguard Worker status = codec->configXAACDecoder((uint8_t*)data, size, &bytesConsumed);
865*15dc779aSAndroid Build Coastguard Worker while ((int32_t)size > bytesConsumed) {
866*15dc779aSAndroid Build Coastguard Worker int32_t numOutBytes;
867*15dc779aSAndroid Build Coastguard Worker size -= bytesConsumed;
868*15dc779aSAndroid Build Coastguard Worker data += bytesConsumed;
869*15dc779aSAndroid Build Coastguard Worker status = codec->decodeXAACStream((uint8_t*)data, size, &bytesConsumed,
870*15dc779aSAndroid Build Coastguard Worker &numOutBytes);
871*15dc779aSAndroid Build Coastguard Worker num_proc_iterations++;
872*15dc779aSAndroid Build Coastguard Worker /* Stop processing after 500 frames */
873*15dc779aSAndroid Build Coastguard Worker if (num_proc_iterations > 500)
874*15dc779aSAndroid Build Coastguard Worker break;
875*15dc779aSAndroid Build Coastguard Worker
876*15dc779aSAndroid Build Coastguard Worker /* If decoder doesn't consume any bytes, advance by 4 bytes */
877*15dc779aSAndroid Build Coastguard Worker if (0 == bytesConsumed) bytesConsumed = 4;
878*15dc779aSAndroid Build Coastguard Worker }
879*15dc779aSAndroid Build Coastguard Worker }
880*15dc779aSAndroid Build Coastguard Worker status = codec->deInitXAACDecoder();
881*15dc779aSAndroid Build Coastguard Worker status = codec->deInitMPEGDDDrc();
882*15dc779aSAndroid Build Coastguard Worker delete codec;
883*15dc779aSAndroid Build Coastguard Worker return 0;
884*15dc779aSAndroid Build Coastguard Worker }
885