Home | History | Annotate | Download | only in effect
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.media.effect;
     18 
     19 import android.filterfw.core.Filter;
     20 import android.filterfw.core.FilterGraph;
     21 import android.filterfw.core.GraphRunner;
     22 import android.filterfw.core.SyncRunner;
     23 import android.media.effect.FilterEffect;
     24 import android.media.effect.EffectContext;
     25 import android.filterfw.io.GraphIOException;
     26 import android.filterfw.io.GraphReader;
     27 import android.filterfw.io.TextGraphReader;
     28 
     29 /**
     30  * Effect subclass for effects based on a single Filter. Subclasses need only invoke the
     31  * constructor with the correct arguments to obtain an Effect implementation.
     32  *
     33  * @hide
     34  */
     35 public class FilterGraphEffect extends FilterEffect {
     36 
     37     private static final String TAG = "FilterGraphEffect";
     38 
     39     protected String mInputName;
     40     protected String mOutputName;
     41     protected GraphRunner mRunner;
     42     protected FilterGraph mGraph;
     43     protected Class mSchedulerClass;
     44 
     45     /**
     46      * Constructs a new FilterGraphEffect.
     47      *
     48      * @param name The name of this effect (used to create it in the EffectFactory).
     49      * @param graphString The graph string to create the graph.
     50      * @param inputName The name of the input GLTextureSource filter.
     51      * @param outputName The name of the output GLTextureSource filter.
     52      */
     53     public FilterGraphEffect(EffectContext context,
     54                               String name,
     55                               String graphString,
     56                               String inputName,
     57                               String outputName,
     58                               Class scheduler) {
     59         super(context, name);
     60 
     61         mInputName = inputName;
     62         mOutputName = outputName;
     63         mSchedulerClass = scheduler;
     64         createGraph(graphString);
     65 
     66     }
     67 
     68     private void createGraph(String graphString) {
     69         GraphReader reader = new TextGraphReader();
     70         try {
     71             mGraph = reader.readGraphString(graphString);
     72         } catch (GraphIOException e) {
     73             throw new RuntimeException("Could not setup effect", e);
     74         }
     75 
     76         if (mGraph == null) {
     77             throw new RuntimeException("Could not setup effect");
     78         }
     79         mRunner = new SyncRunner(getFilterContext(), mGraph, mSchedulerClass);
     80     }
     81 
     82     @Override
     83     public void apply(int inputTexId, int width, int height, int outputTexId) {
     84         beginGLEffect();
     85         Filter src = mGraph.getFilter(mInputName);
     86         if (src != null) {
     87             src.setInputValue("texId", inputTexId);
     88             src.setInputValue("width", width);
     89             src.setInputValue("height", height);
     90         } else {
     91             throw new RuntimeException("Internal error applying effect");
     92         }
     93         Filter dest  = mGraph.getFilter(mOutputName);
     94         if (dest != null) {
     95             dest.setInputValue("texId", outputTexId);
     96         } else {
     97             throw new RuntimeException("Internal error applying effect");
     98         }
     99         try {
    100             mRunner.run();
    101         } catch (RuntimeException e) {
    102             throw new RuntimeException("Internal error applying effect: ", e);
    103         }
    104         endGLEffect();
    105     }
    106 
    107     @Override
    108     public void setParameter(String parameterKey, Object value) {
    109     }
    110 
    111     @Override
    112     public void release() {
    113          mGraph.tearDown(getFilterContext());
    114          mGraph = null;
    115     }
    116 }
    117