d3a3e1d5919e125656d89042e4e61169b3c7d860
[IRC.git] / Robust / src / Tests / ssJava / mp3decoder / SideInfoBuffer.java
1 public class SideInfoBuffer {
2
3         /**
4          * The frame buffer that holds the data for the current frame.
5          */
6         private final int[] framebuffer = new int[BUFFER_INT_SIZE];
7
8         /**
9          * Maximum size of the frame buffer.
10          */
11         private static final int BUFFER_INT_SIZE = 433;
12
13         /**
14          * Index into <code>framebuffer</code> where the next bits are retrieved.
15          */
16         private int wordpointer;
17
18         /**
19          * Number (0-31, from MSB to LSB) of next bit for get_bits()
20          */
21         private int bitindex;
22
23         private int main_data_begin;
24
25         public int getMain_data_begin() {
26                 return main_data_begin;
27         }
28
29         public void setMain_data_begin(int main_data_begin) {
30                 this.main_data_begin = main_data_begin;
31         }
32
33         private final int bitmask[] = {
34                         0, // dummy
35                         0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F,
36                         0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF,
37                         0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF,
38                         0x0000FFFF, 0x0001FFFF };
39
40         public int get_bits(int number_of_bits) {
41                 int returnvalue = 0;
42                 int sum = bitindex + number_of_bits;
43                 // System.out.println("bitindex=" + bitindex + " wordpointer="
44                 // + wordpointer);
45                 // E.B
46                 // There is a problem here, wordpointer could be -1 ?!
47                 if (wordpointer < 0)
48                         wordpointer = 0;
49                 // E.B : End.
50
51                 if (sum <= 32) {
52                         // all bits contained in *wordpointer
53                         returnvalue = (framebuffer[wordpointer] >>> (32 - sum))
54                                         & bitmask[number_of_bits];
55                         // returnvalue = (wordpointer[0] >> (32 - sum)) &
56                         // bitmask[number_of_bits];
57                         if ((bitindex += number_of_bits) == 32) {
58                                 bitindex = 0;
59                                 wordpointer++; // added by me!
60                         }
61                         return returnvalue;
62                 }
63
64                 // E.B : Check that ?
65                 // ((short[])&returnvalue)[0] = ((short[])wordpointer + 1)[0];
66                 // wordpointer++; // Added by me!
67                 // ((short[])&returnvalue + 1)[0] = ((short[])wordpointer)[0];
68                 int Right = (framebuffer[wordpointer] & 0x0000FFFF);
69                 wordpointer++;
70                 int Left = (framebuffer[wordpointer] & 0xFFFF0000);
71                 returnvalue = ((Right << 16) & 0xFFFF0000)
72                                 | ((Left >>> 16) & 0x0000FFFF);
73
74                 returnvalue >>>= 48 - sum; // returnvalue >>= 16 - (number_of_bits - (32
75                                                                         // - bitindex))
76                 returnvalue &= bitmask[number_of_bits];
77                 bitindex = sum - 32;
78                 return returnvalue;
79         }
80
81         public void setBuffer(int idx, int value) {
82                 framebuffer[idx] = value;
83         }
84
85 }