Coverage Report

Created: 2025-10-27 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_drc_freq_dec.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 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 <string.h>
21
#include <stdio.h>
22
#include <math.h>
23
#include "ixheaac_type_def.h"
24
#include "ixheaacd_sbr_common.h"
25
26
#include "ixheaacd_cnst.h"
27
#include "ixheaac_constants.h"
28
#include "ixheaac_basic_ops32.h"
29
#include "ixheaac_basic_ops16.h"
30
#include "ixheaac_basic_ops40.h"
31
#include "ixheaac_basic_ops.h"
32
#include "ixheaacd_bitbuffer.h"
33
#include "ixheaac_error_standards.h"
34
#include "ixheaac_basic_op.h"
35
#include "ixheaacd_intrinsics.h"
36
#include "ixheaacd_defines.h"
37
38
#include "ixheaacd_aac_rom.h"
39
40
#include "ixheaacd_definitions.h"
41
42
#include "ixheaacd_error_codes.h"
43
44
#include "ixheaacd_pulsedata.h"
45
46
#include "ixheaacd_pns.h"
47
#include "ixheaacd_drc_data_struct.h"
48
49
#include "ixheaacd_lt_predict.h"
50
51
#include "ixheaacd_ec_defines.h"
52
#include "ixheaacd_ec_struct_def.h"
53
#include "ixheaacd_channelinfo.h"
54
#include "ixheaacd_drc_dec.h"
55
#include "ixheaacd_sbrdecoder.h"
56
#include "ixheaacd_block.h"
57
#include "ixheaacd_channel.h"
58
59
#include "ixheaacd_sbr_payload.h"
60
#include "ixheaacd_common_rom.h"
61
#include "ixheaacd_sbrdecsettings.h"
62
#include "ixheaacd_sbr_scale.h"
63
#include "ixheaacd_env_extr_part.h"
64
#include "ixheaacd_sbr_rom.h"
65
#include "ixheaacd_stereo.h"
66
#include "ixheaacd_lpp_tran.h"
67
#include "ixheaacd_hybrid.h"
68
#include "ixheaacd_ps_dec.h"
69
70
#include "ixheaacd_env_extr.h"
71
#include "ixheaacd_adts.h"
72
#include "ixheaacd_audioobjtypes.h"
73
74
#include "ixheaacd_memory_standards.h"
75
76
#include "ixheaacd_latmdemux.h"
77
78
#include "ixheaacd_aacdec.h"
79
#include "ixheaacd_config.h"
80
#include "ixheaacd_mps_polyphase.h"
81
#include "ixheaacd_qmf_dec.h"
82
#include "ixheaacd_mps_macro_def.h"
83
#include "ixheaacd_mps_struct_def.h"
84
#include "ixheaacd_mps_res_rom.h"
85
#include "ixheaacd_mps_aac_struct.h"
86
#include "ixheaacd_mps_dec.h"
87
#include "ixheaacd_struct_def.h"
88
89
1.01G
#define DRC_SBR_ONE_Q25 (1 << 25)
90
91
static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_shift29(WORD32 a,
92
553k
                                                             WORD32 b) {
93
553k
  WORD32 result;
94
553k
  WORD64 temp_result;
95
96
553k
  temp_result = (WORD64)a * (WORD64)b;
97
98
553k
  result = (WORD32)(temp_result >> 29);
99
100
553k
  return (result);
101
553k
}
102
103
static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_shift25(WORD32 a,
104
213M
                                                             WORD32 b) {
105
213M
  WORD32 result;
106
213M
  WORD64 temp_result;
107
108
213M
  temp_result = (WORD64)a * (WORD64)b;
109
110
213M
  temp_result = temp_result >> 25;
111
112
213M
  if (temp_result >= MAX_32)
113
571k
    result = MAX_32;
114
213M
  else if (temp_result < MIN_32)
115
768
    result = MIN_32;
116
213M
  else
117
213M
    result = (WORD32)temp_result;
118
119
213M
  return (result);
120
213M
}
121
122
static const WORD32 ixheaacd_drc_pow_tbl_2_q29[] = {
123
    536870912,  537242967,  537615991,  537988562,  538361391,  538734479,
124
    539108539,  539482144,  539856009,  540230847,  540605230,  540979873,
125
    541354776,  541730654,  542106077,  542481760,  542858421,  543234626,
126
    543611091,  543987817,  544365523,  544742772,  545120282,  545498775,
127
    545876810,  546255106,  546633664,  547013208,  547392292,  547771638,
128
    548151972,  548531845,  548911981,  549293107,  549673770,  550054698,
129
    550435889,  550818073,  551199794,  551581779,  551964758,  552347273,
130
    552730053,  553113099,  553497142,  553880719,  554264562,  554649404,
131
    555033779,  555418421,  555803330,  556189241,  556574683,  556960393,
132
    557347107,  557733352,  558119865,  558506646,  558894433,  559281751,
133
    559669337,  560057931,  560446055,  560834448,  561223110,  561612784,
134
    562001985,  562391456,  562781941,  563171952,  563562234,  563952786,
135
    564344355,  564735450,  565126815,  565519199,  565911108,  566303288,
136
    566695739,  567089213,  567482209,  567875478,  568269771,  568663586,
137
    569057673,  569452034,  569847421,  570242329,  570637511,  571033721,
138
    571429451,  571825455,  572221734,  572619044,  573015873,  573412977,
139
    573811114,  574208769,  574606699,  575005666,  575404148,  575802907,
140
    576201942,  576602016,  577001605,  577401471,  577802378,  578202799,
141
    578603497,  579004473,  579406493,  579808025,  580209836,  580612693,
142
    581015061,  581417708,  581820634,  582224610,  582628095,  583031860,
143
    583436676,  583841002,  584245607,  584650493,  585056433,  585461881,
144
    585867610,  586274395,  586680687,  587087260,  587494116,  587902030,
145
    588309450,  588717152,  589125916,  589534184,  589942735,  590351569,
146
    590761467,  591170869,  591580554,  591991306,  592401560,  592812098,
147
    593222920,  593634813,  594046205,  594457883,  594870633,  595282882,
148
    595695417,  596108238,  596522133,  596935527,  597349207,  597763964,
149
    598178218,  598592760,  599008380,  599423497,  599838901,  600254594,
150
    600671368,  601087637,  601504195,  601921837,  602338973,  602756397,
151
    603174111,  603592913,  604011207,  604429790,  604849464,  605268628,
152
    605688083,  606107829,  606528668,  606948996,  607369615,  607791330,
153
    608212533,  608634029,  609055816,  609478701,  609901074,  610323739,
154
    610747505,  611170757,  611594302,  612018141,  612443083,  612867510,
155
    613292231,  613718058,  614143369,  614568974,  614994874,  615421883,
156
    615848375,  616275162,  616703060,  617130439,  617558114,  617986086,
157
    618415172,  618843738,  619272600,  619702579,  620132037,  620561793,
158
    620991846,  621423019,  621853669,  622284618,  622716688,  623148235,
159
    623580081,  624012226,  624445496,  624878241,  625311285,  625745457,
160
    626179103,  626613049,  627048125,  627482673,  627917523,  628352674,
161
    628788957,  629224712,  629660769,  630097961,  630534623,  630971588,
162
    631408855,  631847261,  632285135,  632723313,  633162631,  633601417,
163
    634040507,  634479901,  634920439,  635360443,  635800752,  636242207,
164
    636683127,  637124352,  637565884,  638008564,  638450708,  638893159,
165
    639336761,  639779826,  640223197,  640666876,  641111710,  641556004,
166
    642000607,  642446367,  642891586,  643337114,  643782951,  644229948,
167
    644676404,  645123169,  645571097,  646018482,  646466177,  646914182,
168
    647363354,  647811981,  648260918,  648711025,  649160586,  649610458,
169
    650060643,  650511999,  650962808,  651413929,  651866225,  652317973,
170
    652770033,  653223271,  653675959,  654128960,  654582276,  655036772,
171
    655490716,  655944976,  656400417,  656855307,  657310512,  657766033,
172
    658222739,  658678891,  659135360,  659593017,  660050119,  660507538,
173
    660965274,  661424202,  661882573,  662341262,  662801145,  663260471,
174
    663720114,  664180077,  664641237,  665101837,  665562757,  666024877,
175
    666486436,  666948316,  667410515,  667873918,  668336759,  668799921,
176
    669264288,  669728093,  670192218,  670656666,  671122323,  671587415,
177
    672052829,  672519455,  672985516,  673451899,  673918605,  674386527,
178
    674853881,  675321559,  675790455,  676258782,  676727434,  677196410,
179
    677666608,  678136235,  678606188,  679077364,  679547969,  680018900,
180
    680490157,  680962642,  681434553,  681906792,  682380260,  682853154,
181
    683326375,  683800829,  684274707,  684748914,  685223450,  685699220,
182
    686174414,  686649938,  687126699,  687602882,  688079395,  688556239,
183
    689034324,  689511829,  689989665,  690468745,  690947244,  691426075,
184
    691905238,  692385648,  692865476,  693345636,  693827046,  694307873,
185
    694789033,  695270526,  695753273,  696235434,  696717930,  697201682,
186
    697684847,  698168347,  698652182,  699137277,  699621784,  700106626,
187
    700592731,  701078246,  701564098,  702050286,  702537740,  703024604,
188
    703511804,  704000273,  704488150,  704976365,  705464918,  705954743,
189
    706443974,  706933544,  707424389,  707914639,  708405228,  708896158,
190
    709388365,  709879976,  710371927,  710865159,  711357793,  711850769,
191
    712345028,  712838688,  713332689,  713827033,  714322665,  714817695,
192
    715313068,  715809731,  716305792,  716802196,  717298945,  717796987,
193
    718294425,  718792207,  719291286,  719789759,  720288578,  720787743,
194
    721288207,  721788064,  722288268,  722789774,  723290672,  723791917,
195
    724293510,  724796408,  725298697,  725801333,  726305278,  726808613,
196
    727312296,  727816328,  728321672,  728826404,  729331485,  729837881,
197
    730343664,  730849797,  731356280,  731864082,  732371269,  732878807,
198
    733387666,  733895909,  734404503,  734913450,  735423722,  735933376,
199
    736443382,  736954717,  737465431,  737976499,  738487922,  739000676,
200
    739512808,  740025295,  740539116,  741052315,  741565869,  742079779,
201
    742595027,  743109650,  743624629,  744140950,  744656644,  745172696,
202
    745690092,  746206860,  746723986,  747241470,  747760302,  748278505,
203
    748797067,  749316978,  749836260,  750355901,  750875903,  751397258,
204
    751917981,  752439065,  752961506,  753483313,  754005482,  754528012,
205
    755051903,  755575159,  756098778,  756623759,  757148104,  757672813,
206
    758197885,  758724324,  759250125,  759776290,  760303825,  760830721,
207
    761357981,  761885607,  762414607,  762942965,  763471690,  764001790,
208
    764531249,  765061074,  765591266,  766122838,  766653766,  767185062,
209
    767717742,  768249775,  768782177,  769314948,  769849106,  770382616,
210
    770916497,  771451767,  771986388,  772521379,  773057763,  773593497,
211
    774129603,  774666080,  775203953,  775741174,  776278768,  776817761,
212
    777356101,  777894814,  778433900,  778974389,  779514224,  780054432,
213
    780596047,  781137005,  781678338,  782220046,  782763164,  783305624,
214
    783848460,  784392709,  784936298,  785480264,  786024607,  786570367,
215
    787115466,  787660942,  788207838,  788754071,  789300683,  789847673,
216
    790396087,  790943837,  791491966,  792041522,  792590412,  793139683,
217
    793689333,  794240415,  794790829,  795341624,  795893853,  796445413,
218
    796997355,  797549679,  798103441,  798656532,  799210006,  799764921,
219
    800319163,  800873790,  801428800,  801985256,  802541037,  803097203,
220
    803654817,  804211755,  804769079,  805326789,  805885951,  806444435,
221
    807003307,  807563633,  808123280,  808683314,  809243737,  809805619,
222
    810366819,  810928409,  811491460,  812053829,  812616587,  813179736,
223
    813744351,  814308281,  814872602,  815438392,  816003496,  816568991,
224
    817135959,  817702240,  818268913,  818835978,  819404520,  819972373,
225
    820540619,  821110344,  821679379,  822248808,  822818632,  823389939,
226
    823960554,  824531564,  825104060,  825675863,  826248061,  826820657,
227
    827394742,  827968132,  828541920,  829117201,  829691784,  830266766,
228
    830842146,  831419024,  831995203,  832571781,  833149860,  833727238,
229
    834305017,  834883195,  835462879,  836041861,  836621243,  837202134,
230
    837782320,  838362909,  838943900,  839526403,  840108200,  840690401,
231
    841274117,  841857125,  842440538,  843025469,  843609691,  844194318,
232
    844779350,  845365905,  845951749,  846537999,  847125775,  847712839,
233
    848300310,  848888187,  849477595,  850066289,  850655390,  851246025,
234
    851835944,  852426272,  853017009,  853609284,  854200840,  854792807,
235
    855386315,  855979103,  856572302,  857165912,  857761068,  858355502,
236
    858950348,  859546742,  860142413,  860738498,  861334995,  861933045,
237
    862530370,  863128110,  863727405,  864325973,  864924957,  865524355,
238
    866125314,  866725545,  867326191,  867928401,  868529881,  869131778,
239
    869734092,  870337974,  870941124,  871544692,  872149831,  872754236,
240
    873359061,  873964304,  874571123,  875177207,  875783710,  876391792,
241
    876999138,  877606904,  878215091,  878824861,  879433893,  880043346,
242
    880654386,  881264685,  881875407,  882486553,  883099289,  883711283,
243
    884323700,  884937712,  885550980,  886164672,  886778790,  887394507,
244
    888009477,  888624873,  889241872,  889858122,  890474799,  891093082,
245
    891710615,  892328577,  892946966,  893566965,  894186213,  894805890,
246
    895427180,  896047717,  896668684,  897290081,  897913096,  898535355,
247
    899158046,  899782358,  900405913,  901029900,  901654319,  902280365,
248
    902905651,  903531370,  904158719,  904785306,  905412328,  906039785,
249
    906668875,  907297202,  907925965,  908556365,  909186000,  909816072,
250
    910446581,  911078730,  911710114,  912341935,  912975401,  913608099,
251
    914241235,  914874810,  915510034,  916144489,  916779383,  917415930,
252
    918051705,  918687921,  919325793,  919962891,  920600432,  921238414,
253
    921878057,  922516924,  923156234,  923797209,  924437406,  925078047,
254
    925719132,  926361886,  927003861,  927646281,  928290373,  928933684,
255
    929577441,  930221644,  930867524,  931512622,  932158166,  932805391,
256
    933451831,  934098719,  934746055,  935395077,  936043312,  936691996,
257
    937342369,  937991953,  938641988,  939292472,  939944651,  940596039,
258
    941247878,  941901414,  942554158,  943207354,  943861002,  944516353,
259
    945170909,  945825918,  946482633,  947138552,  947794925,  948451753,
260
    949110291,  949768030,  950426226,  951086135,  951745243,  952404809,
261
    953064832,  953726573,  954387511,  955048908,  955712027,  956374341,
262
    957037115,  957700348,  958365307,  959029460,  959694074,  960360418,
263
    961025954,  961691951,  962358410,  963026603,  963693987,  964361833,
264
    965031418,  965700191,  966369428,  967039128,  967710571,  968381201,
265
    969052296,  969725137,  970397163,  971069654,  971743897,  972417321,
266
    973091213,  973765571,  974441685,  975116980,  975792742,  976470264,
267
    977146964,  977824133,  978501771,  979181174,  979859753,  980538802,
268
    981219619,  981899611,  982580073,  983261008,  983943715,  984625594,
269
    985307946,  985992074,  986675373,  987359145,  988043392,  988729419,
270
    989414615,  990100286,  990787742,  991474364,  992161462,  992849036,
271
    993538401,  994226929,  994915935,  995606734,  996296696,  996987136,
272
    997678055,  998370772,  999062649,  999755006,  1000449165, 1001142483,
273
    1001836281, 1002531886, 1003226647, 1003921889, 1004617614, 1005315149,
274
    1006011839, 1006709012, 1007407999, 1008106140, 1008804764, 1009503872,
275
    1010204800, 1010904879, 1011605442, 1012307830, 1013009365, 1013711388,
276
    1014413896, 1015118233, 1015821717, 1016525688, 1017231492, 1017936440,
277
    1018641876, 1019347801, 1020055565, 1020762470, 1021469865, 1022179101,
278
    1022887478, 1023596346, 1024305704, 1025016910, 1025727253, 1026438089,
279
    1027150775, 1027862597, 1028574913, 1029287722, 1030002386, 1030716185,
280
    1031430478, 1032146630, 1032861915, 1033577694, 1034293970, 1035012111,
281
    1035729381, 1036447148, 1037166784, 1037885547, 1038604809, 1039324569,
282
    1040046202, 1040766961, 1041488219, 1042211355, 1042933614, 1043656374,
283
    1044379635, 1045104778, 1045829042, 1046553809, 1047280462, 1048006234,
284
    1048732509, 1049459287, 1050187958, 1050915745, 1051644036, 1052374224,
285
    1053103526, 1053833333, 1054563647, 1055295861, 1056027188, 1056759022,
286
    1057492761, 1058225610, 1058958967, 1059694233, 1060428608, 1061163492,
287
    1061898885, 1062636193, 1063372607, 1064109531, 1064848373, 1065586320,
288
    1066324778, 1067063748, 1067804642, 1068544637, 1069285146, 1070027582,
289
    1070769118, 1071511168, 1072253732, 1072998229};
