Commit 7453a693 authored by Alexander Alekhin's avatar Alexander Alekhin Committed by Vadim Pisarevsky

core(test): extra tests/fixes for merge/split (#12171)

* core(test): merge hang test

* core(merge/split): fix intrin optimization
parent 39f5e573
...@@ -42,7 +42,7 @@ vecmerge_( const T** src, T* dst, int len, int cn ) ...@@ -42,7 +42,7 @@ vecmerge_( const T** src, T* dst, int len, int cn )
if( r != 0 ) if( r != 0 )
{ {
mode = hal::STORE_UNALIGNED; mode = hal::STORE_UNALIGNED;
if (r % dstElemSize == 0 && len > VECSZ) if (r % dstElemSize == 0 && len > VECSZ*2)
i0 = VECSZ - (r / dstElemSize); i0 = VECSZ - (r / dstElemSize);
} }
......
...@@ -27,8 +27,8 @@ vecsplit_( const T* src, T** dst, int len, int cn ) ...@@ -27,8 +27,8 @@ vecsplit_( const T* src, T** dst, int len, int cn )
if( (r0|r1|r2|r3) != 0 ) if( (r0|r1|r2|r3) != 0 )
{ {
mode = hal::STORE_UNALIGNED; mode = hal::STORE_UNALIGNED;
if( r0 == r1 && r0 == r2 && r0 == r3 && r0 % cn == 0 && len > VECSZ ) if( r0 == r1 && r0 == r2 && r0 == r3 && r0 % sizeof(T) == 0 && len > VECSZ*2 )
i0 = VECSZ - (r0 / cn); i0 = VECSZ - (r0 / sizeof(T));
} }
if( cn == 2 ) if( cn == 2 )
......
...@@ -1824,4 +1824,62 @@ BIGDATA_TEST(Mat, push_back_regression_4158) // memory usage: ~10.6 Gb ...@@ -1824,4 +1824,62 @@ BIGDATA_TEST(Mat, push_back_regression_4158) // memory usage: ~10.6 Gb
} }
} }
TEST(Core_Merge, hang_12171)
{
Mat src1(4, 24, CV_8UC1, Scalar::all(1));
Mat src2(4, 24, CV_8UC1, Scalar::all(2));
Rect src_roi(0, 0, 23, 4);
Mat src_channels[2] = { src1(src_roi), src2(src_roi) };
Mat dst(4, 24, CV_8UC2, Scalar::all(5));
Rect dst_roi(1, 0, 23, 4);
cv::merge(src_channels, 2, dst(dst_roi));
EXPECT_EQ(5, dst.ptr<uchar>()[0]);
EXPECT_EQ(5, dst.ptr<uchar>()[1]);
EXPECT_EQ(1, dst.ptr<uchar>()[2]);
EXPECT_EQ(2, dst.ptr<uchar>()[3]);
EXPECT_EQ(5, dst.ptr<uchar>(1)[0]);
EXPECT_EQ(5, dst.ptr<uchar>(1)[1]);
EXPECT_EQ(1, dst.ptr<uchar>(1)[2]);
EXPECT_EQ(2, dst.ptr<uchar>(1)[3]);
}
TEST(Core_Split, hang_12171)
{
Mat src(4, 24, CV_8UC2, Scalar(1,2,3,4));
Rect src_roi(0, 0, 23, 4);
Mat dst1(4, 24, CV_8UC1, Scalar::all(5));
Mat dst2(4, 24, CV_8UC1, Scalar::all(10));
Rect dst_roi(0, 0, 23, 4);
Mat dst[2] = { dst1(dst_roi), dst2(dst_roi) };
cv::split(src(src_roi), dst);
EXPECT_EQ(1, dst1.ptr<uchar>()[0]);
EXPECT_EQ(1, dst1.ptr<uchar>()[1]);
EXPECT_EQ(2, dst2.ptr<uchar>()[0]);
EXPECT_EQ(2, dst2.ptr<uchar>()[1]);
EXPECT_EQ(1, dst1.ptr<uchar>(1)[0]);
EXPECT_EQ(1, dst1.ptr<uchar>(1)[1]);
EXPECT_EQ(2, dst2.ptr<uchar>(1)[0]);
EXPECT_EQ(2, dst2.ptr<uchar>(1)[1]);
}
TEST(Core_Split, crash_12171)
{
Mat src(4, 40, CV_8UC2, Scalar(1,2,3,4));
Rect src_roi(0, 0, 39, 4);
Mat dst1(4, 40, CV_8UC1, Scalar::all(5));
Mat dst2(4, 40, CV_8UC1, Scalar::all(10));
Rect dst_roi(0, 0, 39, 4);
Mat dst[2] = { dst1(dst_roi), dst2(dst_roi) };
cv::split(src(src_roi), dst);
EXPECT_EQ(1, dst1.ptr<uchar>()[0]);
EXPECT_EQ(1, dst1.ptr<uchar>()[1]);
EXPECT_EQ(2, dst2.ptr<uchar>()[0]);
EXPECT_EQ(2, dst2.ptr<uchar>()[1]);
EXPECT_EQ(1, dst1.ptr<uchar>(1)[0]);
EXPECT_EQ(1, dst1.ptr<uchar>(1)[1]);
EXPECT_EQ(2, dst2.ptr<uchar>(1)[0]);
EXPECT_EQ(2, dst2.ptr<uchar>(1)[1]);
}
}} // namespace }} // namespace
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment