Index: webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java |
diff --git a/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java b/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java |
index 5a54e904ad5062e7a699174fcefba1b4a04e86f0..09f78a58f4c23b583dcee1f1b34dc8a907a06566 100644 |
--- a/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java |
+++ b/webrtc/api/java/android/org/webrtc/SurfaceTextureHelper.java |
@@ -50,7 +50,8 @@ class SurfaceTextureHelper { |
/** |
* Construct a new SurfaceTextureHelper sharing OpenGL resources with |sharedContext|. A dedicated |
- * thread and handler is created for handling the SurfaceTexture. |
+ * thread and handler is created for handling the SurfaceTexture. May return null if EGL fails to |
+ * initialize a pixel buffer surface and make it current. |
*/ |
public static SurfaceTextureHelper create( |
final String threadName, final EglBase.Context sharedContext) { |
@@ -65,7 +66,12 @@ class SurfaceTextureHelper { |
return ThreadUtils.invokeUninterruptibly(handler, new Callable<SurfaceTextureHelper>() { |
@Override |
public SurfaceTextureHelper call() { |
- return new SurfaceTextureHelper(sharedContext, handler); |
+ try { |
+ return new SurfaceTextureHelper(sharedContext, handler); |
+ } catch (RuntimeException e) { |
+ Logging.e(TAG, threadName + " create failure", e); |
+ return null; |
+ } |
} |
}); |
} |
@@ -315,8 +321,16 @@ class SurfaceTextureHelper { |
this.handler = handler; |
eglBase = EglBase.create(sharedContext, EglBase.CONFIG_PIXEL_BUFFER); |
- eglBase.createDummyPbufferSurface(); |
- eglBase.makeCurrent(); |
+ try { |
+ // Both these statements have been observed to fail on rare occasions, see BUG=webrtc:5682. |
+ eglBase.createDummyPbufferSurface(); |
+ eglBase.makeCurrent(); |
+ } catch (RuntimeException e) { |
+ // Clean up before rethrowing the exception. |
+ eglBase.release(); |
+ handler.getLooper().quit(); |
+ throw e; |
+ } |
oesTextureId = GlUtil.generateTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES); |
surfaceTexture = new SurfaceTexture(oesTextureId); |