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) 2018-2019 Intel Corporation
8 #ifndef OPENCV_GAPI_FLUID_BUFFER_PRIV_HPP
9 #define OPENCV_GAPI_FLUID_BUFFER_PRIV_HPP
13 #include "opencv2/gapi/fluid/gfluidbuffer.hpp"
14 #include "opencv2/gapi/own/exports.hpp" // GAPI_EXPORTS
20 class BufferStorageWithBorder;
28 BorderHandler(int border_size);
29 virtual ~BorderHandler() = default;
30 virtual const uint8_t* inLineB(int log_idx, const BufferStorageWithBorder &data, int desc_height) const = 0;
32 // Fills border pixels after buffer allocation (if possible (for const border))
33 inline virtual void fillCompileTimeBorder(BufferStorageWithBorder &) { /* nothing */ }
35 // Fills required border lines
36 inline virtual void updateBorderPixels(BufferStorageWithBorder& /*data*/, int /*startLine*/, int /*lpi*/) const { /* nothing */ }
38 inline int borderSize() const { return m_border_size; }
39 inline virtual std::size_t size() const { return 0; }
42 template<int BorderType>
43 class BorderHandlerT : public BorderHandler
45 std::function<void(uint8_t*,int,int,int)> m_fill_border_row;
47 BorderHandlerT(int border_size, int data_type);
48 virtual void updateBorderPixels(BufferStorageWithBorder& data, int startLine, int lpi) const override;
49 virtual const uint8_t* inLineB(int log_idx, const BufferStorageWithBorder &data, int desc_height) const override;
53 class BorderHandlerT<cv::BORDER_CONSTANT> : public BorderHandler
55 cv::gapi::own::Scalar m_border_value;
56 cv::gapi::own::Mat m_const_border;
59 BorderHandlerT(int border_size, cv::gapi::own::Scalar border_value);
60 virtual const uint8_t* inLineB(int log_idx, const BufferStorageWithBorder &data, int desc_height) const override;
61 virtual void fillCompileTimeBorder(BufferStorageWithBorder &) override;
62 virtual std::size_t size() const override;
68 cv::gapi::own::Mat m_data;
71 void updateInCache(View::Cache& cache, int start_log_idx, int nLines) const;
72 void updateOutCache(Buffer::Cache& cache, int start_log_idx, int nLines);
74 virtual void copyTo(BufferStorageWithBorder &dst, int startLine, int nLines) const = 0;
76 virtual ~BufferStorage() = default;
78 virtual const uint8_t* ptr(int idx) const = 0;
79 virtual uint8_t* ptr(int idx) = 0;
81 inline bool empty() const { return m_data.empty(); }
83 inline const cv::gapi::own::Mat& data() const { return m_data; }
84 inline cv::gapi::own::Mat& data() { return m_data; }
86 inline int rows() const { return m_data.rows; }
87 inline int cols() const { return m_data.cols; }
88 inline int type() const { return m_data.type(); }
90 virtual const uint8_t* inLineB(int log_idx, int desc_height) const = 0;
92 // FIXME? remember parent and remove src parameter?
93 virtual void updateBeforeRead(int startLine, int nLines, const BufferStorage& src) = 0;
94 virtual void updateAfterWrite(int startLine, int nLines) = 0;
96 virtual inline int physIdx(int logIdx) const = 0;
98 virtual size_t size() const = 0;
101 class BufferStorageWithoutBorder final : public BufferStorage
103 bool m_is_virtual = true;
104 cv::gapi::own::Rect m_roi;
107 virtual void copyTo(BufferStorageWithBorder &dst, int startLine, int nLines) const override;
109 inline virtual const uint8_t* ptr(int idx) const override
111 GAPI_DbgAssert((m_is_virtual && m_roi == cv::gapi::own::Rect{}) || (!m_is_virtual && m_roi != cv::gapi::own::Rect{}));
112 return m_data.ptr(physIdx(idx), 0);
114 inline virtual uint8_t* ptr(int idx) override
116 GAPI_DbgAssert((m_is_virtual && m_roi == cv::gapi::own::Rect{}) || (!m_is_virtual && m_roi != cv::gapi::own::Rect{}));
117 return m_data.ptr(physIdx(idx), 0);
120 inline void attach(const cv::gapi::own::Mat& _data, cv::gapi::own::Rect _roi)
122 m_data = _data(_roi);
124 m_is_virtual = false;
127 void create(int capacity, int desc_width, int type);
129 inline virtual const uint8_t* inLineB(int log_idx, int /*desc_height*/) const override { return ptr(log_idx); }
131 virtual void updateBeforeRead(int startLine, int nLines, const BufferStorage& src) override;
132 virtual void updateAfterWrite(int startLine, int nLines) override;
134 inline virtual int physIdx(int logIdx) const override { return (logIdx - m_roi.y) % m_data.rows; }
136 virtual size_t size() const override;
139 class BufferStorageWithBorder final: public BufferStorage
141 std::unique_ptr<BorderHandler> m_borderHandler;
144 inline int borderSize() const { return m_borderHandler->borderSize(); }
146 virtual void copyTo(BufferStorageWithBorder &dst, int startLine, int nLines) const override;
148 inline virtual const uint8_t* ptr(int idx) const override
150 return m_data.ptr(physIdx(idx), borderSize());
152 inline virtual uint8_t* ptr(int idx) override
154 return m_data.ptr(physIdx(idx), borderSize());
157 void init(int depth, int border_size, Border border);
158 void create(int capacity, int desc_width, int dtype);
160 virtual const uint8_t* inLineB(int log_idx, int desc_height) const override;
162 virtual void updateBeforeRead(int startLine, int nLines, const BufferStorage &src) override;
163 virtual void updateAfterWrite(int startLine, int nLines) override;
165 inline virtual int physIdx(int logIdx) const override { return logIdx % m_data.rows; }
167 virtual size_t size() const override;
170 // FIXME: GAPI_EXPORTS is used here only to access internal methods
171 // like readDone/writeDone in low-level tests
172 class GAPI_EXPORTS View::Priv
178 const Buffer *m_p = nullptr; // FIXME replace with weak_ptr
179 int m_read_caret = -1;
180 int m_lines_next_iter = -1;
181 int m_border_size = -1;
184 virtual ~Priv() = default;
185 // API used by actors/backend
187 const View::Cache& cache() const { return m_cache; }
188 void initCache(int lineConsumption);
190 virtual void allocate(int lineConsumption, BorderOpt border) = 0;
191 virtual void prepareToRead() = 0;
193 void readDone(int linesRead, int linesForNextIteration);
194 void reset(int linesForFirstIteration);
196 virtual std::size_t size() const = 0;
198 // Does the view have enough unread lines for next iteration
201 // API used (indirectly) by user code
202 virtual const uint8_t* InLineB(int index) const = 0;
205 class ViewPrivWithoutOwnBorder final : public View::Priv
208 // API used by actors/backend
209 ViewPrivWithoutOwnBorder(const Buffer *p, int borderSize);
211 virtual void allocate(int lineConsumption, BorderOpt) override;
212 virtual void prepareToRead() override;
214 inline virtual std::size_t size() const override { return 0; }
216 // API used (indirectly) by user code
217 virtual const uint8_t* InLineB(int index) const override;
220 class ViewPrivWithOwnBorder final : public View::Priv
222 BufferStorageWithBorder m_own_storage;
225 // API used by actors/backend
226 ViewPrivWithOwnBorder(const Buffer *p, int borderSize);
228 virtual void allocate(int lineConsumption, BorderOpt border) override;
229 virtual void prepareToRead() override;
230 virtual std::size_t size() const override;
232 // API used (indirectly) by user code
233 virtual const uint8_t* InLineB(int index) const override;
236 void debugBufferPriv(const Buffer& buffer, std::ostream &os);
238 // FIXME: GAPI_EXPORTS is used here only to access internal methods
239 // like readDone/writeDone in low-level tests
240 class GAPI_EXPORTS Buffer::Priv
242 Buffer::Cache m_cache;
244 int m_writer_lpi = 1;
246 cv::GMatDesc m_desc = cv::GMatDesc{-1,-1,{-1,-1}};
247 bool m_is_input = false;
249 int m_write_caret = -1;
251 std::vector<View> m_views;
253 std::unique_ptr<BufferStorage> m_storage;
255 // Coordinate starting from which this buffer is assumed
256 // to be read (with border not being taken into account)
258 cv::gapi::own::Rect m_roi;
260 friend void debugBufferPriv(const Buffer& p, std::ostream &os);
264 Priv(int read_start, cv::gapi::own::Rect roi);
266 inline const BufferStorage& storage() const { return *m_storage.get(); }
268 // API used by actors/backend
269 void init(const cv::GMatDesc &desc,
272 cv::gapi::own::Rect roi);
274 void allocate(BorderOpt border, int border_size, int line_consumption, int skew);
275 void bindTo(const cv::gapi::own::Mat &data, bool is_input);
277 inline void addView(const View& view) { m_views.push_back(view); }
279 inline const GMatDesc& meta() const { return m_desc; }
286 int linesReady() const;
288 inline int y() const { return m_write_caret; }
290 inline int writer_lpi() const { return m_writer_lpi; }
292 // API used (indirectly) by user code
293 uint8_t* OutLineB(int index = 0);
296 inline int readStart() const { return m_readStart; }
297 inline int writeStart() const { return m_roi.y; }
298 inline int writeEnd() const { return m_roi.y + m_roi.height; }
299 inline int outputLines() const { return m_roi.height; }
301 inline const Buffer::Cache& cache() const { return m_cache; }
304 } // namespace cv::gapi::fluid
305 } // namespace cv::gapi
308 #endif // OPENCV_GAPI_FLUID_BUFFER_PRIV_HPP