Home | History | Annotate | Download | only in decoder
      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 
     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 
     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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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;
    676   WORD32 bytes = 0, bits = 0;
    677 
    678   memcpy(&local_bs, bs, sizeof(ia_bit_buf_struct));
    679 
    680   bytes = (local_bs.size - bs_pos) >> 3;
    681   bits = (local_bs.size - bs_pos) % 8;
    682 
    683   local_bs.cnt_bits = bs_pos;
    684   local_bs.ptr_read_next = local_bs.ptr_bit_buf_base;
    685   local_bs.ptr_read_next += bytes;
    686   local_bs.bit_pos = 7 - bits;
    687 
    688   if (ixheaacd_read_bits_buf(&local_bs, 8) != DVB_ANC_DATA_SYNC_BYTE) {
    689     return 0;
    690   }
    691 
    692   if (ixheaacd_read_bits_buf(&local_bs, 2) != 3) return 0;
    693 
    694   ixheaacd_read_bits_buf(&local_bs, 2);
    695   pstr_drc_dec->pres_mode = ixheaacd_read_bits_buf(&local_bs, 2);
    696   ixheaacd_read_bits_buf(&local_bs, 1);
    697   if (ixheaacd_read_bits_buf(&local_bs, 1) != 0) return 0;
    698 
    699   if (ixheaacd_read_bits_buf(&local_bs, 3) != 0) return 0;
    700 
    701   dmx_lvl_present = ixheaacd_read_bits_buf(&local_bs, 1);
    702   ext_present = ixheaacd_read_bits_buf(&local_bs, 1);
    703   compression_present = ixheaacd_read_bits_buf(&local_bs, 1);
    704   coarse_gain_present = ixheaacd_read_bits_buf(&local_bs, 1);
    705   fine_grain_present = ixheaacd_read_bits_buf(&local_bs, 1);
    706   bit_count += 24;
    707 
    708   if (dmx_lvl_present) {
    709     ixheaacd_read_bits_buf(&local_bs, 8);
    710     bit_count += 8;
    711   }
    712 
    713   if (compression_present) {
    714     UWORD8 compression_on, compression_val;
    715 
    716     if (ixheaacd_read_bits_buf(&local_bs, 7) != 0) return 0;
    717 
    718     compression_on = (UWORD8)ixheaacd_read_bits_buf(&local_bs, 1);
    719     compression_val = (UWORD8)ixheaacd_read_bits_buf(&local_bs, 8);
    720     bit_count += 16;
    721 
    722     if (compression_on) {
    723       pstr_drc_dec->str_drc_bs_data[0].drc_num_bands = 1;
    724       pstr_drc_dec->str_drc_bs_data[0].dyn_rng_dlbl_dvb[0] = compression_val;
    725       pstr_drc_dec->str_drc_bs_data[0].drc_band_top[0] = (1024 >> 2) - 1;
    726       pstr_drc_dec->drc_ref_level = -1;
    727       pstr_drc_dec->str_drc_bs_data[0].drc_data_type = DVB_DRC_ANC_DATA;
    728     } else {
    729       pstr_drc_dec->str_drc_bs_data[0].drc_num_bands = 1;
    730       pstr_drc_dec->str_drc_bs_data[0].dyn_rng_dlbl_dvb[0] = (WORD8)0x80;
    731       pstr_drc_dec->str_drc_bs_data[0].drc_band_top[0] = (1024 >> 2) - 1;
    732       pstr_drc_dec->str_drc_bs_data[0].drc_data_type = DVB_DRC_ANC_DATA;
    733 
    734       if (compression_val != 0) return 0;
    735     }
    736   }
    737 
    738   if (coarse_gain_present) {
    739     ixheaacd_read_bits_buf(&local_bs, 16);
    740     bit_count += 16;
    741   }
    742   if (fine_grain_present) {
    743     ixheaacd_read_bits_buf(&local_bs, 16);
    744     bit_count += 16;
    745   }
    746 
    747   if (ext_present) {
    748     int ext_bits = 8;
    749 
    750     ixheaacd_read_bits_buf(&local_bs, 1);
    751     if (ixheaacd_read_bits_buf(&local_bs, 1)) ext_bits += 8;
    752     if (ixheaacd_read_bits_buf(&local_bs, 1)) ext_bits += 16;
    753     if (ixheaacd_read_bits_buf(&local_bs, 1)) ext_bits += 8;
    754 
    755     ixheaacd_read_bits_buf(&local_bs, ext_bits - 4);
    756     bit_count += ext_bits;
    757   }
    758 
    759   return (bit_count);
    760 }
    761 
    762 WORD32 ixheaacd_dec_drc_read_element(ia_drc_dec_struct *pstr_drc_dec,
    763                                      ia_drc_dec_struct *drc_dummy,
    764                                      ia_handle_bit_buf_struct bs) {
    765   WORD32 bits_read = 0;
    766   WORD32 bits_parse = 0;
    767   if (pstr_drc_dec->num_drc_elements < pstr_drc_dec->max_audio_channels) {
    768     bits_read = ixheaacd_drc_element_read(
    769         bs, &pstr_drc_dec->str_drc_bs_data[pstr_drc_dec->num_drc_elements]);
    770 
    771     if (pstr_drc_dec->dvb_anc_data_present) {
    772       bits_parse = ixheaacd_drc_read_compression(
    773           bs, pstr_drc_dec, pstr_drc_dec->dvb_anc_data_pos);
    774     }
    775     pstr_drc_dec->num_drc_elements++;
    776 
    777   } else {
    778     ixheaac_drc_bs_data_struct drc_ele_dummy;
    779 
    780     bits_read = ixheaacd_drc_element_read(bs, &drc_ele_dummy);
    781     if (pstr_drc_dec->dvb_anc_data_present) {
    782       bits_parse = ixheaacd_drc_read_compression(
    783           bs, drc_dummy, pstr_drc_dec->dvb_anc_data_pos);
    784     }
    785   }
    786 
    787   pstr_drc_dec->dvb_anc_data_present = 0;
    788 
    789   return bits_read;
    790 }
    791 
    792 static const WORD32 ixheaacd_drc_offset[2][16] = {
    793     {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0},
    794 
    795     {0, 4, 8, 12, 16, 19, 22, 26, 0, 0, 0, 0, 0, 0, 0, 0}};
    796 
    797 WORD32 ixheaacd_get_div_value_24(WORD32 value) {
    798   WORD32 ret;
    799   WORD64 temp;
    800 
    801   temp = (WORD64)value * 44739243;
    802 
    803   ret = (WORD32)((temp + 22369621) >> 30);
    804 
    805   return ret;
    806 }
    807 
    808 WORD32 ixheaacd_get_div_value_2400(WORD32 value) {
    809   WORD32 ret;
    810   WORD64 temp;
    811 
    812   temp = (WORD64)value * 447392;
    813 
    814   ret = (WORD32)((temp + 223696) >> 30);
    815 
    816   return ret;
    817 }
    818 
    819 static WORD32 ixheaacd_drc_div_120_floor(WORD32 value) {
    820   WORD32 ret_val;
    821   WORD64 temp;
    822 
    823   temp = (WORD64)value * 8947849;
    824 
    825   ret_val = (WORD32)(temp >> 30);
    826 
    827   return ret_val;
    828 }
    829 
    830 static WORD32 ixheaacd_drc_floor(WORD32 bottom, WORD32 frame_size) {
    831   WORD32 ret_val;
    832   if (960 == frame_size) {
    833     ret_val = ixheaacd_drc_div_120_floor(bottom);
    834     ret_val *= 30;
    835     ret_val = ret_val >> 3;
    836   } else {
    837     ret_val = bottom >> 7;
    838     ret_val = ret_val << 2;
    839   }
    840   return ret_val;
    841 }
    842 
    843 static WORD32 ixheaacd_drc_ceil(WORD32 top, WORD32 frame_size) {
    844   WORD32 ret_val;
    845   if (960 == frame_size) {
    846     top += 119;
    847     ret_val = ixheaacd_drc_div_120_floor(top);
    848     ret_val *= 30;
    849     ret_val = ret_val >> 3;
    850   } else {
    851     top += 127;
    852     ret_val = top >> 7;
    853     ret_val = ret_val << 2;
    854   }
    855   return ret_val;
    856 }
    857 
    858 static WORD32 ixheaacd_drc_get_bottom_qmf(WORD32 bottom, WORD32 frame_size) {
    859   WORD32 ret_val;
    860   if (960 == frame_size) {
    861     ret_val = bottom % 120;
    862     ret_val = ret_val << 5;
    863     ret_val = ixheaacd_drc_div_120_floor(ret_val);
    864   } else {
    865     ret_val = bottom & 0x7F;
    866     ret_val = ret_val >> 2;
    867   }
    868   return ret_val;
    869 };
    870 
    871 VOID ixheaacd_drc_apply(ia_drc_dec_struct *pstr_drc_dec,
    872                         WORD32 *ptr_spectral_coef, WORD32 win_seq,
    873                         WORD32 channel, WORD32 frame_size) {
    874   WORD32 drc_band, spec_pos, start_pos, end_pos;
    875   WORD32 low_hi, drc_norm, drc_freq_fac;
    876   WORD32 drc_fac, div_val, mod_val, ret_val, offset_value;
    877   WORD32 *table;
    878   ixheaac_drc_data_struct *pstr_drc_data;
    879   WORD32 num_qmf_sub_sample = (frame_size >> 5);
    880   WORD32 num_qmf_sub_sample_by_2 = (frame_size >> 6);
    881   WORD32 diff_ref_level;
    882 
    883   WORD32 *drc_sbr_factors[64];
    884   WORD32 qmf_start_pos, qmf_stop_pos, qmf_start, i, j;
    885   WORD32 prev_frame_drc_sbr_factors[64];
    886   WORD32 *ptr_drc_fac;
    887   ptr_drc_fac =
    888       &pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr[0][0];
    889 
    890   for (i = 0; i < 64; i++) {
    891     drc_sbr_factors[i] = ptr_drc_fac;
    892     ptr_drc_fac += 64;
    893   }
    894 
    895   memcpy(prev_frame_drc_sbr_factors,
    896          drc_sbr_factors[2 * num_qmf_sub_sample - 1], 64 * sizeof(WORD32));
    897 
    898   pstr_drc_data = &pstr_drc_dec->str_drc_channel_data[channel];
    899   if (!pstr_drc_dec->drc_on) return;
    900 
    901   if (pstr_drc_dec->drc_dig_norm) {
    902     diff_ref_level =
    903         pstr_drc_dec->target_ref_level - pstr_drc_dec->prog_ref_level;
    904 
    905     if (diff_ref_level < 0) {
    906       diff_ref_level = -diff_ref_level;
    907       table = ixheaacd_drc_pow_tbl_2_q29;
    908       div_val = ixheaacd_get_div_value_24(diff_ref_level);
    909       drc_norm = 1 << (25 + div_val);
    910       mod_val = diff_ref_level - (div_val * 24);
    911       diff_ref_level = mod_val * 1000;
    912 
    913     } else {
    914       table = ixheaacd_drc_pow_tbl_1_2_q29;
    915       div_val = ixheaacd_get_div_value_24(diff_ref_level);
    916       drc_norm = 1 << (25 - div_val);
    917       mod_val = diff_ref_level - (div_val * 24);
    918       diff_ref_level = mod_val * 1000;
    919     }
    920     ret_val = ixheaacd_get_div_value_24(diff_ref_level);
    921     drc_norm = ixheaacd_mult32x16in32_shift29(drc_norm, table[ret_val]);
    922 
    923   } else {
    924     drc_norm = (1 << 25);
    925   }
    926 
    927   start_pos = 0;
    928   for (drc_band = 0; drc_band < pstr_drc_data->n_drc_bands; drc_band++) {
    929     if ((pstr_drc_dec->str_drc_bs_data[0].drc_data_type == DVB_DRC_ANC_DATA) &&
    930         (pstr_drc_dec->heavy_mode)) {
    931       int val_x, val_y;
    932       float compression_factor;
    933       float temp;
    934       val_x = ((UWORD8)pstr_drc_data->drc_fac_dvb[drc_band]) >> 4;
    935       val_y = ((UWORD8)pstr_drc_data->drc_fac_dvb[drc_band]) & 0x0F;
    936 
    937       compression_factor = (FLOAT32)(48.164 - 6.0206 * val_x - 0.4014 * val_y);
    938 
    939       temp = (FLOAT32)(pow(10, (float)compression_factor / 20.0));
    940       drc_freq_fac = (WORD32)(temp * 33554431);
    941 
    942     } else {
    943       if (pstr_drc_data->drc_fac[drc_band] < 0) {
    944         low_hi = pstr_drc_dec->cut_factor;
    945       } else {
    946         low_hi = pstr_drc_dec->boost_factor;
    947       }
    948 
    949       {
    950         drc_fac =
    951             pstr_drc_dec->str_drc_channel_data[channel].drc_fac[drc_band] *
    952             low_hi;
    953         if (drc_fac < 0) {
    954           drc_fac *= -1;
    955           table = ixheaacd_drc_pow_tbl_1_2_q29;
    956 
    957           div_val = ixheaacd_get_div_value_2400(drc_fac);
    958           drc_freq_fac = 1 << (25 - div_val);
    959 
    960           mod_val = drc_fac - (div_val * 2400);
    961           drc_fac = mod_val * 10;
    962         } else {
    963           table = ixheaacd_drc_pow_tbl_2_q29;
    964 
    965           div_val = ixheaacd_get_div_value_2400(drc_fac);
    966           drc_freq_fac = 1 << (25 + div_val);
    967 
    968           mod_val = drc_fac - (div_val * 2400);
    969           drc_fac = mod_val * 10;
    970         }
    971 
    972         ret_val = ixheaacd_get_div_value_24(drc_fac);
    973 
    974         drc_freq_fac =
    975             ixheaacd_mult32x16in32_shift29(drc_freq_fac, table[ret_val]);
    976 
    977         drc_freq_fac = ixheaacd_mult32x16in32_shift25(drc_freq_fac, drc_norm);
    978       }
    979     }
    980 
    981     end_pos = pstr_drc_data->n_mdct_bands[drc_band];
    982 
    983     if (!pstr_drc_dec->sbr_found) {
    984       for (spec_pos = start_pos; spec_pos < end_pos; spec_pos++) {
    985         ptr_spectral_coef[spec_pos] = ixheaacd_mult32x16in32_shift25(
    986             ptr_spectral_coef[spec_pos], drc_freq_fac);
    987       }
    988     }
    989 
    990     if (pstr_drc_dec->sbr_found) {
    991       if (win_seq != EIGHT_SHORT_SEQUENCE) {
    992         if (960 == frame_size) {
    993           qmf_start = ixheaacd_div_by_30(start_pos);
    994           offset_value = 1;
    995         } else {
    996           qmf_start = start_pos >> 5;
    997           offset_value = 0;
    998         }
    999 
   1000         for (j = -num_qmf_sub_sample_by_2; j < num_qmf_sub_sample; j++) {
   1001           WORD32 alpha_val = 0;
   1002 
   1003           if (j + num_qmf_sub_sample_by_2 < num_qmf_sub_sample) {
   1004             if (pstr_drc_data->drc_interp_scheme == 0) {
   1005               alpha_val = (j + num_qmf_sub_sample_by_2);
   1006               for (i = qmf_start; i < 64; i++) {
   1007                 WORD64 temp_drc = (WORD64)alpha_val * drc_freq_fac +
   1008                                   (num_qmf_sub_sample - alpha_val) *
   1009                                       (WORD64)prev_frame_drc_sbr_factors[i];
   1010 
   1011                 if (frame_size == 512) {
   1012                   drc_sbr_factors[num_qmf_sub_sample + j][i] =
   1013                       (WORD32)(temp_drc >> 4);
   1014                 } else if (frame_size == 480) {
   1015                   drc_sbr_factors[num_qmf_sub_sample + j][i] =
   1016                       ixheaacd_div_by_15(temp_drc);
   1017                 } else {
   1018                   drc_sbr_factors[num_qmf_sub_sample + j][i] =
   1019                       (WORD32)(temp_drc >> 5);
   1020                 }
   1021 
   1022                 if (960 == frame_size) {
   1023                   drc_sbr_factors[num_qmf_sub_sample + j][i] =
   1024                       ixheaacd_div_by_30(
   1025                           drc_sbr_factors[num_qmf_sub_sample + j][i]);
   1026                 }
   1027               }
   1028 
   1029             } else {
   1030               if (j + num_qmf_sub_sample_by_2 >=
   1031                   ixheaacd_drc_offset[offset_value]
   1032                                      [pstr_drc_data->drc_interp_scheme - 1]) {
   1033                 alpha_val = 1;
   1034                 for (i = qmf_start; i < 64; i++) {
   1035                   drc_sbr_factors[num_qmf_sub_sample + j][i] = drc_freq_fac;
   1036                 }
   1037               } else {
   1038                 alpha_val = 0;
   1039                 for (i = qmf_start; i < 64; i++) {
   1040                   drc_sbr_factors[num_qmf_sub_sample + j][i] =
   1041                       prev_frame_drc_sbr_factors[i];
   1042                 }
   1043               }
   1044             }
   1045           } else {
   1046             alpha_val = 1;
   1047             for (i = qmf_start; i < 64; i++) {
   1048               drc_sbr_factors[num_qmf_sub_sample + j][i] = drc_freq_fac;
   1049             }
   1050           }
   1051         }
   1052       } else {
   1053         qmf_start_pos = ixheaacd_drc_floor(start_pos, frame_size);
   1054 
   1055         qmf_stop_pos = ixheaacd_drc_ceil(end_pos, frame_size);
   1056 
   1057         qmf_start = ixheaacd_drc_get_bottom_qmf(start_pos, frame_size);
   1058         for (j = qmf_start_pos; j < qmf_stop_pos; j++) {
   1059           if (j > qmf_start_pos && ((j & 0x03) == 0)) {
   1060             qmf_start = 0;
   1061           }
   1062           for (i = qmf_start; i < 64; i++) {
   1063             drc_sbr_factors[num_qmf_sub_sample + j][i] = drc_freq_fac;
   1064           }
   1065         }
   1066       }
   1067     }
   1068 
   1069     start_pos = end_pos;
   1070   }
   1071 
   1072   if (win_seq != EIGHT_SHORT_SEQUENCE) {
   1073     pstr_drc_data->prev_interp_scheme = pstr_drc_data->drc_interp_scheme;
   1074   } else {
   1075     pstr_drc_data->prev_interp_scheme = 8;
   1076   }
   1077 }
   1078