package org.red5.app.sip.trancoders; import org.apache.mina.core.buffer.IoBuffer; import org.red5.app.sip.codecs.Codec; import org.red5.app.sip.stream.RtpStreamSender; import org.red5.server.net.rtmp.event.AudioData; public class SpeexToSpeexTranscoder implements Transcoder { private Codec audioCodec; private TranscodedAudioDataListener listener; private int timestamp = 0; private static final int SPEEX_CODEC = 178; /* 1011 1111 (see flv spec) */ public SpeexToSpeexTranscoder(Codec audioCodec, TranscodedAudioDataListener listener) { this.audioCodec = audioCodec; this.listener = listener; } public SpeexToSpeexTranscoder(Codec audioCodec) { this.audioCodec = audioCodec; } public void transcode(byte[] asaoBuffer, int offset, int num, byte[] transcodedData, int dataOffset, RtpStreamSender rtpSender) { System.arraycopy(asaoBuffer, offset, transcodedData, dataOffset, num); rtpSender.sendTranscodedData(); } public void transcode(byte[] codedBuffer) { pushAudio(codedBuffer); } private void pushAudio(byte[] audio) { timestamp = timestamp + audio.length; IoBuffer buffer = IoBuffer.allocate(1024); buffer.setAutoExpand(true); buffer.clear(); buffer.put((byte) SPEEX_CODEC); byte[] copy = new byte[audio.length]; System.arraycopy(audio, 0, copy, 0, audio.length ); buffer.put(copy); buffer.flip(); AudioData audioData = new AudioData( buffer ); audioData.setTimestamp((int)timestamp ); listener.handleTranscodedAudioData(audioData); } public int getCodecId() { return audioCodec.getCodecId(); } public int getOutgoingEncodedFrameSize() { return audioCodec.getOutgoingEncodedFrameSize(); } public int getOutgoingPacketization() { return audioCodec.getOutgoingPacketization(); } public int getIncomingEncodedFrameSize() { return audioCodec.getIncomingEncodedFrameSize(); } }