package org.mobicents.media.server.impl.dsp.audio.gsm;
import org.mobicents.media.Buffer;
import org.mobicents.media.Format;
import org.mobicents.media.server.spi.dsp.Codec;
import org.mobicents.media.server.spi.dsp.SignalingProcessor;
/**
*
* @author amit bhayani
*
*/
public class Encoder implements Codec {
private org.tritonus.lowlevel.gsm.Encoder encoder = new org.tritonus.lowlevel.gsm.Encoder();
private short[] signal = new short[160];
private byte[] res = new byte[33];
public void process(Buffer buffer) {
if (buffer.getLength() != 320) {
buffer.setFlags(Buffer.FLAG_BUF_UNDERFLOWN);
return;
}
// encode into short values
byte[] data = (byte[]) buffer.getData();
// int k = 0;
for (int i = 0; i < 160; i++) {
// signal[i] = (short) ((data[k++] << 8) & (data[k++]));
signal[i] = bytesToShort16(data, i * 2, false);
}
encoder.encode(signal, res);
int length = res.length;
System.arraycopy(res, 0, (byte[])buffer.getData(), 0, length);
//buffer.setData(res);
buffer.setOffset(0);
buffer.setFormat(Codec.GSM);
buffer.setLength(length);
}
private short bytesToShort16(byte[] buffer, int byteOffset, boolean bigEndian) {
return bigEndian ? ((short) ((buffer[byteOffset] << 8) | (buffer[byteOffset + 1] & 0xFF)))
: ((short) ((buffer[byteOffset + 1] << 8) | (buffer[byteOffset] & 0xFF)));
}
public Format getSupportedInputFormat() {
return Codec.LINEAR_AUDIO;
}
public Format getSupportedOutputFormat() {
return Codec.GSM;
}
public void setProc(SignalingProcessor processor) {
// TODO Auto-generated method stub
}
}