Made EglBase an abstract class and cleaned up.

Adds EglBase10 that implemenents EglBase for EGL 1.0

BUG=webrtc:4993
TBR=glaznew@webrtc.org

Review URL: https://codereview.webrtc.org/1526463002

Cr-Commit-Position: refs/heads/master@{#11011}
This commit is contained in:
perkj
2015-12-14 06:21:13 -08:00
committed by Commit bot
parent 03960d92dd
commit 3207916f35
10 changed files with 333 additions and 319 deletions

View File

@ -27,51 +27,29 @@
package org.webrtc; package org.webrtc;
import android.graphics.Canvas;
import android.graphics.SurfaceTexture; import android.graphics.SurfaceTexture;
import android.graphics.Rect;
import android.view.Surface; import android.view.Surface;
import android.view.SurfaceHolder;
import org.webrtc.Logging;
import org.webrtc.EglBase.Context;
import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
/** /**
* Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay, * Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay,
* and an EGLSurface. * and an EGLSurface.
*/ */
public class EglBase { public abstract class EglBase {
private static final String TAG = "EglBase"; // EGL wrapper for an actual EGLContext.
public static class Context {
}
// These constants are taken from EGL14.EGL_OPENGL_ES2_BIT and EGL14.EGL_CONTEXT_CLIENT_VERSION. // These constants are taken from EGL14.EGL_OPENGL_ES2_BIT and EGL14.EGL_CONTEXT_CLIENT_VERSION.
// https://android.googlesource.com/platform/frameworks/base/+/master/opengl/java/android/opengl/EGL14.java // https://android.googlesource.com/platform/frameworks/base/+/master/opengl/java/android/opengl/EGL14.java
// This is similar to how GlSurfaceView does: // This is similar to how GlSurfaceView does:
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/opengl/GLSurfaceView.java#760 // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/opengl/GLSurfaceView.java#760
private static final int EGL_OPENGL_ES2_BIT = 4; private static final int EGL_OPENGL_ES2_BIT = 4;
private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
// Android-specific extension. // Android-specific extension.
private static final int EGL_RECORDABLE_ANDROID = 0x3142; private static final int EGL_RECORDABLE_ANDROID = 0x3142;
private final EGL10 egl;
private EGLContext eglContext;
private EGLConfig eglConfig;
private EGLDisplay eglDisplay;
private EGLSurface eglSurface = EGL10.EGL_NO_SURFACE;
// EGL wrapper for an actual EGLContext.
public static class Context {
private final EGLContext eglContext;
public Context(EGLContext eglContext) {
this.eglContext = eglContext;
}
}
public static final int[] CONFIG_PLAIN = { public static final int[] CONFIG_PLAIN = {
EGL10.EGL_RED_SIZE, 8, EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8, EGL10.EGL_GREEN_SIZE, 8,
@ -111,257 +89,39 @@ public class EglBase {
return (EglBase14.isEGL14Supported() return (EglBase14.isEGL14Supported()
&& (sharedContext == null || sharedContext instanceof EglBase14.Context)) && (sharedContext == null || sharedContext instanceof EglBase14.Context))
? new EglBase14((EglBase14.Context) sharedContext, configAttributes) ? new EglBase14((EglBase14.Context) sharedContext, configAttributes)
: new EglBase(sharedContext, configAttributes); : new EglBase10((EglBase10.Context) sharedContext, configAttributes);
} }
public static EglBase create() { public static EglBase create() {
return create(null, CONFIG_PLAIN); return create(null, CONFIG_PLAIN);
} }
//Create root context without any EGLSurface or parent EGLContext. This can be used for branching public abstract void createSurface(Surface surface);
// new contexts that share data.
@Deprecated
public EglBase() {
this((Context) null, CONFIG_PLAIN);
}
@Deprecated
public EglBase(EGLContext sharedContext, int[] configAttributes) {
this(new Context(sharedContext), configAttributes);
Logging.d(TAG, "EglBase created");
}
@Deprecated
public EGLContext getContext() {
return eglContext;
}
// Create a new context with the specified config type, sharing data with sharedContext.
EglBase(Context sharedContext, int[] configAttributes) {
this.egl = (EGL10) EGLContext.getEGL();
eglDisplay = getEglDisplay();
eglConfig = getEglConfig(eglDisplay, configAttributes);
eglContext = createEglContext(sharedContext, eglDisplay, eglConfig);
}
// TODO(perkj): This is a hacky ctor used to allow us to create an EGLBase14. Remove this and
// make EglBase an abstract class once all applications have started using the create factory
// method.
protected EglBase(boolean dummy) {
this.egl = null;
}
public void createSurface(Surface surface) {
/**
* We have to wrap Surface in a SurfaceHolder because for some reason eglCreateWindowSurface
* couldn't actually take a Surface object until API 17. Older versions fortunately just call
* SurfaceHolder.getSurface(), so we'll do that. No other methods are relevant.
*/
class FakeSurfaceHolder implements SurfaceHolder {
private final Surface surface;
FakeSurfaceHolder(Surface surface) {
this.surface = surface;
}
@Override
public void addCallback(Callback callback) {}
@Override
public void removeCallback(Callback callback) {}
@Override
public boolean isCreating() {
return false;
}
@Deprecated
@Override
public void setType(int i) {}
@Override
public void setFixedSize(int i, int i2) {}
@Override
public void setSizeFromLayout() {}
@Override
public void setFormat(int i) {}
@Override
public void setKeepScreenOn(boolean b) {}
@Override
public Canvas lockCanvas() {
return null;
}
@Override
public Canvas lockCanvas(Rect rect) {
return null;
}
@Override
public void unlockCanvasAndPost(Canvas canvas) {}
@Override
public Rect getSurfaceFrame() {
return null;
}
@Override
public Surface getSurface() {
return surface;
}
}
createSurfaceInternal(new FakeSurfaceHolder(surface));
}
// Create EGLSurface from the Android SurfaceTexture. // Create EGLSurface from the Android SurfaceTexture.
public void createSurface(SurfaceTexture surfaceTexture) { public abstract void createSurface(SurfaceTexture surfaceTexture);
createSurfaceInternal(surfaceTexture);
}
// Create EGLSurface from either a SurfaceHolder or a SurfaceTexture.
private void createSurfaceInternal(Object nativeWindow) {
if (!(nativeWindow instanceof SurfaceHolder) && !(nativeWindow instanceof SurfaceTexture)) {
throw new IllegalStateException("Input must be either a SurfaceHolder or SurfaceTexture");
}
checkIsNotReleased();
if (eglSurface != EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Already has an EGLSurface");
}
int[] surfaceAttribs = {EGL10.EGL_NONE};
eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, nativeWindow, surfaceAttribs);
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Failed to create window surface");
}
}
// Create dummy 1x1 pixel buffer surface so the context can be made current. // Create dummy 1x1 pixel buffer surface so the context can be made current.
public void createDummyPbufferSurface() { public abstract void createDummyPbufferSurface();
createPbufferSurface(1, 1);
}
public void createPbufferSurface(int width, int height) { public abstract void createPbufferSurface(int width, int height);
checkIsNotReleased();
if (eglSurface != EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Already has an EGLSurface");
}
int[] surfaceAttribs = {EGL10.EGL_WIDTH, width, EGL10.EGL_HEIGHT, height, EGL10.EGL_NONE};
eglSurface = egl.eglCreatePbufferSurface(eglDisplay, eglConfig, surfaceAttribs);
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Failed to create pixel buffer surface");
}
}
public Context getEglBaseContext() { public abstract Context getEglBaseContext();
return new Context(eglContext);
}
public boolean hasSurface() { public abstract boolean hasSurface();
return eglSurface != EGL10.EGL_NO_SURFACE;
}
public int surfaceWidth() { public abstract int surfaceWidth();
final int widthArray[] = new int[1];
egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_WIDTH, widthArray);
return widthArray[0];
}
public int surfaceHeight() { public abstract int surfaceHeight();
final int heightArray[] = new int[1];
egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_HEIGHT, heightArray);
return heightArray[0];
}
public void releaseSurface() { public abstract void releaseSurface();
if (eglSurface != EGL10.EGL_NO_SURFACE) {
egl.eglDestroySurface(eglDisplay, eglSurface);
eglSurface = EGL10.EGL_NO_SURFACE;
}
}
private void checkIsNotReleased() { public abstract void release();
if (eglDisplay == EGL10.EGL_NO_DISPLAY || eglContext == EGL10.EGL_NO_CONTEXT
|| eglConfig == null) {
throw new RuntimeException("This object has been released");
}
}
public void release() { public abstract void makeCurrent();
checkIsNotReleased();
releaseSurface();
detachCurrent();
egl.eglDestroyContext(eglDisplay, eglContext);
egl.eglTerminate(eglDisplay);
eglContext = EGL10.EGL_NO_CONTEXT;
eglDisplay = EGL10.EGL_NO_DISPLAY;
eglConfig = null;
}
public void makeCurrent() {
checkIsNotReleased();
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("No EGLSurface - can't make current");
}
if (!egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
throw new RuntimeException("eglMakeCurrent failed");
}
}
// Detach the current EGL context, so that it can be made current on another thread. // Detach the current EGL context, so that it can be made current on another thread.
public void detachCurrent() { public abstract void detachCurrent();
if (!egl.eglMakeCurrent(
eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT)) {
throw new RuntimeException("eglMakeCurrent failed");
}
}
public void swapBuffers() { public abstract void swapBuffers();
checkIsNotReleased();
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("No EGLSurface - can't swap buffers");
}
egl.eglSwapBuffers(eglDisplay, eglSurface);
}
// Return an EGLDisplay, or die trying.
private EGLDisplay getEglDisplay() {
EGLDisplay eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
if (eglDisplay == EGL10.EGL_NO_DISPLAY) {
throw new RuntimeException("Unable to get EGL10 display");
}
int[] version = new int[2];
if (!egl.eglInitialize(eglDisplay, version)) {
throw new RuntimeException("Unable to initialize EGL10");
}
return eglDisplay;
}
// Return an EGLConfig, or die trying.
private EGLConfig getEglConfig(EGLDisplay eglDisplay, int[] configAttributes) {
EGLConfig[] configs = new EGLConfig[1];
int[] numConfigs = new int[1];
if (!egl.eglChooseConfig(
eglDisplay, configAttributes, configs, configs.length, numConfigs)) {
throw new RuntimeException("Unable to find any matching EGL config");
}
return configs[0];
}
// Return an EGLConfig, or die trying.
private EGLContext createEglContext(
Context sharedContext, EGLDisplay eglDisplay, EGLConfig eglConfig) {
int[] contextAttributes = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE};
EGLContext rootContext =
sharedContext == null ? EGL10.EGL_NO_CONTEXT : sharedContext.eglContext;
EGLContext eglContext =
egl.eglCreateContext(eglDisplay, eglConfig, rootContext, contextAttributes);
if (eglContext == EGL10.EGL_NO_CONTEXT) {
throw new RuntimeException("Failed to create EGL context");
}
return eglContext;
}
} }

