/*
* @(#)JavaDecoder.java 1.9 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.ibm.media.codec.audio.g723;
import javax.media.*;
import javax.media.format.*;
import javax.media.format.*;
import com.sun.media.*;
import com.sun.media.controls.*;
/**
* Implements an G723 codec which uses native methods to do the decoding.
*/
public class JavaDecoder extends com.ibm.media.codec.audio.AudioCodec {
////////////////////////////////////////////////////////////////////////////
// Variables
protected G723Dec decoder;
////////////////////////////////////////////////////////////////////////////
// Methods
public JavaDecoder() {
supportedInputFormats = new AudioFormat[] { new AudioFormat(AudioFormat.G723),
new AudioFormat(AudioFormat.G723_RTP)};
defaultOutputFormats = new AudioFormat[] { new AudioFormat(AudioFormat.LINEAR) };
PLUGIN_NAME="G723 Decoder";
}
protected Format[] getMatchingOutputFormats(Format in) {
AudioFormat af =(AudioFormat) in;
supportedOutputFormats = new AudioFormat[] {
new AudioFormat(
AudioFormat.LINEAR,
af.getSampleRate(),
16,
1,
AudioFormat.LITTLE_ENDIAN, //isBigEndian(),
AudioFormat.SIGNED //isSigned());
) };
return supportedOutputFormats;
}
public void open() throws ResourceUnavailableException{
decoder=new G723Dec();
decoder.decoderOpen();
}
public void reset() {
resetDecoder();
}
public void close() {
freeDecoder();
}
public int process(Buffer inputBuffer, Buffer outputBuffer) {
if (!checkInputBuffer(inputBuffer) ) {
return BUFFER_PROCESSED_FAILED;
}
if (isEOM(inputBuffer) ) {
propagateEOM(outputBuffer);
return BUFFER_PROCESSED_OK;
}
int inpLength=inputBuffer.getLength();
int outLength = calculateOutputSize(inputBuffer.getLength() );
byte[] inpData = (byte[]) inputBuffer.getData();
byte[] outData = validateByteArraySize(outputBuffer, outLength);
// get offset for both RTP and non RTP streams
decode(inpData, inputBuffer.getOffset(), outData, 0, inpLength);
updateOutput(outputBuffer, outputFormat, outLength, 0);
return BUFFER_PROCESSED_OK;
}
protected void initDecoder() {
decoder.decoderReset();
}
protected void freeDecoder() {
decoder=null;
}
protected void resetDecoder() {
decoder.decoderReset();
}
protected int calculateOutputSize(int inputSize) {
return inputSize/24*480;
}
protected void decode(byte[] inpData,int readPtr,
byte[] outData,int writePtr,
int inpLength) {
int numberOfFrames = (inpLength/24);
int frameSize =24;
int n;
// loop for all G.723 frames in the current block ("Frame")
for (n=0; n<numberOfFrames ; n++, readPtr += frameSize, writePtr += 2*240) {
decoder.decodeFrame(inpData, readPtr,outData,writePtr);
}
}
public java.lang.Object[] getControls() {
if (controls==null) {
controls=new Control[1];
controls[0]=new SilenceSuppressionAdapter(this,true,false);
}
return (Object[])controls;
}
}
|