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
18package android.filterfw.core;
19
20import android.filterfw.core.NativeAllocatorTag;
21import android.graphics.SurfaceTexture;
22import android.os.Looper;
23import android.util.Log;
24import android.view.Surface;
25import android.media.MediaRecorder;
26
27/**
28 * @hide
29 */
30public class GLEnvironment {
31
32    private int glEnvId;
33
34    private boolean mManageContext = true;
35
36    public GLEnvironment() {
37        nativeAllocate();
38    }
39
40    private GLEnvironment(NativeAllocatorTag tag) {
41    }
42
43    public synchronized void tearDown() {
44        if (glEnvId != -1) {
45            nativeDeallocate();
46            glEnvId = -1;
47        }
48    }
49
50    @Override
51    protected void finalize() throws Throwable {
52        tearDown();
53    }
54
55    public void initWithNewContext() {
56        mManageContext = true;
57        if (!nativeInitWithNewContext()) {
58            throw new RuntimeException("Could not initialize GLEnvironment with new context!");
59        }
60    }
61
62    public void initWithCurrentContext() {
63        mManageContext = false;
64        if (!nativeInitWithCurrentContext()) {
65            throw new RuntimeException("Could not initialize GLEnvironment with current context!");
66        }
67    }
68
69    public boolean isActive() {
70        return nativeIsActive();
71    }
72
73    public boolean isContextActive() {
74        return nativeIsContextActive();
75    }
76
77    public static boolean isAnyContextActive() {
78        return nativeIsAnyContextActive();
79    }
80
81    public void activate() {
82        if (Looper.myLooper() != null && Looper.myLooper().equals(Looper.getMainLooper())) {
83            Log.e("FilterFramework", "Activating GL context in UI thread!");
84        }
85        if (mManageContext && !nativeActivate()) {
86            throw new RuntimeException("Could not activate GLEnvironment!");
87        }
88    }
89
90    public void deactivate() {
91        if (mManageContext && !nativeDeactivate()) {
92            throw new RuntimeException("Could not deactivate GLEnvironment!");
93        }
94    }
95
96    public void swapBuffers() {
97        if (!nativeSwapBuffers()) {
98            throw new RuntimeException("Error swapping EGL buffers!");
99        }
100    }
101
102    public int registerSurface(Surface surface) {
103        int result = nativeAddSurface(surface);
104        if (result < 0) {
105            throw new RuntimeException("Error registering surface " + surface + "!");
106        }
107        return result;
108    }
109
110    public int registerSurfaceTexture(SurfaceTexture surfaceTexture, int width, int height) {
111        Surface surface = new Surface(surfaceTexture);
112        int result = nativeAddSurfaceWidthHeight(surface, width, height);
113        surface.release();
114        if (result < 0) {
115            throw new RuntimeException("Error registering surfaceTexture " + surfaceTexture + "!");
116        }
117        return result;
118    }
119
120    public int registerSurfaceFromMediaRecorder(MediaRecorder mediaRecorder) {
121        int result = nativeAddSurfaceFromMediaRecorder(mediaRecorder);
122        if (result < 0) {
123            throw new RuntimeException("Error registering surface from "
124                                    + "MediaRecorder" + mediaRecorder + "!");
125        }
126        return result;
127    }
128
129    public void activateSurfaceWithId(int surfaceId) {
130        if (!nativeActivateSurfaceId(surfaceId)) {
131            throw new RuntimeException("Could not activate surface " + surfaceId + "!");
132        }
133    }
134
135    public void unregisterSurfaceId(int surfaceId) {
136        if (!nativeRemoveSurfaceId(surfaceId)) {
137            throw new RuntimeException("Could not unregister surface " + surfaceId + "!");
138        }
139    }
140
141    public void setSurfaceTimestamp(long timestamp) {
142        if (!nativeSetSurfaceTimestamp(timestamp)) {
143            throw new RuntimeException("Could not set timestamp for current surface!");
144        }
145    }
146
147    static {
148        System.loadLibrary("filterfw");
149    }
150
151    private native boolean nativeInitWithNewContext();
152
153    private native boolean nativeInitWithCurrentContext();
154
155    private native boolean nativeIsActive();
156
157    private native boolean nativeIsContextActive();
158
159    private static native boolean nativeIsAnyContextActive();
160
161    private native boolean nativeActivate();
162
163    private native boolean nativeDeactivate();
164
165    private native boolean nativeSwapBuffers();
166
167    private native boolean nativeAllocate();
168
169    private native boolean nativeDeallocate();
170
171    private native int nativeAddSurface(Surface surface);
172
173    private native int nativeAddSurfaceWidthHeight(Surface surface, int width, int height);
174
175    private native int nativeAddSurfaceFromMediaRecorder(MediaRecorder mediaRecorder);
176
177    private native boolean  nativeDisconnectSurfaceMediaSource(MediaRecorder mediaRecorder);
178
179    private native boolean nativeActivateSurfaceId(int surfaceId);
180
181    private native boolean nativeRemoveSurfaceId(int surfaceId);
182
183    private native boolean nativeSetSurfaceTimestamp(long timestamp);
184}
185