From 9a8f7c158bdfe4550b67a7331391ae96fac1f7f2 Mon Sep 17 00:00:00 2001 From: Vitaliy Zarubin Date: Thu, 9 Nov 2023 13:23:50 +0300 Subject: [PATCH] [camera] Update callback texture --- .../include/camera_aurora/texture_camera.h | 5 +- .../camera_aurora/texture_camera_egl_helper.h | 2 +- .../camera_aurora/aurora/texture_camera.cpp | 47 ++++++++++--------- .../aurora/texture_camera_egl_helper.cpp | 13 ++--- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera.h b/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera.h index d4c70e1..c2dc9d5 100644 --- a/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera.h +++ b/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera.h @@ -11,6 +11,9 @@ #include #include +#include +#include + typedef std::function CameraErrorHandler; class TextureCamera : public Aurora::StreamCamera::CameraListener @@ -43,6 +46,7 @@ private: Aurora::StreamCamera::CameraManager *m_manager; std::shared_ptr m_camera; + std::shared_ptr m_buffer; int64_t m_textureId = 0; size_t m_captureWidth = 0; @@ -50,7 +54,6 @@ private: size_t m_viewWidth = 0; size_t m_viewHeight = 0; - TextureVariant *m_variant; QImage *m_image; }; diff --git a/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera_egl_helper.h b/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera_egl_helper.h index d198663..8281483 100644 --- a/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera_egl_helper.h +++ b/packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera_egl_helper.h @@ -14,7 +14,7 @@ class TextureCameraEGLHelper { public: static void EGLInit(); - static EGLImageKHR EGLCreateImage(std::shared_ptr buffer); + static EGLImageKHR EGLCreateImage(const void* handle, void* egl_display, void* egl_contex); static void EGLDestroyImage(EGLImageKHR image); }; diff --git a/packages/camera/camera_aurora/aurora/texture_camera.cpp b/packages/camera/camera_aurora/aurora/texture_camera.cpp index 8560ba7..9d149a7 100644 --- a/packages/camera/camera_aurora/aurora/texture_camera.cpp +++ b/packages/camera/camera_aurora/aurora/texture_camera.cpp @@ -15,7 +15,7 @@ TextureCamera::TextureCamera(TextureRegistrar *plugin, const CameraErrorHandler &onError) : m_plugin(plugin) , m_onError(onError) - , m_variant(nullptr) + , m_buffer(nullptr) , m_image(nullptr) , m_manager(StreamCameraManager()) { @@ -155,8 +155,28 @@ void TextureCamera::StopCapture() std::map TextureCamera::Register(std::string cameraName) { m_textureId = m_plugin->RegisterTexture( - [this]([[maybe_unused]] size_t width, [[maybe_unused]] size_t height) { - return m_variant; + [this]([[maybe_unused]] size_t width, [[maybe_unused]] size_t height, void* egl_display, void* egl_context) -> std::optional { + if (m_buffer) { + if (m_buffer->handleType == Aurora::StreamCamera::HandleType::EGL) { + auto eglImage = TextureCameraEGLHelper::EGLCreateImage(m_buffer->handle, egl_display, egl_context); + if (eglImage != EGL_NO_IMAGE_KHR) { + return std::make_optional(TextureVariant(FlutterEGLImage{ + eglImage, + m_buffer->width, + m_buffer->height, + })); + } + } else { + m_image = TextureCameraPixelsHelper::YUVtoARGB(m_buffer->mapYCbCr()); + auto pixels = static_cast(m_image->bits()); + return std::make_optional(TextureVariant(FlutterPixelBuffer{ + pixels, + m_buffer->width, + m_buffer->height, + })); + } + } + return std::nullopt; }); if (CreateCamera(cameraName) && m_viewWidth != 0 && m_viewHeight != 0) { @@ -174,7 +194,7 @@ std::map TextureCamera::Unregister() m_textureId = 0; m_captureWidth = 0; m_captureHeight = 0; - m_variant = nullptr; + m_buffer = nullptr; m_camera = nullptr; m_plugin->UnregisterTexture(m_textureId); @@ -184,24 +204,7 @@ std::map TextureCamera::Unregister() void TextureCamera::onCameraFrame(std::shared_ptr buffer) { - if (buffer->handleType == Aurora::StreamCamera::HandleType::EGL && false) { - // @todo not tested - auto eglImage = TextureCameraEGLHelper::EGLCreateImage(buffer); - m_variant = new TextureVariant(FlutterEGLImage{ - eglImage, - buffer->width, - buffer->height, - }); - } else { - m_image = TextureCameraPixelsHelper::YUVtoARGB(buffer->mapYCbCr()); - auto pixels = static_cast(m_image->bits()); - m_variant = new TextureVariant(FlutterPixelBuffer{ - pixels, - buffer->width, - buffer->height, - }); - } - + m_buffer = buffer; m_plugin->MarkTextureAvailable(m_textureId); } diff --git a/packages/camera/camera_aurora/aurora/texture_camera_egl_helper.cpp b/packages/camera/camera_aurora/aurora/texture_camera_egl_helper.cpp index 843a056..27cadb6 100644 --- a/packages/camera/camera_aurora/aurora/texture_camera_egl_helper.cpp +++ b/packages/camera/camera_aurora/aurora/texture_camera_egl_helper.cpp @@ -3,7 +3,6 @@ * SPDX-License-Identifier: BSD-3-Clause */ #include -#include #include #include @@ -19,16 +18,12 @@ void TextureCameraEGLHelper::EGLInit() eglGetProcAddress("eglDestroyImageKHR")); } -EGLImageKHR TextureCameraEGLHelper::EGLCreateImage( - std::shared_ptr buffer) +EGLImageKHR TextureCameraEGLHelper::EGLCreateImage(const void *handle, void *egl_display, void *egl_context) { - auto display = PlatformMethods::GetEGLDisplay(); - auto context = PlatformMethods::GetEGLContext(); - - const void *handle = buffer->handle; GLint eglImgAttrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE, EGL_NONE}; - return eglCreateImageKHR(display, - context, + + return eglCreateImageKHR((EGLDisplay) egl_display, + (EGLContext) egl_context, EGL_NATIVE_BUFFER_ANDROID, (EGLClientBuffer) handle, eglImgAttrs);