From fdf7eecb2418d8cc69339674b98d99c905271f1f Mon Sep 17 00:00:00 2001 From: Jia Hao Goh Date: Mon, 18 Sep 2023 20:45:34 +0800 Subject: [PATCH] Revert "Reenable HardwareBuffer backed Android Platform Views on SDK >= 29 (#44790)" This reverts commit d259a5260697d5d3e94870f9b864ef482bbacf1b. --- .../hardware_buffer_external_texture.cc | 3 +- .../engine/renderer/FlutterRenderer.java | 7 +-- .../ImageReaderPlatformViewRenderTarget.java | 51 ++++++++++--------- .../platform/PlatformViewsController.java | 3 +- .../surface_texture_external_texture.cc | 3 +- 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/shell/platform/android/hardware_buffer_external_texture.cc b/shell/platform/android/hardware_buffer_external_texture.cc index 13d76e8d871ea..0b1319d7458de 100644 --- a/shell/platform/android/hardware_buffer_external_texture.cc +++ b/shell/platform/android/hardware_buffer_external_texture.cc @@ -39,8 +39,7 @@ void HardwareBufferExternalTexture::Paint(PaintContext& context, flutter::DlCanvas::SrcRectConstraint::kStrict // enforce edges ); } else { - FML_LOG(WARNING) - << "No DlImage available for HardwareBufferExternalTexture to paint."; + FML_LOG(WARNING) << "No DlImage available."; } } diff --git a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index f1faeab73e1ef..4a1115bd44af5 100644 --- a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -336,7 +336,6 @@ public void run() { @Keep final class ImageTextureRegistryEntry implements TextureRegistry.ImageTextureEntry { - private static final String TAG = "ImageTextureRegistryEntry"; private final long id; private boolean released; private Image image; @@ -371,10 +370,8 @@ public void pushImage(Image image) { if (toClose != null) { toClose.close(); } - if (image != null) { - // Mark that we have a new frame available. - markTextureFrameAvailable(id); - } + // Mark that we have a new frame available. + markTextureFrameAvailable(id); } @Override diff --git a/shell/platform/android/io/flutter/plugin/platform/ImageReaderPlatformViewRenderTarget.java b/shell/platform/android/io/flutter/plugin/platform/ImageReaderPlatformViewRenderTarget.java index 655f7ee3bcc49..9dc93b0176d68 100644 --- a/shell/platform/android/io/flutter/plugin/platform/ImageReaderPlatformViewRenderTarget.java +++ b/shell/platform/android/io/flutter/plugin/platform/ImageReaderPlatformViewRenderTarget.java @@ -11,9 +11,10 @@ import android.view.Surface; import io.flutter.view.TextureRegistry.ImageTextureEntry; -@TargetApi(29) +@TargetApi(26) public class ImageReaderPlatformViewRenderTarget implements PlatformViewRenderTarget { private ImageTextureEntry textureEntry; + private boolean mustRecreateImageReader = false; private ImageReader reader; private int bufferWidth = 0; private int bufferHeight = 0; @@ -21,14 +22,20 @@ public class ImageReaderPlatformViewRenderTarget implements PlatformViewRenderTa private void closeReader() { if (this.reader != null) { - // Push a null image, forcing the texture entry to close any cached images. - textureEntry.pushImage(null); - // Close the reader, which also closes any produced images. this.reader.close(); this.reader = null; } } + private void recreateImageReaderIfNeeded() { + if (!mustRecreateImageReader) { + return; + } + mustRecreateImageReader = false; + closeReader(); + this.reader = createImageReader(); + } + private final Handler onImageAvailableHandler = new Handler(); private final ImageReader.OnImageAvailableListener onImageAvailableListener = new ImageReader.OnImageAvailableListener() { @@ -48,12 +55,9 @@ protected ImageReader createImageReader33() { // Allow for double buffering. builder.setMaxImages(3); // Use PRIVATE image format so that we can support video decoding. - // TODO(johnmccutchan): Should we always use PRIVATE here? It may impact our - // ability to read back texture data. If we don't always want to use it, how do we - // decide when to use it or not? Perhaps PlatformViews can indicate if they may contain - // DRM'd content. - // I need to investigate how PRIVATE impacts our ability to take screenshots or capture - // the output of Flutter application. + // TODO(johnmccutchan): Should we always use PRIVATE here? It may impact our ability + // to read back texture data. If we don't always want to use it, how do we decide when + // to use it or not? Perhaps PlatformViews can indicate if they may contain DRM'd content. builder.setImageFormat(ImageFormat.PRIVATE); // Hint that consumed images will only be read by GPU. builder.setUsage(HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE); @@ -64,15 +68,13 @@ protected ImageReader createImageReader33() { @TargetApi(29) protected ImageReader createImageReader29() { - final ImageReader reader = - ImageReader.newInstance( - bufferWidth, - bufferHeight, - ImageFormat.PRIVATE, - 2, - HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE); - reader.setOnImageAvailableListener(this.onImageAvailableListener, onImageAvailableHandler); - return reader; + return ImageReader.newInstance( + bufferWidth, bufferHeight, ImageFormat.PRIVATE, 2, HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE); + } + + @TargetApi(26) + protected ImageReader createImageReader26() { + return ImageReader.newInstance(bufferWidth, bufferHeight, ImageFormat.PRIVATE, 2); } protected ImageReader createImageReader() { @@ -80,15 +82,15 @@ protected ImageReader createImageReader() { return createImageReader33(); } else if (Build.VERSION.SDK_INT >= 29) { return createImageReader29(); + } else { + return createImageReader26(); } - throw new UnsupportedOperationException( - "ImageReaderPlatformViewRenderTarget requires API version 29+"); } public ImageReaderPlatformViewRenderTarget(ImageTextureEntry textureEntry) { - if (Build.VERSION.SDK_INT < 29) { + if (Build.VERSION.SDK_INT < 26) { throw new UnsupportedOperationException( - "ImageReaderPlatformViewRenderTarget requires API version 29+"); + "ImageReaderPlatformViewRenderTarget requires API version 26+"); } this.textureEntry = textureEntry; } @@ -125,9 +127,9 @@ public long getId() { } public void release() { - closeReader(); // textureEntry has a finalizer attached. textureEntry = null; + closeReader(); } public boolean isReleased() { @@ -135,6 +137,7 @@ public boolean isReleased() { } public Surface getSurface() { + recreateImageReaderIfNeeded(); return this.reader.getSurface(); } } diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index b783128900e2c..f9500cdf00c20 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -968,7 +968,8 @@ private void unlockInputConnection(@NonNull VirtualDisplayController controller) private static PlatformViewRenderTarget makePlatformViewRenderTarget( TextureRegistry textureRegistry) { - if (Build.VERSION.SDK_INT >= 29) { + // TODO(johnmccutchan): Enable ImageReaderPlatformViewRenderTarget for public use. + if (false) { final TextureRegistry.ImageTextureEntry textureEntry = textureRegistry.createImageTexture(); return new ImageReaderPlatformViewRenderTarget(textureEntry); } diff --git a/shell/platform/android/surface_texture_external_texture.cc b/shell/platform/android/surface_texture_external_texture.cc index de83114e32386..ff701e3978e44 100644 --- a/shell/platform/android/surface_texture_external_texture.cc +++ b/shell/platform/android/surface_texture_external_texture.cc @@ -78,8 +78,7 @@ void SurfaceTextureExternalTexture::Paint(PaintContext& context, context.canvas->DrawImage(dl_image_, {0, 0}, sampling, context.paint); } } else { - FML_LOG(WARNING) - << "No DlImage available for SurfaceTextureExternalTexture to paint."; + FML_LOG(WARNING) << "No DlImage available."; } }