Mercurial > libavcodec.hg
annotate aacsbr.c @ 11816:7c2369ec6faa libavcodec
ARM: check struct offsets only when they are used
The offsets differ depending on configuration, so only check them when
they will actually be used. Presently, this is when NEON is enabled.
author | mru |
---|---|
date | Wed, 02 Jun 2010 22:05:25 +0000 |
parents | ed3d232c9d31 |
children | 9103a9b3573a |
rev | line source |
---|---|
11401 | 1 /* |
2 * AAC Spectral Band Replication decoding functions | |
3 * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl ) | |
4 * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com> | |
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 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11590
diff
changeset
|
24 * @file |
11401 | 25 * AAC Spectral Band Replication decoding functions |
26 * @author Robert Swain ( rob opendot cl ) | |
27 */ | |
28 | |
29 #include "aac.h" | |
30 #include "sbr.h" | |
31 #include "aacsbr.h" | |
32 #include "aacsbrdata.h" | |
11427 | 33 #include "fft.h" |
11401 | 34 |
35 #include <stdint.h> | |
36 #include <float.h> | |
37 | |
38 #define ENVELOPE_ADJUSTMENT_OFFSET 2 | |
39 #define NOISE_FLOOR_OFFSET 6.0f | |
40 | |
41 /** | |
42 * SBR VLC tables | |
43 */ | |
44 enum { | |
45 T_HUFFMAN_ENV_1_5DB, | |
46 F_HUFFMAN_ENV_1_5DB, | |
47 T_HUFFMAN_ENV_BAL_1_5DB, | |
48 F_HUFFMAN_ENV_BAL_1_5DB, | |
49 T_HUFFMAN_ENV_3_0DB, | |
50 F_HUFFMAN_ENV_3_0DB, | |
51 T_HUFFMAN_ENV_BAL_3_0DB, | |
52 F_HUFFMAN_ENV_BAL_3_0DB, | |
53 T_HUFFMAN_NOISE_3_0DB, | |
54 T_HUFFMAN_NOISE_BAL_3_0DB, | |
55 }; | |
56 | |
57 /** | |
58 * bs_frame_class - frame class of current SBR frame (14496-3 sp04 p98) | |
59 */ | |
60 enum { | |
61 FIXFIX, | |
62 FIXVAR, | |
63 VARFIX, | |
64 VARVAR, | |
65 }; | |
66 | |
67 enum { | |
68 EXTENSION_ID_PS = 2, | |
69 }; | |
70 | |
71 static VLC vlc_sbr[10]; | |
72 static const int8_t vlc_sbr_lav[10] = | |
73 { 60, 60, 24, 24, 31, 31, 12, 12, 31, 12 }; | |
74 static DECLARE_ALIGNED(16, float, analysis_cos_pre)[64]; | |
75 static DECLARE_ALIGNED(16, float, analysis_sin_pre)[64]; | |
76 static DECLARE_ALIGNED(16, float, analysis_cossin_post)[32][2]; | |
77 static const DECLARE_ALIGNED(16, float, zero64)[64]; | |
78 | |
79 #define SBR_INIT_VLC_STATIC(num, size) \ | |
80 INIT_VLC_STATIC(&vlc_sbr[num], 9, sbr_tmp[num].table_size / sbr_tmp[num].elem_size, \ | |
81 sbr_tmp[num].sbr_bits , 1, 1, \ | |
82 sbr_tmp[num].sbr_codes, sbr_tmp[num].elem_size, sbr_tmp[num].elem_size, \ | |
83 size) | |
84 | |
85 #define SBR_VLC_ROW(name) \ | |
86 { name ## _codes, name ## _bits, sizeof(name ## _codes), sizeof(name ## _codes[0]) } | |
87 | |
88 av_cold void ff_aac_sbr_init(void) | |
89 { | |
90 int n, k; | |
91 static const struct { | |
92 const void *sbr_codes, *sbr_bits; | |
93 const unsigned int table_size, elem_size; | |
94 } sbr_tmp[] = { | |
95 SBR_VLC_ROW(t_huffman_env_1_5dB), | |
96 SBR_VLC_ROW(f_huffman_env_1_5dB), | |
97 SBR_VLC_ROW(t_huffman_env_bal_1_5dB), | |
98 SBR_VLC_ROW(f_huffman_env_bal_1_5dB), | |
99 SBR_VLC_ROW(t_huffman_env_3_0dB), | |
100 SBR_VLC_ROW(f_huffman_env_3_0dB), | |
101 SBR_VLC_ROW(t_huffman_env_bal_3_0dB), | |
102 SBR_VLC_ROW(f_huffman_env_bal_3_0dB), | |
103 SBR_VLC_ROW(t_huffman_noise_3_0dB), | |
104 SBR_VLC_ROW(t_huffman_noise_bal_3_0dB), | |
105 }; | |
106 | |
107 // SBR VLC table initialization | |
108 SBR_INIT_VLC_STATIC(0, 1098); | |
109 SBR_INIT_VLC_STATIC(1, 1092); | |
110 SBR_INIT_VLC_STATIC(2, 768); | |
111 SBR_INIT_VLC_STATIC(3, 1026); | |
112 SBR_INIT_VLC_STATIC(4, 1058); | |
113 SBR_INIT_VLC_STATIC(5, 1052); | |
114 SBR_INIT_VLC_STATIC(6, 544); | |
115 SBR_INIT_VLC_STATIC(7, 544); | |
116 SBR_INIT_VLC_STATIC(8, 592); | |
117 SBR_INIT_VLC_STATIC(9, 512); | |
118 | |
119 for (n = 0; n < 64; n++) { | |
120 float pre = M_PI * n / 64; | |
121 analysis_cos_pre[n] = cosf(pre); | |
122 analysis_sin_pre[n] = sinf(pre); | |
123 } | |
124 for (k = 0; k < 32; k++) { | |
125 float post = M_PI * (k + 0.5) / 128; | |
126 analysis_cossin_post[k][0] = 4.0 * cosf(post); | |
127 analysis_cossin_post[k][1] = -4.0 * sinf(post); | |
128 } | |
129 for (n = 1; n < 320; n++) | |
130 sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n]; | |
131 sbr_qmf_window_us[384] = -sbr_qmf_window_us[384]; | |
132 sbr_qmf_window_us[512] = -sbr_qmf_window_us[512]; | |
133 | |
134 for (n = 0; n < 320; n++) | |
135 sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n]; | |
136 } | |
137 | |
138 av_cold void ff_aac_sbr_ctx_init(SpectralBandReplication *sbr) | |
139 { | |
140 sbr->kx[0] = sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 | |
11445 | 141 sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; |
11401 | 142 sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); |
143 sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); | |
144 ff_mdct_init(&sbr->mdct, 7, 1, 1.0/64); | |
145 ff_rdft_init(&sbr->rdft, 6, IDFT_R2C); | |
146 } | |
147 | |
148 av_cold void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr) | |
149 { | |
150 ff_mdct_end(&sbr->mdct); | |
151 ff_rdft_end(&sbr->rdft); | |
152 } | |
153 | |
154 static int qsort_comparison_function_int16(const void *a, const void *b) | |
155 { | |
156 return *(const int16_t *)a - *(const int16_t *)b; | |
157 } | |
158 | |
159 static inline int in_table_int16(const int16_t *table, int last_el, int16_t needle) | |
160 { | |
161 int i; | |
162 for (i = 0; i <= last_el; i++) | |
163 if (table[i] == needle) | |
164 return 1; | |
165 return 0; | |
166 } | |
167 | |
168 /// Limiter Frequency Band Table (14496-3 sp04 p198) | |
169 static void sbr_make_f_tablelim(SpectralBandReplication *sbr) | |
170 { | |
171 int k; | |
172 if (sbr->bs_limiter_bands > 0) { | |
173 static const float bands_warped[3] = { 1.32715174233856803909f, //2^(0.49/1.2) | |
174 1.18509277094158210129f, //2^(0.49/2) | |
175 1.11987160404675912501f }; //2^(0.49/3) | |
176 const float lim_bands_per_octave_warped = bands_warped[sbr->bs_limiter_bands - 1]; | |
11670 | 177 int16_t patch_borders[7]; |
11401 | 178 uint16_t *in = sbr->f_tablelim + 1, *out = sbr->f_tablelim; |
179 | |
180 patch_borders[0] = sbr->kx[1]; | |
181 for (k = 1; k <= sbr->num_patches; k++) | |
182 patch_borders[k] = patch_borders[k-1] + sbr->patch_num_subbands[k-1]; | |
183 | |
184 memcpy(sbr->f_tablelim, sbr->f_tablelow, | |
185 (sbr->n[0] + 1) * sizeof(sbr->f_tablelow[0])); | |
186 if (sbr->num_patches > 1) | |
187 memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1, | |
188 (sbr->num_patches - 1) * sizeof(patch_borders[0])); | |
189 | |
190 qsort(sbr->f_tablelim, sbr->num_patches + sbr->n[0], | |
191 sizeof(sbr->f_tablelim[0]), | |
192 qsort_comparison_function_int16); | |
193 | |
194 sbr->n_lim = sbr->n[0] + sbr->num_patches - 1; | |
195 while (out < sbr->f_tablelim + sbr->n_lim) { | |
196 if (*in >= *out * lim_bands_per_octave_warped) { | |
197 *++out = *in++; | |
198 } else if (*in == *out || | |
199 !in_table_int16(patch_borders, sbr->num_patches, *in)) { | |
200 in++; | |
201 sbr->n_lim--; | |
202 } else if (!in_table_int16(patch_borders, sbr->num_patches, *out)) { | |
203 *out = *in++; | |
204 sbr->n_lim--; | |
205 } else { | |
206 *++out = *in++; | |
207 } | |
208 } | |
209 } else { | |
210 sbr->f_tablelim[0] = sbr->f_tablelow[0]; | |
211 sbr->f_tablelim[1] = sbr->f_tablelow[sbr->n[0]]; | |
212 sbr->n_lim = 1; | |
213 } | |
214 } | |
215 | |
216 static unsigned int read_sbr_header(SpectralBandReplication *sbr, GetBitContext *gb) | |
217 { | |
218 unsigned int cnt = get_bits_count(gb); | |
219 uint8_t bs_header_extra_1; | |
220 uint8_t bs_header_extra_2; | |
221 int old_bs_limiter_bands = sbr->bs_limiter_bands; | |
222 SpectrumParameters old_spectrum_params; | |
223 | |
224 sbr->start = 1; | |
225 | |
226 // Save last spectrum parameters variables to compare to new ones | |
227 memcpy(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters)); | |
228 | |
229 sbr->bs_amp_res_header = get_bits1(gb); | |
230 sbr->spectrum_params.bs_start_freq = get_bits(gb, 4); | |
231 sbr->spectrum_params.bs_stop_freq = get_bits(gb, 4); | |
232 sbr->spectrum_params.bs_xover_band = get_bits(gb, 3); | |
233 skip_bits(gb, 2); // bs_reserved | |
234 | |
235 bs_header_extra_1 = get_bits1(gb); | |
236 bs_header_extra_2 = get_bits1(gb); | |
237 | |
238 if (bs_header_extra_1) { | |
239 sbr->spectrum_params.bs_freq_scale = get_bits(gb, 2); | |
240 sbr->spectrum_params.bs_alter_scale = get_bits1(gb); | |
241 sbr->spectrum_params.bs_noise_bands = get_bits(gb, 2); | |
242 } else { | |
243 sbr->spectrum_params.bs_freq_scale = 2; | |
244 sbr->spectrum_params.bs_alter_scale = 1; | |
245 sbr->spectrum_params.bs_noise_bands = 2; | |
246 } | |
247 | |
248 // Check if spectrum parameters changed | |
249 if (memcmp(&old_spectrum_params, &sbr->spectrum_params, sizeof(SpectrumParameters))) | |
250 sbr->reset = 1; | |
251 | |
252 if (bs_header_extra_2) { | |
253 sbr->bs_limiter_bands = get_bits(gb, 2); | |
254 sbr->bs_limiter_gains = get_bits(gb, 2); | |
255 sbr->bs_interpol_freq = get_bits1(gb); | |
256 sbr->bs_smoothing_mode = get_bits1(gb); | |
257 } else { | |
258 sbr->bs_limiter_bands = 2; | |
259 sbr->bs_limiter_gains = 2; | |
260 sbr->bs_interpol_freq = 1; | |
261 sbr->bs_smoothing_mode = 1; | |
262 } | |
263 | |
264 if (sbr->bs_limiter_bands != old_bs_limiter_bands && !sbr->reset) | |
265 sbr_make_f_tablelim(sbr); | |
266 | |
267 return get_bits_count(gb) - cnt; | |
268 } | |
269 | |
270 static int array_min_int16(const int16_t *array, int nel) | |
271 { | |
272 int i, min = array[0]; | |
273 for (i = 1; i < nel; i++) | |
274 min = FFMIN(array[i], min); | |
275 return min; | |
276 } | |
277 | |
278 static void make_bands(int16_t* bands, int start, int stop, int num_bands) | |
279 { | |
280 int k, previous, present; | |
281 float base, prod; | |
282 | |
283 base = powf((float)stop / start, 1.0f / num_bands); | |
284 prod = start; | |
285 previous = start; | |
286 | |
287 for (k = 0; k < num_bands-1; k++) { | |
288 prod *= base; | |
289 present = lrintf(prod); | |
290 bands[k] = present - previous; | |
291 previous = present; | |
292 } | |
293 bands[num_bands-1] = stop - previous; | |
294 } | |
295 | |
296 static int check_n_master(AVCodecContext *avccontext, int n_master, int bs_xover_band) | |
297 { | |
298 // Requirements (14496-3 sp04 p205) | |
299 if (n_master <= 0) { | |
300 av_log(avccontext, AV_LOG_ERROR, "Invalid n_master: %d\n", n_master); | |
301 return -1; | |
302 } | |
303 if (bs_xover_band >= n_master) { | |
304 av_log(avccontext, AV_LOG_ERROR, | |
305 "Invalid bitstream, crossover band index beyond array bounds: %d\n", | |
306 bs_xover_band); | |
307 return -1; | |
308 } | |
309 return 0; | |
310 } | |
311 | |
312 /// Master Frequency Band Table (14496-3 sp04 p194) | |
313 static int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr, | |
314 SpectrumParameters *spectrum) | |
315 { | |
316 unsigned int temp, max_qmf_subbands; | |
317 unsigned int start_min, stop_min; | |
318 int k; | |
319 const int8_t *sbr_offset_ptr; | |
320 int16_t stop_dk[13]; | |
321 | |
322 if (sbr->sample_rate < 32000) { | |
323 temp = 3000; | |
324 } else if (sbr->sample_rate < 64000) { | |
325 temp = 4000; | |
326 } else | |
327 temp = 5000; | |
328 | |
329 start_min = ((temp << 7) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | |
330 stop_min = ((temp << 8) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | |
331 | |
332 switch (sbr->sample_rate) { | |
333 case 16000: | |
334 sbr_offset_ptr = sbr_offset[0]; | |
335 break; | |
336 case 22050: | |
337 sbr_offset_ptr = sbr_offset[1]; | |
338 break; | |
339 case 24000: | |
340 sbr_offset_ptr = sbr_offset[2]; | |
341 break; | |
342 case 32000: | |
343 sbr_offset_ptr = sbr_offset[3]; | |
344 break; | |
345 case 44100: case 48000: case 64000: | |
346 sbr_offset_ptr = sbr_offset[4]; | |
347 break; | |
348 case 88200: case 96000: case 128000: case 176400: case 192000: | |
349 sbr_offset_ptr = sbr_offset[5]; | |
350 break; | |
351 default: | |
352 av_log(ac->avccontext, AV_LOG_ERROR, | |
353 "Unsupported sample rate for SBR: %d\n", sbr->sample_rate); | |
354 return -1; | |
355 } | |
356 | |
357 sbr->k[0] = start_min + sbr_offset_ptr[spectrum->bs_start_freq]; | |
358 | |
359 if (spectrum->bs_stop_freq < 14) { | |
360 sbr->k[2] = stop_min; | |
361 make_bands(stop_dk, stop_min, 64, 13); | |
362 qsort(stop_dk, 13, sizeof(stop_dk[0]), qsort_comparison_function_int16); | |
363 for (k = 0; k < spectrum->bs_stop_freq; k++) | |
364 sbr->k[2] += stop_dk[k]; | |
365 } else if (spectrum->bs_stop_freq == 14) { | |
366 sbr->k[2] = 2*sbr->k[0]; | |
367 } else if (spectrum->bs_stop_freq == 15) { | |
368 sbr->k[2] = 3*sbr->k[0]; | |
369 } else { | |
370 av_log(ac->avccontext, AV_LOG_ERROR, | |
371 "Invalid bs_stop_freq: %d\n", spectrum->bs_stop_freq); | |
372 return -1; | |
373 } | |
374 sbr->k[2] = FFMIN(64, sbr->k[2]); | |
375 | |
376 // Requirements (14496-3 sp04 p205) | |
377 if (sbr->sample_rate <= 32000) { | |
378 max_qmf_subbands = 48; | |
379 } else if (sbr->sample_rate == 44100) { | |
380 max_qmf_subbands = 35; | |
381 } else if (sbr->sample_rate >= 48000) | |
382 max_qmf_subbands = 32; | |
383 | |
384 if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) { | |
385 av_log(ac->avccontext, AV_LOG_ERROR, | |
386 "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr->k[0]); | |
387 return -1; | |
388 } | |
389 | |
390 if (!spectrum->bs_freq_scale) { | |
391 unsigned int dk; | |
392 int k2diff; | |
393 | |
394 dk = spectrum->bs_alter_scale + 1; | |
395 sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1; | |
396 if (check_n_master(ac->avccontext, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | |
397 return -1; | |
398 | |
399 for (k = 1; k <= sbr->n_master; k++) | |
400 sbr->f_master[k] = dk; | |
401 | |
402 k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk; | |
403 if (k2diff < 0) { | |
404 sbr->f_master[1]--; | |
405 sbr->f_master[2]-= (k2diff < 1); | |
406 } else if (k2diff) { | |
407 sbr->f_master[sbr->n_master]++; | |
408 } | |
409 | |
410 sbr->f_master[0] = sbr->k[0]; | |
411 for (k = 1; k <= sbr->n_master; k++) | |
412 sbr->f_master[k] += sbr->f_master[k - 1]; | |
413 | |
414 } else { | |
415 int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = {1,2,3} | |
416 int two_regions, num_bands_0; | |
417 int vdk0_max, vdk1_min; | |
418 int16_t vk0[49]; | |
419 | |
420 if (49 * sbr->k[2] > 110 * sbr->k[0]) { | |
421 two_regions = 1; | |
422 sbr->k[1] = 2 * sbr->k[0]; | |
423 } else { | |
424 two_regions = 0; | |
425 sbr->k[1] = sbr->k[2]; | |
426 } | |
427 | |
428 num_bands_0 = lrintf(half_bands * log2f(sbr->k[1] / (float)sbr->k[0])) * 2; | |
429 | |
430 if (num_bands_0 <= 0) { // Requirements (14496-3 sp04 p205) | |
431 av_log(ac->avccontext, AV_LOG_ERROR, "Invalid num_bands_0: %d\n", num_bands_0); | |
432 return -1; | |
433 } | |
434 | |
435 vk0[0] = 0; | |
436 | |
437 make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0); | |
438 | |
439 qsort(vk0 + 1, num_bands_0, sizeof(vk0[1]), qsort_comparison_function_int16); | |
440 vdk0_max = vk0[num_bands_0]; | |
441 | |
442 vk0[0] = sbr->k[0]; | |
443 for (k = 1; k <= num_bands_0; k++) { | |
444 if (vk0[k] <= 0) { // Requirements (14496-3 sp04 p205) | |
445 av_log(ac->avccontext, AV_LOG_ERROR, "Invalid vDk0[%d]: %d\n", k, vk0[k]); | |
446 return -1; | |
447 } | |
448 vk0[k] += vk0[k-1]; | |
449 } | |
450 | |
451 if (two_regions) { | |
452 int16_t vk1[49]; | |
453 float invwarp = spectrum->bs_alter_scale ? 0.76923076923076923077f | |
454 : 1.0f; // bs_alter_scale = {0,1} | |
455 int num_bands_1 = lrintf(half_bands * invwarp * | |
456 log2f(sbr->k[2] / (float)sbr->k[1])) * 2; | |
457 | |
458 make_bands(vk1+1, sbr->k[1], sbr->k[2], num_bands_1); | |
459 | |
460 vdk1_min = array_min_int16(vk1 + 1, num_bands_1); | |
461 | |
462 if (vdk1_min < vdk0_max) { | |
463 int change; | |
464 qsort(vk1 + 1, num_bands_1, sizeof(vk1[1]), qsort_comparison_function_int16); | |
465 change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1); | |
466 vk1[1] += change; | |
467 vk1[num_bands_1] -= change; | |
468 } | |
469 | |
470 qsort(vk1 + 1, num_bands_1, sizeof(vk1[1]), qsort_comparison_function_int16); | |
471 | |
472 vk1[0] = sbr->k[1]; | |
473 for (k = 1; k <= num_bands_1; k++) { | |
474 if (vk1[k] <= 0) { // Requirements (14496-3 sp04 p205) | |
475 av_log(ac->avccontext, AV_LOG_ERROR, "Invalid vDk1[%d]: %d\n", k, vk1[k]); | |
476 return -1; | |
477 } | |
478 vk1[k] += vk1[k-1]; | |
479 } | |
480 | |
481 sbr->n_master = num_bands_0 + num_bands_1; | |
482 if (check_n_master(ac->avccontext, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | |
483 return -1; | |
484 memcpy(&sbr->f_master[0], vk0, | |
485 (num_bands_0 + 1) * sizeof(sbr->f_master[0])); | |
486 memcpy(&sbr->f_master[num_bands_0 + 1], vk1 + 1, | |
487 num_bands_1 * sizeof(sbr->f_master[0])); | |
488 | |
489 } else { | |
490 sbr->n_master = num_bands_0; | |
491 if (check_n_master(ac->avccontext, sbr->n_master, sbr->spectrum_params.bs_xover_band)) | |
492 return -1; | |
493 memcpy(sbr->f_master, vk0, (num_bands_0 + 1) * sizeof(sbr->f_master[0])); | |
494 } | |
495 } | |
496 | |
497 return 0; | |
498 } | |
499 | |
500 /// High Frequency Generation - Patch Construction (14496-3 sp04 p216 fig. 4.46) | |
501 static int sbr_hf_calc_npatches(AACContext *ac, SpectralBandReplication *sbr) | |
502 { | |
503 int i, k, sb = 0; | |
504 int msb = sbr->k[0]; | |
505 int usb = sbr->kx[1]; | |
506 int goal_sb = ((1000 << 11) + (sbr->sample_rate >> 1)) / sbr->sample_rate; | |
507 | |
508 sbr->num_patches = 0; | |
509 | |
510 if (goal_sb < sbr->kx[1] + sbr->m[1]) { | |
511 for (k = 0; sbr->f_master[k] < goal_sb; k++) ; | |
512 } else | |
513 k = sbr->n_master; | |
514 | |
515 do { | |
516 int odd = 0; | |
517 for (i = k; i == k || sb > (sbr->k[0] - 1 + msb - odd); i--) { | |
518 sb = sbr->f_master[i]; | |
519 odd = (sb + sbr->k[0]) & 1; | |
520 } | |
521 | |
11671
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
522 // Requirements (14496-3 sp04 p205) sets the maximum number of patches to 5. |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
523 // After this check the final number of patches can still be six which is |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
524 // illegal however the Coding Technologies decoder check stream has a final |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
525 // count of 6 patches |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
526 if (sbr->num_patches > 5) { |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
527 av_log(ac->avccontext, AV_LOG_ERROR, "Too many patches: %d\n", sbr->num_patches); |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
528 return -1; |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
529 } |
7f301b81b503
Move the SBR patch count check to prevent overwrites.
alexc
parents:
11670
diff
changeset
|
530 |
11401 | 531 sbr->patch_num_subbands[sbr->num_patches] = FFMAX(sb - usb, 0); |
532 sbr->patch_start_subband[sbr->num_patches] = sbr->k[0] - odd - sbr->patch_num_subbands[sbr->num_patches]; | |
533 | |
534 if (sbr->patch_num_subbands[sbr->num_patches] > 0) { | |
535 usb = sb; | |
536 msb = sb; | |
537 sbr->num_patches++; | |
538 } else | |
539 msb = sbr->kx[1]; | |
540 | |
541 if (sbr->f_master[k] - sb < 3) | |
542 k = sbr->n_master; | |
543 } while (sb != sbr->kx[1] + sbr->m[1]); | |
544 | |
545 if (sbr->patch_num_subbands[sbr->num_patches-1] < 3 && sbr->num_patches > 1) | |
546 sbr->num_patches--; | |
547 | |
548 return 0; | |
549 } | |
550 | |
551 /// Derived Frequency Band Tables (14496-3 sp04 p197) | |
552 static int sbr_make_f_derived(AACContext *ac, SpectralBandReplication *sbr) | |
553 { | |
554 int k, temp; | |
555 | |
556 sbr->n[1] = sbr->n_master - sbr->spectrum_params.bs_xover_band; | |
557 sbr->n[0] = (sbr->n[1] + 1) >> 1; | |
558 | |
559 memcpy(sbr->f_tablehigh, &sbr->f_master[sbr->spectrum_params.bs_xover_band], | |
560 (sbr->n[1] + 1) * sizeof(sbr->f_master[0])); | |
561 sbr->m[1] = sbr->f_tablehigh[sbr->n[1]] - sbr->f_tablehigh[0]; | |
562 sbr->kx[1] = sbr->f_tablehigh[0]; | |
563 | |
564 // Requirements (14496-3 sp04 p205) | |
565 if (sbr->kx[1] + sbr->m[1] > 64) { | |
566 av_log(ac->avccontext, AV_LOG_ERROR, | |
567 "Stop frequency border too high: %d\n", sbr->kx[1] + sbr->m[1]); | |
568 return -1; | |
569 } | |
570 if (sbr->kx[1] > 32) { | |
571 av_log(ac->avccontext, AV_LOG_ERROR, "Start frequency border too high: %d\n", sbr->kx[1]); | |
572 return -1; | |
573 } | |
574 | |
575 sbr->f_tablelow[0] = sbr->f_tablehigh[0]; | |
576 temp = sbr->n[1] & 1; | |
577 for (k = 1; k <= sbr->n[0]; k++) | |
578 sbr->f_tablelow[k] = sbr->f_tablehigh[2 * k - temp]; | |
579 | |
580 sbr->n_q = FFMAX(1, lrintf(sbr->spectrum_params.bs_noise_bands * | |
581 log2f(sbr->k[2] / (float)sbr->kx[1]))); // 0 <= bs_noise_bands <= 3 | |
582 if (sbr->n_q > 5) { | |
583 av_log(ac->avccontext, AV_LOG_ERROR, "Too many noise floor scale factors: %d\n", sbr->n_q); | |
584 return -1; | |
585 } | |
586 | |
587 sbr->f_tablenoise[0] = sbr->f_tablelow[0]; | |
588 temp = 0; | |
589 for (k = 1; k <= sbr->n_q; k++) { | |
590 temp += (sbr->n[0] - temp) / (sbr->n_q + 1 - k); | |
591 sbr->f_tablenoise[k] = sbr->f_tablelow[temp]; | |
592 } | |
593 | |
594 if (sbr_hf_calc_npatches(ac, sbr) < 0) | |
595 return -1; | |
596 | |
597 sbr_make_f_tablelim(sbr); | |
598 | |
599 sbr->data[0].f_indexnoise = 0; | |
600 sbr->data[1].f_indexnoise = 0; | |
601 | |
602 return 0; | |
603 } | |
604 | |
605 static av_always_inline void get_bits1_vector(GetBitContext *gb, uint8_t *vec, | |
606 int elements) | |
607 { | |
608 int i; | |
609 for (i = 0; i < elements; i++) { | |
610 vec[i] = get_bits1(gb); | |
611 } | |
612 } | |
613 | |
614 /** ceil(log2(index+1)) */ | |
615 static const int8_t ceil_log2[] = { | |
616 0, 1, 2, 2, 3, 3, | |
617 }; | |
618 | |
619 static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr, | |
620 GetBitContext *gb, SBRData *ch_data) | |
621 { | |
622 int i; | |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
623 unsigned bs_pointer = 0; |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
624 // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots |
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
625 int abs_bord_trail = 16; |
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
626 int num_rel_lead, num_rel_trail; |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
627 unsigned bs_num_env_old = ch_data->bs_num_env; |
11401 | 628 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
629 ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env]; |
11401 | 630 ch_data->bs_amp_res = sbr->bs_amp_res_header; |
11447 | 631 ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old]; |
11401 | 632 |
633 switch (ch_data->bs_frame_class = get_bits(gb, 2)) { | |
634 case FIXFIX: | |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
635 ch_data->bs_num_env = 1 << get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
636 num_rel_lead = ch_data->bs_num_env - 1; |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
637 if (ch_data->bs_num_env == 1) |
11401 | 638 ch_data->bs_amp_res = 0; |
639 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
640 if (ch_data->bs_num_env > 4) { |
11434 | 641 av_log(ac->avccontext, AV_LOG_ERROR, |
642 "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n", | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
643 ch_data->bs_num_env); |
11434 | 644 return -1; |
645 } | |
646 | |
11447 | 647 ch_data->t_env[0] = 0; |
648 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; | |
649 | |
650 abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) / | |
651 ch_data->bs_num_env; | |
652 for (i = 0; i < num_rel_lead; i++) | |
653 ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail; | |
654 | |
11401 | 655 ch_data->bs_freq_res[1] = get_bits1(gb); |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
656 for (i = 1; i < ch_data->bs_num_env; i++) |
11401 | 657 ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1]; |
658 break; | |
659 case FIXVAR: | |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
660 abs_bord_trail += get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
661 num_rel_trail = get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
662 ch_data->bs_num_env = num_rel_trail + 1; |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
663 ch_data->t_env[0] = 0; |
11447 | 664 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
11401 | 665 |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
666 for (i = 0; i < num_rel_trail; i++) |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
667 ch_data->t_env[ch_data->bs_num_env - 1 - i] = |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
668 ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; |
11401 | 669 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
670 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); |
11401 | 671 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
672 for (i = 0; i < ch_data->bs_num_env; i++) |
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
673 ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb); |
11401 | 674 break; |
675 case VARFIX: | |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
676 ch_data->t_env[0] = get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
677 num_rel_lead = get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
678 ch_data->bs_num_env = num_rel_lead + 1; |
11447 | 679 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
11401 | 680 |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
681 for (i = 0; i < num_rel_lead; i++) |
11447 | 682 ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; |
11401 | 683 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
684 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); |
11401 | 685 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
686 get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); |
11401 | 687 break; |
688 case VARVAR: | |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
689 ch_data->t_env[0] = get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
690 abs_bord_trail += get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
691 num_rel_lead = get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
692 num_rel_trail = get_bits(gb, 2); |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
693 ch_data->bs_num_env = num_rel_lead + num_rel_trail + 1; |
11401 | 694 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
695 if (ch_data->bs_num_env > 5) { |
11434 | 696 av_log(ac->avccontext, AV_LOG_ERROR, |
697 "Invalid bitstream, too many SBR envelopes in VARVAR type SBR frame: %d\n", | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
698 ch_data->bs_num_env); |
11434 | 699 return -1; |
700 } | |
701 | |
11450
95123a24a580
aacsbr: Check that bs_num_env is valid before writing arrays with it as an offset.
alexc
parents:
11449
diff
changeset
|
702 ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
95123a24a580
aacsbr: Check that bs_num_env is valid before writing arrays with it as an offset.
alexc
parents:
11449
diff
changeset
|
703 |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
704 for (i = 0; i < num_rel_lead; i++) |
11447 | 705 ch_data->t_env[i + 1] = ch_data->t_env[i] + 2 * get_bits(gb, 2) + 2; |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
706 for (i = 0; i < num_rel_trail; i++) |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
707 ch_data->t_env[ch_data->bs_num_env - 1 - i] = |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
708 ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; |
11401 | 709 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
710 bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); |
11401 | 711 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
712 get_bits1_vector(gb, ch_data->bs_freq_res + 1, ch_data->bs_num_env); |
11401 | 713 break; |
714 } | |
715 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
716 if (bs_pointer > ch_data->bs_num_env + 1) { |
11433
d8c2170062ce
aacsbr: Check for illegal values of bs_pointer in sbr_read_grid().
alexc
parents:
11429
diff
changeset
|
717 av_log(ac->avccontext, AV_LOG_ERROR, |
d8c2170062ce
aacsbr: Check for illegal values of bs_pointer in sbr_read_grid().
alexc
parents:
11429
diff
changeset
|
718 "Invalid bitstream, bs_pointer points to a middle noise border outside the time borders table: %d\n", |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
719 bs_pointer); |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
720 return -1; |
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
721 } |
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
722 |
11672 | 723 for (i = 1; i <= ch_data->bs_num_env; i++) { |
724 if (ch_data->t_env[i-1] > ch_data->t_env[i]) { | |
725 av_log(ac->avccontext, AV_LOG_ERROR, "Non monotone time borders\n"); | |
726 return -1; | |
727 } | |
728 } | |
729 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
730 ch_data->bs_num_noise = (ch_data->bs_num_env > 1) + 1; |
11401 | 731 |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
732 ch_data->t_q[0] = ch_data->t_env[0]; |
11448
9fd8da0f1a50
aacsbr: Factor out the common end border case from t_q setup.
alexc
parents:
11447
diff
changeset
|
733 ch_data->t_q[ch_data->bs_num_noise] = ch_data->t_env[ch_data->bs_num_env]; |
11439 | 734 if (ch_data->bs_num_noise > 1) { |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
735 unsigned int idx; |
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
736 if (ch_data->bs_frame_class == FIXFIX) { |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
737 idx = ch_data->bs_num_env >> 1; |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
738 } else if (ch_data->bs_frame_class & 1) { // FIXVAR or VARVAR |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
739 idx = ch_data->bs_num_env - FFMAX(bs_pointer - 1, 1); |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
740 } else { // VARFIX |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
741 if (!bs_pointer) |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
742 idx = 1; |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
743 else if (bs_pointer == 1) |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
744 idx = ch_data->bs_num_env - 1; |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
745 else // bs_pointer > 1 |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
746 idx = bs_pointer - 1; |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
747 } |
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
748 ch_data->t_q[1] = ch_data->t_env[idx]; |
11448
9fd8da0f1a50
aacsbr: Factor out the common end border case from t_q setup.
alexc
parents:
11447
diff
changeset
|
749 } |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
750 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
751 ch_data->e_a[0] = -(ch_data->e_a[1] != bs_num_env_old); // l_APrev |
11436
d90f6c676063
aacsbr: Move the e_a calculation from sbr_mapping() to read_sbr_grid().
alexc
parents:
11435
diff
changeset
|
752 ch_data->e_a[1] = -1; |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
753 if ((ch_data->bs_frame_class & 1) && bs_pointer) { // FIXVAR or VARVAR and bs_pointer != 0 |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
754 ch_data->e_a[1] = ch_data->bs_num_env + 1 - bs_pointer; |
11437
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
755 } else if ((ch_data->bs_frame_class == 2) && (bs_pointer > 1)) // VARFIX and bs_pointer > 1 |
8b2d9e680000
aacsbr: Cleanup the newly merged read_sbr_grid, eliminating several context
alexc
parents:
11436
diff
changeset
|
756 ch_data->e_a[1] = bs_pointer - 1; |
11436
d90f6c676063
aacsbr: Move the e_a calculation from sbr_mapping() to read_sbr_grid().
alexc
parents:
11435
diff
changeset
|
757 |
11401 | 758 return 0; |
759 } | |
760 | |
761 static void copy_sbr_grid(SBRData *dst, const SBRData *src) { | |
762 //These variables are saved from the previous frame rather than copied | |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
763 dst->bs_freq_res[0] = dst->bs_freq_res[dst->bs_num_env]; |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
764 dst->t_env_num_env_old = dst->t_env[dst->bs_num_env]; |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
765 dst->e_a[0] = -(dst->e_a[1] != dst->bs_num_env); |
11401 | 766 |
767 //These variables are read from the bitstream and therefore copied | |
768 memcpy(dst->bs_freq_res+1, src->bs_freq_res+1, sizeof(dst->bs_freq_res)-sizeof(*dst->bs_freq_res)); | |
11435
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
769 memcpy(dst->t_env, src->t_env, sizeof(dst->t_env)); |
4dfd0bfbb8dc
aacsbr: Merge sbr_time_freq_grid into read_sbr_grid (and into copy_sbr_grid).
alexc
parents:
11434
diff
changeset
|
770 memcpy(dst->t_q, src->t_q, sizeof(dst->t_q)); |
11449
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
771 dst->bs_num_env = src->bs_num_env; |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
772 dst->bs_amp_res = src->bs_amp_res; |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
773 dst->bs_num_noise = src->bs_num_noise; |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
774 dst->bs_frame_class = src->bs_frame_class; |
e62f45fd47d4
aacsbr: Cleanup read_sbr_grid and copy_sbr_grid after the recent overhaul of those functions.
alexc
parents:
11448
diff
changeset
|
775 dst->e_a[1] = src->e_a[1]; |
11401 | 776 } |
777 | |
778 /// Read how the envelope and noise floor data is delta coded | |
779 static void read_sbr_dtdf(SpectralBandReplication *sbr, GetBitContext *gb, | |
780 SBRData *ch_data) | |
781 { | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
782 get_bits1_vector(gb, ch_data->bs_df_env, ch_data->bs_num_env); |
11401 | 783 get_bits1_vector(gb, ch_data->bs_df_noise, ch_data->bs_num_noise); |
784 } | |
785 | |
786 /// Read inverse filtering data | |
787 static void read_sbr_invf(SpectralBandReplication *sbr, GetBitContext *gb, | |
788 SBRData *ch_data) | |
789 { | |
790 int i; | |
791 | |
792 memcpy(ch_data->bs_invf_mode[1], ch_data->bs_invf_mode[0], 5 * sizeof(uint8_t)); | |
793 for (i = 0; i < sbr->n_q; i++) | |
794 ch_data->bs_invf_mode[0][i] = get_bits(gb, 2); | |
795 } | |
796 | |
797 static void read_sbr_envelope(SpectralBandReplication *sbr, GetBitContext *gb, | |
798 SBRData *ch_data, int ch) | |
799 { | |
800 int bits; | |
801 int i, j, k; | |
802 VLC_TYPE (*t_huff)[2], (*f_huff)[2]; | |
803 int t_lav, f_lav; | |
804 const int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; | |
805 const int odd = sbr->n[1] & 1; | |
806 | |
807 if (sbr->bs_coupling && ch) { | |
808 if (ch_data->bs_amp_res) { | |
809 bits = 5; | |
810 t_huff = vlc_sbr[T_HUFFMAN_ENV_BAL_3_0DB].table; | |
811 t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_BAL_3_0DB]; | |
812 f_huff = vlc_sbr[F_HUFFMAN_ENV_BAL_3_0DB].table; | |
813 f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_3_0DB]; | |
814 } else { | |
815 bits = 6; | |
816 t_huff = vlc_sbr[T_HUFFMAN_ENV_BAL_1_5DB].table; | |
817 t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_BAL_1_5DB]; | |
818 f_huff = vlc_sbr[F_HUFFMAN_ENV_BAL_1_5DB].table; | |
819 f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_1_5DB]; | |
820 } | |
821 } else { | |
822 if (ch_data->bs_amp_res) { | |
823 bits = 6; | |
824 t_huff = vlc_sbr[T_HUFFMAN_ENV_3_0DB].table; | |
825 t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_3_0DB]; | |
826 f_huff = vlc_sbr[F_HUFFMAN_ENV_3_0DB].table; | |
827 f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_3_0DB]; | |
828 } else { | |
829 bits = 7; | |
830 t_huff = vlc_sbr[T_HUFFMAN_ENV_1_5DB].table; | |
831 t_lav = vlc_sbr_lav[T_HUFFMAN_ENV_1_5DB]; | |
832 f_huff = vlc_sbr[F_HUFFMAN_ENV_1_5DB].table; | |
833 f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_1_5DB]; | |
834 } | |
835 } | |
836 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
837 for (i = 0; i < ch_data->bs_num_env; i++) { |
11401 | 838 if (ch_data->bs_df_env[i]) { |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
839 // bs_freq_res[0] == bs_freq_res[bs_num_env] from prev frame |
11401 | 840 if (ch_data->bs_freq_res[i + 1] == ch_data->bs_freq_res[i]) { |
841 for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) | |
842 ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][j] + delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav); | |
843 } else if (ch_data->bs_freq_res[i + 1]) { | |
844 for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | |
845 k = (j + odd) >> 1; // find k such that f_tablelow[k] <= f_tablehigh[j] < f_tablelow[k + 1] | |
846 ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][k] + delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav); | |
847 } | |
848 } else { | |
849 for (j = 0; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) { | |
850 k = j ? 2*j - odd : 0; // find k such that f_tablehigh[k] == f_tablelow[j] | |
851 ch_data->env_facs[i + 1][j] = ch_data->env_facs[i][k] + delta * (get_vlc2(gb, t_huff, 9, 3) - t_lav); | |
852 } | |
853 } | |
854 } else { | |
855 ch_data->env_facs[i + 1][0] = delta * get_bits(gb, bits); // bs_env_start_value_balance | |
856 for (j = 1; j < sbr->n[ch_data->bs_freq_res[i + 1]]; j++) | |
857 ch_data->env_facs[i + 1][j] = ch_data->env_facs[i + 1][j - 1] + delta * (get_vlc2(gb, f_huff, 9, 3) - f_lav); | |
858 } | |
859 } | |
860 | |
861 //assign 0th elements of env_facs from last elements | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
862 memcpy(ch_data->env_facs[0], ch_data->env_facs[ch_data->bs_num_env], |
11401 | 863 sizeof(ch_data->env_facs[0])); |
864 } | |
865 | |
866 static void read_sbr_noise(SpectralBandReplication *sbr, GetBitContext *gb, | |
867 SBRData *ch_data, int ch) | |
868 { | |
869 int i, j; | |
870 VLC_TYPE (*t_huff)[2], (*f_huff)[2]; | |
871 int t_lav, f_lav; | |
872 int delta = (ch == 1 && sbr->bs_coupling == 1) + 1; | |
873 | |
874 if (sbr->bs_coupling && ch) { | |
875 t_huff = vlc_sbr[T_HUFFMAN_NOISE_BAL_3_0DB].table; | |
876 t_lav = vlc_sbr_lav[T_HUFFMAN_NOISE_BAL_3_0DB]; | |
877 f_huff = vlc_sbr[F_HUFFMAN_ENV_BAL_3_0DB].table; | |
878 f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_BAL_3_0DB]; | |
879 } else { | |
880 t_huff = vlc_sbr[T_HUFFMAN_NOISE_3_0DB].table; | |
881 t_lav = vlc_sbr_lav[T_HUFFMAN_NOISE_3_0DB]; | |
882 f_huff = vlc_sbr[F_HUFFMAN_ENV_3_0DB].table; | |
883 f_lav = vlc_sbr_lav[F_HUFFMAN_ENV_3_0DB]; | |
884 } | |
885 | |
886 for (i = 0; i < ch_data->bs_num_noise; i++) { | |
887 if (ch_data->bs_df_noise[i]) { | |
888 for (j = 0; j < sbr->n_q; j++) | |
889 ch_data->noise_facs[i + 1][j] = ch_data->noise_facs[i][j] + delta * (get_vlc2(gb, t_huff, 9, 2) - t_lav); | |
890 } else { | |
891 ch_data->noise_facs[i + 1][0] = delta * get_bits(gb, 5); // bs_noise_start_value_balance or bs_noise_start_value_level | |
892 for (j = 1; j < sbr->n_q; j++) | |
893 ch_data->noise_facs[i + 1][j] = ch_data->noise_facs[i + 1][j - 1] + delta * (get_vlc2(gb, f_huff, 9, 3) - f_lav); | |
894 } | |
895 } | |
896 | |
897 //assign 0th elements of noise_facs from last elements | |
898 memcpy(ch_data->noise_facs[0], ch_data->noise_facs[ch_data->bs_num_noise], | |
899 sizeof(ch_data->noise_facs[0])); | |
900 } | |
901 | |
902 static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, | |
903 GetBitContext *gb, | |
11590 | 904 int bs_extension_id, int *num_bits_left) |
11401 | 905 { |
906 //TODO - implement ps_data for parametric stereo parsing | |
907 switch (bs_extension_id) { | |
908 case EXTENSION_ID_PS: | |
11589
fa81ba4670ea
Print an error and skip PS when PS is found but explicitly found but
alexc
parents:
11482
diff
changeset
|
909 if (!ac->m4ac.ps) { |
fa81ba4670ea
Print an error and skip PS when PS is found but explicitly found but
alexc
parents:
11482
diff
changeset
|
910 av_log(ac->avccontext, AV_LOG_ERROR, "Parametric Stereo signaled to be not-present but was found in the bitstream.\n"); |
11590 | 911 skip_bits_long(gb, *num_bits_left); // bs_fill_bits |
912 *num_bits_left = 0; | |
11589
fa81ba4670ea
Print an error and skip PS when PS is found but explicitly found but
alexc
parents:
11482
diff
changeset
|
913 } else { |
11401 | 914 #if 0 |
11590 | 915 *num_bits_left -= ff_ps_data(gb, ps); |
11401 | 916 #else |
11590 | 917 av_log_missing_feature(ac->avccontext, "Parametric Stereo is", 0); |
918 skip_bits_long(gb, *num_bits_left); // bs_fill_bits | |
919 *num_bits_left = 0; | |
11401 | 920 #endif |
11589
fa81ba4670ea
Print an error and skip PS when PS is found but explicitly found but
alexc
parents:
11482
diff
changeset
|
921 } |
11401 | 922 break; |
923 default: | |
924 av_log_missing_feature(ac->avccontext, "Reserved SBR extensions are", 1); | |
925 skip_bits_long(gb, *num_bits_left); // bs_fill_bits | |
926 *num_bits_left = 0; | |
927 break; | |
928 } | |
929 } | |
930 | |
11428
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
931 static int read_sbr_single_channel_element(AACContext *ac, |
11401 | 932 SpectralBandReplication *sbr, |
933 GetBitContext *gb) | |
934 { | |
935 if (get_bits1(gb)) // bs_data_extra | |
936 skip_bits(gb, 4); // bs_reserved | |
937 | |
11428
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
938 if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
939 return -1; |
11401 | 940 read_sbr_dtdf(sbr, gb, &sbr->data[0]); |
941 read_sbr_invf(sbr, gb, &sbr->data[0]); | |
942 read_sbr_envelope(sbr, gb, &sbr->data[0], 0); | |
943 read_sbr_noise(sbr, gb, &sbr->data[0], 0); | |
944 | |
945 if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) | |
946 get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); | |
11429
4eee52db3c4c
10l: Include missing return values in functions made non-void by the previous commit.
alexc
parents:
11428
diff
changeset
|
947 |
4eee52db3c4c
10l: Include missing return values in functions made non-void by the previous commit.
alexc
parents:
11428
diff
changeset
|
948 return 0; |
11401 | 949 } |
950 | |
11428
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
951 static int read_sbr_channel_pair_element(AACContext *ac, |
11401 | 952 SpectralBandReplication *sbr, |
953 GetBitContext *gb) | |
954 { | |
955 if (get_bits1(gb)) // bs_data_extra | |
956 skip_bits(gb, 8); // bs_reserved | |
957 | |
958 if ((sbr->bs_coupling = get_bits1(gb))) { | |
11428
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
959 if (read_sbr_grid(ac, sbr, gb, &sbr->data[0])) |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
960 return -1; |
11401 | 961 copy_sbr_grid(&sbr->data[1], &sbr->data[0]); |
962 read_sbr_dtdf(sbr, gb, &sbr->data[0]); | |
963 read_sbr_dtdf(sbr, gb, &sbr->data[1]); | |
964 read_sbr_invf(sbr, gb, &sbr->data[0]); | |
965 memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); | |
966 memcpy(sbr->data[1].bs_invf_mode[0], sbr->data[0].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); | |
967 read_sbr_envelope(sbr, gb, &sbr->data[0], 0); | |
968 read_sbr_noise(sbr, gb, &sbr->data[0], 0); | |
969 read_sbr_envelope(sbr, gb, &sbr->data[1], 1); | |
970 read_sbr_noise(sbr, gb, &sbr->data[1], 1); | |
971 } else { | |
11428
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
972 if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) || |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
973 read_sbr_grid(ac, sbr, gb, &sbr->data[1])) |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
974 return -1; |
11401 | 975 read_sbr_dtdf(sbr, gb, &sbr->data[0]); |
976 read_sbr_dtdf(sbr, gb, &sbr->data[1]); | |
977 read_sbr_invf(sbr, gb, &sbr->data[0]); | |
978 read_sbr_invf(sbr, gb, &sbr->data[1]); | |
979 read_sbr_envelope(sbr, gb, &sbr->data[0], 0); | |
980 read_sbr_envelope(sbr, gb, &sbr->data[1], 1); | |
981 read_sbr_noise(sbr, gb, &sbr->data[0], 0); | |
982 read_sbr_noise(sbr, gb, &sbr->data[1], 1); | |
983 } | |
984 | |
985 if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) | |
986 get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); | |
987 if ((sbr->data[1].bs_add_harmonic_flag = get_bits1(gb))) | |
988 get_bits1_vector(gb, sbr->data[1].bs_add_harmonic, sbr->n[1]); | |
11429
4eee52db3c4c
10l: Include missing return values in functions made non-void by the previous commit.
alexc
parents:
11428
diff
changeset
|
989 |
4eee52db3c4c
10l: Include missing return values in functions made non-void by the previous commit.
alexc
parents:
11428
diff
changeset
|
990 return 0; |
11401 | 991 } |
992 | |
993 static unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr, | |
994 GetBitContext *gb, int id_aac) | |
995 { | |
996 unsigned int cnt = get_bits_count(gb); | |
997 | |
998 if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) { | |
11428
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
999 if (read_sbr_single_channel_element(ac, sbr, gb)) { |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
1000 sbr->start = 0; |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
1001 return get_bits_count(gb) - cnt; |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
1002 } |
11401 | 1003 } else if (id_aac == TYPE_CPE) { |
11428
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
1004 if (read_sbr_channel_pair_element(ac, sbr, gb)) { |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
1005 sbr->start = 0; |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
1006 return get_bits_count(gb) - cnt; |
6b0d65c8c13d
aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
alexc
parents:
11427
diff
changeset
|
1007 } |
11401 | 1008 } else { |
1009 av_log(ac->avccontext, AV_LOG_ERROR, | |
1010 "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac); | |
1011 sbr->start = 0; | |
1012 return get_bits_count(gb) - cnt; | |
1013 } | |
1014 if (get_bits1(gb)) { // bs_extended_data | |
1015 int num_bits_left = get_bits(gb, 4); // bs_extension_size | |
1016 if (num_bits_left == 15) | |
1017 num_bits_left += get_bits(gb, 8); // bs_esc_count | |
1018 | |
1019 num_bits_left <<= 3; | |
1020 while (num_bits_left > 7) { | |
1021 num_bits_left -= 2; | |
1022 read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id | |
1023 } | |
1024 } | |
1025 | |
1026 return get_bits_count(gb) - cnt; | |
1027 } | |
1028 | |
1029 static void sbr_reset(AACContext *ac, SpectralBandReplication *sbr) | |
1030 { | |
1031 int err; | |
1032 err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params); | |
1033 if (err >= 0) | |
1034 err = sbr_make_f_derived(ac, sbr); | |
1035 if (err < 0) { | |
1036 av_log(ac->avccontext, AV_LOG_ERROR, | |
1037 "SBR reset failed. Switching SBR to pure upsampling mode.\n"); | |
1038 sbr->start = 0; | |
1039 } | |
1040 } | |
1041 | |
1042 /** | |
1043 * Decode Spectral Band Replication extension data; reference: table 4.55. | |
1044 * | |
1045 * @param crc flag indicating the presence of CRC checksum | |
1046 * @param cnt length of TYPE_FIL syntactic element in bytes | |
1047 * | |
1048 * @return Returns number of bytes consumed from the TYPE_FIL element. | |
1049 */ | |
1050 int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, | |
1051 GetBitContext *gb_host, int crc, int cnt, int id_aac) | |
1052 { | |
1053 unsigned int num_sbr_bits = 0, num_align_bits; | |
1054 unsigned bytes_read; | |
1055 GetBitContext gbc = *gb_host, *gb = &gbc; | |
1056 skip_bits_long(gb_host, cnt*8 - 4); | |
1057 | |
1058 sbr->reset = 0; | |
1059 | |
1060 if (!sbr->sample_rate) | |
1061 sbr->sample_rate = 2 * ac->m4ac.sample_rate; //TODO use the nominal sample rate for arbitrary sample rate support | |
1062 if (!ac->m4ac.ext_sample_rate) | |
1063 ac->m4ac.ext_sample_rate = 2 * ac->m4ac.sample_rate; | |
1064 | |
1065 if (crc) { | |
1066 skip_bits(gb, 10); // bs_sbr_crc_bits; TODO - implement CRC check | |
1067 num_sbr_bits += 10; | |
1068 } | |
1069 | |
1070 //Save some state from the previous frame. | |
1071 sbr->kx[0] = sbr->kx[1]; | |
1072 sbr->m[0] = sbr->m[1]; | |
1073 | |
1074 num_sbr_bits++; | |
1075 if (get_bits1(gb)) // bs_header_flag | |
1076 num_sbr_bits += read_sbr_header(sbr, gb); | |
1077 | |
1078 if (sbr->reset) | |
1079 sbr_reset(ac, sbr); | |
1080 | |
1081 if (sbr->start) | |
1082 num_sbr_bits += read_sbr_data(ac, sbr, gb, id_aac); | |
1083 | |
1084 num_align_bits = ((cnt << 3) - 4 - num_sbr_bits) & 7; | |
1085 bytes_read = ((num_sbr_bits + num_align_bits + 4) >> 3); | |
1086 | |
1087 if (bytes_read > cnt) { | |
1088 av_log(ac->avccontext, AV_LOG_ERROR, | |
1089 "Expected to read %d SBR bytes actually read %d.\n", cnt, bytes_read); | |
1090 } | |
1091 return cnt; | |
1092 } | |
1093 | |
1094 /// Dequantization and stereo decoding (14496-3 sp04 p203) | |
1095 static void sbr_dequant(SpectralBandReplication *sbr, int id_aac) | |
1096 { | |
1097 int k, e; | |
1098 int ch; | |
1099 | |
1100 if (id_aac == TYPE_CPE && sbr->bs_coupling) { | |
1101 float alpha = sbr->data[0].bs_amp_res ? 1.0f : 0.5f; | |
1102 float pan_offset = sbr->data[0].bs_amp_res ? 12.0f : 24.0f; | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1103 for (e = 1; e <= sbr->data[0].bs_num_env; e++) { |
11401 | 1104 for (k = 0; k < sbr->n[sbr->data[0].bs_freq_res[e]]; k++) { |
1105 float temp1 = exp2f(sbr->data[0].env_facs[e][k] * alpha + 7.0f); | |
1106 float temp2 = exp2f((pan_offset - sbr->data[1].env_facs[e][k]) * alpha); | |
1107 float fac = temp1 / (1.0f + temp2); | |
1108 sbr->data[0].env_facs[e][k] = fac; | |
1109 sbr->data[1].env_facs[e][k] = fac * temp2; | |
1110 } | |
1111 } | |
1112 for (e = 1; e <= sbr->data[0].bs_num_noise; e++) { | |
1113 for (k = 0; k < sbr->n_q; k++) { | |
1114 float temp1 = exp2f(NOISE_FLOOR_OFFSET - sbr->data[0].noise_facs[e][k] + 1); | |
1115 float temp2 = exp2f(12 - sbr->data[1].noise_facs[e][k]); | |
1116 float fac = temp1 / (1.0f + temp2); | |
1117 sbr->data[0].noise_facs[e][k] = fac; | |
1118 sbr->data[1].noise_facs[e][k] = fac * temp2; | |
1119 } | |
1120 } | |
1121 } else { // SCE or one non-coupled CPE | |
1122 for (ch = 0; ch < (id_aac == TYPE_CPE) + 1; ch++) { | |
1123 float alpha = sbr->data[ch].bs_amp_res ? 1.0f : 0.5f; | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1124 for (e = 1; e <= sbr->data[ch].bs_num_env; e++) |
11401 | 1125 for (k = 0; k < sbr->n[sbr->data[ch].bs_freq_res[e]]; k++) |
1126 sbr->data[ch].env_facs[e][k] = | |
1127 exp2f(alpha * sbr->data[ch].env_facs[e][k] + 6.0f); | |
1128 for (e = 1; e <= sbr->data[ch].bs_num_noise; e++) | |
1129 for (k = 0; k < sbr->n_q; k++) | |
1130 sbr->data[ch].noise_facs[e][k] = | |
1131 exp2f(NOISE_FLOOR_OFFSET - sbr->data[ch].noise_facs[e][k]); | |
1132 } | |
1133 } | |
1134 } | |
1135 | |
1136 /** | |
1137 * Analysis QMF Bank (14496-3 sp04 p206) | |
1138 * | |
1139 * @param x pointer to the beginning of the first sample window | |
1140 * @param W array of complex-valued samples split into subbands | |
1141 */ | |
1142 static void sbr_qmf_analysis(DSPContext *dsp, RDFTContext *rdft, const float *in, float *x, | |
1143 float z[320], float W[2][32][32][2], | |
11481
96dde15b2e0d
aac: Don't bias output during the IMDCT if SBR will be used.
alexc
parents:
11450
diff
changeset
|
1144 float scale) |
11401 | 1145 { |
1146 int i, k; | |
1147 memcpy(W[0], W[1], sizeof(W[0])); | |
1148 memcpy(x , x+1024, (320-32)*sizeof(x[0])); | |
11481
96dde15b2e0d
aac: Don't bias output during the IMDCT if SBR will be used.
alexc
parents:
11450
diff
changeset
|
1149 if (scale != 1.0f) |
11482 | 1150 dsp->vector_fmul_scalar(x+288, in, scale, 1024); |
11401 | 1151 else |
1152 memcpy(x+288, in, 1024*sizeof(*x)); | |
1153 for (i = 0; i < 32; i++) { // numTimeSlots*RATE = 16*2 as 960 sample frames | |
1154 // are not supported | |
1155 float re, im; | |
1156 dsp->vector_fmul_reverse(z, sbr_qmf_window_ds, x, 320); | |
1157 for (k = 0; k < 64; k++) { | |
1158 float f = z[k] + z[k + 64] + z[k + 128] + z[k + 192] + z[k + 256]; | |
1159 z[k] = f * analysis_cos_pre[k]; | |
1160 z[k+64] = f; | |
1161 } | |
1162 ff_rdft_calc(rdft, z); | |
1163 re = z[0] * 0.5f; | |
1164 im = 0.5f * dsp->scalarproduct_float(z+64, analysis_sin_pre, 64); | |
1165 W[1][i][0][0] = re * analysis_cossin_post[0][0] - im * analysis_cossin_post[0][1]; | |
1166 W[1][i][0][1] = re * analysis_cossin_post[0][1] + im * analysis_cossin_post[0][0]; | |
1167 for (k = 1; k < 32; k++) { | |
1168 re = z[2*k ] - re; | |
1169 im = z[2*k+1] - im; | |
1170 W[1][i][k][0] = re * analysis_cossin_post[k][0] - im * analysis_cossin_post[k][1]; | |
1171 W[1][i][k][1] = re * analysis_cossin_post[k][1] + im * analysis_cossin_post[k][0]; | |
1172 } | |
1173 x += 32; | |
1174 } | |
1175 } | |
1176 | |
1177 /** | |
1178 * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank | |
1179 * (14496-3 sp04 p206) | |
1180 */ | |
1181 static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct, | |
1182 float *out, float X[2][32][64], | |
1183 float mdct_buf[2][64], | |
1184 float *v0, int *v_off, const unsigned int div, | |
1185 float bias, float scale) | |
1186 { | |
1187 int i, n; | |
1188 const float *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us; | |
1189 int scale_and_bias = scale != 1.0f || bias != 0.0f; | |
1190 float *v; | |
1191 for (i = 0; i < 32; i++) { | |
1192 if (*v_off == 0) { | |
1193 int saved_samples = (1280 - 128) >> div; | |
1194 memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(float)); | |
1195 *v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - (128 >> div); | |
1196 } else { | |
1197 *v_off -= 128 >> div; | |
1198 } | |
1199 v = v0 + *v_off; | |
1200 for (n = 1; n < 64 >> div; n+=2) { | |
1201 X[1][i][n] = -X[1][i][n]; | |
1202 } | |
1203 if (div) { | |
1204 memset(X[0][i]+32, 0, 32*sizeof(float)); | |
1205 memset(X[1][i]+32, 0, 32*sizeof(float)); | |
1206 } | |
1207 ff_imdct_half(mdct, mdct_buf[0], X[0][i]); | |
1208 ff_imdct_half(mdct, mdct_buf[1], X[1][i]); | |
1209 if (div) { | |
1210 for (n = 0; n < 32; n++) { | |
1211 v[ n] = -mdct_buf[0][63 - 2*n] + mdct_buf[1][2*n ]; | |
1212 v[ 63 - n] = mdct_buf[0][62 - 2*n] + mdct_buf[1][2*n + 1]; | |
1213 } | |
1214 } else { | |
1215 for (n = 0; n < 64; n++) { | |
1216 v[ n] = -mdct_buf[0][63 - n] + mdct_buf[1][ n ]; | |
1217 v[127 - n] = mdct_buf[0][63 - n] + mdct_buf[1][ n ]; | |
1218 } | |
1219 } | |
1220 dsp->vector_fmul_add(out, v , sbr_qmf_window , zero64, 64 >> div); | |
1221 dsp->vector_fmul_add(out, v + ( 192 >> div), sbr_qmf_window + ( 64 >> div), out , 64 >> div); | |
1222 dsp->vector_fmul_add(out, v + ( 256 >> div), sbr_qmf_window + (128 >> div), out , 64 >> div); | |
1223 dsp->vector_fmul_add(out, v + ( 448 >> div), sbr_qmf_window + (192 >> div), out , 64 >> div); | |
1224 dsp->vector_fmul_add(out, v + ( 512 >> div), sbr_qmf_window + (256 >> div), out , 64 >> div); | |
1225 dsp->vector_fmul_add(out, v + ( 704 >> div), sbr_qmf_window + (320 >> div), out , 64 >> div); | |
1226 dsp->vector_fmul_add(out, v + ( 768 >> div), sbr_qmf_window + (384 >> div), out , 64 >> div); | |
1227 dsp->vector_fmul_add(out, v + ( 960 >> div), sbr_qmf_window + (448 >> div), out , 64 >> div); | |
1228 dsp->vector_fmul_add(out, v + (1024 >> div), sbr_qmf_window + (512 >> div), out , 64 >> div); | |
1229 dsp->vector_fmul_add(out, v + (1216 >> div), sbr_qmf_window + (576 >> div), out , 64 >> div); | |
1230 if (scale_and_bias) | |
1231 for (n = 0; n < 64 >> div; n++) | |
1232 out[n] = out[n] * scale + bias; | |
1233 out += 64 >> div; | |
1234 } | |
1235 } | |
1236 | |
1237 static void autocorrelate(const float x[40][2], float phi[3][2][2], int lag) | |
1238 { | |
1239 int i; | |
1240 float real_sum = 0.0f; | |
1241 float imag_sum = 0.0f; | |
1242 if (lag) { | |
1243 for (i = 1; i < 38; i++) { | |
1244 real_sum += x[i][0] * x[i+lag][0] + x[i][1] * x[i+lag][1]; | |
1245 imag_sum += x[i][0] * x[i+lag][1] - x[i][1] * x[i+lag][0]; | |
1246 } | |
1247 phi[2-lag][1][0] = real_sum + x[ 0][0] * x[lag][0] + x[ 0][1] * x[lag][1]; | |
1248 phi[2-lag][1][1] = imag_sum + x[ 0][0] * x[lag][1] - x[ 0][1] * x[lag][0]; | |
1249 if (lag == 1) { | |
1250 phi[0][0][0] = real_sum + x[38][0] * x[39][0] + x[38][1] * x[39][1]; | |
1251 phi[0][0][1] = imag_sum + x[38][0] * x[39][1] - x[38][1] * x[39][0]; | |
1252 } | |
1253 } else { | |
1254 for (i = 1; i < 38; i++) { | |
1255 real_sum += x[i][0] * x[i][0] + x[i][1] * x[i][1]; | |
1256 } | |
1257 phi[2][1][0] = real_sum + x[ 0][0] * x[ 0][0] + x[ 0][1] * x[ 0][1]; | |
1258 phi[1][0][0] = real_sum + x[38][0] * x[38][0] + x[38][1] * x[38][1]; | |
1259 } | |
1260 } | |
1261 | |
1262 /** High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering | |
1263 * (14496-3 sp04 p214) | |
1264 * Warning: This routine does not seem numerically stable. | |
1265 */ | |
1266 static void sbr_hf_inverse_filter(float (*alpha0)[2], float (*alpha1)[2], | |
1267 const float X_low[32][40][2], int k0) | |
1268 { | |
1269 int k; | |
1270 for (k = 0; k < k0; k++) { | |
1271 float phi[3][2][2], dk; | |
1272 | |
1273 autocorrelate(X_low[k], phi, 0); | |
1274 autocorrelate(X_low[k], phi, 1); | |
1275 autocorrelate(X_low[k], phi, 2); | |
1276 | |
1277 dk = phi[2][1][0] * phi[1][0][0] - | |
1278 (phi[1][1][0] * phi[1][1][0] + phi[1][1][1] * phi[1][1][1]) / 1.000001f; | |
1279 | |
1280 if (!dk) { | |
1281 alpha1[k][0] = 0; | |
1282 alpha1[k][1] = 0; | |
1283 } else { | |
1284 float temp_real, temp_im; | |
1285 temp_real = phi[0][0][0] * phi[1][1][0] - | |
1286 phi[0][0][1] * phi[1][1][1] - | |
1287 phi[0][1][0] * phi[1][0][0]; | |
1288 temp_im = phi[0][0][0] * phi[1][1][1] + | |
1289 phi[0][0][1] * phi[1][1][0] - | |
1290 phi[0][1][1] * phi[1][0][0]; | |
1291 | |
1292 alpha1[k][0] = temp_real / dk; | |
1293 alpha1[k][1] = temp_im / dk; | |
1294 } | |
1295 | |
1296 if (!phi[1][0][0]) { | |
1297 alpha0[k][0] = 0; | |
1298 alpha0[k][1] = 0; | |
1299 } else { | |
1300 float temp_real, temp_im; | |
1301 temp_real = phi[0][0][0] + alpha1[k][0] * phi[1][1][0] + | |
1302 alpha1[k][1] * phi[1][1][1]; | |
1303 temp_im = phi[0][0][1] + alpha1[k][1] * phi[1][1][0] - | |
1304 alpha1[k][0] * phi[1][1][1]; | |
1305 | |
1306 alpha0[k][0] = -temp_real / phi[1][0][0]; | |
1307 alpha0[k][1] = -temp_im / phi[1][0][0]; | |
1308 } | |
1309 | |
1310 if (alpha1[k][0] * alpha1[k][0] + alpha1[k][1] * alpha1[k][1] >= 16.0f || | |
1311 alpha0[k][0] * alpha0[k][0] + alpha0[k][1] * alpha0[k][1] >= 16.0f) { | |
1312 alpha1[k][0] = 0; | |
1313 alpha1[k][1] = 0; | |
1314 alpha0[k][0] = 0; | |
1315 alpha0[k][1] = 0; | |
1316 } | |
1317 } | |
1318 } | |
1319 | |
1320 /// Chirp Factors (14496-3 sp04 p214) | |
1321 static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data) | |
1322 { | |
1323 int i; | |
1324 float new_bw; | |
1325 static const float bw_tab[] = { 0.0f, 0.75f, 0.9f, 0.98f }; | |
1326 | |
1327 for (i = 0; i < sbr->n_q; i++) { | |
1328 if (ch_data->bs_invf_mode[0][i] + ch_data->bs_invf_mode[1][i] == 1) { | |
1329 new_bw = 0.6f; | |
1330 } else | |
1331 new_bw = bw_tab[ch_data->bs_invf_mode[0][i]]; | |
1332 | |
1333 if (new_bw < ch_data->bw_array[i]) { | |
1334 new_bw = 0.75f * new_bw + 0.25f * ch_data->bw_array[i]; | |
1335 } else | |
1336 new_bw = 0.90625f * new_bw + 0.09375f * ch_data->bw_array[i]; | |
1337 ch_data->bw_array[i] = new_bw < 0.015625f ? 0.0f : new_bw; | |
1338 } | |
1339 } | |
1340 | |
1341 /// Generate the subband filtered lowband | |
1342 static int sbr_lf_gen(AACContext *ac, SpectralBandReplication *sbr, | |
1343 float X_low[32][40][2], const float W[2][32][32][2]) | |
1344 { | |
1345 int i, k; | |
1346 const int t_HFGen = 8; | |
1347 const int i_f = 32; | |
1348 memset(X_low, 0, 32*sizeof(*X_low)); | |
1349 for (k = 0; k < sbr->kx[1]; k++) { | |
1350 for (i = t_HFGen; i < i_f + t_HFGen; i++) { | |
1351 X_low[k][i][0] = W[1][i - t_HFGen][k][0]; | |
1352 X_low[k][i][1] = W[1][i - t_HFGen][k][1]; | |
1353 } | |
1354 } | |
1355 for (k = 0; k < sbr->kx[0]; k++) { | |
1356 for (i = 0; i < t_HFGen; i++) { | |
1357 X_low[k][i][0] = W[0][i + i_f - t_HFGen][k][0]; | |
1358 X_low[k][i][1] = W[0][i + i_f - t_HFGen][k][1]; | |
1359 } | |
1360 } | |
1361 return 0; | |
1362 } | |
1363 | |
1364 /// High Frequency Generator (14496-3 sp04 p215) | |
1365 static int sbr_hf_gen(AACContext *ac, SpectralBandReplication *sbr, | |
1366 float X_high[64][40][2], const float X_low[32][40][2], | |
1367 const float (*alpha0)[2], const float (*alpha1)[2], | |
1368 const float bw_array[5], const uint8_t *t_env, | |
1369 int bs_num_env) | |
1370 { | |
1371 int i, j, x; | |
1372 int g = 0; | |
1373 int k = sbr->kx[1]; | |
1374 for (j = 0; j < sbr->num_patches; j++) { | |
1375 for (x = 0; x < sbr->patch_num_subbands[j]; x++, k++) { | |
1376 float alpha[4]; | |
1377 const int p = sbr->patch_start_subband[j] + x; | |
1378 while (g <= sbr->n_q && k >= sbr->f_tablenoise[g]) | |
1379 g++; | |
1380 g--; | |
1381 | |
1382 if (g < 0) { | |
1383 av_log(ac->avccontext, AV_LOG_ERROR, | |
1384 "ERROR : no subband found for frequency %d\n", k); | |
1385 return -1; | |
1386 } | |
1387 | |
1388 alpha[0] = alpha1[p][0] * bw_array[g] * bw_array[g]; | |
1389 alpha[1] = alpha1[p][1] * bw_array[g] * bw_array[g]; | |
1390 alpha[2] = alpha0[p][0] * bw_array[g]; | |
1391 alpha[3] = alpha0[p][1] * bw_array[g]; | |
1392 | |
1393 for (i = 2 * t_env[0]; i < 2 * t_env[bs_num_env]; i++) { | |
1394 const int idx = i + ENVELOPE_ADJUSTMENT_OFFSET; | |
1395 X_high[k][idx][0] = | |
1396 X_low[p][idx - 2][0] * alpha[0] - | |
1397 X_low[p][idx - 2][1] * alpha[1] + | |
1398 X_low[p][idx - 1][0] * alpha[2] - | |
1399 X_low[p][idx - 1][1] * alpha[3] + | |
1400 X_low[p][idx][0]; | |
1401 X_high[k][idx][1] = | |
1402 X_low[p][idx - 2][1] * alpha[0] + | |
1403 X_low[p][idx - 2][0] * alpha[1] + | |
1404 X_low[p][idx - 1][1] * alpha[2] + | |
1405 X_low[p][idx - 1][0] * alpha[3] + | |
1406 X_low[p][idx][1]; | |
1407 } | |
1408 } | |
1409 } | |
1410 if (k < sbr->m[1] + sbr->kx[1]) | |
1411 memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high)); | |
1412 | |
1413 return 0; | |
1414 } | |
1415 | |
1416 /// Generate the subband filtered lowband | |
1417 static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][32][64], | |
1418 const float X_low[32][40][2], const float Y[2][38][64][2], | |
1419 int ch) | |
1420 { | |
1421 int k, i; | |
1422 const int i_f = 32; | |
1423 const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0); | |
1424 memset(X, 0, 2*sizeof(*X)); | |
1425 for (k = 0; k < sbr->kx[0]; k++) { | |
1426 for (i = 0; i < i_Temp; i++) { | |
1427 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; | |
1428 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; | |
1429 } | |
1430 } | |
1431 for (; k < sbr->kx[0] + sbr->m[0]; k++) { | |
1432 for (i = 0; i < i_Temp; i++) { | |
1433 X[0][i][k] = Y[0][i + i_f][k][0]; | |
1434 X[1][i][k] = Y[0][i + i_f][k][1]; | |
1435 } | |
1436 } | |
1437 | |
1438 for (k = 0; k < sbr->kx[1]; k++) { | |
1439 for (i = i_Temp; i < i_f; i++) { | |
1440 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; | |
1441 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; | |
1442 } | |
1443 } | |
1444 for (; k < sbr->kx[1] + sbr->m[1]; k++) { | |
1445 for (i = i_Temp; i < i_f; i++) { | |
1446 X[0][i][k] = Y[1][i][k][0]; | |
1447 X[1][i][k] = Y[1][i][k][1]; | |
1448 } | |
1449 } | |
1450 return 0; | |
1451 } | |
1452 | |
1453 /** High Frequency Adjustment (14496-3 sp04 p217) and Mapping | |
1454 * (14496-3 sp04 p217) | |
1455 */ | |
1456 static void sbr_mapping(AACContext *ac, SpectralBandReplication *sbr, | |
1457 SBRData *ch_data, int e_a[2]) | |
1458 { | |
1459 int e, i, m; | |
1460 | |
1461 memset(ch_data->s_indexmapped[1], 0, 7*sizeof(ch_data->s_indexmapped[1])); | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1462 for (e = 0; e < ch_data->bs_num_env; e++) { |
11401 | 1463 const unsigned int ilim = sbr->n[ch_data->bs_freq_res[e + 1]]; |
1464 uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; | |
1465 int k; | |
1466 | |
1467 for (i = 0; i < ilim; i++) | |
1468 for (m = table[i]; m < table[i + 1]; m++) | |
1469 sbr->e_origmapped[e][m - sbr->kx[1]] = ch_data->env_facs[e+1][i]; | |
1470 | |
1471 // ch_data->bs_num_noise > 1 => 2 noise floors | |
1472 k = (ch_data->bs_num_noise > 1) && (ch_data->t_env[e] >= ch_data->t_q[1]); | |
1473 for (i = 0; i < sbr->n_q; i++) | |
1474 for (m = sbr->f_tablenoise[i]; m < sbr->f_tablenoise[i + 1]; m++) | |
1475 sbr->q_mapped[e][m - sbr->kx[1]] = ch_data->noise_facs[k+1][i]; | |
1476 | |
1477 for (i = 0; i < sbr->n[1]; i++) { | |
1478 if (ch_data->bs_add_harmonic_flag) { | |
1479 const unsigned int m_midpoint = | |
1480 (sbr->f_tablehigh[i] + sbr->f_tablehigh[i + 1]) >> 1; | |
1481 | |
1482 ch_data->s_indexmapped[e + 1][m_midpoint - sbr->kx[1]] = ch_data->bs_add_harmonic[i] * | |
1483 (e >= e_a[1] || (ch_data->s_indexmapped[0][m_midpoint - sbr->kx[1]] == 1)); | |
1484 } | |
1485 } | |
1486 | |
1487 for (i = 0; i < ilim; i++) { | |
1488 int additional_sinusoid_present = 0; | |
1489 for (m = table[i]; m < table[i + 1]; m++) { | |
1490 if (ch_data->s_indexmapped[e + 1][m - sbr->kx[1]]) { | |
1491 additional_sinusoid_present = 1; | |
1492 break; | |
1493 } | |
1494 } | |
1495 memset(&sbr->s_mapped[e][table[i] - sbr->kx[1]], additional_sinusoid_present, | |
1496 (table[i + 1] - table[i]) * sizeof(sbr->s_mapped[e][0])); | |
1497 } | |
1498 } | |
1499 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1500 memcpy(ch_data->s_indexmapped[0], ch_data->s_indexmapped[ch_data->bs_num_env], sizeof(ch_data->s_indexmapped[0])); |
11401 | 1501 } |
1502 | |
1503 /// Estimation of current envelope (14496-3 sp04 p218) | |
1504 static void sbr_env_estimate(float (*e_curr)[48], float X_high[64][40][2], | |
1505 SpectralBandReplication *sbr, SBRData *ch_data) | |
1506 { | |
1507 int e, i, m; | |
1508 | |
1509 if (sbr->bs_interpol_freq) { | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1510 for (e = 0; e < ch_data->bs_num_env; e++) { |
11401 | 1511 const float recip_env_size = 0.5f / (ch_data->t_env[e + 1] - ch_data->t_env[e]); |
1512 int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | |
1513 int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | |
1514 | |
1515 for (m = 0; m < sbr->m[1]; m++) { | |
1516 float sum = 0.0f; | |
1517 | |
1518 for (i = ilb; i < iub; i++) { | |
1519 sum += X_high[m + sbr->kx[1]][i][0] * X_high[m + sbr->kx[1]][i][0] + | |
1520 X_high[m + sbr->kx[1]][i][1] * X_high[m + sbr->kx[1]][i][1]; | |
1521 } | |
1522 e_curr[e][m] = sum * recip_env_size; | |
1523 } | |
1524 } | |
1525 } else { | |
1526 int k, p; | |
1527 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1528 for (e = 0; e < ch_data->bs_num_env; e++) { |
11401 | 1529 const int env_size = 2 * (ch_data->t_env[e + 1] - ch_data->t_env[e]); |
1530 int ilb = ch_data->t_env[e] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | |
1531 int iub = ch_data->t_env[e + 1] * 2 + ENVELOPE_ADJUSTMENT_OFFSET; | |
1532 const uint16_t *table = ch_data->bs_freq_res[e + 1] ? sbr->f_tablehigh : sbr->f_tablelow; | |
1533 | |
1534 for (p = 0; p < sbr->n[ch_data->bs_freq_res[e + 1]]; p++) { | |
1535 float sum = 0.0f; | |
1536 const int den = env_size * (table[p + 1] - table[p]); | |
1537 | |
1538 for (k = table[p]; k < table[p + 1]; k++) { | |
1539 for (i = ilb; i < iub; i++) { | |
1540 sum += X_high[k][i][0] * X_high[k][i][0] + | |
1541 X_high[k][i][1] * X_high[k][i][1]; | |
1542 } | |
1543 } | |
1544 sum /= den; | |
1545 for (k = table[p]; k < table[p + 1]; k++) { | |
1546 e_curr[e][k - sbr->kx[1]] = sum; | |
1547 } | |
1548 } | |
1549 } | |
1550 } | |
1551 } | |
1552 | |
1553 /** | |
1554 * Calculation of levels of additional HF signal components (14496-3 sp04 p219) | |
1555 * and Calculation of gain (14496-3 sp04 p219) | |
1556 */ | |
1557 static void sbr_gain_calc(AACContext *ac, SpectralBandReplication *sbr, | |
1558 SBRData *ch_data, const int e_a[2]) | |
1559 { | |
1560 int e, k, m; | |
1561 // max gain limits : -3dB, 0dB, 3dB, inf dB (limiter off) | |
1562 static const float limgain[4] = { 0.70795, 1.0, 1.41254, 10000000000 }; | |
1563 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1564 for (e = 0; e < ch_data->bs_num_env; e++) { |
11401 | 1565 int delta = !((e == e_a[1]) || (e == e_a[0])); |
1566 for (k = 0; k < sbr->n_lim; k++) { | |
1567 float gain_boost, gain_max; | |
1568 float sum[2] = { 0.0f, 0.0f }; | |
1569 for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { | |
1570 const float temp = sbr->e_origmapped[e][m] / (1.0f + sbr->q_mapped[e][m]); | |
1571 sbr->q_m[e][m] = sqrtf(temp * sbr->q_mapped[e][m]); | |
1572 sbr->s_m[e][m] = sqrtf(temp * ch_data->s_indexmapped[e + 1][m]); | |
1573 if (!sbr->s_mapped[e][m]) { | |
1574 sbr->gain[e][m] = sqrtf(sbr->e_origmapped[e][m] / | |
1575 ((1.0f + sbr->e_curr[e][m]) * | |
1576 (1.0f + sbr->q_mapped[e][m] * delta))); | |
1577 } else { | |
1578 sbr->gain[e][m] = sqrtf(sbr->e_origmapped[e][m] * sbr->q_mapped[e][m] / | |
1579 ((1.0f + sbr->e_curr[e][m]) * | |
1580 (1.0f + sbr->q_mapped[e][m]))); | |
1581 } | |
1582 } | |
1583 for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { | |
1584 sum[0] += sbr->e_origmapped[e][m]; | |
1585 sum[1] += sbr->e_curr[e][m]; | |
1586 } | |
1587 gain_max = limgain[sbr->bs_limiter_gains] * sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1])); | |
1588 gain_max = FFMIN(100000, gain_max); | |
1589 for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { | |
1590 float q_m_max = sbr->q_m[e][m] * gain_max / sbr->gain[e][m]; | |
1591 sbr->q_m[e][m] = FFMIN(sbr->q_m[e][m], q_m_max); | |
1592 sbr->gain[e][m] = FFMIN(sbr->gain[e][m], gain_max); | |
1593 } | |
1594 sum[0] = sum[1] = 0.0f; | |
1595 for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { | |
1596 sum[0] += sbr->e_origmapped[e][m]; | |
1597 sum[1] += sbr->e_curr[e][m] * sbr->gain[e][m] * sbr->gain[e][m] | |
1598 + sbr->s_m[e][m] * sbr->s_m[e][m] | |
1599 + (delta && !sbr->s_m[e][m]) * sbr->q_m[e][m] * sbr->q_m[e][m]; | |
1600 } | |
1601 gain_boost = sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1])); | |
1602 gain_boost = FFMIN(1.584893192, gain_boost); | |
1603 for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { | |
1604 sbr->gain[e][m] *= gain_boost; | |
1605 sbr->q_m[e][m] *= gain_boost; | |
1606 sbr->s_m[e][m] *= gain_boost; | |
1607 } | |
1608 } | |
1609 } | |
1610 } | |
1611 | |
1612 /// Assembling HF Signals (14496-3 sp04 p220) | |
1613 static void sbr_hf_assemble(float Y[2][38][64][2], const float X_high[64][40][2], | |
1614 SpectralBandReplication *sbr, SBRData *ch_data, | |
1615 const int e_a[2]) | |
1616 { | |
1617 int e, i, j, m; | |
1618 const int h_SL = 4 * !sbr->bs_smoothing_mode; | |
1619 const int kx = sbr->kx[1]; | |
1620 const int m_max = sbr->m[1]; | |
1621 static const float h_smooth[5] = { | |
1622 0.33333333333333, | |
1623 0.30150283239582, | |
1624 0.21816949906249, | |
1625 0.11516383427084, | |
1626 0.03183050093751, | |
1627 }; | |
1628 static const int8_t phi[2][4] = { | |
1629 { 1, 0, -1, 0}, // real | |
1630 { 0, 1, 0, -1}, // imaginary | |
1631 }; | |
1632 float (*g_temp)[48] = ch_data->g_temp, (*q_temp)[48] = ch_data->q_temp; | |
1633 int indexnoise = ch_data->f_indexnoise; | |
1634 int indexsine = ch_data->f_indexsine; | |
1635 memcpy(Y[0], Y[1], sizeof(Y[0])); | |
1636 | |
1637 if (sbr->reset) { | |
1638 for (i = 0; i < h_SL; i++) { | |
1639 memcpy(g_temp[i + 2*ch_data->t_env[0]], sbr->gain[0], m_max * sizeof(sbr->gain[0][0])); | |
1640 memcpy(q_temp[i + 2*ch_data->t_env[0]], sbr->q_m[0], m_max * sizeof(sbr->q_m[0][0])); | |
1641 } | |
1642 } else if (h_SL) { | |
1643 memcpy(g_temp[2*ch_data->t_env[0]], g_temp[2*ch_data->t_env_num_env_old], 4*sizeof(g_temp[0])); | |
1644 memcpy(q_temp[2*ch_data->t_env[0]], q_temp[2*ch_data->t_env_num_env_old], 4*sizeof(q_temp[0])); | |
1645 } | |
1646 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1647 for (e = 0; e < ch_data->bs_num_env; e++) { |
11401 | 1648 for (i = 2 * ch_data->t_env[e]; i < 2 * ch_data->t_env[e + 1]; i++) { |
1649 memcpy(g_temp[h_SL + i], sbr->gain[e], m_max * sizeof(sbr->gain[0][0])); | |
1650 memcpy(q_temp[h_SL + i], sbr->q_m[e], m_max * sizeof(sbr->q_m[0][0])); | |
1651 } | |
1652 } | |
1653 | |
11446
806dc446061d
aacsbr: Make the previous value of bs_num_env local to read_sbr_data().
alexc
parents:
11445
diff
changeset
|
1654 for (e = 0; e < ch_data->bs_num_env; e++) { |
11401 | 1655 for (i = 2 * ch_data->t_env[e]; i < 2 * ch_data->t_env[e + 1]; i++) { |
1656 int phi_sign = (1 - 2*(kx & 1)); | |
1657 | |
1658 if (h_SL && e != e_a[0] && e != e_a[1]) { | |
1659 for (m = 0; m < m_max; m++) { | |
1660 const int idx1 = i + h_SL; | |
1661 float g_filt = 0.0f; | |
1662 for (j = 0; j <= h_SL; j++) | |
1663 g_filt += g_temp[idx1 - j][m] * h_smooth[j]; | |
1664 Y[1][i][m + kx][0] = | |
1665 X_high[m + kx][i + ENVELOPE_ADJUSTMENT_OFFSET][0] * g_filt; | |
1666 Y[1][i][m + kx][1] = | |
1667 X_high[m + kx][i + ENVELOPE_ADJUSTMENT_OFFSET][1] * g_filt; | |
1668 } | |
1669 } else { | |
1670 for (m = 0; m < m_max; m++) { | |
1671 const float g_filt = g_temp[i + h_SL][m]; | |
1672 Y[1][i][m + kx][0] = | |
1673 X_high[m + kx][i + ENVELOPE_ADJUSTMENT_OFFSET][0] * g_filt; | |
1674 Y[1][i][m + kx][1] = | |
1675 X_high[m + kx][i + ENVELOPE_ADJUSTMENT_OFFSET][1] * g_filt; | |
1676 } | |
1677 } | |
1678 | |
1679 if (e != e_a[0] && e != e_a[1]) { | |
1680 for (m = 0; m < m_max; m++) { | |
1681 indexnoise = (indexnoise + 1) & 0x1ff; | |
1682 if (sbr->s_m[e][m]) { | |
1683 Y[1][i][m + kx][0] += | |
1684 sbr->s_m[e][m] * phi[0][indexsine]; | |
1685 Y[1][i][m + kx][1] += | |
1686 sbr->s_m[e][m] * (phi[1][indexsine] * phi_sign); | |
1687 } else { | |
1688 float q_filt; | |
1689 if (h_SL) { | |
1690 const int idx1 = i + h_SL; | |
1691 q_filt = 0.0f; | |
1692 for (j = 0; j <= h_SL; j++) | |
1693 q_filt += q_temp[idx1 - j][m] * h_smooth[j]; | |
1694 } else { | |
1695 q_filt = q_temp[i][m]; | |
1696 } | |
1697 Y[1][i][m + kx][0] += | |
1698 q_filt * sbr_noise_table[indexnoise][0]; | |
1699 Y[1][i][m + kx][1] += | |
1700 q_filt * sbr_noise_table[indexnoise][1]; | |
1701 } | |
1702 phi_sign = -phi_sign; | |
1703 } | |
1704 } else { | |
1705 indexnoise = (indexnoise + m_max) & 0x1ff; | |
1706 for (m = 0; m < m_max; m++) { | |
1707 Y[1][i][m + kx][0] += | |
1708 sbr->s_m[e][m] * phi[0][indexsine]; | |
1709 Y[1][i][m + kx][1] += | |
1710 sbr->s_m[e][m] * (phi[1][indexsine] * phi_sign); | |
1711 phi_sign = -phi_sign; | |
1712 } | |
1713 } | |
1714 indexsine = (indexsine + 1) & 3; | |
1715 } | |
1716 } | |
1717 ch_data->f_indexnoise = indexnoise; | |
1718 ch_data->f_indexsine = indexsine; | |
1719 } | |
1720 | |
11667
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1721 void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac, |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1722 float* L, float* R) |
11401 | 1723 { |
11667
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1724 int downsampled = ac->m4ac.ext_sample_rate < sbr->sample_rate; |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1725 int ch; |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1726 int nch = (id_aac == TYPE_CPE) ? 2 : 1; |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1727 |
11401 | 1728 if (sbr->start) { |
1729 sbr_dequant(sbr, id_aac); | |
1730 } | |
11667
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1731 for (ch = 0; ch < nch; ch++) { |
11668 | 1732 /* decode channel */ |
1733 sbr_qmf_analysis(&ac->dsp, &sbr->rdft, ch ? R : L, sbr->data[ch].analysis_filterbank_samples, | |
1734 (float*)sbr->qmf_filter_scratch, | |
1735 sbr->data[ch].W, 1/(-1024 * ac->sf_scale)); | |
1736 sbr_lf_gen(ac, sbr, sbr->X_low, sbr->data[ch].W); | |
1737 if (sbr->start) { | |
1738 sbr_hf_inverse_filter(sbr->alpha0, sbr->alpha1, sbr->X_low, sbr->k[0]); | |
1739 sbr_chirp(sbr, &sbr->data[ch]); | |
1740 sbr_hf_gen(ac, sbr, sbr->X_high, sbr->X_low, sbr->alpha0, sbr->alpha1, | |
1741 sbr->data[ch].bw_array, sbr->data[ch].t_env, | |
1742 sbr->data[ch].bs_num_env); | |
11401 | 1743 |
11668 | 1744 // hf_adj |
1745 sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); | |
1746 sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); | |
1747 sbr_gain_calc(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); | |
1748 sbr_hf_assemble(sbr->data[ch].Y, sbr->X_high, sbr, &sbr->data[ch], | |
1749 sbr->data[ch].e_a); | |
1750 } | |
11401 | 1751 |
11668 | 1752 /* synthesis */ |
11677
ed3d232c9d31
10l: The SBR refactor requires the use of 2 independent output X buffers.
alexc
parents:
11672
diff
changeset
|
1753 sbr_x_gen(sbr, sbr->X[ch], sbr->X_low, sbr->data[ch].Y, ch); |
11667
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1754 } |
11677
ed3d232c9d31
10l: The SBR refactor requires the use of 2 independent output X buffers.
alexc
parents:
11672
diff
changeset
|
1755 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X[0], sbr->qmf_filter_scratch, |
11667
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1756 sbr->data[0].synthesis_filterbank_samples, |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1757 &sbr->data[0].synthesis_filterbank_samples_offset, |
11401 | 1758 downsampled, |
1759 ac->add_bias, -1024 * ac->sf_scale); | |
11667
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1760 if (nch == 2) |
11677
ed3d232c9d31
10l: The SBR refactor requires the use of 2 independent output X buffers.
alexc
parents:
11672
diff
changeset
|
1761 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, R, sbr->X[1], sbr->qmf_filter_scratch, |
11667
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1762 sbr->data[1].synthesis_filterbank_samples, |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1763 &sbr->data[1].synthesis_filterbank_samples_offset, |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1764 downsampled, |
6818ea5a25a2
Rewrite ff_sbr_apply in a manner more friendly to PS.
alexc
parents:
11644
diff
changeset
|
1765 ac->add_bias, -1024 * ac->sf_scale); |
11401 | 1766 } |