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