290
291
static const WORD32 ixheaacd_drc_pow_tbl_1_2_q29[] = {
292
    536870912, 536499115, 536126866, 535755584, 535384559, 535013791, 534642573,
293
    534272319, 533902321, 533531874, 533162389, 532793160, 532424187, 532054765,
294
    531686303, 531318096, 530949443, 530581746, 530214304, 529847117, 529479484,
295
    529112805, 528746380, 528379511, 528013594, 527647931, 527282520, 526916667,
296
    526551763, 526187112, 525822018, 525457872, 525093979, 524729644, 524366255,
297
    524003117, 523640231, 523276904, 522914521, 522552389, 522189817, 521828187,
298
    521466807, 521105678, 520744110, 520383480, 520023101, 519662284, 519302404,
299
    518942774, 518583392, 518223574, 517864691, 517506056, 517146985, 516788847,
300
    516430957, 516073315, 515715239, 515358092, 515001193, 514643861, 514287456,
301
    513931299, 513575388, 513219044, 512863627, 512508455, 512152852, 511798173,
302
    511443739, 511089551, 510734932, 510381235, 510027782, 509673901, 509320938,
303
    508968220, 508615746, 508262844, 507910858, 507559117, 507206948, 506855694,
304
    506504683, 506153915, 505802721, 505452439, 505102400, 504751936, 504402382,
305
    504053070, 503704000, 503354506, 503005920, 502657575, 502308807, 501960945,
306
    501613323, 501265280, 500918141, 500571242, 500224583, 499877503, 499531325,
307
    499185386, 498839027, 498493568, 498148348, 497803367, 497457967, 497113465,
308
    496769200, 496424518, 496080731, 495737182, 495393871, 495050143, 494707308,
309
    494364710, 494021696, 493679573, 493337687, 492996037, 492653973, 492312797,
310
    491971857, 491630504, 491290037, 490949805, 490609809, 490269401, 489929876,
311
    489590587, 489250886, 488912067, 488573482, 488235132, 487896371, 487558490,
312
    487220843, 486882786, 486545606, 486208661, 485871948, 485534827, 485198581,
313
    484862569, 484526148, 484190601, 483855286, 483520203, 483184714, 482850096,
314
    482515709, 482180917, 481846994, 481513302, 481179205, 480845976, 480512977,
315
    480180209, 479847037, 479514730, 479182654, 478850174, 478518557, 478187171,
316
    477856013, 477524454, 477193756, 476863286, 476532416, 476202404, 475872622,
317
    475543067, 475213113, 474884015, 474555145, 474225876, 473897462, 473569276,
318
    473241317, 472912959, 472585454, 472258176, 471930501, 471603677, 471277079,
319
    470950707, 470623939, 470298019, 469972325, 469646236, 469320994, 468995977,
320
    468671184, 468345998, 468021656, 467697539, 467373028, 467049359, 466725915,
321
    466402695, 466079083, 465756311, 465433762, 465110822, 464788720, 464466842,
322
    464145186, 463823140, 463501930, 463180943, 462859566, 462539024, 462218703,
323
    461898604, 461578117, 461258462, 460939028, 460619207, 460300216, 459981446,
324
    459662289, 459343960, 459025852, 458707965, 458389691, 458072244, 457755017,
325
    457437405, 457120617, 456804049, 456487700, 456170967, 455855057, 455539365,
326
    455223290, 454908036, 454593000, 454278182, 453962983, 453648601, 453334438,
327
    453019893, 452706164, 452392653, 452079359, 451765685, 451452825, 451140182,
328
    450827160, 450514950, 450202956, 449891179, 449579023, 449267678, 448956548,
329
    448645040, 448334342, 448023858, 447713590, 447402945, 447093107, 446783483,
330
    446473483, 446164288, 445855308, 445546541, 445237400, 444929061, 444620936,
331
    444312437, 444004738, 443697253, 443389981, 443082336, 442775490, 442468856,
332
    442161850, 441855641, 441549645, 441243276, 440937704, 440632343, 440327193,
333
    440021673, 439716946, 439412431, 439107545, 438803452, 438499569, 438195896,
334
    437891855, 437588603, 437285562, 436982152, 436679530, 436377118, 436074915,
335
    435772346, 435470562, 435168987, 434867046, 434565889, 434264941, 433964201,
336
    433663096, 433362772, 433062657, 432762178, 432462478, 432162987, 431863702,
337
    431564055, 431265185, 430966523, 430667498, 430369249, 430071207, 429773371,
338
    429475174, 429177751, 428880534, 428582956, 428286151, 427989552, 427693157,
339
    427396403, 427100420, 426804642, 426508504, 426213136, 425917972, 425623013,
340
    425327695, 425033144, 424738798, 424444094, 424150155, 423856420, 423562888,
341
    423269000, 422975875, 422682953, 422389675, 422097159, 421804845, 421512177,
342
    421220269, 420928563, 420637058, 420345200, 420054100, 419763202, 419471950,
343
    419181454, 418891160, 418601067, 418310622, 418020930, 417731440, 417441598,
344
    417152508, 416863619, 416574930, 416285891, 415997602, 415709512, 415421073,
345
    415133383, 414845892, 414558600, 414270960, 413984066, 413697371, 413410328,
346
    413124031, 412837931, 412552030, 412265782, 411980277, 411694970, 411409316,
347
    411124404, 410839690, 410555172, 410270309, 409986186, 409702260, 409417989,
348
    409134456, 408851120, 408567980, 408284496, 408001748, 407719196, 407436301,
349
    407154140, 406872175, 406590406, 406308294, 406026914, 405745730, 405464204,
350
    405183410, 404902809, 404621868, 404341657, 404061640, 403781816, 403501653,
351
    403222218, 402942976, 402663395, 402384540, 402105878, 401827409, 401548602,
352
    401270518, 400992628, 400714400, 400436895, 400159582, 399882461, 399605003,
353
    399328266, 399051721, 398774839, 398498677, 398222706, 397946927, 397670812,
354
    397395415, 397120208, 396844667, 396569841, 396295206, 396020761, 395745983,
355
    395471919, 395198044, 394923836, 394650341, 394377035, 394103919, 393830471,
356
    393557733, 393285184, 393012304, 392740132, 392468149, 392196355, 391924230,
357
    391652812, 391381582, 391110023, 390839169, 390568502, 390298023, 390027216,
358
    389757112, 389487195, 389216950, 388947407, 388678050, 388408881, 388139384,
359
    387870587, 387601977, 387333040, 387064801, 386796749, 386528371, 386260690,
360
    385993194, 385725883, 385458248, 385191308, 384924553, 384657474, 384391089,
361
    384124887, 383858871, 383592531, 383326883, 383061419, 382795633, 382530537,
362
    382265624, 382000895, 381735845, 381471483, 381207303, 380942804, 380678991,
363
    380415360, 380151913, 379888145, 379625062, 379362162, 379098943, 378836406,
364
    378574052, 378311880, 378049389, 377787580, 377525952, 377264006, 377002741,
365
    376741656, 376480753, 376219533, 375958991, 375698629, 375437951, 375177951,
366
    374918130, 374658489, 374398533, 374139252, 373880151, 373620735, 373361993,
367
    373103430, 372844553, 372586348, 372328322, 372070475, 371812315, 371554825,
368
    371297513, 371039889, 370782934, 370526157, 370269558, 370012648, 369756404,
369
    369500338, 369243961, 368988250, 368732715, 368477358, 368221691, 367966688,
370
    367711861, 367456725, 367202252, 366947954, 366693833, 366439403, 366185634,
371
    365932041, 365678140, 365424898, 365171832, 364918941, 364665743, 364413202,
372
    364160836, 363908164, 363656148, 363404306, 363152639, 362900667, 362649348,
373
    362398204, 362146755, 361895959, 361645336, 361394887, 361144134, 360894032,
374
    360644103, 360393871, 360144289, 359894880, 359645643, 359396104, 359147212,
375
    358898493, 358649472, 358401098, 358152896, 357904865, 357656534, 357408847,
376
    357161332, 356913517, 356666345, 356419344, 356172514, 355925384, 355678897,
377
    355432580, 355185964, 354939988, 354694182, 354448547, 354202614, 353957319,
378
    353712195, 353466772, 353221987, 352977371, 352732459, 352488182, 352244075,
379
    352000137, 351755902, 351512302, 351268870, 351025143, 350782049, 350539123,
380
    350296365, 350053313, 349810892, 349568639, 349326091, 349084174, 348842424,
381
    348600841, 348358965, 348117717, 347876636, 347635263, 347394516, 347153937,
382
    346913523, 346672818, 346432738, 346192824, 345952619, 345713038, 345473622,
383
    345234373, 344994832, 344755914, 344517162, 344278119, 344039698, 343801441,
384
    343563349, 343324969, 343087207, 342849610, 342611725, 342374457, 342137354,
385
    341899962, 341663188, 341426577, 341190130, 340953396, 340717277, 340481321,
386
    340245079, 340009450, 339773984, 339538682, 339303094, 339068117, 338833304,
387
    338598205, 338363717, 338129391, 337895227, 337660780, 337426941, 337193263,
388
    336959303, 336725949, 336492758, 336259728, 336026415, 335793707, 335561161,
389
    335328333, 335096109, 334864046, 334632144, 334399960, 334168380, 333936959,
390
    333705258, 333474158, 333243218, 333012438, 332781379, 332550919, 332320618,
391
    332090038, 331860057, 331630235, 331400573, 331170631, 330941287, 330712101,
392
    330482637, 330253769, 330025060, 329796509, 329567680, 329339446, 329111369,
393
    328883016, 328655256, 328427654, 328200209, 327972488, 327745358, 327518386,
394
    327291138, 327064480, 326837979, 326611635, 326385017, 326158986, 325933113,
395
    325706965, 325481404, 325255999, 325030751, 324805229, 324580293, 324355513,
396
    324130459, 323905990, 323681677, 323457091, 323233088, 323009241, 322785548,
397
    322561584, 322338202, 322114974, 321891476, 321668557, 321445793, 321223183,
398
    321000303, 320778002, 320555855, 320333438, 320111599, 319889913, 319668381,
399
    319446579, 319225354, 319004282, 318782942, 318562176, 318341563, 318121103,
400
    317900376, 317680221, 317460219, 317239950, 317020253, 316800708, 316581315,
401
    316361656, 316142567, 315923630, 315704427, 315485794, 315267311, 315048981,
402
    314830385, 314612356, 314394479, 314176337, 313958761, 313741337, 313523648,
403
    313306525, 313089551, 312872729, 312655643, 312439120, 312222748, 312006113,
404
    311790040, 311574117, 311358344, 311142309, 310926835, 310711510, 310495923,
405
    310280896, 310066019, 309851290, 309636300, 309421869, 309207586, 308993043,
406
    308779057, 308565219, 308351530, 308137581, 307924187, 307710942, 307497437,
407
    307284487, 307071684, 306859029, 306646116, 306433755, 306221542, 306009071,
408
    305797151, 305585378, 305373753, 305161870, 304950537, 304739351, 304527908,
409
    304317014, 304106267, 303895665, 303684808, 303474498, 303264334, 303053915,
410
    302844042, 302634314, 302424732, 302214895, 302005603, 301796456, 301587056,
411
    301378199, 301169486, 300960918, 300752097, 300543819, 300335684, 300127297,
412
    299919451, 299711748, 299504190, 299296380, 299089109, 298881982, 298674603,
413
    298467763, 298261067, 298054513, 297847708, 297641441, 297435316, 297228942,
414
    297023103, 296817406, 296611460, 296406049, 296200780, 295995653, 295790277,
415
    295585435, 295380734, 295175785, 294971367, 294767092, 294562958, 294358576,
416
    294154725, 293951015, 293747058, 293543630, 293340343, 293137197, 292933805,
417
    292730940, 292528217, 292325247, 292122804, 291920501, 291718338, 291515930,
418
    291314047, 291112305, 290910317, 290708854, 290507530, 290306346, 290104918,
419
    289904013, 289703246, 289502236, 289301748, 289101399, 288901189, 288700736,
420
    288500803, 288301008, 288100971, 287901454, 287702074, 287502453, 287303350,
421
    287104385, 286905557, 286706488, 286507937, 286309522, 286110867, 285912728,
422
    285714725, 285516860, 285318755, 285121164, 284923710, 284726017, 284528837,
423
    284331793, 284134885, 283937739, 283741105, 283544606, 283347870, 283151644,
424
    282955554, 282759600, 282563407, 282367725, 282172178, 281976393, 281781117,
425
    281585976, 281390970, 281195728, 281000992, 280806392, 280611555, 280417224,
426
    280223028, 280028966, 279834668, 279640875, 279447217, 279253323, 279059933,
427
    278866676, 278673554, 278480197, 278287342, 278094620, 277901665, 277709211,
428
    277516890, 277324702, 277132281, 276940359, 276748571, 276556549, 276365027,
429
    276173637, 275982379, 275790889, 275599897, 275409037, 275217945, 275027349,
430
    274836885, 274646553, 274455990, 274265922, 274075986, 273885819, 273696146,
431
    273506604, 273317193, 273127553, 272938405, 272749388, 272560141, 272371386,
432
    272182762, 271993908, 271805545, 271617313, 271429211, 271240880, 271053039,
433
    270865327, 270677388, 270489937, 270302615, 270115423, 269928004, 269741072,
434
    269554269, 269367240, 269180696, 268994281, 268807995, 268621484};
