/*
* @(#)JavaDecoder.java 1.7 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.ibm.media.codec.audio.alaw;
import javax.media.*;
import javax.media.format.*;
import javax.media.format.*;
import com.sun.media.*;
import com.sun.media.controls.*;
/** A-Law to PCM java decoder
* @Author Shay Ben-David bendavid@haifa.vnet.ibm.com
**/
public class JavaDecoder extends com.ibm.media.codec.audio.AudioCodec {
////////////////////////////////////////////////////////////////////////////
// Variables
////////////////////////////////////////////////////////////////////////////
static private final byte[] lutTableL = new byte[256];
static private final byte[] lutTableH = new byte[256];
////////////////////////////////////////////////////////////////////////////
// Methods
public JavaDecoder() {
supportedInputFormats = new AudioFormat[] { new AudioFormat(AudioFormat.ALAW) };
defaultOutputFormats = new AudioFormat[] { new AudioFormat(AudioFormat.LINEAR) };
PLUGIN_NAME="A-Law Decoder";
}
protected Format[] getMatchingOutputFormats(Format in) {
AudioFormat af =(AudioFormat) in;
supportedOutputFormats = new AudioFormat[] {
new AudioFormat(
AudioFormat.LINEAR,
af.getSampleRate(),
16,
af.getChannels(),
AudioFormat.LITTLE_ENDIAN, //isBigEndian(),
AudioFormat.SIGNED //isSigned());
)
};
return supportedOutputFormats;
}
/** Initializes the codec. **/
public void open() {
initTables();
}
/** decode the buffer **/
public int process(Buffer inputBuffer, Buffer outputBuffer) {
if (!checkInputBuffer(inputBuffer) ) {
return BUFFER_PROCESSED_FAILED;
}
if (isEOM(inputBuffer) ) {
propagateEOM(outputBuffer);
return BUFFER_PROCESSED_OK;
}
int channels = ((AudioFormat)outputFormat).getChannels();
byte[] inData =(byte[]) inputBuffer.getData();
byte[] outData = validateByteArraySize(outputBuffer, inData.length * 2);
int inpLength=inputBuffer.getLength();
int outLength=2*inpLength;
int inOffset=0;
int outOffset=0;
for (int i=0;i<inpLength;i++) {
int temp=inData[inOffset++]&0xff;
outData[outOffset++]=lutTableL[temp];
outData[outOffset++]=lutTableH[temp];
}
updateOutput(outputBuffer,outputFormat, outLength, 0);
return BUFFER_PROCESSED_OK;
}
private void initTables (){
for (int i=0;i<256;i++) {
int input = i ^ 0x55;
int mantissa = (input & 0xf ) << 4;
int segment = (input & 0x70) >> 4;
int value = mantissa+8;
if (segment>=1)
value+=0x100;
if (segment>1)
value <<= (segment - 1);
if ( (input & 0x80)==0 )
value = -value;
lutTableL[i]=(byte)value;
lutTableH[i]=(byte)(value>>8);
}
}
public java.lang.Object[] getControls() {
if (controls==null) {
controls=new Control[1];
controls[0]=new com.sun.media.controls.SilenceSuppressionAdapter(this,false,false);
}
return (Object[])controls;
}
}
|