Skip to content

Commit

Permalink
Upstream fixes from release
Browse files Browse the repository at this point in the history
  • Loading branch information
AsyaPronina committed Mar 11, 2021
1 parent fbb38cc commit 0f4b27c
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 12 deletions.
12 changes: 12 additions & 0 deletions modules/gapi/include/opencv2/gapi/media.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,21 @@ class GAPI_EXPORTS MediaFrame {
View access(Access) const;
cv::GFrameDesc desc() const;

// Cast underlying MediaFrame adapter to the particular adapter type,
// return nullptr if underlying type is different
template<typename T> T* get() const
{
static_assert(std::is_base_of<IAdapter, T>::value,
"T is not derived from cv::MediaFrame::IAdapter!");
auto* adapter = getAdapter();
GAPI_Assert(adapter != nullptr);
return dynamic_cast<T*>(adapter);
}

private:
struct Priv;
std::shared_ptr<Priv> m;
IAdapter* getAdapter() const;
};

template<class T, class... Args>
Expand Down
4 changes: 4 additions & 0 deletions modules/gapi/src/api/media.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ cv::MediaFrame::View cv::MediaFrame::access(Access code) const {
return m->adapter->access(code);
}

cv::MediaFrame::IAdapter* cv::MediaFrame::getAdapter() const {
return m->adapter.get();
}

cv::MediaFrame::View::View(Ptrs&& ptrs, Strides&& strs, Callback &&cb)
: ptr (std::move(ptrs))
, stride(std::move(strs))
Expand Down
19 changes: 7 additions & 12 deletions modules/gapi/src/backends/ie/giebackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,25 +126,20 @@ inline IE::TensorDesc toIE(const cv::Mat &mat, cv::gapi::ie::TraitAs hint) {
if (sz.dims() == 2 && hint == cv::gapi::ie::TraitAs::IMAGE)
{
// NB: This logic is mainly taken from IE samples
const size_t pixsz = CV_ELEM_SIZE1(mat.type());
const size_t channels = mat.channels();
const size_t height = mat.size().height;
const size_t width = mat.size().width;

const size_t strideH = mat.step.buf[0];
const size_t strideW = mat.step.buf[1];
const size_t strideH = mat.step[0];

const bool is_dense =
strideW == pixsz * channels &&
strideH == strideW * width;

if (!is_dense)
cv::util::throw_error(std::logic_error("Doesn't support conversion"
" from non-dense cv::Mat"));
IE::BlockingDesc bdesc({1, height, width, channels} /* dims */,
{0, 2, 3, 1} /* order for NHWC */,
0 /* offset */,
{0, 0, 0, 0} /* offsets for dims */,
{strideH * height, strideH, channels, 1} /* strides for dims */);

return IE::TensorDesc(toIE(mat.depth()),
IE::SizeVector{1, channels, height, width},
IE::Layout::NHWC);
IE::SizeVector{1, channels, height, width}, bdesc);
}

return IE::TensorDesc(toIE(mat.depth()), toIE(sz), toIELayout(sz.dims()));
Expand Down

0 comments on commit 0f4b27c

Please sign in to comment.