// 10th added for get_scale_factors
// llth added for decode
// @LATTICE("IS1D*,RO<IS1D,IS1D<SI2,SI2<SI1,SI<P2S,SF1<CH0,SF0*,SFB_SH<NS,NS<SI,SFB_SH*,SFB<SFB_SH,C,C*,SI1<SF2,SF2<SFB,SF1<BR,LR*,OUT<LR,LR<RO,NZ*,SI<SF1,SI1<NZ,NZ<SI,SI1<SBI,SBI<SI,BUF<FT,SF1<SF0,SF0<HD1,BR<ST,ST,FT<SP,SP<OUT,OUT<SI1,SI1<SI,P2S<CH0,CH0<MAX0,MAX0<BR1,FS<BR1,BR1<BR,BR<HD1,HD1<HD,OUT*,BR1*,SI1*,MAX0*,CH0*,RAW,TS,F,C,K,LY,VAR,IR,IP,CSH,GLSFD3,GLSFD4,GLSFD5,GLSFF4,GLSFF2,GLSFF3,GLSFF1,GSF4,GSF5,GSF1,GSF2,GSF3,HD2,HD3,BT,GR,RO6,RO5,RO9,RO8,RO7,RO4,RO1,RO3,RO2,SH,ME,TMP2,S,LSF,J")
-@LATTICE("ISR*,ISP*,LR<ISR,ISR<ISP,SI1<SF2,NS*,HD<ST,IS1D*,RO1<RO,RO1*,RO<IS1D,IS1D<SI2,SI2<SI1,BR<NS,NS<SI,SFB_SH*,SFB<SFB_SH,C,C*,SF2<SFB,LR*,OUT<LR,ISP<RO1,NZ*,SI<SF1,BR1<NZ,NZ<BR,SI1<RT,RT<SBI,SBI<SI,BUF<FT,SF1<CH0,CH0<HD1,FT<SP,SP<OUT,OUT<SI1,SI1<SI,SFB_SH<BR1,BR1<BR,HD1<HD,OUT*,BR1*,SI1*,CH0*,RAW,TS,F,C,K,LY,VAR,IR,IP,CSH,GLSFD3,GLSFD4,GLSFD5,GLSFF4,GLSFF2,GLSFF3,GLSFF1,GSF4,GSF5,GSF1,GSF2,GSF3,HD2,HD3,BT,GR,RO6,RO5,RO9,RO8,RO7,RO4,RO1,RO3,RO2,SH,ME,TMP2,S,LSF,J")
-@METHODDEFAULT("OUT<V,V<THIS,THIS<SH,SH<IN,SH*,THISLOC=THIS,GLOBALLOC=IN")
+@LATTICE("SI0*,INIT*,ISR*,ISP*,HD<CH0,LR<ISR,ISR<ISP,SI1<SF2,NS*,CH0<ST,ST<INIT,IS1D*,RO1<RO,RO1*,RO<IS1D,IS1D<SI2,SI2<SI1,BR<NS,NS<SI,SFB_SH*,SFB<SFB_SH,C,C*,SF2<SFB,LR*,OUT<LR,ISP<RO1,NZ*,SI<SI0,SI0<SF15,SF15<SF1,BR1<NZ,NZ<BR,SI1<RT,RT<SBI,SBI<SI,BUF<FT,SF1<HD1,SF1<HD1,FT<SP,SP<OUT,OUT<SI1,SI1<SI,SFB_SH<BR1,BR1<BR,HD1<HD,OUT*,BR1*,SI1*,CH0*")
+@METHODDEFAULT("OUT<V,V<THIS,THIS<SH,SH<IN,SH*,THISLOC=THIS,GLOBALLOC=IN,RETURNLOC=OUT")
final class LayerIIIDecoder implements FrameDecoder {
static final double d43 = (4.0 / 3.0);
@LOC("SFB")
@LOC("LR")
private float[][][] lr;
@LOC("OUT")
+ private float[] inter; // 576 samples
+ @LOC("OUT")
private float[] out_1d; // 576 samples
@LOC("OUT")
private float[][] prevblck;
private float[][] k;
@LOC("NZ")
private int[] nonzero;
- @LOC("HD")
- private Header header;
@LOC("FT")
private SynthesisFilter filter1;
@LOC("FT")
private SynthesisFilter filter2;
- @LOC("SP")
- private Obuffer buffer; // output buffer
+ // @LOC("SP")
+ // private Obuffer buffer; // output buffer
@LOC("CH0")
private int which_channels;
@LOC("BR")
// @LOC("SBT") private temporaire2[] III_scalefac_t;
@LOC("SF2")
- private temporaire2[] scalefac;
+ private final temporaire2[] scalefac;
// private III_scalefac_t scalefac;
@LOC("CH0")
private int frame_start;
// @LOC("SI1") private int part2_start;
@LOC("CH0")
- private int channels;
+ private final int channels;
@LOC("CH0")
private int first_channel;
@LOC("CH0")
@LOC("SBI")
private int sfreq;
+ @LOC("BR1")
private int part2_start;
+ @LOC("INIT")
+ private boolean initialized = false;
- /**
- * Constructor.
- */
- // REVIEW: these constructor arguments should be moved to the
- // decodeFrame() method, where possible, so that one
- @LATTICE("THIS<VAR,THIS<I,THIS<J,J<CH,I*,J*,CH*,THISLOC=THIS,GLOBALLOC=THIS")
- public LayerIIIDecoder(@LOC("VAR") Header header0, @LOC("VAR") SynthesisFilter filtera,
- @LOC("VAR") SynthesisFilter filterb, @LOC("VAR") Obuffer buffer0, @LOC("VAR") int which_ch0) {
+ // constructor for the linear type system
+ public LayerIIIDecoder(@DELEGATE @LOC("VAR") SynthesisFilter filtera,
+ @DELEGATE @LOC("VAR") SynthesisFilter filterb, @LOC("VAR") int which_ch0) {
+
+ filter1 = filtera;
+ filter2 = filterb;
huffcodetab.inithuff();
is_1d = new int[SBLIMIT * SSLIMIT + 4];
ro = new float[2][SBLIMIT][SSLIMIT];
lr = new float[2][SBLIMIT][SSLIMIT];
out_1d = new float[SBLIMIT * SSLIMIT];
+ inter = new float[SBLIMIT * SSLIMIT];
prevblck = new float[2][SBLIMIT * SSLIMIT];
k = new float[2][SBLIMIT * SSLIMIT];
nonzero = new int[2];
reorder_table[i] = reorder(sfBandIndex[i].s);
}
- // Sftable
- @LOC("VAR") int[] ll0 = { 0, 6, 11, 16, 21 };
- @LOC("VAR") int[] ss0 = { 0, 6, 12 };
- sftable = new Sftable(ll0, ss0);
- // END OF Sftable
-
// scalefac_buffer
scalefac_buffer = new int[54];
// END OF scalefac_buffer
- header = header0;
- filter1 = filtera;
- filter2 = filterb;
- buffer = buffer0;
- which_channels = which_ch0;
+ }
+
+ @LATTICE("THIS<C,THIS<IN,C*,THISLOC=THIS")
+ private void init(@LOC("THIS,LayerIIIDecoder.HD1") Header header) {
frame_start = 0;
channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2;
first_channel = last_channel = 0;
}
- for (@LOC("CH") int ch = 0; ch < 2; ch++)
- for (@LOC("J") int j = 0; j < 576; j++)
+ for (@LOC("THIS,LayerIIIDecoder.CH0") int ch = 0; ch < 2; ch++)
+ for (@LOC("THIS,LayerIIIDecoder.CH0") int j = 0; j < 576; j++)
prevblck[ch][j] = 0.0f;
nonzero[0] = nonzero[1] = 576;
- br = new BitReserve();
si = new III_side_info_t();
+
+ initialized = true;
+
}
+ /**
+ * Constructor.
+ */
+ // REVIEW: these constructor arguments should be moved to the
+ // decodeFrame() method, where possible, so that one
+ // @LATTICE("THIS<VAR,THIS<I,THIS<J,J<CH,I*,J*,CH*,THISLOC=THIS,GLOBALLOC=THIS")
+ // public LayerIIIDecoder(@LOC("VAR") Header header0, @LOC("VAR")
+ // SynthesisFilter filtera,
+ // @LOC("VAR") SynthesisFilter filterb, @LOC("VAR") int which_ch0) {
+ //
+ // huffcodetab.inithuff();
+ // is_1d = new int[SBLIMIT * SSLIMIT + 4];
+ // ro = new float[2][SBLIMIT][SSLIMIT];
+ // lr = new float[2][SBLIMIT][SSLIMIT];
+ // out_1d = new float[SBLIMIT * SSLIMIT];
+ // prevblck = new float[2][SBLIMIT * SSLIMIT];
+ // k = new float[2][SBLIMIT * SSLIMIT];
+ // nonzero = new int[2];
+ //
+ // // removes unnecessary aliases
+ // // III_scalefact_t
+ // // III_scalefac_t = new temporaire2[2];
+ // // III_scalefac_t[0] = new temporaire2();
+ // // III_scalefac_t[1] = new temporaire2();
+ // // scalefac = III_scalefac_t;
+ //
+ // scalefac = new temporaire2[2];
+ // scalefac[0] = new temporaire2();
+ // scalefac[1] = new temporaire2();
+ //
+ // // L3TABLE INIT
+ //
+ // sfBandIndex = new SBI[9]; // SZD: MPEG2.5 +3 indices
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s0 = { 0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132,
+ // 174, 192 };
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s1 = { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136,
+ // 180, 192 };
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s2 = { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134,
+ // 174, 192 };
+ //
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s3 = { 0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136,
+ // 192 };
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s4 = { 0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126,
+ // 192 };
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s5 = { 0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138,
+ // 180, 192 };
+ // // SZD: MPEG2.5
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s6 = { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134,
+ // 174, 192 };
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s7 = { 0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134,
+ // 174, 192 };
+ // @LOC("VAR") 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 };
+ // @LOC("VAR") int[] s8 = { 0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164,
+ // 166, 192 };
+ //
+ // sfBandIndex[0] = new SBI(l0, s0);
+ // sfBandIndex[1] = new SBI(l1, s1);
+ // sfBandIndex[2] = new SBI(l2, s2);
+ //
+ // sfBandIndex[3] = new SBI(l3, s3);
+ // sfBandIndex[4] = new SBI(l4, s4);
+ // sfBandIndex[5] = new SBI(l5, s5);
+ // // SZD: MPEG2.5
+ // sfBandIndex[6] = new SBI(l6, s6);
+ // sfBandIndex[7] = new SBI(l7, s7);
+ // sfBandIndex[8] = new SBI(l8, s8);
+ // // END OF L3TABLE INIT
+ //
+ // if (reorder_table == null) { // SZD: generate LUT
+ // reorder_table = new int[9][];
+ // for (@LOC("I") int i = 0; i < 9; i++)
+ // reorder_table[i] = reorder(sfBandIndex[i].s);
+ // }
+ //
+ // // Sftable
+ // @LOC("VAR") int[] ll0 = { 0, 6, 11, 16, 21 };
+ // @LOC("VAR") int[] ss0 = { 0, 6, 12 };
+ // sftable = new Sftable(ll0, ss0);
+ // // END OF Sftable
+ //
+ // // scalefac_buffer
+ // scalefac_buffer = new int[54];
+ // // END OF scalefac_buffer
+ //
+ // // header = header0;
+ // filter1 = filtera;
+ // filter2 = filterb;
+ // // buffer = buffer0;
+ // which_channels = which_ch0;
+ //
+ // frame_start = 0;
+ // channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2;
+ // max_gr = (header.version() == Header.MPEG1) ? 2 : 1;
+ //
+ // sfreq =
+ // header.sample_frequency()
+ // + ((header.version() == Header.MPEG1) ? 3 : (header.version() ==
+ // Header.MPEG25_LSF) ? 6
+ // : 0); // SZD
+ //
+ // if (channels == 2) {
+ // switch (which_channels) {
+ // case OutputChannels.LEFT_CHANNEL:
+ // case OutputChannels.DOWNMIX_CHANNELS:
+ // first_channel = last_channel = 0;
+ // break;
+ //
+ // case OutputChannels.RIGHT_CHANNEL:
+ // first_channel = last_channel = 1;
+ // break;
+ //
+ // case OutputChannels.BOTH_CHANNELS:
+ // default:
+ // first_channel = 0;
+ // last_channel = 1;
+ // break;
+ // }
+ // } else {
+ // first_channel = last_channel = 0;
+ // }
+ //
+ // for (@LOC("CH") int ch = 0; ch < 2; ch++)
+ // for (@LOC("J") int j = 0; j < 576; j++)
+ // prevblck[ch][j] = 0.0f;
+ //
+ // nonzero[0] = nonzero[1] = 576;
+ //
+ // br = new BitReserve();
+ // si = new III_side_info_t();
+ // }
+
/**
* Notify decoder that a seek is being made.
*/
br = new BitReserve();
}
- public void decodeFrame() {
- decode();
+ public void decodeFrame(@LOC("IN") Header header) {
+ decode(header);
}
/**
* {filter1,filter2}
*/
// @LATTICE("BYTE<THIS,THIS<MAIN,MAIN<VAR,THIS<GR,GR<VAR,BYTE*,GR*,THISLOC=THIS,GLOBALLOC=VAR")
- @LATTICE("VAR<THIS,C<THIS,THIS<IN,THISLOC=THIS,C*,VAR*")
- public void decode() {
+ @LATTICE("HEADER<VAR,VAR<THIS,C<THIS,THIS<IN,THISLOC=THIS,C*,VAR*")
+ public void decode(@LOC("THIS,LayerIIIDecoder.HD") Header header) {
+
+ if (!initialized) {
+ init(header);
+ }
+
+ // overwrites once per a loop
+ samples1 = new float[32];
+ samples2 = new float[32];
+ // prevblck = new float[2][SBLIMIT * SSLIMIT];
+ si = new III_side_info_t();
+ //
@LOC("THIS,LayerIIIDecoder.HD1") int nSlots = header.slots();
@LOC("C") int i;
// modifications for linear type
- get_side_info(header.getSideInfoBuffer());
+ get_side_info(header);
br = header.getBitReserve();
+ @LOC("THIS,LayerIIIDecoder.HD1") int version = header.version();
+
// here 'gr' and 'max_gr' should be higher than 'ch','channels', and more
for (gr = 0; gr < max_gr; gr++) { // two granules per channel
// in the loop body, access set={part2_start}
// 'ch', 'channels' should be higher than all locs in the below body
for (ch = 0; ch < channels; ch++) {
- @LOC("THIS,LayerIIIDecoder.BR,BitReserve.BIT") int part2_start = br.hsstell(); // part2_start
- // <
- // br
+ // part2_start = br.hsstell();
+ @LOC("THIS,LayerIIIDecoder.BR,BitReserve.BIT") int part2_start_local = br.hsstell();
// grab scale factors from the main data.
// following the scale factors is the actual compressed data
- if (header.version() == Header.MPEG1)
- get_scale_factors(ch, gr); // no need to care from this side
+ if (version == Header.MPEG1)
+ get_scale_factors(header, ch, gr); // no need to care from this side
// here move scale factor data from 'br' buffer to 'scalefac' field
else
// MPEG-2 LSF, SZD: MPEG-2.5 LSF
- get_LSF_scale_factors(ch, gr); // no need to care from this side
+ get_LSF_scale_factors(header, ch, gr); // no need to care from this
+ // side
// here, decoding the compressed audio data
- huffman_decode(ch, gr); // no need to care from this side
+ huffman_decode(part2_start_local, ch, gr); // no need to care from this
+ // side
// System.out.println("CheckSum HuffMan = " + CheckSumHuff);
dequantize_sample(/* ro[ch], */ch, gr); // no need to care from this
// side
}
- stereo(gr); // no need to care from this side
+ stereo(header, gr); // no need to care from this side
if ((which_channels == OutputChannels.DOWNMIX_CHANNELS) && (channels > 1)) {
do_downmix();
reorder(/* lr[ch], */ch, gr);
antialias(ch, gr);
- // for (int hb = 0;hb<576;hb++) CheckSumOut1d = CheckSumOut1d +
- // out_1d[hb];
+
+ // float CheckSumOut1d=0;
+ // for (int hb = 0;hb<576;hb++) {
+ // CheckSumOut1d = CheckSumOut1d + out_1d[hb];
+ // }
// System.out.println("CheckSumOut1d = "+CheckSumOut1d);
+ for (@LOC("THIS,LayerIIIDecoder.SI1") int index = 0; index < 576; index++) {
+ out_1d[index] = inter[index];
+ }
+
hybrid(ch, gr);
- // for (int hb = 0;hb<576;hb++) CheckSumOut1d = CheckSumOut1d +
- // out_1d[hb];
+ // float CheckSumOut1d=0;
+ // for (int hb = 0;hb<576;hb++) {
+ // CheckSumOut1d = CheckSumOut1d + out_1d[hb];
+ // }
// System.out.println("CheckSumOut1d = "+CheckSumOut1d);
for (sb18 = 18; sb18 < 576; sb18 += 36) {
sb++; // sb should be loc*
}
filter1.input_samples(samples1);
- filter1.calculate_pcm_samples(buffer);
+ filter1.calculate_pcm_samples();
}
} else {
for (ss = 0; ss < SSLIMIT; ss++) { // Polyphase synthesis
sb++;
}
filter2.input_samples(samples2);
- filter2.calculate_pcm_samples(buffer);
+ filter2.calculate_pcm_samples();
}
}
// if (counter < 609)
// {
counter++; // count should be loc*
- buffer.write_buffer(1); // buffer!!!
+ // buffer.write_buffer(1); // buffer!!!
// }
// else if (counter == 609)
// {
* Reads the side info from the stream, assuming the entire. frame has been
* read already. Mono : 136 bits (= 17 bytes) Stereo : 256 bits (= 32 bytes)
*/
- private boolean get_side_info(SideInfoBuffer sib) {
- int ch, gr;
+ @LATTICE("OUT<THIS,THIS<C,C<IN,C*,THISLOC=THIS,RETURNLOC=OUT")
+ private boolean get_side_info(@LOC("THIS,LayerIIIDecoder.HD1") Header header) {
+
+ @LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.TEMP") SideInfoBuffer sib =
+ header.getSideInfoBuffer();
+ @LOC("THIS,LayerIIIDecoder.SF1") int version = header.version();
+
+ @LOC("THIS,LayerIIIDecoder.SI0") int ch;
+ @LOC("THIS,LayerIIIDecoder.SI0") int gr;
// System.out.println("#get_side_info");
- if (header.version() == Header.MPEG1) {
+ if (version == Header.MPEG1) {
si.main_data_begin = sib.get_bits(9);
if (channels == 1)
si.ch[ch].gr[gr].big_values = sib.get_bits(9);
si.ch[ch].gr[gr].global_gain = sib.get_bits(8);
si.ch[ch].gr[gr].scalefac_compress = sib.get_bits(4);
- si.ch[ch].gr[gr].window_switching_flag = sib.get_bits(1);
- if ((si.ch[ch].gr[gr].window_switching_flag) != 0) {
+ @LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.TEMP") int cond =
+ sib.get_bits(1);
+ // si.ch[ch].gr[gr].window_switching_flag = sib.get_bits(1);
+ // if ((si.ch[ch].gr[gr].window_switching_flag) != 0) {
+ if (cond != 0) {
si.ch[ch].gr[gr].block_type = sib.get_bits(2);
si.ch[ch].gr[gr].mixed_block_flag = sib.get_bits(1);
si.ch[ch].gr[gr].region1_count = sib.get_bits(3);
si.ch[ch].gr[gr].block_type = 0;
}
+ //
+ si.ch[ch].gr[gr].window_switching_flag = cond;
+ //
si.ch[ch].gr[gr].preflag = sib.get_bits(1);
si.ch[ch].gr[gr].scalefac_scale = sib.get_bits(1);
si.ch[ch].gr[gr].count1table_select = sib.get_bits(1);
si.ch[ch].gr[0].big_values = sib.get_bits(9);
si.ch[ch].gr[0].global_gain = sib.get_bits(8);
si.ch[ch].gr[0].scalefac_compress = sib.get_bits(9);
- si.ch[ch].gr[0].window_switching_flag = sib.get_bits(1);
- if ((si.ch[ch].gr[0].window_switching_flag) != 0) {
+ @LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.TEMP") int cond =
+ sib.get_bits(1);
+ // si.ch[ch].gr[0].window_switching_flag = sib.get_bits(1);
+ // if ((si.ch[ch].gr[0].window_switching_flag) != 0) {
+ if (cond != 0) {
si.ch[ch].gr[0].block_type = sib.get_bits(2);
si.ch[ch].gr[0].mixed_block_flag = sib.get_bits(1);
si.ch[ch].gr[0].region1_count = sib.get_bits(3);
si.ch[ch].gr[0].block_type = 0;
}
+ //
+ si.ch[ch].gr[gr].window_switching_flag = cond;
+ //
si.ch[ch].gr[0].scalefac_scale = sib.get_bits(1);
si.ch[ch].gr[0].count1table_select = sib.get_bits(1);
*
*/
@LATTICE("THIS<IN,THISLOC=THIS,GLOBALLOC=IN")
- private void get_scale_factors(@LOC("THIS,LayerIIIDecoder.CH0") int ch,
- @LOC("THIS,LayerIIIDecoder.CH0") int gr) {
+ private void get_scale_factors(@LOC("THIS,LayerIIIDecoder.SF1") Header header,
+ @LOC("THIS,LayerIIIDecoder.SF1") int ch, @LOC("THIS,LayerIIIDecoder.SF1") int gr) {
// gr_info_s gr_info = (si.ch[ch].gr[gr]); remove alias
// ssjava
@LATTICE("M<THIS,THIS<IN,THIS<C,C*,M*,THISLOC=THIS,GLOBALLOC=THIS")
- private void get_LSF_scale_data(@LOC("THIS,LayerIIIDecoder.CH0") int ch,
- @LOC("THIS,LayerIIIDecoder.CH0") int gr) {
+ private void get_LSF_scale_data(@LOC("THIS,LayerIIIDecoder.SF15") Header header,
+ @LOC("THIS,LayerIIIDecoder.SF15") int ch, @LOC("THIS,LayerIIIDecoder.SF15") int gr) {
- @LOC("THIS,LayerIIIDecoder.HD1") int mode_ext = header.mode_extension();
+ @LOC("THIS,LayerIIIDecoder.SI0") int mode_ext = header.mode_extension();
// @LOC("THIS,LayerIIIDecoder.GLSFD1") gr_info_s gr_info =
// (si.ch[ch].gr[gr]); // remove alias
@LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.CH,LayerIIIDecoder$temporaire.GR,LayerIIIDecoder$gr_info_s.V") int scalefac_comp =
si.ch[ch].gr[gr].scalefac_compress;
- @LOC("THIS,LayerIIIDecoder.SI") int blocktypenumber;
+ @LOC("THIS,LayerIIIDecoder.NS") int blocktypenumber;
@LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.CH,LayerIIIDecoder$temporaire.GR,LayerIIIDecoder$gr_info_s.V") int int_scalefac_comp;
@LOC("THIS,LayerIIIDecoder.SFB_SH") int m;
}
}
- for (@LOC("C") int x = 0; x < 45; x++)
+ for (@LOC("THIS,LayerIIIDecoder.NS") int x = 0; x < 45; x++)
// why 45, not 54?
scalefac_buffer[x] = 0;
m = 0;
- for (@LOC("C") int i = 0; i < 4; i++) {
- for (@LOC("THIS,LayerIIIDecoder.NS") int j = 0; j < nr_of_sfb_block[blocknumber][blocktypenumber][i]; j++) {
+ for (@LOC("THIS,LayerIIIDecoder.NS") int i = 0; i < 4; i++) {
+ @LOC("THIS,LayerIIIDecoder.NS") int jmax = nr_of_sfb_block[blocknumber][blocktypenumber][i];
+ for (@LOC("THIS,LayerIIIDecoder.NS") int j = 0; j < jmax; j++) {
scalefac_buffer[m] = (new_slen[i] == 0) ? 0 : br.hgetbits(new_slen[i]);
m++;
*
*/
@LATTICE("THIS<IN,THISLOC=THIS,GLOBALLOC=IN")
- private void get_LSF_scale_factors(@LOC("THIS,LayerIIIDecoder.CH0") int ch,
- @LOC("THIS,LayerIIIDecoder.CH0") int gr) {
+ private void get_LSF_scale_factors(@LOC("THIS,LayerIIIDecoder.SF1") Header header,
+ @LOC("THIS,LayerIIIDecoder.SF1") int ch, @LOC("THIS,LayerIIIDecoder.SF1") int gr) {
@LOC("THIS,LayerIIIDecoder.SFB_SH") int sfb;
@LOC("THIS,LayerIIIDecoder.SFB_SH") int m = 0;
@LOC("THIS,LayerIIIDecoder.SFB_SH") int window;
// gr_info_s gr_info = (si.ch[ch].gr[gr]); // remove alias
- get_LSF_scale_data(ch, gr);
+ get_LSF_scale_data(header, ch, gr);
if ((si.ch[ch].gr[gr].window_switching_flag != 0) && (si.ch[ch].gr[gr].block_type == 2)) {
if (si.ch[ch].gr[gr].mixed_block_flag != 0) { // MIXED
// int[] v = { 0 };
// @LOC("SI1")
// int[] w = { 0 };
- @LOC("SI1")
- int x[] = { 0 };
- @LOC("SI1")
- int y[] = { 0 };
- @LOC("SI1")
- int v[] = { 0 };
- @LOC("SI1")
- int w[] = { 0 };
+ // @LOC("SI1")
+ // int x[] = { 0 };
+ // @LOC("SI1")
+ // int y[] = { 0 };
+ // @LOC("SI1")
+ // int v[] = { 0 };
+ // @LOC("SI1")
+ // int w[] = { 0 };
- private void huffman_decode(int ch, int gr) {
- x[0] = 0;
- y[0] = 0;
- v[0] = 0;
- w[0] = 0;
+ @LATTICE("VAR<OUT,OUT<THIS,THIS<RE,THISLOC=THIS,GLOBALLOC=OUT,RETURNLOC=OUT")
+ private void huffman_decode(@LOC("THIS,LayerIIIDecoder.BR,BitReserve.BIT") int part2_start_local,
+ @LOC("THIS,LayerIIIDecoder.CH0") int ch, @LOC("THIS,LayerIIIDecoder.CH0") int gr) {
- int part2_3_end = part2_start + si.ch[ch].gr[gr].part2_3_length;
- int num_bits;
- int region1Start;
- int region2Start;
- int index;
+ @LOC("RE") int x[] = new int[1];
+ @LOC("RE") int y[] = new int[1];
+ @LOC("RE") int v[] = new int[1];
+ @LOC("RE") int w[] = new int[1];
- int buf, buf1;
+ @LOC("THIS,LayerIIIDecoder.BR,BitReserve.BIT") int part2_3_end =
+ part2_start_local + si.ch[ch].gr[gr].part2_3_length;
+ @LOC("THIS,LayerIIIDecoder.BR,BitReserve.BIT") int num_bits;
+ @LOC("THIS,LayerIIIDecoder.SI1") int region1Start;
+ @LOC("THIS,LayerIIIDecoder.SI1") int region2Start;
+ @LOC("THIS,LayerIIIDecoder.BR,BitReserve.BIT") int index;
- huffcodetab h;
+ @LOC("THIS,LayerIIIDecoder.SI1") int buf;
+ @LOC("THIS,LayerIIIDecoder.SI1") int buf1;
// Find region boundary for short block case
index = 0;
// Read bigvalues area
- for (int i = 0; i < (si.ch[ch].gr[gr].big_values << 1); i += 2) {
- if (i < region1Start)
- h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[0]];
- else if (i < region2Start)
- h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[1]];
- else
- h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[2]];
+ TERMINATE: for (@LOC("THIS,LayerIIIDecoder.BR,BitReserve.BIT") int i = 0; i < (si.ch[ch].gr[gr].big_values << 1); i +=
+ 2) {
+
+ @LOC("THIS,LayerIIIDecoder.SI2") int htIdx;
+ if (i < region1Start) {
+ htIdx = si.ch[ch].gr[gr].table_select[0];
+ // h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[0]];
+ } else if (i < region2Start) {
+ htIdx = si.ch[ch].gr[gr].table_select[1];
+ // h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[1]];
+ } else {
+ htIdx = si.ch[ch].gr[gr].table_select[2];
+ // h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[2]];
+ }
- huffcodetab.huffman_decoder(h, x, y, v, w, br);
+ huffcodetab.huffman_decoder(htIdx, x, y, v, w, br);
// 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);
is_1d[index++] = y[0];
CheckSumHuff = CheckSumHuff + x[0] + y[0];
- // System.out.println("x = "+x[0]+" y = "+y[0]);
+ // System.out.println("x = " + x[0] + " y = " + y[0]);
}
// Read count1 area
- h = huffcodetab.ht[si.ch[ch].gr[gr].count1table_select + 32];
+
+ @LOC("THIS,LayerIIIDecoder.SI2") int htIdx = si.ch[ch].gr[gr].count1table_select + 32;
+ // h = huffcodetab.ht[si.ch[ch].gr[gr].count1table_select + 32];
num_bits = br.hsstell();
- while ((num_bits < part2_3_end) && (index < 576)) {
+ TERMINATE: while ((num_bits < part2_3_end) && (index < 576)) {
- huffcodetab.huffman_decoder(h, x, y, v, w, br);
+ huffcodetab.huffman_decoder(htIdx, x, y, v, w, br);
is_1d[index++] = v[0];
is_1d[index++] = w[0];
if ((si.ch[ch].gr[gr].window_switching_flag != 0) && (si.ch[ch].gr[gr].block_type == 2)) {
for (index = 0; index < 576; index++) {
- out_1d[index] = 0.0f;
+ inter[index] = 0.0f;
}
if (si.ch[ch].gr[gr].mixed_block_flag != 0) {
// Modif E.B 02/22/99
@LOC("THIS,LayerIIIDecoder.SI1") int reste = index % SSLIMIT;
@LOC("THIS,LayerIIIDecoder.SI1") int quotien = (int) ((index - reste) / SSLIMIT);
- out_1d[index] = lr[ch][quotien][reste];
+ inter[index] = lr[ch][quotien][reste];
}
// REORDERING FOR REST SWITCHED SHORT
/*
@LOC("THIS,LayerIIIDecoder.SI1") int reste = src_line % SSLIMIT;
@LOC("THIS,LayerIIIDecoder.SI1") int quotien = (int) ((src_line - reste) / SSLIMIT);
- out_1d[des_line] = lr[ch][quotien][reste];
+ inter[des_line] = lr[ch][quotien][reste];
src_line += sfb_lines;
des_line++;
reste = src_line % SSLIMIT;
quotien = (int) ((src_line - reste) / SSLIMIT);
- out_1d[des_line] = lr[ch][quotien][reste];
+ inter[des_line] = lr[ch][quotien][reste];
src_line += sfb_lines;
des_line++;
reste = src_line % SSLIMIT;
quotien = (int) ((src_line - reste) / SSLIMIT);
- out_1d[des_line] = lr[ch][quotien][reste];
+ inter[des_line] = lr[ch][quotien][reste];
}
}
@LOC("THIS,LayerIIIDecoder.SI1") int j = reorder_table[sfreq][index];
@LOC("THIS,LayerIIIDecoder.SI1") int reste = j % SSLIMIT;
@LOC("THIS,LayerIIIDecoder.SI1") int quotien = (int) ((j - reste) / SSLIMIT);
- out_1d[index] = lr[ch][quotien][reste];
+ inter[index] = lr[ch][quotien][reste];
}
}
} else { // long blocks
// Modif E.B 02/22/99
@LOC("THIS,LayerIIIDecoder.SI1") int reste = index % SSLIMIT;
@LOC("THIS,LayerIIIDecoder.SI1") int quotien = (int) ((index - reste) / SSLIMIT);
- out_1d[index] = lr[ch][quotien][reste];
+ inter[index] = lr[ch][quotien][reste];
}
}
}
// ssjava
@LATTICE("IO<THIS,THIS<IN,THISLOC=THIS,GLOBALLOC=IN")
- private void stereo(@LOC("THIS,LayerIIIDecoder.CH0") int gr) {
+ private void stereo(@LOC("THIS,LayerIIIDecoder.HD1") Header header,
+ @LOC("THIS,LayerIIIDecoder.CH0") int gr) {
@LOC("THIS,LayerIIIDecoder.RO1") int sb;
@LOC("THIS,LayerIIIDecoder.RO1") int ss;
} else {
// gr_info_s gr_info = (si.ch[0].gr[gr]); remove alias
- @LOC("THIS,LayerIIIDecoder.HD1") int mode_ext = header.mode_extension();
+ @LOC("THIS,LayerIIIDecoder.SF1") int mode_ext = header.mode_extension();
@LOC("THIS,LayerIIIDecoder.RO1") int sfb;
@LOC("THIS,LayerIIIDecoder.RO1") int i;
@LOC("THIS,LayerIIIDecoder.RO1") int temp;
@LOC("THIS,LayerIIIDecoder.RO1") int temp2;
- @LOC("THIS,LayerIIIDecoder.CH0") boolean ms_stereo =
+ @LOC("THIS,LayerIIIDecoder.SF15") boolean ms_stereo =
((header.mode() == Header.JOINT_STEREO) && ((mode_ext & 0x2) != 0));
- @LOC("THIS,LayerIIIDecoder.CH0") boolean i_stereo =
+ @LOC("THIS,LayerIIIDecoder.SF15") boolean i_stereo =
((header.mode() == Header.JOINT_STEREO) && ((mode_ext & 0x1) != 0));
- @LOC("THIS,LayerIIIDecoder.CH0") boolean lsf =
+ @LOC("THIS,LayerIIIDecoder.SF15") boolean lsf =
((header.version() == Header.MPEG2_LSF || header.version() == Header.MPEG25_LSF)); // SZD
@LOC("THIS,LayerIIIDecoder.LR") int io_type = (si.ch[0].gr[gr].scalefac_compress & 1);
for (@LOC("THIS,LayerIIIDecoder.RO1") int j = 0; j < 3; j++) {
@LOC("THIS,LayerIIIDecoder.RO1") int sfbcnt;
sfbcnt = 2;
- for (sfb = 12; sfb >= 3; sfb--) {
+ TERMINATE: for (sfb = 12; sfb >= 3; sfb--) {
i = sfBandIndex[sfreq].s[sfb];
lines = sfBandIndex[sfreq].s[sfb + 1] - i;
i = (i << 2) - i + (j + 1) * lines - 1;
-
- while (lines > 0) {
+ TERMINATE: while (lines > 0) {
if (ro[1][i / 18][i % 18] != 0.0f) {
// MDM: in java, array access is very slow.
// Is quicker to compute div and mod values.
sb = sfBandIndex[sfreq].s[sfb + 1] - temp;
i = (temp << 2) - temp + j * sb;
- for (; sb > 0; sb--) {
+ TERMINATE: for (; sb > 0; sb--) {
is_pos[i] = scalefac[1].s[j][sfb];
if (is_pos[i] != 7)
if (lsf)
temp = sfBandIndex[sfreq].s[11];
sb = sfBandIndex[sfreq].s[12] - temp;
i = (temp << 2) - temp + j * sb;
-
- for (; sb > 0; sb--) {
+ TERMINATE: for (; sb > 0; sb--) {
is_pos[i] = is_pos[sfb];
if (lsf) {
i = 2;
ss = 17;
sb = -1;
- while (i >= 0) {
+ TERMINATE: while (i >= 0) {
if (ro[1][i][ss] != 0.0f) {
sb = (i << 4) + (i << 1) + ss;
i = -1;
i = sfBandIndex[sfreq].l[i];
for (; sfb < 8; sfb++) {
sb = sfBandIndex[sfreq].l[sfb + 1] - sfBandIndex[sfreq].l[sfb];
- for (; sb > 0; sb--) {
+ TERMINATE: for (; sb > 0; sb--) {
is_pos[i] = scalefac[1].l[sfb];
if (is_pos[i] != 7)
if (lsf)
for (@LOC("THIS,LayerIIIDecoder.RO1") int j = 0; j < 3; j++) {
@LOC("THIS,LayerIIIDecoder.RO1") int sfbcnt;
sfbcnt = -1;
- for (sfb = 12; sfb >= 0; sfb--) {
+ TERMINATE: for (sfb = 12; sfb >= 0; sfb--) {
temp = sfBandIndex[sfreq].s[sfb];
lines = sfBandIndex[sfreq].s[sfb + 1] - temp;
i = (temp << 2) - temp + (j + 1) * lines - 1;
-
- while (lines > 0) {
+ TERMINATE: while (lines > 0) {
if (ro[1][i / 18][i % 18] != 0.0f) {
// MDM: in java, array access is very slow.
// Is quicker to compute div and mod values.
temp = sfBandIndex[sfreq].s[sfb];
sb = sfBandIndex[sfreq].s[sfb + 1] - temp;
i = (temp << 2) - temp + j * sb;
- for (; sb > 0; sb--) {
+ TERMINATE: for (; sb > 0; sb--) {
is_pos[i] = scalefac[1].s[j][sfb];
if (is_pos[i] != 7)
if (lsf)
sfb = (temp << 2) - temp + j * sb;
sb = sfBandIndex[sfreq].s[12] - temp2;
i = (temp2 << 2) - temp2 + j * sb;
-
- for (; sb > 0; sb--) {
+ TERMINATE: for (; sb > 0; sb--) {
is_pos[i] = is_pos[sfb];
if (lsf) {
i = 31;
ss = 17;
sb = 0;
- while (i >= 0) {
+ TERMINATE: while (i >= 0) {
if (ro[1][i][ss] != 0.0f) {
sb = (i << 4) + (i << 1) + ss;
i = -1;
i = sfBandIndex[sfreq].l[i];
for (; sfb < 21; sfb++) {
sb = sfBandIndex[sfreq].l[sfb + 1] - sfBandIndex[sfreq].l[sfb];
- for (; sb > 0; sb--) {
+ TERMINATE: for (; sb > 0; sb--) {
is_pos[i] = scalefac[1].l[sfb];
if (is_pos[i] != 7)
if (lsf)
}
}
sfb = sfBandIndex[sfreq].l[20];
- for (sb = 576 - sfBandIndex[sfreq].l[21]; (sb > 0) && (i < 576); sb--) {
+ TERMINATE: for (sb = 576 - sfBandIndex[sfreq].l[21]; (sb > 0) && (i < 576); sb--) {
is_pos[i] = is_pos[sfb]; // error here : i >=576
if (lsf) {
@LOC("THIS,LayerIIIDecoder.SI1") int ss;
@LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.CH,LayerIIIDecoder$temporaire.GR2") int sb18lim;
- @LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.CH,LayerIIIDecoder$temporaire.GR1") gr_info_s gr_info =
- (si.ch[ch].gr[gr]);
+ // @LOC("THIS,LayerIIIDecoder.SI,LayerIIIDecoder$III_side_info_t.CH,LayerIIIDecoder$temporaire.GR1")
+ // gr_info_s gr_info =
+ // (si.ch[ch].gr[gr]);
// 31 alias-reduction operations between each pair of sub-bands
// with 8 butterflies between each pair
- if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)
- && !(gr_info.mixed_block_flag != 0))
+ if ((si.ch[ch].gr[gr].window_switching_flag != 0) && (si.ch[ch].gr[gr].block_type == 2)
+ && !(si.ch[ch].gr[gr].mixed_block_flag != 0))
return;
- if ((gr_info.window_switching_flag != 0) && (gr_info.mixed_block_flag != 0)
- && (gr_info.block_type == 2)) {
+ if ((si.ch[ch].gr[gr].window_switching_flag != 0) && (si.ch[ch].gr[gr].mixed_block_flag != 0)
+ && (si.ch[ch].gr[gr].block_type == 2)) {
sb18lim = 18;
} else {
sb18lim = 558;
for (ss = 0; ss < 8; ss++) {
@LOC("THIS,LayerIIIDecoder.SI1") int src_idx1 = sb18 + 17 - ss;
@LOC("THIS,LayerIIIDecoder.SI1") int src_idx2 = sb18 + 18 + ss;
- @LOC("THIS,LayerIIIDecoder.OUT") float bu = out_1d[src_idx1];
- @LOC("THIS,LayerIIIDecoder.OUT") float bd = out_1d[src_idx2];
- out_1d[src_idx1] = (bu * cs[ss]) - (bd * ca[ss]);
- out_1d[src_idx2] = (bd * cs[ss]) + (bu * ca[ss]);
+ @LOC("THIS,LayerIIIDecoder.OUT") float bu = inter[src_idx1];
+ @LOC("THIS,LayerIIIDecoder.OUT") float bd = inter[src_idx2];
+ inter[src_idx1] = (bu * cs[ss]) - (bd * ca[ss]);
+ inter[src_idx2] = (bd * cs[ss]) + (bu * ca[ss]);
}
}
}
private void hybrid(@LOC("THIS,LayerIIIDecoder.SI") int ch, @LOC("THIS,LayerIIIDecoder.SI") int gr) {
@LOC("THIS,LayerIIIDecoder.SI1") int bt;
- @LOC("SB") int sb18;
+ @LOC("THIS,LayerIIIDecoder.SI1") int sb18;
// gr_info_s gr_info = (si.ch[ch].gr[gr]); //remove alias
// @LOC("THIS,LayerIIIDecoder.TS") float[] tsOut; //remove alias
// float[][] prvblk;
for (sb18 = 0; sb18 < 576; sb18 += 18) {
- bt =
- ((si.ch[ch].gr[gr].window_switching_flag != 0)
- && (si.ch[ch].gr[gr].mixed_block_flag != 0) && (sb18 < 36)) ? 0
- : si.ch[ch].gr[gr].block_type;
+ if ((si.ch[ch].gr[gr].window_switching_flag != 0) && (si.ch[ch].gr[gr].mixed_block_flag != 0)
+ && (sb18 < 36)) {
+ bt = 0;
+ } else {
+ bt = si.ch[ch].gr[gr].block_type;
+ }
// tsOut = out_1d;
// Modif E.B 02/22/99
- for (@LOC("SB") int cc = 0; cc < 18; cc++)
+ for (@LOC("THIS,LayerIIIDecoder.SI1") int cc = 0; cc < 18; cc++)
tsOutCopy[cc] = out_1d[cc + sb18];
inv_mdct(bt);
- for (@LOC("SB") int cc = 0; cc < 18; cc++)
+ for (@LOC("THIS,LayerIIIDecoder.SI1") int cc = 0; cc < 18; cc++)
out_1d[cc + sb18] = tsOutCopy[cc];
// Fin Modif
// overlap addition
- // prvblk = prevblck; //eliminated unnecessary areas
-
out_1d[0 + sb18] = rawout[0] + prevblck[ch][sb18 + 0];
prevblck[ch][sb18 + 0] = rawout[18];
out_1d[1 + sb18] = rawout[1] + prevblck[ch][sb18 + 1];
/**
*
*/
- @LATTICE("THIS<SB,THIS<SS,SB<GLOBAL,SS<GLOBAL,SS*,SB*,THISLOC=THIS,GLOBALLOC=GLOBAL")
private void do_downmix() {
- for (@LOC("SB") int sb = 0; sb < SSLIMIT; sb++) {
- for (@LOC("SS") int ss = 0; ss < SSLIMIT; ss += 3) {
+ for (@LOC("THIS,LayerIIIDecoder.ISR") int sb = 0; sb < SSLIMIT; sb++) {
+ for (@LOC("THIS,LayerIIIDecoder.ISR") int ss = 0; ss < SSLIMIT; ss += 3) {
lr[0][sb][ss] = (lr[0][sb][ss] + lr[1][sb][ss]) * 0.5f;
lr[0][sb][ss + 1] = (lr[0][sb][ss + 1] + lr[1][sb][ss + 1]) * 0.5f;
lr[0][sb][ss + 2] = (lr[0][sb][ss + 2] + lr[1][sb][ss + 2]) * 0.5f;
}
@LATTICE("THIS<IN,THISLOC=THIS")
- public SBI(@LOC("IN") int[] thel, @LOC("IN") int[] thes) {
+ public SBI(@DELEGATE @LOC("IN") int[] thel, @DELEGATE @LOC("IN") int[] thes) {
l = thel;
s = thes;
}
}
}
- @LATTICE("CH")
+ @LATTICE("CH<TEMP,TEMP*")
static class III_side_info_t {
@LOC("CH")
/***************************************************************/
/* END OF INV_MDCT */
/***************************************************************/
- @LATTICE("N<VAR")
- class Sftable {
- @LOC("VAR")
- public int[] l;
- @LOC("VAR")
- public int[] s;
-
- public Sftable() {
- l = new int[5];
- s = new int[3];
- }
-
- @LATTICE("THIS<IN,THISLOC=THIS")
- public Sftable(@LOC("IN") int[] thel, @LOC("IN") int[] thes) {
- l = thel;
- s = thes;
- }
- }
-
- @LOC("F")
- public Sftable sftable;
public static final int nr_of_sfb_block[][][] = {
{ { 6, 5, 5, 5 }, { 9, 9, 9, 9 }, { 6, 9, 9, 9 } },