1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/* 2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2011 The Android Open Source Project 3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License"); 5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License. 6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at 7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * http://www.apache.org/licenses/LICENSE-2.0 9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software 11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS, 12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and 14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License. 15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterfw; 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.HashMap; 21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.HashSet; 22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.Map.Entry; 23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.Set; 24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/** 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * A Signature holds the specification for a filter's input and output ports. 27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * A Signature instance must be returned by the filter's {@link Filter#getSignature()} method. It 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * specifies the number and names of the filter's input and output ports, whether or not they 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * are required, how data for those ports are accessed, and more. A Signature does not change over 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * time. This makes Signatures useful for understanding how a filter can be integrated into a 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * graph. 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * There are a number of flags that can be specified for each input and output port. The flag 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * {@code PORT_REQUIRED} indicates that the user must connect the specified port. On the other hand, 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * {@code PORT_OPTIONAL} indicates that a port may be connected by the user. 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * If ports other than the ones in the Signature are allowed, they default to the most generic 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * format, that allows passing in any type of Frame. Thus, if more granular access is needed to 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * a frame's data, it must be specified in the Signature. 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class Signature { 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private HashMap<String, PortInfo> mInputPorts = null; 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private HashMap<String, PortInfo> mOutputPorts = null; 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private boolean mAllowOtherInputs = true; 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private boolean mAllowOtherOutputs = true; 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks static class PortInfo { 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public int flags; 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public FrameType type; 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public PortInfo() { 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks flags = 0; 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks type = FrameType.any(); 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public PortInfo(int flags, FrameType type) { 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks this.flags = flags; 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks this.type = type; 61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public boolean isRequired() { 64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return (flags & PORT_REQUIRED) != 0; 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public String toString(String ioMode, String name) { 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks String ioName = ioMode + " " + name; 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks String modeName = isRequired() ? "required" : "optional"; 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return modeName + " " + ioName + ": " + type.toString(); 71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** Indicates that the port must be connected in the graph. */ 75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public static final int PORT_REQUIRED = 0x02; 76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** Indicates that the port may be connected in the graph . */ 77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public static final int PORT_OPTIONAL = 0x01; 78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Creates a new empty Signature. 81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Signature() { 83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Adds an input port to the Signature. 87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param name the name of the input port. Must be unique among input port names. 89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param flags a combination of port flags. 90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param type the type of the input frame. 91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @return this Signature instance. 92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Signature addInputPort(String name, int flags, FrameType type) { 94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks addInputPort(name, new PortInfo(flags, type)); 95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return this; 96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Adds an output port to the Signature. 100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param name the name of the output port. Must be unique among output port names. 102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param flags a combination of port flags. 103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param type the type of the output frame. 104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @return this Signature instance. 105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Signature addOutputPort(String name, int flags, FrameType type) { 107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks addOutputPort(name, new PortInfo(flags, type)); 108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return this; 109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Disallows the user from adding any other input ports. 113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Adding any input port not explicitly specified in this Signature will cause an error. 114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @return this Signature instance. 115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Signature disallowOtherInputs() { 117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllowOtherInputs = false; 118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return this; 119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Disallows the user from adding any other output ports. 123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Adding any output port not explicitly specified in this Signature will cause an error. 124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @return this Signature instance. 125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Signature disallowOtherOutputs() { 127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllowOtherOutputs = false; 128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return this; 129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Disallows the user from adding any other ports. 133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Adding any input or output port not explicitly specified in this Signature will cause an 134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * error. 135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @return this Signature instance. 136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public Signature disallowOtherPorts() { 138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllowOtherInputs = false; 139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mAllowOtherOutputs = false; 140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return this; 141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public String toString() { 145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks StringBuffer stringBuffer = new StringBuffer(); 146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (Entry<String, PortInfo> entry : mInputPorts.entrySet()) { 147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks stringBuffer.append(entry.getValue().toString("input", entry.getKey()) + "\n"); 148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 149227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (Entry<String, PortInfo> entry : mOutputPorts.entrySet()) { 150227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks stringBuffer.append(entry.getValue().toString("output", entry.getKey()) + "\n"); 151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (!mAllowOtherInputs) { 153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks stringBuffer.append("disallow other inputs\n"); 154227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (!mAllowOtherOutputs) { 156227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks stringBuffer.append("disallow other outputs\n"); 157227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 158227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return stringBuffer.toString(); 159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks PortInfo getInputPortInfo(String name) { 162227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks PortInfo result = mInputPorts != null ? mInputPorts.get(name) : null; 163227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return result != null ? result : new PortInfo(); 164227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks PortInfo getOutputPortInfo(String name) { 167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks PortInfo result = mOutputPorts != null ? mOutputPorts.get(name) : null; 168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return result != null ? result : new PortInfo(); 169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void checkInputPortsConform(Filter filter) { 172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Set<String> filterInputs = new HashSet<String>(); 173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks filterInputs.addAll(filter.getConnectedInputPortMap().keySet()); 174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (mInputPorts != null) { 175227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (Entry<String, PortInfo> entry : mInputPorts.entrySet()) { 176227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks String portName = entry.getKey(); 177227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks PortInfo portInfo = entry.getValue(); 178227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks InputPort inputPort = filter.getConnectedInputPort(portName); 179227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (inputPort == null && portInfo.isRequired()) { 180227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException("Filter " + filter + " does not have required " 181227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks + "input port '" + portName + "'!"); 182227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 183227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks filterInputs.remove(portName); 184227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 185227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 186227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (!mAllowOtherInputs && !filterInputs.isEmpty()) { 187227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException("Filter " + filter + " has invalid input ports: " 188227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks + filterInputs + "!"); 189227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 190227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 191227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 192227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void checkOutputPortsConform(Filter filter) { 193227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Set<String> filterOutputs = new HashSet<String>(); 194227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks filterOutputs.addAll(filter.getConnectedOutputPortMap().keySet()); 195227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (mOutputPorts != null) { 196227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (Entry<String, PortInfo> entry : mOutputPorts.entrySet()) { 197227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks String portName = entry.getKey(); 198227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks PortInfo portInfo = entry.getValue(); 199227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks OutputPort outputPort = filter.getConnectedOutputPort(portName); 200227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (outputPort == null && portInfo.isRequired()) { 201227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException("Filter " + filter + " does not have required " 202227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks + "output port '" + portName + "'!"); 203227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 204227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks filterOutputs.remove(portName); 205227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 206227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 207227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (!mAllowOtherOutputs && !filterOutputs.isEmpty()) { 208227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException("Filter " + filter + " has invalid output ports: " 209227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks + filterOutputs + "!"); 210227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 211227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 212227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 213227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks HashMap<String, PortInfo> getInputPorts() { 214227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mInputPorts; 215227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 216227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 217227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks HashMap<String, PortInfo> getOutputPorts() { 218227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mOutputPorts; 219227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 220227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 221227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private void addInputPort(String name, PortInfo portInfo) { 222227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (mInputPorts == null) { 223227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mInputPorts = new HashMap<String, PortInfo>(); 224227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 225227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (mInputPorts.containsKey(name)) { 226227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException("Attempting to add duplicate input port '" + name + "'!"); 227227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 228227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mInputPorts.put(name, portInfo); 229227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 230227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 231227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private void addOutputPort(String name, PortInfo portInfo) { 232227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (mOutputPorts == null) { 233227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mOutputPorts = new HashMap<String, PortInfo>(); 234227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 235227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (mOutputPorts.containsKey(name)) { 236227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new RuntimeException("Attempting to add duplicate output port '" + name + "'!"); 237227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 238227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mOutputPorts.put(name, portInfo); 239227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 240227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 241227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 242