Path: blob/master/modules/gapi/src/backends/fluid/gfluidbuffer_priv.hpp
16344 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.3//4// Copyright (C) 2018 Intel Corporation567#ifndef OPENCV_GAPI_FLUID_BUFFER_PRIV_HPP8#define OPENCV_GAPI_FLUID_BUFFER_PRIV_HPP910#include <vector>1112#include "opencv2/gapi/fluid/gfluidbuffer.hpp"13#include "opencv2/gapi/own/exports.hpp" // GAPI_EXPORTS1415namespace cv {16namespace gapi {17namespace fluid {1819class BufferStorageWithBorder;2021class BorderHandler22{23protected:24int m_border_size;2526public:27BorderHandler(int border_size);28virtual ~BorderHandler() = default;29virtual const uint8_t* inLineB(int log_idx, const BufferStorageWithBorder &data, int desc_height) const = 0;3031// Fills border pixels after buffer allocation (if possible (for const border))32inline virtual void fillCompileTimeBorder(BufferStorageWithBorder &) const { /* nothing */ }3334// Fills required border lines35inline virtual void updateBorderPixels(BufferStorageWithBorder& /*data*/, int /*startLine*/, int /*lpi*/) const { /* nothing */ }3637inline int borderSize() const { return m_border_size; }38inline virtual std::size_t size() const { return 0; }39};4041template<int BorderType>42class BorderHandlerT : public BorderHandler43{44std::function<void(uint8_t*,int,int,int)> m_fill_border_row;45public:46BorderHandlerT(int border_size, int data_type);47virtual void updateBorderPixels(BufferStorageWithBorder& data, int startLine, int lpi) const override;48virtual const uint8_t* inLineB(int log_idx, const BufferStorageWithBorder &data, int desc_height) const override;49};5051template<>52class BorderHandlerT<cv::BORDER_CONSTANT> : public BorderHandler53{54cv::gapi::own::Scalar m_border_value;55cv::gapi::own::Mat m_const_border;5657public:58BorderHandlerT(int border_size, cv::gapi::own::Scalar border_value, int data_type, int desc_width);59virtual const uint8_t* inLineB(int log_idx, const BufferStorageWithBorder &data, int desc_height) const override;60virtual void fillCompileTimeBorder(BufferStorageWithBorder &) const override;61virtual std::size_t size() const override;62};6364class BufferStorage65{66protected:67cv::gapi::own::Mat m_data;6869public:70virtual void copyTo(BufferStorageWithBorder &dst, int startLine, int nLines) const = 0;7172virtual ~BufferStorage() = default;7374virtual const uint8_t* ptr(int idx) const = 0;75virtual uint8_t* ptr(int idx) = 0;7677inline bool empty() const { return m_data.empty(); }7879inline const cv::gapi::own::Mat& data() const { return m_data; }80inline cv::gapi::own::Mat& data() { return m_data; }8182inline int rows() const { return m_data.rows; }83inline int cols() const { return m_data.cols; }84inline int type() const { return m_data.type(); }8586virtual const uint8_t* inLineB(int log_idx, int desc_height) const = 0;8788// FIXME? remember parent and remove src parameter?89virtual void updateBeforeRead(int startLine, int nLines, const BufferStorage& src) = 0;90virtual void updateAfterWrite(int startLine, int nLines) = 0;9192virtual int physIdx(int logIdx) const = 0;9394virtual size_t size() const = 0;95};9697class BufferStorageWithoutBorder final : public BufferStorage98{99bool m_is_virtual = true;100cv::gapi::own::Rect m_roi;101102public:103virtual void copyTo(BufferStorageWithBorder &dst, int startLine, int nLines) const override;104105inline virtual const uint8_t* ptr(int idx) const override106{107GAPI_DbgAssert((m_is_virtual && m_roi == cv::gapi::own::Rect{}) || (!m_is_virtual && m_roi != cv::gapi::own::Rect{}));108return m_data.ptr(physIdx(idx), 0);109}110inline virtual uint8_t* ptr(int idx) override111{112GAPI_DbgAssert((m_is_virtual && m_roi == cv::gapi::own::Rect{}) || (!m_is_virtual && m_roi != cv::gapi::own::Rect{}));113return m_data.ptr(physIdx(idx), 0);114}115116inline void attach(const cv::gapi::own::Mat& _data, cv::gapi::own::Rect _roi)117{118m_data = _data(_roi);119m_roi = _roi;120m_is_virtual = false;121}122123void create(int capacity, int desc_width, int type);124125inline virtual const uint8_t* inLineB(int log_idx, int desc_height) const override;126127virtual void updateBeforeRead(int startLine, int nLines, const BufferStorage& src) override;128virtual void updateAfterWrite(int startLine, int nLines) override;129130inline virtual int physIdx(int logIdx) const override { return (logIdx - m_roi.y) % m_data.rows; }131132virtual size_t size() const override;133};134135class BufferStorageWithBorder final: public BufferStorage136{137std::unique_ptr<BorderHandler> m_borderHandler;138139public:140inline int borderSize() const { return m_borderHandler->borderSize(); }141142virtual void copyTo(BufferStorageWithBorder &dst, int startLine, int nLines) const override;143144inline virtual const uint8_t* ptr(int idx) const override145{146return m_data.ptr(physIdx(idx), borderSize());147}148inline virtual uint8_t* ptr(int idx) override149{150return m_data.ptr(physIdx(idx), borderSize());151}152153void create(int capacity, int desc_width, int type, int border_size, Border border);154155virtual const uint8_t* inLineB(int log_idx, int desc_height) const override;156157virtual void updateBeforeRead(int startLine, int nLines, const BufferStorage &src) override;158virtual void updateAfterWrite(int startLine, int nLines) override;159160inline virtual int physIdx(int logIdx) const override { return logIdx % m_data.rows; }161162virtual size_t size() const override;163};164165// FIXME: GAPI_EXPORTS is used here only to access internal methods166// like readDone/writeDone in low-level tests167class GAPI_EXPORTS View::Priv168{169friend class View;170protected:171const Buffer *m_p = nullptr; // FIXME replace with weak_ptr172int m_read_caret = -1;173int m_lines_next_iter = -1;174int m_border_size = -1;175176public:177virtual ~Priv() = default;178// API used by actors/backend179180virtual void prepareToRead() = 0;181182void readDone(int linesRead, int linesForNextIteration);183void reset(int linesForFirstIteration);184185virtual std::size_t size() const = 0;186187// Does the view have enough unread lines for next iteration188bool ready() const;189190// API used (indirectly) by user code191virtual const uint8_t* InLineB(int index) const = 0;192};193194class ViewPrivWithoutOwnBorder final : public View::Priv195{196public:197// API used by actors/backend198ViewPrivWithoutOwnBorder(const Buffer *p, int borderSize);199200inline virtual void prepareToRead() override { /* nothing */ }201202inline virtual std::size_t size() const override { return 0; }203204// API used (indirectly) by user code205virtual const uint8_t* InLineB(int index) const override;206};207208class ViewPrivWithOwnBorder final : public View::Priv209{210BufferStorageWithBorder m_own_storage;211212public:213// API used by actors/backend214ViewPrivWithOwnBorder(const Buffer *p, int lineCapacity, int borderSize, Border border);215216virtual void prepareToRead() override;217virtual std::size_t size() const override;218219// API used (indirectly) by user code220virtual const uint8_t* InLineB(int index) const override;221};222223void debugBufferPriv(const Buffer& buffer, std::ostream &os);224225// FIXME: GAPI_EXPORTS is used here only to access internal methods226// like readDone/writeDone in low-level tests227class GAPI_EXPORTS Buffer::Priv228{229int m_writer_lpi = 1;230231cv::GMatDesc m_desc = cv::GMatDesc{-1,-1,{-1,-1}};232bool m_is_input = false;233234int m_write_caret = -1;235236std::vector<View> m_views;237238std::unique_ptr<BufferStorage> m_storage;239240// Coordinate starting from which this buffer is assumed241// to be read (with border not being taken into account)242int m_readStart;243cv::gapi::own::Rect m_roi;244245friend void debugBufferPriv(const Buffer& p, std::ostream &os);246247public:248Priv() = default;249Priv(int read_start, cv::gapi::own::Rect roi);250251inline const BufferStorage& storage() const { return *m_storage.get(); }252253// API used by actors/backend254void init(const cv::GMatDesc &desc,255int wlpi,256int readStart,257cv::gapi::own::Rect roi);258259void allocate(BorderOpt border, int border_size, int line_consumption, int skew);260void bindTo(const cv::gapi::own::Mat &data, bool is_input);261262inline void addView(const View& view) { m_views.push_back(view); }263264inline const GMatDesc& meta() const { return m_desc; }265266bool full() const;267void writeDone();268void reset();269int size() const;270271int linesReady() const;272273inline int y() const { return m_write_caret; }274275inline int writer_lpi() const { return m_writer_lpi; }276277// API used (indirectly) by user code278uint8_t* OutLineB(int index = 0);279int lpi() const;280281inline int readStart() const { return m_readStart; }282inline int writeStart() const { return m_roi.y; }283inline int writeEnd() const { return m_roi.y + m_roi.height; }284inline int outputLines() const { return m_roi.height; }285};286287} // namespace cv::gapi::fluid288} // namespace cv::gapi289} // namespace cv290291#endif // OPENCV_GAPI_FLUID_BUFFER_PRIV_HPP292293294