Skip to content

Commit 521aac9

Browse files
author
Dmitry Budnikov
authored
Merge pull request opencv#17694 from dbudniko:dbudniko/serialization_args2
G-API args serialization * args serialization * GRunArgP draft * UMat added * bind added * DmitryM's review addressed. Code clean up required. * fix android build * bind test added * more comments addressed * try to fix Mac build * clean up * header-based generic implementation (GRunArg) * clang again * one more attempt for clang * more clean up * More Dmitry's comments addressed. * monostate removed * Top level functions and some other comments addressed. * fix warnings * disable warning
1 parent 3d50bde commit 521aac9

File tree

6 files changed

+358
-26
lines changed

6 files changed

+358
-26
lines changed

modules/gapi/include/opencv2/gapi/garg.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ using GRunArgP = util::variant<
133133
>;
134134
using GRunArgsP = std::vector<GRunArgP>;
135135

136+
namespace gapi
137+
{
138+
GAPI_EXPORTS cv::GRunArgsP bind(cv::GRunArgs &results);
139+
}
140+
136141
template<typename... Ts> inline GRunArgs gin(const Ts&... args)
137142
{
138143
return GRunArgs{ GRunArg(detail::wrap_host_helper<Ts>::wrap_in(args))... };

modules/gapi/include/opencv2/gapi/s11n.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ namespace detail {
1717
GAPI_EXPORTS cv::GComputation getGraph(const std::vector<char> &p);
1818
} // namespace detail
1919

20+
namespace detail {
21+
GAPI_EXPORTS cv::GMetaArgs getMetaArgs(const std::vector<char> &p);
22+
} // namespace detail
23+
24+
namespace detail {
25+
GAPI_EXPORTS cv::GRunArgs getRunArgs(const std::vector<char> &p);
26+
} // namespace detail
27+
2028
GAPI_EXPORTS std::vector<char> serialize(const cv::GComputation &c);
2129
//namespace{
2230

@@ -25,11 +33,23 @@ T deserialize(const std::vector<char> &p);
2533

2634
//} //ananymous namespace
2735

36+
GAPI_EXPORTS std::vector<char> serialize(const cv::GMetaArgs&);
37+
GAPI_EXPORTS std::vector<char> serialize(const cv::GRunArgs&);
38+
2839
template<> inline
2940
cv::GComputation deserialize(const std::vector<char> &p) {
3041
return detail::getGraph(p);
3142
}
3243

44+
template<> inline
45+
cv::GMetaArgs deserialize(const std::vector<char> &p) {
46+
return detail::getMetaArgs(p);
47+
}
48+
49+
template<> inline
50+
cv::GRunArgs deserialize(const std::vector<char> &p) {
51+
return detail::getRunArgs(p);
52+
}
3353

3454

3555
} // namespace gapi

modules/gapi/src/api/s11n.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Copyright (C) 2020 Intel Corporation
66

77
#include <opencv2/gapi/s11n.hpp>
8+
#include <opencv2/gapi/garg.hpp>
89

910
#include "backends/common/serialization.hpp"
1011

@@ -18,3 +19,61 @@ cv::GComputation cv::gapi::detail::getGraph(const std::vector<char> &p) {
1819
cv::gimpl::s11n::ByteMemoryInStream is(p);
1920
return cv::GComputation(is);
2021
}
22+
23+
cv::GMetaArgs cv::gapi::detail::getMetaArgs(const std::vector<char> &p) {
24+
cv::gimpl::s11n::ByteMemoryInStream is(p);
25+
return meta_args_deserialize(is);
26+
}
27+
28+
cv::GRunArgs cv::gapi::detail::getRunArgs(const std::vector<char> &p) {
29+
cv::gimpl::s11n::ByteMemoryInStream is(p);
30+
return run_args_deserialize(is);
31+
}
32+
33+
std::vector<char> cv::gapi::serialize(const cv::GMetaArgs& ma)
34+
{
35+
cv::gimpl::s11n::ByteMemoryOutStream os;
36+
serialize(os, ma);
37+
return os.data();
38+
}
39+
40+
std::vector<char> cv::gapi::serialize(const cv::GRunArgs& ra)
41+
{
42+
cv::gimpl::s11n::ByteMemoryOutStream os;
43+
serialize(os, ra);
44+
return os.data();
45+
}
46+
47+
cv::GRunArgsP cv::gapi::bind(cv::GRunArgs &results)
48+
{
49+
cv::GRunArgsP outputs;
50+
outputs.reserve(results.size());
51+
for (cv::GRunArg &res_obj : results)
52+
{
53+
using T = cv::GRunArg;
54+
switch (res_obj.index())
55+
{
56+
#if !defined(GAPI_STANDALONE)
57+
case T::index_of<cv::UMat>() :
58+
outputs.emplace_back((cv::UMat*)(&(cv::util::get<cv::UMat>(res_obj))));
59+
break;
60+
#endif
61+
case cv::GRunArg::index_of<cv::Mat>() :
62+
outputs.emplace_back((cv::Mat*)(&(cv::util::get<cv::Mat>(res_obj))));
63+
break;
64+
case cv::GRunArg::index_of<cv::Scalar>() :
65+
outputs.emplace_back((cv::Scalar*)(&(cv::util::get<cv::Scalar>(res_obj))));
66+
break;
67+
case T::index_of<cv::detail::VectorRef>() :
68+
outputs.emplace_back(cv::util::get<cv::detail::VectorRef>(res_obj));
69+
break;
70+
case T::index_of<cv::detail::OpaqueRef>() :
71+
outputs.emplace_back(cv::util::get<cv::detail::OpaqueRef>(res_obj));
72+
break;
73+
default:
74+
GAPI_Assert(false && "This value type is not supported!"); // ...maybe because of STANDALONE mode.
75+
break;
76+
}
77+
}
78+
return outputs;
79+
}

