Skip to content

Commit

Permalink
feat(sdk): build CalculatorGraphConfig.cs from proto srcs
Browse files Browse the repository at this point in the history
  • Loading branch information
homuler committed Dec 30, 2020
1 parent 01933ae commit 9e576e2
Show file tree
Hide file tree
Showing 26 changed files with 254 additions and 234 deletions.
12 changes: 0 additions & 12 deletions Assets/MediaPipe/SDK/Scripts/External/Protobuf.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,6 @@ class Protobuf {
UnsafeNativeMethods.google_protobuf__SetLogHandler__PF(protobufLogHandler).Assert();
}

/// <exception cref="MediaPipeException">Thrown when an error occured in unmanaged code</exception>
/// <exception cref="FormatException">Thrown when failed to parse <paramref name="configText" /></exception>
public static CalculatorGraphConfig ParseFromStringAsCalculatorGraphConfig(string configText) {
UnsafeNativeMethods.google_protobuf_TextFormat__ParseFromStringAsCalculatorGraphConfig__PKc(configText, out var configPtr).Assert();

if (configPtr == IntPtr.Zero) {
throw new FormatException("Failed to parse the text as CalculatorGraphConfig");
}

return new CalculatorGraphConfig(configPtr);
}

public static T DeserializeProto<T>(IntPtr ptr, pb::MessageParser<T> parser) where T : pb::IMessage<T> {
var serializedProto = Marshal.PtrToStructure<SerializedProto>(ptr);
var bytes = new byte[serializedProto.length];
Expand Down
37 changes: 25 additions & 12 deletions Assets/MediaPipe/SDK/Scripts/Framework/CalculatorGraph.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System;
using System.Runtime.InteropServices;

using Google.Protobuf;

namespace Mediapipe {
public class CalculatorGraph : MpResourceHandle {
public delegate IntPtr NativePacketCallback(IntPtr packetPtr);
Expand All @@ -11,10 +13,18 @@ public class CalculatorGraph : MpResourceHandle {
this.ptr = ptr;
}

public CalculatorGraph(string configText) : base() {
var config = CalculatorGraphConfig.ParseFromString(configText);
UnsafeNativeMethods.mp_CalculatorGraph__Rconfig(config.mpPtr, out var ptr).Assert();
GC.KeepAlive(config);
/// <param name="textFormatConfig">text-formatted config</param>
/// <remarks>
/// By calling this constructor, the config text is parsed and serialized to binary string in C++,
/// parsed and serialized again in C#, and finally the serialized config is passed to C++ (so it is not efficient).
/// If possible, it would be better to build CalculatorGraphConfig from JSON in C# and pass it to another constructor.
/// </remarks>
public CalculatorGraph(string textFormatConfig) : this(CalculatorGraphConfig.Parser.ParseFromTextFormat(textFormatConfig)) {}

public CalculatorGraph(CalculatorGraphConfig config) : base() {
var bytes = config.ToByteArray();

UnsafeNativeMethods.mp_CalculatorGraph__Rcgc(bytes, bytes.Length, out var ptr).Assert();
this.ptr = ptr;
}

Expand All @@ -23,27 +33,30 @@ public class CalculatorGraph : MpResourceHandle {
}

public Status Initialize(CalculatorGraphConfig config) {
UnsafeNativeMethods.mp_CalculatorGraph__Initialize__Rconfig(mpPtr, config.mpPtr, out var statusPtr).Assert();
var bytes = config.ToByteArray();
UnsafeNativeMethods.mp_CalculatorGraph__Initialize__Rcgc(mpPtr, bytes, bytes.Length, out var statusPtr).Assert();

GC.KeepAlive(this);
return new Status(statusPtr);
}

public Status Initialize(CalculatorGraphConfig config, SidePacket sidePacket) {
UnsafeNativeMethods.mp_CalculatorGraph__Initialize__Rconfig_Rsp(mpPtr, config.mpPtr, sidePacket.mpPtr, out var statusPtr).Assert();
var bytes = config.ToByteArray();
UnsafeNativeMethods.mp_CalculatorGraph__Initialize__Rcgc_Rsp(mpPtr, bytes, bytes.Length, sidePacket.mpPtr, out var statusPtr).Assert();

GC.KeepAlive(this);
return new Status(statusPtr);
}

/// <remarks>Crashes if config is not set</remarks>
public CalculatorGraphConfig config {
get {
UnsafeNativeMethods.mp_CalculatorGraph__Config(mpPtr, out var configPtr).Assert();
public CalculatorGraphConfig Config() {
UnsafeNativeMethods.mp_CalculatorGraph__Config(mpPtr, out var serializedProtoPtr).Assert();
GC.KeepAlive(this);

var config = Protobuf.DeserializeProto<CalculatorGraphConfig>(serializedProtoPtr, CalculatorGraphConfig.Parser);
UnsafeNativeMethods.mp_api_SerializedProto__delete(serializedProtoPtr);

GC.KeepAlive(this);
return new CalculatorGraphConfig(configPtr);
}
return config;
}

public Status ObserveOutputStream<T, U>(string streamName, PacketCallback<T, U> packetCallback, out GCHandle callbackHandle) where T : Packet<U> {
Expand Down
37 changes: 9 additions & 28 deletions Assets/MediaPipe/SDK/Scripts/Framework/CalculatorGraphConfig.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,15 @@
using System;

using pb = global::Google.Protobuf;
namespace Mediapipe {
public class CalculatorGraphConfig : MpResourceHandle {
public CalculatorGraphConfig(IntPtr ptr) : base(ptr) {}

public static CalculatorGraphConfig ParseFromString(string configText) {
return Protobuf.ParseFromStringAsCalculatorGraphConfig(configText);
}

protected override void DeleteMpPtr() {
UnsafeNativeMethods.mp_CalculatorGraphConfig__delete(ptr);
}
public static class CalculatorGraphConfigExtension {
/// <summary>
/// </summary>
public static CalculatorGraphConfig ParseFromTextFormat(this pb::MessageParser<CalculatorGraphConfig> parser, string configText) {
UnsafeNativeMethods.mp_api__ConvertFromCalculatorGraphConfigTextFormat(configText, out var serializedProtoPtr).Assert();

public int byteSizeLong {
get { return UnsafeNativeMethods.mp_CalculatorGraphConfig__ByteSizeLong(mpPtr); }
}

/// <exception cref="InvalidOperationException">Thrown when some required fields are not set</exception>
public string SerializeAsString() {
var str = MarshalStringFromNative(UnsafeNativeMethods.mp_CalculatorGraphConfig__SerializeAsString);

if (str == null) {
throw new InvalidOperationException("All the required fields must be set");
}

return str;
}
var config = Protobuf.DeserializeProto(serializedProtoPtr, CalculatorGraphConfig.Parser);
UnsafeNativeMethods.mp_api_SerializedProto__delete(serializedProtoPtr);

public string DebugString() {
return MarshalStringFromNative(UnsafeNativeMethods.mp_CalculatorGraphConfig__DebugString);
return config;
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@ internal static partial class UnsafeNativeMethods {
public static extern MpReturnCode mp_CalculatorGraph__(out IntPtr graph);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__Rconfig(IntPtr config, out IntPtr graph);
public static extern MpReturnCode mp_CalculatorGraph__Rcgc(byte[] serializedConfig, int size, out IntPtr graph);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern void mp_CalculatorGraph__delete(IntPtr graph);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__Initialize__Rconfig(IntPtr graph, IntPtr config, out IntPtr status);
public static extern MpReturnCode mp_CalculatorGraph__Initialize__Rcgc(IntPtr graph, byte[] serializedConfig, int size, out IntPtr status);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__Initialize__Rconfig_Rsp(
IntPtr graph, IntPtr config, IntPtr sidePackets, out IntPtr status);
public static extern MpReturnCode mp_CalculatorGraph__Initialize__Rcgc_Rsp(
IntPtr graph, byte[] serializedConfig, int size, IntPtr sidePackets, out IntPtr status);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__Config(IntPtr graph, out IntPtr config);
public static extern MpReturnCode mp_CalculatorGraph__Config(IntPtr graph, out IntPtr serializedProto);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__ObserveOutputStream__PKc_PF(IntPtr graph, string streamName,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System;
using System.Runtime.InteropServices;

namespace Mediapipe {
internal static partial class UnsafeNativeMethods {
[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_api__ConvertFromCalculatorGraphConfigTextFormat(string configText, out IntPtr serializedProto);
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Assets/MediaPipe/SDK/Scripts/Protobuf/CalculatorOptions.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Assets/MediaPipe/SDK/Scripts/Protobuf/MediapipeOptions.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Assets/MediaPipe/SDK/Scripts/Protobuf/PacketFactory.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Assets/MediaPipe/SDK/Scripts/Protobuf/PacketGenerator.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Assets/MediaPipe/SDK/Scripts/Protobuf/StatusHandler.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Assets/MediaPipe/SDK/Scripts/Protobuf/StreamHandler.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ public class CalculatorGraphTest {
[Test]
public void Ctor_ShouldInstantiateCalculatorGraph_When_CalledWithConfigText() {
var graph = new CalculatorGraph(validConfigText);
var config = graph.config;
var config = graph.Config();

Assert.Greater(config.byteSizeLong, 0);
Assert.AreEqual(config.InputStream[0], "in");
Assert.AreEqual(config.OutputStream[0], "out");
}
#endregion

Expand All @@ -53,26 +54,26 @@ public class CalculatorGraphTest {
[Test]
public void Initialize_ShouldReturnOk_When_CalledWithConfig_And_ConfigIsNotSet() {
var graph = new CalculatorGraph();
var config = CalculatorGraphConfig.ParseFromString(validConfigText);
var status = graph.Initialize(config);

var status = graph.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(validConfigText));
Assert.True(status.ok);
Assert.Greater(graph.config.byteSizeLong, 0);

var config = graph.Config();
Assert.AreEqual(config.InputStream[0], "in");
Assert.AreEqual(config.OutputStream[0], "out");
}

[Test]
public void Initialize_ShouldReturnInternalError_When_CalledWithConfig_And_ConfigIsSet() {
var graph = new CalculatorGraph(validConfigText);
var config = CalculatorGraphConfig.ParseFromString(validConfigText);
var status = graph.Initialize(config);
var status = graph.Initialize(CalculatorGraphConfig.Parser.ParseFromTextFormat(validConfigText));

Assert.AreEqual(status.code, Status.StatusCode.Internal);
}

[Test]
public void Initialize_ShouldReturnOk_When_CalledWithConfigAndSidePacket_And_ConfigIsNotSet() {
var graph = new CalculatorGraph();
var config = CalculatorGraphConfig.ParseFromString(validConfigText);
var config = CalculatorGraphConfig.Parser.ParseFromTextFormat(validConfigText);
var sidePacket = new SidePacket();
sidePacket.Emplace("flag", new BoolPacket(true));
var status = graph.Initialize(config, sidePacket);
Expand All @@ -84,7 +85,7 @@ public class CalculatorGraphTest {
[Test]
public void Initialize_ShouldReturnInternalError_When_CalledWithConfigAndSidePacket_And_ConfigIsSet() {
var graph = new CalculatorGraph(validConfigText);
var config = CalculatorGraphConfig.ParseFromString(validConfigText);
var config = CalculatorGraphConfig.Parser.ParseFromTextFormat(validConfigText);
var sidePacket = new SidePacket();
sidePacket.Emplace("flag", new BoolPacket(true));
var status = graph.Initialize(config, sidePacket);
Expand Down
Loading

0 comments on commit 9e576e2

Please sign in to comment.