mirror of https://github.com/NekoX-Dev/NekoX.git
137 lines
4.4 KiB
Java
137 lines
4.4 KiB
Java
/*
|
|
* Copyright (C) 2013 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 org.telegram.messenger.video;
|
|
|
|
import android.annotation.TargetApi;
|
|
import android.opengl.EGL14;
|
|
import android.opengl.EGLExt;
|
|
import android.opengl.EGLConfig;
|
|
import android.opengl.EGLContext;
|
|
import android.opengl.EGLDisplay;
|
|
import android.opengl.EGLSurface;
|
|
import android.os.Build;
|
|
import android.view.Surface;
|
|
|
|
@TargetApi(17)
|
|
public class InputSurface {
|
|
|
|
private static final int EGL_RECORDABLE_ANDROID = 0x3142;
|
|
private static final int EGL_OPENGL_ES2_BIT = 4;
|
|
private EGLDisplay mEGLDisplay;
|
|
private EGLContext mEGLContext;
|
|
private EGLSurface mEGLSurface;
|
|
private Surface mSurface;
|
|
|
|
public InputSurface(Surface surface) {
|
|
if (surface == null) {
|
|
throw new NullPointerException();
|
|
}
|
|
mSurface = surface;
|
|
eglSetup();
|
|
}
|
|
|
|
private void eglSetup() {
|
|
mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
|
|
if (mEGLDisplay == EGL14.EGL_NO_DISPLAY) {
|
|
throw new RuntimeException("unable to get EGL14 display");
|
|
}
|
|
int[] version = new int[2];
|
|
if (!EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)) {
|
|
mEGLDisplay = null;
|
|
throw new RuntimeException("unable to initialize EGL14");
|
|
}
|
|
|
|
int[] attribList = {
|
|
EGL14.EGL_RED_SIZE, 8,
|
|
EGL14.EGL_GREEN_SIZE, 8,
|
|
EGL14.EGL_BLUE_SIZE, 8,
|
|
EGL14.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
|
EGL_RECORDABLE_ANDROID, 1,
|
|
EGL14.EGL_NONE
|
|
};
|
|
EGLConfig[] configs = new EGLConfig[1];
|
|
int[] numConfigs = new int[1];
|
|
if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
|
|
numConfigs, 0)) {
|
|
throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
|
|
}
|
|
|
|
int[] attrib_list = {
|
|
EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
|
|
EGL14.EGL_NONE
|
|
};
|
|
|
|
mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT, attrib_list, 0);
|
|
checkEglError("eglCreateContext");
|
|
if (mEGLContext == null) {
|
|
throw new RuntimeException("null context");
|
|
}
|
|
|
|
int[] surfaceAttribs = {
|
|
EGL14.EGL_NONE
|
|
};
|
|
mEGLSurface = EGL14.eglCreateWindowSurface(mEGLDisplay, configs[0], mSurface,
|
|
surfaceAttribs, 0);
|
|
checkEglError("eglCreateWindowSurface");
|
|
if (mEGLSurface == null) {
|
|
throw new RuntimeException("surface was null");
|
|
}
|
|
}
|
|
|
|
public void release() {
|
|
if (EGL14.eglGetCurrentContext().equals(mEGLContext)) {
|
|
EGL14.eglMakeCurrent(mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT);
|
|
}
|
|
EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
|
|
EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
|
|
mSurface.release();
|
|
mEGLDisplay = null;
|
|
mEGLContext = null;
|
|
mEGLSurface = null;
|
|
mSurface = null;
|
|
}
|
|
|
|
public void makeCurrent() {
|
|
if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
|
|
throw new RuntimeException("eglMakeCurrent failed");
|
|
}
|
|
}
|
|
|
|
public boolean swapBuffers() {
|
|
return EGL14.eglSwapBuffers(mEGLDisplay, mEGLSurface);
|
|
}
|
|
|
|
public Surface getSurface() {
|
|
return mSurface;
|
|
}
|
|
|
|
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
|
|
public void setPresentationTime(long nsecs) {
|
|
EGLExt.eglPresentationTimeANDROID(mEGLDisplay, mEGLSurface, nsecs);
|
|
}
|
|
|
|
private void checkEglError(String msg) {
|
|
boolean failed = false;
|
|
while (EGL14.eglGetError() != EGL14.EGL_SUCCESS) {
|
|
failed = true;
|
|
}
|
|
if (failed) {
|
|
throw new RuntimeException("EGL error encountered (see log)");
|
|
}
|
|
}
|
|
}
|