From 1d5240e4e7a868401c57376582b84586c1495923 Mon Sep 17 00:00:00 2001 From: homuler Date: Sun, 7 Feb 2021 18:07:11 +0900 Subject: [PATCH] feat: StringPacket can contain null bytes - StringPacket constructor receives a string and its length - *_Rtimestamp -> *_Rt, *_Rpacket -> *_Rp --- .../SDK/Scripts/Core/MpResourceHandle.cs | 3 +- .../Scripts/Framework/Formats/ImageFrame.cs | 1 - .../Scripts/Framework/Packet/BoolPacket.cs | 2 +- .../Framework/Packet/FloatArrayPacket.cs | 2 +- .../Scripts/Framework/Packet/FloatPacket.cs | 2 +- .../Framework/Packet/ImageFramePacket.cs | 2 +- .../SDK/Scripts/Framework/Packet/IntPacket.cs | 2 +- .../SDK/Scripts/Framework/Packet/Packet.cs | 2 +- .../Scripts/Framework/Packet/SidePacket.cs | 2 +- .../Scripts/Framework/Packet/StringPacket.cs | 25 ++++++++- .../Framework/Format/ImageFrame_Unsafe.cs | 2 +- .../NativeMethods/Framework/Packet_Unsafe.cs | 23 +++++--- .../Framework/Packet/StringPacketTest.cs | 36 ++++++++++++- .../framework/formats/image_frame.cc | 6 +-- .../framework/formats/image_frame.h | 6 +-- C/mediapipe_api/framework/packet.cc | 52 +++++++++++++++---- C/mediapipe_api/framework/packet.h | 30 ++++++----- 17 files changed, 149 insertions(+), 49 deletions(-) diff --git a/Assets/MediaPipe/SDK/Scripts/Core/MpResourceHandle.cs b/Assets/MediaPipe/SDK/Scripts/Core/MpResourceHandle.cs index f0f00d0c8..f1e389ae2 100644 --- a/Assets/MediaPipe/SDK/Scripts/Core/MpResourceHandle.cs +++ b/Assets/MediaPipe/SDK/Scripts/Core/MpResourceHandle.cs @@ -56,10 +56,11 @@ protected void ReleaseMpPtr() { protected delegate MpReturnCode StringOutFunc(IntPtr ptr, out IntPtr strPtr); protected string MarshalStringFromNative(StringOutFunc f) { f(mpPtr, out var strPtr).Assert(); + GC.KeepAlive(this); + var str = Marshal.PtrToStringAnsi(strPtr); UnsafeNativeMethods.delete_array__PKc(strPtr); - GC.KeepAlive(this); return str; } } diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Formats/ImageFrame.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Formats/ImageFrame.cs index ad46761c4..6df2e4ff8 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Formats/ImageFrame.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Formats/ImageFrame.cs @@ -1,5 +1,4 @@ using System; -using System.Runtime.InteropServices; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using UnityEngine; diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/BoolPacket.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/BoolPacket.cs index 9a1208df3..7bfef1f56 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/BoolPacket.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/BoolPacket.cs @@ -12,7 +12,7 @@ public BoolPacket(bool value) : base() { } public BoolPacket(bool value, Timestamp timestamp) : base() { - UnsafeNativeMethods.mp__MakeBoolPacket_At__b_Rtimestamp(value, timestamp.mpPtr, out var ptr).Assert(); + UnsafeNativeMethods.mp__MakeBoolPacket_At__b_Rt(value, timestamp.mpPtr, out var ptr).Assert(); GC.KeepAlive(timestamp); this.ptr = ptr; } diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatArrayPacket.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatArrayPacket.cs index b1c10c69d..29de655d7 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatArrayPacket.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatArrayPacket.cs @@ -26,7 +26,7 @@ public FloatArrayPacket(float[] value) : base() { } public FloatArrayPacket(float[] value, Timestamp timestamp) : base() { - UnsafeNativeMethods.mp__MakeFloatArrayPacket_At__Pf_i_Rtimestamp(value, value.Length, timestamp.mpPtr, out var ptr).Assert(); + UnsafeNativeMethods.mp__MakeFloatArrayPacket_At__Pf_i_Rt(value, value.Length, timestamp.mpPtr, out var ptr).Assert(); GC.KeepAlive(timestamp); this.ptr = ptr; Length = value.Length; diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatPacket.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatPacket.cs index 4fd631280..2915c7a1d 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatPacket.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/FloatPacket.cs @@ -12,7 +12,7 @@ public FloatPacket(float value) : base() { } public FloatPacket(float value, Timestamp timestamp) : base() { - UnsafeNativeMethods.mp__MakeFloatPacket_At__f_Rtimestamp(value, timestamp.mpPtr, out var ptr).Assert(); + UnsafeNativeMethods.mp__MakeFloatPacket_At__f_Rt(value, timestamp.mpPtr, out var ptr).Assert(); GC.KeepAlive(timestamp); this.ptr = ptr; } diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/ImageFramePacket.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/ImageFramePacket.cs index 0e8074948..59431476c 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/ImageFramePacket.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/ImageFramePacket.cs @@ -14,7 +14,7 @@ public ImageFramePacket(ImageFrame imageFrame) : base() { } public ImageFramePacket(ImageFrame imageFrame, Timestamp timestamp) : base() { - UnsafeNativeMethods.mp__MakeImageFramePacket_At__Pif_Rtimestamp(imageFrame.mpPtr, timestamp.mpPtr, out var ptr).Assert(); + UnsafeNativeMethods.mp__MakeImageFramePacket_At__Pif_Rt(imageFrame.mpPtr, timestamp.mpPtr, out var ptr).Assert(); GC.KeepAlive(timestamp); imageFrame.Dispose(); // respect move semantics diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/IntPacket.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/IntPacket.cs index 973b843c9..11b28d2a9 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/IntPacket.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/IntPacket.cs @@ -12,7 +12,7 @@ public IntPacket(int value) : base() { } public IntPacket(int value, Timestamp timestamp) : base() { - UnsafeNativeMethods.mp__MakeIntPacket_At__i_Rtimestamp(value, timestamp.mpPtr, out var ptr).Assert(); + UnsafeNativeMethods.mp__MakeIntPacket_At__i_Rt(value, timestamp.mpPtr, out var ptr).Assert(); GC.KeepAlive(timestamp); this.ptr = ptr; } diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/Packet.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/Packet.cs index 71669cfd7..5bc4f3bd6 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/Packet.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/Packet.cs @@ -23,7 +23,7 @@ public Packet(IntPtr ptr, bool isOwner = true) : base(ptr, isOwner) {} /// To avoid copying the value, instantiate the packet with timestamp /// New packet with the given timestamp and the copied value public Packet At(Timestamp timestamp) { - UnsafeNativeMethods.mp_Packet__At__Rtimestamp(mpPtr, timestamp.mpPtr, out var packetPtr).Assert(); + UnsafeNativeMethods.mp_Packet__At__Rt(mpPtr, timestamp.mpPtr, out var packetPtr).Assert(); GC.KeepAlive(timestamp); return (Packet)Activator.CreateInstance(this.GetType(), packetPtr, true); diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/SidePacket.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/SidePacket.cs index 010121ba4..d4a249140 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/SidePacket.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/SidePacket.cs @@ -29,7 +29,7 @@ public T At(string key) { } public void Emplace(string key, Packet packet) { - UnsafeNativeMethods.mp_SidePacket__emplace__PKc_Rpacket(mpPtr, key, packet.mpPtr).Assert(); + UnsafeNativeMethods.mp_SidePacket__emplace__PKc_Rp(mpPtr, key, packet.mpPtr).Assert(); packet.Dispose(); // respect move semantics GC.KeepAlive(this); } diff --git a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/StringPacket.cs b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/StringPacket.cs index b1192b6f4..e75a46e66 100644 --- a/Assets/MediaPipe/SDK/Scripts/Framework/Packet/StringPacket.cs +++ b/Assets/MediaPipe/SDK/Scripts/Framework/Packet/StringPacket.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; namespace Mediapipe { public class StringPacket : Packet { @@ -11,8 +12,19 @@ public StringPacket(string value) : base() { this.ptr = ptr; } + public StringPacket(byte[] bytes) : base() { + UnsafeNativeMethods.mp__MakeStringPacket__PKc_i(bytes, bytes.Length, out var ptr).Assert(); + this.ptr = ptr; + } + public StringPacket(string value, Timestamp timestamp) : base() { - UnsafeNativeMethods.mp__MakeStringPacket_At__PKc_Rtimestamp(value, timestamp.mpPtr, out var ptr).Assert(); + UnsafeNativeMethods.mp__MakeStringPacket_At__PKc_Rt(value, timestamp.mpPtr, out var ptr).Assert(); + GC.KeepAlive(timestamp); + this.ptr = ptr; + } + + public StringPacket(byte[] bytes, Timestamp timestamp) : base() { + UnsafeNativeMethods.mp__MakeStringPacket_At__PKc_i_Rt(bytes, bytes.Length, timestamp.mpPtr, out var ptr).Assert(); GC.KeepAlive(timestamp); this.ptr = ptr; } @@ -21,6 +33,17 @@ public override string Get() { return MarshalStringFromNative(UnsafeNativeMethods.mp_Packet__GetString); } + public byte[] GetByteArray() { + UnsafeNativeMethods.mp_Packet__GetByteString(mpPtr, out var strPtr, out int size); + GC.KeepAlive(this); + + var bytes = new byte[size]; + Marshal.Copy(strPtr, bytes, 0, size); + UnsafeNativeMethods.delete_array__PKc(strPtr); + + return bytes; + } + public override StatusOr Consume() { throw new NotSupportedException(); } diff --git a/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Format/ImageFrame_Unsafe.cs b/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Format/ImageFrame_Unsafe.cs index dbb7e7779..6b9ccbebf 100644 --- a/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Format/ImageFrame_Unsafe.cs +++ b/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Format/ImageFrame_Unsafe.cs @@ -49,7 +49,7 @@ public static extern MpReturnCode mp_ImageFrame__ui_i_i_i_Pui8_PF( public static extern MpReturnCode mp__MakeImageFramePacket__Pif(IntPtr imageFrame, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp__MakeImageFramePacket_At__Pif_Rtimestamp(IntPtr imageFrame, IntPtr timestamp, out IntPtr packet); + public static extern MpReturnCode mp__MakeImageFramePacket_At__Pif_Rt(IntPtr imageFrame, IntPtr timestamp, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__ConsumeImageFrame(IntPtr packet, out IntPtr statusOrImageFrame); diff --git a/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs b/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs index 9c53e2b81..a48b37452 100644 --- a/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs +++ b/Assets/MediaPipe/SDK/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs @@ -11,7 +11,7 @@ internal static partial class UnsafeNativeMethods { public static extern void mp_Packet__delete(IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp_Packet__At__Rtimestamp(IntPtr packet, IntPtr timestamp, out IntPtr newPacket); + public static extern MpReturnCode mp_Packet__At__Rt(IntPtr packet, IntPtr timestamp, out IntPtr newPacket); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__ValidateAsProtoMessageLite(IntPtr packet, out IntPtr status); @@ -34,7 +34,7 @@ internal static partial class UnsafeNativeMethods { public static extern MpReturnCode mp__MakeBoolPacket__b([MarshalAs(UnmanagedType.I1)] bool value, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp__MakeBoolPacket_At__b_Rtimestamp([MarshalAs(UnmanagedType.I1)] bool value, IntPtr timestamp, out IntPtr packet); + public static extern MpReturnCode mp__MakeBoolPacket_At__b_Rt([MarshalAs(UnmanagedType.I1)] bool value, IntPtr timestamp, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__GetBool(IntPtr packet, [MarshalAs(UnmanagedType.I1)]out bool value); @@ -48,7 +48,7 @@ internal static partial class UnsafeNativeMethods { public static extern MpReturnCode mp__MakeFloatPacket__f(float value, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp__MakeFloatPacket_At__f_Rtimestamp(float value, IntPtr timestamp, out IntPtr packet); + public static extern MpReturnCode mp__MakeFloatPacket_At__f_Rt(float value, IntPtr timestamp, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__GetFloat(IntPtr packet, out float value); @@ -62,7 +62,7 @@ internal static partial class UnsafeNativeMethods { public static extern MpReturnCode mp__MakeIntPacket__i(int value, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp__MakeIntPacket_At__i_Rtimestamp(int value, IntPtr timestamp, out IntPtr packet); + public static extern MpReturnCode mp__MakeIntPacket_At__i_Rt(int value, IntPtr timestamp, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__GetInt(IntPtr packet, out int value); @@ -76,7 +76,7 @@ internal static partial class UnsafeNativeMethods { public static extern MpReturnCode mp__MakeFloatArrayPacket__Pf_i(float[] value, int size, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp__MakeFloatArrayPacket_At__Pf_i_Rtimestamp(float[] value, int size, IntPtr timestamp, out IntPtr packet); + public static extern MpReturnCode mp__MakeFloatArrayPacket_At__Pf_i_Rt(float[] value, int size, IntPtr timestamp, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__GetFloatArray(IntPtr packet, out IntPtr value); @@ -90,11 +90,20 @@ internal static partial class UnsafeNativeMethods { public static extern MpReturnCode mp__MakeStringPacket__PKc(string value, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp__MakeStringPacket_At__PKc_Rtimestamp(string value, IntPtr timestamp, out IntPtr packet); + public static extern MpReturnCode mp__MakeStringPacket_At__PKc_Rt(string value, IntPtr timestamp, out IntPtr packet); + + [DllImport (MediaPipeLibrary, ExactSpelling = true)] + public static extern MpReturnCode mp__MakeStringPacket__PKc_i(byte[] bytes, int size, out IntPtr packet); + + [DllImport (MediaPipeLibrary, ExactSpelling = true)] + public static extern MpReturnCode mp__MakeStringPacket_At__PKc_i_Rt(byte[] bytes, int size, IntPtr timestamp, out IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__GetString(IntPtr packet, out IntPtr value); + [DllImport (MediaPipeLibrary, ExactSpelling = true)] + public static extern MpReturnCode mp_Packet__GetByteString(IntPtr packet, out IntPtr value, out int size); + [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__ValidateAsString(IntPtr packet, out IntPtr status); #endregion @@ -107,7 +116,7 @@ internal static partial class UnsafeNativeMethods { public static extern void mp_SidePacket__delete(IntPtr sidePacket); [DllImport (MediaPipeLibrary, ExactSpelling = true)] - public static extern MpReturnCode mp_SidePacket__emplace__PKc_Rpacket(IntPtr sidePacket, string key, IntPtr packet); + public static extern MpReturnCode mp_SidePacket__emplace__PKc_Rp(IntPtr sidePacket, string key, IntPtr packet); [DllImport (MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_SidePacket__at__PKc(IntPtr sidePacket, string key, out IntPtr packet); diff --git a/Assets/MediaPipe/SDK/Tests/EditMode/Framework/Packet/StringPacketTest.cs b/Assets/MediaPipe/SDK/Tests/EditMode/Framework/Packet/StringPacketTest.cs index 2c241fc49..35d866875 100644 --- a/Assets/MediaPipe/SDK/Tests/EditMode/Framework/Packet/StringPacketTest.cs +++ b/Assets/MediaPipe/SDK/Tests/EditMode/Framework/Packet/StringPacketTest.cs @@ -16,7 +16,7 @@ public void Ctor_ShouldInstantiatePacket_When_CalledWithNoArguments() { } [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValue() { + public void Ctor_ShouldInstantiatePacket_When_CalledWithString() { var packet = new StringPacket("test"); Assert.True(packet.ValidateAsType().ok); @@ -25,7 +25,17 @@ public void Ctor_ShouldInstantiatePacket_When_CalledWithValue() { } [Test] - public void Ctor_ShouldInstantiatePacket_When_CalledWithValueAndTimestamp() { + public void Ctor_ShouldInstantiatePacket_When_CalledWithByteArray() { + byte[] bytes = new byte[] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }; + var packet = new StringPacket(bytes); + + Assert.True(packet.ValidateAsType().ok); + Assert.AreEqual(packet.Get(), "test"); + Assert.AreEqual(packet.Timestamp(), Timestamp.Unset()); + } + + [Test] + public void Ctor_ShouldInstantiatePacket_When_CalledWithStringAndTimestamp() { var timestamp = new Timestamp(1); var packet = new StringPacket("test", timestamp); @@ -33,6 +43,17 @@ public void Ctor_ShouldInstantiatePacket_When_CalledWithValueAndTimestamp() { Assert.AreEqual(packet.Get(), "test"); Assert.AreEqual(packet.Timestamp(), timestamp); } + + [Test] + public void Ctor_ShouldInstantiatePacket_When_CalledWithByteArrayAndTimestamp() { + var timestamp = new Timestamp(1); + byte[] bytes = new byte[] { (byte)'t', (byte)'e', (byte)'s', (byte)'t' }; + var packet = new StringPacket(bytes, timestamp); + + Assert.True(packet.ValidateAsType().ok); + Assert.AreEqual(packet.Get(), "test"); + Assert.AreEqual(packet.Timestamp(), timestamp); + } #endregion #region #isDisposed @@ -52,6 +73,17 @@ public void isDisposed_ShouldReturnTrue_When_AlreadyDisposed() { } #endregion + #region #GetByteArray + [Test] + public void GetByteArray_ShouldReturnByteArray() { + byte[] bytes = new byte[] { (byte)'a', (byte)'b', 0, (byte)'c' }; + var packet = new StringPacket(bytes); + + Assert.AreEqual(packet.GetByteArray(), bytes); + Assert.AreEqual(packet.Get(), "ab"); + } + #endregion + #region #Consume [Test] public void Consume_ShouldThrowNotSupportedException() { diff --git a/C/mediapipe_api/framework/formats/image_frame.cc b/C/mediapipe_api/framework/formats/image_frame.cc index f71b0ec36..25aa1950e 100644 --- a/C/mediapipe_api/framework/formats/image_frame.cc +++ b/C/mediapipe_api/framework/formats/image_frame.cc @@ -163,9 +163,9 @@ MpReturnCode mp__MakeImageFramePacket__Pif(mediapipe::ImageFrame* image_frame, m } CATCH_EXCEPTION } -MpReturnCode mp__MakeImageFramePacket_At__Pif_Rtimestamp(mediapipe::ImageFrame* image_frame, - mediapipe::Timestamp* timestamp, - mediapipe::Packet** packet_out) { +MpReturnCode mp__MakeImageFramePacket_At__Pif_Rt(mediapipe::ImageFrame* image_frame, + mediapipe::Timestamp* timestamp, + mediapipe::Packet** packet_out) { TRY { *packet_out = new mediapipe::Packet { mediapipe::MakePacket(std::move(*image_frame)).At(*timestamp) }; RETURN_CODE(MpReturnCode::Success); diff --git a/C/mediapipe_api/framework/formats/image_frame.h b/C/mediapipe_api/framework/formats/image_frame.h index f6972d3f2..0886045f2 100644 --- a/C/mediapipe_api/framework/formats/image_frame.h +++ b/C/mediapipe_api/framework/formats/image_frame.h @@ -57,9 +57,9 @@ MP_CAPI(MpReturnCode) mp_StatusOrImageFrame__ConsumeValueOrDie(StatusOrImageFram // Packet API MP_CAPI(MpReturnCode) mp__MakeImageFramePacket__Pif(mediapipe::ImageFrame* image_frame, mediapipe::Packet** packet_out); -MP_CAPI(MpReturnCode) mp__MakeImageFramePacket_At__Pif_Rtimestamp(mediapipe::ImageFrame* image_frame, - mediapipe::Timestamp* timestamp, - mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeImageFramePacket_At__Pif_Rt(mediapipe::ImageFrame* image_frame, + mediapipe::Timestamp* timestamp, + mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_Packet__ConsumeImageFrame(mediapipe::Packet* packet, StatusOrImageFrame** value_out); MP_CAPI(MpReturnCode) mp_Packet__GetImageFrame(mediapipe::Packet* packet, const mediapipe::ImageFrame** value_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsImageFrame(mediapipe::Packet* packet, mediapipe::Status** status_out); diff --git a/C/mediapipe_api/framework/packet.cc b/C/mediapipe_api/framework/packet.cc index 7f9af6dd8..9d2bc649b 100644 --- a/C/mediapipe_api/framework/packet.cc +++ b/C/mediapipe_api/framework/packet.cc @@ -13,7 +13,7 @@ void mp_Packet__delete(mediapipe::Packet* packet) { delete packet; } -MpReturnCode mp_Packet__At__Rtimestamp(mediapipe::Packet* packet, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { +MpReturnCode mp_Packet__At__Rt(mediapipe::Packet* packet, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { TRY { // not move but copy *packet_out = new mediapipe::Packet { packet->At(*timestamp) }; @@ -64,7 +64,7 @@ MpReturnCode mp__MakeBoolPacket__b(bool value, mediapipe::Packet** packet_out) { } CATCH_EXCEPTION } -MpReturnCode mp__MakeBoolPacket_At__b_Rtimestamp(bool value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { +MpReturnCode mp__MakeBoolPacket_At__b_Rt(bool value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { TRY { *packet_out = new mediapipe::Packet { mediapipe::MakePacket(value).At(*timestamp) }; RETURN_CODE(MpReturnCode::Success); @@ -93,7 +93,7 @@ MpReturnCode mp__MakeFloatPacket__f(float value, mediapipe::Packet** packet_out) } CATCH_EXCEPTION } -MpReturnCode mp__MakeFloatPacket_At__f_Rtimestamp(float value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { +MpReturnCode mp__MakeFloatPacket_At__f_Rt(float value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { TRY { *packet_out = new mediapipe::Packet { mediapipe::MakePacket(value).At(*timestamp) }; RETURN_CODE(MpReturnCode::Success); @@ -122,7 +122,7 @@ MpReturnCode mp__MakeIntPacket__i(int value, mediapipe::Packet** packet_out) { } CATCH_EXCEPTION } -MpReturnCode mp__MakeIntPacket_At__i_Rtimestamp(int value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { +MpReturnCode mp__MakeIntPacket_At__i_Rt(int value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { TRY { *packet_out = new mediapipe::Packet { mediapipe::MakePacket(value).At(*timestamp) }; RETURN_CODE(MpReturnCode::Success); @@ -153,10 +153,10 @@ MpReturnCode mp__MakeFloatArrayPacket__Pf_i(float* value, int size, mediapipe::P } CATCH_EXCEPTION } -MpReturnCode mp__MakeFloatArrayPacket_At__Pf_i_Rtimestamp(float* value, - int size, - mediapipe::Timestamp* timestamp, - mediapipe::Packet** packet_out) { +MpReturnCode mp__MakeFloatArrayPacket_At__Pf_i_Rt(float* value, + int size, + mediapipe::Timestamp* timestamp, + mediapipe::Packet** packet_out) { TRY { float* array = new float[size]; std::memcpy(array, value, size * sizeof(float)); @@ -187,16 +187,46 @@ MpReturnCode mp__MakeStringPacket__PKc(const char* str, mediapipe::Packet** pack } CATCH_EXCEPTION } -MpReturnCode mp__MakeStringPacket_At__PKc_Rtimestamp(const char* str, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { +MpReturnCode mp__MakeStringPacket_At__PKc_Rt(const char* str, + mediapipe::Timestamp* timestamp, + mediapipe::Packet** packet_out) { TRY { *packet_out = new mediapipe::Packet { mediapipe::MakePacket(std::string(str)).At(*timestamp) }; RETURN_CODE(MpReturnCode::Success); } CATCH_EXCEPTION } +MpReturnCode mp__MakeStringPacket__PKc_i(const char* str, int size, mediapipe::Packet** packet_out) { + TRY { + *packet_out = new mediapipe::Packet { mediapipe::MakePacket(std::string(str, size)) }; + RETURN_CODE(MpReturnCode::Success); + } CATCH_EXCEPTION +} + +MpReturnCode mp__MakeStringPacket_At__PKc_i_Rt(const char* str, int size, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out) { + TRY { + *packet_out = new mediapipe::Packet { mediapipe::MakePacket(std::string(str, size)).At(*timestamp) }; + RETURN_CODE(MpReturnCode::Success); + } CATCH_EXCEPTION +} + MpReturnCode mp_Packet__GetString(mediapipe::Packet* packet, const char** value_out) { TRY_ALL { - *value_out = strcpy_to_heap(packet->Get()); + auto& str = packet->Get(); + *value_out = strcpy_to_heap(str); + RETURN_CODE(MpReturnCode::Success); + } CATCH_ALL +} + +MpReturnCode mp_Packet__GetByteString(mediapipe::Packet* packet, const char** value_out, int* size_out) { + TRY_ALL { + auto& str = packet->Get(); + auto length = str.size(); + auto bytes = new char[length]; + memcpy(bytes, str.c_str(), length); + + *value_out = bytes; + *size_out = length; RETURN_CODE(MpReturnCode::Success); } CATCH_ALL } @@ -220,7 +250,7 @@ void mp_SidePacket__delete(SidePacket* side_packet) { delete side_packet; } -MpReturnCode mp_SidePacket__emplace__PKc_Rpacket(SidePacket* side_packet, const char* key, mediapipe::Packet* packet) { +MpReturnCode mp_SidePacket__emplace__PKc_Rp(SidePacket* side_packet, const char* key, mediapipe::Packet* packet) { TRY { side_packet->emplace(std::string(key), std::move(*packet)); RETURN_CODE(MpReturnCode::Success); diff --git a/C/mediapipe_api/framework/packet.h b/C/mediapipe_api/framework/packet.h index 4381fe433..6636f1b00 100644 --- a/C/mediapipe_api/framework/packet.h +++ b/C/mediapipe_api/framework/packet.h @@ -27,7 +27,7 @@ typedef std::map SidePacket; /** mediapipe::Packet API */ MP_CAPI(MpReturnCode) mp_Packet__(mediapipe::Packet** packet_out); MP_CAPI(void) mp_Packet__delete(mediapipe::Packet* packet); -MP_CAPI(MpReturnCode) mp_Packet__At__Rtimestamp(mediapipe::Packet* packet, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp_Packet__At__Rt(mediapipe::Packet* packet, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsProtoMessageLite(mediapipe::Packet* packet, mediapipe::Status** status_out); MP_CAPI(MpReturnCode) mp_Packet__Timestamp(mediapipe::Packet* packet, mediapipe::Timestamp** timestamp_out); MP_CAPI(MpReturnCode) mp_Packet__DebugString(mediapipe::Packet* packet, const char** str_out); @@ -36,43 +36,49 @@ MP_CAPI(MpReturnCode) mp_Packet__DebugTypeName(mediapipe::Packet* packet, const // Boolean MP_CAPI(MpReturnCode) mp__MakeBoolPacket__b(bool value, mediapipe::Packet** packet_out); -MP_CAPI(MpReturnCode) mp__MakeBoolPacket_At__b_Rtimestamp(bool value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeBoolPacket_At__b_Rt(bool value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_Packet__GetBool(mediapipe::Packet* packet, bool* value_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsBool(mediapipe::Packet* packet, mediapipe::Status** status_out); // Float MP_CAPI(MpReturnCode) mp__MakeFloatPacket__f(float value, mediapipe::Packet** packet_out); -MP_CAPI(MpReturnCode) mp__MakeFloatPacket_At__f_Rtimestamp(float value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeFloatPacket_At__f_Rt(float value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_Packet__GetFloat(mediapipe::Packet* packet, float* value_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsFloat(mediapipe::Packet* packet, mediapipe::Status** status_out); // Int MP_CAPI(MpReturnCode) mp__MakeIntPacket__i(int value, mediapipe::Packet** packet_out); -MP_CAPI(MpReturnCode) mp__MakeIntPacket_At__i_Rtimestamp(int value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeIntPacket_At__i_Rt(int value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_Packet__GetInt(mediapipe::Packet* packet, int* value_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsInt(mediapipe::Packet* packet, mediapipe::Status** status_out); // Float Array MP_CAPI(MpReturnCode) mp__MakeFloatArrayPacket__Pf_i(float* value, int size, mediapipe::Packet** packet_out); -MP_CAPI(MpReturnCode) mp__MakeFloatArrayPacket_At__Pf_i_Rtimestamp(float* value, - int size, - mediapipe::Timestamp* timestamp, - mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeFloatArrayPacket_At__Pf_i_Rt(float* value, + int size, + mediapipe::Timestamp* timestamp, + mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_Packet__GetFloatArray(mediapipe::Packet* packet, const float** value_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsFloatArray(mediapipe::Packet* packet, mediapipe::Status** status_out); // String MP_CAPI(MpReturnCode) mp__MakeStringPacket__PKc(const char* str, mediapipe::Packet** packet_out); -MP_CAPI(MpReturnCode) mp__MakeStringPacket_At__PKc_Rtimestamp(const char* str, - mediapipe::Timestamp* timestamp, - mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeStringPacket_At__PKc_Rt(const char* str, + mediapipe::Timestamp* timestamp, + mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeStringPacket__PKc_i(const char* str, int size, mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeStringPacket_At__PKc_i_Rt(const char* str, + int size, + mediapipe::Timestamp* timestamp, + mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_Packet__GetString(mediapipe::Packet* packet, const char** value_out); +MP_CAPI(MpReturnCode) mp_Packet__GetByteString(mediapipe::Packet* packet, const char** value_out, int* size_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsString(mediapipe::Packet* packet, mediapipe::Status** status_out); /** SidePacket API */ MP_CAPI(MpReturnCode) mp_SidePacket__(SidePacket** side_packet_out); MP_CAPI(void) mp_SidePacket__delete(SidePacket* side_packet); -MP_CAPI(MpReturnCode) mp_SidePacket__emplace__PKc_Rpacket(SidePacket* side_packet, const char* key, mediapipe::Packet* packet); +MP_CAPI(MpReturnCode) mp_SidePacket__emplace__PKc_Rp(SidePacket* side_packet, const char* key, mediapipe::Packet* packet); MP_CAPI(MpReturnCode) mp_SidePacket__at__PKc(SidePacket* side_packet, const char* key, mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp_SidePacket__erase__PKc(SidePacket* side_packet, const char* key, int* count_out); MP_CAPI(void) mp_SidePacket__clear(SidePacket* side_packet);