Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lDEVinux
GitHub Repository: lDEVinux/eaglercraft
Path: blob/main/src/lwjgl/java/javazoom/jl/decoder/LayerIIIDecoder.java
8650 views
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, [email protected]
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
35
package javazoom.jl.decoder;
36
37
/**
38
* Class Implementing Layer 3 Decoding.
39
*
40
* @since 0.0
41
*/
42
final class LayerIIIDecoder implements FrameDecoder
43
{
44
static 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
System.arraycopy(tsOut, 0 + sb18, tsOutCopy, 0, 18);
1461
1462
inv_mdct(tsOutCopy, rawout, bt);
1463
1464
System.arraycopy(tsOutCopy, 0, tsOut, 0 + sb18, 18);
1465
// Fin Modif
1466
1467
// overlap addition
1468
prvblk = prevblck;
1469
1470
tsOut[0 + sb18] = rawout[0] + prvblk[ch][sb18 + 0];
1471
prvblk[ch][sb18 + 0] = rawout[18];
1472
tsOut[1 + sb18] = rawout[1] + prvblk[ch][sb18 + 1];
1473
prvblk[ch][sb18 + 1] = rawout[19];
1474
tsOut[2 + sb18] = rawout[2] + prvblk[ch][sb18 + 2];
1475
prvblk[ch][sb18 + 2] = rawout[20];
1476
tsOut[3 + sb18] = rawout[3] + prvblk[ch][sb18 + 3];
1477
prvblk[ch][sb18 + 3] = rawout[21];
1478
tsOut[4 + sb18] = rawout[4] + prvblk[ch][sb18 + 4];
1479
prvblk[ch][sb18 + 4] = rawout[22];
1480
tsOut[5 + sb18] = rawout[5] + prvblk[ch][sb18 + 5];
1481
prvblk[ch][sb18 + 5] = rawout[23];
1482
tsOut[6 + sb18] = rawout[6] + prvblk[ch][sb18 + 6];
1483
prvblk[ch][sb18 + 6] = rawout[24];
1484
tsOut[7 + sb18] = rawout[7] + prvblk[ch][sb18 + 7];
1485
prvblk[ch][sb18 + 7] = rawout[25];
1486
tsOut[8 + sb18] = rawout[8] + prvblk[ch][sb18 + 8];
1487
prvblk[ch][sb18 + 8] = rawout[26];
1488
tsOut[9 + sb18] = rawout[9] + prvblk[ch][sb18 + 9];
1489
prvblk[ch][sb18 + 9] = rawout[27];
1490
tsOut[10 + sb18] = rawout[10] + prvblk[ch][sb18 + 10];
1491
prvblk[ch][sb18 + 10] = rawout[28];
1492
tsOut[11 + sb18] = rawout[11] + prvblk[ch][sb18 + 11];
1493
prvblk[ch][sb18 + 11] = rawout[29];
1494
tsOut[12 + sb18] = rawout[12] + prvblk[ch][sb18 + 12];
1495
prvblk[ch][sb18 + 12] = rawout[30];
1496
tsOut[13 + sb18] = rawout[13] + prvblk[ch][sb18 + 13];
1497
prvblk[ch][sb18 + 13] = rawout[31];
1498
tsOut[14 + sb18] = rawout[14] + prvblk[ch][sb18 + 14];
1499
prvblk[ch][sb18 + 14] = rawout[32];
1500
tsOut[15 + sb18] = rawout[15] + prvblk[ch][sb18 + 15];
1501
prvblk[ch][sb18 + 15] = rawout[33];
1502
tsOut[16 + sb18] = rawout[16] + prvblk[ch][sb18 + 16];
1503
prvblk[ch][sb18 + 16] = rawout[34];
1504
tsOut[17 + sb18] = rawout[17] + prvblk[ch][sb18 + 17];
1505
prvblk[ch][sb18 + 17] = rawout[35];
1506
}
1507
}
1508
1509
/**
1510
*
1511
*/
1512
private void do_downmix()
1513
{
1514
for (int sb=0; sb<SSLIMIT; sb++) {
1515
for (int ss=0; ss<SSLIMIT; ss+=3) {
1516
lr[0][sb][ss] = (lr[0][sb][ss] + lr[1][sb][ss]) * 0.5f;
1517
lr[0][sb][ss+1] = (lr[0][sb][ss+1] + lr[1][sb][ss+1]) * 0.5f;
1518
lr[0][sb][ss+2] = (lr[0][sb][ss+2] + lr[1][sb][ss+2]) * 0.5f;
1519
}
1520
}
1521
}
1522
1523
/**
1524
* Fast INV_MDCT.
1525
*/
1526
1527
public void inv_mdct(float[] in, float[] out, int block_type)
1528
{
1529
float[] win_bt;
1530
int i;
1531
1532
float tmpf_0, tmpf_1, tmpf_2, tmpf_3, tmpf_4, tmpf_5, tmpf_6, tmpf_7, tmpf_8, tmpf_9;
1533
float tmpf_10, tmpf_11, tmpf_12, tmpf_13, tmpf_14, tmpf_15, tmpf_16, tmpf_17;
1534
1535
tmpf_0 = tmpf_1 = tmpf_2 = tmpf_3 = tmpf_4 = tmpf_5 = tmpf_6 = tmpf_7 = tmpf_8 = tmpf_9 =
1536
tmpf_10 = tmpf_11 = tmpf_12 = tmpf_13 = tmpf_14 = tmpf_15 = tmpf_16 = tmpf_17 = 0.0f;
1537
1538
1539
1540
if(block_type == 2)
1541
{
1542
1543
/*
1544
*
1545
* Under MicrosoftVM 2922, This causes a GPF, or
1546
* At best, an ArrayIndexOutOfBoundsExceptin.
1547
for(int p=0;p<36;p+=9)
1548
{
1549
out[p] = out[p+1] = out[p+2] = out[p+3] =
1550
out[p+4] = out[p+5] = out[p+6] = out[p+7] =
1551
out[p+8] = 0.0f;
1552
}
1553
*/
1554
out[0] = 0.0f;
1555
out[1] = 0.0f;
1556
out[2] = 0.0f;
1557
out[3] = 0.0f;
1558
out[4] = 0.0f;
1559
out[5] = 0.0f;
1560
out[6] = 0.0f;
1561
out[7] = 0.0f;
1562
out[8] = 0.0f;
1563
out[9] = 0.0f;
1564
out[10] = 0.0f;
1565
out[11] = 0.0f;
1566
out[12] = 0.0f;
1567
out[13] = 0.0f;
1568
out[14] = 0.0f;
1569
out[15] = 0.0f;
1570
out[16] = 0.0f;
1571
out[17] = 0.0f;
1572
out[18] = 0.0f;
1573
out[19] = 0.0f;
1574
out[20] = 0.0f;
1575
out[21] = 0.0f;
1576
out[22] = 0.0f;
1577
out[23] = 0.0f;
1578
out[24] = 0.0f;
1579
out[25] = 0.0f;
1580
out[26] = 0.0f;
1581
out[27] = 0.0f;
1582
out[28] = 0.0f;
1583
out[29] = 0.0f;
1584
out[30] = 0.0f;
1585
out[31] = 0.0f;
1586
out[32] = 0.0f;
1587
out[33] = 0.0f;
1588
out[34] = 0.0f;
1589
out[35] = 0.0f;
1590
1591
int six_i = 0;
1592
1593
for(i=0;i<3;i++)
1594
{
1595
// 12 point IMDCT
1596
// Begin 12 point IDCT
1597
// Input aliasing for 12 pt IDCT
1598
in[15+i] += in[12+i]; in[12+i] += in[9+i]; in[9+i] += in[6+i];
1599
in[6+i] += in[3+i]; in[3+i] += in[0+i];
1600
1601
// Input aliasing on odd indices (for 6 point IDCT)
1602
in[15+i] += in[9+i]; in[9+i] += in[3+i];
1603
1604
// 3 point IDCT on even indices
1605
float pp1, pp2, sum;
1606
pp2 = in[12+i] * 0.500000000f;
1607
pp1 = in[ 6+i] * 0.866025403f;
1608
sum = in[0+i] + pp2;
1609
tmpf_1 = in[0+i] - in[12+i];
1610
tmpf_0 = sum + pp1;
1611
tmpf_2 = sum - pp1;
1612
1613
// End 3 point IDCT on even indices
1614
// 3 point IDCT on odd indices (for 6 point IDCT)
1615
pp2 = in[15+i] * 0.500000000f;
1616
pp1 = in[ 9+i] * 0.866025403f;
1617
sum = in[ 3+i] + pp2;
1618
tmpf_4 = in[3+i] - in[15+i];
1619
tmpf_5 = sum + pp1;
1620
tmpf_3 = sum - pp1;
1621
// End 3 point IDCT on odd indices
1622
// Twiddle factors on odd indices (for 6 point IDCT)
1623
1624
tmpf_3 *= 1.931851653f;
1625
tmpf_4 *= 0.707106781f;
1626
tmpf_5 *= 0.517638090f;
1627
1628
// Output butterflies on 2 3 point IDCT's (for 6 point IDCT)
1629
float save = tmpf_0;
1630
tmpf_0 += tmpf_5;
1631
tmpf_5 = save - tmpf_5;
1632
save = tmpf_1;
1633
tmpf_1 += tmpf_4;
1634
tmpf_4 = save - tmpf_4;
1635
save = tmpf_2;
1636
tmpf_2 += tmpf_3;
1637
tmpf_3 = save - tmpf_3;
1638
1639
// End 6 point IDCT
1640
// Twiddle factors on indices (for 12 point IDCT)
1641
1642
tmpf_0 *= 0.504314480f;
1643
tmpf_1 *= 0.541196100f;
1644
tmpf_2 *= 0.630236207f;
1645
tmpf_3 *= 0.821339815f;
1646
tmpf_4 *= 1.306562965f;
1647
tmpf_5 *= 3.830648788f;
1648
1649
// End 12 point IDCT
1650
1651
// Shift to 12 point modified IDCT, multiply by window type 2
1652
tmpf_8 = -tmpf_0 * 0.793353340f;
1653
tmpf_9 = -tmpf_0 * 0.608761429f;
1654
tmpf_7 = -tmpf_1 * 0.923879532f;
1655
tmpf_10 = -tmpf_1 * 0.382683432f;
1656
tmpf_6 = -tmpf_2 * 0.991444861f;
1657
tmpf_11 = -tmpf_2 * 0.130526192f;
1658
1659
tmpf_0 = tmpf_3;
1660
tmpf_1 = tmpf_4 * 0.382683432f;
1661
tmpf_2 = tmpf_5 * 0.608761429f;
1662
1663
tmpf_3 = -tmpf_5 * 0.793353340f;
1664
tmpf_4 = -tmpf_4 * 0.923879532f;
1665
tmpf_5 = -tmpf_0 * 0.991444861f;
1666
1667
tmpf_0 *= 0.130526192f;
1668
1669
out[six_i + 6] += tmpf_0;
1670
out[six_i + 7] += tmpf_1;
1671
out[six_i + 8] += tmpf_2;
1672
out[six_i + 9] += tmpf_3;
1673
out[six_i + 10] += tmpf_4;
1674
out[six_i + 11] += tmpf_5;
1675
out[six_i + 12] += tmpf_6;
1676
out[six_i + 13] += tmpf_7;
1677
out[six_i + 14] += tmpf_8;
1678
out[six_i + 15] += tmpf_9;
1679
out[six_i + 16] += tmpf_10;
1680
out[six_i + 17] += tmpf_11;
1681
1682
six_i += 6;
1683
}
1684
}
1685
else
1686
{
1687
// 36 point IDCT
1688
// input aliasing for 36 point IDCT
1689
in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; in[14]+=in[13];
1690
in[13]+=in[12]; in[12]+=in[11]; in[11]+=in[10]; in[10]+=in[9];
1691
in[9] +=in[8]; in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5];
1692
in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; in[2] +=in[1];
1693
in[1] +=in[0];
1694
1695
// 18 point IDCT for odd indices
1696
// input aliasing for 18 point IDCT
1697
in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
1698
in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1];
1699
1700
float tmp0,tmp1,tmp2,tmp3,tmp4,tmp0_,tmp1_,tmp2_,tmp3_;
1701
float tmp0o,tmp1o,tmp2o,tmp3o,tmp4o,tmp0_o,tmp1_o,tmp2_o,tmp3_o;
1702
1703
// Fast 9 Point Inverse Discrete Cosine Transform
1704
//
1705
// By Francois-Raymond Boyer
1706
// mailto:[email protected]
1707
// http://www.iro.umontreal.ca/~boyerf
1708
//
1709
// The code has been optimized for Intel processors
1710
// (takes a lot of time to convert float to and from iternal FPU representation)
1711
//
1712
// It is a simple "factorization" of the IDCT matrix.
1713
1714
// 9 point IDCT on even indices
1715
1716
// 5 points on odd indices (not realy an IDCT)
1717
float i00 = in[0]+in[0];
1718
float iip12 = i00 + in[12];
1719
1720
tmp0 = iip12 + in[4]*1.8793852415718f + in[8]*1.532088886238f + in[16]*0.34729635533386f;
1721
tmp1 = i00 + in[4] - in[8] - in[12] - in[12] - in[16];
1722
tmp2 = iip12 - in[4]*0.34729635533386f - in[8]*1.8793852415718f + in[16]*1.532088886238f;
1723
tmp3 = iip12 - in[4]*1.532088886238f + in[8]*0.34729635533386f - in[16]*1.8793852415718f;
1724
tmp4 = in[0] - in[4] + in[8] - in[12] + in[16];
1725
1726
// 4 points on even indices
1727
float i66_ = in[6]*1.732050808f; // Sqrt[3]
1728
1729
tmp0_ = in[2]*1.9696155060244f + i66_ + in[10]*1.2855752193731f + in[14]*0.68404028665134f;
1730
tmp1_ = (in[2] - in[10] - in[14])*1.732050808f;
1731
tmp2_ = in[2]*1.2855752193731f - i66_ - in[10]*0.68404028665134f + in[14]*1.9696155060244f;
1732
tmp3_ = in[2]*0.68404028665134f - i66_ + in[10]*1.9696155060244f - in[14]*1.2855752193731f;
1733
1734
// 9 point IDCT on odd indices
1735
// 5 points on odd indices (not realy an IDCT)
1736
float i0 = in[0+1]+in[0+1];
1737
float i0p12 = i0 + in[12+1];
1738
1739
tmp0o = i0p12 + in[4+1]*1.8793852415718f + in[8+1]*1.532088886238f + in[16+1]*0.34729635533386f;
1740
tmp1o = i0 + in[4+1] - in[8+1] - in[12+1] - in[12+1] - in[16+1];
1741
tmp2o = i0p12 - in[4+1]*0.34729635533386f - in[8+1]*1.8793852415718f + in[16+1]*1.532088886238f;
1742
tmp3o = i0p12 - in[4+1]*1.532088886238f + in[8+1]*0.34729635533386f - in[16+1]*1.8793852415718f;
1743
tmp4o = (in[0+1] - in[4+1] + in[8+1] - in[12+1] + in[16+1])*0.707106781f; // Twiddled
1744
1745
// 4 points on even indices
1746
float i6_ = in[6+1]*1.732050808f; // Sqrt[3]
1747
1748
tmp0_o = in[2+1]*1.9696155060244f + i6_ + in[10+1]*1.2855752193731f + in[14+1]*0.68404028665134f;
1749
tmp1_o = (in[2+1] - in[10+1] - in[14+1])*1.732050808f;
1750
tmp2_o = in[2+1]*1.2855752193731f - i6_ - in[10+1]*0.68404028665134f + in[14+1]*1.9696155060244f;
1751
tmp3_o = in[2+1]*0.68404028665134f - i6_ + in[10+1]*1.9696155060244f - in[14+1]*1.2855752193731f;
1752
1753
// Twiddle factors on odd indices
1754
// and
1755
// Butterflies on 9 point IDCT's
1756
// and
1757
// twiddle factors for 36 point IDCT
1758
1759
float e, o;
1760
e = tmp0 + tmp0_; o = (tmp0o + tmp0_o)*0.501909918f; tmpf_0 = e + o; tmpf_17 = e - o;
1761
e = tmp1 + tmp1_; o = (tmp1o + tmp1_o)*0.517638090f; tmpf_1 = e + o; tmpf_16 = e - o;
1762
e = tmp2 + tmp2_; o = (tmp2o + tmp2_o)*0.551688959f; tmpf_2 = e + o; tmpf_15 = e - o;
1763
e = tmp3 + tmp3_; o = (tmp3o + tmp3_o)*0.610387294f; tmpf_3 = e + o; tmpf_14 = e - o;
1764
tmpf_4 = tmp4 + tmp4o; tmpf_13 = tmp4 - tmp4o;
1765
e = tmp3 - tmp3_; o = (tmp3o - tmp3_o)*0.871723397f; tmpf_5 = e + o; tmpf_12 = e - o;
1766
e = tmp2 - tmp2_; o = (tmp2o - tmp2_o)*1.183100792f; tmpf_6 = e + o; tmpf_11 = e - o;
1767
e = tmp1 - tmp1_; o = (tmp1o - tmp1_o)*1.931851653f; tmpf_7 = e + o; tmpf_10 = e - o;
1768
e = tmp0 - tmp0_; o = (tmp0o - tmp0_o)*5.736856623f; tmpf_8 = e + o; tmpf_9 = e - o;
1769
1770
// end 36 point IDCT */
1771
// shift to modified IDCT
1772
win_bt = win[block_type];
1773
1774
out[0] =-tmpf_9 * win_bt[0];
1775
out[1] =-tmpf_10 * win_bt[1];
1776
out[2] =-tmpf_11 * win_bt[2];
1777
out[3] =-tmpf_12 * win_bt[3];
1778
out[4] =-tmpf_13 * win_bt[4];
1779
out[5] =-tmpf_14 * win_bt[5];
1780
out[6] =-tmpf_15 * win_bt[6];
1781
out[7] =-tmpf_16 * win_bt[7];
1782
out[8] =-tmpf_17 * win_bt[8];
1783
out[9] = tmpf_17 * win_bt[9];
1784
out[10]= tmpf_16 * win_bt[10];
1785
out[11]= tmpf_15 * win_bt[11];
1786
out[12]= tmpf_14 * win_bt[12];
1787
out[13]= tmpf_13 * win_bt[13];
1788
out[14]= tmpf_12 * win_bt[14];
1789
out[15]= tmpf_11 * win_bt[15];
1790
out[16]= tmpf_10 * win_bt[16];
1791
out[17]= tmpf_9 * win_bt[17];
1792
out[18]= tmpf_8 * win_bt[18];
1793
out[19]= tmpf_7 * win_bt[19];
1794
out[20]= tmpf_6 * win_bt[20];
1795
out[21]= tmpf_5 * win_bt[21];
1796
out[22]= tmpf_4 * win_bt[22];
1797
out[23]= tmpf_3 * win_bt[23];
1798
out[24]= tmpf_2 * win_bt[24];
1799
out[25]= tmpf_1 * win_bt[25];
1800
out[26]= tmpf_0 * win_bt[26];
1801
out[27]= tmpf_0 * win_bt[27];
1802
out[28]= tmpf_1 * win_bt[28];
1803
out[29]= tmpf_2 * win_bt[29];
1804
out[30]= tmpf_3 * win_bt[30];
1805
out[31]= tmpf_4 * win_bt[31];
1806
out[32]= tmpf_5 * win_bt[32];
1807
out[33]= tmpf_6 * win_bt[33];
1808
out[34]= tmpf_7 * win_bt[34];
1809
out[35]= tmpf_8 * win_bt[35];
1810
}
1811
}
1812
1813
private int counter = 0;
1814
private static final int SSLIMIT=18;
1815
private static final int SBLIMIT=32;
1816
// Size of the table of whole numbers raised to 4/3 power.
1817
// This may be adjusted for performance without any problems.
1818
//public static final int POW_TABLE_LIMIT=512;
1819
1820
/************************************************************/
1821
/* L3TABLE */
1822
/************************************************************/
1823
1824
static class SBI
1825
{
1826
public int[] l;
1827
public int[] s;
1828
1829
public SBI()
1830
{
1831
l = new int[23];
1832
s = new int[14];
1833
}
1834
public SBI(int[] thel, int[] thes)
1835
{
1836
l = thel;
1837
s = thes;
1838
}
1839
}
1840
1841
static class gr_info_s
1842
{
1843
public int part2_3_length = 0;
1844
public int big_values = 0;
1845
public int global_gain = 0;
1846
public int scalefac_compress = 0;
1847
public int window_switching_flag = 0;
1848
public int block_type = 0;
1849
public int mixed_block_flag = 0;
1850
public int[] table_select;
1851
public int[] subblock_gain;
1852
public int region0_count = 0;
1853
public int region1_count = 0;
1854
public int preflag = 0;
1855
public int scalefac_scale = 0;
1856
public int count1table_select = 0;
1857
1858
/**
1859
* Dummy Constructor
1860
*/
1861
public gr_info_s()
1862
{
1863
table_select = new int[3];
1864
subblock_gain = new int[3];
1865
}
1866
}
1867
1868
static class temporaire
1869
{
1870
public int[] scfsi;
1871
public gr_info_s[] gr;
1872
1873
/**
1874
* Dummy Constructor
1875
*/
1876
public temporaire()
1877
{
1878
scfsi = new int[4];
1879
gr = new gr_info_s[2];
1880
gr[0] = new gr_info_s();
1881
gr[1] = new gr_info_s();
1882
}
1883
}
1884
1885
static class III_side_info_t
1886
{
1887
1888
public int main_data_begin = 0;
1889
public int private_bits = 0;
1890
public temporaire[] ch;
1891
/**
1892
* Dummy Constructor
1893
*/
1894
public III_side_info_t()
1895
{
1896
ch = new temporaire[2];
1897
ch[0] = new temporaire();
1898
ch[1] = new temporaire();
1899
}
1900
}
1901
1902
static class temporaire2
1903
{
1904
public int[] l; /* [cb] */
1905
public int[][] s; /* [window][cb] */
1906
1907
/**
1908
* Dummy Constructor
1909
*/
1910
public temporaire2()
1911
{
1912
l = new int[23];
1913
s = new int[3][13];
1914
}
1915
}
1916
//class III_scalefac_t
1917
//{
1918
// public temporaire2[] tab;
1919
// /**
1920
// * Dummy Constructor
1921
// */
1922
// public III_scalefac_t()
1923
// {
1924
// tab = new temporaire2[2];
1925
// }
1926
//}
1927
1928
private static final int slen[][] =
1929
{
1930
{0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
1931
{0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
1932
};
1933
1934
public static final int pretab[] =
1935
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0};
1936
1937
private SBI[] sfBandIndex; // Init in the constructor.
1938
1939
public static final float two_to_negative_half_pow[] =
1940
{ 1.0000000000E+00f, 7.0710678119E-01f, 5.0000000000E-01f, 3.5355339059E-01f,
1941
2.5000000000E-01f, 1.7677669530E-01f, 1.2500000000E-01f, 8.8388347648E-02f,
1942
6.2500000000E-02f, 4.4194173824E-02f, 3.1250000000E-02f, 2.2097086912E-02f,
1943
1.5625000000E-02f, 1.1048543456E-02f, 7.8125000000E-03f, 5.5242717280E-03f,
1944
3.9062500000E-03f, 2.7621358640E-03f, 1.9531250000E-03f, 1.3810679320E-03f,
1945
9.7656250000E-04f, 6.9053396600E-04f, 4.8828125000E-04f, 3.4526698300E-04f,
1946
2.4414062500E-04f, 1.7263349150E-04f, 1.2207031250E-04f, 8.6316745750E-05f,
1947
6.1035156250E-05f, 4.3158372875E-05f, 3.0517578125E-05f, 2.1579186438E-05f,
1948
1.5258789062E-05f, 1.0789593219E-05f, 7.6293945312E-06f, 5.3947966094E-06f,
1949
3.8146972656E-06f, 2.6973983047E-06f, 1.9073486328E-06f, 1.3486991523E-06f,
1950
9.5367431641E-07f, 6.7434957617E-07f, 4.7683715820E-07f, 3.3717478809E-07f,
1951
2.3841857910E-07f, 1.6858739404E-07f, 1.1920928955E-07f, 8.4293697022E-08f,
1952
5.9604644775E-08f, 4.2146848511E-08f, 2.9802322388E-08f, 2.1073424255E-08f,
1953
1.4901161194E-08f, 1.0536712128E-08f, 7.4505805969E-09f, 5.2683560639E-09f,
1954
3.7252902985E-09f, 2.6341780319E-09f, 1.8626451492E-09f, 1.3170890160E-09f,
1955
9.3132257462E-10f, 6.5854450798E-10f, 4.6566128731E-10f, 3.2927225399E-10f
1956
};
1957
1958
1959
public static final float t_43[] = create_t_43();
1960
1961
static private float[] create_t_43()
1962
{
1963
float[] t43 = new float[8192];
1964
final double d43 = (4.0/3.0);
1965
1966
for (int i=0; i<8192; i++)
1967
{
1968
t43[i] = (float)Math.pow(i, d43);
1969
}
1970
return t43;
1971
}
1972
1973
public static final float io[][] =
1974
{
1975
{ 1.0000000000E+00f, 8.4089641526E-01f, 7.0710678119E-01f, 5.9460355751E-01f,
1976
5.0000000001E-01f, 4.2044820763E-01f, 3.5355339060E-01f, 2.9730177876E-01f,
1977
2.5000000001E-01f, 2.1022410382E-01f, 1.7677669530E-01f, 1.4865088938E-01f,
1978
1.2500000000E-01f, 1.0511205191E-01f, 8.8388347652E-02f, 7.4325444691E-02f,
1979
6.2500000003E-02f, 5.2556025956E-02f, 4.4194173826E-02f, 3.7162722346E-02f,
1980
3.1250000002E-02f, 2.6278012978E-02f, 2.2097086913E-02f, 1.8581361173E-02f,
1981
1.5625000001E-02f, 1.3139006489E-02f, 1.1048543457E-02f, 9.2906805866E-03f,
1982
7.8125000006E-03f, 6.5695032447E-03f, 5.5242717285E-03f, 4.6453402934E-03f },
1983
{ 1.0000000000E+00f, 7.0710678119E-01f, 5.0000000000E-01f, 3.5355339060E-01f,
1984
2.5000000000E-01f, 1.7677669530E-01f, 1.2500000000E-01f, 8.8388347650E-02f,
1985
6.2500000001E-02f, 4.4194173825E-02f, 3.1250000001E-02f, 2.2097086913E-02f,
1986
1.5625000000E-02f, 1.1048543456E-02f, 7.8125000002E-03f, 5.5242717282E-03f,
1987
3.9062500001E-03f, 2.7621358641E-03f, 1.9531250001E-03f, 1.3810679321E-03f,
1988
9.7656250004E-04f, 6.9053396603E-04f, 4.8828125002E-04f, 3.4526698302E-04f,
1989
2.4414062501E-04f, 1.7263349151E-04f, 1.2207031251E-04f, 8.6316745755E-05f,
1990
6.1035156254E-05f, 4.3158372878E-05f, 3.0517578127E-05f, 2.1579186439E-05f }
1991
};
1992
1993
1994
1995
public static final float TAN12[] =
1996
{
1997
0.0f, 0.26794919f, 0.57735027f, 1.0f,
1998
1.73205081f, 3.73205081f, 9.9999999e10f, -3.73205081f,
1999
-1.73205081f, -1.0f, -0.57735027f, -0.26794919f,
2000
0.0f, 0.26794919f, 0.57735027f, 1.0f
2001
};
2002
2003
// REVIEW: in java, the array lookup may well be slower than
2004
// the actual calculation
2005
// 576 / 18
2006
/*
2007
private static final int ss_div[] =
2008
{
2009
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2010
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2011
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2012
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2013
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
2014
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
2015
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2016
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
2017
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
2018
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
2019
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
2020
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
2021
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
2022
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
2023
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
2024
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
2025
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
2026
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
2027
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
2028
19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
2029
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
2030
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
2031
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
2032
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
2033
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
2034
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
2035
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
2036
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
2037
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
2038
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
2039
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
2040
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31
2041
};
2042
2043
// 576 % 18
2044
private static final int ss_mod[] =
2045
{
2046
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2047
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2048
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
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
};
2079
*/
2080
private static /*final*/ int reorder_table[][]/* = loadReorderTable()*/; // SZD: will be generated on demand
2081
2082
/**
2083
* Loads the data for the reorder
2084
*/
2085
/*private static int[][] loadReorderTable() // SZD: table will be generated
2086
{
2087
try
2088
{
2089
Class elemType = int[][].class.getComponentType();
2090
Object o = JavaLayerUtils.deserializeArrayResource("l3reorder.ser", elemType, 6);
2091
return (int[][])o;
2092
}
2093
catch (IOException ex)
2094
{
2095
throw new ExceptionInInitializerError(ex);
2096
}
2097
}*/
2098
2099
static int[] reorder(int scalefac_band[]) { // SZD: converted from LAME
2100
int j = 0;
2101
int ix[] = new int[576];
2102
for(int sfb = 0; sfb < 13; sfb++) {
2103
int start = scalefac_band[sfb];
2104
int end = scalefac_band[sfb + 1];
2105
for(int window = 0; window < 3; window++)
2106
for(int i = start; i < end; i++)
2107
ix[3 * i + window] = j++;
2108
}
2109
return ix;
2110
}
2111
2112
/*static final int reorder_table_data[][]; =
2113
{
2114
{ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2115
17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2116
34, 27, 31, 35, 36, 42, 48, 37, 43, 49, 38, 44, 50, 39, 45, 51,
2117
40, 46, 52, 41, 47, 53, 54, 60, 66, 55, 61, 67, 56, 62, 68, 57,
2118
63, 69, 58, 64, 70, 59, 65, 71, 72, 80, 88, 73, 81, 89, 74, 82,
2119
90, 75, 83, 91, 76, 84, 92, 77, 85, 93, 78, 86, 94, 79, 87, 95,
2120
96,106,116, 97,107,117, 98,108,118, 99,109,119,100,110,120,101,
2121
111,121,102,112,122,103,113,123,104,114,124,105,115,125,126,140,
2122
154,127,141,155,128,142,156,129,143,157,130,144,158,131,145,159,
2123
132,146,160,133,147,161,134,148,162,135,149,163,136,150,164,137,
2124
151,165,138,152,166,139,153,167,168,186,204,169,187,205,170,188,
2125
206,171,189,207,172,190,208,173,191,209,174,192,210,175,193,211,
2126
176,194,212,177,195,213,178,196,214,179,197,215,180,198,216,181,
2127
199,217,182,200,218,183,201,219,184,202,220,185,203,221,222,248,
2128
274,223,249,275,224,250,276,225,251,277,226,252,278,227,253,279,
2129
228,254,280,229,255,281,230,256,282,231,257,283,232,258,284,233,
2130
259,285,234,260,286,235,261,287,236,262,288,237,263,289,238,264,
2131
290,239,265,291,240,266,292,241,267,293,242,268,294,243,269,295,
2132
244,270,296,245,271,297,246,272,298,247,273,299,300,332,364,301,
2133
333,365,302,334,366,303,335,367,304,336,368,305,337,369,306,338,
2134
370,307,339,371,308,340,372,309,341,373,310,342,374,311,343,375,
2135
312,344,376,313,345,377,314,346,378,315,347,379,316,348,380,317,
2136
349,381,318,350,382,319,351,383,320,352,384,321,353,385,322,354,
2137
386,323,355,387,324,356,388,325,357,389,326,358,390,327,359,391,
2138
328,360,392,329,361,393,330,362,394,331,363,395,396,438,480,397,
2139
439,481,398,440,482,399,441,483,400,442,484,401,443,485,402,444,
2140
486,403,445,487,404,446,488,405,447,489,406,448,490,407,449,491,
2141
408,450,492,409,451,493,410,452,494,411,453,495,412,454,496,413,
2142
455,497,414,456,498,415,457,499,416,458,500,417,459,501,418,460,
2143
502,419,461,503,420,462,504,421,463,505,422,464,506,423,465,507,
2144
424,466,508,425,467,509,426,468,510,427,469,511,428,470,512,429,
2145
471,513,430,472,514,431,473,515,432,474,516,433,475,517,434,476,
2146
518,435,477,519,436,478,520,437,479,521,522,540,558,523,541,559,
2147
524,542,560,525,543,561,526,544,562,527,545,563,528,546,564,529,
2148
547,565,530,548,566,531,549,567,532,550,568,533,551,569,534,552,
2149
570,535,553,571,536,554,572,537,555,573,538,556,574,539,557,575},
2150
{ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2151
17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2152
34, 27, 31, 35, 36, 42, 48, 37, 43, 49, 38, 44, 50, 39, 45, 51,
2153
40, 46, 52, 41, 47, 53, 54, 62, 70, 55, 63, 71, 56, 64, 72, 57,
2154
65, 73, 58, 66, 74, 59, 67, 75, 60, 68, 76, 61, 69, 77, 78, 88,
2155
98, 79, 89, 99, 80, 90,100, 81, 91,101, 82, 92,102, 83, 93,103,
2156
84, 94,104, 85, 95,105, 86, 96,106, 87, 97,107,108,120,132,109,
2157
121,133,110,122,134,111,123,135,112,124,136,113,125,137,114,126,
2158
138,115,127,139,116,128,140,117,129,141,118,130,142,119,131,143,
2159
144,158,172,145,159,173,146,160,174,147,161,175,148,162,176,149,
2160
163,177,150,164,178,151,165,179,152,166,180,153,167,181,154,168,
2161
182,155,169,183,156,170,184,157,171,185,186,204,222,187,205,223,
2162
188,206,224,189,207,225,190,208,226,191,209,227,192,210,228,193,
2163
211,229,194,212,230,195,213,231,196,214,232,197,215,233,198,216,
2164
234,199,217,235,200,218,236,201,219,237,202,220,238,203,221,239,
2165
240,264,288,241,265,289,242,266,290,243,267,291,244,268,292,245,
2166
269,293,246,270,294,247,271,295,248,272,296,249,273,297,250,274,
2167
298,251,275,299,252,276,300,253,277,301,254,278,302,255,279,303,
2168
256,280,304,257,281,305,258,282,306,259,283,307,260,284,308,261,
2169
285,309,262,286,310,263,287,311,312,344,376,313,345,377,314,346,
2170
378,315,347,379,316,348,380,317,349,381,318,350,382,319,351,383,
2171
320,352,384,321,353,385,322,354,386,323,355,387,324,356,388,325,
2172
357,389,326,358,390,327,359,391,328,360,392,329,361,393,330,362,
2173
394,331,363,395,332,364,396,333,365,397,334,366,398,335,367,399,
2174
336,368,400,337,369,401,338,370,402,339,371,403,340,372,404,341,
2175
373,405,342,374,406,343,375,407,408,452,496,409,453,497,410,454,
2176
498,411,455,499,412,456,500,413,457,501,414,458,502,415,459,503,
2177
416,460,504,417,461,505,418,462,506,419,463,507,420,464,508,421,
2178
465,509,422,466,510,423,467,511,424,468,512,425,469,513,426,470,
2179
514,427,471,515,428,472,516,429,473,517,430,474,518,431,475,519,
2180
432,476,520,433,477,521,434,478,522,435,479,523,436,480,524,437,
2181
481,525,438,482,526,439,483,527,440,484,528,441,485,529,442,486,
2182
530,443,487,531,444,488,532,445,489,533,446,490,534,447,491,535,
2183
448,492,536,449,493,537,450,494,538,451,495,539,540,552,564,541,
2184
553,565,542,554,566,543,555,567,544,556,568,545,557,569,546,558,
2185
570,547,559,571,548,560,572,549,561,573,550,562,574,551,563,575},
2186
{ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2187
17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2188
34, 27, 31, 35, 36, 42, 48, 37, 43, 49, 38, 44, 50, 39, 45, 51,
2189
40, 46, 52, 41, 47, 53, 54, 62, 70, 55, 63, 71, 56, 64, 72, 57,
2190
65, 73, 58, 66, 74, 59, 67, 75, 60, 68, 76, 61, 69, 77, 78, 88,
2191
98, 79, 89, 99, 80, 90,100, 81, 91,101, 82, 92,102, 83, 93,103,
2192
84, 94,104, 85, 95,105, 86, 96,106, 87, 97,107,108,120,132,109,
2193
121,133,110,122,134,111,123,135,112,124,136,113,125,137,114,126,
2194
138,115,127,139,116,128,140,117,129,141,118,130,142,119,131,143,
2195
144,158,172,145,159,173,146,160,174,147,161,175,148,162,176,149,
2196
163,177,150,164,178,151,165,179,152,166,180,153,167,181,154,168,
2197
182,155,169,183,156,170,184,157,171,185,186,204,222,187,205,223,
2198
188,206,224,189,207,225,190,208,226,191,209,227,192,210,228,193,
2199
211,229,194,212,230,195,213,231,196,214,232,197,215,233,198,216,
2200
234,199,217,235,200,218,236,201,219,237,202,220,238,203,221,239,
2201
240,264,288,241,265,289,242,266,290,243,267,291,244,268,292,245,
2202
269,293,246,270,294,247,271,295,248,272,296,249,273,297,250,274,
2203
298,251,275,299,252,276,300,253,277,301,254,278,302,255,279,303,
2204
256,280,304,257,281,305,258,282,306,259,283,307,260,284,308,261,
2205
285,309,262,286,310,263,287,311,312,342,372,313,343,373,314,344,
2206
374,315,345,375,316,346,376,317,347,377,318,348,378,319,349,379,
2207
320,350,380,321,351,381,322,352,382,323,353,383,324,354,384,325,
2208
355,385,326,356,386,327,357,387,328,358,388,329,359,389,330,360,
2209
390,331,361,391,332,362,392,333,363,393,334,364,394,335,365,395,
2210
336,366,396,337,367,397,338,368,398,339,369,399,340,370,400,341,
2211
371,401,402,442,482,403,443,483,404,444,484,405,445,485,406,446,
2212
486,407,447,487,408,448,488,409,449,489,410,450,490,411,451,491,
2213
412,452,492,413,453,493,414,454,494,415,455,495,416,456,496,417,
2214
457,497,418,458,498,419,459,499,420,460,500,421,461,501,422,462,
2215
502,423,463,503,424,464,504,425,465,505,426,466,506,427,467,507,
2216
428,468,508,429,469,509,430,470,510,431,471,511,432,472,512,433,
2217
473,513,434,474,514,435,475,515,436,476,516,437,477,517,438,478,
2218
518,439,479,519,440,480,520,441,481,521,522,540,558,523,541,559,
2219
524,542,560,525,543,561,526,544,562,527,545,563,528,546,564,529,
2220
547,565,530,548,566,531,549,567,532,550,568,533,551,569,534,552,
2221
570,535,553,571,536,554,572,537,555,573,538,556,574,539,557,575},
2222
{ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2223
17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2224
34, 27, 31, 35, 36, 40, 44, 37, 41, 45, 38, 42, 46, 39, 43, 47,
2225
48, 54, 60, 49, 55, 61, 50, 56, 62, 51, 57, 63, 52, 58, 64, 53,
2226
59, 65, 66, 74, 82, 67, 75, 83, 68, 76, 84, 69, 77, 85, 70, 78,
2227
86, 71, 79, 87, 72, 80, 88, 73, 81, 89, 90,100,110, 91,101,111,
2228
92,102,112, 93,103,113, 94,104,114, 95,105,115, 96,106,116, 97,
2229
107,117, 98,108,118, 99,109,119,120,132,144,121,133,145,122,134,
2230
146,123,135,147,124,136,148,125,137,149,126,138,150,127,139,151,
2231
128,140,152,129,141,153,130,142,154,131,143,155,156,170,184,157,
2232
171,185,158,172,186,159,173,187,160,174,188,161,175,189,162,176,
2233
190,163,177,191,164,178,192,165,179,193,166,180,194,167,181,195,
2234
168,182,196,169,183,197,198,216,234,199,217,235,200,218,236,201,
2235
219,237,202,220,238,203,221,239,204,222,240,205,223,241,206,224,
2236
242,207,225,243,208,226,244,209,227,245,210,228,246,211,229,247,
2237
212,230,248,213,231,249,214,232,250,215,233,251,252,274,296,253,
2238
275,297,254,276,298,255,277,299,256,278,300,257,279,301,258,280,
2239
302,259,281,303,260,282,304,261,283,305,262,284,306,263,285,307,
2240
264,286,308,265,287,309,266,288,310,267,289,311,268,290,312,269,
2241
291,313,270,292,314,271,293,315,272,294,316,273,295,317,318,348,
2242
378,319,349,379,320,350,380,321,351,381,322,352,382,323,353,383,
2243
324,354,384,325,355,385,326,356,386,327,357,387,328,358,388,329,
2244
359,389,330,360,390,331,361,391,332,362,392,333,363,393,334,364,
2245
394,335,365,395,336,366,396,337,367,397,338,368,398,339,369,399,
2246
340,370,400,341,371,401,342,372,402,343,373,403,344,374,404,345,
2247
375,405,346,376,406,347,377,407,408,464,520,409,465,521,410,466,
2248
522,411,467,523,412,468,524,413,469,525,414,470,526,415,471,527,
2249
416,472,528,417,473,529,418,474,530,419,475,531,420,476,532,421,
2250
477,533,422,478,534,423,479,535,424,480,536,425,481,537,426,482,
2251
538,427,483,539,428,484,540,429,485,541,430,486,542,431,487,543,
2252
432,488,544,433,489,545,434,490,546,435,491,547,436,492,548,437,
2253
493,549,438,494,550,439,495,551,440,496,552,441,497,553,442,498,
2254
554,443,499,555,444,500,556,445,501,557,446,502,558,447,503,559,
2255
448,504,560,449,505,561,450,506,562,451,507,563,452,508,564,453,
2256
509,565,454,510,566,455,511,567,456,512,568,457,513,569,458,514,
2257
570,459,515,571,460,516,572,461,517,573,462,518,574,463,519,575},
2258
{ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2259
17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2260
34, 27, 31, 35, 36, 40, 44, 37, 41, 45, 38, 42, 46, 39, 43, 47,
2261
48, 54, 60, 49, 55, 61, 50, 56, 62, 51, 57, 63, 52, 58, 64, 53,
2262
59, 65, 66, 72, 78, 67, 73, 79, 68, 74, 80, 69, 75, 81, 70, 76,
2263
82, 71, 77, 83, 84, 94,104, 85, 95,105, 86, 96,106, 87, 97,107,
2264
88, 98,108, 89, 99,109, 90,100,110, 91,101,111, 92,102,112, 93,
2265
103,113,114,126,138,115,127,139,116,128,140,117,129,141,118,130,
2266
142,119,131,143,120,132,144,121,133,145,122,134,146,123,135,147,
2267
124,136,148,125,137,149,150,164,178,151,165,179,152,166,180,153,
2268
167,181,154,168,182,155,169,183,156,170,184,157,171,185,158,172,
2269
186,159,173,187,160,174,188,161,175,189,162,176,190,163,177,191,
2270
192,208,224,193,209,225,194,210,226,195,211,227,196,212,228,197,
2271
213,229,198,214,230,199,215,231,200,216,232,201,217,233,202,218,
2272
234,203,219,235,204,220,236,205,221,237,206,222,238,207,223,239,
2273
240,260,280,241,261,281,242,262,282,243,263,283,244,264,284,245,
2274
265,285,246,266,286,247,267,287,248,268,288,249,269,289,250,270,
2275
290,251,271,291,252,272,292,253,273,293,254,274,294,255,275,295,
2276
256,276,296,257,277,297,258,278,298,259,279,299,300,326,352,301,
2277
327,353,302,328,354,303,329,355,304,330,356,305,331,357,306,332,
2278
358,307,333,359,308,334,360,309,335,361,310,336,362,311,337,363,
2279
312,338,364,313,339,365,314,340,366,315,341,367,316,342,368,317,
2280
343,369,318,344,370,319,345,371,320,346,372,321,347,373,322,348,
2281
374,323,349,375,324,350,376,325,351,377,378,444,510,379,445,511,
2282
380,446,512,381,447,513,382,448,514,383,449,515,384,450,516,385,
2283
451,517,386,452,518,387,453,519,388,454,520,389,455,521,390,456,
2284
522,391,457,523,392,458,524,393,459,525,394,460,526,395,461,527,
2285
396,462,528,397,463,529,398,464,530,399,465,531,400,466,532,401,
2286
467,533,402,468,534,403,469,535,404,470,536,405,471,537,406,472,
2287
538,407,473,539,408,474,540,409,475,541,410,476,542,411,477,543,
2288
412,478,544,413,479,545,414,480,546,415,481,547,416,482,548,417,
2289
483,549,418,484,550,419,485,551,420,486,552,421,487,553,422,488,
2290
554,423,489,555,424,490,556,425,491,557,426,492,558,427,493,559,
2291
428,494,560,429,495,561,430,496,562,431,497,563,432,498,564,433,
2292
499,565,434,500,566,435,501,567,436,502,568,437,503,569,438,504,
2293
570,439,505,571,440,506,572,441,507,573,442,508,574,443,509,575},
2294
{ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, 12, 16, 20, 13,
2295
17, 21, 14, 18, 22, 15, 19, 23, 24, 28, 32, 25, 29, 33, 26, 30,
2296
34, 27, 31, 35, 36, 40, 44, 37, 41, 45, 38, 42, 46, 39, 43, 47,
2297
48, 54, 60, 49, 55, 61, 50, 56, 62, 51, 57, 63, 52, 58, 64, 53,
2298
59, 65, 66, 74, 82, 67, 75, 83, 68, 76, 84, 69, 77, 85, 70, 78,
2299
86, 71, 79, 87, 72, 80, 88, 73, 81, 89, 90,102,114, 91,103,115,
2300
92,104,116, 93,105,117, 94,106,118, 95,107,119, 96,108,120, 97,
2301
109,121, 98,110,122, 99,111,123,100,112,124,101,113,125,126,142,
2302
158,127,143,159,128,144,160,129,145,161,130,146,162,131,147,163,
2303
132,148,164,133,149,165,134,150,166,135,151,167,136,152,168,137,
2304
153,169,138,154,170,139,155,171,140,156,172,141,157,173,174,194,
2305
214,175,195,215,176,196,216,177,197,217,178,198,218,179,199,219,
2306
180,200,220,181,201,221,182,202,222,183,203,223,184,204,224,185,
2307
205,225,186,206,226,187,207,227,188,208,228,189,209,229,190,210,
2308
230,191,211,231,192,212,232,193,213,233,234,260,286,235,261,287,
2309
236,262,288,237,263,289,238,264,290,239,265,291,240,266,292,241,
2310
267,293,242,268,294,243,269,295,244,270,296,245,271,297,246,272,
2311
298,247,273,299,248,274,300,249,275,301,250,276,302,251,277,303,
2312
252,278,304,253,279,305,254,280,306,255,281,307,256,282,308,257,
2313
283,309,258,284,310,259,285,311,312,346,380,313,347,381,314,348,
2314
382,315,349,383,316,350,384,317,351,385,318,352,386,319,353,387,
2315
320,354,388,321,355,389,322,356,390,323,357,391,324,358,392,325,
2316
359,393,326,360,394,327,361,395,328,362,396,329,363,397,330,364,
2317
398,331,365,399,332,366,400,333,367,401,334,368,402,335,369,403,
2318
336,370,404,337,371,405,338,372,406,339,373,407,340,374,408,341,
2319
375,409,342,376,410,343,377,411,344,378,412,345,379,413,414,456,
2320
498,415,457,499,416,458,500,417,459,501,418,460,502,419,461,503,
2321
420,462,504,421,463,505,422,464,506,423,465,507,424,466,508,425,
2322
467,509,426,468,510,427,469,511,428,470,512,429,471,513,430,472,
2323
514,431,473,515,432,474,516,433,475,517,434,476,518,435,477,519,
2324
436,478,520,437,479,521,438,480,522,439,481,523,440,482,524,441,
2325
483,525,442,484,526,443,485,527,444,486,528,445,487,529,446,488,
2326
530,447,489,531,448,490,532,449,491,533,450,492,534,451,493,535,
2327
452,494,536,453,495,537,454,496,538,455,497,539,540,552,564,541,
2328
553,565,542,554,566,543,555,567,544,556,568,545,557,569,546,558,
2329
570,547,559,571,548,560,572,549,561,573,550,562,574,551,563,575}
2330
};
2331
*/
2332
2333
private static final float cs[] =
2334
{
2335
0.857492925712f, 0.881741997318f, 0.949628649103f, 0.983314592492f,
2336
0.995517816065f, 0.999160558175f, 0.999899195243f, 0.999993155067f
2337
};
2338
2339
private static final float ca[] =
2340
{
2341
-0.5144957554270f, -0.4717319685650f, -0.3133774542040f, -0.1819131996110f,
2342
-0.0945741925262f, -0.0409655828852f, -0.0141985685725f, -0.00369997467375f
2343
};
2344
2345
/************************************************************/
2346
/* END OF L3TABLE */
2347
/************************************************************/
2348
2349
/************************************************************/
2350
/* L3TYPE */
2351
/************************************************************/
2352
2353
2354
/***************************************************************/
2355
/* END OF L3TYPE */
2356
/***************************************************************/
2357
2358
/***************************************************************/
2359
/* INV_MDCT */
2360
/***************************************************************/
2361
public static final float win[][] =
2362
{
2363
{ -1.6141214951E-02f, -5.3603178919E-02f, -1.0070713296E-01f, -1.6280817573E-01f,
2364
-4.9999999679E-01f, -3.8388735032E-01f, -6.2061144372E-01f, -1.1659756083E+00f,
2365
-3.8720752656E+00f, -4.2256286556E+00f, -1.5195289984E+00f, -9.7416483388E-01f,
2366
-7.3744074053E-01f, -1.2071067773E+00f, -5.1636156596E-01f, -4.5426052317E-01f,
2367
-4.0715656898E-01f, -3.6969460527E-01f, -3.3876269197E-01f, -3.1242222492E-01f,
2368
-2.8939587111E-01f, -2.6880081906E-01f, -5.0000000266E-01f, -2.3251417468E-01f,
2369
-2.1596714708E-01f, -2.0004979098E-01f, -1.8449493497E-01f, -1.6905846094E-01f,
2370
-1.5350360518E-01f, -1.3758624925E-01f, -1.2103922149E-01f, -2.0710679058E-01f,
2371
-8.4752577594E-02f, -6.4157525656E-02f, -4.1131172614E-02f, -1.4790705759E-02f },
2372
2373
{ -1.6141214951E-02f, -5.3603178919E-02f, -1.0070713296E-01f, -1.6280817573E-01f,
2374
-4.9999999679E-01f, -3.8388735032E-01f, -6.2061144372E-01f, -1.1659756083E+00f,
2375
-3.8720752656E+00f, -4.2256286556E+00f, -1.5195289984E+00f, -9.7416483388E-01f,
2376
-7.3744074053E-01f, -1.2071067773E+00f, -5.1636156596E-01f, -4.5426052317E-01f,
2377
-4.0715656898E-01f, -3.6969460527E-01f, -3.3908542600E-01f, -3.1511810350E-01f,
2378
-2.9642226150E-01f, -2.8184548650E-01f, -5.4119610000E-01f, -2.6213228100E-01f,
2379
-2.5387916537E-01f, -2.3296291359E-01f, -1.9852728987E-01f, -1.5233534808E-01f,
2380
-9.6496400054E-02f, -3.3423828516E-02f, 0.0000000000E+00f, 0.0000000000E+00f,
2381
0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f },
2382
2383
{ -4.8300800645E-02f, -1.5715656932E-01f, -2.8325045177E-01f, -4.2953747763E-01f,
2384
-1.2071067795E+00f, -8.2426483178E-01f, -1.1451749106E+00f, -1.7695290101E+00f,
2385
-4.5470225061E+00f, -3.4890531002E+00f, -7.3296292804E-01f, -1.5076514758E-01f,
2386
0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2387
0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2388
0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
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
2393
{ 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f, 0.0000000000E+00f,
2394
0.0000000000E+00f, 0.0000000000E+00f, -1.5076513660E-01f, -7.3296291107E-01f,
2395
-3.4890530566E+00f, -4.5470224727E+00f, -1.7695290031E+00f, -1.1451749092E+00f,
2396
-8.3137738100E-01f, -1.3065629650E+00f, -5.4142014250E-01f, -4.6528974900E-01f,
2397
-4.1066990750E-01f, -3.7004680800E-01f, -3.3876269197E-01f, -3.1242222492E-01f,
2398
-2.8939587111E-01f, -2.6880081906E-01f, -5.0000000266E-01f, -2.3251417468E-01f,
2399
-2.1596714708E-01f, -2.0004979098E-01f, -1.8449493497E-01f, -1.6905846094E-01f,
2400
-1.5350360518E-01f, -1.3758624925E-01f, -1.2103922149E-01f, -2.0710679058E-01f,
2401
-8.4752577594E-02f, -6.4157525656E-02f, -4.1131172614E-02f, -1.4790705759E-02f }
2402
};
2403
/***************************************************************/
2404
/* END OF INV_MDCT */
2405
/***************************************************************/
2406
2407
static class Sftable
2408
{
2409
public int[] l;
2410
public int[] s;
2411
2412
public Sftable()
2413
{
2414
l = new int[5];
2415
s = new int[3];
2416
}
2417
2418
public Sftable(int[] thel, int[] thes)
2419
{
2420
l = thel;
2421
s = thes;
2422
}
2423
}
2424
2425
public Sftable sftable;
2426
2427
public static final int nr_of_sfb_block[][][] =
2428
{{{ 6, 5, 5, 5} , { 9, 9, 9, 9} , { 6, 9, 9, 9}},
2429
{{ 6, 5, 7, 3} , { 9, 9,12, 6} , { 6, 9,12, 6}},
2430
{{11,10, 0, 0} , {18,18, 0, 0} , {15,18, 0, 0}},
2431
{{ 7, 7, 7, 0} , {12,12,12, 0} , { 6,15,12, 0}},
2432
{{ 6, 6, 6, 3} , {12, 9, 9, 6} , { 6,12, 9, 6}},
2433
{{ 8, 8, 5, 0} , {15,12, 9, 0} , { 6,18, 9, 0}}};
2434
2435
2436
}
2437
2438