2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
35 static real_t pow05_table
[] = {
36 COEF_CONST(1.68179283050743), /* 0.5^(-3/4) */
37 COEF_CONST(1.41421356237310), /* 0.5^(-2/4) */
38 COEF_CONST(1.18920711500272), /* 0.5^(-1/4) */
39 COEF_CONST(1.0), /* 0.5^( 0/4) */
40 COEF_CONST(0.84089641525371), /* 0.5^(+1/4) */
41 COEF_CONST(0.70710678118655), /* 0.5^(+2/4) */
42 COEF_CONST(0.59460355750136) /* 0.5^(+3/4) */
46 void is_decode(ic_stream
*ics
, ic_stream
*icsr
, real_t
*l_spec
, real_t
*r_spec
,
57 uint16_t nshort
= frame_len
/8;
60 for (g
= 0; g
< icsr
->num_window_groups
; g
++)
62 /* Do intensity stereo decoding */
63 for (b
= 0; b
< icsr
->window_group_length
[g
]; b
++)
65 for (sfb
= 0; sfb
< icsr
->max_sfb
; sfb
++)
67 if (is_intensity(icsr
, g
, sfb
))
70 /* For scalefactor bands coded in intensity stereo the
71 corresponding predictors in the right channel are
74 ics
->pred
.prediction_used
[sfb
] = 0;
75 icsr
->pred
.prediction_used
[sfb
] = 0;
79 scale
= (real_t
)pow(0.5, (0.25*icsr
->scale_factors
[g
][sfb
]));
81 exp
= icsr
->scale_factors
[g
][sfb
] >> 2;
82 frac
= icsr
->scale_factors
[g
][sfb
] & 3;
85 /* Scale from left to right channel,
86 do not touch left channel */
87 for (i
= icsr
->swb_offset
[sfb
]; i
< icsr
->swb_offset
[sfb
+1]; i
++)
90 r_spec
[(group
*nshort
)+i
] = MUL_R(l_spec
[(group
*nshort
)+i
], scale
);
93 r_spec
[(group
*nshort
)+i
] = l_spec
[(group
*nshort
)+i
] << -exp
;
95 r_spec
[(group
*nshort
)+i
] = l_spec
[(group
*nshort
)+i
] >> exp
;
96 r_spec
[(group
*nshort
)+i
] = MUL_C(r_spec
[(group
*nshort
)+i
], pow05_table
[frac
+ 3]);
98 if (is_intensity(icsr
, g
, sfb
) != invert_intensity(ics
, g
, sfb
))
99 r_spec
[(group
*nshort
)+i
] = -r_spec
[(group
*nshort
)+i
];