/* * 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.media.effect; import android.filterfw.core.Filter; import android.filterfw.core.FilterGraph; import android.filterfw.core.GraphRunner; import android.filterfw.core.SyncRunner; import android.media.effect.FilterEffect; import android.media.effect.EffectContext; import android.filterfw.io.GraphIOException; import android.filterfw.io.GraphReader; import android.filterfw.io.TextGraphReader; /** * Effect subclass for effects based on a single Filter. Subclasses need only invoke the * constructor with the correct arguments to obtain an Effect implementation. * * @hide */ public class FilterGraphEffect extends FilterEffect { private static final String TAG = "FilterGraphEffect"; protected String mInputName; protected String mOutputName; protected GraphRunner mRunner; protected FilterGraph mGraph; protected Class mSchedulerClass; /** * Constructs a new FilterGraphEffect. * * @param name The name of this effect (used to create it in the EffectFactory). * @param graphString The graph string to create the graph. * @param inputName The name of the input GLTextureSource filter. * @param outputName The name of the output GLTextureSource filter. */ public FilterGraphEffect(EffectContext context, String name, String graphString, String inputName, String outputName, Class scheduler) { super(context, name); mInputName = inputName; mOutputName = outputName; mSchedulerClass = scheduler; createGraph(graphString); } private void createGraph(String graphString) { GraphReader reader = new TextGraphReader(); try { mGraph = reader.readGraphString(graphString); } catch (GraphIOException e) { throw new RuntimeException("Could not setup effect", e); } if (mGraph == null) { throw new RuntimeException("Could not setup effect"); } mRunner = new SyncRunner(getFilterContext(), mGraph, mSchedulerClass); } @Override public void apply(int inputTexId, int width, int height, int outputTexId) { beginGLEffect(); Filter src = mGraph.getFilter(mInputName); if (src != null) { src.setInputValue("texId", inputTexId); src.setInputValue("width", width); src.setInputValue("height", height); } else { throw new RuntimeException("Internal error applying effect"); } Filter dest = mGraph.getFilter(mOutputName); if (dest != null) { dest.setInputValue("texId", outputTexId); } else { throw new RuntimeException("Internal error applying effect"); } try { mRunner.run(); } catch (RuntimeException e) { throw new RuntimeException("Internal error applying effect: ", e); } endGLEffect(); } @Override public void setParameter(String parameterKey, Object value) { } @Override public void release() { mGraph.tearDown(getFilterContext()); mGraph = null; } }