/*
 * 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;
    }
}
