diff --git a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java index fd02fd583a..eec6add932 100644 --- a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java +++ b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java @@ -145,8 +145,9 @@ public class SurfaceViewRenderer extends SurfaceView * |drawer|. It is allowed to call init() to reinitialize the renderer after a previous * init()/release() cycle. */ - public void init(EglBase.Context sharedContext, RendererCommon.RendererEvents rendererEvents, - int[] configAttributes, RendererCommon.GlDrawer drawer) { + public void init( + final EglBase.Context sharedContext, RendererCommon.RendererEvents rendererEvents, + final int[] configAttributes, RendererCommon.GlDrawer drawer) { synchronized (handlerLock) { if (renderThreadHandler != null) { throw new IllegalStateException(getResourceName() + "Already initialized"); @@ -156,8 +157,16 @@ public class SurfaceViewRenderer extends SurfaceView this.drawer = drawer; renderThread = new HandlerThread(TAG); renderThread.start(); - eglBase = EglBase.create(sharedContext, configAttributes); renderThreadHandler = new Handler(renderThread.getLooper()); + // Create EGL context on the newly created render thread. It should be possibly to create the + // context on this thread and make it current on the render thread, but this causes failure on + // some Marvel based JB devices. https://bugs.chromium.org/p/webrtc/issues/detail?id=6350. + ThreadUtils.invokeAtFrontUninterruptibly(renderThreadHandler, new Runnable() { + @Override + public void run() { + eglBase = EglBase.create(sharedContext, configAttributes); + } + }); } tryCreateEglSurface(); }