435
436
1.89k
#define MUL_DRC_BAND 4
437
438
19.0M
static PLATFORM_INLINE WORD32 ixheaacd_div_by_30(WORD32 op) {
439
19.0M
  WORD32 ret;
440
19.0M
  WORD64 temp;
441
442
19.0M
  temp = (WORD64)op * 35791394;
443
444
19.0M
  ret = (WORD32)((temp + 17895697) >> 30);
445
446
19.0M
  return ret;
447
19.0M
}
448
449
11.7M
static PLATFORM_INLINE WORD32 ixheaacd_div_by_15(WORD64 op) {
450
11.7M
  WORD32 ret;
451
11.7M
  WORD64 temp;
452
453
11.7M
  temp = (WORD64)op * 71582788;
454
455
11.7M
  ret = (WORD32)((temp + 134217728) >> 30);
456
457
11.7M
  return ret;
458
11.7M
}
459
460
static VOID ixheaacd_copy_drc_data(ixheaac_drc_data_struct *ch_data,
461
                                   ixheaac_drc_bs_data_struct *ptr_bs_data,
462
482
                                   WORD32 frame_size) {
463
482
  WORD32 band_num;
464
465
482
  ch_data->n_drc_bands = ptr_bs_data->drc_num_bands;
466
467
482
  if (ch_data->n_drc_bands == 1) {
468
238
    ch_data->n_mdct_bands[0] = frame_size;
469
238
    ch_data->drc_fac[0] = ptr_bs_data->dyn_rng_dlbl[0];
470
238
    ch_data->drc_fac_dvb[0] = ptr_bs_data->dyn_rng_dlbl_dvb[0];
471
472
244
  } else {
473
2.13k
    for (band_num = 0; band_num < ptr_bs_data->drc_num_bands; band_num++) {
474
1.89k
      ch_data->n_mdct_bands[band_num] =
475
1.89k
          (ptr_bs_data->drc_band_top[band_num] + 1) * MUL_DRC_BAND;
476
1.89k
      ch_data->drc_fac[band_num] = ptr_bs_data->dyn_rng_dlbl[band_num];
477
1.89k
      ch_data->drc_fac_dvb[band_num] = ptr_bs_data->dyn_rng_dlbl_dvb[band_num];
478
1.89k
    }
479
244
  }
480
481
482
  ch_data->drc_interp_scheme = ptr_bs_data->drc_interpolation_scheme;
482
482
}
483
484
WORD32 ixheaacd_drc_map_channels(ia_drc_dec_struct *pstr_drc_dec,
485
240k
                                 WORD32 num_channels, WORD32 frame_size) {
486
240k
  WORD32 i, element;
487
240k
  WORD32 num_drc_elements;
488
240k
  ixheaac_drc_bs_data_struct *ptr_bs_data;
489
490
240k
  num_drc_elements = pstr_drc_dec->num_drc_elements;
491
492
240k
  if (num_drc_elements == 0) {
493
239k
    return IA_NO_ERROR;
494
239k
  }
495
496
590
  if (num_drc_elements == 1) {
497
455
  }
498
499
590
  if (num_drc_elements > 1) {
500
267
    for (i = 0; i < num_channels; i++) {
501
138
      WORD32 drc_on = 0;
502
503
578
      for (element = 0; element < num_drc_elements; element++) {
504
440
        ptr_bs_data = &pstr_drc_dec->str_drc_bs_data[element];
505
440
        if (ptr_bs_data->b_channel_on[i]) drc_on++;
506
440
      }
507
508
138
      if (drc_on > 1) {
509
6
        return IA_XHEAAC_DEC_EXE_FATAL_INVALID_DRC_DATA;
510
6
      }
511
138
    }
512
135
  }
513
514
1.45k
  for (element = 0; element < num_drc_elements; element++) {
515
875
    ptr_bs_data = &pstr_drc_dec->str_drc_bs_data[element];
516
875
    if (ptr_bs_data->prog_ref_level_present)
517
235
      pstr_drc_dec->prog_ref_level = ptr_bs_data->prog_ref_level;
518
519
1.78k
    for (i = 0; i < num_channels; i++) {
520
911
      if (!ptr_bs_data->b_channel_on[i]) continue;
521
522
482
      ixheaacd_copy_drc_data(&pstr_drc_dec->str_drc_channel_data[i],
523
482
                             &pstr_drc_dec->str_drc_bs_data[element],
524
482
                             frame_size);
525
482
    }
526
875
  }
527
584
  return IA_NO_ERROR;
528
590
}
529
530
VOID ixheaacd_drc_dec_create(ia_drc_dec_struct *pstr_drc_dec,
531
12.4k
                             WORD16 drc_ref_level, WORD16 drc_def_level) {
532
12.4k
  WORD32 j, k;
533
12.4k
  WORD32 ch;
534
535
12.4k
  pstr_drc_dec->sbr_allowed = 1;
536
12.4k
  pstr_drc_dec->sbr_found = 0;
537
538
12.4k
  pstr_drc_dec->drc_element_found = 0;
539
540
12.4k
  pstr_drc_dec->max_audio_channels = MAX_BS_ELEMENT;
541
12.4k
  pstr_drc_dec->drc_ref_level = drc_ref_level;
542
12.4k
  pstr_drc_dec->drc_def_level = drc_def_level;
543
544
12.4k
  pstr_drc_dec->num_drc_elements = 0;
545
12.4k
  pstr_drc_dec->target_ref_level = 108;
546
12.4k
  pstr_drc_dec->prog_ref_level = 108;
547
12.4k
  pstr_drc_dec->cut_factor = 0;
548
12.4k
  pstr_drc_dec->boost_factor = 0;
549
12.4k
  pstr_drc_dec->drc_on = 0;
550
12.4k
  pstr_drc_dec->drc_dig_norm = 1;
551
12.4k
  pstr_drc_dec->pres_mode = -1;
552
553
12.4k
  pstr_drc_dec->length_history = 2;
554
12.4k
  if (pstr_drc_dec->sbr_allowed) pstr_drc_dec->length_history++;
555
556
136k
  for (ch = 0; ch < MAX_BS_ELEMENT; ch++) {
557
124k
    ixheaac_drc_data_struct *pstr_drc_data =
558
124k
        (ixheaac_drc_data_struct *)&pstr_drc_dec->str_drc_channel_data[ch];
559
124k
    pstr_drc_dec->drc_channel_next_index[ch] = 0;
560
124k
    pstr_drc_dec->state = 0;
561
562
8.07M
    for (j = 0; j < 64; j++) {
563
516M
      for (k = 0; k < 64; k++) {
564
508M
        pstr_drc_data->drc_factors_sbr[j][k] = DRC_SBR_ONE_Q25;
565
508M
        pstr_drc_data->drc_factors_sbr_lat[j][k] = DRC_SBR_ONE_Q25;
566
508M
      }
567
7.95M
    }
568
2.11M
    for (j = 0; j < MAX_DRC_BANDS; j++) pstr_drc_data->drc_fac[j] = 0;
569
570
124k
    pstr_drc_data->n_mdct_bands[0] = FRAME_SIZE;
571
124k
    pstr_drc_data->drc_exp = 1;
572
124k
    pstr_drc_data->short_block = 0;
573
124k
    pstr_drc_data->drc_interp_scheme = 0;
574
124k
    pstr_drc_data->n_drc_bands = 1;
575
124k
    pstr_drc_data->new_prog_ref_level = 0;
576
124k
    pstr_drc_data->new_drc_fac = 0;
577
124k
  }
578
12.4k
}
579
580
static WORD32 ixheaacd_drc_excluded_channels(ia_bit_buf_struct *it_bit_buf,
581
233
                                             WORD32 nch, UWORD8 *b_channel_on) {
582
233
  WORD32 ich, nbyte = 0;
583
233
  WORD32 num_excl_chan;
584
233
  UWORD8 exclude_mask;
585
586
233
  num_excl_chan = 7;
587
1.86k
  for (ich = 0; ich < 7; ich++) {
588
1.63k
    exclude_mask = ixheaacd_read_bits_buf(it_bit_buf, 1);
589
1.63k
    if (ich < nch) {
590
1.63k
      b_channel_on[ich] = !exclude_mask;
591
1.63k
    }
592
1.63k
  }
593
233
  nbyte++;
594
595
765
  while (ixheaacd_read_bits_buf(it_bit_buf, 1)) {
596
4.22k
    for (ich = num_excl_chan; ich < num_excl_chan + 7; ich++) {
597
3.69k
      exclude_mask = ixheaacd_read_bits_buf(it_bit_buf, 1);
598
3.69k
      if (ich < nch) {
599
153
        b_channel_on[ich] = !exclude_mask;
600
153
      }
601
3.69k
    }
602
532
    nbyte++;
603
532
    num_excl_chan += 7;
604
532
  }
605
606
233
  return nbyte;
607
233
}
608
609
static WORD32 ixheaacd_drc_element_read(
610
444
    ia_bit_buf_struct *it_bit_buf, ixheaac_drc_bs_data_struct *pstr_bs_data) {
611
444
  WORD32 ich, idrc, nbyte = 1;
612
444
  WORD32 pce_tag_present, drc_bands_present;
613
444
  WORD32 excluded_chns_present;
614
444
  UWORD8 drc_band_incr;
615
444
  WORD8 max_dyn_rng_dlbl = -128;
616
617
444
  pstr_bs_data->drc_num_bands = 1;
618
619
444
  pce_tag_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
620
444
  if (pce_tag_present) {
621
276
    ixheaacd_read_bits_buf(it_bit_buf, 4);/*pce_instance_tag*/
622
276
    ixheaacd_read_bits_buf(it_bit_buf, 4);/*drc_tag_reserved_bits*/
623
276
    nbyte++;
624
276
  }
625
626
3.97k
  for (ich = 0; ich < MAX_AUDIO_CHANNELS; ich++) {
627
3.52k
    pstr_bs_data->b_channel_on[ich] = 1;
628
3.52k
  }
629
630
444
  excluded_chns_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
631
444
  if (excluded_chns_present) {
632
233
    nbyte += ixheaacd_drc_excluded_channels(it_bit_buf, MAX_AUDIO_CHANNELS,
633
233
                                            pstr_bs_data->b_channel_on);
634
233
  }
635
636
444
  drc_bands_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
637
444
  if (drc_bands_present) {
638
162
    drc_band_incr = ixheaacd_read_bits_buf(it_bit_buf, 4);
639
162
    pstr_bs_data->drc_interpolation_scheme = ixheaacd_read_bits_buf(it_bit_buf, 4);
640
162
    nbyte++;
641
642
162
    pstr_bs_data->drc_num_bands += drc_band_incr;
643
1.44k
    for (idrc = 0; idrc < pstr_bs_data->drc_num_bands; idrc++) {
644
1.28k
      pstr_bs_data->drc_band_top[idrc] = ixheaacd_read_bits_buf(it_bit_buf, 8);
645
1.28k
      nbyte++;
646
1.28k
    }
647
282
  } else {
648
282
    pstr_bs_data->drc_band_top[0] = FRAME_SIZE / 4 - 1;
649
282
    pstr_bs_data->drc_interpolation_scheme = 0;
650
282
  }
651
652
444
  pstr_bs_data->prog_ref_level_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
653
444
  if (pstr_bs_data->prog_ref_level_present) {
654
142
    pstr_bs_data->prog_ref_level = ixheaacd_read_bits_buf(it_bit_buf, 7);
655
656
142
    ixheaacd_read_bits_buf(it_bit_buf, 1);/*prog_ref_level_reserved_bits*/
657
142
    nbyte++;
658
142
  }
659
660
1.96k
  for (idrc = 0; idrc < pstr_bs_data->drc_num_bands; idrc++) {
661
1.52k
    WORD32 sign = ixheaacd_read_bits_buf(it_bit_buf, 1);
662
1.52k
    pstr_bs_data->dyn_rng_dlbl[idrc] = ixheaacd_read_bits_buf(it_bit_buf, 7);
663
1.52k
    if (sign)
664
775
      pstr_bs_data->dyn_rng_dlbl[idrc] = -pstr_bs_data->dyn_rng_dlbl[idrc];
665
1.52k
    max_dyn_rng_dlbl = max(max_dyn_rng_dlbl, pstr_bs_data->dyn_rng_dlbl[idrc]);
666
667
1.52k
    nbyte++;
668
1.52k
  }
669
444
  pstr_bs_data->max_dyn_rng_dlbl = max_dyn_rng_dlbl;
670
671
444
  return nbyte;
672
444
}
673
674
static WORD32 ixheaacd_drc_read_compression(ia_bit_buf_struct *it_bit_buf,
675
                                         ia_drc_dec_struct *pstr_drc_dec,
676
73
                                         WORD32 bs_pos) {
677
73
  WORD32 bit_count = 0;
678
73
  WORD32 dmx_lvl_present, ext_present, compression_present;
679
73
  WORD32 coarse_gain_present, fine_grain_present;
680
73
  ia_bit_buf_struct local_bs = {0};
681
73
  WORD32 bytes = 0, bits = 0;
682
683
73
  memcpy(&local_bs, it_bit_buf, sizeof(ia_bit_buf_struct));
684
685
73
  if (local_bs.size < bs_pos) {
686
1
    longjmp(*(local_bs.xaac_jmp_buf),
687
1
            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
688
1
  }
689
72
  bytes = (local_bs.size - bs_pos) >> 3;
690
72
  bits = (local_bs.size - bs_pos) % 8;
691
692
72
  local_bs.cnt_bits = bs_pos;
693
72
  local_bs.ptr_read_next = local_bs.ptr_bit_buf_base;
694
72
  local_bs.ptr_read_next += bytes;
695
72
  local_bs.bit_pos = 7 - bits;
696
697
72
  if (ixheaacd_read_bits_buf(&local_bs, 8) != DVB_ANC_DATA_SYNC_BYTE) {
698
0
    return 0;
699
0
  }
700
701
72
  if (ixheaacd_read_bits_buf(&local_bs, 2) != 3) return 0;
702
703
68
  ixheaacd_read_bits_buf(&local_bs, 2);
704
68
  pstr_drc_dec->pres_mode = ixheaacd_read_bits_buf(&local_bs, 2);
705
68
  ixheaacd_read_bits_buf(&local_bs, 1);
706
68
  if (ixheaacd_read_bits_buf(&local_bs, 1) != 0) return 0;
707
708
62
  if (ixheaacd_read_bits_buf(&local_bs, 3) != 0) return 0;
709
710
56
  dmx_lvl_present = ixheaacd_read_bits_buf(&local_bs, 1);
711
56
  ext_present = ixheaacd_read_bits_buf(&local_bs, 1);
712
56
  compression_present = ixheaacd_read_bits_buf(&local_bs, 1);
713
56
  coarse_gain_present = ixheaacd_read_bits_buf(&local_bs, 1);
714
56
  fine_grain_present = ixheaacd_read_bits_buf(&local_bs, 1);
715
56
  bit_count += 24;
716
717
56
  if (dmx_lvl_present) {
718
42
    ixheaacd_read_bits_buf(&local_bs, 8);
719
42
    bit_count += 8;
720
42
  }
721
722
56
  if (compression_present) {
723
32
    UWORD8 compression_on, compression_val;
724
725
32
    if (ixheaacd_read_bits_buf(&local_bs, 7) != 0) return 0;
726
727
22
    compression_on = (UWORD8)ixheaacd_read_bits_buf(&local_bs, 1);
728
22
    compression_val = (UWORD8)ixheaacd_read_bits_buf(&local_bs, 8);
729
22
    bit_count += 16;
730
731
22
    if (compression_on) {
732
4
      pstr_drc_dec->str_drc_bs_data[0].drc_num_bands = 1;
733
4
      pstr_drc_dec->str_drc_bs_data[0].dyn_rng_dlbl_dvb[0] = compression_val;
734
4
      pstr_drc_dec->str_drc_bs_data[0].drc_band_top[0] = (1024 >> 2) - 1;
735
4
      pstr_drc_dec->drc_ref_level = -1;
736
4
      pstr_drc_dec->str_drc_bs_data[0].drc_data_type = DVB_DRC_ANC_DATA;
737
18
    } else {
738
18
      pstr_drc_dec->str_drc_bs_data[0].drc_num_bands = 1;
739
18
      pstr_drc_dec->str_drc_bs_data[0].dyn_rng_dlbl_dvb[0] = (WORD8)0x80;
740
18
      pstr_drc_dec->str_drc_bs_data[0].drc_band_top[0] = (1024 >> 2) - 1;
741
18
      pstr_drc_dec->str_drc_bs_data[0].drc_data_type = DVB_DRC_ANC_DATA;
742
743
18
      if (compression_val != 0) return 0;
744
18
    }
745
22
  }
746
747
36
  if (coarse_gain_present) {
748
13
    ixheaacd_read_bits_buf(&local_bs, 16);
749
13
    bit_count += 16;
750
13
  }
751
36
  if (fine_grain_present) {
752
4
    ixheaacd_read_bits_buf(&local_bs, 16);
753
4
    bit_count += 16;
754
4
  }
755
756
36
  if (ext_present) {
757
23
    WORD32 ext_bits = 8;
758
759
23
    ixheaacd_read_bits_buf(&local_bs, 1);
760
23
    if (ixheaacd_read_bits_buf(&local_bs, 1)) ext_bits += 8;
761
23
    if (ixheaacd_read_bits_buf(&local_bs, 1)) ext_bits += 16;
762
23
    if (ixheaacd_read_bits_buf(&local_bs, 1)) ext_bits += 8;
763
764
23
    ixheaacd_read_bits_buf(&local_bs, ext_bits - 4);
765
23
    bit_count += ext_bits;
766
23
  }
767
768
36
  return (bit_count);
769
56
}
770
771
WORD32 ixheaacd_dec_drc_read_element(ia_drc_dec_struct *pstr_drc_dec,
772
                                     ia_drc_dec_struct *drc_dummy,
773
444
                                     ia_bit_buf_struct *it_bit_buf) {
774
444
  WORD32 bits_read = 0;
775
444
  if (pstr_drc_dec->num_drc_elements < pstr_drc_dec->max_audio_channels) {
776
444
    bits_read = ixheaacd_drc_element_read(
777
444
        it_bit_buf, &pstr_drc_dec->str_drc_bs_data[pstr_drc_dec->num_drc_elements]);
778
779
444
    if (pstr_drc_dec->dvb_anc_data_present) {
780
73
      ixheaacd_drc_read_compression(
781
73
          it_bit_buf, pstr_drc_dec, pstr_drc_dec->dvb_anc_data_pos);
782
73
    }
783
444
    pstr_drc_dec->num_drc_elements++;
784
785
444
  } else {
786
0
    ixheaac_drc_bs_data_struct drc_ele_dummy;
787
788
0
    bits_read = ixheaacd_drc_element_read(it_bit_buf, &drc_ele_dummy);
789
0
    if (pstr_drc_dec->dvb_anc_data_present) {
790
0
      ixheaacd_drc_read_compression(
791
0
          it_bit_buf, drc_dummy, pstr_drc_dec->dvb_anc_data_pos);
792
0
    }
793
0
  }
794
795
444
  pstr_drc_dec->dvb_anc_data_present = 0;
796
797
444
  return bits_read;
798
444
}
799
800
static const WORD32 ixheaacd_drc_offset[2][16] = {
801
    {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0},
802
803
    {0, 4, 8, 12, 16, 19, 22, 26, 0, 0, 0, 0, 0, 0, 0, 0}};
804
805
817k
WORD32 ixheaacd_get_div_value_24(WORD32 value) {
806
817k
  WORD32 ret;
807
817k
  WORD64 temp;
808
809
817k
  temp = (WORD64)value * 44739243;
810
811
817k
  ret = (WORD32)((temp + 22369621) >> 30);
812
813
817k
  return ret;
814
817k
}
815
816
289k
WORD32 ixheaacd_get_div_value_2400(WORD32 value) {
817
289k
  WORD32 ret;
818
289k
  WORD64 temp;
819
820
289k
  temp = (WORD64)value * 447392;
821
822
289k
  ret = (WORD32)((temp + 223696) >> 30);
823
824
289k
  return ret;
825
289k
}
826
827
168
static WORD32 ixheaacd_drc_div_120_floor(WORD32 value) {
828
168
  WORD32 ret_val;
829
168
  WORD64 temp;
830
831
168
  temp = (WORD64)value * 8947849;
832
833
168
  ret_val = (WORD32)(temp >> 30);
834
835
168
  return ret_val;
836
168
}
837
838
1.26k
static WORD32 ixheaacd_drc_floor(WORD32 bottom, WORD32 frame_size) {
839
1.26k
  WORD32 ret_val;
840
1.26k
  if (960 == frame_size) {
841
56
    ret_val = ixheaacd_drc_div_120_floor(bottom);
842
56
    ret_val *= 30;
843
56
    ret_val = ret_val >> 3;
844
1.20k
  } else {
845
1.20k
    ret_val = bottom >> 7;
846
1.20k
    ret_val = ret_val << 2;
847
1.20k
  }
848
1.26k
  return ret_val;
849
1.26k
}
850
851
1.26k
static WORD32 ixheaacd_drc_ceil(WORD32 top, WORD32 frame_size) {
852
1.26k
  WORD32 ret_val;
853
1.26k
  if (960 == frame_size) {
854
56
    top += 119;
855
56
    ret_val = ixheaacd_drc_div_120_floor(top);
856
56
    ret_val *= 30;
857
56
    ret_val = ret_val >> 3;
858
1.20k
  } else {
859
1.20k
    top += 127;
860
1.20k
    ret_val = top >> 7;
861
1.20k
    ret_val = ret_val << 2;
862
1.20k
  }
863
1.26k
  return ret_val;
864
1.26k
}
865
866
1.26k
static WORD32 ixheaacd_drc_get_bottom_qmf(WORD32 bottom, WORD32 frame_size) {
867
1.26k
  WORD32 ret_val;
868
1.26k
  if (960 == frame_size) {
869
56
    ret_val = bottom % 120;
870
56
    ret_val = ret_val << 5;
871
56
    ret_val = ixheaacd_drc_div_120_floor(ret_val);
872
1.20k
  } else {
873
1.20k
    ret_val = bottom & 0x7F;
874
1.20k
    ret_val = ret_val >> 2;
875
1.20k
  }
876
1.26k
  return ret_val;
877
1.26k
};
878
879
VOID ixheaacd_drc_apply(ia_drc_dec_struct *pstr_drc_dec,
880
                        WORD32 *ptr_spectral_coef, WORD32 win_seq, WORD32 channel,
881
263k
                        WORD32 frame_size, WORD32 esbr_flag, WORD32 audio_object_type) {
882
263k
  WORD32 drc_band, spec_pos, start_pos, end_pos;
883
263k
  WORD32 low_hi, drc_norm, drc_freq_fac;
884
263k
  WORD32 drc_fac, div_val, mod_val, ret_val, offset_value;
885
263k
  const WORD32 *table;
886
263k
  ixheaac_drc_data_struct *pstr_drc_data;
887
263k
  WORD32 num_qmf_sub_sample = (frame_size >> 5);
888
263k
  WORD32 num_qmf_sub_sample_by_2 = (frame_size >> 6);
889
263k
  WORD32 diff_ref_level;
890
891
263k
  WORD32 *drc_sbr_factors[64];
892
263k
  WORD32 qmf_start_pos, qmf_stop_pos, qmf_start, i, j;
893
263k
  WORD32 prev_frame_drc_sbr_factors[64];
894
263k
  WORD32 *ptr_drc_fac;
895
896
263k
  if ((audio_object_type != AOT_ER_AAC_ELD) && (audio_object_type != AOT_ER_AAC_LD)
897
123k
      && esbr_flag)
898
123k
  {
899
8.01M
    for (i = 0; i < SBR_QMF_SUB_SAMPLES; i++)
900
7.89M
    {
901
513M
      for (j = 0; j < SBR_QMF_SUB_BANDS; j++)
902
505M
      {
903
505M
        pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr[i][j] =
904
505M
          pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[i][j];
905
505M
      }
906
7.89M
    }
907
4.07M
    for (j = 0; j < 32; j++)
908
3.94M
    {
909
3.94M
      memcpy(pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[j],
910
3.94M
             pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[j + 32],
911
3.94M
             SBR_QMF_SUB_BANDS * sizeof(WORD32));
912
3.94M
    }
913
123k
    ptr_drc_fac =
914
123k
      &pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[0][0];
915
140k
  } else {
916
140k
    ptr_drc_fac =
917
140k
      &pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr[0][0];
918
140k
  }
919
17.1M
  for (i = 0; i < 64; i++) {
920
16.8M
    drc_sbr_factors[i] = ptr_drc_fac;
921
16.8M
    ptr_drc_fac += 64;
922
16.8M
  }
923
924
263k
  memcpy(prev_frame_drc_sbr_factors,
925
263k
         drc_sbr_factors[2 * num_qmf_sub_sample - 1], 64 * sizeof(WORD32));
926
927
263k
  pstr_drc_data = &pstr_drc_dec->str_drc_channel_data[channel];
928
263k
  if (!pstr_drc_dec->drc_on) return;
929
930
263k
  if (pstr_drc_dec->drc_dig_norm) {
931
263k
    diff_ref_level =
932
263k
        pstr_drc_dec->target_ref_level - pstr_drc_dec->prog_ref_level;
933
934
263k
    if (diff_ref_level < 0) {
935
1.93k
      diff_ref_level = -diff_ref_level;
936
1.93k
      table = ixheaacd_drc_pow_tbl_2_q29;
937
1.93k
      div_val = ixheaacd_get_div_value_24(diff_ref_level);
938
1.93k
      drc_norm = 1 << (25 + div_val);
939
1.93k
      mod_val = diff_ref_level - (div_val * 24);
940
1.93k
      diff_ref_level = mod_val * 1000;
941
942
261k
    } else {
943
261k
      table = ixheaacd_drc_pow_tbl_1_2_q29;
944
261k
      div_val = ixheaacd_get_div_value_24(diff_ref_level);
945
261k
      drc_norm = 1 << (25 - div_val);
946
261k
      mod_val = diff_ref_level - (div_val * 24);
947
261k
      diff_ref_level = mod_val * 1000;
948
261k
    }
949
263k
    ret_val = ixheaacd_get_div_value_24(diff_ref_level);
950
263k
    drc_norm = ixheaacd_mult32x16in32_shift29(drc_norm, table[ret_val]);
951
952
263k
  } else {
953
0
    drc_norm = (1 << 25);
954
0
  }
955
956
263k
  start_pos = 0;
957
553k
  for (drc_band = 0; drc_band < pstr_drc_data->n_drc_bands; drc_band++) {
958
289k
    if ((pstr_drc_dec->str_drc_bs_data[0].drc_data_type == DVB_DRC_ANC_DATA) &&
959
56
        (pstr_drc_dec->heavy_mode)) {
960
20
      WORD32 val_x, val_y;
961
20
      float compression_factor;
962
20
      float temp;
963
20
      val_x = ((UWORD8)pstr_drc_data->drc_fac_dvb[drc_band]) >> 4;
964
20
      val_y = ((UWORD8)pstr_drc_data->drc_fac_dvb[drc_band]) & 0x0F;
965
966
20
      compression_factor = (FLOAT32)(48.164 - 6.0206 * val_x - 0.4014 * val_y);
967
968
20
      temp = (FLOAT32)(pow(10, (float)compression_factor / 20.0));
969
20
      drc_freq_fac = (WORD32)(temp * 33554431.0f);
970
971
289k
    } else {
972
289k
      if (pstr_drc_data->drc_fac[drc_band] < 0) {
973
27.0k
        low_hi = pstr_drc_dec->cut_factor;
974
262k
      } else {
975
262k
        low_hi = pstr_drc_dec->boost_factor;
976
262k
      }
977
978
289k
      {
979
289k
        drc_fac =
980
289k
            pstr_drc_dec->str_drc_channel_data[channel].drc_fac[drc_band] *
981
289k
            low_hi;
982
289k
        if (drc_fac < 0) {
983
0
          drc_fac *= -1;
984
0
          table = ixheaacd_drc_pow_tbl_1_2_q29;
985
986
0
          div_val = ixheaacd_get_div_value_2400(drc_fac);
987
0
          drc_freq_fac = 1 << (25 - div_val);
988
989
0
          mod_val = drc_fac - (div_val * 2400);
990
0
          drc_fac = mod_val * 10;
991
289k
        } else {
992
289k
          table = ixheaacd_drc_pow_tbl_2_q29;
993
994
289k
          div_val = ixheaacd_get_div_value_2400(drc_fac);
995
289k
          drc_freq_fac = 1 << (25 + div_val);
996
997
289k
          mod_val = drc_fac - (div_val * 2400);
998
289k
          drc_fac = mod_val * 10;
999
289k
        }
1000
1001
289k
        ret_val = ixheaacd_get_div_value_24(drc_fac);
1002
1003
289k
        drc_freq_fac =
1004
289k
            ixheaacd_mult32x16in32_shift29(drc_freq_fac, table[ret_val]);
1005
1006
289k
        drc_freq_fac = ixheaacd_mult32x16in32_shift25(drc_freq_fac, drc_norm);
1007
289k
      }
1008
289k
    }
1009
1010
289k
    end_pos = pstr_drc_data->n_mdct_bands[drc_band];
1011
1012
289k
    if (!pstr_drc_dec->sbr_found) {
1013
213M
      for (spec_pos = start_pos; spec_pos < end_pos; spec_pos++) {
1014
213M
        ptr_spectral_coef[spec_pos] = ixheaacd_mult32x16in32_shift25(
1015
213M
            ptr_spectral_coef[spec_pos], drc_freq_fac);
1016
213M
      }
1017
209k
    }
1018
1019
289k
    if (pstr_drc_dec->sbr_found) {
1020
80.1k
      if (win_seq != EIGHT_SHORT_SEQUENCE) {
1021
78.8k
        if (960 == frame_size) {
1022
35.7k
          qmf_start = ixheaacd_div_by_30(start_pos);
1023
35.7k
          offset_value = 1;
1024
43.1k
        } else {
1025
43.1k
          qmf_start = start_pos >> 5;
1026
43.1k
          offset_value = 0;
1027
43.1k
        }
1028
1029
3.29M
        for (j = -num_qmf_sub_sample_by_2; j < num_qmf_sub_sample; j++) {
1030
3.21M
          WORD32 alpha_val = 0;
1031
1032
3.21M
          if (j + num_qmf_sub_sample_by_2 < num_qmf_sub_sample) {
1033
2.14M
            if (pstr_drc_data->drc_interp_scheme == 0) {
1034
1.36M
              alpha_val = (j + num_qmf_sub_sample_by_2);
1035
88.5M
              for (i = qmf_start; i < 64; i++) {
1036
87.2M
                WORD64 temp_drc = (WORD64)alpha_val * drc_freq_fac +
1037
87.2M
                                  (num_qmf_sub_sample - alpha_val) *
1038
87.2M
                                      (WORD64)prev_frame_drc_sbr_factors[i];
1039
1040
87.2M
                if (frame_size == 512) {
1041
6.14M
                  drc_sbr_factors[num_qmf_sub_sample + j][i] =
1042
6.14M
                      (WORD32)(temp_drc >> 4);
1043
81.0M
                } else if (frame_size == 480) {
1044
11.7M
                  drc_sbr_factors[num_qmf_sub_sample + j][i] =
1045
11.7M
                      ixheaacd_div_by_15(temp_drc);
1046
69.3M
                } else {
1047
69.3M
                  drc_sbr_factors[num_qmf_sub_sample + j][i] =
1048
69.3M
                      (WORD32)(temp_drc >> 5);
1049
69.3M
                }
1050
1051
87.2M
                if (960 == frame_size) {
1052
19.0M
                  drc_sbr_factors[num_qmf_sub_sample + j][i] =
1053
19.0M
                      ixheaacd_div_by_30(
1054
19.0M
                          drc_sbr_factors[num_qmf_sub_sample + j][i]);
1055
19.0M
                }
1056
87.2M
              }
1057
1058
1.36M
            } else {
1059
785k
              if (j + num_qmf_sub_sample_by_2 >=
1060
785k
                  ixheaacd_drc_offset[offset_value]
1061
785k
                                     [pstr_drc_data->drc_interp_scheme - 1]) {
1062
779k
                alpha_val = 1;
1063
40.5M
                for (i = qmf_start; i < 64; i++) {
1064
39.7M
                  drc_sbr_factors[num_qmf_sub_sample + j][i] = drc_freq_fac;
1065
39.7M
                }
1066
779k
              } else {
1067
5.62k
                alpha_val = 0;
1068
280k
                for (i = qmf_start; i < 64; i++) {
1069
275k
                  drc_sbr_factors[num_qmf_sub_sample + j][i] =
1070
275k
                      prev_frame_drc_sbr_factors[i];
1071
275k
                }
1072
5.62k
              }
1073
785k
            }
1074
2.14M
          } else {
1075
1.06M
            alpha_val = 1;
1076
64.2M
            for (i = qmf_start; i < 64; i++) {
1077
63.2M
              drc_sbr_factors[num_qmf_sub_sample + j][i] = drc_freq_fac;
1078
63.2M
            }
1079
1.06M
          }
1080
3.21M
        }
1081
78.8k
      } else {
1082
1.26k
        qmf_start_pos = ixheaacd_drc_floor(start_pos, frame_size);
1083
1084
1.26k
        qmf_stop_pos = ixheaacd_drc_ceil(end_pos, frame_size);
1085
1086
1.26k
        qmf_start = ixheaacd_drc_get_bottom_qmf(start_pos, frame_size);
1087
26.0k
        for (j = qmf_start_pos; j < qmf_stop_pos; j++) {
1088
24.7k
          if (j > qmf_start_pos && ((j & 0x03) == 0)) {
1089
5.18k
            qmf_start = 0;
1090
5.18k
          }
1091
1.58M
          for (i = qmf_start; i < 64; i++) {
1092
1.56M
            drc_sbr_factors[num_qmf_sub_sample + j][i] = drc_freq_fac;
1093
1.56M
          }
1094
24.7k
        }
1095
1.26k
      }
1096
80.1k
    }
1097
1098
289k
    start_pos = end_pos;
1099
289k
  }
1100
1101
263k
  if (win_seq != EIGHT_SHORT_SEQUENCE) {
1102
215k
    pstr_drc_data->prev_interp_scheme = pstr_drc_data->drc_interp_scheme;
1103
215k
  } else {
1104
47.8k
    pstr_drc_data->prev_interp_scheme = 8;
1105
47.8k
  }
1106
263k
}