Skip to content

Commit

Permalink
feat: marshal Landmarks (#1098)
Browse files Browse the repository at this point in the history
  • Loading branch information
homuler committed Jan 3, 2024
1 parent 3d27714 commit 04752fd
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,26 @@ public ReadOnlySpan<NativeNormalizedLandmark> AsReadOnlySpan()
}
}

[StructLayout(LayoutKind.Sequential)]
internal readonly struct NativeLandmarksArray
{
private readonly IntPtr _data;
public readonly int size;

public void Dispose()
{
UnsafeNativeMethods.mp_api_LandmarksArray__delete(this);
}

public ReadOnlySpan<NativeLandmarks> AsReadOnlySpan()
{
unsafe
{
return new ReadOnlySpan<NativeLandmarks>((NativeLandmarks*)_data, size);
}
}
}

[StructLayout(LayoutKind.Sequential)]
internal readonly struct NativeNormalizedLandmarksArray
{
Expand All @@ -87,7 +107,7 @@ public ReadOnlySpan<NativeNormalizedLandmark> AsReadOnlySpan()

public void Dispose()
{
UnsafeNativeMethods.mp_api_NormalizedLandmarksArray__delete(_data, size);
UnsafeNativeMethods.mp_api_NormalizedLandmarksArray__delete(this);
}

public ReadOnlySpan<NativeNormalizedLandmarks> AsReadOnlySpan()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,16 @@ internal static partial class UnsafeNativeMethods
[DllImport(MediaPipeLibrary, ExactSpelling = true)]
public static extern void mp_tasks_c_components_containers_CppCloseDetectionResult(NativeDetectionResult data);

[DllImport(MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_Packet__GetLandmarksVector(IntPtr packet, out NativeLandmarksArray value);

[DllImport(MediaPipeLibrary, ExactSpelling = true)]
public static extern void mp_api_LandmarksArray__delete(NativeLandmarksArray data);

[DllImport(MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_Packet__GetNormalizedLandmarksVector(IntPtr packet, out NativeNormalizedLandmarksArray value);

[DllImport(MediaPipeLibrary, ExactSpelling = true)]
public static extern void mp_api_NormalizedLandmarksArray__delete(IntPtr data, int size);
public static extern void mp_api_NormalizedLandmarksArray__delete(NativeNormalizedLandmarksArray data);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,17 @@ internal Landmark(float x, float y, float z, float? visibility, float? presence,
this.name = name;
}

internal Landmark(NativeLandmark nativeLandmark) : this(
nativeLandmark.x, nativeLandmark.y, nativeLandmark.z,
#pragma warning disable IDE0004 // for Unity 2020.3.x
nativeLandmark.hasVisibility ? (float?)nativeLandmark.visibility : null,
nativeLandmark.hasPresence ? (float?)nativeLandmark.presence : null,
#pragma warning restore IDE0004 // for Unity 2020.3.x
nativeLandmark.name
)
{
}

#nullable enable
public override bool Equals(object? obj) => obj is Landmark other && Equals(other);
#nullable disable
Expand Down Expand Up @@ -105,17 +116,6 @@ public override string ToString()
public readonly float? presence;
public readonly string name;

internal NormalizedLandmark(NativeNormalizedLandmark nativeLandmark) : this(
nativeLandmark.x, nativeLandmark.y, nativeLandmark.z,
#pragma warning disable IDE0004 // for Unity 2020.3.x
nativeLandmark.hasVisibility ? (float?)nativeLandmark.visibility : null,
nativeLandmark.hasPresence ? (float?)nativeLandmark.presence : null,
#pragma warning restore IDE0004 // for Unity 2020.3.x
nativeLandmark.name
)
{
}

internal NormalizedLandmark(float x, float y, float z, float? visibility, float? presence) : this(x, y, z, visibility, presence, null)
{
}
Expand All @@ -130,6 +130,17 @@ internal NormalizedLandmark(float x, float y, float z, float? visibility, float?
this.name = name;
}

internal NormalizedLandmark(NativeNormalizedLandmark nativeLandmark) : this(
nativeLandmark.x, nativeLandmark.y, nativeLandmark.z,
#pragma warning disable IDE0004 // for Unity 2020.3.x
nativeLandmark.hasVisibility ? (float?)nativeLandmark.visibility : null,
nativeLandmark.hasPresence ? (float?)nativeLandmark.presence : null,
#pragma warning restore IDE0004 // for Unity 2020.3.x
nativeLandmark.name
)
{
}

#nullable enable
public override bool Equals(object? obj) => obj is NormalizedLandmark other && Equals(other);
#nullable disable
Expand Down Expand Up @@ -195,6 +206,18 @@ public static void Copy(LandmarkList source, ref Landmarks destination)
destination = new Landmarks(landmarks);
}

internal static void Copy(NativeLandmarks source, ref Landmarks destination)
{
var landmarks = destination.landmarks ?? new List<Landmark>((int)source.landmarksCount);
landmarks.Clear();

foreach (var nativeLandmark in source.AsReadOnlySpan())
{
landmarks.Add(new Landmark(nativeLandmark));
}
destination = new Landmarks(landmarks);
}

public override string ToString() => $"{{ \"landmarks\": {Util.Format(landmarks)} }}";
}

Expand Down Expand Up @@ -247,8 +270,21 @@ internal static void Copy(NativeNormalizedLandmarks source, ref NormalizedLandma
public override string ToString() => $"{{ \"landmarks\": {Util.Format(landmarks)} }}";
}

internal static class NativeNormalizedLandmarksArrayExtension
internal static class NativeLandmarksArrayExtension
{
public static void FillWith(this List<Landmarks> target, NativeLandmarksArray source)
{
target.ResizeTo(source.size);

var i = 0;
foreach (var nativeLandmarks in source.AsReadOnlySpan())
{
var landmarks = target[i];
Landmarks.Copy(nativeLandmarks, ref landmarks);
target[i] = landmarks;
}
}

public static void FillWith(this List<NormalizedLandmarks> target, NativeNormalizedLandmarksArray source)
{
target.ResizeTo(source.size);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ public static void GetDetectionResult(this Packet packet, ref DetectionResult va
detectionResult.Dispose();
}

public static void GetLandmarksList(this Packet packet, List<Landmarks> outs)
{
UnsafeNativeMethods.mp_Packet__GetLandmarksVector(packet.mpPtr, out var landmarksArray).Assert();
outs.FillWith(landmarksArray);
landmarksArray.Dispose();
}

public static void GetNormalizedLandmarksList(this Packet packet, List<NormalizedLandmarks> outs)
{
UnsafeNativeMethods.mp_Packet__GetNormalizedLandmarksVector(packet.mpPtr, out var landmarksArray).Assert();
Expand Down
36 changes: 33 additions & 3 deletions mediapipe_api/tasks/c/components/containers/landmark.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,40 @@ MpReturnCode mp_Packet__GetNormalizedLandmarksVector(mediapipe::Packet* packet,
CATCH_ALL
}

void mp_api_NormalizedLandmarksArray__delete(NormalizedLandmarks* data, int size) {
auto landmarks = data;
void mp_api_NormalizedLandmarksArray__delete(mp_api::StructArray<NormalizedLandmarks> array) {
auto landmarks = array.data;
auto size = array.size;

for (auto i = 0; i < size; ++i) {
mediapipe::tasks::c::components::containers::CppCloseNormalizedLandmarks(landmarks++);
}
delete[] data;
delete[] array.data;
}

MpReturnCode mp_Packet__GetLandmarksVector(mediapipe::Packet* packet, mp_api::StructArray<Landmarks>* value_out) {
TRY_ALL
// get std::vector<LandmarkList> and convert it to Landmarks*
auto proto_vec = packet->Get<std::vector<mediapipe::LandmarkList>>();
auto vec_size = proto_vec.size();
auto data = new Landmarks[vec_size];

for (auto i = 0; i < vec_size; ++i) {
auto landmarks = mediapipe::tasks::components::containers::ConvertToLandmarks(proto_vec[i]);
mediapipe::tasks::c::components::containers::CppConvertToLandmarks(landmarks.landmarks, &data[i]);
}

value_out->data = data;
value_out->size = static_cast<int>(vec_size);
RETURN_CODE(MpReturnCode::Success);
CATCH_ALL
}

void mp_api_LandmarksArray__delete(mp_api::StructArray<Landmarks> array) {
auto landmarks = array.data;
auto size = array.size;

for (auto i = 0; i < size; ++i) {
mediapipe::tasks::c::components::containers::CppCloseLandmarks(landmarks++);
}
delete[] array.data;
}
4 changes: 3 additions & 1 deletion mediapipe_api/tasks/c/components/containers/landmark.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
extern "C" {

MP_CAPI(MpReturnCode) mp_Packet__GetNormalizedLandmarksVector(mediapipe::Packet* packet, mp_api::StructArray<NormalizedLandmarks>* value_out);
MP_CAPI(void) mp_api_NormalizedLandmarksArray__delete(NormalizedLandmarks* data, int size);
MP_CAPI(void) mp_api_NormalizedLandmarksArray__delete(mp_api::StructArray<NormalizedLandmarks> data);
MP_CAPI(MpReturnCode) mp_Packet__GetLandmarksVector(mediapipe::Packet* packet, mp_api::StructArray<Landmarks>* value_out);
MP_CAPI(void) mp_api_LandmarksArray__delete(mp_api::StructArray<Landmarks> data);

} // extern "C"

Expand Down

0 comments on commit 04752fd

Please sign in to comment.