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 
     18 package android.media.effect;
     19 
     20 import android.filterfw.core.Filter;
     21 import android.filterfw.core.FilterFactory;
     22 import android.filterfw.core.FilterFunction;
     23 import android.filterfw.core.Frame;
     24 import android.media.effect.EffectContext;
     25 
     26 /**
     27  * Effect subclass for effects based on a single Filter. Subclasses need only invoke the
     28  * constructor with the correct arguments to obtain an Effect implementation.
     29  *
     30  * @hide
     31  */
     32 public class SingleFilterEffect extends FilterEffect {
     33 
     34     protected FilterFunction mFunction;
     35     protected String mInputName;
     36     protected String mOutputName;
     37 
     38     /**
     39      * Constructs a new FilterFunctionEffect.
     40      *
     41      * @param name The name of this effect (used to create it in the EffectFactory).
     42      * @param filterClass The class of the filter to wrap.
     43      * @param inputName The name of the input image port.
     44      * @param outputName The name of the output image port.
     45      * @param finalParameters Key-value pairs of final input port assignments.
     46      */
     47     public SingleFilterEffect(EffectContext context,
     48                               String name,
     49                               Class filterClass,
     50                               String inputName,
     51                               String outputName,
     52                               Object... finalParameters) {
     53         super(context, name);
     54 
     55         mInputName = inputName;
     56         mOutputName = outputName;
     57 
     58         String filterName = filterClass.getSimpleName();
     59         FilterFactory factory = FilterFactory.sharedFactory();
     60         Filter filter = factory.createFilterByClass(filterClass, filterName);
     61         filter.initWithAssignmentList(finalParameters);
     62 
     63         mFunction = new FilterFunction(getFilterContext(), filter);
     64     }
     65 
     66     @Override
     67     public void apply(int inputTexId, int width, int height, int outputTexId) {
     68         beginGLEffect();
     69 
     70         Frame inputFrame = frameFromTexture(inputTexId, width, height);
     71         Frame outputFrame = frameFromTexture(outputTexId, width, height);
     72 
     73         Frame resultFrame = mFunction.executeWithArgList(mInputName, inputFrame);
     74 
     75         outputFrame.setDataFromFrame(resultFrame);
     76 
     77         inputFrame.release();
     78         outputFrame.release();
     79         resultFrame.release();
     80 
     81         endGLEffect();
     82     }
     83 
     84     @Override
     85     public void setParameter(String parameterKey, Object value) {
     86         mFunction.setInputValue(parameterKey, value);
     87     }
     88 
     89     @Override
     90     public void release() {
     91         mFunction.tearDown();
     92         mFunction = null;
     93     }
     94 }
     95 
     96