Line data Source code
1 : /* SPDX-License-Identifier: LGPL-2.1-only */
2 : /**
3 : * GStreamer / NNStreamer gRPC/flatbuf support
4 : * Copyright (C) 2020 Dongju Chae <dongju.chae@samsung.com>
5 : */
6 : /**
7 : * @file nnstreamer_grpc_flatbuffer.h
8 : * @date 26 Nov 2020
9 : * @brief nnstreamer gRPC/Flatbuf support
10 : * @see https://github.com/nnstreamer/nnstreamer
11 : * @author Dongju Chae <dongju.chae@samsung.com>
12 : * @bug No known bugs except for NYI items
13 : */
14 :
15 : #ifndef __NNS_GRPC_FLATBUF_H__
16 : #define __NNS_GRPC_FLATBUF_H__
17 :
18 : #include "nnstreamer_grpc_common.h"
19 : #include "nnstreamer.grpc.fb.h" /* Generated by `flatc` */
20 :
21 : using nnstreamer::flatbuf::TensorService;
22 : using nnstreamer::flatbuf::Tensors;
23 : using nnstreamer::flatbuf::Tensor;
24 : using nnstreamer::flatbuf::Empty;
25 :
26 : using flatbuffers::grpc::Message;
27 :
28 : namespace grpc {
29 :
30 : /**
31 : * @brief NNStreamer gRPC flatbuf service impl.
32 : */
33 : class ServiceImplFlatbuf : public NNStreamerRPC
34 : {
35 : public:
36 : ServiceImplFlatbuf (const grpc_config * config);
37 :
38 : void parse_tensors (Message<Tensors> &tensors);
39 : gboolean fill_tensors (Message<Tensors> &tensors);
40 :
41 : protected:
42 : template <typename T>
43 : grpc::Status _write_tensors (T writer);
44 :
45 : template <typename T>
46 : grpc::Status _read_tensors (T reader);
47 :
48 : void _get_tensors_from_buffer (GstBuffer *buffer, Message<Tensors> &tensors);
49 : void _get_buffer_from_tensors (Message<Tensors> &tensors, GstBuffer **buffer);
50 :
51 : std::unique_ptr<nnstreamer::flatbuf::TensorService::Stub> client_stub_;
52 : };
53 :
54 : /**
55 : * @brief NNStreamer gRPC flatbuf sync service impl.
56 : */
57 : class SyncServiceImplFlatbuf final
58 : : public ServiceImplFlatbuf, public TensorService::Service
59 : {
60 : public:
61 : SyncServiceImplFlatbuf (const grpc_config * config);
62 :
63 : Status SendTensors (ServerContext *context, ServerReader<Message<Tensors>> *reader,
64 : Message<Empty> *replay) override;
65 :
66 : Status RecvTensors (ServerContext *context, const Message<Empty> *request,
67 : ServerWriter<Message<Tensors>> *writer) override;
68 :
69 : private:
70 : gboolean start_server (std::string address) override;
71 : gboolean start_client (std::string address) override;
72 :
73 : void _client_thread ();
74 : };
75 :
76 : class AsyncCallData;
77 :
78 : /**
79 : * @brief NNStreamer gRPC flatbuf async service impl.
80 : */
81 : class AsyncServiceImplFlatbuf final
82 : : public ServiceImplFlatbuf, public TensorService::AsyncService
83 : {
84 : public:
85 : AsyncServiceImplFlatbuf (const grpc_config * config);
86 : ~AsyncServiceImplFlatbuf ();
87 :
88 : /** @brief set the last call data */
89 4 : void set_last_call (AsyncCallData * call) { last_call_ = call; }
90 :
91 : private:
92 : gboolean start_server (std::string address) override;
93 : gboolean start_client (std::string address) override;
94 :
95 : void _server_thread ();
96 : void _client_thread ();
97 :
98 : AsyncCallData * last_call_;
99 : };
100 :
101 : /** @brief Internal base class to serve a request */
102 : class AsyncCallData {
103 : public:
104 : /** @brief Constructor of AsyncCallData */
105 8 : AsyncCallData (AsyncServiceImplFlatbuf *service)
106 8 : : service_ (service), state_ (CREATE), count_ (0)
107 : {
108 8 : }
109 :
110 : /** @brief Destructor of AsyncCallData */
111 2 : virtual ~AsyncCallData () {}
112 :
113 : /** @brief FSM-based state handling function */
114 0 : virtual void RunState (bool ok) {}
115 :
116 : protected:
117 : enum CallState { CREATE, PROCESS, FINISH, DESTROY };
118 :
119 : AsyncServiceImplFlatbuf *service_;
120 : CallState state_;
121 : guint count_;
122 :
123 : Message<Tensors> rpc_tensors_;
124 : Message<Empty> rpc_empty_;
125 : };
126 :
127 : }; /* namespace grpc */
128 :
129 : #endif /* __NNS_GRPC_FLATBUF_H__ */
|