modules/gapi/src/backends/common/serialization.cpp

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,51 @@ I::IStream& operator>> (I::IStream& is, cv::GOpaqueDesc &) {return is;}
268268
I::OStream& operator<< (I::OStream& os, const cv::GArrayDesc &) {return os;}
269269
I::IStream& operator>> (I::IStream& is, cv::GArrayDesc &) {return is;}
270270

271+
#if !defined(GAPI_STANDALONE)
272+
I::OStream& operator<< (I::OStream& os, const cv::UMat &)
273+
{
274+
GAPI_Assert(false && "Serialization: Unsupported << for UMat");
275+
return os;
276+
}
277+
I::IStream& operator >> (I::IStream& is, cv::UMat &)
278+
{
279+
GAPI_Assert(false && "Serialization: Unsupported >> for UMat");
280+
return is;
281+
}
282+
#endif // !defined(GAPI_STANDALONE)
283+
284+
I::OStream& operator<< (I::OStream& os, const cv::gapi::wip::IStreamSource::Ptr &)
285+
{
286+
GAPI_Assert(false && "Serialization: Unsupported << for IStreamSource::Ptr");
287+
return os;
288+
}
289+
I::IStream& operator >> (I::IStream& is, cv::gapi::wip::IStreamSource::Ptr &)
290+
{
291+
GAPI_Assert("Serialization: Unsupported >> for IStreamSource::Ptr");
292+
return is;
293+
}
294+
295+
I::OStream& operator<< (I::OStream& os, const cv::detail::VectorRef &)
296+
{
297+
GAPI_Assert(false && "Serialization: Unsupported << for cv::detail::VectorRef &");
298+
return os;
299+
}
300+
I::IStream& operator >> (I::IStream& is, cv::detail::VectorRef &)
301+
{
302+
GAPI_Assert(false && "Serialization: Unsupported >> for cv::detail::VectorRef &");
303+
return is;
304+
}
305+
306+
I::OStream& operator<< (I::OStream& os, const cv::detail::OpaqueRef &)
307+
{
308+
GAPI_Assert(false && "Serialization: Unsupported << for cv::detail::OpaqueRef &");
309+
return os;
310+
}
311+
I::IStream& operator >> (I::IStream& is, cv::detail::OpaqueRef &)
312+
{
313+
GAPI_Assert(false && "Serialization: Unsupported >> for cv::detail::OpaqueRef &");
314+
return is;
315+
}
271316
// Enums and structures
272317

273318
namespace {
@@ -363,7 +408,6 @@ I::IStream& operator>> (I::IStream& is, cv::GArg &arg) {
363408
return is;
364409
}
365410

366-
367411
I::OStream& operator<< (I::OStream& os, const cv::GKernel &k) {
368412
return os << k.name << k.tag << k.outShapes;
369413
}
@@ -608,6 +652,24 @@ I::IStream& ByteMemoryInStream::operator>> (std::string& str) {
608652
return *this;
609653
}
610654

655+
GAPI_EXPORTS void serialize(I::OStream& os, const cv::GMetaArgs &ma) {
656+
os << ma;
657+
}
658+
GAPI_EXPORTS void serialize(I::OStream& os, const cv::GRunArgs &ra) {
659+
os << ra;
660+
}
661+
GAPI_EXPORTS GMetaArgs meta_args_deserialize(I::IStream& is) {
662+
GMetaArgs s;
663+
is >> s;
664+
return s;
665+
}
666+
GAPI_EXPORTS GRunArgs run_args_deserialize(I::IStream& is) {
667+
GRunArgs s;
668+
is >> s;
669+
return s;
670+
}
671+
672+
611673
} // namespace s11n
612674
} // namespace gimpl
613675
} // namespace cv

modules/gapi/src/backends/common/serialization.hpp

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515

1616
#include "compiler/gmodel.hpp"
1717

18+
#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
19+
#pragma warning(disable: 4702)
20+
#endif
21+
1822
namespace cv {
1923
namespace gimpl {
2024
namespace s11n {
@@ -85,6 +89,8 @@ GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::Scalar &s);
8589
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::Mat &m);
8690
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::Mat &m);
8791

