1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
5 // Copyright (C) 2019 Intel Corporation
10 #include <ade/graph.hpp>
11 #include <ade/util/zip_range.hpp> // util::indexed
13 #include <opencv2/gapi/gproto.hpp> // can_describe
14 #include <opencv2/gapi/gcompiled.hpp>
16 #include "compiler/gstreaming_priv.hpp"
17 #include "backends/common/gbackend.hpp"
19 // GStreamingCompiled private implementation ///////////////////////////////////
20 void cv::GStreamingCompiled::Priv::setup(const GMetaArgs &_metaArgs,
21 const GMetaArgs &_outMetas,
22 std::unique_ptr<cv::gimpl::GStreamingExecutor> &&_pE)
25 m_outMetas = _outMetas;
26 m_exec = std::move(_pE);
29 void cv::GStreamingCompiled::Priv::setup(std::unique_ptr<cv::gimpl::GStreamingExecutor> &&_pE)
31 m_exec = std::move(_pE);
34 bool cv::GStreamingCompiled::Priv::isEmpty() const
39 const cv::GMetaArgs& cv::GStreamingCompiled::Priv::metas() const
44 const cv::GMetaArgs& cv::GStreamingCompiled::Priv::outMetas() const
49 // FIXME: What is the reason in having Priv here if Priv actually dispatches
50 // everything to the underlying executable?? May be this executable may become
51 // the G*Compiled's priv?
52 void cv::GStreamingCompiled::Priv::setSource(cv::GRunArgs &&args)
54 if (!m_metas.empty() && !can_describe(m_metas, args))
56 util::throw_error(std::logic_error("This object was compiled "
57 "for different metadata!"));
59 GAPI_Assert(m_exec != nullptr);
60 m_exec->setSource(std::move(args));
63 void cv::GStreamingCompiled::Priv::start()
68 bool cv::GStreamingCompiled::Priv::pull(cv::GRunArgsP &&outs)
70 return m_exec->pull(std::move(outs));
73 bool cv::GStreamingCompiled::Priv::pull(cv::GOptRunArgsP &&outs)
75 return m_exec->pull(std::move(outs));
78 std::tuple<bool, cv::util::variant<cv::GRunArgs, cv::GOptRunArgs>> cv::GStreamingCompiled::Priv::pull()
80 return m_exec->pull();
83 bool cv::GStreamingCompiled::Priv::try_pull(cv::GRunArgsP &&outs)
85 return m_exec->try_pull(std::move(outs));
88 void cv::GStreamingCompiled::Priv::stop()
93 bool cv::GStreamingCompiled::Priv::running() const
95 return m_exec->running();
98 // GStreamingCompiled public implementation ////////////////////////////////////
99 cv::GStreamingCompiled::GStreamingCompiled()
104 // NB: This overload is called from python code
105 void cv::GStreamingCompiled::setSource(const cv::detail::ExtractArgsCallback& callback)
107 setSource(callback(m_priv->inInfo()));
110 void cv::GStreamingCompiled::setSource(GRunArgs &&ins)
112 // FIXME: verify these input parameters according to the graph input meta
113 m_priv->setSource(std::move(ins));
116 void cv::GStreamingCompiled::setSource(const cv::gapi::wip::IStreamSource::Ptr &s)
118 setSource(cv::gin(s));
121 void cv::GStreamingCompiled::start()
126 bool cv::GStreamingCompiled::pull(cv::GRunArgsP &&outs)
128 return m_priv->pull(std::move(outs));
131 std::tuple<bool, cv::util::variant<cv::GRunArgs, cv::GOptRunArgs>> cv::GStreamingCompiled::pull()
133 return m_priv->pull();
136 bool cv::GStreamingCompiled::pull(cv::GOptRunArgsP &&outs)
138 return m_priv->pull(std::move(outs));
141 bool cv::GStreamingCompiled::try_pull(cv::GRunArgsP &&outs)
143 return m_priv->try_pull(std::move(outs));
146 void cv::GStreamingCompiled::stop()
151 bool cv::GStreamingCompiled::running() const
153 return m_priv->running();
156 cv::GStreamingCompiled::operator bool() const
158 return !m_priv->isEmpty();
161 const cv::GMetaArgs& cv::GStreamingCompiled::metas() const
163 return m_priv->metas();
166 const cv::GMetaArgs& cv::GStreamingCompiled::outMetas() const
168 return m_priv->outMetas();
171 cv::GStreamingCompiled::Priv& cv::GStreamingCompiled::priv()