diff --git a/modules/gapi/include/opencv2/gapi/streaming/format.hpp b/modules/gapi/include/opencv2/gapi/streaming/format.hpp index 8bec5dc813..4be25f220c 100644 --- a/modules/gapi/include/opencv2/gapi/streaming/format.hpp +++ b/modules/gapi/include/opencv2/gapi/streaming/format.hpp @@ -13,8 +13,7 @@ namespace cv { namespace gapi { namespace streaming { -cv::gapi::GKernelPackage kernels(); -cv::gapi::GBackend backend(); +GAPI_EXPORTS cv::gapi::GKernelPackage kernels(); // FIXME: Make a generic kernel G_API_OP(GCopy, , "org.opencv.streaming.copy") diff --git a/modules/gapi/src/backends/common/gbackend.hpp b/modules/gapi/src/backends/common/gbackend.hpp index 576168db53..6b2cabccc7 100644 --- a/modules/gapi/src/backends/common/gbackend.hpp +++ b/modules/gapi/src/backends/common/gbackend.hpp @@ -58,6 +58,35 @@ namespace gimpl { struct Data; struct RcDesc; + struct GAPI_EXPORTS RMatMediaAdapterBGR final: public cv::RMat::Adapter + { + explicit RMatMediaAdapterBGR(const cv::MediaFrame& frame) : m_frame(frame) { }; + + virtual cv::RMat::View access(cv::RMat::Access a) override + { + auto view = m_frame.access(a == cv::RMat::Access::W ? cv::MediaFrame::Access::W + : cv::MediaFrame::Access::R); + auto ptr = reinterpret_cast(view.ptr[0]); + auto stride = view.stride[0]; + + std::shared_ptr view_ptr = + std::make_shared(std::move(view)); + auto callback = [view_ptr]() mutable { view_ptr.reset(); }; + + return cv::RMat::View(desc(), ptr, stride, callback); + } + + virtual cv::GMatDesc desc() const override + { + const auto& desc = m_frame.desc(); + GAPI_Assert(desc.fmt == cv::MediaFormat::BGR); + return cv::GMatDesc{CV_8U, 3, desc.size}; + } + + cv::MediaFrame m_frame; + }; + + namespace magazine { template struct Class { diff --git a/modules/gapi/src/backends/streaming/gstreamingbackend.cpp b/modules/gapi/src/backends/streaming/gstreamingbackend.cpp index d5f042de0b..5f6dbab356 100644 --- a/modules/gapi/src/backends/streaming/gstreamingbackend.cpp +++ b/modules/gapi/src/backends/streaming/gstreamingbackend.cpp @@ -55,6 +55,7 @@ class GStreamingIntrinExecutable final: public cv::gimpl::GIslandExecutable public: GStreamingIntrinExecutable(const ade::Graph &, + const cv::GCompileArgs &, const std::vector &); const ade::Graph& m_g; @@ -80,10 +81,10 @@ class GStreamingBackendImpl final: public cv::gapi::GBackend::Priv } virtual EPtr compile(const ade::Graph &graph, - const cv::GCompileArgs &, + const cv::GCompileArgs &args, const std::vector &nodes) const override { - return EPtr{new GStreamingIntrinExecutable(graph, nodes)}; + return EPtr{new GStreamingIntrinExecutable(graph, args, nodes)}; } virtual bool controlsMerge() const override @@ -101,6 +102,7 @@ class GStreamingBackendImpl final: public cv::gapi::GBackend::Priv }; GStreamingIntrinExecutable::GStreamingIntrinExecutable(const ade::Graph& g, + const cv::GCompileArgs& args, const std::vector& nodes) : m_g(g), m_gm(m_g) { @@ -114,7 +116,7 @@ GStreamingIntrinExecutable::GStreamingIntrinExecutable(const ade::Graph& g, GAPI_Assert(it != nodes.end() && "No operators found for this island?!"); ConstStreamingGraph cag(m_g); - m_actor = cag.metadata(*it).get().createActorFunction(); + m_actor = cag.metadata(*it).get().createActorFunction(args); // Ensure this the only op in the graph if (std::any_of(it+1, nodes.end(), is_op)) @@ -141,63 +143,57 @@ cv::gapi::GKernelPackage cv::gapi::streaming::kernels() void cv::gimpl::Copy::Actor::run(cv::gimpl::GIslandExecutable::IInput &in, cv::gimpl::GIslandExecutable::IOutput &out) { - while (true) + const auto in_msg = in.get(); + if (cv::util::holds_alternative(in_msg)) { - const auto in_msg = in.get(); - if (cv::util::holds_alternative(in_msg)) - { - out.post(cv::gimpl::EndOfStream{}); - return; - } - - const cv::GRunArgs &in_args = cv::util::get(in_msg); - GAPI_Assert(in_args.size() == 1u); - - cv::GRunArgP out_arg = out.get(0); - *cv::util::get(out_arg) = cv::util::get(in_args[0]); - out.post(std::move(out_arg)); + out.post(cv::gimpl::EndOfStream{}); + return; } + + const cv::GRunArgs &in_args = cv::util::get(in_msg); + GAPI_Assert(in_args.size() == 1u); + + cv::GRunArgP out_arg = out.get(0); + *cv::util::get(out_arg) = cv::util::get(in_args[0]); + out.post(std::move(out_arg)); } void cv::gimpl::BGR::Actor::run(cv::gimpl::GIslandExecutable::IInput &in, cv::gimpl::GIslandExecutable::IOutput &out) { - while (true) + const auto in_msg = in.get(); + if (cv::util::holds_alternative(in_msg)) { - const auto in_msg = in.get(); - if (cv::util::holds_alternative(in_msg)) - { - out.post(cv::gimpl::EndOfStream{}); - return; - } - - const cv::GRunArgs &in_args = cv::util::get(in_msg); - GAPI_Assert(in_args.size() == 1u); - - cv::GRunArgP out_arg = out.get(0); - auto frame = cv::util::get(in_args[0]); - const auto& desc = frame.desc(); - - auto& rmat = *cv::util::get(out_arg); - switch (desc.fmt) - { - case cv::MediaFormat::BGR: - rmat = cv::make_rmat(frame); - break; - case cv::MediaFormat::NV12: + out.post(cv::gimpl::EndOfStream{}); + return; + } + + const cv::GRunArgs &in_args = cv::util::get(in_msg); + GAPI_Assert(in_args.size() == 1u); + + cv::GRunArgP out_arg = out.get(0); + auto frame = cv::util::get(in_args[0]); + const auto& desc = frame.desc(); + + auto& rmat = *cv::util::get(out_arg); + switch (desc.fmt) + { + case cv::MediaFormat::BGR: + rmat = cv::make_rmat(frame); + break; + case cv::MediaFormat::NV12: { cv::Mat bgr; auto view = frame.access(cv::MediaFrame::Access::R); - cv::Mat y_plane (desc.size, CV_8UC1, view.ptr[0]); - cv::Mat uv_plane(desc.size / 2, CV_8UC2, view.ptr[1]); + cv::Mat y_plane (desc.size, CV_8UC1, view.ptr[0], view.stride[0]); + cv::Mat uv_plane(desc.size / 2, CV_8UC2, view.ptr[1], view.stride[1]); cv::cvtColorTwoPlane(y_plane, uv_plane, bgr, cv::COLOR_YUV2BGR_NV12); rmat = cv::make_rmat(bgr); break; } - default: - cv::util::throw_error( - std::logic_error("Unsupported MediaFormat for cv::gapi::streaming::BGR")); - } - out.post(std::move(out_arg)); + default: + cv::util::throw_error( + std::logic_error("Unsupported MediaFormat for cv::gapi::streaming::BGR")); } + out.post(std::move(out_arg)); } diff --git a/modules/gapi/src/backends/streaming/gstreamingbackend.hpp b/modules/gapi/src/backends/streaming/gstreamingbackend.hpp index bb2100c159..31e8e24555 100644 --- a/modules/gapi/src/backends/streaming/gstreamingbackend.hpp +++ b/modules/gapi/src/backends/streaming/gstreamingbackend.hpp @@ -14,34 +14,6 @@ namespace cv { namespace gimpl { -struct RMatMediaBGRAdapter final: public cv::RMat::Adapter -{ - RMatMediaBGRAdapter(cv::MediaFrame frame) : m_frame(frame) { }; - - virtual cv::RMat::View access(cv::RMat::Access a) override - { - auto view = m_frame.access(a == cv::RMat::Access::W ? cv::MediaFrame::Access::W - : cv::MediaFrame::Access::R); - auto ptr = reinterpret_cast(view.ptr[0]); - auto stride = view.stride[0]; - - std::shared_ptr view_ptr = - std::make_shared(std::move(view)); - auto callback = [view_ptr]() mutable { view_ptr.reset(); }; - - return cv::RMat::View(desc(), ptr, stride, callback); - } - - virtual cv::GMatDesc desc() const override - { - const auto& desc = m_frame.desc(); - GAPI_Assert(desc.fmt == cv::MediaFormat::BGR); - return cv::GMatDesc{CV_8U, 3, desc.size}; - } - - cv::MediaFrame m_frame; -}; - struct Copy: public cv::detail::KernelTag { using API = cv::gapi::streaming::GCopy; @@ -51,14 +23,14 @@ struct Copy: public cv::detail::KernelTag class Actor final: public cv::gapi::streaming::IActor { public: - explicit Actor() {} + explicit Actor(const cv::GCompileArgs&) {} virtual void run(cv::gimpl::GIslandExecutable::IInput &in, cv::gimpl::GIslandExecutable::IOutput &out) override; }; - static cv::gapi::streaming::IActor::Ptr create() + static cv::gapi::streaming::IActor::Ptr create(const cv::GCompileArgs& args) { - return cv::gapi::streaming::IActor::Ptr(new Actor()); + return cv::gapi::streaming::IActor::Ptr(new Actor(args)); } static cv::gapi::streaming::GStreamingKernel kernel() { return {&create}; }; @@ -71,14 +43,14 @@ struct BGR: public cv::detail::KernelTag class Actor final: public cv::gapi::streaming::IActor { public: - explicit Actor() {} + explicit Actor(const cv::GCompileArgs&) {} virtual void run(cv::gimpl::GIslandExecutable::IInput &in, cv::gimpl::GIslandExecutable::IOutput&out) override; }; - static cv::gapi::streaming::IActor::Ptr create() + static cv::gapi::streaming::IActor::Ptr create(const cv::GCompileArgs& args) { - return cv::gapi::streaming::IActor::Ptr(new Actor()); + return cv::gapi::streaming::IActor::Ptr(new Actor(args)); } static cv::gapi::streaming::GStreamingKernel kernel() { return {&create}; }; }; diff --git a/modules/gapi/src/backends/streaming/gstreamingkernel.hpp b/modules/gapi/src/backends/streaming/gstreamingkernel.hpp index 4732262aa0..9b73b77be8 100644 --- a/modules/gapi/src/backends/streaming/gstreamingkernel.hpp +++ b/modules/gapi/src/backends/streaming/gstreamingkernel.hpp @@ -14,6 +14,8 @@ namespace cv { namespace gapi { namespace streaming { +GAPI_EXPORTS cv::gapi::GBackend backend(); + class IActor { public: using Ptr = std::shared_ptr; @@ -24,7 +26,7 @@ public: virtual ~IActor() = default; }; -using CreateActorFunction = std::function; +using CreateActorFunction = std::function; struct GStreamingKernel { CreateActorFunction createActorFunction;