From 31f18e164e01fbac09434774a7e5e4aa9f8da6fb Mon Sep 17 00:00:00 2001 From: Magnus Jedvert Date: Tue, 4 Jun 2019 11:11:11 +0200 Subject: [PATCH] Android SurfaceTextureHelper: Avoid crashing if size hasn't been set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SurfaceTextureHelper currently crashes if an OES texture is produced before setTextureSize() has been called. This is annoying if the texture size is not easily known beforehand. A real world example is MediaPlayer that provides the video size with an asynchronous call to setOnVideoSizeChangedListener(), but that might happen after the first texture is produced on some devices. This CL waits with delivering frames until the size has been sent, rather than crashing. Bug: webrtc:10709 Change-Id: I5d9ce542e0edaafe1153fd5fe7d64dba86d7e33c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/140080 Reviewed-by: Sami Kalliomäki Commit-Queue: Magnus Jedvert Cr-Commit-Position: refs/heads/master@{#28151} --- sdk/android/api/org/webrtc/SurfaceTextureHelper.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sdk/android/api/org/webrtc/SurfaceTextureHelper.java b/sdk/android/api/org/webrtc/SurfaceTextureHelper.java index f11b70b6d6..b8f5624d89 100644 --- a/sdk/android/api/org/webrtc/SurfaceTextureHelper.java +++ b/sdk/android/api/org/webrtc/SurfaceTextureHelper.java @@ -205,6 +205,7 @@ public class SurfaceTextureHelper { handler.post(() -> { this.textureWidth = textureWidth; this.textureHeight = textureHeight; + tryDeliverTextureFrame(); }); } @@ -286,6 +287,12 @@ public class SurfaceTextureHelper { if (isQuitting || !hasPendingTexture || isTextureInUse || listener == null) { return; } + if (textureWidth == 0 || textureHeight == 0) { + // Information about the resolution needs to be provided by a call to setTextureSize() before + // frames are produced. + Logging.w(TAG, "Texture size has not been set."); + return; + } isTextureInUse = true; hasPendingTexture = false; @@ -297,9 +304,6 @@ public class SurfaceTextureHelper { if (timestampAligner != null) { timestampNs = timestampAligner.translateTimestamp(timestampNs); } - if (textureWidth == 0 || textureHeight == 0) { - throw new RuntimeException("Texture size has not been set."); - } final VideoFrame.Buffer buffer = new TextureBufferImpl(textureWidth, textureHeight, TextureBuffer.Type.OES, oesTextureId, RendererCommon.convertMatrixToAndroidGraphicsMatrix(transformMatrix), handler,