package org.mobicents.media.server.impl.codec.g729; import java.io.IOException; import java.io.OutputStream;; public class Util { /*-------------------------------------------------------------------* * Function set zero() * * ~~~~~~~~~~ * * Set vector x[] to zero * *-------------------------------------------------------------------*/ public static void set_zero( float x[], /* (o) : vector to clear */ int L /* (i) : length of vector */ ) { int i; for (i = 0; i < L; i++) x[i] = (float)0.0; return; } /*-------------------------------------------------------------------* * Function copy: * * ~~~~~ * * Copy vector x[] to y[] * *-------------------------------------------------------------------*/ public static void copy( float x[], /* (i) : input vector */ float y[], /* (o) : output vector */ int L /* (i) : vector length */ ) { int i; for (i = 0; i < L; i++) y[i] = x[i]; return; } public static void copy( float x[],int xs, /* (i) : input vector */ float y[],int ys, /* (o) : output vector */ int L /* (i) : vector length */ ) { int i; for (i = 0; i < L; i++) y[ys+i] = x[xs+i]; return; } /* Random generator */ public static short random_g729() { return (short) (0xFFFF&System.currentTimeMillis()); } public static byte[] floatArrayToByteArray( float []data, /* input: inputdata */ int length /* input: length of data array */ ) { int i; short sp16[] = new short[LD8KConstants.L_FRAME]; byte[] ret; float temp; if (length > LD8KConstants.L_FRAME) { throw new RuntimeException("error in fwrite16\n"); } for(i=0; i<length; i++) { /* round and convert to int */ temp = data[i]; if (temp >= (float)0.0) temp += (float)0.5; else temp -= (float)0.5; if (temp > (float)32767.0 ) temp = (float)32767.0; if (temp < (float)-32768.0 ) temp = (float)-32768.0; sp16[i] = (short) temp; } ret = shortArrayToByteArray(sp16); return ret; } /*-----------------------------------------------------------* * fwrite16 - writes a float array as a Short to a a file * *-----------------------------------------------------------*/ public static void fwrite16( float []data, /* input: inputdata */ int length, /* input: length of data array */ OutputStream fp /* input: file pointer */ ) { int i; short sp16[] = new short[LD8KConstants.L_FRAME]; float temp; if (length > LD8KConstants.L_FRAME) { throw new RuntimeException("error in fwrite16\n"); } for(i=0; i<length; i++) { /* round and convert to int */ temp = data[i]; if (temp >= (float)0.0) temp += (float)0.5; else temp -= (float)0.5; if (temp > (float)32767.0 ) temp = (float)32767.0; if (temp < (float)-32768.0 ) temp = (float)-32768.0; sp16[i] = (short) temp; try { fp.write(shortToBytes(sp16[i])); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static byte[] shortToBytes(int myInt) { byte[] bytes = new byte[2]; int hexBase = 0xff; bytes[0] = (byte) (hexBase & myInt); bytes[1] = (byte) (((hexBase << 8)& myInt) >> 8); return bytes; } public static short bytesToShort(byte[] bytes) { return (short)(0xffff&((int)bytes[0] | bytes[1]<<8)); } public static short bytesToShort(byte byte1, byte byte2) { return (short)(0xffff&((0xff&byte1) | ((0xff&byte2)<<8))); } public static short[] byteArrayToShortArray(byte[] bytes) { short[] s = new short[bytes.length/2]; for(int q=0; q<s.length;q++) { s[q] = bytesToShort(bytes[2*q],bytes[2*q+1]); } return s; } public static byte[] shortArrayToByteArray(short[] values) { byte[] s = new byte[values.length*2]; for(int q=0; q<values.length;q++) { byte[] bytes = shortToBytes(values[q]); s[2*q] = bytes[0]; s[2*q+1] = bytes[1]; } return s; } }