package net.sourceforge.jffmpeg;
import javax.media.ResourceUnavailableException;
import javax.media.Codec;
import javax.media.Format;
import javax.media.format.VideoFormat;
import javax.media.format.AudioFormat;
import javax.media.format.RGBFormat;
import javax.media.format.YUVFormat;
import javax.media.Buffer;
import java.awt.Dimension;
import net.sourceforge.jffmpeg.ffmpegnative.NativeDecoder;
import net.sourceforge.jffmpeg.JMFCodec;
/**
* This class manages all ffmpeg audio codecs
*/
public class AudioDecoder implements Codec {
private CodecManager codecManager = new CodecManager();
private JMFCodec peer = null;
/**
* Retrieve the supported input formats.
*
* @return Format[] the supported input formats
*/
public Format[] getSupportedInputFormats() {
return codecManager.getSupportedAudioFormats();
}
/**
* Retrieve the supported output formats. Currently RGBVideo
* for Java codecs.
*
* @return Format[] the supported output formats
*/
public Format[] getSupportedOutputFormats(Format format) {
/* Sanity check */
if ( format == null || !(format instanceof AudioFormat ) ) {
return new Format[ 0 ];
}
AudioFormat inputFormat = (AudioFormat)format;
/* Get corresponding Jffmpeg Format */
JffmpegAudioFormat audioCodec = codecManager.getAudioCodec( format.getEncoding() );
return new AudioFormat[] {
new AudioFormat( "LINEAR", inputFormat.getSampleRate(),
inputFormat.getSampleSizeInBits() > 0 ?
inputFormat.getSampleSizeInBits() : 16,
inputFormat.getChannels(),
0, 1) // endian, int signed
};
}
/**
* Negotiate the format for the input data.
*
* @return Format the negotiated input format
*/
public Format setInputFormat( Format format ) {
JffmpegAudioFormat audioCodec = codecManager.getAudioCodec( format.getEncoding() );
if ( audioCodec == null ) return null;
/* Construct Codec */
try {
peer = (JMFCodec)Class.forName( audioCodec.getCodecClass() ).newInstance();
if ( !peer.isCodecAvailable() ) return null;
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
return null;
} catch ( InstantiationException e ) {
e.printStackTrace();
return null;
} catch ( IllegalAccessException e ) {
e.printStackTrace();
return null;
}
peer.setEncoding( audioCodec.getFFMpegCodecName() );
return format;
}
/**
* Negotiate the format for screen display renderer.
*
* Only the frame rate entry is used. All the other
* values are populated using the negotiated input formnat.
*
* @return Format RGBFormat to supply to display renderer.
*/
public Format setOutputFormat( Format format ) {
if ( peer == null ) throw new IllegalArgumentException( "Must set Input Format first" );
AudioFormat inputFormat = (AudioFormat)format;
return new AudioFormat( "LINEAR", inputFormat.getSampleRate(),
inputFormat.getSampleSizeInBits() > 0 ?
inputFormat.getSampleSizeInBits() : 16,
inputFormat.getChannels(),
0, 1); // endian, int signed
}
/**
* Convert data using this codec
*
* @return BUFFER_PROCESSED_OK The output buffer contains a valid frame
* @return BUFFER_PROCESSED_FAILED A decoding problem was encountered
*/
public int process( Buffer in, Buffer out ) {
return peer.process( in, out );
}
/**
* Initialise the video codec for use.
*/
public void open() throws ResourceUnavailableException {
peer.open();
}
/**
* Deallocate resources, and shutdown.
*/
public void close() {
peer.close();
}
/**
* Reset the internal state of the video codec.
*/
public void reset() {
peer.reset();
}
/**
* Retrives the name of this video codec: "JFFMPEG audio decoder"
* @return Codec name
*/
public String getName() {
return "JFFMPEG audio decoder";
}
/**
* This method returns the interfaces that can be used
* to control this codec. Currently no interfaces are defined.
*/
public Object[] getControls() {
return null; //peer.getControls();
}
/**
* This method returns an interface that can be used
* to control this codec. Currently no interfaces are defined.
*/
public Object getControl( String type ) {
return null; //peer.getControl( type );
}
}