package org.red5.app.sip.codecs.g729;
import org.red5.app.sip.BufferUtils;
public class Encoder {
private CodLD8K encoder = new CodLD8K();
private PreProc preProc = new PreProc();
private short[] serial = new short[ LD8KConstants.SERIAL_SIZE ];
private int[] prm = new int[ LD8KConstants.PRM_SIZE ];
public Encoder() {
preProc.init_pre_process();
encoder.init_coder_ld8k();
}
public void encode( float[] bufferIn, byte[] bufferOut ) {
int inOffset = 0;
int outOffset = 0;
int steps = bufferIn.length / LD8KConstants.L_FRAME;
for ( int i = 0; i < steps; i++ ) {
byte[] tempBufferOut = new byte[ LD8KConstants.L_ENC_FRAME ];
float[] tempBufferIn = new float[ LD8KConstants.L_FRAME ];
// Encode bufferIn
BufferUtils.floatBufferIndexedCopy( tempBufferIn, 0, bufferIn, inOffset, LD8KConstants.L_FRAME );
tempBufferOut = process( tempBufferIn );
// Copy encoded data to bufferOut
BufferUtils.byteBufferIndexedCopy( bufferOut, outOffset, tempBufferOut, 0, LD8KConstants.L_ENC_FRAME );
inOffset += LD8KConstants.L_FRAME;
outOffset += LD8KConstants.L_ENC_FRAME;
}
}
/**
* Perform G729 encoding
*
* @param input
* media
* @return compressed media.
*/
private byte[] process( float[] media ) {
preProc.pre_process( media, LD8KConstants.L_FRAME );
encoder.loadSpeech( media );
encoder.coder_ld8k( prm, 0 );
Bits.prm2bits_ld8k( prm, serial );
return Bits.toRealBits( serial );
}
}