92+
93+
8894
// G-API types /////////////////////////////////////////////////////////////////
8995

9096
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, cv::util::monostate );
@@ -111,6 +117,11 @@ GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::gimpl::Protocol &
111117
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::GArg &arg);
112118
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::GArg &arg);
113119

120+
//Forward declaration
121+
//I::OStream& operator<< (I::OStream& os, const cv::GRunArg &arg);
122+
//I::IStream& operator>> (I::IStream& is, cv::GRunArg &arg);
123+
124+
114125
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::GKernel &k);
115126
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::GKernel &k);
116127

@@ -126,6 +137,20 @@ GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::GOpaqueDesc &);
126137
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::GArrayDesc &);
127138
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::GArrayDesc &);
128139

140+
#if !defined(GAPI_STANDALONE)
141+
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::UMat &);
142+
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::UMat &);
143+
#endif // !defined(GAPI_STANDALONE)
144+
145+
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::gapi::wip::IStreamSource::Ptr &);
146+
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::gapi::wip::IStreamSource::Ptr &);
147+
148+
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::detail::VectorRef &);
149+
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::detail::VectorRef &);
150+
151+
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::detail::OpaqueRef &);
152+
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::detail::OpaqueRef &);
153+
129154
GAPI_EXPORTS I::OStream& operator<< (I::OStream& os, const cv::gimpl::RcDesc &rc);
130155
GAPI_EXPORTS I::IStream& operator>> (I::IStream& is, cv::gimpl::RcDesc &rc);
131156

@@ -163,31 +188,6 @@ GAPI_EXPORTS GSerialized deserialize(I::IStream& is);
163188
GAPI_EXPORTS void reconstruct(const GSerialized &s, ade::Graph &g);
164189

165190
// Legacy //////////////////////////////////////////////////////////////////////
166-
167-
168-
// Generic: vector serialization ///////////////////////////////////////////////
169-
template<typename T>
170-
I::OStream& operator<< (I::OStream& os, const std::vector<T> &ts) {
171-
//const std::size_t sz = ts.size(); // explicitly specify type
172-
const uint32_t sz = (uint32_t)ts.size(); // explicitly specify type
173-
os << sz;
174-
for (auto &&v : ts) os << v;
175-
return os;
176-
}
177-
template<typename T>
178-
I::IStream& operator>> (I::IStream& is, std::vector<T> &ts) {
179-
//std::size_t sz = 0u;
180-
uint32_t sz = 0u;
181-
is >> sz;
182-
if (sz == 0u) {
183-
ts.clear();
184-
} else {
185-
ts.resize(sz);
186-
for (auto &&i : ade::util::iota(sz)) is >> ts[i];
187-
}
188-
return is;
189-
}
190-
191191
// Generic: unordered_map serialization ////////////////////////////////////////
192192
template<typename K, typename V>
193193
I::OStream& operator<< (I::OStream& os, const std::unordered_map<K, V> &m) {
@@ -256,6 +256,32 @@ I::IStream& operator>> (I::IStream& is, cv::util::variant<Ts...> &v) {
256256
return detail::get_v<cv::util::variant<Ts...>, Ts...>(is, v, 0u, idx);
257257
}
258258

259+
// Generic: vector serialization ///////////////////////////////////////////////
260+
// Moved here to fix CLang issues https://clang.llvm.org/compatibility.html
261+
// Unqualified lookup in templates
262+
template<typename T>
263+
I::OStream& operator<< (I::OStream& os, const std::vector<T> &ts) {
264+
//const std::size_t sz = ts.size(); // explicitly specify type
265+
const uint32_t sz = (uint32_t)ts.size(); // explicitly specify type
266+
os << sz;
267+
for (auto &&v : ts) os << v;
268+
return os;
269+
}
270+
template<typename T>
271+
I::IStream& operator >> (I::IStream& is, std::vector<T> &ts) {
272+
//std::size_t sz = 0u;
273+
uint32_t sz = 0u;
274+
is >> sz;
275+
if (sz == 0u) {
276+
ts.clear();
277+
}
278+
else {
279+
ts.resize(sz);
280+
for (auto &&i : ade::util::iota(sz)) is >> ts[i];
281+
}
282+
return is;
283+
}
284+
259285
// FIXME: Basic Stream implementaions //////////////////////////////////////////
260286

261287
// Basic in-memory stream implementations.
@@ -305,6 +331,10 @@ class GAPI_EXPORTS ByteMemoryInStream final: public I::IStream {
305331
virtual I::IStream& operator>> (std::string &) override;
306332
};
307333

334+
GAPI_EXPORTS void serialize(I::OStream& os, const cv::GMetaArgs &ma);
335+
GAPI_EXPORTS void serialize(I::OStream& os, const cv::GRunArgs &ra);
336+
GAPI_EXPORTS GMetaArgs meta_args_deserialize(I::IStream& is);
337+
GAPI_EXPORTS GRunArgs run_args_deserialize(I::IStream& is);
308338

309339
} // namespace s11n
310340
} // namespace gimpl

0 commit comments

Comments
 (0)