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