blob: ce81a18eeaa84d6b08db011c295eb3a87c162aa9 [file] [log] [blame]
/*
* 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<String, Object> 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;
}
}
}