{\r
try\r
{\r
- int cols = 1 + rand() % 100, rows = 1 + rand() % 100;\r
-\r
- testC2C(cols, rows, 0, "no flags");\r
- testC2C(cols, rows + 1, 0, "no flags 0 1");\r
- testC2C(cols, rows + 1, 0, "no flags 1 0");\r
- testC2C(cols + 1, rows, 0, "no flags 1 1");\r
- testC2C(cols, rows, DFT_INVERSE, "DFT_INVERSE");\r
- testC2C(cols, rows, DFT_ROWS, "DFT_ROWS");\r
- testC2C(1, rows, 0, "single col");\r
- testC2C(cols, 1, 0, "single row");\r
- testC2C(1, rows, DFT_INVERSE, "single col inversed");\r
- testC2C(cols, 1, DFT_INVERSE, "single row inversed");\r
- testC2C(cols, 1, DFT_ROWS, "single row DFT_ROWS");\r
- testC2C(1, 2, 0, "size 1 2");\r
- testC2C(2, 1, 0, "size 2 1");\r
-\r
- testR2CThenC2R(cols, rows, "sanity");\r
- testR2CThenC2R(cols, rows + 1, "sanity 0 1");\r
- testR2CThenC2R(cols + 1, rows, "sanity 1 0");\r
- testR2CThenC2R(cols + 1, rows + 1, "sanity 1 1");\r
- testR2CThenC2R(1, rows, "single col");\r
- testR2CThenC2R(1, rows + 1, "single col 1");\r
- testR2CThenC2R(cols, 1, "single row" );;\r
- testR2CThenC2R(cols + 1, 1, "single row 1" );\r
+ srand(0);\r
+ int cols = 2 + rand() % 100, rows = 2 + rand() % 100;\r
+\r
+ for (int inplace = 0; inplace < 2; ++inplace)\r
+ {\r
+ testC2C("no flags", cols, rows, 0, inplace);\r
+ testC2C("no flags 0 1", cols, rows + 1, 0, inplace);\r
+ testC2C("no flags 1 0", cols, rows + 1, 0, inplace);\r
+ testC2C("no flags 1 1", cols + 1, rows, 0, inplace);\r
+ testC2C("DFT_INVERSE", cols, rows, DFT_INVERSE, inplace);\r
+ testC2C("DFT_ROWS", cols, rows, DFT_ROWS, inplace);\r
+ testC2C("single col", 1, rows, 0, inplace);\r
+ testC2C("single row", cols, 1, 0, inplace);\r
+ testC2C("single col inversed", 1, rows, DFT_INVERSE, inplace);\r
+ testC2C("single row inversed", cols, 1, DFT_INVERSE, inplace);\r
+ testC2C("single row DFT_ROWS", cols, 1, DFT_ROWS, inplace);\r
+ testC2C("size 1 2", 1, 2, 0, inplace);\r
+ testC2C("size 2 1", 2, 1, 0, inplace);\r
+ }\r
+\r
+ testR2CThenC2R("sanity", cols, rows);\r
+ testR2CThenC2R("sanity 0 1", cols, rows + 1);\r
+ testR2CThenC2R("sanity 1 0", cols + 1, rows);\r
+ testR2CThenC2R("sanity 1 1", cols + 1, rows + 1);\r
+ testR2CThenC2R("single col", 1, rows);\r
+ testR2CThenC2R("single col 1", 1, rows + 1);\r
+ testR2CThenC2R("single row", cols, 1);\r
+ testR2CThenC2R("single row 1", cols + 1, 1);\r
+\r
+ testR2CThenC2R("sanity", cols, rows, true);\r
+ testR2CThenC2R("sanity 0 1", cols, rows + 1, true);\r
+ testR2CThenC2R("sanity 1 0", cols + 1, rows, true);\r
+ testR2CThenC2R("sanity 1 1", cols + 1, rows + 1, true);\r
+ testR2CThenC2R("single row", cols, 1, true);\r
+ testR2CThenC2R("single row 1", cols + 1, 1, true);\r
}\r
catch (const Exception& e)\r
{\r
return true;\r
}\r
\r
- void testC2C(int cols, int rows, int flags, const std::string& hint)\r
+ void testC2C(const std::string& hint, int cols, int rows, int flags, bool inplace=false)\r
{\r
Mat a;\r
gen(cols, rows, 2, a);\r
dft(a, b_gold, flags);\r
\r
GpuMat d_b;\r
+ GpuMat d_b_data;\r
+ if (inplace)\r
+ {\r
+ d_b_data.create(1, a.size().area(), CV_32FC2);\r
+ d_b = GpuMat(a.rows, a.cols, CV_32FC2, d_b_data.ptr(), a.cols * d_b_data.elemSize());\r
+ }\r
+\r
dft(GpuMat(a), d_b, flags);\r
\r
bool ok = true;\r
+ if (ok && inplace && d_b.ptr() != d_b_data.ptr())\r
+ {\r
+ ts->printf(CvTS::CONSOLE, "unnecessary reallocation was done\n");\r
+ ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);\r
+ ok = false;\r
+ }\r
if (ok && d_b.depth() != CV_32F)\r
{\r
ts->printf(CvTS::CONSOLE, "bad depth: %d\n", d_b.depth());\r
}\r
if (ok) ok = cmp(b_gold, Mat(d_b), rows * cols * 1e-4f);\r
if (!ok) \r
- ts->printf(CvTS::CONSOLE, "testC2C failed: hint=%s, cols=%d, rows=%d, flags=%d\n", hint.c_str(), cols, rows, flags);\r
+ ts->printf(CvTS::CONSOLE, "testC2C failed: hint=%s, cols=%d, rows=%d, flags=%d, inplace=%d\n", \r
+ hint.c_str(), cols, rows, flags, inplace);\r
}\r
\r
- void testR2CThenC2R(int cols, int rows, const std::string& hint)\r
+ void testR2CThenC2R(const std::string& hint, int cols, int rows, bool inplace=false)\r
{\r
Mat a;\r
gen(cols, rows, 1, a);\r
else odd = a.cols % 2 == 1;\r
bool ok = true;\r
\r
- GpuMat d_b;\r
- GpuMat d_c;\r
+ GpuMat d_b, d_c;\r
+ GpuMat d_b_data, d_c_data;\r
+ if (inplace)\r
+ {\r
+ if (a.cols == 1)\r
+ {\r
+ d_b_data.create(1, (a.rows / 2 + 1) * a.cols, CV_32FC2);\r
+ d_b = GpuMat(a.rows / 2 + 1, a.cols, CV_32FC2, d_b_data.ptr(), a.cols * d_b_data.elemSize());\r
+ }\r
+ else\r
+ {\r
+ d_b_data.create(1, a.rows * (a.cols / 2 + 1), CV_32FC2);\r
+ d_b = GpuMat(a.rows, a.cols / 2 + 1, CV_32FC2, d_b_data.ptr(), (a.cols / 2 + 1) * d_b_data.elemSize());\r
+ }\r
+ d_c_data.create(1, a.size().area(), CV_32F);\r
+ d_c = GpuMat(a.rows, a.cols, CV_32F, d_c_data.ptr(), a.cols * d_c_data.elemSize());\r
+ }\r
dft(GpuMat(a), d_b, 0);\r
dft(d_b, d_c, DFT_REAL_OUTPUT, 0, odd);\r
\r
+ if (ok && inplace && d_b.ptr() != d_b_data.ptr())\r
+ {\r
+ ts->printf(CvTS::CONSOLE, "unnecessary reallocation was done for b\n");\r
+ ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);\r
+ ok = false;\r
+ }\r
+ if (ok && inplace && d_c.ptr() != d_c_data.ptr())\r
+ {\r
+ ts->printf(CvTS::CONSOLE, "unnecessary reallocation was done for c\n");\r
+ ts->set_failed_test_info(CvTS::FAIL_INVALID_OUTPUT);\r
+ ok = false;\r
+ }\r
if (ok && d_c.depth() != CV_32F)\r
{\r
ts->printf(CvTS::CONSOLE, "bad depth: %d\n", d_c.depth());\r