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