/*
* @(#)JPEGRenderer.java 1.17 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.renderer.video;
import javax.media.*;
import javax.media.renderer.VideoRenderer;
import javax.media.Format;
import javax.media.format.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.util.Vector;
import com.sun.media.*;
import com.sun.media.util.Arch;
/**
* Renderer for JPEG images.
* @since JMF 2.0
*/
public class JPEGRenderer extends BasicVideoRenderer implements SlowPlugIn {
/*************************************************************************
* Variables and Constants
*************************************************************************/
// The descriptive name of this renderer
private static final String MyName = "JPEG Renderer";
private VideoFormat supportedJPEG = null;
private VideoFormat supportedMJPG = null;
private boolean forceToFail = false;
public void forceToUse() {
// Override the forceToFail Flag.
forceToFail = false;
}
/*************************************************************************
* Constructor
*************************************************************************/
public JPEGRenderer() {
super(MyName);
// Check if the native jpeg decoder is there. If it is, disable
// this renderer by return null from setInputFormat.
if (plugInExists("com.sun.media.codec.video.jpeg.NativeDecoder", PlugInManager.CODEC)) {
try {
JMFSecurityManager.loadLibrary("jmutil");
JMFSecurityManager.loadLibrary("jmjpeg");
forceToFail = true;
} catch (Throwable t) { }
}
// Prepare supported input formats and preferred format
supportedJPEG = new VideoFormat(VideoFormat.JPEG,
null,
Format.NOT_SPECIFIED,
Format.byteArray,
// frame rate
Format.NOT_SPECIFIED);
supportedMJPG = new VideoFormat(VideoFormat.MJPG,
null,
Format.NOT_SPECIFIED,
Format.byteArray,
// frame rate
Format.NOT_SPECIFIED);
supportedFormats = new VideoFormat[1];
supportedFormats[0] = supportedJPEG;
//supportedFormats[1] = supportedMJPG;
}
/*************************************************************************
* PlugIn methods
*************************************************************************/
/**
* Opens the plug-in software or hardware component and acquires
* necessary resources. If all the needed resources could not be
* acquired, it throws a ResourceUnavailableException. Data should not
* be passed into the plug-in without first calling this method.
*/
public void open() throws ResourceUnavailableException {
}
/**
* Resets the state of the plug-in. Typically at end of media or when media
* is repositioned.
*/
public void reset() {
}
/*************************************************************************
* Renderer methods
*************************************************************************/
/**
* Set the data input format.
* @return false if the format is not supported.
*/
public Format setInputFormat(Format format) {
if (forceToFail)
return null;
if (super.setInputFormat(format) != null) {
reset();
return format;
} else
return null;
}
/**
* Processes the data and renders it to the output device
* represented by this renderer.
*/
public synchronized int doProcess(Buffer buffer) {
if (component == null)
return BUFFER_PROCESSED_OK;
if (!buffer.getFormat().equals(inputFormat)) {
Format in = buffer.getFormat();
if (!(in.matches(supportedJPEG)))
return BUFFER_PROCESSED_FAILED;
else {
inputFormat = (VideoFormat) in;
}
}
Dimension size = inputFormat.getSize();
Object data = buffer.getData();
if (!(data instanceof byte[]))
return BUFFER_PROCESSED_FAILED;
Image im = Toolkit.getDefaultToolkit().createImage((byte[])data);
MediaTracker tracker = new MediaTracker(component);
Dimension d = component.getSize();
outWidth = d.width;
outHeight = d.height;
tracker.addImage(im, 0);
try {
tracker.waitForAll();
} catch (Exception e) {}
Graphics g = component.getGraphics();
if (g != null) {
g.drawImage(im, 0, 0, outWidth, outHeight,
0, 0, size.width, size.height, component);
}
return BUFFER_PROCESSED_OK;
}
protected void repaint() {
}
}
|