EGL10.eglCreateWindowSurface(): Replace Surface input with SurfaceHolder
Sending a Surface as input to EGL10.eglCreateWindowSurface() is not supported everywhere. See this code as reference:
https://android.googlesource.com/platform/frameworks/native.git/+/ae9610220b5f509687b840532f95f3638ee0146b/opengl/tools/glgen/stubs/egl/eglCreateWindowSurface.java#42
Sending a SurfaceHolder as input instead should hopefully be supported everywhere, and this is also what GlSurfaceView does:
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/opengl/GLSurfaceView.java#1076
Review URL: https://codereview.webrtc.org/1416213004
Cr-Commit-Position: refs/heads/master@{#10392}
diff --git a/talk/app/webrtc/java/android/org/webrtc/EglBase.java b/talk/app/webrtc/java/android/org/webrtc/EglBase.java
index 32c38f3..2ee3688 100644
--- a/talk/app/webrtc/java/android/org/webrtc/EglBase.java
+++ b/talk/app/webrtc/java/android/org/webrtc/EglBase.java
@@ -28,7 +28,7 @@
package org.webrtc;
import android.graphics.SurfaceTexture;
-import android.view.Surface;
+import android.view.SurfaceHolder;
import org.webrtc.Logging;
@@ -86,9 +86,9 @@
eglContext = createEglContext(sharedContext, eglDisplay, eglConfig);
}
- // Create EGLSurface from the Android Surface.
- public void createSurface(Surface surface) {
- createSurfaceInternal(surface);
+ // Create EGLSurface from the Android SurfaceHolder.
+ public void createSurface(SurfaceHolder surfaceHolder) {
+ createSurfaceInternal(surfaceHolder);
}
// Create EGLSurface from the Android SurfaceTexture.
@@ -96,10 +96,10 @@
createSurfaceInternal(surfaceTexture);
}
- // Create EGLSurface from either Surface or SurfaceTexture.
- private void createSurfaceInternal(Object surface) {
- if (!(surface instanceof Surface) && !(surface instanceof SurfaceTexture)) {
- throw new IllegalStateException("Input must be either a Surface or 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 (configType == ConfigType.PIXEL_BUFFER) {
@@ -109,7 +109,7 @@
throw new RuntimeException("Already has an EGLSurface");
}
int[] surfaceAttribs = {EGL10.EGL_NONE};
- eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, surface, surfaceAttribs);
+ eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, nativeWindow, surfaceAttribs);
if (eglSurface == EGL10.EGL_NO_SURFACE) {
throw new RuntimeException("Failed to create window surface");
}
diff --git a/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java b/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java
index 99f33d7..3281074 100644
--- a/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java
+++ b/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java
@@ -173,7 +173,7 @@
@Override public void run() {
synchronized (layoutLock) {
if (isSurfaceCreated) {
- eglBase.createSurface(getHolder().getSurface());
+ eglBase.createSurface(getHolder());
eglBase.makeCurrent();
// Necessary for YUV frames with odd width.
GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);