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