Skip to content

Commit

Permalink
feat: implement CalculatorGraph#ObserveOutputStream
Browse files Browse the repository at this point in the history
  • Loading branch information
homuler committed Nov 29, 2020
1 parent 891acdc commit fad3ca1
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 6 deletions.
11 changes: 11 additions & 0 deletions Assets/MediaPipe/SDK/Scripts/Framework/CalculatorGraph.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Mediapipe {
public class CalculatorGraph : MpResourceHandle {
public delegate IntPtr PacketCallback(IntPtr packetPtr);

public CalculatorGraph() : base() {
UnsafeNativeMethods.mp_CalculatorGraph__(out var ptr).Assert();
this.ptr = ptr;
Expand Down Expand Up @@ -42,6 +44,15 @@ public class CalculatorGraph : MpResourceHandle {
}
}

/// <param name="packetCallback">This recieves a packet pointer and returns a status pointer. It must be pinned</param>
public Status ObserveOutputStream(string streamName, PacketCallback packetCallback) {
UnsafeNativeMethods.mp_CalculatorGraph__ObserveOutputStream__PKc_PF(
mpPtr, streamName, packetCallback, out var statusPtr).Assert();

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

public StatusOrPoller<T> AddOutputStreamPoller<T>(string streamName) {
UnsafeNativeMethods.mp_CalculatorGraph__AddOutputStreamPoller__PKc(mpPtr, streamName, out var statusOrPollerPtr).Assert();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ internal static partial class UnsafeNativeMethods {
[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__Config(IntPtr graph, out IntPtr config);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__ObserveOutputStream__PKc_PF(IntPtr graph, string streamName,
[MarshalAs(UnmanagedType.FunctionPtr)]CalculatorGraph.PacketCallback packetCallback, out IntPtr status);

[DllImport (MediaPipeLibrary, ExactSpelling = true)]
public static extern MpReturnCode mp_CalculatorGraph__AddOutputStreamPoller__PKc(IntPtr graph, string streamName, out IntPtr statusOrPoller);

Expand Down
13 changes: 13 additions & 0 deletions C/mediapipe_api/framework/calculator_graph.cc
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,19 @@ MpReturnCode mp_CalculatorGraph__Config(mediapipe::CalculatorGraph* graph, media
} CATCH_ALL
}

MP_CAPI(MpReturnCode) mp_CalculatorGraph__ObserveOutputStream__PKc_PF(mediapipe::CalculatorGraph* graph,
const char* stream_name,
PacketCallback* packet_callback,
mediapipe::Status** status_out) {
TRY {
auto status = graph->ObserveOutputStream(stream_name, [packet_callback](const mediapipe::Packet& packet) -> ::mediapipe::Status {
return mediapipe::Status { std::move(*packet_callback(packet)) };
});
*status_out = new mediapipe::Status { std::move(status) };
RETURN_CODE(MpReturnCode::Success);
} CATCH_EXCEPTION
}

MpReturnCode mp_CalculatorGraph__AddOutputStreamPoller__PKc(mediapipe::CalculatorGraph* graph,
const char* stream_name,
mediapipe::StatusOrPoller** status_or_poller_out) {
Expand Down
6 changes: 6 additions & 0 deletions C/mediapipe_api/framework/calculator_graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
extern "C" {

typedef std::map<std::string, mediapipe::Packet> SidePackets;
typedef mediapipe::Status* PacketCallback(const mediapipe::Packet&);

MP_CAPI(MpReturnCode) mp_CalculatorGraph__(mediapipe::CalculatorGraph** graph_out);
MP_CAPI(MpReturnCode) mp_CalculatorGraph__Rconfig(mediapipe::CalculatorGraphConfig* config, mediapipe::CalculatorGraph** graph_out);
Expand All @@ -33,6 +34,11 @@ MP_CAPI(MpReturnCode) mp_CalculatorGraph__Initialize__Rconfig_Rsp(
mediapipe::Status** status_out);

MP_CAPI(MpReturnCode) mp_CalculatorGraph__Config(mediapipe::CalculatorGraph* graph, mediapipe::CalculatorGraphConfig** config_out);
MP_CAPI(MpReturnCode) mp_CalculatorGraph__ObserveOutputStream__PKc_PF(mediapipe::CalculatorGraph* graph,
const char* stream_name,
PacketCallback* packet_callback,
mediapipe::Status** status_out);

MP_CAPI(MpReturnCode) mp_CalculatorGraph__AddOutputStreamPoller__PKc(mediapipe::CalculatorGraph* graph,
const char* stream_name,
mediapipe::StatusOrPoller** status_or_poller_out);
Expand Down
6 changes: 3 additions & 3 deletions C/mediapipe_api/gpu/gl_calculator_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ MpReturnCode mp_GlCalculatorHelper__InitializeForTest__Pgr(mediapipe::GlCalculat
}

MpReturnCode mp_GlCalculatorHelper__RunInGlContext__PF(mediapipe::GlCalculatorHelper* gl_calculator_helper,
MpGlStatusFunction* gl_func,
NativeGlStatusFunction* gl_func,
mediapipe::Status** status_out) {
TRY {
auto status = gl_calculator_helper->RunInGlContext([&gl_func]() -> ::mediapipe::Status {
return *(gl_func());
return mediapipe::Status { std::move(*(gl_func())) };
});
*status_out = new mediapipe::Status { status };
*status_out = new mediapipe::Status { std::move(status) };
RETURN_CODE(MpReturnCode::Success);
} CATCH_EXCEPTION
}
Expand Down
4 changes: 2 additions & 2 deletions C/mediapipe_api/gpu/gl_calculator_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@

extern "C" {

typedef mediapipe::Status* MpGlStatusFunction();
typedef mediapipe::Status* NativeGlStatusFunction();

/** GlCalculatorHelper API */
MP_CAPI(MpReturnCode) mp_GlCalculatorHelper__(mediapipe::GlCalculatorHelper** gl_calculator_helper_out);
MP_CAPI(void) mp_GlCalculatorHelper__delete(mediapipe::GlCalculatorHelper* gl_calculator_helper);
MP_CAPI(MpReturnCode) mp_GlCalculatorHelper__InitializeForTest__Pgr(mediapipe::GlCalculatorHelper* gl_calculator_helper,
mediapipe::GpuResources* gpu_resources);
MP_CAPI(MpReturnCode) mp_GlCalculatorHelper__RunInGlContext__PF(mediapipe::GlCalculatorHelper* gl_calculator_helper,
MpGlStatusFunction* gl_func,
NativeGlStatusFunction* gl_func,
mediapipe::Status** status_out);
MP_CAPI(MpReturnCode) mp_GlCalculatorHelper__CreateSourceTexture__Rif(mediapipe::GlCalculatorHelper* gl_calculator_helper,
mediapipe::ImageFrame* image_frame,
Expand Down
2 changes: 1 addition & 1 deletion C/mediapipe_api/gpu/gl_texture_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ MpReturnCode mp_SharedGlTextureBuffer__ui_ui_i_i_ui_PF_PSgc(GLenum target,
std::shared_ptr<mediapipe::GlContext>* producer_context,
SharedGlTextureBuffer** gl_texture_buffer_out) {
TRY {
auto callback = [&deletion_callback](mediapipe::GlSyncToken token) -> void {
auto callback = [deletion_callback](mediapipe::GlSyncToken token) -> void {
deletion_callback(new mediapipe::GlSyncToken { token });
};
*gl_texture_buffer_out = new SharedGlTextureBuffer {
Expand Down

0 comments on commit fad3ca1

Please sign in to comment.