/* * @(#)GraphNode.java 1.3 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media; import javax.media.*; /** * Used as a node for the node graph. * A node contains a pointer to the plugin, the input and output formats, * a pointer pointing to the previous node and a level marker. * With the use of the "prev" node pointer, a full "track" of plugins * can be represented. * It also serves as a cache to store the supported input and output * formats. That way, the plugin doesn't have to be queried every * time for the supported formats. */ class GraphNode { Class clz; String cname; PlugIn plugin; int type = -1; Format input, output = null; Format supportedIns[], supportedOuts[]; GraphNode prev; int level; boolean failed = false; boolean custom = false; static int ARRAY_INC = 30; GraphNode(PlugIn plugin, Format input, GraphNode prev, int level) { this((String)(plugin == null ? null : plugin.getClass().getName()), plugin, input, prev, level); } GraphNode(String cname, PlugIn plugin, Format input, GraphNode prev, int level) { this.cname = cname; this.plugin = plugin; this.input = input; this.prev = prev; this.level = level; } GraphNode(GraphNode gn, Format input, GraphNode prev, int level) { this.cname = gn.cname; this.plugin = gn.plugin; this.type = gn.type; this.custom = gn.custom; this.input = input; this.prev = prev; this.level = level; this.supportedIns = gn.supportedIns; if (gn.input == input) supportedOuts = gn.supportedOuts; } Format [] getSupportedInputs() { if (supportedIns != null) return supportedIns; else if (plugin == null) return null; else if ((type == -1 || type == PlugInManager.CODEC) && plugin instanceof Codec) supportedIns = ((Codec)plugin).getSupportedInputFormats(); else if ((type == -1 || type == PlugInManager.RENDERER) && plugin instanceof Renderer) supportedIns = ((Renderer)plugin).getSupportedInputFormats(); else if (plugin instanceof Multiplexer) supportedIns = ((Multiplexer)plugin).getSupportedInputFormats(); return supportedIns; } Format [] getSupportedOutputs(Format in) { if (in == input && supportedOuts != null) return supportedOuts; else if (plugin == null) return null; else if ((type == -1 || type == PlugInManager.RENDERER) && plugin instanceof Renderer) return null; else if ((type == -1 || type == PlugInManager.CODEC) && plugin instanceof Codec) { Format outs[]; outs = ((Codec)plugin).getSupportedOutputFormats(in); if (input == in /* && supportedOuts == null */) supportedOuts = outs; return outs; } return null; } public void resetAttempted() { attemptedIdx = 0; attempted = null; } int attemptedIdx = 0; Format attempted[] = null; // An array of input formats attempted for // this plugin. This is for pruning the // the visited paths. boolean checkAttempted(Format input) { if (attempted == null) { attempted = new Format[ARRAY_INC]; attempted[attemptedIdx++] = input; return false; } int j; for (j = 0; j < attemptedIdx; j++) { if (input.equals(attempted[j])) return true; } // The given input format has not been attempted for // this plugin, we'll add that in. if (attemptedIdx >= attempted.length) { // Expand the array. Format newarray[] = new Format[attempted.length+ARRAY_INC]; System.arraycopy(attempted, 0, newarray, 0, attempted.length); attempted = newarray; } attempted[attemptedIdx++] = input; return false; } }