From 3b010fe8985ad3bbf5c2796620d5684013c770fb Mon Sep 17 00:00:00 2001 From: yeom Date: Fri, 21 Oct 2011 17:32:10 +0000 Subject: [PATCH] moves MP3Decoder codes to Benchmark directory --- .../SSJava/DefinitelyWrittenCheck.java | 6 +- .../SSJava/JavaNator/RobotMain.java | 1 + .../SSJava/MP3Decoder/AudioDevice.java | 79 + .../SSJava/MP3Decoder/BitReserve.java | 172 + .../SSJava/MP3Decoder/Bitstream.java | 747 +++++ .../SSJava/MP3Decoder/BitstreamErrors.java | 70 + .../SSJava/MP3Decoder/BitstreamException.java | 70 + .../SSJava/MP3Decoder/BitstreamWrapper.java | 17 + .../Benchmarks/SSJava/MP3Decoder/Control.java | 55 + .../Benchmarks/SSJava/MP3Decoder/Crc16.java | 75 + .../Benchmarks/SSJava/MP3Decoder/Decoder.java | 296 ++ .../SSJava/MP3Decoder/DecoderErrors.java | 44 + .../SSJava/MP3Decoder/DecoderException.java | 61 + .../SSJava/MP3Decoder/Equalizer.java | 200 ++ .../SSJava/MP3Decoder/FrameDecoder.java | 38 + .../Benchmarks/SSJava/MP3Decoder/Header.java | 843 +++++ .../SSJava/MP3Decoder/HuffData.java | 19 + .../SSJava/MP3Decoder/InputStreamSource.java | 78 + .../SSJava/MP3Decoder/JavaLayerError.java | 29 + .../SSJava/MP3Decoder/JavaLayerErrors.java | 39 + .../SSJava/MP3Decoder/JavaLayerException.java | 79 + .../SSJava/MP3Decoder/JavaLayerHook.java | 35 + .../SSJava/MP3Decoder/JavaLayerUtils.java | 227 ++ .../Benchmarks/SSJava/MP3Decoder/LATTICE.java | 3 + .../src/Benchmarks/SSJava/MP3Decoder/LOC.java | 7 + .../SSJava/MP3Decoder/LayerIDecoder.java | 432 +++ .../SSJava/MP3Decoder/LayerIIDecoder.java | 1130 +++++++ .../SSJava/MP3Decoder/LayerIIIDecoder.java | 2968 +++++++++++++++++ .../SSJava/MP3Decoder/METHODDEFAULT.java | 3 + .../SSJava/MP3Decoder/MP3Player.java | 41 + .../Benchmarks/SSJava/MP3Decoder/Manager.java | 45 + .../Benchmarks/SSJava/MP3Decoder/Obuffer.java | 97 + .../SSJava/MP3Decoder/OutputChannels.java | 129 + .../Benchmarks/SSJava/MP3Decoder/Player.java | 239 ++ .../SSJava/MP3Decoder/SampleBuffer.java | 162 + .../MP3Decoder/SampleBufferWrapper.java | 35 + .../SSJava/MP3Decoder/SideInfoBuffer.java | 89 + .../Benchmarks/SSJava/MP3Decoder/Source.java | 48 + .../Benchmarks/SSJava/MP3Decoder/Subband.java | 44 + .../SSJava/MP3Decoder/SynthesisFilter.java | 2224 ++++++++++++ .../Benchmarks/SSJava/MP3Decoder/focus.mp3 | Bin 0 -> 107754 bytes .../SSJava/MP3Decoder/huffcodetab.java | 663 ++++ .../src/Benchmarks/SSJava/MP3Decoder/makefile | 23 + .../SSJava/MP3Decoder/outputfocusmp3 | 168 + Robust/src/Benchmarks/SSJava/MP3Decoder/run | 1 + .../src/Benchmarks/SSJava/MP3Decoder/ssoutput | 168 + 46 files changed, 11997 insertions(+), 2 deletions(-) create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/AudioDevice.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/BitReserve.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Bitstream.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamErrors.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamException.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamWrapper.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Control.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Crc16.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Decoder.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderErrors.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderException.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Equalizer.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/FrameDecoder.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Header.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/HuffData.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/InputStreamSource.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerError.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerErrors.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerException.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerHook.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerUtils.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/LATTICE.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/LOC.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/LayerIDecoder.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/LayerIIDecoder.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/LayerIIIDecoder.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/METHODDEFAULT.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/MP3Player.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Manager.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Obuffer.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/OutputChannels.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Player.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/SampleBuffer.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/SampleBufferWrapper.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/SideInfoBuffer.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Source.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/Subband.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/SynthesisFilter.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/focus.mp3 create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/huffcodetab.java create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/makefile create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/outputfocusmp3 create mode 100755 Robust/src/Benchmarks/SSJava/MP3Decoder/run create mode 100644 Robust/src/Benchmarks/SSJava/MP3Decoder/ssoutput diff --git a/Robust/src/Analysis/SSJava/DefinitelyWrittenCheck.java b/Robust/src/Analysis/SSJava/DefinitelyWrittenCheck.java index f23e0f0c..aa7a697f 100644 --- a/Robust/src/Analysis/SSJava/DefinitelyWrittenCheck.java +++ b/Robust/src/Analysis/SSJava/DefinitelyWrittenCheck.java @@ -1422,7 +1422,6 @@ public class DefinitelyWrittenCheck { case FKind.FlatFieldNode: case FKind.FlatElementNode: { - if (fn.kind() == FKind.FlatFieldNode) { FlatFieldNode ffn = (FlatFieldNode) fn; lhs = ffn.getDst(); @@ -1443,13 +1442,16 @@ public class DefinitelyWrittenCheck { // read field NTuple srcHeapPath = mapHeapPath.get(rhs); - System.out.println("rhs=" + rhs); + NTuple fldHeapPath; if (srcHeapPath != null) { fldHeapPath = new NTuple(srcHeapPath.getList()); } else { // if srcHeapPath is null, it is static reference + System.out.println("##"); + System.out.println("rhs=" + rhs + " fd=" + fld); fldHeapPath = new NTuple(); + fldHeapPath.add(rhs); } fldHeapPath.add(fld); diff --git a/Robust/src/Benchmarks/SSJava/JavaNator/RobotMain.java b/Robust/src/Benchmarks/SSJava/JavaNator/RobotMain.java index dbdd0705..51d9dd45 100644 --- a/Robust/src/Benchmarks/SSJava/JavaNator/RobotMain.java +++ b/Robust/src/Benchmarks/SSJava/JavaNator/RobotMain.java @@ -199,6 +199,7 @@ public class RobotMain { } break; default: + strategyMgr.stop(); System.out.println("processIOCommand: Default: opCode = " + Integer.toString((int) opCode) + " data = " + Integer.toString((int) data)); } diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/AudioDevice.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/AudioDevice.java new file mode 100644 index 00000000..17dc9036 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/AudioDevice.java @@ -0,0 +1,79 @@ +// dummy audio device +/** + * The JavaSoundAudioDevice implements an audio device by using the + * JavaSound API. + * + * @since 0.0.8 + * @author Mat McGowan + */ +public class AudioDevice { + + /** + * Prepares the AudioDevice for playback of audio samples. + * + * @param decoder + * The decoder that will be providing the audio samples. + * + * If the audio device is already open, this method returns silently. + * + */ + public void open(Decoder decoder) throws JavaLayerException { + + } + + /** + * Retrieves the open state of this audio device. + * + * @return true if this audio device is open and playing audio + * samples, or false otherwise. + */ + public boolean isOpen() { + return true; + } + + /** + * Writes a number of samples to this AudioDevice. + * + * @param samples + * The array of signed 16-bit samples to write to the audio device. + * @param offs + * The offset of the first sample. + * @param len + * The number of samples to write. + * + * This method may return prior to the samples actually being played + * by the audio device. + */ + public void write(short[] samples, int offs, int len) throws JavaLayerException { + + } + + /** + * Closes this audio device. Any currently playing audio is stopped as soon as + * possible. Any previously written audio data that has not been heard is + * discarded. + * + * The implementation should ensure that any threads currently blocking on the + * device (e.g. during a write or flush operation + * should be unblocked by this method. + */ + public void close() { + + } + + /** + * Blocks until all audio samples previously written to this audio device have + * been heard. + */ + public void flush() { + + } + + /** + * Retrieves the current playback position in milliseconds. + */ + public int getPosition() { + return 0; + } + +} \ No newline at end of file diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/BitReserve.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitReserve.java new file mode 100644 index 00000000..15f4a068 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitReserve.java @@ -0,0 +1,172 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * + * 12/12/99 0.0.7 Implementation stores single bits + * as ints for better performance. mdm@techie.com. + * + * 02/28/99 0.0 Java Conversion by E.B, javalayer@javazoom.net + * + * Adapted from the public c code by Jeff Tsay. + * + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * Implementation of Bit Reservoir for Layer III. + *

+ * The implementation stores single bits as a word in the buffer. If a bit is + * set, the corresponding word in the buffer will be non-zero. If a bit is + * clear, the corresponding word is zero. Although this may seem waseful, this + * can be a factor of two quicker than packing 8 bits to a byte and extracting. + *

+ */ + +// REVIEW: there is no range checking, so buffer underflow or overflow +// can silently occur. +@LATTICE("BUF 0) { + val <<= 1; + val |= ((buf[pos++] != 0) ? 1 : 0); + } + } else { + TERMINATE: + while (N-- > 0) { + val <<= 1; + val |= ((buf[pos] != 0) ? 1 : 0); + pos = (pos + 1) & BUFSIZE_MASK; + } + } + + buf_byte_idx = pos; + + return val; + + } + + /** + * Returns next bit from reserve. + * + * @returns 0 if next bit is reset, or 1 if next bit is set. + */ + @RETURNLOC("THIS,BitReserve.BIT") + public int hget1bit() { + totbit++; + @LOC("THIS,BitReserve.BIT") int val = buf[buf_byte_idx]; + buf_byte_idx = (buf_byte_idx + 1) & BUFSIZE_MASK; + return val; + } + + /** + * Write 8 bits into the bit stream. + */ + @LATTICE("OUTBistream class is responsible for parsing an MPEG audio + * bitstream. + * + * REVIEW: much of the parsing currently occurs in the various decoders. + * This should be moved into this class and associated inner classes. + */ +@LATTICE("FBframebuffer where the next bits are retrieved. + */ + @LOC("WP") + private int wordpointer; + + /** + * Number (0-31, from MSB to LSB) of next bit for get_bits() + */ + @LOC("BI") + private int bitindex; + + /** + * The current specified syncword + */ + @LOC("F") + private int syncword; + + /** + * Audio header position in stream. + */ + @LOC("F") + private int header_pos = 0; + + /** + * + */ + @LOC("F") + private boolean single_ch_mode; + // private int current_frame_number; + // private int last_frame_number; + + @LOC("F") + private final int bitmask[] = { + 0, // dummy + 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, + 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, + 0x00007FFF, 0x0000FFFF, 0x0001FFFF }; + + @LOC("F") + private final PushbackInputStream source; + + @LOC("F") + private final Header header = new Header(); + + @LOC("F") + private final byte syncbuf[] = new byte[4]; + + @LOC("F") + private Crc16[] crc = new Crc16[1]; + + @LOC("F") + private byte[] rawid3v2 = null; + + @LOC("FF") + private boolean firstframe = true; + + private BitReserve br; + private int main_data_begin; + private int frame_start; + + /** + * Construct a IBitstream that reads data from a given InputStream. + * + * @param in + * The InputStream to read from. + */ + public Bitstream(InputStream in) { + if (in == null) + throw new NullPointerException("in"); + in = new BufferedInputStream(in); + loadID3v2(in); + firstframe = true; + // source = new PushbackInputStream(in, 1024); + source = new PushbackInputStream(in, BUFFER_INT_SIZE * 4); + + closeFrame(); + // current_frame_number = -1; + // last_frame_number = -1; + + br = new BitReserve(); + + } + + /** + * Return position of the first audio header. + * + * @return size of ID3v2 tag frames. + */ + public int header_pos() { + return header_pos; + } + + /** + * Load ID3v2 frames. + * + * @param in + * MP3 InputStream. + * @author JavaZOOM + */ + private void loadID3v2(InputStream in) { + int size = -1; + try { + // Read ID3v2 header (10 bytes). + in.mark(10); + size = readID3v2Header(in); + header_pos = size; + } catch (IOException e) { + } finally { + try { + // Unread ID3v2 header (10 bytes). + in.reset(); + } catch (IOException e) { + } + } + // Load ID3v2 tags. + try { + if (size > 0) { + rawid3v2 = new byte[size]; + in.read(rawid3v2, 0, rawid3v2.length); + } + } catch (IOException e) { + } + } + + /** + * Parse ID3v2 tag header to find out size of ID3v2 frames. + * + * @param in + * MP3 InputStream + * @return size of ID3v2 frames + header + * @throws IOException + * @author JavaZOOM + */ + private int readID3v2Header(InputStream in) throws IOException { + byte[] id3header = new byte[4]; + int size = -10; + in.read(id3header, 0, 3); + // Look for ID3v2 + if ((id3header[0] == 'I') && (id3header[1] == 'D') && (id3header[2] == '3')) { + in.read(id3header, 0, 3); + int majorVersion = id3header[0]; + int revision = id3header[1]; + in.read(id3header, 0, 4); + size = + (int) (id3header[0] << 21) + (id3header[1] << 14) + (id3header[2] << 7) + (id3header[3]); + } + return (size + 10); + } + + /** + * Return raw ID3v2 frames + header. + * + * @return ID3v2 InputStream or null if ID3v2 frames are not available. + */ + public InputStream getRawID3v2() { + if (rawid3v2 == null) + return null; + else { + ByteArrayInputStream bain = new ByteArrayInputStream(rawid3v2); + return bain; + } + } + + /** + * Close the Bitstream. + * + * @throws BitstreamException + */ + public void close() throws BitstreamException { + try { + source.close(); + } catch (IOException ex) { + throw newBitstreamException(STREAM_ERROR, ex); + } + } + + /** + * Reads and parses the next frame from the input source. + * + * @return the Header describing details of the frame read, or null if the end + * of the stream has been reached. + */ + public Header readFrame() throws BitstreamException { + + Header result = null; + try { + result = readNextFrame(); + if (result == null) { + return null; + } + // E.B, Parse VBR (if any) first frame. + if (firstframe == true) { + result.parseVBR(frame_bytes); + firstframe = false; + } + + int channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2; + + result.setSideInfoBuf(getSideInfoBuffer(channels)); + result.setBitReserve(getBitReserve(result.slots())); + + closeFrame(); + + } catch (BitstreamException ex) { + if ((ex.getErrorCode() == INVALIDFRAME)) { + // Try to skip this frame. + // System.out.println("INVALIDFRAME"); + try { + closeFrame(); + result = readNextFrame(); + } catch (BitstreamException e) { + if ((e.getErrorCode() != STREAM_EOF)) { + // wrap original exception so stack trace is maintained. + throw newBitstreamException(e.getErrorCode(), e); + } + } + } else if ((ex.getErrorCode() != STREAM_EOF)) { + // wrap original exception so stack trace is maintained. + throw newBitstreamException(ex.getErrorCode(), ex); + } + } + + return result; + } + + /** + * Read next MP3 frame. + * + * @return MP3 frame header. + * @throws BitstreamException + */ + private Header readNextFrame() throws BitstreamException { + if (framesize == -1) { + if (nextFrame() == -1) { + return null; + } + } + return header; + } + + /** + * Read next MP3 frame. + * + * @throws BitstreamException + */ + private int nextFrame() throws BitstreamException { + // entire frame is read by the header class. + // header.read_header(this, crc); + return header.read_header(this, crc); + } + + /** + * Unreads the bytes read from the frame. + * + * @throws BitstreamException + */ + // REVIEW: add new error codes for this. + public void unreadFrame() throws BitstreamException { + if (wordpointer == -1 && bitindex == -1 && (framesize > 0)) { + try { + source.unread(frame_bytes, 0, framesize); + } catch (IOException ex) { + throw newBitstreamException(STREAM_ERROR); + } + } + } + + /** + * Close MP3 frame. + */ + public void closeFrame() { + framesize = -1; + wordpointer = -1; + bitindex = -1; + } + + /** + * Determines if the next 4 bytes of the stream represent a frame header. + */ + public boolean isSyncCurrentPosition(int syncmode) throws BitstreamException { + int read = readBytes(syncbuf, 0, 4); + int headerstring = + ((syncbuf[0] << 24) & 0xFF000000) | ((syncbuf[1] << 16) & 0x00FF0000) + | ((syncbuf[2] << 8) & 0x0000FF00) | ((syncbuf[3] << 0) & 0x000000FF); + + try { + source.unread(syncbuf, 0, read); + } catch (IOException ex) { + } + + boolean sync = false; + switch (read) { + case 0: + sync = true; + break; + case 4: + sync = isSyncMark(headerstring, syncmode, syncword); + break; + } + + return sync; + } + + // REVIEW: this class should provide inner classes to + // parse the frame contents. Eventually, readBits will + // be removed. + public int readBits(int n) { + return get_bits(n); + } + + public int peek_bits(int number_of_bits) { + + int peekbitindex = bitindex; + int peekPointer = wordpointer; + + int returnvalue = 0; + int sum = peekbitindex + number_of_bits; + + if (peekPointer < 0) { + peekPointer = 0; + } + + if (sum <= 32) { + // all bits contained in *wordpointer + returnvalue = (framebuffer[peekPointer] >>> (32 - sum)) & bitmask[number_of_bits]; + // returnvalue = (wordpointer[0] >> (32 - sum)) & + // bitmask[number_of_bits]; + if ((peekbitindex += number_of_bits) == 32) { + peekbitindex = 0; + peekPointer++; // added by me! + } + return returnvalue; + } + + // E.B : Check that ? + // ((short[])&returnvalue)[0] = ((short[])wordpointer + 1)[0]; + // wordpointer++; // Added by me! + // ((short[])&returnvalue + 1)[0] = ((short[])wordpointer)[0]; + int Right = (framebuffer[peekPointer] & 0x0000FFFF); + peekPointer++; + int Left = (framebuffer[peekPointer] & 0xFFFF0000); + returnvalue = ((Right << 16) & 0xFFFF0000) | ((Left >>> 16) & 0x0000FFFF); + + returnvalue >>>= 48 - sum; // returnvalue >>= 16 - (number_of_bits - (32 + // - bitindex)) + returnvalue &= bitmask[number_of_bits]; + peekbitindex = sum - 32; + return returnvalue; + + } + + public int readCheckedBits(int n) { + // REVIEW: implement CRC check. + return get_bits(n); + } + + protected BitstreamException newBitstreamException(int errorcode) { + return new BitstreamException(errorcode, null); + } + + protected BitstreamException newBitstreamException(int errorcode, Throwable throwable) { + return new BitstreamException(errorcode, throwable); + } + + /** + * Get next 32 bits from bitstream. They are stored in the headerstring. + * syncmod allows Synchro flag ID The returned value is False at the end of + * stream. + */ + + int syncHeader(byte syncmode) throws BitstreamException { + boolean sync; + int headerstring; + // read additional 2 bytes + int bytesRead = readBytes(syncbuf, 0, 3); + + if (bytesRead != 3) + throw newBitstreamException(STREAM_EOF, null); + + headerstring = + ((syncbuf[0] << 16) & 0x00FF0000) | ((syncbuf[1] << 8) & 0x0000FF00) + | ((syncbuf[2] << 0) & 0x000000FF); + + do { + headerstring <<= 8; + + if (readBytes(syncbuf, 3, 1) != 1) { + // System.out.println("THROW NEW BITSTREAM EXCEPTION"); + return -1; + throw newBitstreamException(STREAM_EOF, null); + } + + headerstring |= (syncbuf[3] & 0x000000FF); + + sync = isSyncMark(headerstring, syncmode, syncword); + } while (!sync); + + // current_frame_number++; + // if (last_frame_number < current_frame_number) last_frame_number = + // current_frame_number; + + return headerstring; + } + + public boolean isSyncMark(int headerstring, int syncmode, int word) { + boolean sync = false; + + if (syncmode == INITIAL_SYNC) { + // sync = ((headerstring & 0xFFF00000) == 0xFFF00000); + sync = ((headerstring & 0xFFE00000) == 0xFFE00000); // SZD: MPEG 2.5 + } else { + sync = + ((headerstring & 0xFFF80C00) == word) + && (((headerstring & 0x000000C0) == 0x000000C0) == single_ch_mode); + } + + // filter out invalid sample rate + if (sync) + sync = (((headerstring >>> 10) & 3) != 3); + // filter out invalid layer + if (sync) + sync = (((headerstring >>> 17) & 3) != 0); + // filter out invalid version + if (sync) + sync = (((headerstring >>> 19) & 3) != 1); + + return sync; + } + + /** + * Reads the data for the next frame. The frame is not parsed until parse + * frame is called. + */ + int read_frame_data(int bytesize) throws BitstreamException { + int numread = 0; + numread = readFully(frame_bytes, 0, bytesize); + framesize = bytesize; + wordpointer = -1; + bitindex = -1; + return numread; + } + + /** + * Parses the data previously read with read_frame_data(). + */ + @LATTICE("GLOBAL>> (32 - sum)) & bitmask[number_of_bits]; + // returnvalue = (wordpointer[0] >> (32 - sum)) & bitmask[number_of_bits]; + if ((bitindex += number_of_bits) == 32) { + bitindex = 0; + wordpointer++; // added by me! + } + return returnvalue; + } + + // E.B : Check that ? + // ((short[])&returnvalue)[0] = ((short[])wordpointer + 1)[0]; + // wordpointer++; // Added by me! + // ((short[])&returnvalue + 1)[0] = ((short[])wordpointer)[0]; + @LOC("RL") int Right = (framebuffer[wordpointer] & 0x0000FFFF); + wordpointer++; + @LOC("RL") int Left = (framebuffer[wordpointer] & 0xFFFF0000); + returnvalue = ((Right << 16) & 0xFFFF0000) | ((Left >>> 16) & 0x0000FFFF); + + returnvalue >>>= 48 - sum; // returnvalue >>= 16 - (number_of_bits - (32 - + // bitindex)) + returnvalue &= bitmask[number_of_bits]; + bitindex = sum - 32; + return returnvalue; + } + + /** + * Set the word we want to sync the header to. In Big-Endian byte order + */ + void set_syncword(@LOC("IN") int syncword0) { + syncword = syncword0 & 0xFFFFFF3F; + single_ch_mode = ((syncword0 & 0x000000C0) == 0x000000C0); + } + + /** + * Reads the exact number of bytes from the source input stream into a byte + * array. + * + * @param b + * The byte array to read the specified number of bytes into. + * @param offs + * The index in the array where the first byte read should be stored. + * @param len + * the number of bytes to read. + * + * @exception BitstreamException + * is thrown if the specified number of bytes could not be read + * from the stream. + */ + @LATTICE("OUT 0) { + @LOC("IN") int bytesread = source.read(b, offs, len); + if (bytesread == -1) { + while (len-- > 0) { + b[offs++] = 0; + } + break; + // throw newBitstreamException(UNEXPECTED_EOF, new EOFException()); + } + nRead = nRead + bytesread; + offs += bytesread; + len -= bytesread; + } + } catch (IOException ex) { + throw newBitstreamException(STREAM_ERROR, ex); + } + return nRead; + } + + /** + * Simlar to readFully, but doesn't throw exception when EOF is reached. + */ + @LATTICE("OUT 0) { + @LOC("IN") int bytesread = source.read(b, offs, len); + if (bytesread == -1) { + break; + } + totalBytesRead += bytesread; + offs += bytesread; + len -= bytesread; + } + } catch (IOException ex) { + throw newBitstreamException(STREAM_ERROR, ex); + } + return totalBytesRead; + } + + public SideInfoBuffer getSideInfoBuffer(int channelType) { + + if (wordpointer < 0) + wordpointer = 0; + + SideInfoBuffer sib = new SideInfoBuffer(); + + // first, store main_data_begin from the side inforamtion + main_data_begin = peek_bits(9); + + int max; + if (channelType == 1) { // mono + max = wordpointer + 4; + } else { + max = wordpointer + 8; + } + + try { + for (; wordpointer < max; wordpointer++) { + sib.setBuffer(wordpointer, framebuffer[wordpointer]); + } + } catch (ArrayIndexOutOfBoundsException e) { + System.out.print("wordpointer=" + wordpointer); + System.out.println("framebuffer length=" + framebuffer.length); + } + + return sib; + } + + public BitReserve getBitReserve(int nSlots) { + + int flush_main; + int bytes_to_discard; + int i; + + for (i = 0; i < nSlots; i++) + br.hputbuf(get_bits(8)); + + int main_data_end = br.hsstell() >>> 3; // of previous frame + + if ((flush_main = (br.hsstell() & 7)) != 0) { + br.hgetbits(8 - flush_main); + main_data_end++; + } + + bytes_to_discard = frame_start - main_data_end - main_data_begin; + + frame_start += nSlots; + + if (bytes_to_discard < 0) { + return null; + } + + if (main_data_end > 4096) { + frame_start -= 4096; + br.rewindNbytes(4096); + } + + for (; bytes_to_discard > 0; bytes_to_discard--) + br.hgetbits(8); + + return br; + } +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamErrors.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamErrors.java new file mode 100644 index 00000000..07114dbf --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamErrors.java @@ -0,0 +1,70 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 11/17/04 INVALIDFRAME code added. javalayer@javazoom.net + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * This interface describes all error codes that can be thrown + * in BistreamExceptions. + * + * @see BitstreamException + * + * @author MDM 12/12/99 + * @since 0.0.6 + */ + +public interface BitstreamErrors extends JavaLayerErrors +{ + + /** + * An undeterminable error occurred. + */ + static public final int UNKNOWN_ERROR = BITSTREAM_ERROR + 0; + + /** + * The header describes an unknown sample rate. + */ + static public final int UNKNOWN_SAMPLE_RATE = BITSTREAM_ERROR + 1; + + /** + * A problem occurred reading from the stream. + */ + static public final int STREAM_ERROR = BITSTREAM_ERROR + 2; + + /** + * The end of the stream was reached prematurely. + */ + static public final int UNEXPECTED_EOF = BITSTREAM_ERROR + 3; + + /** + * The end of the stream was reached. + */ + static public final int STREAM_EOF = BITSTREAM_ERROR + 4; + + /** + * Frame data are missing. + */ + static public final int INVALIDFRAME = BITSTREAM_ERROR + 5; + + /** + * + */ + static public final int BITSTREAM_LAST = 0x1ff; + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamException.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamException.java new file mode 100644 index 00000000..fb2e60c7 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamException.java @@ -0,0 +1,70 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * Instances of BitstreamException are thrown + * when operations on a Bitstream fail. + *

+ * The exception provides details of the exception condition + * in two ways: + *

  1. + * as an error-code describing the nature of the error + *


  2. + * as the Throwable instance, if any, that was thrown + * indicating that an exceptional condition has occurred. + *

+ * + * @since 0.0.6 + * @author MDM 12/12/99 + */ +@LATTICE("E") +public class BitstreamException extends JavaLayerException + implements BitstreamErrors +{ + @LOC("E") private int errorcode = UNKNOWN_ERROR; + + public BitstreamException(String msg, Throwable t) + { + super(msg, t); + } + + public BitstreamException(int errorcode, Throwable t) + { + this(getErrorString(errorcode), t); + this.errorcode = errorcode; + } + + public int getErrorCode() + { + return errorcode; + } + + + static public String getErrorString(int errorcode) + { + // REVIEW: use resource bundle to map error codes + // to locale-sensitive strings. + +// return "Bitstream errorcode "+Integer.toHexString(errorcode); + return "Bitstream errorcode "+errorcode; + } + + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamWrapper.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamWrapper.java new file mode 100644 index 00000000..6a3209d1 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/BitstreamWrapper.java @@ -0,0 +1,17 @@ +public class BitstreamWrapper { + + private static Bitstream stream; + + @TRUST + public static void init(String filename) { + FileInputStream fin = new FileInputStream(filename); + BufferedInputStream bin = new BufferedInputStream(fin); + stream = new Bitstream(bin); + } + + @TRUST + public static Header readFrame() { + return stream.readFrame(); + } + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/Control.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/Control.java new file mode 100644 index 00000000..c677b5fd --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/Control.java @@ -0,0 +1,55 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * Work in progress. + */ + +public interface Control +{ + + /** + * Starts playback of the media presented by this control. + */ + public void start(); + + /** + * Stops playback of the media presented by this control. + */ + public void stop(); + + public boolean isPlaying(); + + public void pause(); + + + public boolean isRandomAccess(); + + /** + * Retrieves the current position. + */ + public double getPosition(); + + /** + * + */ + public void setPosition(double d); + + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/Crc16.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/Crc16.java new file mode 100644 index 00000000..20c32d86 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/Crc16.java @@ -0,0 +1,75 @@ +/* + * 11/19/04 : 1.0 moved to LGPL. + * + * 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net + * + * @(#) crc.h 1.5, last edit: 6/15/94 16:55:32 + * @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de) + * @(#) Berlin University of Technology + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * 16-Bit CRC checksum + */ +@LATTICE("B>>= 1) != 0); + } + + /** + * Return the calculated checksum. + * Erase it for next calls to add_bits(). + */ + @RETURNLOC("OUT") + public short checksum() + { + @LOC("OUT") short sum = crc; + crc = (short) 0xFFFF; + return sum; + } +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/Decoder.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/Decoder.java new file mode 100644 index 00000000..12287b1c --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/Decoder.java @@ -0,0 +1,296 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 01/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * The Decoder class encapsulates the details of decoding an MPEG + * audio frame. + * + * @author MDM + * @version 0.0.7 12/12/99 + * @since 0.0.5 + */ +@LATTICE("OUTDecoder instance with default parameters. + */ + + public Decoder() { + this(null); + } + + /** + * Creates a new Decoder instance with default parameters. + * + * @param params + * The Params instance that describes the customizable + * aspects of the decoder. + */ + public Decoder(@DELEGATE Params params0) { + + if (params0 == null) { + params0 = getDefaultParams(); + } + + params = params0; + + Equalizer eq = params.getInitialEqualizerSettings(); + if (eq != null) { + equalizer.setFrom(eq); + } + } + + static public Params getDefaultParams() { + return (Params) DEFAULT_PARAMS.clone(); + } + + // public void setEqualizer(Equalizer eq) { + // if (eq == null) + // eq = Equalizer.PASS_THRU_EQ; + // + // equalizer.setFrom(eq); + // + // float[] factors = equalizer.getBandFactors(); + // + // if (filter1 != null) + // filter1.setEQ(factors); + // + // if (filter2 != null) + // filter2.setEQ(factors); + // } + @LATTICE("THISParams class presents the customizable aspects of the + * decoder. + *

+ * Instances of this class are not thread safe. + */ + public static class Params implements Cloneable { + + // private OutputChannels outputChannels = OutputChannels.BOTH; + private OutputChannels outputChannels = new OutputChannels(0); + + private Equalizer equalizer = new Equalizer(); + + public Params() { + } + + public Object clone() { + // TODO: need to have better clone method + Params clone = new Params(); + clone.outputChannels = new OutputChannels(outputChannels.getChannelsOutputCode()); + clone.equalizer = new Equalizer(); + return clone; + // try + // { + // return super.clone(); + // } + // catch (CloneNotSupportedException ex) + // { + // throw new InternalError(this+": "+ex); + // } + } + + public void setOutputChannels(OutputChannels out) { + if (out == null) + throw new NullPointerException("out"); + + outputChannels = out; + } + + public OutputChannels getOutputChannels() { + return outputChannels; + } + + /** + * Retrieves the equalizer settings that the decoder's equalizer will be + * initialized from. + *

+ * The Equalizer instance returned cannot be changed in real + * time to affect the decoder output as it is used only to initialize the + * decoders EQ settings. To affect the decoder's output in realtime, use the + * Equalizer returned from the getEqualizer() method on the decoder. + * + * @return The Equalizer used to initialize the EQ settings of + * the decoder. + */ + public Equalizer getInitialEqualizerSettings() { + return equalizer; + } + + }; +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderErrors.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderErrors.java new file mode 100644 index 00000000..ef3552ad --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderErrors.java @@ -0,0 +1,44 @@ +/* + * 09/26/08 throw exception on subbband alloc error: Christopher G. Jennings (cjennings@acm.org) + * 11/19/04 1.0 moved to LGPL. + * 01/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +/** + * This interface provides constants describing the error + * codes used by the Decoder to indicate errors. + * + * @author MDM + */ +public interface DecoderErrors extends JavaLayerErrors +{ + + static public final int UNKNOWN_ERROR = DECODER_ERROR + 0; + + /** + * Layer not supported by the decoder. + */ + static public final int UNSUPPORTED_LAYER = DECODER_ERROR + 1; + + /** + * Illegal allocation in subband layer. Indicates a corrupt stream. + */ + static public final int ILLEGAL_SUBBAND_ALLOCATION = DECODER_ERROR + 2; + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderException.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderException.java new file mode 100644 index 00000000..d33b0f09 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/DecoderException.java @@ -0,0 +1,61 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 01/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +/** + * The DecoderException represents the class of + * errors that can occur when decoding MPEG audio. + * + * @author MDM + */ +public class DecoderException extends JavaLayerException + implements DecoderErrors +{ + private int errorcode = UNKNOWN_ERROR; + + public DecoderException(String msg, Throwable t) + { + super(msg, t); + } + + public DecoderException(int errorcode, Throwable t) + { + this(getErrorString(errorcode), t); + this.errorcode = errorcode; + } + + public int getErrorCode() + { + return errorcode; + } + + + static public String getErrorString(int errorcode) + { + // REVIEW: use resource file to map error codes + // to locale-sensitive strings. + +// return "Decoder errorcode "+Integer.toHexString(errorcode); + return "Decoder errorcode "+errorcode; + } + + +} + diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/Equalizer.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/Equalizer.java new file mode 100644 index 00000000..90182cc8 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/Equalizer.java @@ -0,0 +1,200 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * The Equalizer class can be used to specify equalization settings + * for the MPEG audio decoder. + *

+ * The equalizer consists of 32 band-pass filters. Each band of the equalizer + * can take on a fractional value between -1.0 and +1.0. At -1.0, the input + * signal is attenuated by 6dB, at +1.0 the signal is amplified by 6dB. + * + * @see Decoder + * + * @author MDM + */ +@LATTICE("BEqualizer instance. + */ + public Equalizer() { + } + + // private Equalizer(float b1, float b2, float b3, float b4, float b5, + // float b6, float b7, float b8, float b9, float b10, float b11, + // float b12, float b13, float b14, float b15, float b16, + // float b17, float b18, float b19, float b20); + + public Equalizer(float[] settings) { + setFrom(settings); + } + + public Equalizer(EQFunction eq) { + setFrom(eq); + } + + public void setFrom(float[] eq) { + reset(); + int max = (eq.length > BANDS) ? BANDS : eq.length; + + for (int i = 0; i < max; i++) { + settings[i] = limit(eq[i]); + } + } + + public void setFrom(EQFunction eq) { + reset(); + int max = BANDS; + + for (int i = 0; i < max; i++) { + settings[i] = limit(eq.getBand(i)); + } + } + + /** + * Sets the bands of this equalizer to the value the bands of another + * equalizer. Bands that are not present in both equalizers are ignored. + */ + public void setFrom(Equalizer eq) { + if (eq != this) { + setFrom(eq.settings); + } + } + + /** + * Sets all bands to 0.0 + */ + public void reset() { + for (int i = 0; i < BANDS; i++) { + settings[i] = 0.0f; + } + } + + /** + * Retrieves the number of bands present in this equalizer. + */ + public int getBandCount() { + return settings.length; + } + + public float setBand(int band, float neweq) { + float eq = 0.0f; + + if ((band >= 0) && (band < BANDS)) { + eq = settings[band]; + settings[band] = limit(neweq); + } + + return eq; + } + + /** + * Retrieves the eq setting for a given band. + */ + public float getBand(int band) { + float eq = 0.0f; + + if ((band >= 0) && (band < BANDS)) { + eq = settings[band]; + } + + return eq; + } + + private float limit(float eq) { + if (eq == BAND_NOT_PRESENT) + return eq; + if (eq > 1.0f) + return 1.0f; + if (eq < -1.0f) + return -1.0f; + + return eq; + } + + /** + * Retrieves an array of floats whose values represent a scaling factor that + * can be applied to linear samples in each band to provide the equalization + * represented by this instance. + * + * @return an array of factors that can be applied to the subbands. + */ + @LATTICE("OUT>> 19) & 1); + if (((headerstring >>> 20) & 1) == 0) // SZD: MPEG2.5 detection + if (h_version == MPEG2_LSF) + h_version = MPEG25_LSF; + else + throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR); + if ((h_sample_frequency = ((headerstring >>> 10) & 3)) == 3) { + throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR); + } + } + h_layer = 4 - (headerstring >>> 17) & 3; + h_protection_bit = (headerstring >>> 16) & 1; + h_bitrate_index = (headerstring >>> 12) & 0xF; + h_padding_bit = (headerstring >>> 9) & 1; + h_mode = ((headerstring >>> 6) & 3); + h_mode_extension = (headerstring >>> 4) & 3; + if (h_mode == JOINT_STEREO) + h_intensity_stereo_bound = (h_mode_extension << 2) + 4; + else + h_intensity_stereo_bound = 0; // should never be used + if (((headerstring >>> 3) & 1) == 1) + h_copyright = true; + if (((headerstring >>> 2) & 1) == 1) + h_original = true; + // calculate number of subbands: + if (h_layer == 1) + h_number_of_subbands = 32; + else { + channel_bitrate = h_bitrate_index; + // calculate bitrate per channel: + if (h_mode != SINGLE_CHANNEL) + if (channel_bitrate == 4) + channel_bitrate = 1; + else + channel_bitrate -= 4; + if ((channel_bitrate == 1) || (channel_bitrate == 2)) + if (h_sample_frequency == THIRTYTWO) + h_number_of_subbands = 12; + else + h_number_of_subbands = 8; + else if ((h_sample_frequency == FOURTYEIGHT) + || ((channel_bitrate >= 3) && (channel_bitrate <= 5))) + h_number_of_subbands = 27; + else + h_number_of_subbands = 30; + } + if (h_intensity_stereo_bound > h_number_of_subbands) + h_intensity_stereo_bound = h_number_of_subbands; + // calculate framesize and nSlots + calculate_framesize(); + // read framedata: + int framesizeloaded = stream.read_frame_data(framesize); + if ((framesize >= 0) && (framesizeloaded != framesize)) { + // Data loaded does not match to expected framesize, + // it might be an ID3v1 TAG. (Fix 11/17/04). + throw stream.newBitstreamException(Bitstream.INVALIDFRAME); + } + if (stream.isSyncCurrentPosition(syncmode)) { + if (syncmode == Bitstream.INITIAL_SYNC) { + syncmode = Bitstream.STRICT_SYNC; + stream.set_syncword(headerstring & 0xFFF80CC0); + } + sync = true; + } else { + stream.unreadFrame(); + } + } while (!sync); + stream.parse_frame(); + if (h_protection_bit == 0) { + // frame contains a crc checksum + checksum = (short) stream.get_bits(16); + if (crc == null) + crc = new Crc16(); + crc.add_bits(headerstring, 16); + crcp[0] = crc; + } else + crcp[0] = null; + if (h_sample_frequency == FOURTYFOUR_POINT_ONE) { + /* + * if (offset == null) { int max = max_number_of_frames(stream); offset = + * new int[max]; for(int i=0; i 0) && (cf == lf)) { offset[cf] = + * offset[cf-1] + h_padding_bit; } else { offset[0] = h_padding_bit; } + */ + } + return 0; + } + + /** + * Parse frame to extract optionnal VBR frame. + * + * @param firstframe + * @author E.B (javalayer@javazoom.net) + */ + void parseVBR(byte[] firstframe) throws BitstreamException { + // Trying Xing header. + String xing = "Xing"; + byte tmp[] = new byte[4]; + int offset = 0; + // Compute "Xing" offset depending on MPEG version and channels. + if (h_version == MPEG1) { + if (h_mode == SINGLE_CHANNEL) + offset = 21 - 4; + else + offset = 36 - 4; + } else { + if (h_mode == SINGLE_CHANNEL) + offset = 13 - 4; + else + offset = 21 - 4; + } + try { + System.arraycopy(firstframe, offset, tmp, 0, 4); + // Is "Xing" ? + if (xing.equals(new String(tmp))) { + // Yes. + h_vbr = true; + h_vbr_frames = -1; + h_vbr_bytes = -1; + h_vbr_scale = -1; + h_vbr_toc = new byte[100]; + + int length = 4; + // Read flags. + byte flags[] = new byte[4]; + System.arraycopy(firstframe, offset + length, flags, 0, flags.length); + length += flags.length; + // Read number of frames (if available). + if ((flags[3] & (byte) (1 << 0)) != 0) { + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_frames = + (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) + & 0x0000FF00 | tmp[3] & 0x000000FF; + length += 4; + } + // Read size (if available). + if ((flags[3] & (byte) (1 << 1)) != 0) { + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_bytes = + (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) + & 0x0000FF00 | tmp[3] & 0x000000FF; + length += 4; + } + // Read TOC (if available). + if ((flags[3] & (byte) (1 << 2)) != 0) { + System.arraycopy(firstframe, offset + length, h_vbr_toc, 0, h_vbr_toc.length); + length += h_vbr_toc.length; + } + // Read scale (if available). + if ((flags[3] & (byte) (1 << 3)) != 0) { + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_scale = + (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) + & 0x0000FF00 | tmp[3] & 0x000000FF; + length += 4; + } + // System.out.println("VBR:"+xing+" Frames:"+ h_vbr_frames + // +" Size:"+h_vbr_bytes); + } + } catch (ArrayIndexOutOfBoundsException e) { + throw new BitstreamException("XingVBRHeader Corrupted", e); + } + + // Trying VBRI header. + String vbri = "VBRI"; + offset = 36 - 4; + try { + System.arraycopy(firstframe, offset, tmp, 0, 4); + // Is "VBRI" ? + if (vbri.equals(new String(tmp))) { + // Yes. + h_vbr = true; + h_vbr_frames = -1; + h_vbr_bytes = -1; + h_vbr_scale = -1; + h_vbr_toc = new byte[100]; + // Bytes. + int length = 4 + 6; + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_bytes = + (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) & 0x0000FF00 + | tmp[3] & 0x000000FF; + length += 4; + // Frames. + System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length); + h_vbr_frames = + (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) & 0x0000FF00 + | tmp[3] & 0x000000FF; + length += 4; + // System.out.println("VBR:"+vbri+" Frames:"+ h_vbr_frames + // +" Size:"+h_vbr_bytes); + // TOC + // TODO + } + } catch (ArrayIndexOutOfBoundsException e) { + throw new BitstreamException("VBRIVBRHeader Corrupted", e); + } + } + + // Functions to query header contents: + /** + * Returns version. + */ + @RETURNLOC("THIS,Header.HV") + public int version() { + return h_version; + } + + /** + * Returns Layer ID. + */ + @RETURNLOC("THIS,Header.H") + public int layer() { + return h_layer; + } + + /** + * Returns bitrate index. + */ + public int bitrate_index() { + return h_bitrate_index; + } + + /** + * Returns Sample Frequency. + */ + @RETURNLOC("THIS,Header.H") + public int sample_frequency() { + return h_sample_frequency; + } + + /** + * Returns Frequency. + */ + @RETURNLOC("THIS,Header.FS") + public int frequency() { + return frequencies[h_version][h_sample_frequency]; + } + + /** + * Returns Mode. + */ + @RETURNLOC("THIS,Header.H") + public int mode() { + return h_mode; + } + + /** + * Returns Protection bit. + */ + @RETURNLOC("THIS,Header.H") + public boolean checksums() { + if (h_protection_bit == 0) + return true; + else + return false; + } + + /** + * Returns Copyright. + */ + public boolean copyright() { + return h_copyright; + } + + /** + * Returns Original. + */ + public boolean original() { + return h_original; + } + + /** + * Return VBR. + * + * @return true if VBR header is found + */ + public boolean vbr() { + return h_vbr; + } + + /** + * Return VBR scale. + * + * @return scale of -1 if not available + */ + public int vbr_scale() { + return h_vbr_scale; + } + + /** + * Return VBR TOC. + * + * @return vbr toc ot null if not available + */ + public byte[] vbr_toc() { + return h_vbr_toc; + } + + /** + * Returns Checksum flag. Compares computed checksum with stream checksum. + */ + @RETURNLOC("OUT") + public boolean checksum_ok() { + return (checksum == crc.checksum()); + } + + // Seeking and layer III stuff + /** + * Returns Layer III Padding bit. + */ + public boolean padding() { + if (h_padding_bit == 0) + return false; + else + return true; + } + + /** + * Returns Slots. + */ + @RETURNLOC("THIS,Header.NS") + public int slots() { + return nSlots; + } + + /** + * Returns Mode Extension. + */ + @RETURNLOC("THIS,Header.H") + public int mode_extension() { + return h_mode_extension; + } + + // E.B -> private to public + public static final int bitrates[][][] = { + { + { 0 /* free format */, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, + 160000, 176000, 192000, 224000, 256000, 0 }, + { 0 /* free format */, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, + 96000, 112000, 128000, 144000, 160000, 0 }, + { 0 /* free format */, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, + 96000, 112000, 128000, 144000, 160000, 0 } }, + + { + { 0 /* free format */, 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, + 288000, 320000, 352000, 384000, 416000, 448000, 0 }, + { 0 /* free format */, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, + 192000, 224000, 256000, 320000, 384000, 0 }, + { 0 /* free format */, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, + 160000, 192000, 224000, 256000, 320000, 0 } }, + // SZD: MPEG2.5 + { + { 0 /* free format */, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, + 160000, 176000, 192000, 224000, 256000, 0 }, + { 0 /* free format */, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, + 96000, 112000, 128000, 144000, 160000, 0 }, + { 0 /* free format */, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, + 96000, 112000, 128000, 144000, 160000, 0 } }, + + }; + + // E.B -> private to public + /** + * Calculate Frame size. Calculates framesize in bytes excluding header size. + */ + public int calculate_framesize() { + + if (h_layer == 1) { + framesize = + (12 * bitrates[h_version][0][h_bitrate_index]) + / frequencies[h_version][h_sample_frequency]; + if (h_padding_bit != 0) + framesize++; + framesize <<= 2; // one slot is 4 bytes long + nSlots = 0; + } else { + framesize = + (144 * bitrates[h_version][h_layer - 1][h_bitrate_index]) + / frequencies[h_version][h_sample_frequency]; + if (h_version == MPEG2_LSF || h_version == MPEG25_LSF) + framesize >>= 1; // SZD + if (h_padding_bit != 0) + framesize++; + // Layer III slots + if (h_layer == 3) { + if (h_version == MPEG1) { + nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 17 : 32) // side + // info + // size + - ((h_protection_bit != 0) ? 0 : 2) // CRC size + - 4; // header size + } else { // MPEG-2 LSF, SZD: MPEG-2.5 LSF + nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 9 : 17) // side + // info + // size + - ((h_protection_bit != 0) ? 0 : 2) // CRC size + - 4; // header size + } + } else { + nSlots = 0; + } + } + framesize -= 4; // subtract header size + return framesize; + } + + /** + * Returns the maximum number of frames in the stream. + * + * @param streamsize + * @return number of frames + */ + public int max_number_of_frames(int streamsize) // E.B + { + if (h_vbr == true) + return h_vbr_frames; + else { + if ((framesize + 4 - h_padding_bit) == 0) + return 0; + else + return (streamsize / (framesize + 4 - h_padding_bit)); + } + } + + /** + * Returns the maximum number of frames in the stream. + * + * @param streamsize + * @return number of frames + */ + public int min_number_of_frames(int streamsize) // E.B + { + if (h_vbr == true) + return h_vbr_frames; + else { + if ((framesize + 5 - h_padding_bit) == 0) + return 0; + else + return (streamsize / (framesize + 5 - h_padding_bit)); + } + } + + /** + * Returns ms/frame. + * + * @return milliseconds per frame + */ + @LATTICE("OUT private to public + public static final String bitrate_str[][][] = { + { + { "free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", + "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "176 kbit/s", + "192 kbit/s", "224 kbit/s", "256 kbit/s", "forbidden" }, + { "free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", + "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", + "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden" }, + { "free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", + "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", + "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden" } }, + + { + { "free format", "32 kbit/s", "64 kbit/s", "96 kbit/s", "128 kbit/s", "160 kbit/s", + "192 kbit/s", "224 kbit/s", "256 kbit/s", "288 kbit/s", "320 kbit/s", "352 kbit/s", + "384 kbit/s", "416 kbit/s", "448 kbit/s", "forbidden" }, + { "free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", + "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s", "192 kbit/s", "224 kbit/s", + "256 kbit/s", "320 kbit/s", "384 kbit/s", "forbidden" }, + { "free format", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", + "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s", "192 kbit/s", + "224 kbit/s", "256 kbit/s", "320 kbit/s", "forbidden" } }, + // SZD: MPEG2.5 + { + { "free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", + "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s", "176 kbit/s", + "192 kbit/s", "224 kbit/s", "256 kbit/s", "forbidden" }, + { "free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", + "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", + "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden" }, + { "free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s", "40 kbit/s", + "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", + "128 kbit/s", "144 kbit/s", "160 kbit/s", "forbidden" } }, }; + + /** + * Return Bitrate. + * + * @return bitrate in bps + */ + + @RETURNLOC("THIS,Header.FS") + public String bitrate_string() { + @LOC("THIS,Header.T") String kbs = " kb/s"; + if (h_vbr == true) { + return Integer.toString(bitrate() / 1000) + kbs; + } else { + return bitrate_str[h_version][h_layer - 1][h_bitrate_index]; + } + } + + /** + * Return Bitrate. + * + * @return bitrate in bps and average bitrate for VBR header + */ + @RETURNLOC("THIS,Header.FS") + public int bitrate() { + if (h_vbr == true) { + return ((int) ((h_vbr_bytes * 8) / (ms_per_frame() * h_vbr_frames))) * 1000; + } else { + return bitrates[h_version][h_layer - 1][h_bitrate_index]; + } + } + + /** + * Return Instant Bitrate. Bitrate for VBR is not constant. + * + * @return bitrate in bps + */ + public int bitrate_instant() { + return bitrates[h_version][h_layer - 1][h_bitrate_index]; + } + + /** + * Returns Frequency + * + * @return frequency string in kHz + */ + @RETURNLOC("THIS,Header.FS") + public String sample_frequency_string() { + switch (h_sample_frequency) { + case THIRTYTWO: + if (h_version == MPEG1) + return "32 kHz"; + else if (h_version == MPEG2_LSF) + return "16 kHz"; + else + // SZD + return "8 kHz"; + case FOURTYFOUR_POINT_ONE: + if (h_version == MPEG1) + return "44.1 kHz"; + else if (h_version == MPEG2_LSF) + return "22.05 kHz"; + else + // SZD + return "11.025 kHz"; + case FOURTYEIGHT: + if (h_version == MPEG1) + return "48 kHz"; + else if (h_version == MPEG2_LSF) + return "24 kHz"; + else + // SZD + return "12 kHz"; + } + return (null); + } + + /** + * Returns Mode. + */ + @RETURNLOC("THIS,Header.H") + public String mode_string() { + switch (h_mode) { + case STEREO: + return "Stereo"; + case JOINT_STEREO: + return "Joint stereo"; + case DUAL_CHANNEL: + return "Dual channel"; + case SINGLE_CHANNEL: + return "Single channel"; + } + return null; + } + + /** + * Returns Version. + * + * @return MPEG-1 or MPEG-2 LSF or MPEG-2.5 LSF + */ + @RETURNLOC("THIS,Header.HV") + public String version_string() { + switch (h_version) { + case MPEG1: + return "MPEG-1"; + case MPEG2_LSF: + return "MPEG-2 LSF"; + case MPEG25_LSF: // SZD + return "MPEG-2.5 LSF"; + } + return (null); + } + + /** + * Returns the number of subbands in the current frame. + * + * @return number of subbands + */ + public int number_of_subbands() { + return h_number_of_subbands; + } + + /** + * Returns Intensity Stereo. (Layer II joint stereo only). Returns the number + * of subbands which are in stereo mode, subbands above that limit are in + * intensity stereo mode. + * + * @return intensity + */ + public int intensity_stereo_bound() { + return h_intensity_stereo_bound; + } + + public void setSideInfoBuf(SideInfoBuffer sib) { + this.sib = sib; + } + + public void setBitReserve(BitReserve br) { + this.br = br; + } + + @RETURNLOC("THIS,Header.T") + public SideInfoBuffer getSideInfoBuffer() { + return sib; + } + + @RETURNLOC("THIS,Header.T") + public BitReserve getBitReserve() { + return br; + } + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/HuffData.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/HuffData.java new file mode 100644 index 00000000..7497a51e --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/HuffData.java @@ -0,0 +1,19 @@ +// need to have this class for liner type system +@LATTICE("V") +public class HuffData { + + @LOC("V") public int x; + @LOC("V") public int y; + @LOC("V") public int w; + @LOC("V") public int v; + @LOC("V") public BitReserve br; + + public HuffData(int x, int y, int w, int v, BitReserve br) { + this.x = x; + this.y = y; + this.w = w; + this.v = v; + this.br = br; + } + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/InputStreamSource.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/InputStreamSource.java new file mode 100644 index 00000000..3945c3d0 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/InputStreamSource.java @@ -0,0 +1,78 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +import java.io.IOException; +import java.io.InputStream; + +/** + * Work In Progress. + * + * An instance of InputStreamSource implements a + * Source that provides data from an InputStream + * . Seeking functionality is not supported. + * + * @author MDM + */ +public class InputStreamSource implements Source +{ + private final InputStream in; + + public InputStreamSource(InputStream in) + { + if (in==null) + throw new NullPointerException("in"); + + this.in = in; + } + + public int read(byte[] b, int offs, int len) + throws IOException + { + int read = in.read(b, offs, len); + return read; + } + + public boolean willReadBlock() + { + return true; + //boolean block = (in.available()==0); + //return block; + } + + public boolean isSeekable() + { + return false; + } + + public long tell() + { + return -1; + } + + public long seek(long to) + { + return -1; + } + + public long length() + { + return -1; + } +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerError.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerError.java new file mode 100644 index 00000000..cc8dde73 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerError.java @@ -0,0 +1,29 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * Work in progress. + * + * API usage errors may be handled by throwing an instance of this + * class, as per JMF 2.0. + */ +public class JavaLayerError extends Error +{ +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerErrors.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerErrors.java new file mode 100644 index 00000000..4d11270c --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerErrors.java @@ -0,0 +1,39 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +/** + * Exception erorr codes for components of the JavaLayer API. + */ +public interface JavaLayerErrors +{ + /** + * The first bitstream error code. See the {@link DecoderErrors DecoderErrors} + * interface for other bitstream error codes. + */ + static public final int BITSTREAM_ERROR = 0x100; + + /** + * The first decoder error code. See the {@link DecoderErrors DecoderErrors} + * interface for other decoder error codes. + */ + static public final int DECODER_ERROR = 0x200; + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerException.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerException.java new file mode 100644 index 00000000..2759a9a8 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerException.java @@ -0,0 +1,79 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +//import java.io.PrintStream; + + +/** + * The JavaLayerException is the base class for all API-level + * exceptions thrown by JavaLayer. To facilitate conversion and + * common handling of exceptions from other domains, the class + * can delegate some functionality to a contained Throwable instance. + *

+ * + * @author MDM + */ +public class JavaLayerException extends Exception +{ + + private Throwable exception; + + + public JavaLayerException() + { + } + + public JavaLayerException(String msg) + { + super(msg); + } + + public JavaLayerException(String msg, Throwable t) + { + super(msg); + exception = t; + } + + public Throwable getException() + { + return exception; + } + + + public void printStackTrace() + { +// printStackTrace(System.err); + } + + public void printStackTrace(PrintStream ps) + { +// if (this.exception==null) +// { +// super.printStackTrace(ps); +// } +// else +// { +// exception.printStackTrace(); +// } + } + + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerHook.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerHook.java new file mode 100644 index 00000000..eda09dec --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerHook.java @@ -0,0 +1,35 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +//import java.io.InputStream; + +/** + * The JavaLayerHooks class allows developers to change + * the way the JavaLayer library uses Resources. + */ + +public interface JavaLayerHook +{ + /** + * Retrieves the named resource. This allows resources to be + * obtained without specifying how they are retrieved. + */ + public InputStream getResourceAsStream(String name); +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerUtils.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerUtils.java new file mode 100644 index 00000000..13f2ac0b --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/JavaLayerUtils.java @@ -0,0 +1,227 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.InvalidClassException; +//import java.io.InvalidObjectException; +//import java.io.ObjectInputStream; +//import java.io.ObjectOutputStream; +//import java.io.OutputStream; +//import java.lang.reflect.Array; + +/** + * The JavaLayerUtils class is not strictly part of the JavaLayer API. + * It serves to provide useful methods and system-wide hooks. + * + * @author MDM + */ +public class JavaLayerUtils +{ + static private JavaLayerHook hook = null; + + /** + * Deserializes the object contained in the given input stream. + * @param in The input stream to deserialize an object from. + * @param cls The expected class of the deserialized object. + */ +// static public Object deserialize(InputStream in, Class cls) + static public Object deserialize(InputStream in) + throws IOException + { +// if (cls==null) +// throw new NullPointerException("cls"); + +// Object obj = deserialize(in, cls); + Object obj = deserialize(in); +// if (!cls.isInstance(obj)) +// { +// throw new InvalidObjectException("type of deserialized instance not of required class."); +// } + + return obj; + } + + /** + * Deserializes an object from the given InputStream. + * The deserialization is delegated to an + * ObjectInputStream instance. + * + * @param in The InputStream to deserialize an object + * from. + * + * @return The object deserialized from the stream. + * @exception IOException is thrown if there was a problem reading + * the underlying stream, or an object could not be deserialized + * from the stream. + * + * @see java.io.ObjectInputStream + */ + static public Object deserialize(InputStream in) + throws IOException + { + if (in==null) + throw new NullPointerException("in"); + + //TODO : need to enable after having objectinputstream + /* + ObjectInputStream objIn = new ObjectInputStream(in); + + Object obj; + + try + { + obj = objIn.readObject(); + } + catch (ClassNotFoundException ex) + { + throw new InvalidClassException(ex.toString()); + } + + return obj; + */ + return null; + } + + /** + * Deserializes an array from a given InputStream. + * + * @param in The InputStream to + * deserialize an object from. + * + * @param elemType The class denoting the type of the array + * elements. + * @param length The expected length of the array, or -1 if + * any length is expected. + */ + static public Object deserializeArray(InputStream in, int length) + throws IOException + { + if (length<-1) + throw new IllegalArgumentException("length"); + + Object obj = deserialize(in); + + return obj; + } +// static public Object deserializeArray(InputStream in, Class elemType, int length) +// throws IOException +// { +// if (elemType==null) +// throw new NullPointerException("elemType"); +// +// if (length<-1) +// throw new IllegalArgumentException("length"); +// +// Object obj = deserialize(in); +// +// //SSJava will never throw exceptions as it is so this code is meaningless +// /* +// Class cls = obj.getClass(); +// +// if (!cls.isArray()) +// throw new InvalidObjectException("object is not an array"); +// +// Class arrayElemType = cls.getComponentType(); +// if (arrayElemType!=elemType) +// throw new InvalidObjectException("unexpected array component type"); +// +// if (length != -1) +// { +// int arrayLength = Array.getLength(obj); +// if (arrayLength!=length) +// throw new InvalidObjectException("array length mismatch"); +// } +// */ +// return obj; +// } + +// static public Object deserializeArrayResource(String name, Class elemType, int length) + static public Object deserializeArrayResource(String name, int length) + throws IOException + { + InputStream str = getResourceAsStream(name); + if (str==null) + throw new IOException("unable to load resource '"+name+"'"); + +// Object obj = deserializeArray(str, elemType, length); + Object obj = deserializeArray(str, length); + + return obj; + } + + static public void serialize(OutputStream out, Object obj) + throws IOException + { + //TODO : need to enable after having objectinputstream +// if (out==null) +// throw new NullPointerException("out"); +// +// if (obj==null) +// throw new NullPointerException("obj"); +// +// ObjectOutputStream objOut = new ObjectOutputStream(out); +// objOut.writeObject(obj); + + } + + /** + * Sets the system-wide JavaLayer hook. + */ + static synchronized public void setHook(JavaLayerHook hook0) + { + hook = hook0; + } + + static synchronized public JavaLayerHook getHook() + { + return hook; + } + + /** + * Retrieves an InputStream for a named resource. + * + * @param name The name of the resource. This must be a simple + * name, and not a qualified package name. + * + * @return The InputStream for the named resource, or null if + * the resource has not been found. If a hook has been + * provided, its getResourceAsStream() method is called + * to retrieve the resource. + */ + static synchronized public InputStream getResourceAsStream(String name) + { + InputStream is = null; + + if (hook!=null) + { + is = hook.getResourceAsStream(name); + } + //TODO java reflection +// else +// { +// Class cls = JavaLayerUtils.class; +// is = cls.getResourceAsStream(name); +// } + + return is; + } +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/LATTICE.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/LATTICE.java new file mode 100644 index 00000000..3dc53b81 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/LATTICE.java @@ -0,0 +1,3 @@ +public @interface LATTICE{ + String value(); +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/LOC.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/LOC.java new file mode 100644 index 00000000..0165516c --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/LOC.java @@ -0,0 +1,7 @@ +public @interface LOC { + String value(); +} + +public @interface RETURNLOC { + String value(); +} \ No newline at end of file diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/LayerIDecoder.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/LayerIDecoder.java new file mode 100644 index 00000000..ef79a880 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/LayerIDecoder.java @@ -0,0 +1,432 @@ +/* + * 09/26/08 throw exception on subbband alloc error: Christopher G. Jennings (cjennings@acm.org) + * + * 11/19/04 1.0 moved to LGPL. + * + * 12/12/99 Initial version. Adapted from javalayer.java + * and Subband*.java. mdm@techie.com + * + * 02/28/99 Initial version : javalayer.java by E.B + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * Implements decoding of MPEG Audio Layer I frames. + */ +@LATTICE("SB1 source.length - 3) temp = source.length - 3; + if (temp > groupingtable[0].length - 3) { + temp = groupingtable[0].length - 3; + } + + samples[tmp] = groupingtable[0][temp]; + temp++; + tmp++; + samples[tmp] = groupingtable[0][temp]; + temp++; + tmp++; + samples[tmp] = groupingtable[0][temp]; + + // memcpy (samples, groupingtable + samplecode, 3 * sizeof (real)); + } else { + samples[0] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); + samples[1] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); + samples[2] = (float) ((stream.get_bits(codelength[0])) * factor[0] - 1.0); + } + } + samplenumber = 0; + if (++groupnumber == 12) + return true; + else + return false; + } + + // ssjava + public boolean put_next_sample(@LOC("IN") int channels, @LOC("IN") SynthesisFilter filter1, + @LOC("IN") SynthesisFilter filter2) { + + if ((allocation != 0) && (channels != OutputChannels.RIGHT_CHANNEL)) { + + @LOC("THIS,LayerIIDecoder$SubbandLayer2.SM") float sample = samples[samplenumber]; + + if (groupingtable[0] == null) { + sample = (sample + d[0]) * c[0]; + } + if (groupnumber <= 4) { + sample *= scalefactor1; + } else if (groupnumber <= 8) { + sample *= scalefactor2; + } else { + sample *= scalefactor3; + } + filter1.input_sample(sample, subbandnumber); + } + + if (++samplenumber == 3) + return true; + else + return false; + } + }; + + /** + * Class for layer II subbands in joint stereo mode. + */ + @LATTICE("S>> 4) / 5; + new_slen[1] = (scalefac_comp >>> 4) % 5; + new_slen[2] = (scalefac_comp & 0xF) >>> 2; + new_slen[3] = (scalefac_comp & 3); + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 0; + + } else if (scalefac_comp < 500) { + + new_slen[0] = ((scalefac_comp - 400) >>> 2) / 5; + new_slen[1] = ((scalefac_comp - 400) >>> 2) % 5; + new_slen[2] = (scalefac_comp - 400) & 3; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 1; + + } else if (scalefac_comp < 512) { + + new_slen[0] = (scalefac_comp - 500) / 3; + new_slen[1] = (scalefac_comp - 500) % 3; + new_slen[2] = 0; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 1; + blocknumber = 2; + } + } + + if ((((mode_ext == 1) || (mode_ext == 3)) && (ch == 1))) { + int_scalefac_comp = scalefac_comp >>> 1; + + if (int_scalefac_comp < 180) { + new_slen[0] = int_scalefac_comp / 36; + new_slen[1] = (int_scalefac_comp % 36) / 6; + new_slen[2] = (int_scalefac_comp % 36) % 6; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 3; + } else if (int_scalefac_comp < 244) { + new_slen[0] = ((int_scalefac_comp - 180) & 0x3F) >>> 4; + new_slen[1] = ((int_scalefac_comp - 180) & 0xF) >>> 2; + new_slen[2] = (int_scalefac_comp - 180) & 3; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 4; + } else if (int_scalefac_comp < 255) { + new_slen[0] = (int_scalefac_comp - 244) / 3; + new_slen[1] = (int_scalefac_comp - 244) % 3; + new_slen[2] = 0; + new_slen[3] = 0; + si.ch[ch].gr[gr].preflag = 0; + blocknumber = 5; + } + } + + // for (@LOC("THIS,LayerIIIDecoder.NS") int x = 0; x < 45; x++) + // // why 45, not 54? + // scalefac_buffer[x] = 0; + + m = 0; + 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++; + + } // for (unint32 j ... + } // for (uint32 i ... + } + + /** + * + */ + @LATTICE("THIS sfBandIndex[sfreq].l.length - 1) + buf1 = sfBandIndex[sfreq].l.length - 1; + + region1Start = sfBandIndex[sfreq].l[buf]; + region2Start = sfBandIndex[sfreq].l[buf1]; /* MI */ + } + + index = 0; + // Read bigvalues area + 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(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++] = x[0]; + is_1d[index++] = y[0]; + + CheckSumHuff = CheckSumHuff + x[0] + y[0]; + // System.out.println("x = " + x[0] + " y = " + y[0]); + } + + // Read count1 area + + @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(); + + TERMINATE: while ((num_bits < part2_3_end) && (index < 576)) { + + huffcodetab.huffman_decoder(htIdx, x, y, v, w, br); + + is_1d[index++] = v[0]; + is_1d[index++] = w[0]; + is_1d[index++] = x[0]; + is_1d[index++] = y[0]; + CheckSumHuff = CheckSumHuff + v[0] + w[0] + x[0] + y[0]; + // System.out.println("v = "+v[0]+" w = "+w[0]); + // System.out.println("x = "+x[0]+" y = "+y[0]); + num_bits = br.hsstell(); + } + + if (num_bits > part2_3_end) { + br.rewindNbits(num_bits - part2_3_end); + index -= 4; + } + + num_bits = br.hsstell(); + + // Dismiss stuffing bits + if (num_bits < part2_3_end) + br.hgetbits(part2_3_end - num_bits); + + // Zero out rest + + if (index < 576) + nonzero[ch] = index; + else + nonzero[ch] = 576; + + if (index < 0) + index = 0; + + // may not be necessary + for (; index < 576; index++) + is_1d[index] = 0; + } + + @LATTICE("THIS,IN,THISLOC=THIS,RETURNLOC=THIS") + private int huffcodetab_huffman_decoder(@LOC("IN") int h) { + // TODO need to move huffmancodetab implementation here + return 0; + } + + /** + * + */ + private void i_stereo_k_values(@LOC("THIS,LayerIIIDecoder.LR") int is_pos, + @LOC("THIS,LayerIIIDecoder.LR") int io_type, @LOC("THIS,LayerIIIDecoder.LR") int i) { + if (is_pos == 0) { + k[0][i] = 1.0f; + k[1][i] = 1.0f; + } else if ((is_pos & 1) != 0) { + k[0][i] = io[io_type][(is_pos + 1) >>> 1]; + k[1][i] = 1.0f; + } else { + k[0][i] = 1.0f; + k[1][i] = io[io_type][is_pos >>> 1]; + } + } + + /** + * + */ + // @LATTICE("OUT 0) + ro[ch][quotien][reste] = g_gain * t_43[abv]; + else { + if (-abv < t_43.length) + ro[ch][quotien][reste] = -g_gain * t_43[-abv]; + else + ro[ch][quotien][reste] = -g_gain * (float) Math.pow(-abv, d43); + } + } else { + if (is_1d[j] > 0) + ro[ch][quotien][reste] = g_gain * (float) Math.pow(abv, d43); + else + ro[ch][quotien][reste] = -g_gain * (float) Math.pow(-abv, d43); + } + } + } + + // apply formula per block type + for (j = 0; j < nonzero[ch]; j++) { + // Modif E.B 02/22/99 + @LOC("THIS,LayerIIIDecoder.NZ") int reste = j % SSLIMIT; + @LOC("THIS,LayerIIIDecoder.NZ") int quotien = (int) ((j - reste) / SSLIMIT); + + if (index == next_cb_boundary) { /* Adjust critical band boundary */ + 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) { + + if (index == sfBandIndex[sfreq].l[8]) { + next_cb_boundary = sfBandIndex[sfreq].s[4]; + next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary; + cb = 3; + cb_width = sfBandIndex[sfreq].s[4] - sfBandIndex[sfreq].s[3]; + + cb_begin = sfBandIndex[sfreq].s[3]; + cb_begin = (cb_begin << 2) - cb_begin; + + } else if (index < sfBandIndex[sfreq].l[8]) { + + next_cb_boundary = sfBandIndex[sfreq].l[(++cb) + 1]; + + } else { + + next_cb_boundary = sfBandIndex[sfreq].s[(++cb) + 1]; + next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary; + + cb_begin = sfBandIndex[sfreq].s[cb]; + cb_width = sfBandIndex[sfreq].s[cb + 1] - cb_begin; + cb_begin = (cb_begin << 2) - cb_begin; + } + + } else { + + next_cb_boundary = sfBandIndex[sfreq].s[(++cb) + 1]; + next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary; + + cb_begin = sfBandIndex[sfreq].s[cb]; + cb_width = sfBandIndex[sfreq].s[cb + 1] - cb_begin; + cb_begin = (cb_begin << 2) - cb_begin; + } + + } else { // long blocks + + next_cb_boundary = sfBandIndex[sfreq].l[(++cb) + 1]; + + } + } + + // Do long/short dependent scaling operations + + 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)) || ((si.ch[ch].gr[gr].block_type == 2) + && (si.ch[ch].gr[gr].mixed_block_flag != 0) && (j >= 36)))) { + + t_index = (index - cb_begin) / cb_width; + /* + * xr[sb][ss] *= pow(2.0, ((-2.0 * gr_info.subblock_gain[t_index]) -(0.5 + * * (1.0 + gr_info.scalefac_scale) scalefac[ch].s[t_index][cb]))); + */ + @LOC("THIS,LayerIIIDecoder.SI1") int idx = + scalefac[ch].s[t_index][cb] << si.ch[ch].gr[gr].scalefac_scale; + idx += (si.ch[ch].gr[gr].subblock_gain[t_index] << 2); + + ro[ch][quotien][reste] *= two_to_negative_half_pow[idx]; + + } else { // LONG block types 0,1,3 & 1st 2 subbands of switched blocks + /* + * xr[sb][ss] *= pow(2.0, -0.5 * (1.0+gr_info.scalefac_scale) + * (scalefac[ch].l[cb] + gr_info.preflag * pretab[cb])); + */ + @LOC("THIS,LayerIIIDecoder.SI1") int idx = scalefac[ch].l[cb]; + + if (si.ch[ch].gr[gr].preflag != 0) + idx += pretab[cb]; + + idx = idx << si.ch[ch].gr[gr].scalefac_scale; + ro[ch][quotien][reste] *= two_to_negative_half_pow[idx]; + } + index++; + } + + for (j = nonzero[ch]; j < 576; j++) { + // Modif E.B 02/22/99 + @LOC("THIS,LayerIIIDecoder.NZ") int reste = j % SSLIMIT; + @LOC("THIS,LayerIIIDecoder.NZ") int quotien = (int) ((j - reste) / SSLIMIT); + if (reste < 0) + reste = 0; + if (quotien < 0) + quotien = 0; + ro[ch][quotien][reste] = 0.0f; + } + + return; + } + + /** + * + */ + // ssjava + // @LATTICE("THIS= 3; sfb--) { + i = sfBandIndex[sfreq].s[sfb]; + lines = sfBandIndex[sfreq].s[sfb + 1] - i; + i = (i << 2) - i + (j + 1) * lines - 1; + 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. + // if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) { + sfbcnt = sfb; + sfb = -10; + lines = -10; + } + + lines--; + i--; + + } // while (lines > 0) + + } // for (sfb=12 ... + sfb = sfbcnt + 1; + + if (sfb > max_sfb) + max_sfb = sfb; + + while (sfb < 12) { + temp = sfBandIndex[sfreq].s[sfb]; + sb = sfBandIndex[sfreq].s[sfb + 1] - temp; + i = (temp << 2) - temp + j * sb; + + TERMINATE: for (; sb > 0; sb--) { + is_pos[i] = scalefac[1].s[j][sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + + i++; + } // for (; sb>0... + sfb++; + } // while (sfb < 12) + sfb = sfBandIndex[sfreq].s[10]; + sb = sfBandIndex[sfreq].s[11] - sfb; + sfb = (sfb << 2) - sfb + j * sb; + temp = sfBandIndex[sfreq].s[11]; + sb = sfBandIndex[sfreq].s[12] - temp; + i = (temp << 2) - temp + j * sb; + TERMINATE: for (; sb > 0; sb--) { + is_pos[i] = is_pos[sfb]; + + if (lsf) { + k[0][i] = k[0][sfb]; + k[1][i] = k[1][sfb]; + } else { + is_ratio[i] = is_ratio[sfb]; + } + i++; + } // for (; sb > 0 ... + } + if (max_sfb <= 3) { + i = 2; + ss = 17; + sb = -1; + TERMINATE: while (i >= 0) { + if (ro[1][i][ss] != 0.0f) { + sb = (i << 4) + (i << 1) + ss; + i = -1; + } else { + ss--; + if (ss < 0) { + i--; + ss = 17; + } + } // if (ro ... + } // while (i>=0) + i = 0; + while (sfBandIndex[sfreq].l[i] <= sb) + i++; + sfb = i; + i = sfBandIndex[sfreq].l[i]; + for (; sfb < 8; sfb++) { + sb = sfBandIndex[sfreq].l[sfb + 1] - sfBandIndex[sfreq].l[sfb]; + TERMINATE: for (; sb > 0; sb--) { + is_pos[i] = scalefac[1].l[sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + i++; + } // for (; sb>0 ... + } // for (; sfb<8 ... + } // for (j=0 ... + } else { // if (gr_info.mixed_block_flag) + for (@LOC("THIS,LayerIIIDecoder.RO1") int j = 0; j < 3; j++) { + @LOC("THIS,LayerIIIDecoder.RO1") int sfbcnt; + sfbcnt = -1; + 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; + 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. + // if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) { + sfbcnt = sfb; + sfb = -10; + lines = -10; + } + lines--; + i--; + } // while (lines > 0) */ + + } // for (sfb=12 ... + sfb = sfbcnt + 1; + while (sfb < 12) { + temp = sfBandIndex[sfreq].s[sfb]; + sb = sfBandIndex[sfreq].s[sfb + 1] - temp; + i = (temp << 2) - temp + j * sb; + TERMINATE: for (; sb > 0; sb--) { + is_pos[i] = scalefac[1].s[j][sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + i++; + } // for (; sb>0 ... + sfb++; + } // while (sfb<12) + + temp = sfBandIndex[sfreq].s[10]; + temp2 = sfBandIndex[sfreq].s[11]; + sb = temp2 - temp; + sfb = (temp << 2) - temp + j * sb; + sb = sfBandIndex[sfreq].s[12] - temp2; + i = (temp2 << 2) - temp2 + j * sb; + TERMINATE: for (; sb > 0; sb--) { + is_pos[i] = is_pos[sfb]; + + if (lsf) { + k[0][i] = k[0][sfb]; + k[1][i] = k[1][sfb]; + } else { + is_ratio[i] = is_ratio[sfb]; + } + i++; + } // for (; sb>0 ... + } // for (sfb=12 + } // for (j=0 ... + } else { // if (gr_info.window_switching_flag ... + i = 31; + ss = 17; + sb = 0; + TERMINATE: while (i >= 0) { + if (ro[1][i][ss] != 0.0f) { + sb = (i << 4) + (i << 1) + ss; + i = -1; + } else { + ss--; + if (ss < 0) { + i--; + ss = 17; + } + } + } + i = 0; + while (sfBandIndex[sfreq].l[i] <= sb) + i++; + + sfb = i; + i = sfBandIndex[sfreq].l[i]; + for (; sfb < 21; sfb++) { + sb = sfBandIndex[sfreq].l[sfb + 1] - sfBandIndex[sfreq].l[sfb]; + TERMINATE: for (; sb > 0; sb--) { + is_pos[i] = scalefac[1].l[sfb]; + if (is_pos[i] != 7) + if (lsf) + i_stereo_k_values(is_pos[i], io_type, i); + else + is_ratio[i] = TAN12[is_pos[i]]; + i++; + } + } + sfb = sfBandIndex[sfreq].l[20]; + 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) { + k[0][i] = k[0][sfb]; + k[1][i] = k[1][sfb]; + } else { + is_ratio[i] = is_ratio[sfb]; + } + i++; + } // if (gr_info.mixed_block_flag) + } // if (gr_info.window_switching_flag ... + } // if (i_stereo) + + i = 0; + for (sb = 0; sb < SBLIMIT; sb++) + for (ss = 0; ss < SSLIMIT; ss++) { + if (is_pos[i] == 7) { + if (ms_stereo) { + lr[0][sb][ss] = (ro[0][sb][ss] + ro[1][sb][ss]) * 0.707106781f; + lr[1][sb][ss] = (ro[0][sb][ss] - ro[1][sb][ss]) * 0.707106781f; + } else { + lr[0][sb][ss] = ro[0][sb][ss]; + lr[1][sb][ss] = ro[1][sb][ss]; + } + } else if (i_stereo) { + + if (lsf) { + lr[0][sb][ss] = ro[0][sb][ss] * k[0][i]; + lr[1][sb][ss] = ro[0][sb][ss] * k[1][i]; + } else { + lr[1][sb][ss] = ro[0][sb][ss] / (float) (1 + is_ratio[i]); + lr[0][sb][ss] = lr[1][sb][ss] * is_ratio[i]; + } + } + /* + * else { System.out.println("Error in stereo processing\n"); } + */ + i++; + } + + } // channels == 2 + + } + + /** + * + */ + // @LATTICE("THIS 32767.0f) { + s = (short) 32767; + } else if (sample < -32768.0f) { + s = (short) -32768; + } + + return s; + + } + + /** + * Write the samples to the file or directly to the audio hardware. + */ + public abstract void write_buffer(@LOC("IN") int val); + + public abstract void close(); + + /** + * Clears all data in the buffer (for seeking). + */ + public abstract void clear_buffer(); + + /** + * Notify the buffer that the user has stopped the stream. + */ + public abstract void set_stop_flag(); +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/OutputChannels.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/OutputChannels.java new file mode 100644 index 00000000..276ca6a2 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/OutputChannels.java @@ -0,0 +1,129 @@ +/* + * 11/19/04 1.0 moved to LGPL. + * 12/12/99 Initial implementation. mdm@techie.com. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * A Type-safe representation of the the supported output channel constants. + * + * This class is immutable and, hence, is thread safe. + * + * @author Mat McGowan 12/12/99 + * @since 0.0.7 + */ +@LATTICE("BOutputChannels instance corresponding to the given + * channel code. + * + * @param code + * one of the OutputChannels channel code constants. + * + * @throws IllegalArgumentException + * if code is not a valid channel code. + */ + static public OutputChannels fromInt(int code) { + switch (code) { + case LEFT_CHANNEL: + return LEFT; + case RIGHT_CHANNEL: + return RIGHT; + case BOTH_CHANNELS: + return BOTH; + case DOWNMIX_CHANNELS: + return DOWNMIX; + default: + throw new IllegalArgumentException("Invalid channel code: " + code); + } + } + + public OutputChannels(@LOC("IN") int channels) { + outputChannels = channels; + + if (channels < 0 || channels > 3) + throw new IllegalArgumentException("channels"); + } + + /** + * Retrieves the code representing the desired output channels. Will be one of + * LEFT_CHANNEL, RIGHT_CHANNEL, BOTH_CHANNELS or DOWNMIX_CHANNELS. + * + * @return the channel code represented by this instance. + */ + public int getChannelsOutputCode() { + return outputChannels; + } + + /** + * Retrieves the number of output channels represented by this channel output + * type. + * + * @return The number of output channels for this channel output type. This + * will be 2 for BOTH_CHANNELS only, and 1 for all other types. + */ + public int getChannelCount() { + int count = (outputChannels == BOTH_CHANNELS) ? 2 : 1; + return count; + } + + public boolean equals(Object o) { + boolean equals = false; + + if (o instanceof OutputChannels) { + OutputChannels oc = (OutputChannels) o; + equals = (oc.outputChannels == outputChannels); + } + + return equals; + } + + public int hashCode() { + return outputChannels; + } + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/Player.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/Player.java new file mode 100644 index 00000000..b418fc1e --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/Player.java @@ -0,0 +1,239 @@ +import java.awt.image.SampleModel; + +import FileOutputStream; + +/* + * 11/19/04 1.0 moved to LGPL. + * 29/01/00 Initial version. mdm@techie.com + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + +/** + * The Player class implements a simple player for playback of an + * MPEG audio stream. + * + * @author Mat McGowan + * @since 0.0.8 + */ + +// REVIEW: the audio device should not be opened until the +// first MPEG audio frame has been decoded. +@LATTICE("BPlayer instance. + */ + public Player() throws JavaLayerException { + this(null); + } + + public Player(AudioDevice device) throws JavaLayerException { + // bitstream = new Bitstream(stream); + decoder = new Decoder(); + + // if (device!=null) + // { + // audio = device; + // } + // else + // { + // FactoryRegistry r = FactoryRegistry.systemRegistry(); + // audio = r.createAudioDevice(); + // } + + device.open(decoder); + } + + public void play() throws JavaLayerException { + play(Integer.MAX_VALUE); + } + + /** + * Plays a number of MPEG audio frames. + * + * @param frames + * The number of frames to play. + * @return true if the last frame was played, or false if there are more + * frames. + */ + @LATTICE("OUT + * AudioDevice that is used by this player to sound the decoded audio + * samples. + */ + public int getPosition() { + // int position = lastPosition; + + // AudioDevice out = audio; + // if (out!=null) + // { + // position = out.getPosition(); + // } + // return position; + return 0; + } + + /** + * Decodes a single frame. + * + * @return true if there are no more frames to decode, false otherwise. + */ + @LATTICE("CSampleBuffer class implements an output buffer that provides + * storage for a fixed size block of samples. + */ +@LATTICE("BUF [D] + frequency = sample_frequency; // [IN] -> [D] + + for (@LOC("C") int i = 0; i < number_of_channels; ++i) { + bufferp[i] = (short) i; // LOC(bufferp[i]) has indirect flows from the + // location C, IN + // also, it has a direct flow from C + // anyway, LOC(bufferp[i])=[D,SampleBuffer.BUFP] is lower than all + // locations that have in-flows + } + + } + + public int getChannelCount() { + return this.channels; + } + + public int getSampleFrequency() { + return this.frequency; + } + + public short[] getBuffer() { + return this.buffer; + } + + public int getBufferLength() { + return bufferp[0]; + } + + /** + * Takes a 16 Bit PCM sample. + */ + public void append(@LOC("IN") int channel, @LOC("IN") short value) { + buffer[bufferp[channel]] = value; + // LOC(bufferp[channel])= [local.D,SampleBuffer.BUF] + // so, for LHS, LOC(buffer) < LOC(bufferp[channle]) + // also, bet' LHS and RHS, LOC(LHS) < LOC(RHS) since LOC(value)=[IN] + + bufferp[channel] += channels; + // for lhs, LOC(bufferp[channel]) = [local.D, SampleBuffer.BUFP] + // for rhs, LOC(channels) = [local.D, SampleBuffer.CON] + + } + + @LATTICE("D [D,BUFP] + + if (fs > 32767.0f) { + fs = 32767.0f; + // it has an indirect flow from LOC(fs) + // since LOC(fs) is a shared location, it's okay + } else { + if (fs < -32767.0f) { + fs = -32767.0f; + } + } + + /* + * fs = (fs>32767.0f ? 32767.0f : (fs < -32767.0f ? -32767.0f : fs)); + */ + + s = (short) fs; // it's okay since BUFP of [D,BUFP] is a shared location + buffer[pos] = s; + // for LHS, LOC(buffer[pos])= GLB( [D,BUF] , [D,BUFP] ) = [D,BUF] + // for RHS, LOC(s) = [D,BUFP] + // so it's okay: [D,BUFP] -> [D,BUF] + + pos += channels; // [D,BUFP] -> [D,BUFP] + } + + bufferp[channel] = pos; + // for lhs, LOC(bufferp[channel])=[D,BUFP] + // for rhs, LOC(pos)=[D,BUFP] + // since BUFP is a shared location, the assignment is okay + } + + /** + * Write the samples to the file (Random Acces). + */ + public void write_buffer(@LOC("IN") int val) { + + // for (int i = 0; i < channels; ++i) + // bufferp[i] = (short)i; + + } + + public void close() { + } + + /** + * + */ + + public void clear_buffer() { + for (idx = 0; idx < channels; ++idx) + bufferp[idx] = (short) idx; + } + + /** + * + */ + public void set_stop_flag() { + } +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/SampleBufferWrapper.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/SampleBufferWrapper.java new file mode 100644 index 00000000..5c691eb2 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/SampleBufferWrapper.java @@ -0,0 +1,35 @@ +public class SampleBufferWrapper { + + static SampleBuffer output; + + @TRUST + static void init(int freq, int channels) { + output = new SampleBuffer(freq, channels); + } + + @TRUST + static void clear_buffer(){ + output.clear_buffer(); + } + + @TRUST + static SampleBuffer getOutput() { + return output; + } + + @TRUST + static short[] getBuffer() { + return output.getBuffer(); + } + + @TRUST + static int getBufferLength() { + return output.getBufferLength(); + } + + @TRUST + static void appendSamples(int channel, float[] f) { + output.appendSamples(channel, f); + } + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/SideInfoBuffer.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/SideInfoBuffer.java new file mode 100644 index 00000000..6fef3fcf --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/SideInfoBuffer.java @@ -0,0 +1,89 @@ +@LATTICE("BUFframebuffer where the next bits are retrieved. + */ + @LOC("IDX") + private int wordpointer; + + /** + * Number (0-31, from MSB to LSB) of next bit for get_bits() + */ + @LOC("IDX") + private int bitindex; + + @LOC("V") + private int main_data_begin; + + public int getMain_data_begin() { + return main_data_begin; + } + + public void setMain_data_begin(@LOC("IN") int main_data_begin) { + this.main_data_begin = main_data_begin; + } + + private static final int bitmask[] = { + 0, // dummy + 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, + 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, + 0x00007FFF, 0x0000FFFF, 0x0001FFFF }; + + @LATTICE("OUT>> 16) & 0x0000FFFF); + + returnvalue >>>= 48 - sum; // returnvalue >>= 16 - (number_of_bits - (32 + // - bitindex)) + returnvalue &= bitmask[number_of_bits]; + bitindex = sum - 32; + return returnvalue; + } + + public void setBuffer(int idx, int value) { + framebuffer[idx] = value; + } + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/Source.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/Source.java new file mode 100644 index 00000000..ad2f0c91 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/Source.java @@ -0,0 +1,48 @@ +/* + * 11/19/04 1.0 moved to LGPL. + *----------------------------------------------------------------------- + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *---------------------------------------------------------------------- + */ + + +import java.io.IOException; + +/** + * Work in progress. + * + * Class to describe a seekable data source. + * + */ +public interface Source +{ + + public static final long LENGTH_UNKNOWN = -1; + + public int read(byte[] b, int offs, int len) + throws IOException; + + + public boolean willReadBlock(); + + public boolean isSeekable(); + + public long length(); + + public long tell(); + + public long seek(long pos); + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/Subband.java b/Robust/src/Benchmarks/SSJava/MP3Decoder/Subband.java new file mode 100644 index 00000000..7fe106c3 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/Subband.java @@ -0,0 +1,44 @@ +//package ssJava.mp3decoder; + +/** + * Abstract base class for subband classes of layer I and II + */ +@LATTICE("S= 0; i--) { + samples[i] = s[i] * eq[i]; + } + } + + private void compute_new_v2_v1() { + + @LOC("THIS,SynthesisFilter.NEWV") float new_v0 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v1 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v2 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v3 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v4 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v5 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v6 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v7 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v8 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v9 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v10 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v11 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v12 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v13 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v14 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v15 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v16 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v17 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v18 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v19 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v20 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v21 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v22 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v23 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v24 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v25 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v26 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v27 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v28 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v29 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v30 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v31 = 0.0f; + + // float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure + // 3-A.2 in ISO DIS 11172-3 + // float[] p = new float[16]; + // float[] pp = new float[16]; + + // float[] s = samples; + + @LOC("THIS,SynthesisFilter.NEWV") float s0 = samples[0]; + @LOC("THIS,SynthesisFilter.NEWV") float s1 = samples[1]; + @LOC("THIS,SynthesisFilter.NEWV") float s2 = samples[2]; + @LOC("THIS,SynthesisFilter.NEWV") float s3 = samples[3]; + @LOC("THIS,SynthesisFilter.NEWV") float s4 = samples[4]; + @LOC("THIS,SynthesisFilter.NEWV") float s5 = samples[5]; + @LOC("THIS,SynthesisFilter.NEWV") float s6 = samples[6]; + @LOC("THIS,SynthesisFilter.NEWV") float s7 = samples[7]; + @LOC("THIS,SynthesisFilter.NEWV") float s8 = samples[8]; + @LOC("THIS,SynthesisFilter.NEWV") float s9 = samples[9]; + @LOC("THIS,SynthesisFilter.NEWV") float s10 = samples[10]; + @LOC("THIS,SynthesisFilter.NEWV") float s11 = samples[11]; + @LOC("THIS,SynthesisFilter.NEWV") float s12 = samples[12]; + @LOC("THIS,SynthesisFilter.NEWV") float s13 = samples[13]; + @LOC("THIS,SynthesisFilter.NEWV") float s14 = samples[14]; + @LOC("THIS,SynthesisFilter.NEWV") float s15 = samples[15]; + @LOC("THIS,SynthesisFilter.NEWV") float s16 = samples[16]; + @LOC("THIS,SynthesisFilter.NEWV") float s17 = samples[17]; + @LOC("THIS,SynthesisFilter.NEWV") float s18 = samples[18]; + @LOC("THIS,SynthesisFilter.NEWV") float s19 = samples[19]; + @LOC("THIS,SynthesisFilter.NEWV") float s20 = samples[20]; + @LOC("THIS,SynthesisFilter.NEWV") float s21 = samples[21]; + @LOC("THIS,SynthesisFilter.NEWV") float s22 = samples[22]; + @LOC("THIS,SynthesisFilter.NEWV") float s23 = samples[23]; + @LOC("THIS,SynthesisFilter.NEWV") float s24 = samples[24]; + @LOC("THIS,SynthesisFilter.NEWV") float s25 = samples[25]; + @LOC("THIS,SynthesisFilter.NEWV") float s26 = samples[26]; + @LOC("THIS,SynthesisFilter.NEWV") float s27 = samples[27]; + @LOC("THIS,SynthesisFilter.NEWV") float s28 = samples[28]; + @LOC("THIS,SynthesisFilter.NEWV") float s29 = samples[29]; + @LOC("THIS,SynthesisFilter.NEWV") float s30 = samples[30]; + @LOC("THIS,SynthesisFilter.NEWV") float s31 = samples[31]; + + @LOC("THIS,SynthesisFilter.NEWV") float p0 = s0 + s31; + @LOC("THIS,SynthesisFilter.NEWV") float p1 = s1 + s30; + @LOC("THIS,SynthesisFilter.NEWV") float p2 = s2 + s29; + @LOC("THIS,SynthesisFilter.NEWV") float p3 = s3 + s28; + @LOC("THIS,SynthesisFilter.NEWV") float p4 = s4 + s27; + @LOC("THIS,SynthesisFilter.NEWV") float p5 = s5 + s26; + @LOC("THIS,SynthesisFilter.NEWV") float p6 = s6 + s25; + @LOC("THIS,SynthesisFilter.NEWV") float p7 = s7 + s24; + @LOC("THIS,SynthesisFilter.NEWV") float p8 = s8 + s23; + @LOC("THIS,SynthesisFilter.NEWV") float p9 = s9 + s22; + @LOC("THIS,SynthesisFilter.NEWV") float p10 = s10 + s21; + @LOC("THIS,SynthesisFilter.NEWV") float p11 = s11 + s20; + @LOC("THIS,SynthesisFilter.NEWV") float p12 = s12 + s19; + @LOC("THIS,SynthesisFilter.NEWV") float p13 = s13 + s18; + @LOC("THIS,SynthesisFilter.NEWV") float p14 = s14 + s17; + @LOC("THIS,SynthesisFilter.NEWV") float p15 = s15 + s16; + + @LOC("THIS,SynthesisFilter.NEWV") float pp0 = p0 + p15; + @LOC("THIS,SynthesisFilter.NEWV") float pp1 = p1 + p14; + @LOC("THIS,SynthesisFilter.NEWV") float pp2 = p2 + p13; + @LOC("THIS,SynthesisFilter.NEWV") float pp3 = p3 + p12; + @LOC("THIS,SynthesisFilter.NEWV") float pp4 = p4 + p11; + @LOC("THIS,SynthesisFilter.NEWV") float pp5 = p5 + p10; + @LOC("THIS,SynthesisFilter.NEWV") float pp6 = p6 + p9; + @LOC("THIS,SynthesisFilter.NEWV") float pp7 = p7 + p8; + @LOC("THIS,SynthesisFilter.NEWV") float pp8 = (p0 - p15) * cos1_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp9 = (p1 - p14) * cos3_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp10 = (p2 - p13) * cos5_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp11 = (p3 - p12) * cos7_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp12 = (p4 - p11) * cos9_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp13 = (p5 - p10) * cos11_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp14 = (p6 - p9) * cos13_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp15 = (p7 - p8) * cos15_32; + + p0 = pp0 + pp7; + p1 = pp1 + pp6; + p2 = pp2 + pp5; + p3 = pp3 + pp4; + p4 = (pp0 - pp7) * cos1_16; + p5 = (pp1 - pp6) * cos3_16; + p6 = (pp2 - pp5) * cos5_16; + p7 = (pp3 - pp4) * cos7_16; + p8 = pp8 + pp15; + p9 = pp9 + pp14; + p10 = pp10 + pp13; + p11 = pp11 + pp12; + p12 = (pp8 - pp15) * cos1_16; + p13 = (pp9 - pp14) * cos3_16; + p14 = (pp10 - pp13) * cos5_16; + p15 = (pp11 - pp12) * cos7_16; + + pp0 = p0 + p3; + pp1 = p1 + p2; + pp2 = (p0 - p3) * cos1_8; + pp3 = (p1 - p2) * cos3_8; + pp4 = p4 + p7; + pp5 = p5 + p6; + pp6 = (p4 - p7) * cos1_8; + pp7 = (p5 - p6) * cos3_8; + pp8 = p8 + p11; + pp9 = p9 + p10; + pp10 = (p8 - p11) * cos1_8; + pp11 = (p9 - p10) * cos3_8; + pp12 = p12 + p15; + pp13 = p13 + p14; + pp14 = (p12 - p15) * cos1_8; + pp15 = (p13 - p14) * cos3_8; + + p0 = pp0 + pp1; + p1 = (pp0 - pp1) * cos1_4; + p2 = pp2 + pp3; + p3 = (pp2 - pp3) * cos1_4; + p4 = pp4 + pp5; + p5 = (pp4 - pp5) * cos1_4; + p6 = pp6 + pp7; + p7 = (pp6 - pp7) * cos1_4; + p8 = pp8 + pp9; + p9 = (pp8 - pp9) * cos1_4; + p10 = pp10 + pp11; + p11 = (pp10 - pp11) * cos1_4; + p12 = pp12 + pp13; + p13 = (pp12 - pp13) * cos1_4; + p14 = pp14 + pp15; + p15 = (pp14 - pp15) * cos1_4; + + // this is pretty insane coding + @LOC("THIS,SynthesisFilter.NEWV") float tmp1; + new_v19/* 36-17 */= -(new_v4 = (new_v12 = p7) + p5) - p6; + new_v27/* 44-17 */= -p6 - p7 - p4; + new_v6 = (new_v10 = (new_v14 = p15) + p11) + p13; + new_v17/* 34-17 */= -(new_v2 = p15 + p13 + p9) - p14; + new_v21/* 38-17 */= (tmp1 = -p14 - p15 - p10 - p11) - p13; + new_v29/* 46-17 */= -p14 - p15 - p12 - p8; + new_v25/* 42-17 */= tmp1 - p12; + new_v31/* 48-17 */= -p0; + new_v0 = p1; + new_v23/* 40-17 */= -(new_v8 = p3) - p2; + + p0 = (s0 - s31) * cos1_64; + p1 = (s1 - s30) * cos3_64; + p2 = (s2 - s29) * cos5_64; + p3 = (s3 - s28) * cos7_64; + p4 = (s4 - s27) * cos9_64; + p5 = (s5 - s26) * cos11_64; + p6 = (s6 - s25) * cos13_64; + p7 = (s7 - s24) * cos15_64; + p8 = (s8 - s23) * cos17_64; + p9 = (s9 - s22) * cos19_64; + p10 = (s10 - s21) * cos21_64; + p11 = (s11 - s20) * cos23_64; + p12 = (s12 - s19) * cos25_64; + p13 = (s13 - s18) * cos27_64; + p14 = (s14 - s17) * cos29_64; + p15 = (s15 - s16) * cos31_64; + + pp0 = p0 + p15; + pp1 = p1 + p14; + pp2 = p2 + p13; + pp3 = p3 + p12; + pp4 = p4 + p11; + pp5 = p5 + p10; + pp6 = p6 + p9; + pp7 = p7 + p8; + pp8 = (p0 - p15) * cos1_32; + pp9 = (p1 - p14) * cos3_32; + pp10 = (p2 - p13) * cos5_32; + pp11 = (p3 - p12) * cos7_32; + pp12 = (p4 - p11) * cos9_32; + pp13 = (p5 - p10) * cos11_32; + pp14 = (p6 - p9) * cos13_32; + pp15 = (p7 - p8) * cos15_32; + + p0 = pp0 + pp7; + p1 = pp1 + pp6; + p2 = pp2 + pp5; + p3 = pp3 + pp4; + p4 = (pp0 - pp7) * cos1_16; + p5 = (pp1 - pp6) * cos3_16; + p6 = (pp2 - pp5) * cos5_16; + p7 = (pp3 - pp4) * cos7_16; + p8 = pp8 + pp15; + p9 = pp9 + pp14; + p10 = pp10 + pp13; + p11 = pp11 + pp12; + p12 = (pp8 - pp15) * cos1_16; + p13 = (pp9 - pp14) * cos3_16; + p14 = (pp10 - pp13) * cos5_16; + p15 = (pp11 - pp12) * cos7_16; + + pp0 = p0 + p3; + pp1 = p1 + p2; + pp2 = (p0 - p3) * cos1_8; + pp3 = (p1 - p2) * cos3_8; + pp4 = p4 + p7; + pp5 = p5 + p6; + pp6 = (p4 - p7) * cos1_8; + pp7 = (p5 - p6) * cos3_8; + pp8 = p8 + p11; + pp9 = p9 + p10; + pp10 = (p8 - p11) * cos1_8; + pp11 = (p9 - p10) * cos3_8; + pp12 = p12 + p15; + pp13 = p13 + p14; + pp14 = (p12 - p15) * cos1_8; + pp15 = (p13 - p14) * cos3_8; + + p0 = pp0 + pp1; + p1 = (pp0 - pp1) * cos1_4; + p2 = pp2 + pp3; + p3 = (pp2 - pp3) * cos1_4; + p4 = pp4 + pp5; + p5 = (pp4 - pp5) * cos1_4; + p6 = pp6 + pp7; + p7 = (pp6 - pp7) * cos1_4; + p8 = pp8 + pp9; + p9 = (pp8 - pp9) * cos1_4; + p10 = pp10 + pp11; + p11 = (pp10 - pp11) * cos1_4; + p12 = pp12 + pp13; + p13 = (pp12 - pp13) * cos1_4; + p14 = pp14 + pp15; + p15 = (pp14 - pp15) * cos1_4; + + // manually doing something that a compiler should handle sucks + // coding like this is hard to read + @LOC("THIS,SynthesisFilter.NEWV") float tmp2; + new_v5 = (new_v11 = (new_v13 = (new_v15 = p15) + p7) + p11) + p5 + p13; + new_v7 = (new_v9 = p15 + p11 + p3) + p13; + new_v16/* 33-17 */= -(new_v1 = (tmp1 = p13 + p15 + p9) + p1) - p14; + new_v18/* 35-17 */= -(new_v3 = tmp1 + p5 + p7) - p6 - p14; + + new_v22/* 39-17 */= (tmp1 = -p10 - p11 - p14 - p15) - p13 - p2 - p3; + new_v20/* 37-17 */= tmp1 - p13 - p5 - p6 - p7; + new_v24/* 41-17 */= tmp1 - p12 - p2 - p3; + new_v26/* 43-17 */= tmp1 - p12 - (tmp2 = p4 + p6 + p7); + new_v30/* 47-17 */= (tmp1 = -p8 - p12 - p14 - p15) - p0; + new_v28/* 45-17 */= tmp1 - tmp2; + + // insert V[0-15] (== new_v[0-15]) into actual v: + // float[] x2 = actual_v + actual_write_pos; + // float dest[] = actual_v; v2 + + @LOC("THIS,SynthesisFilter.NEWV") int pos = actual_write_pos; + + v2[0 + pos] = new_v0; + v2[16 + pos] = new_v1; + v2[32 + pos] = new_v2; + v2[48 + pos] = new_v3; + v2[64 + pos] = new_v4; + v2[80 + pos] = new_v5; + v2[96 + pos] = new_v6; + v2[112 + pos] = new_v7; + v2[128 + pos] = new_v8; + v2[144 + pos] = new_v9; + v2[160 + pos] = new_v10; + v2[176 + pos] = new_v11; + v2[192 + pos] = new_v12; + v2[208 + pos] = new_v13; + v2[224 + pos] = new_v14; + v2[240 + pos] = new_v15; + + // V[16] is always 0.0: + v2[256 + pos] = 0.0f; + + // insert V[17-31] (== -new_v[15-1]) into actual v: + v2[272 + pos] = -new_v15; + v2[288 + pos] = -new_v14; + v2[304 + pos] = -new_v13; + v2[320 + pos] = -new_v12; + v2[336 + pos] = -new_v11; + v2[352 + pos] = -new_v10; + v2[368 + pos] = -new_v9; + v2[384 + pos] = -new_v8; + v2[400 + pos] = -new_v7; + v2[416 + pos] = -new_v6; + v2[432 + pos] = -new_v5; + v2[448 + pos] = -new_v4; + v2[464 + pos] = -new_v3; + v2[480 + pos] = -new_v2; + v2[496 + pos] = -new_v1; + + // insert V[32] (== -new_v[0]) into other v: + // dest = (actual_v == v1) ? v2 : v1; + + v1[0 + pos] = -new_v0; + // insert V[33-48] (== new_v[16-31]) into other v: + v1[16 + pos] = new_v16; + v1[32 + pos] = new_v17; + v1[48 + pos] = new_v18; + v1[64 + pos] = new_v19; + v1[80 + pos] = new_v20; + v1[96 + pos] = new_v21; + v1[112 + pos] = new_v22; + v1[128 + pos] = new_v23; + v1[144 + pos] = new_v24; + v1[160 + pos] = new_v25; + v1[176 + pos] = new_v26; + v1[192 + pos] = new_v27; + v1[208 + pos] = new_v28; + v1[224 + pos] = new_v29; + v1[240 + pos] = new_v30; + v1[256 + pos] = new_v31; + + // insert V[49-63] (== new_v[30-16]) into other v: + v1[272 + pos] = new_v30; + v1[288 + pos] = new_v29; + v1[304 + pos] = new_v28; + v1[320 + pos] = new_v27; + v1[336 + pos] = new_v26; + v1[352 + pos] = new_v25; + v1[368 + pos] = new_v24; + v1[384 + pos] = new_v23; + v1[400 + pos] = new_v22; + v1[416 + pos] = new_v21; + v1[432 + pos] = new_v20; + v1[448 + pos] = new_v19; + v1[464 + pos] = new_v18; + v1[480 + pos] = new_v17; + v1[496 + pos] = new_v16; + + /* + * setup PREV + */ + + prev2[0 + pos] = new_v0; + prev2[16 + pos] = new_v1; + prev2[32 + pos] = new_v2; + prev2[48 + pos] = new_v3; + prev2[64 + pos] = new_v4; + prev2[80 + pos] = new_v5; + prev2[96 + pos] = new_v6; + prev2[112 + pos] = new_v7; + prev2[128 + pos] = new_v8; + prev2[144 + pos] = new_v9; + prev2[160 + pos] = new_v10; + prev2[176 + pos] = new_v11; + prev2[192 + pos] = new_v12; + prev2[208 + pos] = new_v13; + prev2[224 + pos] = new_v14; + prev2[240 + pos] = new_v15; + + // V[16] is always 0.0: + prev2[256 + pos] = 0.0f; + + // insert V[17-31] (== -new_v[15-1]) into actual v: + prev2[272 + pos] = -new_v15; + prev2[288 + pos] = -new_v14; + prev2[304 + pos] = -new_v13; + prev2[320 + pos] = -new_v12; + prev2[336 + pos] = -new_v11; + prev2[352 + pos] = -new_v10; + prev2[368 + pos] = -new_v9; + prev2[384 + pos] = -new_v8; + prev2[400 + pos] = -new_v7; + prev2[416 + pos] = -new_v6; + prev2[432 + pos] = -new_v5; + prev2[448 + pos] = -new_v4; + prev2[464 + pos] = -new_v3; + prev2[480 + pos] = -new_v2; + prev2[496 + pos] = -new_v1; + + // insert V[32] (== -new_v[0]) into other v: + // dest = (actual_v == v1) ? v2 : v1; + + prev1[0 + pos] = -new_v0; + // insert V[33-48] (== new_v[16-31]) into other v: + prev1[16 + pos] = new_v16; + prev1[32 + pos] = new_v17; + prev1[48 + pos] = new_v18; + prev1[64 + pos] = new_v19; + prev1[80 + pos] = new_v20; + prev1[96 + pos] = new_v21; + prev1[112 + pos] = new_v22; + prev1[128 + pos] = new_v23; + prev1[144 + pos] = new_v24; + prev1[160 + pos] = new_v25; + prev1[176 + pos] = new_v26; + prev1[192 + pos] = new_v27; + prev1[208 + pos] = new_v28; + prev1[224 + pos] = new_v29; + prev1[240 + pos] = new_v30; + prev1[256 + pos] = new_v31; + + // insert V[49-63] (== new_v[30-16]) into other v: + prev1[272 + pos] = new_v30; + prev1[288 + pos] = new_v29; + prev1[304 + pos] = new_v28; + prev1[320 + pos] = new_v27; + prev1[336 + pos] = new_v26; + prev1[352 + pos] = new_v25; + prev1[368 + pos] = new_v24; + prev1[384 + pos] = new_v23; + prev1[400 + pos] = new_v22; + prev1[416 + pos] = new_v21; + prev1[432 + pos] = new_v20; + prev1[448 + pos] = new_v19; + prev1[464 + pos] = new_v18; + prev1[480 + pos] = new_v17; + prev1[496 + pos] = new_v16; + } + + private void compute_new_v1_v2() { + + @LOC("THIS,SynthesisFilter.NEWV") float new_v0 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v1 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v2 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v3 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v4 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v5 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v6 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v7 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v8 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v9 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v10 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v11 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v12 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v13 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v14 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v15 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v16 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v17 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v18 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v19 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v20 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v21 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v22 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v23 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v24 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v25 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v26 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v27 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v28 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v29 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v30 = 0.0f; + @LOC("THIS,SynthesisFilter.NEWV") float new_v31 = 0.0f; + + // float[] new_v = new float[32]; // new V[0-15] and V[33-48] of Figure + // 3-A.2 in ISO DIS 11172-3 + // float[] p = new float[16]; + // float[] pp = new float[16]; + + // float[] s = samples; + + @LOC("THIS,SynthesisFilter.NEWV") float s0 = samples[0]; + @LOC("THIS,SynthesisFilter.NEWV") float s1 = samples[1]; + @LOC("THIS,SynthesisFilter.NEWV") float s2 = samples[2]; + @LOC("THIS,SynthesisFilter.NEWV") float s3 = samples[3]; + @LOC("THIS,SynthesisFilter.NEWV") float s4 = samples[4]; + @LOC("THIS,SynthesisFilter.NEWV") float s5 = samples[5]; + @LOC("THIS,SynthesisFilter.NEWV") float s6 = samples[6]; + @LOC("THIS,SynthesisFilter.NEWV") float s7 = samples[7]; + @LOC("THIS,SynthesisFilter.NEWV") float s8 = samples[8]; + @LOC("THIS,SynthesisFilter.NEWV") float s9 = samples[9]; + @LOC("THIS,SynthesisFilter.NEWV") float s10 = samples[10]; + @LOC("THIS,SynthesisFilter.NEWV") float s11 = samples[11]; + @LOC("THIS,SynthesisFilter.NEWV") float s12 = samples[12]; + @LOC("THIS,SynthesisFilter.NEWV") float s13 = samples[13]; + @LOC("THIS,SynthesisFilter.NEWV") float s14 = samples[14]; + @LOC("THIS,SynthesisFilter.NEWV") float s15 = samples[15]; + @LOC("THIS,SynthesisFilter.NEWV") float s16 = samples[16]; + @LOC("THIS,SynthesisFilter.NEWV") float s17 = samples[17]; + @LOC("THIS,SynthesisFilter.NEWV") float s18 = samples[18]; + @LOC("THIS,SynthesisFilter.NEWV") float s19 = samples[19]; + @LOC("THIS,SynthesisFilter.NEWV") float s20 = samples[20]; + @LOC("THIS,SynthesisFilter.NEWV") float s21 = samples[21]; + @LOC("THIS,SynthesisFilter.NEWV") float s22 = samples[22]; + @LOC("THIS,SynthesisFilter.NEWV") float s23 = samples[23]; + @LOC("THIS,SynthesisFilter.NEWV") float s24 = samples[24]; + @LOC("THIS,SynthesisFilter.NEWV") float s25 = samples[25]; + @LOC("THIS,SynthesisFilter.NEWV") float s26 = samples[26]; + @LOC("THIS,SynthesisFilter.NEWV") float s27 = samples[27]; + @LOC("THIS,SynthesisFilter.NEWV") float s28 = samples[28]; + @LOC("THIS,SynthesisFilter.NEWV") float s29 = samples[29]; + @LOC("THIS,SynthesisFilter.NEWV") float s30 = samples[30]; + @LOC("THIS,SynthesisFilter.NEWV") float s31 = samples[31]; + + @LOC("THIS,SynthesisFilter.NEWV") float p0 = s0 + s31; + @LOC("THIS,SynthesisFilter.NEWV") float p1 = s1 + s30; + @LOC("THIS,SynthesisFilter.NEWV") float p2 = s2 + s29; + @LOC("THIS,SynthesisFilter.NEWV") float p3 = s3 + s28; + @LOC("THIS,SynthesisFilter.NEWV") float p4 = s4 + s27; + @LOC("THIS,SynthesisFilter.NEWV") float p5 = s5 + s26; + @LOC("THIS,SynthesisFilter.NEWV") float p6 = s6 + s25; + @LOC("THIS,SynthesisFilter.NEWV") float p7 = s7 + s24; + @LOC("THIS,SynthesisFilter.NEWV") float p8 = s8 + s23; + @LOC("THIS,SynthesisFilter.NEWV") float p9 = s9 + s22; + @LOC("THIS,SynthesisFilter.NEWV") float p10 = s10 + s21; + @LOC("THIS,SynthesisFilter.NEWV") float p11 = s11 + s20; + @LOC("THIS,SynthesisFilter.NEWV") float p12 = s12 + s19; + @LOC("THIS,SynthesisFilter.NEWV") float p13 = s13 + s18; + @LOC("THIS,SynthesisFilter.NEWV") float p14 = s14 + s17; + @LOC("THIS,SynthesisFilter.NEWV") float p15 = s15 + s16; + + @LOC("THIS,SynthesisFilter.NEWV") float pp0 = p0 + p15; + @LOC("THIS,SynthesisFilter.NEWV") float pp1 = p1 + p14; + @LOC("THIS,SynthesisFilter.NEWV") float pp2 = p2 + p13; + @LOC("THIS,SynthesisFilter.NEWV") float pp3 = p3 + p12; + @LOC("THIS,SynthesisFilter.NEWV") float pp4 = p4 + p11; + @LOC("THIS,SynthesisFilter.NEWV") float pp5 = p5 + p10; + @LOC("THIS,SynthesisFilter.NEWV") float pp6 = p6 + p9; + @LOC("THIS,SynthesisFilter.NEWV") float pp7 = p7 + p8; + @LOC("THIS,SynthesisFilter.NEWV") float pp8 = (p0 - p15) * cos1_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp9 = (p1 - p14) * cos3_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp10 = (p2 - p13) * cos5_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp11 = (p3 - p12) * cos7_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp12 = (p4 - p11) * cos9_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp13 = (p5 - p10) * cos11_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp14 = (p6 - p9) * cos13_32; + @LOC("THIS,SynthesisFilter.NEWV") float pp15 = (p7 - p8) * cos15_32; + + p0 = pp0 + pp7; + p1 = pp1 + pp6; + p2 = pp2 + pp5; + p3 = pp3 + pp4; + p4 = (pp0 - pp7) * cos1_16; + p5 = (pp1 - pp6) * cos3_16; + p6 = (pp2 - pp5) * cos5_16; + p7 = (pp3 - pp4) * cos7_16; + p8 = pp8 + pp15; + p9 = pp9 + pp14; + p10 = pp10 + pp13; + p11 = pp11 + pp12; + p12 = (pp8 - pp15) * cos1_16; + p13 = (pp9 - pp14) * cos3_16; + p14 = (pp10 - pp13) * cos5_16; + p15 = (pp11 - pp12) * cos7_16; + + pp0 = p0 + p3; + pp1 = p1 + p2; + pp2 = (p0 - p3) * cos1_8; + pp3 = (p1 - p2) * cos3_8; + pp4 = p4 + p7; + pp5 = p5 + p6; + pp6 = (p4 - p7) * cos1_8; + pp7 = (p5 - p6) * cos3_8; + pp8 = p8 + p11; + pp9 = p9 + p10; + pp10 = (p8 - p11) * cos1_8; + pp11 = (p9 - p10) * cos3_8; + pp12 = p12 + p15; + pp13 = p13 + p14; + pp14 = (p12 - p15) * cos1_8; + pp15 = (p13 - p14) * cos3_8; + + p0 = pp0 + pp1; + p1 = (pp0 - pp1) * cos1_4; + p2 = pp2 + pp3; + p3 = (pp2 - pp3) * cos1_4; + p4 = pp4 + pp5; + p5 = (pp4 - pp5) * cos1_4; + p6 = pp6 + pp7; + p7 = (pp6 - pp7) * cos1_4; + p8 = pp8 + pp9; + p9 = (pp8 - pp9) * cos1_4; + p10 = pp10 + pp11; + p11 = (pp10 - pp11) * cos1_4; + p12 = pp12 + pp13; + p13 = (pp12 - pp13) * cos1_4; + p14 = pp14 + pp15; + p15 = (pp14 - pp15) * cos1_4; + + // this is pretty insane coding + @LOC("THIS,SynthesisFilter.NEWV") float tmp1; + new_v19/* 36-17 */= -(new_v4 = (new_v12 = p7) + p5) - p6; + new_v27/* 44-17 */= -p6 - p7 - p4; + new_v6 = (new_v10 = (new_v14 = p15) + p11) + p13; + new_v17/* 34-17 */= -(new_v2 = p15 + p13 + p9) - p14; + new_v21/* 38-17 */= (tmp1 = -p14 - p15 - p10 - p11) - p13; + new_v29/* 46-17 */= -p14 - p15 - p12 - p8; + new_v25/* 42-17 */= tmp1 - p12; + new_v31/* 48-17 */= -p0; + new_v0 = p1; + new_v23/* 40-17 */= -(new_v8 = p3) - p2; + + p0 = (s0 - s31) * cos1_64; + p1 = (s1 - s30) * cos3_64; + p2 = (s2 - s29) * cos5_64; + p3 = (s3 - s28) * cos7_64; + p4 = (s4 - s27) * cos9_64; + p5 = (s5 - s26) * cos11_64; + p6 = (s6 - s25) * cos13_64; + p7 = (s7 - s24) * cos15_64; + p8 = (s8 - s23) * cos17_64; + p9 = (s9 - s22) * cos19_64; + p10 = (s10 - s21) * cos21_64; + p11 = (s11 - s20) * cos23_64; + p12 = (s12 - s19) * cos25_64; + p13 = (s13 - s18) * cos27_64; + p14 = (s14 - s17) * cos29_64; + p15 = (s15 - s16) * cos31_64; + + pp0 = p0 + p15; + pp1 = p1 + p14; + pp2 = p2 + p13; + pp3 = p3 + p12; + pp4 = p4 + p11; + pp5 = p5 + p10; + pp6 = p6 + p9; + pp7 = p7 + p8; + pp8 = (p0 - p15) * cos1_32; + pp9 = (p1 - p14) * cos3_32; + pp10 = (p2 - p13) * cos5_32; + pp11 = (p3 - p12) * cos7_32; + pp12 = (p4 - p11) * cos9_32; + pp13 = (p5 - p10) * cos11_32; + pp14 = (p6 - p9) * cos13_32; + pp15 = (p7 - p8) * cos15_32; + + p0 = pp0 + pp7; + p1 = pp1 + pp6; + p2 = pp2 + pp5; + p3 = pp3 + pp4; + p4 = (pp0 - pp7) * cos1_16; + p5 = (pp1 - pp6) * cos3_16; + p6 = (pp2 - pp5) * cos5_16; + p7 = (pp3 - pp4) * cos7_16; + p8 = pp8 + pp15; + p9 = pp9 + pp14; + p10 = pp10 + pp13; + p11 = pp11 + pp12; + p12 = (pp8 - pp15) * cos1_16; + p13 = (pp9 - pp14) * cos3_16; + p14 = (pp10 - pp13) * cos5_16; + p15 = (pp11 - pp12) * cos7_16; + + pp0 = p0 + p3; + pp1 = p1 + p2; + pp2 = (p0 - p3) * cos1_8; + pp3 = (p1 - p2) * cos3_8; + pp4 = p4 + p7; + pp5 = p5 + p6; + pp6 = (p4 - p7) * cos1_8; + pp7 = (p5 - p6) * cos3_8; + pp8 = p8 + p11; + pp9 = p9 + p10; + pp10 = (p8 - p11) * cos1_8; + pp11 = (p9 - p10) * cos3_8; + pp12 = p12 + p15; + pp13 = p13 + p14; + pp14 = (p12 - p15) * cos1_8; + pp15 = (p13 - p14) * cos3_8; + + p0 = pp0 + pp1; + p1 = (pp0 - pp1) * cos1_4; + p2 = pp2 + pp3; + p3 = (pp2 - pp3) * cos1_4; + p4 = pp4 + pp5; + p5 = (pp4 - pp5) * cos1_4; + p6 = pp6 + pp7; + p7 = (pp6 - pp7) * cos1_4; + p8 = pp8 + pp9; + p9 = (pp8 - pp9) * cos1_4; + p10 = pp10 + pp11; + p11 = (pp10 - pp11) * cos1_4; + p12 = pp12 + pp13; + p13 = (pp12 - pp13) * cos1_4; + p14 = pp14 + pp15; + p15 = (pp14 - pp15) * cos1_4; + + // manually doing something that a compiler should handle sucks + // coding like this is hard to read + @LOC("THIS,SynthesisFilter.NEWV") float tmp2; + new_v5 = (new_v11 = (new_v13 = (new_v15 = p15) + p7) + p11) + p5 + p13; + new_v7 = (new_v9 = p15 + p11 + p3) + p13; + new_v16/* 33-17 */= -(new_v1 = (tmp1 = p13 + p15 + p9) + p1) - p14; + new_v18/* 35-17 */= -(new_v3 = tmp1 + p5 + p7) - p6 - p14; + + new_v22/* 39-17 */= (tmp1 = -p10 - p11 - p14 - p15) - p13 - p2 - p3; + new_v20/* 37-17 */= tmp1 - p13 - p5 - p6 - p7; + new_v24/* 41-17 */= tmp1 - p12 - p2 - p3; + new_v26/* 43-17 */= tmp1 - p12 - (tmp2 = p4 + p6 + p7); + new_v30/* 47-17 */= (tmp1 = -p8 - p12 - p14 - p15) - p0; + new_v28/* 45-17 */= tmp1 - tmp2; + + // insert V[0-15] (== new_v[0-15]) into actual v: + // float[] x2 = actual_v + actual_write_pos; + // float dest[] = actual_v; actual_v=v1; + + @LOC("THIS,SynthesisFilter.NEWV") int pos = actual_write_pos; + + v1[0 + pos] = new_v0; + v1[16 + pos] = new_v1; + v1[32 + pos] = new_v2; + v1[48 + pos] = new_v3; + v1[64 + pos] = new_v4; + v1[80 + pos] = new_v5; + v1[96 + pos] = new_v6; + v1[112 + pos] = new_v7; + v1[128 + pos] = new_v8; + v1[144 + pos] = new_v9; + v1[160 + pos] = new_v10; + v1[176 + pos] = new_v11; + v1[192 + pos] = new_v12; + v1[208 + pos] = new_v13; + v1[224 + pos] = new_v14; + v1[240 + pos] = new_v15; + + // V[16] is always 0.0: + v1[256 + pos] = 0.0f; + + // insert V[17-31] (== -new_v[15-1]) into actual v: + v1[272 + pos] = -new_v15; + v1[288 + pos] = -new_v14; + v1[304 + pos] = -new_v13; + v1[320 + pos] = -new_v12; + v1[336 + pos] = -new_v11; + v1[352 + pos] = -new_v10; + v1[368 + pos] = -new_v9; + v1[384 + pos] = -new_v8; + v1[400 + pos] = -new_v7; + v1[416 + pos] = -new_v6; + v1[432 + pos] = -new_v5; + v1[448 + pos] = -new_v4; + v1[464 + pos] = -new_v3; + v1[480 + pos] = -new_v2; + v1[496 + pos] = -new_v1; + + // insert V[32] (== -new_v[0]) into other v: + // dest = (actual_v == v1) ? v2 : v1; + + v2[0 + pos] = -new_v0; + // insert V[33-48] (== new_v[16-31]) into other v: + v2[16 + pos] = new_v16; + v2[32 + pos] = new_v17; + v2[48 + pos] = new_v18; + v2[64 + pos] = new_v19; + v2[80 + pos] = new_v20; + v2[96 + pos] = new_v21; + v2[112 + pos] = new_v22; + v2[128 + pos] = new_v23; + v2[144 + pos] = new_v24; + v2[160 + pos] = new_v25; + v2[176 + pos] = new_v26; + v2[192 + pos] = new_v27; + v2[208 + pos] = new_v28; + v2[224 + pos] = new_v29; + v2[240 + pos] = new_v30; + v2[256 + pos] = new_v31; + + // insert V[49-63] (== new_v[30-16]) into other v: + v2[272 + pos] = new_v30; + v2[288 + pos] = new_v29; + v2[304 + pos] = new_v28; + v2[320 + pos] = new_v27; + v2[336 + pos] = new_v26; + v2[352 + pos] = new_v25; + v2[368 + pos] = new_v24; + v2[384 + pos] = new_v23; + v2[400 + pos] = new_v22; + v2[416 + pos] = new_v21; + v2[432 + pos] = new_v20; + v2[448 + pos] = new_v19; + v2[464 + pos] = new_v18; + v2[480 + pos] = new_v17; + v2[496 + pos] = new_v16; + + /* + * setup PREV + */ + + prev1[0 + pos] = new_v0; + prev1[16 + pos] = new_v1; + prev1[32 + pos] = new_v2; + prev1[48 + pos] = new_v3; + prev1[64 + pos] = new_v4; + prev1[80 + pos] = new_v5; + prev1[96 + pos] = new_v6; + prev1[112 + pos] = new_v7; + prev1[128 + pos] = new_v8; + prev1[144 + pos] = new_v9; + prev1[160 + pos] = new_v10; + prev1[176 + pos] = new_v11; + prev1[192 + pos] = new_v12; + prev1[208 + pos] = new_v13; + prev1[224 + pos] = new_v14; + prev1[240 + pos] = new_v15; + + // V[16] is always 0.0: + prev1[256 + pos] = 0.0f; + + // insert V[17-31] (== -new_v[15-1]) into actual v: + prev1[272 + pos] = -new_v15; + prev1[288 + pos] = -new_v14; + prev1[304 + pos] = -new_v13; + prev1[320 + pos] = -new_v12; + prev1[336 + pos] = -new_v11; + prev1[352 + pos] = -new_v10; + prev1[368 + pos] = -new_v9; + prev1[384 + pos] = -new_v8; + prev1[400 + pos] = -new_v7; + prev1[416 + pos] = -new_v6; + prev1[432 + pos] = -new_v5; + prev1[448 + pos] = -new_v4; + prev1[464 + pos] = -new_v3; + prev1[480 + pos] = -new_v2; + prev1[496 + pos] = -new_v1; + + // insert V[32] (== -new_v[0]) into other v: + // dest = (actual_v == v1) ? v2 : v1; + + prev2[0 + pos] = -new_v0; + // insert V[33-48] (== new_v[16-31]) into other v: + prev2[16 + pos] = new_v16; + prev2[32 + pos] = new_v17; + prev2[48 + pos] = new_v18; + prev2[64 + pos] = new_v19; + prev2[80 + pos] = new_v20; + prev2[96 + pos] = new_v21; + prev2[112 + pos] = new_v22; + prev2[128 + pos] = new_v23; + prev2[144 + pos] = new_v24; + prev2[160 + pos] = new_v25; + prev2[176 + pos] = new_v26; + prev2[192 + pos] = new_v27; + prev2[208 + pos] = new_v28; + prev2[224 + pos] = new_v29; + prev2[240 + pos] = new_v30; + prev2[256 + pos] = new_v31; + + // insert V[49-63] (== new_v[30-16]) into other v: + prev2[272 + pos] = new_v30; + prev2[288 + pos] = new_v29; + prev2[304 + pos] = new_v28; + prev2[320 + pos] = new_v27; + prev2[336 + pos] = new_v26; + prev2[352 + pos] = new_v25; + prev2[368 + pos] = new_v24; + prev2[384 + pos] = new_v23; + prev2[400 + pos] = new_v22; + prev2[416 + pos] = new_v21; + prev2[432 + pos] = new_v20; + prev2[448 + pos] = new_v19; + prev2[464 + pos] = new_v18; + prev2[480 + pos] = new_v17; + prev2[496 + pos] = new_v16; + } + + /** + * Compute PCM Samples. + */ + + @LOC("OUT") + private float[] _tmpOut = new float[32]; + + private void compute_pcm_samples0() { + + if (vidx == 1) { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + // final float[] dp = d16[i]; + pcm_sample = + (float) (((v1[0 + dvp] * d16[i][0]) + (v1[15 + dvp] * d16[i][1]) + + (v1[14 + dvp] * d16[i][2]) + (v1[13 + dvp] * d16[i][3]) + + (v1[12 + dvp] * d16[i][4]) + (v1[11 + dvp] * d16[i][5]) + + (v1[10 + dvp] * d16[i][6]) + (v1[9 + dvp] * d16[i][7]) + + (v1[8 + dvp] * d16[i][8]) + (v1[7 + dvp] * d16[i][9]) + + (v1[6 + dvp] * d16[i][10]) + (v1[5 + dvp] * d16[i][11]) + + (v1[4 + dvp] * d16[i][12]) + (v1[3 + dvp] * d16[i][13]) + + (v1[2 + dvp] * d16[i][14]) + (v1[1 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + // final float[] dp = d16[i]; + pcm_sample = + (float) (((v2[0 + dvp] * d16[i][0]) + (v2[15 + dvp] * d16[i][1]) + + (v2[14 + dvp] * d16[i][2]) + (v2[13 + dvp] * d16[i][3]) + + (v2[12 + dvp] * d16[i][4]) + (v2[11 + dvp] * d16[i][5]) + + (v2[10 + dvp] * d16[i][6]) + (v2[9 + dvp] * d16[i][7]) + + (v2[8 + dvp] * d16[i][8]) + (v2[7 + dvp] * d16[i][9]) + + (v2[6 + dvp] * d16[i][10]) + (v2[5 + dvp] * d16[i][11]) + + (v2[4 + dvp] * d16[i][12]) + (v2[3 + dvp] * d16[i][13]) + + (v2[2 + dvp] * d16[i][14]) + (v2[1 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples1() { + + if (vidx == 1) { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[1 + dvp] * d16[i][0]) + (v1[0 + dvp] * d16[i][1]) + + (v1[15 + dvp] * d16[i][2]) + (v1[14 + dvp] * d16[i][3]) + + (v1[13 + dvp] * d16[i][4]) + (v1[12 + dvp] * d16[i][5]) + + (v1[11 + dvp] * d16[i][6]) + (v1[10 + dvp] * d16[i][7]) + + (v1[9 + dvp] * d16[i][8]) + (v1[8 + dvp] * d16[i][9]) + + (v1[7 + dvp] * d16[i][10]) + (v1[6 + dvp] * d16[i][11]) + + (v1[5 + dvp] * d16[i][12]) + (v1[4 + dvp] * d16[i][13]) + + (v1[3 + dvp] * d16[i][14]) + (v1[2 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[1 + dvp] * d16[i][0]) + (v2[0 + dvp] * d16[i][1]) + + (v2[15 + dvp] * d16[i][2]) + (v2[14 + dvp] * d16[i][3]) + + (v2[13 + dvp] * d16[i][4]) + (v2[12 + dvp] * d16[i][5]) + + (v2[11 + dvp] * d16[i][6]) + (v2[10 + dvp] * d16[i][7]) + + (v2[9 + dvp] * d16[i][8]) + (v2[8 + dvp] * d16[i][9]) + + (v2[7 + dvp] * d16[i][10]) + (v2[6 + dvp] * d16[i][11]) + + (v2[5 + dvp] * d16[i][12]) + (v2[4 + dvp] * d16[i][13]) + + (v2[3 + dvp] * d16[i][14]) + (v2[2 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples2() { + + if (vidx == 1) { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[2 + dvp] * d16[i][0]) + (v1[1 + dvp] * d16[i][1]) + + (v1[0 + dvp] * d16[i][2]) + (v1[15 + dvp] * d16[i][3]) + + (v1[14 + dvp] * d16[i][4]) + (v1[13 + dvp] * d16[i][5]) + + (v1[12 + dvp] * d16[i][6]) + (v1[11 + dvp] * d16[i][7]) + + (v1[10 + dvp] * d16[i][8]) + (v1[9 + dvp] * d16[i][9]) + + (v1[8 + dvp] * d16[i][10]) + (v1[7 + dvp] * d16[i][11]) + + (v1[6 + dvp] * d16[i][12]) + (v1[5 + dvp] * d16[i][13]) + + (v1[4 + dvp] * d16[i][14]) + (v1[3 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[2 + dvp] * d16[i][0]) + (v2[1 + dvp] * d16[i][1]) + + (v2[0 + dvp] * d16[i][2]) + (v2[15 + dvp] * d16[i][3]) + + (v2[14 + dvp] * d16[i][4]) + (v2[13 + dvp] * d16[i][5]) + + (v2[12 + dvp] * d16[i][6]) + (v2[11 + dvp] * d16[i][7]) + + (v2[10 + dvp] * d16[i][8]) + (v2[9 + dvp] * d16[i][9]) + + (v2[8 + dvp] * d16[i][10]) + (v2[7 + dvp] * d16[i][11]) + + (v2[6 + dvp] * d16[i][12]) + (v2[5 + dvp] * d16[i][13]) + + (v2[4 + dvp] * d16[i][14]) + (v2[3 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples3() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[3 + dvp] * d16[i][0]) + (v1[2 + dvp] * d16[i][1]) + + (v1[1 + dvp] * d16[i][2]) + (v1[0 + dvp] * d16[i][3]) + + (v1[15 + dvp] * d16[i][4]) + (v1[14 + dvp] * d16[i][5]) + + (v1[13 + dvp] * d16[i][6]) + (v1[12 + dvp] * d16[i][7]) + + (v1[11 + dvp] * d16[i][8]) + (v1[10 + dvp] * d16[i][9]) + + (v1[9 + dvp] * d16[i][10]) + (v1[8 + dvp] * d16[i][11]) + + (v1[7 + dvp] * d16[i][12]) + (v1[6 + dvp] * d16[i][13]) + + (v1[5 + dvp] * d16[i][14]) + (v1[4 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[3 + dvp] * d16[i][0]) + (v2[2 + dvp] * d16[i][1]) + + (v2[1 + dvp] * d16[i][2]) + (v2[0 + dvp] * d16[i][3]) + + (v2[15 + dvp] * d16[i][4]) + (v2[14 + dvp] * d16[i][5]) + + (v2[13 + dvp] * d16[i][6]) + (v2[12 + dvp] * d16[i][7]) + + (v2[11 + dvp] * d16[i][8]) + (v2[10 + dvp] * d16[i][9]) + + (v2[9 + dvp] * d16[i][10]) + (v2[8 + dvp] * d16[i][11]) + + (v2[7 + dvp] * d16[i][12]) + (v2[6 + dvp] * d16[i][13]) + + (v2[5 + dvp] * d16[i][14]) + (v2[4 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples4() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[4 + dvp] * d16[i][0]) + (v1[3 + dvp] * d16[i][1]) + + (v1[2 + dvp] * d16[i][2]) + (v1[1 + dvp] * d16[i][3]) + (v1[0 + dvp] * d16[i][4]) + + (v1[15 + dvp] * d16[i][5]) + (v1[14 + dvp] * d16[i][6]) + + (v1[13 + dvp] * d16[i][7]) + (v1[12 + dvp] * d16[i][8]) + + (v1[11 + dvp] * d16[i][9]) + (v1[10 + dvp] * d16[i][10]) + + (v1[9 + dvp] * d16[i][11]) + (v1[8 + dvp] * d16[i][12]) + + (v1[7 + dvp] * d16[i][13]) + (v1[6 + dvp] * d16[i][14]) + (v1[5 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[4 + dvp] * d16[i][0]) + (v2[3 + dvp] * d16[i][1]) + + (v2[2 + dvp] * d16[i][2]) + (v2[1 + dvp] * d16[i][3]) + (v2[0 + dvp] * d16[i][4]) + + (v2[15 + dvp] * d16[i][5]) + (v2[14 + dvp] * d16[i][6]) + + (v2[13 + dvp] * d16[i][7]) + (v2[12 + dvp] * d16[i][8]) + + (v2[11 + dvp] * d16[i][9]) + (v2[10 + dvp] * d16[i][10]) + + (v2[9 + dvp] * d16[i][11]) + (v2[8 + dvp] * d16[i][12]) + + (v2[7 + dvp] * d16[i][13]) + (v2[6 + dvp] * d16[i][14]) + (v2[5 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples5() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[5 + dvp] * d16[i][0]) + (v1[4 + dvp] * d16[i][1]) + + (v1[3 + dvp] * d16[i][2]) + (v1[2 + dvp] * d16[i][3]) + (v1[1 + dvp] * d16[i][4]) + + (v1[0 + dvp] * d16[i][5]) + (v1[15 + dvp] * d16[i][6]) + + (v1[14 + dvp] * d16[i][7]) + (v1[13 + dvp] * d16[i][8]) + + (v1[12 + dvp] * d16[i][9]) + (v1[11 + dvp] * d16[i][10]) + + (v1[10 + dvp] * d16[i][11]) + (v1[9 + dvp] * d16[i][12]) + + (v1[8 + dvp] * d16[i][13]) + (v1[7 + dvp] * d16[i][14]) + (v1[6 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[5 + dvp] * d16[i][0]) + (v2[4 + dvp] * d16[i][1]) + + (v2[3 + dvp] * d16[i][2]) + (v2[2 + dvp] * d16[i][3]) + (v2[1 + dvp] * d16[i][4]) + + (v2[0 + dvp] * d16[i][5]) + (v2[15 + dvp] * d16[i][6]) + + (v2[14 + dvp] * d16[i][7]) + (v2[13 + dvp] * d16[i][8]) + + (v2[12 + dvp] * d16[i][9]) + (v2[11 + dvp] * d16[i][10]) + + (v2[10 + dvp] * d16[i][11]) + (v2[9 + dvp] * d16[i][12]) + + (v2[8 + dvp] * d16[i][13]) + (v2[7 + dvp] * d16[i][14]) + (v2[6 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples6() { + + if (vidx == 1) { + + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[6 + dvp] * d16[i][0]) + (v1[5 + dvp] * d16[i][1]) + + (v1[4 + dvp] * d16[i][2]) + (v1[3 + dvp] * d16[i][3]) + (v1[2 + dvp] * d16[i][4]) + + (v1[1 + dvp] * d16[i][5]) + (v1[0 + dvp] * d16[i][6]) + + (v1[15 + dvp] * d16[i][7]) + (v1[14 + dvp] * d16[i][8]) + + (v1[13 + dvp] * d16[i][9]) + (v1[12 + dvp] * d16[i][10]) + + (v1[11 + dvp] * d16[i][11]) + (v1[10 + dvp] * d16[i][12]) + + (v1[9 + dvp] * d16[i][13]) + (v1[8 + dvp] * d16[i][14]) + (v1[7 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[6 + dvp] * d16[i][0]) + (v2[5 + dvp] * d16[i][1]) + + (v2[4 + dvp] * d16[i][2]) + (v2[3 + dvp] * d16[i][3]) + (v2[2 + dvp] * d16[i][4]) + + (v2[1 + dvp] * d16[i][5]) + (v2[0 + dvp] * d16[i][6]) + + (v2[15 + dvp] * d16[i][7]) + (v2[14 + dvp] * d16[i][8]) + + (v2[13 + dvp] * d16[i][9]) + (v2[12 + dvp] * d16[i][10]) + + (v2[11 + dvp] * d16[i][11]) + (v2[10 + dvp] * d16[i][12]) + + (v2[9 + dvp] * d16[i][13]) + (v2[8 + dvp] * d16[i][14]) + (v2[7 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples7() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[7 + dvp] * d16[i][0]) + (v1[6 + dvp] * d16[i][1]) + + (v1[5 + dvp] * d16[i][2]) + (v1[4 + dvp] * d16[i][3]) + (v1[3 + dvp] * d16[i][4]) + + (v1[2 + dvp] * d16[i][5]) + (v1[1 + dvp] * d16[i][6]) + (v1[0 + dvp] * d16[i][7]) + + (v1[15 + dvp] * d16[i][8]) + (v1[14 + dvp] * d16[i][9]) + + (v1[13 + dvp] * d16[i][10]) + (v1[12 + dvp] * d16[i][11]) + + (v1[11 + dvp] * d16[i][12]) + (v1[10 + dvp] * d16[i][13]) + + (v1[9 + dvp] * d16[i][14]) + (v1[8 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[7 + dvp] * d16[i][0]) + (v2[6 + dvp] * d16[i][1]) + + (v2[5 + dvp] * d16[i][2]) + (v2[4 + dvp] * d16[i][3]) + (v2[3 + dvp] * d16[i][4]) + + (v2[2 + dvp] * d16[i][5]) + (v2[1 + dvp] * d16[i][6]) + (v2[0 + dvp] * d16[i][7]) + + (v2[15 + dvp] * d16[i][8]) + (v2[14 + dvp] * d16[i][9]) + + (v2[13 + dvp] * d16[i][10]) + (v2[12 + dvp] * d16[i][11]) + + (v2[11 + dvp] * d16[i][12]) + (v2[10 + dvp] * d16[i][13]) + + (v2[9 + dvp] * d16[i][14]) + (v2[8 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples8() { + + if (vidx == 1) { + + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[8 + dvp] * d16[i][0]) + (v1[7 + dvp] * d16[i][1]) + + (v1[6 + dvp] * d16[i][2]) + (v1[5 + dvp] * d16[i][3]) + (v1[4 + dvp] * d16[i][4]) + + (v1[3 + dvp] * d16[i][5]) + (v1[2 + dvp] * d16[i][6]) + (v1[1 + dvp] * d16[i][7]) + + (v1[0 + dvp] * d16[i][8]) + (v1[15 + dvp] * d16[i][9]) + + (v1[14 + dvp] * d16[i][10]) + (v1[13 + dvp] * d16[i][11]) + + (v1[12 + dvp] * d16[i][12]) + (v1[11 + dvp] * d16[i][13]) + + (v1[10 + dvp] * d16[i][14]) + (v1[9 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[8 + dvp] * d16[i][0]) + (v2[7 + dvp] * d16[i][1]) + + (v2[6 + dvp] * d16[i][2]) + (v2[5 + dvp] * d16[i][3]) + (v2[4 + dvp] * d16[i][4]) + + (v2[3 + dvp] * d16[i][5]) + (v2[2 + dvp] * d16[i][6]) + (v2[1 + dvp] * d16[i][7]) + + (v2[0 + dvp] * d16[i][8]) + (v2[15 + dvp] * d16[i][9]) + + (v2[14 + dvp] * d16[i][10]) + (v2[13 + dvp] * d16[i][11]) + + (v2[12 + dvp] * d16[i][12]) + (v2[11 + dvp] * d16[i][13]) + + (v2[10 + dvp] * d16[i][14]) + (v2[9 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples9() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[9 + dvp] * d16[i][0]) + (v1[8 + dvp] * d16[i][1]) + + (v1[7 + dvp] * d16[i][2]) + (v1[6 + dvp] * d16[i][3]) + (v1[5 + dvp] * d16[i][4]) + + (v1[4 + dvp] * d16[i][5]) + (v1[3 + dvp] * d16[i][6]) + (v1[2 + dvp] * d16[i][7]) + + (v1[1 + dvp] * d16[i][8]) + (v1[0 + dvp] * d16[i][9]) + + (v1[15 + dvp] * d16[i][10]) + (v1[14 + dvp] * d16[i][11]) + + (v1[13 + dvp] * d16[i][12]) + (v1[12 + dvp] * d16[i][13]) + + (v1[11 + dvp] * d16[i][14]) + (v1[10 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[9 + dvp] * d16[i][0]) + (v2[8 + dvp] * d16[i][1]) + + (v2[7 + dvp] * d16[i][2]) + (v2[6 + dvp] * d16[i][3]) + (v2[5 + dvp] * d16[i][4]) + + (v2[4 + dvp] * d16[i][5]) + (v2[3 + dvp] * d16[i][6]) + (v2[2 + dvp] * d16[i][7]) + + (v2[1 + dvp] * d16[i][8]) + (v2[0 + dvp] * d16[i][9]) + + (v2[15 + dvp] * d16[i][10]) + (v2[14 + dvp] * d16[i][11]) + + (v2[13 + dvp] * d16[i][12]) + (v2[12 + dvp] * d16[i][13]) + + (v2[11 + dvp] * d16[i][14]) + (v2[10 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples10() { + if (vidx == 1) { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[10 + dvp] * d16[i][0]) + (v1[9 + dvp] * d16[i][1]) + + (v1[8 + dvp] * d16[i][2]) + (v1[7 + dvp] * d16[i][3]) + (v1[6 + dvp] * d16[i][4]) + + (v1[5 + dvp] * d16[i][5]) + (v1[4 + dvp] * d16[i][6]) + (v1[3 + dvp] * d16[i][7]) + + (v1[2 + dvp] * d16[i][8]) + (v1[1 + dvp] * d16[i][9]) + + (v1[0 + dvp] * d16[i][10]) + (v1[15 + dvp] * d16[i][11]) + + (v1[14 + dvp] * d16[i][12]) + (v1[13 + dvp] * d16[i][13]) + + (v1[12 + dvp] * d16[i][14]) + (v1[11 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[10 + dvp] * d16[i][0]) + (v2[9 + dvp] * d16[i][1]) + + (v2[8 + dvp] * d16[i][2]) + (v2[7 + dvp] * d16[i][3]) + (v2[6 + dvp] * d16[i][4]) + + (v2[5 + dvp] * d16[i][5]) + (v2[4 + dvp] * d16[i][6]) + (v2[3 + dvp] * d16[i][7]) + + (v2[2 + dvp] * d16[i][8]) + (v2[1 + dvp] * d16[i][9]) + + (v2[0 + dvp] * d16[i][10]) + (v2[15 + dvp] * d16[i][11]) + + (v2[14 + dvp] * d16[i][12]) + (v2[13 + dvp] * d16[i][13]) + + (v2[12 + dvp] * d16[i][14]) + (v2[11 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples11() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[11 + dvp] * d16[i][0]) + (v1[10 + dvp] * d16[i][1]) + + (v1[9 + dvp] * d16[i][2]) + (v1[8 + dvp] * d16[i][3]) + (v1[7 + dvp] * d16[i][4]) + + (v1[6 + dvp] * d16[i][5]) + (v1[5 + dvp] * d16[i][6]) + (v1[4 + dvp] * d16[i][7]) + + (v1[3 + dvp] * d16[i][8]) + (v1[2 + dvp] * d16[i][9]) + + (v1[1 + dvp] * d16[i][10]) + (v1[0 + dvp] * d16[i][11]) + + (v1[15 + dvp] * d16[i][12]) + (v1[14 + dvp] * d16[i][13]) + + (v1[13 + dvp] * d16[i][14]) + (v1[12 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[11 + dvp] * d16[i][0]) + (v2[10 + dvp] * d16[i][1]) + + (v2[9 + dvp] * d16[i][2]) + (v2[8 + dvp] * d16[i][3]) + (v2[7 + dvp] * d16[i][4]) + + (v2[6 + dvp] * d16[i][5]) + (v2[5 + dvp] * d16[i][6]) + (v2[4 + dvp] * d16[i][7]) + + (v2[3 + dvp] * d16[i][8]) + (v2[2 + dvp] * d16[i][9]) + + (v2[1 + dvp] * d16[i][10]) + (v2[0 + dvp] * d16[i][11]) + + (v2[15 + dvp] * d16[i][12]) + (v2[14 + dvp] * d16[i][13]) + + (v2[13 + dvp] * d16[i][14]) + (v2[12 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples12() { + + if (vidx == 1) { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[12 + dvp] * d16[i][0]) + (v1[11 + dvp] * d16[i][1]) + + (v1[10 + dvp] * d16[i][2]) + (v1[9 + dvp] * d16[i][3]) + + (v1[8 + dvp] * d16[i][4]) + (v1[7 + dvp] * d16[i][5]) + (v1[6 + dvp] * d16[i][6]) + + (v1[5 + dvp] * d16[i][7]) + (v1[4 + dvp] * d16[i][8]) + (v1[3 + dvp] * d16[i][9]) + + (v1[2 + dvp] * d16[i][10]) + (v1[1 + dvp] * d16[i][11]) + + (v1[0 + dvp] * d16[i][12]) + (v1[15 + dvp] * d16[i][13]) + + (v1[14 + dvp] * d16[i][14]) + (v1[13 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[12 + dvp] * d16[i][0]) + (v2[11 + dvp] * d16[i][1]) + + (v2[10 + dvp] * d16[i][2]) + (v2[9 + dvp] * d16[i][3]) + + (v2[8 + dvp] * d16[i][4]) + (v2[7 + dvp] * d16[i][5]) + (v2[6 + dvp] * d16[i][6]) + + (v2[5 + dvp] * d16[i][7]) + (v2[4 + dvp] * d16[i][8]) + (v2[3 + dvp] * d16[i][9]) + + (v2[2 + dvp] * d16[i][10]) + (v2[1 + dvp] * d16[i][11]) + + (v2[0 + dvp] * d16[i][12]) + (v2[15 + dvp] * d16[i][13]) + + (v2[14 + dvp] * d16[i][14]) + (v2[13 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples13() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[13 + dvp] * d16[i][0]) + (v1[12 + dvp] * d16[i][1]) + + (v1[11 + dvp] * d16[i][2]) + (v1[10 + dvp] * d16[i][3]) + + (v1[9 + dvp] * d16[i][4]) + (v1[8 + dvp] * d16[i][5]) + (v1[7 + dvp] * d16[i][6]) + + (v1[6 + dvp] * d16[i][7]) + (v1[5 + dvp] * d16[i][8]) + (v1[4 + dvp] * d16[i][9]) + + (v1[3 + dvp] * d16[i][10]) + (v1[2 + dvp] * d16[i][11]) + + (v1[1 + dvp] * d16[i][12]) + (v1[0 + dvp] * d16[i][13]) + + (v1[15 + dvp] * d16[i][14]) + (v1[14 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[13 + dvp] * d16[i][0]) + (v2[12 + dvp] * d16[i][1]) + + (v2[11 + dvp] * d16[i][2]) + (v2[10 + dvp] * d16[i][3]) + + (v2[9 + dvp] * d16[i][4]) + (v2[8 + dvp] * d16[i][5]) + (v2[7 + dvp] * d16[i][6]) + + (v2[6 + dvp] * d16[i][7]) + (v2[5 + dvp] * d16[i][8]) + (v2[4 + dvp] * d16[i][9]) + + (v2[3 + dvp] * d16[i][10]) + (v2[2 + dvp] * d16[i][11]) + + (v2[1 + dvp] * d16[i][12]) + (v2[0 + dvp] * d16[i][13]) + + (v2[15 + dvp] * d16[i][14]) + (v2[14 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples14() { + + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v1[14 + dvp] * d16[i][0]) + (v1[13 + dvp] * d16[i][1]) + + (v1[12 + dvp] * d16[i][2]) + (v1[11 + dvp] * d16[i][3]) + + (v1[10 + dvp] * d16[i][4]) + (v1[9 + dvp] * d16[i][5]) + + (v1[8 + dvp] * d16[i][6]) + (v1[7 + dvp] * d16[i][7]) + (v1[6 + dvp] * d16[i][8]) + + (v1[5 + dvp] * d16[i][9]) + (v1[4 + dvp] * d16[i][10]) + + (v1[3 + dvp] * d16[i][11]) + (v1[2 + dvp] * d16[i][12]) + + (v1[1 + dvp] * d16[i][13]) + (v1[0 + dvp] * d16[i][14]) + (v1[15 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + // final float[] dp = d16[i]; + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + + pcm_sample = + (float) (((v2[14 + dvp] * d16[i][0]) + (v2[13 + dvp] * d16[i][1]) + + (v2[12 + dvp] * d16[i][2]) + (v2[11 + dvp] * d16[i][3]) + + (v2[10 + dvp] * d16[i][4]) + (v2[9 + dvp] * d16[i][5]) + + (v2[8 + dvp] * d16[i][6]) + (v2[7 + dvp] * d16[i][7]) + (v2[6 + dvp] * d16[i][8]) + + (v2[5 + dvp] * d16[i][9]) + (v2[4 + dvp] * d16[i][10]) + + (v2[3 + dvp] * d16[i][11]) + (v2[2 + dvp] * d16[i][12]) + + (v2[1 + dvp] * d16[i][13]) + (v2[0 + dvp] * d16[i][14]) + (v2[15 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples15() { + if (vidx == 1) { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + // final float d16[i][] = d16[i]; + pcm_sample = + (float) (((v1[15 + dvp] * d16[i][0]) + (v1[14 + dvp] * d16[i][1]) + + (v1[13 + dvp] * d16[i][2]) + (v1[12 + dvp] * d16[i][3]) + + (v1[11 + dvp] * d16[i][4]) + (v1[10 + dvp] * d16[i][5]) + + (v1[9 + dvp] * d16[i][6]) + (v1[8 + dvp] * d16[i][7]) + (v1[7 + dvp] * d16[i][8]) + + (v1[6 + dvp] * d16[i][9]) + (v1[5 + dvp] * d16[i][10]) + + (v1[4 + dvp] * d16[i][11]) + (v1[3 + dvp] * d16[i][12]) + + (v1[2 + dvp] * d16[i][13]) + (v1[1 + dvp] * d16[i][14]) + (v1[0 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + dvp += 16; + } // for + } else { + // final float[] vp = actual_v; + + // int inc = v_inc; + // final float[] tmpOut = _tmpOut; + @LOC("THIS,SynthesisFilter.NEWV") int dvp = 0; + + // fat chance of having this loop unroll + for (@LOC("THIS,SynthesisFilter.NEWV") int i = 0; i < 32; i++) { + @LOC("THIS,SynthesisFilter.V2") float pcm_sample; + // final float d16[i][] = d16[i]; + pcm_sample = + (float) (((v2[15 + dvp] * d16[i][0]) + (v2[14 + dvp] * d16[i][1]) + + (v2[13 + dvp] * d16[i][2]) + (v2[12 + dvp] * d16[i][3]) + + (v2[11 + dvp] * d16[i][4]) + (v2[10 + dvp] * d16[i][5]) + + (v2[9 + dvp] * d16[i][6]) + (v2[8 + dvp] * d16[i][7]) + (v2[7 + dvp] * d16[i][8]) + + (v2[6 + dvp] * d16[i][9]) + (v2[5 + dvp] * d16[i][10]) + + (v2[4 + dvp] * d16[i][11]) + (v2[3 + dvp] * d16[i][12]) + + (v2[2 + dvp] * d16[i][13]) + (v2[1 + dvp] * d16[i][14]) + (v2[0 + dvp] * d16[i][15])) * scalefactor); + + _tmpOut[i] = pcm_sample; + dvp += 16; + } // for + } + + } + + private void compute_pcm_samples() { + + switch (actual_write_pos) { + case 0: + compute_pcm_samples0(); + break; + case 1: + compute_pcm_samples1(); + break; + case 2: + compute_pcm_samples2(); + break; + case 3: + compute_pcm_samples3(); + break; + case 4: + compute_pcm_samples4(); + break; + case 5: + compute_pcm_samples5(); + break; + case 6: + compute_pcm_samples6(); + break; + case 7: + compute_pcm_samples7(); + break; + case 8: + compute_pcm_samples8(); + break; + case 9: + compute_pcm_samples9(); + break; + case 10: + compute_pcm_samples10(); + break; + case 11: + compute_pcm_samples11(); + break; + case 12: + compute_pcm_samples12(); + break; + case 13: + compute_pcm_samples13(); + break; + case 14: + compute_pcm_samples14(); + break; + case 15: + compute_pcm_samples15(); + break; + } + + // if (buffer != null) { + // buffer.appendSamples(channel, _tmpOut); + // } + SampleBufferWrapper.appendSamples(channel, _tmpOut); + + /* + * // MDM: I was considering putting in quality control for // low-spec + * CPUs, but the performance gain (about 10-15%) // did not justify the + * considerable drop in audio quality. switch (inc) { case 16: + * buffer.appendSamples(channel, tmpOut); break; case 32: for (int i=0; + * i<16; i++) { buffer.append(channel, (short)tmpOut[i]); + * buffer.append(channel, (short)tmpOut[i]); } break; case 64: for (int i=0; + * i<8; i++) { buffer.append(channel, (short)tmpOut[i]); + * buffer.append(channel, (short)tmpOut[i]); buffer.append(channel, + * (short)tmpOut[i]); buffer.append(channel, (short)tmpOut[i]); } break; + * + * } + */ + } + + @LATTICE("THISblockSize. + */ + static private float[][] splitArray(final float[] array, final int blockSize) { + int size = array.length / blockSize; + float[][] split = new float[size][]; + for (int i = 0; i < size; i++) { + split[i] = subArray(array, i * blockSize, blockSize); + } + return split; + } + + /** + * Returns a subarray of an existing array. + * + * @param array + * The array to retrieve a subarra from. + * @param offs + * The offset in the array that corresponds to the first index of the + * subarray. + * @param len + * The number of indeces in the subarray. + * @return The subarray, which may be of length 0. + */ + static private float[] subArray(final float[] array, final int offs, int len) { + if (offs + len > array.length) { + len = array.length - offs; + } + + if (len < 0) + len = 0; + + float[] subarray = new float[len]; + for (int i = 0; i < len; i++) { + subarray[i] = array[offs + i]; + } + + return subarray; + } + + // The original data for d[]. This data is loaded from a file + // to reduce the overall package size and to improve performance. + + static final float d[] = { 0.000000000f, -0.000442505f, 0.003250122f, -0.007003784f, + 0.031082153f, -0.078628540f, 0.100311279f, -0.572036743f, 1.144989014f, 0.572036743f, + 0.100311279f, 0.078628540f, 0.031082153f, 0.007003784f, 0.003250122f, 0.000442505f, + -0.000015259f, -0.000473022f, 0.003326416f, -0.007919312f, 0.030517578f, -0.084182739f, + 0.090927124f, -0.600219727f, 1.144287109f, 0.543823242f, 0.108856201f, 0.073059082f, + 0.031478882f, 0.006118774f, 0.003173828f, 0.000396729f, -0.000015259f, -0.000534058f, + 0.003387451f, -0.008865356f, 0.029785156f, -0.089706421f, 0.080688477f, -0.628295898f, + 1.142211914f, 0.515609741f, 0.116577148f, 0.067520142f, 0.031738281f, 0.005294800f, + 0.003082275f, 0.000366211f, -0.000015259f, -0.000579834f, 0.003433228f, -0.009841919f, + 0.028884888f, -0.095169067f, 0.069595337f, -0.656219482f, 1.138763428f, 0.487472534f, + 0.123474121f, 0.061996460f, 0.031845093f, 0.004486084f, 0.002990723f, 0.000320435f, + -0.000015259f, -0.000625610f, 0.003463745f, -0.010848999f, 0.027801514f, -0.100540161f, + 0.057617188f, -0.683914185f, 1.133926392f, 0.459472656f, 0.129577637f, 0.056533813f, + 0.031814575f, 0.003723145f, 0.002899170f, 0.000289917f, -0.000015259f, -0.000686646f, + 0.003479004f, -0.011886597f, 0.026535034f, -0.105819702f, 0.044784546f, -0.711318970f, + 1.127746582f, 0.431655884f, 0.134887695f, 0.051132202f, 0.031661987f, 0.003005981f, + 0.002792358f, 0.000259399f, -0.000015259f, -0.000747681f, 0.003479004f, -0.012939453f, + 0.025085449f, -0.110946655f, 0.031082153f, -0.738372803f, 1.120223999f, 0.404083252f, + 0.139450073f, 0.045837402f, 0.031387329f, 0.002334595f, 0.002685547f, 0.000244141f, + -0.000030518f, -0.000808716f, 0.003463745f, -0.014022827f, 0.023422241f, -0.115921021f, + 0.016510010f, -0.765029907f, 1.111373901f, 0.376800537f, 0.143264771f, 0.040634155f, + 0.031005859f, 0.001693726f, 0.002578735f, 0.000213623f, -0.000030518f, -0.000885010f, + 0.003417969f, -0.015121460f, 0.021575928f, -0.120697021f, 0.001068115f, -0.791213989f, + 1.101211548f, 0.349868774f, 0.146362305f, 0.035552979f, 0.030532837f, 0.001098633f, + 0.002456665f, 0.000198364f, -0.000030518f, -0.000961304f, 0.003372192f, -0.016235352f, + 0.019531250f, -0.125259399f, -0.015228271f, -0.816864014f, 1.089782715f, 0.323318481f, + 0.148773193f, 0.030609131f, 0.029937744f, 0.000549316f, 0.002349854f, 0.000167847f, + -0.000030518f, -0.001037598f, 0.003280640f, -0.017349243f, 0.017257690f, -0.129562378f, + -0.032379150f, -0.841949463f, 1.077117920f, 0.297210693f, 0.150497437f, 0.025817871f, + 0.029281616f, 0.000030518f, 0.002243042f, 0.000152588f, -0.000045776f, -0.001113892f, + 0.003173828f, -0.018463135f, 0.014801025f, -0.133590698f, -0.050354004f, -0.866363525f, + 1.063217163f, 0.271591187f, 0.151596069f, 0.021179199f, 0.028533936f, -0.000442505f, + 0.002120972f, 0.000137329f, -0.000045776f, -0.001205444f, 0.003051758f, -0.019577026f, + 0.012115479f, -0.137298584f, -0.069168091f, -0.890090942f, 1.048156738f, 0.246505737f, + 0.152069092f, 0.016708374f, 0.027725220f, -0.000869751f, 0.002014160f, 0.000122070f, + -0.000061035f, -0.001296997f, 0.002883911f, -0.020690918f, 0.009231567f, -0.140670776f, + -0.088775635f, -0.913055420f, 1.031936646f, 0.221984863f, 0.151962280f, 0.012420654f, + 0.026840210f, -0.001266479f, 0.001907349f, 0.000106812f, -0.000061035f, -0.001388550f, + 0.002700806f, -0.021789551f, 0.006134033f, -0.143676758f, -0.109161377f, -0.935195923f, + 1.014617920f, 0.198059082f, 0.151306152f, 0.008316040f, 0.025909424f, -0.001617432f, + 0.001785278f, 0.000106812f, -0.000076294f, -0.001480103f, 0.002487183f, -0.022857666f, + 0.002822876f, -0.146255493f, -0.130310059f, -0.956481934f, 0.996246338f, 0.174789429f, + 0.150115967f, 0.004394531f, 0.024932861f, -0.001937866f, 0.001693726f, 0.000091553f, + -0.000076294f, -0.001586914f, 0.002227783f, -0.023910522f, -0.000686646f, -0.148422241f, + -0.152206421f, -0.976852417f, 0.976852417f, 0.152206421f, 0.148422241f, 0.000686646f, + 0.023910522f, -0.002227783f, 0.001586914f, 0.000076294f, -0.000091553f, -0.001693726f, + 0.001937866f, -0.024932861f, -0.004394531f, -0.150115967f, -0.174789429f, -0.996246338f, + 0.956481934f, 0.130310059f, 0.146255493f, -0.002822876f, 0.022857666f, -0.002487183f, + 0.001480103f, 0.000076294f, -0.000106812f, -0.001785278f, 0.001617432f, -0.025909424f, + -0.008316040f, -0.151306152f, -0.198059082f, -1.014617920f, 0.935195923f, 0.109161377f, + 0.143676758f, -0.006134033f, 0.021789551f, -0.002700806f, 0.001388550f, 0.000061035f, + -0.000106812f, -0.001907349f, 0.001266479f, -0.026840210f, -0.012420654f, -0.151962280f, + -0.221984863f, -1.031936646f, 0.913055420f, 0.088775635f, 0.140670776f, -0.009231567f, + 0.020690918f, -0.002883911f, 0.001296997f, 0.000061035f, -0.000122070f, -0.002014160f, + 0.000869751f, -0.027725220f, -0.016708374f, -0.152069092f, -0.246505737f, -1.048156738f, + 0.890090942f, 0.069168091f, 0.137298584f, -0.012115479f, 0.019577026f, -0.003051758f, + 0.001205444f, 0.000045776f, -0.000137329f, -0.002120972f, 0.000442505f, -0.028533936f, + -0.021179199f, -0.151596069f, -0.271591187f, -1.063217163f, 0.866363525f, 0.050354004f, + 0.133590698f, -0.014801025f, 0.018463135f, -0.003173828f, 0.001113892f, 0.000045776f, + -0.000152588f, -0.002243042f, -0.000030518f, -0.029281616f, -0.025817871f, -0.150497437f, + -0.297210693f, -1.077117920f, 0.841949463f, 0.032379150f, 0.129562378f, -0.017257690f, + 0.017349243f, -0.003280640f, 0.001037598f, 0.000030518f, -0.000167847f, -0.002349854f, + -0.000549316f, -0.029937744f, -0.030609131f, -0.148773193f, -0.323318481f, -1.089782715f, + 0.816864014f, 0.015228271f, 0.125259399f, -0.019531250f, 0.016235352f, -0.003372192f, + 0.000961304f, 0.000030518f, -0.000198364f, -0.002456665f, -0.001098633f, -0.030532837f, + -0.035552979f, -0.146362305f, -0.349868774f, -1.101211548f, 0.791213989f, -0.001068115f, + 0.120697021f, -0.021575928f, 0.015121460f, -0.003417969f, 0.000885010f, 0.000030518f, + -0.000213623f, -0.002578735f, -0.001693726f, -0.031005859f, -0.040634155f, -0.143264771f, + -0.376800537f, -1.111373901f, 0.765029907f, -0.016510010f, 0.115921021f, -0.023422241f, + 0.014022827f, -0.003463745f, 0.000808716f, 0.000030518f, -0.000244141f, -0.002685547f, + -0.002334595f, -0.031387329f, -0.045837402f, -0.139450073f, -0.404083252f, -1.120223999f, + 0.738372803f, -0.031082153f, 0.110946655f, -0.025085449f, 0.012939453f, -0.003479004f, + 0.000747681f, 0.000015259f, -0.000259399f, -0.002792358f, -0.003005981f, -0.031661987f, + -0.051132202f, -0.134887695f, -0.431655884f, -1.127746582f, 0.711318970f, -0.044784546f, + 0.105819702f, -0.026535034f, 0.011886597f, -0.003479004f, 0.000686646f, 0.000015259f, + -0.000289917f, -0.002899170f, -0.003723145f, -0.031814575f, -0.056533813f, -0.129577637f, + -0.459472656f, -1.133926392f, 0.683914185f, -0.057617188f, 0.100540161f, -0.027801514f, + 0.010848999f, -0.003463745f, 0.000625610f, 0.000015259f, -0.000320435f, -0.002990723f, + -0.004486084f, -0.031845093f, -0.061996460f, -0.123474121f, -0.487472534f, -1.138763428f, + 0.656219482f, -0.069595337f, 0.095169067f, -0.028884888f, 0.009841919f, -0.003433228f, + 0.000579834f, 0.000015259f, -0.000366211f, -0.003082275f, -0.005294800f, -0.031738281f, + -0.067520142f, -0.116577148f, -0.515609741f, -1.142211914f, 0.628295898f, -0.080688477f, + 0.089706421f, -0.029785156f, 0.008865356f, -0.003387451f, 0.000534058f, 0.000015259f, + -0.000396729f, -0.003173828f, -0.006118774f, -0.031478882f, -0.073059082f, -0.108856201f, + -0.543823242f, -1.144287109f, 0.600219727f, -0.090927124f, 0.084182739f, -0.030517578f, + 0.007919312f, -0.003326416f, 0.000473022f, 0.000015259f }; + +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/focus.mp3 b/Robust/src/Benchmarks/SSJava/MP3Decoder/focus.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..06a9386d7eb643913230adb49292396941454f87 GIT binary patch literal 107754 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 fyMuLYJh}Y9x(;66?hgOlpCAk-_J6!pJk>> 4; + y[0] = ht[htIdx].val[point][1] & 0xf; + error = 0; + break; + } + + // hget1bit() is called thousands of times, and so needs to be + // ultra fast. + /* + * if (bitIndex==bitsAvailable) { bitsAvailable = br.readBits(bits, 32); + * bitIndex = 0; } + */ + // if (bits[bitIndex++]!=0) + if (br.hget1bit() != 0) { + TERMINATE: while (ht[htIdx].val[point][1] >= MXOFF) + point += ht[htIdx].val[point][1]; + point += ht[htIdx].val[point][1]; + } else { + TERMINATE: while (ht[htIdx].val[point][0] >= MXOFF) + point += ht[htIdx].val[point][0]; + point += ht[htIdx].val[point][0]; + } + level >>>= 1; + // MDM: ht[0] is always 0; + } while ((level != 0) || (point < 0 /* ht[0].treelen */)); + + // put back any bits not consumed + /* + * int unread = (bitsAvailable-bitIndex); if (unread>0) + * br.rewindNbits(unread); + */ + /* Process sign encodings for quadruples tables. */ + // System.out.println(ht[htIdx].tablename); + if (ht[htIdx].tablename0 == '3' && (ht[htIdx].tablename1 == '2' || ht[htIdx].tablename1 == '3')) { + v[0] = (y[0] >> 3) & 1; + w[0] = (y[0] >> 2) & 1; + x[0] = (y[0] >> 1) & 1; + y[0] = y[0] & 1; + + /* + * v, w, x and y are reversed in the bitstream. switch them around to make + * test bistream work. + */ + + if (v[0] != 0) + if (br.hget1bit() != 0) + v[0] = -v[0]; + if (w[0] != 0) + if (br.hget1bit() != 0) + w[0] = -w[0]; + if (x[0] != 0) + if (br.hget1bit() != 0) + x[0] = -x[0]; + if (y[0] != 0) + if (br.hget1bit() != 0) + y[0] = -y[0]; + } else { + // Process sign and escape encodings for dual tables. + // x and y are reversed in the test bitstream. + // Reverse x and y here to make test bitstream work. + + if (ht[htIdx].linbits != 0) + if ((ht[htIdx].xlen - 1) == x[0]) + x[0] += br.hgetbits(ht[htIdx].linbits); + if (x[0] != 0) + if (br.hget1bit() != 0) + x[0] = -x[0]; + if (ht[htIdx].linbits != 0) + if ((ht[htIdx].ylen - 1) == y[0]) + y[0] += br.hgetbits(ht[htIdx].linbits); + if (y[0] != 0) + if (br.hget1bit() != 0) + y[0] = -y[0]; + } + return error; + } + + public static void inithuff() { + + if (ht != null) + return; + + ht = new huffcodetab[HTN]; + ht[0] = new huffcodetab("0 ", 0, 0, 0, 0, -1, null, null, ValTab0, 0); + ht[1] = new huffcodetab("1 ", 2, 2, 0, 0, -1, null, null, ValTab1, 7); + ht[2] = new huffcodetab("2 ", 3, 3, 0, 0, -1, null, null, ValTab2, 17); + ht[3] = new huffcodetab("3 ", 3, 3, 0, 0, -1, null, null, ValTab3, 17); + ht[4] = new huffcodetab("4 ", 0, 0, 0, 0, -1, null, null, ValTab4, 0); + ht[5] = new huffcodetab("5 ", 4, 4, 0, 0, -1, null, null, ValTab5, 31); + ht[6] = new huffcodetab("6 ", 4, 4, 0, 0, -1, null, null, ValTab6, 31); + ht[7] = new huffcodetab("7 ", 6, 6, 0, 0, -1, null, null, ValTab7, 71); + ht[8] = new huffcodetab("8 ", 6, 6, 0, 0, -1, null, null, ValTab8, 71); + ht[9] = new huffcodetab("9 ", 6, 6, 0, 0, -1, null, null, ValTab9, 71); + ht[10] = new huffcodetab("10 ", 8, 8, 0, 0, -1, null, null, ValTab10, 127); + ht[11] = new huffcodetab("11 ", 8, 8, 0, 0, -1, null, null, ValTab11, 127); + ht[12] = new huffcodetab("12 ", 8, 8, 0, 0, -1, null, null, ValTab12, 127); + ht[13] = new huffcodetab("13 ", 16, 16, 0, 0, -1, null, null, ValTab13, 511); + ht[14] = new huffcodetab("14 ", 0, 0, 0, 0, -1, null, null, ValTab14, 0); + ht[15] = new huffcodetab("15 ", 16, 16, 0, 0, -1, null, null, ValTab15, 511); + ht[16] = new huffcodetab("16 ", 16, 16, 1, 1, -1, null, null, ValTab16, 511); + ht[17] = new huffcodetab("17 ", 16, 16, 2, 3, 16, null, null, ValTab16, 511); + ht[18] = new huffcodetab("18 ", 16, 16, 3, 7, 16, null, null, ValTab16, 511); + ht[19] = new huffcodetab("19 ", 16, 16, 4, 15, 16, null, null, ValTab16, 511); + ht[20] = new huffcodetab("20 ", 16, 16, 6, 63, 16, null, null, ValTab16, 511); + ht[21] = new huffcodetab("21 ", 16, 16, 8, 255, 16, null, null, ValTab16, 511); + ht[22] = new huffcodetab("22 ", 16, 16, 10, 1023, 16, null, null, ValTab16, 511); + ht[23] = new huffcodetab("23 ", 16, 16, 13, 8191, 16, null, null, ValTab16, 511); + ht[24] = new huffcodetab("24 ", 16, 16, 4, 15, -1, null, null, ValTab24, 512); + ht[25] = new huffcodetab("25 ", 16, 16, 5, 31, 24, null, null, ValTab24, 512); + ht[26] = new huffcodetab("26 ", 16, 16, 6, 63, 24, null, null, ValTab24, 512); + ht[27] = new huffcodetab("27 ", 16, 16, 7, 127, 24, null, null, ValTab24, 512); + ht[28] = new huffcodetab("28 ", 16, 16, 8, 255, 24, null, null, ValTab24, 512); + ht[29] = new huffcodetab("29 ", 16, 16, 9, 511, 24, null, null, ValTab24, 512); + ht[30] = new huffcodetab("30 ", 16, 16, 11, 2047, 24, null, null, ValTab24, 512); + ht[31] = new huffcodetab("31 ", 16, 16, 13, 8191, 24, null, null, ValTab24, 512); + ht[32] = new huffcodetab("32 ", 1, 16, 0, 0, -1, null, null, ValTab32, 31); + ht[33] = new huffcodetab("33 ", 1, 16, 0, 0, -1, null, null, ValTab33, 31); + } +} diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/makefile b/Robust/src/Benchmarks/SSJava/MP3Decoder/makefile new file mode 100644 index 00000000..503e2d11 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/makefile @@ -0,0 +1,23 @@ +BUILDSCRIPT=../../../buildscript + +PROGRAM=MP3Player +SOURCE_FILES=MP3Player.java + +BSFLAGS= -32bit -ssjava -mainclass $(PROGRAM) -heapsize-mb 1000 -nooptimize -debug -garbagestats -ssjavadebug #-printlinenum #-joptimize + +default: $(PROGRAM)s.bin + +$(PROGRAM)s.bin: $(SOURCE_FILES) makefile + $(BUILDSCRIPT) $(BSFLAGS) -o $(PROGRAM) -builddir sing $(SOURCE_FILES) + +clean: + rm -f $(PROGRAM).bin + rm -fr sing + rm -f *~ + rm -f *.dot + rm -f *.png + rm -f *.txt + rm -f aliases.txt + rm -f results*txt + rm -f *log + diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/outputfocusmp3 b/Robust/src/Benchmarks/SSJava/MP3Decoder/outputfocusmp3 new file mode 100644 index 00000000..45fcfde7 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/outputfocusmp3 @@ -0,0 +1,168 @@ +playing focus.mp3... +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +-4777 +-631072 +1293323 +-1326139 +861767 +451288 +-47296 +-1248777 +1925353 +-2179234 +1182947 +683998 +-2517503 +2835485 +-2320058 +2460065 +-2306413 +195502 +1310892 +-1577569 +2430640 +-2328745 +1740775 +-1051879 +-376916 +1246895 +-1709109 +1874073 +-1369555 +601164 +293020 +-738830 +499587 +-630175 +1256735 +-783515 +104125 +-124200 +-342781 +812927 +-998554 +947185 +-717666 +353871 +163304 +-621030 +722986 +-594950 +632691 +-271096 +-144508 +104417 +-298261 +621697 +-447509 +308172 +-393156 +152638 +150214 +-265019 +545920 +-590735 +387837 +-202976 +-59867 +392340 +-483584 +362935 +-348877 +211165 +-163997 +17939 +244738 +-312426 +949236 +-261437 +-240964 +850661 +744267 +-2000037 +-1233522 +130242 +743770 +1774653 +357115 +-1197546 +-1206982 +-843540 +184622 +2128890 +359831 +442096 +-818716 +-689965 +-947304 +773965 +646175 +520632 +-72768 +-630029 +-808955 +-155733 +682029 +576228 +188296 +-67453 +-549263 +-718693 +488039 +350375 +350661 +65091 +-277534 +-1095438 +155867 +396317 +488158 +190983 +-211400 +-626435 +-132469 +118532 +187159 +206311 +312933 +-494249 +-59286 +-154420 +13707 +235088 +178369 +27036 +-238910 +-136433 +8957 +133869 +61867 +159041 +-102253 +-137070 +60010 +-87635 +15930 +209339 +-92839 +-5986 +-38700 +-20011 +26409 +29158 +16768 +-21964 +1477 +0 +0 +0 +0 diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/run b/Robust/src/Benchmarks/SSJava/MP3Decoder/run new file mode 100755 index 00000000..4642b81b --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/run @@ -0,0 +1 @@ +./MP3Player.bin focus.mp3 \ No newline at end of file diff --git a/Robust/src/Benchmarks/SSJava/MP3Decoder/ssoutput b/Robust/src/Benchmarks/SSJava/MP3Decoder/ssoutput new file mode 100644 index 00000000..45fcfde7 --- /dev/null +++ b/Robust/src/Benchmarks/SSJava/MP3Decoder/ssoutput @@ -0,0 +1,168 @@ +playing focus.mp3... +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +-4777 +-631072 +1293323 +-1326139 +861767 +451288 +-47296 +-1248777 +1925353 +-2179234 +1182947 +683998 +-2517503 +2835485 +-2320058 +2460065 +-2306413 +195502 +1310892 +-1577569 +2430640 +-2328745 +1740775 +-1051879 +-376916 +1246895 +-1709109 +1874073 +-1369555 +601164 +293020 +-738830 +499587 +-630175 +1256735 +-783515 +104125 +-124200 +-342781 +812927 +-998554 +947185 +-717666 +353871 +163304 +-621030 +722986 +-594950 +632691 +-271096 +-144508 +104417 +-298261 +621697 +-447509 +308172 +-393156 +152638 +150214 +-265019 +545920 +-590735 +387837 +-202976 +-59867 +392340 +-483584 +362935 +-348877 +211165 +-163997 +17939 +244738 +-312426 +949236 +-261437 +-240964 +850661 +744267 +-2000037 +-1233522 +130242 +743770 +1774653 +357115 +-1197546 +-1206982 +-843540 +184622 +2128890 +359831 +442096 +-818716 +-689965 +-947304 +773965 +646175 +520632 +-72768 +-630029 +-808955 +-155733 +682029 +576228 +188296 +-67453 +-549263 +-718693 +488039 +350375 +350661 +65091 +-277534 +-1095438 +155867 +396317 +488158 +190983 +-211400 +-626435 +-132469 +118532 +187159 +206311 +312933 +-494249 +-59286 +-154420 +13707 +235088 +178369 +27036 +-238910 +-136433 +8957 +133869 +61867 +159041 +-102253 +-137070 +60010 +-87635 +15930 +209339 +-92839 +-5986 +-38700 +-20011 +26409 +29158 +16768 +-21964 +1477 +0 +0 +0 +0 -- 2.34.1