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