mirror of https://github.com/opencv/opencv.git
parent
2a333a6c86
commit
a15cd4b63d
2 changed files with 146 additions and 4 deletions
@ -0,0 +1,144 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
#include "test_precomp.hpp" |
||||
|
||||
namespace opencv_test { namespace { |
||||
|
||||
// Dummy allocator implementation copied from the default OpenCV allocator with some simplifications
|
||||
struct DummyAllocator: public cv::MatAllocator |
||||
{ |
||||
public: |
||||
DummyAllocator() {}; |
||||
~DummyAllocator() {}; |
||||
|
||||
cv::UMatData* allocate(int dims, const int* sizes, int type, |
||||
void* data0, size_t* step, cv::AccessFlag flags, |
||||
cv::UMatUsageFlags usageFlags) const |
||||
{ |
||||
CV_UNUSED(flags); |
||||
CV_UNUSED(usageFlags); |
||||
|
||||
size_t total = CV_ELEM_SIZE(type); |
||||
for( int i = dims-1; i >= 0; i-- ) |
||||
{ |
||||
if( step ) |
||||
{ |
||||
if( data0 && step[i] != CV_AUTOSTEP ) |
||||
{ |
||||
CV_Assert(total <= step[i]); |
||||
total = step[i]; |
||||
} |
||||
else |
||||
step[i] = total; |
||||
} |
||||
total *= sizes[i]; |
||||
} |
||||
|
||||
uchar* data = nullptr; |
||||
if (data0) |
||||
{ |
||||
data = (uchar*)data0; |
||||
} |
||||
else |
||||
{ |
||||
data = new uchar[total]; |
||||
DummyAllocator::allocatedBytes += total; |
||||
DummyAllocator::allocations++; |
||||
} |
||||
cv::UMatData* u = new cv::UMatData(this); |
||||
u->data = u->origdata = data; |
||||
u->size = total; |
||||
if(data0) |
||||
u->flags |= cv::UMatData::USER_ALLOCATED; |
||||
|
||||
return u; |
||||
} |
||||
|
||||
bool allocate(cv::UMatData* u, cv::AccessFlag accessFlags, cv::UMatUsageFlags usageFlags) const |
||||
{ |
||||
CV_UNUSED(accessFlags); |
||||
CV_UNUSED(usageFlags); |
||||
|
||||
if(!u) return false; |
||||
return true; |
||||
} |
||||
|
||||
void deallocate(cv::UMatData* u) const |
||||
{ |
||||
if(!u) |
||||
return; |
||||
|
||||
CV_Assert(u->urefcount == 0); |
||||
CV_Assert(u->refcount == 0); |
||||
if( !(u->flags & cv::UMatData::USER_ALLOCATED) ) |
||||
{ |
||||
delete[] u->origdata; |
||||
DummyAllocator::deallocations++; |
||||
u->origdata = 0; |
||||
} |
||||
delete u; |
||||
} |
||||
|
||||
static size_t allocatedBytes; |
||||
static int allocations; |
||||
static int deallocations; |
||||
}; |
||||
|
||||
size_t DummyAllocator::allocatedBytes = 0; |
||||
int DummyAllocator::allocations = 0; |
||||
int DummyAllocator::deallocations = 0; |
||||
|
||||
cv::MatAllocator* getDummyAllocator() |
||||
{ |
||||
static cv::MatAllocator* allocator = new DummyAllocator; |
||||
return allocator; |
||||
} |
||||
|
||||
struct AllocatorTest : public testing::Test { |
||||
void SetUp() override { |
||||
cv::MatAllocator* allocator = getDummyAllocator(); |
||||
EXPECT_TRUE(allocator != nullptr); |
||||
cv::Mat::setDefaultAllocator(allocator); |
||||
} |
||||
|
||||
void TearDown() override { |
||||
cv::Mat::setDefaultAllocator(cv::Mat::getStdAllocator()); |
||||
} |
||||
}; |
||||
|
||||
TEST_F(AllocatorTest, DummyAllocator) |
||||
{ |
||||
cv::MatAllocator* dummy = getDummyAllocator(); |
||||
|
||||
DummyAllocator::allocatedBytes = 0; |
||||
DummyAllocator::allocations = 0; |
||||
DummyAllocator::deallocations = 0; |
||||
|
||||
{ |
||||
cv::Mat src1 = cv::Mat::ones (16, 16, CV_8UC1); |
||||
EXPECT_TRUE(!src1.empty()); |
||||
EXPECT_EQ(src1.allocator, dummy); |
||||
|
||||
cv::Mat src1_roi = src1(cv::Rect(2,2,8,8)); |
||||
EXPECT_EQ(src1_roi.allocator, dummy); |
||||
|
||||
cv::MatAllocator* standard = cv::Mat::getStdAllocator(); |
||||
cv::Mat::setDefaultAllocator(standard); |
||||
cv::Mat src2 = cv::Mat::ones (16, 16, CV_8UC1); |
||||
EXPECT_TRUE(!src2.empty()); |
||||
EXPECT_EQ(src2.allocator, standard); |
||||
|
||||
src1.create(32, 32, CV_8UC1); |
||||
EXPECT_EQ(src1.allocator, dummy); |
||||
} |
||||
|
||||
size_t expect_allocated = 16*16*sizeof(uchar) + 32*32*sizeof(uchar); |
||||
EXPECT_EQ(expect_allocated, DummyAllocator::allocatedBytes); |
||||
|
||||
// ROI should not trigger extra allocations
|
||||
EXPECT_EQ(2, DummyAllocator::allocations); |
||||
EXPECT_EQ(2, DummyAllocator::deallocations); |
||||
} |
||||
|
||||
}} // namespace
|
Loading…
Reference in new issue