package net.sf.fmj.media.codec.audio.gsm;
import java.util.logging.Logger;
import javax.media.Format;
import javax.media.format.AudioFormat;
import net.sf.fmj.media.AbstractPacketizer;
import net.sf.fmj.utility.LoggerSingleton;
/**
* GSM/RTP packetizer Codec.
*
* @author Martin Harvan
*/
public class Packetizer extends AbstractPacketizer {
private static final Logger logger = LoggerSingleton.logger;
private static final int PACKET_SIZE = 495;
@Override
public String getName() {
return "GSM Packetizer";
}
public Packetizer() {
super();
this.inputFormats = new Format[]{new AudioFormat(AudioFormat.GSM, 8000, 8, 1, -1, AudioFormat.SIGNED, 264, -1.0, Format.byteArray)};
}
// TODO: move to base class?
protected Format[] outputFormats = new Format[]{new AudioFormat(AudioFormat.GSM_RTP, 8000, 8, 1, -1, AudioFormat.SIGNED, 264, -1.0, Format.byteArray)};
@Override
public Format[] getSupportedOutputFormats(Format input) {
if (input == null)
return outputFormats;
else {
if (!(input instanceof AudioFormat)) {
logger.warning(this.getClass().getSimpleName() + ".getSupportedOutputFormats: input format does not match, returning format array of {null} for " + input); // this can cause an NPE in JMF if it ever happens.
return new Format[]{null};
}
final AudioFormat inputCast = (AudioFormat) input;
if (!inputCast.getEncoding().equals(AudioFormat.GSM) ||
(inputCast.getSampleSizeInBits() != 8 && inputCast.getSampleSizeInBits() != Format.NOT_SPECIFIED) ||
(inputCast.getChannels() != 1 && inputCast.getChannels() != Format.NOT_SPECIFIED) ||
(inputCast.getFrameSizeInBits() != 264 && inputCast.getFrameSizeInBits() != Format.NOT_SPECIFIED)
) {
logger.warning(this.getClass().getSimpleName() + ".getSupportedOutputFormats: input format does not match, returning format array of {null} for " + input); // this can cause an NPE in JMF if it ever happens.
return new Format[]{null};
}
final AudioFormat result = new AudioFormat(AudioFormat.GSM_RTP, inputCast.getSampleRate(), 8,
1, inputCast.getEndian(), inputCast.getSigned(), 264,
inputCast.getFrameRate(), inputCast.getDataType());
return new Format[]{result};
}
}
@Override
public void open() {
setPacketSize(PACKET_SIZE);
}
@Override
public void close() {
}
@Override
public Format setInputFormat(Format arg0) {
return super.setInputFormat(arg0);
}
@Override
public Format setOutputFormat(Format arg0) {
return super.setOutputFormat(arg0);
}
}