1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 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 /* File includes */
22*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
23*15dc779aSAndroid Build Coastguard Worker #include <string.h>
24*15dc779aSAndroid Build Coastguard Worker #include <stdio.h>
25*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_user_config.h"
32*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_handler.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_loudness_measurement.h"
37*15dc779aSAndroid Build Coastguard Worker
38*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_error_handler_init();
39*15dc779aSAndroid Build Coastguard Worker VOID ia_testbench_error_handler_init();
40*15dc779aSAndroid Build Coastguard Worker
41*15dc779aSAndroid Build Coastguard Worker extern ia_error_info_struct ia_testbench_error_info;
42*15dc779aSAndroid Build Coastguard Worker extern ia_error_info_struct ia_enhaacplus_enc_error_info;
43*15dc779aSAndroid Build Coastguard Worker
44*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
45*15dc779aSAndroid Build Coastguard Worker /* Constant hash defines */
46*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
47*15dc779aSAndroid Build Coastguard Worker #define IA_MAX_CMD_LINE_LENGTH 300
48*15dc779aSAndroid Build Coastguard Worker #define IA_MAX_ARGS 20
49*15dc779aSAndroid Build Coastguard Worker #define IA_SCREEN_WIDTH 80
50*15dc779aSAndroid Build Coastguard Worker #define APP_BITRES_SIZE_CONFIG_PARAM_DEF_VALUE_LC (768)
51*15dc779aSAndroid Build Coastguard Worker #define APP_BITRES_SIZE_CONFIG_PARAM_DEF_VALUE_LD (384)
52*15dc779aSAndroid Build Coastguard Worker
53*15dc779aSAndroid Build Coastguard Worker #define PARAMFILE "paramfilesimple.txt"
54*15dc779aSAndroid Build Coastguard Worker
55*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
56*15dc779aSAndroid Build Coastguard Worker /* Error codes for the testbench */
57*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
58*15dc779aSAndroid Build Coastguard Worker #define IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED 0xFFFFA001
59*15dc779aSAndroid Build Coastguard Worker #define DRC_CONFIG_FILE "impd_drc_config_params.txt"
60*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
61*15dc779aSAndroid Build Coastguard Worker /* Application Context structure */
62*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
63*15dc779aSAndroid Build Coastguard Worker typedef struct {
64*15dc779aSAndroid Build Coastguard Worker FILE *pf_inp;
65*15dc779aSAndroid Build Coastguard Worker FILE *pf_out;
66*15dc779aSAndroid Build Coastguard Worker FILE *pf_meta;
67*15dc779aSAndroid Build Coastguard Worker WORD32 use_ga_hdr;
68*15dc779aSAndroid Build Coastguard Worker } ixheaace_app_context;
69*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_fread(void * buf,int size,int bytes,FILE * fp)70*15dc779aSAndroid Build Coastguard Worker int ia_enhaacplus_enc_fread(void *buf, int size, int bytes, FILE *fp) {
71*15dc779aSAndroid Build Coastguard Worker return (int)fread(buf, size, bytes, fp);
72*15dc779aSAndroid Build Coastguard Worker }
73*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_pcm_data_read(FILE * in_file,UWORD32 num_samples,WORD32 num_channels,WORD16 ** data)74*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_pcm_data_read(FILE *in_file, UWORD32 num_samples,
75*15dc779aSAndroid Build Coastguard Worker WORD32 num_channels, WORD16 **data) {
76*15dc779aSAndroid Build Coastguard Worker UWORD32 count = 0;
77*15dc779aSAndroid Build Coastguard Worker WORD16 temp;
78*15dc779aSAndroid Build Coastguard Worker WORD16 *buf = &temp;
79*15dc779aSAndroid Build Coastguard Worker UWORD8 channel_no;
80*15dc779aSAndroid Build Coastguard Worker UWORD32 sample_no = 0;
81*15dc779aSAndroid Build Coastguard Worker
82*15dc779aSAndroid Build Coastguard Worker while (count < num_samples) {
83*15dc779aSAndroid Build Coastguard Worker sample_no = count / num_channels;
84*15dc779aSAndroid Build Coastguard Worker channel_no = (UWORD8)(count % num_channels);
85*15dc779aSAndroid Build Coastguard Worker if (fread(buf, sizeof(WORD16), 1, in_file) != 1) {
86*15dc779aSAndroid Build Coastguard Worker if (feof(in_file)) {
87*15dc779aSAndroid Build Coastguard Worker printf("End of file reached.\n");
88*15dc779aSAndroid Build Coastguard Worker } else {
89*15dc779aSAndroid Build Coastguard Worker printf("Error reading a file.\n");
90*15dc779aSAndroid Build Coastguard Worker return -1;
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker }
93*15dc779aSAndroid Build Coastguard Worker data[channel_no][sample_no] = temp;
94*15dc779aSAndroid Build Coastguard Worker count++;
95*15dc779aSAndroid Build Coastguard Worker }
96*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
97*15dc779aSAndroid Build Coastguard Worker }
98*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_fwrite(void * pb_buf,FILE * pf_out,WORD32 i_out_bytes)99*15dc779aSAndroid Build Coastguard Worker int ia_enhaacplus_enc_fwrite(void *pb_buf, FILE *pf_out, WORD32 i_out_bytes) {
100*15dc779aSAndroid Build Coastguard Worker fwrite(pb_buf, sizeof(char), i_out_bytes, pf_out);
101*15dc779aSAndroid Build Coastguard Worker return 1;
102*15dc779aSAndroid Build Coastguard Worker }
103*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_wav_header_decode(FILE * in_file,UWORD32 * n_channels,UWORD32 * i_channel_mask,UWORD32 * sample_rate,UWORD32 * pcm_sz,WORD32 * length)104*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_wav_header_decode(FILE *in_file, UWORD32 *n_channels,
105*15dc779aSAndroid Build Coastguard Worker UWORD32 *i_channel_mask, UWORD32 *sample_rate,
106*15dc779aSAndroid Build Coastguard Worker UWORD32 *pcm_sz, WORD32 *length) {
107*15dc779aSAndroid Build Coastguard Worker WORD8 wav_hdr[40 + 36];
108*15dc779aSAndroid Build Coastguard Worker WORD8 data_start[4];
109*15dc779aSAndroid Build Coastguard Worker WORD16 num_ch;
110*15dc779aSAndroid Build Coastguard Worker UWORD32 f_samp;
111*15dc779aSAndroid Build Coastguard Worker WORD16 output_format;
112*15dc779aSAndroid Build Coastguard Worker WORD32 check, count = 0;
113*15dc779aSAndroid Build Coastguard Worker FLAG wav_format_pcm = 0, wav_format_extensible = 0;
114*15dc779aSAndroid Build Coastguard Worker UWORD16 cb_size = 0;
115*15dc779aSAndroid Build Coastguard Worker WORD32 curr_pos, size;
116*15dc779aSAndroid Build Coastguard Worker
117*15dc779aSAndroid Build Coastguard Worker *i_channel_mask = 0;
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker if (fread(wav_hdr, 1, 40, in_file) != 40) return 1;
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker if (wav_hdr[0] != 'R' && wav_hdr[1] != 'I' && wav_hdr[2] != 'F' && wav_hdr[3] != 'F') {
122*15dc779aSAndroid Build Coastguard Worker return 1;
123*15dc779aSAndroid Build Coastguard Worker }
124*15dc779aSAndroid Build Coastguard Worker
125*15dc779aSAndroid Build Coastguard Worker if (wav_hdr[20] == 01 && wav_hdr[21] == 00) {
126*15dc779aSAndroid Build Coastguard Worker wav_format_pcm = 1;
127*15dc779aSAndroid Build Coastguard Worker } else if (wav_hdr[20] == ((WORD8)-2) && wav_hdr[21] == ((WORD8)-1)) {
128*15dc779aSAndroid Build Coastguard Worker wav_format_extensible = 1;
129*15dc779aSAndroid Build Coastguard Worker } else {
130*15dc779aSAndroid Build Coastguard Worker return 1;
131*15dc779aSAndroid Build Coastguard Worker }
132*15dc779aSAndroid Build Coastguard Worker
133*15dc779aSAndroid Build Coastguard Worker num_ch = (WORD16)((UWORD8)wav_hdr[23] * 256 + (UWORD8)wav_hdr[22]);
134*15dc779aSAndroid Build Coastguard Worker f_samp = ((UWORD8)wav_hdr[27] * 256 * 256 * 256);
135*15dc779aSAndroid Build Coastguard Worker f_samp += ((UWORD8)wav_hdr[26] * 256 * 256);
136*15dc779aSAndroid Build Coastguard Worker f_samp += ((UWORD8)wav_hdr[25] * 256);
137*15dc779aSAndroid Build Coastguard Worker f_samp += ((UWORD8)wav_hdr[24]);
138*15dc779aSAndroid Build Coastguard Worker
139*15dc779aSAndroid Build Coastguard Worker output_format = ((UWORD8)wav_hdr[35] * 256);
140*15dc779aSAndroid Build Coastguard Worker output_format += ((UWORD8)wav_hdr[34]);
141*15dc779aSAndroid Build Coastguard Worker
142*15dc779aSAndroid Build Coastguard Worker *n_channels = num_ch;
143*15dc779aSAndroid Build Coastguard Worker *sample_rate = f_samp;
144*15dc779aSAndroid Build Coastguard Worker *pcm_sz = output_format;
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker if (wav_format_pcm) {
147*15dc779aSAndroid Build Coastguard Worker data_start[0] = wav_hdr[36];
148*15dc779aSAndroid Build Coastguard Worker data_start[1] = wav_hdr[37];
149*15dc779aSAndroid Build Coastguard Worker data_start[2] = wav_hdr[38];
150*15dc779aSAndroid Build Coastguard Worker data_start[3] = wav_hdr[39];
151*15dc779aSAndroid Build Coastguard Worker } else if (wav_format_extensible) {
152*15dc779aSAndroid Build Coastguard Worker cb_size |= ((UWORD8)wav_hdr[37] << 8);
153*15dc779aSAndroid Build Coastguard Worker cb_size |= ((UWORD8)wav_hdr[36]);
154*15dc779aSAndroid Build Coastguard Worker
155*15dc779aSAndroid Build Coastguard Worker if (fread(&(wav_hdr[40]), 1, (UWORD16)(cb_size - 2 + 4), in_file) !=
156*15dc779aSAndroid Build Coastguard Worker (UWORD16)(cb_size - 2 + 4))
157*15dc779aSAndroid Build Coastguard Worker return 1;
158*15dc779aSAndroid Build Coastguard Worker
159*15dc779aSAndroid Build Coastguard Worker if (cb_size > 34) {
160*15dc779aSAndroid Build Coastguard Worker return 1;
161*15dc779aSAndroid Build Coastguard Worker }
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker *i_channel_mask = 0;
164*15dc779aSAndroid Build Coastguard Worker *i_channel_mask |= (UWORD8)wav_hdr[43] << 24;
165*15dc779aSAndroid Build Coastguard Worker *i_channel_mask |= (UWORD8)wav_hdr[42] << 16;
166*15dc779aSAndroid Build Coastguard Worker *i_channel_mask |= (UWORD8)wav_hdr[41] << 8;
167*15dc779aSAndroid Build Coastguard Worker *i_channel_mask |= (UWORD8)wav_hdr[40];
168*15dc779aSAndroid Build Coastguard Worker
169*15dc779aSAndroid Build Coastguard Worker data_start[0] = wav_hdr[40 + cb_size - 2 + 0];
170*15dc779aSAndroid Build Coastguard Worker data_start[1] = wav_hdr[40 + cb_size - 2 + 1];
171*15dc779aSAndroid Build Coastguard Worker data_start[2] = wav_hdr[40 + cb_size - 2 + 2];
172*15dc779aSAndroid Build Coastguard Worker data_start[3] = wav_hdr[40 + cb_size - 2 + 3];
173*15dc779aSAndroid Build Coastguard Worker }
174*15dc779aSAndroid Build Coastguard Worker
175*15dc779aSAndroid Build Coastguard Worker check = 1;
176*15dc779aSAndroid Build Coastguard Worker while (check) {
177*15dc779aSAndroid Build Coastguard Worker if (data_start[0] == 'd' && data_start[1] == 'a' && data_start[2] == 't' &&
178*15dc779aSAndroid Build Coastguard Worker data_start[3] == 'a') {
179*15dc779aSAndroid Build Coastguard Worker if (1 != fread(length, 4, 1, in_file)) return 1;
180*15dc779aSAndroid Build Coastguard Worker check = 0;
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker curr_pos = ftell(in_file);
183*15dc779aSAndroid Build Coastguard Worker fseek(in_file, 0L, SEEK_END);
184*15dc779aSAndroid Build Coastguard Worker size = ftell(in_file) - curr_pos;
185*15dc779aSAndroid Build Coastguard Worker if (*length > size) {
186*15dc779aSAndroid Build Coastguard Worker printf("\n Inconsitent file size \n");
187*15dc779aSAndroid Build Coastguard Worker *length = size;
188*15dc779aSAndroid Build Coastguard Worker }
189*15dc779aSAndroid Build Coastguard Worker fseek(in_file, curr_pos, SEEK_SET);
190*15dc779aSAndroid Build Coastguard Worker } else {
191*15dc779aSAndroid Build Coastguard Worker data_start[0] = data_start[1];
192*15dc779aSAndroid Build Coastguard Worker data_start[1] = data_start[2];
193*15dc779aSAndroid Build Coastguard Worker data_start[2] = data_start[3];
194*15dc779aSAndroid Build Coastguard Worker if (1 != fread(&data_start[3], 1, 1, in_file)) return 1;
195*15dc779aSAndroid Build Coastguard Worker }
196*15dc779aSAndroid Build Coastguard Worker count++;
197*15dc779aSAndroid Build Coastguard Worker if (count > 40) {
198*15dc779aSAndroid Build Coastguard Worker *length = 0xffffffff;
199*15dc779aSAndroid Build Coastguard Worker return (1);
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_print_usage()205*15dc779aSAndroid Build Coastguard Worker void ia_enhaacplus_enc_print_usage() {
206*15dc779aSAndroid Build Coastguard Worker printf("\nUsage:\n");
207*15dc779aSAndroid Build Coastguard Worker printf("\n<executable> -ifile:<inputfile> -ofile:<outputfile> [options]\n");
208*15dc779aSAndroid Build Coastguard Worker printf("\nor\n");
209*15dc779aSAndroid Build Coastguard Worker printf("\n<executable> -paramfile:<paramfile>\n");
210*15dc779aSAndroid Build Coastguard Worker printf("\n[options] can be,");
211*15dc779aSAndroid Build Coastguard Worker printf("\n[-br:<bitrate>]");
212*15dc779aSAndroid Build Coastguard Worker printf("\n[-mps:<use_mps>]");
213*15dc779aSAndroid Build Coastguard Worker printf("\n[-adts:<use_adts_flag>]");
214*15dc779aSAndroid Build Coastguard Worker printf("\n[-tns:<use_tns_flag>]");
215*15dc779aSAndroid Build Coastguard Worker printf("\n[-nf:<use_noise_filling>]");
216*15dc779aSAndroid Build Coastguard Worker printf("\n[-cmpx_pred:<use_complex_prediction>]");
217*15dc779aSAndroid Build Coastguard Worker printf("\n[-framesize:<framesize_to_be_used>]");
218*15dc779aSAndroid Build Coastguard Worker printf("\n[-aot:<audio_object_type>]");
219*15dc779aSAndroid Build Coastguard Worker printf("\n[-esbr:<esbr_flag>]");
220*15dc779aSAndroid Build Coastguard Worker printf("\n[-full_bandwidth:<enable_full_bandwidth>]");
221*15dc779aSAndroid Build Coastguard Worker printf("\n[-max_out_buffer_per_ch:<bitreservoir_size>]");
222*15dc779aSAndroid Build Coastguard Worker printf("\n[-tree_cfg:<tree_config>]");
223*15dc779aSAndroid Build Coastguard Worker printf("\n[-usac:<usac_encoding_mode>]");
224*15dc779aSAndroid Build Coastguard Worker printf("\n[-ccfl_idx:<corecoder_framelength_index>]");
225*15dc779aSAndroid Build Coastguard Worker printf("\n[-pvc_enc:<pvc_enc_flag>]");
226*15dc779aSAndroid Build Coastguard Worker printf("\n[-harmonic_sbr:<harmonic_sbr_flag>]");
227*15dc779aSAndroid Build Coastguard Worker printf("\n[-esbr_hq:<esbr_hq_flag>]");
228*15dc779aSAndroid Build Coastguard Worker printf("\n[-drc:<drc_flag>]");
229*15dc779aSAndroid Build Coastguard Worker printf("\n[-inter_tes_enc:<inter_tes_enc_flag>]");
230*15dc779aSAndroid Build Coastguard Worker printf("\n[-rap:<random access interval in ms>]");
231*15dc779aSAndroid Build Coastguard Worker printf("\n[-stream_id:<stream identifier>]");
232*15dc779aSAndroid Build Coastguard Worker printf("\n\nwhere, \n <paramfile> is the parameter file with multiple commands");
233*15dc779aSAndroid Build Coastguard Worker printf("\n <inputfile> is the input 16-bit WAV or PCM file name");
234*15dc779aSAndroid Build Coastguard Worker printf("\n <outputfile> is the output ADTS/ES file name");
235*15dc779aSAndroid Build Coastguard Worker printf("\n <bitrate> is the bit-rate in bits per second. Default value is 48000. ");
236*15dc779aSAndroid Build Coastguard Worker printf("\n <use_mps> Valid values are 0 (disable MPS) and 1 (enable MPS). Default is 0.");
237*15dc779aSAndroid Build Coastguard Worker printf(
238*15dc779aSAndroid Build Coastguard Worker "\n <use_adts_flag> Valid values are 0 ( No ADTS header) and 1 ( generate ADTS header). "
239*15dc779aSAndroid Build Coastguard Worker "Default is 0.");
240*15dc779aSAndroid Build Coastguard Worker printf("\n <use_tns_flag> Valid values are 0 (disable TNS) and 1 (enable TNS). Default is 1.");
241*15dc779aSAndroid Build Coastguard Worker printf("\n <use_noise_filling> controls usage of noise filling in encoding. Default 0.");
242*15dc779aSAndroid Build Coastguard Worker printf(
243*15dc779aSAndroid Build Coastguard Worker "\n <use_complex_prediction> controls usage of complex prediction in encoding. Default "
244*15dc779aSAndroid Build Coastguard Worker "0.");
245*15dc779aSAndroid Build Coastguard Worker printf("\n <framesize_to_be_used> is the framesize to be used.");
246*15dc779aSAndroid Build Coastguard Worker printf(
247*15dc779aSAndroid Build Coastguard Worker "\n For AOT 23, 39 (LD core coder profiles) valid values are 480 and 512. Default "
248*15dc779aSAndroid Build Coastguard Worker "is "
249*15dc779aSAndroid Build Coastguard Worker "512.");
250*15dc779aSAndroid Build Coastguard Worker printf(
251*15dc779aSAndroid Build Coastguard Worker "\n For AOT 2, 5, 29 (LC core coder profiles) valid values are 960 and 1024. "
252*15dc779aSAndroid Build Coastguard Worker "Default "
253*15dc779aSAndroid Build Coastguard Worker "is 1024.");
254*15dc779aSAndroid Build Coastguard Worker printf(
255*15dc779aSAndroid Build Coastguard Worker "\n For AOT 42 (USAC profile) valid values are 768 and 1024. "
256*15dc779aSAndroid Build Coastguard Worker "Default "
257*15dc779aSAndroid Build Coastguard Worker "is 1024.");
258*15dc779aSAndroid Build Coastguard Worker printf("\n <audio_object_type> is the Audio object type");
259*15dc779aSAndroid Build Coastguard Worker printf("\n 2 for AAC-LC");
260*15dc779aSAndroid Build Coastguard Worker printf("\n 5 for HE-AACv1(Legacy SBR)");
261*15dc779aSAndroid Build Coastguard Worker printf("\n 23 for AAC-LD");
262*15dc779aSAndroid Build Coastguard Worker printf("\n 29 for HE-AACv2");
263*15dc779aSAndroid Build Coastguard Worker printf("\n 39 for AAC-ELD");
264*15dc779aSAndroid Build Coastguard Worker printf("\n 42 for USAC");
265*15dc779aSAndroid Build Coastguard Worker printf("\n Default is 2 for AAC-LC.");
266*15dc779aSAndroid Build Coastguard Worker printf("\n <esbr_flag> Valid values are 0 (disable eSBR) and 1 (enable eSBR).");
267*15dc779aSAndroid Build Coastguard Worker printf("\n Default is 0 for HE-AACv1 profile (legacy SBR) and 1 for USAC profile.");
268*15dc779aSAndroid Build Coastguard Worker printf(
269*15dc779aSAndroid Build Coastguard Worker "\n <enable_full_bandwidth> Enable use of full bandwidth of input. Valid values are "
270*15dc779aSAndroid Build Coastguard Worker "0(disable full bandwidth) and 1(enable full bandwidth). Default is 0.");
271*15dc779aSAndroid Build Coastguard Worker printf("\n <bitreservoir_size> is the maximum size of bit reservoir to be used.");
272*15dc779aSAndroid Build Coastguard Worker printf(
273*15dc779aSAndroid Build Coastguard Worker "\n Valid values are from -1 to 6144. -1 will omit use of bit reservoir. Default is "
274*15dc779aSAndroid Build Coastguard Worker "384.");
275*15dc779aSAndroid Build Coastguard Worker printf(
276*15dc779aSAndroid Build Coastguard Worker "\n <tree_config> MPS tree config"
277*15dc779aSAndroid Build Coastguard Worker "\n 0 for '212'"
278*15dc779aSAndroid Build Coastguard Worker "\n 1 for '5151'"
279*15dc779aSAndroid Build Coastguard Worker "\n 2 for '5152'"
280*15dc779aSAndroid Build Coastguard Worker "\n 3 for '525'"
281*15dc779aSAndroid Build Coastguard Worker "\n Default '212' for stereo input and '5151' for 6ch input.");
282*15dc779aSAndroid Build Coastguard Worker printf(
283*15dc779aSAndroid Build Coastguard Worker "\n <usac_encoding_mode> USAC encoding mode to be chose"
284*15dc779aSAndroid Build Coastguard Worker "0 for 'usac_switched'"
285*15dc779aSAndroid Build Coastguard Worker "1 for 'usac_fd'"
286*15dc779aSAndroid Build Coastguard Worker "2 for 'usac_td'"
287*15dc779aSAndroid Build Coastguard Worker "Default 'usac_fd'");
288*15dc779aSAndroid Build Coastguard Worker printf(
289*15dc779aSAndroid Build Coastguard Worker "\n <corecoder_framelength_index> is the core coder framelength index for USAC encoder");
290*15dc779aSAndroid Build Coastguard Worker printf("\n Valid values are 0, 1, 2, 3, 4. eSBR enabling is implicit");
291*15dc779aSAndroid Build Coastguard Worker printf("\n 0 - Core coder framelength of USAC is 768 and eSBR is disabled");
292*15dc779aSAndroid Build Coastguard Worker printf("\n 1 - Core coder framelength of USAC is 1024 and eSBR is disabled");
293*15dc779aSAndroid Build Coastguard Worker printf("\n 2 - Core coder framelength of USAC is 768 and eSBR ratio 8:3");
294*15dc779aSAndroid Build Coastguard Worker printf("\n 3 - Core coder framelength of USAC is 1024 and eSBR ratio 2:1");
295*15dc779aSAndroid Build Coastguard Worker printf("\n 4 - Core coder framelength of USAC is 1024 and eSBR ratio 4:1");
296*15dc779aSAndroid Build Coastguard Worker printf(
297*15dc779aSAndroid Build Coastguard Worker "\n <pvc_enc_flag> Valid values are 0 (disable PVC encoding) and "
298*15dc779aSAndroid Build Coastguard Worker "1 (enable PVC encoding). Default is 0.");
299*15dc779aSAndroid Build Coastguard Worker printf(
300*15dc779aSAndroid Build Coastguard Worker "\n <harmonic_sbr_flag> Valid values are 0 (disable harmonic SBR) and "
301*15dc779aSAndroid Build Coastguard Worker "1 (enable harmonic SBR). Default is 0.");
302*15dc779aSAndroid Build Coastguard Worker printf(
303*15dc779aSAndroid Build Coastguard Worker "\n <esbr_hq_flag> Valid values are 0 (disable high quality eSBR) and "
304*15dc779aSAndroid Build Coastguard Worker "1 (enable high quality eSBR). Default is 0.");
305*15dc779aSAndroid Build Coastguard Worker printf(
306*15dc779aSAndroid Build Coastguard Worker "\n <drc_flag> Valid values are 0 (disable DRC encoding) and "
307*15dc779aSAndroid Build Coastguard Worker "1 (enable DRC encoding). Default is 0.");
308*15dc779aSAndroid Build Coastguard Worker printf(
309*15dc779aSAndroid Build Coastguard Worker "\n <inter_tes_enc_flag> Valid values are 0 (disable inter - TES encoding) and "
310*15dc779aSAndroid Build Coastguard Worker "1 (enable inter - TES encoding). Default is 0.");
311*15dc779aSAndroid Build Coastguard Worker printf(
312*15dc779aSAndroid Build Coastguard Worker "\n <random access interval in ms> is the time interval between audio preroll frames in "
313*15dc779aSAndroid Build Coastguard Worker "ms. It is applicable only for AOT 42."
314*15dc779aSAndroid Build Coastguard Worker "\n Valid values are -1 (Audio preroll sent only at beginning of file) and "
315*15dc779aSAndroid Build Coastguard Worker "greater than 1000 ms. Default is -1.");
316*15dc779aSAndroid Build Coastguard Worker printf(
317*15dc779aSAndroid Build Coastguard Worker "\n <stream identifier> is the stream id used to uniquely identify configuration of a "
318*15dc779aSAndroid Build Coastguard Worker "stream within a set of associated streams."
319*15dc779aSAndroid Build Coastguard Worker "\n It is applicable only for AOT 42. Valid values are 0 to 65535. Default is 0.");
320*15dc779aSAndroid Build Coastguard Worker exit(1);
321*15dc779aSAndroid Build Coastguard Worker }
322*15dc779aSAndroid Build Coastguard Worker
ixheaace_parse_config_param(WORD32 argc,pWORD8 argv[],pVOID ptr_enc_api)323*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_parse_config_param(WORD32 argc, pWORD8 argv[], pVOID ptr_enc_api) {
324*15dc779aSAndroid Build Coastguard Worker LOOPIDX i;
325*15dc779aSAndroid Build Coastguard Worker ixheaace_user_config_struct *pstr_enc_api = (ixheaace_user_config_struct *)ptr_enc_api;
326*15dc779aSAndroid Build Coastguard Worker
327*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < argc; i++) {
328*15dc779aSAndroid Build Coastguard Worker /* Stream bit rate */
329*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-br:", 4)) {
330*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 4;
331*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.i_bitrate = atoi(pb_arg_val);
332*15dc779aSAndroid Build Coastguard Worker fprintf(stdout, "Stream bit rate = %d\n", pstr_enc_api->input_config.i_bitrate);
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker /* MPS */
335*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-mps:", 5)) {
336*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 5;
337*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.i_use_mps = atoi(pb_arg_val);
338*15dc779aSAndroid Build Coastguard Worker }
339*15dc779aSAndroid Build Coastguard Worker /* Use TNS */
340*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-tns:", 5)) {
341*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 5;
342*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.aac_config.use_tns = atoi(pb_arg_val);
343*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.user_tns_flag = 1;
344*15dc779aSAndroid Build Coastguard Worker }
345*15dc779aSAndroid Build Coastguard Worker /*noise filling*/
346*15dc779aSAndroid Build Coastguard Worker if (!strncmp((pCHAR8)argv[i], "-nf:", 4)) {
347*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)argv[i] + 4;
348*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.aac_config.noise_filling = atoi(pb_arg_val);
349*15dc779aSAndroid Build Coastguard Worker }
350*15dc779aSAndroid Build Coastguard Worker /* Complex Prediction */
351*15dc779aSAndroid Build Coastguard Worker if (!strncmp((pCHAR8)argv[i], "-cmpx_pred:", 11)) {
352*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 11);
353*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.cplx_pred = atoi(pb_arg_val);
354*15dc779aSAndroid Build Coastguard Worker }
355*15dc779aSAndroid Build Coastguard Worker /*Use full bandwidth*/
356*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-full_bandwidth:", 16)) {
357*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 16;
358*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.aac_config.full_bandwidth = atoi(pb_arg_val);
359*15dc779aSAndroid Build Coastguard Worker }
360*15dc779aSAndroid Build Coastguard Worker /* frame size */
361*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-framesize:", 11)) {
362*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 11;
363*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.frame_length = atoi(pb_arg_val);
364*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.frame_cmd_flag = 1;
365*15dc779aSAndroid Build Coastguard Worker }
366*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-aot:", 5)) {
367*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 5;
368*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.aot = atoi(pb_arg_val);
369*15dc779aSAndroid Build Coastguard Worker }
370*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-esbr:", 6)) {
371*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 6;
372*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.esbr_flag = atoi(pb_arg_val);
373*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.user_esbr_flag = 1;
374*15dc779aSAndroid Build Coastguard Worker }
375*15dc779aSAndroid Build Coastguard Worker
376*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-max_out_buffer_per_ch:", 23)) {
377*15dc779aSAndroid Build Coastguard Worker char *pb_arg_val = (char *)argv[i] + 23;
378*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.aac_config.bitreservoir_size = atoi(pb_arg_val);
379*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.out_bytes_flag = 1;
380*15dc779aSAndroid Build Coastguard Worker }
381*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-tree_cfg:", 10)) {
382*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 10);
383*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.i_mps_tree_config = atoi(pb_arg_val);
384*15dc779aSAndroid Build Coastguard Worker }
385*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-adts:", 6)) {
386*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 6);
387*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.i_use_adts = atoi(pb_arg_val);
388*15dc779aSAndroid Build Coastguard Worker }
389*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-usac:", 6)) {
390*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 6);
391*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.codec_mode = atoi(pb_arg_val);
392*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.usac_en = 1;
393*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.aot = AOT_USAC;
394*15dc779aSAndroid Build Coastguard Worker }
395*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-ccfl_idx:", 10)) {
396*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 10);
397*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.ccfl_idx = atoi(pb_arg_val);
398*15dc779aSAndroid Build Coastguard Worker }
399*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-pvc_enc:", 9)) {
400*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 9);
401*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.pvc_active = atoi(pb_arg_val);
402*15dc779aSAndroid Build Coastguard Worker }
403*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-harmonic_sbr:", 14)) {
404*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 14);
405*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.harmonic_sbr = atoi(pb_arg_val);
406*15dc779aSAndroid Build Coastguard Worker }
407*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-esbr_hq:", 9)) {
408*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 9);
409*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.hq_esbr = atoi(pb_arg_val);
410*15dc779aSAndroid Build Coastguard Worker }
411*15dc779aSAndroid Build Coastguard Worker /* DRC */
412*15dc779aSAndroid Build Coastguard Worker if (!strncmp((pCHAR8)argv[i], "-drc:", 5)) {
413*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 5);
414*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.use_drc_element = atoi(pb_arg_val);
415*15dc779aSAndroid Build Coastguard Worker }
416*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-inter_tes_enc:", 15)) {
417*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 15);
418*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.inter_tes_active = atoi(pb_arg_val);
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-rap:", 5)) {
421*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 5);
422*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.random_access_interval = atoi(pb_arg_val);
423*15dc779aSAndroid Build Coastguard Worker }
424*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-stream_id:", 11)) {
425*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 11);
426*15dc779aSAndroid Build Coastguard Worker pstr_enc_api->input_config.stream_id = atoi(pb_arg_val);
427*15dc779aSAndroid Build Coastguard Worker }
428*15dc779aSAndroid Build Coastguard Worker }
429*15dc779aSAndroid Build Coastguard Worker
430*15dc779aSAndroid Build Coastguard Worker return;
431*15dc779aSAndroid Build Coastguard Worker }
432*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_display_id_message(WORD8 lib_name[],WORD8 lib_version[])433*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_display_id_message(WORD8 lib_name[], WORD8 lib_version[]) {
434*15dc779aSAndroid Build Coastguard Worker WORD8 str[4][IA_SCREEN_WIDTH] = {"ITTIAM SYSTEMS PVT LTD, BANGALORE\n",
435*15dc779aSAndroid Build Coastguard Worker "http:\\\\www.ittiam.com\n", "", ""};
436*15dc779aSAndroid Build Coastguard Worker WORD8 spaces[IA_SCREEN_WIDTH / 2 + 1];
437*15dc779aSAndroid Build Coastguard Worker WORD32 i, spclen;
438*15dc779aSAndroid Build Coastguard Worker
439*15dc779aSAndroid Build Coastguard Worker strcpy((pCHAR8)str[2], (pCHAR8)lib_name);
440*15dc779aSAndroid Build Coastguard Worker strcat((pCHAR8)str[2], (pCHAR8)lib_version);
441*15dc779aSAndroid Build Coastguard Worker strcat((pCHAR8)str[2], "\n");
442*15dc779aSAndroid Build Coastguard Worker strcat((pCHAR8)str[4 - 1], "\n");
443*15dc779aSAndroid Build Coastguard Worker
444*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < IA_SCREEN_WIDTH / 2 + 1; i++) {
445*15dc779aSAndroid Build Coastguard Worker spaces[i] = ' ';
446*15dc779aSAndroid Build Coastguard Worker }
447*15dc779aSAndroid Build Coastguard Worker
448*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 4; i++) {
449*15dc779aSAndroid Build Coastguard Worker spclen = IA_SCREEN_WIDTH / 2 - (WORD32)(strlen((const char *)str[i]) / 2);
450*15dc779aSAndroid Build Coastguard Worker spaces[spclen] = '\0';
451*15dc779aSAndroid Build Coastguard Worker printf("%s", (const char *)spaces);
452*15dc779aSAndroid Build Coastguard Worker spaces[spclen] = ' ';
453*15dc779aSAndroid Build Coastguard Worker printf("%s", (const char *)str[i]);
454*15dc779aSAndroid Build Coastguard Worker }
455*15dc779aSAndroid Build Coastguard Worker }
456*15dc779aSAndroid Build Coastguard Worker
malloc_global(UWORD32 size,UWORD32 alignment)457*15dc779aSAndroid Build Coastguard Worker pVOID malloc_global(UWORD32 size, UWORD32 alignment) {
458*15dc779aSAndroid Build Coastguard Worker #ifdef WIN32
459*15dc779aSAndroid Build Coastguard Worker return _aligned_malloc(size, alignment);
460*15dc779aSAndroid Build Coastguard Worker #else
461*15dc779aSAndroid Build Coastguard Worker pVOID ptr = NULL;
462*15dc779aSAndroid Build Coastguard Worker if (posix_memalign((VOID **)&ptr, alignment, size)) {
463*15dc779aSAndroid Build Coastguard Worker ptr = NULL;
464*15dc779aSAndroid Build Coastguard Worker }
465*15dc779aSAndroid Build Coastguard Worker return ptr;
466*15dc779aSAndroid Build Coastguard Worker #endif
467*15dc779aSAndroid Build Coastguard Worker }
468*15dc779aSAndroid Build Coastguard Worker
free_global(pVOID ptr)469*15dc779aSAndroid Build Coastguard Worker VOID free_global(pVOID ptr) {
470*15dc779aSAndroid Build Coastguard Worker #ifdef WIN32
471*15dc779aSAndroid Build Coastguard Worker _aligned_free(ptr);
472*15dc779aSAndroid Build Coastguard Worker #else
473*15dc779aSAndroid Build Coastguard Worker free(ptr);
474*15dc779aSAndroid Build Coastguard Worker #endif
475*15dc779aSAndroid Build Coastguard Worker ptr = NULL;
476*15dc779aSAndroid Build Coastguard Worker }
477*15dc779aSAndroid Build Coastguard Worker
iaace_aac_set_default_config(ixheaace_aac_enc_config * config)478*15dc779aSAndroid Build Coastguard Worker static VOID iaace_aac_set_default_config(ixheaace_aac_enc_config *config) {
479*15dc779aSAndroid Build Coastguard Worker /* make the pre initialization of the structs flexible */
480*15dc779aSAndroid Build Coastguard Worker memset(config, 0, sizeof(*config));
481*15dc779aSAndroid Build Coastguard Worker
482*15dc779aSAndroid Build Coastguard Worker /* default configurations */
483*15dc779aSAndroid Build Coastguard Worker config->bitrate = 48000;
484*15dc779aSAndroid Build Coastguard Worker config->bandwidth = 0;
485*15dc779aSAndroid Build Coastguard Worker config->inv_quant = 2;
486*15dc779aSAndroid Build Coastguard Worker config->use_tns = 0;
487*15dc779aSAndroid Build Coastguard Worker config->noise_filling = 0;
488*15dc779aSAndroid Build Coastguard Worker config->bitreservoir_size = APP_BITRES_SIZE_CONFIG_PARAM_DEF_VALUE_LC;
489*15dc779aSAndroid Build Coastguard Worker }
490*15dc779aSAndroid Build Coastguard Worker
ixheaace_print_drc_config_params(ixheaace_input_config * pstr_input_config,ixheaace_input_config * pstr_input_config_user)491*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_print_drc_config_params(ixheaace_input_config *pstr_input_config,
492*15dc779aSAndroid Build Coastguard Worker ixheaace_input_config *pstr_input_config_user) {
493*15dc779aSAndroid Build Coastguard Worker WORD32 flag = 0, i, j, k;
494*15dc779aSAndroid Build Coastguard Worker ia_drc_input_config *drc_cfg = (ia_drc_input_config *)(pstr_input_config->pv_drc_cfg);
495*15dc779aSAndroid Build Coastguard Worker ia_drc_input_config *drc_cfg_user = (ia_drc_input_config *)(pstr_input_config_user->pv_drc_cfg);
496*15dc779aSAndroid Build Coastguard Worker
497*15dc779aSAndroid Build Coastguard Worker ia_drc_uni_drc_config_struct *pstr_uni_drc_config = &drc_cfg->str_uni_drc_config;
498*15dc779aSAndroid Build Coastguard Worker ia_drc_uni_drc_config_struct *pstr_uni_drc_config_user = &drc_cfg_user->str_uni_drc_config;
499*15dc779aSAndroid Build Coastguard Worker
500*15dc779aSAndroid Build Coastguard Worker ia_drc_loudness_info_set_struct *pstr_enc_loudness_info_set =
501*15dc779aSAndroid Build Coastguard Worker &drc_cfg->str_enc_loudness_info_set;
502*15dc779aSAndroid Build Coastguard Worker ia_drc_loudness_info_set_struct *pstr_enc_loudness_info_set_user =
503*15dc779aSAndroid Build Coastguard Worker &drc_cfg_user->str_enc_loudness_info_set;
504*15dc779aSAndroid Build Coastguard Worker
505*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_uni_drc_config->drc_instructions_uni_drc_count; i++) {
506*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].additional_downmix_id_count !=
507*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].additional_downmix_id_count) {
508*15dc779aSAndroid Build Coastguard Worker flag = 1;
509*15dc779aSAndroid Build Coastguard Worker }
510*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].drc_location !=
511*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].drc_location) {
512*15dc779aSAndroid Build Coastguard Worker flag = 1;
513*15dc779aSAndroid Build Coastguard Worker }
514*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i]
515*15dc779aSAndroid Build Coastguard Worker .drc_set_target_loudness_value_upper !=
516*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i]
517*15dc779aSAndroid Build Coastguard Worker .drc_set_target_loudness_value_upper) {
518*15dc779aSAndroid Build Coastguard Worker flag = 1;
519*15dc779aSAndroid Build Coastguard Worker }
520*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i]
521*15dc779aSAndroid Build Coastguard Worker .drc_set_target_loudness_value_lower !=
522*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i]
523*15dc779aSAndroid Build Coastguard Worker .drc_set_target_loudness_value_lower) {
524*15dc779aSAndroid Build Coastguard Worker flag = 1;
525*15dc779aSAndroid Build Coastguard Worker }
526*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i]
527*15dc779aSAndroid Build Coastguard Worker .drc_set_target_loudness_value_lower !=
528*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i]
529*15dc779aSAndroid Build Coastguard Worker .drc_set_target_loudness_value_lower) {
530*15dc779aSAndroid Build Coastguard Worker flag = 1;
531*15dc779aSAndroid Build Coastguard Worker }
532*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < MAX_CHANNEL_COUNT; j++) {
533*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].gain_set_index[j] !=
534*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].gain_set_index[j]) {
535*15dc779aSAndroid Build Coastguard Worker flag = 1;
536*15dc779aSAndroid Build Coastguard Worker }
537*15dc779aSAndroid Build Coastguard Worker }
538*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].num_drc_channel_groups !=
539*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].num_drc_channel_groups) {
540*15dc779aSAndroid Build Coastguard Worker flag = 1;
541*15dc779aSAndroid Build Coastguard Worker }
542*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_uni_drc_config->str_drc_instructions_uni_drc[i].num_drc_channel_groups;
543*15dc779aSAndroid Build Coastguard Worker j++) {
544*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i]
545*15dc779aSAndroid Build Coastguard Worker .str_gain_modifiers[j]
546*15dc779aSAndroid Build Coastguard Worker .attenuation_scaling[0] != pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i]
547*15dc779aSAndroid Build Coastguard Worker .str_gain_modifiers[j]
548*15dc779aSAndroid Build Coastguard Worker .attenuation_scaling[0]) {
549*15dc779aSAndroid Build Coastguard Worker flag = 1;
550*15dc779aSAndroid Build Coastguard Worker }
551*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i]
552*15dc779aSAndroid Build Coastguard Worker .str_gain_modifiers[j]
553*15dc779aSAndroid Build Coastguard Worker .amplification_scaling[0] !=
554*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i]
555*15dc779aSAndroid Build Coastguard Worker .str_gain_modifiers[j]
556*15dc779aSAndroid Build Coastguard Worker .amplification_scaling[0]) {
557*15dc779aSAndroid Build Coastguard Worker flag = 1;
558*15dc779aSAndroid Build Coastguard Worker }
559*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i]
560*15dc779aSAndroid Build Coastguard Worker .str_gain_modifiers[j]
561*15dc779aSAndroid Build Coastguard Worker .gain_offset[0] != pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i]
562*15dc779aSAndroid Build Coastguard Worker .str_gain_modifiers[j]
563*15dc779aSAndroid Build Coastguard Worker .gain_offset[0]) {
564*15dc779aSAndroid Build Coastguard Worker flag = 1;
565*15dc779aSAndroid Build Coastguard Worker }
566*15dc779aSAndroid Build Coastguard Worker }
567*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].limiter_peak_target !=
568*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].limiter_peak_target) {
569*15dc779aSAndroid Build Coastguard Worker flag = 1;
570*15dc779aSAndroid Build Coastguard Worker }
571*15dc779aSAndroid Build Coastguard Worker }
572*15dc779aSAndroid Build Coastguard Worker if (flag == 1) {
573*15dc779aSAndroid Build Coastguard Worker printf("\nDRC : Invalid config str_drc_instructions_uni_drc");
574*15dc779aSAndroid Build Coastguard Worker flag = 0;
575*15dc779aSAndroid Build Coastguard Worker }
576*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_uni_drc_config->drc_coefficients_uni_drc_count; i++) {
577*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i].drc_location !=
578*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i].drc_location) {
579*15dc779aSAndroid Build Coastguard Worker flag = 1;
580*15dc779aSAndroid Build Coastguard Worker }
581*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i].gain_set_count !=
582*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i].gain_set_count) {
583*15dc779aSAndroid Build Coastguard Worker flag = 1;
584*15dc779aSAndroid Build Coastguard Worker }
585*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_uni_drc_config->str_drc_coefficients_uni_drc[i].gain_set_count; j++) {
586*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]
587*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
588*15dc779aSAndroid Build Coastguard Worker .gain_coding_profile != pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i]
589*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
590*15dc779aSAndroid Build Coastguard Worker .gain_coding_profile) {
591*15dc779aSAndroid Build Coastguard Worker flag = 1;
592*15dc779aSAndroid Build Coastguard Worker }
593*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]
594*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
595*15dc779aSAndroid Build Coastguard Worker .band_count != pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i]
596*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
597*15dc779aSAndroid Build Coastguard Worker .band_count) {
598*15dc779aSAndroid Build Coastguard Worker flag = 1;
599*15dc779aSAndroid Build Coastguard Worker }
600*15dc779aSAndroid Build Coastguard Worker for (k = 0;
601*15dc779aSAndroid Build Coastguard Worker k <
602*15dc779aSAndroid Build Coastguard Worker pstr_uni_drc_config->str_drc_coefficients_uni_drc[i].str_gain_set_params[j].band_count;
603*15dc779aSAndroid Build Coastguard Worker k++) {
604*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]
605*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
606*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
607*15dc779aSAndroid Build Coastguard Worker .nb_points != pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i]
608*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
609*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
610*15dc779aSAndroid Build Coastguard Worker .nb_points) {
611*15dc779aSAndroid Build Coastguard Worker flag = 1;
612*15dc779aSAndroid Build Coastguard Worker }
613*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]
614*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
615*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
616*15dc779aSAndroid Build Coastguard Worker .drc_characteristic != pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i]
617*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
618*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
619*15dc779aSAndroid Build Coastguard Worker .drc_characteristic) {
620*15dc779aSAndroid Build Coastguard Worker flag = 1;
621*15dc779aSAndroid Build Coastguard Worker }
622*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]
623*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
624*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
625*15dc779aSAndroid Build Coastguard Worker .crossover_freq_index != pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i]
626*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
627*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
628*15dc779aSAndroid Build Coastguard Worker .crossover_freq_index) {
629*15dc779aSAndroid Build Coastguard Worker flag = 1;
630*15dc779aSAndroid Build Coastguard Worker }
631*15dc779aSAndroid Build Coastguard Worker if (pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]
632*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
633*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
634*15dc779aSAndroid Build Coastguard Worker .start_sub_band_index != pstr_uni_drc_config_user->str_drc_coefficients_uni_drc[i]
635*15dc779aSAndroid Build Coastguard Worker .str_gain_set_params[j]
636*15dc779aSAndroid Build Coastguard Worker .gain_params[k]
637*15dc779aSAndroid Build Coastguard Worker .start_sub_band_index) {
638*15dc779aSAndroid Build Coastguard Worker flag = 1;
639*15dc779aSAndroid Build Coastguard Worker }
640*15dc779aSAndroid Build Coastguard Worker }
641*15dc779aSAndroid Build Coastguard Worker }
642*15dc779aSAndroid Build Coastguard Worker }
643*15dc779aSAndroid Build Coastguard Worker if (flag == 1) {
644*15dc779aSAndroid Build Coastguard Worker printf("\nDRC : Invalid config: str_drc_coefficients_uni_drc");
645*15dc779aSAndroid Build Coastguard Worker flag = 0;
646*15dc779aSAndroid Build Coastguard Worker }
647*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_enc_loudness_info_set->loudness_info_count; i++) {
648*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i].sample_peak_level !=
649*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info[i].sample_peak_level) {
650*15dc779aSAndroid Build Coastguard Worker flag = 1;
651*15dc779aSAndroid Build Coastguard Worker }
652*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i].true_peak_level !=
653*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info[i].true_peak_level) {
654*15dc779aSAndroid Build Coastguard Worker flag = 1;
655*15dc779aSAndroid Build Coastguard Worker }
656*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i].true_peak_level_measurement_system !=
657*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info[i]
658*15dc779aSAndroid Build Coastguard Worker .true_peak_level_measurement_system) {
659*15dc779aSAndroid Build Coastguard Worker flag = 1;
660*15dc779aSAndroid Build Coastguard Worker }
661*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i].true_peak_level_reliability !=
662*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info[i].true_peak_level_reliability) {
663*15dc779aSAndroid Build Coastguard Worker flag = 1;
664*15dc779aSAndroid Build Coastguard Worker }
665*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i].measurement_count !=
666*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info[i].measurement_count) {
667*15dc779aSAndroid Build Coastguard Worker flag = 1;
668*15dc779aSAndroid Build Coastguard Worker }
669*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_enc_loudness_info_set->str_loudness_info[i].measurement_count; j++) {
670*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i]
671*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
672*15dc779aSAndroid Build Coastguard Worker .method_definition != pstr_enc_loudness_info_set_user->str_loudness_info[i]
673*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
674*15dc779aSAndroid Build Coastguard Worker .method_definition) {
675*15dc779aSAndroid Build Coastguard Worker flag = 1;
676*15dc779aSAndroid Build Coastguard Worker }
677*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i].str_loudness_measure[j].method_value !=
678*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info[i]
679*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
680*15dc779aSAndroid Build Coastguard Worker .method_value) {
681*15dc779aSAndroid Build Coastguard Worker flag = 1;
682*15dc779aSAndroid Build Coastguard Worker }
683*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i]
684*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
685*15dc779aSAndroid Build Coastguard Worker .measurement_system != pstr_enc_loudness_info_set_user->str_loudness_info[i]
686*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
687*15dc779aSAndroid Build Coastguard Worker .measurement_system) {
688*15dc779aSAndroid Build Coastguard Worker flag = 1;
689*15dc779aSAndroid Build Coastguard Worker }
690*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info[i].str_loudness_measure[j].reliability !=
691*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info[i]
692*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
693*15dc779aSAndroid Build Coastguard Worker .reliability) {
694*15dc779aSAndroid Build Coastguard Worker flag = 1;
695*15dc779aSAndroid Build Coastguard Worker }
696*15dc779aSAndroid Build Coastguard Worker }
697*15dc779aSAndroid Build Coastguard Worker }
698*15dc779aSAndroid Build Coastguard Worker if (flag == 1) {
699*15dc779aSAndroid Build Coastguard Worker printf("\nDRC : Invalid config str_loudness_info");
700*15dc779aSAndroid Build Coastguard Worker flag = 0;
701*15dc779aSAndroid Build Coastguard Worker }
702*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_enc_loudness_info_set->loudness_info_album_count; i++) {
703*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i].sample_peak_level !=
704*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info_album[i].sample_peak_level) {
705*15dc779aSAndroid Build Coastguard Worker flag = 1;
706*15dc779aSAndroid Build Coastguard Worker }
707*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i].true_peak_level !=
708*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info_album[i].true_peak_level) {
709*15dc779aSAndroid Build Coastguard Worker flag = 1;
710*15dc779aSAndroid Build Coastguard Worker }
711*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i]
712*15dc779aSAndroid Build Coastguard Worker .true_peak_level_measurement_system !=
713*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info_album[i]
714*15dc779aSAndroid Build Coastguard Worker .true_peak_level_measurement_system) {
715*15dc779aSAndroid Build Coastguard Worker flag = 1;
716*15dc779aSAndroid Build Coastguard Worker }
717*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i].true_peak_level_reliability !=
718*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info_album[i].true_peak_level_reliability) {
719*15dc779aSAndroid Build Coastguard Worker flag = 1;
720*15dc779aSAndroid Build Coastguard Worker }
721*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i].measurement_count !=
722*15dc779aSAndroid Build Coastguard Worker pstr_enc_loudness_info_set_user->str_loudness_info_album[i].measurement_count) {
723*15dc779aSAndroid Build Coastguard Worker flag = 1;
724*15dc779aSAndroid Build Coastguard Worker }
725*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < pstr_enc_loudness_info_set->str_loudness_info_album[i].measurement_count;
726*15dc779aSAndroid Build Coastguard Worker j++) {
727*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i]
728*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
729*15dc779aSAndroid Build Coastguard Worker .method_definition != pstr_enc_loudness_info_set_user->str_loudness_info_album[i]
730*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
731*15dc779aSAndroid Build Coastguard Worker .method_definition) {
732*15dc779aSAndroid Build Coastguard Worker flag = 1;
733*15dc779aSAndroid Build Coastguard Worker }
734*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i]
735*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
736*15dc779aSAndroid Build Coastguard Worker .method_value != pstr_enc_loudness_info_set_user->str_loudness_info_album[i]
737*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
738*15dc779aSAndroid Build Coastguard Worker .method_value) {
739*15dc779aSAndroid Build Coastguard Worker flag = 1;
740*15dc779aSAndroid Build Coastguard Worker }
741*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i]
742*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
743*15dc779aSAndroid Build Coastguard Worker .measurement_system != pstr_enc_loudness_info_set_user->str_loudness_info_album[i]
744*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
745*15dc779aSAndroid Build Coastguard Worker .measurement_system) {
746*15dc779aSAndroid Build Coastguard Worker flag = 1;
747*15dc779aSAndroid Build Coastguard Worker }
748*15dc779aSAndroid Build Coastguard Worker if (pstr_enc_loudness_info_set->str_loudness_info_album[i]
749*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
750*15dc779aSAndroid Build Coastguard Worker .reliability != pstr_enc_loudness_info_set_user->str_loudness_info_album[i]
751*15dc779aSAndroid Build Coastguard Worker .str_loudness_measure[j]
752*15dc779aSAndroid Build Coastguard Worker .reliability) {
753*15dc779aSAndroid Build Coastguard Worker flag = 1;
754*15dc779aSAndroid Build Coastguard Worker }
755*15dc779aSAndroid Build Coastguard Worker }
756*15dc779aSAndroid Build Coastguard Worker }
757*15dc779aSAndroid Build Coastguard Worker if (flag == 1) {
758*15dc779aSAndroid Build Coastguard Worker printf("\nDRC : Invalid config str_loudness_info_album");
759*15dc779aSAndroid Build Coastguard Worker }
760*15dc779aSAndroid Build Coastguard Worker }
761*15dc779aSAndroid Build Coastguard Worker
ixheaace_print_config_params(ixheaace_input_config * pstr_input_config,ixheaace_input_config * pstr_input_config_user)762*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_print_config_params(ixheaace_input_config *pstr_input_config,
763*15dc779aSAndroid Build Coastguard Worker ixheaace_input_config *pstr_input_config_user) {
764*15dc779aSAndroid Build Coastguard Worker printf(
765*15dc779aSAndroid Build Coastguard Worker "\n*************************************************************************************"
766*15dc779aSAndroid Build Coastguard Worker "***********\n");
767*15dc779aSAndroid Build Coastguard Worker printf("\nParameters Taken:\n");
768*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->aot == pstr_input_config->aot) {
769*15dc779aSAndroid Build Coastguard Worker printf("\nAOT : %d", pstr_input_config->aot);
770*15dc779aSAndroid Build Coastguard Worker } else {
771*15dc779aSAndroid Build Coastguard Worker printf("\nAOT (Invalid config value, setting to default) : %d", pstr_input_config->aot);
772*15dc779aSAndroid Build Coastguard Worker }
773*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->aot == AOT_AAC_LC) {
774*15dc779aSAndroid Build Coastguard Worker printf(" - AAC LC ");
775*15dc779aSAndroid Build Coastguard Worker } else if (pstr_input_config->aot == AOT_SBR) {
776*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->esbr_flag == 1) {
777*15dc779aSAndroid Build Coastguard Worker printf(" - HEAACv1 (eSBR) ");
778*15dc779aSAndroid Build Coastguard Worker } else {
779*15dc779aSAndroid Build Coastguard Worker printf(" - HEAACv1 (Legacy SBR) ");
780*15dc779aSAndroid Build Coastguard Worker }
781*15dc779aSAndroid Build Coastguard Worker } else if (pstr_input_config->aot == AOT_AAC_ELD) {
782*15dc779aSAndroid Build Coastguard Worker printf(" - AAC ELD");
783*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->i_use_mps == 1) {
784*15dc779aSAndroid Build Coastguard Worker printf("v2");
785*15dc779aSAndroid Build Coastguard Worker }
786*15dc779aSAndroid Build Coastguard Worker } else if (pstr_input_config->aot == AOT_AAC_LD) {
787*15dc779aSAndroid Build Coastguard Worker printf(" - AAC LD ");
788*15dc779aSAndroid Build Coastguard Worker } else if (pstr_input_config->aot == AOT_USAC) {
789*15dc779aSAndroid Build Coastguard Worker printf(" - USAC ");
790*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->i_use_mps == 1) {
791*15dc779aSAndroid Build Coastguard Worker printf(" MPS ");
792*15dc779aSAndroid Build Coastguard Worker }
793*15dc779aSAndroid Build Coastguard Worker } else if (pstr_input_config->aot == AOT_PS) {
794*15dc779aSAndroid Build Coastguard Worker printf(" - HEAACv2 ");
795*15dc779aSAndroid Build Coastguard Worker }
796*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->aot == AOT_PS || pstr_input_config->aot == AOT_SBR) {
797*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->esbr_flag == pstr_input_config->esbr_flag) {
798*15dc779aSAndroid Build Coastguard Worker printf("\nESBR Flag : %d", pstr_input_config->esbr_flag);
799*15dc779aSAndroid Build Coastguard Worker } else {
800*15dc779aSAndroid Build Coastguard Worker printf("\nESBR Flag (Invalid config value, setting to default) : %d",
801*15dc779aSAndroid Build Coastguard Worker pstr_input_config->esbr_flag);
802*15dc779aSAndroid Build Coastguard Worker }
803*15dc779aSAndroid Build Coastguard Worker }
804*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->aot == AOT_USAC) {
805*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->codec_mode == pstr_input_config->codec_mode) {
806*15dc779aSAndroid Build Coastguard Worker printf("\nUSAC Codec Mode : ");
807*15dc779aSAndroid Build Coastguard Worker } else {
808*15dc779aSAndroid Build Coastguard Worker printf("\nUSAC Codec Mode (Invalid config value, setting to default) : ");
809*15dc779aSAndroid Build Coastguard Worker }
810*15dc779aSAndroid Build Coastguard Worker
811*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->usac_en) {
812*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->codec_mode == USAC_SWITCHED) {
813*15dc779aSAndroid Build Coastguard Worker printf("Switched Mode");
814*15dc779aSAndroid Build Coastguard Worker } else if (pstr_input_config->codec_mode == USAC_ONLY_FD) {
815*15dc779aSAndroid Build Coastguard Worker printf("FD Mode");
816*15dc779aSAndroid Build Coastguard Worker } else if (pstr_input_config->codec_mode == USAC_ONLY_TD) {
817*15dc779aSAndroid Build Coastguard Worker printf("TD Mode");
818*15dc779aSAndroid Build Coastguard Worker }
819*15dc779aSAndroid Build Coastguard Worker } else {
820*15dc779aSAndroid Build Coastguard Worker printf("Not Enabled");
821*15dc779aSAndroid Build Coastguard Worker }
822*15dc779aSAndroid Build Coastguard Worker }
823*15dc779aSAndroid Build Coastguard Worker
824*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->aot == AOT_USAC) {
825*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->harmonic_sbr == pstr_input_config->harmonic_sbr) {
826*15dc779aSAndroid Build Coastguard Worker printf("\nHarmonic SBR : %d", pstr_input_config->harmonic_sbr);
827*15dc779aSAndroid Build Coastguard Worker } else {
828*15dc779aSAndroid Build Coastguard Worker printf("\nHarmonic SBR (Invalid config value, setting to default) : %d",
829*15dc779aSAndroid Build Coastguard Worker pstr_input_config->harmonic_sbr);
830*15dc779aSAndroid Build Coastguard Worker }
831*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->hq_esbr == pstr_input_config->hq_esbr) {
832*15dc779aSAndroid Build Coastguard Worker printf("\nHigh quality esbr : %d", pstr_input_config->hq_esbr);
833*15dc779aSAndroid Build Coastguard Worker } else {
834*15dc779aSAndroid Build Coastguard Worker printf("\nHigh quality esbr Flag (Invalid config value, setting to default) : %d",
835*15dc779aSAndroid Build Coastguard Worker pstr_input_config->hq_esbr);
836*15dc779aSAndroid Build Coastguard Worker }
837*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->cplx_pred == pstr_input_config->cplx_pred) {
838*15dc779aSAndroid Build Coastguard Worker printf("\nComplex Prediction Flag : %d", pstr_input_config->cplx_pred);
839*15dc779aSAndroid Build Coastguard Worker } else {
840*15dc779aSAndroid Build Coastguard Worker printf("\nComplex Prediction Flag (Invalid config value, setting to default) : %d",
841*15dc779aSAndroid Build Coastguard Worker pstr_input_config->cplx_pred);
842*15dc779aSAndroid Build Coastguard Worker }
843*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->aac_config.use_tns == pstr_input_config->aac_config.use_tns) {
844*15dc779aSAndroid Build Coastguard Worker printf("\nTNS Flag : %d", pstr_input_config->aac_config.use_tns);
845*15dc779aSAndroid Build Coastguard Worker } else {
846*15dc779aSAndroid Build Coastguard Worker printf("\nTNS Flag (Invalid config value, setting to default) : %d",
847*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.use_tns);
848*15dc779aSAndroid Build Coastguard Worker }
849*15dc779aSAndroid Build Coastguard Worker
850*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->ccfl_idx == pstr_input_config->ccfl_idx) {
851*15dc779aSAndroid Build Coastguard Worker printf("\nCore-coder framelength index : %d", pstr_input_config->ccfl_idx);
852*15dc779aSAndroid Build Coastguard Worker } else {
853*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->ccfl_idx >= NO_SBR_CCFL_768 &&
854*15dc779aSAndroid Build Coastguard Worker pstr_input_config_user->ccfl_idx <= SBR_4_1) {
855*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->ccfl_idx == NO_SBR_CCFL_768 &&
856*15dc779aSAndroid Build Coastguard Worker pstr_input_config->ccfl_idx == SBR_8_3) {
857*15dc779aSAndroid Build Coastguard Worker printf(
858*15dc779aSAndroid Build Coastguard Worker "\nCore-coder framelength index (Unsupported configuration, enabling 8:3 eSBR) : "
859*15dc779aSAndroid Build Coastguard Worker "%d",
860*15dc779aSAndroid Build Coastguard Worker pstr_input_config->ccfl_idx);
861*15dc779aSAndroid Build Coastguard Worker }
862*15dc779aSAndroid Build Coastguard Worker else if (pstr_input_config_user->ccfl_idx == NO_SBR_CCFL_1024 &&
863*15dc779aSAndroid Build Coastguard Worker pstr_input_config->ccfl_idx == SBR_2_1) {
864*15dc779aSAndroid Build Coastguard Worker printf(
865*15dc779aSAndroid Build Coastguard Worker "\nCore-coder framelength index (Unsupported configuration, enabling 2:1 eSBR) : "
866*15dc779aSAndroid Build Coastguard Worker "%d",
867*15dc779aSAndroid Build Coastguard Worker pstr_input_config->ccfl_idx);
868*15dc779aSAndroid Build Coastguard Worker }
869*15dc779aSAndroid Build Coastguard Worker else if (pstr_input_config_user->ccfl_idx != pstr_input_config->ccfl_idx)
870*15dc779aSAndroid Build Coastguard Worker {
871*15dc779aSAndroid Build Coastguard Worker printf(
872*15dc779aSAndroid Build Coastguard Worker "\nCore-coder framelength index changed from %d to %d ",
873*15dc779aSAndroid Build Coastguard Worker pstr_input_config_user->ccfl_idx, pstr_input_config->ccfl_idx);
874*15dc779aSAndroid Build Coastguard Worker }
875*15dc779aSAndroid Build Coastguard Worker } else {
876*15dc779aSAndroid Build Coastguard Worker printf(
877*15dc779aSAndroid Build Coastguard Worker "\nCore-coder framelength index (Invalid input config value, setting to default): %d"
878*15dc779aSAndroid Build Coastguard Worker , pstr_input_config->ccfl_idx);
879*15dc779aSAndroid Build Coastguard Worker }
880*15dc779aSAndroid Build Coastguard Worker }
881*15dc779aSAndroid Build Coastguard Worker }
882*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->aac_config.noise_filling ==
883*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.noise_filling) {
884*15dc779aSAndroid Build Coastguard Worker printf("\nNoise Filling Flag : %d", pstr_input_config->aac_config.noise_filling);
885*15dc779aSAndroid Build Coastguard Worker } else {
886*15dc779aSAndroid Build Coastguard Worker printf("\nNoise Filling Flag (Invalid config value, setting to default) : %d",
887*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.noise_filling);
888*15dc779aSAndroid Build Coastguard Worker }
889*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->i_use_adts == pstr_input_config->i_use_adts) {
890*15dc779aSAndroid Build Coastguard Worker printf("\nUse ADTS Flag : %d", pstr_input_config->i_use_adts);
891*15dc779aSAndroid Build Coastguard Worker } else {
892*15dc779aSAndroid Build Coastguard Worker printf("\nUse ADTS Flag (Invalid config value, setting to default) : %d",
893*15dc779aSAndroid Build Coastguard Worker pstr_input_config->i_use_adts);
894*15dc779aSAndroid Build Coastguard Worker }
895*15dc779aSAndroid Build Coastguard Worker
896*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->aot != AOT_USAC) {
897*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->aac_config.full_bandwidth ==
898*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.full_bandwidth) {
899*15dc779aSAndroid Build Coastguard Worker printf("\nFull Bandwidth Flag : %d", pstr_input_config->aac_config.full_bandwidth);
900*15dc779aSAndroid Build Coastguard Worker } else {
901*15dc779aSAndroid Build Coastguard Worker printf("\nFull Bandwidth Flag (Invalid config value, setting to default) : %d",
902*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.full_bandwidth);
903*15dc779aSAndroid Build Coastguard Worker }
904*15dc779aSAndroid Build Coastguard Worker }
905*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->aac_config.use_tns == pstr_input_config->aac_config.use_tns) {
906*15dc779aSAndroid Build Coastguard Worker printf("\nUse TNS Flag : %d", pstr_input_config->aac_config.use_tns);
907*15dc779aSAndroid Build Coastguard Worker } else {
908*15dc779aSAndroid Build Coastguard Worker printf("\nUse TNS Flag (Invalid config value, setting to default) : %d",
909*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.use_tns);
910*15dc779aSAndroid Build Coastguard Worker }
911*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->aot == AOT_AAC_LD || pstr_input_config->aot == AOT_AAC_ELD) {
912*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->aac_config.bitreservoir_size ==
913*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.bitreservoir_size) {
914*15dc779aSAndroid Build Coastguard Worker printf("\nBitreservoir Size : %d", pstr_input_config->aac_config.bitreservoir_size);
915*15dc779aSAndroid Build Coastguard Worker } else {
916*15dc779aSAndroid Build Coastguard Worker printf("\nBitreservoir Size (Invalid config value, setting to default) : %d",
917*15dc779aSAndroid Build Coastguard Worker pstr_input_config->aac_config.bitreservoir_size);
918*15dc779aSAndroid Build Coastguard Worker }
919*15dc779aSAndroid Build Coastguard Worker }
920*15dc779aSAndroid Build Coastguard Worker
921*15dc779aSAndroid Build Coastguard Worker printf("\nBitrate : %d bps", pstr_input_config->i_bitrate);
922*15dc779aSAndroid Build Coastguard Worker
923*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->i_use_mps != pstr_input_config->i_use_mps) {
924*15dc779aSAndroid Build Coastguard Worker printf("\nMPS (Invalid config value, setting to default) : %d ",
925*15dc779aSAndroid Build Coastguard Worker pstr_input_config->i_use_mps);
926*15dc779aSAndroid Build Coastguard Worker }
927*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->i_use_mps) {
928*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->i_mps_tree_config == pstr_input_config->i_mps_tree_config) {
929*15dc779aSAndroid Build Coastguard Worker printf("\nTree config : %d ", pstr_input_config->i_mps_tree_config);
930*15dc779aSAndroid Build Coastguard Worker } else {
931*15dc779aSAndroid Build Coastguard Worker printf("\nTree config (Invalid tree config value, setting to default) : %d ",
932*15dc779aSAndroid Build Coastguard Worker pstr_input_config->i_mps_tree_config);
933*15dc779aSAndroid Build Coastguard Worker }
934*15dc779aSAndroid Build Coastguard Worker } else if (!(pstr_input_config->i_use_mps) && (pstr_input_config_user->i_mps_tree_config !=
935*15dc779aSAndroid Build Coastguard Worker pstr_input_config->i_mps_tree_config)) {
936*15dc779aSAndroid Build Coastguard Worker printf("\nTree config (Invalid tree config value ) : %d ",
937*15dc779aSAndroid Build Coastguard Worker pstr_input_config->i_mps_tree_config);
938*15dc779aSAndroid Build Coastguard Worker }
939*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->frame_cmd_flag) {
940*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config_user->frame_length == pstr_input_config->frame_length) {
941*15dc779aSAndroid Build Coastguard Worker printf("\nFrame Length : %d", pstr_input_config->frame_length);
942*15dc779aSAndroid Build Coastguard Worker } else {
943*15dc779aSAndroid Build Coastguard Worker printf("\nFrame Length (Invalid config value, setting to default) : %d",
944*15dc779aSAndroid Build Coastguard Worker pstr_input_config->frame_length);
945*15dc779aSAndroid Build Coastguard Worker }
946*15dc779aSAndroid Build Coastguard Worker } else {
947*15dc779aSAndroid Build Coastguard Worker printf("\nFrame Length : %d", pstr_input_config->frame_length);
948*15dc779aSAndroid Build Coastguard Worker }
949*15dc779aSAndroid Build Coastguard Worker if ((pstr_input_config_user->i_samp_freq != pstr_input_config->i_samp_freq) &&
950*15dc779aSAndroid Build Coastguard Worker (pstr_input_config->i_use_adts == 1)) {
951*15dc779aSAndroid Build Coastguard Worker printf(
952*15dc779aSAndroid Build Coastguard Worker "\nSampling Frequency (With adts:1, Setting non-standard Sampling Frequency to mapped "
953*15dc779aSAndroid Build Coastguard Worker "standard Sampling Frequency) : %d Hz",
954*15dc779aSAndroid Build Coastguard Worker pstr_input_config->i_samp_freq);
955*15dc779aSAndroid Build Coastguard Worker } else {
956*15dc779aSAndroid Build Coastguard Worker printf("\nSampling Frequency : %d Hz", pstr_input_config_user->i_samp_freq);
957*15dc779aSAndroid Build Coastguard Worker }
958*15dc779aSAndroid Build Coastguard Worker
959*15dc779aSAndroid Build Coastguard Worker // DRC validation
960*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->aot == AOT_USAC) {
961*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->use_drc_element != pstr_input_config_user->use_drc_element) {
962*15dc779aSAndroid Build Coastguard Worker printf("\nDRC (Invalid config value, setting to default) : %d",
963*15dc779aSAndroid Build Coastguard Worker pstr_input_config->use_drc_element);
964*15dc779aSAndroid Build Coastguard Worker }
965*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->use_drc_element) {
966*15dc779aSAndroid Build Coastguard Worker printf("\nDRC : 1");
967*15dc779aSAndroid Build Coastguard Worker ixheaace_print_drc_config_params(pstr_input_config, pstr_input_config_user);
968*15dc779aSAndroid Build Coastguard Worker }
969*15dc779aSAndroid Build Coastguard Worker
970*15dc779aSAndroid Build Coastguard Worker if (pstr_input_config->random_access_interval !=
971*15dc779aSAndroid Build Coastguard Worker pstr_input_config_user->random_access_interval) {
972*15dc779aSAndroid Build Coastguard Worker printf("\nRandom access interval (Invalid config value, setting to default) : %d",
973*15dc779aSAndroid Build Coastguard Worker pstr_input_config->random_access_interval);
974*15dc779aSAndroid Build Coastguard Worker }
975*15dc779aSAndroid Build Coastguard Worker }
976*15dc779aSAndroid Build Coastguard Worker
977*15dc779aSAndroid Build Coastguard Worker printf(
978*15dc779aSAndroid Build Coastguard Worker "\n*************************************************************************************"
979*15dc779aSAndroid Build Coastguard Worker "***********\n\n");
980*15dc779aSAndroid Build Coastguard Worker }
981*15dc779aSAndroid Build Coastguard Worker
ixheaace_calculate_loudness_measure(ixheaace_input_config * pstr_in_cfg,ixheaace_output_config * pstr_out_cfg,FILE * in_file)982*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_calculate_loudness_measure(ixheaace_input_config *pstr_in_cfg,
983*15dc779aSAndroid Build Coastguard Worker ixheaace_output_config *pstr_out_cfg,
984*15dc779aSAndroid Build Coastguard Worker FILE *in_file) {
985*15dc779aSAndroid Build Coastguard Worker WORD32 temp_pos, input_size;
986*15dc779aSAndroid Build Coastguard Worker WORD32 count = 0;
987*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
988*15dc779aSAndroid Build Coastguard Worker temp_pos = ftell(in_file);
989*15dc779aSAndroid Build Coastguard Worker VOID *loudness_handle =
990*15dc779aSAndroid Build Coastguard Worker malloc_global(ixheaace_loudness_info_get_handle_size(), DEFAULT_MEM_ALIGN_8);
991*15dc779aSAndroid Build Coastguard Worker if (loudness_handle == NULL) {
992*15dc779aSAndroid Build Coastguard Worker printf("fatal error: libxaac encoder: Memory allocation failed");
993*15dc779aSAndroid Build Coastguard Worker return -1;
994*15dc779aSAndroid Build Coastguard Worker }
995*15dc779aSAndroid Build Coastguard Worker input_size = (pstr_in_cfg->i_samp_freq / 10) * (pstr_in_cfg->i_channels);
996*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_loudness_init_params(loudness_handle, pstr_in_cfg, pstr_out_cfg);
997*15dc779aSAndroid Build Coastguard Worker if (err_code) {
998*15dc779aSAndroid Build Coastguard Worker free_global(loudness_handle);
999*15dc779aSAndroid Build Coastguard Worker return -1;
1000*15dc779aSAndroid Build Coastguard Worker }
1001*15dc779aSAndroid Build Coastguard Worker WORD16 **samples = 0;
1002*15dc779aSAndroid Build Coastguard Worker samples =
1003*15dc779aSAndroid Build Coastguard Worker (WORD16 **)malloc_global(pstr_in_cfg->i_channels * sizeof(*samples), DEFAULT_MEM_ALIGN_8);
1004*15dc779aSAndroid Build Coastguard Worker if (samples == NULL) {
1005*15dc779aSAndroid Build Coastguard Worker printf("fatal error: libxaac encoder: Memory allocation failed");
1006*15dc779aSAndroid Build Coastguard Worker free_global(loudness_handle);
1007*15dc779aSAndroid Build Coastguard Worker return -1;
1008*15dc779aSAndroid Build Coastguard Worker }
1009*15dc779aSAndroid Build Coastguard Worker for (count = 0; count < pstr_in_cfg->i_channels; count++) {
1010*15dc779aSAndroid Build Coastguard Worker samples[count] = (WORD16 *)malloc_global(
1011*15dc779aSAndroid Build Coastguard Worker (pstr_out_cfg->samp_freq / 10) * sizeof(*samples[count]), DEFAULT_MEM_ALIGN_8);
1012*15dc779aSAndroid Build Coastguard Worker if (samples[count] == NULL) {
1013*15dc779aSAndroid Build Coastguard Worker printf("fatal error: libxaac encoder: Memory allocation failed");
1014*15dc779aSAndroid Build Coastguard Worker while (count) {
1015*15dc779aSAndroid Build Coastguard Worker count--;
1016*15dc779aSAndroid Build Coastguard Worker free_global(samples[count]);
1017*15dc779aSAndroid Build Coastguard Worker }
1018*15dc779aSAndroid Build Coastguard Worker free_global(samples);
1019*15dc779aSAndroid Build Coastguard Worker free_global(loudness_handle);
1020*15dc779aSAndroid Build Coastguard Worker return -1;
1021*15dc779aSAndroid Build Coastguard Worker }
1022*15dc779aSAndroid Build Coastguard Worker memset(samples[count], 0, (pstr_out_cfg->samp_freq / 10) * sizeof(*samples[count]));
1023*15dc779aSAndroid Build Coastguard Worker }
1024*15dc779aSAndroid Build Coastguard Worker count = 0;
1025*15dc779aSAndroid Build Coastguard Worker WORD32 no_samples_per_frame = (WORD32)(pstr_out_cfg->samp_freq * 0.1 * pstr_in_cfg->i_channels);
1026*15dc779aSAndroid Build Coastguard Worker while (count <= ((pstr_in_cfg->aac_config.length / 2) - no_samples_per_frame)) {
1027*15dc779aSAndroid Build Coastguard Worker err_code =
1028*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_pcm_data_read(in_file, input_size, pstr_in_cfg->i_channels, samples);
1029*15dc779aSAndroid Build Coastguard Worker if (err_code) {
1030*15dc779aSAndroid Build Coastguard Worker printf("fatal error: libxaac encoder: Reading PCM data failed");
1031*15dc779aSAndroid Build Coastguard Worker for (count = 0; count < pstr_in_cfg->i_channels; count++) {
1032*15dc779aSAndroid Build Coastguard Worker free_global(samples[count]);
1033*15dc779aSAndroid Build Coastguard Worker }
1034*15dc779aSAndroid Build Coastguard Worker free_global(samples);
1035*15dc779aSAndroid Build Coastguard Worker free_global(loudness_handle);
1036*15dc779aSAndroid Build Coastguard Worker return -1;
1037*15dc779aSAndroid Build Coastguard Worker }
1038*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->measured_loudness = ixheaace_measure_loudness(loudness_handle, samples);
1039*15dc779aSAndroid Build Coastguard Worker count += no_samples_per_frame;
1040*15dc779aSAndroid Build Coastguard Worker }
1041*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->method_def == METHOD_DEFINITION_PROGRAM_LOUDNESS) {
1042*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->measured_loudness = ixheaace_measure_integrated_loudness(loudness_handle);
1043*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->sample_peak_level = ixheaace_measure_sample_peak_value(loudness_handle);
1044*15dc779aSAndroid Build Coastguard Worker }
1045*15dc779aSAndroid Build Coastguard Worker fseek(in_file, temp_pos, SEEK_SET);
1046*15dc779aSAndroid Build Coastguard Worker for (count = 0; count < pstr_in_cfg->i_channels; count++) {
1047*15dc779aSAndroid Build Coastguard Worker free_global(samples[count]);
1048*15dc779aSAndroid Build Coastguard Worker }
1049*15dc779aSAndroid Build Coastguard Worker free_global(samples);
1050*15dc779aSAndroid Build Coastguard Worker free_global(loudness_handle);
1051*15dc779aSAndroid Build Coastguard Worker return err_code;
1052*15dc779aSAndroid Build Coastguard Worker }
1053*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_main_process(ixheaace_app_context * pstr_context,WORD32 argc,pWORD8 argv[])1054*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_main_process(ixheaace_app_context *pstr_context, WORD32 argc,
1055*15dc779aSAndroid Build Coastguard Worker pWORD8 argv[]) {
1056*15dc779aSAndroid Build Coastguard Worker LOOPIDX frame_count = 0;
1057*15dc779aSAndroid Build Coastguard Worker
1058*15dc779aSAndroid Build Coastguard Worker /* Error code */
1059*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
1060*15dc779aSAndroid Build Coastguard Worker
1061*15dc779aSAndroid Build Coastguard Worker /* API obj */
1062*15dc779aSAndroid Build Coastguard Worker pVOID pv_ia_process_api_obj;
1063*15dc779aSAndroid Build Coastguard Worker /* First part */
1064*15dc779aSAndroid Build Coastguard Worker /* Error Handler Init */
1065*15dc779aSAndroid Build Coastguard Worker /* Get Library Name, Library Version and API Version */
1066*15dc779aSAndroid Build Coastguard Worker /* Initialize API structure + Default config set */
1067*15dc779aSAndroid Build Coastguard Worker /* Set config params from user */
1068*15dc779aSAndroid Build Coastguard Worker /* Initialize memory tables */
1069*15dc779aSAndroid Build Coastguard Worker /* Get memory information and allocate memory */
1070*15dc779aSAndroid Build Coastguard Worker
1071*15dc779aSAndroid Build Coastguard Worker pWORD8 pb_inp_buf = NULL, pb_out_buf = NULL;
1072*15dc779aSAndroid Build Coastguard Worker WORD32 i_bytes_read = 0;
1073*15dc779aSAndroid Build Coastguard Worker WORD32 input_size = 0;
1074*15dc779aSAndroid Build Coastguard Worker WORD32 samp_freq;
1075*15dc779aSAndroid Build Coastguard Worker FLOAT32 down_sampling_ratio = 1;
1076*15dc779aSAndroid Build Coastguard Worker WORD32 i_out_bytes = 0;
1077*15dc779aSAndroid Build Coastguard Worker WORD32 i_total_length = 0;
1078*15dc779aSAndroid Build Coastguard Worker WORD32 start_offset_samples = 0, i_dec_len = 0;
1079*15dc779aSAndroid Build Coastguard Worker UWORD32 *ia_stsz_size = NULL;
1080*15dc779aSAndroid Build Coastguard Worker UWORD32 ui_samp_freq, ui_num_chan, ui_pcm_wd_sz, ui_pcm = 0, ui_channel_mask,
1081*15dc779aSAndroid Build Coastguard Worker ui_num_coupling_chans = 0;
1082*15dc779aSAndroid Build Coastguard Worker WORD32 max_frame_size = 0;
1083*15dc779aSAndroid Build Coastguard Worker WORD32 expected_frame_count = 0;
1084*15dc779aSAndroid Build Coastguard Worker FILE *pf_drc_inp = NULL;
1085*15dc779aSAndroid Build Coastguard Worker /* The error init function */
1086*15dc779aSAndroid Build Coastguard Worker VOID (*p_error_init)();
1087*15dc779aSAndroid Build Coastguard Worker
1088*15dc779aSAndroid Build Coastguard Worker /* The process error info structure */
1089*15dc779aSAndroid Build Coastguard Worker ia_error_info_struct *p_proc_err_info;
1090*15dc779aSAndroid Build Coastguard Worker
1091*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1092*15dc779aSAndroid Build Coastguard Worker /* The API config structure */
1093*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1094*15dc779aSAndroid Build Coastguard Worker ixheaace_user_config_struct str_enc_api = {{0}, {0}};
1095*15dc779aSAndroid Build Coastguard Worker ixheaace_input_config *pstr_in_cfg = &str_enc_api.input_config;
1096*15dc779aSAndroid Build Coastguard Worker ixheaace_output_config *pstr_out_cfg = &str_enc_api.output_config;
1097*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->pv_drc_cfg = malloc_global(sizeof(ia_drc_input_config), DEFAULT_MEM_ALIGN_8);
1098*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->pv_drc_cfg == NULL) {
1099*15dc779aSAndroid Build Coastguard Worker printf("fatal error: libxaac encoder: Memory allocation failed");
1100*15dc779aSAndroid Build Coastguard Worker return -1;
1101*15dc779aSAndroid Build Coastguard Worker }
1102*15dc779aSAndroid Build Coastguard Worker ia_drc_input_config *pstr_drc_cfg = (ia_drc_input_config *)pstr_in_cfg->pv_drc_cfg;
1103*15dc779aSAndroid Build Coastguard Worker
1104*15dc779aSAndroid Build Coastguard Worker /* Stack process struct initing */
1105*15dc779aSAndroid Build Coastguard Worker p_error_init = ia_enhaacplus_enc_error_handler_init;
1106*15dc779aSAndroid Build Coastguard Worker p_proc_err_info = &ia_enhaacplus_enc_error_info;
1107*15dc779aSAndroid Build Coastguard Worker /* Stack process struct initing end */
1108*15dc779aSAndroid Build Coastguard Worker
1109*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1110*15dc779aSAndroid Build Coastguard Worker /* Initialize the error handler */
1111*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1112*15dc779aSAndroid Build Coastguard Worker (*p_error_init)();
1113*15dc779aSAndroid Build Coastguard Worker
1114*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1115*15dc779aSAndroid Build Coastguard Worker /* Parse input configuration parameters */
1116*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1117*15dc779aSAndroid Build Coastguard Worker
1118*15dc779aSAndroid Build Coastguard Worker iaace_aac_set_default_config(&pstr_in_cfg->aac_config);
1119*15dc779aSAndroid Build Coastguard Worker
1120*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_bitrate = pstr_in_cfg->aac_config.bitrate;
1121*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aot = AOT_AAC_LC;
1122*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->codec_mode = USAC_ONLY_FD;
1123*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_channels = 2;
1124*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_samp_freq = 44100;
1125*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_use_mps = 0;
1126*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_mps_tree_config = -1;
1127*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_use_adts = 0;
1128*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->esbr_flag = 0;
1129*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_use_es = 1;
1130*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->cplx_pred = 0;
1131*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->ccfl_idx = NO_SBR_CCFL_1024;
1132*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->pvc_active = 0;
1133*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->harmonic_sbr = 0;
1134*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->inter_tes_active = 0;
1135*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->use_drc_element = 0;
1136*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_channels_mask = 0;
1137*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_num_coupling_chan = 0;
1138*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aac_config.full_bandwidth = 0;
1139*15dc779aSAndroid Build Coastguard Worker pstr_out_cfg->malloc_xheaace = &malloc_global;
1140*15dc779aSAndroid Build Coastguard Worker pstr_out_cfg->free_xheaace = &free_global;
1141*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->frame_cmd_flag = 0;
1142*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->out_bytes_flag = 0;
1143*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->user_tns_flag = 0;
1144*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->user_esbr_flag = 0;
1145*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_use_adts = !pstr_context->use_ga_hdr;
1146*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->random_access_interval = DEFAULT_RAP_INTERVAL_IN_MS;
1147*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->method_def = METHOD_DEFINITION_PROGRAM_LOUDNESS;
1148*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->measurement_system = MEASUREMENT_SYSTEM_BS_1770_3;
1149*15dc779aSAndroid Build Coastguard Worker
1150*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1151*15dc779aSAndroid Build Coastguard Worker /* Parse input configuration parameters */
1152*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1153*15dc779aSAndroid Build Coastguard Worker ixheaace_parse_config_param(argc, argv, &str_enc_api);
1154*15dc779aSAndroid Build Coastguard Worker
1155*15dc779aSAndroid Build Coastguard Worker {
1156*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->aot == AOT_AAC_LC || pstr_in_cfg->aot == AOT_SBR ||
1157*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aot == AOT_PS) {
1158*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->frame_cmd_flag == 0) {
1159*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->frame_length = 1024;
1160*15dc779aSAndroid Build Coastguard Worker }
1161*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->out_bytes_flag == 0) {
1162*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aac_config.bitreservoir_size = APP_BITRES_SIZE_CONFIG_PARAM_DEF_VALUE_LC;
1163*15dc779aSAndroid Build Coastguard Worker }
1164*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->user_tns_flag == 0) {
1165*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aac_config.use_tns = 1;
1166*15dc779aSAndroid Build Coastguard Worker }
1167*15dc779aSAndroid Build Coastguard Worker } else if (pstr_in_cfg->aot == AOT_AAC_LD || pstr_in_cfg->aot == AOT_AAC_ELD) {
1168*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->frame_cmd_flag == 0) {
1169*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->frame_length = 512;
1170*15dc779aSAndroid Build Coastguard Worker }
1171*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->out_bytes_flag == 0) {
1172*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aac_config.bitreservoir_size = APP_BITRES_SIZE_CONFIG_PARAM_DEF_VALUE_LD;
1173*15dc779aSAndroid Build Coastguard Worker }
1174*15dc779aSAndroid Build Coastguard Worker
1175*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->user_tns_flag == 0) {
1176*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aac_config.use_tns = 1;
1177*15dc779aSAndroid Build Coastguard Worker }
1178*15dc779aSAndroid Build Coastguard Worker } else if (pstr_in_cfg->aot == AOT_USAC) {
1179*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->user_esbr_flag == 0) {
1180*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->esbr_flag = 1;
1181*15dc779aSAndroid Build Coastguard Worker }
1182*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->user_tns_flag == 0) {
1183*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aac_config.use_tns = 1;
1184*15dc779aSAndroid Build Coastguard Worker }
1185*15dc779aSAndroid Build Coastguard Worker }
1186*15dc779aSAndroid Build Coastguard Worker }
1187*15dc779aSAndroid Build Coastguard Worker
1188*15dc779aSAndroid Build Coastguard Worker ui_samp_freq = pstr_in_cfg->i_samp_freq;
1189*15dc779aSAndroid Build Coastguard Worker ui_num_chan = pstr_in_cfg->i_channels;
1190*15dc779aSAndroid Build Coastguard Worker ui_channel_mask = pstr_in_cfg->i_channels_mask;
1191*15dc779aSAndroid Build Coastguard Worker ui_num_coupling_chans = pstr_in_cfg->i_num_coupling_chan;
1192*15dc779aSAndroid Build Coastguard Worker ui_pcm_wd_sz = pstr_in_cfg->ui_pcm_wd_sz;
1193*15dc779aSAndroid Build Coastguard Worker if (!(pstr_in_cfg->i_use_adts)) {
1194*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_use_es = 1;
1195*15dc779aSAndroid Build Coastguard Worker } else {
1196*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_use_es = 0;
1197*15dc779aSAndroid Build Coastguard Worker }
1198*15dc779aSAndroid Build Coastguard Worker
1199*15dc779aSAndroid Build Coastguard Worker if (!ui_pcm) {
1200*15dc779aSAndroid Build Coastguard Worker /* Decode WAV header */
1201*15dc779aSAndroid Build Coastguard Worker if (ia_enhaacplus_enc_wav_header_decode(pstr_context->pf_inp, &ui_num_chan, &ui_channel_mask,
1202*15dc779aSAndroid Build Coastguard Worker &ui_samp_freq, &ui_pcm_wd_sz, &i_total_length) == 1) {
1203*15dc779aSAndroid Build Coastguard Worker fprintf(stdout, "Unable to Read Input WAV File\n");
1204*15dc779aSAndroid Build Coastguard Worker exit(1);
1205*15dc779aSAndroid Build Coastguard Worker }
1206*15dc779aSAndroid Build Coastguard Worker
1207*15dc779aSAndroid Build Coastguard Worker /* PCM Word Size (For single input file) */
1208*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->ui_pcm_wd_sz = ui_pcm_wd_sz;
1209*15dc779aSAndroid Build Coastguard Worker /* Sampling Frequency */
1210*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_samp_freq = ui_samp_freq;
1211*15dc779aSAndroid Build Coastguard Worker /* Total Number of Channels */
1212*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_channels = ui_num_chan;
1213*15dc779aSAndroid Build Coastguard Worker /* Number of coupling channels*/
1214*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_num_coupling_chan = ui_num_coupling_chans;
1215*15dc779aSAndroid Build Coastguard Worker /* Channels Mask */
1216*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_channels_mask = ui_channel_mask;
1217*15dc779aSAndroid Build Coastguard Worker
1218*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->aac_config.length = i_total_length;
1219*15dc779aSAndroid Build Coastguard Worker }
1220*15dc779aSAndroid Build Coastguard Worker
1221*15dc779aSAndroid Build Coastguard Worker /*1st pass -> Loudness Measurement */
1222*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->aot == AOT_USAC) {
1223*15dc779aSAndroid Build Coastguard Worker err_code =
1224*15dc779aSAndroid Build Coastguard Worker ixheaace_calculate_loudness_measure(pstr_in_cfg, pstr_out_cfg, pstr_context->pf_inp);
1225*15dc779aSAndroid Build Coastguard Worker if (err_code) {
1226*15dc779aSAndroid Build Coastguard Worker printf("\n Error in calculating loudness.\n");
1227*15dc779aSAndroid Build Coastguard Worker exit(1);
1228*15dc779aSAndroid Build Coastguard Worker } else {
1229*15dc779aSAndroid Build Coastguard Worker printf("\n loudness level : %lf", pstr_in_cfg->measured_loudness);
1230*15dc779aSAndroid Build Coastguard Worker printf("\n sample_peak_level : %lf \n", pstr_in_cfg->sample_peak_level);
1231*15dc779aSAndroid Build Coastguard Worker }
1232*15dc779aSAndroid Build Coastguard Worker }
1233*15dc779aSAndroid Build Coastguard Worker
1234*15dc779aSAndroid Build Coastguard Worker ixheaace_input_config pstr_in_cfg_user = *pstr_in_cfg;
1235*15dc779aSAndroid Build Coastguard Worker
1236*15dc779aSAndroid Build Coastguard Worker ia_drc_input_config *pstr_drc_cfg_user = NULL;
1237*15dc779aSAndroid Build Coastguard Worker
1238*15dc779aSAndroid Build Coastguard Worker /* Get library id and version number and display it */
1239*15dc779aSAndroid Build Coastguard Worker ixheaace_get_lib_id_strings((pVOID)&pstr_out_cfg->version);
1240*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_display_id_message(pstr_out_cfg->version.p_lib_name,
1241*15dc779aSAndroid Build Coastguard Worker pstr_out_cfg->version.p_version_num);
1242*15dc779aSAndroid Build Coastguard Worker
1243*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1244*15dc779aSAndroid Build Coastguard Worker /* Initialize API structure and set config params to default */
1245*15dc779aSAndroid Build Coastguard Worker /* ******************************************************************/
1246*15dc779aSAndroid Build Coastguard Worker /* DRC */
1247*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->use_drc_element == 1 && pstr_in_cfg->aot == AOT_USAC) {
1248*15dc779aSAndroid Build Coastguard Worker LOOPIDX k;
1249*15dc779aSAndroid Build Coastguard Worker CHAR8 drc_config_file_name[IA_MAX_CMD_LINE_LENGTH];
1250*15dc779aSAndroid Build Coastguard Worker strcpy(drc_config_file_name, DRC_CONFIG_FILE);
1251*15dc779aSAndroid Build Coastguard Worker
1252*15dc779aSAndroid Build Coastguard Worker pf_drc_inp = fopen(drc_config_file_name, "rt");
1253*15dc779aSAndroid Build Coastguard Worker
1254*15dc779aSAndroid Build Coastguard Worker if (!pf_drc_inp) {
1255*15dc779aSAndroid Build Coastguard Worker printf("\nError in opening DRC configuration file\n\n");
1256*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->use_drc_element = 0;
1257*15dc779aSAndroid Build Coastguard Worker }
1258*15dc779aSAndroid Build Coastguard Worker
1259*15dc779aSAndroid Build Coastguard Worker if (pf_drc_inp != 0) {
1260*15dc779aSAndroid Build Coastguard Worker memset(pstr_drc_cfg, 0, sizeof(ia_drc_input_config));
1261*15dc779aSAndroid Build Coastguard Worker ixheaace_read_drc_config_params(
1262*15dc779aSAndroid Build Coastguard Worker pf_drc_inp, &pstr_drc_cfg->str_enc_params, &pstr_drc_cfg->str_uni_drc_config,
1263*15dc779aSAndroid Build Coastguard Worker &pstr_drc_cfg->str_enc_loudness_info_set, &pstr_drc_cfg->str_enc_gain_extension,
1264*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg->i_channels);
1265*15dc779aSAndroid Build Coastguard Worker
1266*15dc779aSAndroid Build Coastguard Worker pstr_drc_cfg->str_enc_params.gain_sequence_present = FALSE;
1267*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_drc_cfg->str_uni_drc_config.drc_coefficients_uni_drc_count; k++) {
1268*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_cfg->str_uni_drc_config.str_drc_coefficients_uni_drc[k].drc_location == 1) {
1269*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_cfg->str_uni_drc_config.str_drc_coefficients_uni_drc[k].gain_set_count >
1270*15dc779aSAndroid Build Coastguard Worker 0) {
1271*15dc779aSAndroid Build Coastguard Worker pstr_drc_cfg->str_enc_params.gain_sequence_present = TRUE;
1272*15dc779aSAndroid Build Coastguard Worker break;
1273*15dc779aSAndroid Build Coastguard Worker }
1274*15dc779aSAndroid Build Coastguard Worker }
1275*15dc779aSAndroid Build Coastguard Worker }
1276*15dc779aSAndroid Build Coastguard Worker
1277*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_cfg->str_enc_params.gain_sequence_present == FALSE) {
1278*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_drc_cfg->str_uni_drc_config.str_uni_drc_config_ext
1279*15dc779aSAndroid Build Coastguard Worker .drc_coefficients_uni_drc_v1_count;
1280*15dc779aSAndroid Build Coastguard Worker k++) {
1281*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_cfg->str_uni_drc_config.str_uni_drc_config_ext
1282*15dc779aSAndroid Build Coastguard Worker .str_drc_coefficients_uni_drc_v1[k]
1283*15dc779aSAndroid Build Coastguard Worker .drc_location == 1) {
1284*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_cfg->str_uni_drc_config.str_uni_drc_config_ext
1285*15dc779aSAndroid Build Coastguard Worker .str_drc_coefficients_uni_drc_v1[k]
1286*15dc779aSAndroid Build Coastguard Worker .gain_sequence_count > 0) {
1287*15dc779aSAndroid Build Coastguard Worker pstr_drc_cfg->str_enc_params.gain_sequence_present = TRUE;
1288*15dc779aSAndroid Build Coastguard Worker break;
1289*15dc779aSAndroid Build Coastguard Worker }
1290*15dc779aSAndroid Build Coastguard Worker }
1291*15dc779aSAndroid Build Coastguard Worker }
1292*15dc779aSAndroid Build Coastguard Worker }
1293*15dc779aSAndroid Build Coastguard Worker
1294*15dc779aSAndroid Build Coastguard Worker pstr_drc_cfg_user =
1295*15dc779aSAndroid Build Coastguard Worker (ia_drc_input_config *)malloc_global(sizeof(ia_drc_input_config), DEFAULT_MEM_ALIGN_8);
1296*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_cfg_user == NULL) {
1297*15dc779aSAndroid Build Coastguard Worker printf("fatal error: libxaac encoder: Memory allocation failed");
1298*15dc779aSAndroid Build Coastguard Worker free_global(pstr_in_cfg->pv_drc_cfg);
1299*15dc779aSAndroid Build Coastguard Worker return -1;
1300*15dc779aSAndroid Build Coastguard Worker }
1301*15dc779aSAndroid Build Coastguard Worker // Copy DRC config to user DRC config
1302*15dc779aSAndroid Build Coastguard Worker memcpy(pstr_drc_cfg_user, pstr_drc_cfg, sizeof(ia_drc_input_config));
1303*15dc779aSAndroid Build Coastguard Worker
1304*15dc779aSAndroid Build Coastguard Worker pstr_in_cfg_user.pv_drc_cfg = pstr_drc_cfg_user;
1305*15dc779aSAndroid Build Coastguard Worker }
1306*15dc779aSAndroid Build Coastguard Worker }
1307*15dc779aSAndroid Build Coastguard Worker
1308*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_create((pVOID)pstr_in_cfg, (pVOID)pstr_out_cfg);
1309*15dc779aSAndroid Build Coastguard Worker _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code, pstr_out_cfg);
1310*15dc779aSAndroid Build Coastguard Worker
1311*15dc779aSAndroid Build Coastguard Worker pv_ia_process_api_obj = pstr_out_cfg->pv_ia_process_api_obj;
1312*15dc779aSAndroid Build Coastguard Worker
1313*15dc779aSAndroid Build Coastguard Worker pb_inp_buf = (pWORD8)pstr_out_cfg->mem_info_table[IA_MEMTYPE_INPUT].mem_ptr;
1314*15dc779aSAndroid Build Coastguard Worker pb_out_buf = (pWORD8)pstr_out_cfg->mem_info_table[IA_MEMTYPE_OUTPUT].mem_ptr;
1315*15dc779aSAndroid Build Coastguard Worker
1316*15dc779aSAndroid Build Coastguard Worker ixheaace_print_config_params(pstr_in_cfg, &pstr_in_cfg_user);
1317*15dc779aSAndroid Build Coastguard Worker
1318*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_cfg_user) {
1319*15dc779aSAndroid Build Coastguard Worker free_global(pstr_drc_cfg_user);
1320*15dc779aSAndroid Build Coastguard Worker pstr_drc_cfg_user = NULL;
1321*15dc779aSAndroid Build Coastguard Worker }
1322*15dc779aSAndroid Build Coastguard Worker
1323*15dc779aSAndroid Build Coastguard Worker start_offset_samples = 0;
1324*15dc779aSAndroid Build Coastguard Worker input_size = pstr_out_cfg->input_size;
1325*15dc779aSAndroid Build Coastguard Worker
1326*15dc779aSAndroid Build Coastguard Worker if (input_size) {
1327*15dc779aSAndroid Build Coastguard Worker expected_frame_count = (pstr_in_cfg->aac_config.length + (input_size - 1)) / input_size;
1328*15dc779aSAndroid Build Coastguard Worker }
1329*15dc779aSAndroid Build Coastguard Worker
1330*15dc779aSAndroid Build Coastguard Worker if (NULL == ia_stsz_size) {
1331*15dc779aSAndroid Build Coastguard Worker ia_stsz_size = (UWORD32 *)malloc_global((expected_frame_count + 2) * sizeof(*ia_stsz_size),
1332*15dc779aSAndroid Build Coastguard Worker DEFAULT_MEM_ALIGN_8);
1333*15dc779aSAndroid Build Coastguard Worker if (ia_stsz_size == NULL) {
1334*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->pv_drc_cfg) {
1335*15dc779aSAndroid Build Coastguard Worker free_global(pstr_in_cfg->pv_drc_cfg);
1336*15dc779aSAndroid Build Coastguard Worker }
1337*15dc779aSAndroid Build Coastguard Worker printf("fatal error: libxaac encoder: Memory allocation failed");
1338*15dc779aSAndroid Build Coastguard Worker return -1;
1339*15dc779aSAndroid Build Coastguard Worker }
1340*15dc779aSAndroid Build Coastguard Worker memset(ia_stsz_size, 0, (expected_frame_count + 2) * sizeof(*ia_stsz_size));
1341*15dc779aSAndroid Build Coastguard Worker }
1342*15dc779aSAndroid Build Coastguard Worker down_sampling_ratio = pstr_out_cfg->down_sampling_ratio;
1343*15dc779aSAndroid Build Coastguard Worker samp_freq = (WORD32)(pstr_out_cfg->samp_freq / down_sampling_ratio);
1344*15dc779aSAndroid Build Coastguard Worker
1345*15dc779aSAndroid Build Coastguard Worker { ia_enhaacplus_enc_fwrite(pb_out_buf, pstr_context->pf_out, 0); }
1346*15dc779aSAndroid Build Coastguard Worker
1347*15dc779aSAndroid Build Coastguard Worker if ((pstr_in_cfg->usac_en || pstr_in_cfg->i_use_es)) {
1348*15dc779aSAndroid Build Coastguard Worker i_dec_len = pstr_out_cfg->i_out_bytes;
1349*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_fwrite(pb_out_buf, pstr_context->pf_out, pstr_out_cfg->i_out_bytes);
1350*15dc779aSAndroid Build Coastguard Worker fflush(pstr_context->pf_out);
1351*15dc779aSAndroid Build Coastguard Worker }
1352*15dc779aSAndroid Build Coastguard Worker
1353*15dc779aSAndroid Build Coastguard Worker i_bytes_read =
1354*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_fread((pVOID)pb_inp_buf, sizeof(WORD8), input_size, pstr_context->pf_inp);
1355*15dc779aSAndroid Build Coastguard Worker
1356*15dc779aSAndroid Build Coastguard Worker while (i_bytes_read) {
1357*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
1358*15dc779aSAndroid Build Coastguard Worker /* Print frame number */
1359*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
1360*15dc779aSAndroid Build Coastguard Worker fprintf(stdout, "Frames Processed [%d]\r", frame_count);
1361*15dc779aSAndroid Build Coastguard Worker fflush(stdout);
1362*15dc779aSAndroid Build Coastguard Worker
1363*15dc779aSAndroid Build Coastguard Worker if (i_bytes_read != input_size) {
1364*15dc779aSAndroid Build Coastguard Worker memset((pb_inp_buf + i_bytes_read), 0, (input_size - i_bytes_read));
1365*15dc779aSAndroid Build Coastguard Worker }
1366*15dc779aSAndroid Build Coastguard Worker
1367*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
1368*15dc779aSAndroid Build Coastguard Worker /* Perform Encoding of frame data */
1369*15dc779aSAndroid Build Coastguard Worker /*****************************************************************************/
1370*15dc779aSAndroid Build Coastguard Worker
1371*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_process(pv_ia_process_api_obj, (pVOID)pstr_in_cfg, (pVOID)pstr_out_cfg);
1372*15dc779aSAndroid Build Coastguard Worker
1373*15dc779aSAndroid Build Coastguard Worker _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code, pstr_out_cfg);
1374*15dc779aSAndroid Build Coastguard Worker
1375*15dc779aSAndroid Build Coastguard Worker /* Get the output bytes */
1376*15dc779aSAndroid Build Coastguard Worker i_out_bytes = pstr_out_cfg->i_out_bytes;
1377*15dc779aSAndroid Build Coastguard Worker
1378*15dc779aSAndroid Build Coastguard Worker if (max_frame_size < i_out_bytes) max_frame_size = i_out_bytes;
1379*15dc779aSAndroid Build Coastguard Worker if (i_out_bytes) {
1380*15dc779aSAndroid Build Coastguard Worker frame_count++;
1381*15dc779aSAndroid Build Coastguard Worker ia_stsz_size[frame_count - 1] = pstr_out_cfg->i_out_bytes;
1382*15dc779aSAndroid Build Coastguard Worker
1383*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_fwrite(pb_out_buf, pstr_context->pf_out, i_out_bytes);
1384*15dc779aSAndroid Build Coastguard Worker fflush(pstr_context->pf_out);
1385*15dc779aSAndroid Build Coastguard Worker
1386*15dc779aSAndroid Build Coastguard Worker i_bytes_read = ia_enhaacplus_enc_fread((pVOID)pb_inp_buf, sizeof(WORD8), input_size,
1387*15dc779aSAndroid Build Coastguard Worker pstr_context->pf_inp);
1388*15dc779aSAndroid Build Coastguard Worker }
1389*15dc779aSAndroid Build Coastguard Worker if (frame_count == expected_frame_count) break;
1390*15dc779aSAndroid Build Coastguard Worker }
1391*15dc779aSAndroid Build Coastguard Worker
1392*15dc779aSAndroid Build Coastguard Worker fprintf(stdout, "\n");
1393*15dc779aSAndroid Build Coastguard Worker fflush(stdout);
1394*15dc779aSAndroid Build Coastguard Worker
1395*15dc779aSAndroid Build Coastguard Worker // Error handler is not invoked here to avoid invoking ixheaace_delete() twice.
1396*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_delete((pVOID)pstr_out_cfg);
1397*15dc779aSAndroid Build Coastguard Worker if ((err_code)&IA_FATAL_ERROR) {
1398*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->pv_drc_cfg) {
1399*15dc779aSAndroid Build Coastguard Worker free_global(pstr_in_cfg->pv_drc_cfg);
1400*15dc779aSAndroid Build Coastguard Worker }
1401*15dc779aSAndroid Build Coastguard Worker if (ia_stsz_size != NULL) {
1402*15dc779aSAndroid Build Coastguard Worker free_global(ia_stsz_size);
1403*15dc779aSAndroid Build Coastguard Worker }
1404*15dc779aSAndroid Build Coastguard Worker return (err_code);
1405*15dc779aSAndroid Build Coastguard Worker }
1406*15dc779aSAndroid Build Coastguard Worker
1407*15dc779aSAndroid Build Coastguard Worker if ((pstr_in_cfg->usac_en || pstr_in_cfg->i_use_es) && (pstr_context->pf_meta)) {
1408*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-dec_info_init:%d\n", i_dec_len);
1409*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-g_track_count:%d\n", 1);
1410*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-ia_mp4_stsz_entries:%d\n", frame_count);
1411*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-movie_time_scale:%d\n", samp_freq);
1412*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-media_time_scale:%d\n", samp_freq);
1413*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-playTimeInSamples:%d\n",
1414*15dc779aSAndroid Build Coastguard Worker i_total_length / ((ui_pcm_wd_sz >> 3) * ui_num_chan));
1415*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-startOffsetInSamples:%d\n-useEditlist:%d\n",
1416*15dc779aSAndroid Build Coastguard Worker start_offset_samples, 1);
1417*15dc779aSAndroid Build Coastguard Worker for (WORD32 i = 0; i < frame_count; i++)
1418*15dc779aSAndroid Build Coastguard Worker fprintf(pstr_context->pf_meta, "-ia_mp4_stsz_size:%d\n", ia_stsz_size[i]);
1419*15dc779aSAndroid Build Coastguard Worker }
1420*15dc779aSAndroid Build Coastguard Worker if (pstr_in_cfg->pv_drc_cfg) {
1421*15dc779aSAndroid Build Coastguard Worker free_global(pstr_in_cfg->pv_drc_cfg);
1422*15dc779aSAndroid Build Coastguard Worker }
1423*15dc779aSAndroid Build Coastguard Worker if (ia_stsz_size != NULL) {
1424*15dc779aSAndroid Build Coastguard Worker free_global(ia_stsz_size);
1425*15dc779aSAndroid Build Coastguard Worker }
1426*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1427*15dc779aSAndroid Build Coastguard Worker }
1428*15dc779aSAndroid Build Coastguard Worker
main(WORD32 argc,pCHAR8 argv[])1429*15dc779aSAndroid Build Coastguard Worker int main(WORD32 argc, pCHAR8 argv[]) {
1430*15dc779aSAndroid Build Coastguard Worker FILE *param_file_id = NULL;
1431*15dc779aSAndroid Build Coastguard Worker WORD32 usac_en = 0;
1432*15dc779aSAndroid Build Coastguard Worker WORD8 curr_cmd[IA_MAX_CMD_LINE_LENGTH];
1433*15dc779aSAndroid Build Coastguard Worker WORD32 fargc, curpos;
1434*15dc779aSAndroid Build Coastguard Worker WORD32 processcmd = 0;
1435*15dc779aSAndroid Build Coastguard Worker WORD8 fargv[IA_MAX_ARGS][IA_MAX_CMD_LINE_LENGTH];
1436*15dc779aSAndroid Build Coastguard Worker
1437*15dc779aSAndroid Build Coastguard Worker pWORD8 pargv[IA_MAX_ARGS];
1438*15dc779aSAndroid Build Coastguard Worker
1439*15dc779aSAndroid Build Coastguard Worker WORD8 pb_input_file_path[IA_MAX_CMD_LINE_LENGTH] = "";
1440*15dc779aSAndroid Build Coastguard Worker WORD8 pb_output_file_path[IA_MAX_CMD_LINE_LENGTH] = "";
1441*15dc779aSAndroid Build Coastguard Worker WORD8 pb_drc_file_path[IA_MAX_CMD_LINE_LENGTH] = "";
1442*15dc779aSAndroid Build Coastguard Worker ixheaace_app_context str_context;
1443*15dc779aSAndroid Build Coastguard Worker memset(&str_context, 0, sizeof(ixheaace_app_context));
1444*15dc779aSAndroid Build Coastguard Worker str_context.use_ga_hdr = 1;
1445*15dc779aSAndroid Build Coastguard Worker ia_testbench_error_handler_init();
1446*15dc779aSAndroid Build Coastguard Worker
1447*15dc779aSAndroid Build Coastguard Worker ixheaace_version instance = {0};
1448*15dc779aSAndroid Build Coastguard Worker if (argc == 1 || argc == 2) {
1449*15dc779aSAndroid Build Coastguard Worker if (argc == 2 && (!strncmp((const char *)argv[1], "-paramfile:", 11))) {
1450*15dc779aSAndroid Build Coastguard Worker pWORD8 paramfile = (pWORD8)argv[1] + 11;
1451*15dc779aSAndroid Build Coastguard Worker
1452*15dc779aSAndroid Build Coastguard Worker param_file_id = fopen((const char *)paramfile, "r");
1453*15dc779aSAndroid Build Coastguard Worker if (param_file_id == NULL) {
1454*15dc779aSAndroid Build Coastguard Worker ixheaace_get_lib_id_strings(&instance);
1455*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_display_id_message(instance.p_lib_name, instance.p_version_num);
1456*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_print_usage();
1457*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1458*15dc779aSAndroid Build Coastguard Worker }
1459*15dc779aSAndroid Build Coastguard Worker } else {
1460*15dc779aSAndroid Build Coastguard Worker param_file_id = fopen(PARAMFILE, "r");
1461*15dc779aSAndroid Build Coastguard Worker if (param_file_id == NULL) {
1462*15dc779aSAndroid Build Coastguard Worker ixheaace_get_lib_id_strings(&instance);
1463*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_display_id_message(instance.p_lib_name, instance.p_version_num);
1464*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_print_usage();
1465*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1466*15dc779aSAndroid Build Coastguard Worker }
1467*15dc779aSAndroid Build Coastguard Worker }
1468*15dc779aSAndroid Build Coastguard Worker
1469*15dc779aSAndroid Build Coastguard Worker /* Process one line at a time */
1470*15dc779aSAndroid Build Coastguard Worker while (fgets((char *)curr_cmd, IA_MAX_CMD_LINE_LENGTH, param_file_id)) {
1471*15dc779aSAndroid Build Coastguard Worker WORD8 pb_meta_file_name[IA_MAX_CMD_LINE_LENGTH] = "";
1472*15dc779aSAndroid Build Coastguard Worker curpos = 0;
1473*15dc779aSAndroid Build Coastguard Worker fargc = 0;
1474*15dc779aSAndroid Build Coastguard Worker usac_en = 0;
1475*15dc779aSAndroid Build Coastguard Worker /* if it is not a param_file command and if */
1476*15dc779aSAndroid Build Coastguard Worker /* CLP processing is not enabled */
1477*15dc779aSAndroid Build Coastguard Worker if (curr_cmd[0] != '@' && !processcmd) { /* skip it */
1478*15dc779aSAndroid Build Coastguard Worker continue;
1479*15dc779aSAndroid Build Coastguard Worker }
1480*15dc779aSAndroid Build Coastguard Worker
1481*15dc779aSAndroid Build Coastguard Worker while (sscanf((char *)curr_cmd + curpos, "%s", fargv[fargc]) != EOF) {
1482*15dc779aSAndroid Build Coastguard Worker if (fargv[0][0] == '/' && fargv[0][1] == '/') break;
1483*15dc779aSAndroid Build Coastguard Worker if (strcmp((const char *)fargv[0], "@echo") == 0) break;
1484*15dc779aSAndroid Build Coastguard Worker if (strcmp((const char *)fargv[fargc], "@New_line") == 0) {
1485*15dc779aSAndroid Build Coastguard Worker if (NULL == fgets((char *)curr_cmd + curpos, IA_MAX_CMD_LINE_LENGTH, param_file_id))
1486*15dc779aSAndroid Build Coastguard Worker break;
1487*15dc779aSAndroid Build Coastguard Worker continue;
1488*15dc779aSAndroid Build Coastguard Worker }
1489*15dc779aSAndroid Build Coastguard Worker curpos += (WORD32)strlen((const char *)fargv[fargc]);
1490*15dc779aSAndroid Build Coastguard Worker while (*(curr_cmd + curpos) == ' ' || *(curr_cmd + curpos) == '\t') curpos++;
1491*15dc779aSAndroid Build Coastguard Worker fargc++;
1492*15dc779aSAndroid Build Coastguard Worker }
1493*15dc779aSAndroid Build Coastguard Worker
1494*15dc779aSAndroid Build Coastguard Worker if (fargc < 1) /* for blank lines etc. */
1495*15dc779aSAndroid Build Coastguard Worker continue;
1496*15dc779aSAndroid Build Coastguard Worker
1497*15dc779aSAndroid Build Coastguard Worker if (strcmp((const char *)fargv[0], "@Output_path") == 0) {
1498*15dc779aSAndroid Build Coastguard Worker if (fargc > 1)
1499*15dc779aSAndroid Build Coastguard Worker strcpy((char *)pb_output_file_path, (const char *)fargv[1]);
1500*15dc779aSAndroid Build Coastguard Worker else
1501*15dc779aSAndroid Build Coastguard Worker strcpy((char *)pb_output_file_path, "");
1502*15dc779aSAndroid Build Coastguard Worker continue;
1503*15dc779aSAndroid Build Coastguard Worker }
1504*15dc779aSAndroid Build Coastguard Worker
1505*15dc779aSAndroid Build Coastguard Worker if (strcmp((const char *)fargv[0], "@Input_path") == 0) {
1506*15dc779aSAndroid Build Coastguard Worker if (fargc > 1)
1507*15dc779aSAndroid Build Coastguard Worker strcpy((char *)pb_input_file_path, (const char *)fargv[1]);
1508*15dc779aSAndroid Build Coastguard Worker else
1509*15dc779aSAndroid Build Coastguard Worker strcpy((char *)pb_input_file_path, "");
1510*15dc779aSAndroid Build Coastguard Worker strcpy((char *)pb_drc_file_path, (const char *)pb_input_file_path);
1511*15dc779aSAndroid Build Coastguard Worker continue;
1512*15dc779aSAndroid Build Coastguard Worker }
1513*15dc779aSAndroid Build Coastguard Worker
1514*15dc779aSAndroid Build Coastguard Worker if (strcmp((const char *)fargv[0], "@Start") == 0) {
1515*15dc779aSAndroid Build Coastguard Worker processcmd = 1;
1516*15dc779aSAndroid Build Coastguard Worker continue;
1517*15dc779aSAndroid Build Coastguard Worker }
1518*15dc779aSAndroid Build Coastguard Worker
1519*15dc779aSAndroid Build Coastguard Worker if (strcmp((const char *)fargv[0], "@Stop") == 0) {
1520*15dc779aSAndroid Build Coastguard Worker processcmd = 0;
1521*15dc779aSAndroid Build Coastguard Worker continue;
1522*15dc779aSAndroid Build Coastguard Worker }
1523*15dc779aSAndroid Build Coastguard Worker
1524*15dc779aSAndroid Build Coastguard Worker /* otherwise if this a normal command and its enabled for execution */
1525*15dc779aSAndroid Build Coastguard Worker if (processcmd) {
1526*15dc779aSAndroid Build Coastguard Worker int i;
1527*15dc779aSAndroid Build Coastguard Worker int err_code = IA_NO_ERROR;
1528*15dc779aSAndroid Build Coastguard Worker WORD8 pb_input_file_name[IA_MAX_CMD_LINE_LENGTH] = "";
1529*15dc779aSAndroid Build Coastguard Worker WORD8 pb_output_file_name[IA_MAX_CMD_LINE_LENGTH] = "";
1530*15dc779aSAndroid Build Coastguard Worker WORD32 aot_value = 0;
1531*15dc779aSAndroid Build Coastguard Worker WORD32 is_ld_eld = 0; // If set to 1, it denotes AOT 23 or AOT 39
1532*15dc779aSAndroid Build Coastguard Worker
1533*15dc779aSAndroid Build Coastguard Worker int file_count = 0;
1534*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fargc; i++) {
1535*15dc779aSAndroid Build Coastguard Worker printf("%s ", fargv[i]);
1536*15dc779aSAndroid Build Coastguard Worker pargv[i] = fargv[i];
1537*15dc779aSAndroid Build Coastguard Worker
1538*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)fargv[i], "-ifile:", 7)) {
1539*15dc779aSAndroid Build Coastguard Worker pWORD8 pb_arg_val = fargv[i] + 7;
1540*15dc779aSAndroid Build Coastguard Worker
1541*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_input_file_name, (const char *)pb_input_file_path);
1542*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_input_file_name, (const char *)pb_arg_val);
1543*15dc779aSAndroid Build Coastguard Worker
1544*15dc779aSAndroid Build Coastguard Worker str_context.pf_inp = NULL;
1545*15dc779aSAndroid Build Coastguard Worker str_context.pf_inp = fopen((const char *)pb_input_file_name, "rb");
1546*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_inp == NULL) {
1547*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1548*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Input File", err_code);
1549*15dc779aSAndroid Build Coastguard Worker }
1550*15dc779aSAndroid Build Coastguard Worker file_count++;
1551*15dc779aSAndroid Build Coastguard Worker }
1552*15dc779aSAndroid Build Coastguard Worker
1553*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)fargv[i], "-ofile:", 7)) {
1554*15dc779aSAndroid Build Coastguard Worker pWORD8 pb_arg_val = fargv[i] + 7;
1555*15dc779aSAndroid Build Coastguard Worker
1556*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_output_file_name, (const char *)pb_output_file_path);
1557*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_output_file_name, (const char *)pb_arg_val);
1558*15dc779aSAndroid Build Coastguard Worker
1559*15dc779aSAndroid Build Coastguard Worker str_context.pf_out = NULL;
1560*15dc779aSAndroid Build Coastguard Worker str_context.pf_out = fopen((const char *)pb_output_file_name, "wb");
1561*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_out == NULL) {
1562*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1563*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Output File", err_code);
1564*15dc779aSAndroid Build Coastguard Worker }
1565*15dc779aSAndroid Build Coastguard Worker file_count++;
1566*15dc779aSAndroid Build Coastguard Worker }
1567*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)fargv[i], "-usac:", 6)) {
1568*15dc779aSAndroid Build Coastguard Worker usac_en = 1;
1569*15dc779aSAndroid Build Coastguard Worker }
1570*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)fargv[i], "-aot:", 5)) {
1571*15dc779aSAndroid Build Coastguard Worker pWORD8 pb_arg_val = fargv[i] + 5;
1572*15dc779aSAndroid Build Coastguard Worker aot_value = atoi((const char *)(pb_arg_val));
1573*15dc779aSAndroid Build Coastguard Worker if (aot_value == 23 || aot_value == 39) {
1574*15dc779aSAndroid Build Coastguard Worker is_ld_eld = 1;
1575*15dc779aSAndroid Build Coastguard Worker }
1576*15dc779aSAndroid Build Coastguard Worker }
1577*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)fargv[i], "-adts:", 6)) {
1578*15dc779aSAndroid Build Coastguard Worker pWORD8 pb_arg_val = fargv[i] + 6;
1579*15dc779aSAndroid Build Coastguard Worker
1580*15dc779aSAndroid Build Coastguard Worker if ((atoi((const char *)pb_arg_val))) str_context.use_ga_hdr = 0;
1581*15dc779aSAndroid Build Coastguard Worker }
1582*15dc779aSAndroid Build Coastguard Worker }
1583*15dc779aSAndroid Build Coastguard Worker
1584*15dc779aSAndroid Build Coastguard Worker printf("\n");
1585*15dc779aSAndroid Build Coastguard Worker
1586*15dc779aSAndroid Build Coastguard Worker if (file_count != 2) {
1587*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1588*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Input or Output File", err_code);
1589*15dc779aSAndroid Build Coastguard Worker }
1590*15dc779aSAndroid Build Coastguard Worker if (is_ld_eld) {
1591*15dc779aSAndroid Build Coastguard Worker str_context.use_ga_hdr = 1;
1592*15dc779aSAndroid Build Coastguard Worker }
1593*15dc779aSAndroid Build Coastguard Worker
1594*15dc779aSAndroid Build Coastguard Worker if ((strcmp((const char *)pb_output_file_name, "")) &&
1595*15dc779aSAndroid Build Coastguard Worker (usac_en || str_context.use_ga_hdr)) {
1596*15dc779aSAndroid Build Coastguard Worker char *file_name = strrchr((const char *)pb_output_file_name, '.');
1597*15dc779aSAndroid Build Coastguard Worker SIZE_T idx = file_name - (char *)pb_output_file_name;
1598*15dc779aSAndroid Build Coastguard Worker memcpy(pb_meta_file_name, pb_output_file_name, idx);
1599*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_meta_file_name, ".txt");
1600*15dc779aSAndroid Build Coastguard Worker str_context.pf_meta = NULL;
1601*15dc779aSAndroid Build Coastguard Worker str_context.pf_meta = fopen((const char *)pb_meta_file_name, "wt");
1602*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_meta == NULL) {
1603*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1604*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Meta File", err_code);
1605*15dc779aSAndroid Build Coastguard Worker }
1606*15dc779aSAndroid Build Coastguard Worker }
1607*15dc779aSAndroid Build Coastguard Worker if (err_code == IA_NO_ERROR) ia_enhaacplus_enc_main_process(&str_context, fargc, pargv);
1608*15dc779aSAndroid Build Coastguard Worker
1609*15dc779aSAndroid Build Coastguard Worker str_context.use_ga_hdr = 1;
1610*15dc779aSAndroid Build Coastguard Worker
1611*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_inp) fclose(str_context.pf_inp);
1612*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_out) fclose(str_context.pf_out);
1613*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_meta != NULL) {
1614*15dc779aSAndroid Build Coastguard Worker fclose(str_context.pf_meta);
1615*15dc779aSAndroid Build Coastguard Worker str_context.pf_meta = NULL;
1616*15dc779aSAndroid Build Coastguard Worker }
1617*15dc779aSAndroid Build Coastguard Worker }
1618*15dc779aSAndroid Build Coastguard Worker }
1619*15dc779aSAndroid Build Coastguard Worker } else {
1620*15dc779aSAndroid Build Coastguard Worker int i;
1621*15dc779aSAndroid Build Coastguard Worker int err_code = IA_NO_ERROR;
1622*15dc779aSAndroid Build Coastguard Worker int file_count = 0;
1623*15dc779aSAndroid Build Coastguard Worker WORD32 aot_value = 0;
1624*15dc779aSAndroid Build Coastguard Worker WORD32 is_ld_eld = 0; // If set to 1, it denotes AOT 23 or AOT 39
1625*15dc779aSAndroid Build Coastguard Worker
1626*15dc779aSAndroid Build Coastguard Worker WORD8 pb_input_file_name[IA_MAX_CMD_LINE_LENGTH] = "";
1627*15dc779aSAndroid Build Coastguard Worker WORD8 pb_output_file_name[IA_MAX_CMD_LINE_LENGTH] = "";
1628*15dc779aSAndroid Build Coastguard Worker WORD8 pb_meta_file_name[IA_MAX_CMD_LINE_LENGTH] = "";
1629*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < argc; i++) {
1630*15dc779aSAndroid Build Coastguard Worker printf("%s ", argv[i]);
1631*15dc779aSAndroid Build Coastguard Worker
1632*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-ifile:", 7)) {
1633*15dc779aSAndroid Build Coastguard Worker pWORD8 pb_arg_val = (pWORD8)argv[i] + 7;
1634*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_input_file_name, (const char *)pb_input_file_path);
1635*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_input_file_name, (const char *)pb_arg_val);
1636*15dc779aSAndroid Build Coastguard Worker
1637*15dc779aSAndroid Build Coastguard Worker str_context.pf_inp = NULL;
1638*15dc779aSAndroid Build Coastguard Worker str_context.pf_inp = fopen((const char *)pb_input_file_name, "rb");
1639*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_inp == NULL) {
1640*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1641*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Input File", err_code);
1642*15dc779aSAndroid Build Coastguard Worker }
1643*15dc779aSAndroid Build Coastguard Worker file_count++;
1644*15dc779aSAndroid Build Coastguard Worker }
1645*15dc779aSAndroid Build Coastguard Worker
1646*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-ofile:", 7)) {
1647*15dc779aSAndroid Build Coastguard Worker pWORD8 pb_arg_val = (pWORD8)argv[i] + 7;
1648*15dc779aSAndroid Build Coastguard Worker
1649*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_output_file_name, (const char *)pb_output_file_path);
1650*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_output_file_name, (const char *)pb_arg_val);
1651*15dc779aSAndroid Build Coastguard Worker
1652*15dc779aSAndroid Build Coastguard Worker str_context.pf_out = NULL;
1653*15dc779aSAndroid Build Coastguard Worker str_context.pf_out = fopen((const char *)pb_output_file_name, "wb");
1654*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_out == NULL) {
1655*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1656*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Output File", err_code);
1657*15dc779aSAndroid Build Coastguard Worker }
1658*15dc779aSAndroid Build Coastguard Worker file_count++;
1659*15dc779aSAndroid Build Coastguard Worker }
1660*15dc779aSAndroid Build Coastguard Worker
1661*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-usac:", 6)) {
1662*15dc779aSAndroid Build Coastguard Worker usac_en = 1;
1663*15dc779aSAndroid Build Coastguard Worker }
1664*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-aot:", 5)) {
1665*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = argv[i] + 5;
1666*15dc779aSAndroid Build Coastguard Worker aot_value = atoi((const char *)(pb_arg_val));
1667*15dc779aSAndroid Build Coastguard Worker if (aot_value == 23 || aot_value == 39) {
1668*15dc779aSAndroid Build Coastguard Worker is_ld_eld = 1;
1669*15dc779aSAndroid Build Coastguard Worker }
1670*15dc779aSAndroid Build Coastguard Worker }
1671*15dc779aSAndroid Build Coastguard Worker
1672*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-adts:", 6)) {
1673*15dc779aSAndroid Build Coastguard Worker pCHAR8 pb_arg_val = argv[i] + 6;
1674*15dc779aSAndroid Build Coastguard Worker if (atoi((const char *)pb_arg_val)) str_context.use_ga_hdr = 0;
1675*15dc779aSAndroid Build Coastguard Worker }
1676*15dc779aSAndroid Build Coastguard Worker
1677*15dc779aSAndroid Build Coastguard Worker if (!strncmp((const char *)argv[i], "-help", 5)) {
1678*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_print_usage();
1679*15dc779aSAndroid Build Coastguard Worker }
1680*15dc779aSAndroid Build Coastguard Worker }
1681*15dc779aSAndroid Build Coastguard Worker
1682*15dc779aSAndroid Build Coastguard Worker printf("\n");
1683*15dc779aSAndroid Build Coastguard Worker if (file_count != 2) {
1684*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1685*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Input or Output File", err_code);
1686*15dc779aSAndroid Build Coastguard Worker }
1687*15dc779aSAndroid Build Coastguard Worker if (is_ld_eld) {
1688*15dc779aSAndroid Build Coastguard Worker str_context.use_ga_hdr = 1;
1689*15dc779aSAndroid Build Coastguard Worker }
1690*15dc779aSAndroid Build Coastguard Worker #ifdef _WIN32
1691*15dc779aSAndroid Build Coastguard Worker #pragma warning(suppress : 6001)
1692*15dc779aSAndroid Build Coastguard Worker #endif
1693*15dc779aSAndroid Build Coastguard Worker
1694*15dc779aSAndroid Build Coastguard Worker if ((strcmp((const char *)pb_output_file_name, "")) && (usac_en || str_context.use_ga_hdr)) {
1695*15dc779aSAndroid Build Coastguard Worker char *file_name = strrchr((const char *)pb_output_file_name, '.');
1696*15dc779aSAndroid Build Coastguard Worker SIZE_T idx = file_name - (char *)pb_output_file_name;
1697*15dc779aSAndroid Build Coastguard Worker memcpy(pb_meta_file_name, pb_output_file_name, idx);
1698*15dc779aSAndroid Build Coastguard Worker strcat((char *)pb_meta_file_name, ".txt");
1699*15dc779aSAndroid Build Coastguard Worker str_context.pf_meta = NULL;
1700*15dc779aSAndroid Build Coastguard Worker str_context.pf_meta = fopen((const char *)pb_meta_file_name, "wt");
1701*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_meta == NULL) {
1702*15dc779aSAndroid Build Coastguard Worker err_code = IA_TESTBENCH_MFMAN_FATAL_FILE_OPEN_FAILED;
1703*15dc779aSAndroid Build Coastguard Worker ia_error_handler(&ia_testbench_error_info, (pWORD8) "Meta File", err_code);
1704*15dc779aSAndroid Build Coastguard Worker }
1705*15dc779aSAndroid Build Coastguard Worker }
1706*15dc779aSAndroid Build Coastguard Worker if (err_code == IA_NO_ERROR)
1707*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_main_process(&str_context, argc - 1, (pWORD8 *)&argv[1]);
1708*15dc779aSAndroid Build Coastguard Worker
1709*15dc779aSAndroid Build Coastguard Worker str_context.use_ga_hdr = 1;
1710*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_inp) fclose(str_context.pf_inp);
1711*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_out) fclose(str_context.pf_out);
1712*15dc779aSAndroid Build Coastguard Worker if (str_context.pf_meta != NULL) {
1713*15dc779aSAndroid Build Coastguard Worker fclose(str_context.pf_meta);
1714*15dc779aSAndroid Build Coastguard Worker str_context.pf_meta = NULL;
1715*15dc779aSAndroid Build Coastguard Worker }
1716*15dc779aSAndroid Build Coastguard Worker }
1717*15dc779aSAndroid Build Coastguard Worker if (param_file_id != NULL) {
1718*15dc779aSAndroid Build Coastguard Worker fclose(param_file_id);
1719*15dc779aSAndroid Build Coastguard Worker }
1720*15dc779aSAndroid Build Coastguard Worker
1721*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1722*15dc779aSAndroid Build Coastguard Worker }
1723