mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 15:23:05 +04:00
G-API: Introduce streaming::desync and infer(ROI)
- desync() is a new (and for now, the only one) intrinsic which splits the graph execution into asynchronous parts when running in Streaming mode; - desync() makes no effect when compiling in Traditional mode; - Added tests on desync() working in various scenarios; - Extended GStreamingExecutor to support desync(); also extended GStreamingCompiled() with a new version of pull() returning a vector of optional values; - Fixed various issues with storing the type information & proper construction callbacks for GArray<> and GOpaque; - Introduced a new infer(Roi,GMat) overload with a sample; - Introduced an internal API for Islands to control fusion procedure (to fuse or not to fuse); - Introduced handleStopStream() callback for island executables; - Added GCompileArgs to metadata of the graph (required for other features).
This commit is contained in:
@@ -77,7 +77,7 @@ ade::NodeHandle GModel::mkDataNode(GModel::Graph &g, const GShape shape)
|
||||
return data_h;
|
||||
}
|
||||
|
||||
void GModel::linkIn(Graph &g, ade::NodeHandle opH, ade::NodeHandle objH, std::size_t in_port)
|
||||
ade::EdgeHandle GModel::linkIn(Graph &g, ade::NodeHandle opH, ade::NodeHandle objH, std::size_t in_port)
|
||||
{
|
||||
// Check if input is already connected
|
||||
for (const auto& in_e : opH->inEdges())
|
||||
@@ -96,9 +96,11 @@ void GModel::linkIn(Graph &g, ade::NodeHandle opH, ade::NodeHandle objH, std::si
|
||||
|
||||
// Replace an API object with a REF (G* -> GOBJREF)
|
||||
op.args[in_port] = cv::GArg(RcDesc{gm.rc, gm.shape, {}});
|
||||
|
||||
return eh;
|
||||
}
|
||||
|
||||
void GModel::linkOut(Graph &g, ade::NodeHandle opH, ade::NodeHandle objH, std::size_t out_port)
|
||||
ade::EdgeHandle GModel::linkOut(Graph &g, ade::NodeHandle opH, ade::NodeHandle objH, std::size_t out_port)
|
||||
{
|
||||
// FIXME: check validity using kernel prototype
|
||||
|
||||
@@ -121,6 +123,8 @@ void GModel::linkOut(Graph &g, ade::NodeHandle opH, ade::NodeHandle objH, std::s
|
||||
const auto min_out_size = std::max(op.outs.size(), storage_with_port);
|
||||
op.outs.resize(min_out_size, RcDesc{-1,GShape::GMAT,{}}); // FIXME: Invalid shape instead?
|
||||
op.outs[out_port] = RcDesc{gm.rc, gm.shape, {}};
|
||||
|
||||
return eh;
|
||||
}
|
||||
|
||||
std::vector<ade::NodeHandle> GModel::orderedInputs(const ConstGraph &g, ade::NodeHandle nh)
|
||||
@@ -210,26 +214,29 @@ ade::NodeHandle GModel::detail::dataNodeOf(const ConstLayoutGraph &g, const GOri
|
||||
return g.metadata().get<Layout>().object_nodes.at(origin);
|
||||
}
|
||||
|
||||
void GModel::redirectReaders(Graph &g, ade::NodeHandle from, ade::NodeHandle to)
|
||||
std::vector<ade::EdgeHandle> GModel::redirectReaders(Graph &g, ade::NodeHandle from, ade::NodeHandle to)
|
||||
{
|
||||
std::vector<ade::EdgeHandle> ehh(from->outEdges().begin(), from->outEdges().end());
|
||||
std::vector<ade::EdgeHandle> ohh;
|
||||
ohh.reserve(ehh.size());
|
||||
for (auto e : ehh)
|
||||
{
|
||||
auto dst = e->dstNode();
|
||||
auto input = g.metadata(e).get<Input>();
|
||||
g.erase(e);
|
||||
linkIn(g, dst, to, input.port);
|
||||
ohh.push_back(linkIn(g, dst, to, input.port));
|
||||
}
|
||||
return ohh;
|
||||
}
|
||||
|
||||
void GModel::redirectWriter(Graph &g, ade::NodeHandle from, ade::NodeHandle to)
|
||||
ade::EdgeHandle GModel::redirectWriter(Graph &g, ade::NodeHandle from, ade::NodeHandle to)
|
||||
{
|
||||
GAPI_Assert(from->inEdges().size() == 1);
|
||||
auto e = from->inEdges().front();
|
||||
auto op = e->srcNode();
|
||||
auto output = g.metadata(e).get<Output>();
|
||||
g.erase(e);
|
||||
linkOut(g, op, to, output.port);
|
||||
return linkOut(g, op, to, output.port);
|
||||
}
|
||||
|
||||
GMetaArgs GModel::collectInputMeta(const GModel::ConstGraph &cg, ade::NodeHandle node)
|
||||
|
||||
Reference in New Issue
Block a user