1 /******************************************************************************
2 * *
3 * Copyright (C) 2024 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #include <stdlib.h>
21 #include <string.h>
22 #include <math.h>
23 #include <float.h>
24 #include "ixheaac_type_def.h"
25 #include "ixheaac_error_standards.h"
26 #include "ixheaace_error_codes.h"
27 #include "ixheaace_api.h"
28 #include "ixheaace_loudness_measurement.h"
29 #include "iusace_cnst.h"
30 #include "ixheaac_constants.h"
31
32 FLOAT64 a_coeff_pre_flt[12][3] = {
33 {0, -1.84460946989011, 0.85584332293064}, /* 96000Hz sample_rate*/
34 {0, -1.83091998796233, 0.84414226108785}, /* 88200Hz sample_rate*/
35 {0, -1.76738637827624, 0.79175893605869}, /* 64000Hz sample_rate*/
36 {0, -1.69065929318241, 0.73248077421585}, /* 48000Hz sample_rate*/
37 {0, -1.66365511325602, 0.71259542807323}, /* 44100Hz sample_rate*/
38 {0, -1.53904509625064, 0.62696685598156}, /* 32000Hz sample_rate*/
39 {0, -1.39023460519282, 0.53683848126040}, /* 24000Hz sample_rate*/
40 {0, -1.33830533606613, 0.50824455891360}, /* 22050Hz sample_rate*/
41 {0, -1.10153376910699, 0.39491236874986}, /* 16000Hz sample_rate*/
42 {0, -0.82398044060334, 0.29429059828526}, /* 12000Hz sample_rate*/
43 {0, -0.73075690963163, 0.26764083061798}, /* 11025Hz sample_rate*/
44 {0, -0.29338078241492, 0.18687510604541}}; /* 8000Hz sample_rate*/
45
46 FLOAT64 b_coeff_pre_flt[12][3] = {
47 {1.55971422897580, -2.92674157825108, 1.37826120231582}, /* 96000Hz sample_rate*/
48 {1.55751537557965, -2.90562707992635, 1.36133397747221}, /* 88200Hz sample_rate*/
49 {1.54734277602520, -2.80819560855113, 1.28522539030837}, /* 64000Hz sample_rate*/
50 {1.53512485958697, -2.69169618940638, 1.19839281085285}, /* 48000Hz sample_rate*/
51 {1.53084123005034, -2.65097999515473, 1.16907907992158}, /* 44100Hz sample_rate*/
52 {1.51117789956876, -2.46488941336014, 1.04163327352229}, /* 32000Hz sample_rate*/
53 {1.48790022096228, -2.24620546814114, 0.90490912324644}, /* 24000Hz sample_rate*/
54 {1.47982535097775, -2.17072861285683, 0.86084248472655}, /* 22050Hz sample_rate*/
55 {1.44329522349136, -1.83157538126046, 0.68165875741197}, /* 16000Hz sample_rate*/
56 {1.40101638596118, -1.44343141964020, 0.51272519136094}, /* 12000Hz sample_rate*/
57 {1.38693639705635, -1.31515305817747, 0.46510058210747}, /* 11025Hz sample_rate*/
58 {1.32162356892998, -0.72625549131569, 0.29812624601620}}; /* 8000Hz sample_rate*/
59
60 FLOAT64 a_coeff_RLB_flt[12][3] = {
61 {0, -1.99501754472472, 0.99502375904092}, /* 96000Hz sample_rate*/
62 {0, -1.99457751545034, 0.99458487587805}, /* 88200Hz sample_rate*/
63 {0, -1.99253095794890, 0.99254492277827}, /* 64000Hz sample_rate*/
64 {0, -1.99004745483398, 0.99007225036621}, /* 48000Hz sample_rate*/
65 {0, -1.98916967362979, 0.98919903578704}, /* 44100Hz sample_rate*/
66 {0, -1.98508966898868, 0.98514532066955}, /* 32000Hz sample_rate*/
67 {0, -1.98014412622893, 0.98024281785928}, /* 24000Hz sample_rate*/
68 {0, -1.97839760259012, 0.97851441950325}, /* 22050Hz sample_rate*/
69 {0, -1.97028952800443, 0.97051049053584}, /* 16000Hz sample_rate*/
70 {0, -1.96048317995201, 0.96087407552357}, /* 12000Hz sample_rate*/
71 {0, -1.95712192483092, 0.95758214578578}, /* 11025Hz sample_rate*/
72 {0, -1.94101334282922, 0.94188430416850}}; /* 8000Hz sample_rate*/
73
74 FLOAT64 b_coeff_RLB_flt[12][3] = {
75 {1.00247575433736, -2.00497008989074, 1.00247575433736}, /* 96000Hz sample_rate*/
76 {1.00225631275593, -2.00453006061636, 1.00225631275593}, /* 88200Hz sample_rate*/
77 {1.00123633620603, -2.00248350311492, 1.00123633620603}, /* 64000Hz sample_rate*/
78 {1.0, -2.0, 1.0}, /* 48000Hz sample_rate*/
79 {0.99956006454251, -1.9991201290850, 0.99956006454251}, /* 44100Hz sample_rate*/
80 {0.99751647782627, -1.9950329556525, 0.99751647782627}, /* 32000Hz sample_rate*/
81 {0.99508528374654, -1.99009667139495, 0.99508528374654}, /* 24000Hz sample_rate*/
82 {0.99422108456853, -1.98835014775614, 0.99422108456853}, /* 22050Hz sample_rate*/
83 {0.99021912008482, -1.98024207317045, 0.99021912008482}, /* 16000Hz sample_rate*/
84 {0.98540091257869, -1.97043572511803, 0.98540091257869}, /* 12000Hz sample_rate*/
85 {0.98375494770979, -1.96707446999694, 0.98375494770979}, /* 11025Hz sample_rate*/
86 {0.97590602690115, -1.95096588799524, 0.97590602690115}}; /* 8000Hz sample_rate*/
87
ixheaace_map_sample_rate(WORD32 sample_rate,ixheaace_loudness_struct * pstr_loudness_hdl)88 static WORD32 ixheaace_map_sample_rate(WORD32 sample_rate,
89 ixheaace_loudness_struct *pstr_loudness_hdl) {
90 WORD32 mapped_sample_rate = sample_rate;
91
92 if ((mapped_sample_rate >= 0) && (mapped_sample_rate < 9391)) {
93 mapped_sample_rate = 8000;
94 pstr_loudness_hdl->sample_rate_idx = 11;
95 } else if ((mapped_sample_rate >= 9391) && (mapped_sample_rate < 11502)) {
96 mapped_sample_rate = 11025;
97 pstr_loudness_hdl->sample_rate_idx = 10;
98 } else if ((mapped_sample_rate >= 11502) && (mapped_sample_rate < 13856)) {
99 mapped_sample_rate = 12000;
100 pstr_loudness_hdl->sample_rate_idx = 9;
101 } else if ((mapped_sample_rate >= 13856) && (mapped_sample_rate < 18783)) {
102 mapped_sample_rate = 16000;
103 pstr_loudness_hdl->sample_rate_idx = 8;
104 } else if ((mapped_sample_rate >= 18783) && (mapped_sample_rate < 23004)) {
105 mapped_sample_rate = 22050;
106 pstr_loudness_hdl->sample_rate_idx = 7;
107 } else if ((mapped_sample_rate >= 23004) && (mapped_sample_rate < 27713)) {
108 mapped_sample_rate = 24000;
109 pstr_loudness_hdl->sample_rate_idx = 6;
110 } else if ((mapped_sample_rate >= 27713) && (mapped_sample_rate < 37566)) {
111 mapped_sample_rate = 32000;
112 pstr_loudness_hdl->sample_rate_idx = 5;
113 } else if ((mapped_sample_rate >= 37566) && (mapped_sample_rate < 46009)) {
114 mapped_sample_rate = 44100;
115 pstr_loudness_hdl->sample_rate_idx = 4;
116 } else if ((mapped_sample_rate >= 46009) && (mapped_sample_rate < 55426)) {
117 mapped_sample_rate = 48000;
118 pstr_loudness_hdl->sample_rate_idx = 3;
119 } else if ((mapped_sample_rate >= 55426) && (mapped_sample_rate < 75132)) {
120 mapped_sample_rate = 64000;
121 pstr_loudness_hdl->sample_rate_idx = 2;
122 } else if ((mapped_sample_rate >= 75132) && (mapped_sample_rate < 92017)) {
123 mapped_sample_rate = 88200;
124 pstr_loudness_hdl->sample_rate_idx = 1;
125 } else if (mapped_sample_rate >= 92017) {
126 mapped_sample_rate = 96000;
127 pstr_loudness_hdl->sample_rate_idx = 0;
128 } else {
129 mapped_sample_rate = 48000;
130 pstr_loudness_hdl->sample_rate_idx = 3;
131 }
132 return mapped_sample_rate;
133 }
134
ixheaace_loudness_info_get_handle_size()135 WORD32 ixheaace_loudness_info_get_handle_size() {
136 return IXHEAAC_GET_SIZE_ALIGNED(sizeof(ixheaace_loudness_struct), BYTE_ALIGN_8);
137 }
ixheaace_loudness_init_params(pVOID loudness_handle,ixheaace_input_config * pstr_input_config,ixheaace_output_config * pstr_output_config)138 IA_ERRORCODE ixheaace_loudness_init_params(pVOID loudness_handle,
139 ixheaace_input_config *pstr_input_config,
140 ixheaace_output_config *pstr_output_config) {
141 UWORD32 count = 0;
142 UWORD8 temp_count = 0;
143 IA_ERRORCODE err_code = IA_NO_ERROR;
144 ixheaace_loudness_struct *pstr_loudness_hdl = (ixheaace_loudness_struct *)loudness_handle;
145 memset(pstr_loudness_hdl, 0, sizeof(ixheaace_loudness_struct));
146 pstr_loudness_hdl->sample_rate =
147 ixheaace_map_sample_rate(pstr_input_config->i_samp_freq, pstr_loudness_hdl);
148
149 pstr_output_config->samp_freq = pstr_loudness_hdl->sample_rate;
150 pstr_loudness_hdl->length = pstr_input_config->aac_config.length;
151 pstr_loudness_hdl->pcm_sz = pstr_input_config->ui_pcm_wd_sz;
152 if (pstr_loudness_hdl->pcm_sz != 16) {
153 return (IA_EXHEAACE_CONFIG_FATAL_PCM_WDSZ);
154 }
155 pstr_loudness_hdl->n_channels = pstr_input_config->i_channels;
156 if (pstr_loudness_hdl->n_channels > 2 || pstr_loudness_hdl->n_channels < 1) {
157 return (IA_EXHEAACE_CONFIG_FATAL_NUM_CHANNELS);
158 }
159 pstr_loudness_hdl->num_samples_per_ch = (pstr_loudness_hdl->sample_rate / 10);
160 pstr_loudness_hdl->sum_square = 0;
161 pstr_loudness_hdl->mom_loudness_first_time_flag = 1;
162
163 pstr_loudness_hdl->count_fn_call_mmstl = 0;
164 pstr_loudness_hdl->sl_first_time_flag = 1;
165 pstr_loudness_hdl->local_sl_count = 0;
166 pstr_loudness_hdl->short_term_loudness_overlap = IXHEAACE_SL_OVERLAP;
167
168 pstr_loudness_hdl->no_of_mf = IXHEAACE_SEC_TO_100MS_FACTOR;
169 pstr_loudness_hdl->no_of_mf -= IXHEAACE_MOMENTARY_LOUDNESS_OVERLAP;
170 pstr_loudness_hdl->no_of_stf =
171 (((pstr_loudness_hdl->no_of_mf + IXHEAACE_MOMENTARY_LOUDNESS_OVERLAP) - 30) /
172 (30 - pstr_loudness_hdl->short_term_loudness_overlap)) +
173 1;
174
175 pstr_loudness_hdl->tot_int_val_stf_passing_abs_gate = 0;
176 pstr_loudness_hdl->curr_stf_no = 0;
177 pstr_loudness_hdl->loop_curr_stf_no = 0;
178 pstr_loudness_hdl->no_of_stf_passing_abs_gate = 0;
179 pstr_loudness_hdl->max_lra_count = pstr_loudness_hdl->no_of_stf;
180 pstr_loudness_hdl->loop_ml_count_fn_call = 0;
181 pstr_loudness_hdl->ml_count_fn_call = 0;
182 pstr_loudness_hdl->max_il_buf_size = pstr_loudness_hdl->no_of_mf;
183 pstr_loudness_hdl->get_intergrated_loudness = 1;
184 pstr_loudness_hdl->max_sample_val = FLT_EPSILON;
185
186 for (count = 0; count < pstr_loudness_hdl->n_channels; count++) {
187 for (temp_count = 0; temp_count < IXHEAACE_LOUDNESS_NUM_TAPS; temp_count++) {
188 pstr_loudness_hdl->w[0][count][temp_count] = 0;
189 pstr_loudness_hdl->w[1][count][temp_count] = 0;
190 }
191 }
192
193 for (count = 0; count < 4; count++) {
194 pstr_loudness_hdl->prev_four_sum_square[count] = 0;
195 }
196
197 for (count = 0; count < 30; count++) {
198 pstr_loudness_hdl->prev_thirty_sum_square[count] = 0;
199 }
200
201 count = 0;
202 while (count < (pstr_loudness_hdl->no_of_stf)) {
203 pstr_loudness_hdl->temp_stf_instances_loudness[count] = 0;
204 count++;
205 }
206
207 count = 0;
208 while (count < (pstr_loudness_hdl->no_of_stf)) {
209 pstr_loudness_hdl->stf_instances[count].short_term_loudness =
210 IXHEAACE_DEFAULT_SHORT_TERM_LOUDENSS;
211 pstr_loudness_hdl->stf_instances[count].int_val = 0;
212 pstr_loudness_hdl->stf_instances[count].passes_abs_gate = FALSE;
213 count++;
214 }
215
216 count = 0;
217 while (count < pstr_loudness_hdl->no_of_mf) {
218 pstr_loudness_hdl->mf_instances[count].momentary_loudness =
219 IXHEAACE_DEFAULT_MOMENTARY_LOUDENSS;
220 pstr_loudness_hdl->mf_instances[count].int_val = 0.0;
221 pstr_loudness_hdl->mf_instances[count].passes_abs_gate = FALSE;
222 count++;
223 }
224 return err_code;
225 }
226
ixheaace_loudness_gen_flt(FLOAT64 * a,FLOAT64 * b,FLOAT64 * w,FLOAT64 input)227 static FLOAT64 ixheaace_loudness_gen_flt(FLOAT64 *a, FLOAT64 *b, FLOAT64 *w, FLOAT64 input) {
228 FLOAT64 output = 0;
229 UWORD8 count;
230
231 for (count = 0; count <= IXHEAACE_LOUDNESS_NUM_TAPS - 2; count++) {
232 w[count] = w[count + 1];
233 }
234 w[IXHEAACE_LOUDNESS_NUM_TAPS - 1] = 0;
235
236 for (count = 1; count <= IXHEAACE_LOUDNESS_NUM_TAPS - 1; count++) {
237 w[IXHEAACE_LOUDNESS_NUM_TAPS - 1] += a[count] * w[IXHEAACE_LOUDNESS_NUM_TAPS - count - 1];
238 }
239 w[IXHEAACE_LOUDNESS_NUM_TAPS - 1] = input - w[IXHEAACE_LOUDNESS_NUM_TAPS - 1];
240
241 for (count = 0; count <= IXHEAACE_LOUDNESS_NUM_TAPS - 1; count++) {
242 output += b[count] * w[IXHEAACE_LOUDNESS_NUM_TAPS - count - 1];
243 }
244
245 return output;
246 }
247
ixheaace_loudness_k_flt(FLOAT64 input,ixheaace_loudness_struct * pstr_loudness_hdl,UWORD8 channel_no)248 static FLOAT64 ixheaace_loudness_k_flt(FLOAT64 input, ixheaace_loudness_struct *pstr_loudness_hdl,
249 UWORD8 channel_no) {
250 FLOAT64 temp;
251 temp = ixheaace_loudness_gen_flt(a_coeff_pre_flt[pstr_loudness_hdl->sample_rate_idx],
252 b_coeff_pre_flt[pstr_loudness_hdl->sample_rate_idx],
253 pstr_loudness_hdl->w[IXHEAACE_LOUDNESS_PRE_FLT][channel_no],
254 input);
255
256 temp = ixheaace_loudness_gen_flt(a_coeff_RLB_flt[pstr_loudness_hdl->sample_rate_idx],
257 b_coeff_RLB_flt[pstr_loudness_hdl->sample_rate_idx],
258 pstr_loudness_hdl->w[IXHEAACE_LOUDNESS_RLB_FLT][channel_no],
259 temp);
260
261 return temp;
262 }
263
ixheaace_measure_sum_square(WORD16 ** input,ixheaace_loudness_struct * pstr_loudness_hdl)264 static VOID ixheaace_measure_sum_square(WORD16 **input,
265 ixheaace_loudness_struct *pstr_loudness_hdl) {
266 FLOAT64 tot_one_channel = 0;
267 FLOAT64 sum_square = 0;
268 UWORD32 count = 0;
269 FLOAT64 temp = 0;
270 UWORD8 channel_no = 0;
271 FLOAT64 input_sample;
272 for (channel_no = 0; channel_no < pstr_loudness_hdl->n_channels; channel_no++) {
273 tot_one_channel = 0;
274 for (count = 0; count < pstr_loudness_hdl->num_samples_per_ch; count++) {
275 input_sample = (FLOAT64)input[channel_no][count] / 32768.0;
276 pstr_loudness_hdl->max_sample_val =
277 MAX(fabs(input_sample), pstr_loudness_hdl->max_sample_val);
278 temp = ixheaace_loudness_k_flt(input_sample, pstr_loudness_hdl, channel_no);
279 tot_one_channel = tot_one_channel + (temp * temp);
280 }
281 sum_square += tot_one_channel;
282 }
283 pstr_loudness_hdl->sum_square = sum_square;
284 }
285
ixheaace_measure_momentary_loudness(ixheaace_loudness_struct * pstr_loudness_hdl)286 static FLOAT64 ixheaace_measure_momentary_loudness(ixheaace_loudness_struct *pstr_loudness_hdl) {
287 FLOAT64 sum = 0;
288 FLOAT64 momentary_loudness;
289 UWORD32 count = 0;
290 FLOAT64 old_ml_val, db_old_ml_val;
291 {
292 for (count = 0; count <= 2; count++) {
293 pstr_loudness_hdl->prev_four_sum_square[count] =
294 pstr_loudness_hdl->prev_four_sum_square[count + 1];
295 sum += pstr_loudness_hdl->prev_four_sum_square[count];
296 }
297
298 pstr_loudness_hdl->prev_four_sum_square[3] = pstr_loudness_hdl->sum_square;
299 sum += pstr_loudness_hdl->prev_four_sum_square[3];
300
301 if ((pstr_loudness_hdl->mom_loudness_first_time_flag == 1) &&
302 (pstr_loudness_hdl->count_fn_call_mmstl <= 2)) {
303 momentary_loudness = IXHEAACE_LOUDNESS_DONT_PASS;
304 } else {
305 pstr_loudness_hdl->mom_loudness_first_time_flag = 0;
306 momentary_loudness =
307 -0.691 + 10 * log10(sum / ((FLOAT64)(4 * pstr_loudness_hdl->num_samples_per_ch)));
308
309 if (pstr_loudness_hdl->get_intergrated_loudness == 1) {
310 old_ml_val =
311 pstr_loudness_hdl->mf_instances[pstr_loudness_hdl->loop_ml_count_fn_call].int_val;
312 pstr_loudness_hdl->mf_instances[pstr_loudness_hdl->loop_ml_count_fn_call].int_val =
313 sum / ((FLOAT64)(4 * pstr_loudness_hdl->num_samples_per_ch));
314 db_old_ml_val = pstr_loudness_hdl->mf_instances[pstr_loudness_hdl->loop_ml_count_fn_call]
315 .momentary_loudness;
316 pstr_loudness_hdl->mf_instances[pstr_loudness_hdl->loop_ml_count_fn_call]
317 .momentary_loudness = momentary_loudness;
318 if (pstr_loudness_hdl->mf_instances[pstr_loudness_hdl->loop_ml_count_fn_call]
319 .momentary_loudness >= IXHEAACE_ABS_GATE) {
320 if (db_old_ml_val < IXHEAACE_ABS_GATE) {
321 pstr_loudness_hdl->no_of_mf_passing_abs_gate++;
322 old_ml_val = 0;
323 }
324
325 pstr_loudness_hdl->tot_int_val_mf_passing_abs_gate =
326 pstr_loudness_hdl->tot_int_val_mf_passing_abs_gate +
327 (pstr_loudness_hdl->mf_instances[pstr_loudness_hdl->loop_ml_count_fn_call].int_val -
328 old_ml_val);
329 } else {
330 if (db_old_ml_val >= IXHEAACE_ABS_GATE) {
331 pstr_loudness_hdl->no_of_mf_passing_abs_gate--;
332 pstr_loudness_hdl->tot_int_val_mf_passing_abs_gate =
333 pstr_loudness_hdl->tot_int_val_mf_passing_abs_gate - old_ml_val;
334 }
335 }
336
337 pstr_loudness_hdl->loop_ml_count_fn_call++;
338 if (pstr_loudness_hdl->ml_count_fn_call < pstr_loudness_hdl->max_il_buf_size)
339 pstr_loudness_hdl->ml_count_fn_call++;
340
341 pstr_loudness_hdl->loop_ml_count_fn_call =
342 pstr_loudness_hdl->loop_ml_count_fn_call % pstr_loudness_hdl->max_il_buf_size;
343 }
344 }
345 }
346 return (momentary_loudness);
347 }
348
ixheaace_measure_integrated_loudness(pVOID loudness_handle)349 FLOAT64 ixheaace_measure_integrated_loudness(pVOID loudness_handle) {
350 UWORD32 count = 0;
351 FLOAT64 avg = 0;
352 FLOAT64 loudness = 0;
353 ixheaace_loudness_struct *pstr_loudness_hdl = (ixheaace_loudness_struct *)loudness_handle;
354 pstr_loudness_hdl->no_of_mf_passing_rel_gate = 0;
355 pstr_loudness_hdl->tot_int_val_mf_passing_rel_gate = 0;
356
357 avg = (pstr_loudness_hdl->tot_int_val_mf_passing_abs_gate /
358 pstr_loudness_hdl->no_of_mf_passing_abs_gate);
359 pstr_loudness_hdl->rel_gate = -0.691 + 10 * log10(avg) - 10;
360
361 while (count < pstr_loudness_hdl->ml_count_fn_call) {
362 if (pstr_loudness_hdl->mf_instances[count].momentary_loudness >=
363 pstr_loudness_hdl->rel_gate) {
364 pstr_loudness_hdl->no_of_mf_passing_rel_gate++;
365 pstr_loudness_hdl->tot_int_val_mf_passing_rel_gate +=
366 pstr_loudness_hdl->mf_instances[count].int_val;
367 }
368 count++;
369 }
370
371 loudness = -0.691 + 10 * log10((pstr_loudness_hdl->tot_int_val_mf_passing_rel_gate /
372 (FLOAT64)pstr_loudness_hdl->no_of_mf_passing_rel_gate));
373
374 return loudness;
375 }
376
ixheaace_measure_loudness(pVOID loudness_handle,WORD16 ** samples)377 FLOAT64 ixheaace_measure_loudness(pVOID loudness_handle, WORD16 **samples) {
378 FLOAT64 loudness_value;
379 ixheaace_loudness_struct *pstr_loudness_hdl = (ixheaace_loudness_struct *)loudness_handle;
380 ixheaace_measure_sum_square(samples, pstr_loudness_hdl);
381 loudness_value = ixheaace_measure_momentary_loudness(pstr_loudness_hdl);
382 pstr_loudness_hdl->count_fn_call_mmstl++;
383 return loudness_value;
384 }
385
ixheaace_measure_sample_peak_value(pVOID loudness_handle)386 FLOAT32 ixheaace_measure_sample_peak_value(pVOID loudness_handle) {
387 FLOAT32 sample_peak_value;
388 ixheaace_loudness_struct *pstr_loudness_hdl = (ixheaace_loudness_struct *)loudness_handle;
389 sample_peak_value = (FLOAT32)(20 * log10(pstr_loudness_hdl->max_sample_val));
390 return sample_peak_value;
391 }