having new variable 'inter' in-between "reorder/antialias" and "hybrid" in order...
[IRC.git] / Robust / src / Tests / ssJava / mp3decoder / LayerIIIDecoder.java
index 31b71e2b8587abb7449e9e2294bf4d29d7fe5961..8714428bb07d9728353fddea7c47c1e4c08cc26b 100644 (file)
@@ -47,8 +47,8 @@
 // 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")
@@ -65,6 +65,8 @@ final class LayerIIIDecoder implements FrameDecoder {
   @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;
@@ -72,14 +74,12 @@ final class LayerIIIDecoder implements FrameDecoder {
   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")
@@ -89,7 +89,7 @@ final class LayerIIIDecoder implements FrameDecoder {
 
   // @LOC("SBT") private temporaire2[] III_scalefac_t;
   @LOC("SF2")
-  private temporaire2[] scalefac;
+  private final temporaire2[] scalefac;
   // private III_scalefac_t scalefac;
 
   @LOC("CH0")
@@ -98,7 +98,7 @@ final class LayerIIIDecoder implements FrameDecoder {
   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")
@@ -106,23 +106,25 @@ final class LayerIIIDecoder implements FrameDecoder {
   @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];
@@ -199,21 +201,14 @@ final class LayerIIIDecoder implements FrameDecoder {
         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;
@@ -245,16 +240,184 @@ final class LayerIIIDecoder implements FrameDecoder {
       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.
    */
@@ -267,8 +430,8 @@ final class LayerIIIDecoder implements FrameDecoder {
     br = new BitReserve();
   }
 
-  public void decodeFrame() {
-    decode();
+  public void decodeFrame(@LOC("IN") Header header) {
+    decode(header);
   }
 
   /**
@@ -290,8 +453,19 @@ final class LayerIIIDecoder implements FrameDecoder {
    * {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();
 
@@ -309,36 +483,39 @@ final class LayerIIIDecoder implements FrameDecoder {
     @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();
@@ -354,14 +531,23 @@ final class LayerIIIDecoder implements FrameDecoder {
 
         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) {
@@ -385,7 +571,7 @@ final class LayerIIIDecoder implements FrameDecoder {
               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
@@ -396,7 +582,7 @@ final class LayerIIIDecoder implements FrameDecoder {
               sb++;
             }
             filter2.input_samples(samples2);
-            filter2.calculate_pcm_samples(buffer);
+            filter2.calculate_pcm_samples();
           }
 
         }
@@ -407,7 +593,7 @@ final class LayerIIIDecoder implements FrameDecoder {
     // if (counter < 609)
     // {
     counter++; // count should be loc*
-    buffer.write_buffer(1); // buffer!!!
+    // buffer.write_buffer(1); // buffer!!!
     // }
     // else if (counter == 609)
     // {
@@ -424,10 +610,17 @@ final class LayerIIIDecoder implements FrameDecoder {
    * 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)
@@ -452,8 +645,11 @@ final class LayerIIIDecoder implements FrameDecoder {
           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);
 
@@ -484,6 +680,9 @@ final class LayerIIIDecoder implements FrameDecoder {
             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);
@@ -504,9 +703,12 @@ final class LayerIIIDecoder implements FrameDecoder {
         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);
@@ -538,6 +740,9 @@ final class LayerIIIDecoder implements FrameDecoder {
           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);
@@ -550,8 +755,8 @@ final class LayerIIIDecoder implements FrameDecoder {
         *
         */
   @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
 
@@ -664,16 +869,16 @@ final class LayerIIIDecoder implements FrameDecoder {
 
   // 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;
@@ -750,13 +955,14 @@ final class LayerIIIDecoder implements FrameDecoder {
       }
     }
 
-    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++;
 
@@ -768,15 +974,15 @@ final class LayerIIIDecoder implements FrameDecoder {
         *
         */
   @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
@@ -827,30 +1033,33 @@ final class LayerIIIDecoder implements FrameDecoder {
   // 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
 
@@ -876,15 +1085,22 @@ final class LayerIIIDecoder implements FrameDecoder {
 
     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);
 
@@ -892,16 +1108,18 @@ final class LayerIIIDecoder implements FrameDecoder {
       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];
@@ -1162,7 +1380,7 @@ final class LayerIIIDecoder implements FrameDecoder {
     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) {
@@ -1171,7 +1389,7 @@ final class LayerIIIDecoder implements FrameDecoder {
           // 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
         /*
@@ -1195,21 +1413,21 @@ final class LayerIIIDecoder implements FrameDecoder {
             @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];
           }
         }
 
@@ -1218,7 +1436,7 @@ final class LayerIIIDecoder implements FrameDecoder {
           @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
@@ -1226,7 +1444,7 @@ final class LayerIIIDecoder implements FrameDecoder {
         // 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];
       }
     }
   }
@@ -1242,7 +1460,8 @@ final class LayerIIIDecoder implements FrameDecoder {
 
   // 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;
 
@@ -1258,7 +1477,7 @@ final class LayerIIIDecoder implements FrameDecoder {
     } 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;
@@ -1266,11 +1485,11 @@ final class LayerIIIDecoder implements FrameDecoder {
       @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);
@@ -1292,12 +1511,11 @@ final class LayerIIIDecoder implements FrameDecoder {
             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.
@@ -1323,7 +1541,7 @@ final class LayerIIIDecoder implements FrameDecoder {
                 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)
@@ -1341,8 +1559,7 @@ final class LayerIIIDecoder implements FrameDecoder {
               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) {
@@ -1358,7 +1575,7 @@ final class LayerIIIDecoder implements FrameDecoder {
               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;
@@ -1377,7 +1594,7 @@ final class LayerIIIDecoder implements FrameDecoder {
               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)
@@ -1392,12 +1609,11 @@ final class LayerIIIDecoder implements FrameDecoder {
             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.
@@ -1416,7 +1632,7 @@ final class LayerIIIDecoder implements FrameDecoder {
                 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)
@@ -1434,8 +1650,7 @@ final class LayerIIIDecoder implements FrameDecoder {
               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) {
@@ -1452,7 +1667,7 @@ final class LayerIIIDecoder implements FrameDecoder {
           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;
@@ -1472,7 +1687,7 @@ final class LayerIIIDecoder implements FrameDecoder {
           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)
@@ -1483,7 +1698,7 @@ final class LayerIIIDecoder implements FrameDecoder {
             }
           }
           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) {
@@ -1540,17 +1755,18 @@ final class LayerIIIDecoder implements FrameDecoder {
     @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;
@@ -1560,10 +1776,10 @@ final class LayerIIIDecoder implements FrameDecoder {
       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]);
       }
     }
   }
@@ -1583,32 +1799,32 @@ final class LayerIIIDecoder implements FrameDecoder {
   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];
@@ -1651,10 +1867,9 @@ final class LayerIIIDecoder implements FrameDecoder {
   /**
         *
         */
-  @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;
@@ -2097,7 +2312,7 @@ final class LayerIIIDecoder implements FrameDecoder {
     }
 
     @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;
     }
@@ -2161,7 +2376,7 @@ final class LayerIIIDecoder implements FrameDecoder {
     }
   }
 
-  @LATTICE("CH")
+  @LATTICE("CH<TEMP,TEMP*")
   static class III_side_info_t {
 
     @LOC("CH")
@@ -2648,27 +2863,6 @@ final class LayerIIIDecoder implements FrameDecoder {
   /***************************************************************/
   /* 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 } },