diff --git a/Assets/MediaPipe/SDK/Scripts/Gpu/GlTextureBuffer.cs b/Assets/MediaPipe/SDK/Scripts/Gpu/GlTextureBuffer.cs new file mode 100644 index 000000000..95fb75078 --- /dev/null +++ b/Assets/MediaPipe/SDK/Scripts/Gpu/GlTextureBuffer.cs @@ -0,0 +1,52 @@ +using System; +using System.Runtime.InteropServices; + +using MpGlContext = System.IntPtr; +using MpGlTextureBuffer = System.IntPtr; +using GlSyncTokenPtr = System.IntPtr; + +namespace Mediapipe { + public class GlTextureBuffer : ResourceHandle { + private static UInt32 GL_TEXTURE_2D = 0x0DE1; + + private bool _disposed = false; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + public delegate void DeletionCallback(GlSyncTokenPtr ptr); + private GCHandle deletionCallbackHandle; + + private GlTextureBuffer(MpGlTextureBuffer ptr) : base(ptr) {} + + public GlTextureBuffer(UInt32 target, UInt32 name, int width, int height, + GpuBufferFormat format, DeletionCallback callback, MpGlContext glContext) + { + deletionCallbackHandle = GCHandle.Alloc(callback, GCHandleType.Pinned); + ptr = UnsafeNativeMethods.MpGlTextureBufferCreate( + target, name, width, height, (UInt32)format, Marshal.GetFunctionPointerForDelegate(callback), glContext); + + base.TakeOwnership(ptr); + } + + public GlTextureBuffer(UInt32 name, int width, int height, GpuBufferFormat format, DeletionCallback callback, MpGlContext glContext) : + this(GL_TEXTURE_2D, name, width, height, format, callback, glContext) {} + + public GlTextureBuffer(UInt32 name, int width, int height, GpuBufferFormat format, DeletionCallback callback) : + this(name, width, height, format, callback, IntPtr.Zero) {} + + protected override void Dispose(bool disposing) { + if (_disposed) return; + + if (OwnsResource()) { + UnsafeNativeMethods.MpGlTextureBufferDestroy(ptr); + } + + if (deletionCallbackHandle != null && deletionCallbackHandle.IsAllocated) { + deletionCallbackHandle.Free(); + } + + ptr = IntPtr.Zero; + + _disposed = true; + } + } +} diff --git a/Assets/MediaPipe/SDK/Scripts/Gpu/GlTextureBuffer.cs.meta b/Assets/MediaPipe/SDK/Scripts/Gpu/GlTextureBuffer.cs.meta new file mode 100644 index 000000000..547b37446 --- /dev/null +++ b/Assets/MediaPipe/SDK/Scripts/Gpu/GlTextureBuffer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fdc0e340c6497d69482b411dd1da98d1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/MediaPipe/SDK/Scripts/UnsafeNativeMethods.cs b/Assets/MediaPipe/SDK/Scripts/UnsafeNativeMethods.cs index 975ec97ca..8ac588915 100644 --- a/Assets/MediaPipe/SDK/Scripts/UnsafeNativeMethods.cs +++ b/Assets/MediaPipe/SDK/Scripts/UnsafeNativeMethods.cs @@ -10,6 +10,7 @@ using MpGlCalculatorHelper = System.IntPtr; using MpGlContext = System.IntPtr; using MpGlSyncToken = System.IntPtr; +using MpGlTextureBuffer = System.IntPtr; using MpGpuResources = System.IntPtr; using MpLandmarkList = System.IntPtr; using MpLandmarkListVector = System.IntPtr; @@ -30,6 +31,7 @@ using CacheFilePathResolverPtr = System.IntPtr; using GlContextPtr = System.IntPtr; using GlTexturePtr = System.IntPtr; +using GlTextureBufferDeletionCallbackPtr = System.IntPtr; using GlTextureInfoPtr = System.IntPtr; using GlStatusFunctionPtr = System.IntPtr; using GpuBufferPtr = System.IntPtr; @@ -175,12 +177,24 @@ internal static class UnsafeNativeMethods { public static extern unsafe GpuBufferPtr MpGlTextureGetGpuBufferFrame(GlTexturePtr glTexture); + /// GlTextureBuffer API + [DllImport (MediaPipeLibrary)] + public static extern unsafe MpGlTextureBuffer MpGlTextureBufferCreate(UInt32 target, UInt32 name, int width, int height, UInt32 formatCode, + [MarshalAs(UnmanagedType.FunctionPtr)]GlTextureBufferDeletionCallbackPtr callbackPtr, MpGlContext producerContext); + + [DllImport (MediaPipeLibrary)] + public static extern unsafe void MpGlTextureBufferDestroy(MpGlTextureBuffer glTextureBuffer); + + /// GlTextureInfo API [DllImport (MediaPipeLibrary)] public static extern unsafe int MpGlTextureInfoDestroy(GlTextureInfoPtr glTextureInfo); /// GpuBuffer API + [DllImport (MediaPipeLibrary)] + public static extern unsafe GpuBufferPtr MpGpuBufferCreate(MpGlTextureBuffer glTextureBuffer); + [DllImport (MediaPipeLibrary)] public static extern unsafe void MpGpuBufferDestroy(GpuBufferPtr gpuBuffer); diff --git a/C/mediapipe_api/gpu/BUILD b/C/mediapipe_api/gpu/BUILD index ca4ff1b22..91d0529ae 100644 --- a/C/mediapipe_api/gpu/BUILD +++ b/C/mediapipe_api/gpu/BUILD @@ -7,8 +7,20 @@ cc_library( srcs = ["gl_base.cc"], hdrs = ["gl_base.h"], deps = [ + "//mediapipe_api:common", "@com_google_mediapipe//mediapipe/gpu:gl_base", + ], + alwayslink = True, +) + +cc_library( + name = "gl_calculator_helper", + srcs = ["gl_calculator_helper.cc"], + hdrs = ["gl_calculator_helper.h"], + deps = [ "//mediapipe_api:common", + "//mediapipe_api/framework/port:status", + "@com_google_mediapipe//mediapipe/gpu:gl_calculator_helper", ], alwayslink = True, ) @@ -18,35 +30,34 @@ cc_library( srcs = ["gl_context.cc"], hdrs = ["gl_context.h"], deps = [ - "@com_google_mediapipe//mediapipe/gpu:gl_context", "//mediapipe_api:common", + "@com_google_mediapipe//mediapipe/gpu:gl_context", ], alwayslink = True, ) cc_library( - name = "gpu_shared_data_internal", - srcs = ["gpu_shared_data_internal.cc"], - hdrs = ["gpu_shared_data_internal.h"], + name = "gl_texture_buffer", + srcs = ["gl_texture_buffer.cc"], + hdrs = ["gl_texture_buffer.h"], deps = [ - "@com_google_mediapipe//mediapipe/gpu:gpu_shared_data_internal", "//mediapipe_api:common", - "//mediapipe_api/framework/port:status", - "//mediapipe_api/framework/port:statusor", + "@com_google_mediapipe//mediapipe/gpu:gl_texture_buffer", ], alwayslink = True, ) cc_library( - name = "gl_calculator_helper", - srcs = ["gl_calculator_helper.cc"], - hdrs = ["gl_calculator_helper.h"], + name = "gpu_buffer", + srcs = ["gpu_buffer.cc"], + hdrs = ["gpu_buffer.h"], deps = [ - "@com_google_mediapipe//mediapipe/gpu:gl_calculator_helper", + ":gl_texture_buffer", "//mediapipe_api:common", "//mediapipe_api/framework:packet", "//mediapipe_api/framework/port:status", "//mediapipe_api/framework/port:statusor", + "@com_google_mediapipe//mediapipe/gpu:gpu_buffer", ], alwayslink = True, ) @@ -56,8 +67,21 @@ cc_library( srcs = ["gpu_buffer_format.cc"], hdrs = ["gpu_buffer_format.h"], deps = [ + "//mediapipe_api:common", "@com_google_mediapipe//mediapipe/gpu:gpu_buffer_format", + ], + alwayslink = True, +) + +cc_library( + name = "gpu_shared_data_internal", + srcs = ["gpu_shared_data_internal.cc"], + hdrs = ["gpu_shared_data_internal.h"], + deps = [ "//mediapipe_api:common", + "//mediapipe_api/framework/port:status", + "//mediapipe_api/framework/port:statusor", + "@com_google_mediapipe//mediapipe/gpu:gpu_shared_data_internal", ], alwayslink = True, ) diff --git a/C/mediapipe_api/gpu/gl_calculator_helper.cc b/C/mediapipe_api/gpu/gl_calculator_helper.cc index 3a1d41477..e72c916ed 100644 --- a/C/mediapipe_api/gpu/gl_calculator_helper.cc +++ b/C/mediapipe_api/gpu/gl_calculator_helper.cc @@ -53,52 +53,6 @@ void MpGlTextureRelease(mediapipe::GlTexture* gl_texture) { gl_texture->Release(); } -void MpGpuBufferDestroy(mediapipe::GpuBuffer* gpu_buffer) { - delete gpu_buffer; -} - -uint32_t MpGpuBufferFormat(mediapipe::GpuBuffer* gpu_buffer) { - return static_cast(gpu_buffer->format()); -} - -int MpGpuBufferWidth(mediapipe::GpuBuffer* gpu_buffer) { - return gpu_buffer->width(); -} - -int MpGpuBufferHeight(mediapipe::GpuBuffer* gpu_buffer) { - return gpu_buffer->height(); -} - mediapipe::GpuBuffer* MpGlTextureGetGpuBufferFrame(mediapipe::GlTexture* gl_texture) { return gl_texture->GetFrame().release(); } - -MpPacket* MpMakeGpuBufferPacketAt(mediapipe::GpuBuffer* gpu_buffer, int timestamp) { - auto packet = mediapipe::Adopt(gpu_buffer).At(mediapipe::Timestamp(timestamp)); - - return new MpPacket { std::move(packet) }; -} - -mediapipe::GpuBuffer* MpPacketGetGpuBuffer(MpPacket* packet) { - auto holder = static_cast*>(mediapipe::packet_internal::GetHolder(*packet->impl)); - - return holder->Get(); -} - -MpStatusOrGpuBuffer* MpPacketConsumeGpuBuffer(MpPacket* packet) { - auto status_or_gpu_buffer = packet->impl->Consume(); - - return new MpStatusOrGpuBuffer { std::move(status_or_gpu_buffer) }; -} - -void MpStatusOrGpuBufferDestroy(MpStatusOrGpuBuffer* status_or_gpu_buffer) { - delete status_or_gpu_buffer; -} - -MpStatus* MpStatusOrGpuBufferStatus(MpStatusOrGpuBuffer* status_or_gpu_buffer) { - return new MpStatus { *status_or_gpu_buffer->status }; -} - -mediapipe::GpuBuffer* MpStatusOrGpuBufferConsumeValue(MpStatusOrGpuBuffer* gpu_buffer) { - return gpu_buffer->value.release(); -} diff --git a/C/mediapipe_api/gpu/gl_calculator_helper.h b/C/mediapipe_api/gpu/gl_calculator_helper.h index c32650859..9628d4fda 100644 --- a/C/mediapipe_api/gpu/gl_calculator_helper.h +++ b/C/mediapipe_api/gpu/gl_calculator_helper.h @@ -4,9 +4,7 @@ #include #include "mediapipe/gpu/gl_calculator_helper.h" #include "mediapipe_api/common.h" -#include "mediapipe_api/framework/packet.h" #include "mediapipe_api/framework/port/status.h" -#include "mediapipe_api/framework/port/statusor.h" extern "C" { @@ -16,7 +14,6 @@ typedef struct MpGlCalculatorHelper { MpGlCalculatorHelper() : impl { std::make_unique() } {} } MpGlCalculatorHelper; -typedef MpStatusOrValue> MpStatusOrGpuBuffer; typedef MpStatus* MpGlStatusFunction(); /** GlCalculatorHelper API */ @@ -37,19 +34,6 @@ MP_CAPI_EXPORT extern int MpGlTextureHeight(mediapipe::GlTexture* gl_texture); MP_CAPI_EXPORT extern void MpGlTextureRelease(mediapipe::GlTexture* gl_texture); MP_CAPI_EXPORT extern mediapipe::GpuBuffer* MpGlTextureGetGpuBufferFrame(mediapipe::GlTexture* gl_texture); -/** GpuBuffer API */ -MP_CAPI_EXPORT extern void MpGpuBufferDestroy(mediapipe::GpuBuffer* gpu_buffer); -MP_CAPI_EXPORT extern uint32_t MpGpuBufferFormat(mediapipe::GpuBuffer* gpu_buffer); -MP_CAPI_EXPORT extern int MpGpuBufferWidth(mediapipe::GpuBuffer* gpu_buffer); -MP_CAPI_EXPORT extern int MpGpuBufferHeight(mediapipe::GpuBuffer* gpu_buffer); - -MP_CAPI_EXPORT extern MpPacket* MpMakeGpuBufferPacketAt(mediapipe::GpuBuffer* gpu_buffer, int timestamp); -MP_CAPI_EXPORT extern mediapipe::GpuBuffer* MpPacketGetGpuBuffer(MpPacket* packet); -MP_CAPI_EXPORT extern MpStatusOrGpuBuffer* MpPacketConsumeGpuBuffer(MpPacket* packet); -MP_CAPI_EXPORT extern void MpStatusOrGpuBufferDestroy(MpStatusOrGpuBuffer* status_or_gpu_buffer); -MP_CAPI_EXPORT extern MpStatus* MpStatusOrGpuBufferStatus(MpStatusOrGpuBuffer* status_or_gpu_buffer); -MP_CAPI_EXPORT extern mediapipe::GpuBuffer* MpStatusOrGpuBufferConsumeValue(MpStatusOrGpuBuffer* status_or_gpu_buffer); - } // extern "C" #endif // C_MEDIAPIPE_API_GPU_GL_CALCULATOR_HELPER_H_ diff --git a/C/mediapipe_api/gpu/gl_texture_buffer.cc b/C/mediapipe_api/gpu/gl_texture_buffer.cc new file mode 100644 index 000000000..5d27c3f3f --- /dev/null +++ b/C/mediapipe_api/gpu/gl_texture_buffer.cc @@ -0,0 +1,22 @@ +#include "mediapipe_api/gpu/gl_texture_buffer.h" + +MpGlTextureBuffer* MpGlTextureBufferCreate(GLenum target, GLuint name, int width, int height, + uint32_t format_code, MpDeletionCallback* deletion_callback, mediapipe::GlContext* producer_context /* =nullptr */) { + auto callback = [&deletion_callback](mediapipe::GlSyncToken token) -> void { + deletion_callback(token.get()); + }; + auto buffer = std::make_shared( + GL_TEXTURE_2D, + name, + width, + height, + static_cast(format_code), + callback, + std::shared_ptr(producer_context)); + + return new MpGlTextureBuffer { std::move(buffer) }; +} + +void MpGlTextureBufferDestroy(MpGlTextureBuffer* gl_texture_buffer) { + delete gl_texture_buffer; +} diff --git a/C/mediapipe_api/gpu/gl_texture_buffer.h b/C/mediapipe_api/gpu/gl_texture_buffer.h new file mode 100644 index 000000000..40bebc1bd --- /dev/null +++ b/C/mediapipe_api/gpu/gl_texture_buffer.h @@ -0,0 +1,24 @@ +#ifndef C_MEDIAPIPE_API_GPU_GL_TEXTURE_BUFFER_H_ +#define C_MEDIAPIPE_API_GPU_GL_TEXTURE_BUFFER_H_ + +#include +#include +#include "mediapipe/gpu/gl_texture_buffer.h" +#include "mediapipe_api/common.h" + +extern "C" { + +typedef struct MpGlTextureBuffer { + std::shared_ptr impl; +} MpGlTextureBuffer; + +typedef void MpDeletionCallback(mediapipe::GlSyncPoint* gl_sync_point); + +MP_CAPI_EXPORT extern MpGlTextureBuffer* MpGlTextureBufferCreate(GLenum target, GLuint name, int width, int height, + uint32_t format_code, MpDeletionCallback* deletion_callback, mediapipe::GlContext* producer_context = nullptr); + +MP_CAPI_EXPORT extern void MpGlTextureBufferDestroy(MpGlTextureBuffer* gl_texture_buffer); + +} // extern "C" + +#endif // C_MEDIAPIPE_API_GPU_GL_TEXTURE_BUFFER_H_ diff --git a/C/mediapipe_api/gpu/gpu_buffer.cc b/C/mediapipe_api/gpu/gpu_buffer.cc new file mode 100644 index 000000000..768f40398 --- /dev/null +++ b/C/mediapipe_api/gpu/gpu_buffer.cc @@ -0,0 +1,52 @@ +#include +#include "mediapipe_api/gpu/gpu_buffer.h" + +mediapipe::GpuBuffer* MpGpuBufferCreate(MpGlTextureBuffer* gl_texture_buffer) { + return new mediapipe::GpuBuffer { gl_texture_buffer->impl }; +} + +void MpGpuBufferDestroy(mediapipe::GpuBuffer* gpu_buffer) { + delete gpu_buffer; +} + +uint32_t MpGpuBufferFormat(mediapipe::GpuBuffer* gpu_buffer) { + return static_cast(gpu_buffer->format()); +} + +int MpGpuBufferWidth(mediapipe::GpuBuffer* gpu_buffer) { + return gpu_buffer->width(); +} + +int MpGpuBufferHeight(mediapipe::GpuBuffer* gpu_buffer) { + return gpu_buffer->height(); +} + +MpPacket* MpMakeGpuBufferPacketAt(mediapipe::GpuBuffer* gpu_buffer, int timestamp) { + auto packet = mediapipe::Adopt(gpu_buffer).At(mediapipe::Timestamp(timestamp)); + + return new MpPacket { std::move(packet) }; +} + +mediapipe::GpuBuffer* MpPacketGetGpuBuffer(MpPacket* packet) { + auto holder = static_cast*>(mediapipe::packet_internal::GetHolder(*packet->impl)); + + return holder->Get(); +} + +MpStatusOrGpuBuffer* MpPacketConsumeGpuBuffer(MpPacket* packet) { + auto status_or_gpu_buffer = packet->impl->Consume(); + + return new MpStatusOrGpuBuffer { std::move(status_or_gpu_buffer) }; +} + +void MpStatusOrGpuBufferDestroy(MpStatusOrGpuBuffer* status_or_gpu_buffer) { + delete status_or_gpu_buffer; +} + +MpStatus* MpStatusOrGpuBufferStatus(MpStatusOrGpuBuffer* status_or_gpu_buffer) { + return new MpStatus { *status_or_gpu_buffer->status }; +} + +mediapipe::GpuBuffer* MpStatusOrGpuBufferConsumeValue(MpStatusOrGpuBuffer* gpu_buffer) { + return gpu_buffer->value.release(); +} diff --git a/C/mediapipe_api/gpu/gpu_buffer.h b/C/mediapipe_api/gpu/gpu_buffer.h new file mode 100644 index 000000000..dd229e341 --- /dev/null +++ b/C/mediapipe_api/gpu/gpu_buffer.h @@ -0,0 +1,31 @@ +#ifndef C_MEDIAPIPE_API_GPU_GPU_BUFFER_H_ +#define C_MEDIAPIPE_API_GPU_GPU_BUFFER_H_ + +#include +#include "mediapipe/gpu/gpu_buffer.h" +#include "mediapipe_api/common.h" +#include "mediapipe_api/framework/packet.h" +#include "mediapipe_api/framework/port/status.h" +#include "mediapipe_api/framework/port/statusor.h" +#include "mediapipe_api/gpu/gl_texture_buffer.h" + +extern "C" { + +typedef MpStatusOrValue> MpStatusOrGpuBuffer; + +MP_CAPI_EXPORT extern mediapipe::GpuBuffer* MpGpuBufferCreate(MpGlTextureBuffer* gl_texture_buffer); +MP_CAPI_EXPORT extern void MpGpuBufferDestroy(mediapipe::GpuBuffer* gpu_buffer); +MP_CAPI_EXPORT extern uint32_t MpGpuBufferFormat(mediapipe::GpuBuffer* gpu_buffer); +MP_CAPI_EXPORT extern int MpGpuBufferWidth(mediapipe::GpuBuffer* gpu_buffer); +MP_CAPI_EXPORT extern int MpGpuBufferHeight(mediapipe::GpuBuffer* gpu_buffer); + +MP_CAPI_EXPORT extern MpPacket* MpMakeGpuBufferPacketAt(mediapipe::GpuBuffer* gpu_buffer, int timestamp); +MP_CAPI_EXPORT extern mediapipe::GpuBuffer* MpPacketGetGpuBuffer(MpPacket* packet); +MP_CAPI_EXPORT extern MpStatusOrGpuBuffer* MpPacketConsumeGpuBuffer(MpPacket* packet); +MP_CAPI_EXPORT extern void MpStatusOrGpuBufferDestroy(MpStatusOrGpuBuffer* status_or_gpu_buffer); +MP_CAPI_EXPORT extern MpStatus* MpStatusOrGpuBufferStatus(MpStatusOrGpuBuffer* status_or_gpu_buffer); +MP_CAPI_EXPORT extern mediapipe::GpuBuffer* MpStatusOrGpuBufferConsumeValue(MpStatusOrGpuBuffer* status_or_gpu_buffer); + +} // extern "C" + +#endif // C_MEDIAPIPE_API_GPU_GPU_BUFFER_H_