View File

@ -0,0 +1,299 @@
/*
* libjingle
* Copyright 2015 Google Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.webrtc;
import android.graphics.Canvas;
import android.graphics.SurfaceTexture;
import android.graphics.Rect;
import android.view.Surface;
import android.view.SurfaceHolder;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
/**
* Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay,
* and an EGLSurface.
*/
final class EglBase10 extends EglBase {
// This constant is taken from EGL14.EGL_CONTEXT_CLIENT_VERSION.
private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
private final EGL10 egl;
private EGLContext eglContext;
private EGLConfig eglConfig;
private EGLDisplay eglDisplay;
private EGLSurface eglSurface = EGL10.EGL_NO_SURFACE;
// EGL wrapper for an actual EGLContext.
public static class Context extends EglBase.Context {
private final EGLContext eglContext;
public Context(EGLContext eglContext) {
this.eglContext = eglContext;
}
}
// Create a new context with the specified config type, sharing data with sharedContext.
EglBase10(Context sharedContext, int[] configAttributes) {
this.egl = (EGL10) EGLContext.getEGL();
eglDisplay = getEglDisplay();
eglConfig = getEglConfig(eglDisplay, configAttributes);
eglContext = createEglContext(sharedContext, eglDisplay, eglConfig);
}
@Override
public void createSurface(Surface surface) {
/**
* We have to wrap Surface in a SurfaceHolder because for some reason eglCreateWindowSurface
* couldn't actually take a Surface object until API 17. Older versions fortunately just call
* SurfaceHolder.getSurface(), so we'll do that. No other methods are relevant.
*/
class FakeSurfaceHolder implements SurfaceHolder {
private final Surface surface;
FakeSurfaceHolder(Surface surface) {
this.surface = surface;
}
@Override
public void addCallback(Callback callback) {}
@Override
public void removeCallback(Callback callback) {}
@Override
public boolean isCreating() {
return false;
}
@Deprecated
@Override
public void setType(int i) {}
@Override
public void setFixedSize(int i, int i2) {}
@Override
public void setSizeFromLayout() {}
@Override
public void setFormat(int i) {}
@Override
public void setKeepScreenOn(boolean b) {}
@Override
public Canvas lockCanvas() {
return null;
}
@Override
public Canvas lockCanvas(Rect rect) {
return null;
}
@Override
public void unlockCanvasAndPost(Canvas canvas) {}
@Override
public Rect getSurfaceFrame() {
return null;
}
@Override
public Surface getSurface() {
return surface;
}
}
createSurfaceInternal(new FakeSurfaceHolder(surface));
}
// Create EGLSurface from the Android SurfaceTexture.
@Override
public void createSurface(SurfaceTexture surfaceTexture) {
createSurfaceInternal(surfaceTexture);
}
// Create EGLSurface from either a SurfaceHolder or a SurfaceTexture.
private void createSurfaceInternal(Object nativeWindow) {
if (!(nativeWindow instanceof SurfaceHolder) && !(nativeWindow instanceof SurfaceTexture)) {
throw new IllegalStateException("Input must be either a SurfaceHolder or SurfaceTexture");
}
checkIsNotReleased();
if (eglSurface != EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Already has an EGLSurface");
}
int[] surfaceAttribs = {EGL10.EGL_NONE};
eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, nativeWindow, surfaceAttribs);
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Failed to create window surface");
}
}
// Create dummy 1x1 pixel buffer surface so the context can be made current.
@Override
public void createDummyPbufferSurface() {
createPbufferSurface(1, 1);
}
@Override
public void createPbufferSurface(int width, int height) {
checkIsNotReleased();
if (eglSurface != EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Already has an EGLSurface");
}
int[] surfaceAttribs = {EGL10.EGL_WIDTH, width, EGL10.EGL_HEIGHT, height, EGL10.EGL_NONE};
eglSurface = egl.eglCreatePbufferSurface(eglDisplay, eglConfig, surfaceAttribs);
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Failed to create pixel buffer surface");
}
}
@Override
public org.webrtc.EglBase.Context getEglBaseContext() {
return new EglBase10.Context(eglContext);
}
@Override
public boolean hasSurface() {
return eglSurface != EGL10.EGL_NO_SURFACE;
}
@Override
public int surfaceWidth() {
final int widthArray[] = new int[1];
egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_WIDTH, widthArray);
return widthArray[0];
}
@Override
public int surfaceHeight() {
final int heightArray[] = new int[1];
egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_HEIGHT, heightArray);
return heightArray[0];
}
@Override
public void releaseSurface() {
if (eglSurface != EGL10.EGL_NO_SURFACE) {
egl.eglDestroySurface(eglDisplay, eglSurface);
eglSurface = EGL10.EGL_NO_SURFACE;
}
}
private void checkIsNotReleased() {
if (eglDisplay == EGL10.EGL_NO_DISPLAY || eglContext == EGL10.EGL_NO_CONTEXT
|| eglConfig == null) {
throw new RuntimeException("This object has been released");
}
}
@Override
public void release() {
checkIsNotReleased();
releaseSurface();
detachCurrent();
egl.eglDestroyContext(eglDisplay, eglContext);
egl.eglTerminate(eglDisplay);
eglContext = EGL10.EGL_NO_CONTEXT;
eglDisplay = EGL10.EGL_NO_DISPLAY;
eglConfig = null;
}
@Override
public void makeCurrent() {
checkIsNotReleased();
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("No EGLSurface - can't make current");
}
if (!egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
throw new RuntimeException("eglMakeCurrent failed");
}
}
// Detach the current EGL context, so that it can be made current on another thread.
@Override
public void detachCurrent() {
if (!egl.eglMakeCurrent(
eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT)) {
throw new RuntimeException("eglMakeCurrent failed");
}
}
@Override
public void swapBuffers() {
checkIsNotReleased();
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("No EGLSurface - can't swap buffers");
}
egl.eglSwapBuffers(eglDisplay, eglSurface);
}
// Return an EGLDisplay, or die trying.
private EGLDisplay getEglDisplay() {
EGLDisplay eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
if (eglDisplay == EGL10.EGL_NO_DISPLAY) {
throw new RuntimeException("Unable to get EGL10 display");
}
int[] version = new int[2];
if (!egl.eglInitialize(eglDisplay, version)) {
throw new RuntimeException("Unable to initialize EGL10");
}
return eglDisplay;
}
// Return an EGLConfig, or die trying.
private EGLConfig getEglConfig(EGLDisplay eglDisplay, int[] configAttributes) {
EGLConfig[] configs = new EGLConfig[1];
int[] numConfigs = new int[1];
if (!egl.eglChooseConfig(
eglDisplay, configAttributes, configs, configs.length, numConfigs)) {
throw new RuntimeException("Unable to find any matching EGL config");
}
return configs[0];
}
// Return an EGLConfig, or die trying.
private EGLContext createEglContext(
Context sharedContext, EGLDisplay eglDisplay, EGLConfig eglConfig) {
int[] contextAttributes = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE};
EGLContext rootContext =
sharedContext == null ? EGL10.EGL_NO_CONTEXT : sharedContext.eglContext;
EGLContext eglContext =
egl.eglCreateContext(eglDisplay, eglConfig, rootContext, contextAttributes);
if (eglContext == EGL10.EGL_NO_CONTEXT) {
throw new RuntimeException("Failed to create EGL context");
}
return eglContext;
}
}

