3 * MIPS Technologies, Inc., California.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * AAC Spectral Band Replication decoding functions (fixed-point)
30 * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl )
31 * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com>
33 * This file is part of FFmpeg.
35 * FFmpeg is free software; you can redistribute it and/or
36 * modify it under the terms of the GNU Lesser General Public
37 * License as published by the Free Software Foundation; either
38 * version 2.1 of the License, or (at your option) any later version.
40 * FFmpeg is distributed in the hope that it will be useful,
41 * but WITHOUT ANY WARRANTY; without even the implied warranty of
42 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
43 * Lesser General Public License for more details.
45 * You should have received a copy of the GNU Lesser General Public
46 * License along with FFmpeg; if not, write to the Free Software
47 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
52 * AAC Spectral Band Replication decoding functions (fixed-point)
53 * Note: Rounding-to-nearest used unless otherwise stated
54 * @author Robert Swain ( rob opendot cl )
55 * @author Stanislav Ocovaj ( stanislav.ocovaj imgtec com )
62 #include "aacsbrdata.h"
65 #include "libavutil/internal.h"
66 #include "libavutil/libm.h"
67 #include "libavutil/avassert.h"
73 static void aacsbr_func_ptr_init(AACSBRContext
*c
);
74 static const int CONST_LN2
= Q31(0.6931471806/256); // ln(2)/256
75 static const int CONST_RECIP_LN2
= Q31(0.7213475204); // 0.5/ln(2)
76 static const int CONST_076923
= Q31(0.76923076923076923077f
);
78 static const int fixed_log_table
[10] =
80 Q31(1.0/2), Q31(1.0/3), Q31(1.0/4), Q31(1.0/5), Q31(1.0/6),
81 Q31(1.0/7), Q31(1.0/8), Q31(1.0/9), Q31(1.0/10), Q31(1.0/11)
84 static int fixed_log(int x
)
86 int i
, ret
, xpow
, tmp
;
90 for (i
=0; i
<10; i
+=2){
91 xpow
= (int)(((int64_t)xpow
* x
+ 0x40000000) >> 31);
92 tmp
= (int)(((int64_t)xpow
* fixed_log_table
[i
] + 0x40000000) >> 31);
95 xpow
= (int)(((int64_t)xpow
* x
+ 0x40000000) >> 31);
96 tmp
= (int)(((int64_t)xpow
* fixed_log_table
[i
+1] + 0x40000000) >> 31);
103 static const int fixed_exp_table
[7] =
105 Q31(1.0/2), Q31(1.0/6), Q31(1.0/24), Q31(1.0/120),
106 Q31(1.0/720), Q31(1.0/5040), Q31(1.0/40320)
109 static int fixed_exp(int x
)
111 int i
, ret
, xpow
, tmp
;
116 xpow
= (int)(((int64_t)xpow
* x
+ 0x400000) >> 23);
117 tmp
= (int)(((int64_t)xpow
* fixed_exp_table
[i
] + 0x40000000) >> 31);
124 static void make_bands(int16_t* bands
, int start
, int stop
, int num_bands
)
126 int k
, previous
, present
;
127 int base
, prod
, nz
= 0;
129 base
= (stop
<< 23) / start
;
130 while (base
< 0x40000000){
134 base
= fixed_log(base
- 0x80000000);
135 base
= (((base
+ 0x80) >> 8) + (8-nz
)*CONST_LN2
) / num_bands
;
136 base
= fixed_exp(base
);
141 for (k
= 0; k
< num_bands
-1; k
++) {
142 prod
= (int)(((int64_t)prod
* base
+ 0x400000) >> 23);
143 present
= (prod
+ 0x400000) >> 23;
144 bands
[k
] = present
- previous
;
147 bands
[num_bands
-1] = stop
- previous
;
150 /// Dequantization and stereo decoding (14496-3 sp04 p203)
151 static void sbr_dequant(SpectralBandReplication
*sbr
, int id_aac
)
156 if (id_aac
== TYPE_CPE
&& sbr
->bs_coupling
) {
157 int alpha
= sbr
->data
[0].bs_amp_res
? 2 : 1;
158 int pan_offset
= sbr
->data
[0].bs_amp_res
? 12 : 24;
159 for (e
= 1; e
<= sbr
->data
[0].bs_num_env
; e
++) {
160 for (k
= 0; k
< sbr
->n
[sbr
->data
[0].bs_freq_res
[e
]]; k
++) {
161 SoftFloat temp1
, temp2
, fac
;
163 temp1
.exp
= sbr
->data
[0].env_facs_q
[e
][k
] * alpha
+ 14;
165 temp1
.mant
= 759250125;
167 temp1
.mant
= 0x20000000;
168 temp1
.exp
= (temp1
.exp
>> 1) + 1;
169 if (temp1
.exp
> 66) { // temp1 > 1E20
170 av_log(NULL
, AV_LOG_ERROR
, "envelope scalefactor overflow in dequant\n");
174 temp2
.exp
= (pan_offset
- sbr
->data
[1].env_facs_q
[e
][k
]) * alpha
;
176 temp2
.mant
= 759250125;
178 temp2
.mant
= 0x20000000;
179 temp2
.exp
= (temp2
.exp
>> 1) + 1;
180 fac
= av_div_sf(temp1
, av_add_sf(FLOAT_1
, temp2
));
181 sbr
->data
[0].env_facs
[e
][k
] = fac
;
182 sbr
->data
[1].env_facs
[e
][k
] = av_mul_sf(fac
, temp2
);
185 for (e
= 1; e
<= sbr
->data
[0].bs_num_noise
; e
++) {
186 for (k
= 0; k
< sbr
->n_q
; k
++) {
187 SoftFloat temp1
, temp2
, fac
;
189 temp1
.exp
= NOISE_FLOOR_OFFSET
- \
190 sbr
->data
[0].noise_facs_q
[e
][k
] + 2;
191 temp1
.mant
= 0x20000000;
192 av_assert0(temp1
.exp
<= 66);
193 temp2
.exp
= 12 - sbr
->data
[1].noise_facs_q
[e
][k
] + 1;
194 temp2
.mant
= 0x20000000;
195 fac
= av_div_sf(temp1
, av_add_sf(FLOAT_1
, temp2
));
196 sbr
->data
[0].noise_facs
[e
][k
] = fac
;
197 sbr
->data
[1].noise_facs
[e
][k
] = av_mul_sf(fac
, temp2
);
200 } else { // SCE or one non-coupled CPE
201 for (ch
= 0; ch
< (id_aac
== TYPE_CPE
) + 1; ch
++) {
202 int alpha
= sbr
->data
[ch
].bs_amp_res
? 2 : 1;
203 for (e
= 1; e
<= sbr
->data
[ch
].bs_num_env
; e
++)
204 for (k
= 0; k
< sbr
->n
[sbr
->data
[ch
].bs_freq_res
[e
]]; k
++){
207 temp1
.exp
= alpha
* sbr
->data
[ch
].env_facs_q
[e
][k
] + 12;
209 temp1
.mant
= 759250125;
211 temp1
.mant
= 0x20000000;
212 temp1
.exp
= (temp1
.exp
>> 1) + 1;
213 if (temp1
.exp
> 66) { // temp1 > 1E20
214 av_log(NULL
, AV_LOG_ERROR
, "envelope scalefactor overflow in dequant\n");
217 sbr
->data
[ch
].env_facs
[e
][k
] = temp1
;
219 for (e
= 1; e
<= sbr
->data
[ch
].bs_num_noise
; e
++)
220 for (k
= 0; k
< sbr
->n_q
; k
++){
221 sbr
->data
[ch
].noise_facs
[e
][k
].exp
= NOISE_FLOOR_OFFSET
- \
222 sbr
->data
[ch
].noise_facs_q
[e
][k
] + 1;
223 sbr
->data
[ch
].noise_facs
[e
][k
].mant
= 0x20000000;
229 /** High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering
230 * (14496-3 sp04 p214)
231 * Warning: This routine does not seem numerically stable.
233 static void sbr_hf_inverse_filter(SBRDSPContext
*dsp
,
234 int (*alpha0
)[2], int (*alpha1
)[2],
235 const int X_low
[32][40][2], int k0
)
240 for (k
= 0; k
< k0
; k
++) {
241 SoftFloat phi
[3][2][2];
242 SoftFloat a00
, a01
, a10
, a11
;
245 dsp
->autocorrelate(X_low
[k
], phi
);
247 dk
= av_sub_sf(av_mul_sf(phi
[2][1][0], phi
[1][0][0]),
248 av_mul_sf(av_add_sf(av_mul_sf(phi
[1][1][0], phi
[1][1][0]),
249 av_mul_sf(phi
[1][1][1], phi
[1][1][1])), FLOAT_0999999
));
255 SoftFloat temp_real
, temp_im
;
256 temp_real
= av_sub_sf(av_sub_sf(av_mul_sf(phi
[0][0][0], phi
[1][1][0]),
257 av_mul_sf(phi
[0][0][1], phi
[1][1][1])),
258 av_mul_sf(phi
[0][1][0], phi
[1][0][0]));
259 temp_im
= av_sub_sf(av_add_sf(av_mul_sf(phi
[0][0][0], phi
[1][1][1]),
260 av_mul_sf(phi
[0][0][1], phi
[1][1][0])),
261 av_mul_sf(phi
[0][1][1], phi
[1][0][0]));
263 a10
= av_div_sf(temp_real
, dk
);
264 a11
= av_div_sf(temp_im
, dk
);
267 if (!phi
[1][0][0].mant
) {
271 SoftFloat temp_real
, temp_im
;
272 temp_real
= av_add_sf(phi
[0][0][0],
273 av_add_sf(av_mul_sf(a10
, phi
[1][1][0]),
274 av_mul_sf(a11
, phi
[1][1][1])));
275 temp_im
= av_add_sf(phi
[0][0][1],
276 av_sub_sf(av_mul_sf(a11
, phi
[1][1][0]),
277 av_mul_sf(a10
, phi
[1][1][1])));
279 temp_real
.mant
= -temp_real
.mant
;
280 temp_im
.mant
= -temp_im
.mant
;
281 a00
= av_div_sf(temp_real
, phi
[1][0][0]);
282 a01
= av_div_sf(temp_im
, phi
[1][0][0]);
287 alpha0
[k
][0] = 0x7fffffff;
288 else if (shift
<= -30)
293 alpha0
[k
][0] = a00
.mant
* (1<<-shift
);
295 round
= 1 << (shift
-1);
296 alpha0
[k
][0] = (a00
.mant
+ round
) >> shift
;
302 alpha0
[k
][1] = 0x7fffffff;
303 else if (shift
<= -30)
308 alpha0
[k
][1] = a01
.mant
* (1<<-shift
);
310 round
= 1 << (shift
-1);
311 alpha0
[k
][1] = (a01
.mant
+ round
) >> shift
;
316 alpha1
[k
][0] = 0x7fffffff;
317 else if (shift
<= -30)
322 alpha1
[k
][0] = a10
.mant
* (1<<-shift
);
324 round
= 1 << (shift
-1);
325 alpha1
[k
][0] = (a10
.mant
+ round
) >> shift
;
331 alpha1
[k
][1] = 0x7fffffff;
332 else if (shift
<= -30)
337 alpha1
[k
][1] = a11
.mant
* (1<<-shift
);
339 round
= 1 << (shift
-1);
340 alpha1
[k
][1] = (a11
.mant
+ round
) >> shift
;
344 shift
= (int)(((int64_t)(alpha1
[k
][0]>>1) * (alpha1
[k
][0]>>1) + \
345 (int64_t)(alpha1
[k
][1]>>1) * (alpha1
[k
][1]>>1) + \
347 if (shift
>= 0x20000000){
354 shift
= (int)(((int64_t)(alpha0
[k
][0]>>1) * (alpha0
[k
][0]>>1) + \
355 (int64_t)(alpha0
[k
][1]>>1) * (alpha0
[k
][1]>>1) + \
357 if (shift
>= 0x20000000){
366 /// Chirp Factors (14496-3 sp04 p214)
367 static void sbr_chirp(SpectralBandReplication
*sbr
, SBRData
*ch_data
)
371 static const int bw_tab
[] = { 0, 1610612736, 1932735283, 2104533975 };
374 for (i
= 0; i
< sbr
->n_q
; i
++) {
375 if (ch_data
->bs_invf_mode
[0][i
] + ch_data
->bs_invf_mode
[1][i
] == 1)
378 new_bw
= bw_tab
[ch_data
->bs_invf_mode
[0][i
]];
380 if (new_bw
< ch_data
->bw_array
[i
]){
381 accu
= (int64_t)new_bw
* 1610612736;
382 accu
+= (int64_t)ch_data
->bw_array
[i
] * 0x20000000;
383 new_bw
= (int)((accu
+ 0x40000000) >> 31);
385 accu
= (int64_t)new_bw
* 1946157056;
386 accu
+= (int64_t)ch_data
->bw_array
[i
] * 201326592;
387 new_bw
= (int)((accu
+ 0x40000000) >> 31);
389 ch_data
->bw_array
[i
] = new_bw
< 0x2000000 ? 0 : new_bw
;
394 * Calculation of levels of additional HF signal components (14496-3 sp04 p219)
395 * and Calculation of gain (14496-3 sp04 p219)
397 static void sbr_gain_calc(SpectralBandReplication
*sbr
,
398 SBRData
*ch_data
, const int e_a
[2])
401 // max gain limits : -3dB, 0dB, 3dB, inf dB (limiter off)
402 static const SoftFloat limgain
[4] = { { 760155524, 0 }, { 0x20000000, 1 },
403 { 758351638, 1 }, { 625000000, 34 } };
405 for (e
= 0; e
< ch_data
->bs_num_env
; e
++) {
406 int delta
= !((e
== e_a
[1]) || (e
== e_a
[0]));
407 for (k
= 0; k
< sbr
->n_lim
; k
++) {
408 SoftFloat gain_boost
, gain_max
;
410 sum
[0] = sum
[1] = FLOAT_0
;
411 for (m
= sbr
->f_tablelim
[k
] - sbr
->kx
[1]; m
< sbr
->f_tablelim
[k
+ 1] - sbr
->kx
[1]; m
++) {
412 const SoftFloat temp
= av_div_sf(sbr
->e_origmapped
[e
][m
],
413 av_add_sf(FLOAT_1
, sbr
->q_mapped
[e
][m
]));
414 sbr
->q_m
[e
][m
] = av_sqrt_sf(av_mul_sf(temp
, sbr
->q_mapped
[e
][m
]));
415 sbr
->s_m
[e
][m
] = av_sqrt_sf(av_mul_sf(temp
, av_int2sf(ch_data
->s_indexmapped
[e
+ 1][m
], 0)));
416 if (!sbr
->s_mapped
[e
][m
]) {
418 sbr
->gain
[e
][m
] = av_sqrt_sf(av_div_sf(sbr
->e_origmapped
[e
][m
],
419 av_mul_sf(av_add_sf(FLOAT_1
, sbr
->e_curr
[e
][m
]),
420 av_add_sf(FLOAT_1
, sbr
->q_mapped
[e
][m
]))));
422 sbr
->gain
[e
][m
] = av_sqrt_sf(av_div_sf(sbr
->e_origmapped
[e
][m
],
423 av_add_sf(FLOAT_1
, sbr
->e_curr
[e
][m
])));
426 sbr
->gain
[e
][m
] = av_sqrt_sf(
428 av_mul_sf(sbr
->e_origmapped
[e
][m
], sbr
->q_mapped
[e
][m
]),
430 av_add_sf(FLOAT_1
, sbr
->e_curr
[e
][m
]),
431 av_add_sf(FLOAT_1
, sbr
->q_mapped
[e
][m
]))));
433 sbr
->gain
[e
][m
] = av_add_sf(sbr
->gain
[e
][m
], FLOAT_MIN
);
435 for (m
= sbr
->f_tablelim
[k
] - sbr
->kx
[1]; m
< sbr
->f_tablelim
[k
+ 1] - sbr
->kx
[1]; m
++) {
436 sum
[0] = av_add_sf(sum
[0], sbr
->e_origmapped
[e
][m
]);
437 sum
[1] = av_add_sf(sum
[1], sbr
->e_curr
[e
][m
]);
439 gain_max
= av_mul_sf(limgain
[sbr
->bs_limiter_gains
],
442 av_add_sf(FLOAT_EPSILON
, sum
[0]),
443 av_add_sf(FLOAT_EPSILON
, sum
[1]))));
444 if (av_gt_sf(gain_max
, FLOAT_100000
))
445 gain_max
= FLOAT_100000
;
446 for (m
= sbr
->f_tablelim
[k
] - sbr
->kx
[1]; m
< sbr
->f_tablelim
[k
+ 1] - sbr
->kx
[1]; m
++) {
447 SoftFloat q_m_max
= av_div_sf(
448 av_mul_sf(sbr
->q_m
[e
][m
], gain_max
),
450 if (av_gt_sf(sbr
->q_m
[e
][m
], q_m_max
))
451 sbr
->q_m
[e
][m
] = q_m_max
;
452 if (av_gt_sf(sbr
->gain
[e
][m
], gain_max
))
453 sbr
->gain
[e
][m
] = gain_max
;
455 sum
[0] = sum
[1] = FLOAT_0
;
456 for (m
= sbr
->f_tablelim
[k
] - sbr
->kx
[1]; m
< sbr
->f_tablelim
[k
+ 1] - sbr
->kx
[1]; m
++) {
457 sum
[0] = av_add_sf(sum
[0], sbr
->e_origmapped
[e
][m
]);
458 sum
[1] = av_add_sf(sum
[1],
460 av_mul_sf(sbr
->e_curr
[e
][m
],
463 sum
[1] = av_add_sf(sum
[1],
464 av_mul_sf(sbr
->s_m
[e
][m
], sbr
->s_m
[e
][m
]));
465 if (delta
&& !sbr
->s_m
[e
][m
].mant
)
466 sum
[1] = av_add_sf(sum
[1],
467 av_mul_sf(sbr
->q_m
[e
][m
], sbr
->q_m
[e
][m
]));
469 gain_boost
= av_sqrt_sf(
471 av_add_sf(FLOAT_EPSILON
, sum
[0]),
472 av_add_sf(FLOAT_EPSILON
, sum
[1])));
473 if (av_gt_sf(gain_boost
, FLOAT_1584893192
))
474 gain_boost
= FLOAT_1584893192
;
476 for (m
= sbr
->f_tablelim
[k
] - sbr
->kx
[1]; m
< sbr
->f_tablelim
[k
+ 1] - sbr
->kx
[1]; m
++) {
477 sbr
->gain
[e
][m
] = av_mul_sf(sbr
->gain
[e
][m
], gain_boost
);
478 sbr
->q_m
[e
][m
] = av_mul_sf(sbr
->q_m
[e
][m
], gain_boost
);
479 sbr
->s_m
[e
][m
] = av_mul_sf(sbr
->s_m
[e
][m
], gain_boost
);
485 /// Assembling HF Signals (14496-3 sp04 p220)
486 static void sbr_hf_assemble(int Y1
[38][64][2],
487 const int X_high
[64][40][2],
488 SpectralBandReplication
*sbr
, SBRData
*ch_data
,
492 const int h_SL
= 4 * !sbr
->bs_smoothing_mode
;
493 const int kx
= sbr
->kx
[1];
494 const int m_max
= sbr
->m
[1];
495 static const SoftFloat h_smooth
[5] = {
502 SoftFloat (*g_temp
)[48] = ch_data
->g_temp
, (*q_temp
)[48] = ch_data
->q_temp
;
503 int indexnoise
= ch_data
->f_indexnoise
;
504 int indexsine
= ch_data
->f_indexsine
;
507 for (i
= 0; i
< h_SL
; i
++) {
508 memcpy(g_temp
[i
+ 2*ch_data
->t_env
[0]], sbr
->gain
[0], m_max
* sizeof(sbr
->gain
[0][0]));
509 memcpy(q_temp
[i
+ 2*ch_data
->t_env
[0]], sbr
->q_m
[0], m_max
* sizeof(sbr
->q_m
[0][0]));
512 for (i
= 0; i
< 4; i
++) {
513 memcpy(g_temp
[i
+ 2 * ch_data
->t_env
[0]],
514 g_temp
[i
+ 2 * ch_data
->t_env_num_env_old
],
516 memcpy(q_temp
[i
+ 2 * ch_data
->t_env
[0]],
517 q_temp
[i
+ 2 * ch_data
->t_env_num_env_old
],
522 for (e
= 0; e
< ch_data
->bs_num_env
; e
++) {
523 for (i
= 2 * ch_data
->t_env
[e
]; i
< 2 * ch_data
->t_env
[e
+ 1]; i
++) {
524 memcpy(g_temp
[h_SL
+ i
], sbr
->gain
[e
], m_max
* sizeof(sbr
->gain
[0][0]));
525 memcpy(q_temp
[h_SL
+ i
], sbr
->q_m
[e
], m_max
* sizeof(sbr
->q_m
[0][0]));
529 for (e
= 0; e
< ch_data
->bs_num_env
; e
++) {
530 for (i
= 2 * ch_data
->t_env
[e
]; i
< 2 * ch_data
->t_env
[e
+ 1]; i
++) {
531 SoftFloat g_filt_tab
[48];
532 SoftFloat q_filt_tab
[48];
533 SoftFloat
*g_filt
, *q_filt
;
535 if (h_SL
&& e
!= e_a
[0] && e
!= e_a
[1]) {
538 for (m
= 0; m
< m_max
; m
++) {
539 const int idx1
= i
+ h_SL
;
540 g_filt
[m
].mant
= g_filt
[m
].exp
= 0;
541 q_filt
[m
].mant
= q_filt
[m
].exp
= 0;
542 for (j
= 0; j
<= h_SL
; j
++) {
543 g_filt
[m
] = av_add_sf(g_filt
[m
],
544 av_mul_sf(g_temp
[idx1
- j
][m
],
546 q_filt
[m
] = av_add_sf(q_filt
[m
],
547 av_mul_sf(q_temp
[idx1
- j
][m
],
552 g_filt
= g_temp
[i
+ h_SL
];
556 sbr
->dsp
.hf_g_filt(Y1
[i
] + kx
, X_high
+ kx
, g_filt
, m_max
,
557 i
+ ENVELOPE_ADJUSTMENT_OFFSET
);
559 if (e
!= e_a
[0] && e
!= e_a
[1]) {
560 sbr
->dsp
.hf_apply_noise
[indexsine
](Y1
[i
] + kx
, sbr
->s_m
[e
],
564 int idx
= indexsine
&1;
565 int A
= (1-((indexsine
+(kx
& 1))&2));
566 int B
= (A
^(-idx
)) + idx
;
567 unsigned *out
= &Y1
[i
][kx
][idx
];
571 SoftFloat
*in
= sbr
->s_m
[e
];
572 for (m
= 0; m
+1 < m_max
; m
+=2) {
574 shift
= 22 - in
[m
].exp
;
575 shift2
= 22 - in
[m
+1].exp
;
576 if (shift
< 1 || shift2
< 1) {
577 av_log(NULL
, AV_LOG_ERROR
, "Overflow in sbr_hf_assemble, shift=%d,%d\n", shift
, shift2
);
581 round
= 1 << (shift
-1);
582 out
[2*m
] += (int)(in
[m
].mant
* A
+ round
) >> shift
;
586 round
= 1 << (shift2
-1);
587 out
[2*m
+2] += (int)(in
[m
+1].mant
* B
+ round
) >> shift2
;
592 shift
= 22 - in
[m
].exp
;
594 av_log(NULL
, AV_LOG_ERROR
, "Overflow in sbr_hf_assemble, shift=%d\n", shift
);
596 } else if (shift
< 32) {
597 round
= 1 << (shift
-1);
598 out
[2*m
] += (int)(in
[m
].mant
* A
+ round
) >> shift
;
602 indexnoise
= (indexnoise
+ m_max
) & 0x1ff;
603 indexsine
= (indexsine
+ 1) & 3;
606 ch_data
->f_indexnoise
= indexnoise
;
607 ch_data
->f_indexsine
= indexsine
;
610 #include "aacsbr_template.c"