Browse Source

[camera] Update callback texture

camera_next
Vitaliy Zarubin 1 year ago
parent
commit
9a8f7c158b
  1. 5
      packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera.h
  2. 2
      packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera_egl_helper.h
  3. 47
      packages/camera/camera_aurora/aurora/texture_camera.cpp
  4. 13
      packages/camera/camera_aurora/aurora/texture_camera_egl_helper.cpp

5
packages/camera/camera_aurora/aurora/include/camera_aurora/texture_camera.h

@ -11,6 +11,9 @@
#include <QImage>
#include <QtCore>
#include <EGL/egl.h>
#include <EGL/eglext.h>
typedef std::function<void()> CameraErrorHandler;
class TextureCamera : public Aurora::StreamCamera::CameraListener
@ -43,6 +46,7 @@ private:
Aurora::StreamCamera::CameraManager *m_manager;
std::shared_ptr<Aurora::StreamCamera::Camera> m_camera;
std::shared_ptr<Aurora::StreamCamera::GraphicBuffer> 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;
};

2
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<Aurora::StreamCamera::GraphicBuffer> buffer);
static EGLImageKHR EGLCreateImage(const void* handle, void* egl_display, void* egl_contex);
static void EGLDestroyImage(EGLImageKHR image);
};

47
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<Encodable, Encodable> 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<TextureVariant> {
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<uint8_t *>(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<Encodable, Encodable> 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<Encodable, Encodable> TextureCamera::Unregister()
void TextureCamera::onCameraFrame(std::shared_ptr<Aurora::StreamCamera::GraphicBuffer> 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<uint8_t *>(m_image->bits());
m_variant = new TextureVariant(FlutterPixelBuffer{
pixels,
buffer->width,
buffer->height,
});
}
m_buffer = buffer;
m_plugin->MarkTextureAvailable(m_textureId);
}

13
packages/camera/camera_aurora/aurora/texture_camera_egl_helper.cpp

@ -3,7 +3,6 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <camera_aurora/texture_camera_egl_helper.h>
#include <flutter/platform-methods.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
@ -19,16 +18,12 @@ void TextureCameraEGLHelper::EGLInit()
eglGetProcAddress("eglDestroyImageKHR"));
}
EGLImageKHR TextureCameraEGLHelper::EGLCreateImage(
std::shared_ptr<Aurora::StreamCamera::GraphicBuffer> 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);

Loading…
Cancel
Save