OpenGL ESを使用してMediaCodecにより符号化画面が紫になる
17784 ワード
简単だと思っていたのに、コードがあって、直接一绪に持ってきたコードを修正して修正することに成功して、结局画面が紫になって、最后にここで原因を発见して、eglの配置が间违っています
このコードを参考にしてjava
eglの構成時に変更
完全なコード
このコードを参考にしてjava
eglの構成時に変更
private static final int EGL_RECORDABLE_ANDROID = 0x3142;
int confAttr[] = {
EGL14.EGL_RED_SIZE, 8,
EGL14.EGL_GREEN_SIZE, 8,
EGL14.EGL_BLUE_SIZE, 8,
EGL14.EGL_ALPHA_SIZE, 8,
EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
EGL_RECORDABLE_ANDROID, 1,
EGL14.EGL_NONE
};
完全なコード
public class EGLUtils {
private static final int EGL_RECORDABLE_ANDROID = 0x3142;
private EGLSurface eglSurface = EGL14.EGL_NO_SURFACE;
private EGLContext eglCtx = EGL14.EGL_NO_CONTEXT;
private EGLDisplay eglDis = EGL14.EGL_NO_DISPLAY;
public void initEGL(Surface surface) {
eglDis = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
EGL14.eglInitialize(eglDis, version, 0, version, 1);
int confAttr[] = {
EGL14.EGL_RED_SIZE, 8,
EGL14.EGL_GREEN_SIZE, 8,
EGL14.EGL_BLUE_SIZE, 8,
EGL14.EGL_ALPHA_SIZE, 8,
EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
EGL_RECORDABLE_ANDROID, 1,
EGL14.EGL_NONE
};
EGLConfig[] configs = new EGLConfig[1];
int[] numConfigs = new int[1];
EGL14.eglChooseConfig(eglDis, confAttr, 0, configs, 0, 1, numConfigs, 0);
int ctxAttr[] = {
EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,// 0x3098
EGL14.EGL_NONE
};
eglCtx = EGL14.eglCreateContext(eglDis, configs[0], EGL14.EGL_NO_CONTEXT, ctxAttr, 0);
int[] surfaceAttr = {
EGL14.EGL_NONE
};
eglSurface = EGL14.eglCreateWindowSurface(eglDis, configs[0], surface, surfaceAttr, 0);
EGL14.eglMakeCurrent(eglDis, eglSurface, eglSurface, eglCtx);
}
public EGLContext getContext() {
return eglCtx;
}
public void swap() {
EGL14.eglSwapBuffers(eglDis, eglSurface);
}
public void release() {
if (eglSurface != EGL14.EGL_NO_SURFACE) {
EGL14.eglMakeCurrent(eglDis, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT);
EGL14.eglDestroySurface(eglDis, eglSurface);
eglSurface = EGL14.EGL_NO_SURFACE;
}
if (eglCtx != EGL14.EGL_NO_CONTEXT) {
EGL14.eglDestroyContext(eglDis, eglCtx);
eglCtx = EGL14.EGL_NO_CONTEXT;
}
if (eglDis != EGL14.EGL_NO_DISPLAY) {
EGL14.eglTerminate(eglDis);
eglDis = EGL14.EGL_NO_DISPLAY;
}
}
}