Home | History | Annotate | Download | only in core
      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.filterfw.core;
     19 
     20 import android.filterfw.core.Filter;
     21 import android.filterfw.core.Frame;
     22 import android.filterfw.core.FrameManager;
     23 import android.filterfw.core.GLEnvironment;
     24 
     25 import java.util.HashMap;
     26 import java.util.HashSet;
     27 import java.util.Set;
     28 
     29 /**
     30  * @hide
     31  */
     32 public class FilterContext {
     33 
     34     private FrameManager mFrameManager;
     35     private GLEnvironment mGLEnvironment;
     36     private HashMap<String, Frame> mStoredFrames = new HashMap<String, Frame>();
     37     private Set<FilterGraph> mGraphs = new HashSet<FilterGraph>();
     38 
     39     public FrameManager getFrameManager() {
     40         return mFrameManager;
     41     }
     42 
     43     public void setFrameManager(FrameManager manager) {
     44         if (manager == null) {
     45             throw new NullPointerException("Attempting to set null FrameManager!");
     46         } else if (manager.getContext() != null) {
     47             throw new IllegalArgumentException("Attempting to set FrameManager which is already "
     48                 + "bound to another FilterContext!");
     49         } else {
     50             mFrameManager = manager;
     51             mFrameManager.setContext(this);
     52         }
     53     }
     54 
     55     public GLEnvironment getGLEnvironment() {
     56         return mGLEnvironment;
     57     }
     58 
     59     public void initGLEnvironment(GLEnvironment environment) {
     60         if (mGLEnvironment == null) {
     61             mGLEnvironment = environment;
     62         } else {
     63             throw new RuntimeException("Attempting to re-initialize GL Environment for " +
     64                 "FilterContext!");
     65         }
     66     }
     67 
     68     public interface OnFrameReceivedListener {
     69         public void onFrameReceived(Filter filter, Frame frame, Object userData);
     70     }
     71 
     72     public synchronized void storeFrame(String key, Frame frame) {
     73         Frame storedFrame = fetchFrame(key);
     74         if (storedFrame != null) {
     75             storedFrame.release();
     76         }
     77         frame.onFrameStore();
     78         mStoredFrames.put(key, frame.retain());
     79     }
     80 
     81     public synchronized Frame fetchFrame(String key) {
     82         Frame frame = mStoredFrames.get(key);
     83         if (frame != null) {
     84             frame.onFrameFetch();
     85         }
     86         return frame;
     87     }
     88 
     89     public synchronized void removeFrame(String key) {
     90         Frame frame = mStoredFrames.get(key);
     91         if (frame != null) {
     92             mStoredFrames.remove(key);
     93             frame.release();
     94         }
     95     }
     96 
     97     public synchronized void tearDown() {
     98         // Release stored frames
     99         for (Frame frame : mStoredFrames.values()) {
    100             frame.release();
    101         }
    102         mStoredFrames.clear();
    103 
    104         // Release graphs
    105         for (FilterGraph graph : mGraphs) {
    106             graph.tearDown(this);
    107         }
    108         mGraphs.clear();
    109 
    110         // Release frame manager
    111         if (mFrameManager != null) {
    112             mFrameManager.tearDown();
    113             mFrameManager = null;
    114         }
    115 
    116         // Release GL context
    117         if (mGLEnvironment != null) {
    118             mGLEnvironment.tearDown();
    119             mGLEnvironment = null;
    120         }
    121     }
    122 
    123     final void addGraph(FilterGraph graph) {
    124         mGraphs.add(graph);
    125     }
    126 }
    127