/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.filterfw.core; import java.util.Map.Entry; /** * @hide */ public class FilterFunction { private Filter mFilter; private FilterContext mFilterContext; private boolean mFilterIsSetup = false; private FrameHolderPort[] mResultHolders; private class FrameHolderPort extends StreamPort { public FrameHolderPort() { super(null, "holder"); } } public FilterFunction(FilterContext context, Filter filter) { mFilterContext = context; mFilter = filter; } public Frame execute(KeyValueMap inputMap) { int filterOutCount = mFilter.getNumberOfOutputs(); // Sanity checks if (filterOutCount > 1) { throw new RuntimeException("Calling execute on filter " + mFilter + " with multiple " + "outputs! Use executeMulti() instead!"); } // Setup filter if (!mFilterIsSetup) { connectFilterOutputs(); mFilterIsSetup = true; } // Make sure GL environment is active boolean didActivateGLEnv = false; GLEnvironment glEnv = mFilterContext.getGLEnvironment(); if (glEnv != null && !glEnv.isActive()) { glEnv.activate(); didActivateGLEnv = true; } // Setup the inputs for (Entry entry : inputMap.entrySet()) { if (entry.getValue() instanceof Frame) { mFilter.pushInputFrame(entry.getKey(), (Frame)entry.getValue()); } else { mFilter.pushInputValue(entry.getKey(), entry.getValue()); } } // Process the filter if (mFilter.getStatus() != Filter.STATUS_PROCESSING) { mFilter.openOutputs(); } mFilter.performProcess(mFilterContext); // Create result handle Frame result = null; if (filterOutCount == 1 && mResultHolders[0].hasFrame()) { result = mResultHolders[0].pullFrame(); } // Deactivate GL environment if activated if (didActivateGLEnv) { glEnv.deactivate(); } return result; } public Frame executeWithArgList(Object... inputs) { return execute(KeyValueMap.fromKeyValues(inputs)); } public void close() { mFilter.performClose(mFilterContext); } public FilterContext getContext() { return mFilterContext; } public Filter getFilter() { return mFilter; } public void setInputFrame(String input, Frame frame) { mFilter.setInputFrame(input, frame); } public void setInputValue(String input, Object value) { mFilter.setInputValue(input, value); } public void tearDown() { mFilter.performTearDown(mFilterContext); mFilter = null; } @Override public String toString() { return mFilter.getName(); } private void connectFilterOutputs() { int i = 0; mResultHolders = new FrameHolderPort[mFilter.getNumberOfOutputs()]; for (OutputPort outputPort : mFilter.getOutputPorts()) { mResultHolders[i] = new FrameHolderPort(); outputPort.connectTo(mResultHolders[i]); ++i; } } }