summaryrefslogtreecommitdiff
path: root/audio_codec/libfaad/sbr_dec.h (plain)
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
35extern "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