blob: ec6dd2b38af869d9a57753ccc7e0458da5078911
1 | /* |
2 | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | ** |
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. |
9 | ** |
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. |
14 | ** |
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. |
18 | ** |
19 | ** Any non-GPL usage of this software or parts of this software is strictly |
20 | ** forbidden. |
21 | ** |
22 | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | ** |
25 | ** Commercial non-GPL licensing of this software is possible. |
26 | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | ** |
28 | ** $Id: sbr_dec.h,v 1.39 2007/11/01 12:33:34 menno Exp $ |
29 | **/ |
30 | |
31 | #ifndef __SBR_DEC_H__ |
32 | #define __SBR_DEC_H__ |
33 | |
34 | #ifdef __cplusplus |
35 | extern "C" { |
36 | #endif |
37 | |
38 | #ifdef PS_DEC |
39 | #include "ps_dec.h" |
40 | #endif |
41 | #ifdef DRM_PS |
42 | #include "drm_dec.h" |
43 | #endif |
44 | |
45 | /* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. 16*2+8 */ |
46 | #define MAX_NTSRHFG 40 |
47 | #define MAX_NTSR 32 /* max number_time_slots * rate, ok for DRM and not DRM mode */ |
48 | |
49 | /* MAX_M: maximum value for M */ |
50 | #define MAX_M 49 |
51 | /* MAX_L_E: maximum value for L_E */ |
52 | #define MAX_L_E 5 |
53 | |
54 | typedef struct { |
55 | real_t *x; |
56 | int16_t x_index; |
57 | uint8_t channels; |
58 | } qmfa_info; |
59 | |
60 | typedef struct { |
61 | real_t *v; |
62 | int16_t v_index; |
63 | uint8_t channels; |
64 | } qmfs_info; |
65 | |
66 | typedef struct { |
67 | uint32_t sample_rate; |
68 | uint32_t maxAACLine; |
69 | |
70 | uint8_t rate; |
71 | uint8_t just_seeked; |
72 | uint8_t ret; |
73 | |
74 | uint8_t amp_res[2]; |
75 | |
76 | uint8_t k0; |
77 | uint8_t kx; |
78 | uint8_t M; |
79 | uint8_t N_master; |
80 | uint8_t N_high; |
81 | uint8_t N_low; |
82 | uint8_t N_Q; |
83 | uint8_t N_L[4]; |
84 | uint8_t n[2]; |
85 | |
86 | uint8_t f_master[64]; |
87 | uint8_t f_table_res[2][64]; |
88 | uint8_t f_table_noise[64]; |
89 | uint8_t f_table_lim[4][64]; |
90 | #ifdef SBR_LOW_POWER |
91 | uint8_t f_group[5][64]; |
92 | uint8_t N_G[5]; |
93 | #endif |
94 | |
95 | uint8_t table_map_k_to_g[64]; |
96 | |
97 | uint8_t abs_bord_lead[2]; |
98 | uint8_t abs_bord_trail[2]; |
99 | uint8_t n_rel_lead[2]; |
100 | uint8_t n_rel_trail[2]; |
101 | |
102 | uint8_t L_E[2]; |
103 | uint8_t L_E_prev[2]; |
104 | uint8_t L_Q[2]; |
105 | |
106 | uint8_t t_E[2][MAX_L_E + 1]; |
107 | uint8_t t_Q[2][3]; |
108 | uint8_t f[2][MAX_L_E + 1]; |
109 | uint8_t f_prev[2]; |
110 | |
111 | real_t *G_temp_prev[2][5]; |
112 | real_t *Q_temp_prev[2][5]; |
113 | int8_t GQ_ringbuf_index[2]; |
114 | |
115 | int16_t E[2][64][MAX_L_E]; |
116 | int16_t E_prev[2][64]; |
117 | #ifndef FIXED_POINT |
118 | real_t E_orig[2][64][MAX_L_E]; |
119 | #endif |
120 | real_t E_curr[2][64][MAX_L_E]; |
121 | int32_t Q[2][64][2]; |
122 | #ifndef FIXED_POINT |
123 | real_t Q_div[2][64][2]; |
124 | real_t Q_div2[2][64][2]; |
125 | #endif |
126 | int32_t Q_prev[2][64]; |
127 | |
128 | int8_t l_A[2]; |
129 | int8_t l_A_prev[2]; |
130 | |
131 | uint8_t bs_invf_mode[2][MAX_L_E]; |
132 | uint8_t bs_invf_mode_prev[2][MAX_L_E]; |
133 | real_t bwArray[2][64]; |
134 | real_t bwArray_prev[2][64]; |
135 | |
136 | uint8_t noPatches; |
137 | uint8_t patchNoSubbands[64]; |
138 | uint8_t patchStartSubband[64]; |
139 | |
140 | uint8_t bs_add_harmonic[2][64]; |
141 | uint8_t bs_add_harmonic_prev[2][64]; |
142 | |
143 | uint16_t index_noise_prev[2]; |
144 | uint8_t psi_is_prev[2]; |
145 | |
146 | uint8_t bs_start_freq_prev; |
147 | uint8_t bs_stop_freq_prev; |
148 | uint8_t bs_xover_band_prev; |
149 | uint8_t bs_freq_scale_prev; |
150 | uint8_t bs_alter_scale_prev; |
151 | uint8_t bs_noise_bands_prev; |
152 | |
153 | int8_t prevEnvIsShort[2]; |
154 | |
155 | int8_t kx_prev; |
156 | uint8_t bsco; |
157 | uint8_t bsco_prev; |
158 | uint8_t M_prev; |
159 | uint16_t frame_len; |
160 | |
161 | uint8_t Reset; |
162 | uint32_t frame; |
163 | uint32_t header_count; |
164 | |
165 | uint8_t id_aac; |
166 | qmfa_info *qmfa[2]; |
167 | qmfs_info *qmfs[2]; |
168 | |
169 | qmf_t Xsbr[2][MAX_NTSRHFG][64]; |
170 | |
171 | #ifdef DRM |
172 | uint8_t Is_DRM_SBR; |
173 | #ifdef DRM_PS |
174 | drm_ps_info *drm_ps; |
175 | #endif |
176 | #endif |
177 | |
178 | uint8_t numTimeSlotsRate; |
179 | uint8_t numTimeSlots; |
180 | uint8_t tHFGen; |
181 | uint8_t tHFAdj; |
182 | |
183 | #ifdef PS_DEC |
184 | ps_info *ps; |
185 | #endif |
186 | #if (defined(PS_DEC) || defined(DRM_PS)) |
187 | uint8_t ps_used; |
188 | uint8_t psResetFlag; |
189 | #endif |
190 | |
191 | /* to get it compiling */ |
192 | /* we'll see during the coding of all the tools, whether |
193 | these are all used or not. |
194 | */ |
195 | uint8_t bs_header_flag; |
196 | uint8_t bs_crc_flag; |
197 | uint16_t bs_sbr_crc_bits; |
198 | uint8_t bs_protocol_version; |
199 | uint8_t bs_amp_res; |
200 | uint8_t bs_start_freq; |
201 | uint8_t bs_stop_freq; |
202 | uint8_t bs_xover_band; |
203 | uint8_t bs_freq_scale; |
204 | uint8_t bs_alter_scale; |
205 | uint8_t bs_noise_bands; |
206 | uint8_t bs_limiter_bands; |
207 | uint8_t bs_limiter_gains; |
208 | uint8_t bs_interpol_freq; |
209 | uint8_t bs_smoothing_mode; |
210 | uint8_t bs_samplerate_mode; |
211 | uint8_t bs_add_harmonic_flag[2]; |
212 | uint8_t bs_add_harmonic_flag_prev[2]; |
213 | uint8_t bs_extended_data; |
214 | uint8_t bs_extension_id; |
215 | uint8_t bs_extension_data; |
216 | uint8_t bs_coupling; |
217 | uint8_t bs_frame_class[2]; |
218 | uint8_t bs_rel_bord[2][9]; |
219 | uint8_t bs_rel_bord_0[2][9]; |
220 | uint8_t bs_rel_bord_1[2][9]; |
221 | uint8_t bs_pointer[2]; |
222 | uint8_t bs_abs_bord_0[2]; |
223 | uint8_t bs_abs_bord_1[2]; |
224 | uint8_t bs_num_rel_0[2]; |
225 | uint8_t bs_num_rel_1[2]; |
226 | uint8_t bs_df_env[2][9]; |
227 | uint8_t bs_df_noise[2][3]; |
228 | } sbr_info; |
229 | |
230 | sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, |
231 | uint32_t sample_rate, uint8_t downSampledSBR |
232 | #ifdef DRM |
233 | , uint8_t IsDRM |
234 | #endif |
235 | ); |
236 | void sbrDecodeEnd(sbr_info *sbr); |
237 | void sbrReset(sbr_info *sbr); |
238 | |
239 | uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, |
240 | const uint8_t just_seeked, const uint8_t downSampledSBR); |
241 | uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, |
242 | const uint8_t just_seeked, const uint8_t downSampledSBR); |
243 | #if (defined(PS_DEC) || defined(DRM_PS)) |
244 | uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, |
245 | const uint8_t just_seeked, const uint8_t downSampledSBR); |
246 | #endif |
247 | |
248 | |
249 | #ifdef __cplusplus |
250 | } |
251 | #endif |
252 | #endif |
253 | |
254 |