From 9a042b2e75de5f393cf4ba77bef0c400228aedac Mon Sep 17 00:00:00 2001 From: Junrou Nishida Date: Sun, 17 Dec 2023 14:35:17 +0900 Subject: [PATCH] feat: implement Packet.CreateFloat, Packet.GetFloat (#1070) --- .../Runtime/Scripts/Framework/Packet.cs | 54 +++++++++++++++++++ .../NativeMethods/Framework/Packet_Unsafe.cs | 3 ++ .../Tests/EditMode/Framework/PacketTest.cs | 37 +++++++++++++ mediapipe_api/framework/packet.cc | 7 +++ mediapipe_api/framework/packet.h | 1 + 5 files changed, 102 insertions(+) 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 e392b1b7a..81a899a41 100644 --- a/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Framework/Packet.cs +++ b/Packages/com.github.homuler.mediapipe/Runtime/Scripts/Framework/Packet.cs @@ -113,6 +113,29 @@ public static Packet CreateDoubleAt(double value, long timestampMicrosec) return new Packet(ptr, true); } + /// + /// Create a float Packet. + /// + public static Packet CreateFloat(float value) + { + UnsafeNativeMethods.mp__MakeFloatPacket__f(value, out var ptr).Assert(); + + return new Packet(ptr, true); + } + + /// + /// Create a float Packet. + /// + /// + /// The timestamp of the packet. + /// + public static Packet CreateFloatAt(float value, long timestampMicrosec) + { + UnsafeNativeMethods.mp__MakeFloatPacket_At__f_ll(value, timestampMicrosec, out var ptr).Assert(); + + return new Packet(ptr, true); + } + /// /// Get the content of the as a boolean. /// @@ -179,6 +202,23 @@ public double GetDouble() return value; } + /// + /// Get the content of the as a float. + /// + /// + /// On some platforms (e.g. Windows), it will abort the process when should be thrown. + /// + /// + /// If the doesn't contain float data. + /// + public float GetFloat() + { + UnsafeNativeMethods.mp_Packet__GetFloat(mpPtr, out var value).Assert(); + + GC.KeepAlive(this); + return value; + } + /// /// Validate if the content of the is a boolean. /// @@ -220,5 +260,19 @@ public void ValidateAsDouble() GC.KeepAlive(this); AssertStatusOk(statusPtr); } + + /// + /// Validate if the content of the is a float. + /// + /// + /// If the doesn't contain float data;. + /// + public void ValidateAsFloat() + { + UnsafeNativeMethods.mp_Packet__ValidateAsFloat(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 9fbf45d17..ceaa48cfc 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 @@ -89,6 +89,9 @@ internal static partial class UnsafeNativeMethods [DllImport(MediaPipeLibrary, ExactSpelling = true)] 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__MakeFloatPacket_At__f_ll(float value, long timestampMicrosec, out IntPtr packet); + [DllImport(MediaPipeLibrary, ExactSpelling = true)] public static extern MpReturnCode mp_Packet__GetFloat(IntPtr packet, out float value); 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 3c176197e..9dd1344f2 100644 --- a/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/PacketTest.cs +++ b/Packages/com.github.homuler.mediapipe/Tests/EditMode/Framework/PacketTest.cs @@ -105,6 +105,35 @@ public void CreateDoubleAt_ShouldReturnNewDoublePacket(double value) } #endregion + #region Float + [TestCase(float.MaxValue)] + [TestCase(0f)] + [TestCase(float.MinValue)] + public void CreateFloat_ShouldReturnNewFloatPacket(float value) + { + using var packet = Packet.CreateFloat(value); + + Assert.DoesNotThrow(packet.ValidateAsFloat); + Assert.AreEqual(value, packet.GetFloat()); + + using var unsetTimestamp = Timestamp.Unset(); + Assert.AreEqual(unsetTimestamp.Microseconds(), packet.TimestampMicroseconds()); + } + + [TestCase(float.MaxValue)] + [TestCase(0f)] + [TestCase(float.MinValue)] + public void CreateFloatAt_ShouldReturnNewFloatPacket(float value) + { + var timestamp = 1; + using var packet = Packet.CreateFloatAt(value, timestamp); + + Assert.DoesNotThrow(packet.ValidateAsFloat); + Assert.AreEqual(value, packet.GetFloat()); + Assert.AreEqual(timestamp, packet.TimestampMicroseconds()); + } + #endregion + #region #Validate [Test] public void ValidateAsBool_ShouldThrow_When_ValueIsNotSet() @@ -126,6 +155,14 @@ public void ValidateAsDouble_ShouldThrow_When_ValueIsNotSet() using var packet = Packet.CreateEmpty(); _ = Assert.Throws(packet.ValidateAsDouble); } + + + [Test] + public void ValidateAsFloat_ShouldThrow_When_ValueIsNotSet() + { + using var packet = Packet.CreateEmpty(); + _ = Assert.Throws(packet.ValidateAsFloat); + } #endregion } } diff --git a/mediapipe_api/framework/packet.cc b/mediapipe_api/framework/packet.cc index fae344fc9..40c3e17c2 100644 --- a/mediapipe_api/framework/packet.cc +++ b/mediapipe_api/framework/packet.cc @@ -167,6 +167,13 @@ MpReturnCode mp__MakeFloatPacket_At__f_Rt(float value, mediapipe::Timestamp* tim CATCH_EXCEPTION } +MpReturnCode mp__MakeFloatPacket_At__f_ll(float 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__GetFloat(mediapipe::Packet* packet, float* value_out) { TRY_ALL *value_out = packet->Get(); diff --git a/mediapipe_api/framework/packet.h b/mediapipe_api/framework/packet.h index 1f5a3f504..e124a3134 100644 --- a/mediapipe_api/framework/packet.h +++ b/mediapipe_api/framework/packet.h @@ -67,6 +67,7 @@ MP_CAPI(MpReturnCode) mp_Packet__ValidateAsDouble(mediapipe::Packet* packet, abs // 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); +MP_CAPI(MpReturnCode) mp__MakeFloatPacket_At__f_ll(float value, int64 timestampMicrosec, 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, absl::Status** status_out);