From c3402fc3ef0dfebdc82f71ca0bc9a8b549539a2b Mon Sep 17 00:00:00 2001 From: magjed Date: Fri, 23 Oct 2015 18:13:15 -0700 Subject: [PATCH] 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} --- .../java/android/org/webrtc/EglBase.java | 18 +++++++++--------- .../org/webrtc/SurfaceViewRenderer.java | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/talk/app/webrtc/java/android/org/webrtc/EglBase.java b/talk/app/webrtc/java/android/org/webrtc/EglBase.java index 32c38f3f09..2ee36882e8 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 @@ public final class EglBase { 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 @@ public final class EglBase { 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 @@ public final class EglBase { 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 99f33d7d07..32810749da 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 @@ public class SurfaceViewRenderer extends SurfaceView @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);