summaryrefslogtreecommitdiff
path: root/songdbj/javazoom/jl/decoder/LayerIIIDecoder.java
diff options
context:
space:
mode:
authorMichiel Van Der Kolk <not.valid@email.address>2005-07-11 15:42:37 +0000
committerMichiel Van Der Kolk <not.valid@email.address>2005-07-11 15:42:37 +0000
commit9fee0ec4ca0c5b7a334cc29dbb58e76c7a4c736e (patch)
tree4c304cd4151020bd5494d279ee68a105ae3a5a3a /songdbj/javazoom/jl/decoder/LayerIIIDecoder.java
parentdfa8ecbe609ca8ea194d08560a44fb9a92e94b4b (diff)
downloadrockbox-9fee0ec4ca0c5b7a334cc29dbb58e76c7a4c736e.tar.gz
rockbox-9fee0ec4ca0c5b7a334cc29dbb58e76c7a4c736e.zip
Songdb java version, source. only 1.5 compatible
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7101 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'songdbj/javazoom/jl/decoder/LayerIIIDecoder.java')
-rw-r--r--songdbj/javazoom/jl/decoder/LayerIIIDecoder.java2439
1 files changed, 2439 insertions, 0 deletions
diff --git a/songdbj/javazoom/jl/decoder/LayerIIIDecoder.java b/songdbj/javazoom/jl/decoder/LayerIIIDecoder.java
new file mode 100644
index 0000000000..602badf0f2
--- /dev/null
+++ b/songdbj/javazoom/jl/decoder/LayerIIIDecoder.java
@@ -0,0 +1,2439 @@
1/*
2 * 11/19/04 1.0 moved to LGPL.
3 *
4 * 18/06/01 Michael Scheerer, Fixed bugs which causes
5 * negative indexes in method huffmann_decode and in method
6 * dequanisize_sample.
7 *
8 * 16/07/01 Michael Scheerer, Catched a bug in method
9 * huffmann_decode, which causes an outOfIndexException.
10 * Cause : Indexnumber of 24 at SfBandIndex,
11 * which has only a length of 22. I have simply and dirty
12 * fixed the index to <= 22, because I'm not really be able
13 * to fix the bug. The Indexnumber is taken from the MP3
14 * file and the origin Ma-Player with the same code works
15 * well.
16 *
17 * 02/19/99 Java Conversion by E.B, javalayer@javazoom.net
18 *-----------------------------------------------------------------------
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU Library General Public License as published
21 * by the Free Software Foundation; either version 2 of the License, or
22 * (at your option) any later version.
23 *
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU Library General Public License for more details.
28 *
29 * You should have received a copy of the GNU Library General Public
30 * License along with this program; if not, write to the Free Software
31 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32 *----------------------------------------------------------------------
33 */
34
35package javazoom.jl.decoder;
36
37/**
38 * Class Implementing Layer 3 Decoder.
39 *
40 * @since 0.0
41 */
42final class LayerIIIDecoder implements FrameDecoder
43{
44 final double d43 = (4.0/3.0);
45
46 public int[] scalefac_buffer;
47
48 // MDM: removed, as this wasn't being used.
49 //private float CheckSumOut1d = 0.0f;
50 private int CheckSumHuff = 0;
51 private int[] is_1d;
52 private float[][][] ro;
53 private float[][][] lr;
54 private float[] out_1d;
55 private float[][] prevblck;
56 private float[][] k;
57 private int[] nonzero;
58 private Bitstream stream;
59 private Header header;
60 private SynthesisFilter filter1, filter2;
61 private Obuffer buffer;
62 private int which_channels;
63 private BitReserve br;
64 private III_side_info_t si;
65
66 private temporaire2[] III_scalefac_t;
67 private temporaire2[] scalefac;
68 // private III_scalefac_t scalefac;
69
70 private int max_gr;
71 private int frame_start;
72 private int part2_start;
73 private int channels;
74 private int first_channel;
75 private int last_channel;
76 private int sfreq;
77
78
79 /**
80 * Constructor.
81 */
82 // REVIEW: these constructor arguments should be moved to the
83 // decodeFrame() method, where possible, so that one
84 public LayerIIIDecoder(Bitstream stream0, Header header0,
85 SynthesisFilter filtera, SynthesisFilter filterb,
86 Obuffer buffer0, int which_ch0)
87 {
88 huffcodetab.inithuff();
89 is_1d = new int[SBLIMIT*SSLIMIT+4];
90 ro = new float[2][SBLIMIT][SSLIMIT];
91 lr = new float[2][SBLIMIT][SSLIMIT];
92 out_1d = new float[SBLIMIT*SSLIMIT];
93 prevblck = new float[2][SBLIMIT*SSLIMIT];
94 k = new float[2][SBLIMIT*SSLIMIT];
95 nonzero = new int[2];
96
97 //III_scalefact_t
98 III_scalefac_t = new temporaire2[2];
99 III_scalefac_t[0] = new temporaire2();
100 III_scalefac_t[1] = new temporaire2();
101 scalefac = III_scalefac_t;
102 // L3TABLE INIT
103
104 sfBandIndex = new SBI[9]; // SZD: MPEG2.5 +3 indices
105 int[] l0 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
106 int[] s0 = {0,4,8,12,18,24,32,42,56,74,100,132,174,192};
107 int[] l1 = {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576};
108 int[] s1 = {0,4,8,12,18,26,36,48,62,80,104,136,180,192};
109 int[] l2 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
110 int[] s2 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192};
111
112 int[] l3 = {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576};
113 int[] s3 = {0,4,8,12,16,22,30,40,52,66,84,106,136,192};
114 int[] l4 = {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576};
115 int[] s4 = {0,4,8,12,16,22,28,38,50,64,80,100,126,192};
116 int[] l5 = {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576};
117 int[] s5 = {0,4,8,12,16,22,30,42,58,78,104,138,180,192};
118 // SZD: MPEG2.5
119 int[] l6 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
120 int[] s6 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192};
121 int[] l7 = {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576};
122 int[] s7 = {0,4,8,12,18,26,36,48,62,80,104,134,174,192};
123 int[] l8 = {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576};
124 int[] s8 = {0,8,16,24,36,52,72,96,124,160,162,164,166,192};
125
126 sfBandIndex[0]= new SBI(l0,s0);
127 sfBandIndex[1]= new SBI(l1,s1);
128 sfBandIndex[2]= new SBI(l2,s2);
129
130 sfBandIndex[3]= new SBI(l3,s3);
131 sfBandIndex[4]= new SBI(l4,s4);
132 sfBandIndex[5]= new SBI(l5,s5);
133 //SZD: MPEG2.5
134 sfBandIndex[6]= new SBI(l6,s6);
135 sfBandIndex[7]= new SBI(l7,s7);
136 sfBandIndex[8]= new SBI(l8,s8);
137 // END OF L3TABLE INIT
138
139 if(reorder_table == null) { // SZD: generate LUT
140 reorder_table = new int[9][];
141 for(int i = 0; i < 9; i++)
142 reorder_table[i] = reorder(sfBandIndex[i].s);
143 }
144
145 // Sftable
146 int[] ll0 = {0, 6, 11, 16, 21};
147 int[] ss0 = {0, 6, 12};
148 sftable = new Sftable(ll0,ss0);
149 // END OF Sftable
150
151 // scalefac_buffer
152 scalefac_buffer = new int[54];
153 // END OF scalefac_buffer
154
155 stream = stream0;
156 header = header0;
157 filter1 = filtera;
158 filter2 = filterb;
159 buffer = buffer0;
160 which_channels = which_ch0;
161
162 frame_start = 0;
163 channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2;
164 max_gr = (header.version() == Header.MPEG1) ? 2 : 1;
165
166 sfreq = header.sample_frequency() +
167 ((header.version() == Header.MPEG1) ? 3 :
168 (header.version() == Header.MPEG25_LSF) ? 6 : 0); // SZD
169
170 if (channels == 2)
171 {
172 switch (which_channels)
173 {
174 case OutputChannels.LEFT_CHANNEL:
175 case OutputChannels.DOWNMIX_CHANNELS:
176 first_channel = last_channel = 0;
177 break;
178
179 case OutputChannels.RIGHT_CHANNEL:
180 first_channel = last_channel = 1;
181 break;
182
183 case OutputChannels.BOTH_CHANNELS:
184 default:
185 first_channel = 0;
186 last_channel = 1;
187 break;
188 }
189 }
190 else
191 {
192 first_channel = last_channel = 0;
193 }
194
195 for(int ch=0;ch<2;ch++)
196 for (int j=0; j<576; j++)
197 prevblck[ch][j] = 0.0f;
198
199 nonzero[0] = nonzero[1] = 576;
200
201 br = new BitReserve();
202 si = new III_side_info_t();
203 }
204
205 /**
206 * Notify decoder that a seek is being made.
207 */
208 public void seek_notify()
209 {
210 frame_start = 0;
211 for(int ch=0;ch<2;ch++)
212 for (int j=0; j<576; j++)
213 prevblck[ch][j] = 0.0f;
214 br = new BitReserve();
215 }
216
217 public void decodeFrame()
218 {
219 decode();
220 }
221
222 /**
223 * Decode one frame, filling the buffer with the output samples.
224 */
225
226 // subband samples are buffered and passed to the
227 // SynthesisFilter in one go.
228 private float[] samples1 = new float[32];
229 private float[] samples2 = new float[32];
230
231 public void decode()
232 {
233 int nSlots = header.slots();
234 int flush_main;
235 int gr, ch, ss, sb, sb18;
236 int main_data_end;
237 int bytes_to_discard;
238 int i;
239
240 get_side_info();
241
242 for (i=0; i<nSlots; i++)
243 br.hputbuf(stream.get_bits(8));
244
245 main_data_end = br.hsstell() >>> 3; // of previous frame
246
247 if ((flush_main = (br.hsstell() & 7)) != 0) {
248 br.hgetbits(8 - flush_main);
249 main_data_end++;
250 }
251
252 bytes_to_discard = frame_start - main_data_end
253 - si.main_data_begin;
254
255 frame_start += nSlots;
256
257 if (bytes_to_discard < 0)
258 return;
259
260 if (main_data_end > 4096) {
261 frame_start -= 4096;
262 br.rewindNbytes(4096);
263 }
264
265 for (; bytes_to_discard > 0; bytes_to_discard--)
266 br.hgetbits(8);
267
268 for (gr=0;gr<max_gr;gr++) {
269
270 for (ch=0; ch<channels; ch++) {
271 part2_start = br.hsstell();
272
273 if (header.version() == Header.MPEG1)
274 get_scale_factors(ch, gr);
275 else // MPEG-2 LSF, SZD: MPEG-2.5 LSF
276 get_LSF_scale_factors(ch, gr);
277
278 huffman_decode(ch, gr);
279 // System.out.println("CheckSum HuffMan = " + CheckSumHuff);
280 dequantize_sample(ro[ch], ch, gr);
281 }
282
283 stereo(gr);
284
285 if ((which_channels == OutputChannels.DOWNMIX_CHANNELS) && (channels > 1))
286 do_downmix();
287
288 for (ch=first_channel; ch<=last_channel; ch++) {
289
290 reorder(lr[ch], ch, gr);
291 antialias(ch, gr);
292 //for (int hb = 0;hb<576;hb++) CheckSumOut1d = CheckSumOut1d + out_1d[hb];
293 //System.out.println("CheckSumOut1d = "+CheckSumOut1d);
294
295 hybrid(ch, gr);
296
297 //for (int hb = 0;hb<576;hb++) CheckSumOut1d = CheckSumOut1d + out_1d[hb];
298 //System.out.println("CheckSumOut1d = "+CheckSumOut1d);
299
300 for (sb18=18;sb18<576;sb18+=36) // Frequency inversion
301 for (ss=1;ss<SSLIMIT;ss+=2)
302 out_1d[sb18 + ss] = -out_1d[sb18 + ss];
303
304 if ((ch == 0) || (which_channels == OutputChannels.RIGHT_CHANNEL)) {
305 for (ss=0;ss<SSLIMIT;ss++) { // Polyphase synthesis
306 sb = 0;
307 for (sb18=0; sb18<576; sb18+=18) {
308 samples1[sb] = out_1d[sb18+ss];
309 //filter1.input_sample(out_1d[sb18+ss], sb);
310 sb++;
311 }
312 filter1.input_samples(samples1);
313 filter1.calculate_pcm_samples(buffer);
314 }
315 } else {
316 for (ss=0;ss<SSLIMIT;ss++) { // Polyphase synthesis
317 sb = 0;
318 for (sb18=0; sb18<576; sb18+=18) {
319 samples2[sb] = out_1d[sb18+ss];
320 //filter2.input_sample(out_1d[sb18+ss], sb);
321 sb++;
322 }
323 filter2.input_samples(samples2);
324 filter2.calculate_pcm_samples(buffer);
325 }
326
327 }
328 } // channels
329 } // granule
330
331
332 // System.out.println("Counter = ................................."+counter);
333 //if (counter < 609)
334 //{
335 counter++;
336 buffer.write_buffer(1);
337 //}
338 //else if (counter == 609)
339 //{
340 // buffer.close();
341 // counter++;
342 //}
343 //else
344 //{
345 //}
346
347 }
348
349 /**
350 * Reads the side info from the stream, assuming the entire.
351 * frame has been read already.
352 * Mono : 136 bits (= 17 bytes)
353 * Stereo : 256 bits (= 32 bytes)
354 */
355 private boolean get_side_info()
356 {
357 int ch, gr;
358 if (header.version() == Header.MPEG1)
359 {
360
361 si.main_data_begin = stream.get_bits(9);
362 if (channels == 1)
363 si.private_bits = stream.get_bits(5);
364 else si.private_bits = stream.get_bits(3);
365
366 for (ch=0; ch<channels; ch++) {
367 si.ch[ch].scfsi[0] = stream.get_bits(1);
368 si.ch[ch].scfsi[1] = stream.get_bits(1);
369 si.ch[ch].scfsi[2] = stream.get_bits(1);
370 si.ch[ch].scfsi[3] = stream.get_bits(1);
371 }
372
373 for (gr=0; gr<2; gr++) {
374 for (ch=0; ch<channels; ch++) {
375 si.ch[ch].gr[gr].part2_3_length = stream.get_bits(12);
376 si.ch[ch].gr[gr].big_values = stream.get_bits(9);
377 si.ch[ch].gr[gr].global_gain = stream.get_bits(8);
378 si.ch[ch].gr[gr].scalefac_compress = stream.get_bits(4);
379 si.ch[ch].gr[gr].window_switching_flag = stream.get_bits(1);
380 if ((si.ch[ch].gr[gr].window_switching_flag) != 0) {
381 si.ch[ch].gr[gr].block_type = stream.get_bits(2);
382 si.ch[ch].gr[gr].mixed_block_flag = stream.get_bits(1);
383
384 si.ch[ch].gr[gr].table_select[0] = stream.get_bits(5);
385 si.ch[ch].gr[gr].table_select[1] = stream.get_bits(5);
386
387 si.ch[ch].gr[gr].subblock_gain[0] = stream.get_bits(3);
388 si.ch[ch].gr[gr].subblock_gain[1] = stream.get_bits(3);
389 si.ch[ch].gr[gr].subblock_gain[2] = stream.get_bits(3);
390
391 // Set region_count parameters since they are implicit in this case.
392
393 if (si.ch[ch].gr[gr].block_type == 0) {
394 // Side info bad: block_type == 0 in split block
395 return false;
396 } else if (si.ch[ch].gr[gr].block_type == 2
397 && si.ch[ch].gr[gr].mixed_block_flag == 0) {
398 si.ch[ch].gr[gr].region0_count = 8;
399 } else {
400 si.ch[ch].gr[gr].region0_count = 7;
401 }
402 si.ch[ch].gr[gr].region1_count = 20 -
403 si.ch[ch].gr[gr].region0_count;
404 } else {
405 si.ch[ch].gr[gr].table_select[0] = stream.get_bits(5);
406 si.ch[ch].gr[gr].table_select[1] = stream.get_bits(5);
407 si.ch[ch].gr[gr].table_select[2] = stream.get_bits(5);
408 si.ch[ch].gr[gr].region0_count = stream.get_bits(4);
409 si.ch[ch].gr[gr].region1_count = stream.get_bits(3);
410 si.ch[ch].gr[gr].block_type = 0;
411 }
412 si.ch[ch].gr[gr].preflag = stream.get_bits(1);
413 si.ch[ch].gr[gr].scalefac_scale = stream.get_bits(1);
414 si.ch[ch].gr[gr].count1table_select = stream.get_bits(1);
415 }
416 }
417
418 } else { // MPEG-2 LSF, SZD: MPEG-2.5 LSF
419
420 si.main_data_begin = stream.get_bits(8);
421 if (channels == 1)
422 si.private_bits = stream.get_bits(1);
423 else si.private_bits = stream.get_bits(2);
424
425 for (ch=0; ch<channels; ch++) {
426
427 si.ch[ch].gr[0].part2_3_length = stream.get_bits(12);
428 si.ch[ch].gr[0].big_values = stream.get_bits(9);
429 si.ch[ch].gr[0].global_gain = stream.get_bits(8);
430 si.ch[ch].gr[0].scalefac_compress = stream.get_bits(9);
431 si.ch[ch].gr[0].window_switching_flag = stream.get_bits(1);
432
433 if ((si.ch[ch].gr[0].window_switching_flag) != 0) {
434
435 si.ch[ch].gr[0].block_type = stream.get_bits(2);
436 si.ch[ch].gr[0].mixed_block_flag = stream.get_bits(1);
437 si.ch[ch].gr[0].table_select[0] = stream.get_bits(5);
438 si.ch[ch].gr[0].table_select[1] = stream.get_bits(5);
439
440 si.ch[ch].gr[0].subblock_gain[0] = stream.get_bits(3);
441 si.ch[ch].gr[0].subblock_gain[1] = stream.get_bits(3);
442 si.ch[ch].gr[0].subblock_gain[2] = stream.get_bits(3);
443
444 // Set region_count parameters since they are implicit in this case.
445
446 if (si.ch[ch].gr[0].block_type == 0) {
447 // Side info bad: block_type == 0 in split block
448 return false;
449 } else if (si.ch[ch].gr[0].block_type == 2
450 && si.ch[ch].gr[0].mixed_block_flag == 0) {
451 si.ch[ch].gr[0].region0_count = 8;
452 } else {
453 si.ch[ch].gr[0].region0_count = 7;
454 si.ch[ch].gr[0].region1_count = 20 -
455 si.ch[ch].gr[0].region0_count;
456 }
457
458 } else {
459 si.ch[ch].gr[0].table_select[0] = stream.get_bits(5);
460 si.ch[ch].gr[0].table_select[1] = stream.get_bits(5);
461 si.ch[ch].gr[0].table_select[2] = stream.get_bits(5);
462 si.ch[ch].gr[0].region0_count = stream.get_bits(4);
463 si.ch[ch].gr[0].region1_count = stream.get_bits(3);
464 si.ch[ch].gr[0].block_type = 0;
465 }
466
467 si.ch[ch].gr[0].scalefac_scale = stream.get_bits(1);
468 si.ch[ch].gr[0].count1table_select = stream.get_bits(1);
469 } // for(ch=0; ch<channels; ch++)
470 } // if (header.version() == MPEG1)
471 return true;
472 }
473
474 /**
475 *
476 */
477 private void get_scale_factors(int ch, int gr)
478 {
479 int sfb, window;
480 gr_info_s gr_info = (si.ch[ch].gr[gr]);
481 int scale_comp = gr_info.scalefac_compress;
482 int length0 = slen[0][scale_comp];
483 int length1 = slen[1][scale_comp];
484
485 if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
486 if ((gr_info.mixed_block_flag) != 0) { // MIXED
487 for (sfb = 0; sfb < 8; sfb++)
488 scalefac[ch].l[sfb] = br.hgetbits(
489 slen[0][gr_info.scalefac_compress]);
490 for (sfb = 3; sfb < 6; sfb++)
491 for (window=0; window<3; window++)
492 scalefac[ch].s[window][sfb] = br.hgetbits(
493 slen[0][gr_info.scalefac_compress]);
494 for (sfb = 6; sfb < 12; sfb++)
495 for (window=0; window<3; window++)
496 scalefac[ch].s[window][sfb] = br.hgetbits(
497 slen[1][gr_info.scalefac_compress]);
498 for (sfb=12,window=0; window<3; window++)
499 scalefac[ch].s[window][sfb] = 0;
500
501 } else { // SHORT
502
503 scalefac[ch].s[0][0] = br.hgetbits(length0);
504 scalefac[ch].s[1][0] = br.hgetbits(length0);
505 scalefac[ch].s[2][0] = br.hgetbits(length0);
506 scalefac[ch].s[0][1] = br.hgetbits(length0);
507 scalefac[ch].s[1][1] = br.hgetbits(length0);
508 scalefac[ch].s[2][1] = br.hgetbits(length0);
509 scalefac[ch].s[0][2] = br.hgetbits(length0);
510 scalefac[ch].s[1][2] = br.hgetbits(length0);
511 scalefac[ch].s[2][2] = br.hgetbits(length0);
512 scalefac[ch].s[0][3] = br.hgetbits(length0);
513 scalefac[ch].s[1][3] = br.hgetbits(length0);
514 scalefac[ch].s[2][3] = br.hgetbits(length0);
515 scalefac[ch].s[0][4] = br.hgetbits(length0);
516 scalefac[ch].s[1][4] = br.hgetbits(length0);
517 scalefac[ch].s[2][4] = br.hgetbits(length0);
518 scalefac[ch].s[0][5] = br.hgetbits(length0);
519 scalefac[ch].s[1][5] = br.hgetbits(length0);
520 scalefac[ch].s[2][5] = br.hgetbits(length0);
521 scalefac[ch].s[0][6] = br.hgetbits(length1);
522 scalefac[ch].s[1][6] = br.hgetbits(length1);
523 scalefac[ch].s[2][6] = br.hgetbits(length1);
524 scalefac[ch].s[0][7] = br.hgetbits(length1);
525 scalefac[ch].s[1][7] = br.hgetbits(length1);
526 scalefac[ch].s[2][7] = br.hgetbits(length1);
527 scalefac[ch].s[0][8] = br.hgetbits(length1);
528 scalefac[ch].s[1][8] = br.hgetbits(length1);
529 scalefac[ch].s[2][8] = br.hgetbits(length1);
530 scalefac[ch].s[0][9] = br.hgetbits(length1);
531 scalefac[ch].s[1][9] = br.hgetbits(length1);
532 scalefac[ch].s[2][9] = br.hgetbits(length1);
533 scalefac[ch].s[0][10] = br.hgetbits(length1);
534 scalefac[ch].s[1][10] = br.hgetbits(length1);
535 scalefac[ch].s[2][10] = br.hgetbits(length1);
536 scalefac[ch].s[0][11] = br.hgetbits(length1);
537 scalefac[ch].s[1][11] = br.hgetbits(length1);
538 scalefac[ch].s[2][11] = br.hgetbits(length1);
539 scalefac[ch].s[0][12] = 0;
540 scalefac[ch].s[1][12] = 0;
541 scalefac[ch].s[2][12] = 0;
542 } // SHORT
543
544 } else { // LONG types 0,1,3
545
546 if ((si.ch[ch].scfsi[0] == 0) || (gr == 0)) {
547 scalefac[ch].l[0] = br.hgetbits(length0);
548 scalefac[ch].l[1] = br.hgetbits(length0);
549 scalefac[ch].l[2] = br.hgetbits(length0);
550 scalefac[ch].l[3] = br.hgetbits(length0);
551 scalefac[ch].l[4] = br.hgetbits(length0);
552 scalefac[ch].l[5] = br.hgetbits(length0);
553 }
554 if ((si.ch[ch].scfsi[1] == 0) || (gr == 0)) {
555 scalefac[ch].l[6] = br.hgetbits(length0);
556 scalefac[ch].l[7] = br.hgetbits(length0);
557 scalefac[ch].l[8] = br.hgetbits(length0);
558 scalefac[ch].l[9] = br.hgetbits(length0);
559 scalefac[ch].l[10] = br.hgetbits(length0);
560 }
561 if ((si.ch[ch].scfsi[2] == 0) || (gr == 0)) {
562 scalefac[ch].l[11] = br.hgetbits(length1);
563 scalefac[ch].l[12] = br.hgetbits(length1);
564 scalefac[ch].l[13] = br.hgetbits(length1);
565 scalefac[ch].l[14] = br.hgetbits(length1);
566 scalefac[ch].l[15] = br.hgetbits(length1);
567 }
568 if ((si.ch[ch].scfsi[3] == 0) || (gr == 0)) {
569 scalefac[ch].l[16] = br.hgetbits(length1);
570 scalefac[ch].l[17] = br.hgetbits(length1);
571 scalefac[ch].l[18] = br.hgetbits(length1);
572 scalefac[ch].l[19] = br.hgetbits(length1);
573 scalefac[ch].l[20] = br.hgetbits(length1);
574 }
575
576 scalefac[ch].l[21] = 0;
577 scalefac[ch].l[22] = 0;
578 }
579 }
580
581 /**
582 *
583 */
584 // MDM: new_slen is fully initialized before use, no need
585 // to reallocate array.
586 private final int[] new_slen = new int[4];
587
588 private void get_LSF_scale_data(int ch, int gr)
589 {
590
591 int scalefac_comp, int_scalefac_comp;
592 int mode_ext = header.mode_extension();
593 int m;
594 int blocktypenumber;
595 int blocknumber = 0;
596
597 gr_info_s gr_info = (si.ch[ch].gr[gr]);
598
599 scalefac_comp = gr_info.scalefac_compress;
600
601 if (gr_info.block_type == 2) {
602 if (gr_info.mixed_block_flag == 0)
603 blocktypenumber = 1;
604 else if (gr_info.mixed_block_flag == 1)
605 blocktypenumber = 2;
606 else
607 blocktypenumber = 0;
608 } else {
609 blocktypenumber = 0;
610 }
611
612 if(!(((mode_ext == 1) || (mode_ext == 3)) && (ch == 1))) {
613
614 if(scalefac_comp < 400) {
615
616 new_slen[0] = (scalefac_comp >>> 4) / 5 ;
617 new_slen[1] = (scalefac_comp >>> 4) % 5 ;
618 new_slen[2] = (scalefac_comp & 0xF) >>> 2 ;
619 new_slen[3] = (scalefac_comp & 3);
620 si.ch[ch].gr[gr].preflag = 0;
621 blocknumber = 0;
622
623 } else if (scalefac_comp < 500) {
624
625 new_slen[0] = ((scalefac_comp - 400) >>> 2) / 5 ;
626 new_slen[1] = ((scalefac_comp - 400) >>> 2) % 5 ;
627 new_slen[2] = (scalefac_comp - 400 ) & 3 ;
628 new_slen[3] = 0;
629 si.ch[ch].gr[gr].preflag = 0;
630 blocknumber = 1;
631
632 } else if (scalefac_comp < 512) {
633
634 new_slen[0] = (scalefac_comp - 500 ) / 3 ;
635 new_slen[1] = (scalefac_comp - 500) % 3 ;
636 new_slen[2] = 0;
637 new_slen[3] = 0;
638 si.ch[ch].gr[gr].preflag = 1;
639 blocknumber = 2;
640 }
641 }
642
643 if((((mode_ext == 1) || (mode_ext == 3)) && (ch == 1)))
644 {
645 int_scalefac_comp = scalefac_comp >>> 1;
646
647 if (int_scalefac_comp < 180)
648 {
649 new_slen[0] = int_scalefac_comp / 36 ;
650 new_slen[1] = (int_scalefac_comp % 36 ) / 6 ;
651 new_slen[2] = (int_scalefac_comp % 36) % 6;
652 new_slen[3] = 0;
653 si.ch[ch].gr[gr].preflag = 0;
654 blocknumber = 3;
655 } else if (int_scalefac_comp < 244) {
656 new_slen[0] = ((int_scalefac_comp - 180 ) & 0x3F) >>> 4 ;
657 new_slen[1] = ((int_scalefac_comp - 180) & 0xF) >>> 2 ;
658 new_slen[2] = (int_scalefac_comp - 180 ) & 3 ;
659 new_slen[3] = 0;
660 si.ch[ch].gr[gr].preflag = 0;
661 blocknumber = 4;
662 } else if (int_scalefac_comp < 255) {
663 new_slen[0] = (int_scalefac_comp - 244 ) / 3 ;
664 new_slen[1] = (int_scalefac_comp - 244 ) % 3 ;
665 new_slen[2] = 0 ;
666 new_slen[3] = 0;
667 si.ch[ch].gr[gr].preflag = 0;
668 blocknumber = 5;
669 }
670 }
671
672 for (int x=0; x<45; x++) // why 45, not 54?
673 scalefac_buffer[x] = 0;
674
675 m = 0;
676 for (int i=0; i<4;i++) {
677 for (int j = 0; j < nr_of_sfb_block[blocknumber][blocktypenumber][i];
678 j++)
679 {
680 scalefac_buffer[m] = (new_slen[i] == 0) ? 0 :
681 br.hgetbits(new_slen[i]);
682 m++;
683
684 } // for (unint32 j ...
685 } // for (uint32 i ...
686 }
687
688 /**
689 *
690 */
691 private void get_LSF_scale_factors(int ch, int gr)
692 {
693 int m = 0;
694 int sfb, window;
695 gr_info_s gr_info = (si.ch[ch].gr[gr]);
696
697 get_LSF_scale_data(ch, gr);
698
699 if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
700 if (gr_info.mixed_block_flag != 0) { // MIXED
701 for (sfb = 0; sfb < 8; sfb++)
702 {
703 scalefac[ch].l[sfb] = scalefac_buffer[m];
704 m++;
705 }
706 for (sfb = 3; sfb < 12; sfb++) {
707 for (window=0; window<3; window++)
708 {
709 scalefac[ch].s[window][sfb] = scalefac_buffer[m];
710 m++;
711 }
712 }
713 for (window=0; window<3; window++)
714 scalefac[ch].s[window][12] = 0;
715
716 } else { // SHORT
717
718 for (sfb = 0; sfb < 12; sfb++) {
719 for (window=0; window<3; window++)
720 {
721 scalefac[ch].s[window][sfb] = scalefac_buffer[m];
722 m++;
723 }
724 }
725
726 for (window=0; window<3; window++)
727 scalefac[ch].s[window][12] = 0;
728 }
729 } else { // LONG types 0,1,3
730
731 for (sfb = 0; sfb < 21; sfb++) {
732 scalefac[ch].l[sfb] = scalefac_buffer[m];
733 m++;
734 }
735 scalefac[ch].l[21] = 0; // Jeff
736 scalefac[ch].l[22] = 0;
737 }
738 }
739
740 /**
741 *
742 */
743 int[] x = {0};
744 int[] y = {0};
745 int[] v = {0};
746 int[] w = {0};
747 private void huffman_decode(int ch, int gr)
748 {
749 x[0] = 0;
750 y[0] = 0;
751 v[0] = 0;
752 w[0] = 0;
753
754 int part2_3_end = part2_start + si.ch[ch].gr[gr].part2_3_length;
755 int num_bits;
756 int region1Start;
757 int region2Start;
758 int index;
759
760 int buf, buf1;
761
762 huffcodetab h;
763
764 // Find region boundary for short block case
765
766 if ( ((si.ch[ch].gr[gr].window_switching_flag) != 0) &&
767 (si.ch[ch].gr[gr].block_type == 2) ) {
768
769 // Region2.
770 //MS: Extrahandling for 8KHZ
771 region1Start = (sfreq == 8) ? 72 : 36; // sfb[9/3]*3=36 or in case 8KHZ = 72
772 region2Start = 576; // No Region2 for short block case
773
774 } else { // Find region boundary for long block case
775
776 buf = si.ch[ch].gr[gr].region0_count + 1;
777 buf1 = buf + si.ch[ch].gr[gr].region1_count + 1;
778
779 if(buf1 > sfBandIndex[sfreq].l.length - 1) buf1 = sfBandIndex[sfreq].l.length - 1;
780
781 region1Start = sfBandIndex[sfreq].l[buf];
782 region2Start = sfBandIndex[sfreq].l[buf1]; /* MI */
783 }
784
785 index = 0;
786 // Read bigvalues area
787 for (int i=0; i<(si.ch[ch].gr[gr].big_values<<1); i+=2) {
788 if (i<region1Start) h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[0]];
789 else if (i<region2Start) h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[1]];
790 else h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[2]];
791
792 huffcodetab.huffman_decoder(h, x, y, v, w, br);
793 //if (index >= is_1d.length) System.out.println("i0="+i+"/"+(si.ch[ch].gr[gr].big_values<<1)+" Index="+index+" is_1d="+is_1d.length);
794
795 is_1d[index++] = x[0];
796 is_1d[index++] = y[0];
797
798 CheckSumHuff = CheckSumHuff + x[0] + y[0];
799 // System.out.println("x = "+x[0]+" y = "+y[0]);
800 }
801
802 // Read count1 area
803 h = huffcodetab.ht[si.ch[ch].gr[gr].count1table_select+32];
804 num_bits = br.hsstell();
805
806 while ((num_bits < part2_3_end) && (index < 576)) {
807
808 huffcodetab.huffman_decoder(h, x, y, v, w, br);
809
810 is_1d[index++] = v[0];
811 is_1d[index++] = w[0];
812 is_1d[index++] = x[0];
813 is_1d[index++] = y[0];
814 CheckSumHuff = CheckSumHuff + v[0] + w[0] + x[0] + y[0];
815 // System.out.println("v = "+v[0]+" w = "+w[0]);
816 // System.out.println("x = "+x[0]+" y = "+y[0]);
817 num_bits = br.hsstell();
818 }
819
820 if (num_bits > part2_3_end) {
821 br.rewindNbits(num_bits - part2_3_end);
822 index-=4;
823 }
824
825 num_bits = br.hsstell();
826
827 // Dismiss stuffing bits
828 if (num_bits < part2_3_end)
829 br.hgetbits(part2_3_end - num_bits);
830
831 // Zero out rest
832
833 if (index < 576)
834 nonzero[ch] = index;
835 else
836 nonzero[ch] = 576;
837
838 if (index < 0) index = 0;
839
840 // may not be necessary
841 for (; index<576; index++)
842 is_1d[index] = 0;
843 }
844
845 /**
846 *
847 */
848 private void i_stereo_k_values(int is_pos, int io_type, int i)
849 {
850 if (is_pos == 0) {
851 k[0][i] = 1.0f;
852 k[1][i] = 1.0f;
853 } else if ((is_pos & 1) != 0) {
854 k[0][i] = io[io_type][(is_pos + 1) >>> 1];
855 k[1][i] = 1.0f;
856 } else {
857 k[0][i] = 1.0f;
858 k[1][i] = io[io_type][is_pos >>> 1];
859 }
860 }
861
862 /**
863 *
864 */
865 private void dequantize_sample(float xr[][], int ch, int gr)
866 {
867 gr_info_s gr_info = (si.ch[ch].gr[gr]);
868 int cb=0;
869 int next_cb_boundary;
870 int cb_begin = 0;
871 int cb_width = 0;
872 int index=0, t_index, j;
873 float g_gain;
874 float[][] xr_1d = xr;
875
876 // choose correct scalefactor band per block type, initalize boundary
877
878 if ((gr_info.window_switching_flag !=0 ) && (gr_info.block_type == 2) ) {
879 if (gr_info.mixed_block_flag != 0)
880 next_cb_boundary=sfBandIndex[sfreq].l[1]; // LONG blocks: 0,1,3
881 else {
882 cb_width = sfBandIndex[sfreq].s[1];
883 next_cb_boundary = (cb_width << 2) - cb_width;
884 cb_begin = 0;
885 }
886 } else {
887 next_cb_boundary=sfBandIndex[sfreq].l[1]; // LONG blocks: 0,1,3
888 }
889
890 // Compute overall (global) scaling.
891
892 g_gain = (float) Math.pow(2.0 , (0.25 * (gr_info.global_gain - 210.0)));
893
894 for (j=0; j<nonzero[ch]; j++)
895 {
896 // Modif E.B 02/22/99
897 int reste = j % SSLIMIT;
898 int quotien = (int) ((j-reste)/SSLIMIT);
899 if (is_1d[j] == 0) xr_1d[quotien][reste] = 0.0f;
900 else
901 {
902 int abv = is_1d[j];
903 // Pow Array fix (11/17/04)
904 if (abv < t_43.length)
905 {
906 if (is_1d[j] > 0) xr_1d[quotien][reste] = g_gain * t_43[abv];
907 else
908 {
909 if (-abv < t_43.length) xr_1d[quotien][reste] = -g_gain * t_43[-abv];
910 else xr_1d[quotien][reste] = -g_gain * (float)Math.pow(-abv, d43);
911 }
912 }
913 else
914 {
915 if (is_1d[j] > 0) xr_1d[quotien][reste] = g_gain * (float)Math.pow(abv, d43);
916 else xr_1d[quotien][reste] = -g_gain * (float)Math.pow(-abv, d43);
917 }
918 }
919 }
920
921 // apply formula per block type
922 for (j=0; j<nonzero[ch]; j++)
923 {
924 // Modif E.B 02/22/99
925 int reste = j % SSLIMIT;
926 int quotien = (int) ((j-reste)/SSLIMIT);
927
928 if (index == next_cb_boundary) { /* Adjust critical band boundary */
929 if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
930 if (gr_info.mixed_block_flag != 0) {
931
932 if (index == sfBandIndex[sfreq].l[8]) {
933 next_cb_boundary = sfBandIndex[sfreq].s[4];
934 next_cb_boundary = (next_cb_boundary << 2) -
935 next_cb_boundary;
936 cb = 3;
937 cb_width = sfBandIndex[sfreq].s[4] -
938 sfBandIndex[sfreq].s[3];
939
940 cb_begin = sfBandIndex[sfreq].s[3];
941 cb_begin = (cb_begin << 2) - cb_begin;
942
943 } else if (index < sfBandIndex[sfreq].l[8]) {
944
945 next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];
946
947 } else {
948
949 next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1];
950 next_cb_boundary = (next_cb_boundary << 2) -
951 next_cb_boundary;
952
953 cb_begin = sfBandIndex[sfreq].s[cb];
954 cb_width = sfBandIndex[sfreq].s[cb+1] -
955 cb_begin;
956 cb_begin = (cb_begin << 2) - cb_begin;
957 }
958
959 } else {
960
961 next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1];
962 next_cb_boundary = (next_cb_boundary << 2) -
963 next_cb_boundary;
964
965 cb_begin = sfBandIndex[sfreq].s[cb];
966 cb_width = sfBandIndex[sfreq].s[cb+1] -
967 cb_begin;
968 cb_begin = (cb_begin << 2) - cb_begin;
969 }
970
971 } else { // long blocks
972
973 next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];
974
975 }
976 }
977
978 // Do long/short dependent scaling operations
979
980 if ((gr_info.window_switching_flag !=0)&&
981 (((gr_info.block_type == 2) && (gr_info.mixed_block_flag == 0)) ||
982 ((gr_info.block_type == 2) && (gr_info.mixed_block_flag!=0) && (j >= 36)) ))
983 {
984
985 t_index = (index - cb_begin) / cb_width;
986 /* xr[sb][ss] *= pow(2.0, ((-2.0 * gr_info.subblock_gain[t_index])
987 -(0.5 * (1.0 + gr_info.scalefac_scale)
988 * scalefac[ch].s[t_index][cb]))); */
989 int idx = scalefac[ch].s[t_index][cb]
990 << gr_info.scalefac_scale;
991 idx += (gr_info.subblock_gain[t_index] << 2);
992
993 xr_1d[quotien][reste] *= two_to_negative_half_pow[idx];
994
995 } else { // LONG block types 0,1,3 & 1st 2 subbands of switched blocks
996 /* xr[sb][ss] *= pow(2.0, -0.5 * (1.0+gr_info.scalefac_scale)
997 * (scalefac[ch].l[cb]
998 + gr_info.preflag * pretab[cb])); */
999 int idx = scalefac[ch].l[cb];
1000
1001 if (gr_info.preflag != 0)
1002 idx += pretab[cb];
1003
1004 idx = idx << gr_info.scalefac_scale;
1005 xr_1d[quotien][reste] *= two_to_negative_half_pow[idx];
1006 }
1007 index++;
1008 }
1009
1010 for (j=nonzero[ch]; j<576; j++)
1011 {
1012 // Modif E.B 02/22/99
1013 int reste = j % SSLIMIT;
1014 int quotien = (int) ((j-reste)/SSLIMIT);
1015 if(reste < 0) reste = 0;
1016 if(quotien < 0) quotien = 0;
1017 xr_1d[quotien][reste] = 0.0f;
1018 }
1019
1020 return;
1021 }
1022
1023 /**
1024 *
1025 */
1026 private void reorder(float xr[][], int ch, int gr)
1027 {
1028 gr_info_s gr_info = (si.ch[ch].gr[gr]);
1029 int freq, freq3;
1030 int index;
1031 int sfb, sfb_start, sfb_lines;
1032 int src_line, des_line;
1033 float[][] xr_1d = xr;
1034
1035 if ((gr_info.window_switching_flag !=0) && (gr_info.block_type == 2)) {
1036
1037 for(index=0; index<576; index++)
1038 out_1d[index] = 0.0f;
1039
1040 if (gr_info.mixed_block_flag !=0 ) {
1041 // NO REORDER FOR LOW 2 SUBBANDS
1042 for (index = 0; index < 36; index++)
1043 {
1044 // Modif E.B 02/22/99
1045 int reste = index % SSLIMIT;
1046 int quotien = (int) ((index-reste)/SSLIMIT);
1047 out_1d[index] = xr_1d[quotien][reste];
1048 }
1049 // REORDERING FOR REST SWITCHED SHORT
1050 /*for( sfb=3,sfb_start=sfBandIndex[sfreq].s[3],
1051 sfb_lines=sfBandIndex[sfreq].s[4] - sfb_start;
1052 sfb < 13; sfb++,sfb_start = sfBandIndex[sfreq].s[sfb],
1053 sfb_lines = sfBandIndex[sfreq].s[sfb+1] - sfb_start )
1054 {*/
1055 for( sfb=3; sfb < 13; sfb++)
1056 {
1057 //System.out.println("sfreq="+sfreq+" sfb="+sfb+" sfBandIndex="+sfBandIndex.length+" sfBandIndex[sfreq].s="+sfBandIndex[sfreq].s.length);
1058 sfb_start = sfBandIndex[sfreq].s[sfb];
1059 sfb_lines = sfBandIndex[sfreq].s[sfb+1] - sfb_start;
1060
1061 int sfb_start3 = (sfb_start << 2) - sfb_start;
1062
1063 for(freq=0, freq3=0; freq<sfb_lines;
1064 freq++, freq3+=3) {
1065
1066 src_line = sfb_start3 + freq;
1067 des_line = sfb_start3 + freq3;
1068 // Modif E.B 02/22/99
1069 int reste = src_line % SSLIMIT;
1070 int quotien = (int) ((src_line-reste)/SSLIMIT);
1071
1072 out_1d[des_line] = xr_1d[quotien][reste];
1073 src_line += sfb_lines;
1074 des_line++;
1075
1076 reste = src_line % SSLIMIT;
1077 quotien = (int) ((src_line-reste)/SSLIMIT);
1078
1079 out_1d[des_line] = xr_1d[quotien][reste];
1080 src_line += sfb_lines;
1081 des_line++;
1082
1083 reste = src_line % SSLIMIT;
1084 quotien = (int) ((src_line-reste)/SSLIMIT);
1085
1086 out_1d[des_line] = xr_1d[quotien][reste];
1087 }
1088 }
1089
1090 } else { // pure short
1091 for(index=0;index<576;index++)
1092 {
1093 int j = reorder_table[sfreq][index];
1094 int reste = j % SSLIMIT;
1095 int quotien = (int) ((j-reste)/SSLIMIT);
1096 out_1d[index] = xr_1d[quotien][reste];
1097 }
1098 }
1099 }
1100 else { // long blocks
1101 for(index=0; index<576; index++)
1102 {
1103 // Modif E.B 02/22/99
1104 int reste = index % SSLIMIT;
1105 int quotien = (int) ((index-reste)/SSLIMIT);
1106 out_1d[index] = xr_1d[quotien][reste];
1107 }
1108 }
1109 }
1110
1111 /**
1112 *
1113 */
1114
1115 int[] is_pos = new int[576];
1116 float[] is_ratio = new float[576];
1117
1118 private void stereo(int gr)
1119 {
1120 int sb, ss;
1121
1122 if (channels == 1) { // mono , bypass xr[0][][] to lr[0][][]
1123
1124 for(sb=0;sb<SBLIMIT;sb++)
1125 for(ss=0;ss<SSLIMIT;ss+=3) {
1126 lr[0][sb][ss] = ro[0][sb][ss];
1127 lr[0][sb][ss+1] = ro[0][sb][ss+1];
1128 lr[0][sb][ss+2] = ro[0][sb][ss+2];
1129 }
1130
1131 } else {
1132
1133 gr_info_s gr_info = (si.ch[0].gr[gr]);
1134 int mode_ext = header.mode_extension();
1135 int sfb;
1136 int i;
1137 int lines, temp, temp2;
1138
1139 boolean ms_stereo = ((header.mode() == Header.JOINT_STEREO) && ((mode_ext & 0x2)!=0));
1140 boolean i_stereo = ((header.mode() == Header.JOINT_STEREO) && ((mode_ext & 0x1)!=0));
1141 boolean lsf = ((header.version() == Header.MPEG2_LSF || header.version() == Header.MPEG25_LSF )); // SZD
1142
1143 int io_type = (gr_info.scalefac_compress & 1);
1144
1145 // initialization
1146
1147 for (i=0; i<576; i++)
1148 {
1149 is_pos[i] = 7;
1150
1151 is_ratio[i] = 0.0f;
1152 }
1153
1154 if (i_stereo) {
1155 if ((gr_info.window_switching_flag !=0 )&& (gr_info.block_type == 2)) {
1156 if (gr_info.mixed_block_flag != 0) {
1157
1158 int max_sfb = 0;
1159
1160 for (int j=0; j<3; j++) {
1161 int sfbcnt;
1162 sfbcnt = 2;
1163 for( sfb=12; sfb >=3; sfb-- ) {
1164 i = sfBandIndex[sfreq].s[sfb];
1165 lines = sfBandIndex[sfreq].s[sfb+1] - i;
1166 i = (i << 2) - i + (j+1) * lines - 1;
1167
1168 while (lines > 0) {
1169 if (ro[1][i/18][i%18] != 0.0f) {
1170 // MDM: in java, array access is very slow.
1171 // Is quicker to compute div and mod values.
1172 //if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) {
1173 sfbcnt = sfb;
1174 sfb = -10;
1175 lines = -10;
1176 }
1177
1178 lines--;
1179 i--;
1180
1181 } // while (lines > 0)
1182
1183 } // for (sfb=12 ...
1184 sfb = sfbcnt + 1;
1185
1186 if (sfb > max_sfb)
1187 max_sfb = sfb;
1188
1189 while(sfb < 12) {
1190 temp = sfBandIndex[sfreq].s[sfb];
1191 sb = sfBandIndex[sfreq].s[sfb+1] - temp;
1192 i = (temp << 2) - temp + j * sb;
1193
1194 for ( ; sb > 0; sb--) {
1195 is_pos[i] = scalefac[1].s[j][sfb];
1196 if (is_pos[i] != 7)
1197 if (lsf)
1198 i_stereo_k_values(is_pos[i], io_type, i);
1199 else
1200 is_ratio[i] = TAN12[is_pos[i]];
1201
1202 i++;
1203 } // for (; sb>0...
1204 sfb++;
1205 } // while (sfb < 12)
1206 sfb = sfBandIndex[sfreq].s[10];
1207 sb = sfBandIndex[sfreq].s[11] - sfb;
1208 sfb = (sfb << 2) - sfb + j * sb;
1209 temp = sfBandIndex[sfreq].s[11];
1210 sb = sfBandIndex[sfreq].s[12] - temp;
1211 i = (temp << 2) - temp + j * sb;
1212
1213 for (; sb > 0; sb--) {
1214 is_pos[i] = is_pos[sfb];
1215
1216 if (lsf) {
1217 k[0][i] = k[0][sfb];
1218 k[1][i] = k[1][sfb];
1219 } else {
1220 is_ratio[i] = is_ratio[sfb];
1221 }
1222 i++;
1223 } // for (; sb > 0 ...
1224 }
1225 if (max_sfb <= 3) {
1226 i = 2;
1227 ss = 17;
1228 sb = -1;
1229 while (i >= 0) {
1230 if (ro[1][i][ss] != 0.0f) {
1231 sb = (i<<4) + (i<<1) + ss;
1232 i = -1;
1233 } else {
1234 ss--;
1235 if (ss < 0) {
1236 i--;
1237 ss = 17;
1238 }
1239 } // if (ro ...
1240 } // while (i>=0)
1241 i = 0;
1242 while (sfBandIndex[sfreq].l[i] <= sb)
1243 i++;
1244 sfb = i;
1245 i = sfBandIndex[sfreq].l[i];
1246 for (; sfb<8; sfb++) {
1247 sb = sfBandIndex[sfreq].l[sfb+1]-sfBandIndex[sfreq].l[sfb];
1248 for (; sb>0; sb--) {
1249 is_pos[i] = scalefac[1].l[sfb];
1250 if (is_pos[i] != 7)
1251 if (lsf)
1252 i_stereo_k_values(is_pos[i], io_type, i);
1253 else
1254 is_ratio[i] = TAN12[is_pos[i]];
1255 i++;
1256 } // for (; sb>0 ...
1257 } // for (; sfb<8 ...
1258 } // for (j=0 ...
1259 } else { // if (gr_info.mixed_block_flag)
1260 for (int j=0; j<3; j++) {
1261 int sfbcnt;
1262 sfbcnt = -1;
1263 for( sfb=12; sfb >=0; sfb-- )
1264 {
1265 temp = sfBandIndex[sfreq].s[sfb];
1266 lines = sfBandIndex[sfreq].s[sfb+1] - temp;
1267 i = (temp << 2) - temp + (j+1) * lines - 1;
1268
1269 while (lines > 0) {
1270 if (ro[1][i/18][i%18] != 0.0f) {
1271 // MDM: in java, array access is very slow.
1272 // Is quicker to compute div and mod values.
1273 //if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) {
1274 sfbcnt = sfb;
1275 sfb = -10;
1276 lines = -10;
1277 }
1278 lines--;
1279 i--;
1280 } // while (lines > 0) */
1281
1282 } // for (sfb=12 ...
1283 sfb = sfbcnt + 1;
1284 while(sfb<12) {
1285 temp = sfBandIndex[sfreq].s[sfb];
1286 sb = sfBandIndex[sfreq].s[sfb+1] - temp;
1287 i = (temp << 2) - temp + j * sb;
1288 for ( ; sb > 0; sb--) {
1289 is_pos[i] = scalefac[1].s[j][sfb];
1290 if (is_pos[i] != 7)
1291 if (lsf)
1292 i_stereo_k_values(is_pos[i], io_type, i);
1293 else
1294 is_ratio[i] = TAN12[is_pos[i]];
1295 i++;
1296 } // for (; sb>0 ...
1297 sfb++;
1298 } // while (sfb<12)
1299
1300 temp = sfBandIndex[sfreq].s[10];
1301 temp2= sfBandIndex[sfreq].s[11];
1302 sb = temp2 - temp;
1303 sfb = (temp << 2) - temp + j * sb;
1304 sb = sfBandIndex[sfreq].s[12] - temp2;
1305 i = (temp2 << 2) - temp2 + j * sb;
1306
1307 for (; sb>0; sb--) {
1308 is_pos[i] = is_pos[sfb];
1309
1310 if (lsf) {
1311 k[0][i] = k[0][sfb];
1312 k[1][i] = k[1][sfb];
1313 } else {
1314 is_ratio[i] = is_ratio[sfb];
1315 }
1316 i++;
1317 } // for (; sb>0 ...
1318 } // for (sfb=12
1319 } // for (j=0 ...
1320 } else { // if (gr_info.window_switching_flag ...
1321 i = 31;
1322 ss = 17;
1323 sb = 0;
1324 while (i >= 0) {
1325 if (ro[1][i][ss] != 0.0f) {
1326 sb = (i<<4) + (i<<1) + ss;
1327 i = -1;
1328 } else {
1329 ss--;
1330 if (ss < 0) {
1331 i--;
1332 ss = 17;
1333 }
1334 }
1335 }
1336 i = 0;
1337 while (sfBandIndex[sfreq].l[i] <= sb)
1338 i++;
1339
1340 sfb = i;
1341 i = sfBandIndex[sfreq].l[i];
1342 for (; sfb<21; sfb++) {
1343 sb = sfBandIndex[sfreq].l[sfb+1] - sfBandIndex[sfreq].l[sfb];
1344 for (; sb > 0; sb--) {
1345 is_pos[i] = scalefac[1].l[sfb];
1346 if (is_pos[i] != 7)
1347 if (lsf)
1348 i_stereo_k_values(is_pos[i], io_type, i);
1349 else
1350 is_ratio[i] = TAN12[is_pos[i]];
1351 i++;
1352 }
1353 }
1354 sfb = sfBandIndex[sfreq].l[20];
1355 for (sb = 576 - sfBandIndex[sfreq].l[21]; (sb > 0) && (i<576); sb--)
1356 {
1357 is_pos[i] = is_pos[sfb]; // error here : i >=576
1358
1359 if (lsf) {
1360 k[0][i] = k[0][sfb];
1361 k[1][i] = k[1][sfb];
1362 } else {
1363 is_ratio[i] = is_ratio[sfb];
1364 }
1365 i++;
1366 } // if (gr_info.mixed_block_flag)
1367 } // if (gr_info.window_switching_flag ...
1368 } // if (i_stereo)
1369
1370 i = 0;
1371 for(sb=0;sb<SBLIMIT;sb++)
1372 for(ss=0;ss<SSLIMIT;ss++) {
1373 if (is_pos[i] == 7) {
1374 if (ms_stereo) {
1375 lr[0][sb][ss] = (ro[0][sb][ss]+ro[1][sb][ss]) * 0.707106781f;
1376 lr[1][sb][ss] = (ro[0][sb][ss]-ro[1][sb][ss]) * 0.707106781f;
1377 } else {
1378 lr[0][sb][ss] = ro[0][sb][ss];
1379 lr[1][sb][ss] = ro[1][sb][ss];
1380 }
1381 }
1382 else if (i_stereo) {
1383
1384 if (lsf) {
1385 lr[0][sb][ss] = ro[0][sb][ss] * k[0][i];
1386 lr[1][sb][ss] = ro[0][sb][ss] * k[1][i];
1387 } else {
1388 lr[1][sb][ss] = ro[0][sb][ss] / (float) (1 + is_ratio[i]);
1389 lr[0][sb][ss] = lr[1][sb][ss] * is_ratio[i];
1390 }
1391 }
1392 /* else {
1393 System.out.println("Error in stereo processing\n");
1394 } */
1395 i++;
1396 }
1397
1398 } // channels == 2
1399
1400 }
1401
1402 /**
1403 *
1404 */
1405 private void antialias(int ch, int gr)
1406 {
1407 int sb18, ss, sb18lim;
1408 gr_info_s gr_info = (si.ch[ch].gr[gr]);
1409 // 31 alias-reduction operations between each pair of sub-bands
1410 // with 8 butterflies between each pair
1411
1412 if ((gr_info.window_switching_flag !=0) && (gr_info.block_type == 2) &&
1413 !(gr_info.mixed_block_flag != 0) )
1414 return;
1415
1416 if ((gr_info.window_switching_flag !=0) && (gr_info.mixed_block_flag != 0)&&
1417 (gr_info.block_type == 2)) {
1418 sb18lim = 18;
1419 } else {
1420 sb18lim = 558;
1421 }
1422
1423 for (sb18=0; sb18 < sb18lim; sb18+=18) {
1424 for (ss=0;ss<8;ss++) {
1425 int src_idx1 = sb18 + 17 - ss;
1426 int src_idx2 = sb18 + 18 + ss;
1427 float bu = out_1d[src_idx1];
1428 float bd = out_1d[src_idx2];
1429 out_1d[src_idx1] = (bu * cs[ss]) - (bd * ca[ss]);
1430 out_1d[src_idx2] = (bd * cs[ss]) + (bu * ca[ss]);
1431 }
1432 }
1433 }
1434
1435 /**
1436 *
1437 */
1438
1439 // MDM: tsOutCopy and rawout do not need initializing, so the arrays
1440 // can be reused.
1441 float[] tsOutCopy = new float[18];
1442 float[] rawout = new float[36];
1443
1444 private void hybrid(int ch, int gr)
1445 {
1446 int bt;
1447 int sb18;
1448 gr_info_s gr_info = (si.ch[ch].gr[gr]);
1449 float[] tsOut;
1450
1451 float[][] prvblk;
1452
1453 for(sb18=0;sb18<576;sb18+=18)
1454 {
1455 bt = ((gr_info.window_switching_flag !=0 ) && (gr_info.mixed_block_flag !=0) &&
1456 (sb18 < 36)) ? 0 : gr_info.block_type;
1457
1458 tsOut = out_1d;
1459 // Modif E.B 02/22/99
1460 for (int cc = 0;cc<18;cc++)
1461 tsOutCopy[cc] = tsOut[cc+sb18];
1462
1463 inv_mdct(tsOutCopy, rawout, bt);
1464
1465
1466 for (int cc = 0;cc<18;cc++)
1467 tsOut[cc+sb18] = tsOutCopy[cc];
1468 // Fin Modif
1469
1470 // overlap addition
1471 prvblk = prevblck;
1472
1473 tsOut[0 + sb18] = rawout[0] + prvblk[ch][sb18 + 0];
1474 prvblk[ch][sb18 + 0] = rawout[18];
1475 tsOut[1 + sb18] = rawout[1] + prvblk[ch][sb18 + 1];
1476 prvblk[ch][sb18 + 1] = rawout[19];
1477 tsOut[2 + sb18] = rawout[2] + prvblk[ch][sb18 + 2];
1478 prvblk[ch][sb18 + 2] = rawout[20];
1479 tsOut[3 + sb18] = rawout[3] + prvblk[ch][sb18 + 3];
1480 prvblk[ch][sb18 + 3] = rawout[21];
1481 tsOut[4 + sb18] = rawout[4] + prvblk[ch][sb18 + 4];
1482 prvblk[ch][sb18 + 4] = rawout[22];
1483 tsOut[5 + sb18] = rawout[5] + prvblk[ch][sb18 + 5];
1484 prvblk[ch][sb18 + 5] = rawout[23];
1485 tsOut[6 + sb18] = rawout[6] + prvblk[ch][sb18 + 6];
1486 prvblk[ch][sb18 + 6] = rawout[24];
1487 tsOut[7 + sb18] = rawout[7] + prvblk[ch][sb18 + 7];
1488 prvblk[ch][sb18 + 7] = rawout[25];
1489 tsOut[8 + sb18] = rawout[8] + prvblk[ch][sb18 + 8];
1490 prvblk[ch][sb18 + 8] = rawout[26];
1491 tsOut[9 + sb18] = rawout[9] + prvblk[ch][sb18 + 9];
1492 prvblk[ch][sb18 + 9] = rawout[27];
1493 tsOut[10 + sb18] = rawout[10] + prvblk[ch][sb18 + 10];
1494 prvblk[ch][sb18 + 10] = rawout[28];
1495 tsOut[11 + sb18] = rawout[11] + prvblk[ch][sb18 + 11];
1496 prvblk[ch][sb18 + 11] = rawout[29];
1497 tsOut[12 + sb18] = rawout[12] + prvblk[ch][sb18 + 12];
1498 prvblk[ch][sb18 + 12] = rawout[30];
1499 tsOut[13 + sb18] = rawout[13] + prvblk[ch][sb18 + 13];
1500 prvblk[ch][sb18 + 13] = rawout[31];
1501 tsOut[14 + sb18] = rawout[14] + prvblk[ch][sb18 + 14];
1502 prvblk[ch][sb18 + 14] = rawout[32];
1503 tsOut[15 + sb18] = rawout[15] + prvblk[ch][sb18 + 15];
1504 prvblk[ch][sb18 + 15] = rawout[33];
1505 tsOut[16 + sb18] = rawout[16] + prvblk[ch][sb18 + 16];
1506 prvblk[ch][sb18 + 16] = rawout[34];
1507 tsOut[17 + sb18] = rawout[17] + prvblk[ch][sb18 + 17];
1508 prvblk[ch][sb18 + 17] = rawout[35];
1509 }
1510 }
1511
1512 /**
1513 *
1514 */
1515 private void do_downmix()
1516 {
1517 for (int sb=0; sb<SSLIMIT; sb++) {
1518 for (int ss=0; ss<SSLIMIT; ss+=3) {
1519 lr[0][sb][ss] = (lr[0][sb][ss] + lr[1][sb][ss]) * 0.5f;
1520 lr[0][sb][ss+1] = (lr[0][sb][ss+1] + lr[1][sb][ss+1]) * 0.5f;
1521 lr[0][sb][ss+2] = (lr[0][sb][ss+2] + lr[1][sb][ss+2]) * 0.5f;
1522 }
1523 }
1524 }
1525
1526 /**
1527 * Fast INV_MDCT.
1528 */
1529
1530 public void inv_mdct(float[] in, float[] out, int block_type)
1531 {
1532 float[] win_bt;
1533 int i;
1534
1535 float tmpf_0, tmpf_1, tmpf_2, tmpf_3, tmpf_4, tmpf_5, tmpf_6, tmpf_7, tmpf_8, tmpf_9;
1536 float tmpf_10, tmpf_11, tmpf_12, tmpf_13, tmpf_14, tmpf_15, tmpf_16, tmpf_17;
1537
1538 tmpf_0 = tmpf_1 = tmpf_2 = tmpf_3 = tmpf_4 = tmpf_5 = tmpf_6 = tmpf_7 = tmpf_8 = tmpf_9 =
1539 tmpf_10 = tmpf_11 = tmpf_12 = tmpf_13 = tmpf_14 = tmpf_15 = tmpf_16 = tmpf_17 = 0.0f;
1540
1541
1542
1543 if(block_type == 2)
1544 {
1545
1546 /*
1547 *
1548 * Under MicrosoftVM 2922, This causes a GPF, or
1549 * At best, an ArrayIndexOutOfBoundsExceptin.
1550 for(int p=0;p<36;p+=9)
1551 {
1552 out[p] = out[p+1] = out[p+2] = out[p+3] =
1553 out[p+4] = out[p+5] = out[p+6] = out[p+7] =
1554 out[p+8] = 0.0f;
1555 }
1556 */
1557 out[0] = 0.0f;
1558 out[1] = 0.0f;
1559 out[2] = 0.0f;
1560 out[3] = 0.0f;
1561 out[4] = 0.0f;
1562 out[5] = 0.0f;
1563 out[6] = 0.0f;
1564 out[7] = 0.0f;
1565 out[8] = 0.0f;
1566 out[9] = 0.0f;
1567 out[10] = 0.0f;
1568 out[11] = 0.0f;
1569 out[12] = 0.0f;
1570 out[13] = 0.0f;
1571 out[14] = 0.0f;
1572 out[15] = 0.0f;
1573 out[16] = 0.0f;
1574 out[17] = 0.0f;
1575 out[18] = 0.0f;
1576 out[19] = 0.0f;
1577 out[20] = 0.0f;
1578 out[21] = 0.0f;
1579 out[22] = 0.0f;
1580 out[23] = 0.0f;
1581 out[24] = 0.0f;
1582 out[25] = 0.0f;
1583 out[26] = 0.0f;
1584 out[27] = 0.0f;
1585 out[28] = 0.0f;
1586 out[29] = 0.0f;
1587 out[30] = 0.0f;
1588 out[31] = 0.0f;
1589 out[32] = 0.0f;
1590 out[33] = 0.0f;
1591 out[34] = 0.0f;
1592 out[35] = 0.0f;
1593
1594 int six_i = 0;
1595
1596 for(i=0;i<3;i++)
1597 {
1598 // 12 point IMDCT
1599 // Begin 12 point IDCT
1600 // Input aliasing for 12 pt IDCT
1601 in[15+i] += in[12+i]; in[12+i] += in[9+i]; in[9+i] += in[6+i];
1602 in[6+i] += in[3+i]; in[3+i] += in[0+i];
1603
1604 // Input aliasing on odd indices (for 6 point IDCT)
1605 in[15+i] += in[9+i]; in[9+i] += in[3+i];
1606
1607 // 3 point IDCT on even indices
1608 float pp1, pp2, sum;
1609 pp2 = in[12+i] * 0.500000000f;
1610 pp1 = in[ 6+i] * 0.866025403f;
1611 sum = in[0+i] + pp2;
1612 tmpf_1 = in[0+i] - in[12+i];
1613 tmpf_0 = sum + pp1;
1614 tmpf_2 = sum - pp1;
1615
1616 // End 3 point IDCT on even indices
1617 // 3 point IDCT on odd indices (for 6 point IDCT)
1618 pp2 = in[15+i] * 0.500000000f;
1619 pp1 = in[ 9+i] * 0.866025403f;
1620 sum = in[ 3+i] + pp2;
1621 tmpf_4 = in[3+i] - in[15+i];
1622 tmpf_5 = sum + pp1;
1623 tmpf_3 = sum - pp1;
1624 // End 3 point IDCT on odd indices
1625 // Twiddle factors on odd indices (for 6 point IDCT)
1626
1627 tmpf_3 *= 1.931851653f;
1628 tmpf_4 *= 0.707106781f;
1629 tmpf_5 *= 0.517638090f;
1630
1631 // Output butterflies on 2 3 point IDCT's (for 6 point IDCT)
1632 float save = tmpf_0;
1633 tmpf_0 += tmpf_5;
1634 tmpf_5 = save - tmpf_5;
1635 save = tmpf_1;
1636 tmpf_1 += tmpf_4;
1637 tmpf_4 = save - tmpf_4;
1638 save = tmpf_2;
1639 tmpf_2 += tmpf_3;
1640 tmpf_3 = save - tmpf_3;
1641
1642 // End 6 point IDCT
1643 // Twiddle factors on indices (for 12 point IDCT)
1644
1645 tmpf_0 *= 0.504314480f;
1646 tmpf_1 *= 0.541196100f;
1647 tmpf_2 *= 0.630236207f;
1648 tmpf_3 *= 0.821339815f;
1649 tmpf_4 *= 1.306562965f;
1650 tmpf_5 *= 3.830648788f;
1651
1652 // End 12 point IDCT
1653
1654 // Shift to 12 point modified IDCT, multiply by window type 2
1655 tmpf_8 = -tmpf_0 * 0.793353340f;
1656 tmpf_9 = -tmpf_0 * 0.608761429f;
1657 tmpf_7 = -tmpf_1 * 0.923879532f;
1658 tmpf_10 = -tmpf_1 * 0.382683432f;
1659 tmpf_6 = -tmpf_2 * 0.991444861f;
1660 tmpf_11 = -tmpf_2 * 0.130526192f;
1661
1662 tmpf_0 = tmpf_3;
1663 tmpf_1 = tmpf_4 * 0.382683432f;
1664 tmpf_2 = tmpf_5 * 0.608761429f;
1665
1666 tmpf_3 = -tmpf_5 * 0.793353340f;
1667 tmpf_4 = -tmpf_4 * 0.923879532f;
1668 tmpf_5 = -tmpf_0 * 0.991444861f;
1669
1670 tmpf_0 *= 0.130526192f;
1671
1672 out[six_i + 6] += tmpf_0;
1673 out[six_i + 7] += tmpf_1;
1674 out[six_i + 8] += tmpf_2;
1675 out[six_i + 9] += tmpf_3;
1676 out[six_i + 10] += tmpf_4;
1677 out[six_i + 11] += tmpf_5;
1678 out[six_i + 12] += tmpf_6;
1679 out[six_i + 13] += tmpf_7;
1680 out[six_i + 14] += tmpf_8;
1681 out[six_i + 15] += tmpf_9;
1682 out[six_i + 16] += tmpf_10;
1683 out[six_i + 17] += tmpf_11;
1684
1685 six_i += 6;
1686 }
1687 }
1688 else
1689 {
1690 // 36 point IDCT
1691 // input aliasing for 36 point IDCT
1692 in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; in[14]+=in[13];
1693 in[13]+=in[12]; in[12]+=in[11]; in[11]+=in[10]; in[10]+=in[9];
1694 in[9] +=in[8]; in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5];
1695 in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; in[2] +=in[1];
1696 in[1] +=in[0];
1697
1698 // 18 point IDCT for odd indices
1699 // input aliasing for 18 point IDCT
1700 in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
1701 in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1];
1702
1703 float tmp0,tmp1,tmp2,tmp3,tmp4,tmp0_,tmp1_,tmp2_,tmp3_;
1704 float tmp0o,tmp1o,tmp2o,tmp3o,tmp4o,tmp0_o,tmp1_o,tmp2_o,tmp3_o;
1705
1706 // Fast 9 Point Inverse Discrete Cosine Transform
1707 //
1708 // By Francois-Raymond Boyer
1709 // mailto:boyerf@iro.umontreal.ca
1710 // http://www.iro.umontreal.ca/~boyerf
1711 //
1712 // The code has been optimized for Intel processors
1713 // (takes a lot of time to convert float to and from iternal FPU representation)
1714 //
1715 // It is a simple "factorization" of the IDCT matrix.
1716
1717 // 9 point IDCT on even indices
1718
1719 // 5 points on odd indices (not realy an IDCT)
1720 float i00 = in[0]+in[0];
1721 float iip12 = i00 + in[12];
1722
1723 tmp0 = iip12 + in[4]*1.8793852415718f + in[8]*1.532088886238f + in[16]*0.34729635533386f;
1724 tmp1 = i00 + in[4] - in[8] - in[12] - in[12] - in[16];
1725 tmp2 = iip12 - in[4]*0.34729635533386f - in[8]*1.8793852415718f + in[16]*1.532088886238f;
1726 tmp3 = iip12 - in[4]*1.532088886238f + in[8]*0.34729635533386f - in[16]*1.8793852415718f;
1727 tmp4 = in[0] - in[4] + in[8] - in[12] + in[16];
1728
1729 // 4 points on even indices
1730 float i66_ = in[6]*1.732050808f; // Sqrt[3]
1731
1732 tmp0_ = in[2]*1.9696155060244f + i66_ + in[10]*1.2855752193731f + in[14]*0.68404028665134f;
1733 tmp1_ = (in[2] - in[10] - in[14])*1.732050808f;
1734 tmp2_ = in[2]*1.2855752193731f - i66_ - in[10]*0.68404028665134f + in[14]*1.9696155060244f;
1735 tmp3_ = in[2]*0.68404028665134f - i66_ + in[10]*1.9696155060244f - in[14]*1.2855752193731f;
1736
1737 // 9 point IDCT on odd indices
1738 // 5 points on odd indices (not realy an IDCT)
1739 float i0 = in[0+1]+in[0+1];
1740 float i0p12 = i0 + in[12+1];
1741
1742 tmp0o = i0p12 + in[4+1]*1.8793852415718f + in[8+1]*1.532088886238f + in[16+1]*0.34729635533386f;
1743 tmp1o = i0 + in[4+1] - in[8+1] - in[12+1] - in[12+1] - in[16+1];
1744 tmp2o = i0p12 - in[4+1]*0.34729635533386f - in[8+1]*1.8793852415718f + in[16+1]*1.532088886238f;
1745 tmp3o = i0p12 - in[4+1]*1.532088886238f + in[8+1]*0.34729635533386f - in[16+1]*1.8793852415718f;
1746 tmp4o = (in[0+1] - in[4+1] + in[8+1] - in[12+1] + in[16+1])*0.707106781f; // Twiddled
1747
1748 // 4 points on even indices
1749 float i6_ = in[6+1]*1.732050808f; // Sqrt[3]
1750
1751 tmp0_o = in[2+1]*1.9696155060244f + i6_ + in[10+1]*1.2855752193731f + in[14+1]*0.68404028665134f;
1752 tmp1_o = (in[2+1] - in[10+1] - in[14+1])*1.732050808f;
1753 tmp2_o = in[2+1]*1.2855752193731f - i6_ - in[10+1]*0.68404028665134f + in[14+1]*1.9696155060244f;
1754 tmp3_o = in[2+1]*0.68404028665134f - i6_ + in[10+1]*1.9696155060244f - in[14+1]*1.2855752193731f;
1755
1756 // Twiddle factors on odd indices
1757 // and
1758 // Butterflies on 9 point IDCT's
1759 // and
1760 // twiddle factors for 36 point IDCT
1761
1762 float e, o;
1763 e = tmp0 + tmp0_; o = (tmp0o + tmp0_o)*0.501909918f; tmpf_0 = e + o; tmpf_17 = e - o;
1764 e = tmp1 + tmp1_; o = (tmp1o + tmp1_o)*0.517638090f; tmpf_1 = e + o; tmpf_16 = e - o;
1765 e = tmp2 + tmp2_; o = (tmp2o + tmp2_o)*0.551688959f; tmpf_2 = e + o; tmpf_15 = e - o;
1766 e = tmp3 + tmp3_; o = (tmp3o + tmp3_o)*0.610387294f; tmpf_3 = e + o; tmpf_14 = e - o;
1767 tmpf_4 = tmp4 + tmp4o; tmpf_13 = tmp4 - tmp4o;
1768 e = tmp3 - tmp3_; o = (tmp3o - tmp3_o)*0.871723397f; tmpf_5 = e + o; tmpf_12 = e - o;
1769 e = tmp2 - tmp2_; o = (tmp2o - tmp2_o)*1.183100792f; tmpf_6 = e + o; tmpf_11 = e - o;
1770 e = tmp1 - tmp1_; o = (tmp1o - tmp1_o)*1.931851653f; tmpf_7 = e + o; tmpf_10 = e - o;
1771 e = tmp0 - tmp0_; o = (tmp0o - tmp0_o)*5.736856623f; tmpf_8 = e + o; tmpf_9 = e - o;
1772
1773 // end 36 point IDCT */
1774 // shift to modified IDCT
1775 win_bt = win[block_type];
1776
1777 out[0] =-tmpf_9 * win_bt[0];
1778 out[1] =-tmpf_10 * win_bt[1];
1779 out[2] =-tmpf_11 * win_bt[2];
1780 out[3] =-tmpf_12 * win_bt[3];
1781 out[4] =-tmpf_13 * win_bt[4];
1782 out[5] =-tmpf_14 * win_bt[5];
1783 out[6] =-tmpf_15 * win_bt[6];
1784 out[7] =-tmpf_16 * win_bt[7];
1785 out[8] =-tmpf_17 * win_bt[8];
1786 out[9] = tmpf_17 * win_bt[9];
1787 out[10]= tmpf_16 * win_bt[10];
1788 out[11]= tmpf_15 * win_bt[11];
1789 out[12]= tmpf_14 * win_bt[12];
1790 out[13]= tmpf_13 * win_bt[13];
1791 out[14]= tmpf_12 * win_bt[14];
1792 out[15]= tmpf_11 * win_bt[15];
1793 out[16]= tmpf_10 * win_bt[16];
1794 out[17]= tmpf_9 * win_bt[17];
1795 out[18]= tmpf_8 * win_bt[18];
1796 out[19]= tmpf_7 * win_bt[19];
1797 out[20]= tmpf_6 * win_bt[20];
1798 out[21]= tmpf_5 * win_bt[21];
1799 out[22]= tmpf_4 * win_bt[22];
1800 out[23]= tmpf_3 * win_bt[23];
1801 out[24]= tmpf_2 * win_bt[24];
1802 out[25]= tmpf_1 * win_bt[25];
1803 out[26]= tmpf_0 * win_bt[26];
1804 out[27]= tmpf_0 * win_bt[27];
1805 out[28]= tmpf_1 * win_bt[28];
1806 out[29]= tmpf_2 * win_bt[29];
1807 out[30]= tmpf_3 * win_bt[30];
1808 out[31]= tmpf_4 * win_bt[31];
1809 out[32]= tmpf_5 * win_bt[32];
1810 out[33]= tmpf_6 * win_bt[33];
1811 out[34]= tmpf_7 * win_bt[34];
1812 out[35]= tmpf_8 * win_bt[35];
1813 }
1814 }
1815
1816 private int counter = 0;
1817 private static final int SSLIMIT=18;
1818 private static final int SBLIMIT=32;
1819 // Size of the table of whole numbers raised to 4/3 power.
1820 // This may be adjusted for performance without any problems.
1821 //public static final int POW_TABLE_LIMIT=512;
1822
1823 /************************************************************/
1824 /* L3TABLE */
1825 /************************************************************/
1826
1827 static class SBI
1828 {
1829 public int[] l;
1830 public int[] s;
1831
1832 public SBI()
1833 {
1834 l = new int[23];
1835 s = new int[14];
1836 }
1837 public SBI(int[] thel, int[] thes)
1838 {
1839 l = thel;
1840 s = thes;
1841 }
1842 }
1843
1844 static class gr_info_s
1845 {
1846 public int part2_3_length = 0;
1847 public int big_values = 0;
1848 public int global_gain = 0;
1849 public int scalefac_compress = 0;
1850 public int window_switching_flag = 0;
1851 public int block_type = 0;
1852 public int mixed_block_flag = 0;
1853 public int[] table_select;
1854 public int[] subblock_gain;
1855 public int region0_count = 0;
1856 public int region1_count = 0;
1857 public int preflag = 0;
1858 public int scalefac_scale = 0;
1859 public int count1table_select = 0;
1860
1861 /**
1862 * Dummy Constructor
1863 */
1864 public gr_info_s()
1865 {
1866 table_select = new int[3];
1867 subblock_gain = new int[3];
1868 }
1869 }
1870
1871 static class temporaire
1872 {
1873 public int[] scfsi;
1874 public gr_info_s[] gr;
1875
1876 /**
1877 * Dummy Constructor
1878 */
1879 public temporaire()
1880 {
1881 scfsi = new int[4];
1882 gr = new gr_info_s[2];
1883 gr[0] = new gr_info_s();
1884 gr[1] = new gr_info_s();
1885 }
1886 }
1887
1888 static class III_side_info_t
1889 {
1890
1891 public int main_data_begin = 0;
1892 public int private_bits = 0;
1893 public temporaire[] ch;
1894 /**
1895 * Dummy Constructor
1896 */
1897 public III_side_info_t()
1898 {
1899 ch = new temporaire[2];
1900 ch[0] = new temporaire();
1901 ch[1] = new temporaire();
1902 }
1903 }
1904
1905 static class temporaire2
1906 {
1907 public int[] l; /* [cb] */
1908 public int[][] s; /* [window][cb] */
1909
1910 /**
1911 * Dummy Constructor
1912 */
1913 public temporaire2()
1914 {
1915 l = new int[23];
1916 s = new int[3][13];
1917 }
1918 }
1919 //class III_scalefac_t
1920 //{
1921 // public temporaire2[] tab;
1922 // /**
1923 // * Dummy Constructor
1924 // */
1925 // public III_scalefac_t()
1926 // {
1927 // tab = new temporaire2[2];
1928 // }
1929 //}
1930
1931 private static final int slen[][] =
1932 {
1933 {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
1934 {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
1935 };
1936
1937 public static final int pretab[] =
1938 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0};
1939
1940 private SBI[] sfBandIndex; // Init in the constructor.
1941
1942 public static final float two_to_negative_half_pow[] =
1943 { 1.0000000000E+00f, 7.0710678119E-01f, 5.0000000000E-01f, 3.5355339059E-01f,
1944 2.5000000000E-01f, 1.7677669530E-01f, 1.2500000000E-01f, 8.8388347648E-02f,
1945 6.2500000000E-02f, 4.4194173824E-02f, 3.1250000000E-02f, 2.2097086912E-02f,
1946 1.5625000000E-02f, 1.1048543456E-02f, 7.8125000000E-03f, 5.5242717280E-03f,
1947 3.9062500000E-03f, 2.7621358640E-03f, 1.9531250000E-03f, 1.3810679320E-03f,
1948 9.7656250000E-04f, 6.9053396600E-04f, 4.8828125000E-04f, 3.4526698300E-04f,
1949 2.4414062500E-04f, 1.7263349150E-04f, 1.2207031250E-04f, 8.6316745750E-05f,
1950 6.1035156250E-05f, 4.3158372875E-05f, 3.0517578125E-05f, 2.1579186438E-05f,
1951 1.5258789062E-05f, 1.0789593219E-05f, 7.6293945312E-06f, 5.3947966094E-06f,
1952 3.8146972656E-06f, 2.6973983047E-06f, 1.9073486328E-06f, 1.3486991523E-06f,
1953 9.5367431641E-07f, 6.7434957617E-07f, 4.7683715820E-07f, 3.3717478809E-07f,
1954 2.3841857910E-07f, 1.6858739404E-07f, 1.1920928955E-07f, 8.4293697022E-08f,
1955 5.9604644775E-08f, 4.2146848511E-08f, 2.9802322388E-08f, 2.1073424255E-08f,
1956 1.4901161194E-08f, 1.0536712128E-08f, 7.4505805969E-09f, 5.2683560639E-09f,
1957 3.7252902985E-09f, 2.6341780319E-09f, 1.8626451492E-09f, 1.3170890160E-09f,
1958 9.3132257462E-10f, 6.5854450798E-10f, 4.6566128731E-10f, 3.2927225399E-10f
1959 };
1960
1961
1962 public static final float t_43[] = create_t_43();
1963
1964 static private float[] create_t_43()
1965 {
1966 float[] t43 = new float[8192];
1967 final double d43 = (4.0/3.0);
1968
1969 for (int i=0; i<8192; i++)
1970 {
1971 t43[i] = (float)Math.pow(i, d43);
1972 }
1973 return t43;
1974 }
1975
1976 public static final float io[][] =
1977 {
1978 { 1.0000000000E+00f, 8.4089641526E-01f, 7.0710678119E-01f, 5.9460355751E-01f,
1979 5.0000000001E-01f, 4.2044820763E-01f, 3.5355339060E-01f, 2.9730177876E-01f,
1980 2.5000000001E-01f, 2.1022410382E-01f, 1.7677669530E-01f, 1.4865088938E-01f,
1981 1.2500000000E-01f, 1.0511205191E-01f, 8.8388347652E-02f, 7.4325444691E-02f,
1982 6.2500000003E-02f, 5.2556025956E-02f, 4.4194173826E-02f, 3.7162722346E-02f,
1983 3.1250000002E-02f, 2.6278012978E-02f, 2.2097086913E-02f, 1.8581361173E-02f,
1984 1.5625000001E-02f, 1.3139006489E-02f, 1.1048543457E-02f, 9.2906805866E-03f,
1985 7.8125000006E-03f, 6.5695032447E-03f, 5.5242717285E-03f, 4.6453402934E-03f },
1986 { 1.0000000000E+00f, 7.0710678119E-01f, 5.0000000000E-01f, 3.5355339060E-01f,
1987 2.5000000000E-01f, 1.7677669530E-01f, 1.2500000000E-01f, 8.8388347650E-02f,
1988 6.2500000001E-02f, 4.4194173825E-02f, 3.1250000001E-02f, 2.2097086913E-02f,
1989 1.5625000000E-02f, 1.1048543456E-02f, 7.8125000002E-03f, 5.5242717282E-03f,
1990 3.9062500001E-03f, 2.7621358641E-03f, 1.9531250001E-03f, 1.3810679321E-03f,
1991 9.7656250004E-04f, 6.9053396603E-04f, 4.8828125002E-04f, 3.4526698302E-04f,
1992 2.4414062501E-04f, 1.7263349151E-04f, 1.2207031251E-04f, 8.6316745755E-05f,
1993 6.1035156254E-05f, 4.3158372878E-05f, 3.0517578127E-05f, 2.1579186439E-05f }
1994 };
1995
1996
1997
1998 public static final float TAN12[] =
1999 {
2000 0.0f, 0.26794919f, 0.57735027f, 1.0f,
2001 1.73205081f, 3.73205081f, 9.9999999e10f, -3.73205081f,
2002 -1.73205081f, -1.0f, -0.57735027f, -0.26794919f,
2003 0.0f, 0.26794919f, 0.57735027f, 1.0f
2004 };
2005
2006 // REVIEW: in java, the array lookup may well be slower than
2007 // the actual calculation
2008 // 576 / 18
2009/*
2010 private static final int ss_div[] =
2011 {
2012 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2013 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2014 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2015 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2016 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
2017 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
2018 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2019 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
2020 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
2021 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
2022 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
2023 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
2024 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
2025 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
2026 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
2027 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
2028 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
2029 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
2030 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
2031 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
2032 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
2033 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
2034 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
2035 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
2036 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
2037 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
2038 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
2039 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
2040 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
2041 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
2042 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
2043 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31
2044 };
2045
2046 // 576 % 18
2047 private static final int ss_mod[] =
2048 {
2049 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2050 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2051 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2052 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2053 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2054 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2055 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2056 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2057 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2058 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2059 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2060 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2061 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2062 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2063 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2064 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2065 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2066 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2067 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2068 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2069 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2070 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2071 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2072 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2073 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2074 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2075 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2076 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2077 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2078 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2079 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2080 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
2081 };
2082*/
2083 private static /*final*/ int reorder_table[][]/* = loadReorderTable()*/; // SZD: will be generated on demand
2084
2085 /**
2086 * Loads the data for the reorder
2087 */
2088 /*private static int[][] loadReorderTable() // SZD: table will be generated
2089 {
2090 try
2091 {
2092 Class elemType = int[][].class.getComponentType();
2093 Object o = JavaLayerUtils.deserializeArrayResource("l3reorder.ser", elemType, 6);
2094 return (int[][])o;
2095 }
2096 catch (IOException ex)
2097 {
2098 throw new ExceptionInInitializerError(ex);
2099 }
2100 }*/
2101
2102 static int[] reorder(int scalefac_band[]) { // SZD: converted from LAME
2103 int j = 0;
2104 int ix[] = new int[576];
2105 for(int sfb = 0; sfb < 13; sfb++) {
2106 int start = scalefac_band[sfb];
2107 int end = scalefac_band[sfb + 1];
2108 for(int window = 0; window < 3; window++)
2109 for(int i = start; i < end; i++)
2110 ix[3 * i + window] = j++;
2111 }
2112 return ix;
2113 }
2114
2115 /*static final int reorder_table_data[][]; =
2116 {
2117 { 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2118 17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2119 34, 27, 31, 35, 36, 42, 48, 37, 43, 49, 38, 44, 50, 39, 45, 51,
2120 40, 46, 52, 41, 47, 53, 54, 60, 66, 55, 61, 67, 56, 62, 68, 57,
2121 63, 69, 58, 64, 70, 59, 65, 71, 72, 80, 88, 73, 81, 89, 74, 82,
2122 90, 75, 83, 91, 76, 84, 92, 77, 85, 93, 78, 86, 94, 79, 87, 95,
2123 96,106,116, 97,107,117, 98,108,118, 99,109,119,100,110,120,101,
2124 111,121,102,112,122,103,113,123,104,114,124,105,115,125,126,140,
2125 154,127,141,155,128,142,156,129,143,157,130,144,158,131,145,159,
2126 132,146,160,133,147,161,134,148,162,135,149,163,136,150,164,137,
2127 151,165,138,152,166,139,153,167,168,186,204,169,187,205,170,188,
2128 206,171,189,207,172,190,208,173,191,209,174,192,210,175,193,211,
2129 176,194,212,177,195,213,178,196,214,179,197,215,180,198,216,181,
2130 199,217,182,200,218,183,201,219,184,202,220,185,203,221,222,248,
2131 274,223,249,275,224,250,276,225,251,277,226,252,278,227,253,279,
2132 228,254,280,229,255,281,230,256,282,231,257,283,232,258,284,233,
2133 259,285,234,260,286,235,261,287,236,262,288,237,263,289,238,264,
2134 290,239,265,291,240,266,292,241,267,293,242,268,294,243,269,295,
2135 244,270,296,245,271,297,246,272,298,247,273,299,300,332,364,301,
2136 333,365,302,334,366,303,335,367,304,336,368,305,337,369,306,338,
2137 370,307,339,371,308,340,372,309,341,373,310,342,374,311,343,375,
2138 312,344,376,313,345,377,314,346,378,315,347,379,316,348,380,317,
2139 349,381,318,350,382,319,351,383,320,352,384,321,353,385,322,354,
2140 386,323,355,387,324,356,388,325,357,389,326,358,390,327,359,391,
2141 328,360,392,329,361,393,330,362,394,331,363,395,396,438,480,397,
2142 439,481,398,440,482,399,441,483,400,442,484,401,443,485,402,444,
2143 486,403,445,487,404,446,488,405,447,489,406,448,490,407,449,491,
2144 408,450,492,409,451,493,410,452,494,411,453,495,412,454,496,413,
2145 455,497,414,456,498,415,457,499,416,458,500,417,459,501,418,460,
2146 502,419,461,503,420,462,504,421,463,505,422,464,506,423,465,507,
2147 424,466,508,425,467,509,426,468,510,427,469,511,428,470,512,429,
2148 471,513,430,472,514,431,473,515,432,474,516,433,475,517,434,476,
2149 518,435,477,519,436,478,520,437,479,521,522,540,558,523,541,559,
2150 524,542,560,525,543,561,526,544,562,527,545,563,528,546,564,529,
2151 547,565,530,548,566,531,549,567,532,550,568,533,551,569,534,552,
2152 570,535,553,571,536,554,572,537,555,573,538,556,574,539,557,575},
2153 { 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2154 17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2155 34, 27, 31, 35, 36, 42, 48, 37, 43, 49, 38, 44, 50, 39, 45, 51,
2156 40, 46, 52, 41, 47, 53, 54, 62, 70, 55, 63, 71, 56, 64, 72, 57,
2157 65, 73, 58, 66, 74, 59, 67, 75, 60, 68, 76, 61, 69, 77, 78, 88,
2158 98, 79, 89, 99, 80, 90,100, 81, 91,101, 82, 92,102, 83, 93,103,
2159 84, 94,104, 85, 95,105, 86, 96,106, 87, 97,107,108,120,132,109,
2160 121,133,110,122,134,111,123,135,112,124,136,113,125,137,114,126,
2161 138,115,127,139,116,128,140,117,129,141,118,130,142,119,131,143,
2162 144,158,172,145,159,173,146,160,174,147,161,175,148,162,176,149,
2163 163,177,150,164,178,151,165,179,152,166,180,153,167,181,154,168,
2164 182,155,169,183,156,170,184,157,171,185,186,204,222,187,205,223,
2165 188,206,224,189,207,225,190,208,226,191,209,227,192,210,228,193,
2166 211,229,194,212,230,195,213,231,196,214,232,197,215,233,198,216,
2167 234,199,217,235,200,218,236,201,219,237,202,220,238,203,221,239,
2168 240,264,288,241,265,289,242,266,290,243,267,291,244,268,292,245,
2169 269,293,246,270,294,247,271,295,248,272,296,249,273,297,250,274,
2170 298,251,275,299,252,276,300,253,277,301,254,278,302,255,279,303,
2171 256,280,304,257,281,305,258,282,306,259,283,307,260,284,308,261,
2172 285,309,262,286,310,263,287,311,312,344,376,313,345,377,314,346,
2173 378,315,347,379,316,348,380,317,349,381,318,350,382,319,351,383,
2174 320,352,384,321,353,385,322,354,386,323,355,387,324,356,388,325,
2175 357,389,326,358,390,327,359,391,328,360,392,329,361,393,330,362,
2176 394,331,363,395,332,364,396,333,365,397,334,366,398,335,367,399,
2177 336,368,400,337,369,401,338,370,402,339,371,403,340,372,404,341,
2178 373,405,342,374,406,343,375,407,408,452,496,409,453,497,410,454,
2179 498,411,455,499,412,456,500,413,457,501,414,458,502,415,459,503,
2180 416,460,504,417,461,505,418,462,506,419,463,507,420,464,508,421,
2181 465,509,422,466,510,423,467,511,424,468,512,425,469,513,426,470,
2182 514,427,471,515,428,472,516,429,473,517,430,474,518,431,475,519,
2183 432,476,520,433,477,521,434,478,522,435,479,523,436,480,524,437,
2184 481,525,438,482,526,439,483,527,440,484,528,441,485,529,442,486,
2185 530,443,487,531,444,488,532,445,489,533,446,490,534,447,491,535,
2186 448,492,536,449,493,537,450,494,538,451,495,539,540,552,564,541,
2187 553,565,542,554,566,543,555,567,544,556,568,545,557,569,546,558,
2188 570,547,559,571,548,560,572,549,561,573,550,562,574,551,563,575},
2189 { 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2190 17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2191 34, 27, 31, 35, 36, 42, 48, 37, 43, 49, 38, 44, 50, 39, 45, 51,
2192 40, 46, 52, 41, 47, 53, 54, 62, 70, 55, 63, 71, 56, 64, 72, 57,
2193 65, 73, 58, 66, 74, 59, 67, 75, 60, 68, 76, 61, 69, 77, 78, 88,
2194 98, 79, 89, 99, 80, 90,100, 81, 91,101, 82, 92,102, 83, 93,103,
2195 84, 94,104, 85, 95,105, 86, 96,106, 87, 97,107,108,120,132,109,
2196 121,133,110,122,134,111,123,135,112,124,136,113,125,137,114,126,
2197 138,115,127,139,116,128,140,117,129,141,118,130,142,119,131,143,
2198 144,158,172,145,159,173,146,160,174,147,161,175,148,162,176,149,
2199 163,177,150,164,178,151,165,179,152,166,180,153,167,181,154,168,
2200 182,155,169,183,156,170,184,157,171,185,186,204,222,187,205,223,
2201 188,206,224,189,207,225,190,208,226,191,209,227,192,210,228,193,
2202 211,229,194,212,230,195,213,231,196,214,232,197,215,233,198,216,
2203 234,199,217,235,200,218,236,201,219,237,202,220,238,203,221,239,
2204 240,264,288,241,265,289,242,266,290,243,267,291,244,268,292,245,
2205 269,293,246,270,294,247,271,295,248,272,296,249,273,297,250,274,
2206 298,251,275,299,252,276,300,253,277,301,254,278,302,255,279,303,
2207 256,280,304,257,281,305,258,282,306,259,283,307,260,284,308,261,
2208 285,309,262,286,310,263,287,311,312,342,372,313,343,373,314,344,
2209 374,315,345,375,316,346,376,317,347,377,318,348,378,319,349,379,
2210 320,350,380,321,351,381,322,352,382,323,353,383,324,354,384,325,
2211 355,385,326,356,386,327,357,387,328,358,388,329,359,389,330,360,
2212 390,331,361,391,332,362,392,333,363,393,334,364,394,335,365,395,
2213 336,366,396,337,367,397,338,368,398,339,369,399,340,370,400,341,
2214 371,401,402,442,482,403,443,483,404,444,484,405,445,485,406,446,
2215 486,407,447,487,408,448,488,409,449,489,410,450,490,411,451,491,
2216 412,452,492,413,453,493,414,454,494,415,455,495,416,456,496,417,
2217 457,497,418,458,498,419,459,499,420,460,500,421,461,501,422,462,
2218 502,423,463,503,424,464,504,425,465,505,426,466,506,427,467,507,
2219 428,468,508,429,469,509,430,470,510,431,471,511,432,472,512,433,
2220 473,513,434,474,514,435,475,515,436,476,516,437,477,517,438,478,
2221 518,439,479,519,440,480,520,441,481,521,522,540,558,523,541,559,
2222 524,542,560,525,543,561,526,544,562,527,545,563,528,546,564,529,
2223 547,565,530,548,566,531,549,567,532,550,568,533,551,569,534,552,
2224 570,535,553,571,536,554,572,537,555,573,538,556,574,539,557,575},
2225 { 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2226 17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2227 34, 27, 31, 35, 36, 40, 44, 37, 41, 45, 38, 42, 46, 39, 43, 47,
2228 48, 54, 60, 49, 55, 61, 50, 56, 62, 51, 57, 63, 52, 58, 64, 53,
2229 59, 65, 66, 74, 82, 67, 75, 83, 68, 76, 84, 69, 77, 85, 70, 78,
2230 86, 71, 79, 87, 72, 80, 88, 73, 81, 89, 90,100,110, 91,101,111,
2231 92,102,112, 93,103,113, 94,104,114, 95,105,115, 96,106,116, 97,
2232 107,117, 98,108,118, 99,109,119,120,132,144,121,133,145,122,134,
2233 146,123,135,147,124,136,148,125,137,149,126,138,150,127,139,151,
2234 128,140,152,129,141,153,130,142,154,131,143,155,156,170,184,157,
2235 171,185,158,172,186,159,173,187,160,174,188,161,175,189,162,176,
2236 190,163,177,191,164,178,192,165,179,193,166,180,194,167,181,195,
2237 168,182,196,169,183,197,198,216,234,199,217,235,200,218,236,201,
2238 219,237,202,220,238,203,221,239,204,222,240,205,223,241,206,224,
2239 242,207,225,243,208,226,244,209,227,245,210,228,246,211,229,247,
2240 212,230,248,213,231,249,214,232,250,215,233,251,252,274,296,253,
2241 275,297,254,276,298,255,277,299,256,278,300,257,279,301,258,280,
2242 302,259,281,303,260,282,304,261,283,305,262,284,306,263,285,307,
2243 264,286,308,265,287,309,266,288,310,267,289,311,268,290,312,269,
2244 291,313,270,292,314,271,293,315,272,294,316,273,295,317,318,348,
2245 378,319,349,379,320,350,380,321,351,381,322,352,382,323,353,383,
2246 324,354,384,325,355,385,326,356,386,327,357,387,328,358,388,329,
2247 359,389,330,360,390,331,361,391,332,362,392,333,363,393,334,364,
2248 394,335,365,395,336,366,396,337,367,397,338,368,398,339,369,399,
2249 340,370,400,341,371,401,342,372,402,343,373,403,344,374,404,345,
2250 375,405,346,376,406,347,377,407,408,464,520,409,465,521,410,466,
2251 522,411,467,523,412,468,524,413,469,525,414,470,526,415,471,527,
2252 416,472,528,417,473,529,418,474,530,419,475,531,420,476,532,421,
2253 477,533,422,478,534,423,479,535,424,480,536,425,481,537,426,482,
2254 538,427,483,539,428,484,540,429,485,541,430,486,542,431,487,543,
2255 432,488,544,433,489,545,434,490,546,435,491,547,436,492,548,437,
2256 493,549,438,494,550,439,495,551,440,496,552,441,497,553,442,498,
2257 554,443,499,555,444,500,556,445,501,557,446,502,558,447,503,559,
2258 448,504,560,449,505,561,450,506,562,451,507,563,452,508,564,453,
2259 509,565,454,510,566,455,511,567,456,512,568,457,513,569,458,514,
2260 570,459,515,571,460,516,572,461,517,573,462,518,574,463,519,575},
2261 { 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2262 17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2263 34, 27, 31, 35, 36, 40, 44, 37, 41, 45, 38, 42, 46, 39, 43, 47,
2264 48, 54, 60, 49, 55, 61, 50, 56, 62, 51, 57, 63, 52, 58, 64, 53,
2265 59, 65, 66, 72, 78, 67, 73, 79, 68, 74, 80, 69, 75, 81, 70, 76,
2266 82, 71, 77, 83, 84, 94,104, 85, 95,105, 86, 96,106, 87, 97,107,
2267 88, 98,108, 89, 99,109, 90,100,110, 91,101,111, 92,102,112, 93,
2268 103,113,114,126,138,115,127,139,116,128,140,117,129,141,118,130,
2269 142,119,131,143,120,132,144,121,133,145,122,134,146,123,135,147,
2270 124,136,148,125,137,149,150,164,178,151,165,179,152,166,180,153,
2271 167,181,154,168,182,155,169,183,156,170,184,157,171,185,158,172,
2272 186,159,173,187,160,174,188,161,175,189,162,176,190,163,177,191,
2273 192,208,224,193,209,225,194,210,226,195,211,227,196,212,228,197,
2274 213,229,198,214,230,199,215,231,200,216,232,201,217,233,202,218,
2275 234,203,219,235,204,220,236,205,221,237,206,222,238,207,223,239,
2276 240,260,280,241,261,281,242,262,282,243,263,283,244,264,284,245,
2277 265,285,246,266,286,247,267,287,248,268,288,249,269,289,250,270,
2278 290,251,271,291,252,272,292,253,273,293,254,274,294,255,275,295,
2279 256,276,296,257,277,297,258,278,298,259,279,299,300,326,352,301,
2280 327,353,302,328,354,303,329,355,304,330,356,305,331,357,306,332,
2281 358,307,333,359,308,334,360,309,335,361,310,336,362,311,337,363,
2282 312,338,364,313,339,365,314,340,366,315,341,367,316,342,368,317,
2283 343,369,318,344,370,319,345,371,320,346,372,321,347,373,322,348,
2284 374,323,349,375,324,350,376,325,351,377,378,444,510,379,445,511,
2285 380,446,512,381,447,513,382,448,514,383,449,515,384,450,516,385,
2286 451,517,386,452,518,387,453,519,388,454,520,389,455,521,390,456,
2287 522,391,457,523,392,458,524,393,459,525,394,460,526,395,461,527,
2288 396,462,528,397,463,529,398,464,530,399,465,531,400,466,532,401,
2289 467,533,402,468,534,403,469,535,404,470,536,405,471,537,406,472,
2290 538,407,473,539,408,474,540,409,475,541,410,476,542,411,477,543,
2291 412,478,544,413,479,545,414,480,546,415,481,547,416,482,548,417,
2292 483,549,418,484,550,419,485,551,420,486,552,421,487,553,422,488,
2293 554,423,489,555,424,490,556,425,491,557,426,492,558,427,493,559,
2294 428,494,560,429,495,561,430,496,562,431,497,563,432,498,564,433,
2295 499,565,434,500,566,435,501,567,436,502,568,437,503,569,438,504,
2296 570,439,505,571,440,506,572,441,507,573,442,508,574,443,509,575},
2297 { 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2298 17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2299 34, 27, 31, 35, 36, 40, 44, 37, 41, 45, 38, 42, 46, 39, 43, 47,
2300 48, 54, 60, 49, 55, 61, 50, 56, 62, 51, 57, 63, 52, 58, 64, 53,
2301 59, 65, 66, 74, 82, 67, 75, 83, 68, 76, 84, 69, 77, 85, 70, 78,
2302 86, 71, 79, 87, 72, 80, 88, 73, 81, 89, 90,102,114, 91,103,115,
2303 92,104,116, 93,105,117, 94,106,118, 95,107,119, 96,108,120, 97,
2304 109,121, 98,110,122, 99,111,123,100,112,124,101,113,125,126,142,
2305 158,127,143,159,128,144,160,129,145,161,130,146,162,131,147,163,
2306 132,148,164,133,149,165,134,150,166,135,151,167,136,152,168,137,
2307 153,169,138,154,170,139,155,171,140,156,172,141,157,173,174,194,
2308 214,175,195,215,176,196,216,177,197,217,178,198,218,179,199,219,
2309 180,200,220,181,201,221,182,202,222,183,203,223,184,204,224,185,
2310 205,225,186,206,226,187,207,227,188,208,228,189,209,229,190,210,
2311 230,191,211,231,192,212,232,193,213,233,234,260,286,235,261,287,
2312 236,262,288,237,263,289,238,264,290,239,265,291,240,266,292,241,
2313 267,293,242,268,294,243,269,295,244,270,296,245,271,297,246,272,
2314 298,247,273,299,248,274,300,249,275,301,250,276,302,251,277,303,
2315 252,278,304,253,279,305,254,280,306,255,281,307,256,282,308,257,
2316 283,309,258,284,310,259,285,311,312,346,380,313,347,381,314,348,
2317 382,315,349,383,316,350,384,317,351,385,318,352,386,319,353,387,
2318 320,354,388,321,355,389,322,356,390,323,357,391,324,358,392,325,
2319 359,393,326,360,394,327,361,395,328,362,396,329,363,397,330,364,
2320 398,331,365,399,332,366,400,333,367,401,334,368,402,335,369,403,
2321 336,370,404,337,371,405,338,372,406,339,373,407,340,374,408,341,
2322 375,409,342,376,410,343,377,411,344,378,412,345,379,413,414,456,
2323 498,415,457,499,416,458,500,417,459,501,418,460,502,419,461,503,
2324 420,462,504,421,463,505,422,464,506,423,465,507,424,466,508,425,
2325 467,509,426,468,510,427,469,511,428,470,512,429,471,513,430,472,
2326 514,431,473,515,432,474,516,433,475,517,434,476,518,435,477,519,
2327 436,478,520,437,479,521,438,480,522,439,481,523,440,482,524,441,
2328 483,525,442,484,526,443,485,527,444,486,528,445,487,529,446,488,
2329 530,447,489,531,448,490,532,449,491,533,450,492,534,451,493,535,
2330 452,494,536,453,495,537,454,496,538,455,497,539,540,552,564,541,
2331 553,565,542,554,566,543,555,567,544,556,568,545,557,569,546,558,
2332 570,547,559,571,548,560,572,549,561,573,550,562,574,551,563,575}
2333 };
2334*/
2335
2336 private static final float cs[] =
2337 {
2338 0.857492925712f, 0.881741997318f, 0.949628649103f, 0.983314592492f,
2339 0.995517816065f, 0.999160558175f, 0.999899195243f, 0.999993155067f
2340 };
2341
2342 private static final float ca[] =
2343 {
2344 -0.5144957554270f, -0.4717319685650f, -0.3133774542040f, -0.1819131996110f,
2345 -0.0945741925262f, -0.0409655828852f, -0.0141985685725f, -0.00369997467375f
2346 };
2347
2348 /************************************************************/
2349 /* END OF L3TABLE */
2350 /************************************************************/
2351
2352 /************************************************************/
2353 /* L3TYPE */
2354 /************************************************************/
2355
2356
2357 /***************************************************************/
2358 /* END OF L3TYPE */
2359 /***************************************************************/
2360
2361 /***************************************************************/
2362 /* INV_MDCT */
2363 /***************************************************************/
2364 public static final float win[][] =
2365 {
2366 { -1.6141214951E-02f, -5.3603178919E-02f, -1.0070713296E-01f, -1.6280817573E-01f,
2367 -4.9999999679E-01f, -3.8388735032E-01f, -6.2061144372E-01f, -1.1659756083E+00f,
2368 -3.8720752656E+00f, -4.2256286556E+00f, -1.5195289984E+00f, -9.7416483388E-01f,
2369 -7.3744074053E-01f, -1.2071067773E+00f, -5.1636156596E-01f, -4.5426052317E-01f,
2370 -4.0715656898E-01f, -3.6969460527E-01f, -3.3876269197E-01f, -3.1242222492E-01f,
2371 -2.8939587111E-01f, -2.6880081906E-01f, -5.0000000266E-01f, -2.3251417468E-01f,
2372 -2.1596714708E-01f, -2.0004979098E-01f, -1.8449493497E-01f, -1.6905846094E-01f,
2373 -1.5350360518E-01f, -1.3758624925E-01f, -1.2103922149E-01f, -2.0710679058E-01f,
2374 -8.4752577594E-02f, -6.4157525656E-02f, -4.1131172614E-02f, -1.4790705759E-02f },
2375
2376 { -1.6141214951E-02f, -5.3603178919E-02f, -1.0070713296E-01f, -1.6280817573E-01f,
2377 -4.9999999679E-01f, -3.8388735032E-01f, -6.2061144372E-01f, -1.1659756083E+00f,
2378 -3.8720752656E+00f, -4.2256286556E+00f, -1.5195289984E+00f, -9.7416483388E-01f,
2379 -7.3744074053E-01f, -1.2071067773E+00f, -5.1636156596E-01f, -4.5426052317E-01f,
2380 -4.0715656898E-01f, -3.6969460527E-01f, -3.3908542600E-01f, -3.1511810350E-01f,
2381 -2.9642226150E-01f, -2.8184548650E-01f, -5.4119610000E-01f, -2.6213228100E-01f,
2382 -2.5387916537E-01f, -2.3296291359E-01f, -1.9852728987E-01f, -1.5233534808E-01f,
2383 -9.6496400054E-02f, -3.3423828516E-02f, 0.0000000000E+00f, 0.0000000000E+00f,
2384 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f },
2385
2386 { -4.8300800645E-02f, -1.5715656932E-01f, -2.8325045177E-01f, -4.2953747763E-01f,
2387 -1.2071067795E+00f, -8.2426483178E-01f, -1.1451749106E+00f, -1.7695290101E+00f,
2388 -4.5470225061E+00f, -3.4890531002E+00f, -7.3296292804E-01f, -1.5076514758E-01f,
2389 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2390 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2391 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2392 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2393 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2394 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f },
2395
2396 { 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2397 0.0000000000E+00f, 0.0000000000E+00f, -1.5076513660E-01f, -7.3296291107E-01f,
2398 -3.4890530566E+00f, -4.5470224727E+00f, -1.7695290031E+00f, -1.1451749092E+00f,
2399 -8.3137738100E-01f, -1.3065629650E+00f, -5.4142014250E-01f, -4.6528974900E-01f,
2400 -4.1066990750E-01f, -3.7004680800E-01f, -3.3876269197E-01f, -3.1242222492E-01f,
2401 -2.8939587111E-01f, -2.6880081906E-01f, -5.0000000266E-01f, -2.3251417468E-01f,
2402 -2.1596714708E-01f, -2.0004979098E-01f, -1.8449493497E-01f, -1.6905846094E-01f,
2403 -1.5350360518E-01f, -1.3758624925E-01f, -1.2103922149E-01f, -2.0710679058E-01f,
2404 -8.4752577594E-02f, -6.4157525656E-02f, -4.1131172614E-02f, -1.4790705759E-02f }
2405 };
2406 /***************************************************************/
2407 /* END OF INV_MDCT */
2408 /***************************************************************/
2409
2410 class Sftable
2411 {
2412 public int[] l;
2413 public int[] s;
2414
2415 public Sftable()
2416 {
2417 l = new int[5];
2418 s = new int[3];
2419 }
2420
2421 public Sftable(int[] thel, int[] thes)
2422 {
2423 l = thel;
2424 s = thes;
2425 }
2426 }
2427
2428 public Sftable sftable;
2429
2430 public static final int nr_of_sfb_block[][][] =
2431 {{{ 6, 5, 5, 5} , { 9, 9, 9, 9} , { 6, 9, 9, 9}},
2432 {{ 6, 5, 7, 3} , { 9, 9,12, 6} , { 6, 9,12, 6}},
2433 {{11,10, 0, 0} , {18,18, 0, 0} , {15,18, 0, 0}},
2434 {{ 7, 7, 7, 0} , {12,12,12, 0} , { 6,15,12, 0}},
2435 {{ 6, 6, 6, 3} , {12, 9, 9, 6} , { 6,12, 9, 6}},
2436 {{ 8, 8, 5, 0} , {15,12, 9, 0} , { 6,18, 9, 0}}};
2437
2438
2439}