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