annotate libfaad2/sbr_dec.c @ 10730:67449e5936f3

fix 10l (computation based on uninitialized data which led to incorrect field matching) and greatly improve selection logic. the pullup core should be very accurate now, so try throwing tough samples at it and report any failures! :)
author rfelker
date Sun, 31 Aug 2003 17:46:32 +0000
parents e989150f8216
children 3185f64f6350
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
1 /*
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
3 ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
4 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
5 ** This program is free software; you can redistribute it and/or modify
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
6 ** it under the terms of the GNU General Public License as published by
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
7 ** the Free Software Foundation; either version 2 of the License, or
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
8 ** (at your option) any later version.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
9 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
10 ** This program is distributed in the hope that it will be useful,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
13 ** GNU General Public License for more details.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
14 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
15 ** You should have received a copy of the GNU General Public License
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
16 ** along with this program; if not, write to the Free Software
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
18 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
19 ** Any non-GPL usage of this software or parts of this software is strictly
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
20 ** forbidden.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
21 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
22 ** Commercial non-GPL licensing of this software is possible.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
24 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
25 ** $Id: sbr_dec.c,v 1.5 2003/07/29 08:20:13 menno Exp $
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
26 **/
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
27
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
28 /*
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
29 SBR Decoder overview:
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
30
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
31 To achieve a synchronized output signal, the following steps have to be
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
32 acknowledged in the decoder:
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
33 - The bitstream parser divides the bitstream into two parts; the AAC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
34 core coder part and the SBR part.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
35 - The SBR bitstream part is fed to the bitstream de-multiplexer followed
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
36 by de-quantization The raw data is Huffman decoded.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
37 - The AAC bitstream part is fed to the AAC core decoder, where the
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
38 bitstream data of the current frame is decoded, yielding a time domain
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
39 audio signal block of 1024 samples. The block length could easily be
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
40 adapted to other sizes e.g. 960.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
41 - The core coder audio block is fed to the analysis QMF bank using a
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
42 delay of 1312 samples.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
43 - The analysis QMF bank performs the filtering of the delayed core coder
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
44 audio signal. The output from the filtering is stored in the matrix
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
45 Xlow. The output from the analysis QMF bank is delayed tHFGen subband
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
46 samples, before being fed to the synthesis QMF bank. To achieve
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
47 synchronization tHFGen = 32, i.e. the value must equal the number of
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
48 subband samples corresponding to one frame.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
49 - The HF generator calculates XHigh given the matrix XLow. The process
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
50 is guided by the SBR data contained in the current frame.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
51 - The envelope adjuster calculates the matrix Y given the matrix XHigh
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
52 and the SBR envelope data, extracted from the SBR bitstream. To
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
53 achieve synchronization, tHFAdj has to be set to tHFAdj = 0, i.e. the
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
54 envelope adjuster operates on data delayed tHFGen subband samples.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
55 - The synthesis QMF bank operates on the delayed output from the analysis
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
56 QMF bank and the output from the envelope adjuster.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
57 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
58
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
59 #include "common.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
60 #include "structs.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
61
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
62 #ifdef SBR_DEC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
63
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
64 #include <stdlib.h>
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
65
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
66 #include "syntax.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
67 #include "bits.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
68 #include "sbr_syntax.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
69 #include "sbr_qmf.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
70 #include "sbr_hfgen.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
71 #include "sbr_hfadj.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
72
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
73
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
74 sbr_info *sbrDecodeInit()
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
75 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
76 sbr_info *sbr = malloc(sizeof(sbr_info));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
77 memset(sbr, 0, sizeof(sbr_info));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
78
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
79 sbr->bs_freq_scale = 2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
80 sbr->bs_alter_scale = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
81 sbr->bs_noise_bands = 2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
82 sbr->bs_limiter_bands = 2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
83 sbr->bs_limiter_gains = 2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
84 sbr->bs_interpol_freq = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
85 sbr->bs_smoothing_mode = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
86 sbr->bs_start_freq = 5;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
87 sbr->bs_amp_res = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
88 sbr->bs_samplerate_mode = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
89 sbr->prevEnvIsShort[0] = -1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
90 sbr->prevEnvIsShort[1] = -1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
91 sbr->header_count = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
92
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
93 return sbr;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
94 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
95
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
96 void sbrDecodeEnd(sbr_info *sbr)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
97 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
98 uint8_t j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
99
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
100 if (sbr)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
101 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
102 qmfa_end(sbr->qmfa[0]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
103 qmfs_end(sbr->qmfs[0]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
104 if (sbr->id_aac == ID_CPE)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
105 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
106 qmfa_end(sbr->qmfa[1]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
107 qmfs_end(sbr->qmfs[1]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
108 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
109
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
110 if (sbr->Xcodec[0]) free(sbr->Xcodec[0]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
111 if (sbr->Xsbr[0]) free(sbr->Xsbr[0]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
112 if (sbr->Xcodec[1]) free(sbr->Xcodec[1]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
113 if (sbr->Xsbr[1]) free(sbr->Xsbr[1]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
114
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
115 for (j = 0; j < 5; j++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
116 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
117 if (sbr->G_temp_prev[0][j]) free(sbr->G_temp_prev[0][j]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
118 if (sbr->Q_temp_prev[0][j]) free(sbr->Q_temp_prev[0][j]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
119 if (sbr->G_temp_prev[1][j]) free(sbr->G_temp_prev[1][j]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
120 if (sbr->Q_temp_prev[1][j]) free(sbr->Q_temp_prev[1][j]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
121 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
122
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
123 free(sbr);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
124 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
125 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
126
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
127 void sbr_save_prev_data(sbr_info *sbr, uint8_t ch)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
128 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
129 uint8_t i;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
130
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
131 /* save data for next frame */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
132 sbr->kx_prev = sbr->kx;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
133
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
134 sbr->L_E_prev[ch] = sbr->L_E[ch];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
135
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
136 sbr->f_prev[ch] = sbr->f[ch][sbr->L_E[ch] - 1];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
137 for (i = 0; i < 64; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
138 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
139 sbr->E_prev[ch][i] = sbr->E[ch][i][sbr->L_E[ch] - 1];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
140 sbr->Q_prev[ch][i] = sbr->Q[ch][i][sbr->L_Q[ch] - 1];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
141 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
142
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
143 for (i = 0; i < 64; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
144 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
145 sbr->bs_add_harmonic_prev[ch][i] = sbr->bs_add_harmonic[ch][i];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
146 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
147 sbr->bs_add_harmonic_flag_prev[ch] = sbr->bs_add_harmonic_flag[ch];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
148
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
149 if (sbr->l_A[ch] == sbr->L_E[ch])
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
150 sbr->prevEnvIsShort[ch] = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
151 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
152 sbr->prevEnvIsShort[ch] = -1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
153 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
154
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
155
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
156 void sbrDecodeFrame(sbr_info *sbr, real_t *left_channel,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
157 real_t *right_channel, uint8_t id_aac,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
158 uint8_t just_seeked)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
159 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
160 int16_t i, k, l;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
161
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
162 uint8_t dont_process = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
163 uint8_t ch, channels, ret;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
164 real_t *ch_buf;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
165
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
166 qmf_t X[32*64];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
167 #ifdef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
168 real_t deg[64];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
169 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
170
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
171 bitfile *ld = (bitfile*)malloc(sizeof(bitfile));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
172
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
173
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
174 sbr->id_aac = id_aac;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
175 channels = (id_aac == ID_SCE) ? 1 : 2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
176
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
177 /* initialise and read the bitstream */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
178 faad_initbits(ld, sbr->data, sbr->data_size);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
179
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
180 ret = sbr_extension_data(ld, sbr, id_aac);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
181
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
182 if (sbr->data) free(sbr->data);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
183 sbr->data = NULL;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
184
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
185 ret = ld->error ? ld->error : ret;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
186 faad_endbits(ld);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
187 if (ld) free(ld);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
188 ld = NULL;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
189 if (ret || (sbr->header_count == 0))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
190 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
191 /* don't process just upsample */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
192 dont_process = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
193 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
194
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
195 if (just_seeked)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
196 sbr->just_seeked = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
197 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
198 sbr->just_seeked = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
199
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
200 for (ch = 0; ch < channels; ch++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
201 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
202 if (sbr->frame == 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
203 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
204 uint8_t j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
205 sbr->qmfa[ch] = qmfa_init(32);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
206 sbr->qmfs[ch] = qmfs_init(64);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
207
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
208 for (j = 0; j < 5; j++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
209 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
210 sbr->G_temp_prev[ch][j] = malloc(64*sizeof(real_t));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
211 sbr->Q_temp_prev[ch][j] = malloc(64*sizeof(real_t));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
212 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
213
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
214 sbr->Xsbr[ch] = malloc((32+tHFGen)*64 * sizeof(qmf_t));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
215 sbr->Xcodec[ch] = malloc((32+tHFGen)*32 * sizeof(qmf_t));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
216
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
217 memset(sbr->Xsbr[ch], 0, (32+tHFGen)*64 * sizeof(qmf_t));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
218 memset(sbr->Xcodec[ch], 0, (32+tHFGen)*32 * sizeof(qmf_t));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
219 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
220
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
221 if (ch == 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
222 ch_buf = left_channel;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
223 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
224 ch_buf = right_channel;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
225
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
226 for (i = 0; i < tHFAdj; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
227 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
228 int8_t j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
229 for (j = sbr->kx_prev; j < sbr->kx; j++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
230 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
231 QMF_RE(sbr->Xcodec[ch][i*32 + j]) = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
232 #ifndef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
233 QMF_IM(sbr->Xcodec[ch][i*32 + j]) = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
234 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
235 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
236 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
237
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
238 /* subband analysis */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
239 sbr_qmf_analysis_32(sbr->qmfa[ch], ch_buf, sbr->Xcodec[ch], tHFGen);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
240
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
241 if (!dont_process)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
242 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
243 /* insert high frequencies here */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
244 /* hf generation using patching */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
245 hf_generation(sbr, sbr->Xcodec[ch], sbr->Xsbr[ch]
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
246 #ifdef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
247 ,deg
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
248 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
249 ,ch);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
250
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
251 #ifdef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
252 for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
253 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
254 for (k = 0; k < sbr->kx; k++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
255 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
256 QMF_RE(sbr->Xsbr[ch][(tHFAdj + l)*64 + k]) = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
257 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
258 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
259 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
260
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
261 /* hf adjustment */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
262 hf_adjustment(sbr, sbr->Xsbr[ch]
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
263 #ifdef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
264 ,deg
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
265 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
266 ,ch);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
267 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
268
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
269 if ((sbr->just_seeked != 0) || dont_process)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
270 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
271 for (l = 0; l < 32; l++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
272 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
273 for (k = 0; k < 32; k++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
274 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
275 QMF_RE(X[l * 64 + k]) = QMF_RE(sbr->Xcodec[ch][(l + tHFAdj)*32 + k]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
276 #ifndef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
277 QMF_IM(X[l * 64 + k]) = QMF_IM(sbr->Xcodec[ch][(l + tHFAdj)*32 + k]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
278 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
279 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
280 for (k = 32; k < 64; k++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
281 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
282 QMF_RE(X[l * 64 + k]) = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
283 #ifndef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
284 QMF_IM(X[l * 64 + k]) = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
285 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
286 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
287 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
288 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
289 for (l = 0; l < 32; l++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
290 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
291 uint8_t xover_band;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
292
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
293 if (l < sbr->t_E[ch][0])
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
294 xover_band = sbr->kx_prev;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
295 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
296 xover_band = sbr->kx;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
297
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
298 for (k = 0; k < xover_band; k++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
299 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
300 QMF_RE(X[l * 64 + k]) = QMF_RE(sbr->Xcodec[ch][(l + tHFAdj)*32 + k]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
301 #ifndef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
302 QMF_IM(X[l * 64 + k]) = QMF_IM(sbr->Xcodec[ch][(l + tHFAdj)*32 + k]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
303 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
304 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
305 for (k = xover_band; k < 64; k++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
306 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
307 QMF_RE(X[l * 64 + k]) = QMF_RE(sbr->Xsbr[ch][(l + tHFAdj)*64 + k]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
308 #ifndef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
309 QMF_IM(X[l * 64 + k]) = QMF_IM(sbr->Xsbr[ch][(l + tHFAdj)*64 + k]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
310 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
311 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
312 #ifdef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
313 QMF_RE(X[l * 64 + xover_band - 1]) += QMF_RE(sbr->Xsbr[ch][(l + tHFAdj)*64 + xover_band - 1]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
314 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
315 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
316 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
317
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
318 /* subband synthesis */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
319 sbr_qmf_synthesis_64(sbr->qmfs[ch], (const complex_t*)X, ch_buf);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
320
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
321 for (i = 0; i < 32; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
322 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
323 int8_t j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
324 for (j = 0; j < tHFGen; j++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
325 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
326 QMF_RE(sbr->Xcodec[ch][j*32 + i]) = QMF_RE(sbr->Xcodec[ch][(j+32)*32 + i]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
327 #ifndef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
328 QMF_IM(sbr->Xcodec[ch][j*32 + i]) = QMF_IM(sbr->Xcodec[ch][(j+32)*32 + i]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
329 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
330 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
331 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
332 for (i = 0; i < 64; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
333 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
334 int8_t j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
335 for (j = 0; j < tHFGen; j++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
336 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
337 QMF_RE(sbr->Xsbr[ch][j*64 + i]) = QMF_RE(sbr->Xsbr[ch][(j+32)*64 + i]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
338 #ifndef SBR_LOW_POWER
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
339 QMF_IM(sbr->Xsbr[ch][j*64 + i]) = QMF_IM(sbr->Xsbr[ch][(j+32)*64 + i]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
340 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
341 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
342 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
343 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
344
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
345 if (sbr->bs_header_flag)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
346 sbr->just_seeked = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
347
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
348 if (sbr->header_count != 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
349 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
350 for (ch = 0; ch < channels; ch++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
351 sbr_save_prev_data(sbr, ch);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
352 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
353
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
354 sbr->frame++;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
355 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
356
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
357 #endif