View File

@ -47,9 +47,6 @@ final class EglBase14 extends EglBase {
private static final String TAG = "EglBase14"; private static final String TAG = "EglBase14";
private static final int EGL14_SDK_VERSION = android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; private static final int EGL14_SDK_VERSION = android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
private static final int CURRENT_SDK_VERSION = android.os.Build.VERSION.SDK_INT; private static final int CURRENT_SDK_VERSION = android.os.Build.VERSION.SDK_INT;
// Android-specific extension.
private static final int EGL_RECORDABLE_ANDROID = 0x3142;
private EGLContext eglContext; private EGLContext eglContext;
private EGLConfig eglConfig; private EGLConfig eglConfig;
private EGLDisplay eglDisplay; private EGLDisplay eglDisplay;
@ -65,7 +62,6 @@ final class EglBase14 extends EglBase {
private final android.opengl.EGLContext egl14Context; private final android.opengl.EGLContext egl14Context;
Context(android.opengl.EGLContext eglContext) { Context(android.opengl.EGLContext eglContext) {
super(null);
this.egl14Context = eglContext; this.egl14Context = eglContext;
} }
} }
@ -73,7 +69,6 @@ final class EglBase14 extends EglBase {
// Create a new context with the specified config type, sharing data with sharedContext. // Create a new context with the specified config type, sharing data with sharedContext.
// |sharedContext| may be null. // |sharedContext| may be null.
EglBase14(EglBase14.Context sharedContext, int[] configAttributes) { EglBase14(EglBase14.Context sharedContext, int[] configAttributes) {
super(true /* dummy */);
eglDisplay = getEglDisplay(); eglDisplay = getEglDisplay();
eglConfig = getEglConfig(eglDisplay, configAttributes); eglConfig = getEglConfig(eglDisplay, configAttributes);
eglContext = createEglContext(sharedContext, eglDisplay, eglConfig); eglContext = createEglContext(sharedContext, eglDisplay, eglConfig);

View File

@ -169,13 +169,6 @@ public class SurfaceViewRenderer extends SurfaceView
tryCreateEglSurface(); tryCreateEglSurface();
} }
@Deprecated
// TODO(perkj): Remove when applications has been updated.
public void init(
EGLContext sharedContext, RendererCommon.RendererEvents rendererEvents) {
init(sharedContext != null ? new EglBase.Context(sharedContext) : null, rendererEvents);
}
/** /**
* Create and make an EGLSurface current if both init() and surfaceCreated() have been called. * Create and make an EGLSurface current if both init() and surfaceCreated() have been called.
*/ */

View File

@ -415,13 +415,8 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
eglContextReady = eglContextReadyCallback; eglContextReady = eglContextReadyCallback;
} }
@Deprecated
public static synchronized EGLContext getEGLContext() {
return eglContext;
}
public static synchronized EglBase.Context getEglBaseContext() { public static synchronized EglBase.Context getEglBaseContext() {
return new EglBase.Context(eglContext); return new EglBase10.Context(eglContext);
} }
/** Releases GLSurfaceView video renderer. */ /** Releases GLSurfaceView video renderer. */

