From 36ba64452e45968f1a7d87258d2e086b41bd24d8 Mon Sep 17 00:00:00 2001 From: Junrou Nishida Date: Sun, 17 Dec 2023 13:50:06 +0900 Subject: [PATCH] feat: implement Packet.CreateDouble, Packet.GetDouble (#1069) --- .../Runtime/Scripts/Framework/Packet.cs | 64 ++++++++++++++++++- .../NativeMethods/Framework/Packet_Unsafe.cs | 14 ++++ .../Tests/EditMode/Framework/PacketTest.cs | 36 +++++++++++ mediapipe_api/framework/packet.cc | 29 +++++++++ mediapipe_api/framework/packet.h | 6 ++ 5 files changed, 147 insertions(+), 2 deletions(-) diff --git a/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Framework/Packet.cs b/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Framework/Packet.cs index dbc814415..e392b1b7a 100644 --- a/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Framework/Packet.cs +++ b/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Framework/Packet.cs @@ -45,7 +45,7 @@ internal static Packet CreateEmpty() public static Packet CreateForReference(IntPtr ptr) => new Packet(ptr, false); /// - /// Create a bool Packet from a boolean. + /// Create a bool Packet. /// public static Packet CreateBool(bool value) { @@ -90,11 +90,34 @@ public static Packet CreateBoolVectorAt(bool[] value, long timestampMicrosec) return new Packet(ptr, true); } + /// + /// Create a double Packet. + /// + public static Packet CreateDouble(double value) + { + UnsafeNativeMethods.mp__MakeDoublePacket__d(value, out var ptr).Assert(); + + return new Packet(ptr, true); + } + + /// + /// Create a double Packet. + /// + /// + /// The timestamp of the packet. + /// + public static Packet CreateDoubleAt(double value, long timestampMicrosec) + { + UnsafeNativeMethods.mp__MakeDoublePacket_At__d_ll(value, timestampMicrosec, out var ptr).Assert(); + + return new Packet(ptr, true); + } + /// /// Get the content of the as a boolean. /// /// - /// On some platforms (e.g. Windows), it will abort the process when should be thrown. + /// On some platforms (e.g. Windows), it will abort the process when should be thrown. /// /// /// If the doesn't contain bool data. @@ -121,9 +144,15 @@ public List GetBoolList() /// /// Get the content of a bool vector Packet as a . /// + /// + /// On some platforms (e.g. Windows), it will abort the process when should be thrown. + /// /// /// The to be filled with the content of the . /// + /// + /// If the doesn't contain std::vector<bool> data. + /// public void GetBoolList(List value) { UnsafeNativeMethods.mp_Packet__GetBoolVector(mpPtr, out var structArray).Assert(); @@ -133,6 +162,23 @@ public void GetBoolList(List value) structArray.Dispose(); } + /// + /// Get the content of the as a double. + /// + /// + /// On some platforms (e.g. Windows), it will abort the process when should be thrown. + /// + /// + /// If the doesn't contain double data. + /// + public double GetDouble() + { + UnsafeNativeMethods.mp_Packet__GetDouble(mpPtr, out var value).Assert(); + + GC.KeepAlive(this); + return value; + } + /// /// Validate if the content of the is a boolean. /// @@ -160,5 +206,19 @@ public void ValidateAsBoolVector() GC.KeepAlive(this); AssertStatusOk(statusPtr); } + + /// + /// Validate if the content of the is a double. + /// + /// + /// If the doesn't contain double data;. + /// + public void ValidateAsDouble() + { + UnsafeNativeMethods.mp_Packet__ValidateAsDouble(mpPtr, out var statusPtr).Assert(); + + GC.KeepAlive(this); + AssertStatusOk(statusPtr); + } } } diff --git a/Packages/com.github.homuler.mediapipe/Runtime/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs b/Packages/com.github.homuler.mediapipe/Runtime/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs index 0b94c0d13..9fbf45d17 100644 --- a/Packages/com.github.homuler.mediapipe/Runtime/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs +++ b/Packages/com.github.homuler.mediapipe/Runtime/Scripts/PInvoke/NativeMethods/Framework/Packet_Unsafe.cs @@ -68,6 +68,20 @@ internal static partial class UnsafeNativeMethods public static extern MpReturnCode mp_Packet__ValidateAsBoolVector(IntPtr packet, out IntPtr status); #endregion + #region Double + [DllImport(MediaPipeLibrary, ExactSpelling = true)] + public static extern MpReturnCode mp__MakeDoublePacket__d(double value, out IntPtr packet); + + [DllImport(MediaPipeLibrary, ExactSpelling = true)] + public static extern MpReturnCode mp__MakeDoublePacket_At__d_ll(double value, long timestampMicrosec, out IntPtr packet); + + [DllImport(MediaPipeLibrary, ExactSpelling = true)] + public static extern MpReturnCode mp_Packet__GetDouble(IntPtr packet, out double value); + + [DllImport(MediaPipeLibrary, ExactSpelling = true)] + public static extern MpReturnCode mp_Packet__ValidateAsDouble(IntPtr packet, out IntPtr status); + #endregion + #region Float [DllImport(MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp__MakeFloatPacket__f(float value, out IntPtr packet); diff --git a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/PacketTest.cs b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/PacketTest.cs index dcc298203..3c176197e 100644 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/PacketTest.cs +++ b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/PacketTest.cs @@ -76,6 +76,35 @@ public void CreateBoolVectorAt_ShouldReturnNewBoolVectorPacket() } #endregion + #region Double + [TestCase(double.MaxValue)] + [TestCase(0d)] + [TestCase(double.MinValue)] + public void CreateDouble_ShouldReturnNewDoublePacket(double value) + { + using var packet = Packet.CreateDouble(value); + + Assert.DoesNotThrow(packet.ValidateAsDouble); + Assert.AreEqual(value, packet.GetDouble()); + + using var unsetTimestamp = Timestamp.Unset(); + Assert.AreEqual(unsetTimestamp.Microseconds(), packet.TimestampMicroseconds()); + } + + [TestCase(double.MaxValue)] + [TestCase(0d)] + [TestCase(double.MinValue)] + public void CreateDoubleAt_ShouldReturnNewDoublePacket(double value) + { + var timestamp = 1; + using var packet = Packet.CreateDoubleAt(value, timestamp); + + Assert.DoesNotThrow(packet.ValidateAsDouble); + Assert.AreEqual(value, packet.GetDouble()); + Assert.AreEqual(timestamp, packet.TimestampMicroseconds()); + } + #endregion + #region #Validate [Test] public void ValidateAsBool_ShouldThrow_When_ValueIsNotSet() @@ -90,6 +119,13 @@ public void ValidateAsBoolVector_ShouldThrow_When_ValueIsNotSet() using var packet = Packet.CreateEmpty(); _ = Assert.Throws(packet.ValidateAsBoolVector); } + + [Test] + public void ValidateAsDouble_ShouldThrow_When_ValueIsNotSet() + { + using var packet = Packet.CreateEmpty(); + _ = Assert.Throws(packet.ValidateAsDouble); + } #endregion } } diff --git a/mediapipe_api/framework/packet.cc b/mediapipe_api/framework/packet.cc index 49319eb3c..fae344fc9 100644 --- a/mediapipe_api/framework/packet.cc +++ b/mediapipe_api/framework/packet.cc @@ -123,6 +123,35 @@ MpReturnCode mp_Packet__ValidateAsBoolVector(mediapipe::Packet* packet, absl::St CATCH_EXCEPTION } +// DoublePacket +MpReturnCode mp__MakeDoublePacket__d(double value, mediapipe::Packet** packet_out) { + TRY + *packet_out = new mediapipe::Packet{mediapipe::MakePacket(value)}; + RETURN_CODE(MpReturnCode::Success); + CATCH_EXCEPTION +} + +MpReturnCode mp__MakeDoublePacket_At__d_ll(double value, int64 timestampMicrosec, mediapipe::Packet** packet_out) { + TRY + *packet_out = new mediapipe::Packet{mediapipe::MakePacket(value).At(mediapipe::Timestamp(timestampMicrosec))}; + RETURN_CODE(MpReturnCode::Success); + CATCH_EXCEPTION +} + +MpReturnCode mp_Packet__GetDouble(mediapipe::Packet* packet, double* value_out) { + TRY_ALL + *value_out = packet->Get(); + RETURN_CODE(MpReturnCode::Success); + CATCH_ALL +} + +MpReturnCode mp_Packet__ValidateAsDouble(mediapipe::Packet* packet, absl::Status** status_out) { + TRY + *status_out = new absl::Status{packet->ValidateAsType()}; + RETURN_CODE(MpReturnCode::Success); + CATCH_EXCEPTION +} + // FloatPacket MpReturnCode mp__MakeFloatPacket__f(float value, mediapipe::Packet** packet_out) { TRY diff --git a/mediapipe_api/framework/packet.h b/mediapipe_api/framework/packet.h index 3b3f37104..1f5a3f504 100644 --- a/mediapipe_api/framework/packet.h +++ b/mediapipe_api/framework/packet.h @@ -58,6 +58,12 @@ MP_CAPI(MpReturnCode) mp__MakeBoolVectorPacket_At__Pb_i_ll(bool* value, int size MP_CAPI(MpReturnCode) mp_Packet__GetBoolVector(mediapipe::Packet* packet, mp_api::StructArray* value_out); MP_CAPI(MpReturnCode) mp_Packet__ValidateAsBoolVector(mediapipe::Packet* packet, absl::Status** status_out); +// double +MP_CAPI(MpReturnCode) mp__MakeDoublePacket__d(double value, mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp__MakeDoublePacket_At__d_ll(double value, int64 timestampMicrosec, mediapipe::Packet** packet_out); +MP_CAPI(MpReturnCode) mp_Packet__GetDouble(mediapipe::Packet* packet, double* value_out); +MP_CAPI(MpReturnCode) mp_Packet__ValidateAsDouble(mediapipe::Packet* packet, absl::Status** status_out); + // float MP_CAPI(MpReturnCode) mp__MakeFloatPacket__f(float value, mediapipe::Packet** packet_out); MP_CAPI(MpReturnCode) mp__MakeFloatPacket_At__f_Rt(float value, mediapipe::Timestamp* timestamp, mediapipe::Packet** packet_out);