xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_loudness_measurement.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 }