View File

@ -1365,40 +1365,12 @@ JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)(
OwnedFactoryAndThreads* owned_factory = OwnedFactoryAndThreads* owned_factory =
reinterpret_cast<OwnedFactoryAndThreads*>(native_factory); reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
// TODO(perkj): In order to not break existing applications we need to
// check if |local_egl_context| or |remote_egl_context| is an
// EGL10 context. If so, create an EGLBase10.EGL10Context instead.
// Remove this once existing applications has been updated.
jobject local_eglbase_context = local_egl_context;
jobject remote_eglbase_context = remote_egl_context;
jclass j_egl10_context_class =
FindClass(jni, "javax/microedition/khronos/egl/EGLContext");
jclass j_eglbase_context_class =
FindClass(jni, "org/webrtc/EglBase$Context");
jmethodID j_eglbase_context_ctor = GetMethodID(
jni, j_eglbase_context_class,
"<init>", "(Ljavax/microedition/khronos/egl/EGLContext;)V");
if (local_egl_context != nullptr &&
jni->IsInstanceOf(local_egl_context, j_egl10_context_class)) {
local_eglbase_context = jni->NewObject(
j_eglbase_context_class, j_eglbase_context_ctor,
local_egl_context);
}
if (remote_egl_context != nullptr &&
jni->IsInstanceOf(remote_egl_context, j_egl10_context_class)) {
remote_eglbase_context = jni->NewObject(
j_eglbase_context_class, j_eglbase_context_ctor,
remote_egl_context);
}
MediaCodecVideoEncoderFactory* encoder_factory = MediaCodecVideoEncoderFactory* encoder_factory =
static_cast<MediaCodecVideoEncoderFactory*> static_cast<MediaCodecVideoEncoderFactory*>
(owned_factory->encoder_factory()); (owned_factory->encoder_factory());
if (encoder_factory) { if (encoder_factory) {
LOG(LS_INFO) << "Set EGL context for HW encoding."; LOG(LS_INFO) << "Set EGL context for HW encoding.";
encoder_factory->SetEGLContext(jni, local_eglbase_context); encoder_factory->SetEGLContext(jni, local_egl_context);
} }
MediaCodecVideoDecoderFactory* decoder_factory = MediaCodecVideoDecoderFactory* decoder_factory =
@ -1406,7 +1378,7 @@ JOW(void, PeerConnectionFactory_nativeSetVideoHwAccelerationOptions)(
(owned_factory->decoder_factory()); (owned_factory->decoder_factory());
if (decoder_factory) { if (decoder_factory) {
LOG(LS_INFO) << "Set EGL context for HW decoding."; LOG(LS_INFO) << "Set EGL context for HW decoding.";
decoder_factory->SetEGLContext(jni, remote_eglbase_context); decoder_factory->SetEGLContext(jni, remote_egl_context);
} }
#endif #endif
} }

