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