2 * Audio Processing Technology codec for Bluetooth (aptX)
4 * Copyright (C) 2017 Aurelien Jacobs <aurel@gnuage.org>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 static const int32_t quantize_intervals_LF[65] = {
28 -9948, 9948, 29860, 49808, 69822, 89926, 110144, 130502,
29 151026, 171738, 192666, 213832, 235264, 256982, 279014, 301384,
30 324118, 347244, 370790, 394782, 419250, 444226, 469742, 495832,
31 522536, 549890, 577936, 606720, 636290, 666700, 698006, 730270,
32 763562, 797958, 833538, 870398, 908640, 948376, 989740, 1032874,
33 1077948, 1125150, 1174700, 1226850, 1281900, 1340196, 1402156, 1468282,
34 1539182, 1615610, 1698514, 1789098, 1888944, 2000168, 2125700, 2269750,
35 2438670, 2642660, 2899462, 3243240, 3746078, 4535138, 5664098, 7102424,
38 static const int32_t invert_quantize_dither_factors_LF[65] = {
39 9948, 9948, 9962, 9988, 10026, 10078, 10142, 10218,
40 10306, 10408, 10520, 10646, 10784, 10934, 11098, 11274,
41 11462, 11664, 11880, 12112, 12358, 12618, 12898, 13194,
42 13510, 13844, 14202, 14582, 14988, 15422, 15884, 16380,
43 16912, 17484, 18098, 18762, 19480, 20258, 21106, 22030,
44 23044, 24158, 25390, 26760, 28290, 30008, 31954, 34172,
45 36728, 39700, 43202, 47382, 52462, 58762, 66770, 77280,
46 91642, 112348, 144452, 199326, 303512, 485546, 643414, 794914,
49 static const int32_t quantize_dither_factors_LF[65] = {
50 0, 4, 7, 10, 13, 16, 19, 22,
51 26, 28, 32, 35, 38, 41, 44, 47,
52 51, 54, 58, 62, 65, 70, 74, 79,
53 84, 90, 95, 102, 109, 116, 124, 133,
54 143, 154, 166, 180, 195, 212, 231, 254,
55 279, 308, 343, 383, 430, 487, 555, 639,
56 743, 876, 1045, 1270, 1575, 2002, 2628, 3591,
57 5177, 8026, 13719, 26047, 45509, 39467, 37875, 51303,
60 static const int16_t quantize_factor_select_offset_LF[65] = {
61 0, -21, -19, -17, -15, -12, -10, -8,
62 -6, -4, -1, 1, 3, 6, 8, 10,
63 13, 15, 18, 20, 23, 26, 29, 31,
64 34, 37, 40, 43, 47, 50, 53, 57,
65 60, 64, 68, 72, 76, 80, 85, 89,
66 94, 99, 105, 110, 116, 123, 129, 136,
67 144, 152, 161, 171, 182, 194, 207, 223,
68 241, 263, 291, 328, 382, 467, 522, 522,
73 static const int32_t quantize_intervals_MLF[9] = {
74 -89806, 89806, 278502, 494338, 759442, 1113112, 1652322, 2720256, 5190186,
76 static const int32_t invert_quantize_dither_factors_MLF[9] = {
77 89806, 89806, 98890, 116946, 148158, 205512, 333698, 734236, 1735696,
79 static const int32_t quantize_dither_factors_MLF[9] = {
80 0, 2271, 4514, 7803, 14339, 32047, 100135, 250365, 0,
82 static const int16_t quantize_factor_select_offset_MLF[9] = {
83 0, -14, 6, 29, 58, 96, 154, 270, 521,
87 static const int32_t quantize_intervals_MHF[3] = {
88 -194080, 194080, 890562,
90 static const int32_t invert_quantize_dither_factors_MHF[3] = {
91 194080, 194080, 502402,
93 static const int32_t quantize_dither_factors_MHF[3] = {
96 static const int16_t quantize_factor_select_offset_MHF[3] = {
101 static const int32_t quantize_intervals_HF[5] = {
102 -163006, 163006, 542708, 1120554, 2669238,
104 static const int32_t invert_quantize_dither_factors_HF[5] = {
105 163006, 163006, 216698, 361148, 1187538,
107 static const int32_t quantize_dither_factors_HF[5] = {
108 0, 13423, 36113, 206598, 0,
110 static const int16_t quantize_factor_select_offset_HF[5] = {
115 static const int32_t hd_quantize_intervals_LF[257] = {
116 -2436, 2436, 7308, 12180, 17054, 21930, 26806, 31686,
117 36566, 41450, 46338, 51230, 56124, 61024, 65928, 70836,
118 75750, 80670, 85598, 90530, 95470, 100418, 105372, 110336,
119 115308, 120288, 125278, 130276, 135286, 140304, 145334, 150374,
120 155426, 160490, 165566, 170654, 175756, 180870, 185998, 191138,
121 196294, 201466, 206650, 211850, 217068, 222300, 227548, 232814,
122 238096, 243396, 248714, 254050, 259406, 264778, 270172, 275584,
123 281018, 286470, 291944, 297440, 302956, 308496, 314056, 319640,
124 325248, 330878, 336532, 342212, 347916, 353644, 359398, 365178,
125 370986, 376820, 382680, 388568, 394486, 400430, 406404, 412408,
126 418442, 424506, 430600, 436726, 442884, 449074, 455298, 461554,
127 467844, 474168, 480528, 486922, 493354, 499820, 506324, 512866,
128 519446, 526064, 532722, 539420, 546160, 552940, 559760, 566624,
129 573532, 580482, 587478, 594520, 601606, 608740, 615920, 623148,
130 630426, 637754, 645132, 652560, 660042, 667576, 675164, 682808,
131 690506, 698262, 706074, 713946, 721876, 729868, 737920, 746036,
132 754216, 762460, 770770, 779148, 787594, 796108, 804694, 813354,
133 822086, 830892, 839774, 848736, 857776, 866896, 876100, 885386,
134 894758, 904218, 913766, 923406, 933138, 942964, 952886, 962908,
135 973030, 983254, 993582, 1004020, 1014566, 1025224, 1035996, 1046886,
136 1057894, 1069026, 1080284, 1091670, 1103186, 1114838, 1126628, 1138558,
137 1150634, 1162858, 1175236, 1187768, 1200462, 1213320, 1226346, 1239548,
138 1252928, 1266490, 1280242, 1294188, 1308334, 1322688, 1337252, 1352034,
139 1367044, 1382284, 1397766, 1413494, 1429478, 1445728, 1462252, 1479058,
140 1496158, 1513562, 1531280, 1549326, 1567710, 1586446, 1605550, 1625034,
141 1644914, 1665208, 1685932, 1707108, 1728754, 1750890, 1773542, 1796732,
142 1820488, 1844840, 1869816, 1895452, 1921780, 1948842, 1976680, 2005338,
143 2034868, 2065322, 2096766, 2129260, 2162880, 2197708, 2233832, 2271352,
144 2310384, 2351050, 2393498, 2437886, 2484404, 2533262, 2584710, 2639036,
145 2696578, 2757738, 2822998, 2892940, 2968278, 3049896, 3138912, 3236760,
146 3345312, 3467068, 3605434, 3765154, 3952904, 4177962, 4452178, 4787134,
147 5187290, 5647128, 6159120, 6720518, 7332904, 8000032, 8726664, 9518152,
150 static const int32_t hd_invert_quantize_dither_factors_LF[257] = {
151 2436, 2436, 2436, 2436, 2438, 2438, 2438, 2440,
152 2442, 2442, 2444, 2446, 2448, 2450, 2454, 2456,
153 2458, 2462, 2464, 2468, 2472, 2476, 2480, 2484,
154 2488, 2492, 2498, 2502, 2506, 2512, 2518, 2524,
155 2528, 2534, 2540, 2548, 2554, 2560, 2568, 2574,
156 2582, 2588, 2596, 2604, 2612, 2620, 2628, 2636,
157 2646, 2654, 2664, 2672, 2682, 2692, 2702, 2712,
158 2722, 2732, 2742, 2752, 2764, 2774, 2786, 2798,
159 2810, 2822, 2834, 2846, 2858, 2870, 2884, 2896,
160 2910, 2924, 2938, 2952, 2966, 2980, 2994, 3010,
161 3024, 3040, 3056, 3070, 3086, 3104, 3120, 3136,
162 3154, 3170, 3188, 3206, 3224, 3242, 3262, 3280,
163 3300, 3320, 3338, 3360, 3380, 3400, 3422, 3442,
164 3464, 3486, 3508, 3532, 3554, 3578, 3602, 3626,
165 3652, 3676, 3702, 3728, 3754, 3780, 3808, 3836,
166 3864, 3892, 3920, 3950, 3980, 4010, 4042, 4074,
167 4106, 4138, 4172, 4206, 4240, 4276, 4312, 4348,
168 4384, 4422, 4460, 4500, 4540, 4580, 4622, 4664,
169 4708, 4752, 4796, 4842, 4890, 4938, 4986, 5036,
170 5086, 5138, 5192, 5246, 5300, 5358, 5416, 5474,
171 5534, 5596, 5660, 5726, 5792, 5860, 5930, 6002,
172 6074, 6150, 6226, 6306, 6388, 6470, 6556, 6644,
173 6736, 6828, 6924, 7022, 7124, 7228, 7336, 7448,
174 7562, 7680, 7802, 7928, 8058, 8192, 8332, 8476,
175 8624, 8780, 8940, 9106, 9278, 9458, 9644, 9840,
176 10042, 10252, 10472, 10702, 10942, 11194, 11458, 11734,
177 12024, 12328, 12648, 12986, 13342, 13720, 14118, 14540,
178 14990, 15466, 15976, 16520, 17102, 17726, 18398, 19124,
179 19908, 20760, 21688, 22702, 23816, 25044, 26404, 27922,
180 29622, 31540, 33720, 36222, 39116, 42502, 46514, 51334,
181 57218, 64536, 73830, 85890, 101860, 123198, 151020, 183936,
182 216220, 243618, 268374, 293022, 319362, 347768, 378864, 412626, 449596,
184 static const int32_t hd_quantize_dither_factors_LF[256] = {
185 0, 0, 0, 1, 0, 0, 1, 1,
186 0, 1, 1, 1, 1, 1, 1, 1,
187 1, 1, 1, 1, 1, 1, 1, 1,
188 1, 2, 1, 1, 2, 2, 2, 1,
189 2, 2, 2, 2, 2, 2, 2, 2,
190 2, 2, 2, 2, 2, 2, 2, 3,
191 2, 3, 2, 3, 3, 3, 3, 3,
192 3, 3, 3, 3, 3, 3, 3, 3,
193 3, 3, 3, 3, 3, 4, 3, 4,
194 4, 4, 4, 4, 4, 4, 4, 4,
195 4, 4, 4, 4, 5, 4, 4, 5,
196 4, 5, 5, 5, 5, 5, 5, 5,
197 5, 5, 6, 5, 5, 6, 5, 6,
198 6, 6, 6, 6, 6, 6, 6, 7,
199 6, 7, 7, 7, 7, 7, 7, 7,
200 7, 7, 8, 8, 8, 8, 8, 8,
201 8, 9, 9, 9, 9, 9, 9, 9,
202 10, 10, 10, 10, 10, 11, 11, 11,
203 11, 11, 12, 12, 12, 12, 13, 13,
204 13, 14, 14, 14, 15, 15, 15, 15,
205 16, 16, 17, 17, 17, 18, 18, 18,
206 19, 19, 20, 21, 21, 22, 22, 23,
207 23, 24, 25, 26, 26, 27, 28, 29,
208 30, 31, 32, 33, 34, 35, 36, 37,
209 39, 40, 42, 43, 45, 47, 49, 51,
210 53, 55, 58, 60, 63, 66, 69, 73,
211 76, 80, 85, 89, 95, 100, 106, 113,
212 119, 128, 136, 146, 156, 168, 182, 196,
213 213, 232, 254, 279, 307, 340, 380, 425,
214 480, 545, 626, 724, 847, 1003, 1205, 1471,
215 1830, 2324, 3015, 3993, 5335, 6956, 8229, 8071,
216 6850, 6189, 6162, 6585, 7102, 7774, 8441, 9243,
218 static const int16_t hd_quantize_factor_select_offset_LF[257] = {
219 0, -22, -21, -21, -20, -20, -19, -19,
220 -18, -18, -17, -17, -16, -16, -15, -14,
221 -14, -13, -13, -12, -12, -11, -11, -10,
222 -10, -9, -9, -8, -7, -7, -6, -6,
223 -5, -5, -4, -4, -3, -3, -2, -1,
224 -1, 0, 0, 1, 1, 2, 2, 3,
225 4, 4, 5, 5, 6, 6, 7, 8,
226 8, 9, 9, 10, 11, 11, 12, 12,
227 13, 14, 14, 15, 15, 16, 17, 17,
228 18, 19, 19, 20, 20, 21, 22, 22,
229 23, 24, 24, 25, 26, 26, 27, 28,
230 28, 29, 30, 30, 31, 32, 33, 33,
231 34, 35, 35, 36, 37, 38, 38, 39,
232 40, 41, 41, 42, 43, 44, 44, 45,
233 46, 47, 48, 48, 49, 50, 51, 52,
234 52, 53, 54, 55, 56, 57, 58, 58,
235 59, 60, 61, 62, 63, 64, 65, 66,
236 67, 68, 69, 69, 70, 71, 72, 73,
237 74, 75, 77, 78, 79, 80, 81, 82,
238 83, 84, 85, 86, 87, 89, 90, 91,
239 92, 93, 94, 96, 97, 98, 99, 101,
240 102, 103, 105, 106, 107, 109, 110, 112,
241 113, 115, 116, 118, 119, 121, 122, 124,
242 125, 127, 129, 130, 132, 134, 136, 137,
243 139, 141, 143, 145, 147, 149, 151, 153,
244 155, 158, 160, 162, 164, 167, 169, 172,
245 174, 177, 180, 182, 185, 188, 191, 194,
246 197, 201, 204, 208, 211, 215, 219, 223,
247 227, 232, 236, 241, 246, 251, 257, 263,
248 269, 275, 283, 290, 298, 307, 317, 327,
249 339, 352, 367, 384, 404, 429, 458, 494,
250 522, 522, 522, 522, 522, 522, 522, 522, 522,
254 static const int32_t hd_quantize_intervals_MLF[33] = {
255 -21236, 21236, 63830, 106798, 150386, 194832, 240376, 287258,
256 335726, 386034, 438460, 493308, 550924, 611696, 676082, 744626,
257 817986, 896968, 982580, 1076118, 1179278, 1294344, 1424504, 1574386,
258 1751090, 1966260, 2240868, 2617662, 3196432, 4176450, 5658260, 7671068,
261 static const int32_t hd_invert_quantize_dither_factors_MLF[33] = {
262 21236, 21236, 21360, 21608, 21978, 22468, 23076, 23806,
263 24660, 25648, 26778, 28070, 29544, 31228, 33158, 35386,
264 37974, 41008, 44606, 48934, 54226, 60840, 69320, 80564,
265 96140, 119032, 155576, 221218, 357552, 622468, 859344, 1153464, 1555840,
267 static const int32_t hd_quantize_dither_factors_MLF[32] = {
268 0, 31, 62, 93, 123, 152, 183, 214,
269 247, 283, 323, 369, 421, 483, 557, 647,
270 759, 900, 1082, 1323, 1654, 2120, 2811, 3894,
271 5723, 9136, 16411, 34084, 66229, 59219, 73530, 100594,
273 static const int16_t hd_quantize_factor_select_offset_MLF[33] = {
274 0, -21, -16, -12, -7, -2, 3, 8,
275 13, 19, 24, 30, 36, 43, 50, 57,
276 65, 74, 83, 93, 104, 117, 131, 147,
277 166, 189, 219, 259, 322, 427, 521, 521, 521,
281 static const int32_t hd_quantize_intervals_MHF[9] = {
282 -95044, 95044, 295844, 528780, 821332, 1226438, 1890540, 3344850, 6450664,
284 static const int32_t hd_invert_quantize_dither_factors_MHF[9] = {
285 95044, 95044, 105754, 127180, 165372, 39736, 424366, 1029946, 2075866,
287 static const int32_t hd_quantize_dither_factors_MHF[8] = {
288 0, 2678, 5357, 9548, -31409, 96158, 151395, 261480,
290 static const int16_t hd_quantize_factor_select_offset_MHF[9] = {
291 0, -17, 5, 30, 62, 105, 177, 334, 518,
295 static const int32_t hd_quantize_intervals_HF[17] = {
296 -45754, 45754, 138496, 234896, 337336, 448310, 570738, 708380,
297 866534, 1053262, 1281958, 1577438, 1993050, 2665984, 3900982, 5902844,
300 static const int32_t hd_invert_quantize_dither_factors_HF[17] = {
301 45754, 45754, 46988, 49412, 53026, 57950, 64478, 73164,
302 84988, 101740, 126958, 168522, 247092, 425842, 809154, 1192708, 1801910,
304 static const int32_t hd_quantize_dither_factors_HF[16] = {
305 0, 309, 606, 904, 1231, 1632, 2172, 2956,
306 4188, 6305, 10391, 19643, 44688, 95828, 95889, 152301,
308 static const int16_t hd_quantize_factor_select_offset_HF[17] = {
309 0, -18, -8, 2, 13, 25, 38, 53,
310 70, 90, 115, 147, 192, 264, 398, 521, 521,
313 ConstTables ff_aptx_quant_tables[2][NB_SUBBANDS] = {
315 [LF] = { quantize_intervals_LF,
316 invert_quantize_dither_factors_LF,
317 quantize_dither_factors_LF,
318 quantize_factor_select_offset_LF,
319 FF_ARRAY_ELEMS(quantize_intervals_LF),
321 [MLF] = { quantize_intervals_MLF,
322 invert_quantize_dither_factors_MLF,
323 quantize_dither_factors_MLF,
324 quantize_factor_select_offset_MLF,
325 FF_ARRAY_ELEMS(quantize_intervals_MLF),
327 [MHF] = { quantize_intervals_MHF,
328 invert_quantize_dither_factors_MHF,
329 quantize_dither_factors_MHF,
330 quantize_factor_select_offset_MHF,
331 FF_ARRAY_ELEMS(quantize_intervals_MHF),
333 [HF] = { quantize_intervals_HF,
334 invert_quantize_dither_factors_HF,
335 quantize_dither_factors_HF,
336 quantize_factor_select_offset_HF,
337 FF_ARRAY_ELEMS(quantize_intervals_HF),
341 [LF] = { hd_quantize_intervals_LF,
342 hd_invert_quantize_dither_factors_LF,
343 hd_quantize_dither_factors_LF,
344 hd_quantize_factor_select_offset_LF,
345 FF_ARRAY_ELEMS(hd_quantize_intervals_LF),
347 [MLF] = { hd_quantize_intervals_MLF,
348 hd_invert_quantize_dither_factors_MLF,
349 hd_quantize_dither_factors_MLF,
350 hd_quantize_factor_select_offset_MLF,
351 FF_ARRAY_ELEMS(hd_quantize_intervals_MLF),
353 [MHF] = { hd_quantize_intervals_MHF,
354 hd_invert_quantize_dither_factors_MHF,
355 hd_quantize_dither_factors_MHF,
356 hd_quantize_factor_select_offset_MHF,
357 FF_ARRAY_ELEMS(hd_quantize_intervals_MHF),
359 [HF] = { hd_quantize_intervals_HF,
360 hd_invert_quantize_dither_factors_HF,
361 hd_quantize_dither_factors_HF,
362 hd_quantize_factor_select_offset_HF,
363 FF_ARRAY_ELEMS(hd_quantize_intervals_HF),
368 static const int16_t quantization_factors[32] = {
369 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383,
370 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834,
371 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371,
372 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008,
377 static void aptx_update_codeword_history(Channel *channel)
379 int32_t cw = ((channel->quantize[0].quantized_sample & 3) << 0) +
380 ((channel->quantize[1].quantized_sample & 2) << 1) +
381 ((channel->quantize[2].quantized_sample & 1) << 3);
382 channel->codeword_history = (cw << 8) + ((unsigned)channel->codeword_history << 4);
385 void ff_aptx_generate_dither(Channel *channel)
391 aptx_update_codeword_history(channel);
393 m = (int64_t)5184443 * (channel->codeword_history >> 7);
394 d = (m * 4) + (m >> 22);
395 for (subband = 0; subband < NB_SUBBANDS; subband++)
396 channel->dither[subband] = (unsigned)d << (23 - 5*subband);
397 channel->dither_parity = (d >> 25) & 1;
400 static void aptx_invert_quantization(InvertQuantize *invert_quantize,
401 int32_t quantized_sample, int32_t dither,
404 int32_t qr, idx, shift, factor_select;
406 idx = (quantized_sample ^ -(quantized_sample < 0)) + 1;
407 qr = tables->quantize_intervals[idx] / 2;
408 if (quantized_sample < 0)
411 qr = rshift64_clip24((qr * (1LL<<32)) + MUL64(dither, tables->invert_quantize_dither_factors[idx]), 32);
412 invert_quantize->reconstructed_difference = MUL64(invert_quantize->quantization_factor, qr) >> 19;
414 /* update factor_select */
415 factor_select = 32620 * invert_quantize->factor_select;
416 factor_select = rshift32(factor_select + (tables->quantize_factor_select_offset[idx] * (1 << 15)), 15);
417 invert_quantize->factor_select = av_clip(factor_select, 0, tables->factor_max);
419 /* update quantization factor */
420 idx = (invert_quantize->factor_select & 0xFF) >> 3;
421 shift = (tables->factor_max - invert_quantize->factor_select) >> 8;
422 invert_quantize->quantization_factor = (quantization_factors[idx] << 11) >> shift;
425 static int32_t *aptx_reconstructed_differences_update(Prediction *prediction,
426 int32_t reconstructed_difference,
429 int32_t *rd1 = prediction->reconstructed_differences, *rd2 = rd1 + order;
430 int p = prediction->pos;
433 prediction->pos = p = (p + 1) % order;
434 rd2[p] = reconstructed_difference;
438 static void aptx_prediction_filtering(Prediction *prediction,
439 int32_t reconstructed_difference,
442 int32_t reconstructed_sample, predictor, srd0;
443 int32_t *reconstructed_differences;
444 int64_t predicted_difference = 0;
447 reconstructed_sample = av_clip_intp2(reconstructed_difference + prediction->predicted_sample, 23);
448 predictor = av_clip_intp2((MUL64(prediction->s_weight[0], prediction->previous_reconstructed_sample)
449 + MUL64(prediction->s_weight[1], reconstructed_sample)) >> 22, 23);
450 prediction->previous_reconstructed_sample = reconstructed_sample;
452 reconstructed_differences = aptx_reconstructed_differences_update(prediction, reconstructed_difference, order);
453 srd0 = FFDIFFSIGN(reconstructed_difference, 0) * (1 << 23);
454 for (i = 0; i < order; i++) {
455 int32_t srd = FF_SIGNBIT(reconstructed_differences[-i-1]) | 1;
456 prediction->d_weight[i] -= rshift32(prediction->d_weight[i] - srd*srd0, 8);
457 predicted_difference += MUL64(reconstructed_differences[-i], prediction->d_weight[i]);
460 prediction->predicted_difference = av_clip_intp2(predicted_difference >> 22, 23);
461 prediction->predicted_sample = av_clip_intp2(predictor + prediction->predicted_difference, 23);
464 static void aptx_process_subband(InvertQuantize *invert_quantize,
465 Prediction *prediction,
466 int32_t quantized_sample, int32_t dither,
469 int32_t sign, same_sign[2], weight[2], sw1, range;
471 aptx_invert_quantization(invert_quantize, quantized_sample, dither, tables);
473 sign = FFDIFFSIGN(invert_quantize->reconstructed_difference,
474 -prediction->predicted_difference);
475 same_sign[0] = sign * prediction->prev_sign[0];
476 same_sign[1] = sign * prediction->prev_sign[1];
477 prediction->prev_sign[0] = prediction->prev_sign[1];
478 prediction->prev_sign[1] = sign | 1;
481 sw1 = rshift32(-same_sign[1] * prediction->s_weight[1], 1);
482 sw1 = (av_clip(sw1, -range, range) & ~0xF) * 16;
485 weight[0] = 254 * prediction->s_weight[0] + 0x800000*same_sign[0] + sw1;
486 prediction->s_weight[0] = av_clip(rshift32(weight[0], 8), -range, range);
488 range = 0x3C0000 - prediction->s_weight[0];
489 weight[1] = 255 * prediction->s_weight[1] + 0xC00000*same_sign[1];
490 prediction->s_weight[1] = av_clip(rshift32(weight[1], 8), -range, range);
492 aptx_prediction_filtering(prediction,
493 invert_quantize->reconstructed_difference,
494 tables->prediction_order);
497 void ff_aptx_invert_quantize_and_prediction(Channel *channel, int hd)
500 for (subband = 0; subband < NB_SUBBANDS; subband++)
501 aptx_process_subband(&channel->invert_quantize[subband],
502 &channel->prediction[subband],
503 channel->quantize[subband].quantized_sample,
504 channel->dither[subband],
505 &ff_aptx_quant_tables[hd][subband]);
508 av_cold int ff_aptx_init(AVCodecContext *avctx)
510 AptXContext *s = avctx->priv_data;
513 if (avctx->ch_layout.nb_channels != 2)
514 return AVERROR_INVALIDDATA;
516 s->hd = avctx->codec->id == AV_CODEC_ID_APTX_HD;
517 s->block_size = s->hd ? 6 : 4;
519 for (chan = 0; chan < NB_CHANNELS; chan++) {
520 Channel *channel = &s->channels[chan];
521 for (subband = 0; subband < NB_SUBBANDS; subband++) {
522 Prediction *prediction = &channel->prediction[subband];
523 prediction->prev_sign[0] = 1;
524 prediction->prev_sign[1] = 1;