/*
* @(#)RCModule.java 1.8 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.ibm.media.codec.audio.rc;
import javax.media.*;
import javax.media.format.AudioFormat;
import javax.media.Format;
import com.sun.media.*;
import java.io.*;
public class RCModule extends com.ibm.media.codec.audio.AudioCodec {
private RateConversion rateConversion = null;
private Format lastInputFormat=null;
private Format lastOutputFormat=null;
private static boolean DEBUG=false;
public RCModule() {
supportedInputFormats = new AudioFormat[] {
new AudioFormat(
AudioFormat.LINEAR,
Format.NOT_SPECIFIED,
16,
2,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
Format.NOT_SPECIFIED,
16,
1,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
Format.NOT_SPECIFIED,
8,
2,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
Format.NOT_SPECIFIED,
8,
1,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
) };
/*
supportedInputFormats = new AudioFormat[] {
new AudioFormat(
AudioFormat.LINEAR,
11025,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
11127,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
16000,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
22050,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
22254,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
22255,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
32000,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
44100,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
),
new AudioFormat(
AudioFormat.LINEAR,
48000,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED
) };
*/
defaultOutputFormats = new AudioFormat[] {
// new AudioFormat(
// AudioFormat.ULAW,
// 8000,
// 8,
// 1,
// Format.NOT_SPECIFIED,
// Format.NOT_SPECIFIED
// ),
new AudioFormat(
AudioFormat.LINEAR,
8000,
16,
2,
AudioFormat.LITTLE_ENDIAN,
AudioFormat.SIGNED
),
new AudioFormat(
AudioFormat.LINEAR,
8000,
16,
1,
AudioFormat.LITTLE_ENDIAN,
AudioFormat.SIGNED
)
};
PLUGIN_NAME="Rate Conversion";
}
public Format setInputFormat(Format format) {
if (!isSampleRateSupported(format)) return null;
//System.err.println("INput format is " + format);
return super.setInputFormat(format);
}
protected Format[] getMatchingOutputFormats(Format in) {
if (!isSampleRateSupported(in)) return new Format[0];
supportedOutputFormats = new AudioFormat[] {
// new AudioFormat(
// AudioFormat.ULAW,
// 8000,
// 8,
// 1,
// Format.NOT_SPECIFIED,
// Format.NOT_SPECIFIED
// ),
new AudioFormat(
AudioFormat.LINEAR,
8000,
16,
1,
AudioFormat.LITTLE_ENDIAN,
AudioFormat.SIGNED
),
new AudioFormat(
AudioFormat.LINEAR,
8000,
16,
2,
AudioFormat.LITTLE_ENDIAN,
AudioFormat.SIGNED
)
};
return supportedOutputFormats;
}
public void open() throws ResourceUnavailableException {
//System.err.println("RCModule output is " + outputFormat);
}
public void reset() {
if (null != rateConversion) {
rateConversion.reset();
}
}
public void close() {
if (null != rateConversion) {
rateConversion.close();
}
rateConversion = null;
}
public int process(Buffer inputBuffer, Buffer outputBuffer) {
if (!checkInputBuffer(inputBuffer) ) {
return BUFFER_PROCESSED_FAILED;
}
if (isEOM(inputBuffer) ) {
propagateEOM(outputBuffer);
return BUFFER_PROCESSED_OK;
}
int inputLength = inputBuffer.getLength();
if ( (lastInputFormat != inputFormat) || (lastOutputFormat != outputFormat) ||
(rateConversion == null) ) {
if (false == initConverter((AudioFormat)inputFormat,
(AudioFormat)outputFormat,inputLength)) {
return BUFFER_PROCESSED_FAILED;
}
}
int maxOutLength = rateConversion.getMaxOutputLength(inputLength);
byte[] inputData = (byte[]) inputBuffer.getData();
byte[] outData = validateByteArraySize(outputBuffer, maxOutLength);
int outLength = rateConversion.process(inputData,inputBuffer.getOffset(),
inputLength,outData,outputBuffer.getOffset());
updateOutput(outputBuffer, outputFormat, outLength, outputBuffer.getOffset());
//System.err.println(outputBuffer.getFormat());
return BUFFER_PROCESSED_OK;
}
private boolean isSampleRateSupported(Format format) {
try {
int sampleRate = (int) (((AudioFormat)format).getSampleRate());
// these are the only supported rates
if ( !( (sampleRate == 11025) || (sampleRate == 11127) ||
(sampleRate == 16000) || (sampleRate == 22050) ||
(sampleRate == 22254) || (sampleRate == 22255) ||
(sampleRate == 32000) || (sampleRate == 44100) ||
(sampleRate == 48000) ) ) {
if (DEBUG) {
System.out.println("RCModule - input format sampling rate isn't supported");
}
return false; // input sampling rate doesn't match
}
}
catch (Throwable t) { // in case that the format isn't instance of AudioFormat
return false;
}
/*
int numberOfInputChannels=((AudioFormat)format).getChannels();
int inputSampleSize=((AudioFormat)format).getSampleSizeInBits();
if ( ( (numberOfInputChannels != 1) && (numberOfInputChannels != 2) ) || ( (inputSampleSize != 16) && (inputSampleSize != 8) ) ) {
System.out.println("input format doesn't match");
false; // input format doesn't match
}
*/
return true;
}
private boolean initConverter(AudioFormat inFormat,AudioFormat outFormat,int inputLength) {
lastInputFormat=inFormat;
lastOutputFormat=outFormat;
boolean isSigned=false;
int numberOfInputChannels=inFormat.getChannels();
int numberOfOutputChannels=outFormat.getChannels();
int inputSampleSize=inFormat.getSampleSizeInBits();
int sampleRate=(int)inFormat.getSampleRate();
boolean ulawOutput=false;
if (sampleRate == 8000) {
return false;
}
int pcmType = RateConversion.RATE_CONVERSION_LITTLE_ENDIAN_FORMAT;
if (inFormat.getEndian() == AudioFormat.BIG_ENDIAN) {
pcmType = RateConversion.RATE_CONVERSION_BIG_ENDIAN_FORMAT;
}
if (8 == inputSampleSize) {
pcmType = RateConversion.RATE_CONVERSION_BYTE_FORMAT;
}
if (inFormat.getSigned()==AudioFormat.SIGNED) {
isSigned=true;
}
if (rateConversion != null) {
close();
}
if (outFormat.getEncoding()==AudioFormat.ULAW) {
ulawOutput=true;
}
rateConversion = new RateConversion();
if (RateConversion.RATE_CONVERSION_OK != rateConversion.init(inputLength,
sampleRate,
8000,
numberOfInputChannels,
numberOfOutputChannels,
pcmType,
isSigned,
ulawOutput) ) {
rateConversion = null;
return false;
}
return true;
}
}
|