View File

@ -149,6 +149,7 @@
'app/webrtc/java/android/org/webrtc/CameraEnumerationAndroid.java', 'app/webrtc/java/android/org/webrtc/CameraEnumerationAndroid.java',
'app/webrtc/java/android/org/webrtc/CameraEnumerator.java', 'app/webrtc/java/android/org/webrtc/CameraEnumerator.java',
'app/webrtc/java/android/org/webrtc/EglBase.java', 'app/webrtc/java/android/org/webrtc/EglBase.java',
'app/webrtc/java/android/org/webrtc/EglBase10.java',
'app/webrtc/java/android/org/webrtc/EglBase14.java', 'app/webrtc/java/android/org/webrtc/EglBase14.java',
'app/webrtc/java/android/org/webrtc/GlRectDrawer.java', 'app/webrtc/java/android/org/webrtc/GlRectDrawer.java',
'app/webrtc/java/android/org/webrtc/GlShader.java', 'app/webrtc/java/android/org/webrtc/GlShader.java',

View File

@ -181,9 +181,9 @@ public class CallActivity extends Activity
remoteRender.setOnClickListener(listener); remoteRender.setOnClickListener(listener);
// Create video renderers. // Create video renderers.
rootEglBase = new EglBase(); rootEglBase = EglBase.create();
localRender.init(rootEglBase.getContext(), null); localRender.init(rootEglBase.getEglBaseContext(), null);
remoteRender.init(rootEglBase.getContext(), null); remoteRender.init(rootEglBase.getEglBaseContext(), null);
localRender.setZOrderMediaOverlay(true); localRender.setZOrderMediaOverlay(true);
updateVideoView(); updateVideoView();
@ -254,6 +254,7 @@ public class CallActivity extends Activity
// For command line execution run connection for <runTimeMs> and exit. // For command line execution run connection for <runTimeMs> and exit.
if (commandLineRun && runTimeMs > 0) { if (commandLineRun && runTimeMs > 0) {
(new Handler()).postDelayed(new Runnable() { (new Handler()).postDelayed(new Runnable() {
@Override
public void run() { public void run() {
disconnect(); disconnect();
} }
@ -488,7 +489,7 @@ public class CallActivity extends Activity
signalingParameters = params; signalingParameters = params;
logAndToast("Creating peer connection, delay=" + delta + "ms"); logAndToast("Creating peer connection, delay=" + delta + "ms");
peerConnectionClient.createPeerConnection(rootEglBase.getContext(), peerConnectionClient.createPeerConnection(rootEglBase.getEglBaseContext(),
localRender, remoteRender, signalingParameters); localRender, remoteRender, signalingParameters);
if (signalingParameters.initiator) { if (signalingParameters.initiator) {

View File

@ -47,8 +47,6 @@ import java.util.TimerTask;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.microedition.khronos.egl.EGLContext;
/** /**
* Peer connection client implementation. * Peer connection client implementation.
* *
@ -259,7 +257,7 @@ public class PeerConnectionClient {
} }
public void createPeerConnection( public void createPeerConnection(
final EGLContext renderEGLContext, final EglBase.Context renderEGLContext,
final VideoRenderer.Callbacks localRender, final VideoRenderer.Callbacks localRender,
final VideoRenderer.Callbacks remoteRender, final VideoRenderer.Callbacks remoteRender,
final SignalingParameters signalingParameters) { final SignalingParameters signalingParameters) {
@ -429,7 +427,7 @@ public class PeerConnectionClient {
} }
} }
private void createPeerConnectionInternal(EGLContext renderEGLContext) { private void createPeerConnectionInternal(EglBase.Context renderEGLContext) {
if (factory == null || isError) { if (factory == null || isError) {
Log.e(TAG, "Peerconnection factory is not created"); Log.e(TAG, "Peerconnection factory is not created");
return; return;
@ -478,7 +476,7 @@ public class PeerConnectionClient {
} }
Log.d(TAG, "Opening camera: " + cameraDeviceName); Log.d(TAG, "Opening camera: " + cameraDeviceName);
videoCapturer = VideoCapturerAndroid.create(cameraDeviceName, null, videoCapturer = VideoCapturerAndroid.create(cameraDeviceName, null,
peerConnectionParameters.captureToTexture ? new EglBase.Context(renderEGLContext) : null); peerConnectionParameters.captureToTexture ? renderEGLContext : null);
if (videoCapturer == null) { if (videoCapturer == null) {
reportError("Failed to open camera"); reportError("Failed to open camera");
return; return;

View File

@ -240,7 +240,7 @@ public class PeerConnectionClientTest extends InstrumentationTestCase
client.setPeerConnectionFactoryOptions(options); client.setPeerConnectionFactoryOptions(options);
client.createPeerConnectionFactory( client.createPeerConnectionFactory(
getInstrumentation().getContext(), peerConnectionParameters, this); getInstrumentation().getContext(), peerConnectionParameters, this);
client.createPeerConnection(useTexures ? eglBase.getContext() : null, client.createPeerConnection(useTexures ? eglBase.getEglBaseContext() : null,
localRenderer, remoteRenderer, signalingParameters); localRenderer, remoteRenderer, signalingParameters);
client.createOffer(); client.createOffer();
return client; return client;
@ -270,7 +270,7 @@ public class PeerConnectionClientTest extends InstrumentationTestCase
signalingExecutor = new LooperExecutor(); signalingExecutor = new LooperExecutor();
signalingExecutor.requestStart(); signalingExecutor.requestStart();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
eglBase = new EglBase(); eglBase = EglBase.create();
} }
} }