From 510890ba19e7e02986a0f57a7d6067e2e30284ce Mon Sep 17 00:00:00 2001 From: Mirko Bonadei Date: Wed, 17 May 2023 11:15:37 +0000 Subject: [PATCH] Revert "Avoid recreating VirtualDisplay on format changes." MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit fcd1dfad1f855346a1fb6741322ff48c61601df7. Reason for revert: Breaks downstream test. Original change's description: > Avoid recreating VirtualDisplay on format changes. > > Recreating the VirtualDisplay will require new user permission dialog, > so resize instead when possible. > > Bug: b/281978124 > Change-Id: I3b6939720897c038c9e598433372342cf72e001e > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/305560 > Reviewed-by: Xavier Lepaul‎ > Commit-Queue: Linus Nilsson > Cr-Commit-Position: refs/heads/main@{#40084} Bug: b/281978124, b/283063961 Change-Id: I8ec2ba3321be225a673af2a6192819a8a1b79b2c No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/305641 Owners-Override: Mirko Bonadei Commit-Queue: Mirko Bonadei Bot-Commit: rubber-stamper@appspot.gserviceaccount.com Cr-Commit-Position: refs/heads/main@{#40085} --- .../api/org/webrtc/ScreenCapturerAndroid.java | 31 ++++++------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/sdk/android/api/org/webrtc/ScreenCapturerAndroid.java b/sdk/android/api/org/webrtc/ScreenCapturerAndroid.java index 0a9d7dac2a..231d507155 100644 --- a/sdk/android/api/org/webrtc/ScreenCapturerAndroid.java +++ b/sdk/android/api/org/webrtc/ScreenCapturerAndroid.java @@ -17,8 +17,6 @@ import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.view.Surface; import androidx.annotation.Nullable; @@ -115,7 +113,7 @@ public class ScreenCapturerAndroid implements VideoCapturer, VideoSink { // Let MediaProjection callback use the SurfaceTextureHelper thread. mediaProjection.registerCallback(mediaProjectionCallback, surfaceTextureHelper.getHandler()); - updateVirtualDisplay(); + createVirtualDisplay(); capturerObserver.onCapturerStarted(true); surfaceTextureHelper.startListening(ScreenCapturerAndroid.this); } @@ -173,33 +171,24 @@ public class ScreenCapturerAndroid implements VideoCapturer, VideoSink { this.height = height; if (virtualDisplay == null) { - // Capturer is stopped, the virtual display will be created in startCapture(). + // Capturer is stopped, the virtual display will be created in startCaptuer(). return; } // Create a new virtual display on the surfaceTextureHelper thread to avoid interference // with frame processing, which happens on the same thread (we serialize events by running // them on the same thread). - ThreadUtils.invokeAtFrontUninterruptibly( - surfaceTextureHelper.getHandler(), this::updateVirtualDisplay); + ThreadUtils.invokeAtFrontUninterruptibly(surfaceTextureHelper.getHandler(), new Runnable() { + @Override + public void run() { + virtualDisplay.release(); + createVirtualDisplay(); + } + }); } - private void updateVirtualDisplay() { - surfaceTextureHelper.setTextureSize(width, height); - // Before Android S (12), resizing the virtual display can cause the captured screen to be - // scaled incorrectly (b/260606562), so keep the behavior of recreating the virtual display - // prior to Android S. - if (virtualDisplay == null || VERSION.SDK_INT < VERSION_CODES.S) { - createVirtualDisplay(); - } else { - virtualDisplay.resize(width, height, VIRTUAL_DISPLAY_DPI); - virtualDisplay.setSurface(new Surface(surfaceTextureHelper.getSurfaceTexture())); - } - } private void createVirtualDisplay() { - if (virtualDisplay != null) { - virtualDisplay.release(); - } + surfaceTextureHelper.setTextureSize(width, height); virtualDisplay = mediaProjection.createVirtualDisplay("WebRTC_ScreenCapture", width, height, VIRTUAL_DISPLAY_DPI, DISPLAY_FLAGS, new Surface(surfaceTextureHelper.getSurfaceTexture()), null /* callback */, null /* callback handler */);