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