/* * @(#)BasicCodec.java 1.17 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media; import javax.media.format.*; import javax.media.*; import com.sun.media.util.*; import java.awt.Dimension; public abstract class BasicCodec extends BasicPlugIn implements Codec { private static final boolean DEBUG=true; protected Format inputFormat; protected Format outputFormat; protected boolean opened = false; protected Format[] inputFormats=new Format[0]; protected Format[] outputFormats=new Format[0]; protected boolean pendingEOM = false; public Format setInputFormat(Format input) { inputFormat = input; return input; } public Format setOutputFormat(Format output) { outputFormat = output; return output; } protected Format getInputFormat() { return inputFormat; } protected Format getOutputFormat() { return outputFormat; } public void reset() { } public void open() throws ResourceUnavailableException { opened = true; } public void close() { opened = false; } public Format [] getSupportedInputFormats() { return inputFormats; } protected RGBFormat updateRGBFormat(VideoFormat newFormat, RGBFormat outputFormat) { Dimension size = newFormat.getSize(); RGBFormat oldFormat = (RGBFormat) outputFormat; int lineStride = size.width * oldFormat.getPixelStride(); RGBFormat newRGB = new RGBFormat(size, lineStride * size.height, oldFormat.getDataType(), newFormat.getFrameRate(), oldFormat.getBitsPerPixel(), oldFormat.getRedMask(), oldFormat.getGreenMask(), oldFormat.getBlueMask(), oldFormat.getPixelStride(), lineStride, oldFormat.getFlipped(), oldFormat.getEndian() ); return newRGB; } protected boolean isEOM(Buffer inputBuffer) { return inputBuffer.isEOM(); } protected void propagateEOM(Buffer outputBuffer) { updateOutput(outputBuffer, getOutputFormat(), 0, 0); outputBuffer.setEOM(true); } protected void updateOutput(Buffer outputBuffer, Format format,int length, int offset) { outputBuffer.setFormat(format); outputBuffer.setLength(length); outputBuffer.setOffset(offset); } protected boolean checkInputBuffer(Buffer inputBuffer){ boolean fError= !isEOM(inputBuffer) && (inputBuffer == null || inputBuffer.getFormat() == null || !checkFormat(inputBuffer.getFormat()) ); if (DEBUG) if (fError) System.out.println(getClass().getName()+" : [error] checkInputBuffer"); return !fError; } protected boolean checkFormat(Format format) { return true; } protected int checkEOM(Buffer inputBuffer,Buffer outputBuffer) { processAtEOM(inputBuffer,outputBuffer); // process tail of input // this is a little tricky since we have to output two frames now: // one to close former session, another to signle EOM if (outputBuffer.getLength() > 0 ) { pendingEOM=true; return BUFFER_PROCESSED_OK | INPUT_BUFFER_NOT_CONSUMED ; } else { // in case we have nothing in the output, we are done propagateEOM(outputBuffer); return BUFFER_PROCESSED_OK; } } protected int processAtEOM(Buffer inputBuffer,Buffer outputBuffer) { return 0; } protected int getArrayElementSize(Class type) { if (type == Format.intArray) return 4; else if (type == Format.shortArray) return 2; else if (type == Format.byteArray) return 1; else return 0; } }