package org.red5.app.sip.codecs; import java.util.Arrays; import local.media.G711; /* * This class should be a NOOP as we'll * be using this as a passthru (SPEEX<->SPEEX) * between Flash Player and Asterisk. */ public class SpeexCodec implements Codec { private static final String codecName = "SPEEX"; private static int defaultEncodedFrameSize = 120; private static int defaultDecodedFrameSize = 120; private static int defaultSampleRate = 16000; private int outgoingPacketization = 0; private int incomingPacketization = 0; public static final int codecId = 100; public SpeexCodec() {} public void encodeInit(int defaultEncodePacketization) { if ( this.outgoingPacketization == 0 ) { this.outgoingPacketization = defaultEncodePacketization; } System.out.println("encodeInit " + outgoingPacketization); } public void decodeInit(int defaultDecodePacketization) { if ( this.incomingPacketization == 0 ) { this.incomingPacketization = defaultDecodePacketization; } System.out.println("decodeInit " + incomingPacketization); } public String codecNegotiateAttribute(String attributeName, String localAttributeValue, String remoteAttributeValue) { // Not applicable for this codec type return null; } public int getCodecBlankPacket(byte[] buffer, int offset) { Arrays.fill( buffer, offset, offset + getOutgoingEncodedFrameSize(), (byte)G711.linear2ulaw(0)); return getOutgoingEncodedFrameSize(); } public int codecToPcm(byte[] bufferIn, float[] bufferOut) { if (bufferIn.length > 0) { for (int i = 0; i < bufferIn.length; i++) { bufferOut[i] = (float) G711.ulaw2linear((int) bufferIn[i]); } return bufferOut.length; } else { return 0; } } public int pcmToCodec(float[] bufferIn, byte[] bufferOut) { if (bufferIn.length > 0) { for (int i = 0; i < bufferIn.length; i++) { bufferOut[i] = (byte) G711.linear2ulaw((int) bufferIn[i]); } return bufferOut.length; } else { return 0; } } public int getIncomingEncodedFrameSize() { return ( defaultEncodedFrameSize / Codec.DEFAULT_PACKETIZATION ) * incomingPacketization; } public int getIncomingDecodedFrameSize() { return ( defaultDecodedFrameSize / Codec.DEFAULT_PACKETIZATION ) * incomingPacketization; } public int getOutgoingEncodedFrameSize() { return ( defaultEncodedFrameSize / Codec.DEFAULT_PACKETIZATION ) * outgoingPacketization; } public int getOutgoingDecodedFrameSize() { return ( defaultDecodedFrameSize / Codec.DEFAULT_PACKETIZATION ) * outgoingPacketization; } public int getIncomingPacketization() { return incomingPacketization; } public int getOutgoingPacketization() { return outgoingPacketization; } public void setLocalPtime( int localPtime ) { // Test for prior update during attributes negotiation. if ( this.incomingPacketization == 0 ) { incomingPacketization = localPtime; } } public void setRemotePtime( int remotePtime ) { // Test for prior update during attributes negotiation. if ( this.outgoingPacketization == 0 ) { outgoingPacketization = remotePtime; } } public int getSampleRate() { return defaultSampleRate; } public String getCodecName() { return codecName; } public int getCodecId() { return codecId; } public String[] getCodecMediaAttributes() { // TODO Auto-generated method stub return null; } }