33
44#include < android/hardware_buffer_jni.h>
55#include < android/sensor.h>
6+
7+ #include " flutter/shell/platform/android/jni/platform_view_android_jni.h"
68#include " flutter/shell/platform/android/ndk_helpers.h"
79
810namespace flutter {
@@ -23,6 +25,7 @@ void HardwareBufferExternalTexture::Paint(PaintContext& context,
2325 if (state_ == AttachmentState::kDetached ) {
2426 return ;
2527 }
28+ Attach (context);
2629 const bool should_process_frame =
2730 (!freeze && new_frame_ready_) || dl_image_ == nullptr ;
2831 if (should_process_frame) {
@@ -39,7 +42,7 @@ void HardwareBufferExternalTexture::Paint(PaintContext& context,
3942 flutter::DlCanvas::SrcRectConstraint::kStrict // enforce edges
4043 );
4144 } else {
42- FML_LOG (WARNING )
45+ FML_LOG (ERROR )
4346 << " No DlImage available for HardwareBufferExternalTexture to paint." ;
4447 }
4548}
@@ -57,53 +60,56 @@ void HardwareBufferExternalTexture::OnGrContextCreated() {
5760 state_ = AttachmentState::kUninitialized ;
5861}
5962
60- AHardwareBuffer* HardwareBufferExternalTexture::GetLatestHardwareBuffer () {
63+ // Implementing flutter::ContextListener.
64+ void HardwareBufferExternalTexture::OnGrContextDestroyed () {
65+ if (state_ == AttachmentState::kAttached ) {
66+ dl_image_.reset ();
67+ Detach ();
68+ }
69+ state_ = AttachmentState::kDetached ;
70+ }
71+
72+ JavaLocalRef HardwareBufferExternalTexture::AcquireLatestImage () {
6173 JNIEnv* env = fml::jni::AttachCurrentThread ();
6274 FML_CHECK (env != nullptr );
6375
6476 // ImageTextureEntry.acquireLatestImage.
6577 JavaLocalRef image_java = jni_facade_->ImageTextureEntryAcquireLatestImage (
6678 JavaLocalRef (image_texture_entry_));
67- if (image_java.obj () == nullptr ) {
68- return nullptr ;
69- }
79+ return image_java;
80+ }
7081
71- // Image.getHardwareBuffer.
72- JavaLocalRef hardware_buffer_java =
73- jni_facade_->ImageGetHardwareBuffer (image_java);
74- if (hardware_buffer_java.obj () == nullptr ) {
75- jni_facade_->ImageClose (image_java);
76- return nullptr ;
82+ void HardwareBufferExternalTexture::CloseImage (
83+ const fml::jni::JavaRef<jobject>& image) {
84+ if (image.obj () == nullptr ) {
85+ return ;
7786 }
87+ jni_facade_->ImageClose (JavaLocalRef (image));
88+ }
7889
79- // Convert into NDK HardwareBuffer.
80- AHardwareBuffer* latest_hardware_buffer =
81- NDKHelpers::AHardwareBuffer_fromHardwareBuffer (
82- env, hardware_buffer_java.obj ());
83- if (latest_hardware_buffer == nullptr ) {
84- jni_facade_->HardwareBufferClose (hardware_buffer_java);
85- jni_facade_->ImageClose (image_java);
86- return nullptr ;
90+ void HardwareBufferExternalTexture::CloseHardwareBuffer (
91+ const fml::jni::JavaRef<jobject>& hardware_buffer) {
92+ if (hardware_buffer.obj () == nullptr ) {
93+ return ;
8794 }
88-
89- // Keep hardware buffer alive.
90- NDKHelpers::AHardwareBuffer_acquire (latest_hardware_buffer);
91-
92- // Now that we have referenced the native hardware buffer, close the Java
93- // Image and HardwareBuffer objects.
94- jni_facade_->HardwareBufferClose (hardware_buffer_java);
95- jni_facade_->ImageClose (image_java);
96-
97- return latest_hardware_buffer;
95+ jni_facade_->HardwareBufferClose (JavaLocalRef (hardware_buffer));
9896}
9997
100- // Implementing flutter::ContextListener.
101- void HardwareBufferExternalTexture::OnGrContextDestroyed () {
102- if (state_ == AttachmentState::kAttached ) {
103- dl_image_.reset ();
104- Detach ();
98+ JavaLocalRef HardwareBufferExternalTexture::HardwareBufferFor (
99+ const fml::jni::JavaRef<jobject>& image) {
100+ if (image.obj () == nullptr ) {
101+ return JavaLocalRef ();
105102 }
106- state_ = AttachmentState::kDetached ;
103+ // Image.getHardwareBuffer.
104+ return jni_facade_->ImageGetHardwareBuffer (JavaLocalRef (image));
105+ }
106+
107+ AHardwareBuffer* HardwareBufferExternalTexture::AHardwareBufferFor (
108+ const fml::jni::JavaRef<jobject>& hardware_buffer) {
109+ JNIEnv* env = fml::jni::AttachCurrentThread ();
110+ FML_CHECK (env != nullptr );
111+ return NDKHelpers::AHardwareBuffer_fromHardwareBuffer (env,
112+ hardware_buffer.obj ());
107113}
108114
109115} // namespace flutter
0 commit comments