Mercurial > mplayer.hg
annotate libfaad2/pns.c @ 14256:27002dcf0a70
ensure af_fmt2str always return a 0 terminated string
author | reimar |
---|---|
date | Mon, 27 Dec 2004 19:47:33 +0000 |
parents | 6d50ef45a058 |
children | 2ae5ab4331ca |
rev | line source |
---|---|
10725 | 1 /* |
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding | |
12527 | 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com |
10725 | 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 ** Commercial non-GPL licensing of this software is possible. | |
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. | |
24 ** | |
12625
d81145997036
More information about modifications to comply more closely with GPL 2a.
diego
parents:
12527
diff
changeset
|
25 ** Initially modified for use with MPlayer by Arpad Gereöffy on 2003/08/30 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
26 ** $Id: pns.c,v 1.4 2004/06/23 13:50:51 diego Exp $ |
12625
d81145997036
More information about modifications to comply more closely with GPL 2a.
diego
parents:
12527
diff
changeset
|
27 ** detailed CVS changelog at http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ |
10725 | 28 **/ |
29 | |
30 #include "common.h" | |
31 #include "structs.h" | |
32 | |
33 #include "pns.h" | |
34 | |
35 | |
12527 | 36 /* static function declarations */ |
37 static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, | |
38 uint8_t sub); | |
39 | |
40 | |
10725 | 41 #ifdef FIXED_POINT |
42 | |
10989 | 43 #define DIV(A, B) (((int64_t)A << REAL_BITS)/B) |
10725 | 44 |
45 #define step(shift) \ | |
46 if ((0x40000000l >> shift) + root <= value) \ | |
47 { \ | |
48 value -= (0x40000000l >> shift) + root; \ | |
49 root = (root >> 1) | (0x40000000l >> shift); \ | |
50 } else { \ | |
51 root = root >> 1; \ | |
52 } | |
53 | |
54 /* fixed point square root approximation */ | |
10989 | 55 /* !!!! ONLY WORKS FOR EVEN %REAL_BITS% !!!! */ |
10725 | 56 real_t fp_sqrt(real_t value) |
57 { | |
58 real_t root = 0; | |
59 | |
60 step( 0); step( 2); step( 4); step( 6); | |
61 step( 8); step(10); step(12); step(14); | |
62 step(16); step(18); step(20); step(22); | |
63 step(24); step(26); step(28); step(30); | |
64 | |
65 if (root < value) | |
66 ++root; | |
67 | |
10989 | 68 root <<= (REAL_BITS/2); |
10725 | 69 |
70 return root; | |
71 } | |
72 | |
73 static real_t pow2_table[] = | |
74 { | |
75 COEF_CONST(1.0), | |
76 COEF_CONST(1.18920711500272), | |
77 COEF_CONST(1.41421356237310), | |
78 COEF_CONST(1.68179283050743) | |
79 }; | |
80 #endif | |
81 | |
82 /* The function gen_rand_vector(addr, size) generates a vector of length | |
83 <size> with signed random values of average energy MEAN_NRG per random | |
84 value. A suitable random number generator can be realized using one | |
85 multiplication/accumulation per random value. | |
86 */ | |
10989 | 87 static INLINE void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, |
88 uint8_t sub) | |
10725 | 89 { |
90 #ifndef FIXED_POINT | |
91 uint16_t i; | |
92 real_t energy = 0.0; | |
93 | |
10989 | 94 real_t scale = (real_t)1.0/(real_t)size; |
10725 | 95 |
96 for (i = 0; i < size; i++) | |
97 { | |
98 real_t tmp = scale*(real_t)(int32_t)random_int(); | |
99 spec[i] = tmp; | |
100 energy += tmp*tmp; | |
101 } | |
102 | |
10989 | 103 scale = (real_t)1.0/(real_t)sqrt(energy); |
10725 | 104 scale *= (real_t)pow(2.0, 0.25 * scale_factor); |
105 for (i = 0; i < size; i++) | |
106 { | |
107 spec[i] *= scale; | |
108 } | |
109 #else | |
110 uint16_t i; | |
111 real_t energy = 0, scale; | |
112 int32_t exp, frac; | |
113 | |
114 for (i = 0; i < size; i++) | |
115 { | |
10989 | 116 /* this can be replaced by a 16 bit random generator!!!! */ |
117 real_t tmp = (int32_t)random_int(); | |
118 if (tmp < 0) | |
119 tmp = -(tmp & ((1<<(REAL_BITS-1))-1)); | |
120 else | |
121 tmp = (tmp & ((1<<(REAL_BITS-1))-1)); | |
10725 | 122 |
12527 | 123 energy += MUL_R(tmp,tmp); |
10725 | 124 |
10989 | 125 spec[i] = tmp; |
10725 | 126 } |
127 | |
128 energy = fp_sqrt(energy); | |
129 if (energy > 0) | |
130 { | |
10989 | 131 scale = DIV(REAL_CONST(1),energy); |
10725 | 132 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
133 exp = scale_factor >> 2; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
134 frac = scale_factor & 3; |
10725 | 135 |
10989 | 136 /* IMDCT pre-scaling */ |
137 exp -= sub; | |
138 | |
10725 | 139 if (exp < 0) |
140 scale >>= -exp; | |
141 else | |
142 scale <<= exp; | |
143 | |
144 if (frac) | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
145 scale = MUL_C(scale, pow2_table[frac]); |
10725 | 146 |
147 for (i = 0; i < size; i++) | |
148 { | |
12527 | 149 spec[i] = MUL_R(spec[i], scale); |
10725 | 150 } |
151 } | |
152 #endif | |
153 } | |
154 | |
155 void pns_decode(ic_stream *ics_left, ic_stream *ics_right, | |
156 real_t *spec_left, real_t *spec_right, uint16_t frame_len, | |
10989 | 157 uint8_t channel_pair, uint8_t object_type) |
10725 | 158 { |
159 uint8_t g, sfb, b; | |
160 uint16_t size, offs; | |
161 | |
162 uint8_t group = 0; | |
163 uint16_t nshort = frame_len >> 3; | |
164 | |
10989 | 165 uint8_t sub = 0; |
166 | |
167 #ifdef FIXED_POINT | |
168 /* IMDCT scaling */ | |
169 if (object_type == LD) | |
170 { | |
171 sub = 9 /*9*/; | |
172 } else { | |
173 if (ics_left->window_sequence == EIGHT_SHORT_SEQUENCE) | |
174 sub = 7 /*7*/; | |
175 else | |
176 sub = 10 /*10*/; | |
177 } | |
178 #endif | |
179 | |
10725 | 180 for (g = 0; g < ics_left->num_window_groups; g++) |
181 { | |
182 /* Do perceptual noise substitution decoding */ | |
183 for (b = 0; b < ics_left->window_group_length[g]; b++) | |
184 { | |
185 for (sfb = 0; sfb < ics_left->max_sfb; sfb++) | |
186 { | |
187 if (is_noise(ics_left, g, sfb)) | |
188 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
189 #ifdef LTP_DEC |
10725 | 190 /* Simultaneous use of LTP and PNS is not prevented in the |
191 syntax. If both LTP, and PNS are enabled on the same | |
192 scalefactor band, PNS takes precedence, and no prediction | |
193 is applied to this band. | |
194 */ | |
195 ics_left->ltp.long_used[sfb] = 0; | |
196 ics_left->ltp2.long_used[sfb] = 0; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
197 #endif |
10725 | 198 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
199 #ifdef MAIN_DEC |
10725 | 200 /* For scalefactor bands coded using PNS the corresponding |
201 predictors are switched to "off". | |
202 */ | |
203 ics_left->pred.prediction_used[sfb] = 0; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
204 #endif |
10725 | 205 |
206 offs = ics_left->swb_offset[sfb]; | |
207 size = ics_left->swb_offset[sfb+1] - offs; | |
208 | |
209 /* Generate random vector */ | |
210 gen_rand_vector(&spec_left[(group*nshort)+offs], | |
10989 | 211 ics_left->scale_factors[g][sfb], size, sub); |
10725 | 212 } |
213 | |
214 /* From the spec: | |
215 If the same scalefactor band and group is coded by perceptual noise | |
216 substitution in both channels of a channel pair, the correlation of | |
217 the noise signal can be controlled by means of the ms_used field: While | |
218 the default noise generation process works independently for each channel | |
219 (separate generation of random vectors), the same random vector is used | |
220 for both channels if ms_used[] is set for a particular scalefactor band | |
221 and group. In this case, no M/S stereo coding is carried out (because M/S | |
222 stereo coding and noise substitution coding are mutually exclusive). | |
223 If the same scalefactor band and group is coded by perceptual noise | |
224 substitution in only one channel of a channel pair the setting of ms_used[] | |
225 is not evaluated. | |
226 */ | |
227 if (channel_pair) | |
228 { | |
229 if (is_noise(ics_right, g, sfb)) | |
230 { | |
231 if (((ics_left->ms_mask_present == 1) && | |
232 (ics_left->ms_used[g][sfb])) || | |
233 (ics_left->ms_mask_present == 2)) | |
234 { | |
235 uint16_t c; | |
236 | |
237 offs = ics_right->swb_offset[sfb]; | |
238 size = ics_right->swb_offset[sfb+1] - offs; | |
239 | |
240 for (c = 0; c < size; c++) | |
241 { | |
242 spec_right[(group*nshort) + offs + c] = | |
243 spec_left[(group*nshort) + offs + c]; | |
244 } | |
245 } else /*if (ics_left->ms_mask_present == 0)*/ { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
246 #ifdef LTP_DEC |
10725 | 247 ics_right->ltp.long_used[sfb] = 0; |
248 ics_right->ltp2.long_used[sfb] = 0; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
249 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
250 #ifdef MAIN_DEC |
10725 | 251 ics_right->pred.prediction_used[sfb] = 0; |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
252 #endif |
10725 | 253 |
254 offs = ics_right->swb_offset[sfb]; | |
255 size = ics_right->swb_offset[sfb+1] - offs; | |
256 | |
257 /* Generate random vector */ | |
258 gen_rand_vector(&spec_right[(group*nshort)+offs], | |
10989 | 259 ics_right->scale_factors[g][sfb], size, sub); |
10725 | 260 } |
261 } | |
262 } | |
263 } /* sfb */ | |
264 group++; | |
265 } /* b */ | |
266 } /* g */ | |
267 } |