/*
* @(#)PlugInManager.java 1.20 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media;
import javax.media.Format;
import java.lang.reflect.*;
import java.util.Vector;
/**
* The <CODE>PlugInManager</CODE> is used to search for installed plug-ins and
* register new plug-ins. <P>
* <H3>Plug-in Types</H3>
* JMF defines several types of plug-ins, such as codecs, demultiplexers, and renderers.
* Custom plug-in types can also be registered.
* The predefined plug-in types are:
* <ul>
* <li>DEMULTIPLEXER = 1<BR></li>
* <li>CODEC = 2<BR></li>
* <li>EFFECT = 3<BR></li>
* <li>RENDERER = 4<BR></li>
* <li>MULTIPLEXER = 5<BR></li>
* </ul>
* <p>
* This <CODE>PlugInManager</CODE> is a wrapper for the actual implementation, which it
* expects to find in <CODE>javax.media.pim.PlugInManager</CODE>. If this implementation
* exists and is an instance of <CODE>javax.media.PlugInManager</CODE>, all calls to
* <CODE>javax.media.PlugInManager</CODE> are redirected to <CODE>javax.media.pim.PlugInManager</CODE>.
* If the implementation is not found, all calls to <CODE>javax.media.PlugInManager</CODE> methods
* will fail and return null or invalid data.
* @since JMF 2.0
*/
public class PlugInManager {
private static PlugInManager pim = null;
/** Demultiplexer plug-in type. */
public static final int DEMULTIPLEXER = 1;
/** Codec plug-in type. */
public static final int CODEC = 2;
/** Effect plug-in type. */
public static final int EFFECT = 3;
/** Renderer plug-in type. */
public static final int RENDERER = 4;
/** Multiplexer plug-in type. */
public static final int MULTIPLEXER = 5;
private static Method mGetPlugInList = null;
private static Method mSetPlugInList = null;
private static Method mCommit = null;
private static Method mAddPlugIn = null;
private static Method mRemovePlugIn = null;
private static Method mGetSupportedInputFormats = null;
private static Method mGetSupportedOutputFormats = null;
private static Format [] emptyFormat = new Format[0];
static {
// Look for javax.media.pim.PlugInManager
Class classPIM = null;
try {
classPIM = Class.forName("javax.media.pim.PlugInManager");
if (classPIM != null) {
Object tryPIM = classPIM.newInstance();
if (tryPIM instanceof PlugInManager) {
pim = (PlugInManager) tryPIM;
mGetSupportedInputFormats =
PackageManager.getDeclaredMethod(classPIM, "getSupportedInputFormats",
new Class[] {String.class, int.class});
mGetSupportedOutputFormats =
PackageManager.getDeclaredMethod(classPIM, "getSupportedOutputFormats",
new Class[] {String.class, int.class});
mGetPlugInList =
PackageManager.getDeclaredMethod(classPIM, "getPlugInList",
new Class[] { Format.class,
Format.class,
int.class} );
mSetPlugInList =
PackageManager.getDeclaredMethod(classPIM, "setPlugInList",
new Class[] {Vector.class, int.class});
mAddPlugIn =
PackageManager.getDeclaredMethod(classPIM, "addPlugIn",
new Class[] {String.class,
Format.formatArray,
Format.formatArray,
int.class});
mRemovePlugIn =
PackageManager.getDeclaredMethod(classPIM, "removePlugIn",
new Class[] {String.class, int.class});
mCommit =
PackageManager.getDeclaredMethod(classPIM, "commit", null);
}
}
} catch (ClassNotFoundException e) {
System.err.println(e);
} catch (InstantiationException e) {
System.err.println(e);
} catch (IllegalAccessException e) {
System.err.println(e);
} catch (SecurityException e) {
System.err.println(e);
} catch (NoSuchMethodException e) {
System.err.println(e);
}
}
static Object runMethod(Method m, Object [] params) {
try {
return m.invoke(null, params);
} catch (IllegalAccessException iae) {
System.err.println(iae);
} catch (IllegalArgumentException iare) {
System.err.println(iare);
} catch (InvocationTargetException ite) {
System.err.println(ite);
}
return null;
}
/**
* Builds a list of plug-ins that satisfy the specified plug-in type and input and
* output formats. Either or both of the formats can be null.
* If <code>input</code> is null, <CODE>getPlugInList</CODE>
* returns a list of plug-ins of the specified type that match the output format. If <code>output</code> is
* null, <CODE>getPlugInList</CODE> returns a list of plug-ins of the specified type that match the input format.
* If both parameters are null, <CODE>getPlugInList</CODE> returns a list of all of the
* plug-ins of the specified type.
* @param input The input <CODE>Format</CODE> to be supported by the plug-in.
* @param output The output <CODE>Format</CODE> to be generated by the plug-in.
* @param type The type of plug-in to search for, for example:
* <CODE>DEMULTIPLEXER</CODE>, <CODE>CODEC</CODE>, <CODE>EFFECT</CODE>,
* <CODE>MULTIPLEXER</CODE>, or <CODE>RENDERER</CODE>.
* @return A <CODE>Vector</CODE> that contains the plug-in list.
*/
public static Vector getPlugInList(Format input, Format output, int type) {
if (pim != null && mGetPlugInList != null) {
Object params[] = new Object[3];
params[0] = input;
params[1] = output;
params[2] = new Integer(type);
return (Vector) runMethod(mGetPlugInList, params);
} else
return new Vector(1);
}
/**
* Sets the search order for the plug-ins of the specified type. This enables
* you to control what plug-in is selected when multiple plug-ins of a particular
* type support the same input and output formats. (The first match is selected by
* the <CODE>Processor</CODE>.)
* This list is valid
* for the duration of the session only, unless <code>commit</code> is
* called.
* @param plugins A <CODE>Vector</CODE> that lists the plug-ins in the order that they
* should be searched.
* @param type The type of plug-in contained in the search list, for example:
* <CODE>DEMULTIPLEXER</CODE>, <CODE>CODEC</CODE>, <CODE>EFFECT</CODE>,
* <CODE>MULTIPLEXER</CODE>, or <CODE>RENDERER</CODE>.
* @see #commit
*/
public static void setPlugInList(Vector plugins, int type) {
if (pim != null && mSetPlugInList != null) {
Object params[] = new Object[2];
params[0] = plugins;
params[1] = new Integer(type);
runMethod(mSetPlugInList, params);
}
}
/**
* Commits any changes made to the plug-in list.
* The <CODE>commit</CODE> method must be called when a plug-in is added or removed
* to make the change permanent.
* Changes to the search
* order can also be made permanent by calling <CODE>commit</CODE>.
*/
public static void commit() throws java.io.IOException {
if (pim != null && mCommit != null) {
runMethod(mCommit, null);
}
}
/**
* Registers a new plug-in. This plug-in is automatically appended
* to the list of plug-ins searched when a <CODE>Processor</CODE> is created.
* Registration will fail if a plug-in of the same name
* already exists. The <code>commit</code> method has to be called to make the
* addition permanent.
* @param classname A <CODE>String</CODE> that contains the class name of the new plug-in.
* @param in A <CODE>Format</CODE> array that contains the input formats that the plug-in supports.
* @param out A <CODE>Format</CODE> array that contains the output formats that the plug-in supports.
* @param type The type of the new plug-in, for example:
* <CODE>DEMULTIPLEXER</CODE>, <CODE>CODEC</CODE>, <CODE>EFFECT</CODE>,
* <CODE>MULTIPLEXER</CODE>, or <CODE>RENDERER</CODE>.
* @return <CODE>true</CODE> if the plug-in is registered successfully, <CODE>false</CODE> if it could
* not be registered.
*/
public static boolean addPlugIn(String classname, Format [] in,
Format [] out, int type ) {
if (pim != null && mAddPlugIn != null) {
Object params[] = new Object[4];
params[0] = classname;
params[1] = in;
params[2] = out;
params[3] = new Integer(type);
Object result = runMethod(mAddPlugIn, params);
if (result != null)
return ((Boolean)result).booleanValue();
else
return false;
} else
return false;
}
/**
* Removes an existing plug-in from the registry. The <code>commit</code> method has
* to be called to make this change permanent.
* @param classname A <CODE>String</CODE> that contains the class name of the plug-in to be removed.
* @param type The type of the new plug-in, for example:
* <CODE>DEMULTIPLEXER</CODE>, <CODE>CODEC</CODE>, <CODE>EFFECT</CODE>,
* <CODE>MULTIPLEXER</CODE>, or <CODE>RENDERER</CODE>.
* @return <CODE>true</CODE> if the plug-in is succesfully removed, <CODE>false</CODE> if
* no plug-in with the specified name could be found.
*/
public static boolean removePlugIn(String classname, int type) {
if (pim != null && mRemovePlugIn != null) {
Object params[] = new Object[2];
params[0] = classname;
params[1] = new Integer(type);
Object result = runMethod(mRemovePlugIn, params);
if (result != null)
return ((Boolean)result).booleanValue();
else
return false;
} else
return false;
}
/**
* Gets a list of the input formats that the specified plug-in supports.
* @param className The plug-in class name. For example: <CODE>com.sun.media.codec.MPEG</CODE>
* @param type The type of the specified plug-in, for example:
* <CODE>DEMULTIPLEXER</CODE>, <CODE>CODEC</CODE>, <CODE>EFFECT</CODE>,
* <CODE>MULTIPLEXER</CODE>, or <CODE>RENDERER</CODE>.
* @return An array of <CODE>Format</CODE> objects that the specified plug-in can accept
* as input. Returns an array of zero elements if
* specified plug-in is not registered or has no inputs.
*/
public static Format [] getSupportedInputFormats(String className, int type) {
if (pim != null && mGetSupportedInputFormats != null) {
Object params[] = new Object[2];
params[0] = className;
params[1] = new Integer(type);
Object result = runMethod(mGetSupportedInputFormats, params);
return (Format[]) result;
} else
return emptyFormat;
}
/**
* Gets a list of the output formats that the specified plug-in supports.
* @param className The plug-in class name. For example: <CODE>com.sun.media.codec.MPEG</CODE>
* @param type The type of the specified plug-in, for example:
* <CODE>DEMULTIPLEXER</CODE>, <CODE>CODEC</CODE>, <CODE>EFFECT</CODE>,
* <CODE>MULTIPLEXER</CODE>, or <CODE>RENDERER</CODE>.
* @return An array of <CODE>Format</CODE> objects that the specified plug-in can generate
* as output. Returns an array of zero elements if
* specified plug-in is not registered or has no outputs.
*/
public static Format [] getSupportedOutputFormats(String className, int type) {
if (pim != null && mGetSupportedOutputFormats != null) {
Object params[] = new Object[2];
params[0] = className;
params[1] = new Integer(type);
Object result = runMethod(mGetSupportedOutputFormats, params);
return (Format[]) result;
} else
return emptyFormat;
}
}
|