/proc/self/cwd/libfaad/sbr_tf_grid.c
Line | Count | Source (jump to first uncovered line) |
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_tf_grid.c,v 1.20 2008/09/19 22:50:20 menno Exp $ |
29 | | **/ |
30 | | |
31 | | /* Time/Frequency grid */ |
32 | | |
33 | | #include "common.h" |
34 | | #include "structs.h" |
35 | | |
36 | | #ifdef SBR_DEC |
37 | | |
38 | | #include <stdlib.h> |
39 | | |
40 | | #include "sbr_syntax.h" |
41 | | #include "sbr_tf_grid.h" |
42 | | |
43 | | |
44 | | /* static function declarations */ |
45 | | #if 0 |
46 | | static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l); |
47 | | static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l); |
48 | | #endif |
49 | | static uint8_t middleBorder(sbr_info *sbr, uint8_t ch); |
50 | | |
51 | | |
52 | | /* function constructs new time border vector */ |
53 | | /* first build into temp vector to be able to use previous vector on error */ |
54 | | uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch) |
55 | 89.4k | { |
56 | 89.4k | uint8_t l, border, temp, trail; |
57 | 89.4k | uint8_t t_E_temp[6] = {0}; |
58 | | |
59 | 89.4k | trail = sbr->abs_bord_trail[ch]; |
60 | 89.4k | t_E_temp[0] = sbr->rate * sbr->abs_bord_lead[ch]; |
61 | 89.4k | t_E_temp[sbr->L_E[ch]] = sbr->rate * trail; |
62 | | |
63 | 89.4k | switch (sbr->bs_frame_class[ch]) |
64 | 89.4k | { |
65 | 32.7k | case FIXFIX: |
66 | 32.7k | switch (sbr->L_E[ch]) |
67 | 32.7k | { |
68 | 5.84k | case 4: |
69 | 5.84k | temp = (sbr->numTimeSlots / 4); |
70 | 5.84k | t_E_temp[3] = sbr->rate * 3 * temp; |
71 | 5.84k | t_E_temp[2] = sbr->rate * 2 * temp; |
72 | 5.84k | t_E_temp[1] = sbr->rate * temp; |
73 | 5.84k | break; |
74 | 4.29k | case 2: |
75 | 4.29k | t_E_temp[1] = sbr->rate * (sbr->numTimeSlots / 2); |
76 | 4.29k | break; |
77 | 22.6k | default: |
78 | 22.6k | break; |
79 | 32.7k | } |
80 | 32.7k | break; |
81 | | |
82 | 32.7k | case FIXVAR: |
83 | 18.3k | if (sbr->L_E[ch] > 1) |
84 | 7.70k | { |
85 | 7.70k | int8_t i = sbr->L_E[ch]; |
86 | 7.70k | border = sbr->abs_bord_trail[ch]; |
87 | | |
88 | 24.3k | for (l = 0; l < (sbr->L_E[ch] - 1); l++) |
89 | 17.2k | { |
90 | 17.2k | if (border < sbr->bs_rel_bord[ch][l]) |
91 | 626 | return 1; |
92 | | |
93 | 16.6k | border -= sbr->bs_rel_bord[ch][l]; |
94 | 16.6k | t_E_temp[--i] = sbr->rate * border; |
95 | 16.6k | } |
96 | 7.70k | } |
97 | 17.7k | break; |
98 | | |
99 | 19.8k | case VARFIX: |
100 | 19.8k | if (sbr->L_E[ch] > 1) |
101 | 11.0k | { |
102 | 11.0k | int8_t i = 1; |
103 | 11.0k | border = sbr->abs_bord_lead[ch]; |
104 | | |
105 | 31.7k | for (l = 0; l < (sbr->L_E[ch] - 1); l++) |
106 | 21.5k | { |
107 | 21.5k | border += sbr->bs_rel_bord[ch][l]; |
108 | | |
109 | 21.5k | if (border > trail) |
110 | 851 | return 1; |
111 | | |
112 | 20.6k | t_E_temp[i++] = sbr->rate * border; |
113 | 20.6k | } |
114 | 11.0k | } |
115 | 18.9k | break; |
116 | | |
117 | 18.9k | case VARVAR: |
118 | 18.4k | if (sbr->bs_num_rel_0[ch]) |
119 | 12.1k | { |
120 | 12.1k | int8_t i = 1; |
121 | 12.1k | border = sbr->abs_bord_lead[ch]; |
122 | | |
123 | 40.7k | for (l = 0; l < sbr->bs_num_rel_0[ch]; l++) |
124 | 29.4k | { |
125 | 29.4k | border += sbr->bs_rel_bord_0[ch][l]; |
126 | | |
127 | 29.4k | if (border > trail) |
128 | 890 | return 1; |
129 | | |
130 | 28.5k | t_E_temp[i++] = sbr->rate * border; |
131 | 28.5k | } |
132 | 12.1k | } |
133 | | |
134 | 17.6k | if (sbr->bs_num_rel_1[ch]) |
135 | 12.7k | { |
136 | 12.7k | int8_t i = sbr->L_E[ch]; |
137 | 12.7k | border = sbr->abs_bord_trail[ch]; |
138 | | |
139 | 40.2k | for (l = 0; l < sbr->bs_num_rel_1[ch]; l++) |
140 | 28.5k | { |
141 | 28.5k | if (border < sbr->bs_rel_bord_1[ch][l]) |
142 | 995 | return 1; |
143 | | |
144 | 27.5k | border -= sbr->bs_rel_bord_1[ch][l]; |
145 | 27.5k | t_E_temp[--i] = sbr->rate * border; |
146 | 27.5k | } |
147 | 12.7k | } |
148 | 16.6k | break; |
149 | 89.4k | } |
150 | | |
151 | | /* no error occured, we can safely use this t_E vector */ |
152 | 602k | for (l = 0; l < 6; l++) |
153 | 516k | { |
154 | 516k | sbr->t_E[ch][l] = t_E_temp[l]; |
155 | 516k | } |
156 | | |
157 | 86.0k | return 0; |
158 | 89.4k | } |
159 | | |
160 | | void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch) |
161 | 86.0k | { |
162 | 86.0k | sbr->t_Q[ch][0] = sbr->t_E[ch][0]; |
163 | | |
164 | 86.0k | if (sbr->L_E[ch] == 1) |
165 | 44.7k | { |
166 | 44.7k | sbr->t_Q[ch][1] = sbr->t_E[ch][1]; |
167 | 44.7k | sbr->t_Q[ch][2] = 0; |
168 | 44.7k | } else { |
169 | 41.3k | uint8_t index = middleBorder(sbr, ch); |
170 | 41.3k | sbr->t_Q[ch][1] = sbr->t_E[ch][index]; |
171 | 41.3k | sbr->t_Q[ch][2] = sbr->t_E[ch][sbr->L_E[ch]]; |
172 | 41.3k | } |
173 | 86.0k | } |
174 | | |
175 | | #if 0 |
176 | | static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l) |
177 | | { |
178 | | uint8_t i; |
179 | | int16_t acc = 0; |
180 | | |
181 | | switch (sbr->bs_frame_class[ch]) |
182 | | { |
183 | | case FIXFIX: |
184 | | return sbr->numTimeSlots/sbr->L_E[ch]; |
185 | | case FIXVAR: |
186 | | return 0; |
187 | | case VARFIX: |
188 | | for (i = 0; i < l; i++) |
189 | | { |
190 | | acc += sbr->bs_rel_bord[ch][i]; |
191 | | } |
192 | | return acc; |
193 | | case VARVAR: |
194 | | for (i = 0; i < l; i++) |
195 | | { |
196 | | acc += sbr->bs_rel_bord_0[ch][i]; |
197 | | } |
198 | | return acc; |
199 | | } |
200 | | |
201 | | return 0; |
202 | | } |
203 | | |
204 | | static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l) |
205 | | { |
206 | | uint8_t i; |
207 | | int16_t acc = 0; |
208 | | |
209 | | switch (sbr->bs_frame_class[ch]) |
210 | | { |
211 | | case FIXFIX: |
212 | | case VARFIX: |
213 | | return 0; |
214 | | case FIXVAR: |
215 | | for (i = 0; i < l; i++) |
216 | | { |
217 | | acc += sbr->bs_rel_bord[ch][i]; |
218 | | } |
219 | | return acc; |
220 | | case VARVAR: |
221 | | for (i = 0; i < l; i++) |
222 | | { |
223 | | acc += sbr->bs_rel_bord_1[ch][i]; |
224 | | } |
225 | | return acc; |
226 | | } |
227 | | |
228 | | return 0; |
229 | | } |
230 | | #endif |
231 | | |
232 | | static uint8_t middleBorder(sbr_info *sbr, uint8_t ch) |
233 | 41.3k | { |
234 | 41.3k | int8_t retval = 0; |
235 | | |
236 | 41.3k | switch (sbr->bs_frame_class[ch]) |
237 | 41.3k | { |
238 | 10.1k | case FIXFIX: |
239 | 10.1k | retval = sbr->L_E[ch]/2; |
240 | 10.1k | break; |
241 | 10.1k | case VARFIX: |
242 | 10.1k | if (sbr->bs_pointer[ch] == 0) |
243 | 3.86k | retval = 1; |
244 | 6.30k | else if (sbr->bs_pointer[ch] == 1) |
245 | 2.04k | retval = sbr->L_E[ch] - 1; |
246 | 4.26k | else |
247 | 4.26k | retval = sbr->bs_pointer[ch] - 1; |
248 | 10.1k | break; |
249 | 7.08k | case FIXVAR: |
250 | 21.0k | case VARVAR: |
251 | 21.0k | if (sbr->bs_pointer[ch] > 1) |
252 | 8.44k | retval = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; |
253 | 12.5k | else |
254 | 12.5k | retval = sbr->L_E[ch] - 1; |
255 | 21.0k | break; |
256 | 41.3k | } |
257 | | |
258 | 41.3k | return (retval > 0) ? retval : 0; |
259 | 41.3k | } |
260 | | |
261 | | |
262 | | #endif |