/* * @(#)JavaDecoder.java 1.10 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.codec.video.cinepak; import javax.media.*; import javax.media.format.*; import javax.media.format.*; import com.sun.media.*; import com.ibm.media.codec.video.*; import java.awt.Dimension; public class JavaDecoder extends VideoCodec { //////////////////////////////////////////////////////////////////////////// // Constants // RGB bit masks static final private int rMask = 0x000000ff; static final private int gMask = 0x0000ff00; static final private int bMask = 0x00ff0000; //////////////////////////////////////////////////////////////////////////// // Variables private int [] refData = null; /** the cinepak java decoder **/ private CineStore fOurStore; public JavaDecoder() { supportedInputFormats = new VideoFormat[] {new VideoFormat(VideoFormat.CINEPAK) }; defaultOutputFormats = new VideoFormat[] {new RGBFormat( null, Format.NOT_SPECIFIED, Format.intArray, Format.NOT_SPECIFIED, // frame rate 32, rMask, gMask, bMask, 1,Format.NOT_SPECIFIED, Format.FALSE, // flipped Format.NOT_SPECIFIED // endian ) }; PLUGIN_NAME = "Cinepak Decoder"; } protected Format[] getMatchingOutputFormats(Format in) { VideoFormat ivf = (VideoFormat) in; Dimension inSize = ivf.getSize(); int lineStride = (inSize.width + 3) & ~3; int rowStride = (inSize.height + 3) & ~3; supportedOutputFormats= new VideoFormat[] { new RGBFormat (new Dimension(inSize), lineStride * rowStride, Format.intArray, ivf.getFrameRate(), 32, rMask, gMask, bMask ) }; return supportedOutputFormats; } public void open() throws ResourceUnavailableException { initDecoder(); } public void close() { fOurStore=null; } public void reset() { // no need to init decoder as first frame is always a key frame } // called when video resize is detected, by checkFormat() protected void videoResized() { initDecoder(); } protected void initDecoder() { fOurStore = new CineStore(); } public int process(Buffer inputBuffer, Buffer outputBuffer) { if (!checkInputBuffer(inputBuffer) ) { return BUFFER_PROCESSED_FAILED; } if (isEOM(inputBuffer) ) { propagateEOM(outputBuffer); return BUFFER_PROCESSED_OK; } VideoFormat ivf=(VideoFormat) inputBuffer.getFormat(); int inLength=inputBuffer.getLength(); int inMaxLength=ivf.getMaxDataLength(); int outMaxLength=outputFormat.getMaxDataLength(); byte[] inData =(byte[]) inputBuffer.getData(); int[] outData = validateIntArraySize(outputBuffer,outMaxLength ); if (refData == null) { refData = outData; outputBuffer.setData(null); outData = validateIntArraySize(outputBuffer, outMaxLength); } outputBuffer.setData(refData); // temporarily // the java decoder relies on output Buffer format outputBuffer.setFormat(outputFormat); fOurStore.DoFrame(inputBuffer, outputBuffer, fOurStore); System.arraycopy(refData, 0, outData, 0, outMaxLength); // make a copy outputBuffer.setData(outData); // put it back in the buffer updateOutput(outputBuffer,outputFormat, outMaxLength, 0); return BUFFER_PROCESSED_OK; } }