/* * @(#)BufferToImage.java 1.6 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package javax.media.util; import java.awt.Image; import java.awt.Dimension; import java.awt.Toolkit; import java.util.Vector; import java.awt.image.*; import javax.media.PlugInManager; import javax.media.PlugIn; import javax.media.Codec; import javax.media.Buffer; import javax.media.Format; import javax.media.format.*; import javax.media.ResourceUnavailableException; /** * This is a utility class to convert a video <code>Buffer</code> object to * an AWT <code>Image</code> object that you can then render using AWT methods. * <P>You can use this class in conjunction with the * <code>FrameGrabbingControl</code> to grab frames from the video renderer * and manipulate the image. * @see javax.media.control.FrameGrabbingControl * @since JMF 2.0 */ public class BufferToImage { private VideoFormat format; private Codec converter = null; private RGBFormat prefFormat; private Buffer outputBuffer; private Dimension size; private boolean converterNotRequired = false; /** * Instantiates a Buffer to Image conversion object for the specified * format. The <code>createImage</code> method expects input buffers to have the * format that is specified here. * @param format the format of incoming <code>Buffer</code> objects. */ public BufferToImage(VideoFormat format) { if (!(format instanceof YUVFormat || format instanceof RGBFormat)) { // Cant do } else { this.format = format; size = format.getSize(); prefFormat = new RGBFormat(size, size.width * size.height, // maxDataLength Format.intArray, // type format.getFrameRate(), 32, // bpp Format.NOT_SPECIFIED, // masks Format.NOT_SPECIFIED, Format.NOT_SPECIFIED, 1, Format.NOT_SPECIFIED, // strides RGBFormat.FALSE, // flipped Format.NOT_SPECIFIED); // endian if (format.matches(prefFormat)) { converterNotRequired = true; return; } Codec codec = findCodec(format, prefFormat); if (codec != null) converter = codec; outputBuffer = new Buffer(); } } private Codec findCodec(VideoFormat input, VideoFormat output) { Vector codecList = PlugInManager.getPlugInList(input, output, PlugInManager.CODEC); if (codecList == null || codecList.size() == 0) return null; for (int i = 0; i < codecList.size(); i++) { String codecName = (String) codecList.elementAt(i); Class codecClass = null; Codec codec = null; try { codecClass = Class.forName(codecName); if (codecClass != null) codec = (Codec) codecClass.newInstance(); } catch (ClassNotFoundException cnfe) { } catch (IllegalAccessException iae) { } catch (InstantiationException ie) { } catch (ClassCastException cce) { } if (codec == null) continue; if (codec.setInputFormat(input) == null) continue; Format [] outputs = codec.getSupportedOutputFormats(input); if (outputs == null || outputs.length == 0) continue; for (int j = 0; j < outputs.length; j++) { if (outputs[j].matches(output)) { Format out = codec.setOutputFormat(outputs[j]); if (out != null && out.matches(output)) { try { codec.open(); return codec; } catch (ResourceUnavailableException rue) { } } } } } return null; } /** * Converts the input buffer to a standard AWT image and returns the image. * The buffer should contain video data of the format specified in the * constructor. If the input data is not valid or a suitable converter * couldn't be found, the method returns null. * @return an AWT Image if the conversion was completed succesfully, else * returns null. */ public Image createImage(Buffer buffer) { // check for bad values if ( buffer == null || (converter == null && converterNotRequired == false) || prefFormat == null || buffer.getFormat() == null || !buffer.getFormat().matches(format) || buffer.getData() == null || buffer.isEOM() || buffer.isDiscard() ) return null; int [] outputData; RGBFormat vf; try { if (converterNotRequired) { outputData = (int[]) buffer.getData(); vf = (RGBFormat) buffer.getFormat(); outputBuffer = buffer; } else { int retVal = converter.process(buffer, outputBuffer); if (retVal != PlugIn.BUFFER_PROCESSED_OK) return null; outputData = (int[]) outputBuffer.getData(); vf = (RGBFormat) outputBuffer.getFormat(); } } catch (Exception ex) { System.err.println("Exception " + ex); return null; } Image outputImage = null; BufferToImage waFor2DBug = null; try { Class cl = Class.forName("com.sun.media.util.BufferToBufferedImage"); waFor2DBug = (BufferToImage) cl.newInstance(); } catch (Exception e) { //System.err.println("Not JDK 1.2"); } if (waFor2DBug != null) { outputImage = waFor2DBug.createImage(outputBuffer); } else { int redMask = vf.getRedMask(); int greenMask = vf.getGreenMask(); int blueMask = vf.getBlueMask(); DirectColorModel dcm = new DirectColorModel(32, redMask, greenMask, blueMask); MemoryImageSource sourceImage = new MemoryImageSource(size.width, size.height, dcm, outputData, 0, size.width); outputImage = Toolkit.getDefaultToolkit().createImage(sourceImage); } return outputImage; } }