From fb598bb76a0431aa3a880ecfa45054c996a070fb Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Fri, 13 May 2016 13:28:09 +0300 Subject: [PATCH 01/96] Disabled PCH support for gcc >= 6.0.0 Command line generation routine uses "-isystem" to include headers outside of "/modules" folder, but GCC 6 does not work when passed "-isystem /usr/include" option. --- cmake/OpenCVPCHSupport.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/OpenCVPCHSupport.cmake b/cmake/OpenCVPCHSupport.cmake index 13619daf27..e6585cae02 100644 --- a/cmake/OpenCVPCHSupport.cmake +++ b/cmake/OpenCVPCHSupport.cmake @@ -19,7 +19,7 @@ IF(CMAKE_COMPILER_IS_GNUCXX) ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE gcc_compiler_version) #MESSAGE("GCC Version: ${gcc_compiler_version}") - IF(gcc_compiler_version VERSION_GREATER "4.2.-1") + IF(gcc_compiler_version VERSION_GREATER "4.2.-1" AND gcc_compiler_version VERSION_LESS "6.0.0") SET(PCHSupport_FOUND TRUE) ENDIF() From a8b2b4dba12e8d23bec2a8cac98c5838620c6c6b Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Fri, 27 May 2016 13:46:12 +0300 Subject: [PATCH 02/96] Packaging fixes for Ubuntu 16.04. --- cmake/OpenCVPackaging.cmake | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/cmake/OpenCVPackaging.cmake b/cmake/OpenCVPackaging.cmake index 106c03ff17..9fef5e7476 100644 --- a/cmake/OpenCVPackaging.cmake +++ b/cmake/OpenCVPackaging.cmake @@ -98,15 +98,15 @@ if(HAVE_CUDA) set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "cuda-core-libs-${cuda_version_suffix}, cuda-extra-libs-${cuda_version_suffix}") set(CPACK_DEB_DEV_PACKAGE_DEPENDS "cuda-headers-${cuda_version_suffix}") else() - set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "cuda-cudart-${cuda_version_suffix}, cuda-npp-${cuda_version_suffix}") - set(CPACK_DEB_DEV_PACKAGE_DEPENDS "cuda-cudart-dev-${cuda_version_suffix}, cuda-npp-dev-${cuda_version_suffix}") + set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "cuda-cudart-${cuda_version_suffix} | libcudart${CUDA_VERSION}, cuda-npp-${cuda_version_suffix} | libnppc${CUDA_VERSION}, cuda-npp-${cuda_version_suffix} | libnppi${CUDA_VERSION}, cuda-npp-${cuda_version_suffix} | libnpps${CUDA_VERSION}") + set(CPACK_DEB_DEV_PACKAGE_DEPENDS "cuda-cudart-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION}), cuda-npp-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION})") if(HAVE_CUFFT) - set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "${CPACK_DEB_LIBS_PACKAGE_DEPENDS}, cuda-cufft-${cuda_version_suffix}") - set(CPACK_DEB_DEV_PACKAGE_DEPENDS "${CPACK_DEB_DEV_PACKAGE_DEPENDS}, cuda-cufft-dev-${cuda_version_suffix}") + set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "${CPACK_DEB_LIBS_PACKAGE_DEPENDS}, cuda-cufft-${cuda_version_suffix} | libcufft${CUDA_VERSION}") + set(CPACK_DEB_DEV_PACKAGE_DEPENDS "${CPACK_DEB_DEV_PACKAGE_DEPENDS}, cuda-cufft-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION})") endif() if(HAVE_HAVE_CUBLAS) - set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "${CPACK_DEB_LIBS_PACKAGE_DEPENDS}, cuda-cublas-${cuda_version_suffix}") - set(CPACK_DEB_DEV_PACKAGE_DEPENDS "${CPACK_DEB_DEV_PACKAGE_DEPENDS}, cuda-cublas-dev-${cuda_version_suffix}") + set(CPACK_DEB_LIBS_PACKAGE_DEPENDS "${CPACK_DEB_LIBS_PACKAGE_DEPENDS}, cuda-cublas-${cuda_version_suffix} | libcublas${CUDA_VERSION}") + set(CPACK_DEB_DEV_PACKAGE_DEPENDS "${CPACK_DEB_DEV_PACKAGE_DEPENDS}, cuda-cublas-dev-${cuda_version_suffix} | nvidia-cuda-dev (>=${CUDA_VERSION})") endif() endif() endif() @@ -122,10 +122,17 @@ endif() set(STD_OPENCV_LIBS opencv-data) set(STD_OPENCV_DEV libopencv-dev) +set(ABI_VERSION_SUFFIX "") +if(CMAKE_COMPILER_IS_GNUCXX) + if(${CMAKE_OPENCV_GCC_VERSION_MAJOR} EQUAL 5) + set(ABI_VERSION_SUFFIX "v5") + endif() +endif() + foreach(module calib3d contrib core features2d flann gpu highgui imgproc legacy ml objdetect ocl photo stitching superres ts video videostab) if(HAVE_opencv_${module}) - list(APPEND STD_OPENCV_LIBS "libopencv-${module}2.4") + list(APPEND STD_OPENCV_LIBS "libopencv-${module}2.4${ABI_VERSION_SUFFIX}") list(APPEND STD_OPENCV_DEV "libopencv-${module}-dev") endif() endforeach() From 78de75397e512a3fb4b9aad677ebc4c1472fa9cc Mon Sep 17 00:00:00 2001 From: Gilles Rochefort Date: Sun, 29 May 2016 17:25:02 +0200 Subject: [PATCH 03/96] Fixed BackgroundSubstractorMOG2 in opencv_video. The number of gaussians involved in a mixture is supposed to be dynamically adjusted. After being increased, the number of gaussians can't be reduced anymore. It seems to be a regression as the legacy code located in modules/legacy/src/bgfg_gaussmix.cpp allows to reduce such number of gaussians. --- modules/video/src/bgfg_gaussmix2.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/video/src/bgfg_gaussmix2.cpp b/modules/video/src/bgfg_gaussmix2.cpp index 9700dfebd8..d5eff8224c 100644 --- a/modules/video/src/bgfg_gaussmix2.cpp +++ b/modules/video/src/bgfg_gaussmix2.cpp @@ -309,7 +309,7 @@ struct MOG2Invoker : ParallelLoopBody //internal: bool fitsPDF = false;//if it remains zero a new GMM mode will be added - int nmodes = modesUsed[x], nNewModes = nmodes;//current number of modes in GMM + int nmodes = modesUsed[x];//current number of modes in GMM float totalWeight = 0.f; float* mean_m = mean; @@ -415,8 +415,6 @@ struct MOG2Invoker : ParallelLoopBody gmm[mode].weight *= totalWeight; } - nmodes = nNewModes; - //make new mode if needed and exit if( !fitsPDF ) { From 2717ba735a896d45b99a4e1143354bea19c394f7 Mon Sep 17 00:00:00 2001 From: Gilles Rochefort Date: Fri, 3 Jun 2016 11:00:31 +0200 Subject: [PATCH 04/96] Fixed BackgroundSubstractorMOG2 ocl implementation. --- modules/ocl/src/opencl/bgfg_mog.cl | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/ocl/src/opencl/bgfg_mog.cl b/modules/ocl/src/opencl/bgfg_mog.cl index a3c2619abc..f18a115325 100644 --- a/modules/ocl/src/opencl/bgfg_mog.cl +++ b/modules/ocl/src/opencl/bgfg_mog.cl @@ -369,7 +369,6 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob bool fitsPDF = false; //if it remains zero a new GMM mode will be added int nmodes = modesUsed[y * modesUsed_step + x]; - int nNewModes = nmodes; //current number of modes in GMM float totalWeight = 0.0f; @@ -430,8 +429,6 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob for (int mode = 0; mode < nmodes; ++mode) weight[(mode * frame_row + y) * weight_step + x] *= totalWeight; - nmodes = nNewModes; - if (!fitsPDF) { int mode = nmodes == (NMIXTURES) ? (NMIXTURES) - 1 : nmodes++; From 9fee6996934e7444a4cf2f9de741e689472dada1 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Wed, 8 Jun 2016 14:18:38 +0300 Subject: [PATCH 05/96] Fixed package-contains-timestamped-gzip lintian warning for Debian packages. --- cmake/OpenCVPackaging.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/OpenCVPackaging.cmake b/cmake/OpenCVPackaging.cmake index 9fef5e7476..a4913ea050 100644 --- a/cmake/OpenCVPackaging.cmake +++ b/cmake/OpenCVPackaging.cmake @@ -325,7 +325,7 @@ if(CPACK_GENERATOR STREQUAL "DEB") set(CHANGELOG_PACKAGE_NAME "${CPACK_DEBIAN_COMPONENT_${comp_upcase}_NAME}") configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/changelog.Debian.in" "${DEBIAN_CHANGELOG_OUT_FILE}" @ONLY) - execute_process(COMMAND "${GZIP_TOOL}" "-cf9" "${DEBIAN_CHANGELOG_OUT_FILE}" + execute_process(COMMAND "${GZIP_TOOL}" "-ncf9" "${DEBIAN_CHANGELOG_OUT_FILE}" OUTPUT_FILE "${DEBIAN_CHANGELOG_OUT_FILE_GZ}" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") @@ -337,7 +337,7 @@ if(CPACK_GENERATOR STREQUAL "DEB") set(CHANGELOG_OUT_FILE_GZ "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}/changelog.gz") file(WRITE ${CHANGELOG_OUT_FILE} "Upstream changelog stub. See https://github.com/Itseez/opencv/wiki/ChangeLog") - execute_process(COMMAND "${GZIP_TOOL}" "-cf9" "${CHANGELOG_OUT_FILE}" + execute_process(COMMAND "${GZIP_TOOL}" "-ncf9" "${CHANGELOG_OUT_FILE}" OUTPUT_FILE "${CHANGELOG_OUT_FILE_GZ}" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") From e5d12502c594c90aec0212b9b98b195ff3be21af Mon Sep 17 00:00:00 2001 From: "S. Garrido" Date: Thu, 9 Jun 2016 17:34:00 +0100 Subject: [PATCH 06/96] Fix useExtrinsicGuess in solvePnP --- modules/calib3d/src/solvepnp.cpp | 56 ++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/modules/calib3d/src/solvepnp.cpp b/modules/calib3d/src/solvepnp.cpp index 3c1e50e6b2..ae28eb5af5 100644 --- a/modules/calib3d/src/solvepnp.cpp +++ b/modules/calib3d/src/solvepnp.cpp @@ -53,17 +53,36 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, Mat opoints = _opoints.getMat(), ipoints = _ipoints.getMat(); int npoints = std::max(opoints.checkVector(3, CV_32F), opoints.checkVector(3, CV_64F)); CV_Assert( npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) ); - _rvec.create(3, 1, CV_64F); - _tvec.create(3, 1, CV_64F); Mat cameraMatrix = _cameraMatrix.getMat(), distCoeffs = _distCoeffs.getMat(); + Mat rvec, tvec; + if( flags != CV_ITERATIVE ) + useExtrinsicGuess = false; + + if( useExtrinsicGuess ) + { + int rtype = _rvec.type(), ttype = _tvec.type(); + Size rsize = _rvec.size(), tsize = _tvec.size(); + CV_Assert( (rtype == CV_32F || rtype == CV_64F) && + (ttype == CV_32F || ttype == CV_64F) ); + CV_Assert( (rsize == Size(1, 3) || rsize == Size(3, 1)) && + (tsize == Size(1, 3) || tsize == Size(3, 1)) ); + } + else + { + _rvec.create(3, 1, CV_64F); + _tvec.create(3, 1, CV_64F); + } + rvec = _rvec.getMat(); + tvec = _tvec.getMat(); + if (flags == CV_EPNP) { cv::Mat undistortedPoints; cv::undistortPoints(ipoints, undistortedPoints, cameraMatrix, distCoeffs); epnp PnP(cameraMatrix, opoints, undistortedPoints); - cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat(); + cv::Mat R; PnP.compute_pose(R, tvec); cv::Rodrigues(R, rvec); return true; @@ -75,7 +94,7 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, cv::undistortPoints(ipoints, undistortedPoints, cameraMatrix, distCoeffs); p3p P3Psolver(cameraMatrix); - cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat(); + cv::Mat R; bool result = P3Psolver.solve(R, tvec, opoints, undistortedPoints); if (result) cv::Rodrigues(R, rvec); @@ -85,7 +104,7 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, { CvMat c_objectPoints = opoints, c_imagePoints = ipoints; CvMat c_cameraMatrix = cameraMatrix, c_distCoeffs = distCoeffs; - CvMat c_rvec = _rvec.getMat(), c_tvec = _tvec.getMat(); + CvMat c_rvec = rvec, c_tvec = tvec; cvFindExtrinsicCameraParams2(&c_objectPoints, &c_imagePoints, &c_cameraMatrix, c_distCoeffs.rows*c_distCoeffs.cols ? &c_distCoeffs : 0, &c_rvec, &c_tvec, useExtrinsicGuess ); @@ -316,10 +335,26 @@ void cv::solvePnPRansac(InputArray _opoints, InputArray _ipoints, CV_Assert(ipoints.depth() == CV_32F || ipoints.depth() == CV_64F); CV_Assert((ipoints.rows == 1 && ipoints.channels() == 2) || ipoints.cols*ipoints.channels() == 2); - _rvec.create(3, 1, CV_64FC1); - _tvec.create(3, 1, CV_64FC1); - Mat rvec = _rvec.getMat(); - Mat tvec = _tvec.getMat(); + Mat rvec, tvec; + if( flags != CV_ITERATIVE ) + useExtrinsicGuess = false; + + if( useExtrinsicGuess ) + { + int rtype = _rvec.type(), ttype = _tvec.type(); + Size rsize = _rvec.size(), tsize = _tvec.size(); + CV_Assert( (rtype == CV_32F || rtype == CV_64F) && + (ttype == CV_32F || ttype == CV_64F) ); + CV_Assert( (rsize == Size(1, 3) || rsize == Size(3, 1)) && + (tsize == Size(1, 3) || tsize == Size(3, 1)) ); + } + else + { + _rvec.create(3, 1, CV_64F); + _tvec.create(3, 1, CV_64F); + } + rvec = _rvec.getMat(); + tvec = _tvec.getMat(); Mat objectPoints = opoints.reshape(3, 1), imagePoints = ipoints.reshape(2, 1); @@ -360,7 +395,8 @@ void cv::solvePnPRansac(InputArray _opoints, InputArray _ipoints, Mat colInlierObjectPoints = inlierObjectPoints(Rect(i, 0, 1, 1)); objectPoints.col(index).copyTo(colInlierObjectPoints); } - solvePnP(inlierObjectPoints, inlierImagePoints, params.camera.intrinsics, params.camera.distortion, localRvec, localTvec, false, flags); + solvePnP(inlierObjectPoints, inlierImagePoints, params.camera.intrinsics, params.camera.distortion, + localRvec, localTvec, params.useExtrinsicGuess, flags); } localRvec.copyTo(rvec); localTvec.copyTo(tvec); From e0d64df76351f97c1dea5babb09954afbaea63a7 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Thu, 16 Jun 2016 12:53:59 +0300 Subject: [PATCH 07/96] fixed -Wunused-result warning --- modules/highgui/src/cap_ffmpeg_impl.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/highgui/src/cap_ffmpeg_impl.hpp b/modules/highgui/src/cap_ffmpeg_impl.hpp index dc3e10d490..da05bde324 100644 --- a/modules/highgui/src/cap_ffmpeg_impl.hpp +++ b/modules/highgui/src/cap_ffmpeg_impl.hpp @@ -2287,7 +2287,8 @@ bool OutputMediaStream_FFMPEG::open(const char* fileName, int width, int height, #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 2, 0) av_write_header(oc_); #else - avformat_write_header(oc_, NULL); + if (avformat_write_header(oc_, NULL) != 0) + return false; #endif return true; From c6be51eecd923cef6eac7c8eb60ca7eb9e41c19b Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 16 Jun 2016 14:29:36 +0300 Subject: [PATCH 08/96] cmake: fix JNI configuration problem for Android samples Some CMake 3.x (2.8.12.2 is fine) provides broken build configurations with following build error message: ld: fatal error: -soname: must take a non-empty argument Linker command line sample contains this: "-shared -Wl,-soname, -o" --- cmake/OpenCVDetectAndroidSDK.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/OpenCVDetectAndroidSDK.cmake b/cmake/OpenCVDetectAndroidSDK.cmake index a518d85eba..38430e214e 100644 --- a/cmake/OpenCVDetectAndroidSDK.cmake +++ b/cmake/OpenCVDetectAndroidSDK.cmake @@ -290,7 +290,7 @@ macro(add_android_project target path) set(android_proj_NATIVE_DEPS ${android_proj_NATIVE_DEPS} android) endif() - add_library(${JNI_LIB_NAME} MODULE ${android_proj_jni_files}) + add_library(${JNI_LIB_NAME} SHARED ${android_proj_jni_files}) target_link_libraries(${JNI_LIB_NAME} ${OPENCV_LINKER_LIBS} ${android_proj_NATIVE_DEPS}) set_target_properties(${JNI_LIB_NAME} PROPERTIES From 6677f81779760b1e35346653a7449d77dfb1a273 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Fri, 17 Jun 2016 11:00:31 +0300 Subject: [PATCH 09/96] fixed lintian warnings --- cmake/OpenCVPackaging.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/OpenCVPackaging.cmake b/cmake/OpenCVPackaging.cmake index a4913ea050..b57f46595e 100644 --- a/cmake/OpenCVPackaging.cmake +++ b/cmake/OpenCVPackaging.cmake @@ -266,6 +266,11 @@ ocv_get_lintian_version(LINTIAN_VERSION) set(LIBS_LINTIAN_OVERRIDES "binary-or-shlib-defines-rpath" # usr/lib/libopencv_core.so.2.4.12 "package-name-doesnt-match-sonames") # libopencv-calib3d2.4 libopencv-contrib2.4 +if(AARCH64 AND CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) + # GCC 4.8 has a bug which sometimes causes it to produce non-PIC aarch64 code. + list(APPEND LIBS_LINTIAN_OVERRIDES "shlib-with-non-pic-code") +endif() + if(HAVE_opencv_python) set(PYTHON_LINTIAN_OVERRIDES "binary-or-shlib-defines-rpath" # usr/lib/python2.7/dist-packages/cv2.so "missing-dependency-on-numpy-abi") From 9564531ec8064fdd2dbe7f0e3adbcf6959d0ed35 Mon Sep 17 00:00:00 2001 From: Tomi Date: Thu, 30 Jun 2016 10:41:03 +0300 Subject: [PATCH 10/96] features2d: Added missing SimpleBlob parameters Added missing SimpleBlobDetector parameters to features2d_init.cpp. --- modules/features2d/src/features2d_init.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/features2d/src/features2d_init.cpp b/modules/features2d/src/features2d_init.cpp index e12310a3b4..c310f01e85 100644 --- a/modules/features2d/src/features2d_init.cpp +++ b/modules/features2d/src/features2d_init.cpp @@ -139,12 +139,16 @@ CV_INIT_ALGORITHM(SimpleBlobDetector, "Feature2D.SimpleBlob", obj.info()->addParam(obj, "filterByColor", obj.params.filterByColor); obj.info()->addParam(obj, "blobColor", obj.params.blobColor); obj.info()->addParam(obj, "filterByArea", obj.params.filterByArea); + obj.info()->addParam(obj, "minArea", obj.params.minArea); obj.info()->addParam(obj, "maxArea", obj.params.maxArea); obj.info()->addParam(obj, "filterByCircularity", obj.params.filterByCircularity); + obj.info()->addParam(obj, "minCircularity", obj.params.minCircularity); obj.info()->addParam(obj, "maxCircularity", obj.params.maxCircularity); obj.info()->addParam(obj, "filterByInertia", obj.params.filterByInertia); + obj.info()->addParam(obj, "minInertiaRatio", obj.params.minInertiaRatio); obj.info()->addParam(obj, "maxInertiaRatio", obj.params.maxInertiaRatio); obj.info()->addParam(obj, "filterByConvexity", obj.params.filterByConvexity); + obj.info()->addParam(obj, "minConvexity", obj.params.minConvexity); obj.info()->addParam(obj, "maxConvexity", obj.params.maxConvexity); ) From c3dc7266d1937d09c89d5b11fcf0934fa02e1df0 Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Wed, 29 Jun 2016 19:50:51 +0300 Subject: [PATCH 11/96] Fixing of AutoBuffer::allocate(nsz) method AutoBuffer::allocate(nsz) didn't work properly when (sz < nsz < fixed_size). In this case sz remained unchanged. --- modules/core/include/opencv2/core/operations.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 0ae51c6939..076a5e467d 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -2558,10 +2558,10 @@ template inline void AutoBuffer<_Tp, fixed_size if(_size <= size) return; deallocate(); + size = _size; if(_size > fixed_size) { ptr = cv::allocate<_Tp>(_size); - size = _size; } } From 882e120a9d6302ec015a25deec776cf8f543be9f Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 29 Jun 2016 12:35:38 +0300 Subject: [PATCH 12/96] update libpng 1.5.27 --- 3rdparty/libpng/CMakeLists.txt | 2 +- 3rdparty/libpng/LICENSE | 73 ++-- 3rdparty/libpng/README | 61 ++-- 3rdparty/libpng/arm/arm_init.c | 232 ++++++++++++ 3rdparty/libpng/png.c | 416 ++++++++++++--------- 3rdparty/libpng/png.h | 650 +++++++++++++++------------------ 3rdparty/libpng/pngconf.h | 66 ++-- 3rdparty/libpng/pngdebug.h | 22 +- 3rdparty/libpng/pngerror.c | 13 +- 3rdparty/libpng/pngget.c | 66 +++- 3rdparty/libpng/pnginfo.h | 7 +- 3rdparty/libpng/pnglibconf.h | 157 ++++---- 3rdparty/libpng/pngmem.c | 12 +- 3rdparty/libpng/pngpread.c | 128 +------ 3rdparty/libpng/pngpriv.h | 248 +++++++++---- 3rdparty/libpng/pngread.c | 33 +- 3rdparty/libpng/pngrio.c | 4 +- 3rdparty/libpng/pngrtran.c | 210 ++++++----- 3rdparty/libpng/pngrutil.c | 200 +++++----- 3rdparty/libpng/pngset.c | 248 ++++++++++--- 3rdparty/libpng/pngstruct.h | 21 +- 3rdparty/libpng/pngtrans.c | 12 +- 3rdparty/libpng/pngwio.c | 6 +- 3rdparty/libpng/pngwrite.c | 414 +++++---------------- 3rdparty/libpng/pngwtran.c | 20 +- 3rdparty/libpng/pngwutil.c | 605 +++--------------------------- 3rdparty/readme.txt | 4 +- 27 files changed, 1836 insertions(+), 2094 deletions(-) create mode 100644 3rdparty/libpng/arm/arm_init.c diff --git a/3rdparty/libpng/CMakeLists.txt b/3rdparty/libpng/CMakeLists.txt index 88bf04d604..76ead5d1dd 100644 --- a/3rdparty/libpng/CMakeLists.txt +++ b/3rdparty/libpng/CMakeLists.txt @@ -15,7 +15,7 @@ file(GLOB lib_srcs *.c) file(GLOB lib_hdrs *.h) if(ARM AND NEON) - list(APPEND lib_srcs arm/filter_neon.S) + list(APPEND lib_srcs arm/filter_neon.S arm/arm_init.c) add_definitions(-DPNG_ARM_NEON) endif() diff --git a/3rdparty/libpng/LICENSE b/3rdparty/libpng/LICENSE index 3a67d54588..11a0c9c9ca 100644 --- a/3rdparty/libpng/LICENSE +++ b/3rdparty/libpng/LICENSE @@ -10,20 +10,16 @@ this sentence. This code is released under the libpng license. -libpng versions 1.2.6, August 15, 2004, through 1.5.12, July 11, 2012, are -Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.2.5 -with the following individual added to the list of Contributing Authors - - Cosmin Truta - -libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are -Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.0.6 -with the following individuals added to the list of Contributing Authors +libpng versions 1.0.7, July 1, 2000, through 1.5.27, May 26, 2016, are +Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: Simon-Pierre Cadieux Eric S. Raymond + Mans Rullgard + Cosmin Truta Gilles Vollant and with the following additions to the disclaimer: @@ -36,18 +32,20 @@ and with the following additions to the disclaimer: the user. libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are -Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-0.96, -with the following individuals added to the list of Contributing Authors: +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the list +of Contributing Authors: Tom Lane Glenn Randers-Pehrson Willem van Schaik libpng versions 0.89, June 1996, through 0.96, May 1997, are -Copyright (c) 1996, 1997 Andreas Dilger -Distributed according to the same disclaimer and license as libpng-0.88, -with the following individuals added to the list of Contributing Authors: +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: John Bowler Kevin Bracey @@ -57,7 +55,7 @@ with the following individuals added to the list of Contributing Authors: Tom Tanner libpng versions 0.5, May 1995, through 0.88, January 1996, are -Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. For the purposes of this copyright and license, "Contributing Authors" is defined as the following set of individuals: @@ -80,13 +78,13 @@ Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions: -1. The origin of this source code must not be misrepresented. + 1. The origin of this source code must not be misrepresented. -2. Altered versions must be plainly marked as such and must not - be misrepresented as being the original source. + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. -3. This Copyright notice may not be removed or altered from any - source or altered source distribution. + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to @@ -94,18 +92,31 @@ supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. +END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE. -A "png_get_copyright" function is available, for convenient use in "about" -boxes and the like: +TRADEMARK: - printf("%s",png_get_copyright(NULL)); +The name "libpng" has not been registered by the Copyright owner +as a trademark in any jurisdiction. However, because libpng has +been distributed and maintained world-wide, continually since 1995, +the Copyright owner claims "common-law trademark protection" in any +jurisdiction where common-law trademark is recognized. -Also, the PNG logo (in PNG format, of course) is supplied in the -files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). +OSI CERTIFICATION: -Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a -certification mark of the Open Source Initiative. +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is +a certification mark of the Open Source Initiative. OSI has not addressed +the additional disclaimers inserted at version 1.0.7. + +EXPORT CONTROL: + +The Copyright owner believes that the Export Control Classification +Number (ECCN) for libpng is EAR99, which means not subject to export +controls or International Traffic in Arms Regulations (ITAR) because +it is open source, publicly available software, that does not contain +any encryption software. See the EAR, paragraphs 734.3(b)(3) and +734.7(b). Glenn Randers-Pehrson glennrp at users.sourceforge.net -July 11, 2012 +May 26, 2016 diff --git a/3rdparty/libpng/README b/3rdparty/libpng/README index 3f5b0d6b64..38ae14629e 100644 --- a/3rdparty/libpng/README +++ b/3rdparty/libpng/README @@ -1,11 +1,11 @@ -README for libpng version 1.5.12 - July 11, 2012 (shared library 15.0) +README for libpng version 1.5.27 - May 26, 2016 (shared library 15.0) See the note about version numbers near the top of png.h See INSTALL for instructions on how to install libpng. -Libpng comes in several distribution formats. Get libpng-*.tar.gz, -libpng-*.tar.xz or libpng-*.tar.bz2 if you want UNIX-style line endings -in the text files, or lpng*.zip if you want DOS-style line endings. +Libpng comes in several distribution formats. Get libpng-*.tar.gz or +libpng-*.tar.xz or if you want UNIX-style line endings in the text files, +or lpng*.7z or lpng*.zip if you want DOS-style line endings. Version 0.89 was the first official release of libpng. Don't let the fact that it's the first release fool you. The libpng library has been in @@ -23,18 +23,25 @@ earlier versions if you are using a shared library. The type of the png_uint_32, which will affect shared-library applications that use this function. -To avoid problems with changes to the internals of png_info_struct, +To avoid problems with changes to the internals of the png info_struct, new APIs have been made available in 0.95 to avoid direct application access to info_ptr. These functions are the png_set_ and png_get_ functions. These functions should be used when accessing/storing the info_struct data, rather than manipulating it directly, to avoid such problems in the future. -It is important to note that the APIs do not make current programs +It is important to note that the APIs did not make current programs that access the info struct directly incompatible with the new -library. However, it is strongly suggested that new programs use -the new APIs (as shown in example.c and pngtest.c), and older programs -be converted to the new format, to facilitate upgrades in the future. +library, through libpng-1.2.x. In libpng-1.4.x, which was meant to +be a transitional release, members of the png_struct and the +info_struct can still be accessed, but the compiler will issue a +warning about deprecated usage. Since libpng-1.5.0, direct access +to these structs is not allowed, and the definitions of the structs +reside in private pngstruct.h and pnginfo.h header files that are not +accessible to applications. It is strongly suggested that new +programs use the new APIs (as shown in example.c and pngtest.c), and +older programs be converted to the new format, to facilitate upgrades +in the future. **** Additions since 0.90 include the ability to compile libpng as a @@ -77,17 +84,21 @@ compression library that is useful for more things than just PNG files. You can use zlib as a drop-in replacement for fread() and fwrite() if you are so inclined. -zlib should be available at the same place that libpng is, or at. -ftp://ftp.info-zip.org/pub/infozip/zlib +zlib should be available at the same place that libpng is, or at zlib.net. You may also want a copy of the PNG specification. It is available as an RFC, a W3C Recommendation, and an ISO/IEC Standard. You can find these at http://www.libpng.org/pub/png/documents/ This code is currently being archived at libpng.sf.net in the -[DOWNLOAD] area, and on CompuServe, Lib 20 (PNG SUPPORT) -at GO GRAPHSUP. If you can't find it in any of those places, -e-mail me, and I'll help you find it. +[DOWNLOAD] area, and at ftp://ftp.simplesystems.org. If you can't find it +in any of those places, e-mail me, and I'll help you find it. + +I am not a lawyer, but I believe that the Export Control Classification +Number (ECCN) for libpng is EAR99, which means not subject to export +controls or International Traffic in Arms Regulations (ITAR) because it +is open source, publicly available software, that does not contain any +encryption software. See the EAR, paragraphs 734.3(b)(3) and 734.7(b). If you have any code changes, requests, problems, etc., please e-mail them to me. Also, I'd appreciate any make files or project files, @@ -105,7 +116,7 @@ based in a large way on Guy's and Andreas' earlier work), and the PNG development group. Send comments/corrections/commendations to png-mng-implement at -lists.sourceforge.net (subscription required; visit +lists.sourceforge.net (subscription required; visit https://lists.sourceforge.net/lists/listinfo/png-mng-implement to subscribe) or to glennrp at users.sourceforge.net @@ -123,7 +134,7 @@ and ...". If in doubt, send questions to me. I'll bounce them to others, if necessary. Please do not send suggestions on how to change PNG. We have -been discussing PNG for sixteen years now, and it is official and +been discussing PNG for twenty years now, and it is official and finished. If you have suggestions for libpng, however, I'll gladly listen. Even if your suggestion is not used immediately, it may be used later. @@ -167,23 +178,23 @@ Files in this distribution: pngwrite.c => High-level write functions pngwtran.c => Write data transformations pngwutil.c => Write utility functions + arm => Contains optimized code for the ARM platform contrib => Contributions gregbook => source code for PNG reading and writing, from Greg Roelofs' "PNG: The Definitive Guide", O'Reilly, 1999 - msvctest => Builds and runs pngtest using a MSVC workspace - pngminus => Simple pnm2png and png2pnm programs - pngsuite => Test images - visupng => Contains a MSVC workspace for VisualPng + libtests => Test programs + pngminim => Minimal decoder, encoder, and progressive decoder + programs demonstrating use of pngusr.dfa + pngminus => Simple pnm2png and png2pnm programs + pngsuite => Test images + visupng => Contains a MSVC workspace for VisualPng projects => Contains project files and workspaces for building a DLL - cbuilder5 => Contains a Borland workspace for building - libpng and zlib - visualc6 => Contains a Microsoft Visual C++ (MSVC) - workspace for building libpng and zlib + owatcom => Contains a WATCOM project for building libpng visualc71 => Contains a Microsoft Visual C++ (MSVC) workspace for building libpng and zlib - xcode => Contains an Apple xcode + vstudio => Contains a Microsoft Visual C++ (MSVC) workspace for building libpng and zlib scripts => Directory containing scripts for building libpng: (see scripts/README.txt for the list of scripts) diff --git a/3rdparty/libpng/arm/arm_init.c b/3rdparty/libpng/arm/arm_init.c new file mode 100644 index 0000000000..6a6a019acb --- /dev/null +++ b/3rdparty/libpng/arm/arm_init.c @@ -0,0 +1,232 @@ + +/* arm_init.c - NEON optimised filter functions + * + * Copyright (c) 2013 Glenn Randers-Pehrson + * Written by Mans Rullgard, 2011. + * Last changed in libpng 1.6.8 [December 19, 2013] + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ +/* Below, after checking __linux__, various non-C90 POSIX 1003.1 functions are + * called. + */ +#define _POSIX_SOURCE 1 + +#include "../pngpriv.h" + +#ifdef PNG_READ_SUPPORTED +#if PNG_ARM_NEON_OPT > 0 +#ifdef PNG_ARM_NEON_CHECK_SUPPORTED /* Do run-time checks */ +#include /* for sig_atomic_t */ + +#ifdef __ANDROID__ +/* Linux provides access to information about CPU capabilites via + * /proc/self/auxv, however Android blocks this while still claiming to be + * Linux. The Andoid NDK, however, provides appropriate support. + * + * Documentation: http://www.kandroid.org/ndk/docs/CPU-ARM-NEON.html + */ +#include + +static int +png_have_neon(png_structp png_ptr) +{ + /* This is a whole lot easier than the mess below, however it is probably + * implemented as below, therefore it is better to cache the result (these + * function calls may be slow!) + */ + PNG_UNUSED(png_ptr) + return android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && + (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0; +} +#elif defined(__linux__) +/* The generic __linux__ implementation requires reading /proc/self/auxv and + * looking at each element for one that records NEON capabilities. + */ +#include /* for POSIX 1003.1 */ +#include /* for EINTR */ + +#include +#include +#include +#include +#include + +/* A read call may be interrupted, in which case it returns -1 and sets errno to + * EINTR if nothing was done, otherwise (if something was done) a partial read + * may result. + */ +static size_t +safe_read(png_structp png_ptr, int fd, void *buffer_in, size_t nbytes) +{ + size_t ntotal = 0; + char *buffer = png_voidcast(char*, buffer_in); + + while (nbytes > 0) + { + unsigned int nread; + int iread; + + /* Passing nread > INT_MAX to read is implementation defined in POSIX + * 1003.1, therefore despite the unsigned argument portable code must + * limit the value to INT_MAX! + */ + if (nbytes > INT_MAX) + nread = INT_MAX; + + else + nread = (unsigned int)/*SAFE*/nbytes; + + iread = read(fd, buffer, nread); + + if (iread == -1) + { + /* This is the devil in the details, a read can terminate early with 0 + * bytes read because of EINTR, yet it still returns -1 otherwise end + * of file cannot be distinguished. + */ + if (errno != EINTR) + { + png_warning(png_ptr, "/proc read failed"); + return 0; /* I.e., a permanent failure */ + } + } + + else if (iread < 0) + { + /* Not a valid 'read' result: */ + png_warning(png_ptr, "OS /proc read bug"); + return 0; + } + + else if (iread > 0) + { + /* Continue reading until a permanent failure, or EOF */ + buffer += iread; + nbytes -= (unsigned int)/*SAFE*/iread; + ntotal += (unsigned int)/*SAFE*/iread; + } + + else + return ntotal; + } + + return ntotal; /* nbytes == 0 */ +} + +static int +png_have_neon(png_structp png_ptr) +{ + int fd = open("/proc/self/auxv", O_RDONLY); + Elf32_auxv_t aux; + + /* Failsafe: failure to open means no NEON */ + if (fd == -1) + { + png_warning(png_ptr, "/proc/self/auxv open failed"); + return 0; + } + + while (safe_read(png_ptr, fd, &aux, sizeof aux) == sizeof aux) + { + if (aux.a_type == AT_HWCAP && (aux.a_un.a_val & HWCAP_NEON) != 0) + { + close(fd); + return 1; + } + } + + close(fd); + return 0; +} +#else + /* We don't know how to do a run-time check on this system */ +# error "no support for run-time ARM NEON checks" +#endif /* OS checks */ +#endif /* PNG_ARM_NEON_CHECK_SUPPORTED */ + +#ifndef PNG_ALIGNED_MEMORY_SUPPORTED +# error "ALIGNED_MEMORY is required; set: -DPNG_ALIGNED_MEMORY_SUPPORTED" +#endif + +void +png_init_filter_functions_neon(png_structp pp, unsigned int bpp) +{ + /* The switch statement is compiled in for ARM_NEON_API, the call to + * png_have_neon is compiled in for ARM_NEON_CHECK. If both are defined + * the check is only performed if the API has not set the NEON option on + * or off explicitly. In this case the check controls what happens. + * + * If the CHECK is not compiled in and the option is UNSET the behavior prior + * to 1.6.7 was to use the NEON code - this was a bug caused by having the + * wrong order of the 'ON' and 'default' cases. UNSET now defaults to OFF, + * as documented in png.h + */ +#ifdef PNG_ARM_NEON_API_SUPPORTED + switch ((pp->options >> PNG_ARM_NEON) & 3) + { + case PNG_OPTION_UNSET: + /* Allow the run-time check to execute if it has been enabled - + * thus both API and CHECK can be turned on. If it isn't supported + * this case will fall through to the 'default' below, which just + * returns. + */ +#endif /* PNG_ARM_NEON_API_SUPPORTED */ +#ifdef PNG_ARM_NEON_CHECK_SUPPORTED + { + static volatile sig_atomic_t no_neon = -1; /* not checked */ + + if (no_neon < 0) + no_neon = !png_have_neon(pp); + + if (no_neon) + return; + } +#ifdef PNG_ARM_NEON_API_SUPPORTED + break; +#endif +#endif /* PNG_ARM_NEON_CHECK_SUPPORTED */ + +#ifdef PNG_ARM_NEON_API_SUPPORTED + default: /* OFF or INVALID */ + return; + + case PNG_OPTION_ON: + /* Option turned on */ + break; + } +#endif + + /* IMPORTANT: any new external functions used here must be declared using + * PNG_INTERNAL_FUNCTION in ../pngpriv.h. This is required so that the + * 'prefix' option to configure works: + * + * ./configure --with-libpng-prefix=foobar_ + * + * Verify you have got this right by running the above command, doing a build + * and examining pngprefix.h; it must contain a #define for every external + * function you add. (Notice that this happens automatically for the + * initialization function.) + */ + pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_neon; + + if (bpp == 3) + { + pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_neon; + pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_neon; + pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = + png_read_filter_row_paeth3_neon; + } + + else if (bpp == 4) + { + pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_neon; + pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_neon; + pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = + png_read_filter_row_paeth4_neon; + } +} +#endif /* PNG_ARM_NEON_OPT > 0 */ +#endif /* PNG_READ_SUPPORTED */ diff --git a/3rdparty/libpng/png.c b/3rdparty/libpng/png.c index 6808c5cb90..711b7c4629 100644 --- a/3rdparty/libpng/png.c +++ b/3rdparty/libpng/png.c @@ -1,8 +1,8 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.5.11 [June 14, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.23 [July 23, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_5_12 Your_png_h_is_not_version_1_5_12; +typedef png_libpng_version_1_5_27 Your_png_h_is_not_version_1_5_27; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -26,15 +26,20 @@ typedef png_libpng_version_1_5_12 Your_png_h_is_not_version_1_5_12; void PNGAPI png_set_sig_bytes(png_structp png_ptr, int num_bytes) { + unsigned int nb = (unsigned int)num_bytes; + png_debug(1, "in png_set_sig_bytes"); if (png_ptr == NULL) return; - if (num_bytes > 8) + if (num_bytes < 0) + nb = 0; + + if (nb > 8) png_error(png_ptr, "Too many bytes for PNG signature"); - png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); + png_ptr->sig_bytes = (png_byte)nb; } /* Checks whether the supplied bytes match the PNG signature. We allow @@ -73,13 +78,16 @@ PNG_FUNCTION(voidpf /* PRIVATE */, png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED) { png_voidp ptr; - png_structp p=(png_structp)png_ptr; - png_uint_32 save_flags=p->flags; + png_structp p; + png_uint_32 save_flags; png_alloc_size_t num_bytes; if (png_ptr == NULL) return (NULL); + p=(png_structp)png_ptr; + save_flags=p->flags; + if (items > PNG_UINT_32_MAX/size) { png_warning (p, "Potential overflow in png_zalloc()"); @@ -146,9 +154,10 @@ png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length) do { uInt safeLength = (uInt)length; +#ifndef __COVERITY__ if (safeLength == 0) safeLength = (uInt)-1; /* evil, but safe */ - +#endif crc = crc32(crc, ptr, safeLength); /* The following should never issue compiler warnings, if they do the @@ -171,49 +180,51 @@ png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length) int png_user_version_check(png_structp png_ptr, png_const_charp user_png_ver) { - if (user_png_ver) + /* Libpng versions 1.0.0 and later are binary compatible if the version + * string matches through the second '.'; we must recompile any + * applications that use any older library version. + */ + + if (user_png_ver != NULL) { - int i = 0; + int i = -1; + int found_dots = 0; do { - if (user_png_ver[i] != png_libpng_ver[i]) + i++; + if (user_png_ver[i] != PNG_LIBPNG_VER_STRING[i]) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - } while (png_libpng_ver[i++]); + if (user_png_ver[i] == '.') + found_dots++; + } while (found_dots < 2 && user_png_ver[i] != 0 && + PNG_LIBPNG_VER_STRING[i] != 0); } else png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + if ((png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) != 0) { - /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so - * we must recompile any applications that use any older library version. - * For versions after libpng 1.0, we will be compatible, so we need - * only check the first digit. - */ - if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || - (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || - (user_png_ver[0] == '0' && user_png_ver[2] < '9')) - { #ifdef PNG_WARNINGS_SUPPORTED - size_t pos = 0; - char m[128]; + size_t pos = 0; + char m[128]; - pos = png_safecat(m, sizeof m, pos, "Application built with libpng-"); - pos = png_safecat(m, sizeof m, pos, user_png_ver); - pos = png_safecat(m, sizeof m, pos, " but running with "); - pos = png_safecat(m, sizeof m, pos, png_libpng_ver); + pos = png_safecat(m, (sizeof m), pos, + "Application built with libpng-"); + pos = png_safecat(m, (sizeof m), pos, user_png_ver); + pos = png_safecat(m, (sizeof m), pos, " but running with "); + pos = png_safecat(m, (sizeof m), pos, PNG_LIBPNG_VER_STRING); + PNG_UNUSED(pos) - png_warning(png_ptr, m); + png_warning(png_ptr, m); #endif #ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags = 0; + png_ptr->flags = 0; #endif - return 0; - } + return 0; } /* Success return. */ @@ -300,6 +311,8 @@ png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) png_destroy_struct(info_ptr); info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); *ptr_ptr = info_ptr; + if (info_ptr == NULL) + return; } /* Set everything to 0 */ @@ -337,42 +350,43 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, #ifdef PNG_TEXT_SUPPORTED /* Free text item num or (if num == -1) all text items */ - if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) + if (info_ptr->text != 0 && + ((mask & PNG_FREE_TEXT) & info_ptr->free_me) != 0) { if (num != -1) { - if (info_ptr->text && info_ptr->text[num].key) - { - png_free(png_ptr, info_ptr->text[num].key); - info_ptr->text[num].key = NULL; - } + png_free(png_ptr, info_ptr->text[num].key); + info_ptr->text[num].key = NULL; } else { int i; + for (i = 0; i < info_ptr->num_text; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); + png_free(png_ptr, info_ptr->text[i].key); + png_free(png_ptr, info_ptr->text); info_ptr->text = NULL; - info_ptr->num_text=0; + info_ptr->num_text = 0; } } #endif #ifdef PNG_tRNS_SUPPORTED /* Free any tRNS entry */ - if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) + if (((mask & PNG_FREE_TRNS) & info_ptr->free_me) != 0) { + info_ptr->valid &= ~PNG_INFO_tRNS; png_free(png_ptr, info_ptr->trans_alpha); info_ptr->trans_alpha = NULL; - info_ptr->valid &= ~PNG_INFO_tRNS; + info_ptr->num_trans = 0; } #endif #ifdef PNG_sCAL_SUPPORTED /* Free any sCAL entry */ - if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) + if (((mask & PNG_FREE_SCAL) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->scal_s_width); png_free(png_ptr, info_ptr->scal_s_height); @@ -384,20 +398,20 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, #ifdef PNG_pCAL_SUPPORTED /* Free any pCAL entry */ - if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) + if (((mask & PNG_FREE_PCAL) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->pcal_purpose); png_free(png_ptr, info_ptr->pcal_units); info_ptr->pcal_purpose = NULL; info_ptr->pcal_units = NULL; + if (info_ptr->pcal_params != NULL) { int i; - for (i = 0; i < (int)info_ptr->pcal_nparams; i++) - { + + for (i = 0; i < info_ptr->pcal_nparams; i++) png_free(png_ptr, info_ptr->pcal_params[i]); - info_ptr->pcal_params[i] = NULL; - } + png_free(png_ptr, info_ptr->pcal_params); info_ptr->pcal_params = NULL; } @@ -406,8 +420,8 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, #endif #ifdef PNG_iCCP_SUPPORTED - /* Free any iCCP entry */ - if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) + /* Free any profile entry */ + if (((mask & PNG_FREE_ICCP) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->iccp_name); png_free(png_ptr, info_ptr->iccp_profile); @@ -419,74 +433,62 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, #ifdef PNG_sPLT_SUPPORTED /* Free a given sPLT entry, or (if num == -1) all sPLT entries */ - if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) + if (info_ptr->splt_palettes != 0 && + ((mask & PNG_FREE_SPLT) & info_ptr->free_me) != 0) { if (num != -1) { - if (info_ptr->splt_palettes) - { - png_free(png_ptr, info_ptr->splt_palettes[num].name); - png_free(png_ptr, info_ptr->splt_palettes[num].entries); - info_ptr->splt_palettes[num].name = NULL; - info_ptr->splt_palettes[num].entries = NULL; - } - } - - else - { - if (info_ptr->splt_palettes_num) - { - int i; - for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); - - png_free(png_ptr, info_ptr->splt_palettes); - info_ptr->splt_palettes = NULL; - info_ptr->splt_palettes_num = 0; - } - info_ptr->valid &= ~PNG_INFO_sPLT; - } - } -#endif - -#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED - if (png_ptr->unknown_chunk.data) - { - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } - - if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) - { - if (num != -1) - { - if (info_ptr->unknown_chunks) - { - png_free(png_ptr, info_ptr->unknown_chunks[num].data); - info_ptr->unknown_chunks[num].data = NULL; - } + png_free(png_ptr, info_ptr->splt_palettes[num].name); + png_free(png_ptr, info_ptr->splt_palettes[num].entries); + info_ptr->splt_palettes[num].name = NULL; + info_ptr->splt_palettes[num].entries = NULL; } else { int i; - if (info_ptr->unknown_chunks_num) + for (i = 0; i < info_ptr->splt_palettes_num; i++) { - for (i = 0; i < info_ptr->unknown_chunks_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); - - png_free(png_ptr, info_ptr->unknown_chunks); - info_ptr->unknown_chunks = NULL; - info_ptr->unknown_chunks_num = 0; + png_free(png_ptr, info_ptr->splt_palettes[i].name); + png_free(png_ptr, info_ptr->splt_palettes[i].entries); } + + png_free(png_ptr, info_ptr->splt_palettes); + info_ptr->splt_palettes = NULL; + info_ptr->splt_palettes_num = 0; + info_ptr->valid &= ~PNG_INFO_sPLT; + } + } +#endif + +#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED + if (info_ptr->unknown_chunks != 0 && + ((mask & PNG_FREE_UNKN) & info_ptr->free_me) != 0) + { + if (num != -1) + { + png_free(png_ptr, info_ptr->unknown_chunks[num].data); + info_ptr->unknown_chunks[num].data = NULL; + } + + else + { + int i; + + for (i = 0; i < info_ptr->unknown_chunks_num; i++) + png_free(png_ptr, info_ptr->unknown_chunks[i].data); + + png_free(png_ptr, info_ptr->unknown_chunks); + info_ptr->unknown_chunks = NULL; + info_ptr->unknown_chunks_num = 0; } } #endif #ifdef PNG_hIST_SUPPORTED /* Free any hIST entry */ - if ((mask & PNG_FREE_HIST) & info_ptr->free_me) + if (((mask & PNG_FREE_HIST) & info_ptr->free_me) != 0) { png_free(png_ptr, info_ptr->hist); info_ptr->hist = NULL; @@ -495,9 +497,9 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, #endif /* Free any PLTE entry that was internally allocated */ - if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) + if (((mask & PNG_FREE_PLTE) & info_ptr->free_me) != 0) { - png_zfree(png_ptr, info_ptr->palette); + png_free(png_ptr, info_ptr->palette); info_ptr->palette = NULL; info_ptr->valid &= ~PNG_INFO_PLTE; info_ptr->num_palette = 0; @@ -505,16 +507,14 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, #ifdef PNG_INFO_IMAGE_SUPPORTED /* Free any image bits attached to the info structure */ - if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) + if (((mask & PNG_FREE_ROWS) & info_ptr->free_me) != 0) { - if (info_ptr->row_pointers) + if (info_ptr->row_pointers != 0) { - int row; - for (row = 0; row < (int)info_ptr->height; row++) - { + png_uint_32 row; + for (row = 0; row < info_ptr->height; row++) png_free(png_ptr, info_ptr->row_pointers[row]); - info_ptr->row_pointers[row] = NULL; - } + png_free(png_ptr, info_ptr->row_pointers); info_ptr->row_pointers = NULL; } @@ -655,14 +655,15 @@ png_get_copyright(png_const_structp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.5.12 - July 11, 2012" PNG_STRING_NEWLINE \ - "Copyright (c) 1998-2012 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ + "libpng version 1.5.27 - May 26, 2016" PNG_STRING_NEWLINE \ + "Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson" \ + PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ PNG_STRING_NEWLINE; # else - return "libpng version 1.5.12 - July 11, 2012\ - Copyright (c) 1998-2012 Glenn Randers-Pehrson\ + return "libpng version 1.5.27 - May 26, 2016\ + Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; # endif @@ -892,7 +893,8 @@ int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy) /* Check xy and, implicitly, z. Note that wide gamut color spaces typically * have end points with 0 tristimulus values (these are impossible end - * points, but they are used to cover the possible colors.) + * points, but they are used to cover the possible colors). We check + * xy.whitey against 5, not 0, to avoid a possible integer overflow. */ if (xy.redx < 0 || xy.redx > PNG_FP_1) return 1; if (xy.redy < 0 || xy.redy > PNG_FP_1-xy.redx) return 1; @@ -901,7 +903,7 @@ int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy) if (xy.bluex < 0 || xy.bluex > PNG_FP_1) return 1; if (xy.bluey < 0 || xy.bluey > PNG_FP_1-xy.bluex) return 1; if (xy.whitex < 0 || xy.whitex > PNG_FP_1) return 1; - if (xy.whitey < 0 || xy.whitey > PNG_FP_1-xy.whitex) return 1; + if (xy.whitey < 5 || xy.whitey > PNG_FP_1-xy.whitex) return 1; /* The reverse calculation is more difficult because the original tristimulus * value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8 @@ -1165,6 +1167,17 @@ int png_XYZ_from_xy_checked(png_structp png_ptr, png_XYZ *XYZ, png_xy xy) } #endif +#ifdef __GNUC__ +/* This exists solely to work round a warning from GNU C. */ +static int /* PRIVATE */ +png_gt(size_t a, size_t b) +{ + return a > b; +} +#else +# define png_gt(a,b) ((a) > (b)) +#endif + void /* PRIVATE */ png_check_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, @@ -1179,53 +1192,68 @@ png_check_IHDR(png_structp png_ptr, png_warning(png_ptr, "Image width is zero in IHDR"); error = 1; } + else if (width > PNG_UINT_31_MAX) + { + png_warning(png_ptr, "Invalid image width in IHDR"); + error = 1; + } + + else if (png_gt(width, + (PNG_SIZE_MAX >> 3) /* 8-byte RGBA pixels */ + - 48 /* big_row_buf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding width to multiple of 8 pix */ + - 8)) /* extra max_pixel_depth pad */ + { + /* The size of the row must be within the limits of this architecture. + * Because the read code can perform arbitrary transformations the + * maximum size is checked here. Because the code in png_read_start_row + * adds extra space "for safety's sake" in several places a conservative + * limit is used here. + * + * NOTE: it would be far better to check the size that is actually used, + * but the effect in the real world is minor and the changes are more + * extensive, therefore much more dangerous and much more difficult to + * write in a way that avoids compiler warnings. + */ + png_warning(png_ptr, "Image width is too large for this architecture"); + error = 1; + } + else + { +# ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (width > png_ptr->user_width_max) +# else + if (width > PNG_USER_WIDTH_MAX) +# endif + { + png_warning(png_ptr, "Image width exceeds user limit in IHDR"); + error = 1; + } + } if (height == 0) { png_warning(png_ptr, "Image height is zero in IHDR"); error = 1; } - -# ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (width > png_ptr->user_width_max) - -# else - if (width > PNG_USER_WIDTH_MAX) -# endif - { - png_warning(png_ptr, "Image width exceeds user limit in IHDR"); - error = 1; - } - -# ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (height > png_ptr->user_height_max) -# else - if (height > PNG_USER_HEIGHT_MAX) -# endif - { - png_warning(png_ptr, "Image height exceeds user limit in IHDR"); - error = 1; - } - - if (width > PNG_UINT_31_MAX) - { - png_warning(png_ptr, "Invalid image width in IHDR"); - error = 1; - } - - if (height > PNG_UINT_31_MAX) + else if (height > PNG_UINT_31_MAX) { png_warning(png_ptr, "Invalid image height in IHDR"); error = 1; } - - if (width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 48 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - png_warning(png_ptr, "Width is too large for libpng to process pixels"); + else + { +# ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (height > png_ptr->user_height_max) +# else + if (height > PNG_USER_HEIGHT_MAX) +# endif + { + png_warning(png_ptr, "Image height exceeds user limit in IHDR"); + error = 1; + } + } /* Check other values */ if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && @@ -1458,7 +1486,7 @@ png_check_fp_string(png_const_charp string, png_size_t size) } #endif /* pCAL or sCAL */ -#ifdef PNG_READ_sCAL_SUPPORTED +#ifdef PNG_sCAL_SUPPORTED # ifdef PNG_FLOATING_POINT_SUPPORTED /* Utility used below - a simple accurate power of ten from an integral * exponent. @@ -1490,7 +1518,7 @@ png_pow10(int power) } while (power > 0); - if (recip) d = 1/d; + if (recip != 0) d = 1/d; } /* else power is 0 and d is 1 */ @@ -1722,7 +1750,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, /* Check for an exponent, if we don't need one we are * done and just need to terminate the string. At * this point exp_b10==(-1) is effectively if flag - it got - * to '-1' because of the decrement after outputing + * to '-1' because of the decrement after outputting * the decimal point above (the exponent required is * *not* -1!) */ @@ -1730,7 +1758,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, { /* The following only happens if we didn't output the * leading zeros above for negative exponent, so this - * doest add to the digit requirement. Note that the + * doesn't add to the digit requirement. Note that the * two zeros here can only be output if the two leading * zeros were *not* output, so this doesn't increase * the output count. @@ -1904,7 +1932,7 @@ png_fixed(png_structp png_ptr, double fp, png_const_charp text) #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || \ - defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG__READ_pHYs_SUPPORTED) + defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED) /* muldiv functions */ /* This API takes signed arguments and rounds the result to the nearest * integer (or, for a fixed point number - the standard argument - to @@ -2008,7 +2036,7 @@ png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times, if (s00 >= (D >> 1)) ++result; - if (negative) + if (negative != 0) result = -result; /* Check for overflow. */ @@ -2044,26 +2072,31 @@ png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times, } #endif -#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gamma */ +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) +/* more fixed point functions for gamma and cHRM (xy/XYZ) suport. */ /* Calculate a reciprocal, return 0 on div-by-zero or overflow. */ png_fixed_point png_reciprocal(png_fixed_point a) { + if (a != 0) + { #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = floor(1E10/a+.5); + double r = floor(1E10/a+.5); - if (r <= 2147483647. && r >= -2147483648.) - return (png_fixed_point)r; + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; #else - png_fixed_point res; + png_fixed_point res; - if (png_muldiv(&res, 100000, 100000, a)) - return res; + if (png_muldiv(&res, 100000, 100000, a)) + return res; #endif + } return 0; /* error/overflow */ } +#ifdef PNG_READ_GAMMA_SUPPORTED /* A local convenience routine. */ static png_fixed_point png_product2(png_fixed_point a, png_fixed_point b) @@ -2085,6 +2118,7 @@ png_product2(png_fixed_point a, png_fixed_point b) return 0; /* overflow */ } +#endif /* READ_GAMMA */ /* The inverse of the above. */ png_fixed_point @@ -2092,17 +2126,20 @@ png_reciprocal2(png_fixed_point a, png_fixed_point b) { /* The required result is 1/a * 1/b; the following preserves accuracy. */ #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = 1E15/a; - r /= b; - r = floor(r+.5); + if (a != 0 && b != 0) + { + double r = 1E15/a; + r /= b; + r = floor(r+.5); - if (r <= 2147483647. && r >= -2147483648.) - return (png_fixed_point)r; + if (r <= 2147483647. && r >= -2147483648.) + return (png_fixed_point)r; + } #else - /* This may overflow because the range of png_fixed_point isn't symmetric, - * but this API is only used for the product of file and screen gamma so it - * doesn't matter that the smallest number it can produce is 1/21474, not - * 1/100000 + /* This may overflow because the range of png_fixed_point isn't + * symmetric, but this API is only used for the product of file and + * screen gamma so it doesn't matter that the smallest number it can + * produce is 1/21474, not 1/100000 */ png_fixed_point res = png_product2(a, b); @@ -2112,7 +2149,7 @@ png_reciprocal2(png_fixed_point a, png_fixed_point b) return 0; /* overflow */ } -#endif /* READ_GAMMA */ +#endif /* READ_GAMMA || cHRM */ #ifdef PNG_CHECK_cHRM_SUPPORTED /* Added at libpng version 1.2.34 (Dec 8, 2008) and 1.4.0 (Jan 2, @@ -2523,6 +2560,7 @@ png_gamma_significant(png_fixed_point gamma_val) gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED; } +#ifdef PNG_16BIT_SUPPORTED /* Internal function to build a single 16-bit table - the table consists of * 'num' 256-entry subtables, where 'num' is determined by 'shift' - the amount * to shift the input values right (or 16-number_of_signifiant_bits). @@ -2571,7 +2609,7 @@ png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable, double d = floor(65535*pow(ig/(double)max, gamma_val*.00001)+.5); sub_table[j] = (png_uint_16)d; # else - if (shift) + if (shift != 0) ig = (ig * 65535U + max_by_2)/max; sub_table[j] = png_gamma_16bit_correct(ig, gamma_val); @@ -2587,7 +2625,7 @@ png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable, { png_uint_32 ig = (j << (8-shift)) + i; - if (shift) + if (shift != 0) ig = (ig * 65535U + max_by_2)/max; sub_table[j] = (png_uint_16)ig; @@ -2595,6 +2633,7 @@ png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable, } } } +#endif /* NOTE: this function expects the *inverse* of the overall gamma transformation * required. @@ -2872,3 +2911,24 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth) } #endif /* READ_GAMMA */ #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +/* HARDWARE OPTION SUPPORT */ +#ifdef PNG_SET_OPTION_SUPPORTED +int PNGAPI +png_set_option(png_structp png_ptr, int option, int onoff) +{ + if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT && + (option & 1) == 0) + { + int mask = 3 << option; + int setting = (2 + (onoff != 0)) << option; + int current = png_ptr->options; + + png_ptr->options = (png_byte)((current & ~mask) | setting); + + return (current & mask) >> option; + } + + return PNG_OPTION_INVALID; +} +#endif diff --git a/3rdparty/libpng/png.h b/3rdparty/libpng/png.h index 4c37e58a4c..f726c7282f 100644 --- a/3rdparty/libpng/png.h +++ b/3rdparty/libpng/png.h @@ -1,8 +1,9 @@ /* png.h - header file for PNG reference library * - * libpng version 1.5.12 - July 11, 2012 - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * libpng version 1.5.27, May 26, 2016 + * + * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,16 +12,152 @@ * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.5.12 - July 11, 2012: Glenn + * libpng versions 0.97, January 1998, through 1.5.27, May 26, 2016: + * Glenn Randers-Pehrson. * See also "Contributing Authors", below. + */ + +/* + * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: * - * Note about libpng version numbers: + * If you modify libpng you may insert additional notices immediately following + * this sentence. * - * Due to various miscommunications, unforeseen code incompatibilities - * and occasional factors outside the authors' control, version numbering - * on the library has not always been consistent and straightforward. - * The following table summarizes matters since version 0.89c, which was - * the first widely used release: + * This code is released under the libpng license. + * + * libpng versions 1.0.7, July 1, 2000, through 1.5.27, May 26, 2016, are + * Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are + * derived from libpng-1.0.6, and are distributed according to the same + * disclaimer and license as libpng-1.0.6 with the following individuals + * added to the list of Contributing Authors: + * + * Simon-Pierre Cadieux + * Eric S. Raymond + * Mans Rullgard + * Cosmin Truta + * Gilles Vollant + * + * and with the following additions to the disclaimer: + * + * There is no warranty against interference with your enjoyment of the + * library or against infringement. There is no warranty that our + * efforts or the library will fulfill any of your particular purposes + * or needs. This library is provided with all faults, and the entire + * risk of satisfactory quality, performance, accuracy, and effort is with + * the user. + * + * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are + * Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from + * libpng-0.96, and are distributed according to the same disclaimer and + * license as libpng-0.96, with the following individuals added to the list + * of Contributing Authors: + * + * Tom Lane + * Glenn Randers-Pehrson + * Willem van Schaik + * + * libpng versions 0.89, June 1996, through 0.96, May 1997, are + * Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, + * and are distributed according to the same disclaimer and license as + * libpng-0.88, with the following individuals added to the list of + * Contributing Authors: + * + * John Bowler + * Kevin Bracey + * Sam Bushell + * Magnus Holmgren + * Greg Roelofs + * Tom Tanner + * + * libpng versions 0.5, May 1995, through 0.88, January 1996, are + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + * + * For the purposes of this copyright and license, "Contributing Authors" + * is defined as the following set of individuals: + * + * Andreas Dilger + * Dave Martindale + * Guy Eric Schalnat + * Paul Schmidt + * Tim Wegner + * + * The PNG Reference Library is supplied "AS IS". The Contributing Authors + * and Group 42, Inc. disclaim all warranties, expressed or implied, + * including, without limitation, the warranties of merchantability and of + * fitness for any purpose. The Contributing Authors and Group 42, Inc. + * assume no liability for direct, indirect, incidental, special, exemplary, + * or consequential damages, which may result from the use of the PNG + * Reference Library, even if advised of the possibility of such damage. + * + * Permission is hereby granted to use, copy, modify, and distribute this + * source code, or portions hereof, for any purpose, without fee, subject + * to the following restrictions: + * + * 1. The origin of this source code must not be misrepresented. + * + * 2. Altered versions must be plainly marked as such and must not + * be misrepresented as being the original source. + * + * 3. This Copyright notice may not be removed or altered from any + * source or altered source distribution. + * + * The Contributing Authors and Group 42, Inc. specifically permit, without + * fee, and encourage the use of this source code as a component to + * supporting the PNG file format in commercial products. If you use this + * source code in a product, acknowledgment is not required but would be + * appreciated. + * + * END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE. + * + * TRADEMARK: + * + * The name "libpng" has not been registered by the Copyright owner + * as a trademark in any jurisdiction. However, because libpng has + * been distributed and maintained world-wide, continually since 1995, + * the Copyright owner claims "common-law trademark protection" in any + * jurisdiction where common-law trademark is recognized. + * + * OSI CERTIFICATION: + * + * Libpng is OSI Certified Open Source Software. OSI Certified Open Source is + * a certification mark of the Open Source Initiative. OSI has not addressed + * the additional disclaimers inserted at version 1.0.7. + * + * EXPORT CONTROL: + * + * The Copyright owner believes that the Export Control Classification + * Number (ECCN) for libpng is EAR99, which means not subject to export + * controls or International Traffic in Arms Regulations (ITAR) because + * it is open source, publicly available software, that does not contain + * any encryption software. See the EAR, paragraphs 734.3(b)(3) and + * 734.7(b). + */ + +/* + * A "png_get_copyright" function is available, for convenient use in "about" + * boxes and the like: + * + * printf("%s", png_get_copyright(NULL)); + * + * Also, the PNG logo (in PNG format, of course) is supplied in the + * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + */ + +/* + * The contributing authors would like to thank all those who helped + * with testing, bug fixes, and patience. This wouldn't have been + * possible without all of you. + * + * Thanks to Frank J. T. Wojcik for helping with the documentation. + */ + +/* Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: * * source png.h png.h shared-lib * version string int version @@ -58,276 +195,46 @@ * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) * 1.0.7 1 10007 (still compatible) - * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 - * 1.0.8rc1 1 10008 2.1.0.8rc1 - * 1.0.8 1 10008 2.1.0.8 - * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 - * 1.0.9rc1 1 10009 2.1.0.9rc1 - * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 - * 1.0.9rc2 1 10009 2.1.0.9rc2 - * 1.0.9 1 10009 2.1.0.9 - * 1.0.10beta1 1 10010 2.1.0.10beta1 - * 1.0.10rc1 1 10010 2.1.0.10rc1 - * 1.0.10 1 10010 2.1.0.10 - * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 - * 1.0.11rc1 1 10011 2.1.0.11rc1 - * 1.0.11 1 10011 2.1.0.11 - * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 - * 1.0.12rc1 2 10012 2.1.0.12rc1 - * 1.0.12 2 10012 2.1.0.12 - * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) - * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 - * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 - * 1.2.0rc1 3 10200 3.1.2.0rc1 - * 1.2.0 3 10200 3.1.2.0 - * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 - * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 - * 1.2.1 3 10201 3.1.2.1 - * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 - * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 - * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 - * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 - * 1.0.13 10 10013 10.so.0.1.0.13 - * 1.2.2 12 10202 12.so.0.1.2.2 - * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 - * 1.2.3 12 10203 12.so.0.1.2.3 - * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 - * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 - * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 - * 1.0.14 10 10014 10.so.0.1.0.14 - * 1.2.4 13 10204 12.so.0.1.2.4 - * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 - * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 - * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 - * 1.0.15 10 10015 10.so.0.1.0.15 - * 1.2.5 13 10205 12.so.0.1.2.5 - * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 - * 1.0.16 10 10016 10.so.0.1.0.16 - * 1.2.6 13 10206 12.so.0.1.2.6 - * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 - * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 - * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 - * 1.0.17 10 10017 12.so.0.1.0.17 - * 1.2.7 13 10207 12.so.0.1.2.7 - * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 - * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 - * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 - * 1.0.18 10 10018 12.so.0.1.0.18 - * 1.2.8 13 10208 12.so.0.1.2.8 - * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 - * 1.2.9beta4-11 13 10209 12.so.0.9[.0] - * 1.2.9rc1 13 10209 12.so.0.9[.0] - * 1.2.9 13 10209 12.so.0.9[.0] - * 1.2.10beta1-7 13 10210 12.so.0.10[.0] - * 1.2.10rc1-2 13 10210 12.so.0.10[.0] - * 1.2.10 13 10210 12.so.0.10[.0] - * 1.4.0beta1-5 14 10400 14.so.0.0[.0] - * 1.2.11beta1-4 13 10211 12.so.0.11[.0] - * 1.4.0beta7-8 14 10400 14.so.0.0[.0] - * 1.2.11 13 10211 12.so.0.11[.0] - * 1.2.12 13 10212 12.so.0.12[.0] - * 1.4.0beta9-14 14 10400 14.so.0.0[.0] - * 1.2.13 13 10213 12.so.0.13[.0] - * 1.4.0beta15-36 14 10400 14.so.0.0[.0] - * 1.4.0beta37-87 14 10400 14.so.14.0[.0] - * 1.4.0rc01 14 10400 14.so.14.0[.0] - * 1.4.0beta88-109 14 10400 14.so.14.0[.0] - * 1.4.0rc02-08 14 10400 14.so.14.0[.0] - * 1.4.0 14 10400 14.so.14.0[.0] - * 1.4.1beta01-03 14 10401 14.so.14.1[.0] - * 1.4.1rc01 14 10401 14.so.14.1[.0] - * 1.4.1beta04-12 14 10401 14.so.14.1[.0] - * 1.4.1 14 10401 14.so.14.1[.0] - * 1.4.2 14 10402 14.so.14.2[.0] - * 1.4.3 14 10403 14.so.14.3[.0] - * 1.4.4 14 10404 14.so.14.4[.0] - * 1.5.0beta01-58 15 10500 15.so.15.0[.0] - * 1.5.0rc01-07 15 10500 15.so.15.0[.0] - * 1.5.0 15 10500 15.so.15.0[.0] - * 1.5.1beta01-11 15 10501 15.so.15.1[.0] - * 1.5.1rc01-02 15 10501 15.so.15.1[.0] - * 1.5.1 15 10501 15.so.15.1[.0] - * 1.5.2beta01-03 15 10502 15.so.15.2[.0] - * 1.5.2rc01-03 15 10502 15.so.15.2[.0] - * 1.5.2 15 10502 15.so.15.2[.0] - * 1.5.3beta01-10 15 10503 15.so.15.3[.0] - * 1.5.3rc01-02 15 10503 15.so.15.3[.0] - * 1.5.3beta11 15 10503 15.so.15.3[.0] - * 1.5.3 [omitted] - * 1.5.4beta01-08 15 10504 15.so.15.4[.0] - * 1.5.4rc01 15 10504 15.so.15.4[.0] - * 1.5.4 15 10504 15.so.15.4[.0] - * 1.5.5beta01-08 15 10505 15.so.15.5[.0] - * 1.5.5rc01 15 10505 15.so.15.5[.0] - * 1.5.5 15 10505 15.so.15.5[.0] - * 1.5.6beta01-07 15 10506 15.so.15.6[.0] - * 1.5.6rc01-03 15 10506 15.so.15.6[.0] - * 1.5.6 15 10506 15.so.15.6[.0] - * 1.5.7beta01-05 15 10507 15.so.15.7[.0] - * 1.5.7rc01-03 15 10507 15.so.15.7[.0] - * 1.5.7 15 10507 15.so.15.7[.0] - * 1.5.8beta01 15 10508 15.so.15.8[.0] - * 1.5.8rc01 15 10508 15.so.15.8[.0] - * 1.5.8 15 10508 15.so.15.8[.0] - * 1.5.9beta01-02 15 10509 15.so.15.9[.0] - * 1.5.9rc01 15 10509 15.so.15.9[.0] - * 1.5.9 15 10509 15.so.15.9[.0] - * 1.5.10beta01-05 15 10510 15.so.15.10[.0] - * 1.5.10 15 10510 15.so.15.10[.0] - * 1.5.11beta01 15 10511 15.so.15.11[.0] - * 1.5.11rc01-05 15 10511 15.so.15.11[.0] - * 1.5.11 15 10511 15.so.15.11[.0] - * 1.5.12 15 10512 15.so.15.12[.0] + * ... + * 1.0.19 10 10019 10.so.0.19[.0] + * ... + * 1.2.56 13 10256 12.so.0.56[.0] + * ... + * 1.5.27 15 10527 15.so.15.27[.0] * - * Henceforth the source version will match the shared-library major - * and minor numbers; the shared-library major version number will be - * used for changes in backward compatibility, as it is intended. The - * PNG_LIBPNG_VER macro, which is not used within libpng but is available - * for applications, is an unsigned integer of the form xyyzz corresponding - * to the source version x.y.z (leading zeros in y and z). Beta versions - * were given the previous public release number plus a letter, until - * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcNN". + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcNN". * - * Binary incompatibility exists only when applications make direct access - * to the info_ptr or png_ptr members through png.h, and the compiled - * application is loaded with a different version of the library. + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. * - * DLLNUM will change each time there are forward or backward changes - * in binary compatibility (e.g., when a new feature is added). + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). * - * See libpng-manual.txt or libpng.3 for more information. The PNG - * specification is available as a W3C Recommendation and as an ISO - * Specification, * * If you just need to read a PNG file and don't want to read the documentation * skip to the end of this file and read the section entitled 'simplified API'. */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.5.12" +#define PNG_LIBPNG_VER_STRING "1.5.27" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.5.12 - July 11, 2012\n" + " libpng version 1.5.27 - May 26, 2016\n" #define PNG_LIBPNG_VER_SONUM 15 #define PNG_LIBPNG_VER_DLLNUM 15 @@ -396,7 +305,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 5 -#define PNG_LIBPNG_VER_RELEASE 12 +#define PNG_LIBPNG_VER_RELEASE 27 /* This should match the numeric part of the final component of * PNG_LIBPNG_VER_STRING, omitting any leading zero: @@ -427,7 +336,7 @@ * version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10512 /* 1.5.12 */ +#define PNG_LIBPNG_VER 10527 /* 1.5.27 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -460,7 +369,7 @@ /* Machine specific configuration. */ # include "pngconf.h" -#endif +#endif /* PNG_VERSION_INFO_ONLY */ /* * Added at libpng-1.2.8 @@ -549,7 +458,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_5_12; +typedef char* png_libpng_version_1_5_27; /* Three color definitions. The order of the red, green, and blue, (and the * exact size) is not important, although the size of the fields need to @@ -813,22 +722,22 @@ typedef png_info FAR * FAR * png_infopp; * data in the info_struct to be written into the output file. The values * of the PNG_INFO_ defines should NOT be changed. */ -#define PNG_INFO_gAMA 0x0001 -#define PNG_INFO_sBIT 0x0002 -#define PNG_INFO_cHRM 0x0004 -#define PNG_INFO_PLTE 0x0008 -#define PNG_INFO_tRNS 0x0010 -#define PNG_INFO_bKGD 0x0020 -#define PNG_INFO_hIST 0x0040 -#define PNG_INFO_pHYs 0x0080 -#define PNG_INFO_oFFs 0x0100 -#define PNG_INFO_tIME 0x0200 -#define PNG_INFO_pCAL 0x0400 -#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ -#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ -#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ -#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ -#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */ +#define PNG_INFO_gAMA 0x0001U +#define PNG_INFO_sBIT 0x0002U +#define PNG_INFO_cHRM 0x0004U +#define PNG_INFO_PLTE 0x0008U +#define PNG_INFO_tRNS 0x0010U +#define PNG_INFO_bKGD 0x0020U +#define PNG_INFO_hIST 0x0040U +#define PNG_INFO_pHYs 0x0080U +#define PNG_INFO_oFFs 0x0100U +#define PNG_INFO_tIME 0x0200U +#define PNG_INFO_pCAL 0x0400U +#define PNG_INFO_sRGB 0x0800U /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000U /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000U /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */ /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using @@ -1020,11 +929,13 @@ PNG_EXPORTA(5, png_structp, png_create_write_struct, png_error_ptr warn_fn), PNG_ALLOCATED); +#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, (png_const_structp png_ptr)); PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr, png_size_t size)); +#endif /* WRITE_CUSTOMIZE_COMPRESSION */ /* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp * match up. @@ -1158,9 +1069,9 @@ PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr)); #define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/ PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structp png_ptr, - int error_action, double red, double green)); + int error_action, double red, double green)) PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr, - int error_action, png_fixed_point red, png_fixed_point green)); + int error_action, png_fixed_point red, png_fixed_point green)) PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structp png_ptr)); @@ -1228,9 +1139,9 @@ PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, #define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */ PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structp png_ptr, int mode, - double output_gamma)); + double output_gamma)) PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr, - int mode, png_fixed_point output_gamma)); + int mode, png_fixed_point output_gamma)) #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED) @@ -1453,10 +1364,10 @@ PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr)); */ PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr, png_const_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma)); + int need_expand, double background_gamma)) PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr, png_const_color_16p background_color, int background_gamma_code, - int need_expand, png_fixed_point background_gamma)); + int need_expand, png_fixed_point background_gamma)) #endif #ifdef PNG_READ_BACKGROUND_SUPPORTED # define PNG_BACKGROUND_GAMMA_UNKNOWN 0 @@ -1471,7 +1382,7 @@ PNG_EXPORT(229, void, png_set_scale_16, (png_structp png_ptr)); #endif #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED -#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */ +#define PNG_READ_16_TO_8_SUPPORTED /* Name prior to 1.5.4 */ /* Strip the second byte of information from a 16-bit depth file. */ PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr)); #endif @@ -1505,9 +1416,9 @@ PNG_EXPORT(49, void, png_set_quantize, */ PNG_FP_EXPORT(50, void, png_set_gamma, (png_structp png_ptr, double screen_gamma, - double override_file_gamma)); + double override_file_gamma)) PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr, - png_fixed_point screen_gamma, png_fixed_point override_file_gamma)); + png_fixed_point screen_gamma, png_fixed_point override_file_gamma)) #endif #ifdef PNG_WRITE_FLUSH_SUPPORTED @@ -1623,8 +1534,8 @@ PNG_EXPORT(67, void, png_set_filter, #define PNG_FILTER_UP 0x20 #define PNG_FILTER_AVG 0x40 #define PNG_FILTER_PAETH 0x80 -#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ - PNG_FILTER_AVG | PNG_FILTER_PAETH) +#define PNG_FAST_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP) +#define PNG_ALL_FILTERS (PNG_FAST_FILTERS | PNG_FILTER_AVG | PNG_FILTER_PAETH) /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. * These defines should NOT be changed. @@ -1636,47 +1547,17 @@ PNG_EXPORT(67, void, png_set_filter, #define PNG_FILTER_VALUE_PAETH 4 #define PNG_FILTER_VALUE_LAST 5 -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */ -/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ - * defines, either the default (minimum-sum-of-absolute-differences), or - * the experimental method (weighted-minimum-sum-of-absolute-differences). - * - * Weights are factors >= 1.0, indicating how important it is to keep the - * filter type consistent between rows. Larger numbers mean the current - * filter is that many times as likely to be the same as the "num_weights" - * previous filters. This is cumulative for each previous row with a weight. - * There needs to be "num_weights" values in "filter_weights", or it can be - * NULL if the weights aren't being specified. Weights have no influence on - * the selection of the first row filter. Well chosen weights can (in theory) - * improve the compression for a given image. - * - * Costs are factors >= 1.0 indicating the relative decoding costs of a - * filter type. Higher costs indicate more decoding expense, and are - * therefore less likely to be selected over a filter with lower computational - * costs. There needs to be a value in "filter_costs" for each valid filter - * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't - * setting the costs. Costs try to improve the speed of decompression without - * unduly increasing the compressed image size. - * - * A negative weight or cost indicates the default value is to be used, and - * values in the range [0.0, 1.0) indicate the value is to remain unchanged. - * The default values for both weights and costs are currently 1.0, but may - * change if good general weighting/cost heuristics can be found. If both - * the weights and costs are set to 1.0, this degenerates the WEIGHTED method - * to the UNWEIGHTED method, but with added encoding time/computation. - */ +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */ PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr, int heuristic_method, int num_weights, png_const_doublep filter_weights, - png_const_doublep filter_costs)); + png_const_doublep filter_costs)) PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, (png_structp png_ptr, int heuristic_method, int num_weights, png_const_fixed_point_p - filter_weights, png_const_fixed_point_p filter_costs)); + filter_weights, png_const_fixed_point_p filter_costs)) #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ -/* Heuristic used for row filter selection. These defines should NOT be - * changed. - */ +/* The following are no longer used and will be removed from libpng-1.7: */ #define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ #define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ @@ -1690,6 +1571,7 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, * for PNG images, and do considerably fewer caclulations. In the future, * these values may not correspond directly to the zlib compression levels. */ +#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED PNG_EXPORT(69, void, png_set_compression_level, (png_structp png_ptr, int level)); @@ -1707,7 +1589,7 @@ PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr, PNG_EXPORT(73, void, png_set_compression_method, (png_structp png_ptr, int method)); -#endif +#endif /* WRITE_CUSTOMIZE_COMPRESSION */ #ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED /* Also set zlib parameters for compressing non-IDAT chunks */ @@ -1729,6 +1611,7 @@ PNG_EXPORT(225, void, png_set_text_compression_window_bits, (png_structp PNG_EXPORT(226, void, png_set_text_compression_method, (png_structp png_ptr, int method)); #endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ +#endif /* WRITE */ /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, @@ -1940,6 +1823,8 @@ PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr, #else /* Fatal error in PNG image of libpng - can't continue */ PNG_EXPORTA(104, void, png_err, (png_structp png_ptr), PNG_NORETURN); +# define png_error(s1,s2) png_err(s1) +# define png_chunk_error(s1,s2) png_err(s1) #endif #ifdef PNG_WARNINGS_SUPPORTED @@ -1950,6 +1835,9 @@ PNG_EXPORT(105, void, png_warning, (png_structp png_ptr, /* Non-fatal error in libpng, chunk name is prepended to message. */ PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr, png_const_charp warning_message)); +#else +# define png_warning(s1,s2) ((void)(s1)) +# define png_chunk_warning(s1,s2) ((void)(s1)) #endif #ifdef PNG_BENIGN_ERRORS_SUPPORTED @@ -2053,9 +1941,9 @@ PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, /* Returns pixel aspect ratio, computed from pHYs chunk data. */ PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, - (png_const_structp png_ptr, png_const_infop info_ptr)); + (png_const_structp png_ptr, png_const_infop info_ptr)) PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, - (png_const_structp png_ptr, png_const_infop info_ptr)); + (png_const_structp png_ptr, png_const_infop info_ptr)) /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, @@ -2088,11 +1976,11 @@ PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr, PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr, png_const_infop info_ptr, double *white_x, double *white_y, double *red_x, double *red_y, double *green_x, double *green_y, double *blue_x, - double *blue_y)); + double *blue_y)) PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_structp png_ptr, png_const_infop info_ptr, double *red_X, double *red_Y, double *red_Z, double *green_X, double *green_Y, double *green_Z, double *blue_X, - double *blue_Y, double *blue_Z)); + double *blue_Y, double *blue_Z)) #ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */ PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, (png_const_structp png_ptr, @@ -2100,7 +1988,7 @@ PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, png_fixed_point *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point *int_blue_x, - png_fixed_point *int_blue_y)); + png_fixed_point *int_blue_y)) #endif PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, (png_structp png_ptr, png_const_infop info_ptr, @@ -2108,46 +1996,46 @@ PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, png_fixed_point *int_red_Z, png_fixed_point *int_green_X, png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, - png_fixed_point *int_blue_Z)); + png_fixed_point *int_blue_Z)) #endif #ifdef PNG_cHRM_SUPPORTED PNG_FP_EXPORT(135, void, png_set_cHRM, (png_structp png_ptr, png_infop info_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, - double green_y, double blue_x, double blue_y)); + double green_y, double blue_x, double blue_y)) PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_structp png_ptr, png_infop info_ptr, double red_X, double red_Y, double red_Z, double green_X, double green_Y, double green_Z, double blue_X, - double blue_Y, double blue_Z)); + double blue_Y, double blue_Z)) PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr, png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)); + png_fixed_point int_blue_y)) PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_structp png_ptr, png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, png_fixed_point int_red_Z, png_fixed_point int_green_X, png_fixed_point int_green_Y, png_fixed_point int_green_Z, png_fixed_point int_blue_X, png_fixed_point int_blue_Y, - png_fixed_point int_blue_Z)); + png_fixed_point int_blue_Z)) #endif #ifdef PNG_gAMA_SUPPORTED PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structp png_ptr, png_const_infop info_ptr, - double *file_gamma)); + double *file_gamma)) PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, (png_const_structp png_ptr, png_const_infop info_ptr, - png_fixed_point *int_file_gamma)); + png_fixed_point *int_file_gamma)) #endif #ifdef PNG_gAMA_SUPPORTED PNG_FP_EXPORT(139, void, png_set_gAMA, (png_structp png_ptr, - png_infop info_ptr, double file_gamma)); + png_infop info_ptr, double file_gamma)) PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr, - png_infop info_ptr, png_fixed_point int_file_gamma)); + png_infop info_ptr, png_fixed_point int_file_gamma)) #endif #ifdef PNG_hIST_SUPPORTED @@ -2313,7 +2201,7 @@ PNG_EXPORT(167, void, png_set_tRNS, #ifdef PNG_sCAL_SUPPORTED PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structp png_ptr, png_const_infop info_ptr, - int *unit, double *width, double *height)); + int *unit, double *width, double *height)) #ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED /* NOTE: this API is currently implemented using floating point arithmetic, * consequently it can only be used on systems with floating point support. @@ -2323,7 +2211,7 @@ PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, (png_structp png_ptr, png_const_infop info_ptr, int *unit, png_fixed_point *width, - png_fixed_point *height)); + png_fixed_point *height)) #endif PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, (png_const_structp png_ptr, png_const_infop info_ptr, @@ -2331,10 +2219,10 @@ PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, PNG_FP_EXPORT(170, void, png_set_sCAL, (png_structp png_ptr, png_infop info_ptr, - int unit, double width, double height)); + int unit, double width, double height)) PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr, png_infop info_ptr, int unit, png_fixed_point width, - png_fixed_point height)); + png_fixed_point height)) PNG_EXPORT(171, void, png_set_sCAL_s, (png_structp png_ptr, png_infop info_ptr, int unit, png_const_charp swidth, png_const_charp sheight)); @@ -2447,17 +2335,17 @@ PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, (png_const_structp png_ptr, png_const_infop info_ptr)); PNG_FP_EXPORT(196, float, png_get_x_offset_inches, - (png_const_structp png_ptr, png_const_infop info_ptr)); + (png_const_structp png_ptr, png_const_infop info_ptr)) #ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, - (png_structp png_ptr, png_const_infop info_ptr)); + (png_structp png_ptr, png_const_infop info_ptr)) #endif PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr, - png_const_infop info_ptr)); + png_const_infop info_ptr)) #ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, - (png_structp png_ptr, png_const_infop info_ptr)); + (png_structp png_ptr, png_const_infop info_ptr)) #endif # ifdef PNG_pHYs_SUPPORTED @@ -2640,15 +2528,59 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); # define png_get_int_32(buf) \ ((png_int_32)((*(buf) & 0x80) \ - ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ + ? -((png_int_32)(((png_get_uint_32(buf)^0xffffffffU)+1U)&0x7fffffffU)) \ : (png_int_32)png_get_uint_32(buf))) #endif -#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ - defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr, int allowed)); +# ifdef PNG_GET_PALETTE_MAX_SUPPORTED +PNG_EXPORT(235, int, png_get_palette_max, (png_const_structp png_ptr, + png_const_infop info_ptr)); +# endif +#endif /* CHECK_FOR_INVALID_INDEX */ + +/******************************************************************************* + * IMPLEMENTATION OPTIONS + ******************************************************************************* + * + * Support for arbitrary implementation-specific optimizations. The API allows + * particular options to be turned on or off. 'Option' is the number of the + * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given + * by the PNG_OPTION_ defines below. + * + * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions, + * are detected at run time, however sometimes it may be impossible + * to do this in user mode, in which case it is necessary to discover + * the capabilities in an OS specific way. Such capabilities are + * listed here when libpng has support for them and must be turned + * ON by the application if present. + * + * SOFTWARE: sometimes software optimizations actually result in performance + * decrease on some architectures or systems, or with some sets of + * PNG images. 'Software' options allow such optimizations to be + * selected at run time. + */ +#ifdef PNG_SET_OPTION_SUPPORTED +#ifdef PNG_ARM_NEON_API_SUPPORTED +# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ #endif +#define PNG_OPTION_NEXT 2 /* Next option - numbers must be even */ + +/* Return values: NOTE: there are four values and 'off' is *not* zero */ +#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ +#define PNG_OPTION_INVALID 1 /* Option number out of range */ +#define PNG_OPTION_OFF 2 +#define PNG_OPTION_ON 3 + +PNG_EXPORT(236, int, png_set_option, (png_structp png_ptr, int option, + int onoff)); +#endif + +/******************************************************************************* + * END OF HARDWARE OPTIONS + ******************************************************************************/ /* Maintainer: Put new public prototypes here ^, in libpng.3, and project * defs @@ -2659,7 +2591,7 @@ PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr, * scripts/symbols.def as well. */ #ifdef PNG_EXPORT_LAST_ORDINAL - PNG_EXPORT_LAST_ORDINAL(234); + PNG_EXPORT_LAST_ORDINAL(236); #endif #ifdef __cplusplus diff --git a/3rdparty/libpng/pngconf.h b/3rdparty/libpng/pngconf.h index 5c3eb1454d..ce1ff5853f 100644 --- a/3rdparty/libpng/pngconf.h +++ b/3rdparty/libpng/pngconf.h @@ -1,9 +1,9 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.5.12 - July 11, 2012 + * libpng version 1.5.27, May 26, 2016 * - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -11,9 +11,7 @@ * For conditions of distribution and use, see the disclaimer * and license in png.h * - */ - -/* Any machine specific code is near the front of this file, so if you + * Any machine specific code is near the front of this file, so if you * are configuring libpng for a machine, you may want to read the section * starting here down to where it starts to typedef png_color, png_text, * and png_info. @@ -177,18 +175,16 @@ * ========================== * This code is used at build time to find PNG_IMPEXP, the API settings * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL - * import processing is possible. On Windows/x86 systems it also sets + * import processing is possible. On Windows systems it also sets * compiler-specific macros to the values required to change the calling * conventions of the various functions. */ -#if ( defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ - defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) ) &&\ - ( defined(_X86_) || defined(_X64_) || defined(_M_IX86) ||\ - defined(_M_X64) || defined(_M_IA64) ) - /* Windows system (DOS doesn't support DLLs) running on x86/x64. Includes - * builds under Cygwin or MinGW. Also includes Watcom builds but these need - * special treatment because they are not compatible with GCC or Visual C - * because of different calling conventions. +#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ + defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) + /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or + * MinGW on any architecture currently supported by Windows. Also includes + * Watcom builds but these need special treatment because they are not + * compatible with GCC or Visual C because of different calling conventions. */ # if PNG_API_RULE == 2 /* If this line results in an error, either because __watcall is not @@ -199,9 +195,12 @@ # define PNGCAPI __watcall # endif -# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) +# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) # define PNGCAPI __cdecl # if PNG_API_RULE == 1 + /* If this line results in an error __stdcall is not understood and + * PNG_API_RULE should not have been set to '1'. + */ # define PNGAPI __stdcall # endif # else @@ -239,7 +238,7 @@ # endif # endif /* compiler */ -#else /* !Windows/x86 */ +#else /* !Windows */ # if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) # define PNGAPI _System # else /* !Windows/x86 && !OS/2 */ @@ -337,6 +336,7 @@ * functions in png.h will generate compiler warnings. Added at libpng * version 1.2.41. */ + # if defined(__GNUC__) # ifndef PNG_USE_RESULT # define PNG_USE_RESULT __attribute__((__warn_unused_result__)) @@ -344,21 +344,23 @@ # ifndef PNG_NORETURN # define PNG_NORETURN __attribute__((__noreturn__)) # endif -# ifndef PNG_ALLOCATED -# define PNG_ALLOCATED __attribute__((__malloc__)) -# endif -# ifndef PNG_DEPRECATED -# define PNG_DEPRECATED __attribute__((__deprecated__)) -# endif -# ifndef PNG_PRIVATE -# if 0 /* Doesn't work so we use deprecated instead*/ -# define PNG_PRIVATE \ - __attribute__((warning("This function is not exported by libpng."))) -# else -# define PNG_PRIVATE \ - __attribute__((__deprecated__)) +# if __GNUC__ >= 3 +# ifndef PNG_ALLOCATED +# define PNG_ALLOCATED __attribute__((__malloc__)) # endif -# endif +# ifndef PNG_DEPRECATED +# define PNG_DEPRECATED __attribute__((__deprecated__)) +# endif +# ifndef PNG_PRIVATE +# if 0 /* Doesn't work so we use deprecated instead*/ +# define PNG_PRIVATE \ + __attribute__((warning("This function is not exported by libpng."))) +# else +# define PNG_PRIVATE \ + __attribute__((__deprecated__)) +# endif +# endif +# endif /* __GNUC__ >= 3 */ # endif /* __GNUC__ */ # if defined(_MSC_VER) && (_MSC_VER >= 1300) @@ -400,7 +402,7 @@ #ifndef PNG_FP_EXPORT /* A floating point API. */ # ifdef PNG_FLOATING_POINT_SUPPORTED # define PNG_FP_EXPORT(ordinal, type, name, args)\ - PNG_EXPORT(ordinal, type, name, args) + PNG_EXPORT(ordinal, type, name, args); # else /* No floating point APIs */ # define PNG_FP_EXPORT(ordinal, type, name, args) # endif @@ -408,7 +410,7 @@ #ifndef PNG_FIXED_EXPORT /* A fixed point API. */ # ifdef PNG_FIXED_POINT_SUPPORTED # define PNG_FIXED_EXPORT(ordinal, type, name, args)\ - PNG_EXPORT(ordinal, type, name, args) + PNG_EXPORT(ordinal, type, name, args); # else /* No fixed point APIs */ # define PNG_FIXED_EXPORT(ordinal, type, name, args) # endif diff --git a/3rdparty/libpng/pngdebug.h b/3rdparty/libpng/pngdebug.h index 16f81fdd14..020369f061 100644 --- a/3rdparty/libpng/pngdebug.h +++ b/3rdparty/libpng/pngdebug.h @@ -1,12 +1,11 @@ /* pngdebug.h - Debugging macros for libpng, also used in pngtest.c * - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.18 [February 6, 2014] + * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.0 [January 6, 2011] - * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer * and license in png.h @@ -25,7 +24,7 @@ * (actually ((void)0)). * * level: level of detail of message, starting at 0. A level 'n' - * message is preceded by 'n' tab characters (not implemented + * message is preceded by 'n' 3-space indentations (not implemented * on Microsoft compilers unless PNG_DEBUG_FILE is also * defined, to allow debug DLL compilation with no standard IO). * message: a printf(3) style text string. A trailing '\n' is added @@ -77,32 +76,29 @@ # endif /* PNG_DEBUG_FILE */ # if (PNG_DEBUG > 1) -/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on - * non-ISO compilers - */ # ifdef __STDC__ # ifndef png_debug # define png_debug(l,m) \ do { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \ + (num_tabs==2 ? " " : (num_tabs>2 ? " " : "")))); \ } while (0) # endif # ifndef png_debug1 # define png_debug1(l,m,p1) \ do { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \ + (num_tabs==2 ? " " : (num_tabs>2 ? " " : ""))),p1); \ } while (0) # endif # ifndef png_debug2 # define png_debug2(l,m,p1,p2) \ do { \ int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \ + (num_tabs==2 ? " " : (num_tabs>2 ? " " : ""))),p1,p2);\ } while (0) # endif # else /* __STDC __ */ diff --git a/3rdparty/libpng/pngerror.c b/3rdparty/libpng/pngerror.c index e0585a856e..372d1b6fbd 100644 --- a/3rdparty/libpng/pngerror.c +++ b/3rdparty/libpng/pngerror.c @@ -1,8 +1,8 @@ /* pngerror.c - stub functions for i/o and memory allocation * - * Last changed in libpng 1.5.8 [February 1, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.19 [August 21, 2014] + * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -161,7 +161,7 @@ png_format_number(png_const_charp start, png_charp end, int format, case PNG_NUMBER_FORMAT_02u: /* Expects at least 2 digits. */ mincount = 2; - /* fall through */ + /* FALL THROUGH */ case PNG_NUMBER_FORMAT_u: *--end = digits[number % 10]; @@ -171,7 +171,7 @@ png_format_number(png_const_charp start, png_charp end, int format, case PNG_NUMBER_FORMAT_02x: /* This format expects at least two digits */ mincount = 2; - /* fall through */ + /* FALL THROUGH */ case PNG_NUMBER_FORMAT_x: *--end = digits[number & 0xf]; @@ -193,7 +193,7 @@ png_format_number(png_const_charp start, png_charp end, int format, * drop the decimal point. If the number is a true zero handle that * here. */ - if (output) + if (output != 0) *--end = '.'; else if (number == 0) /* and !output */ *--end = '0'; @@ -578,6 +578,9 @@ png_longjmp,(png_structp png_ptr, int val),PNG_NORETURN) png_ptr->longjmp_fn(png_ptr->longjmp_buffer, val); # endif } +#else + PNG_UNUSED(png_ptr); + PNG_UNUSED(val); #endif /* Here if not setjmp support or if png_ptr is null. */ PNG_ABORT(); diff --git a/3rdparty/libpng/pngget.c b/3rdparty/libpng/pngget.c index 0e56124bae..5b1d757c66 100644 --- a/3rdparty/libpng/pngget.c +++ b/3rdparty/libpng/pngget.c @@ -1,8 +1,8 @@ /* pngget.c - retrieval of values from info struct * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.19 [August 21, 2014] + * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -123,6 +123,9 @@ png_get_x_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) return (info_ptr->x_pixels_per_unit); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -140,6 +143,9 @@ png_get_y_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) return (info_ptr->y_pixels_per_unit); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -157,6 +163,9 @@ png_get_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr) info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit) return (info_ptr->x_pixels_per_unit); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -175,6 +184,9 @@ png_get_pixel_aspect_ratio(png_const_structp png_ptr, png_const_infop info_ptr) return ((float)((float)info_ptr->y_pixels_per_unit /(float)info_ptr->x_pixels_per_unit)); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return ((float)0.0); @@ -203,6 +215,9 @@ png_get_pixel_aspect_ratio_fixed(png_const_structp png_ptr, (png_int_32)info_ptr->x_pixels_per_unit)) return res; } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return 0; @@ -220,6 +235,9 @@ png_get_x_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr) if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) return (info_ptr->x_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -236,6 +254,9 @@ png_get_y_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr) if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) return (info_ptr->y_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -252,6 +273,9 @@ png_get_x_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr) if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) return (info_ptr->x_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -268,6 +292,9 @@ png_get_y_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr) if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) return (info_ptr->y_offset); } +#else + PNG_UNUSED(png_ptr) + PNG_UNUSED(info_ptr) #endif return (0); @@ -646,7 +673,7 @@ png_get_gAMA(png_const_structp png_ptr, png_const_infop info_ptr, png_fixed_point igamma; png_uint_32 ok = png_get_gAMA_fixed(png_ptr, info_ptr, &igamma); - if (ok) + if (ok != 0) *file_gamma = png_float(png_ptr, igamma, "png_get_gAMA"); return ok; @@ -683,7 +710,7 @@ png_get_iCCP(png_const_structp png_ptr, png_const_infop info_ptr, if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) && name != NULL && compression_type != NULL && profile != NULL && - proflen != NULL) + proflen != NULL) { *name = info_ptr->iccp_name; *profile = info_ptr->iccp_profile; @@ -741,14 +768,20 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr, { png_debug1(1, "in %s retrieval function", "IHDR"); - if (png_ptr == NULL || info_ptr == NULL || width == NULL || - height == NULL || bit_depth == NULL || color_type == NULL) + if (png_ptr == NULL || info_ptr == NULL) return (0); - *width = info_ptr->width; - *height = info_ptr->height; - *bit_depth = info_ptr->bit_depth; - *color_type = info_ptr->color_type; + if (width != NULL) + *width = info_ptr->width; + + if (height != NULL) + *height = info_ptr->height; + + if (bit_depth != NULL) + *bit_depth = info_ptr->bit_depth; + + if (color_type != NULL) + *color_type = info_ptr->color_type; if (compression_type != NULL) *compression_type = info_ptr->compression_type; @@ -1121,4 +1154,17 @@ png_get_io_chunk_name (png_structp png_ptr) } #endif /* ?PNG_IO_STATE_SUPPORTED */ +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +# ifdef PNG_GET_PALETTE_MAX_SUPPORTED +int PNGAPI +png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return png_ptr->num_palette_max; + + return (-1); +} +# endif +#endif + #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/3rdparty/libpng/pnginfo.h b/3rdparty/libpng/pnginfo.h index a33bfab06d..c5b68c1e84 100644 --- a/3rdparty/libpng/pnginfo.h +++ b/3rdparty/libpng/pnginfo.h @@ -1,12 +1,11 @@ /* pnginfo.h - header file for PNG reference library * - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.0 [January 6, 2011] + * Copyright (c) 1998-2002,2004,2006-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.0 [January 6, 2011] - * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer * and license in png.h @@ -242,7 +241,7 @@ defined(PNG_READ_BACKGROUND_SUPPORTED) #ifdef PNG_sPLT_SUPPORTED /* Data on sPLT chunks (there may be more than one). */ png_sPLT_tp splt_palettes; - png_uint_32 splt_palettes_num; + int splt_palettes_num; #endif #ifdef PNG_sCAL_SUPPORTED diff --git a/3rdparty/libpng/pnglibconf.h b/3rdparty/libpng/pnglibconf.h index d93adabaa6..1df6146f29 100644 --- a/3rdparty/libpng/pnglibconf.h +++ b/3rdparty/libpng/pnglibconf.h @@ -1,48 +1,28 @@ - -/* libpng STANDARD API DEFINITION */ - +/* 1.5.27 STANDARD API DEFINITION */ /* pnglibconf.h - library build configuration */ -/* Libpng 1.5.12 - July 11, 2012 */ +/* libpng version 1.5.27 - May 26, 2016 */ -/* Copyright (c) 1998-2012 Glenn Randers-Pehrson */ +/* Copyright (c) 2011-2015 Glenn Randers-Pehrson */ /* This code is released under the libpng license. */ /* For conditions of distribution and use, see the disclaimer */ /* and license in png.h */ /* pnglibconf.h */ +/* Machine generated file: DO NOT EDIT */ /* Derived from: scripts/pnglibconf.dfa */ -/* If you edit this file by hand you must obey the rules expressed in */ -/* pnglibconf.dfa with respect to the dependencies between the following */ -/* symbols. It is much better to generate a new file using */ -/* scripts/libpngconf.mak */ - #ifndef PNGLCONF_H #define PNGLCONF_H -/* settings */ -#define PNG_API_RULE 0 -#define PNG_CALLOC_SUPPORTED -#define PNG_COST_SHIFT 3 -#define PNG_DEFAULT_READ_MACROS 1 -#define PNG_GAMMA_THRESHOLD_FIXED 5000 -#define PNG_MAX_GAMMA_8 11 -#define PNG_QUANTIZE_BLUE_BITS 5 -#define PNG_QUANTIZE_GREEN_BITS 5 -#define PNG_QUANTIZE_RED_BITS 5 -#define PNG_sCAL_PRECISION 5 -#define PNG_WEIGHT_SHIFT 8 -#define PNG_ZBUF_SIZE 8192 -/* end of settings */ /* options */ #define PNG_16BIT_SUPPORTED -#define PNG_ALIGN_MEMORY_SUPPORTED +#define PNG_ALIGNED_MEMORY_SUPPORTED +/*#undef PNG_ARM_NEON_API_SUPPORTED*/ +/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/ #define PNG_BENIGN_ERRORS_SUPPORTED -#define PNG_bKGD_SUPPORTED #define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED -#define PNG_CHECK_cHRM_SUPPORTED #define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED -#define PNG_cHRM_SUPPORTED +#define PNG_CHECK_cHRM_SUPPORTED #define PNG_CONSOLE_IO_SUPPORTED #define PNG_CONVERT_tIME_SUPPORTED #define PNG_EASY_ACCESS_SUPPORTED @@ -51,18 +31,12 @@ #define PNG_FIXED_POINT_SUPPORTED #define PNG_FLOATING_ARITHMETIC_SUPPORTED #define PNG_FLOATING_POINT_SUPPORTED -#define PNG_gAMA_SUPPORTED +#define PNG_GET_PALETTE_MAX_SUPPORTED #define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -#define PNG_hIST_SUPPORTED -#define PNG_iCCP_SUPPORTED #define PNG_INCH_CONVERSIONS_SUPPORTED #define PNG_INFO_IMAGE_SUPPORTED #define PNG_IO_STATE_SUPPORTED -#define PNG_iTXt_SUPPORTED #define PNG_MNG_FEATURES_SUPPORTED -#define PNG_oFFs_SUPPORTED -#define PNG_pCAL_SUPPORTED -#define PNG_pHYs_SUPPORTED #define PNG_POINTER_INDEXING_SUPPORTED #define PNG_PROGRESSIVE_READ_SUPPORTED #define PNG_READ_16BIT_SUPPORTED @@ -70,68 +44,62 @@ #define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #define PNG_READ_BACKGROUND_SUPPORTED #define PNG_READ_BGR_SUPPORTED -#define PNG_READ_bKGD_SUPPORTED #define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED -#define PNG_READ_cHRM_SUPPORTED #define PNG_READ_COMPOSITE_NODIV_SUPPORTED #define PNG_READ_COMPRESSED_TEXT_SUPPORTED #define PNG_READ_EXPAND_16_SUPPORTED #define PNG_READ_EXPAND_SUPPORTED #define PNG_READ_FILLER_SUPPORTED -#define PNG_READ_gAMA_SUPPORTED #define PNG_READ_GAMMA_SUPPORTED +#define PNG_READ_GET_PALETTE_MAX_SUPPORTED #define PNG_READ_GRAY_TO_RGB_SUPPORTED -#define PNG_READ_hIST_SUPPORTED -#define PNG_READ_iCCP_SUPPORTED #define PNG_READ_INTERLACING_SUPPORTED #define PNG_READ_INT_FUNCTIONS_SUPPORTED #define PNG_READ_INVERT_ALPHA_SUPPORTED #define PNG_READ_INVERT_SUPPORTED -#define PNG_READ_iTXt_SUPPORTED -#define PNG_READ_oFFs_SUPPORTED #define PNG_READ_OPT_PLTE_SUPPORTED -#define PNG_READ_PACK_SUPPORTED #define PNG_READ_PACKSWAP_SUPPORTED -#define PNG_READ_pCAL_SUPPORTED -#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_PACK_SUPPORTED #define PNG_READ_QUANTIZE_SUPPORTED #define PNG_READ_RGB_TO_GRAY_SUPPORTED -#define PNG_READ_sBIT_SUPPORTED #define PNG_READ_SCALE_16_TO_8_SUPPORTED -#define PNG_READ_sCAL_SUPPORTED #define PNG_READ_SHIFT_SUPPORTED -#define PNG_READ_sPLT_SUPPORTED -#define PNG_READ_sRGB_SUPPORTED #define PNG_READ_STRIP_16_TO_8_SUPPORTED #define PNG_READ_STRIP_ALPHA_SUPPORTED #define PNG_READ_SUPPORTED #define PNG_READ_SWAP_ALPHA_SUPPORTED #define PNG_READ_SWAP_SUPPORTED -#define PNG_READ_tEXt_SUPPORTED #define PNG_READ_TEXT_SUPPORTED -#define PNG_READ_tIME_SUPPORTED #define PNG_READ_TRANSFORMS_SUPPORTED -#define PNG_READ_tRNS_SUPPORTED #define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED #define PNG_READ_USER_CHUNKS_SUPPORTED #define PNG_READ_USER_TRANSFORM_SUPPORTED +#define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_cHRM_SUPPORTED +#define PNG_READ_gAMA_SUPPORTED +#define PNG_READ_hIST_SUPPORTED +#define PNG_READ_iCCP_SUPPORTED +#define PNG_READ_iTXt_SUPPORTED +#define PNG_READ_oFFs_SUPPORTED +#define PNG_READ_pCAL_SUPPORTED +#define PNG_READ_pHYs_SUPPORTED +#define PNG_READ_sBIT_SUPPORTED +#define PNG_READ_sCAL_SUPPORTED +#define PNG_READ_sPLT_SUPPORTED +#define PNG_READ_sRGB_SUPPORTED +#define PNG_READ_tEXt_SUPPORTED +#define PNG_READ_tIME_SUPPORTED +#define PNG_READ_tRNS_SUPPORTED #define PNG_READ_zTXt_SUPPORTED +/*#undef PNG_SAFE_LIMITS_SUPPORTED*/ #define PNG_SAVE_INT_32_SUPPORTED -#define PNG_sBIT_SUPPORTED -#define PNG_sCAL_SUPPORTED #define PNG_SEQUENTIAL_READ_SUPPORTED -#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED -#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED #define PNG_SETJMP_SUPPORTED +/*#undef PNG_SET_OPTION_SUPPORTED*/ #define PNG_SET_USER_LIMITS_SUPPORTED -#define PNG_sPLT_SUPPORTED -#define PNG_sRGB_SUPPORTED #define PNG_STDIO_SUPPORTED -#define PNG_tEXt_SUPPORTED #define PNG_TEXT_SUPPORTED #define PNG_TIME_RFC1123_SUPPORTED -#define PNG_tIME_SUPPORTED -#define PNG_tRNS_SUPPORTED #define PNG_UNKNOWN_CHUNKS_SUPPORTED #define PNG_USER_CHUNKS_SUPPORTED #define PNG_USER_LIMITS_SUPPORTED @@ -142,45 +110,78 @@ #define PNG_WRITE_16BIT_SUPPORTED #define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #define PNG_WRITE_BGR_SUPPORTED -#define PNG_WRITE_bKGD_SUPPORTED #define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED -#define PNG_WRITE_cHRM_SUPPORTED #define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED +#define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED #define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED #define PNG_WRITE_FILLER_SUPPORTED #define PNG_WRITE_FILTER_SUPPORTED #define PNG_WRITE_FLUSH_SUPPORTED -#define PNG_WRITE_gAMA_SUPPORTED -#define PNG_WRITE_hIST_SUPPORTED -#define PNG_WRITE_iCCP_SUPPORTED +#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED #define PNG_WRITE_INTERLACING_SUPPORTED #define PNG_WRITE_INT_FUNCTIONS_SUPPORTED #define PNG_WRITE_INVERT_ALPHA_SUPPORTED #define PNG_WRITE_INVERT_SUPPORTED +#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED +#define PNG_WRITE_PACKSWAP_SUPPORTED +#define PNG_WRITE_PACK_SUPPORTED +#define PNG_WRITE_SHIFT_SUPPORTED +#define PNG_WRITE_SUPPORTED +#define PNG_WRITE_SWAP_ALPHA_SUPPORTED +#define PNG_WRITE_SWAP_SUPPORTED +#define PNG_WRITE_TEXT_SUPPORTED +#define PNG_WRITE_TRANSFORMS_SUPPORTED +#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +#define PNG_WRITE_USER_TRANSFORM_SUPPORTED +#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_cHRM_SUPPORTED +#define PNG_WRITE_gAMA_SUPPORTED +#define PNG_WRITE_hIST_SUPPORTED +#define PNG_WRITE_iCCP_SUPPORTED #define PNG_WRITE_iTXt_SUPPORTED #define PNG_WRITE_oFFs_SUPPORTED -#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED -#define PNG_WRITE_PACK_SUPPORTED -#define PNG_WRITE_PACKSWAP_SUPPORTED #define PNG_WRITE_pCAL_SUPPORTED #define PNG_WRITE_pHYs_SUPPORTED #define PNG_WRITE_sBIT_SUPPORTED #define PNG_WRITE_sCAL_SUPPORTED -#define PNG_WRITE_SHIFT_SUPPORTED #define PNG_WRITE_sPLT_SUPPORTED #define PNG_WRITE_sRGB_SUPPORTED -#define PNG_WRITE_SUPPORTED -#define PNG_WRITE_SWAP_ALPHA_SUPPORTED -#define PNG_WRITE_SWAP_SUPPORTED #define PNG_WRITE_tEXt_SUPPORTED -#define PNG_WRITE_TEXT_SUPPORTED #define PNG_WRITE_tIME_SUPPORTED -#define PNG_WRITE_TRANSFORMS_SUPPORTED #define PNG_WRITE_tRNS_SUPPORTED -#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_WRITE_USER_TRANSFORM_SUPPORTED -#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED #define PNG_WRITE_zTXt_SUPPORTED +#define PNG_bKGD_SUPPORTED +#define PNG_cHRM_SUPPORTED +#define PNG_gAMA_SUPPORTED +#define PNG_hIST_SUPPORTED +#define PNG_iCCP_SUPPORTED +#define PNG_iTXt_SUPPORTED +#define PNG_oFFs_SUPPORTED +#define PNG_pCAL_SUPPORTED +#define PNG_pHYs_SUPPORTED +#define PNG_sBIT_SUPPORTED +#define PNG_sCAL_SUPPORTED +#define PNG_sPLT_SUPPORTED +#define PNG_sRGB_SUPPORTED +#define PNG_tEXt_SUPPORTED +#define PNG_tIME_SUPPORTED +#define PNG_tRNS_SUPPORTED #define PNG_zTXt_SUPPORTED /* end of options */ +/* settings */ +#define PNG_API_RULE 0 +#define PNG_DEFAULT_READ_MACROS 1 +#define PNG_GAMMA_THRESHOLD_FIXED 5000 +#define PNG_MAX_GAMMA_8 11 +#define PNG_QUANTIZE_BLUE_BITS 5 +#define PNG_QUANTIZE_GREEN_BITS 5 +#define PNG_QUANTIZE_RED_BITS 5 +#define PNG_USER_CHUNK_CACHE_MAX 1000 +#define PNG_USER_CHUNK_MALLOC_MAX 8000000 +#define PNG_USER_HEIGHT_MAX 1000000 +#define PNG_USER_WIDTH_MAX 1000000 +#define PNG_ZBUF_SIZE 8192 +#define PNG_sCAL_PRECISION 5 +/* end of settings */ #endif /* PNGLCONF_H */ diff --git a/3rdparty/libpng/pngmem.c b/3rdparty/libpng/pngmem.c index bf5ff037da..ae74dcace0 100644 --- a/3rdparty/libpng/pngmem.c +++ b/3rdparty/libpng/pngmem.c @@ -1,8 +1,8 @@ /* pngmem.c - stub functions for memory allocation * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.13 [September 27, 2012] + * Copyright (c) 1998-2002,2004,2006-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -56,7 +56,7 @@ png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr), if (malloc_fn != NULL) { png_struct dummy_struct; - memset(&dummy_struct, 0, sizeof dummy_struct); + png_memset(&dummy_struct, 0, sizeof dummy_struct); dummy_struct.mem_ptr=mem_ptr; struct_ptr = (*(malloc_fn))(&dummy_struct, (png_alloc_size_t)size); } @@ -90,7 +90,7 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, if (free_fn != NULL) { png_struct dummy_struct; - memset(&dummy_struct, 0, sizeof dummy_struct); + png_memset(&dummy_struct, 0, sizeof dummy_struct); dummy_struct.mem_ptr=mem_ptr; (*(free_fn))(&dummy_struct, struct_ptr); return; @@ -102,7 +102,7 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, } /* Allocate memory. For reasonable files, size should never exceed - * 64K. However, zlib may allocate more then 64K if you don't tell + * 64K. However, zlib may allocate more than 64K if you don't tell * it not to. See zconf.h and png.h for more information. zlib does * need to allocate exactly 64K, so whatever you call here must * have the ability to do that. @@ -475,7 +475,7 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, } /* Allocate memory. For reasonable files, size should never exceed - * 64K. However, zlib may allocate more then 64K if you don't tell + * 64K. However, zlib may allocate more than 64K if you don't tell * it not to. See zconf.h and png.h for more information. zlib does * need to allocate exactly 64K, so whatever you call here must * have the ability to do that. diff --git a/3rdparty/libpng/pngpread.c b/3rdparty/libpng/pngpread.c index 6b65ba8f4e..9cf987d7e3 100644 --- a/3rdparty/libpng/pngpread.c +++ b/3rdparty/libpng/pngpread.c @@ -1,8 +1,8 @@ /* pngpread.c - read a png file in push mode * - * Last changed in libpng 1.5.11 [June 14, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.23 [July 23, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -19,7 +19,6 @@ #define PNG_READ_SIG_MODE 0 #define PNG_READ_CHUNK_MODE 1 #define PNG_READ_IDAT_MODE 2 -#define PNG_SKIP_MODE 3 #define PNG_READ_tEXt_MODE 4 #define PNG_READ_zTXt_MODE 5 #define PNG_READ_DONE_MODE 6 @@ -49,7 +48,7 @@ png_process_data_pause(png_structp png_ptr, int save) /* It's easiest for the caller if we do the save, then the caller doesn't * have to supply the same data again: */ - if (save) + if (save != 0) png_push_save_buffer(png_ptr); else { @@ -71,32 +70,15 @@ png_process_data_pause(png_structp png_ptr, int save) png_uint_32 PNGAPI png_process_data_skip(png_structp png_ptr) { - png_uint_32 remaining = 0; - - if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE && - png_ptr->skip_length > 0) - { - /* At the end of png_process_data the buffer size must be 0 (see the loop - * above) so we can detect a broken call here: - */ - if (png_ptr->buffer_size != 0) - png_error(png_ptr, - "png_process_data_skip called inside png_process_data"); - - /* If is impossible for there to be a saved buffer at this point - - * otherwise we could not be in SKIP mode. This will also happen if - * png_process_skip is called inside png_process_data (but only very - * rarely.) - */ - if (png_ptr->save_buffer_size != 0) - png_error(png_ptr, "png_process_data_skip called with saved data"); - - remaining = png_ptr->skip_length; - png_ptr->skip_length = 0; - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - } - - return remaining; + /* TODO: Deprecate and remove this API. + * Somewhere the implementation of this seems to have been lost, + * or abandoned. It was only to support some internal back-door access + * to png_struct) in libpng-1.4.x. + */ + png_warning(png_ptr, + "png_process_data_skip is not implemented in any current version" + " of libpng"); + return 0; } /* What we do with the incoming data depends on what we were previously @@ -128,12 +110,6 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr) break; } - case PNG_SKIP_MODE: - { - png_push_crc_finish(png_ptr); - break; - } - default: { png_ptr->buffer_size = 0; @@ -151,7 +127,7 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr) void /* PRIVATE */ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) { - png_size_t num_checked = png_ptr->sig_bytes, + png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */ num_to_check = 8 - num_checked; if (png_ptr->buffer_size < num_to_check) @@ -564,76 +540,6 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; } -void /* PRIVATE */ -png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) -{ - png_ptr->process_mode = PNG_SKIP_MODE; - png_ptr->skip_length = skip; -} - -void /* PRIVATE */ -png_push_crc_finish(png_structp png_ptr) -{ - if (png_ptr->skip_length && png_ptr->save_buffer_size) - { - png_size_t save_size = png_ptr->save_buffer_size; - png_uint_32 skip_length = png_ptr->skip_length; - - /* We want the smaller of 'skip_length' and 'save_buffer_size', but - * they are of different types and we don't know which variable has the - * fewest bits. Carefully select the smaller and cast it to the type of - * the larger - this cannot overflow. Do not cast in the following test - * - it will break on either 16 or 64 bit platforms. - */ - if (skip_length < save_size) - save_size = (png_size_t)skip_length; - - else - skip_length = (png_uint_32)save_size; - - png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - - png_ptr->skip_length -= skip_length; - png_ptr->buffer_size -= save_size; - png_ptr->save_buffer_size -= save_size; - png_ptr->save_buffer_ptr += save_size; - } - - if (png_ptr->skip_length && png_ptr->current_buffer_size) - { - png_size_t save_size = png_ptr->current_buffer_size; - png_uint_32 skip_length = png_ptr->skip_length; - - /* We want the smaller of 'skip_length' and 'current_buffer_size', here, - * the same problem exists as above and the same solution. - */ - if (skip_length < save_size) - save_size = (png_size_t)skip_length; - - else - skip_length = (png_uint_32)save_size; - - png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_ptr->skip_length -= skip_length; - png_ptr->buffer_size -= save_size; - png_ptr->current_buffer_size -= save_size; - png_ptr->current_buffer_ptr += save_size; - } - - if (!png_ptr->skip_length) - { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_crc_finish(png_ptr, 0); - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - } -} - void PNGCBAPI png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) { @@ -897,6 +803,12 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, */ ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); + /* Hack, added in 1.5.18: the progressive reader does not reset + * png_ptr->zstream, so any attempt to use it after the last IDAT fails + * (silently). This allows the read code to do the reset when required. + */ + png_ptr->flags |= PNG_FLAG_ZSTREAM_PROGRESSIVE; + /* Check for any failure before proceeding. */ if (ret != Z_OK && ret != Z_STREAM_END) { @@ -1285,7 +1197,7 @@ png_progressive_combine_row (png_structp png_ptr, png_bytep old_row, * it must be png_ptr->row_buf+1 */ if (new_row != NULL) - png_combine_row(png_ptr, old_row, 1/*display*/); + png_combine_row(png_ptr, old_row, 1/*blocky display*/); } #endif /* PNG_READ_INTERLACING_SUPPORTED */ diff --git a/3rdparty/libpng/pngpriv.h b/3rdparty/libpng/pngpriv.h index e7824b839e..8bdccccafb 100644 --- a/3rdparty/libpng/pngpriv.h +++ b/3rdparty/libpng/pngpriv.h @@ -1,13 +1,11 @@ /* pngpriv.h - private declarations for use inside libpng * - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.26 [December 17, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.10 [March 29, 2012] - * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer * and license in png.h @@ -39,6 +37,7 @@ */ #define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */ +#ifndef PNG_VERSION_INFO_ONLY /* This is required for the definition of abort(), used as a last ditch * error handler when all else fails. */ @@ -46,6 +45,7 @@ /* This is used to find 'offsetof', used below for alignment tests. */ #include +#endif /* !PNG_VERSION_INFO_ONLY */ #define PNGLIB_BUILD /*libpng is being built, not used*/ @@ -125,14 +125,59 @@ #endif #include "png.h" -#include "pnginfo.h" -#include "pngstruct.h" /* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */ #ifndef PNG_DLL_EXPORT # define PNG_DLL_EXPORT #endif +/* Compile time options. + * ===================== + * In a multi-arch build the compiler may compile the code several times for the + * same object module, producing different binaries for different architectures. + * When this happens configure-time setting of the target host options cannot be + * done and this interferes with the handling of the ARM NEON optimizations, and + * possibly other similar optimizations. Put additional tests here; in general + * this is needed when the same option can be changed at both compile time and + * run time depending on the target OS (i.e. iOS vs Android.) + * + * NOTE: symbol prefixing does not pass $(CFLAGS) to the preprocessor, because + * this is not possible with certain compilers (Oracle SUN OS CC), as a result + * it is necessary to ensure that all extern functions that *might* be used + * regardless of $(CFLAGS) get declared in this file. The test on __ARM_NEON__ + * below is one example of this behavior because it is controlled by the + * presence or not of -mfpu=neon on the GCC command line, it is possible to do + * this in $(CC), e.g. "CC=gcc -mfpu=neon", but people who build libpng rarely + * do this. + */ +#ifndef PNG_ARM_NEON_OPT + /* ARM NEON optimizations are being controlled by the compiler settings, + * typically the target FPU. If the FPU has been set to NEON (-mfpu=neon + * with GCC) then the compiler will define __ARM_NEON__ and we can rely + * unconditionally on NEON instructions not crashing, otherwise we must + * disable use of NEON instructions. + * + * NOTE: at present these optimizations depend on 'ALIGNED_MEMORY', so they + * can only be turned on automatically if that is supported too. If + * PNG_ARM_NEON_OPT is set in CPPFLAGS (to >0) then arm/arm_init.c will fail + * to compile with an appropriate #error if ALIGNED_MEMORY has been turned + * off. + */ +# if defined(__ARM_NEON__) && defined(PNG_ALIGNED_MEMORY_SUPPORTED) +# define PNG_ARM_NEON_OPT 2 +# else +# define PNG_ARM_NEON_OPT 0 +# endif +#endif + + +#if PNG_ARM_NEON_OPT > 0 + /* NEON optimizations are to be at least considered by libpng, so enable the + * callbacks to do this. + */ +# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon +#endif + /* SECURITY and SAFETY: * * By default libpng is built without any internal limits on image size, @@ -143,44 +188,6 @@ * real system capabilities. */ -#ifdef PNG_SAFE_LIMITS_SUPPORTED - /* 'safe' limits */ -# ifndef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 1000000 -# endif -# ifndef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 1000000 -# endif -# ifndef PNG_USER_CHUNK_CACHE_MAX -# define PNG_USER_CHUNK_CACHE_MAX 128 -# endif -# ifndef PNG_USER_CHUNK_MALLOC_MAX -# define PNG_USER_CHUNK_MALLOC_MAX 8000000 -# endif -#else - /* values for no limits */ -# ifndef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 0x7fffffff -# endif -# ifndef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 0x7fffffff -# endif -# ifndef PNG_USER_CHUNK_CACHE_MAX -# define PNG_USER_CHUNK_CACHE_MAX 0 -# endif -# ifndef PNG_USER_CHUNK_MALLOC_MAX -# define PNG_USER_CHUNK_MALLOC_MAX 0 -# endif -#endif - -/* This is used for 16 bit gamma tables - only the top level pointers are const, - * this could be changed: - */ -typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; - -/* Added at libpng-1.2.9 */ -/* Moved to pngpriv.h at libpng-1.5.0 */ - /* config.h is created by and PNG_CONFIGURE_LIBPNG is set by the "configure" * script. We may need it here to get the correct configuration on things * like limits. @@ -191,9 +198,11 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; # endif #endif -/* Moved to pngpriv.h at libpng-1.5.0 */ -/* NOTE: some of these may have been used in external applications as - * these definitions were exposed in pngconf.h prior to 1.5. +/* SECURITY and SAFETY: + * + * libpng is built with support for internal limits on image dimensions and + * memory usage. These are documented in scripts/pnglibconf.dfa of the + * source and recorded in the machine generated header file pnglibconf.h. */ /* If you are running on a machine where you cannot allocate more @@ -211,6 +220,11 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; # define PNG_MAX_MALLOC_64K #endif +/* Moved to pngpriv.h at libpng-1.5.0 */ +/* NOTE: some of these may have been used in external applications as + * these definitions were exposed in pngconf.h prior to 1.5. + */ + #ifndef PNG_UNUSED /* Unused formal parameter warnings are silenced using the following macro * which is expected to have no bad effects on performance (optimizing @@ -246,7 +260,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; /* Modern compilers support restrict, but assume not for anything not * recognized here: */ -# if defined __GNUC__ || defined _MSC_VER || defined __WATCOMC__ +# if defined(__GNUC__) || defined(_MSC_VER) || defined(__WATCOMC__) # define PNG_RESTRICT restrict # else # define PNG_RESTRICT @@ -260,8 +274,6 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #ifdef PNG_WARNINGS_SUPPORTED # define PNG_WARNING_PARAMETERS(p) png_warning_parameters p; #else -# define png_warning(s1,s2) ((void)(s1)) -# define png_chunk_warning(s1,s2) ((void)(s1)) # define png_warning_parameter(p,number,string) ((void)0) # define png_warning_parameter_unsigned(p,number,format,value) ((void)0) # define png_warning_parameter_signed(p,number,format,value) ((void)0) @@ -269,8 +281,6 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; # define PNG_WARNING_PARAMETERS(p) #endif #ifndef PNG_ERROR_TEXT_SUPPORTED -# define png_error(s1,s2) png_err(s1) -# define png_chunk_error(s1,s2) png_err(s1) # define png_fixed_error(s1,s2) png_err(s1) #endif @@ -308,6 +318,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; # define PNGFAPI /* PRIVATE */ #endif +#ifndef PNG_VERSION_INFO_ONLY /* Other defines specific to compilers can go here. Try to keep * them inside an appropriate ifdef/endif pair for portability. */ @@ -352,6 +363,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; defined(_WIN32) || defined(__WIN32__) # include /* defines _WINDOWS_ macro */ #endif +#endif /* !PNG_VERSION_INFO_ONLY */ /* Moved here around 1.5.0beta36 from pngconf.h */ /* Users may want to use these so they are not private. Any library @@ -360,7 +372,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; /* Memory model/platform independent fns */ #ifndef PNG_ABORT -# if defined(_WINDOWS_) && !defined(HAVE_WINRT) +# ifdef _WINDOWS_ # define PNG_ABORT() ExitProcess(0) # else # define PNG_ABORT() abort() @@ -378,12 +390,12 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; # define png_memcpy _fmemcpy # define png_memset _fmemset #else -# if defined(_WINDOWS_) && !defined(HAVE_WINRT) /* Favor Windows over C runtime fns */ +# ifdef _WINDOWS_ /* Favor Windows over C runtime fns */ # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # define png_strlen lstrlenA # define png_memcmp memcmp -# define png_memcpy CopyMemory +# define png_memcpy memcpy # define png_memset memset # else # define CVT_PTR(ptr) (ptr) @@ -416,7 +428,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE /* This is used because in some compiler implementations non-aligned * structure members are supported, so the offsetof approach below fails. - * Set PNG_ALIGN_TO_SIZE=0 for compiler combinations where unaligned access + * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access * is good for performance. Do not do this unless you have tested the result * and understand it. */ @@ -505,10 +517,6 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #define PNG_STRUCT_PNG 0x0001 #define PNG_STRUCT_INFO 0x0002 -/* Scaling factor for filter heuristic weighting calculations */ -#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) -#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) - /* Flags for the png_ptr->flags rather than declaring a byte for each one */ #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 @@ -531,7 +539,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000 #define PNG_FLAG_STRIP_ERROR_TEXT 0x80000 #define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000 - /* 0x200000 unused */ +#define PNG_FLAG_ZSTREAM_PROGRESSIVE 0x200000 /* 0x400000 unused */ #define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000 /* Added to libpng-1.4.0 */ #define PNG_FLAG_ZTXT_CUSTOM_STRATEGY 0x1000000 /* 5 lines added */ @@ -617,8 +625,10 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\ ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0)) #else +#ifndef PNG_VERSION_INFO_ONLY PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp, png_const_charp text)); +#endif /* !PNG_VERSION_INFO_ONLY */ #endif #endif @@ -692,6 +702,18 @@ PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp, #define PNG_GAMMA_MAC_INVERSE 65909 #define PNG_GAMMA_sRGB_INVERSE 45455 +/* Almost everything below is C specific; the #defines above can be used in + * non-C code (so long as it is C-preprocessed) the rest of this stuff cannot. + */ +#ifndef PNG_VERSION_INFO_ONLY + +#include "pngstruct.h" +#include "pnginfo.h" + +/* This is used for 16 bit gamma tables -- only the top level pointers are + * const; this could be changed: + */ +typedef const png_uint_16p * png_const_uint_16pp; /* Inhibit C++ name-mangling for libpng functions but not for system calls. */ #ifdef __cplusplus @@ -823,10 +845,8 @@ PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); # ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); # endif -# ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point file_gamma)); -# endif #endif #ifdef PNG_WRITE_sBIT_SUPPORTED @@ -881,13 +901,6 @@ PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_const_uint_16p hist, int num_hist)); #endif -/* Chunks that have keywords */ -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ - defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) -PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, - png_const_charp key, png_charpp new_key)); -#endif - #ifdef PNG_WRITE_tEXt_SUPPORTED PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_const_charp key, png_const_charp text, png_size_t text_len)); @@ -993,8 +1006,8 @@ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, /* Unfilter a row: check the filter value before calling this, there is no point * calling it for PNG_FILTER_VALUE_NONE. */ -PNG_EXTERN void png_read_filter_row PNGARG((png_structp pp, png_row_infop row_info, - png_bytep row, png_const_bytep prev_row, int filter)); +PNG_EXTERN void png_read_filter_row PNGARG((png_structp pp, png_row_infop + row_info, png_bytep row, png_const_bytep prev_row, int filter)); PNG_EXTERN void png_read_filter_row_up_neon PNGARG((png_row_infop row_info, png_bytep row, png_const_bytep prev_row)); @@ -1293,9 +1306,6 @@ PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, - png_uint_32 length)); -PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); @@ -1491,14 +1501,16 @@ PNG_EXTERN void png_formatted_warning(png_structp png_ptr, /* ASCII to FP interfaces, currently only implemented if sCAL * support is required. */ -#if defined(PNG_READ_sCAL_SUPPORTED) +#ifdef PNG_sCAL_SUPPORTED /* MAX_DIGITS is actually the maximum number of characters in an sCAL * width or height, derived from the precision (number of significant * digits - a build time settable option) and assumpitions about the * maximum ridiculous exponent. */ #define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/) +#endif +#ifdef PNG_sCAL_SUPPORTED #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_ascii_from_fp PNGARG((png_structp png_ptr, png_charp ascii, png_size_t size, double fp, unsigned int precision)); @@ -1583,14 +1595,14 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr, #define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK) #define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK) -/* The actual parser. This can be called repeatedly, it updates +/* The actual parser. This can be called repeatedly. It updates * the index into the string and the state variable (which must - * be initialzed to 0). It returns a result code, as above. There + * be initialized to 0). It returns a result code, as above. There * is no point calling the parser any more if it fails to advance to * the end of the string - it is stuck on an invalid character (or * terminated by '\0'). * - * Note that the pointer will consume an E or even an E+ then leave + * Note that the pointer will consume an E or even an E+ and then leave * a 'maybe' state even though a preceding integer.fraction is valid. * The PNG_FP_WAS_VALID flag indicates that a preceding substring was * a valid number. It's possible to recover from this by calling @@ -1629,7 +1641,7 @@ PNG_EXTERN png_fixed_point png_muldiv_warn PNGARG((png_structp png_ptr, png_fixed_point a, png_int_32 multiplied_by, png_int_32 divided_by)); #endif -#ifdef PNG_READ_GAMMA_SUPPORTED +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) /* Calculate a reciprocal - used for gamma values. This returns * 0 if the argument is 0 in order to maintain an undefined value, * there are no warnings. @@ -1664,7 +1676,80 @@ PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr, int bit_depth)); #endif -/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ +/* Missing declarations if FIXED_POINT is *not* supported - fixed properly + * in libpng 1.6 + */ +#ifndef PNG_FIXED_POINT_SUPPORTED +#ifdef PNG_cHRM_SUPPORTED +PNG_EXTERN png_uint_32 png_get_cHRM_XYZ_fixed PNGARG( + (png_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_red_X, png_fixed_point *int_red_Y, + png_fixed_point *int_red_Z, png_fixed_point *int_green_X, + png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, + png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, + png_fixed_point *int_blue_Z)); +PNG_EXTERN void png_set_cHRM_XYZ_fixed PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, + png_fixed_point int_red_Z, png_fixed_point int_green_X, + png_fixed_point int_green_Y, png_fixed_point int_green_Z, + png_fixed_point int_blue_X, png_fixed_point int_blue_Y, + png_fixed_point int_blue_Z)); +PNG_EXTERN void png_set_cHRM_fixed PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, + png_fixed_point int_white_y, png_fixed_point int_red_x, + png_fixed_point int_red_y, png_fixed_point int_green_x, + png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif + +#ifdef PNG_gAMA_SUPPORTED +PNG_EXTERN png_uint_32 png_get_gAMA_fixed PNGARG( + (png_const_structp png_ptr, png_const_infop info_ptr, + png_fixed_point *int_file_gamma)); +PNG_EXTERN void png_set_gAMA_fixed PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)); +#endif + +#ifdef PNG_READ_BACKGROUND_SUPPORTED +PNG_EXTERN void png_set_background_fixed PNGARG((png_structp png_ptr, + png_const_color_16p background_color, int background_gamma_code, + int need_expand, png_fixed_point background_gamma)); +#endif + +#ifdef PNG_READ_ALPHA_MODE_SUPPORTED +PNG_EXTERN void png_set_alpha_mode_fixed PNGARG((png_structp png_ptr, + int mode, png_fixed_point output_gamma)); +#endif + +#ifdef PNG_READ_GAMMA_SUPPORTED +PNG_EXTERN void png_set_gamma_fixed PNGARG((png_structp png_ptr, + png_fixed_point screen_gamma, png_fixed_point override_file_gamma)); +#endif + +#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED +PNG_EXTERN void png_set_rgb_to_gray_fixed PNGARG((png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green)); +#endif +#endif /* FIX MISSING !FIXED_POINT DECLARATIONS */ + +/* These are initialization functions for hardware specific PNG filter + * optimizations; list these here then select the appropriate one at compile + * time using the macro PNG_FILTER_OPTIMIZATIONS. If the macro is not defined + * the generic code is used. + */ +#ifdef PNG_FILTER_OPTIMIZATIONS +PNG_EXTERN void PNG_FILTER_OPTIMIZATIONS(png_structp png_ptr, unsigned int bpp); + /* Just declare the optimization that will be used */ +#else + /* List *all* the possible optimizations here - this branch is required if + * the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in + * CFLAGS in place of CPPFLAGS *and* uses symbol prefixing. + */ +PNG_EXTERN void png_init_filter_functions_neon(png_structp png_ptr, + unsigned int bpp); +#endif + +/* Maintainer: Put new private prototypes here ^ */ #include "pngdebug.h" @@ -1672,4 +1757,5 @@ PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr, } #endif +#endif /* PNG_VERSION_INFO_ONLY */ #endif /* PNGPRIV_H */ diff --git a/3rdparty/libpng/pngread.c b/3rdparty/libpng/pngread.c index 1d8c6b3346..b90e017e62 100644 --- a/3rdparty/libpng/pngread.c +++ b/3rdparty/libpng/pngread.c @@ -1,8 +1,8 @@ /* pngread.c - read a PNG file * - * Last changed in libpng 1.5.10 [March 8, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.23 [July 23, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -100,7 +100,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, if (!png_user_version_check(png_ptr, user_png_ver)) png_cleanup_needed = 1; - if (!png_cleanup_needed) + if (png_cleanup_needed == 0) { /* Initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; @@ -114,7 +114,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; - if (!png_cleanup_needed) + if (png_cleanup_needed == 0) { switch (inflateInit(&png_ptr->zstream)) { @@ -141,7 +141,7 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, } } - if (png_cleanup_needed) + if (png_cleanup_needed != 0) { /* Clean up PNG structure and deallocate any memory. */ png_free(png_ptr, png_ptr->zbuf); @@ -559,7 +559,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) if (ret == Z_STREAM_END) { if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || - png_ptr->idat_size) + png_ptr->idat_size) png_benign_error(png_ptr, "Extra compressed data"); png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; @@ -617,7 +617,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) #ifdef PNG_READ_INTERLACING_SUPPORTED /* Blow up interlaced rows to full size */ if (png_ptr->interlaced && - (png_ptr->transformations & PNG_INTERLACE)) + (png_ptr->transformations & PNG_INTERLACE)) { if (png_ptr->pass < 6) png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass, @@ -1119,9 +1119,8 @@ png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) #ifdef PNG_SEQUENTIAL_READ_SUPPORTED #ifdef PNG_INFO_IMAGE_SUPPORTED void PNGAPI -png_read_png(png_structp png_ptr, png_infop info_ptr, - int transforms, - voidp params) +png_read_png(png_structp png_ptr, png_infop info_ptr, int transforms, + voidp params) { int row; @@ -1191,7 +1190,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr, if (transforms & PNG_TRANSFORM_EXPAND) if ((png_ptr->bit_depth < 8) || (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || - (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) + (info_ptr->valid & PNG_INFO_tRNS)) png_set_expand(png_ptr); #endif @@ -1210,14 +1209,8 @@ png_read_png(png_structp png_ptr, png_infop info_ptr, * [0,65535] to the original [0,7] or [0,31], or whatever range the * colors were originally in: */ - if ((transforms & PNG_TRANSFORM_SHIFT) - && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) - { - png_color_8p sig_bit; - - png_get_sBIT(png_ptr, info_ptr, &sig_bit); - png_set_shift(png_ptr, sig_bit); - } + if ((transforms & PNG_TRANSFORM_SHIFT) && (info_ptr->valid & PNG_INFO_sBIT)) + png_set_shift(png_ptr, &info_ptr->sig_bit); #endif #ifdef PNG_READ_BGR_SUPPORTED @@ -1287,7 +1280,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr, for (row = 0; row < (int)info_ptr->height; row++) info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, - png_get_rowbytes(png_ptr, info_ptr)); + png_get_rowbytes(png_ptr, info_ptr)); } png_read_image(png_ptr, info_ptr->row_pointers); diff --git a/3rdparty/libpng/pngrio.c b/3rdparty/libpng/pngrio.c index e9c381c5ba..b4042e9ed3 100644 --- a/3rdparty/libpng/pngrio.c +++ b/3rdparty/libpng/pngrio.c @@ -2,7 +2,7 @@ /* pngrio.c - functions for data input * * Last changed in libpng 1.5.0 [January 6, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2002,2004,2006-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -26,7 +26,7 @@ * reads from a file pointer. Note that this routine sometimes gets called * with very small lengths, so you should implement some kind of simple * buffering if you are using unbuffered reads. This should never be asked - * to read more then 64K on a 16 bit machine. + * to read more than 64K on a 16 bit machine. */ void /* PRIVATE */ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) diff --git a/3rdparty/libpng/pngrtran.c b/3rdparty/libpng/pngrtran.c index 96732b55c5..f273362616 100644 --- a/3rdparty/libpng/pngrtran.c +++ b/3rdparty/libpng/pngrtran.c @@ -1,8 +1,8 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.5.11 [June 14, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.24 [November 12, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -114,7 +114,7 @@ png_set_background_fixed(png_structp png_ptr, png_sizeof(png_color_16)); png_ptr->background_gamma = background_gamma; png_ptr->background_gamma_type = (png_byte)(background_gamma_code); - if (need_expand) + if (need_expand != 0) png_ptr->transformations |= PNG_BACKGROUND_EXPAND; else png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND; @@ -194,8 +194,10 @@ translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma, */ # ifdef PNG_READ_sRGB_SUPPORTED png_ptr->flags |= PNG_FLAG_ASSUME_sRGB; +# else + PNG_UNUSED(png_ptr) # endif - if (is_screen) + if (is_screen != 0) output_gamma = PNG_GAMMA_sRGB; else output_gamma = PNG_GAMMA_sRGB_INVERSE; @@ -204,7 +206,7 @@ translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma, else if (output_gamma == PNG_GAMMA_MAC_18 || output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18) { - if (is_screen) + if (is_screen != 0) output_gamma = PNG_GAMMA_MAC_OLD; else output_gamma = PNG_GAMMA_MAC_INVERSE; @@ -329,7 +331,7 @@ png_set_alpha_mode_fixed(png_structp png_ptr, int mode, /* Finally, if pre-multiplying, set the background fields to achieve the * desired result. */ - if (compose) + if (compose != 0) { /* And obtain alpha pre-multiplication by composing on black: */ png_memset(&png_ptr->background, 0, sizeof png_ptr->background); @@ -389,7 +391,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, png_ptr->transformations |= PNG_QUANTIZE; - if (!full_quantize) + if (full_quantize == 0) { int i; @@ -444,12 +446,12 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, } } - if (done) + if (done != 0) break; } /* Swap the palette around, and set up a table, if necessary */ - if (full_quantize) + if (full_quantize != 0) { int j = num_palette; @@ -632,7 +634,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, num_new_palette--; palette[png_ptr->index_to_palette[j]] = palette[num_new_palette]; - if (!full_quantize) + if (full_quantize == 0) { int k; @@ -700,7 +702,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette, } png_ptr->num_palette = (png_uint_16)num_palette; - if (full_quantize) + if (full_quantize != 0) { int i; png_bytep distance; @@ -969,7 +971,7 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, png_uint_16 red_int, green_int; /* NOTE: this calculation does not round, but this behavior is retained - * for consistency, the inaccuracy is very small. The code here always + * for consistency; the inaccuracy is very small. The code here always * overwrites the coefficients, regardless of whether they have been * defaulted or set already. */ @@ -1068,7 +1070,7 @@ png_gamma_threshold(png_fixed_point screen_gamma, png_fixed_point file_gamma) * the palette. */ -/*For the moment 'png_init_palette_transformations' and +/* For the moment 'png_init_palette_transformations' and * 'png_init_rgb_transformations' only do some flag canceling optimizations. * The intent is that these two routines should have palette or rgb operations * extracted from 'png_init_read_transformations'. @@ -1093,25 +1095,31 @@ png_init_palette_transformations(png_structp png_ptr) /* Ignore if all the entries are opaque (unlikely!) */ for (i=0; inum_trans; ++i) + { if (png_ptr->trans_alpha[i] == 255) continue; else if (png_ptr->trans_alpha[i] == 0) input_has_transparency = 1; else + { + input_has_transparency = 1; input_has_alpha = 1; + break; + } + } } /* If no alpha we can optimize. */ - if (!input_has_alpha) + if (input_has_alpha == 0) { /* Any alpha means background and associative alpha processing is - * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA + * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA * and ENCODE_ALPHA are irrelevant. */ png_ptr->transformations &= ~PNG_ENCODE_ALPHA; png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - if (!input_has_transparency) + if (input_has_transparency == 0) png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND); } @@ -1167,10 +1175,10 @@ png_init_rgb_transformations(png_structp png_ptr) int input_has_transparency = png_ptr->num_trans > 0; /* If no alpha we can optimize. */ - if (!input_has_alpha) + if (input_has_alpha == 0) { /* Any alpha means background and associative alpha processing is - * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA + * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA * and ENCODE_ALPHA are irrelevant. */ # ifdef PNG_READ_ALPHA_MODE_SUPPORTED @@ -1178,7 +1186,7 @@ png_init_rgb_transformations(png_structp png_ptr) png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; # endif - if (!input_has_transparency) + if (input_has_transparency == 0) png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND); } @@ -1221,7 +1229,7 @@ png_init_rgb_transformations(png_structp png_ptr) default: case 8: - /* Already 8 bits, fall through */ + /* FALL THROUGH (already 8 bits) */ case 16: /* Already a full 16 bits */ @@ -1304,7 +1312,7 @@ png_init_read_transformations(png_structp png_ptr) * the code immediately below if the transform can be handled outside the * row loop. */ - if (gamma_correction) + if (gamma_correction != 0) png_ptr->transformations |= PNG_GAMMA; else @@ -1313,7 +1321,7 @@ png_init_read_transformations(png_structp png_ptr) #endif /* Certain transformations have the effect of preventing other - * transformations that happen afterward in png_do_read_transformations, + * transformations that happen afterward in png_do_read_transformations; * resolve the interdependencies here. From the code of * png_do_read_transformations the order is: * @@ -1702,11 +1710,11 @@ png_init_read_transformations(png_structp png_ptr) g_sig = png_gamma_significant(g); gs_sig = png_gamma_significant(gs); - if (g_sig) + if (g_sig != 0) png_ptr->background_1.gray = png_gamma_correct(png_ptr, png_ptr->background.gray, g); - if (gs_sig) + if (gs_sig != 0) png_ptr->background.gray = png_gamma_correct(png_ptr, png_ptr->background.gray, gs); @@ -1715,7 +1723,7 @@ png_init_read_transformations(png_structp png_ptr) (png_ptr->background.red != png_ptr->background.gray)) { /* RGB or RGBA with color background */ - if (g_sig) + if (g_sig != 0) { png_ptr->background_1.red = png_gamma_correct(png_ptr, png_ptr->background.red, g); @@ -1727,7 +1735,7 @@ png_init_read_transformations(png_structp png_ptr) png_ptr->background.blue, g); } - if (gs_sig) + if (gs_sig != 0) { png_ptr->background.red = png_gamma_correct(png_ptr, png_ptr->background.red, gs); @@ -1898,6 +1906,9 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) info_ptr->bit_depth = 8; info_ptr->num_trans = 0; + + if (png_ptr->palette == NULL) + png_error (png_ptr, "Palette is NULL in indexed image"); } else { @@ -2045,10 +2056,10 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) defined(PNG_READ_USER_TRANSFORM_SUPPORTED) if (png_ptr->transformations & PNG_USER_TRANSFORM) { - if (info_ptr->bit_depth < png_ptr->user_transform_depth) + if (png_ptr->user_transform_depth) info_ptr->bit_depth = png_ptr->user_transform_depth; - if (info_ptr->channels < png_ptr->user_transform_channels) + if (png_ptr->user_transform_channels) info_ptr->channels = png_ptr->user_transform_channels; } #endif @@ -2067,7 +2078,7 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_ptr->info_rowbytes = info_ptr->rowbytes; #ifndef PNG_READ_EXPAND_SUPPORTED - if (png_ptr) + if (png_ptr != NULL) return; #endif } @@ -2144,7 +2155,7 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) png_do_rgb_to_gray(png_ptr, row_info, png_ptr->row_buf + 1); - if (rgb_error) + if (rgb_error != 0) { png_ptr->rgb_to_gray_status=1; if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == @@ -2198,8 +2209,8 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1); #endif -#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\ - (defined PNG_READ_ALPHA_MODE_SUPPORTED) +#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ + defined(PNG_READ_ALPHA_MODE_SUPPORTED) if (png_ptr->transformations & PNG_COMPOSE) png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr); #endif @@ -2210,8 +2221,8 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) /* Because RGB_TO_GRAY does the gamma transform. */ !(png_ptr->transformations & PNG_RGB_TO_GRAY) && #endif -#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\ - (defined PNG_READ_ALPHA_MODE_SUPPORTED) +#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ + defined(PNG_READ_ALPHA_MODE_SUPPORTED) /* Because PNG_COMPOSE does the gamma transform if there is something to * do (if there is an alpha channel or transparency.) */ @@ -2522,7 +2533,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, have_shift = 1; } - if (!have_shift) + if (have_shift == 0) return; } @@ -2958,13 +2969,13 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 1; i < row_width; i++) { - *(--dp) = hi_filler; *(--dp) = lo_filler; + *(--dp) = hi_filler; *(--dp) = *(--sp); *(--dp) = *(--sp); } - *(--dp) = hi_filler; *(--dp) = lo_filler; + *(--dp) = hi_filler; row_info->channels = 2; row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; @@ -2979,8 +2990,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, { *(--dp) = *(--sp); *(--dp) = *(--sp); - *(--dp) = hi_filler; *(--dp) = lo_filler; + *(--dp) = hi_filler; } row_info->channels = 2; row_info->pixel_depth = 32; @@ -3039,8 +3050,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 1; i < row_width; i++) { - *(--dp) = hi_filler; *(--dp) = lo_filler; + *(--dp) = hi_filler; *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); @@ -3048,8 +3059,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, *(--dp) = *(--sp); *(--dp) = *(--sp); } - *(--dp) = hi_filler; *(--dp) = lo_filler; + *(--dp) = hi_filler; row_info->channels = 4; row_info->pixel_depth = 64; row_info->rowbytes = row_width * 8; @@ -3068,8 +3079,8 @@ png_do_read_filler(png_row_infop row_info, png_bytep row, *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); - *(--dp) = hi_filler; *(--dp) = lo_filler; + *(--dp) = hi_filler; } row_info->channels = 4; @@ -3283,7 +3294,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) *(dp++) = red; } - if (have_alpha) + if (have_alpha != 0) *(dp++) = *(sp++); } } @@ -3312,7 +3323,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) else *(dp++) = red; - if (have_alpha) + if (have_alpha != 0) *(dp++) = *(sp++); } } @@ -3330,11 +3341,17 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) for (i = 0; i < row_width; i++) { png_uint_16 red, green, blue, w; - +#if 0 /* Coverity doesn't like this */ red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; +#else + png_byte hi,lo; + hi=*(sp)++; lo=*(sp)++; red = (png_uint_16)((hi << 8) | (lo)); + hi=*(sp)++; lo=*(sp)++; green = (png_uint_16)((hi << 8) | (lo)); + hi=*(sp)++; lo=*(sp)++; blue = (png_uint_16)((hi << 8) | (lo)); +#endif if (red == green && red == blue) { if (png_ptr->gamma_16_table != NULL) @@ -3364,7 +3381,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)((w>>8) & 0xff); *(dp++) = (png_byte)(w & 0xff); - if (have_alpha) + if (have_alpha != 0) { *(dp++) = *(sp++); *(dp++) = *(sp++); @@ -3398,7 +3415,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) *(dp++) = (png_byte)((gray16>>8) & 0xff); *(dp++) = (png_byte)(gray16 & 0xff); - if (have_alpha) + if (have_alpha != 0) { *(dp++) = *(sp++); *(dp++) = *(sp++); @@ -3477,8 +3494,8 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette) #ifdef PNG_READ_TRANSFORMS_SUPPORTED -#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\ - (defined PNG_READ_ALPHA_MODE_SUPPORTED) +#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ + defined(PNG_READ_ALPHA_MODE_SUPPORTED) /* Replace any alpha or transparency with the supplied background color. * "background" is already in the screen gamma, while "background_1" is * at a gamma of 1.0. Paletted files have already been taken care of. @@ -3524,7 +3541,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) *sp |= (png_byte)(png_ptr->background.gray << shift); } - if (!shift) + if (shift == 0) { shift = 7; sp++; @@ -3561,7 +3578,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) *sp |= (png_byte)(g << shift); } - if (!shift) + if (shift == 0) { shift = 6; sp++; @@ -3586,7 +3603,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) *sp |= (png_byte)(png_ptr->background.gray << shift); } - if (!shift) + if (shift == 0) { shift = 6; sp++; @@ -3624,7 +3641,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) *sp |= (png_byte)(g << shift); } - if (!shift) + if (shift == 0) { shift = 4; sp++; @@ -3649,7 +3666,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) *sp |= (png_byte)(png_ptr->background.gray << shift); } - if (!shift) + if (shift == 0) { shift = 4; sp++; @@ -3705,8 +3722,10 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) if (v == png_ptr->trans_color.gray) { /* Background is already in screen gamma */ - *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); + *sp = (png_byte)((png_ptr->background.gray >> 8) + & 0xff); + *(sp + 1) = (png_byte)(png_ptr->background.gray + & 0xff); } else @@ -3729,8 +3748,10 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) if (v == png_ptr->trans_color.gray) { - *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); + *sp = (png_byte)((png_ptr->background.gray >> 8) + & 0xff); + *(sp + 1) = (png_byte)(png_ptr->background.gray + & 0xff); } } } @@ -3810,9 +3831,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) /* Background is already in screen gamma */ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff); + *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) + & 0xff); + *(sp + 3) = (png_byte)(png_ptr->background.green + & 0xff); + *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) + & 0xff); *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); } @@ -3853,9 +3877,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) { *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff); + *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) + & 0xff); + *(sp + 3) = (png_byte)(png_ptr->background.green + & 0xff); + *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) + & 0xff); *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); } } @@ -3892,7 +3919,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) v = gamma_to_1[*sp]; png_composite(w, v, a, png_ptr->background_1.gray); - if (!optimize) + if (optimize == 0) w = gamma_from_1[w]; *sp = w; } @@ -3910,7 +3937,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) *sp = (png_byte)png_ptr->background.gray; else if (a < 0xff) - png_composite(*sp, *sp, a, png_ptr->background_1.gray); + png_composite(*sp, *sp, a, png_ptr->background.gray); } } } @@ -3938,7 +3965,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) else if (a == 0) { /* Background is already in screen gamma */ - *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff); + *sp = (png_byte)((png_ptr->background.gray >> 8) + & 0xff); *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); } @@ -3948,7 +3976,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; png_composite_16(v, g, a, png_ptr->background_1.gray); - if (optimize) + if (optimize != 0) w = v; else w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; @@ -3968,7 +3996,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) if (a == 0) { - *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff); + *sp = (png_byte)((png_ptr->background.gray >> 8) + & 0xff); *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); } @@ -3977,7 +4006,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) png_uint_16 g, v; g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_composite_16(v, g, a, png_ptr->background_1.gray); + png_composite_16(v, g, a, png_ptr->background.gray); *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); } @@ -4021,17 +4050,17 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) v = gamma_to_1[*sp]; png_composite(w, v, a, png_ptr->background_1.red); - if (!optimize) w = gamma_from_1[w]; + if (optimize == 0) w = gamma_from_1[w]; *sp = w; v = gamma_to_1[*(sp + 1)]; png_composite(w, v, a, png_ptr->background_1.green); - if (!optimize) w = gamma_from_1[w]; + if (optimize == 0) w = gamma_from_1[w]; *(sp + 1) = w; v = gamma_to_1[*(sp + 2)]; png_composite(w, v, a, png_ptr->background_1.blue); - if (!optimize) w = gamma_from_1[w]; + if (optimize == 0) w = gamma_from_1[w]; *(sp + 2) = w; } } @@ -4098,9 +4127,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) /* Background is already in screen gamma */ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff); + *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) + & 0xff); + *(sp + 3) = (png_byte)(png_ptr->background.green + & 0xff); + *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) + & 0xff); *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); } @@ -4110,23 +4142,26 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; png_composite_16(w, v, a, png_ptr->background_1.red); - if (!optimize) - w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + if (optimize == 0) + w = gamma_16_from_1[((w&0xff) >> gamma_shift)] + [w >> 8]; *sp = (png_byte)((w >> 8) & 0xff); *(sp + 1) = (png_byte)(w & 0xff); v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; png_composite_16(w, v, a, png_ptr->background_1.green); - if (!optimize) - w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + if (optimize == 0) + w = gamma_16_from_1[((w&0xff) >> gamma_shift)] + [w >> 8]; *(sp + 2) = (png_byte)((w >> 8) & 0xff); *(sp + 3) = (png_byte)(w & 0xff); v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; png_composite_16(w, v, a, png_ptr->background_1.blue); - if (!optimize) - w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + if (optimize == 0) + w = gamma_16_from_1[((w&0xff) >> gamma_shift)] + [w >> 8]; *(sp + 4) = (png_byte)((w >> 8) & 0xff); *(sp + 5) = (png_byte)(w & 0xff); @@ -4147,9 +4182,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr) { *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff); + *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) + & 0xff); + *(sp + 3) = (png_byte)(png_ptr->background.green + & 0xff); + *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) + & 0xff); *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); } @@ -4725,7 +4763,9 @@ png_do_expand(png_row_infop row_info, png_bytep row, { if (row_info->bit_depth == 8) { - gray = gray & 0xff; + /* NOTE: prior to libpng 1.5.14 this cleared out the top bits of + * 'gray', however if those are set it is an error. + */ sp = row + (png_size_t)row_width - 1; dp = row + (png_size_t)(row_width << 1) - 1; diff --git a/3rdparty/libpng/pngrutil.c b/3rdparty/libpng/pngrutil.c index d8fe54cc62..6061651fef 100644 --- a/3rdparty/libpng/pngrutil.c +++ b/3rdparty/libpng/pngrutil.c @@ -1,8 +1,8 @@ /* pngrutil.c - utilities to read a PNG file * - * Last changed in libpng 1.5.10 [March 8, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.25 [December 3, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -18,8 +18,6 @@ #ifdef PNG_READ_SUPPORTED -#define png_strtod(p,a,b) strtod(a,b) - png_uint_32 PNGAPI png_get_uint_31(png_structp png_ptr, png_const_bytep buf) { @@ -91,7 +89,13 @@ png_get_int_32)(png_const_bytep buf) return uval; uval = (uval ^ 0xffffffff) + 1; /* 2's complement: -x = ~x+1 */ - return -(png_int_32)uval; + if ((uval & 0x80000000) == 0) /* no overflow */ + return -(png_int_32)uval; + /* The following has to be safe; this function only gets called on PNG data + * and if we get here that data is invalid. 0 is the most safe value and + * if not then an attacker would surely just generate a PNG with 0 instead. + */ + return 0; } /* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ @@ -211,7 +215,7 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip) png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); } - if (i) + if (i != 0) { png_crc_read(png_ptr, png_ptr->zbuf, i); } @@ -267,7 +271,7 @@ png_crc_error(png_structp png_ptr) /* The chunk CRC must be serialized in a single I/O call. */ png_read_data(png_ptr, crc_bytes, 4); - if (need_crc) + if (need_crc != 0) { crc = png_get_uint_32(crc_bytes); return ((int)(crc != png_ptr->crc)); @@ -284,6 +288,17 @@ png_inflate(png_structp png_ptr, png_bytep data, png_size_t size, { png_size_t count = 0; + /* HACK: added in libpng 1.5.18: the progressive reader always leaves + * png_ptr->zstream in a non-reset state. This causes a reset if it needs to + * be used again. This only copes with that one specific error; see libpng + * 1.6 for a better solution. + */ + if ((png_ptr->flags & PNG_FLAG_ZSTREAM_PROGRESSIVE) != 0) + { + (void)inflateReset(&png_ptr->zstream); + png_ptr->flags &= ~PNG_FLAG_ZSTREAM_PROGRESSIVE; + } + /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it can't * even necessarily handle 65536 bytes) because the type uInt is "16 bits or * more". Consequently it is necessary to chunk the input to zlib. This @@ -596,7 +611,7 @@ void /* PRIVATE */ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_color palette[PNG_MAX_PALETTE_LENGTH]; - int num, i; + int max_palette_length, num, i; #ifdef PNG_POINTER_INDEXING_SUPPORTED png_colorp pal_ptr; #endif @@ -649,8 +664,22 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } } + /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */ num = (int)length / 3; + /* If the palette has 256 or fewer entries but is too large for the bit + * depth, we don't issue an error, to preserve the behavior of previous + * libpng versions. We silently truncate the unused extra palette entries + * here. + */ + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + max_palette_length = (1 << png_ptr->bit_depth); + else + max_palette_length = PNG_MAX_PALETTE_LENGTH; + + if (num > max_palette_length) + num = max_palette_length; + #ifdef PNG_POINTER_INDEXING_SUPPORTED for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++) { @@ -683,7 +712,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) #endif { - png_crc_finish(png_ptr, 0); + png_crc_finish(png_ptr, (int) length - num * 3); } #ifndef PNG_READ_OPT_PLTE_SUPPORTED @@ -1298,7 +1327,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* There should be at least one zero (the compression type byte) * following the separator, and we should be on it */ - if (profile >= png_ptr->chunkdata + slength - 1) + if (slength < 1U || profile >= png_ptr->chunkdata + slength - 1U) { png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; @@ -1309,7 +1338,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Compression_type should always be zero */ compression_type = *profile++; - if (compression_type) + if (compression_type != 0) { png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); compression_type = 0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8 @@ -1447,7 +1476,8 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) ++entry_start; /* A sample depth should follow the separator, and we should be on it */ - if (entry_start > (png_bytep)png_ptr->chunkdata + slength - 2) + if (slength < 2U || + entry_start > (png_bytep)png_ptr->chunkdata + slength - 2U) { png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; @@ -1976,7 +2006,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* We need to have at least 12 bytes after the purpose string * in order to get the parameter information. */ - if (endptr <= buf + 12) + if (endptr - buf <= 12) { png_warning(png_ptr, "Invalid pCAL data"); png_free(png_ptr, png_ptr->chunkdata); @@ -2309,7 +2339,7 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_ptr->chunkdata = NULL; png_free(png_ptr, text_ptr); - if (ret) + if (ret != 0) png_warning(png_ptr, "Insufficient memory to process text chunk"); } #endif @@ -2388,7 +2418,7 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Empty loop */ ; /* zTXt must have some text after the chunkdataword */ - if (text >= png_ptr->chunkdata + slength - 2) + if (slength < 2U || text >= png_ptr->chunkdata + slength - 2U) { png_warning(png_ptr, "Truncated zTXt chunk"); png_free(png_ptr, png_ptr->chunkdata); @@ -2439,7 +2469,7 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; - if (ret) + if (ret != 0) png_error(png_ptr, "Insufficient memory to store zTXt chunk"); } #endif @@ -2452,7 +2482,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_textp text_ptr; png_charp key, lang, text, lang_key; int comp_flag; - int comp_type = 0; + int comp_type; int ret; png_size_t slength, prefix_len, data_len; @@ -2525,7 +2555,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) * keyword */ - if (lang >= png_ptr->chunkdata + slength - 3) + if (slength < 3U || lang >= png_ptr->chunkdata + slength - 3U) { png_warning(png_ptr, "Truncated iTXt chunk"); png_free(png_ptr, png_ptr->chunkdata); @@ -2533,18 +2563,30 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - else - { - comp_flag = *lang++; - comp_type = *lang++; - } + comp_flag = *lang++; + comp_type = *lang++; - if (comp_type || (comp_flag && comp_flag != PNG_TEXT_COMPRESSION_zTXt)) + /* 1.5.14: The spec says "for uncompressed text decoders shall ignore [the + * compression type]". The compression flag shall be 0 (no compression) or + * 1 (compressed with method 0 - deflate.) + */ + if (comp_flag/*compressed*/ != 0) { - png_warning(png_ptr, "Unknown iTXt compression type or method"); - png_free(png_ptr, png_ptr->chunkdata); - png_ptr->chunkdata = NULL; - return; + if (comp_flag != 1) + { + png_warning(png_ptr, "invalid iTXt compression flag"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + if (comp_type != 0) + { + png_warning(png_ptr, "unknown iTXt compression type"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } } for (lang_key = lang; *lang_key; lang_key++) @@ -2577,7 +2619,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) key=png_ptr->chunkdata; - if (comp_flag) + if (comp_flag/*compressed*/) png_decompress_chunk(png_ptr, comp_type, (size_t)length, prefix_len, &data_len); @@ -2595,7 +2637,8 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - text_ptr->compression = (int)comp_flag + 1; + text_ptr->compression = + (comp_flag ? PNG_ITXT_COMPRESSION_zTXt : PNG_ITXT_COMPRESSION_NONE); text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key); text_ptr->lang = png_ptr->chunkdata + (lang - key); text_ptr->itxt_length = data_len; @@ -2609,7 +2652,7 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) png_free(png_ptr, png_ptr->chunkdata); png_ptr->chunkdata = NULL; - if (ret) + if (ret != 0) png_error(png_ptr, "Insufficient memory to store iTXt chunk"); } #endif @@ -2786,7 +2829,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display) { unsigned int pixel_depth = png_ptr->transformed_pixel_depth; png_const_bytep sp = png_ptr->row_buf + 1; - png_uint_32 row_width = png_ptr->width; + png_alloc_size_t row_width = png_ptr->width; unsigned int pass = png_ptr->pass; png_bytep end_ptr = 0; png_byte end_byte = 0; @@ -2938,7 +2981,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display) # define S_MASKS(d,s) { S_MASK(0,d,s), S_MASK(1,d,s), S_MASK(2,d,s),\ S_MASK(3,d,s), S_MASK(4,d,s), S_MASK(5,d,s) } -# define B_MASKS(d,s) { B_MASK(1,d,s), S_MASK(3,d,s), S_MASK(5,d,s) } +# define B_MASKS(d,s) { B_MASK(1,d,s), B_MASK(3,d,s), B_MASK(5,d,s) } # define DEPTH_INDEX(d) ((d)==1?0:((d)==2?1:2)) @@ -3049,7 +3092,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display) } /* Work out the bytes to copy. */ - if (display) + if (display != 0) { /* When doing the 'block' algorithm the pixel in the pass gets * replicated to adjacent pixels. This is why the even (0,2,4,6) @@ -3059,7 +3102,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display) /* But don't allow this number to exceed the actual row width. */ if (bytes_to_copy > row_width) - bytes_to_copy = row_width; + bytes_to_copy = (unsigned int)/*SAFE*/row_width; } else /* normal row; Adam7 only ever gives us one pixel to copy. */ @@ -3151,7 +3194,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display) { png_uint_32p dp32 = (png_uint_32p)dp; png_const_uint_32p sp32 = (png_const_uint_32p)sp; - unsigned int skip = (bytes_to_jump-bytes_to_copy) / + size_t skip = (bytes_to_jump-bytes_to_copy) / sizeof (png_uint_32); do @@ -3192,7 +3235,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display) { png_uint_16p dp16 = (png_uint_16p)dp; png_const_uint_16p sp16 = (png_const_uint_16p)sp; - unsigned int skip = (bytes_to_jump-bytes_to_copy) / + size_t skip = (bytes_to_jump-bytes_to_copy) / sizeof (png_uint_16); do @@ -3237,7 +3280,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display) dp += bytes_to_jump; row_width -= bytes_to_jump; if (bytes_to_copy > row_width) - bytes_to_copy = row_width; + bytes_to_copy = (unsigned int)/*SAFE*/row_width; } } @@ -3476,7 +3519,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, for (i = 0; i < row_info->width; i++) { - png_byte v[8]; + png_byte v[8]; /* SAFE; pixel_depth does not exceed 64 */ int j; png_memcpy(v, sp, pixel_bytes); @@ -3660,66 +3703,6 @@ png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row, } } -#ifdef PNG_ARM_NEON - -#if defined __linux__ && !defined __ANDROID__ -#include -#include -#include - -static int png_have_hwcap(unsigned cap) -{ - FILE *f = fopen("/proc/self/auxv", "r"); - Elf32_auxv_t aux; - int have_cap = 0; - - if (!f) - return 0; - - while (fread(&aux, sizeof(aux), 1, f) > 0) - { - if (aux.a_type == AT_HWCAP && - aux.a_un.a_val & cap) - { - have_cap = 1; - break; - } - } - - fclose(f); - - return have_cap; -} -#endif /* __linux__ */ - -static void -png_init_filter_functions_neon(png_structp pp, unsigned int bpp) -{ -#if defined __linux__ && !defined __ANDROID__ - if (!png_have_hwcap(HWCAP_NEON)) - return; -#endif - - pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_neon; - - if (bpp == 3) - { - pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_neon; - pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_neon; - pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = - png_read_filter_row_paeth3_neon; - } - - else if (bpp == 4) - { - pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_neon; - pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_neon; - pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = - png_read_filter_row_paeth4_neon; - } -} -#endif /* PNG_ARM_NEON */ - static void png_init_filter_functions(png_structp pp) { @@ -3735,8 +3718,16 @@ png_init_filter_functions(png_structp pp) pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = png_read_filter_row_paeth_multibyte_pixel; -#ifdef PNG_ARM_NEON - png_init_filter_functions_neon(pp, bpp); +#ifdef PNG_FILTER_OPTIMIZATIONS + /* To use this define PNG_FILTER_OPTIMIZATIONS as the name of a function to + * call to install hardware optimizations for the above functions; simply + * replace whatever elements of the pp->read_filter[] array with a hardware + * specific (or, for that matter, generic) optimization. + * + * To see an example of this examine what configure.ac does when + * --enable-arm-neon is specified on the command line. + */ + PNG_FILTER_OPTIMIZATIONS(pp, bpp); #endif } @@ -3744,10 +3735,13 @@ void /* PRIVATE */ png_read_filter_row(png_structp pp, png_row_infop row_info, png_bytep row, png_const_bytep prev_row, int filter) { - if (pp->read_filter[0] == NULL) - png_init_filter_functions(pp); if (filter > PNG_FILTER_VALUE_NONE && filter < PNG_FILTER_VALUE_LAST) + { + if (pp->read_filter[0] == NULL) + png_init_filter_functions(pp); + pp->read_filter[filter-1](row_info, row, prev_row); + } } #ifdef PNG_SEQUENTIAL_READ_SUPPORTED diff --git a/3rdparty/libpng/pngset.c b/3rdparty/libpng/pngset.c index 8c07eec3e8..61be6bc62e 100644 --- a/3rdparty/libpng/pngset.c +++ b/3rdparty/libpng/pngset.c @@ -1,8 +1,8 @@ /* pngset.c - storage of image information into info struct * - * Last changed in libpng 1.5.11 [June 14, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.26 [December 17, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -20,6 +20,60 @@ #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) ||\ + defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) +/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification, + * and if invalid, correct the keyword rather than discarding the entire + * chunk. The PNG 1.0 specification requires keywords 1-79 characters in + * length, forbids leading or trailing whitespace, multiple internal spaces, + * and the non-break space (0x80) from ISO 8859-1. Returns keyword length. + * + * The 'new_key' buffer must be 80 characters in size (for the keyword plus a + * trailing '\0'). If this routine returns 0 then there was no keyword, or a + * valid one could not be generated, and the caller must handle the error by not + * setting the keyword. + */ +static png_uint_32 +png_check_keyword(png_const_charp key, png_bytep new_key) +{ + png_uint_32 key_len = 0; + int space = 1; + + if (key == NULL) + { + *new_key = 0; + return 0; + } + + while (*key && key_len < 79) + { + png_byte ch = (png_byte)*key++; + + if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/)) + *new_key++ = ch, ++key_len, space = 0; + + else if (space == 0) + { + /* A space or an invalid character when one wasn't seen immediately + * before; output just a space. + */ + *new_key++ = 32, ++key_len, space = 1; + } + } + + if (key_len > 0 && space != 0) /* trailing space */ + --key_len, --new_key; + + /* Terminate the keyword */ + *new_key = 0; + + if (key_len == 0) + return 0; + + return key_len; +} +#endif /* TEXT || pCAL || iCCP || sPLT */ + #ifdef PNG_bKGD_SUPPORTED void PNGAPI png_set_bKGD(png_structp png_ptr, png_infop info_ptr, @@ -123,12 +177,12 @@ png_set_cHRM_XYZ(png_structp png_ptr, png_infop info_ptr, double red_X, png_fixed(png_ptr, red_X, "cHRM Red X"), png_fixed(png_ptr, red_Y, "cHRM Red Y"), png_fixed(png_ptr, red_Z, "cHRM Red Z"), - png_fixed(png_ptr, green_X, "cHRM Red X"), - png_fixed(png_ptr, green_Y, "cHRM Red Y"), - png_fixed(png_ptr, green_Z, "cHRM Red Z"), - png_fixed(png_ptr, blue_X, "cHRM Red X"), - png_fixed(png_ptr, blue_Y, "cHRM Red Y"), - png_fixed(png_ptr, blue_Z, "cHRM Red Z")); + png_fixed(png_ptr, green_X, "cHRM Green X"), + png_fixed(png_ptr, green_Y, "cHRM Green Y"), + png_fixed(png_ptr, green_Z, "cHRM Green Z"), + png_fixed(png_ptr, blue_X, "cHRM Blue X"), + png_fixed(png_ptr, blue_Y, "cHRM Blue Y"), + png_fixed(png_ptr, blue_Z, "cHRM Blue Z")); } # endif /* PNG_FLOATING_POINT_SUPPORTED */ @@ -252,16 +306,7 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr, info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); - /* Check for potential overflow */ - if (width > - (PNG_UINT_32_MAX >> 3) /* 8-byte RRGGBBAA pixels */ - - 48 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - info_ptr->rowbytes = 0; - else - info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); } #ifdef PNG_oFFs_SUPPORTED @@ -287,6 +332,7 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_const_charp units, png_charpp params) { + png_byte new_purpose[80]; png_size_t length; int i; @@ -295,7 +341,15 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr, if (png_ptr == NULL || info_ptr == NULL) return; - length = png_strlen(purpose) + 1; + length = png_check_keyword(purpose, new_purpose); + + if (length == 0) + { + png_warning(png_ptr, "pCAL: invalid purpose keyword"); + return; + } + + ++length; png_debug1(3, "allocating purpose for info (%lu bytes)", (unsigned long)length); @@ -318,7 +372,7 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr, return; } - png_memcpy(info_ptr->pcal_purpose, purpose, length); + png_memcpy(info_ptr->pcal_purpose, new_purpose, length); png_debug(3, "storing X0, X1, type, and nparams in info"); info_ptr->pcal_X0 = X0; @@ -517,12 +571,17 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr, png_const_colorp palette, int num_palette) { + png_uint_32 max_palette_length; + png_debug1(1, "in %s storage function", "PLTE"); if (png_ptr == NULL || info_ptr == NULL) return; - if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH) + max_palette_length = (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ? + (1 << info_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH; + + if (num_palette < 0 || num_palette > (int) max_palette_length) { if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) png_error(png_ptr, "Invalid palette length"); @@ -541,8 +600,8 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr, png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead - * of num_palette entries, in case of an invalid PNG file that has - * too-large sample values. + * of num_palette entries, in case of an invalid PNG file or incorrect + * call to png_set_PLTE() with too-large sample values. */ png_ptr->palette = (png_colorp)png_calloc(png_ptr, PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); @@ -618,6 +677,7 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr, png_const_charp name, int compression_type, png_const_bytep profile, png_uint_32 proflen) { + png_byte new_name[80]; png_charp new_iccp_name; png_bytep new_iccp_profile; png_size_t length; @@ -627,7 +687,15 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr, if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) return; - length = png_strlen(name)+1; + length = png_check_keyword(name, new_name); + + if (length == 0) + { + png_warning(png_ptr, "iCCP: invalid keyword"); + return; + } + + ++length; new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length); if (new_iccp_name == NULL) @@ -636,7 +704,7 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr, return; } - png_memcpy(new_iccp_name, name, length); + png_memcpy(new_iccp_name, new_name, length); new_iccp_profile = (png_bytep)png_malloc_warn(png_ptr, proflen); if (new_iccp_profile == NULL) @@ -671,7 +739,7 @@ png_set_text(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr, int ret; ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); - if (ret) + if (ret != 0) png_error(png_ptr, "Insufficient memory to store text"); } @@ -680,8 +748,9 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr, int num_text) { int i; + size_t element_size; - png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" : + png_debug1(1, "in %lx storage function", png_ptr == NULL ? 0xabadca11 : (unsigned long)png_ptr->chunk_name); if (png_ptr == NULL || info_ptr == NULL || num_text == 0) @@ -690,6 +759,18 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, /* Make sure we have enough space in the "text" array in info_struct * to hold all of the incoming text_ptr objects. */ + + element_size=png_sizeof(png_text); + if (num_text < 0 || + num_text > INT_MAX - info_ptr->num_text - 8 || + (unsigned int)/*SAFE*/(num_text +/*SAFE*/ + info_ptr->num_text + 8) >= + PNG_SIZE_MAX/element_size) + { + png_warning(png_ptr, "too many text chunks"); + return(0); + } + if (info_ptr->num_text + num_text > info_ptr->max_text) { int old_max_text = info_ptr->max_text; @@ -739,6 +820,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, } for (i = 0; i < num_text; i++) { + png_byte new_key[80], new_lang[80]; png_size_t text_length, key_len; png_size_t lang_len, lang_key_len; png_textp textp = &(info_ptr->text[info_ptr->num_text]); @@ -753,7 +835,13 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, continue; } - key_len = png_strlen(text_ptr[i].key); + key_len = png_check_keyword(text_ptr[i].key, new_key); + + if (key_len == 0) + { + png_warning(png_ptr, "invalid text keyword"); + continue; + } if (text_ptr[i].compression <= 0) { @@ -766,8 +854,9 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, { /* Set iTXt data */ + /* Zero length language is OK */ if (text_ptr[i].lang != NULL) - lang_len = png_strlen(text_ptr[i].lang); + lang_len = png_check_keyword(text_ptr[i].lang, new_lang); else lang_len = 0; @@ -815,7 +904,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, (key_len + lang_len + lang_key_len + text_length + 4), textp->key); - png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len)); + png_memcpy(textp->key, new_key, (png_size_t)(key_len)); *(textp->key + key_len) = '\0'; if (text_ptr[i].compression > 0) @@ -836,7 +925,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, textp->text = textp->key + key_len + 1; } - if (text_length) + if (text_length != 0) png_memcpy(textp->text, text_ptr[i].text, (png_size_t)(text_length)); @@ -897,6 +986,12 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr, if (png_ptr == NULL || info_ptr == NULL) return; + if (num_trans < 0 || num_trans > PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, "Ignoring invalid num_trans value"); + return; + } + if (trans_alpha != NULL) { /* It may not actually be necessary to set png_ptr->trans_alpha here; @@ -916,16 +1011,19 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr, if (trans_color != NULL) { - int sample_max = (1 << info_ptr->bit_depth); + if (info_ptr->bit_depth < 16) + { + unsigned int sample_max = (1U << info_ptr->bit_depth) - 1U; - if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && - (int)trans_color->gray > sample_max) || - (info_ptr->color_type == PNG_COLOR_TYPE_RGB && - ((int)trans_color->red > sample_max || - (int)trans_color->green > sample_max || - (int)trans_color->blue > sample_max))) - png_warning(png_ptr, - "tRNS chunk has out-of-range samples for bit_depth"); + if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && + trans_color->gray > sample_max) || + (info_ptr->color_type == PNG_COLOR_TYPE_RGB && + (trans_color->red > sample_max || + trans_color->green > sample_max || + trans_color->blue > sample_max))) + png_warning(png_ptr, + "tRNS chunk has out-of-range samples for bit_depth"); + } png_memcpy(&(info_ptr->trans_color), trans_color, png_sizeof(png_color_16)); @@ -958,14 +1056,25 @@ png_set_sPLT(png_structp png_ptr, */ { png_sPLT_tp np; - int i; + int i, j; + size_t element_size; if (png_ptr == NULL || info_ptr == NULL) return; - np = (png_sPLT_tp)png_malloc_warn(png_ptr, - (info_ptr->splt_palettes_num + nentries) * - (png_size_t)png_sizeof(png_sPLT_t)); + element_size = png_sizeof(png_sPLT_t); + if (nentries < 0 || + nentries > INT_MAX-info_ptr->splt_palettes_num || + (unsigned int)/*SAFE*/(nentries +/*SAFE*/ + info_ptr->splt_palettes_num) >= + PNG_SIZE_MAX/element_size) + np=NULL; + + else + + np = (png_sPLT_tp)png_malloc_warn(png_ptr, + (info_ptr->splt_palettes_num + nentries) * + (png_size_t)png_sizeof(png_sPLT_t)); if (np == NULL) { @@ -979,13 +1088,22 @@ png_set_sPLT(png_structp png_ptr, png_free(png_ptr, info_ptr->splt_palettes); info_ptr->splt_palettes=NULL; - for (i = 0; i < nentries; i++) + for (i = j = 0; i < nentries; i++) { - png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; + png_sPLT_tp to = np + info_ptr->splt_palettes_num + j; png_const_sPLT_tp from = entries + i; + png_byte new_name[80]; png_size_t length; - length = png_strlen(from->name) + 1; + length = png_check_keyword(from->name, new_name); + + if (length == 0) + { + png_warning(png_ptr, "sPLT: invalid keyword"); + continue; + } + + ++length; /* for trailing '\0' */ to->name = (png_charp)png_malloc_warn(png_ptr, length); if (to->name == NULL) @@ -995,7 +1113,7 @@ png_set_sPLT(png_structp png_ptr, continue; } - png_memcpy(to->name, from->name, length); + png_memcpy(to->name, new_name, length); to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, from->nentries * png_sizeof(png_sPLT_entry)); @@ -1013,10 +1131,11 @@ png_set_sPLT(png_structp png_ptr, to->nentries = from->nentries; to->depth = from->depth; + ++j; } info_ptr->splt_palettes = np; - info_ptr->splt_palettes_num += nentries; + info_ptr->splt_palettes_num = j; info_ptr->valid |= PNG_INFO_sPLT; info_ptr->free_me |= PNG_FREE_SPLT; } @@ -1029,13 +1148,23 @@ png_set_unknown_chunks(png_structp png_ptr, { png_unknown_chunkp np; int i; + size_t element_size; if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) return; - np = (png_unknown_chunkp)png_malloc_warn(png_ptr, - (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) * - png_sizeof(png_unknown_chunk)); + element_size = png_sizeof(png_unknown_chunk); + if (num_unknowns < 0 || + num_unknowns > INT_MAX-info_ptr->unknown_chunks_num || + (unsigned int)/*SAFE*/(num_unknowns +/*SAFE*/ + info_ptr->unknown_chunks_num) >= + PNG_SIZE_MAX/element_size) + np=NULL; + + else + np = (png_unknown_chunkp)png_malloc_warn(png_ptr, + (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) * + png_sizeof(png_unknown_chunk)); if (np == NULL) { @@ -1198,11 +1327,12 @@ png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) info_ptr->row_pointers = row_pointers; - if (row_pointers) + if (row_pointers != NULL) info_ptr->valid |= PNG_INFO_IDAT; } #endif +#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED void PNGAPI png_set_compression_buffer_size(png_structp png_ptr, png_size_t size) { @@ -1230,6 +1360,7 @@ png_set_compression_buffer_size(png_structp png_ptr, png_size_t size) png_ptr->zstream.avail_out = 0; png_ptr->zstream.avail_in = 0; } +#endif /* WRITE_CUSTOMIZE_COMPRESSION */ void PNGAPI png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) @@ -1248,7 +1379,7 @@ png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max, { /* Images with dimensions larger than these limits will be * rejected by png_set_IHDR(). To accept any PNG datastream - * regardless of dimensions, set both limits to 0x7ffffffL. + * regardless of dimensions, set both limits to 0x7fffffffL. */ if (png_ptr == NULL) return; @@ -1262,7 +1393,7 @@ void PNGAPI png_set_chunk_cache_max (png_structp png_ptr, png_uint_32 user_chunk_cache_max) { - if (png_ptr) + if (png_ptr != NULL) png_ptr->user_chunk_cache_max = user_chunk_cache_max; } @@ -1271,7 +1402,7 @@ void PNGAPI png_set_chunk_malloc_max (png_structp png_ptr, png_alloc_size_t user_chunk_malloc_max) { - if (png_ptr) + if (png_ptr != NULL) png_ptr->user_chunk_malloc_max = user_chunk_malloc_max; } #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ @@ -1283,7 +1414,7 @@ png_set_benign_errors(png_structp png_ptr, int allowed) { png_debug(1, "in png_set_benign_errors"); - if (allowed) + if (allowed != 0) png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; else @@ -1300,12 +1431,11 @@ png_set_check_for_invalid_index(png_structp png_ptr, int allowed) { png_debug(1, "in png_set_check_for_invalid_index"); - if (allowed) + if (allowed != 0) png_ptr->num_palette_max = 0; else png_ptr->num_palette_max = -1; } #endif - #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/3rdparty/libpng/pngstruct.h b/3rdparty/libpng/pngstruct.h index db0d4e4948..52eef80e69 100644 --- a/3rdparty/libpng/pngstruct.h +++ b/3rdparty/libpng/pngstruct.h @@ -1,12 +1,11 @@ /* pngstruct.h - header file for PNG reference library * - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.23 [July 23, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.9 [February 18, 2012] - * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer * and license in png.h @@ -237,16 +236,6 @@ struct png_struct_def png_uint_16p hist; /* histogram */ #endif -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - png_byte heuristic_method; /* heuristic for row filter selection */ - png_byte num_prev_filters; /* number of weights for previous rows */ - png_bytep prev_filters; /* filter type(s) of previous row(s) */ - png_uint_16p filter_weights; /* weight(s) for previous line(s) */ - png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ - png_uint_16p filter_costs; /* relative filter calculation cost */ - png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ -#endif - #ifdef PNG_TIME_RFC1123_SUPPORTED /* This is going to be unused in libpng16 and removed from libpng17 */ char time_buffer[29]; /* String to hold RFC 1123 time text */ @@ -352,7 +341,13 @@ struct png_struct_def /* New member added in libpng-1.5.6 */ png_bytep big_prev_row; +/* New member added in libpng-1.5.7 */ void (*read_filter[PNG_FILTER_VALUE_LAST-1])(png_row_infop row_info, png_bytep row, png_const_bytep prev_row); + + /* Options */ +#ifdef PNG_SET_OPTION_SUPPORTED + png_byte options; /* On/off state (up to 4 options) */ +#endif }; #endif /* PNGSTRUCT_H */ diff --git a/3rdparty/libpng/pngtrans.c b/3rdparty/libpng/pngtrans.c index ee60957fc1..a5df5afe00 100644 --- a/3rdparty/libpng/pngtrans.c +++ b/3rdparty/libpng/pngtrans.c @@ -1,8 +1,8 @@ /* pngtrans.c - transforms the data in a row (used by both readers and writers) * - * Last changed in libpng 1.5.11 [June 14, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.19 [August 21, 2014] + * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -452,7 +452,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) { if (row_info->bit_depth == 8) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ ++sp; else /* Skip initial channel and, for sp, the filler */ sp += 2, ++dp; @@ -466,7 +466,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) else if (row_info->bit_depth == 16) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ sp += 2; else /* Skip initial channel and, for sp, the filler */ sp += 4, dp += 2; @@ -492,7 +492,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) { if (row_info->bit_depth == 8) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ ++sp; else /* Skip initial channels and, for sp, the filler */ sp += 4, dp += 3; @@ -506,7 +506,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) else if (row_info->bit_depth == 16) { - if (at_start) /* Skip initial filler */ + if (at_start != 0) /* Skip initial filler */ sp += 2; else /* Skip initial channels and, for sp, the filler */ sp += 8, dp += 6; diff --git a/3rdparty/libpng/pngwio.c b/3rdparty/libpng/pngwio.c index 95ffb3429f..cc55521452 100644 --- a/3rdparty/libpng/pngwio.c +++ b/3rdparty/libpng/pngwio.c @@ -1,8 +1,8 @@ /* pngwio.c - functions for data output * - * Last changed in libpng 1.5.0 [January 6, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.18 [February 6, 2014] + * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -207,6 +207,8 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, # else png_ptr->output_flush_fn = output_flush_fn; # endif +#else + PNG_UNUSED(output_flush_fn) #endif /* PNG_WRITE_FLUSH_SUPPORTED */ /* It is an error to read while writing a png file */ diff --git a/3rdparty/libpng/pngwrite.c b/3rdparty/libpng/pngwrite.c index 2a72ad33f4..776c23603a 100644 --- a/3rdparty/libpng/pngwrite.c +++ b/3rdparty/libpng/pngwrite.c @@ -1,8 +1,8 @@ /* pngwrite.c - general routines to write a PNG file * - * Last changed in libpng 1.5.11 [June 14, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.23 [July 23, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -34,85 +34,87 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) { - /* Write PNG signature */ - png_write_sig(png_ptr); + /* Write PNG signature */ + png_write_sig(png_ptr); #ifdef PNG_MNG_FEATURES_SUPPORTED - if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \ - (png_ptr->mng_features_permitted)) - { - png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); - png_ptr->mng_features_permitted = 0; - } + if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \ + (png_ptr->mng_features_permitted)) + { + png_warning(png_ptr, + "MNG features are not allowed in a PNG datastream"); + png_ptr->mng_features_permitted = 0; + } #endif - /* Write IHDR information. */ - png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, - info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, - info_ptr->filter_type, + /* Write IHDR information. */ + png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, + info_ptr->bit_depth, info_ptr->color_type, + info_ptr->compression_type, info_ptr->filter_type, #ifdef PNG_WRITE_INTERLACING_SUPPORTED - info_ptr->interlace_type); + info_ptr->interlace_type #else - 0); + 0 #endif - /* The rest of these check to see if the valid field has the appropriate - * flag set, and if it does, writes the chunk. - */ + ); + /* The rest of these check to see if the valid field has the appropriate + * flag set, and if it does, writes the chunk. + */ #ifdef PNG_WRITE_gAMA_SUPPORTED - if (info_ptr->valid & PNG_INFO_gAMA) - png_write_gAMA_fixed(png_ptr, info_ptr->gamma); + if (info_ptr->valid & PNG_INFO_gAMA) + png_write_gAMA_fixed(png_ptr, info_ptr->gamma); #endif #ifdef PNG_WRITE_sRGB_SUPPORTED - if (info_ptr->valid & PNG_INFO_sRGB) - png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); + if (info_ptr->valid & PNG_INFO_sRGB) + png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); #endif #ifdef PNG_WRITE_iCCP_SUPPORTED - if (info_ptr->valid & PNG_INFO_iCCP) - png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, - (png_charp)info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); + if (info_ptr->valid & PNG_INFO_iCCP) + png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, + (png_charp)info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); #endif #ifdef PNG_WRITE_sBIT_SUPPORTED - if (info_ptr->valid & PNG_INFO_sBIT) - png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); + if (info_ptr->valid & PNG_INFO_sBIT) + png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); #endif #ifdef PNG_WRITE_cHRM_SUPPORTED - if (info_ptr->valid & PNG_INFO_cHRM) - png_write_cHRM_fixed(png_ptr, - info_ptr->x_white, info_ptr->y_white, - info_ptr->x_red, info_ptr->y_red, - info_ptr->x_green, info_ptr->y_green, - info_ptr->x_blue, info_ptr->y_blue); + if (info_ptr->valid & PNG_INFO_cHRM) + png_write_cHRM_fixed(png_ptr, + info_ptr->x_white, info_ptr->y_white, + info_ptr->x_red, info_ptr->y_red, + info_ptr->x_green, info_ptr->y_green, + info_ptr->x_blue, info_ptr->y_blue); #endif #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - if (info_ptr->unknown_chunks_num) - { - png_unknown_chunk *up; - - png_debug(5, "writing extra chunks"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - up++) + if (info_ptr->unknown_chunks_num) { - int keep = png_handle_as_unknown(png_ptr, up->name); + png_unknown_chunk *up; - if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && - !(up->location & PNG_HAVE_PLTE) && - !(up->location & PNG_HAVE_IDAT) && - !(up->location & PNG_AFTER_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + png_debug(5, "writing extra chunks"); + + for (up = info_ptr->unknown_chunks; + up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; + up++) { - if (up->size == 0) - png_warning(png_ptr, "Writing zero-length unknown chunk"); + int keep = png_handle_as_unknown(png_ptr, up->name); - png_write_chunk(png_ptr, up->name, up->data, up->size); + if (keep != PNG_HANDLE_CHUNK_NEVER && + up->location && + !(up->location & PNG_HAVE_PLTE) && + !(up->location & PNG_HAVE_IDAT) && + !(up->location & PNG_AFTER_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + { + if (up->size == 0) + png_warning(png_ptr, "Writing zero-length unknown chunk"); + + png_write_chunk(png_ptr, up->name, up->data, up->size); + } } } - } #endif png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; } @@ -223,11 +225,14 @@ png_write_info(png_structp png_ptr, png_infop info_ptr) info_ptr->text[i].lang, info_ptr->text[i].lang_key, info_ptr->text[i].text); + /* Mark this chunk as written */ + if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + else + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; #else - png_warning(png_ptr, "Unable to write international text"); + png_warning(png_ptr, "Unable to write international text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } /* If we want a compressed text chunk */ @@ -238,11 +243,11 @@ png_write_info(png_structp png_ptr, png_infop info_ptr) png_write_zTXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0, info_ptr->text[i].compression); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; #else png_warning(png_ptr, "Unable to write compressed text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) @@ -340,11 +345,11 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) info_ptr->text[i].lang, info_ptr->text[i].lang_key, info_ptr->text[i].text); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; #else png_warning(png_ptr, "Unable to write international text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) @@ -354,11 +359,11 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) png_write_zTXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0, info_ptr->text[i].compression); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; #else png_warning(png_ptr, "Unable to write compressed text"); #endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) @@ -367,12 +372,11 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) /* Write uncompressed chunk */ png_write_tEXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; #else png_warning(png_ptr, "Unable to write uncompressed text"); #endif - - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } } #endif @@ -420,7 +424,6 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) } #ifdef PNG_CONVERT_tIME_SUPPORTED -/* "tm" structure is not supported on WindowsCE */ void PNGAPI png_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm FAR * ttime) { @@ -456,9 +459,6 @@ png_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr, warn_fn, NULL, NULL, NULL)); } -/* Alternate initialize png_ptr structure, and allocate any memory needed */ -static void png_reset_filter_heuristics(png_structp png_ptr); /* forward decl */ - PNG_FUNCTION(png_structp,PNGAPI png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, @@ -500,14 +500,13 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, */ #ifdef USE_FAR_KEYWORD if (setjmp(tmp_jmpbuf)) + png_memcpy(png_jmpbuf(png_ptr), tmp_jmpbuf, png_sizeof(jmp_buf)); + PNG_ABORT(); #else if (setjmp(png_jmpbuf(png_ptr))) /* sets longjmp to match setjmp */ -#endif -#ifdef USE_FAR_KEYWORD - png_memcpy(png_jmpbuf(png_ptr), tmp_jmpbuf, png_sizeof(jmp_buf)); -#endif PNG_ABORT(); #endif +#endif #ifdef PNG_USER_MEM_SUPPORTED png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); @@ -520,7 +519,7 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, /* Initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; - if (!png_cleanup_needed) + if (png_cleanup_needed == 0) { png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr, png_ptr->zbuf_size); @@ -528,7 +527,7 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_cleanup_needed = 1; } - if (png_cleanup_needed) + if (png_cleanup_needed != 0) { /* Clean up PNG structure and deallocate any memory. */ png_free(png_ptr, png_ptr->zbuf); @@ -544,10 +543,6 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_set_write_fn(png_ptr, NULL, NULL, NULL); -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - png_reset_filter_heuristics(png_ptr); -#endif - return (png_ptr); } @@ -764,7 +759,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row) { png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass); /* This should always get caught above, but still ... */ - if (!(row_info.width)) + if (row_info.width == 0) { png_write_finish_row(png_ptr); return; @@ -864,7 +859,7 @@ png_write_flush(png_structp png_ptr) png_error(png_ptr, "zlib error"); } - if (!(png_ptr->zstream.avail_out)) + if ((png_ptr->zstream.avail_out) == 0) { /* Write the IDAT and reset the zlib output buffer */ png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); @@ -982,13 +977,6 @@ png_write_destroy(png_structp png_ptr) png_free(png_ptr, png_ptr->paeth_row); #endif -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - /* Use this to save a little code space, it doesn't free the filter_costs */ - png_reset_filter_heuristics(png_ptr); - png_free(png_ptr, png_ptr->filter_costs); - png_free(png_ptr, png_ptr->inv_filter_costs); -#endif - #ifdef PNG_SETJMP_SUPPORTED /* Reset structure */ png_memcpy(tmp_jmp, png_ptr->longjmp_buffer, png_sizeof(jmp_buf)); @@ -1042,6 +1030,7 @@ png_set_filter(png_structp png_ptr, int method, int filters) case 5: case 6: case 7: png_warning(png_ptr, "Unknown row filter for method 0"); + /* FALL THROUGH */ #endif /* PNG_WRITE_FILTER_SUPPORTED */ case PNG_FILTER_VALUE_NONE: png_ptr->do_filter = PNG_FILTER_NONE; break; @@ -1078,6 +1067,7 @@ png_set_filter(png_structp png_ptr, int method, int filters) */ if (png_ptr->row_buf != NULL) { + png_ptr->do_filter = PNG_FILTER_NONE; #ifdef PNG_WRITE_FILTER_SUPPORTED if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) { @@ -1138,8 +1128,8 @@ png_set_filter(png_structp png_ptr, int method, int filters) } if (png_ptr->do_filter == PNG_NO_FILTERS) -#endif /* PNG_WRITE_FILTER_SUPPORTED */ png_ptr->do_filter = PNG_FILTER_NONE; +#endif /* PNG_WRITE_FILTER_SUPPORTED */ } } else @@ -1153,122 +1143,7 @@ png_set_filter(png_structp png_ptr, int method, int filters) * filtered data going to zlib more consistent, hopefully resulting in * better compression. */ -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */ -/* Convenience reset API. */ -static void -png_reset_filter_heuristics(png_structp png_ptr) -{ - /* Clear out any old values in the 'weights' - this must be done because if - * the app calls set_filter_heuristics multiple times with different - * 'num_weights' values we would otherwise potentially have wrong sized - * arrays. - */ - png_ptr->num_prev_filters = 0; - png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; - if (png_ptr->prev_filters != NULL) - { - png_bytep old = png_ptr->prev_filters; - png_ptr->prev_filters = NULL; - png_free(png_ptr, old); - } - if (png_ptr->filter_weights != NULL) - { - png_uint_16p old = png_ptr->filter_weights; - png_ptr->filter_weights = NULL; - png_free(png_ptr, old); - } - - if (png_ptr->inv_filter_weights != NULL) - { - png_uint_16p old = png_ptr->inv_filter_weights; - png_ptr->inv_filter_weights = NULL; - png_free(png_ptr, old); - } - - /* Leave the filter_costs - this array is fixed size. */ -} - -static int -png_init_filter_heuristics(png_structp png_ptr, int heuristic_method, - int num_weights) -{ - if (png_ptr == NULL) - return 0; - - /* Clear out the arrays */ - png_reset_filter_heuristics(png_ptr); - - /* Check arguments; the 'reset' function makes the correct settings for the - * unweighted case, but we must handle the weight case by initializing the - * arrays for the caller. - */ - if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int i; - - if (num_weights > 0) - { - png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_byte) * num_weights)); - - /* To make sure that the weighting starts out fairly */ - for (i = 0; i < num_weights; i++) - { - png_ptr->prev_filters[i] = 255; - } - - png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); - - png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); - - for (i = 0; i < num_weights; i++) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - - /* Safe to set this now */ - png_ptr->num_prev_filters = (png_byte)num_weights; - } - - /* If, in the future, there are other filter methods, this would - * need to be based on png_ptr->filter. - */ - if (png_ptr->filter_costs == NULL) - { - png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); - - png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); - } - - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) - { - png_ptr->inv_filter_costs[i] = - png_ptr->filter_costs[i] = PNG_COST_FACTOR; - } - - /* All the arrays are inited, safe to set this: */ - png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED; - - /* Return the 'ok' code. */ - return 1; - } - else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT || - heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) - { - return 1; - } - else - { - png_warning(png_ptr, "Unknown filter heuristic method"); - return 0; - } -} - +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */ /* Provide floating and fixed point APIs */ #ifdef PNG_FLOATING_POINT_SUPPORTED void PNGAPI @@ -1276,52 +1151,11 @@ png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, int num_weights, png_const_doublep filter_weights, png_const_doublep filter_costs) { - png_debug(1, "in png_set_filter_heuristics"); - - /* The internal API allocates all the arrays and ensures that the elements of - * those arrays are set to the default value. - */ - if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) - return; - - /* If using the weighted method copy in the weights. */ - if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int i; - for (i = 0; i < num_weights; i++) - { - if (filter_weights[i] <= 0.0) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - - else - { - png_ptr->inv_filter_weights[i] = - (png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5); - - png_ptr->filter_weights[i] = - (png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5); - } - } - - /* Here is where we set the relative costs of the different filters. We - * should take the desired compression level into account when setting - * the costs, so that Paeth, for instance, has a high relative cost at low - * compression levels, while it has a lower relative cost at higher - * compression settings. The filter types are in order of increasing - * relative cost, so it would be possible to do this with an algorithm. - */ - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0) - { - png_ptr->inv_filter_costs[i] = - (png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5); - - png_ptr->filter_costs[i] = - (png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5); - } - } + PNG_UNUSED(png_ptr) + PNG_UNUSED(heuristic_method) + PNG_UNUSED(num_weights) + PNG_UNUSED(filter_weights) + PNG_UNUSED(filter_costs) } #endif /* FLOATING_POINT */ @@ -1331,67 +1165,16 @@ png_set_filter_heuristics_fixed(png_structp png_ptr, int heuristic_method, int num_weights, png_const_fixed_point_p filter_weights, png_const_fixed_point_p filter_costs) { - png_debug(1, "in png_set_filter_heuristics_fixed"); - - /* The internal API allocates all the arrays and ensures that the elements of - * those arrays are set to the default value. - */ - if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) - return; - - /* If using the weighted method copy in the weights. */ - if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int i; - for (i = 0; i < num_weights; i++) - { - if (filter_weights[i] <= 0) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - - else - { - png_ptr->inv_filter_weights[i] = (png_uint_16) - ((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1); - - png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR* - PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]); - } - } - - /* Here is where we set the relative costs of the different filters. We - * should take the desired compression level into account when setting - * the costs, so that Paeth, for instance, has a high relative cost at low - * compression levels, while it has a lower relative cost at higher - * compression settings. The filter types are in order of increasing - * relative cost, so it would be possible to do this with an algorithm. - */ - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) - if (filter_costs[i] >= PNG_FP_1) - { - png_uint_32 tmp; - - /* Use a 32 bit unsigned temporary here because otherwise the - * intermediate value will be a 32 bit *signed* integer (ANSI rules) - * and this will get the wrong answer on division. - */ - tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2); - tmp /= filter_costs[i]; - - png_ptr->inv_filter_costs[i] = (png_uint_16)tmp; - - tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF; - tmp /= PNG_FP_1; - - png_ptr->filter_costs[i] = (png_uint_16)tmp; - } - } + PNG_UNUSED(png_ptr) + PNG_UNUSED(heuristic_method) + PNG_UNUSED(num_weights) + PNG_UNUSED(filter_weights) + PNG_UNUSED(filter_costs) } #endif /* FIXED_POINT */ -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ +#endif /* WRITE_WEIGHTED_FILTER */ +#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED void PNGAPI png_set_compression_level(png_structp png_ptr, int level) { @@ -1470,6 +1253,7 @@ png_set_compression_method(png_structp png_ptr, int method) png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; png_ptr->zlib_method = method; } +#endif /* WRITE_CUSTOMIZE_COMPRESSION */ /* The following were added to libpng-1.5.4 */ #ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED @@ -1527,10 +1311,10 @@ png_set_text_compression_window_bits(png_structp png_ptr, int window_bits) #ifndef WBITS_8_OK /* Avoid libpng bug with 256-byte windows */ if (window_bits == 8) - { - png_warning(png_ptr, "Text compression window is being reset to 512"); - window_bits = 9; - } + { + png_warning(png_ptr, "Text compression window is being reset to 512"); + window_bits = 9; + } #endif png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS; diff --git a/3rdparty/libpng/pngwtran.c b/3rdparty/libpng/pngwtran.c index 96608efcb4..24c436ffe4 100644 --- a/3rdparty/libpng/pngwtran.c +++ b/3rdparty/libpng/pngwtran.c @@ -1,8 +1,8 @@ /* pngwtran.c - transforms the data in a row for PNG writers * - * Last changed in libpng 1.5.6 [November 3, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2002,2004,2006-2012 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -45,8 +45,20 @@ png_do_write_transformations(png_structp png_ptr, png_row_infop row_info) #ifdef PNG_WRITE_FILLER_SUPPORTED if (png_ptr->transformations & PNG_FILLER) - png_do_strip_channel(row_info, png_ptr->row_buf + 1, - !(png_ptr->flags & PNG_FLAG_FILLER_AFTER)); + { + if (png_ptr->color_type & (PNG_COLOR_MASK_ALPHA|PNG_COLOR_MASK_PALETTE)) + { + /* GA, RGBA or palette; in any of these cases libpng will not do the + * the correct thing (whatever that might be). + */ + png_warning(png_ptr, "incorrect png_set_filler call ignored"); + png_ptr->transformations &= ~PNG_FILLER; + } + + else + png_do_strip_channel(row_info, png_ptr->row_buf + 1, + !(png_ptr->flags & PNG_FLAG_FILLER_AFTER)); + } #endif #ifdef PNG_WRITE_PACKSWAP_SUPPORTED diff --git a/3rdparty/libpng/pngwutil.c b/3rdparty/libpng/pngwutil.c index b49704f1a5..d5f097fb97 100644 --- a/3rdparty/libpng/pngwutil.c +++ b/3rdparty/libpng/pngwutil.c @@ -1,8 +1,8 @@ /* pngwutil.c - utilities to write a PNG file * - * Last changed in libpng 1.5.10 [March 8, 2012] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Last changed in libpng 1.5.26 [December 17, 2015] + * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -30,19 +30,20 @@ png_save_uint_32(png_bytep buf, png_uint_32 i) } #ifdef PNG_SAVE_INT_32_SUPPORTED -/* The png_save_int_32 function assumes integers are stored in two's - * complement format. If this isn't the case, then this routine needs to - * be modified to write data in two's complement format. Note that, - * the following works correctly even if png_int_32 has more than 32 bits - * (compare the more complex code required on read for sign extention.) +/* PNG signed integers are saved in 32-bit 2's complement format. ANSI C-90 + * defines a cast of a signed integer to an unsigned integer either to preserve + * the value, if it is positive, or to calculate: + * + * (UNSIGNED_MAX+1) + integer + * + * Where UNSIGNED_MAX is the appropriate maximum unsigned value, so when the + * negative integral value is added the result will be an unsigned value + * correspnding to the 2's complement representation. */ void PNGAPI png_save_int_32(png_bytep buf, png_int_32 i) { - buf[0] = (png_byte)((i >> 24) & 0xff); - buf[1] = (png_byte)((i >> 16) & 0xff); - buf[2] = (png_byte)((i >> 8) & 0xff); - buf[3] = (png_byte)(i & 0xff); + png_save_uint_32(buf, i); } #endif @@ -315,6 +316,7 @@ png_zlib_release(png_structp png_ptr) if (ret != Z_OK) { +#ifdef PNG_WARNINGS_SUPPORTED png_const_charp err; PNG_WARNING_PARAMETERS(p) @@ -349,6 +351,7 @@ png_zlib_release(png_structp png_ptr) png_formatted_warning(png_ptr, p, "zlib failed to reset compressor: @1(@2): @3"); +#endif } } @@ -460,24 +463,21 @@ png_text_compress(png_structp png_ptr, old_ptr = comp->output_ptr; comp->output_ptr = (png_bytepp)png_malloc(png_ptr, - (png_alloc_size_t) - (comp->max_output_ptr * png_sizeof(png_charpp))); + (comp->max_output_ptr * png_sizeof(png_bytep))); png_memcpy(comp->output_ptr, old_ptr, old_max - * png_sizeof(png_charp)); + * png_sizeof(png_bytep)); png_free(png_ptr, old_ptr); } else comp->output_ptr = (png_bytepp)png_malloc(png_ptr, - (png_alloc_size_t) - (comp->max_output_ptr * png_sizeof(png_charp))); + (comp->max_output_ptr * png_sizeof(png_bytep))); } /* Save the data */ comp->output_ptr[comp->num_output_ptr] = - (png_bytep)png_malloc(png_ptr, - (png_alloc_size_t)png_ptr->zbuf_size); + (png_bytep)png_malloc(png_ptr, png_ptr->zbuf_size); png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, png_ptr->zbuf_size); @@ -826,7 +826,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; - if (!(png_ptr->do_filter)) + if ((png_ptr->do_filter) == PNG_NO_FILTERS) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || png_ptr->bit_depth < 8) @@ -896,17 +896,20 @@ void /* PRIVATE */ png_write_PLTE(png_structp png_ptr, png_const_colorp palette, png_uint_32 num_pal) { - png_uint_32 i; + png_uint_32 max_palette_length, i; png_const_colorp pal_ptr; png_byte buf[3]; png_debug(1, "in png_write_PLTE"); + max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ? + (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH; + if (( #ifdef PNG_MNG_FEATURES_SUPPORTED !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && #endif - num_pal == 0) || num_pal > 256) + num_pal == 0) || num_pal > max_palette_length) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { @@ -1096,7 +1099,6 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, png_const_charp profile, int profile_len) { png_size_t name_len; - png_charp new_name; compression_state comp; int embedded_profile_len = 0; @@ -1108,8 +1110,7 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, comp.input = NULL; comp.input_len = 0; - if ((name_len = png_check_keyword(png_ptr, name, &new_name)) == 0) - return; + name_len = png_strlen(name); if (compression_type != PNG_COMPRESSION_TYPE_BASE) png_warning(png_ptr, "Unknown compression type in iCCP chunk"); @@ -1128,8 +1129,6 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, { png_warning(png_ptr, "Embedded profile length in iCCP chunk is negative"); - - png_free(png_ptr, new_name); return; } @@ -1137,8 +1136,6 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, { png_warning(png_ptr, "Embedded profile length too large in iCCP chunk"); - - png_free(png_ptr, new_name); return; } @@ -1150,7 +1147,7 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, profile_len = embedded_profile_len; } - if (profile_len) + if (profile_len != 0) profile_len = png_text_compress(png_ptr, profile, (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp); @@ -1158,18 +1155,21 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, png_write_chunk_header(png_ptr, png_iCCP, (png_uint_32)(name_len + profile_len + 2)); - new_name[name_len + 1] = 0x00; + png_write_chunk_data(png_ptr, (png_bytep)name, name_len); - png_write_chunk_data(png_ptr, (png_bytep)new_name, - (png_size_t)(name_len + 2)); + { + png_byte buffer[2]; + buffer[0] = 0; /* terminate name */ + buffer[1] = 0xFFU & compression_type; + png_write_chunk_data(png_ptr, buffer, 2); + } - if (profile_len) + if (profile_len != 0) { png_write_compressed_data_out(png_ptr, &comp, profile_len); } png_write_chunk_end(png_ptr); - png_free(png_ptr, new_name); } #endif @@ -1179,7 +1179,6 @@ void /* PRIVATE */ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette) { png_size_t name_len; - png_charp new_name; png_byte entrybuf[10]; png_size_t entry_size = (spalette->depth == 8 ? 6 : 10); png_size_t palette_size = entry_size * spalette->nentries; @@ -1190,14 +1189,13 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette) png_debug(1, "in png_write_sPLT"); - if ((name_len = png_check_keyword(png_ptr,spalette->name, &new_name))==0) - return; + name_len = png_strlen(spalette->name); /* Make sure we include the NULL after the name */ png_write_chunk_header(png_ptr, png_sPLT, (png_uint_32)(name_len + 2 + palette_size)); - png_write_chunk_data(png_ptr, (png_bytep)new_name, + png_write_chunk_data(png_ptr, (png_bytep)spalette->name, (png_size_t)(name_len + 1)); png_write_chunk_data(png_ptr, &spalette->depth, (png_size_t)1); @@ -1253,7 +1251,6 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette) #endif png_write_chunk_end(png_ptr); - png_free(png_ptr, new_name); } #endif @@ -1370,7 +1367,8 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha, } /* Write the chunk out as it is */ - png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans); + png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha, + (png_size_t)num_trans); } else if (color_type == PNG_COLOR_TYPE_GRAY) @@ -1508,138 +1506,6 @@ png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist) } #endif -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ - defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) -/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification, - * and if invalid, correct the keyword rather than discarding the entire - * chunk. The PNG 1.0 specification requires keywords 1-79 characters in - * length, forbids leading or trailing whitespace, multiple internal spaces, - * and the non-break space (0x80) from ISO 8859-1. Returns keyword length. - * - * The new_key is allocated to hold the corrected keyword and must be freed - * by the calling routine. This avoids problems with trying to write to - * static keywords without having to have duplicate copies of the strings. - */ -png_size_t /* PRIVATE */ -png_check_keyword(png_structp png_ptr, png_const_charp key, png_charpp new_key) -{ - png_size_t key_len; - png_const_charp ikp; - png_charp kp, dp; - int kflag; - int kwarn=0; - - png_debug(1, "in png_check_keyword"); - - *new_key = NULL; - - if (key == NULL || (key_len = png_strlen(key)) == 0) - { - png_warning(png_ptr, "zero length keyword"); - return ((png_size_t)0); - } - - png_debug1(2, "Keyword to be checked is '%s'", key); - - *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2)); - - if (*new_key == NULL) - { - png_warning(png_ptr, "Out of memory while procesing keyword"); - return ((png_size_t)0); - } - - /* Replace non-printing characters with a blank and print a warning */ - for (ikp = key, dp = *new_key; *ikp != '\0'; ikp++, dp++) - { - if ((png_byte)*ikp < 0x20 || - ((png_byte)*ikp > 0x7E && (png_byte)*ikp < 0xA1)) - { - PNG_WARNING_PARAMETERS(p) - - png_warning_parameter_unsigned(p, 1, PNG_NUMBER_FORMAT_02x, - (png_byte)*ikp); - png_formatted_warning(png_ptr, p, "invalid keyword character 0x@1"); - *dp = ' '; - } - - else - { - *dp = *ikp; - } - } - *dp = '\0'; - - /* Remove any trailing white space. */ - kp = *new_key + key_len - 1; - if (*kp == ' ') - { - png_warning(png_ptr, "trailing spaces removed from keyword"); - - while (*kp == ' ') - { - *(kp--) = '\0'; - key_len--; - } - } - - /* Remove any leading white space. */ - kp = *new_key; - if (*kp == ' ') - { - png_warning(png_ptr, "leading spaces removed from keyword"); - - while (*kp == ' ') - { - kp++; - key_len--; - } - } - - png_debug1(2, "Checking for multiple internal spaces in '%s'", kp); - - /* Remove multiple internal spaces. */ - for (kflag = 0, dp = *new_key; *kp != '\0'; kp++) - { - if (*kp == ' ' && kflag == 0) - { - *(dp++) = *kp; - kflag = 1; - } - - else if (*kp == ' ') - { - key_len--; - kwarn = 1; - } - - else - { - *(dp++) = *kp; - kflag = 0; - } - } - *dp = '\0'; - if (kwarn) - png_warning(png_ptr, "extra interior spaces removed from keyword"); - - if (key_len == 0) - { - png_free(png_ptr, *new_key); - png_warning(png_ptr, "Zero length keyword"); - } - - if (key_len > 79) - { - png_warning(png_ptr, "keyword length must be 1 - 79 characters"); - (*new_key)[79] = '\0'; - key_len = 79; - } - - return (key_len); -} -#endif - #ifdef PNG_WRITE_tEXt_SUPPORTED /* Write a tEXt chunk */ void /* PRIVATE */ @@ -1647,12 +1513,10 @@ png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text, png_size_t text_len) { png_size_t key_len; - png_charp new_key; png_debug(1, "in png_write_tEXt"); - if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0) - return; + key_len = strlen(key); if (text == NULL || *text == '\0') text_len = 0; @@ -1669,15 +1533,14 @@ png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text, * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. */ - png_write_chunk_data(png_ptr, (png_bytep)new_key, + png_write_chunk_data(png_ptr, (png_bytep)key, (png_size_t)(key_len + 1)); - if (text_len) + if (text_len != 0) png_write_chunk_data(png_ptr, (png_const_bytep)text, (png_size_t)text_len); png_write_chunk_end(png_ptr); - png_free(png_ptr, new_key); } #endif @@ -1689,7 +1552,6 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text, { png_size_t key_len; png_byte buf; - png_charp new_key; compression_state comp; png_debug(1, "in png_write_zTXt"); @@ -1700,16 +1562,11 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text, comp.input = NULL; comp.input_len = 0; - if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0) - { - png_free(png_ptr, new_key); - return; - } + key_len = strlen(key); if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE) { - png_write_tEXt(png_ptr, new_key, text, (png_size_t)0); - png_free(png_ptr, new_key); + png_write_tEXt(png_ptr, key, text, (png_size_t)0); return; } @@ -1724,11 +1581,9 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text, (png_uint_32)(key_len+text_len + 2)); /* Write key */ - png_write_chunk_data(png_ptr, (png_bytep)new_key, + png_write_chunk_data(png_ptr, (png_bytep)key, (png_size_t)(key_len + 1)); - png_free(png_ptr, new_key); - buf = (png_byte)compression; /* Write compression */ @@ -1749,8 +1604,6 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, png_const_charp lang, png_const_charp lang_key, png_const_charp text) { png_size_t lang_len, key_len, lang_key_len, text_len; - png_charp new_lang; - png_charp new_key = NULL; png_byte cbuf[2]; compression_state comp; @@ -1761,15 +1614,13 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, comp.output_ptr = NULL; comp.input = NULL; - if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0) - return; + key_len = png_strlen(key); - if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang)) == 0) - { - png_warning(png_ptr, "Empty language field in iTXt chunk"); - new_lang = NULL; + if (lang == NULL) lang_len = 0; - } + + else + lang_len = png_strlen(lang); if (lang_key == NULL) lang_key_len = 0; @@ -1804,7 +1655,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. */ - png_write_chunk_data(png_ptr, (png_bytep)new_key, (png_size_t)(key_len + 1)); + png_write_chunk_data(png_ptr, (png_bytep)key, (png_size_t)(key_len + 1)); /* Set the compression flag */ if (compression == PNG_ITXT_COMPRESSION_NONE || @@ -1820,7 +1671,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, png_write_chunk_data(png_ptr, cbuf, (png_size_t)2); cbuf[0] = 0; - png_write_chunk_data(png_ptr, (new_lang ? (png_const_bytep)new_lang : cbuf), + png_write_chunk_data(png_ptr, (lang ? (png_const_bytep)lang : cbuf), (png_size_t)(lang_len + 1)); png_write_chunk_data(png_ptr, (lang_key ? (png_const_bytep)lang_key : cbuf), @@ -1829,9 +1680,6 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, png_write_compressed_data_out(png_ptr, &comp, text_len); png_write_chunk_end(png_ptr); - - png_free(png_ptr, new_key); - png_free(png_ptr, new_lang); } #endif @@ -1865,7 +1713,6 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, png_size_t purpose_len, units_len, total_len; png_size_tp params_len; png_byte buf[10]; - png_charp new_purpose; int i; png_debug1(1, "in png_write_pCAL (%d parameters)", nparams); @@ -1873,7 +1720,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, if (type >= PNG_EQUATION_LAST) png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); - purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1; + purpose_len = strlen(purpose) + 1; png_debug1(3, "pCAL purpose length = %d", (int)purpose_len); units_len = png_strlen(units) + (nparams == 0 ? 0 : 1); png_debug1(3, "pCAL units length = %d", (int)units_len); @@ -1895,7 +1742,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, png_debug1(3, "pCAL total length = %d", (int)total_len); png_write_chunk_header(png_ptr, png_pCAL, (png_uint_32)total_len); - png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose, purpose_len); + png_write_chunk_data(png_ptr, (png_const_bytep)purpose, purpose_len); png_save_int_32(buf, X0); png_save_int_32(buf + 4, X1); buf[8] = (png_byte)type; @@ -1903,8 +1750,6 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, png_write_chunk_data(png_ptr, buf, (png_size_t)10); png_write_chunk_data(png_ptr, (png_const_bytep)units, (png_size_t)units_len); - png_free(png_ptr, new_purpose); - for (i = 0; i < nparams; i++) { png_write_chunk_data(png_ptr, (png_const_bytep)params[i], params_len[i]); @@ -2429,20 +2274,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) png_uint_32 mins, bpp; png_byte filter_to_do = png_ptr->do_filter; png_size_t row_bytes = row_info->rowbytes; -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - int num_p_filters = png_ptr->num_prev_filters; -#endif png_debug(1, "in png_write_find_filter"); -#ifndef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->row_number == 0 && filter_to_do == PNG_ALL_FILTERS) - { - /* These will never be selected so we need not test them. */ - filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH); - } -#endif - /* Find out how many bytes offset each pixel is */ bpp = (row_info->pixel_depth + 7) >> 3; @@ -2494,44 +2328,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) sum += (v < 128) ? v : 256 - v; } -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - png_uint_32 sumhi, sumlo; - int j; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */ - - /* Reduce the sum if we match any of the previous rows */ - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - /* Factor in the cost of this filter (this is here for completeness, - * but it makes no sense to have a "cost" for the NONE filter, as - * it has the minimum possible computational cost - none). - */ - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif mins = sum; } @@ -2564,44 +2360,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) png_size_t i; int v; -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - /* We temporarily increase the "minimum sum" by the factor we - * would reduce the sum of this filter, so that we can do the - * early exit comparison without scaling the sum each time. - */ - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; i++, rp++, dp++) { @@ -2621,40 +2379,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) break; } -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) - { - sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - if (sum < mins) { mins = sum; @@ -2685,41 +2409,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) png_size_t i; int v; - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, pp = prev_row + 1; i < row_bytes; i++) { @@ -2731,40 +2420,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) break; } -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - if (sum < mins) { mins = sum; @@ -2799,40 +2454,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) png_size_t i; int v; -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, pp = prev_row + 1; i < bpp; i++) { @@ -2852,40 +2473,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) break; } -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - if (sum < mins) { mins = sum; @@ -2940,40 +2527,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) png_size_t i; int v; -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, pp = prev_row + 1; i < bpp; i++) { @@ -3027,40 +2580,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) break; } -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - if (sum < mins) { best_row = png_ptr->paeth_row; @@ -3070,26 +2589,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) /* Do the actual writing of the filtered row data from the chosen filter. */ png_write_filtered_row(png_ptr, best_row, row_info->rowbytes+1); - -#ifdef PNG_WRITE_FILTER_SUPPORTED -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - /* Save the type of filter we picked this time for future calculations */ - if (png_ptr->num_prev_filters > 0) - { - int j; - - for (j = 1; j < num_p_filters; j++) - { - png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; - } - - png_ptr->prev_filters[j] = best_row[0]; - } -#endif -#endif /* PNG_WRITE_FILTER_SUPPORTED */ } - /* Do the actual writing of a previously filtered row. */ static void png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row, diff --git a/3rdparty/readme.txt b/3rdparty/readme.txt index ca46fbd576..3c2e078497 100644 --- a/3rdparty/readme.txt +++ b/3rdparty/readme.txt @@ -14,8 +14,8 @@ libjpeg 8d (8.4) - The Independent JPEG Group's JPEG software. HAVE_JPEG preprocessor flag must be set to make highgui use libjpeg. On UNIX systems configure script takes care of it. ------------------------------------------------------------------------------------ -libpng 1.5.12 - Portable Network Graphics library. - Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson. +libpng - Portable Network Graphics library. + The license and copyright notes can be found in libpng/LICENSE. See libpng home page http://www.libpng.org for details and links to the source code From 7c64e03cc9a47f09cc441a9514483c246b4b4574 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 29 Jun 2016 12:42:57 +0300 Subject: [PATCH 13/96] libpng: re-apply patch --- 3rdparty/libpng/opencv-libpng.patch | 6 +++--- 3rdparty/libpng/pngpriv.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/3rdparty/libpng/opencv-libpng.patch b/3rdparty/libpng/opencv-libpng.patch index 6ca96392a0..75a6d3121b 100644 --- a/3rdparty/libpng/opencv-libpng.patch +++ b/3rdparty/libpng/opencv-libpng.patch @@ -1,8 +1,8 @@ diff --git a/3rdparty/libpng/pngpriv.h b/3rdparty/libpng/pngpriv.h -index 07b2b0b..e7824b8 100644 +index 8bdcccc..0f1c638 100644 --- a/3rdparty/libpng/pngpriv.h +++ b/3rdparty/libpng/pngpriv.h -@@ -360,7 +360,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; +@@ -372,7 +372,7 @@ /* Memory model/platform independent fns */ #ifndef PNG_ABORT @@ -11,7 +11,7 @@ index 07b2b0b..e7824b8 100644 # define PNG_ABORT() ExitProcess(0) # else # define PNG_ABORT() abort() -@@ -378,7 +378,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; +@@ -390,7 +390,7 @@ # define png_memcpy _fmemcpy # define png_memset _fmemset #else diff --git a/3rdparty/libpng/pngpriv.h b/3rdparty/libpng/pngpriv.h index 8bdccccafb..0f1c638e57 100644 --- a/3rdparty/libpng/pngpriv.h +++ b/3rdparty/libpng/pngpriv.h @@ -372,7 +372,7 @@ /* Memory model/platform independent fns */ #ifndef PNG_ABORT -# ifdef _WINDOWS_ +# if defined(_WINDOWS_) && !defined(HAVE_WINRT) # define PNG_ABORT() ExitProcess(0) # else # define PNG_ABORT() abort() @@ -390,7 +390,7 @@ # define png_memcpy _fmemcpy # define png_memset _fmemset #else -# ifdef _WINDOWS_ /* Favor Windows over C runtime fns */ +# if defined(_WINDOWS_) && !defined(HAVE_WINRT) /* Favor Windows over C runtime fns */ # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # define png_strlen lstrlenA From babaa00ac11e84a4e7932a72a69c7667f7fea725 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 29 Jun 2016 13:18:17 +0300 Subject: [PATCH 14/96] libpng: fix NEON --- 3rdparty/libpng/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/3rdparty/libpng/CMakeLists.txt b/3rdparty/libpng/CMakeLists.txt index 76ead5d1dd..bd243c34a4 100644 --- a/3rdparty/libpng/CMakeLists.txt +++ b/3rdparty/libpng/CMakeLists.txt @@ -3,7 +3,7 @@ # # ---------------------------------------------------------------------------- -if(NEON) +if(ARM AND ENABLE_NEON AND NOT AARCH64) project(${PNG_LIBRARY} ASM) else() project(${PNG_LIBRARY}) @@ -14,9 +14,11 @@ ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" ${ZLIB_INCLUDE_DIR}) file(GLOB lib_srcs *.c) file(GLOB lib_hdrs *.h) -if(ARM AND NEON) +if(ARM AND ENABLE_NEON AND NOT AARCH64) list(APPEND lib_srcs arm/filter_neon.S arm/arm_init.c) - add_definitions(-DPNG_ARM_NEON) + add_definitions(-DPNG_ARM_NEON_OPT=2) +else() + add_definitions(-DPNG_ARM_NEON_OPT=0) endif() # ---------------------------------------------------------------------------------- From f29fd63f13d9b5995d8e250673132a27f0659e9b Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Fri, 13 May 2016 10:41:06 +0300 Subject: [PATCH 15/96] Enabled build with LLVM libc++ for Android. --- modules/core/include/opencv2/core/operations.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 0ae51c6939..7127f0ce4b 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -46,9 +46,9 @@ #ifndef SKIP_INCLUDES #include #include + #include #endif // SKIP_INCLUDES - #ifdef __cplusplus /////// exchange-add operation for atomic operations on reference counters /////// @@ -66,7 +66,7 @@ #if !(defined WIN32 || defined _WIN32) && (defined __i486__ || defined __i586__ || \ defined __i686__ || defined __MMX__ || defined __SSE__ || defined __ppc__) || \ - (defined __GNUC__ && defined _STLPORT_MAJOR) || \ + defined _STLPORT_MAJOR || defined _LIBCPP_VERSION || \ defined __EMSCRIPTEN__ #define CV_XADD __sync_fetch_and_add From bb5e25ba7c551c244c1f677cd4cba350097deb7c Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 16 Jun 2016 17:39:38 +0300 Subject: [PATCH 16/96] migration: github.com/opencv/opencv --- CONTRIBUTING.md | 2 +- cmake/OpenCVPackaging.cmake | 2 +- cmake/templates/changelog.Debian.in | 2 +- doc/opencv_cheatsheet.tex | 16 ++++++++-------- .../basic_geometric_drawing.rst | 2 +- .../feature_description/feature_description.rst | 2 +- .../feature_flann_matcher.rst | 2 +- .../corner_subpixeles/corner_subpixeles.rst | 2 +- .../generic_corner_detector.rst | 2 +- .../good_features_to_track.rst | 2 +- .../harris_detector/harris_detector.rst | 2 +- .../erosion_dilatation/erosion_dilatation.rst | 2 +- .../gausian_median_blur_bilateral_filter.rst | 2 +- .../back_projection/back_projection.rst | 6 +++--- .../histogram_calculation.rst | 2 +- .../histogram_comparison.rst | 2 +- .../histogram_equalization.rst | 2 +- .../template_matching/template_matching.rst | 2 +- .../imgtrans/canny_detector/canny_detector.rst | 2 +- .../imgtrans/copyMakeBorder/copyMakeBorder.rst | 2 +- .../imgproc/imgtrans/filter_2d/filter_2d.rst | 2 +- .../imgtrans/hough_circle/hough_circle.rst | 4 ++-- .../imgproc/imgtrans/hough_lines/hough_lines.rst | 4 ++-- .../laplace_operator/laplace_operator.rst | 2 +- doc/tutorials/imgproc/imgtrans/remap/remap.rst | 2 +- .../sobel_derivatives/sobel_derivatives.rst | 2 +- .../imgproc/imgtrans/warp_affine/warp_affine.rst | 2 +- .../opening_closing_hats.rst | 2 +- doc/tutorials/imgproc/pyramids/pyramids.rst | 2 +- .../bounding_rects_circles.rst | 2 +- .../bounding_rotated_ellipses.rst | 2 +- .../find_contours/find_contours.rst | 2 +- .../imgproc/shapedescriptors/hull/hull.rst | 2 +- .../imgproc/shapedescriptors/moments/moments.rst | 2 +- .../point_polygon_test/point_polygon_test.rst | 2 +- doc/tutorials/imgproc/threshold/threshold.rst | 2 +- .../clojure_dev_intro/clojure_dev_intro.rst | 2 +- .../arm_crosscompile_with_cmake.rst | 6 +++--- .../introduction/desktop_java/java_dev_intro.rst | 4 ++-- .../introduction/display_image/display_image.rst | 2 +- .../how_to_write_a_tutorial.rst | 2 +- .../introduction/ios_install/ios_install.rst | 4 ++-- .../introduction/linux_install/linux_install.rst | 6 +++--- .../windows_install/windows_install.rst | 4 ++-- .../cascade_classifier/cascade_classifier.rst | 2 +- doc/user_guide/ug_intelperc.rst | 2 +- doc/user_guide/ug_kinect.rst | 2 +- modules/core/doc/basic_structures.rst | 2 +- .../test/test_lshindex_flannbased_matcher.cpp | 2 +- modules/gpu/doc/introduction.rst | 2 +- .../doc/reading_and_writing_images_and_video.rst | 2 +- modules/highgui/doc/user_interface.rst | 2 +- modules/highgui/src/cap_libv4l.cpp | 2 +- modules/highgui/src/cap_v4l.cpp | 2 +- ...structural_analysis_and_shape_descriptors.rst | 2 +- modules/objdetect/doc/cascade_classification.rst | 2 +- modules/python/test/test_digits.py | 2 +- modules/python/test/test_gaussian_mix.py | 2 +- modules/python/test/tests_common.py | 4 ++-- .../CameraCalibrationActivity.java | 2 +- samples/cpp/facial_features.cpp | 4 ++-- samples/cpp/stereo_calib.cpp | 2 +- samples/python/chessboard.py | 2 +- samples/python/cvutils.py | 2 +- samples/python/demhist.py | 2 +- samples/python/dft.py | 2 +- samples/python/distrans.py | 2 +- samples/python/edge.py | 2 +- samples/python/ffilldemo.py | 2 +- samples/python/fitellipse.py | 2 +- samples/python/houghlines.py | 2 +- samples/python/inpaint.py | 2 +- samples/python/logpolar.py | 2 +- samples/python/morphology.py | 2 +- samples/python/numpy_array.py | 2 +- samples/python/watershed.py | 2 +- 76 files changed, 96 insertions(+), 96 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e13c89969..318e9ac8fc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ ## Contributing guidelines -All guidelines for contributing to the OpenCV repository can be found at [`How to contribute guideline`](https://github.com/Itseez/opencv/wiki/How_to_contribute). +All guidelines for contributing to the OpenCV repository can be found at [`How to contribute guideline`](https://github.com/opencv/opencv/wiki/How_to_contribute). diff --git a/cmake/OpenCVPackaging.cmake b/cmake/OpenCVPackaging.cmake index b57f46595e..92c573dd13 100644 --- a/cmake/OpenCVPackaging.cmake +++ b/cmake/OpenCVPackaging.cmake @@ -340,7 +340,7 @@ if(CPACK_GENERATOR STREQUAL "DEB") set(CHANGELOG_OUT_FILE "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}/changelog") set(CHANGELOG_OUT_FILE_GZ "${CMAKE_BINARY_DIR}/deb-packages-gen/${comp}/changelog.gz") - file(WRITE ${CHANGELOG_OUT_FILE} "Upstream changelog stub. See https://github.com/Itseez/opencv/wiki/ChangeLog") + file(WRITE ${CHANGELOG_OUT_FILE} "Upstream changelog stub. See https://github.com/opencv/opencv/wiki/ChangeLog") execute_process(COMMAND "${GZIP_TOOL}" "-ncf9" "${CHANGELOG_OUT_FILE}" OUTPUT_FILE "${CHANGELOG_OUT_FILE_GZ}" diff --git a/cmake/templates/changelog.Debian.in b/cmake/templates/changelog.Debian.in index a47ec42bc8..2133f8bbe8 100644 --- a/cmake/templates/changelog.Debian.in +++ b/cmake/templates/changelog.Debian.in @@ -1,5 +1,5 @@ @CHANGELOG_PACKAGE_NAME@ (@CPACK_PACKAGE_VERSION@) unstable; urgency=low - * Debian changelog stub. See https://github.com/Itseez/opencv/wiki/ChangeLog + * Debian changelog stub. See https://github.com/opencv/opencv/wiki/ChangeLog or release notes in user documentation for more details. -- @CPACK_PACKAGE_CONTACT@ @CHANGELOG_PACKAGE_DATE@ diff --git a/doc/opencv_cheatsheet.tex b/doc/opencv_cheatsheet.tex index d6c339916d..e9a8d2be0b 100644 --- a/doc/opencv_cheatsheet.tex +++ b/doc/opencv_cheatsheet.tex @@ -437,7 +437,7 @@ Example. Decimate image by factor of $\sqrt{2}$:\\ \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#watershed}{watershed()}}, \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html\#grabcut}{grabCut()}} & marker-based image segmentation algorithms. - See the samples \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/watershed.cpp}{watershed.cpp}} and \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/grabcut.cpp}{grabcut.cpp}}. + See the samples \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/watershed.cpp}{watershed.cpp}} and \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/grabcut.cpp}{grabcut.cpp}}. \end{tabular} @@ -465,7 +465,7 @@ Example. Compute Hue-Saturation histogram of an image:\\ \end{tabbing} \subsection{Contours} -See \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/contours2.cpp}{contours2.cpp}} and \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/squares.cpp}{squares.cpp}} +See \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/contours2.cpp}{contours2.cpp}} and \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/squares.cpp}{squares.cpp}} samples on what are the contours and how to use them. \section{Data I/O} @@ -559,7 +559,7 @@ samples on what are the contours and how to use them. \end{tabular} -See \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/camshiftdemo.cpp}{camshiftdemo.cpp}} and other \href{https://github.com/Itseez/opencv/tree/master/samples/}{OpenCV samples} on how to use the GUI functions. +See \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/camshiftdemo.cpp}{camshiftdemo.cpp}} and other \href{https://github.com/opencv/opencv/tree/master/samples/}{OpenCV samples} on how to use the GUI functions. \section{Camera Calibration, Pose Estimation and Depth Estimation} @@ -586,10 +586,10 @@ See \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/camsh \end{tabular} -To calibrate a camera, you can use \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/calibration.cpp}{calibration.cpp}} or -\texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/stereo\_calib.cpp}{stereo\_calib.cpp}} samples. +To calibrate a camera, you can use \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/calibration.cpp}{calibration.cpp}} or +\texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/stereo\_calib.cpp}{stereo\_calib.cpp}} samples. To get the disparity maps and the point clouds, use -\texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/stereo\_match.cpp}{stereo\_match.cpp}} sample. +\texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/stereo\_match.cpp}{stereo\_match.cpp}} sample. \section{Object Detection} @@ -597,9 +597,9 @@ To get the disparity maps and the point clouds, use @{}p{\linewidth-\the\MyLen}@{}} \texttt{\href{http://docs.opencv.org/modules/imgproc/doc/object_detection.html\#matchtemplate}{matchTemplate}} & Compute proximity map for given template.\\ -\texttt{\href{http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html\#cascadeclassifier}{CascadeClassifier}} & Viola's Cascade of Boosted classifiers using Haar or LBP features. Suits for detecting faces, facial features and some other objects without diverse textures. See \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/c/facedetect.cpp}{facedetect.cpp}}\\ +\texttt{\href{http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html\#cascadeclassifier}{CascadeClassifier}} & Viola's Cascade of Boosted classifiers using Haar or LBP features. Suits for detecting faces, facial features and some other objects without diverse textures. See \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/c/facedetect.cpp}{facedetect.cpp}}\\ -\texttt{{HOGDescriptor}} & N. Dalal's object detector using Histogram-of-Oriented-Gradients (HOG) features. Suits for detecting people, cars and other objects with well-defined silhouettes. See \texttt{\href{https://github.com/Itseez/opencv/tree/master/samples/cpp/peopledetect.cpp}{peopledetect.cpp}}\\ +\texttt{{HOGDescriptor}} & N. Dalal's object detector using Histogram-of-Oriented-Gradients (HOG) features. Suits for detecting people, cars and other objects with well-defined silhouettes. See \texttt{\href{https://github.com/opencv/opencv/tree/master/samples/cpp/peopledetect.cpp}{peopledetect.cpp}}\\ \end{tabular} diff --git a/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst b/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst index 83938415c6..4a3ea3bb62 100644 --- a/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst +++ b/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.rst @@ -56,7 +56,7 @@ Scalar Code ===== -* This code is in your OpenCV sample folder. Otherwise you can grab it from `here `_ +* This code is in your OpenCV sample folder. Otherwise you can grab it from `here `_ Explanation ============= diff --git a/doc/tutorials/features2d/feature_description/feature_description.rst b/doc/tutorials/features2d/feature_description/feature_description.rst index 422647a1d0..2e33523c86 100644 --- a/doc/tutorials/features2d/feature_description/feature_description.rst +++ b/doc/tutorials/features2d/feature_description/feature_description.rst @@ -23,7 +23,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.rst b/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.rst index e4630c97ae..11154f7b2c 100644 --- a/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.rst +++ b/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.rst @@ -19,7 +19,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. literalinclude:: ../../../../samples/cpp/tutorial_code/features2D/SURF_FlannMatcher.cpp :language: cpp diff --git a/doc/tutorials/features2d/trackingmotion/corner_subpixeles/corner_subpixeles.rst b/doc/tutorials/features2d/trackingmotion/corner_subpixeles/corner_subpixeles.rst index a98f4d979d..424d744456 100644 --- a/doc/tutorials/features2d/trackingmotion/corner_subpixeles/corner_subpixeles.rst +++ b/doc/tutorials/features2d/trackingmotion/corner_subpixeles/corner_subpixeles.rst @@ -19,7 +19,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/features2d/trackingmotion/generic_corner_detector/generic_corner_detector.rst b/doc/tutorials/features2d/trackingmotion/generic_corner_detector/generic_corner_detector.rst index 5cfcde2e77..093a43fb29 100644 --- a/doc/tutorials/features2d/trackingmotion/generic_corner_detector/generic_corner_detector.rst +++ b/doc/tutorials/features2d/trackingmotion/generic_corner_detector/generic_corner_detector.rst @@ -20,7 +20,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. literalinclude:: ../../../../../samples/cpp/tutorial_code/TrackingMotion/cornerDetector_Demo.cpp :language: cpp diff --git a/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst b/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst index f7be02a111..ce7e329861 100644 --- a/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst +++ b/doc/tutorials/features2d/trackingmotion/good_features_to_track/good_features_to_track.rst @@ -18,7 +18,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.rst b/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.rst index 0f6f99617d..300839f31a 100644 --- a/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.rst +++ b/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.rst @@ -151,7 +151,7 @@ How does it work? Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst index 64f80e4aa1..5ba21f622e 100644 --- a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst +++ b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst @@ -70,7 +70,7 @@ Erosion Code ====== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.rst b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.rst index ceb3e7bee2..0a7b10384c 100644 --- a/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.rst +++ b/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.rst @@ -115,7 +115,7 @@ Code * Applies 4 different kinds of filters (explained in Theory) and show the filtered images sequentially * **Downloadable code**: - Click `here `_ + Click `here `_ * **Code at glance:** diff --git a/doc/tutorials/imgproc/histograms/back_projection/back_projection.rst b/doc/tutorials/imgproc/histograms/back_projection/back_projection.rst index 5062b7b300..629bdcf7bb 100644 --- a/doc/tutorials/imgproc/histograms/back_projection/back_projection.rst +++ b/doc/tutorials/imgproc/histograms/back_projection/back_projection.rst @@ -99,9 +99,9 @@ Code * **Downloadable code**: - a. Click `here `_ for the basic version (explained in this tutorial). - b. For stuff slightly fancier (using H-S histograms and floodFill to define a mask for the skin area) you can check the `improved demo `_ - c. ...or you can always check out the classical `camshiftdemo `_ in samples. + a. Click `here `_ for the basic version (explained in this tutorial). + b. For stuff slightly fancier (using H-S histograms and floodFill to define a mask for the skin area) you can check the `improved demo `_ + c. ...or you can always check out the classical `camshiftdemo `_ in samples. * **Code at glance:** diff --git a/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.rst b/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.rst index decbd33983..821decded2 100644 --- a/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.rst +++ b/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.rst @@ -82,7 +82,7 @@ Code * Plot the three histograms in a window * **Downloadable code**: - Click `here `_ + Click `here `_ * **Code at glance:** diff --git a/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst b/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst index 5eb72d64d8..536bea087e 100644 --- a/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst +++ b/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst @@ -80,7 +80,7 @@ Code * Display the numerical matching parameters obtained. * **Downloadable code**: - Click `here `_ + Click `here `_ * **Code at glance:** diff --git a/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.rst b/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.rst index a042714a5b..9310d2dd2c 100644 --- a/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.rst +++ b/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.rst @@ -83,7 +83,7 @@ Code * Display the source and equalized images in a window. * **Downloadable code**: - Click `here `_ + Click `here `_ * **Code at glance:** diff --git a/doc/tutorials/imgproc/histograms/template_matching/template_matching.rst b/doc/tutorials/imgproc/histograms/template_matching/template_matching.rst index 32878df541..c8127e92b9 100644 --- a/doc/tutorials/imgproc/histograms/template_matching/template_matching.rst +++ b/doc/tutorials/imgproc/histograms/template_matching/template_matching.rst @@ -125,7 +125,7 @@ Code * Draw a rectangle around the area corresponding to the highest match * **Downloadable code**: - Click `here `_ + Click `here `_ * **Code at glance:** diff --git a/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.rst b/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.rst index e0ee43bcc6..6280fe10db 100644 --- a/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.rst +++ b/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.rst @@ -86,7 +86,7 @@ Code * Applies the *Canny Detector* and generates a **mask** (bright lines representing the edges on a black background). * Applies the mask obtained on the original image and display it in a window. -#. The tutorial code's is shown lines below. You can also download it from `here `_ +#. The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.rst b/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.rst index 8c2c0adc31..540becf434 100644 --- a/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.rst +++ b/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.rst @@ -47,7 +47,7 @@ Code The user chooses either option by pressing 'c' (constant) or 'r' (replicate) * The program finishes when the user presses 'ESC' -#. The tutorial code's is shown lines below. You can also download it from `here `_ +#. The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.rst b/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.rst index 5802c82cdf..e61fc8f29e 100644 --- a/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.rst +++ b/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.rst @@ -72,7 +72,7 @@ Code * The filter output (with each kernel) will be shown during 500 milliseconds -#. The tutorial code's is shown lines below. You can also download it from `here `_ +#. The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst index db63ab12ac..02f35bc9dd 100644 --- a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst +++ b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.rst @@ -40,9 +40,9 @@ Code * Display the detected circle in a window. .. |TutorialHoughCirclesSimpleDownload| replace:: here - .. _TutorialHoughCirclesSimpleDownload: https://github.com/Itseez/opencv/tree/master/samples/cpp/houghcircles.cpp + .. _TutorialHoughCirclesSimpleDownload: https://github.com/opencv/opencv/tree/master/samples/cpp/houghcircles.cpp .. |TutorialHoughCirclesFancyDownload| replace:: here - .. _TutorialHoughCirclesFancyDownload: https://github.com/Itseez/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/HoughCircle_Demo.cpp + .. _TutorialHoughCirclesFancyDownload: https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/HoughCircle_Demo.cpp #. The sample code that we will explain can be downloaded from |TutorialHoughCirclesSimpleDownload|_. A slightly fancier version (which shows both Hough standard and probabilistic with trackbars for changing the threshold values) can be found |TutorialHoughCirclesFancyDownload|_. diff --git a/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.rst b/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.rst index 09f6592800..ac3d67551e 100644 --- a/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.rst +++ b/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.rst @@ -89,9 +89,9 @@ Code ====== .. |TutorialHoughLinesSimpleDownload| replace:: here -.. _TutorialHoughLinesSimpleDownload: https://github.com/Itseez/opencv/tree/master/samples/cpp/houghlines.cpp +.. _TutorialHoughLinesSimpleDownload: https://github.com/opencv/opencv/tree/master/samples/cpp/houghlines.cpp .. |TutorialHoughLinesFancyDownload| replace:: here -.. _TutorialHoughLinesFancyDownload: https://github.com/Itseez/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/HoughLines_Demo.cpp +.. _TutorialHoughLinesFancyDownload: https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/ImgTrans/HoughLines_Demo.cpp #. **What does this program do?** diff --git a/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.rst b/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.rst index c83dcc6b1d..0f15df1c9c 100644 --- a/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.rst +++ b/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.rst @@ -55,7 +55,7 @@ Code * Applies a Laplacian operator to the grayscale image and stores the output image * Display the result in a window -#. The tutorial code's is shown lines below. You can also download it from `here `_ +#. The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/imgtrans/remap/remap.rst b/doc/tutorials/imgproc/imgtrans/remap/remap.rst index b3426c84f8..0c10996d65 100644 --- a/doc/tutorials/imgproc/imgtrans/remap/remap.rst +++ b/doc/tutorials/imgproc/imgtrans/remap/remap.rst @@ -59,7 +59,7 @@ Code * Each second, apply 1 of 4 different remapping processes to the image and display them indefinitely in a window. * Wait for the user to exit the program -#. The tutorial code's is shown lines below. You can also download it from `here `_ +#. The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.rst b/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.rst index 8d06c81bc2..3a258e5252 100644 --- a/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.rst +++ b/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.rst @@ -121,7 +121,7 @@ Code * Applies the *Sobel Operator* and generates as output an image with the detected *edges* bright on a darker background. -#. The tutorial code's is shown lines below. You can also download it from `here `_ +#. The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.rst b/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.rst index 49e42d32e7..feddbbcde1 100644 --- a/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.rst +++ b/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.rst @@ -93,7 +93,7 @@ Code * Applies a Rotation to the image after being transformed. This rotation is with respect to the image center * Waits until the user exits the program -#. The tutorial code's is shown lines below. You can also download it from `here `_ +#. The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst b/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst index 8af5112bc2..abe7b496fe 100644 --- a/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst +++ b/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst @@ -111,7 +111,7 @@ Black Hat Code ====== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/pyramids/pyramids.rst b/doc/tutorials/imgproc/pyramids/pyramids.rst index e9c91144c8..3a1c4d083d 100644 --- a/doc/tutorials/imgproc/pyramids/pyramids.rst +++ b/doc/tutorials/imgproc/pyramids/pyramids.rst @@ -80,7 +80,7 @@ Gaussian Pyramid Code ====== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.rst b/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.rst index 92755a3ba2..214f577a38 100644 --- a/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.rst +++ b/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.rst @@ -21,7 +21,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.rst b/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.rst index 2009ce7987..0ba6ffbc5a 100644 --- a/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.rst +++ b/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.rst @@ -21,7 +21,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.rst b/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.rst index fd78c783a8..3f5f8c8cbb 100644 --- a/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.rst +++ b/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.rst @@ -19,7 +19,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/shapedescriptors/hull/hull.rst b/doc/tutorials/imgproc/shapedescriptors/hull/hull.rst index e4a97fb1aa..49b4ec3fad 100644 --- a/doc/tutorials/imgproc/shapedescriptors/hull/hull.rst +++ b/doc/tutorials/imgproc/shapedescriptors/hull/hull.rst @@ -19,7 +19,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/shapedescriptors/moments/moments.rst b/doc/tutorials/imgproc/shapedescriptors/moments/moments.rst index 7fd1a92721..0b6de7f778 100644 --- a/doc/tutorials/imgproc/shapedescriptors/moments/moments.rst +++ b/doc/tutorials/imgproc/shapedescriptors/moments/moments.rst @@ -21,7 +21,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.rst b/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.rst index cd96586534..7bbacb6cbc 100644 --- a/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.rst +++ b/doc/tutorials/imgproc/shapedescriptors/point_polygon_test/point_polygon_test.rst @@ -19,7 +19,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/imgproc/threshold/threshold.rst b/doc/tutorials/imgproc/threshold/threshold.rst index 4f7ab92670..66bf03423b 100644 --- a/doc/tutorials/imgproc/threshold/threshold.rst +++ b/doc/tutorials/imgproc/threshold/threshold.rst @@ -130,7 +130,7 @@ Threshold to Zero, Inverted Code ====== -The tutorial code's is shown lines below. You can also download it from `here `_ +The tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/introduction/clojure_dev_intro/clojure_dev_intro.rst b/doc/tutorials/introduction/clojure_dev_intro/clojure_dev_intro.rst index 248abdf6d2..ed4dc21d9c 100644 --- a/doc/tutorials/introduction/clojure_dev_intro/clojure_dev_intro.rst +++ b/doc/tutorials/introduction/clojure_dev_intro/clojure_dev_intro.rst @@ -51,7 +51,7 @@ OpenCV on Mac OS X: cd ~/ mkdir opt - git clone https://github.com/Itseez/opencv.git + git clone https://github.com/opencv/opencv.git cd opencv git checkout 2.4 mkdir build diff --git a/doc/tutorials/introduction/crosscompilation/arm_crosscompile_with_cmake.rst b/doc/tutorials/introduction/crosscompilation/arm_crosscompile_with_cmake.rst index 87f6d9d4d6..2b472d59a8 100644 --- a/doc/tutorials/introduction/crosscompilation/arm_crosscompile_with_cmake.rst +++ b/doc/tutorials/introduction/crosscompilation/arm_crosscompile_with_cmake.rst @@ -42,7 +42,7 @@ Getting OpenCV Source Code ========================== You can use the latest stable OpenCV version available in *sourceforge* or you can grab the latest -snapshot from our `Git repository `_. +snapshot from our `Git repository `_. Getting the Latest Stable OpenCV Version @@ -56,14 +56,14 @@ Getting the Latest Stable OpenCV Version Getting the Cutting-edge OpenCV from the Git Repository ------------------------------------------------------- -Launch Git client and clone `OpenCV repository `_ +Launch Git client and clone `OpenCV repository `_ In Linux it can be achieved with the following command in Terminal: .. code-block:: bash cd ~/ - git clone https://github.com/Itseez/opencv.git + git clone https://github.com/opencv/opencv.git Building OpenCV diff --git a/doc/tutorials/introduction/desktop_java/java_dev_intro.rst b/doc/tutorials/introduction/desktop_java/java_dev_intro.rst index d5cb31f894..983ef49d81 100644 --- a/doc/tutorials/introduction/desktop_java/java_dev_intro.rst +++ b/doc/tutorials/introduction/desktop_java/java_dev_intro.rst @@ -41,7 +41,7 @@ The most simple way to get it is downloading the appropriate package of **versio For other OSes it's required to build OpenCV from sources. Another option to get OpenCV sources is to clone `OpenCV git repository -`_. +`_. In order to build OpenCV with Java bindings you need :abbr:`JDK (Java Development Kit)` (we recommend `Oracle/Sun JDK 6 or 7 `_), `Apache Ant `_ and `Python` v2.6 or higher to be installed. @@ -53,7 +53,7 @@ Let's build OpenCV: .. code-block:: bash - git clone git://github.com/Itseez/opencv.git + git clone git://github.com/opencv/opencv.git cd opencv git checkout 2.4 mkdir build diff --git a/doc/tutorials/introduction/display_image/display_image.rst b/doc/tutorials/introduction/display_image/display_image.rst index 9e80818137..b32f18aa2c 100644 --- a/doc/tutorials/introduction/display_image/display_image.rst +++ b/doc/tutorials/introduction/display_image/display_image.rst @@ -17,7 +17,7 @@ In this tutorial you will learn how to: Source Code =========== -Download the source code from `here `_. +Download the source code from `here `_. .. literalinclude:: ../../../../samples/cpp/tutorial_code/introduction/display_image/display_image.cpp :language: cpp diff --git a/doc/tutorials/introduction/how_to_write_a_tutorial/how_to_write_a_tutorial.rst b/doc/tutorials/introduction/how_to_write_a_tutorial/how_to_write_a_tutorial.rst index e66054ec8f..c78e3c2924 100644 --- a/doc/tutorials/introduction/how_to_write_a_tutorial/how_to_write_a_tutorial.rst +++ b/doc/tutorials/introduction/how_to_write_a_tutorial/how_to_write_a_tutorial.rst @@ -64,7 +64,7 @@ In our world, achieving some tasks is possible in multiple ways. However, some o Now the best option would be to do the integration yourself. For this, you first need to have the source code. I recommend following the guides for your operating system on acquiring OpenCV sources. For Linux users look :ref:`here ` and for :ref:`Windows here `. You must also install python and sphinx with its dependencies in order to be able to build the documentation. -Once you have downloaded the repository to your hard drive you can take a look in the OpenCV directory to make sure you have both the samples and doc folder present. Anyone may download the latest source files from :file:`git://github.com/Itseez/opencv.git`. Nevertheless, not everyone has upload (commit/submit) rights. This is to protect the integrity of the library. If you plan doing more than one tutorial, and would like to have an account with commit user rights you should first register an account at http://code.opencv.org/ and then contact OpenCV administrator -delete-admin@-delete-opencv.org. Otherwise, you can just send the resulting files to us at -delete-admin@-delete-opencv.org and we'll add it. +Once you have downloaded the repository to your hard drive you can take a look in the OpenCV directory to make sure you have both the samples and doc folder present. Anyone may download the latest source files from :file:`git://github.com/opencv/opencv.git`. Nevertheless, not everyone has upload (commit/submit) rights. This is to protect the integrity of the library. If you plan doing more than one tutorial, and would like to have an account with commit user rights you should first register an account at http://code.opencv.org/ and then contact OpenCV administrator -delete-admin@-delete-opencv.org. Otherwise, you can just send the resulting files to us at -delete-admin@-delete-opencv.org and we'll add it. Format the Source Code ====================== diff --git a/doc/tutorials/introduction/ios_install/ios_install.rst b/doc/tutorials/introduction/ios_install/ios_install.rst index 2973b7ec2b..e3d36dff3c 100644 --- a/doc/tutorials/introduction/ios_install/ios_install.rst +++ b/doc/tutorials/introduction/ios_install/ios_install.rst @@ -12,14 +12,14 @@ Required Packages Getting the Cutting-edge OpenCV from Git Repository --------------------------------------------------- -Launch GIT client and clone OpenCV repository from `here `_ +Launch GIT client and clone OpenCV repository from `here `_ In MacOS it can be done using the following command in Terminal: .. code-block:: bash cd ~/ - git clone https://github.com/Itseez/opencv.git + git clone https://github.com/opencv/opencv.git Building OpenCV from Source, using CMake and Command Line diff --git a/doc/tutorials/introduction/linux_install/linux_install.rst b/doc/tutorials/introduction/linux_install/linux_install.rst index e367cd8258..e2ee91b5f2 100644 --- a/doc/tutorials/introduction/linux_install/linux_install.rst +++ b/doc/tutorials/introduction/linux_install/linux_install.rst @@ -29,7 +29,7 @@ The packages can be installed using a terminal and the following commands or by Getting OpenCV Source Code ========================== -You can use the latest stable OpenCV version available in *sourceforge* or you can grab the latest snapshot from our `Git repository `_. +You can use the latest stable OpenCV version available in *sourceforge* or you can grab the latest snapshot from our `Git repository `_. Getting the Latest Stable OpenCV Version ---------------------------------------- @@ -42,14 +42,14 @@ Getting the Latest Stable OpenCV Version Getting the Cutting-edge OpenCV from the Git Repository ------------------------------------------------------- -Launch Git client and clone `OpenCV repository `_ +Launch Git client and clone `OpenCV repository `_ In Linux it can be achieved with the following command in Terminal: .. code-block:: bash cd ~/ - git clone https://github.com/Itseez/opencv.git + git clone https://github.com/opencv/opencv.git Building OpenCV from Source Using CMake, Using the Command Line diff --git a/doc/tutorials/introduction/windows_install/windows_install.rst b/doc/tutorials/introduction/windows_install/windows_install.rst index abb39cd13e..3fda01c086 100644 --- a/doc/tutorials/introduction/windows_install/windows_install.rst +++ b/doc/tutorials/introduction/windows_install/windows_install.rst @@ -46,7 +46,7 @@ You may find the content of this tutorial also inside the following videos: `Par .. warning:: These videos above are long-obsolete and contain inaccurate information. Be careful, since solutions described in those videos are no longer supported and may even break your install. -If you are building your own libraries you can take the source files from our `Git repository `_. +If you are building your own libraries you can take the source files from our `Git repository `_. Building the OpenCV library from scratch requires a couple of tools installed beforehand: @@ -128,7 +128,7 @@ Building the library #. Choose a directory in your file system, where you will download the OpenCV libraries to. I recommend creating a new one that has short path and no special charachters in it, for example :file:`D:/OpenCV`. For this tutorial I'll suggest you do so. If you use your own path and know, what you're doing -- it's OK. - a) Clone the repository to the selected directory. After clicking *Clone* button, a window will appear where you can select from what repository you want to download source files (https://github.com/Itseez/opencv.git) and to what directory (:file:`D:/OpenCV`). + a) Clone the repository to the selected directory. After clicking *Clone* button, a window will appear where you can select from what repository you want to download source files (https://github.com/opencv/opencv.git) and to what directory (:file:`D:/OpenCV`). #) Push the OK button and be patient as the repository is quite a heavy download. It will take some time depending on your Internet connection. diff --git a/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst index ea229ca9de..1338249147 100644 --- a/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst +++ b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst @@ -22,7 +22,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ . The second version (using LBP for face detection) can be `found here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ . The second version (using LBP for face detection) can be `found here `_ .. code-block:: cpp diff --git a/doc/user_guide/ug_intelperc.rst b/doc/user_guide/ug_intelperc.rst index f08d8f2c64..04a10a1a95 100644 --- a/doc/user_guide/ug_intelperc.rst +++ b/doc/user_guide/ug_intelperc.rst @@ -76,4 +76,4 @@ Since two types of sensor's data generators are supported (image generator and d For more information please refer to the example of usage intelperc_capture.cpp_ in ``opencv/samples/cpp`` folder. -.. _intelperc_capture.cpp: https://github.com/Itseez/opencv/tree/master/samples/cpp/intelperc_capture.cpp +.. _intelperc_capture.cpp: https://github.com/opencv/opencv/tree/master/samples/cpp/intelperc_capture.cpp diff --git a/doc/user_guide/ug_kinect.rst b/doc/user_guide/ug_kinect.rst index cb15ac42db..15e3274210 100644 --- a/doc/user_guide/ug_kinect.rst +++ b/doc/user_guide/ug_kinect.rst @@ -130,4 +130,4 @@ Flags specifing the needed generator type must be used in combination with parti For more information please refer to the example of usage openni_capture.cpp_ in ``opencv/samples/cpp`` folder. -.. _openni_capture.cpp: https://github.com/Itseez/opencv/tree/master/samples/cpp/openni_capture.cpp +.. _openni_capture.cpp: https://github.com/opencv/opencv/tree/master/samples/cpp/openni_capture.cpp diff --git a/modules/core/doc/basic_structures.rst b/modules/core/doc/basic_structures.rst index 9b37bd38f7..6344182a19 100644 --- a/modules/core/doc/basic_structures.rst +++ b/modules/core/doc/basic_structures.rst @@ -2898,5 +2898,5 @@ The above methods are usually enough for users. If you want to make your own alg * Make a class and specify ``Algorithm`` as its base class. * The algorithm parameters should be the class members. See ``Algorithm::get()`` for the list of possible types of the parameters. * Add public virtual method ``AlgorithmInfo* info() const;`` to your class. - * Add constructor function, ``AlgorithmInfo`` instance and implement the ``info()`` method. The simplest way is to take https://github.com/Itseez/opencv/tree/master/modules/ml/src/ml_init.cpp as the reference and modify it according to the list of your parameters. + * Add constructor function, ``AlgorithmInfo`` instance and implement the ``info()`` method. The simplest way is to take https://github.com/opencv/opencv/tree/master/modules/ml/src/ml_init.cpp as the reference and modify it according to the list of your parameters. * Add some public function (e.g. ``initModule_()``) that calls info() of your algorithm and put it into the same source file as ``info()`` implementation. This is to force C++ linker to include this object file into the target application. See ``Algorithm::create()`` for details. diff --git a/modules/features2d/test/test_lshindex_flannbased_matcher.cpp b/modules/features2d/test/test_lshindex_flannbased_matcher.cpp index d1c6ea7e43..29f9dbc574 100644 --- a/modules/features2d/test/test_lshindex_flannbased_matcher.cpp +++ b/modules/features2d/test/test_lshindex_flannbased_matcher.cpp @@ -31,7 +31,7 @@ For OpenCV2.4/OpenCV3.0 Test for Pull Request # 3829 - https://github.com/Itseez/opencv/pull/3829 + https://github.com/opencv/opencv/pull/3829 This test code creates brute force matcher for accuracy of reference, and the test target matcher. Then, add() and train() transformed query image descriptors, and some outlier images descriptors to both matchers. diff --git a/modules/gpu/doc/introduction.rst b/modules/gpu/doc/introduction.rst index 776ed2fb48..8b4eb04b8b 100644 --- a/modules/gpu/doc/introduction.rst +++ b/modules/gpu/doc/introduction.rst @@ -59,4 +59,4 @@ While developing algorithms for multiple GPUs, note a data passing overhead. For With this algorithm, a dual GPU gave a 180 % performance increase comparing to the single Fermi GPU. For a source code example, see -https://github.com/Itseez/opencv/tree/master/samples/gpu/. +https://github.com/opencv/opencv/tree/master/samples/gpu/. diff --git a/modules/highgui/doc/reading_and_writing_images_and_video.rst b/modules/highgui/doc/reading_and_writing_images_and_video.rst index a17ad90ebd..c4ac793bca 100644 --- a/modules/highgui/doc/reading_and_writing_images_and_video.rst +++ b/modules/highgui/doc/reading_and_writing_images_and_video.rst @@ -319,7 +319,7 @@ The methods/functions grab the next frame from video file or camera and return t The primary use of the function is in multi-camera environments, especially when the cameras do not have hardware synchronization. That is, you call ``VideoCapture::grab()`` for each camera and after that call the slower method ``VideoCapture::retrieve()`` to decode and get frame from each camera. This way the overhead on demosaicing or motion jpeg decompression etc. is eliminated and the retrieved frames from different cameras will be closer in time. -Also, when a connected camera is multi-head (for example, a stereo camera or a Kinect device), the correct way of retrieving data from it is to call `VideoCapture::grab` first and then call :ocv:func:`VideoCapture::retrieve` one or more times with different values of the ``channel`` parameter. See https://github.com/Itseez/opencv/tree/master/samples/cpp/openni_capture.cpp +Also, when a connected camera is multi-head (for example, a stereo camera or a Kinect device), the correct way of retrieving data from it is to call `VideoCapture::grab` first and then call :ocv:func:`VideoCapture::retrieve` one or more times with different values of the ``channel`` parameter. See https://github.com/opencv/opencv/tree/master/samples/cpp/openni_capture.cpp VideoCapture::retrieve diff --git a/modules/highgui/doc/user_interface.rst b/modules/highgui/doc/user_interface.rst index bc241b81d4..952dead05c 100644 --- a/modules/highgui/doc/user_interface.rst +++ b/modules/highgui/doc/user_interface.rst @@ -224,7 +224,7 @@ Sets mouse handler for the specified window :param winname: Window name - :param onMouse: Mouse callback. See OpenCV samples, such as https://github.com/Itseez/opencv/tree/master/samples/cpp/ffilldemo.cpp, on how to specify and use the callback. + :param onMouse: Mouse callback. See OpenCV samples, such as https://github.com/opencv/opencv/tree/master/samples/cpp/ffilldemo.cpp, on how to specify and use the callback. :param userdata: The optional parameter passed to the callback. diff --git a/modules/highgui/src/cap_libv4l.cpp b/modules/highgui/src/cap_libv4l.cpp index ff153042d1..5f161a535b 100644 --- a/modules/highgui/src/cap_libv4l.cpp +++ b/modules/highgui/src/cap_libv4l.cpp @@ -16,7 +16,7 @@ For Release: OpenCV-Linux Beta4 opencv-0.9.6 Tested On: LMLBT44 with 8 video inputs Problems? Post your questions at answers.opencv.org, Report bugs at code.opencv.org, - Submit your fixes at https://github.com/Itseez/opencv/ + Submit your fixes at https://github.com/opencv/opencv/ Patched Comments: TW: The cv cam utils that came with the initial release of OpenCV for LINUX Beta4 diff --git a/modules/highgui/src/cap_v4l.cpp b/modules/highgui/src/cap_v4l.cpp index 2599cada80..4093219ca6 100644 --- a/modules/highgui/src/cap_v4l.cpp +++ b/modules/highgui/src/cap_v4l.cpp @@ -16,7 +16,7 @@ For Release: OpenCV-Linux Beta4 opencv-0.9.6 Tested On: LMLBT44 with 8 video inputs Problems? Post your questions at answers.opencv.org, Report bugs at code.opencv.org, - Submit your fixes at https://github.com/Itseez/opencv/ + Submit your fixes at https://github.com/opencv/opencv/ Patched Comments: TW: The cv cam utils that came with the initial release of OpenCV for LINUX Beta4 diff --git a/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst b/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst index 512f4bcddf..dfbdfa917c 100644 --- a/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst +++ b/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst @@ -296,7 +296,7 @@ Approximates a polygonal curve(s) with the specified precision. The functions ``approxPolyDP`` approximate a curve or a polygon with another curve/polygon with less vertices so that the distance between them is less or equal to the specified precision. It uses the Douglas-Peucker algorithm http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm -See https://github.com/Itseez/opencv/tree/master/samples/cpp/contours2.cpp for the function usage model. +See https://github.com/opencv/opencv/tree/master/samples/cpp/contours2.cpp for the function usage model. ApproxChains diff --git a/modules/objdetect/doc/cascade_classification.rst b/modules/objdetect/doc/cascade_classification.rst index a416392be7..265d2a439e 100644 --- a/modules/objdetect/doc/cascade_classification.rst +++ b/modules/objdetect/doc/cascade_classification.rst @@ -21,7 +21,7 @@ The word "cascade" in the classifier name means that the resultant classifier co The feature used in a particular classifier is specified by its shape (1a, 2b etc.), position within the region of interest and the scale (this scale is not the same as the scale used at the detection stage, though these two scales are multiplied). For example, in the case of the third line feature (2c) the response is calculated as the difference between the sum of image pixels under the rectangle covering the whole feature (including the two white stripes and the black stripe in the middle) and the sum of the image pixels under the black stripe multiplied by 3 in order to compensate for the differences in the size of areas. The sums of pixel values over a rectangular regions are calculated rapidly using integral images (see below and the :ocv:func:`integral` description). To see the object detector at work, have a look at the facedetect demo: -https://github.com/Itseez/opencv/tree/master/samples/cpp/dbt_face_detection.cpp +https://github.com/opencv/opencv/tree/master/samples/cpp/dbt_face_detection.cpp The following reference is for the detection part only. There is a separate application called ``opencv_traincascade`` that can train a cascade of boosted classifiers from a set of samples. diff --git a/modules/python/test/test_digits.py b/modules/python/test/test_digits.py index e30361e0eb..3236276173 100644 --- a/modules/python/test/test_digits.py +++ b/modules/python/test/test_digits.py @@ -58,7 +58,7 @@ def deskew(img): class StatModel(object): def load(self, fn): - self.model.load(fn) # Known bug: https://github.com/Itseez/opencv/issues/4969 + self.model.load(fn) # Known bug: https://github.com/opencv/opencv/issues/4969 def save(self, fn): self.model.save(fn) diff --git a/modules/python/test/test_gaussian_mix.py b/modules/python/test/test_gaussian_mix.py index 498cf3862f..0a146f3d68 100644 --- a/modules/python/test/test_gaussian_mix.py +++ b/modules/python/test/test_gaussian_mix.py @@ -41,7 +41,7 @@ class gaussian_mix_test(NewOpenCVTests): em = cv2.EM(cluster_n,cv2.EM_COV_MAT_GENERIC) em.train(points) means = em.getMat("means") - covs = em.getMatVector("covs") # Known bug: https://github.com/Itseez/opencv/pull/4232 + covs = em.getMatVector("covs") # Known bug: https://github.com/opencv/opencv/pull/4232 found_distrs = zip(means, covs) matches_count = 0 diff --git a/modules/python/test/tests_common.py b/modules/python/test/tests_common.py index a32f2889c2..791773a7cf 100644 --- a/modules/python/test/tests_common.py +++ b/modules/python/test/tests_common.py @@ -21,7 +21,7 @@ class OpenCVTests(unittest.TestCase): # path to local repository folder containing 'samples' folder repoPath = None # github repository url - repoUrl = 'https://raw.github.com/Itseez/opencv/2.4' + repoUrl = 'https://raw.github.com/opencv/opencv/2.4' # path to local folder containing 'camera_calibration.tar.gz' dataPath = None # data url @@ -126,7 +126,7 @@ class NewOpenCVTests(unittest.TestCase): repoPath = None extraTestDataPath = None # github repository url - repoUrl = 'https://raw.github.com/Itseez/opencv/master' + repoUrl = 'https://raw.github.com/opencv/opencv/master' def get_sample(self, filename, iscolor = cv2.IMREAD_COLOR): if not filename in self.image_cache: diff --git a/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java b/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java index 33c9bbbf46..cb1d52be42 100644 --- a/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java +++ b/samples/android/camera-calibration/src/org/opencv/samples/cameracalibration/CameraCalibrationActivity.java @@ -2,7 +2,7 @@ // http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html // // It uses standard OpenCV asymmetric circles grid pattern 11x4: -// https://github.com/Itseez/opencv/blob/2.4/doc/acircles_pattern.png. +// https://github.com/opencv/opencv/blob/2.4/doc/acircles_pattern.png. // The results are the camera matrix and 5 distortion coefficients. // // Tap on highlighted pattern to capture pattern corners for calibration. diff --git a/samples/cpp/facial_features.cpp b/samples/cpp/facial_features.cpp index 9cfbd85c7f..490f492cfd 100644 --- a/samples/cpp/facial_features.cpp +++ b/samples/cpp/facial_features.cpp @@ -117,10 +117,10 @@ static void help() "\tThis will detect only the face in image.jpg.\n"; cout << " \n\nThe classifiers for face and eyes can be downloaded from : " - " \nhttps://github.com/Itseez/opencv/tree/master/data/haarcascades"; + " \nhttps://github.com/opencv/opencv/tree/master/data/haarcascades"; cout << "\n\nThe classifiers for nose and mouth can be downloaded from : " - " \nhttps://github.com/Itseez/opencv_contrib/tree/master/modules/face/data/cascades\n"; + " \nhttps://github.com/opencv/opencv_contrib/tree/master/modules/face/data/cascades\n"; } static void detectFaces(Mat& img, vector >& faces, string cascade_path) diff --git a/samples/cpp/stereo_calib.cpp b/samples/cpp/stereo_calib.cpp index 6ae20c75da..64f67a4778 100644 --- a/samples/cpp/stereo_calib.cpp +++ b/samples/cpp/stereo_calib.cpp @@ -19,7 +19,7 @@ Online docs: http://docs.opencv.org Q&A forum: http://answers.opencv.org Issue tracker: http://code.opencv.org - GitHub: https://github.com/Itseez/opencv/ + GitHub: https://github.com/opencv/opencv/ ************************************************** */ #include "opencv2/calib3d/calib3d.hpp" diff --git a/samples/python/chessboard.py b/samples/python/chessboard.py index c108784930..9eaab17334 100755 --- a/samples/python/chessboard.py +++ b/samples/python/chessboard.py @@ -15,7 +15,7 @@ if __name__ == "__main__": im = cv.LoadImageM(fileName, False) im3 = cv.LoadImageM(fileName, True) except: # if local copy cannot be opened, try downloading it - url = 'https://raw.github.com/Itseez/opencv/master/samples/cpp/left01.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/cpp/left01.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/cvutils.py b/samples/python/cvutils.py index 4827d9d657..025c7c4cea 100755 --- a/samples/python/cvutils.py +++ b/samples/python/cvutils.py @@ -11,7 +11,7 @@ def load_sample(name=None): try: img0 = cv.LoadImage(name, cv.CV_LOAD_IMAGE_COLOR) except IOError: - urlbase = 'https://raw.github.com/Itseez/opencv/master/samples/c/' + urlbase = 'https://raw.github.com/opencv/opencv/master/samples/c/' file = name.split('/')[-1] filedata = urllib2.urlopen(urlbase+file).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) diff --git a/samples/python/demhist.py b/samples/python/demhist.py index 59f7e1f782..11745dbeb8 100755 --- a/samples/python/demhist.py +++ b/samples/python/demhist.py @@ -68,7 +68,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: src_image = cv.GetMat(cv.LoadImage(sys.argv[1], 0)) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/baboon.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/baboon.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/dft.py b/samples/python/dft.py index 2bce090da1..7cbec960a8 100755 --- a/samples/python/dft.py +++ b/samples/python/dft.py @@ -51,7 +51,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: im = cv.LoadImage( sys.argv[1], cv.CV_LOAD_IMAGE_GRAYSCALE) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/baboon.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/baboon.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/distrans.py b/samples/python/distrans.py index c7a61c6dbb..6fc92c52bb 100755 --- a/samples/python/distrans.py +++ b/samples/python/distrans.py @@ -42,7 +42,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: gray = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_GRAYSCALE) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/stuff.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/stuff.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/edge.py b/samples/python/edge.py index 194d2474f9..84ab838a0a 100755 --- a/samples/python/edge.py +++ b/samples/python/edge.py @@ -32,7 +32,7 @@ if __name__ == '__main__': if len(sys.argv) > 1: im = cv.LoadImage( sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/fruits.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/fruits.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/ffilldemo.py b/samples/python/ffilldemo.py index 1ad3755c20..29eda6df4b 100755 --- a/samples/python/ffilldemo.py +++ b/samples/python/ffilldemo.py @@ -73,7 +73,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: im = cv.LoadImage( sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/fruits.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/fruits.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/fitellipse.py b/samples/python/fitellipse.py index 2a1673b7f0..f77ba13c70 100755 --- a/samples/python/fitellipse.py +++ b/samples/python/fitellipse.py @@ -82,7 +82,7 @@ if __name__ == '__main__': if len(sys.argv) > 1: source_image = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_GRAYSCALE) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/stuff.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/stuff.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/houghlines.py b/samples/python/houghlines.py index 00d8b1b06c..0625e7361c 100755 --- a/samples/python/houghlines.py +++ b/samples/python/houghlines.py @@ -14,7 +14,7 @@ if __name__ == "__main__": filename = sys.argv[1] src = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_GRAYSCALE) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/cpp/building.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/cpp/building.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/inpaint.py b/samples/python/inpaint.py index fd2d5f22c4..9c1b71ee12 100755 --- a/samples/python/inpaint.py +++ b/samples/python/inpaint.py @@ -27,7 +27,7 @@ if __name__=="__main__": if len(sys.argv) > 1: img0 = cv.LoadImage( sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/fruits.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/fruits.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/logpolar.py b/samples/python/logpolar.py index 13ee5d94ee..5e5a6996dd 100755 --- a/samples/python/logpolar.py +++ b/samples/python/logpolar.py @@ -23,7 +23,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: src = cv.LoadImage( sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/fruits.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/fruits.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/morphology.py b/samples/python/morphology.py index a1817bf304..2f6abce1dc 100755 --- a/samples/python/morphology.py +++ b/samples/python/morphology.py @@ -31,7 +31,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: src = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/fruits.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/fruits.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/numpy_array.py b/samples/python/numpy_array.py index 76ef14201f..db0ac293cb 100755 --- a/samples/python/numpy_array.py +++ b/samples/python/numpy_array.py @@ -22,7 +22,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: img0 = cv.LoadImageM( sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/lena.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/lena.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) diff --git a/samples/python/watershed.py b/samples/python/watershed.py index 5134ed34e9..c989ac19aa 100755 --- a/samples/python/watershed.py +++ b/samples/python/watershed.py @@ -27,7 +27,7 @@ if __name__ == "__main__": if len(sys.argv) > 1: img0 = cv.LoadImage( sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) else: - url = 'https://raw.github.com/Itseez/opencv/master/samples/c/fruits.jpg' + url = 'https://raw.github.com/opencv/opencv/master/samples/c/fruits.jpg' filedata = urllib2.urlopen(url).read() imagefiledata = cv.CreateMatHeader(1, len(filedata), cv.CV_8UC1) cv.SetData(imagefiledata, filedata, len(filedata)) From 9e652161081fc9f6da0ddd0f4330f259bbab94b9 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Fri, 15 Jul 2016 15:11:36 +0300 Subject: [PATCH 17/96] set threshold to 1 in sanity test for GPU rotate on 8UC1 to fix difference with CUDA 8.0 results --- modules/gpu/perf/perf_imgproc.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/gpu/perf/perf_imgproc.cpp b/modules/gpu/perf/perf_imgproc.cpp index 4117cc6367..2e0aa9f7b6 100644 --- a/modules/gpu/perf/perf_imgproc.cpp +++ b/modules/gpu/perf/perf_imgproc.cpp @@ -1373,7 +1373,10 @@ PERF_TEST_P(Sz_Depth_Cn_Inter, ImgProc_Rotate, TEST_CYCLE() cv::gpu::rotate(d_src, dst, size, 30.0, 0, 0, interpolation); - GPU_SANITY_CHECK(dst, 1e-3, ERROR_RELATIVE); + if (depth == CV_8U) + GPU_SANITY_CHECK(dst, 1); + else + GPU_SANITY_CHECK(dst, 1e-3, ERROR_RELATIVE); } else { From 7b2ef647aac2ad54a5152146af5270fafea9c31b Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Sat, 16 Jul 2016 14:26:31 +0300 Subject: [PATCH 18/96] fixed memory corruption when normal dist. params have less channels than target matrix; test added --- modules/core/src/rand.cpp | 14 +++++++------- modules/core/test/test_rand.cpp | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/modules/core/src/rand.cpp b/modules/core/src/rand.cpp index 73dff184b5..eed4684a54 100644 --- a/modules/core/src/rand.cpp +++ b/modules/core/src/rand.cpp @@ -622,7 +622,7 @@ void RNG::fill( InputOutputArray _mat, int disttype, int ptype = depth == CV_64F ? CV_64F : CV_32F; int esz = (int)CV_ELEM_SIZE(ptype); - if( _param1.isContinuous() && _param1.type() == ptype ) + if( _param1.isContinuous() && _param1.type() == ptype && n1 >= cn) mean = _param1.data; else { @@ -635,18 +635,18 @@ void RNG::fill( InputOutputArray _mat, int disttype, for( j = n1*esz; j < cn*esz; j++ ) mean[j] = mean[j - n1*esz]; - if( _param2.isContinuous() && _param2.type() == ptype ) + if( _param2.isContinuous() && _param2.type() == ptype && n2 >= cn) stddev = _param2.data; else { - Mat tmp(_param2.size(), ptype, parambuf + cn); + Mat tmp(_param2.size(), ptype, parambuf + MAX(n1, cn)); _param2.convertTo(tmp, ptype); - stddev = (uchar*)(parambuf + cn); + stddev = (uchar*)(parambuf + MAX(n1, cn)); } - if( n1 < cn ) - for( j = n1*esz; j < cn*esz; j++ ) - stddev[j] = stddev[j - n1*esz]; + if( n2 < cn ) + for( j = n2*esz; j < cn*esz; j++ ) + stddev[j] = stddev[j - n2*esz]; stdmtx = _param2.rows == cn && _param2.cols == cn; scaleFunc = randnScaleTab[depth]; diff --git a/modules/core/test/test_rand.cpp b/modules/core/test/test_rand.cpp index 1d9b3dd0d1..5ce5ae85ac 100644 --- a/modules/core/test/test_rand.cpp +++ b/modules/core/test/test_rand.cpp @@ -365,3 +365,20 @@ TEST(Core_RNG_MT19937, regression) ASSERT_EQ(expected[i], actual[i]); } } + + +TEST(Core_Rand, Regression_Stack_Corruption) +{ + int bufsz = 128; //enough for 14 doubles + AutoBuffer buffer(bufsz); + size_t offset = 0; + cv::Mat_ x(2, 3, (cv::Point2d*)(buffer+offset)); offset += x.total()*x.elemSize(); + double& param1 = *(double*)(buffer+offset); offset += sizeof(double); + double& param2 = *(double*)(buffer+offset); offset += sizeof(double); + param1 = -9; param2 = 2; + + cv::theRNG().fill(x, cv::RNG::NORMAL, param1, param2); + + ASSERT_EQ(param1, -9); + ASSERT_EQ(param2, 2); +} From 87d06eab828bc6fce18fc7762f5ad9b7359dac64 Mon Sep 17 00:00:00 2001 From: catree Date: Sun, 17 Jul 2016 23:06:20 +0200 Subject: [PATCH 19/96] Add bib reference for overall hitrate and false alarm rate for the train cascade user guide (OpenCV 2.4). --- doc/opencv.bib | 1 + doc/user_guide/ug_traincascade.rst | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/opencv.bib b/doc/opencv.bib index 83f986855a..8ecb0a98c1 100644 --- a/doc/opencv.bib +++ b/doc/opencv.bib @@ -316,6 +316,7 @@ # '''[Teh89]''' C.H. Teh, R.T. Chin. On the Detection of Dominant Points on Digital Curves. - IEEE Tr. PAMI, 1989, v.11, No.8, p. 859-872. # '''[Trucco98]''' Emanuele Trucco, Alessandro Verri. Introductory Techniques for 3-D Computer Vision. Prentice Hall, Inc., 1998. # '''[Viola01]''' Paul Viola and Michael J. Jones. Rapid Object Detection using a Boosted Cascade of Simple Features. IEEE CVPR, 2001.<
> The paper is available online at http://www.ai.mit.edu/people/viola/ +# '''[Viola04]''' Paul Viola and Michael J. Jones. Robust real-time face detection. International Journal of Computer Vision, 57(2):137–154, 2004.<
> The paper is available online at http://www.vision.caltech.edu/html-files/EE148-2005-Spring/pprs/viola04ijcv.pdf # '''[Welch95]''' Greg Welch, Gary Bishop. An Introduction To the Kalman Filter. Technical Report TR95-041, University of North Carolina at Chapel Hill, 1995.<
> Online version is available at http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html # '''[Williams92]''' D. J. Williams and M. Shah. A Fast Algorithm for Active Contours and Curvature Estimation. CVGIP: Image Understanding, Vol. 55, No. 1, pp. 14-26, Jan., 1992. http://www.cs.ucf.edu/~vision/papers/shah/92/WIS92A.pdf. # '''[Yuen03]''' H.K. Yuen, J. Princen, J. Illingworth and J. Kittler. Comparative study of Hough Transform methods for circle finding.<
>http://www.sciencedirect.com/science/article/B6V09-48TCV4N-5Y/2/91f551d124777f7a4cf7b18325235673 diff --git a/doc/user_guide/ug_traincascade.rst b/doc/user_guide/ug_traincascade.rst index 49cdbd698a..a29ad488da 100644 --- a/doc/user_guide/ug_traincascade.rst +++ b/doc/user_guide/ug_traincascade.rst @@ -326,11 +326,11 @@ Command line arguments of ``opencv_traincascade`` application grouped by purpose * ``-minHitRate `` - Minimal desired hit rate for each stage of the classifier. Overall hit rate may be estimated as (min_hit_rate^number_of_stages). + Minimal desired hit rate for each stage of the classifier. Overall hit rate may be estimated as (min_hit_rate ^ number_of_stages) [Viola2004]_. * ``-maxFalseAlarmRate `` - Maximal desired false alarm rate for each stage of the classifier. Overall false alarm rate may be estimated as (max_false_alarm_rate^number_of_stages). + Maximal desired false alarm rate for each stage of the classifier. Overall false alarm rate may be estimated as (max_false_alarm_rate ^ number_of_stages) [Viola2004]_. * ``-weightTrimRate `` @@ -362,7 +362,9 @@ After the ``opencv_traincascade`` application has finished its work, the trained Training is finished and you can test you cascade classifier! -.. [Viola2001] Paul Viola, Michael Jones. *Rapid Object Detection using a Boosted Cascade of Simple Features*. Conference on Computer Vision and Pattern Recognition (CVPR), 2001, pp. 511-518. +.. [Viola2001] Paul Viola, Michael J. Jones. *Rapid Object Detection using a Boosted Cascade of Simple Features*. Conference on Computer Vision and Pattern Recognition (CVPR), 2001, pp. 511-518. + +.. [Viola2004] Paul Viola, Michael J. Jones. *Robust real-time face detection*. International Journal of Computer Vision, 57(2):137–154, 2004. .. [Rainer2002] Rainer Lienhart and Jochen Maydt. *An Extended Set of Haar-like Features for Rapid Object Detection*. Submitted to ICIP2002. From d99821aa44682d28c980351abe227c5ef87a5d41 Mon Sep 17 00:00:00 2001 From: Philippe FOUBERT Date: Sun, 17 Jul 2016 12:22:37 +0200 Subject: [PATCH 20/96] Resolves issue #6931 --- modules/core/include/opencv2/core/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/version.hpp b/modules/core/include/opencv2/core/version.hpp index 2dbb3c3403..39e66583d2 100644 --- a/modules/core/include/opencv2/core/version.hpp +++ b/modules/core/include/opencv2/core/version.hpp @@ -55,7 +55,7 @@ #define CVAUX_STR_EXP(__A) #__A #define CVAUX_STR(__A) CVAUX_STR_EXP(__A) -#define CVAUX_STRW_EXP(__A) L#__A +#define CVAUX_STRW_EXP(__A) L ## #__A #define CVAUX_STRW(__A) CVAUX_STRW_EXP(__A) #if CV_VERSION_REVISION From 0af9bf457ae81f76b45f982e8816a4ba1b0173f8 Mon Sep 17 00:00:00 2001 From: lewgate Date: Sun, 31 Jul 2016 16:22:53 +0800 Subject: [PATCH 21/96] Fix a latent bug for seam_finders.cpp when computing the source and destination points of the seam --- modules/stitching/src/seam_finders.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/stitching/src/seam_finders.cpp b/modules/stitching/src/seam_finders.cpp index 234f2047e6..b01e82d712 100644 --- a/modules/stitching/src/seam_finders.cpp +++ b/modules/stitching/src/seam_finders.cpp @@ -630,7 +630,7 @@ bool DpSeamFinder::getSeamTips(int comp1, int comp2, Point &p1, Point &p2) { double size1 = static_cast(points[i].size()), size2 = static_cast(points[j].size()); double cx1 = cvRound(sum[i].x / size1), cy1 = cvRound(sum[i].y / size1); - double cx2 = cvRound(sum[j].x / size2), cy2 = cvRound(sum[j].y / size1); + double cx2 = cvRound(sum[j].x / size2), cy2 = cvRound(sum[j].y / size2); double dist = (cx1 - cx2) * (cx1 - cx2) + (cy1 - cy2) * (cy1 - cy2); if (dist > maxDist) From ba14895fd7239ff680ca2795dd3986f597e1498a Mon Sep 17 00:00:00 2001 From: catree Date: Mon, 8 Aug 2016 04:06:46 +0200 Subject: [PATCH 22/96] Add figure for the pinhole camera model in the 2.4 documentation. --- ...camera_calibration_and_3d_reconstruction.rst | 5 +++++ .../calib3d/doc/pics/pinhole_camera_model.png | Bin 0 -> 97238 bytes 2 files changed, 5 insertions(+) create mode 100644 modules/calib3d/doc/pics/pinhole_camera_model.png diff --git a/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst b/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst index 1b8fa52d61..29b458e6ca 100644 --- a/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst +++ b/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst @@ -62,6 +62,11 @@ to the following (when v = f_y*y' + c_y \end{array} +The following figure illustrates the pinhole camera model. + +.. image:: pics/pinhole_camera_model.png + :align: center + Real lenses usually have some distortion, mostly radial distortion and slight tangential distortion. So, the above model is extended as: diff --git a/modules/calib3d/doc/pics/pinhole_camera_model.png b/modules/calib3d/doc/pics/pinhole_camera_model.png new file mode 100644 index 0000000000000000000000000000000000000000..3594de9684da817e29a229a0824988872a8a5823 GIT binary patch literal 97238 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 Vb*d4$tL(X~CS7rik{qQY8MY4f?l!9N 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 tfeLgdJv>BNOX;IAk8GWtD0J>A3kpNTIH` Date: Mon, 8 Aug 2016 10:58:46 +0200 Subject: [PATCH 23/96] fix small typo --- .../features2d/doc/common_interfaces_of_feature_detectors.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/features2d/doc/common_interfaces_of_feature_detectors.rst b/modules/features2d/doc/common_interfaces_of_feature_detectors.rst index 9f7b630953..a42ac07e14 100644 --- a/modules/features2d/doc/common_interfaces_of_feature_detectors.rst +++ b/modules/features2d/doc/common_interfaces_of_feature_detectors.rst @@ -147,7 +147,7 @@ for example: ``"GridFAST"``, ``"PyramidSTAR"`` . .. note:: When using the SIFT and SURF detector types be sure to add the following lines to your code * Add an extra include: `#include ` - * Add an initialisation function at the start of your code: `initModules_nonfree();` + * Add an initialisation function at the start of your code: `initModule_nonfree();` FastFeatureDetector ------------------- From a893395da8a6d13b238614eee558f2aabbfcdf35 Mon Sep 17 00:00:00 2001 From: catree Date: Thu, 11 Aug 2016 00:56:24 +0200 Subject: [PATCH 24/96] Fix typo bug in the calculation of some derivatives (dmxdt, dmydt, dmxdr, dmydr) in cvProjectPoints2 function. --- modules/calib3d/src/calibration.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/calib3d/src/calibration.cpp b/modules/calib3d/src/calibration.cpp index d9e821db41..b9cb224973 100644 --- a/modules/calib3d/src/calibration.cpp +++ b/modules/calib3d/src/calibration.cpp @@ -1078,9 +1078,9 @@ CV_IMPL void cvProjectPoints2( const CvMat* objectPoints, double dicdist2_dt = -icdist2*icdist2*(k[5]*dr2dt + 2*k[6]*r2*dr2dt + 3*k[7]*r4*dr2dt); double da1dt = 2*(x*dydt[j] + y*dxdt[j]); double dmxdt = fx*(dxdt[j]*cdist*icdist2 + x*dcdist_dt*icdist2 + x*cdist*dicdist2_dt + - k[2]*da1dt + k[3]*(dr2dt + 2*x*dxdt[j])); + k[2]*da1dt + k[3]*(dr2dt + 4*x*dxdt[j])); double dmydt = fy*(dydt[j]*cdist*icdist2 + y*dcdist_dt*icdist2 + y*cdist*dicdist2_dt + - k[2]*(dr2dt + 2*y*dydt[j]) + k[3]*da1dt); + k[2]*(dr2dt + 4*y*dydt[j]) + k[3]*da1dt); dpdt_p[j] = dmxdt; dpdt_p[dpdt_step+j] = dmydt; } @@ -1116,9 +1116,9 @@ CV_IMPL void cvProjectPoints2( const CvMat* objectPoints, double dicdist2_dr = -icdist2*icdist2*(k[5]*dr2dr + 2*k[6]*r2*dr2dr + 3*k[7]*r4*dr2dr); double da1dr = 2*(x*dydr + y*dxdr); double dmxdr = fx*(dxdr*cdist*icdist2 + x*dcdist_dr*icdist2 + x*cdist*dicdist2_dr + - k[2]*da1dr + k[3]*(dr2dr + 2*x*dxdr)); + k[2]*da1dr + k[3]*(dr2dr + 4*x*dxdr)); double dmydr = fy*(dydr*cdist*icdist2 + y*dcdist_dr*icdist2 + y*cdist*dicdist2_dr + - k[2]*(dr2dr + 2*y*dydr) + k[3]*da1dr); + k[2]*(dr2dr + 4*y*dydr) + k[3]*da1dr); dpdr_p[j] = dmxdr; dpdr_p[dpdr_step+j] = dmydr; } From 0f8023967c05ff0d2fd77889a091807d04ee7c5f Mon Sep 17 00:00:00 2001 From: Asal Mirzaieva Date: Thu, 18 Aug 2016 15:57:20 +0300 Subject: [PATCH 25/96] add reqiured includes to the "Load, Modify, and Save an Image" tutorial resolves #6944 --- doc/tutorials/introduction/load_save_image/load_save_image.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/tutorials/introduction/load_save_image/load_save_image.rst b/doc/tutorials/introduction/load_save_image/load_save_image.rst index bb77583415..15ece4ebd3 100644 --- a/doc/tutorials/introduction/load_save_image/load_save_image.rst +++ b/doc/tutorials/introduction/load_save_image/load_save_image.rst @@ -28,6 +28,8 @@ Here it is: #include #include + #include + #include using namespace cv; From 2d0fe514a01cc6cdcab7255bd454aba2c9f0e763 Mon Sep 17 00:00:00 2001 From: "PkLab.net" Date: Mon, 22 Aug 2016 19:57:42 +0200 Subject: [PATCH 26/96] Fix rho,phi exchange. Backport to 2.4 --- .../imgproc/doc/geometric_transformations.rst | 54 ++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/modules/imgproc/doc/geometric_transformations.rst b/modules/imgproc/doc/geometric_transformations.rst index 56c74ebf5f..50d26157b1 100644 --- a/modules/imgproc/doc/geometric_transformations.rst +++ b/modules/imgproc/doc/geometric_transformations.rst @@ -264,11 +264,11 @@ Remaps an image to polar space. :param src: Source image - :param dst: Destination image + :param dst: Destination image. It will have same size and type as src. :param center: The transformation center; - :param maxRadius: Inverse magnitude scale parameter. See below + :param maxRadius: The radius of the bounding circle to transform. It determines the inverse magnitude scale parameter too. See below :param flags: A combination of interpolation methods and the following optional flags: @@ -283,7 +283,7 @@ The function ``cvLinearPolar`` transforms the source image using the following t .. math:: - dst( \phi , \rho ) = src(x,y) + dst( \rho , \phi ) = src(x,y) * @@ -291,20 +291,34 @@ The function ``cvLinearPolar`` transforms the source image using the following t .. math:: - dst(x,y) = src( \phi , \rho ) + dst(x,y) = src( \rho , \phi ) where .. math:: - \rho = (src.width/maxRadius) \cdot \sqrt{x^2 + y^2} , \phi =atan(y/x) + \begin{array}{l} + I = (dx,dy) = (x - center.x,y - center.y) \\ + \rho = Kx \cdot \texttt{magnitude} (I) ,\\ + \phi = Ky \cdot \texttt{angle} (I)_{0..360 deg} + \end{array} +and -The function can not operate in-place. + .. math:: + + \begin{array}{l} + Kx = src.cols / maxRadius \\ + Ky = src.rows / 360 + \end{array} .. note:: + * The function can not operate in-place. + + * To calculate magnitude and angle in degrees :ocv:func:`cvCartToPolar` is used internally thus angles are measured from 0 to 360 with accuracy about 0.3 degrees. + * An example using the LinearPolar operation can be found at opencv_source_code/samples/c/polar_transforms.c @@ -319,11 +333,11 @@ Remaps an image to log-polar space. :param src: Source image - :param dst: Destination image + :param dst: Destination image. It will have same size and type as src. :param center: The transformation center; where the output precision is maximal - :param M: Magnitude scale parameter. See below + :param M: Magnitude scale parameter. It determines the radius of the bounding circle to transform too. See below :param flags: A combination of interpolation methods and the following optional flags: @@ -338,7 +352,7 @@ The function ``cvLogPolar`` transforms the source image using the following tran .. math:: - dst( \phi , \rho ) = src(x,y) + dst( \rho , \phi ) = src(x, y) * @@ -346,20 +360,36 @@ The function ``cvLogPolar`` transforms the source image using the following tran .. math:: - dst(x,y) = src( \phi , \rho ) + dst(x,y) = src( \rho , \phi ) where .. math:: - \rho = M \cdot \log{\sqrt{x^2 + y^2}} , \phi =atan(y/x) + \begin{array}{l} + I = (dx,dy) = (x - center.x,y - center.y) \\ + \rho = M \cdot log_e(\texttt{magnitude} (I)) ,\\ + \phi = Ky \cdot \texttt{angle} (I)_{0..360 deg} + \end{array} +and -The function emulates the human "foveal" vision and can be used for fast scale and rotation-invariant template matching, for object tracking and so forth. The function can not operate in-place. + .. math:: + + \begin{array}{l} + M = src.cols / log_e(maxRadius) \\ + Ky = src.rows / 360 + \end{array} + +The function emulates the human "foveal" vision and can be used for fast scale and rotation-invariant template matching, for object tracking and so forth. .. note:: + * The function can not operate in-place. + + * To calculate magnitude and angle in degrees :ocv:func:`cvCartToPolar` is used internally thus angles are measured from 0 to 360 with accuracy about 0.3 degrees. + * An example using the geometric logpolar operation in 4 applications can be found at opencv_source_code/samples/cpp/logpolar_bsm.cpp remap From a6e5ebafcf1ba5fa4b27f23b0581dee917e3198c Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 31 Aug 2016 15:18:25 +0300 Subject: [PATCH 27/96] calib3d: fix cornerSubPix memory error --- modules/calib3d/test/test_cornerssubpix.cpp | 14 ++++++++++++++ modules/imgproc/src/cornersubpix.cpp | 9 +++++++++ modules/imgproc/src/samplers.cpp | 2 ++ 3 files changed, 25 insertions(+) diff --git a/modules/calib3d/test/test_cornerssubpix.cpp b/modules/calib3d/test/test_cornerssubpix.cpp index eb07b47cbd..79ba4c2ffe 100644 --- a/modules/calib3d/test/test_cornerssubpix.cpp +++ b/modules/calib3d/test/test_cornerssubpix.cpp @@ -239,4 +239,18 @@ void CV_ChessboardSubpixelTest::generateIntrinsicParams() TEST(Calib3d_ChessboardSubPixDetector, accuracy) { CV_ChessboardSubpixelTest test; test.safe_run(); } +TEST(Calib3d_CornerSubPix, regression_7204) +{ + cv::Mat image(cv::Size(70, 38), CV_8UC1, cv::Scalar::all(0)); + image(cv::Rect(65, 26, 5, 5)).setTo(cv::Scalar::all(255)); + image(cv::Rect(55, 31, 8, 1)).setTo(cv::Scalar::all(255)); + image(cv::Rect(56, 35, 14, 2)).setTo(cv::Scalar::all(255)); + image(cv::Rect(66, 24, 4, 2)).setTo(cv::Scalar::all(255)); + image.at(24, 69) = 0; + std::vector corners; + corners.push_back(cv::Point2f(65, 30)); + cv::cornerSubPix(image, corners, cv::Size(3, 3), cv::Size(-1, -1), + cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1)); +} + /* End of file. */ diff --git a/modules/imgproc/src/cornersubpix.cpp b/modules/imgproc/src/cornersubpix.cpp index 1f55fa7513..013b245787 100644 --- a/modules/imgproc/src/cornersubpix.cpp +++ b/modules/imgproc/src/cornersubpix.cpp @@ -234,6 +234,15 @@ cvFindCornerSubPix( const void* srcarr, CvPoint2D32f* corners, err = (cI2.x - cI.x) * (cI2.x - cI.x) + (cI2.y - cI.y) * (cI2.y - cI.y); cI = cI2; + + /* if new point is too far from initial, it means poor convergence. */ + if (fabs(cI.x - cT.x) > win.width || fabs(cI.y - cT.y) > win.height) + { + cI = cT; + break; + } + cI.x = std::max(0.0f, std::min((float)size.width, cI.x)); + cI.y = std::max(0.0f, std::min((float)size.height, cI.y)); } while( ++iter < max_iters && err > eps ); diff --git a/modules/imgproc/src/samplers.cpp b/modules/imgproc/src/samplers.cpp index f1c11447bd..1f881c0d0d 100644 --- a/modules/imgproc/src/samplers.cpp +++ b/modules/imgproc/src/samplers.cpp @@ -392,6 +392,8 @@ CvStatus CV_STDCALL icvGetRectSubPix_8u32f_C1R ip.x = cvFloor( center.x ); ip.y = cvFloor( center.y ); + CV_DbgAssert(fabs(center.x - ip.x) <= 1.0f && fabs(center.y - ip.y) <= 1.0f); + if( win_size.width <= 0 || win_size.height <= 0 ) return CV_BADRANGE_ERR; From be7c924e7cd746c6febcbe45a515bee164c70453 Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Fri, 2 Sep 2016 01:50:54 +0300 Subject: [PATCH 28/96] integer overflow fixed in getContinuousSize() --- modules/core/src/precomp.hpp | 47 +++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/modules/core/src/precomp.hpp b/modules/core/src/precomp.hpp index c53224e0aa..6359c38354 100644 --- a/modules/core/src/precomp.hpp +++ b/modules/core/src/precomp.hpp @@ -127,39 +127,46 @@ template struct OpMax T operator ()(const T a, const T b) const { return std::max(a, b); } }; -inline Size getContinuousSize( const Mat& m1, int widthScale=1 ) +inline Size getContinuousSize_(int flags, int cols, int rows, int widthScale) { - return m1.isContinuous() ? Size(m1.cols*m1.rows*widthScale, 1) : - Size(m1.cols*widthScale, m1.rows); + int64 sz = (int64)cols * rows * widthScale; + return (flags & Mat::CONTINUOUS_FLAG) != 0 && + (int)sz == sz ? Size((int)sz, 1) : Size(cols * widthScale, rows); } -inline Size getContinuousSize( const Mat& m1, const Mat& m2, int widthScale=1 ) +inline Size getContinuousSize(const Mat& m1, int widthScale = 1) { - return (m1.flags & m2.flags & Mat::CONTINUOUS_FLAG) != 0 ? - Size(m1.cols*m1.rows*widthScale, 1) : Size(m1.cols*widthScale, m1.rows); + return getContinuousSize_(m1.flags, + m1.cols, m1.rows, widthScale); } -inline Size getContinuousSize( const Mat& m1, const Mat& m2, - const Mat& m3, int widthScale=1 ) +inline Size getContinuousSize(const Mat& m1, const Mat& m2, int widthScale = 1) { - return (m1.flags & m2.flags & m3.flags & Mat::CONTINUOUS_FLAG) != 0 ? - Size(m1.cols*m1.rows*widthScale, 1) : Size(m1.cols*widthScale, m1.rows); + return getContinuousSize_(m1.flags & m2.flags, + m1.cols, m1.rows, widthScale); } -inline Size getContinuousSize( const Mat& m1, const Mat& m2, - const Mat& m3, const Mat& m4, - int widthScale=1 ) +inline Size getContinuousSize(const Mat& m1, const Mat& m2, + const Mat& m3, int widthScale = 1) { - return (m1.flags & m2.flags & m3.flags & m4.flags & Mat::CONTINUOUS_FLAG) != 0 ? - Size(m1.cols*m1.rows*widthScale, 1) : Size(m1.cols*widthScale, m1.rows); + return getContinuousSize_(m1.flags & m2.flags & m3.flags, + m1.cols, m1.rows, widthScale); } -inline Size getContinuousSize( const Mat& m1, const Mat& m2, - const Mat& m3, const Mat& m4, - const Mat& m5, int widthScale=1 ) +inline Size getContinuousSize(const Mat& m1, const Mat& m2, + const Mat& m3, const Mat& m4, + int widthScale = 1) { - return (m1.flags & m2.flags & m3.flags & m4.flags & m5.flags & Mat::CONTINUOUS_FLAG) != 0 ? - Size(m1.cols*m1.rows*widthScale, 1) : Size(m1.cols*widthScale, m1.rows); + return getContinuousSize_(m1.flags & m2.flags & m3.flags & m4.flags, + m1.cols, m1.rows, widthScale); +} + +inline Size getContinuousSize(const Mat& m1, const Mat& m2, + const Mat& m3, const Mat& m4, + const Mat& m5, int widthScale = 1) +{ + return getContinuousSize_(m1.flags & m2.flags & m3.flags & m4.flags & m5.flags, + m1.cols, m1.rows, widthScale); } struct NoVec From 726efee4d2a4b4f075a9e37fca445b800186fddb Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Sat, 3 Sep 2016 20:28:54 +0300 Subject: [PATCH 29/96] fixed http://code.opencv.org/issues/4278 --- modules/core/src/matmul.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/core/src/matmul.cpp b/modules/core/src/matmul.cpp index d537b7dced..4be9c4daa3 100644 --- a/modules/core/src/matmul.cpp +++ b/modules/core/src/matmul.cpp @@ -1013,7 +1013,7 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, GEMMBlockMulFunc blockMulFunc; GEMMStoreFunc storeFunc; Mat *matD = &D, tmat; - int tmat_size = 0; + size_t tmat_size = 0; const uchar* Cdata = C.data; size_t Cstep = C.data ? (size_t)C.step : 0; AutoBuffer buf; @@ -1046,7 +1046,7 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, if( D.data == A.data || D.data == B.data ) { - tmat_size = d_size.width*d_size.height*CV_ELEM_SIZE(type); + tmat_size = (size_t)d_size.width*d_size.height*CV_ELEM_SIZE(type); // Allocate tmat later, once the size of buf is known matD = &tmat; } @@ -1137,7 +1137,7 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, int is_b_t = flags & GEMM_2_T; int elem_size = CV_ELEM_SIZE(type); int dk0_1, dk0_2; - int a_buf_size = 0, b_buf_size, d_buf_size; + size_t a_buf_size = 0, b_buf_size, d_buf_size; uchar* a_buf = 0; uchar* b_buf = 0; uchar* d_buf = 0; @@ -1178,8 +1178,8 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, dn0 = block_size / dk0; dk0_1 = (dn0+dn0/8+2) & -2; - b_buf_size = (dk0+dk0/8+1)*dk0_1*elem_size; - d_buf_size = (dk0+dk0/8+1)*dk0_1*work_elem_size; + b_buf_size = (size_t)(dk0+dk0/8+1)*dk0_1*elem_size; + d_buf_size = (size_t)(dk0+dk0/8+1)*dk0_1*work_elem_size; if( is_a_t ) { From b28d13430c78e9df7e6e2a50b34c0fbd717ff8d1 Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Sat, 3 Sep 2016 21:49:54 +0300 Subject: [PATCH 30/96] fixed http://code.opencv.org/issues/3828 --- modules/core/src/stat.cpp | 5 +++++ modules/core/test/test_arithm.cpp | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/modules/core/src/stat.cpp b/modules/core/src/stat.cpp index 3c24f02541..e88d175108 100644 --- a/modules/core/src/stat.cpp +++ b/modules/core/src/stat.cpp @@ -2587,6 +2587,11 @@ void cv::findNonZero( InputArray _src, OutputArray _idx ) Mat src = _src.getMat(); CV_Assert( src.type() == CV_8UC1 ); int n = countNonZero(src); + if (n == 0) + { + _idx.release(); + return; + } if( _idx.kind() == _InputArray::MAT && !_idx.getMatRef().isContinuous() ) _idx.release(); _idx.create(n, 1, CV_32SC2); diff --git a/modules/core/test/test_arithm.cpp b/modules/core/test/test_arithm.cpp index ac88615955..57adb89210 100644 --- a/modules/core/test/test_arithm.cpp +++ b/modules/core/test/test_arithm.cpp @@ -1810,3 +1810,13 @@ TEST(MinMaxLoc, Mat_IntMax_Without_Mask) ASSERT_EQ(Point(0, 0), minLoc); ASSERT_EQ(Point(0, 0), maxLoc); } + + +TEST(Core_FindNonZero, singular) +{ + Mat img(10, 10, CV_8U, Scalar::all(0)); + vector pts, pts2(10); + findNonZero(img, pts); + findNonZero(img, pts2); + ASSERT_TRUE(pts.empty() && pts2.empty()); +} \ No newline at end of file From 0a3a2df4333bfbf6a43f96a3fa2415f17c7145b9 Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Sat, 3 Sep 2016 21:58:19 +0300 Subject: [PATCH 31/96] fixed U non-orthogonality in SVD (http://code.opencv.org/issues/3801) --- modules/core/src/lapack.cpp | 2 +- modules/core/test/test_mat.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/core/src/lapack.cpp b/modules/core/src/lapack.cpp index 7ee84a6d45..0168610572 100644 --- a/modules/core/src/lapack.cpp +++ b/modules/core/src/lapack.cpp @@ -688,7 +688,7 @@ JacobiSVDImpl_(_Tp* At, size_t astep, _Tp* _W, _Tp* Vt, size_t vstep, At[i*astep + k] = t; asum += std::abs(t); } - asum = asum ? 1/asum : 0; + asum = asum > eps * 100 ? 1 / asum : 0; for( k = 0; k < m; k++ ) At[i*astep + k] *= asum; } diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index f854abed7e..0aef147b60 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -919,6 +919,20 @@ TEST(Core_Mat, copyNx1ToVector) ASSERT_PRED_FORMAT2(cvtest::MatComparator(0, 0), ref_dst16, cv::Mat_(dst16)); } +TEST(Core_SVD, orthogonality) +{ + for (int i = 0; i < 2; i++) + { + int type = i == 0 ? CV_32F : CV_64F; + Mat mat_D(2, 2, type); + mat_D.setTo(88.); + Mat mat_U, mat_W; + SVD::compute(mat_D, mat_W, mat_U, noArray(), SVD::FULL_UV); + mat_U *= mat_U.t(); + ASSERT_LT(norm(mat_U, Mat::eye(2, 2, type), NORM_INF), 1e-5); + } +} + TEST(Core_Mat, multiDim) { int d[]={3,3,3}; From c7045184ce220a04796d8e9072ac42d2d362dc71 Mon Sep 17 00:00:00 2001 From: Bernd Kuhls Date: Tue, 6 Sep 2016 11:49:00 +0200 Subject: [PATCH 32/96] types_c.h: Fix compiling VFP assembler code Replace asm by __asm__ according to https://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords as suggested by Arnout Vandecappelle: http://lists.busybox.net/pipermail/buildroot/2016-September/171491.html to fix build errors in ffmpeg with opencv2 support detected by buildroot autobuilders: http://autobuild.buildroot.net/results/c32/c32a21240a9933796ee850349a62ff3c2314f25c/build-end.log Signed-off-by: Bernd Kuhls --- modules/core/include/opencv2/core/types_c.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/types_c.h b/modules/core/include/opencv2/core/types_c.h index c21cd2c758..771715d5df 100644 --- a/modules/core/include/opencv2/core/types_c.h +++ b/modules/core/include/opencv2/core/types_c.h @@ -318,7 +318,7 @@ enum { int res; \ float temp; \ (void)temp; \ - asm(_asm_string : [res] "=r" (res), [temp] "=w" (temp) : [value] "w" (_value)); \ + __asm__(_asm_string : [res] "=r" (res), [temp] "=w" (temp) : [value] "w" (_value)); \ return res; // 2. version for double #ifdef __clang__ From cb52d249fed9c72fb2bb75a7c5f46a915ec209b6 Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Tue, 6 Sep 2016 14:09:44 +0300 Subject: [PATCH 33/96] fixed optional args processing in SVD::compute() --- modules/core/src/lapack.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/core/src/lapack.cpp b/modules/core/src/lapack.cpp index 0168610572..3084a5354b 100644 --- a/modules/core/src/lapack.cpp +++ b/modules/core/src/lapack.cpp @@ -1560,18 +1560,18 @@ static void _SVDcompute( InputArray _aarr, OutputArray _w, JacobiSVD(temp_a.ptr(), temp_u.step, temp_w.ptr(), temp_v.ptr(), temp_v.step, m, n, compute_uv ? urows : 0); } - temp_w.copyTo(_w); + if(_w.needed()) temp_w.copyTo(_w); if( compute_uv ) { if( !at ) { - transpose(temp_u, _u); - temp_v.copyTo(_vt); + if(_u.needed()) transpose(temp_u, _u); + if(_vt.needed()) temp_v.copyTo(_vt); } else { - transpose(temp_v, _u); - temp_u.copyTo(_vt); + if(_u.needed()) transpose(temp_v, _u); + if(_vt.needed()) temp_u.copyTo(_vt); } } } From 98408257430e4f7cda150d8398be8b7024c11745 Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Mon, 5 Sep 2016 21:55:17 +0300 Subject: [PATCH 34/96] added test checking http://code.opencv.org/issues/4050 --- modules/core/test/test_mat.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index 0aef147b60..d5b7ab97e1 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -919,6 +919,12 @@ TEST(Core_Mat, copyNx1ToVector) ASSERT_PRED_FORMAT2(cvtest::MatComparator(0, 0), ref_dst16, cv::Mat_(dst16)); } +TEST(Core_InputArray, empty) +{ + vector > data; + ASSERT_TRUE(_InputArray(data).empty()); +} + TEST(Core_SVD, orthogonality) { for (int i = 0; i < 2; i++) From 6d691f2e05aa1062e3381373eba2e494d5955678 Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Mon, 5 Sep 2016 22:14:47 +0300 Subject: [PATCH 35/96] added test for http://code.opencv.org/issues/1918 --- modules/core/test/test_mat.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index d5b7ab97e1..0d35e60780 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -925,6 +925,19 @@ TEST(Core_InputArray, empty) ASSERT_TRUE(_InputArray(data).empty()); } + +TEST(Core_CopyMask, bug1918) +{ + Mat_ tmpSrc(100, 100); + tmpSrc = 124; + Mat_ tmpMask(100, 100); + tmpMask = 255; + Mat_ tmpDst(100, 100); + tmpDst = 2; + tmpSrc.copyTo(tmpDst, tmpMask); + ASSERT_EQ(sum(tmpDst)[0], 124 * 100 * 100); +} + TEST(Core_SVD, orthogonality) { for (int i = 0; i < 2; i++) From 27dd27400a5b16825741fa3c8aeb37ae5c77c51a Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Mon, 5 Sep 2016 22:32:57 +0300 Subject: [PATCH 36/96] fixed invalid output of cv::dft when using DFT_ROWS + DFT_COMPLEX_OUTPUT (http://code.opencv.org/issues/3428) --- modules/core/src/dxt.cpp | 83 +++++++++++++++++++--------------- modules/core/test/test_dxt.cpp | 21 +++++++++ 2 files changed, 68 insertions(+), 36 deletions(-) diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index 033bf45120..79cb31ceed 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -1473,6 +1473,47 @@ typedef IppStatus (CV_STDCALL* IppDFTGetSizeFunc)(int, int, IppHintAlgorithm, in typedef IppStatus (CV_STDCALL* IppDFTInitFunc)(int, int, IppHintAlgorithm, void*, uchar*); #endif +namespace cv +{ +static void complementComplexOutput(Mat& dst, int len, int dft_dims) +{ + int i, n = dst.cols; + size_t elem_size = dst.elemSize1(); + if (elem_size == sizeof(float)) + { + float* p0 = dst.ptr(); + size_t dstep = dst.step / sizeof(p0[0]); + for (i = 0; i < len; i++) + { + float* p = p0 + dstep*i; + float* q = dft_dims == 1 || i == 0 || i * 2 == len ? p : p0 + dstep*(len - i); + + for (int j = 1; j < (n + 1) / 2; j++) + { + p[(n - j) * 2] = q[j * 2]; + p[(n - j) * 2 + 1] = -q[j * 2 + 1]; + } + } + } + else + { + double* p0 = dst.ptr(); + size_t dstep = dst.step / sizeof(p0[0]); + for (i = 0; i < len; i++) + { + double* p = p0 + dstep*i; + double* q = dft_dims == 1 || i == 0 || i * 2 == len ? p : p0 + dstep*(len - i); + + for (int j = 1; j < (n + 1) / 2; j++) + { + p[(n - j) * 2] = q[j * 2]; + p[(n - j) * 2 + 1] = -q[j * 2 + 1]; + } + } + } +} +} + void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows ) { static DFTFunc dft_tbl[6] = @@ -1688,8 +1729,12 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows ) memset( dptr0, 0, dst_full_len ); } - if( stage != 1 ) + if (stage != 1) + { + if (!inv && real_transform && dst.channels() == 2) + complementComplexOutput(dst, nonzero_rows, 1); break; + } src = dst; } else @@ -1831,41 +1876,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows ) if( stage != 0 ) { if( !inv && real_transform && dst.channels() == 2 && len > 1 ) - { - int n = dst.cols; - if( elem_size == (int)sizeof(float) ) - { - float* p0 = (float*)dst.data; - size_t dstep = dst.step/sizeof(p0[0]); - for( i = 0; i < len; i++ ) - { - float* p = p0 + dstep*i; - float* q = i == 0 || i*2 == len ? p : p0 + dstep*(len-i); - - for( int j = 1; j < (n+1)/2; j++ ) - { - p[(n-j)*2] = q[j*2]; - p[(n-j)*2+1] = -q[j*2+1]; - } - } - } - else - { - double* p0 = (double*)dst.data; - size_t dstep = dst.step/sizeof(p0[0]); - for( i = 0; i < len; i++ ) - { - double* p = p0 + dstep*i; - double* q = i == 0 || i*2 == len ? p : p0 + dstep*(len-i); - - for( int j = 1; j < (n+1)/2; j++ ) - { - p[(n-j)*2] = q[j*2]; - p[(n-j)*2+1] = -q[j*2+1]; - } - } - } - } + complementComplexOutput(dst, len, 2); break; } src = dst; diff --git a/modules/core/test/test_dxt.cpp b/modules/core/test/test_dxt.cpp index 1c0c7b00bf..33ddb02660 100644 --- a/modules/core/test/test_dxt.cpp +++ b/modules/core/test/test_dxt.cpp @@ -866,3 +866,24 @@ protected: }; TEST(Core_DFT, complex_output) { Core_DFTComplexOutputTest test; test.safe_run(); } + +TEST(Core_DFT, complex_output2) +{ + for (int i = 0; i < 100; i++) + { + int type = theRNG().uniform(0, 2) ? CV_64F : CV_32F; + int m = theRNG().uniform(1, 10); + int n = theRNG().uniform(1, 10); + Mat x(m, n, type), out; + randu(x, -1., 1.); + dft(x, out, DFT_ROWS | DFT_COMPLEX_OUTPUT); + double nrm = norm(out, NORM_INF); + double thresh = n*m * 2; + if (nrm > thresh) + { + cout << "x: " << x << endl; + cout << "out: " << out << endl; + ASSERT_LT(nrm, thresh); + } + } +} From b8b7f155a5be52a0bb85a748fe69cac447928ccb Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Mon, 5 Sep 2016 22:33:31 +0300 Subject: [PATCH 37/96] fixed random failures in Core_DFT.complex_output2 test (the case of input_mat.cols == 1) --- modules/core/src/dxt.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index 79cb31ceed..90eb392f58 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -1070,11 +1070,12 @@ RealDFT( const T* src, T* dst, int n, int nf, int* factors, const int* itab, } } - if( complex_output && (n & 1) == 0 ) + if (complex_output && ((n & 1) == 0 || n == 1)) { dst[-1] = dst[0]; dst[0] = 0; - dst[n] = 0; + if (n > 1) + dst[n] = 0; } } From c68b9328ca85ad0be1fb756b6db4551e2ed74aae Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 14 Sep 2016 20:00:28 +0300 Subject: [PATCH 38/96] android: workaround for Android NDK-8e clang ICE --- modules/ocl/src/stereo_csbp.cpp | 144 ++++++++++++++++---------------- 1 file changed, 71 insertions(+), 73 deletions(-) diff --git a/modules/ocl/src/stereo_csbp.cpp b/modules/ocl/src/stereo_csbp.cpp index 409d6f21c2..ff78a19c3b 100644 --- a/modules/ocl/src/stereo_csbp.cpp +++ b/modules/ocl/src/stereo_csbp.cpp @@ -76,11 +76,11 @@ namespace cv /////////////////////////////////init_data_cost////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// static void init_data_cost_caller(const oclMat &left, const oclMat &right, oclMat &temp, - StereoConstantSpaceBP &rthis, + StereoConstantSpaceBP *pThis, int msg_step, int h, int w, int level) { Context *clCxt = left.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; int channels = left.oclchannels(); string kernelName = get_kernel_name("init_data_cost_", data_type); @@ -104,12 +104,12 @@ namespace cv openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&level)); openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&channels)); openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&msg_step)); - openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_float), (void *)&rthis.data_weight)); - openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_float), (void *)&rthis.max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_float), (void *)&pThis->data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_float), (void *)&pThis->max_data_term)); openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&cdisp_step1)); - openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&pThis->min_disp_th)); openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&left.step)); - openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&pThis->ndisp)); openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getClCommandQueuePtr(), kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); @@ -118,12 +118,12 @@ namespace cv } static void init_data_cost_reduce_caller(const oclMat &left, const oclMat &right, oclMat &temp, - StereoConstantSpaceBP &rthis, + StereoConstantSpaceBP *pThis, int msg_step, int h, int w, int level) { Context *clCxt = left.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; int channels = left.oclchannels(); int win_size = (int)std::pow(2.f, level); @@ -135,7 +135,7 @@ namespace cv //size_t blockSize = threadsNum; size_t localThreads[3] = {(size_t)win_size, 1, (size_t)threadsNum / win_size}; size_t globalThreads[3] = { w *localThreads[0], - h * divUp(rthis.ndisp, localThreads[2]) *localThreads[1], 1 * localThreads[2] + h * divUp(pThis->ndisp, localThreads[2]) *localThreads[1], 1 * localThreads[2] }; int local_mem_size = threadsNum * sizeof(float); @@ -153,11 +153,11 @@ namespace cv openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&h)); openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&win_size)); openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&channels)); - openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&pThis->ndisp)); openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&left.step)); - openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_float), (void *)&rthis.data_weight)); - openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_float), (void *)&rthis.max_data_term)); - openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_float), (void *)&pThis->data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_float), (void *)&pThis->max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_int), (void *)&pThis->min_disp_th)); openCLSafeCall(clSetKernelArg(kernel, 15, sizeof(cl_int), (void *)&cdisp_step1)); openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_int), (void *)&msg_step)); openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getClCommandQueuePtr(), kernel, 3, NULL, @@ -167,11 +167,11 @@ namespace cv } static void get_first_initial_local_caller(uchar *data_cost_selected, uchar *disp_selected_pyr, - oclMat &temp, StereoConstantSpaceBP &rthis, + oclMat &temp, StereoConstantSpaceBP *pThis, int h, int w, int nr_plane, int msg_step) { Context *clCxt = temp.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; string kernelName = get_kernel_name("get_first_k_initial_local_", data_type); @@ -191,7 +191,7 @@ namespace cv openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&nr_plane)); openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&msg_step)); openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&disp_step)); - openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&pThis->ndisp)); openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getClCommandQueuePtr(), kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); @@ -199,11 +199,11 @@ namespace cv openCLSafeCall(clReleaseKernel(kernel)); } static void get_first_initial_global_caller(uchar *data_cost_selected, uchar *disp_selected_pyr, - oclMat &temp, StereoConstantSpaceBP &rthis, + oclMat &temp, StereoConstantSpaceBP *pThis, int h, int w, int nr_plane, int msg_step) { Context *clCxt = temp.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; string kernelName = get_kernel_name("get_first_k_initial_global_", data_type); @@ -226,7 +226,7 @@ namespace cv openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&nr_plane)); openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&msg_step)); openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&disp_step)); - openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&pThis->ndisp)); openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getClCommandQueuePtr(), kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); @@ -234,23 +234,23 @@ namespace cv openCLSafeCall(clReleaseKernel(kernel)); } - static void init_data_cost(const oclMat &left, const oclMat &right, oclMat &temp, StereoConstantSpaceBP &rthis, + static void init_data_cost(const oclMat &left, const oclMat &right, oclMat &temp, StereoConstantSpaceBP *pThis, uchar *disp_selected_pyr, uchar *data_cost_selected, size_t msg_step, int h, int w, int level, int nr_plane) { if(level <= 1) - init_data_cost_caller(left, right, temp, rthis, msg_step, h, w, level); + init_data_cost_caller(left, right, temp, pThis, msg_step, h, w, level); else - init_data_cost_reduce_caller(left, right, temp, rthis, msg_step, h, w, level); + init_data_cost_reduce_caller(left, right, temp, pThis, msg_step, h, w, level); - if(rthis.use_local_init_data_cost == true) + if(pThis->use_local_init_data_cost == true) { - get_first_initial_local_caller(data_cost_selected, disp_selected_pyr, temp, rthis, h, w, nr_plane, msg_step); + get_first_initial_local_caller(data_cost_selected, disp_selected_pyr, temp, pThis, h, w, nr_plane, msg_step); } else { - get_first_initial_global_caller(data_cost_selected, disp_selected_pyr, temp, rthis, h, w, + get_first_initial_global_caller(data_cost_selected, disp_selected_pyr, temp, pThis, h, w, nr_plane, msg_step); } } @@ -259,13 +259,13 @@ namespace cv ///////////////////////////////////compute_data_cost////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// static void compute_data_cost_caller(uchar *disp_selected_pyr, uchar *data_cost, - StereoConstantSpaceBP &rthis, int msg_step1, + StereoConstantSpaceBP *pThis, int msg_step1, int msg_step2, const oclMat &left, const oclMat &right, int h, int w, int h2, int level, int nr_plane) { Context *clCxt = left.clCxt; int channels = left.oclchannels(); - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; string kernelName = get_kernel_name("compute_data_cost_", data_type); @@ -290,10 +290,10 @@ namespace cv openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&msg_step2)); openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&disp_step1)); openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&disp_step2)); - openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_float), (void *)&rthis.data_weight)); - openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_float), (void *)&rthis.max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_float), (void *)&pThis->data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_float), (void *)&pThis->max_data_term)); openCLSafeCall(clSetKernelArg(kernel, 15, sizeof(cl_int), (void *)&left.step)); - openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_int), (void *)&pThis->min_disp_th)); openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getClCommandQueuePtr(), kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); @@ -301,12 +301,12 @@ namespace cv openCLSafeCall(clReleaseKernel(kernel)); } static void compute_data_cost_reduce_caller(uchar *disp_selected_pyr, uchar *data_cost, - StereoConstantSpaceBP &rthis, int msg_step1, + StereoConstantSpaceBP *pThis, int msg_step1, int msg_step2, const oclMat &left, const oclMat &right, int h, int w, int h2, int level, int nr_plane) { Context *clCxt = left.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; int channels = left.oclchannels(); int win_size = (int)std::pow(2.f, level); @@ -341,25 +341,25 @@ namespace cv openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&msg_step2)); openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_int), (void *)&disp_step1)); openCLSafeCall(clSetKernelArg(kernel, 15, sizeof(cl_int), (void *)&disp_step2)); - openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_float), (void *)&rthis.data_weight)); - openCLSafeCall(clSetKernelArg(kernel, 17, sizeof(cl_float), (void *)&rthis.max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_float), (void *)&pThis->data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 17, sizeof(cl_float), (void *)&pThis->max_data_term)); openCLSafeCall(clSetKernelArg(kernel, 18, sizeof(cl_int), (void *)&left.step)); - openCLSafeCall(clSetKernelArg(kernel, 19, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clSetKernelArg(kernel, 19, sizeof(cl_int), (void *)&pThis->min_disp_th)); openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getClCommandQueuePtr(), kernel, 3, NULL, globalThreads, localThreads, 0, NULL, NULL)); clFinish(*(cl_command_queue*)getClCommandQueuePtr()); openCLSafeCall(clReleaseKernel(kernel)); } - static void compute_data_cost(uchar *disp_selected_pyr, uchar *data_cost, StereoConstantSpaceBP &rthis, + static void compute_data_cost(uchar *disp_selected_pyr, uchar *data_cost, StereoConstantSpaceBP *pThis, int msg_step1, int msg_step2, const oclMat &left, const oclMat &right, int h, int w, int h2, int level, int nr_plane) { if(level <= 1) - compute_data_cost_caller(disp_selected_pyr, data_cost, rthis, msg_step1, msg_step2, + compute_data_cost_caller(disp_selected_pyr, data_cost, pThis, msg_step1, msg_step2, left, right, h, w, h2, level, nr_plane); else - compute_data_cost_reduce_caller(disp_selected_pyr, data_cost, rthis, msg_step1, msg_step2, + compute_data_cost_reduce_caller(disp_selected_pyr, data_cost, pThis, msg_step1, msg_step2, left, right, h, w, h2, level, nr_plane); } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -368,12 +368,12 @@ namespace cv static void init_message(uchar *u_new, uchar *d_new, uchar *l_new, uchar *r_new, uchar *u_cur, uchar *d_cur, uchar *l_cur, uchar *r_cur, uchar *disp_selected_pyr_new, uchar *disp_selected_pyr_cur, - uchar *data_cost_selected, uchar *data_cost, oclMat &temp, StereoConstantSpaceBP rthis, + uchar *data_cost_selected, uchar *data_cost, oclMat &temp, StereoConstantSpaceBP *pThis, size_t msg_step1, size_t msg_step2, int h, int w, int nr_plane, int h2, int w2, int nr_plane2) { Context *clCxt = temp.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; string kernelName = get_kernel_name("init_message_", data_type); @@ -419,11 +419,11 @@ namespace cv ///////////////////////////calc_all_iterations//////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// static void calc_all_iterations_caller(uchar *u, uchar *d, uchar *l, uchar *r, uchar *data_cost_selected, - uchar *disp_selected_pyr, oclMat &temp, StereoConstantSpaceBP rthis, + uchar *disp_selected_pyr, oclMat &temp, StereoConstantSpaceBP *pThis, int msg_step, int h, int w, int nr_plane, int i) { Context *clCxt = temp.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; string kernelName = get_kernel_name("compute_message_", data_type); @@ -447,10 +447,10 @@ namespace cv openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&w)); openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&nr_plane)); openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&i)); - openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_float), (void *)&rthis.max_disc_term)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_float), (void *)&pThis->max_disc_term)); openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&disp_step)); openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&msg_step)); - openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_float), (void *)&rthis.disc_single_jump)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_float), (void *)&pThis->disc_single_jump)); openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getClCommandQueuePtr(), kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); @@ -458,11 +458,11 @@ namespace cv openCLSafeCall(clReleaseKernel(kernel)); } static void calc_all_iterations(uchar *u, uchar *d, uchar *l, uchar *r, uchar *data_cost_selected, - uchar *disp_selected_pyr, oclMat &temp, StereoConstantSpaceBP rthis, + uchar *disp_selected_pyr, oclMat &temp, StereoConstantSpaceBP *pThis, int msg_step, int h, int w, int nr_plane) { - for(int t = 0; t < rthis.iters; t++) - calc_all_iterations_caller(u, d, l, r, data_cost_selected, disp_selected_pyr, temp, rthis, + for(int t = 0; t < pThis->iters; t++) + calc_all_iterations_caller(u, d, l, r, data_cost_selected, disp_selected_pyr, temp, pThis, msg_step, h, w, nr_plane, t & 1); } @@ -470,11 +470,11 @@ namespace cv //////////////////////////compute_disp//////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// static void compute_disp(uchar *u, uchar *d, uchar *l, uchar *r, uchar *data_cost_selected, - uchar *disp_selected_pyr, StereoConstantSpaceBP &rthis, size_t msg_step, + uchar *disp_selected_pyr, StereoConstantSpaceBP *pThis, size_t msg_step, oclMat &disp, int nr_plane) { Context *clCxt = disp.clCxt; - int data_type = rthis.msg_type; + int data_type = pThis->msg_type; string kernelName = get_kernel_name("compute_disp_", data_type); @@ -550,20 +550,20 @@ cv::ocl::StereoConstantSpaceBP::StereoConstantSpaceBP(int ndisp_, int iters_, in : ndisp(ndisp_), iters(iters_), levels(levels_), nr_plane(nr_plane_), max_data_term(max_data_term_), data_weight(data_weight_), max_disc_term(max_disc_term_), disc_single_jump(disc_single_jump_), min_disp_th(min_disp_th_), - msg_type(msg_type_), use_local_init_data_cost(true) + msg_type(msg_type_), use_local_init_data_cost(TRUE) { CV_Assert(msg_type_ == CV_32F || msg_type_ == CV_16S); } template -static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2], oclMat l[2], oclMat r[2], +static void csbp_operator(StereoConstantSpaceBP *pThis, oclMat u[2], oclMat d[2], oclMat l[2], oclMat r[2], oclMat disp_selected_pyr[2], oclMat &data_cost, oclMat &data_cost_selected, oclMat &temp, oclMat &out, const oclMat &left, const oclMat &right, oclMat &disp) { - CV_DbgAssert(0 < rthis.ndisp && 0 < rthis.iters && 0 < rthis.levels && 0 < rthis.nr_plane + CV_DbgAssert(0 < pThis->ndisp && 0 < pThis->iters && 0 < pThis->levels && 0 < pThis->nr_plane && left.rows == right.rows && left.cols == right.cols && left.type() == right.type()); - CV_Assert(rthis.levels <= 8 && (left.type() == CV_8UC1 || left.type() == CV_8UC3)); + CV_Assert(pThis->levels <= 8 && (left.type() == CV_8UC1 || left.type() == CV_8UC3)); const Scalar zero = Scalar::all(0); @@ -571,8 +571,8 @@ static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2] int rows = left.rows; int cols = left.cols; - rthis.levels = min(rthis.levels, int(log((double)rthis.ndisp) / log(2.0))); - int levels = rthis.levels; + pThis->levels = min(pThis->levels, int(log((double)pThis->ndisp) / log(2.0))); + int levels = pThis->levels; AutoBuffer buf(levels * 4); @@ -583,7 +583,7 @@ static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2] cols_pyr[0] = cols; rows_pyr[0] = rows; - nr_plane_pyr[0] = rthis.nr_plane; + nr_plane_pyr[0] = pThis->nr_plane; const int n = 64; step_pyr[0] = alignSize(cols * sizeof(T), n) / sizeof(T); @@ -617,16 +617,16 @@ static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2] data_cost_selected.create(msg_size, DataType::type); Size temp_size = data_cost_size; - if (data_cost_size.width * data_cost_size.height < step_pyr[0] * rows_pyr[levels - 1] * rthis.ndisp) - temp_size = Size(step_pyr[0], rows_pyr[levels - 1] * rthis.ndisp); + if (data_cost_size.width * data_cost_size.height < step_pyr[0] * rows_pyr[levels - 1] * pThis->ndisp) + temp_size = Size(step_pyr[0], rows_pyr[levels - 1] * pThis->ndisp); temp.create(temp_size, DataType::type); temp = zero; ///////////////////////////////// Compute//////////////////////////////////////////////// - //csbp::load_constants(rthis.ndisp, rthis.max_data_term, rthis.data_weight, - // rthis.max_disc_term, rthis.disc_single_jump, rthis.min_disp_th, left, right, temp); + //csbp::load_constants(pThis->ndisp, pThis->max_data_term, pThis->data_weight, + // pThis->max_disc_term, pThis->disc_single_jump, pThis->min_disp_th, left, right, temp); l[0] = zero; d[0] = zero; @@ -650,14 +650,14 @@ static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2] { if (i == levels - 1) { - cv::ocl::stereoCSBP::init_data_cost(left, right, temp, rthis, disp_selected_pyr[cur_idx].data, + cv::ocl::stereoCSBP::init_data_cost(left, right, temp, pThis, disp_selected_pyr[cur_idx].data, data_cost_selected.data, step_pyr[0], rows_pyr[i], cols_pyr[i], i, nr_plane_pyr[i]); } else { cv::ocl::stereoCSBP::compute_data_cost( - disp_selected_pyr[cur_idx].data, data_cost.data, rthis, step_pyr[0], + disp_selected_pyr[cur_idx].data, data_cost.data, pThis, step_pyr[0], step_pyr[0], left, right, rows_pyr[i], cols_pyr[i], rows_pyr[i + 1], i, nr_plane_pyr[i + 1]); @@ -666,14 +666,14 @@ static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2] cv::ocl::stereoCSBP::init_message(u[new_idx].data, d[new_idx].data, l[new_idx].data, r[new_idx].data, u[cur_idx].data, d[cur_idx].data, l[cur_idx].data, r[cur_idx].data, disp_selected_pyr[new_idx].data, disp_selected_pyr[cur_idx].data, - data_cost_selected.data, data_cost.data, temp, rthis, step_pyr[0], + data_cost_selected.data, data_cost.data, temp, pThis, step_pyr[0], step_pyr[0], rows_pyr[i], cols_pyr[i], nr_plane_pyr[i], rows_pyr[i + 1], cols_pyr[i + 1], nr_plane_pyr[i + 1]); cur_idx = new_idx; } cv::ocl::stereoCSBP::calc_all_iterations(u[cur_idx].data, d[cur_idx].data, l[cur_idx].data, r[cur_idx].data, data_cost_selected.data, disp_selected_pyr[cur_idx].data, temp, - rthis, step_pyr[0], rows_pyr[i], cols_pyr[i], nr_plane_pyr[i]); + pThis, step_pyr[0], rows_pyr[i], cols_pyr[i], nr_plane_pyr[i]); } if (disp.empty()) @@ -683,23 +683,21 @@ static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2] out = zero; stereoCSBP::compute_disp(u[cur_idx].data, d[cur_idx].data, l[cur_idx].data, r[cur_idx].data, - data_cost_selected.data, disp_selected_pyr[cur_idx].data, rthis, step_pyr[0], + data_cost_selected.data, disp_selected_pyr[cur_idx].data, pThis, step_pyr[0], out, nr_plane_pyr[0]); if (disp.type() != CV_16S) out.convertTo(disp, disp.type()); } -typedef void (*csbp_operator_t)(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2], oclMat l[2], oclMat r[2], - oclMat disp_selected_pyr[2], oclMat &data_cost, oclMat &data_cost_selected, - oclMat &temp, oclMat &out, const oclMat &left, const oclMat &right, oclMat &disp); - -const static csbp_operator_t operators[] = {0, 0, 0, csbp_operator, 0, csbp_operator, 0, 0}; - void cv::ocl::StereoConstantSpaceBP::operator()(const oclMat &left, const oclMat &right, oclMat &disp) { CV_Assert(msg_type == CV_32F || msg_type == CV_16S); - operators[msg_type](*this, u, d, l, r, disp_selected_pyr, data_cost, data_cost_selected, temp, out, - left, right, disp); + if (msg_type == CV_16S) + csbp_operator(this, u, d, l, r, disp_selected_pyr, data_cost, data_cost_selected, temp, out, + left, right, disp); + else + csbp_operator(this, u, d, l, r, disp_selected_pyr, data_cost, data_cost_selected, temp, out, + left, right, disp); } From 9285dddbaad296e9c8bd5bc9013a68954d0a99e5 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 16 Sep 2016 16:03:35 +0300 Subject: [PATCH 39/96] android: clone build_sdk.py from 3.x --- platforms/android/build_sdk.py | 324 +++++++++++++++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100755 platforms/android/build_sdk.py diff --git a/platforms/android/build_sdk.py b/platforms/android/build_sdk.py new file mode 100755 index 0000000000..7d52eab9c0 --- /dev/null +++ b/platforms/android/build_sdk.py @@ -0,0 +1,324 @@ +#!/usr/bin/env python + +import os, sys, subprocess, argparse, shutil, glob, re +import logging as log +import xml.etree.ElementTree as ET + +class Fail(Exception): + def __init__(self, text=None): + self.t = text + def __str__(self): + return "ERROR" if self.t is None else self.t + +def execute(cmd, shell=False): + try: + log.info("Executing: %s" % cmd) + retcode = subprocess.call(cmd, shell=shell) + if retcode < 0: + raise Fail("Child was terminated by signal:" %s -retcode) + elif retcode > 0: + raise Fail("Child returned: %s" % retcode) + except OSError as e: + raise Fail("Execution failed: %d / %s" % (e.errno, e.strerror)) + +def rm_one(d): + d = os.path.abspath(d) + if os.path.exists(d): + if os.path.isdir(d): + log.info("Removing dir: %s", d) + shutil.rmtree(d) + elif os.path.isfile(d): + log.info("Removing file: %s", d) + os.remove(d) + +def check_dir(d, create=False, clean=False): + d = os.path.abspath(d) + log.info("Check dir %s (create: %s, clean: %s)", d, create, clean) + if os.path.exists(d): + if not os.path.isdir(d): + raise Fail("Not a directory: %s" % d) + if clean: + for x in glob.glob(os.path.join(d, "*")): + rm_one(x) + else: + if create: + os.makedirs(d) + return d + +def determine_engine_version(manifest_path): + with open(manifest_path, "rt") as f: + return re.search(r'android:versionName="(\d+\.\d+)"', f.read(), re.MULTILINE).group(1) + +def determine_opencv_version(version_hpp_path): + # version in 2.4 - CV_VERSION_EPOCH.CV_VERSION_MAJOR.CV_VERSION_MINOR.CV_VERSION_REVISION + # version in master - CV_VERSION_MAJOR.CV_VERSION_MINOR.CV_VERSION_REVISION-CV_VERSION_STATUS + with open(version_hpp_path, "rt") as f: + data = f.read() + major = re.search(r'^#define\W+CV_VERSION_MAJOR\W+(\d+)$', data, re.MULTILINE).group(1) + minor = re.search(r'^#define\W+CV_VERSION_MINOR\W+(\d+)$', data, re.MULTILINE).group(1) + revision = re.search(r'^#define\W+CV_VERSION_REVISION\W+(\d+)$', data, re.MULTILINE).group(1) + version_status = re.search(r'^#define\W+CV_VERSION_STATUS\W+"([^"]*)"$', data, re.MULTILINE).group(1) + return "%(major)s.%(minor)s.%(revision)s%(version_status)s" % locals() + +#=================================================================================================== + +class ABI: + def __init__(self, platform_id, name, toolchain, cmake_name=None): + self.platform_id = platform_id # platform code to add to apk version (for cmake) + self.name = name # general name (official Android ABI identifier) + self.toolchain = toolchain # toolchain identifier (for cmake) + self.cmake_name = cmake_name # name of android toolchain (for cmake) + if self.cmake_name is None: + self.cmake_name = self.name + def __str__(self): + return "%s (%s)" % (self.name, self.toolchain) + def haveIPP(self): + return self.name == "x86" or self.name == "x86_64" + +ABIs = [ + ABI("2", "armeabi-v7a", "arm-linux-androideabi-4.8", cmake_name="armeabi-v7a with NEON"), + ABI("1", "armeabi", "arm-linux-androideabi-4.8"), + ABI("3", "arm64-v8a", "aarch64-linux-android-4.9"), + ABI("5", "x86_64", "x86_64-4.9"), + ABI("4", "x86", "x86-4.8"), + ABI("7", "mips64", "mips64el-linux-android-4.9"), + ABI("6", "mips", "mipsel-linux-android-4.8") +] + +#=================================================================================================== + +class Builder: + def __init__(self, workdir, opencvdir): + self.workdir = check_dir(workdir, create=True) + self.opencvdir = check_dir(opencvdir) + self.extra_modules_path = None + self.libdest = check_dir(os.path.join(self.workdir, "o4a"), create=True, clean=True) + self.docdest = check_dir(os.path.join(self.workdir, "javadoc"), create=True, clean=True) + self.resultdest = check_dir(os.path.join(self.workdir, "OpenCV-android-sdk"), create=True, clean=True) + self.extra_packs = [] + self.opencv_version = determine_opencv_version(os.path.join(self.opencvdir, "modules", "core", "include", "opencv2", "core", "version.hpp")) + self.engine_version = determine_engine_version(os.path.join(self.opencvdir, "platforms", "android", "service", "engine", "AndroidManifest.xml")) + self.use_ccache = True + + def get_toolchain_file(self): + return os.path.join(self.opencvdir, "platforms", "android", "android.toolchain.cmake") + + def get_engine_apk_dest(self, engdest): + return os.path.join(engdest, "platforms", "android", "service", "engine", ".build") + + def add_extra_pack(self, ver, path): + if path is None: + return + self.extra_packs.append((ver, check_dir(path))) + + def clean_library_build_dir(self): + for d in ["CMakeCache.txt", "CMakeFiles/", "bin/", "libs/", "lib/", "package/", "install/samples/"]: + rm_one(d) + + def build_library(self, abi, do_install): + cmd = [ + "cmake", + "-GNinja", + "-DCMAKE_TOOLCHAIN_FILE='%s'" % self.get_toolchain_file(), + "-DWITH_OPENCL=OFF", + "-DWITH_CUDA=OFF", + "-DWITH_IPP=%s" % ("ON" if abi.haveIPP() else "OFF"), + "-DBUILD_EXAMPLES=OFF", + "-DBUILD_TESTS=OFF", + "-DBUILD_PERF_TESTS=OFF", + "-DBUILD_DOCS=OFF", + "-DBUILD_ANDROID_EXAMPLES=ON", + "-DINSTALL_ANDROID_EXAMPLES=ON", + "-DANDROID_STL=gnustl_static", + "-DANDROID_NATIVE_API_LEVEL=9", + "-DANDROID_ABI='%s'" % abi.cmake_name, + "-DWITH_TBB=ON", + "-DANDROID_TOOLCHAIN_NAME=%s" % abi.toolchain + ] + + if self.extra_modules_path is not None: + cmd.append("-DOPENCV_EXTRA_MODULES_PATH='%s'" % self.extra_modules_path) + + cmd.append(self.opencvdir) + + if self.use_ccache == True: + cmd.append("-DNDK_CCACHE=ccache") + if do_install: + cmd.extend(["-DBUILD_TESTS=ON", "-DINSTALL_TESTS=ON"]) + execute(cmd) + if do_install: + execute(["ninja"]) + for c in ["libs", "dev", "java", "samples"]: + execute(["cmake", "-DCOMPONENT=%s" % c, "-P", "cmake_install.cmake"]) + else: + execute(["ninja", "install/strip"]) + + def build_engine(self, abi, engdest): + cmd = [ + "cmake", + "-GNinja", + "-DCMAKE_TOOLCHAIN_FILE='%s'" % self.get_toolchain_file(), + "-DANDROID_ABI='%s'" % abi.cmake_name, + "-DBUILD_ANDROID_SERVICE=ON", + "-DANDROID_PLATFORM_ID=%s" % abi.platform_id, + "-DWITH_CUDA=OFF", + "-DWITH_OPENCL=OFF", + "-DWITH_IPP=OFF", + self.opencvdir + ] + execute(cmd) + apkdest = self.get_engine_apk_dest(engdest) + # Add extra data + apkxmldest = check_dir(os.path.join(apkdest, "res", "xml"), create=True) + apklibdest = check_dir(os.path.join(apkdest, "libs", abi.name), create=True) + for ver, d in self.extra_packs + [("3.1.0", os.path.join(self.libdest, "lib"))]: + r = ET.Element("library", attrib={"version": ver}) + log.info("Adding libraries from %s", d) + + for f in glob.glob(os.path.join(d, abi.name, "*.so")): + log.info("Copy file: %s", f) + shutil.copy2(f, apklibdest) + if "libnative_camera" in f: + continue + log.info("Register file: %s", os.path.basename(f)) + n = ET.SubElement(r, "file", attrib={"name": os.path.basename(f)}) + + if len(list(r)) > 0: + xmlname = os.path.join(apkxmldest, "config%s.xml" % ver.replace(".", "")) + log.info("Generating XML config: %s", xmlname) + ET.ElementTree(r).write(xmlname, encoding="utf-8") + + execute(["ninja", "opencv_engine"]) + execute(["ant", "-f", os.path.join(apkdest, "build.xml"), "debug"], + shell=(sys.platform == 'win32')) + # TODO: Sign apk + + def build_javadoc(self): + classpaths = [os.path.join(self.libdest, "bin", "classes")] + for dir, _, files in os.walk(os.environ["ANDROID_SDK"]): + for f in files: + if f == "android.jar" or f == "annotations.jar": + classpaths.append(os.path.join(dir, f)) + cmd = [ + "javadoc", + "-header", "OpenCV %s" % self.opencv_version, + "-nodeprecated", + "-footer", 'OpenCV %s Documentation' % self.opencv_version, + "-public", + "-sourcepath", os.path.join(self.libdest, "src"), + "-d", self.docdest, + "-classpath", ":".join(classpaths) + ] + for _, dirs, _ in os.walk(os.path.join(self.libdest, "src", "org", "opencv")): + cmd.extend(["org.opencv." + d for d in dirs]) + execute(cmd) + + def gather_results(self, engines): + # Copy all files + root = os.path.join(self.libdest, "install") + for item in os.listdir(root): + name = item + item = os.path.join(root, item) + if os.path.isdir(item): + log.info("Copy dir: %s", item) + shutil.copytree(item, os.path.join(self.resultdest, name)) + elif os.path.isfile(item): + log.info("Copy file: %s", item) + shutil.copy2(item, os.path.join(self.resultdest, name)) + + # Copy engines for all platforms + for abi, engdest in engines: + log.info("Copy engine: %s (%s)", abi, engdest) + f = os.path.join(self.get_engine_apk_dest(engdest), "bin", "opencv_engine-debug.apk") + resname = "OpenCV_%s_Manager_%s_%s.apk" % (self.opencv_version, self.engine_version, abi) + shutil.copy2(f, os.path.join(self.resultdest, "apk", resname)) + + # Copy javadoc + log.info("Copy docs: %s", self.docdest) + shutil.copytree(self.docdest, os.path.join(self.resultdest, "sdk", "java", "javadoc")) + + # Clean samples + path = os.path.join(self.resultdest, "samples") + for item in os.listdir(path): + item = os.path.join(path, item) + if os.path.isdir(item): + for name in ["build.xml", "local.properties", "proguard-project.txt"]: + rm_one(os.path.join(item, name)) + + +#=================================================================================================== + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Build OpenCV for Android SDK') + parser.add_argument("work_dir", help="Working directory (and output)") + parser.add_argument("opencv_dir", help="Path to OpenCV source dir") + parser.add_argument('--ndk_path', help="Path to Android NDK to use for build") + parser.add_argument('--sdk_path', help="Path to Android SDK to use for build") + parser.add_argument("--extra_modules_path", help="Path to extra modules to use for build") + parser.add_argument('--sign_with', help="Sertificate to sign the Manager apk") + parser.add_argument('--build_doc', action="store_true", help="Build javadoc") + parser.add_argument('--no_ccache', action="store_true", help="Do not use ccache during library build") + parser.add_argument('--extra_pack', action='append', help="provide extra OpenCV libraries for Manager apk in form :, for example '2.4.11:unpacked/sdk/native/libs'") + args = parser.parse_args() + + log.basicConfig(format='%(message)s', level=log.DEBUG) + log.debug("Args: %s", args) + + if args.ndk_path is not None: + os.environ["ANDROID_NDK"] = args.ndk_path + if args.sdk_path is not None: + os.environ["ANDROID_SDK"] = args.sdk_path + + log.info("Android NDK path: %s", os.environ["ANDROID_NDK"]) + log.info("Android SDK path: %s", os.environ["ANDROID_SDK"]) + + builder = Builder(args.work_dir, args.opencv_dir) + + if args.extra_modules_path is not None: + builder.extra_modules_path = os.path.abspath(args.extra_modules_path) + + if args.no_ccache: + builder.use_ccache = False + + log.info("Detected OpenCV version: %s", builder.opencv_version) + log.info("Detected Engine version: %s", builder.engine_version) + + if args.extra_pack: + for one in args.extra_pack: + i = one.find(":") + if i > 0 and i < len(one) - 1: + builder.add_extra_pack(one[:i], one[i+1:]) + else: + raise Fail("Bad extra pack provided: %s, should be in form ':'" % one) + + engines = [] + for i, abi in enumerate(ABIs): + do_install = (i == 0) + engdest = check_dir(os.path.join(builder.workdir, "build_service_%s" % abi.name), create=True, clean=True) + + log.info("=====") + log.info("===== Building library for %s", abi) + log.info("=====") + + os.chdir(builder.libdest) + builder.clean_library_build_dir() + builder.build_library(abi, do_install) + + log.info("=====") + log.info("===== Building engine for %s", abi) + log.info("=====") + + os.chdir(engdest) + builder.build_engine(abi, engdest) + engines.append((abi.name, engdest)) + + if args.build_doc: + builder.build_javadoc() + + builder.gather_results(engines) + + log.info("=====") + log.info("===== Build finished") + log.info("=====") + log.info("SDK location: %s", builder.resultdest) + log.info("Documentation location: %s", builder.docdest) From 4d17051f14bda835c463ddd80215c29b307d2a21 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 16 Sep 2016 16:14:54 +0300 Subject: [PATCH 40/96] android: backport Android SDK build script --- cmake/OpenCVDetectAndroidSDK.cmake | 12 ++ cmake/templates/OpenCV.mk.in | 4 + .../src/java/android+OpenCVLoader.java | 13 ++ platforms/android/build_sdk.py | 157 +++++------------- platforms/android/service/CMakeLists.txt | 2 - platforms/android/service/doc/JavaHelper.rst | 8 + platforms/android/service/readme.txt | 2 + samples/android/face-detection/jni/Android.mk | 1 - 8 files changed, 77 insertions(+), 122 deletions(-) mode change 100755 => 100644 platforms/android/build_sdk.py diff --git a/cmake/OpenCVDetectAndroidSDK.cmake b/cmake/OpenCVDetectAndroidSDK.cmake index 38430e214e..4f26a78ece 100644 --- a/cmake/OpenCVDetectAndroidSDK.cmake +++ b/cmake/OpenCVDetectAndroidSDK.cmake @@ -274,6 +274,17 @@ macro(add_android_project target path) file(GLOB_RECURSE android_proj_jni_files "${path}/jni/*.c" "${path}/jni/*.h" "${path}/jni/*.cpp" "${path}/jni/*.hpp") ocv_list_filterout(android_proj_jni_files "\\\\.svn") + foreach(lib "opencv_java") + get_property(f TARGET ${lib} PROPERTY LOCATION) + get_filename_component(f_name ${f} NAME) + add_custom_command( + OUTPUT "${android_proj_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}/${f_name}" + COMMAND ${CMAKE_COMMAND} -E copy "${f}" "${android_proj_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}/${f_name}" + DEPENDS "${lib}" VERBATIM + COMMENT "Embedding ${f}") + list(APPEND android_proj_file_deps "${android_proj_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}/${f_name}") + endforeach() + if(android_proj_jni_files AND EXISTS ${path}/jni/Android.mk AND NOT DEFINED JNI_LIB_NAME) # find local module name in Android.mk file to build native lib file(STRINGS "${path}/jni/Android.mk" JNI_LIB_NAME REGEX "LOCAL_MODULE[ ]*:=[ ]*.*" ) @@ -307,6 +318,7 @@ macro(add_android_project target path) # copy opencv_java, tbb if it is shared and dynamicuda if present if FORCE_EMBED_OPENCV flag is set if(android_proj_FORCE_EMBED_OPENCV) set(native_deps ${android_proj_NATIVE_DEPS}) + list(REMOVE_ITEM native_deps "opencv_java") # filter out gpu module as it is always static library on Android list(REMOVE_ITEM native_deps "opencv_gpu") if(ENABLE_DYNAMIC_CUDA) diff --git a/cmake/templates/OpenCV.mk.in b/cmake/templates/OpenCV.mk.in index 66d476b895..d85ed2bb84 100644 --- a/cmake/templates/OpenCV.mk.in +++ b/cmake/templates/OpenCV.mk.in @@ -110,6 +110,10 @@ else OPENCV_INSTALL_MODULES:=on endif +ifeq ($(OPENCV_INSTALL_MODULES),) + OPENCV_INSTALL_MODULES:=on +endif + define add_opencv_module include $(CLEAR_VARS) LOCAL_MODULE:=opencv_$1 diff --git a/modules/java/generator/src/java/android+OpenCVLoader.java b/modules/java/generator/src/java/android+OpenCVLoader.java index 2c05272c22..c220f19588 100644 --- a/modules/java/generator/src/java/android+OpenCVLoader.java +++ b/modules/java/generator/src/java/android+OpenCVLoader.java @@ -1,12 +1,15 @@ package org.opencv.android; import android.content.Context; +import android.util.Log; /** * Helper class provides common initialization methods for OpenCV library. */ public class OpenCVLoader { + private static final String TAG = "OpenCVLoader"; + /** * OpenCV Library version 2.4.2. */ @@ -62,6 +65,11 @@ public class OpenCVLoader */ public static final String OPENCV_VERSION_2_4_12 = "2.4.12"; + /** + * OpenCV Library version 2.4.13. + */ + public static final String OPENCV_VERSION_2_4_13 = "2.4.13"; + /** * Loads and initializes OpenCV library from current application package. Roughly, it's an analog of system.loadLibrary("opencv_java"). * @return Returns true is initialization of OpenCV was successful. @@ -91,6 +99,11 @@ public class OpenCVLoader public static boolean initAsync(String Version, Context AppContext, LoaderCallbackInterface Callback) { + if (initDebug()) { + Callback.onManagerConnected(LoaderCallbackInterface.SUCCESS); + return true; + } + Log.w(TAG, "OpenCV binaries are not packaged with application. Trying to use OpenCV Manager..."); return AsyncServiceHelper.initOpenCV(Version, AppContext, Callback); } } diff --git a/platforms/android/build_sdk.py b/platforms/android/build_sdk.py old mode 100755 new mode 100644 index 7d52eab9c0..7251948d7b --- a/platforms/android/build_sdk.py +++ b/platforms/android/build_sdk.py @@ -10,13 +10,13 @@ class Fail(Exception): def __str__(self): return "ERROR" if self.t is None else self.t -def execute(cmd, shell=False): +def execute(cmd, shell=False, allowFail=False): try: log.info("Executing: %s" % cmd) retcode = subprocess.call(cmd, shell=shell) if retcode < 0: raise Fail("Child was terminated by signal:" %s -retcode) - elif retcode > 0: + elif retcode > 0 and not allowFail: raise Fail("Child returned: %s" % retcode) except OSError as e: raise Fail("Execution failed: %d / %s" % (e.errno, e.strerror)) @@ -45,44 +45,37 @@ def check_dir(d, create=False, clean=False): os.makedirs(d) return d -def determine_engine_version(manifest_path): - with open(manifest_path, "rt") as f: - return re.search(r'android:versionName="(\d+\.\d+)"', f.read(), re.MULTILINE).group(1) - def determine_opencv_version(version_hpp_path): # version in 2.4 - CV_VERSION_EPOCH.CV_VERSION_MAJOR.CV_VERSION_MINOR.CV_VERSION_REVISION # version in master - CV_VERSION_MAJOR.CV_VERSION_MINOR.CV_VERSION_REVISION-CV_VERSION_STATUS with open(version_hpp_path, "rt") as f: data = f.read() + epoch = re.search(r'^#define\W+CV_VERSION_EPOCH\W+(\d+)$', data, re.MULTILINE).group(1) major = re.search(r'^#define\W+CV_VERSION_MAJOR\W+(\d+)$', data, re.MULTILINE).group(1) minor = re.search(r'^#define\W+CV_VERSION_MINOR\W+(\d+)$', data, re.MULTILINE).group(1) revision = re.search(r'^#define\W+CV_VERSION_REVISION\W+(\d+)$', data, re.MULTILINE).group(1) - version_status = re.search(r'^#define\W+CV_VERSION_STATUS\W+"([^"]*)"$', data, re.MULTILINE).group(1) - return "%(major)s.%(minor)s.%(revision)s%(version_status)s" % locals() + revision = '' if revision == '0' else '.' + revision + return "%(epoch)s.%(major)s.%(minor)s%(revision)s" % locals() #=================================================================================================== class ABI: - def __init__(self, platform_id, name, toolchain, cmake_name=None): + def __init__(self, platform_id, name, toolchain, api_level=8, cmake_name=None): self.platform_id = platform_id # platform code to add to apk version (for cmake) self.name = name # general name (official Android ABI identifier) self.toolchain = toolchain # toolchain identifier (for cmake) + self.api_level = api_level self.cmake_name = cmake_name # name of android toolchain (for cmake) if self.cmake_name is None: self.cmake_name = self.name def __str__(self): return "%s (%s)" % (self.name, self.toolchain) - def haveIPP(self): - return self.name == "x86" or self.name == "x86_64" ABIs = [ - ABI("2", "armeabi-v7a", "arm-linux-androideabi-4.8", cmake_name="armeabi-v7a with NEON"), - ABI("1", "armeabi", "arm-linux-androideabi-4.8"), - ABI("3", "arm64-v8a", "aarch64-linux-android-4.9"), - ABI("5", "x86_64", "x86_64-4.9"), - ABI("4", "x86", "x86-4.8"), - ABI("7", "mips64", "mips64el-linux-android-4.9"), - ABI("6", "mips", "mipsel-linux-android-4.8") + ABI("2", "armeabi-v7a", "arm-linux-androideabi-4.6", cmake_name="armeabi-v7a with NEON"), + ABI("1", "armeabi", "arm-linux-androideabi-4.6"), + ABI("4", "x86", "x86-clang3.1", api_level=9), + ABI("6", "mips", "mipsel-linux-android-4.6", api_level=9) ] #=================================================================================================== @@ -91,38 +84,30 @@ class Builder: def __init__(self, workdir, opencvdir): self.workdir = check_dir(workdir, create=True) self.opencvdir = check_dir(opencvdir) - self.extra_modules_path = None self.libdest = check_dir(os.path.join(self.workdir, "o4a"), create=True, clean=True) self.docdest = check_dir(os.path.join(self.workdir, "javadoc"), create=True, clean=True) self.resultdest = check_dir(os.path.join(self.workdir, "OpenCV-android-sdk"), create=True, clean=True) - self.extra_packs = [] self.opencv_version = determine_opencv_version(os.path.join(self.opencvdir, "modules", "core", "include", "opencv2", "core", "version.hpp")) - self.engine_version = determine_engine_version(os.path.join(self.opencvdir, "platforms", "android", "service", "engine", "AndroidManifest.xml")) self.use_ccache = True def get_toolchain_file(self): return os.path.join(self.opencvdir, "platforms", "android", "android.toolchain.cmake") - def get_engine_apk_dest(self, engdest): - return os.path.join(engdest, "platforms", "android", "service", "engine", ".build") - - def add_extra_pack(self, ver, path): - if path is None: - return - self.extra_packs.append((ver, check_dir(path))) - def clean_library_build_dir(self): for d in ["CMakeCache.txt", "CMakeFiles/", "bin/", "libs/", "lib/", "package/", "install/samples/"]: rm_one(d) - def build_library(self, abi, do_install): + def build_library(self, abi, do_install, build_docs): cmd = [ "cmake", "-GNinja", "-DCMAKE_TOOLCHAIN_FILE='%s'" % self.get_toolchain_file(), - "-DWITH_OPENCL=OFF", - "-DWITH_CUDA=OFF", - "-DWITH_IPP=%s" % ("ON" if abi.haveIPP() else "OFF"), + "-DINSTALL_CREATE_DISTRIB=ON", + #"-DWITH_OPENCL=OFF", + "-DWITH_CUDA=OFF", "-DBUILD_opencv_gpu=OFF", + "-DBUILD_opencv_nonfree=OFF", + "-DWITH_TBB=OFF", + "-DWITH_IPP=OFF", "-DBUILD_EXAMPLES=OFF", "-DBUILD_TESTS=OFF", "-DBUILD_PERF_TESTS=OFF", @@ -130,68 +115,28 @@ class Builder: "-DBUILD_ANDROID_EXAMPLES=ON", "-DINSTALL_ANDROID_EXAMPLES=ON", "-DANDROID_STL=gnustl_static", - "-DANDROID_NATIVE_API_LEVEL=9", + "-DANDROID_NATIVE_API_LEVEL=%s" % abi.api_level, "-DANDROID_ABI='%s'" % abi.cmake_name, - "-DWITH_TBB=ON", "-DANDROID_TOOLCHAIN_NAME=%s" % abi.toolchain ] - if self.extra_modules_path is not None: - cmd.append("-DOPENCV_EXTRA_MODULES_PATH='%s'" % self.extra_modules_path) - cmd.append(self.opencvdir) if self.use_ccache == True: cmd.append("-DNDK_CCACHE=ccache") if do_install: cmd.extend(["-DBUILD_TESTS=ON", "-DINSTALL_TESTS=ON"]) + if do_install and build_docs: + cmd.extend(["-DBUILD_DOCS=ON"]) execute(cmd) if do_install: - execute(["ninja"]) - for c in ["libs", "dev", "java", "samples"]: + execute(["cmake", "--build", "."]) + if do_install and build_docs: + execute(["cmake", "--build", ".", "--target", "docs"]) + for c in ["libs", "dev", "java", "samples"] + (["docs"] if do_install and build_docs else []): execute(["cmake", "-DCOMPONENT=%s" % c, "-P", "cmake_install.cmake"]) else: - execute(["ninja", "install/strip"]) - - def build_engine(self, abi, engdest): - cmd = [ - "cmake", - "-GNinja", - "-DCMAKE_TOOLCHAIN_FILE='%s'" % self.get_toolchain_file(), - "-DANDROID_ABI='%s'" % abi.cmake_name, - "-DBUILD_ANDROID_SERVICE=ON", - "-DANDROID_PLATFORM_ID=%s" % abi.platform_id, - "-DWITH_CUDA=OFF", - "-DWITH_OPENCL=OFF", - "-DWITH_IPP=OFF", - self.opencvdir - ] - execute(cmd) - apkdest = self.get_engine_apk_dest(engdest) - # Add extra data - apkxmldest = check_dir(os.path.join(apkdest, "res", "xml"), create=True) - apklibdest = check_dir(os.path.join(apkdest, "libs", abi.name), create=True) - for ver, d in self.extra_packs + [("3.1.0", os.path.join(self.libdest, "lib"))]: - r = ET.Element("library", attrib={"version": ver}) - log.info("Adding libraries from %s", d) - - for f in glob.glob(os.path.join(d, abi.name, "*.so")): - log.info("Copy file: %s", f) - shutil.copy2(f, apklibdest) - if "libnative_camera" in f: - continue - log.info("Register file: %s", os.path.basename(f)) - n = ET.SubElement(r, "file", attrib={"name": os.path.basename(f)}) - - if len(list(r)) > 0: - xmlname = os.path.join(apkxmldest, "config%s.xml" % ver.replace(".", "")) - log.info("Generating XML config: %s", xmlname) - ET.ElementTree(r).write(xmlname, encoding="utf-8") - - execute(["ninja", "opencv_engine"]) - execute(["ant", "-f", os.path.join(apkdest, "build.xml"), "debug"], - shell=(sys.platform == 'win32')) - # TODO: Sign apk + execute(["cmake", "--build", ".", "--target", "install/strip"]) def build_javadoc(self): classpaths = [os.path.join(self.libdest, "bin", "classes")] @@ -201,6 +146,7 @@ class Builder: classpaths.append(os.path.join(dir, f)) cmd = [ "javadoc", + "-encoding", "UTF-8", "-header", "OpenCV %s" % self.opencv_version, "-nodeprecated", "-footer", 'OpenCV %s Documentation' % self.opencv_version, @@ -211,9 +157,9 @@ class Builder: ] for _, dirs, _ in os.walk(os.path.join(self.libdest, "src", "org", "opencv")): cmd.extend(["org.opencv." + d for d in dirs]) - execute(cmd) + execute(cmd, allowFail=True) # FIXIT javadoc currenly reports some errors - def gather_results(self, engines): + def gather_results(self, with_samples_apk): # Copy all files root = os.path.join(self.libdest, "install") for item in os.listdir(root): @@ -226,13 +172,6 @@ class Builder: log.info("Copy file: %s", item) shutil.copy2(item, os.path.join(self.resultdest, name)) - # Copy engines for all platforms - for abi, engdest in engines: - log.info("Copy engine: %s (%s)", abi, engdest) - f = os.path.join(self.get_engine_apk_dest(engdest), "bin", "opencv_engine-debug.apk") - resname = "OpenCV_%s_Manager_%s_%s.apk" % (self.opencv_version, self.engine_version, abi) - shutil.copy2(f, os.path.join(self.resultdest, "apk", resname)) - # Copy javadoc log.info("Copy docs: %s", self.docdest) shutil.copytree(self.docdest, os.path.join(self.resultdest, "sdk", "java", "javadoc")) @@ -244,6 +183,9 @@ class Builder: if os.path.isdir(item): for name in ["build.xml", "local.properties", "proguard-project.txt"]: rm_one(os.path.join(item, name)) + if not with_samples_apk: + if re.search(r'\.apk$', item): # reduce size of SDK + rm_one(item) #=================================================================================================== @@ -254,11 +196,10 @@ if __name__ == "__main__": parser.add_argument("opencv_dir", help="Path to OpenCV source dir") parser.add_argument('--ndk_path', help="Path to Android NDK to use for build") parser.add_argument('--sdk_path', help="Path to Android SDK to use for build") - parser.add_argument("--extra_modules_path", help="Path to extra modules to use for build") - parser.add_argument('--sign_with', help="Sertificate to sign the Manager apk") - parser.add_argument('--build_doc', action="store_true", help="Build javadoc") + parser.add_argument('--build_doc', action="store_true", help="Build documentation") + parser.add_argument('--build_javadoc', action="store_true", help="Build javadoc") parser.add_argument('--no_ccache', action="store_true", help="Do not use ccache during library build") - parser.add_argument('--extra_pack', action='append', help="provide extra OpenCV libraries for Manager apk in form :, for example '2.4.11:unpacked/sdk/native/libs'") + parser.add_argument('--with_samples_apk', action="store_true", help="Include samples APKs") args = parser.parse_args() log.basicConfig(format='%(message)s', level=log.DEBUG) @@ -274,27 +215,13 @@ if __name__ == "__main__": builder = Builder(args.work_dir, args.opencv_dir) - if args.extra_modules_path is not None: - builder.extra_modules_path = os.path.abspath(args.extra_modules_path) - if args.no_ccache: builder.use_ccache = False log.info("Detected OpenCV version: %s", builder.opencv_version) - log.info("Detected Engine version: %s", builder.engine_version) - if args.extra_pack: - for one in args.extra_pack: - i = one.find(":") - if i > 0 and i < len(one) - 1: - builder.add_extra_pack(one[:i], one[i+1:]) - else: - raise Fail("Bad extra pack provided: %s, should be in form ':'" % one) - - engines = [] for i, abi in enumerate(ABIs): do_install = (i == 0) - engdest = check_dir(os.path.join(builder.workdir, "build_service_%s" % abi.name), create=True, clean=True) log.info("=====") log.info("===== Building library for %s", abi) @@ -302,20 +229,12 @@ if __name__ == "__main__": os.chdir(builder.libdest) builder.clean_library_build_dir() - builder.build_library(abi, do_install) + builder.build_library(abi, do_install, build_docs=args.build_doc) - log.info("=====") - log.info("===== Building engine for %s", abi) - log.info("=====") - - os.chdir(engdest) - builder.build_engine(abi, engdest) - engines.append((abi.name, engdest)) - - if args.build_doc: + if args.build_doc or args.build_javadoc: builder.build_javadoc() - builder.gather_results(engines) + builder.gather_results(with_samples_apk=args.with_samples_apk) log.info("=====") log.info("===== Build finished") diff --git a/platforms/android/service/CMakeLists.txt b/platforms/android/service/CMakeLists.txt index c99b71392f..7b1522bf79 100644 --- a/platforms/android/service/CMakeLists.txt +++ b/platforms/android/service/CMakeLists.txt @@ -2,5 +2,3 @@ if(BUILD_ANDROID_SERVICE) add_subdirectory(engine) #add_subdirectory(engine_test) endif() - -install(FILES "readme.txt" DESTINATION "apk/" COMPONENT libs) diff --git a/platforms/android/service/doc/JavaHelper.rst b/platforms/android/service/doc/JavaHelper.rst index 6be46d61a3..3c3762b9e3 100644 --- a/platforms/android/service/doc/JavaHelper.rst +++ b/platforms/android/service/doc/JavaHelper.rst @@ -79,3 +79,11 @@ OpenCV version constants .. data:: OPENCV_VERSION_2_4_11 OpenCV Library version 2.4.11 + +.. data:: OPENCV_VERSION_2_4_12 + + OpenCV Library version 2.4.12 + +.. data:: OPENCV_VERSION_2_4_13 + + OpenCV Library version 2.4.13 diff --git a/platforms/android/service/readme.txt b/platforms/android/service/readme.txt index 51853c24e5..c8230e38d8 100644 --- a/platforms/android/service/readme.txt +++ b/platforms/android/service/readme.txt @@ -1,6 +1,8 @@ How to select the proper version of OpenCV Manager -------------------------------------------------- +DEPRECATED: This information is outdated since OpenCV 2.4.12 + Since version 1.7 several packages of OpenCV Manager are built. Every package is targeted for some specific hardware platform and includes corresponding OpenCV binaries. So, in most cases OpenCV Manager uses built-in version of OpenCV. Separate package with OpenCV binaries is currently used in diff --git a/samples/android/face-detection/jni/Android.mk b/samples/android/face-detection/jni/Android.mk index 6b6642602d..cf20dff2b5 100644 --- a/samples/android/face-detection/jni/Android.mk +++ b/samples/android/face-detection/jni/Android.mk @@ -3,7 +3,6 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #OPENCV_CAMERA_MODULES:=off -#OPENCV_INSTALL_MODULES:=off #OPENCV_LIB_TYPE:=SHARED include ../../sdk/native/jni/OpenCV.mk From 2d10336601ba026c29dcb5de08ffd641085a65ca Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 16 Sep 2016 16:10:41 +0300 Subject: [PATCH 41/96] fix documentation --- README.md | 6 +++--- cmake/OpenCVDetectPython.cmake | 7 ++++--- doc/CMakeLists.txt | 4 +--- doc/conf.py | 2 +- .../random_generator_and_text.rst | 2 +- .../feature_detection/feature_detection.rst | 2 +- .../feature_homography/feature_homography.rst | 2 +- .../android_binary_package/O4A_SDK.rst | 6 +----- .../dev_with_OCV_on_Android.rst | 17 +++++++++-------- modules/contrib/doc/facerec/index.rst | 4 ---- samples/cpp/Qt_sample/qt_opengl.cpp | 2 +- 11 files changed, 23 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index e74a329668..787b71f330 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ #### Resources * Homepage: -* Docs: +* Docs: * Q&A forum: -* Issue tracking: +* Issue tracking: #### Contributing -Please read before starting work on a pull request: +Please read before starting work on a pull request: Summary of guidelines: diff --git a/cmake/OpenCVDetectPython.cmake b/cmake/OpenCVDetectPython.cmake index 7ef548f0f1..20df69e170 100644 --- a/cmake/OpenCVDetectPython.cmake +++ b/cmake/OpenCVDetectPython.cmake @@ -123,10 +123,11 @@ if(PYTHON_EXECUTABLE) find_host_program(SPHINX_BUILD sphinx-build) if(SPHINX_BUILD) execute_process(COMMAND "${SPHINX_BUILD}" - OUTPUT_QUIET - ERROR_VARIABLE SPHINX_OUTPUT + ERROR_VARIABLE SPHINX_STDERR + OUTPUT_VARIABLE SPHINX_STDOUT OUTPUT_STRIP_TRAILING_WHITESPACE) - if(SPHINX_OUTPUT MATCHES "Sphinx v([0-9][^ \n]*)") + if(SPHINX_STDERR MATCHES "Sphinx v([0-9][^ \n]*)" + OR SPHINX_STDOUT MATCHES "Sphinx v([0-9][^ \n]*)") set(SPHINX_VERSION "${CMAKE_MATCH_1}") set(HAVE_SPHINX 1) message(STATUS "Found Sphinx ${SPHINX_VERSION}: ${SPHINX_BUILD}") diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 66d2a478a2..29d5a0a1e1 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -40,9 +40,7 @@ endif(HAVE_DOC_GENERATOR) # ========= Sphinx docs ========= if(BUILD_DOCS AND HAVE_SPHINX) - if(NOT INSTALL_CREATE_DISTRIB) - list(APPEND DOC_LIST "${OpenCV_SOURCE_DIR}/doc/haartraining.htm") - endif() + list(APPEND DOC_LIST "${OpenCV_SOURCE_DIR}/doc/haartraining.htm") # build lists of documentation files and generate table of contents for reference manual set(DOC_FAKE_ROOT "${CMAKE_CURRENT_BINARY_DIR}/fake-root") diff --git a/doc/conf.py b/doc/conf.py index 0bf75ad488..430a83579c 100755 --- a/doc/conf.py +++ b/doc/conf.py @@ -315,7 +315,7 @@ extlinks = { # 'opencv_group' : ('http://answers.opencv.org/%s', None), 'opencv_qa' : ('http://answers.opencv.org/%s', None), - 'how_to_contribute' : ('http://code.opencv.org/projects/opencv/wiki/How_to_contribute/%s', None), + 'how_to_contribute' : ('https://github.com/opencv/opencv/wiki/How_to_contribute/%s', None), 'cvt_color' : ('http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html?highlight=cvtcolor#cvtcolor%s', None), 'imread' : ('http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imread#imread%s', None), diff --git a/doc/tutorials/core/random_generator_and_text/random_generator_and_text.rst b/doc/tutorials/core/random_generator_and_text/random_generator_and_text.rst index a5c4bb7ed6..3a743f9d33 100644 --- a/doc/tutorials/core/random_generator_and_text/random_generator_and_text.rst +++ b/doc/tutorials/core/random_generator_and_text/random_generator_and_text.rst @@ -22,7 +22,7 @@ Code * In this tutorial, we intend to use *random* values for the drawing parameters. Also, we intend to populate our image with a big number of geometric figures. Since we will be initializing them in a random fashion, this process will be automatic and made by using *loops* . - * This code is in your OpenCV sample folder. Otherwise you can grab it from `here `_ . + * This code is in your OpenCV sample folder. Otherwise you can grab it from `here `_ . Explanation ============ diff --git a/doc/tutorials/features2d/feature_detection/feature_detection.rst b/doc/tutorials/features2d/feature_detection/feature_detection.rst index 51776de1fc..e495d36b45 100644 --- a/doc/tutorials/features2d/feature_detection/feature_detection.rst +++ b/doc/tutorials/features2d/feature_detection/feature_detection.rst @@ -22,7 +22,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/features2d/feature_homography/feature_homography.rst b/doc/tutorials/features2d/feature_homography/feature_homography.rst index e195e53f43..def8759b8f 100644 --- a/doc/tutorials/features2d/feature_homography/feature_homography.rst +++ b/doc/tutorials/features2d/feature_homography/feature_homography.rst @@ -20,7 +20,7 @@ Theory Code ==== -This tutorial code's is shown lines below. You can also download it from `here `_ +This tutorial code's is shown lines below. You can also download it from `here `_ .. code-block:: cpp diff --git a/doc/tutorials/introduction/android_binary_package/O4A_SDK.rst b/doc/tutorials/introduction/android_binary_package/O4A_SDK.rst index f4d957fc1a..8f7a2fbf1b 100644 --- a/doc/tutorials/introduction/android_binary_package/O4A_SDK.rst +++ b/doc/tutorials/introduction/android_binary_package/O4A_SDK.rst @@ -48,11 +48,7 @@ The structure of package contents looks as follows: :: - OpenCV-2.4.11-android-sdk - |_ apk - | |_ OpenCV_2.4.11_binary_pack_armv7a.apk - | |_ OpenCV_2.4.11_Manager_2.20_XXX.apk - | + OpenCV-2.4.13-android-sdk |_ doc |_ samples |_ sdk diff --git a/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst b/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst index c83548e98b..7b9204e0b1 100644 --- a/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst +++ b/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst @@ -55,14 +55,14 @@ Manager to access OpenCV libraries externally installed in the target system. :guilabel:`File -> Import -> Existing project in your workspace`. Press :guilabel:`Browse` button and locate OpenCV4Android SDK - (:file:`OpenCV-2.4.11-android-sdk/sdk`). + (:file:`OpenCV-2.4.13-android-sdk/sdk`). .. image:: images/eclipse_opencv_dependency0.png :alt: Add dependency from OpenCV library :align: center #. In application project add a reference to the OpenCV Java SDK in - :guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.11``. + :guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.13``. .. image:: images/eclipse_opencv_dependency1.png :alt: Add dependency from OpenCV library @@ -128,27 +128,27 @@ described above. #. Add the OpenCV library project to your workspace the same way as for the async initialization above. Use menu :guilabel:`File -> Import -> Existing project in your workspace`, press :guilabel:`Browse` button and select OpenCV SDK path - (:file:`OpenCV-2.4.11-android-sdk/sdk`). + (:file:`OpenCV-2.4.13-android-sdk/sdk`). .. image:: images/eclipse_opencv_dependency0.png :alt: Add dependency from OpenCV library :align: center #. In the application project add a reference to the OpenCV4Android SDK in - :guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.11``; + :guilabel:`Project -> Properties -> Android -> Library -> Add` select ``OpenCV Library - 2.4.13``; .. image:: images/eclipse_opencv_dependency1.png :alt: Add dependency from OpenCV library :align: center #. If your application project **doesn't have a JNI part**, just copy the corresponding OpenCV - native libs from :file:`/sdk/native/libs/` to your + native libs from :file:`/sdk/native/libs/` to your project directory to folder :file:`libs/`. In case of the application project **with a JNI part**, instead of manual libraries copying you need to modify your ``Android.mk`` file: add the following two code lines after the ``"include $(CLEAR_VARS)"`` and before - ``"include path_to_OpenCV-2.4.11-android-sdk/sdk/native/jni/OpenCV.mk"`` + ``"include path_to_OpenCV-2.4.13-android-sdk/sdk/native/jni/OpenCV.mk"`` .. code-block:: make :linenos: @@ -221,7 +221,7 @@ taken: .. code-block:: make - include C:\Work\OpenCV4Android\OpenCV-2.4.11-android-sdk\sdk\native\jni\OpenCV.mk + include C:\Work\OpenCV4Android\OpenCV-2.4.13-android-sdk\sdk\native\jni\OpenCV.mk Should be inserted into the :file:`jni/Android.mk` file **after** this line: @@ -230,7 +230,8 @@ taken: include $(CLEAR_VARS) #. Several variables can be used to customize OpenCV stuff, but you **don't need** to use them when - your application uses the `async initialization` via the `OpenCV Manager` API. + your application uses the `async initialization` via the `OpenCV Manager` API + (It is not recommended since OpenCV 2.4.13). .. note:: These variables should be set **before** the ``"include .../OpenCV.mk"`` line: diff --git a/modules/contrib/doc/facerec/index.rst b/modules/contrib/doc/facerec/index.rst index b871448c55..4605d7c900 100644 --- a/modules/contrib/doc/facerec/index.rst +++ b/modules/contrib/doc/facerec/index.rst @@ -5,10 +5,6 @@ OpenCV 2.4 now comes with the very new :ocv:class:`FaceRecognizer` class for fac These documents are the help I have wished for, when I was working myself into face recognition. I hope you also think the new :ocv:class:`FaceRecognizer` is a useful addition to OpenCV. -Please issue any feature requests and/or bugs on the official OpenCV bug tracker at: - - * http://code.opencv.org/projects/opencv/issues - Contents ======== diff --git a/samples/cpp/Qt_sample/qt_opengl.cpp b/samples/cpp/Qt_sample/qt_opengl.cpp index eebb17b50a..47b5478e43 100644 --- a/samples/cpp/Qt_sample/qt_opengl.cpp +++ b/samples/cpp/Qt_sample/qt_opengl.cpp @@ -30,7 +30,7 @@ static void help() "Using OpenCV version " << CV_VERSION << "\n\n" " 1) This demo is mainly based on work from Javier Barandiaran Martirena\n" - " See this page http://code.opencv.org/projects/opencv/wiki/Posit.\n" + " See this page https://github.com/opencv/opencv/wiki/Posit .\n" " 2) This is a demo to illustrate how to use **OpenGL Callback**.\n" " 3) You need Qt binding to compile this sample with OpenGL support enabled.\n" " 4) The features' detection is very basic and could highly be improved\n" From d68e3502278d6fc5a1de0ce8f7951d9961b20913 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 16 Sep 2016 14:58:07 +0300 Subject: [PATCH 42/96] OpenCV version++ --- modules/core/include/opencv2/core/version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/version.hpp b/modules/core/include/opencv2/core/version.hpp index 39e66583d2..e4f15abea0 100644 --- a/modules/core/include/opencv2/core/version.hpp +++ b/modules/core/include/opencv2/core/version.hpp @@ -50,7 +50,7 @@ #define CV_VERSION_EPOCH 2 #define CV_VERSION_MAJOR 4 #define CV_VERSION_MINOR 13 -#define CV_VERSION_REVISION 0 +#define CV_VERSION_REVISION 1 #define CVAUX_STR_EXP(__A) #__A #define CVAUX_STR(__A) CVAUX_STR_EXP(__A) From 3648c6117225bc1e385bfd10b1e63b1e943c9f0d Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 19 Sep 2016 19:46:42 +0300 Subject: [PATCH 43/96] highgui: clone cap_avfoundation_mac.mm from master --- modules/highgui/src/cap_avfoundation_mac.mm | 1322 +++++++++++++++++++ 1 file changed, 1322 insertions(+) create mode 100644 modules/highgui/src/cap_avfoundation_mac.mm diff --git a/modules/highgui/src/cap_avfoundation_mac.mm b/modules/highgui/src/cap_avfoundation_mac.mm new file mode 100644 index 0000000000..8c30506400 --- /dev/null +++ b/modules/highgui/src/cap_avfoundation_mac.mm @@ -0,0 +1,1322 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the contributor be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*//////////////////////////////////////////////////////////////////////////////////////// + + +#include "precomp.hpp" +#include "opencv2/imgproc.hpp" +#include +#import + +/********************** Declaration of class headers ************************/ + +/***************************************************************************** + * + * CaptureDelegate Declaration. + * + * CaptureDelegate is notified on a separate thread by the OS whenever there + * is a new frame. When "updateImage" is called from the main thread, it + * copies this new frame into an IplImage, but only if this frame has not + * been copied before. When "getOutput" is called from the main thread, + * it gives the last copied IplImage. + * + *****************************************************************************/ + + +@interface CaptureDelegate : NSObject +{ + NSCondition *mHasNewFrame; + CVPixelBufferRef mGrabbedPixels; + CVImageBufferRef mCurrentImageBuffer; + IplImage *mDeviceImage; + uint8_t *mOutImagedata; + IplImage *mOutImage; + size_t currSize; +} + +- (void)captureOutput:(AVCaptureOutput *)captureOutput +didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + fromConnection:(AVCaptureConnection *)connection; + +- (BOOL)grabImageUntilDate: (NSDate *)limit; +- (int)updateImage; +- (IplImage*)getOutput; + +@end + +/***************************************************************************** + * + * CvCaptureCAM Declaration. + * + * CvCaptureCAM is the instantiation of a capture source for cameras. + * + *****************************************************************************/ + +class CvCaptureCAM : public CvCapture { +public: + CvCaptureCAM(int cameraNum = -1) ; + ~CvCaptureCAM(); + virtual bool grabFrame(); + virtual IplImage* retrieveFrame(int); + virtual double getProperty(int property_id) const; + virtual bool setProperty(int property_id, double value); + virtual int didStart(); + + +private: + AVCaptureSession *mCaptureSession; + AVCaptureDeviceInput *mCaptureDeviceInput; + AVCaptureVideoDataOutput *mCaptureVideoDataOutput; + AVCaptureDevice *mCaptureDevice; + CaptureDelegate *mCapture; + + int startCaptureDevice(int cameraNum); + void stopCaptureDevice(); + + void setWidthHeight(); + bool grabFrame(double timeOut); + + int camNum; + int width; + int height; + int settingWidth; + int settingHeight; + OSType mInputPixelFormat; + + int started; +}; + + +/***************************************************************************** + * + * CvCaptureFile Declaration. + * + * CvCaptureFile is the instantiation of a capture source for video files. + * + *****************************************************************************/ + +class CvCaptureFile : public CvCapture { +public: + CvCaptureFile(const char* filename) ; + ~CvCaptureFile(); + virtual bool grabFrame(); + virtual IplImage* retrieveFrame(int); + virtual double getProperty(int property_id) const; + virtual bool setProperty(int property_id, double value); + virtual int didStart(); + + +private: + AVAsset *mAsset; + AVAssetTrack *mAssetTrack; + AVAssetReader *mAssetReader; + AVAssetReaderTrackOutput *mTrackOutput; + + CMSampleBufferRef mCurrentSampleBuffer; + CVImageBufferRef mGrabbedPixels; + IplImage *mDeviceImage; + uint8_t *mOutImagedata; + IplImage *mOutImage; + size_t currSize; + int mMode; + int mFormat; + + bool setupReadingAt(CMTime position); + IplImage* retrieveFramePixelBuffer(); + + CMTime mFrameTimestamp; + size_t mFrameNum; + OSType mInputPixelFormat; + + int started; +}; + + +/***************************************************************************** + * + * CvVideoWriter_AVFoundation Declaration. + * + * CvVideoWriter_AVFoundation is the instantiation of a video output class. + * + *****************************************************************************/ + +class CvVideoWriter_AVFoundation : public CvVideoWriter { + public: + CvVideoWriter_AVFoundation(const char* filename, int fourcc, + double fps, CvSize frame_size, + int is_color=1); + ~CvVideoWriter_AVFoundation(); + bool writeFrame(const IplImage* image); + private: + IplImage* argbimage; + + AVAssetWriter *mMovieWriter; + AVAssetWriterInput* mMovieWriterInput; + AVAssetWriterInputPixelBufferAdaptor* mMovieWriterAdaptor; + + NSString* path; + NSString* codec; + NSString* fileType; + double mMovieFPS; + CvSize movieSize; + int movieColor; + unsigned long mFrameNum; +}; + +/****************** Implementation of interface functions ********************/ + + +CvCapture* cvCreateFileCapture_AVFoundation(const char* filename) { + CvCaptureFile *retval = new CvCaptureFile(filename); + + if(retval->didStart()) + return retval; + delete retval; + return NULL; +} + +CvCapture* cvCreateCameraCapture_AVFoundation(int index ) { + CvCapture* retval = new CvCaptureCAM(index); + if (!((CvCaptureCAM *)retval)->didStart()) + cvReleaseCapture(&retval); + return retval; +} + +CvVideoWriter* cvCreateVideoWriter_AVFoundation(const char* filename, int fourcc, + double fps, CvSize frame_size, + int is_color) { + return new CvVideoWriter_AVFoundation(filename, fourcc, fps, frame_size,is_color); +} + +/********************** Implementation of Classes ****************************/ + +/***************************************************************************** + * + * CvCaptureCAM Implementation. + * + * CvCaptureCAM is the instantiation of a capture source for cameras. + * + *****************************************************************************/ + +CvCaptureCAM::CvCaptureCAM(int cameraNum) { + mCaptureSession = nil; + mCaptureDeviceInput = nil; + mCaptureVideoDataOutput = nil; + mCaptureDevice = nil; + mCapture = nil; + + width = 0; + height = 0; + settingWidth = 0; + settingHeight = 0; + + camNum = cameraNum; + + if ( ! startCaptureDevice(camNum) ) { + fprintf(stderr, "OpenCV: camera failed to properly initialize!\n"); + started = 0; + } else { + started = 1; + } +} + +CvCaptureCAM::~CvCaptureCAM() { + stopCaptureDevice(); +} + +int CvCaptureCAM::didStart() { + return started; +} + + +bool CvCaptureCAM::grabFrame() { + return grabFrame(1); +} + +bool CvCaptureCAM::grabFrame(double timeOut) { + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + bool isGrabbed = false; + NSDate *limit = [NSDate dateWithTimeIntervalSinceNow: timeOut]; + if ( [mCapture grabImageUntilDate: limit] ) { + [mCapture updateImage]; + isGrabbed = true; + } + + [localpool drain]; + return isGrabbed; +} + +IplImage* CvCaptureCAM::retrieveFrame(int) { + return [mCapture getOutput]; +} + +void CvCaptureCAM::stopCaptureDevice() { + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + [mCaptureSession stopRunning]; + + [mCaptureSession release]; + [mCaptureDeviceInput release]; + [mCaptureDevice release]; + + [mCaptureVideoDataOutput release]; + [mCapture release]; + + [localpool drain]; +} + +int CvCaptureCAM::startCaptureDevice(int cameraNum) { + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + // get capture device + NSArray *devices = [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo]; + + if ( devices.count == 0 ) { + fprintf(stderr, "OpenCV: AVFoundation didn't find any attached Video Input Devices!\n"); + [localpool drain]; + return 0; + } + + if ( cameraNum < 0 || devices.count <= NSUInteger(cameraNum) ) { + fprintf(stderr, "OpenCV: out device of bound (0-%ld): %d\n", devices.count-1, cameraNum); + [localpool drain]; + return 0; + } + + mCaptureDevice = devices[cameraNum]; + + if ( ! mCaptureDevice ) { + fprintf(stderr, "OpenCV: device %d not able to use.\n", cameraNum); + [localpool drain]; + return 0; + } + + // get input device + NSError *error = nil; + mCaptureDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice: mCaptureDevice + error: &error]; + if ( error ) { + fprintf(stderr, "OpenCV: error in [AVCaptureDeviceInput initWithDevice:error:]\n"); + NSLog(@"OpenCV: %@", error.localizedDescription); + [localpool drain]; + return 0; + } + + // create output + mCapture = [[CaptureDelegate alloc] init]; + mCaptureVideoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; + dispatch_queue_t queue = dispatch_queue_create("cameraQueue", DISPATCH_QUEUE_SERIAL); + [mCaptureVideoDataOutput setSampleBufferDelegate: mCapture queue: queue]; + dispatch_release(queue); + + OSType pixelFormat = kCVPixelFormatType_32BGRA; + //OSType pixelFormat = kCVPixelFormatType_422YpCbCr8; + NSDictionary *pixelBufferOptions; + if (width > 0 && height > 0) { + pixelBufferOptions = + @{ + (id)kCVPixelBufferWidthKey: @(1.0*width), + (id)kCVPixelBufferHeightKey: @(1.0*height), + (id)kCVPixelBufferPixelFormatTypeKey: @(pixelFormat) + }; + } else { + pixelBufferOptions = + @{ + (id)kCVPixelBufferPixelFormatTypeKey: @(pixelFormat) + }; + } + mCaptureVideoDataOutput.videoSettings = pixelBufferOptions; + mCaptureVideoDataOutput.alwaysDiscardsLateVideoFrames = YES; + + // create session + mCaptureSession = [[AVCaptureSession alloc] init]; + mCaptureSession.sessionPreset = AVCaptureSessionPresetMedium; + [mCaptureSession addInput: mCaptureDeviceInput]; + [mCaptureSession addOutput: mCaptureVideoDataOutput]; + + [mCaptureSession startRunning]; + + // flush old position image + grabFrame(1); + + [localpool drain]; + return 1; +} + +void CvCaptureCAM::setWidthHeight() { + NSMutableDictionary *pixelBufferOptions = [mCaptureVideoDataOutput.videoSettings mutableCopy]; + + while ( true ) { + // auto matching + pixelBufferOptions[(id)kCVPixelBufferWidthKey] = @(1.0*width); + pixelBufferOptions[(id)kCVPixelBufferHeightKey] = @(1.0*height); + mCaptureVideoDataOutput.videoSettings = pixelBufferOptions; + + // compare matched size and my options + CMFormatDescriptionRef format = mCaptureDevice.activeFormat.formatDescription; + CMVideoDimensions deviceSize = CMVideoFormatDescriptionGetDimensions(format); + if ( deviceSize.width == width && deviceSize.height == height ) { + break; + } + + // fit my options to matched size + width = deviceSize.width; + height = deviceSize.height; + } + + // flush old size image + grabFrame(1); + + [pixelBufferOptions release]; +} + + +double CvCaptureCAM::getProperty(int property_id) const{ + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + CMFormatDescriptionRef format = mCaptureDevice.activeFormat.formatDescription; + CMVideoDimensions s1 = CMVideoFormatDescriptionGetDimensions(format); + double retval = 0; + + switch (property_id) { + case CV_CAP_PROP_FRAME_WIDTH: + retval = s1.width; + break; + case CV_CAP_PROP_FRAME_HEIGHT: + retval = s1.height; + break; + case CV_CAP_PROP_FPS: + { + CMTime frameDuration = mCaptureDevice.activeVideoMaxFrameDuration; + retval = frameDuration.timescale / double(frameDuration.value); + } + break; + case CV_CAP_PROP_FORMAT: + retval = CV_8UC3; + break; + default: + break; + } + + [localpool drain]; + return retval; +} + +bool CvCaptureCAM::setProperty(int property_id, double value) { + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + bool isSucceeded = false; + + switch (property_id) { + case CV_CAP_PROP_FRAME_WIDTH: + width = value; + settingWidth = 1; + if (settingWidth && settingHeight) { + setWidthHeight(); + settingWidth = 0; + settingHeight = 0; + } + isSucceeded = true; + break; + case CV_CAP_PROP_FRAME_HEIGHT: + height = value; + settingHeight = 1; + if (settingWidth && settingHeight) { + setWidthHeight(); + settingWidth = 0; + settingHeight = 0; + } + isSucceeded = true; + break; + case CV_CAP_PROP_FPS: + if ( [mCaptureDevice lockForConfiguration: NULL] ) { + NSArray * ranges = mCaptureDevice.activeFormat.videoSupportedFrameRateRanges; + AVFrameRateRange *matchedRange = ranges[0]; + double minDiff = fabs(matchedRange.maxFrameRate - value); + for ( AVFrameRateRange *range in ranges ) { + double diff = fabs(range.maxFrameRate - value); + if ( diff < minDiff ) { + minDiff = diff; + matchedRange = range; + } + } + mCaptureDevice.activeVideoMinFrameDuration = matchedRange.minFrameDuration; + mCaptureDevice.activeVideoMaxFrameDuration = matchedRange.minFrameDuration; + isSucceeded = true; + [mCaptureDevice unlockForConfiguration]; + } + break; + default: + break; + } + + [localpool drain]; + return isSucceeded; +} + + +/***************************************************************************** + * + * CaptureDelegate Implementation. + * + * CaptureDelegate is notified on a separate thread by the OS whenever there + * is a new frame. When "updateImage" is called from the main thread, it + * copies this new frame into an IplImage, but only if this frame has not + * been copied before. When "getOutput" is called from the main thread, + * it gives the last copied IplImage. + * + *****************************************************************************/ + + +@implementation CaptureDelegate + +- (id)init { + [super init]; + mHasNewFrame = [[NSCondition alloc] init]; + mCurrentImageBuffer = NULL; + mGrabbedPixels = NULL; + mDeviceImage = NULL; + mOutImagedata = NULL; + mOutImage = NULL; + currSize = 0; + return self; +} + +-(void)dealloc { + free(mOutImagedata); + cvReleaseImage(&mOutImage); + cvReleaseImage(&mDeviceImage); + CVBufferRelease(mCurrentImageBuffer); + CVBufferRelease(mGrabbedPixels); + [mHasNewFrame release]; + [super dealloc]; +} + +- (void)captureOutput:(AVCaptureOutput *)captureOutput +didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + fromConnection:(AVCaptureConnection *)connection { + (void)captureOutput; + (void)sampleBuffer; + (void)connection; + + CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); + CVBufferRetain(imageBuffer); + + [mHasNewFrame lock]; + + CVBufferRelease(mCurrentImageBuffer); + mCurrentImageBuffer = imageBuffer; + [mHasNewFrame signal]; + + [mHasNewFrame unlock]; + +} + +-(IplImage*) getOutput { + return mOutImage; +} + +-(BOOL) grabImageUntilDate: (NSDate *)limit { + BOOL isGrabbed = NO; + [mHasNewFrame lock]; + + if ( mGrabbedPixels ) { + CVBufferRelease(mGrabbedPixels); + } + if ( [mHasNewFrame waitUntilDate: limit] ) { + isGrabbed = YES; + mGrabbedPixels = CVBufferRetain(mCurrentImageBuffer); + } + + [mHasNewFrame unlock]; + return isGrabbed; +} + +-(int) updateImage { + if ( ! mGrabbedPixels ) { + return 0; + } + + CVPixelBufferLockBaseAddress(mGrabbedPixels, 0); + void *baseaddress = CVPixelBufferGetBaseAddress(mGrabbedPixels); + + size_t width = CVPixelBufferGetWidth(mGrabbedPixels); + size_t height = CVPixelBufferGetHeight(mGrabbedPixels); + size_t rowBytes = CVPixelBufferGetBytesPerRow(mGrabbedPixels); + OSType pixelFormat = CVPixelBufferGetPixelFormatType(mGrabbedPixels); + + if ( rowBytes == 0 ) { + fprintf(stderr, "OpenCV: error: rowBytes == 0\n"); + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + return 0; + } + + if ( currSize != width*3*height ) { + currSize = width*3*height; + free(mOutImagedata); + mOutImagedata = reinterpret_cast(malloc(currSize)); + } + + if (mOutImage == NULL) { + mOutImage = cvCreateImageHeader(cvSize((int)width,(int)height), IPL_DEPTH_8U, 3); + } + mOutImage->width = int(width); + mOutImage->height = int(height); + mOutImage->nChannels = 3; + mOutImage->depth = IPL_DEPTH_8U; + mOutImage->widthStep = int(width*3); + mOutImage->imageData = reinterpret_cast(mOutImagedata); + mOutImage->imageSize = int(currSize); + + if ( pixelFormat == kCVPixelFormatType_32BGRA ) { + if (mDeviceImage == NULL) { + mDeviceImage = cvCreateImageHeader(cvSize(int(width),int(height)), IPL_DEPTH_8U, 4); + } + mDeviceImage->width = int(width); + mDeviceImage->height = int(height); + mDeviceImage->nChannels = 4; + mDeviceImage->depth = IPL_DEPTH_8U; + mDeviceImage->widthStep = int(rowBytes); + mDeviceImage->imageData = reinterpret_cast(baseaddress); + mDeviceImage->imageSize = int(rowBytes*height); + + cvCvtColor(mDeviceImage, mOutImage, CV_BGRA2BGR); + } else if ( pixelFormat == kCVPixelFormatType_422YpCbCr8 ) { + if ( currSize != width*3*height ) { + currSize = width*3*height; + free(mOutImagedata); + mOutImagedata = reinterpret_cast(malloc(currSize)); + } + + if (mDeviceImage == NULL) { + mDeviceImage = cvCreateImageHeader(cvSize(int(width),int(height)), IPL_DEPTH_8U, 2); + } + mDeviceImage->width = int(width); + mDeviceImage->height = int(height); + mDeviceImage->nChannels = 2; + mDeviceImage->depth = IPL_DEPTH_8U; + mDeviceImage->widthStep = int(rowBytes); + mDeviceImage->imageData = reinterpret_cast(baseaddress); + mDeviceImage->imageSize = int(rowBytes*height); + + cvCvtColor(mDeviceImage, mOutImage, CV_YUV2BGR_UYVY); + } else { + fprintf(stderr, "OpenCV: unknown pixel format 0x%08X\n", pixelFormat); + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + return 0; + } + + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + + return 1; +} + +@end + + +/***************************************************************************** + * + * CvCaptureFile Implementation. + * + * CvCaptureFile is the instantiation of a capture source for video files. + * + *****************************************************************************/ + +CvCaptureFile::CvCaptureFile(const char* filename) { + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + mAsset = nil; + mAssetTrack = nil; + mAssetReader = nil; + mTrackOutput = nil; + mDeviceImage = NULL; + mOutImage = NULL; + mOutImagedata = NULL; + currSize = 0; + mMode = CV_CAP_MODE_BGR; + mFormat = CV_8UC3; + mCurrentSampleBuffer = NULL; + mGrabbedPixels = NULL; + mFrameTimestamp = kCMTimeZero; + mFrameNum = 0; + + started = 0; + + mAsset = [[AVAsset assetWithURL:[NSURL fileURLWithPath: @(filename)]] retain]; + + if ( mAsset == nil ) { + fprintf(stderr, "OpenCV: Couldn't read movie file \"%s\"\n", filename); + [localpool drain]; + started = 0; + return; + } + + mAssetTrack = [[mAsset tracksWithMediaType: AVMediaTypeVideo][0] retain]; + + if ( ! setupReadingAt(kCMTimeZero) ) { + fprintf(stderr, "OpenCV: Couldn't read movie file \"%s\"\n", filename); + [localpool drain]; + started = 0; + return; + } + + started = 1; + [localpool drain]; +} + +CvCaptureFile::~CvCaptureFile() { + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + free(mOutImagedata); + cvReleaseImage(&mOutImage); + cvReleaseImage(&mDeviceImage); + [mAssetReader release]; + [mTrackOutput release]; + [mAssetTrack release]; + [mAsset release]; + CVBufferRelease(mGrabbedPixels); + if ( mCurrentSampleBuffer ) { + CFRelease(mCurrentSampleBuffer); + } + + [localpool drain]; +} + +bool CvCaptureFile::setupReadingAt(CMTime position) { + if (mAssetReader) { + if (mAssetReader.status == AVAssetReaderStatusReading) { + [mAssetReader cancelReading]; + } + [mAssetReader release]; + mAssetReader = nil; + } + if (mTrackOutput) { + [mTrackOutput release]; + mTrackOutput = nil; + } + + // Capture in a pixel format that can be converted efficiently to the output mode. + OSType pixelFormat; + if (mMode == CV_CAP_MODE_BGR || mMode == CV_CAP_MODE_RGB) { + // For CV_CAP_MODE_BGR, read frames as BGRA (AV Foundation's YUV->RGB conversion is slightly faster than OpenCV's CV_YUV2BGR_YV12) + // kCVPixelFormatType_32ABGR is reportedly faster on OS X, but OpenCV doesn't have a CV_ABGR2BGR conversion. + // kCVPixelFormatType_24RGB is significanly slower than kCVPixelFormatType_32BGRA. + pixelFormat = kCVPixelFormatType_32BGRA; + mFormat = CV_8UC3; + } else if (mMode == CV_CAP_MODE_GRAY) { + // For CV_CAP_MODE_GRAY, read frames as 420v (faster than 420f or 422 -- at least for H.264 files) + pixelFormat = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange; + mFormat = CV_8UC1; + } else if (mMode == CV_CAP_MODE_YUYV) { + // For CV_CAP_MODE_YUYV, read frames directly as 422. + pixelFormat = kCVPixelFormatType_422YpCbCr8; + mFormat = CV_8UC2; + } else { + fprintf(stderr, "VIDEOIO ERROR: AVF Mac: Unsupported mode: %d\n", mMode); + return false; + } + + NSDictionary *settings = + @{ + (id)kCVPixelBufferPixelFormatTypeKey: @(pixelFormat) + }; + mTrackOutput = [[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack: mAssetTrack + outputSettings: settings] retain]; + + if ( !mTrackOutput ) { + fprintf(stderr, "OpenCV: error in [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:outputSettings:]\n"); + return false; + } + + NSError *error = nil; + mAssetReader = [[AVAssetReader assetReaderWithAsset: mAsset + error: &error] retain]; + if ( error ) { + fprintf(stderr, "OpenCV: error in [AVAssetReader assetReaderWithAsset:error:]\n"); + NSLog(@"OpenCV: %@", error.localizedDescription); + return false; + } + + mAssetReader.timeRange = CMTimeRangeMake(position, kCMTimePositiveInfinity); + mFrameTimestamp = position; + mFrameNum = round((mFrameTimestamp.value * mAssetTrack.nominalFrameRate) / double(mFrameTimestamp.timescale)); + [mAssetReader addOutput: mTrackOutput]; + [mAssetReader startReading]; + + return true; +} + +int CvCaptureFile::didStart() { + return started; +} + +bool CvCaptureFile::grabFrame() { + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + CVBufferRelease(mGrabbedPixels); + if ( mCurrentSampleBuffer ) { + CFRelease(mCurrentSampleBuffer); + } + mCurrentSampleBuffer = [mTrackOutput copyNextSampleBuffer]; + mGrabbedPixels = CMSampleBufferGetImageBuffer(mCurrentSampleBuffer); + CVBufferRetain(mGrabbedPixels); + mFrameTimestamp = CMSampleBufferGetOutputPresentationTimeStamp(mCurrentSampleBuffer); + mFrameNum++; + + bool isReading = (mAssetReader.status == AVAssetReaderStatusReading); + [localpool drain]; + return isReading; +} + + +IplImage* CvCaptureFile::retrieveFramePixelBuffer() { + if ( ! mGrabbedPixels ) { + return 0; + } + + NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; + + CVPixelBufferLockBaseAddress(mGrabbedPixels, 0); + void *baseaddress; + size_t width, height, rowBytes; + + OSType pixelFormat = CVPixelBufferGetPixelFormatType(mGrabbedPixels); + + if (CVPixelBufferIsPlanar(mGrabbedPixels)) { + baseaddress = CVPixelBufferGetBaseAddressOfPlane(mGrabbedPixels, 0); + width = CVPixelBufferGetWidthOfPlane(mGrabbedPixels, 0); + height = CVPixelBufferGetHeightOfPlane(mGrabbedPixels, 0); + rowBytes = CVPixelBufferGetBytesPerRowOfPlane(mGrabbedPixels, 0); + } else { + baseaddress = CVPixelBufferGetBaseAddress(mGrabbedPixels); + width = CVPixelBufferGetWidth(mGrabbedPixels); + height = CVPixelBufferGetHeight(mGrabbedPixels); + rowBytes = CVPixelBufferGetBytesPerRow(mGrabbedPixels); + } + + if ( rowBytes == 0 ) { + fprintf(stderr, "OpenCV: error: rowBytes == 0\n"); + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + return 0; + } + + // Output image paramaters. + int outChannels; + if (mMode == CV_CAP_MODE_BGR || mMode == CV_CAP_MODE_RGB) { + outChannels = 3; + } else if (mMode == CV_CAP_MODE_GRAY) { + outChannels = 1; + } else if (mMode == CV_CAP_MODE_YUYV) { + outChannels = 2; + } else { + fprintf(stderr, "VIDEOIO ERROR: AVF Mac: Unsupported mode: %d\n", mMode); + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + return 0; + } + + if ( currSize != width*outChannels*height ) { + currSize = width*outChannels*height; + free(mOutImagedata); + mOutImagedata = reinterpret_cast(malloc(currSize)); + } + + // Build the header for the output image. + if (mOutImage == NULL) { + mOutImage = cvCreateImageHeader(cvSize((int)width,(int)height), IPL_DEPTH_8U, outChannels); + } + mOutImage->width = int(width); + mOutImage->height = int(height); + mOutImage->nChannels = outChannels; + mOutImage->depth = IPL_DEPTH_8U; + mOutImage->widthStep = int(width*outChannels); + mOutImage->imageData = reinterpret_cast(mOutImagedata); + mOutImage->imageSize = int(currSize); + + // Device image paramaters and conversion code. + // (Not all of these conversions are used in production, but they were all tested to find the fastest options.) + int deviceChannels; + int cvtCode; + + if ( pixelFormat == kCVPixelFormatType_32BGRA ) { + deviceChannels = 4; + + if (mMode == CV_CAP_MODE_BGR) { + cvtCode = CV_BGRA2BGR; + } else if (mMode == CV_CAP_MODE_RGB) { + cvtCode = CV_BGRA2RGB; + } else if (mMode == CV_CAP_MODE_GRAY) { + cvtCode = CV_BGRA2GRAY; + } else { + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); + return 0; + } + } else if ( pixelFormat == kCVPixelFormatType_24RGB ) { + deviceChannels = 3; + + if (mMode == CV_CAP_MODE_BGR) { + cvtCode = CV_RGB2BGR; + } else if (mMode == CV_CAP_MODE_RGB) { + cvtCode = 0; + } else if (mMode == CV_CAP_MODE_GRAY) { + cvtCode = CV_RGB2GRAY; + } else { + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); + return 0; + } + } else if ( pixelFormat == kCVPixelFormatType_422YpCbCr8 ) { // 422 (2vuy, UYVY) + deviceChannels = 2; + + if (mMode == CV_CAP_MODE_BGR) { + cvtCode = CV_YUV2BGR_UYVY; + } else if (mMode == CV_CAP_MODE_RGB) { + cvtCode = CV_YUV2RGB_UYVY; + } else if (mMode == CV_CAP_MODE_GRAY) { + cvtCode = CV_YUV2GRAY_UYVY; + } else if (mMode == CV_CAP_MODE_YUYV) { + cvtCode = -1; // Copy + } else { + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); + return 0; + } + } else if ( pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange || // 420v + pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ) { // 420f + // cvCvtColor(CV_YUV2GRAY_420) is expecting a single buffer with both the Y plane and the CrCb planes. + // So, lie about the height of the buffer. cvCvtColor(CV_YUV2GRAY_420) will only read the first 2/3 of it. + height = height * 3 / 2; + deviceChannels = 1; + + if (mMode == CV_CAP_MODE_BGR) { + cvtCode = CV_YUV2BGR_YV12; + } else if (mMode == CV_CAP_MODE_RGB) { + cvtCode = CV_YUV2RGB_YV12; + } else if (mMode == CV_CAP_MODE_GRAY) { + cvtCode = CV_YUV2GRAY_420; + } else { + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); + return 0; + } + } else { + fprintf(stderr, "OpenCV: unsupported pixel format 0x%08X\n", pixelFormat); + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + CVBufferRelease(mGrabbedPixels); + mGrabbedPixels = NULL; + return 0; + } + + // Build the header for the device image. + if (mDeviceImage == NULL) { + mDeviceImage = cvCreateImageHeader(cvSize(int(width),int(height)), IPL_DEPTH_8U, deviceChannels); + } + mDeviceImage->width = int(width); + mDeviceImage->height = int(height); + mDeviceImage->nChannels = deviceChannels; + mDeviceImage->depth = IPL_DEPTH_8U; + mDeviceImage->widthStep = int(rowBytes); + mDeviceImage->imageData = reinterpret_cast(baseaddress); + mDeviceImage->imageSize = int(rowBytes*height); + + // Convert the device image into the output image. + if (cvtCode == -1) { + // Copy. + cv::cvarrToMat(mDeviceImage).copyTo(cv::cvarrToMat(mOutImage)); + } else { + cvCvtColor(mDeviceImage, mOutImage, cvtCode); + } + + + CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); + + [localpool drain]; + + return mOutImage; +} + + +IplImage* CvCaptureFile::retrieveFrame(int) { + return retrieveFramePixelBuffer(); +} + +double CvCaptureFile::getProperty(int property_id) const{ + if (mAsset == nil) return 0; + + CMTime t; + + switch (property_id) { + case CV_CAP_PROP_POS_MSEC: + return mFrameTimestamp.value * 1000.0 / mFrameTimestamp.timescale; + case CV_CAP_PROP_POS_FRAMES: + return mFrameNum; + case CV_CAP_PROP_POS_AVI_RATIO: + t = [mAsset duration]; + return (mFrameTimestamp.value * t.timescale) / double(mFrameTimestamp.timescale * t.value); + case CV_CAP_PROP_FRAME_WIDTH: + return mAssetTrack.naturalSize.width; + case CV_CAP_PROP_FRAME_HEIGHT: + return mAssetTrack.naturalSize.height; + case CV_CAP_PROP_FPS: + return mAssetTrack.nominalFrameRate; + case CV_CAP_PROP_FRAME_COUNT: + t = [mAsset duration]; + return round((t.value * mAssetTrack.nominalFrameRate) / double(t.timescale)); + case CV_CAP_PROP_FORMAT: + return mFormat; + case CV_CAP_PROP_MODE: + return mMode; + default: + break; + } + + return 0; +} + +bool CvCaptureFile::setProperty(int property_id, double value) { + if (mAsset == nil) return false; + + NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; + + bool retval = false; + CMTime t; + + switch (property_id) { + case CV_CAP_PROP_POS_MSEC: + t = mAsset.duration; + t.value = value * t.timescale / 1000; + setupReadingAt(t); + retval = true; + break; + case CV_CAP_PROP_POS_FRAMES: + setupReadingAt(CMTimeMake(value, mAssetTrack.nominalFrameRate)); + retval = true; + break; + case CV_CAP_PROP_POS_AVI_RATIO: + t = mAsset.duration; + t.value = round(t.value * value); + setupReadingAt(t); + retval = true; + break; + case CV_CAP_PROP_MODE: + int mode; + mode = cvRound(value); + if (mMode == mode) { + retval = true; + } else { + switch (mode) { + case CV_CAP_MODE_BGR: + case CV_CAP_MODE_RGB: + case CV_CAP_MODE_GRAY: + case CV_CAP_MODE_YUYV: + mMode = mode; + setupReadingAt(mFrameTimestamp); + retval = true; + break; + default: + fprintf(stderr, "VIDEOIO ERROR: AVF Mac: Unsupported mode: %d\n", mode); + retval=false; + break; + } + } + break; + default: + break; + } + + [localpool drain]; + return retval; +} + + +/***************************************************************************** + * + * CvVideoWriter_AVFoundation Implementation. + * + * CvVideoWriter_AVFoundation is the instantiation of a video output class. + * + *****************************************************************************/ + + +CvVideoWriter_AVFoundation::CvVideoWriter_AVFoundation(const char* filename, int fourcc, + double fps, CvSize frame_size, + int is_color) { + + NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; + + + mFrameNum = 0; + mMovieFPS = fps; + movieSize = frame_size; + movieColor = is_color; + argbimage = cvCreateImage(movieSize, IPL_DEPTH_8U, 4); + path = [[[NSString stringWithCString:filename encoding:NSASCIIStringEncoding] stringByExpandingTildeInPath] retain]; + + + /* + AVFileTypeQuickTimeMovie + UTI for the QuickTime movie file format. + The value of this UTI is com.apple.quicktime-movie. Files are identified with the .mov and .qt extensions. + + AVFileTypeMPEG4 + UTI for the MPEG-4 file format. + The value of this UTI is public.mpeg-4. Files are identified with the .mp4 extension. + + AVFileTypeAppleM4V + UTI for the iTunes video file format. + The value of this UTI is com.apple.mpeg-4-video. Files are identified with the .m4v extension. + + AVFileType3GPP + UTI for the 3GPP file format. + The value of this UTI is public.3gpp. Files are identified with the .3gp, .3gpp, and .sdv extensions. + */ + + NSString *fileExt =[[[path pathExtension] lowercaseString] copy]; + if ([fileExt isEqualToString:@"mov"] || [fileExt isEqualToString:@"qt"]){ + fileType = [AVFileTypeQuickTimeMovie copy]; + }else if ([fileExt isEqualToString:@"mp4"]){ + fileType = [AVFileTypeMPEG4 copy]; + }else if ([fileExt isEqualToString:@"m4v"]){ + fileType = [AVFileTypeAppleM4V copy]; +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + }else if ([fileExt isEqualToString:@"3gp"] || [fileExt isEqualToString:@"3gpp"] || [fileExt isEqualToString:@"sdv"] ){ + fileType = [AVFileType3GPP copy]; +#endif + } else{ + fileType = [AVFileTypeMPEG4 copy]; //default mp4 + } + [fileExt release]; + + char cc[5]; + cc[0] = fourcc & 255; + cc[1] = (fourcc >> 8) & 255; + cc[2] = (fourcc >> 16) & 255; + cc[3] = (fourcc >> 24) & 255; + cc[4] = 0; + int cc2 = CV_FOURCC(cc[0], cc[1], cc[2], cc[3]); + if (cc2!=fourcc) { + fprintf(stderr, "OpenCV: Didn't properly encode FourCC. Expected 0x%08X but got 0x%08X.\n", fourcc, cc2); + //exception; + } + + // Two codec supported AVVideoCodecH264 AVVideoCodecJPEG + // On iPhone 3G H264 is not supported. + if (fourcc == CV_FOURCC('J','P','E','G') || fourcc == CV_FOURCC('j','p','e','g') || + fourcc == CV_FOURCC('M','J','P','G') || fourcc == CV_FOURCC('m','j','p','g') ){ + codec = [AVVideoCodecJPEG copy]; // Use JPEG codec if specified, otherwise H264 + }else if(fourcc == CV_FOURCC('H','2','6','4') || fourcc == CV_FOURCC('a','v','c','1')){ + codec = [AVVideoCodecH264 copy]; + }else{ + codec = [AVVideoCodecH264 copy]; // default canonical H264. + + } + + //NSLog(@"Path: %@", path); + + NSError *error = nil; + + + // Make sure the file does not already exist. Necessary to overwirte?? + /* + NSFileManager *fileManager = [NSFileManager defaultManager]; + if ([fileManager fileExistsAtPath:path]){ + [fileManager removeItemAtPath:path error:&error]; + } + */ + + // Wire the writer: + // Supported file types: + // AVFileTypeQuickTimeMovie AVFileTypeMPEG4 AVFileTypeAppleM4V AVFileType3GPP + + mMovieWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path] + fileType:fileType + error:&error]; + //NSParameterAssert(mMovieWriter); + + NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: + codec, AVVideoCodecKey, + [NSNumber numberWithInt:movieSize.width], AVVideoWidthKey, + [NSNumber numberWithInt:movieSize.height], AVVideoHeightKey, + nil]; + + mMovieWriterInput = [[AVAssetWriterInput + assetWriterInputWithMediaType:AVMediaTypeVideo + outputSettings:videoSettings] retain]; + + //NSParameterAssert(mMovieWriterInput); + //NSParameterAssert([mMovieWriter canAddInput:mMovieWriterInput]); + + [mMovieWriter addInput:mMovieWriterInput]; + + mMovieWriterAdaptor = [[AVAssetWriterInputPixelBufferAdaptor alloc] initWithAssetWriterInput:mMovieWriterInput sourcePixelBufferAttributes:nil]; + + + //Start a session: + [mMovieWriter startWriting]; + [mMovieWriter startSessionAtSourceTime:kCMTimeZero]; + + + if(mMovieWriter.status == AVAssetWriterStatusFailed){ + NSLog(@"AVF: AVAssetWriter status: %@", [mMovieWriter.error localizedDescription]); + // TODO: error handling, cleanup. Throw execption? + // return; + } + + [localpool drain]; +} + + +CvVideoWriter_AVFoundation::~CvVideoWriter_AVFoundation() { + NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; + + [mMovieWriterInput markAsFinished]; + [mMovieWriter finishWriting]; + [mMovieWriter release]; + [mMovieWriterInput release]; + [mMovieWriterAdaptor release]; + [path release]; + [codec release]; + [fileType release]; + cvReleaseImage(&argbimage); + + [localpool drain]; + +} + +static void releaseCallback( void *releaseRefCon, const void * ) { + CFRelease((CFDataRef)releaseRefCon); +} + +bool CvVideoWriter_AVFoundation::writeFrame(const IplImage* iplimage) { + NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; + + // writer status check + if (mMovieWriter.status != AVAssetWriterStatusWriting ) { + NSLog(@"mMovieWriter.status: %d. Error: %@", (int)mMovieWriter.status, [mMovieWriter.error localizedDescription]); + [localpool drain]; + return false; + } + + // Make writeFrame() a blocking call. + while (![mMovieWriterInput isReadyForMoreMediaData]) { + fprintf(stderr, "OpenCV: AVF: waiting to write video data.\n"); + // Sleep 1 msec. + usleep(1000); + } + + BOOL success = FALSE; + + if (iplimage->height!=movieSize.height || iplimage->width!=movieSize.width){ + fprintf(stderr, "OpenCV: Frame size does not match video size.\n"); + [localpool drain]; + return false; + } + + if (movieColor) { + //assert(iplimage->nChannels == 3); + cvCvtColor(iplimage, argbimage, CV_BGR2BGRA); + }else{ + //assert(iplimage->nChannels == 1); + cvCvtColor(iplimage, argbimage, CV_GRAY2BGRA); + } + //IplImage -> CGImage conversion + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + NSData *nsData = [NSData dataWithBytes:argbimage->imageData length:argbimage->imageSize]; + CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)nsData); + CGImageRef cgImage = CGImageCreate(argbimage->width, argbimage->height, + argbimage->depth, argbimage->depth * argbimage->nChannels, argbimage->widthStep, + colorSpace, kCGImageAlphaLast|kCGBitmapByteOrderDefault, + provider, NULL, false, kCGRenderingIntentDefault); + + //CGImage -> CVPixelBufferRef coversion + CVPixelBufferRef pixelBuffer = NULL; + CFDataRef cfData = CGDataProviderCopyData(CGImageGetDataProvider(cgImage)); + int status = CVPixelBufferCreateWithBytes(NULL, + movieSize.width, + movieSize.height, + kCVPixelFormatType_32BGRA, + (void*)CFDataGetBytePtr(cfData), + CGImageGetBytesPerRow(cgImage), + &releaseCallback, + (void *)cfData, + NULL, + &pixelBuffer); + if(status == kCVReturnSuccess){ + success = [mMovieWriterAdaptor appendPixelBuffer:pixelBuffer + withPresentationTime:CMTimeMake(mFrameNum, mMovieFPS)]; + } + + //cleanup + CVPixelBufferRelease(pixelBuffer); + CGImageRelease(cgImage); + CGDataProviderRelease(provider); + CGColorSpaceRelease(colorSpace); + + [localpool drain]; + + if (success) { + mFrameNum ++; + //NSLog(@"Frame #%d", mFrameNum); + return true; + }else{ + NSLog(@"Frame appendPixelBuffer failed."); + return false; + } + +} From c314178e7aa06fd4ed84b6521d592ea12e1d6851 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 19 Sep 2016 19:51:10 +0300 Subject: [PATCH 44/96] highgui/osx: backport AVFoundation support --- CMakeLists.txt | 20 +++++++------ cmake/OpenCVFindLibsVideo.cmake | 23 +++++++-------- modules/highgui/CMakeLists.txt | 9 ++++-- modules/highgui/src/cap_avfoundation_mac.mm | 32 +++++++++++++++++++++ 4 files changed, 61 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c52ab5c458..007b80d4da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,7 +137,7 @@ endif() # Optional 3rd party components # =================================================== OCV_OPTION(WITH_1394 "Include IEEE1394 support" ON IF (NOT ANDROID AND NOT IOS) ) -OCV_OPTION(WITH_AVFOUNDATION "Use AVFoundation for Video I/O" ON IF IOS) +OCV_OPTION(WITH_AVFOUNDATION "Use AVFoundation for Video I/O (iOS/Mac)" ON IF APPLE) OCV_OPTION(WITH_CARBON "Use Carbon for UI instead of Cocoa" OFF IF APPLE ) OCV_OPTION(WITH_CUDA "Include NVidia Cuda Runtime support" ON IF (CMAKE_VERSION VERSION_GREATER "2.8" AND NOT IOS) ) OCV_OPTION(WITH_VTK "Include VTK library support (and build opencv_viz module eiher)" OFF IF (NOT ANDROID AND NOT IOS AND NOT CMAKE_CROSSCOMPILING) ) @@ -162,7 +162,8 @@ OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON OCV_OPTION(WITH_GIGEAPI "Include Smartek GigE support" ON IF (NOT ANDROID AND NOT IOS) ) OCV_OPTION(WITH_QT "Build with Qt Backend support" OFF IF (NOT ANDROID AND NOT IOS) ) OCV_OPTION(WITH_WIN32UI "Build with Win32 UI Backend support" ON IF WIN32 ) -OCV_OPTION(WITH_QUICKTIME "Use QuickTime for Video I/O insted of QTKit" OFF IF APPLE ) +OCV_OPTION(WITH_QUICKTIME "Use QuickTime for Video I/O" OFF IF APPLE ) +OCV_OPTION(WITH_QTKIT "Use QTKit Video I/O backend" OFF IF APPLE ) OCV_OPTION(WITH_TBB "Include Intel TBB support" OFF IF (NOT IOS) ) OCV_OPTION(WITH_OPENMP "Include OpenMP support" OFF) OCV_OPTION(WITH_CSTRIPES "Include C= support" OFF IF WIN32 ) @@ -879,10 +880,6 @@ if(ANDROID) endif() endif() -if(DEFINED WITH_AVFOUNDATION) - status(" AVFoundation:" WITH_AVFOUNDATION THEN YES ELSE NO) -endif(DEFINED WITH_AVFOUNDATION) - if(DEFINED WITH_FFMPEG) if(WIN32) status(" FFMPEG:" WITH_FFMPEG THEN "YES (prebuilt binaries)" ELSE NO) @@ -923,10 +920,15 @@ if(DEFINED WITH_GIGEAPI) status(" GigEVisionSDK:" HAVE_GIGE_API THEN YES ELSE NO) endif(DEFINED WITH_GIGEAPI) -if(DEFINED WITH_QUICKTIME) +if(DEFINED APPLE) + status(" AVFoundation:" HAVE_AVFOUNDATION THEN YES ELSE NO) + if(WITH_QUICKTIME OR HAVE_QUICKTIME) status(" QuickTime:" HAVE_QUICKTIME THEN YES ELSE NO) - status(" QTKit:" HAVE_QTKIT THEN YES ELSE NO) -endif(DEFINED WITH_QUICKTIME) + endif() + if(WITH_QTKIT OR HAVE_QTKIT) + status(" QTKit:" HAVE_QTKIT THEN "YES (deprecated)" ELSE NO) + endif() +endif(DEFINED APPLE) if(DEFINED WITH_UNICAP) status(" UniCap:" HAVE_UNICAP THEN "YES (ver ${ALIASOF_libunicap_VERSION})" ELSE NO) diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake index 514aa5cd3d..5430759f39 100644 --- a/cmake/OpenCVFindLibsVideo.cmake +++ b/cmake/OpenCVFindLibsVideo.cmake @@ -273,19 +273,18 @@ if(WIN32) endif() endif(WIN32) -# --- Apple AV Foundation --- -if(WITH_AVFOUNDATION) - set(HAVE_AVFOUNDATION YES) -endif() - -# --- QuickTime --- -if (NOT IOS) - if(WITH_QUICKTIME) - set(HAVE_QUICKTIME YES) - elseif(APPLE) - set(HAVE_QTKIT YES) +if(APPLE) + if(WITH_AVFOUNDATION) + set(HAVE_AVFOUNDATION YES) endif() -endif() + if(NOT IOS) + if(WITH_QUICKTIME) + set(HAVE_QUICKTIME YES) + elseif(WITH_QTKIT) + set(HAVE_QTKIT YES) + endif() + endif() +endif(APPLE) # --- Intel Perceptual Computing SDK --- if(WITH_INTELPERC) diff --git a/modules/highgui/CMakeLists.txt b/modules/highgui/CMakeLists.txt index 44cf98c613..789232141e 100644 --- a/modules/highgui/CMakeLists.txt +++ b/modules/highgui/CMakeLists.txt @@ -215,8 +215,13 @@ if(HAVE_IMAGEIO AND IOS) endif() if(HAVE_AVFOUNDATION) - list(APPEND highgui_srcs src/cap_avfoundation.mm) - list(APPEND HIGHGUI_LIBRARIES "-framework AVFoundation" "-framework QuartzCore") + if(IOS) + list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/cap_avfoundation.mm) + list(APPEND HIGHGUI_LIBRARIES "-framework AVFoundation" "-framework QuartzCore") + else() + list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/cap_avfoundation_mac.mm) + list(APPEND HIGHGUI_LIBRARIES "-framework Cocoa" "-framework Accelerate" "-framework AVFoundation" "-framework CoreGraphics" "-framework CoreImage" "-framework CoreMedia" "-framework CoreVideo" "-framework QuartzCore") + endif() endif() if(HAVE_QUICKTIME) diff --git a/modules/highgui/src/cap_avfoundation_mac.mm b/modules/highgui/src/cap_avfoundation_mac.mm index 8c30506400..a7b889522f 100644 --- a/modules/highgui/src/cap_avfoundation_mac.mm +++ b/modules/highgui/src/cap_avfoundation_mac.mm @@ -155,7 +155,9 @@ private: uint8_t *mOutImagedata; IplImage *mOutImage; size_t currSize; +/* int mMode; +*/ int mFormat; bool setupReadingAt(CMTime position); @@ -677,7 +679,9 @@ CvCaptureFile::CvCaptureFile(const char* filename) { mOutImage = NULL; mOutImagedata = NULL; currSize = 0; +/* mMode = CV_CAP_MODE_BGR; +*/ mFormat = CV_8UC3; mCurrentSampleBuffer = NULL; mGrabbedPixels = NULL; @@ -741,12 +745,15 @@ bool CvCaptureFile::setupReadingAt(CMTime position) { // Capture in a pixel format that can be converted efficiently to the output mode. OSType pixelFormat; +/* if (mMode == CV_CAP_MODE_BGR || mMode == CV_CAP_MODE_RGB) { +*/ // For CV_CAP_MODE_BGR, read frames as BGRA (AV Foundation's YUV->RGB conversion is slightly faster than OpenCV's CV_YUV2BGR_YV12) // kCVPixelFormatType_32ABGR is reportedly faster on OS X, but OpenCV doesn't have a CV_ABGR2BGR conversion. // kCVPixelFormatType_24RGB is significanly slower than kCVPixelFormatType_32BGRA. pixelFormat = kCVPixelFormatType_32BGRA; mFormat = CV_8UC3; +/* } else if (mMode == CV_CAP_MODE_GRAY) { // For CV_CAP_MODE_GRAY, read frames as 420v (faster than 420f or 422 -- at least for H.264 files) pixelFormat = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange; @@ -759,6 +766,7 @@ bool CvCaptureFile::setupReadingAt(CMTime position) { fprintf(stderr, "VIDEOIO ERROR: AVF Mac: Unsupported mode: %d\n", mMode); return false; } +*/ NSDictionary *settings = @{ @@ -848,8 +856,11 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { // Output image paramaters. int outChannels; +/* if (mMode == CV_CAP_MODE_BGR || mMode == CV_CAP_MODE_RGB) { +*/ outChannels = 3; +/* } else if (mMode == CV_CAP_MODE_GRAY) { outChannels = 1; } else if (mMode == CV_CAP_MODE_YUYV) { @@ -861,6 +872,7 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { mGrabbedPixels = NULL; return 0; } +*/ if ( currSize != width*outChannels*height ) { currSize = width*outChannels*height; @@ -888,8 +900,11 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { if ( pixelFormat == kCVPixelFormatType_32BGRA ) { deviceChannels = 4; +/* if (mMode == CV_CAP_MODE_BGR) { +*/ cvtCode = CV_BGRA2BGR; +/* } else if (mMode == CV_CAP_MODE_RGB) { cvtCode = CV_BGRA2RGB; } else if (mMode == CV_CAP_MODE_GRAY) { @@ -901,11 +916,15 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); return 0; } +*/ } else if ( pixelFormat == kCVPixelFormatType_24RGB ) { deviceChannels = 3; +/* if (mMode == CV_CAP_MODE_BGR) { +*/ cvtCode = CV_RGB2BGR; +/* } else if (mMode == CV_CAP_MODE_RGB) { cvtCode = 0; } else if (mMode == CV_CAP_MODE_GRAY) { @@ -917,11 +936,15 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); return 0; } +*/ } else if ( pixelFormat == kCVPixelFormatType_422YpCbCr8 ) { // 422 (2vuy, UYVY) deviceChannels = 2; +/* if (mMode == CV_CAP_MODE_BGR) { +*/ cvtCode = CV_YUV2BGR_UYVY; +/* } else if (mMode == CV_CAP_MODE_RGB) { cvtCode = CV_YUV2RGB_UYVY; } else if (mMode == CV_CAP_MODE_GRAY) { @@ -935,6 +958,7 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); return 0; } +*/ } else if ( pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange || // 420v pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ) { // 420f // cvCvtColor(CV_YUV2GRAY_420) is expecting a single buffer with both the Y plane and the CrCb planes. @@ -942,8 +966,11 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { height = height * 3 / 2; deviceChannels = 1; +/* if (mMode == CV_CAP_MODE_BGR) { +*/ cvtCode = CV_YUV2BGR_YV12; +/* } else if (mMode == CV_CAP_MODE_RGB) { cvtCode = CV_YUV2RGB_YV12; } else if (mMode == CV_CAP_MODE_GRAY) { @@ -955,6 +982,7 @@ IplImage* CvCaptureFile::retrieveFramePixelBuffer() { fprintf(stderr, "OpenCV: unsupported pixel conversion mode\n"); return 0; } +*/ } else { fprintf(stderr, "OpenCV: unsupported pixel format 0x%08X\n", pixelFormat); CVPixelBufferUnlockBaseAddress(mGrabbedPixels, 0); @@ -1020,8 +1048,10 @@ double CvCaptureFile::getProperty(int property_id) const{ return round((t.value * mAssetTrack.nominalFrameRate) / double(t.timescale)); case CV_CAP_PROP_FORMAT: return mFormat; +/* case CV_CAP_PROP_MODE: return mMode; +*/ default: break; } @@ -1054,6 +1084,7 @@ bool CvCaptureFile::setProperty(int property_id, double value) { setupReadingAt(t); retval = true; break; +/* case CV_CAP_PROP_MODE: int mode; mode = cvRound(value); @@ -1076,6 +1107,7 @@ bool CvCaptureFile::setProperty(int property_id, double value) { } } break; +*/ default: break; } From f1009e2234712546907ffa4b15f6bb6fc629de74 Mon Sep 17 00:00:00 2001 From: catree Date: Fri, 30 Sep 2016 23:56:35 +0200 Subject: [PATCH 45/96] Fix dead link for hit or miss 2.4 documentation. --- modules/imgproc/doc/filtering.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/doc/filtering.rst b/modules/imgproc/doc/filtering.rst index 0a78c365ff..b796b67415 100755 --- a/modules/imgproc/doc/filtering.rst +++ b/modules/imgproc/doc/filtering.rst @@ -1271,7 +1271,7 @@ Morphological gradient: \texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src} -"Hit and Miss": Only supported for CV_8UC1 binary images. Tutorial can be found in this page: http://opencv-code.com/tutorials/hit-or-miss-transform-in-opencv/ +"Hit and Miss": Only supported for CV_8UC1 binary images. Tutorial can be found in this page: https://web.archive.org/web/20160316070407/http://opencv-code.com/tutorials/hit-or-miss-transform-in-opencv/ Any of the operations can be done in-place. In case of multi-channel images, each channel is processed independently. From 26a32dcbf60ffd05fb7262bb4d211bef9f18f4b1 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sun, 2 Oct 2016 03:04:37 +0300 Subject: [PATCH 46/96] videoio: remove 'const' from getProperty 'const' is available in OpenCV 3.x only --- modules/highgui/src/cap_avfoundation_mac.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/highgui/src/cap_avfoundation_mac.mm b/modules/highgui/src/cap_avfoundation_mac.mm index a7b889522f..5b24263cfe 100644 --- a/modules/highgui/src/cap_avfoundation_mac.mm +++ b/modules/highgui/src/cap_avfoundation_mac.mm @@ -95,7 +95,7 @@ public: ~CvCaptureCAM(); virtual bool grabFrame(); virtual IplImage* retrieveFrame(int); - virtual double getProperty(int property_id) const; + virtual double getProperty(int property_id); virtual bool setProperty(int property_id, double value); virtual int didStart(); @@ -138,7 +138,7 @@ public: ~CvCaptureFile(); virtual bool grabFrame(); virtual IplImage* retrieveFrame(int); - virtual double getProperty(int property_id) const; + virtual double getProperty(int property_id); virtual bool setProperty(int property_id, double value); virtual int didStart(); @@ -411,7 +411,7 @@ void CvCaptureCAM::setWidthHeight() { } -double CvCaptureCAM::getProperty(int property_id) const{ +double CvCaptureCAM::getProperty(int property_id) { NSAutoreleasePool *localpool = [[NSAutoreleasePool alloc] init]; CMFormatDescriptionRef format = mCaptureDevice.activeFormat.formatDescription; @@ -1024,7 +1024,7 @@ IplImage* CvCaptureFile::retrieveFrame(int) { return retrieveFramePixelBuffer(); } -double CvCaptureFile::getProperty(int property_id) const{ +double CvCaptureFile::getProperty(int property_id) { if (mAsset == nil) return 0; CMTime t; From c181f2f4937186306dc6f1a72fc3cebd8685f37a Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 4 Oct 2016 13:30:43 +0300 Subject: [PATCH 47/96] cmake: fix for GCC 6.x --- cmake/OpenCVPCHSupport.cmake | 7 +------ cmake/OpenCVUtils.cmake | 3 +++ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/cmake/OpenCVPCHSupport.cmake b/cmake/OpenCVPCHSupport.cmake index e6585cae02..7d7aacf00f 100644 --- a/cmake/OpenCVPCHSupport.cmake +++ b/cmake/OpenCVPCHSupport.cmake @@ -14,12 +14,7 @@ IF(CMAKE_COMPILER_IS_GNUCXX) - EXEC_PROGRAM( - ${CMAKE_CXX_COMPILER} - ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion - OUTPUT_VARIABLE gcc_compiler_version) - #MESSAGE("GCC Version: ${gcc_compiler_version}") - IF(gcc_compiler_version VERSION_GREATER "4.2.-1" AND gcc_compiler_version VERSION_LESS "6.0.0") + IF(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.2.0") SET(PCHSupport_FOUND TRUE) ENDIF() diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index 0692b763d5..0241c43c1c 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -41,6 +41,9 @@ function(ocv_include_directories) get_filename_component(__abs_dir "${dir}" ABSOLUTE) if("${__abs_dir}" MATCHES "^${OpenCV_SOURCE_DIR}" OR "${__abs_dir}" MATCHES "^${OpenCV_BINARY_DIR}") list(APPEND __add_before "${dir}") + elseif(CMAKE_COMPILER_IS_GNUCXX AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "6.0" AND + dir MATCHES "/usr/include$") + # workaround for GCC 6.x bug else() include_directories(AFTER SYSTEM "${dir}") endif() From 80f03f58e71bafbae79644f086a53f3d291b4e55 Mon Sep 17 00:00:00 2001 From: StevenPuttemans Date: Thu, 6 Oct 2016 13:42:12 +0200 Subject: [PATCH 48/96] backport of 7361 --- .../introduction/windows_install/windows_install.rst | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/tutorials/introduction/windows_install/windows_install.rst b/doc/tutorials/introduction/windows_install/windows_install.rst index 3fda01c086..a02a07d969 100644 --- a/doc/tutorials/introduction/windows_install/windows_install.rst +++ b/doc/tutorials/introduction/windows_install/windows_install.rst @@ -70,8 +70,12 @@ Building the OpenCV library from scratch requires a couple of tools installed be .. _CUDA_Toolkit: http://developer.nvidia.com/cuda-downloads .. |OpenEXR| replace:: OpenEXR .. _OpenEXR: http://www.openexr.com/downloads.html -.. |OpenNI_Framework| replace:: OpenNI Framework -.. _OpenNI_Framework: http://www.openni.org/ +.. |OpenNI_prebuilt| replace:: OpenNI prebuilt binaries +.. _OpenNI_prebuilt: http://structure.io/openni +.. |OpenNI_github| replace:: OpenNI Github +.. _OpenNI_github: https://github.com/OpenNI/OpenNI +.. |OpenNI2_github| replace:: OpenNI2 Github +.. _OpenNI2_github: https://github.com/OpenNI/OpenNI2 .. |Miktex| replace:: Miktex .. _Miktex: http://miktex.org/2.9/setup .. |Sphinx| replace:: Sphinx @@ -105,7 +109,7 @@ OpenCV may come in multiple flavors. There is a "core" section that will work on + |OpenEXR|_ source files are required for the library to work with this high dynamic range (HDR) image file format. - + The |OpenNI_Framework|_ contains a set of open source APIs that provide support for natural interaction with devices via methods such as voice command recognition, hand gestures and body motion tracking. + + The OpenNI Framework contains a set of open source APIs that provide support for natural interaction with devices via methods such as voice command recognition, hand gestures and body motion tracking. |OpenNI_prebuilt|_ , |OpenNI_github|_ code and |OpenNI2_github|_ code is available. + |Miktex|_ is the best `TEX `_ implementation on the Windows OS. It is required to build the *OpenCV documentation*. @@ -172,7 +176,7 @@ Building the library #) Same as above with |OpenEXR|_. - #) For the |OpenNI_Framework|_ you need to install both the `development build `_ and the `PrimeSensor Module `_. + #) For the |OpenNI_prebuilt|_ you need to install both the `development build `_ and the `PrimeSensor Module `_. #) For the CUDA you need again two modules: the latest |CUDA_Toolkit|_ and the *CUDA Tools SDK*. Download and install both of them with a *complete* option by using the 32 or 64 bit setups according to your OS. From 4e7f28811c1503e431a91d790d4998e63e80753d Mon Sep 17 00:00:00 2001 From: Juha Reunanen Date: Wed, 12 Oct 2016 10:37:07 +0300 Subject: [PATCH 49/96] Merge pull request #7452 from reunanen:issue-7409-2.4 Fix findContours crash for very large images (v2.4) * Cast step to size_t in order to avoid integer overflow when processing very large images * Change assert to CV_Assert --- modules/imgproc/src/contours.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/imgproc/src/contours.cpp b/modules/imgproc/src/contours.cpp index 304214257c..8d1ec9b32a 100644 --- a/modules/imgproc/src/contours.cpp +++ b/modules/imgproc/src/contours.cpp @@ -284,10 +284,13 @@ cvStartFindContours( void* _img, CvMemStorage* storage, scanner->cinfo_storage ); } + CV_Assert(step >= 0); + CV_Assert(size.height >= 1); + /* make zero borders */ int esz = CV_ELEM_SIZE(mat->type); memset( img, 0, size.width*esz ); - memset( img + step * (size.height - 1), 0, size.width*esz ); + memset( img + static_cast(step) * (size.height - 1), 0, size.width*esz ); img += step; for( int y = 1; y < size.height - 1; y++, img += step ) @@ -989,6 +992,8 @@ cvFindNextContour( CvContourScanner scanner ) { if( !scanner ) CV_Error( CV_StsNullPtr, "" ); + CV_Assert(scanner->img_step >= 0); + icvEndProcessContour( scanner ); /* initialize local state */ @@ -1063,7 +1068,7 @@ cvFindNextContour( CvContourScanner scanner ) is_hole = 1; } - if( mode == 0 && (is_hole || img0[lnbd.y * step + lnbd.x] > 0) ) + if( mode == 0 && (is_hole || img0[lnbd.y * static_cast(step) + lnbd.x] > 0) ) goto resume_scan; origin.y = y; @@ -1077,8 +1082,8 @@ cvFindNextContour( CvContourScanner scanner ) else { int lval = (img0_i ? - img0_i[lnbd.y * step_i + lnbd.x] : - (int)img0[lnbd.y * step + lnbd.x]) & 0x7f; + img0_i[lnbd.y * static_cast(step_i) + lnbd.x] : + (int)img0[lnbd.y * static_cast(step) + lnbd.x]) & 0x7f; _CvContourInfo *cur = scanner->cinfo_table[lval]; /* find the first bounding contour */ @@ -1090,11 +1095,11 @@ cvFindNextContour( CvContourScanner scanner ) if( par_info ) { if( (img0_i && - icvTraceContour_32s( img0_i + par_info->origin.y * step_i + + icvTraceContour_32s( img0_i + par_info->origin.y * static_cast(step_i) + par_info->origin.x, step_i, img_i + lnbd.x, par_info->is_hole ) > 0) || (!img0_i && - icvTraceContour( img0 + par_info->origin.y * step + + icvTraceContour( img0 + par_info->origin.y * static_cast(step) + par_info->origin.x, step, img + lnbd.x, par_info->is_hole ) > 0) ) break; From c419552002486ef45ba403afc6eeb145fc081275 Mon Sep 17 00:00:00 2001 From: catree Date: Mon, 17 Oct 2016 00:01:08 +0200 Subject: [PATCH 50/96] Add images for tutorials on morphological operations to avoid possible confusion. --- .../erosion_dilatation/erosion_dilatation.rst | 15 +++++++++++++++ ...Morphology_1_Tutorial_Theory_Dilatation_2.png | Bin 0 -> 1558 bytes .../Morphology_1_Tutorial_Theory_Erosion_2.png | Bin 0 -> 1533 bytes .../Morphology_2_Tutorial_Theory_Closing_2.png | Bin 0 -> 1383 bytes .../Morphology_2_Tutorial_Theory_Opening_2.png | Bin 0 -> 1341 bytes .../opening_closing_hats.rst | 13 ++++++++++++- 6 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 doc/tutorials/imgproc/erosion_dilatation/images/Morphology_1_Tutorial_Theory_Dilatation_2.png create mode 100644 doc/tutorials/imgproc/erosion_dilatation/images/Morphology_1_Tutorial_Theory_Erosion_2.png create mode 100644 doc/tutorials/imgproc/opening_closing_hats/images/Morphology_2_Tutorial_Theory_Closing_2.png create mode 100644 doc/tutorials/imgproc/opening_closing_hats/images/Morphology_2_Tutorial_Theory_Opening_2.png diff --git a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst index 5ba21f622e..4d7eedbf73 100644 --- a/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst +++ b/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.rst @@ -53,6 +53,14 @@ Dilation The background (bright) dilates around the black regions of the letter. +To better grasp the idea and avoid possible confusion, in this another example we have inverted the original image such as the object in white is now the letter. We have performed two dilatations with a rectangular structuring element of size :math:`3x3`. + + .. image:: images/Morphology_1_Tutorial_Theory_Dilatation_2.png + :alt: Left image: original image inverted, right image: resulting dilatation + :align: center + +The dilatation makes the object in white bigger. + Erosion ^^^^^^^^ @@ -66,6 +74,13 @@ Erosion :alt: Erosion result - Theory example :align: center +In the same manner, the corresponding image resulting of the erosion operation on the inverted original image (two erosions with a rectangular structuring element of size :math:`3x3`. + + .. image:: images/Morphology_1_Tutorial_Theory_Erosion_2.png + :alt: Left image: original image inverted, right image: resulting erosion + :align: center + +The erosion makes the object in white smaller. Code ====== diff --git a/doc/tutorials/imgproc/erosion_dilatation/images/Morphology_1_Tutorial_Theory_Dilatation_2.png b/doc/tutorials/imgproc/erosion_dilatation/images/Morphology_1_Tutorial_Theory_Dilatation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bdca7c62339475cb30ee30ed690759dd1e54835c GIT binary patch literal 1558 zcmV+x2I={UP)WFU8GbZ8()Nlj2>E@cM*00nwUL_t(|+U?!Ta@#r( zMNw0Q|NmuWlu1%DC6NI7vG&;4(ZxC3Xg*9GKR-XuAEf2^tR3HR970aa!x8`>7ytwV z00aYoU;yN0SOOq7XLk~J-iad^ppZ;n{WrTLLogS@^^69h%VoD@2k11|Dj z+$pL*NsIi`3&8-GE|(pWA{Y}18uf8?zX|4s#U~|zV5UlfWB`HzKrjFZ1^@_VJ|4IO z2nGPb0H`o&6O2PH#%O{8g7eO_5_QTp!2rqS^2yJcV1k9|`U^7kH(Fm!Fef{J zH`O8f^b#3@X%aL*Fa!dW>LkGcFwz1JD>H{=W-1Oz-1A>`nh3&Vt-cC6?S#uj$_9J6I_I@AKCOWf5!ILU?NNi zB!a5)dsr-=5%Qk(*;-F9JEs?7L8PwE>SI~KblWMQlMz3Y=U{>d>Mjy8zZ+?EJ%}^h z@*@{ypQKDMLBk{$J;?MqJjuJ^;3XGC>gsB_l$>C)?-b->ddc+fpY_!#QjkE21$TF1 zw%FeJe52ceJ@Y^|wIIUuvf|%-x3eag&4H2&DvG6?V0KI|#Dd)ia`f+mH^C4K5>6DW zPrbhFZ5zQvxL`&u1uLmGr^Dx$Yf7vhj2*+{iL$0w?n9;f<97N-QOWpVnGkF z?C9=Wxg6wjs z)ZvjK%)bln8xc`SE*&<*5jD(z7eC^csexF?WuaiM21*d9LHhPTOpVzUob{4SRofT8x{&?m0X00N~bg3Hp8z3^XWnV?V`GKgk2la zj5qst?CK-i4gl=xtZ90|1oO!vUy+M2vAQcWUk=}Oqn+|3@2W33GabRCUFZ~P#WfLf zK{UCTrh`l{4ti9ZT6|^j!U-nIxipa>%R%40t6>B~E|}SyZ#v}EsMrKUF32n{eZ3%< zvjulc8dc;$E&(T)Z$lv$m|O^EN;s{6frW)k9n#kYg1KX%kK+&)QXTmE`aa{%1@{-xh$5L;57FuF2EkZ-RF{ly z2M`Pp@pLK5w~rDGP*^lr&%+V`AQ%7y0{{dAfM5U+3;_JcA3*B%y~mug)Bpeg07*qo IM6N<$g5j*1WB>pF literal 0 HcmV?d00001 diff --git a/doc/tutorials/imgproc/erosion_dilatation/images/Morphology_1_Tutorial_Theory_Erosion_2.png b/doc/tutorials/imgproc/erosion_dilatation/images/Morphology_1_Tutorial_Theory_Erosion_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e666eef3614ce093e5dd178bd4d07284fcf3d90 GIT binary patch literal 1533 zcmVWFU8GbZ8()Nlj2>E@cM*00m)5L_t(|+U?!jZrd;r zMbSv$|NpZ46rfGxM3#A(8Ls_U1gXI}-aM2P`}p|yczhr&k4NqC9miqFi8(C+0D=KP zFaSU>00;&E!2kfk0GLO!1lRfc%!y|-0D|cvlV?9eGJqpece&j8SwMpUkbX0a(yTQY zjRXa=8YRaB(_tv21Q5(nNstUQZGr)|kxK*#5e%TY5Db8P5KJdLa0d_!U?U?K02O3J zFpfBoXM!)FyJ3D+~M3-FysPxC72My@+=I6Kyk5yYB9K`^uAVwi}~v`6Q#O4Dwc7K2={I=|rhTp&+HoA@0%$Nbb_Um9pm8N_FaSU>g?9?npxQ@kp1TbV z0KsT40Kovzw4c)qE%s~GuC!_m2E#PyySur`N$xavVw^+G;%?vxsQ5^+z}~=T!;nL?s7i+KWF5z z8QPrRO)i+7iIrk0BbX6#>HRy&1rgp4D{{ES5$UIe9oc?}1yP#zsw}o$1~&8TODu@c zv?JuO87{e?PKKl9uT@>>C`T}0M$?X(!B%B3q=Fqc%jh|56&IaYP&LQd^4BU4gIGW& z8wcZRyJOB;mf;WyGPjjov)3{V$1o95D$jD}d#@%4X4N8-3r6Pl zPQG@|WLq($y92T_V1-z0T7d*J>f;R}ewiAG1rr71Dm${vrFRB*&vY9#sGdV`G{R`P z^b$daFS1W1m?(doWtdnk7jza(lrI<)5JV7*_VPbxbh$VlL2KEp!MysWzdKBKjzBIO zACVkikV!7HzBX9q-#8+@(q7(KXh$QEiv}~KwPgMLQN%<}k~EkZ*F?w#y<0_vmbA?g z$(tS^mnDLkwd)urR<{>&NhTO_!3gAqV1xx4((Zy8`8AaWhOBb2=}l@dcO^kCaQq^e zA+nhD&>qk`-}1OXFyw-0&7xOBCYQm2xw@#o4fOGNkPA{thFtE`ULD$%VU7A+Ucj-a z_z`K=A{!=FwwSL?TOKDgm=(bQ-p$gdD58A4s|K@h!3`6UG9`}-1T$*k4HHo$a~y{} zu0A4Nz359Wh$NY3nU%p{g6Sa{Lq(<|6DAAh%FbZG0KwQ90CeTF1ONyI0KotN!2lo_ j00aX71OtFz02JU4O40(pVDRtD00000NkvXXu0mjfQaX&Y literal 0 HcmV?d00001 diff --git a/doc/tutorials/imgproc/opening_closing_hats/images/Morphology_2_Tutorial_Theory_Closing_2.png b/doc/tutorials/imgproc/opening_closing_hats/images/Morphology_2_Tutorial_Theory_Closing_2.png new file mode 100644 index 0000000000000000000000000000000000000000..57b790583f42933202d593d58ebb49521bd529fe GIT binary patch literal 1383 zcmYjRX;4#F6nNC|z~7weDCJ@?*o@7caHbIv&tyDi+- z#@z-009!!>Z#w{3xuSdxXpNru&@<)eWt|ii&I8_Cmb$aC3jHBwMeNB2020Nrt$;d} z#fBggMDq#bHbiH)4Gno6s0>(^zGJs6^gu>NYNiZ*0zjxVHBpwDLeEK;eNGP-M8~GE zQV9Tndnn)q?~woYYHTdCf$hXkJo(SN8!FAxQ{QbH_Ijd%4vSxffw{uFj#eFCS(s*5akC6Lv$wPMvUt~D@lJEU;ze`FtFZ5Dj+qy+%&wfnX?sI8U7cMnLM_SS;SQE?YG z5;fim7Kqd^SN}CTCS>7-@2>_-RVgt|5Np6l{j}9&a_>kSg$#T!Ho80(znkcYIVs8u zHYn=EmBmwnLv$C&ffdBYVPt=LTQExq7XNl=ycI4eR|pPvvi}Pn7Nd^h#!Og!K-M#A zH8dFiQAZa(f~xp+262hjLEe$19uo%fa-GN*ftU8nS;i19ak9zSi)EsrJWN$$X_0@A z+&s&qm6No0R=N}c8vFhX6fOO>sKqopYxmm@{-WT$ z_SWJ8a|`L%B`|V<7Zj0){`a&I8dvDsZ}Ya zjnJ!at8$9iJ@y`5ks;iIX!g(dvXG(_6Xy>c7QiLnutgKqdvA)e6ru5gMp4+0e6>~yQZOgfUvQ&H%zOD!tV_^?JpByKcveD43NBXE zoE0;c-!(uiL{{N1mv7~VOezMhm$oh5oy*LS%}hDv^dGDe#h!UY-a1Waxq>&RL&Q(sR+3iFXCMAdchxQ}Nn3V3<#i+R_--}) z&^#K(hFQ;?C3I=9ftb$cHg=EAcJy^?Uo^v?%3tPrYs#Y@D{ekvAZ^Ed23a~NVt8N~ zqDttxOr`ZQLb;tTCqzRfV~EgS%M0`=w=r?fiy7Rx(j97;h^HV2D|I2O&9y?d+qt-? zHQ!!<`*6uRT=U55DJS>ZAnq`U8Ir}rAZwV)&5)<#wB(@n*`YAH%d~_xK%O||SAxBG zGnA>Uzqh!$x@7HDj7GU{gU#fy5yYS+G|HlO1I_E5h1I(bDHY#eg`Xd37qH`~b!Z#- z1vC^(?(owzPZ$~Co3Zg+X<;wo)l@_|i4Vh@I7;!pfX%s%=b9Yi=Z}k^%!+uz{L{)+ zAS1@tyzo1&RbK~c#Hl$Z&fnC&3z%DccE{U6p7qC4X4-WXD5%c;oPxy&cQ+;(5pL4n zSqd44c8YMV8_E9s^WTU}*#+W4f>gT~T6o3SN}Bvj4%(e*fP=FG%JdhH{xq=Vic#b# zZ^xQzb4v|JXqUab5Hb^O6rCyiia1bBNWiP%dZz0ji|^kzJvHh3=roBH$fH7v=X9kH z_4${H4tv&_7u;qa*dNt9Rjh1)1$a+a+0%82!&Kt`hYk*VObnoe8@IdhZm52Li*~(b N-U;~Ic-KS3(7%}ZOS}L8 literal 0 HcmV?d00001 diff --git a/doc/tutorials/imgproc/opening_closing_hats/images/Morphology_2_Tutorial_Theory_Opening_2.png b/doc/tutorials/imgproc/opening_closing_hats/images/Morphology_2_Tutorial_Theory_Opening_2.png new file mode 100644 index 0000000000000000000000000000000000000000..973e13a2d24c11fbbceda8d89676243bc17d3b3c GIT binary patch literal 1341 zcmYL}2~d+q6oCJPB!nXea)qippvsVM=45+N8s48@}bW5G}<{nP18XJ_Ag``#Yk?CyJKqxP{0 zmd=&{01(1BtOEdmq9Aq+9*0P5$i?%B!o`QPS-`rfUHR!oHR7>2#)&-+09Ll9jsof~ znbw$RhwTkDpSHBHcOps(%qkI=+mYy)?2rtBASpc?83I5^RuVruDUo{ONOmff9kw?r z5lk`%08C>TD=0c|;?>m1xe2BCY$q8JVqj_S7FiaC59y6%RBsIrgCkRz5P+f8le8ijK%3z!xUTdD^wUKz zlYp9xc2buz4^XPs85vT~ve%E;KlEc=+6lBdW3+htO1C=(vgSB;=z+D9pez8eh>_2-{Uk9P#E&vbHi4zlsdRoOYGAVwyddkw zxFCBGl7EqlP1G^<{r%k0=z8NG!^vo2p#V(09NE4iV}ILg>)5Qm!M)y7Mgzs=Fy5+X zBmHCI%cDGNLTyUI9ix9U!*@SdBH%E+zu(!wzSC<9q~UV>x46}JLW)$OWNw&jzXwB` zoo*SFs`Vn{oV{`kZ|I7F{F`j-IyjLe<@jdm))E2zF{$sx_98xG-q7BJ618neU|OdSqxS?~GhPZf zEkGY%5xFh>{#EDsrK_Iw_k_pTYmaAV2X!Mei?izynKl<&l}9rrZzgU1U&~8MRmj_$ zg))O2e8}7sS~)>~D;Lwz$^G#pTAW4wMci z{=tOdr0)(drLcw+ai-XIgK9orWb9K~Sk&g!spYWnc{vpnhr4?;%vHWs7xe_`Q>E%K zmx$4Em+W_pgTGF&b`8xB!`ey-b9#9<^j%s14bMSW2ZIwux;3!5cML&#l*7ot(jJf~ zwvO6QpS@XDaN1|%*GiIIRAZiN3j38In;lb7ix^%c=zm_$@&wZ>DFHrUZfJVd)sC7& zPvfEcuq)A0RWZ)$D^+o2goV0BnKG|XB!^XZ(H2hs{@zg!P@W3a3n))64D_Fs6ZBIY zu~p0GZ&#GOt^=yoVRubQc?P}e8%aoMznS5A^}AT#A%mUcZ?~5Oler6_=WAuP;_z0( z%`d{U=Doa&t23&S1Ez@%&bZyY!eN+&WAczxQ{;#=-0M|AWJj`ehQFBL!;cGL4E|-0 xUw^-@LY1-v`%<=)o(b;Ym=YhU5dW)9i{@S4J_^mbu3S?U3k%)HY7K^p{sBv$RJH&B literal 0 HcmV?d00001 diff --git a/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst b/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst index abe7b496fe..a09ea41b6d 100644 --- a/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst +++ b/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.rst @@ -31,7 +31,7 @@ In the previous tutorial we covered two basic Morphology operations: * Erosion * Dilation. -Based on these two we can effectuate more sophisticated transformations to our images. Here we discuss briefly 05 operations offered by OpenCV: +Based on these two we can effectuate more sophisticated transformations to our images. Here we discuss briefly 5 operations offered by OpenCV: Opening --------- @@ -50,6 +50,12 @@ Opening :alt: Opening :align: center +For the sake of clarity, we have performed the opening operation (:math:`7x7` rectangular structuring element) on the same original image but inverted such as the object in white is now the letter. + + .. image:: images/Morphology_2_Tutorial_Theory_Opening_2.png + :alt: Left image: original image inverted, right image: resulting opening + :align: center + Closing --------- @@ -65,6 +71,11 @@ Closing :alt: Closing example :align: center +On the inverted image, we have performed the closing operation (:math:`7x7` rectangular structuring element): + + .. image:: images/Morphology_2_Tutorial_Theory_Closing_2.png + :alt: Left image: original image inverted, right image: resulting closing + :align: center Morphological Gradient ------------------------ From 1c409abe9c04b0b03cbafedee07e33190fdb30ab Mon Sep 17 00:00:00 2001 From: catree Date: Mon, 17 Oct 2016 00:18:41 +0200 Subject: [PATCH 51/96] Add example image about distortion effect. --- ...camera_calibration_and_3d_reconstruction.rst | 9 ++++++++- .../calib3d/doc/pics/distortion_examples.png | Bin 0 -> 36227 bytes 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 modules/calib3d/doc/pics/distortion_examples.png diff --git a/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst b/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst index 29b458e6ca..9d3f1f2940 100644 --- a/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst +++ b/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst @@ -83,7 +83,14 @@ is extended as: :math:`k_6` are radial distortion coefficients. :math:`p_1` and :math:`p_2` are tangential distortion coefficients. -Higher-order coefficients are not considered in OpenCV. In the functions below the coefficients are passed or returned as +Higher-order coefficients are not considered in OpenCV. + +The next figure shows two common types of radial distortion: barrel distortion (typically :math:`k_1 > 0` and pincushion distortion (typically :math:`k_1 < 0`). + +.. image:: pics/distortion_examples.png + :align: center + +In the functions below the coefficients are passed or returned as .. math:: diff --git a/modules/calib3d/doc/pics/distortion_examples.png b/modules/calib3d/doc/pics/distortion_examples.png new file mode 100644 index 0000000000000000000000000000000000000000..4650d44c7096432c52f2b687c2b7018ea1cc00e1 GIT binary patch literal 36227 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 literal 0 HcmV?d00001 From 6f00e53159f9f7295dbc26ee9c36974e42e7f268 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 20 Oct 2016 14:35:34 +0300 Subject: [PATCH 52/96] ts: update run.py Add information about python bindings --- modules/ts/misc/run_suite.py | 41 ++++++++++++++++++++++++++++++------ modules/ts/misc/run_utils.py | 24 +++++++++++++++++---- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/modules/ts/misc/run_suite.py b/modules/ts/misc/run_suite.py index 280c21caa6..bd80874475 100644 --- a/modules/ts/misc/run_suite.py +++ b/modules/ts/misc/run_suite.py @@ -85,8 +85,8 @@ class TestSuite(object): return set(res) def isTest(self, fullpath): - if fullpath == "java": - return True + if fullpath in ['java', 'python2', 'python3']: + return self.options.mode == 'test' if not os.path.isfile(fullpath): return False if self.cache.getOS() == "nt" and not fullpath.endswith(".exe"): @@ -102,6 +102,14 @@ class TestSuite(object): return res + cmd return cmd + def tryCommand(self, cmd): + try: + if 0 == execute(cmd, cwd = workingDir): + return True + except: + pass + return False + def runTest(self, path, logfile, workingDir, args = []): args = args[:] exe = os.path.abspath(path) @@ -109,6 +117,22 @@ class TestSuite(object): cmd = [self.cache.ant_executable, "-Dopencv.build.type=%s" % self.cache.build_type, "buildAndTest"] ret = execute(cmd, cwd = self.cache.java_test_binary_dir + "/.build") return None, ret + elif path in ['python2', 'python3']: + executable = os.getenv('OPENCV_PYTHON_BINARY', None) + if executable is None: + executable = path + if not self.tryCommand([executable, '--version']): + executable = 'python' + cmd = [executable, self.cache.opencv_home + '/modules/python/test/test.py', '--repo', self.cache.opencv_home, '-v'] + args + module_suffix = '' if not 'Visual Studio' in self.cache.cmake_generator else '/' + self.cache.build_type + env = {} + env['PYTHONPATH'] = self.cache.opencv_build + '/lib' + module_suffix + os.pathsep + os.getenv('PYTHONPATH', '') + if self.cache.getOS() == 'nt': + env['PATH'] = self.cache.opencv_build + '/bin' + module_suffix + os.pathsep + os.getenv('PATH', '') + else: + env['LD_LIBRARY_PATH'] = self.cache.opencv_build + '/bin' + os.pathsep + os.getenv('LD_LIBRARY_PATH', '') + ret = execute(cmd, cwd = workingDir, env = env) + return None, ret else: if isColorEnabled(args): args.append("--gtest_color=yes") @@ -140,12 +164,15 @@ class TestSuite(object): more_args = [] exe = self.getTest(test) - userlog = [a for a in args if a.startswith("--gtest_output=")] - if len(userlog) == 0: - logname = self.getLogName(exe, date) - more_args.append("--gtest_output=xml:" + logname) + if exe in ["java", "python2", "python3"]: + logname = None else: - logname = userlog[0][userlog[0].find(":")+1:] + userlog = [a for a in args if a.startswith("--gtest_output=")] + if len(userlog) == 0: + logname = self.getLogName(exe, date) + more_args.append("--gtest_output=xml:" + logname) + else: + logname = userlog[0][userlog[0].find(":")+1:] log.debug("Running the test: %s (%s) ==> %s in %s", exe, args + more_args, logname, workingDir) if self.options.dry_run: diff --git a/modules/ts/misc/run_utils.py b/modules/ts/misc/run_utils.py index 5841631a7c..8740aa7855 100644 --- a/modules/ts/misc/run_utils.py +++ b/modules/ts/misc/run_utils.py @@ -22,13 +22,17 @@ class Err(Exception): def __init__(self, msg, *args): self.msg = msg % args -def execute(cmd, silent = False, cwd = "."): +def execute(cmd, silent = False, cwd = ".", env = None): try: log.debug("Run: %s", cmd) + if env: + for k in env: + log.debug(" Environ: %s=%s", k, env[k]) + env = os.environ.update(env) if silent: - return check_output(cmd, stderr = STDOUT, cwd = cwd).decode("latin-1") + return check_output(cmd, stderr = STDOUT, cwd = cwd, env = env).decode("latin-1") else: - return check_call(cmd, cwd = cwd) + return check_call(cmd, cwd = cwd, env = env) except CalledProcessError as e: if silent: log.debug("Process returned: %d", e.returncode) @@ -171,6 +175,8 @@ parse_patterns = ( {'name': "cuda_library", 'default': None, 'pattern': re.compile(r"^CUDA_CUDA_LIBRARY:FILEPATH=(.+)$")}, {'name': "cuda_version", 'default': None, 'pattern': re.compile(r"^CUDA_VERSION:STRING=(.+)$")}, {'name': "core_dependencies", 'default': None, 'pattern': re.compile(r"^opencv_core_LIB_DEPENDS:STATIC=(.+)$")}, + {'name': "python2", 'default': None, 'pattern': re.compile(r"^BUILD_opencv_python2:BOOL=(.*)$")}, + {'name': "python3", 'default': None, 'pattern': re.compile(r"^BUILD_opencv_python3:BOOL=(.*)$")}, ) class CMakeCache: @@ -247,11 +253,15 @@ class CMakeCache: files = glob.glob(os.path.join(d, mask)) if not self.getOS() == "android" and self.withJava(): files.append("java") + if self.withPython2(): + files.append("python2") + if self.withPython3(): + files.append("python3") return [f for f in files if isGood(f)] return [] def isMainModule(self, name): - return name in self.main_modules + return name in self.main_modules + ['python2', 'python3'] def withCuda(self): return self.cuda_version and self.with_cuda == "ON" and self.cuda_library and not self.cuda_library.endswith("-NOTFOUND") @@ -259,6 +269,12 @@ class CMakeCache: def withJava(self): return self.ant_executable and self.java_test_binary_dir + def withPython2(self): + return self.python2 == 'ON' + + def withPython3(self): + return self.python3 == 'ON' + def getGitVersion(self): if self.cmake_home_vcver: if self.cmake_home_vcver == self.opencv_home_vcver: From 8577f718105cb28148e564df4341cb34b4c7ebd1 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 20 Oct 2016 16:26:19 +0300 Subject: [PATCH 53/96] ts: 2.4 changes --- modules/ts/misc/run_suite.py | 6 +++--- modules/ts/misc/run_utils.py | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/ts/misc/run_suite.py b/modules/ts/misc/run_suite.py index bd80874475..30805facdc 100644 --- a/modules/ts/misc/run_suite.py +++ b/modules/ts/misc/run_suite.py @@ -85,7 +85,7 @@ class TestSuite(object): return set(res) def isTest(self, fullpath): - if fullpath in ['java', 'python2', 'python3']: + if fullpath in ['java', 'python', 'python2', 'python3']: return self.options.mode == 'test' if not os.path.isfile(fullpath): return False @@ -117,7 +117,7 @@ class TestSuite(object): cmd = [self.cache.ant_executable, "-Dopencv.build.type=%s" % self.cache.build_type, "buildAndTest"] ret = execute(cmd, cwd = self.cache.java_test_binary_dir + "/.build") return None, ret - elif path in ['python2', 'python3']: + elif path in ['python', 'python2', 'python3']: executable = os.getenv('OPENCV_PYTHON_BINARY', None) if executable is None: executable = path @@ -164,7 +164,7 @@ class TestSuite(object): more_args = [] exe = self.getTest(test) - if exe in ["java", "python2", "python3"]: + if exe in ["java", "python", "python2", "python3"]: logname = None else: userlog = [a for a in args if a.startswith("--gtest_output=")] diff --git a/modules/ts/misc/run_utils.py b/modules/ts/misc/run_utils.py index 8740aa7855..db1e7f5b0d 100644 --- a/modules/ts/misc/run_utils.py +++ b/modules/ts/misc/run_utils.py @@ -175,6 +175,7 @@ parse_patterns = ( {'name': "cuda_library", 'default': None, 'pattern': re.compile(r"^CUDA_CUDA_LIBRARY:FILEPATH=(.+)$")}, {'name': "cuda_version", 'default': None, 'pattern': re.compile(r"^CUDA_VERSION:STRING=(.+)$")}, {'name': "core_dependencies", 'default': None, 'pattern': re.compile(r"^opencv_core_LIB_DEPENDS:STATIC=(.+)$")}, + {'name': "python", 'default': None, 'pattern': re.compile(r"^BUILD_opencv_python:BOOL=(.*)$")}, {'name': "python2", 'default': None, 'pattern': re.compile(r"^BUILD_opencv_python2:BOOL=(.*)$")}, {'name': "python3", 'default': None, 'pattern': re.compile(r"^BUILD_opencv_python3:BOOL=(.*)$")}, ) @@ -253,6 +254,8 @@ class CMakeCache: files = glob.glob(os.path.join(d, mask)) if not self.getOS() == "android" and self.withJava(): files.append("java") + if self.withPython(): + files.append("python") if self.withPython2(): files.append("python2") if self.withPython3(): @@ -261,7 +264,7 @@ class CMakeCache: return [] def isMainModule(self, name): - return name in self.main_modules + ['python2', 'python3'] + return name in self.main_modules + ['python', 'python2', 'python3'] def withCuda(self): return self.cuda_version and self.with_cuda == "ON" and self.cuda_library and not self.cuda_library.endswith("-NOTFOUND") @@ -269,6 +272,9 @@ class CMakeCache: def withJava(self): return self.ant_executable and self.java_test_binary_dir + def withPython(self): + return self.python == 'ON' + def withPython2(self): return self.python2 == 'ON' From c585d3890e50d8b8fceabc5d486704501fa79c83 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 27 Oct 2016 13:22:13 +0300 Subject: [PATCH 54/96] core: update CV_XADD Allow to use custom implementations of CV_XADD (passed via -D of CXXFLAGS) --- modules/core/include/opencv2/core/operations.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 0177d8db7a..1b7484aded 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -52,8 +52,8 @@ #ifdef __cplusplus /////// exchange-add operation for atomic operations on reference counters /////// -#if defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32) // atomic increment on the linux version of the Intel(tm) compiler - #define CV_XADD(addr,delta) _InterlockedExchangeAdd(const_cast(reinterpret_cast(addr)), delta) +#ifdef CV_XADD + // allow to use user-defined macro #elif defined __GNUC__ #if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ && !defined __EMSCRIPTEN__ && !defined(__CUDACC__) From 64a2d1904b80faf71a322f934be885bee8ecac4a Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 11 Nov 2016 16:27:22 +0300 Subject: [PATCH 55/96] ffmpeg: backport 7213 Commit: 6d54abbd0fc64b23ea0b97f3c906cba219b52dc8 --- modules/highgui/src/cap_ffmpeg_impl.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/highgui/src/cap_ffmpeg_impl.hpp b/modules/highgui/src/cap_ffmpeg_impl.hpp index da05bde324..a934faaa91 100644 --- a/modules/highgui/src/cap_ffmpeg_impl.hpp +++ b/modules/highgui/src/cap_ffmpeg_impl.hpp @@ -1482,6 +1482,10 @@ static AVStream *icv_add_video_stream_FFMPEG(AVFormatContext *oc, } #endif +#if LIBAVCODEC_BUILD >= CALC_FFMPEG_VERSION(52, 42, 0) + st->avg_frame_rate = (AVRational){frame_rate, frame_rate_base}; +#endif + return st; } From 4d84e6efee0d4cc0e259647df57ae5414c342816 Mon Sep 17 00:00:00 2001 From: Declan Moran Date: Mon, 14 Nov 2016 17:21:53 +0100 Subject: [PATCH 56/96] fix compiler error when building with gnu-5 toolchain (eg as currently shipped with crystax.org android ndk, and presumably soon with android studio). "ts_perf.cpp ....error: 'errno' was not declared in this scope int err=errno;" --- modules/ts/src/ts_perf.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index 3bcb5c11a9..360c8b5a13 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -41,6 +41,7 @@ static bool log_power_checkpoints; #include #include +#include static void setCurrentThreadAffinityMask(int mask) { pid_t pid=gettid(); From 21167b1bf1b8471101732073d9b4803b80fe0ce4 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Wed, 31 Aug 2016 23:12:52 +0300 Subject: [PATCH 57/96] Fixed several GCC 5.x warnings --- 3rdparty/libtiff/CMakeLists.txt | 4 ++-- 3rdparty/openexr/CMakeLists.txt | 4 ++-- cmake/OpenCVCompilerOptions.cmake | 1 + modules/calib3d/src/calibinit.cpp | 4 +++- .../calib3d/test/test_cameracalibration.cpp | 2 ++ .../include/opencv2/core/cuda_devptrs.hpp | 23 ++++++++----------- modules/core/include/opencv2/core/gpumat.hpp | 7 +++--- .../core/include/opencv2/core/internal.hpp | 2 +- modules/core/include/opencv2/core/types_c.h | 9 ++++++++ modules/core/test/test_ds.cpp | 2 +- modules/flann/include/opencv2/flann/any.h | 2 +- modules/flann/include/opencv2/flann/flann.hpp | 23 +++++++++++-------- modules/highgui/src/cap_v4l.cpp | 11 ++++----- modules/legacy/test/test_optflow.cpp | 11 +++++---- modules/legacy/test/test_stereomatching.cpp | 2 ++ modules/ocl/src/mssegmentation.cpp | 11 ++------- modules/ocl/test/utility.hpp | 2 +- modules/stitching/src/matchers.cpp | 1 + modules/ts/include/opencv2/ts/gpu_test.hpp | 2 +- modules/ts/include/opencv2/ts/ts_gtest.h | 4 ++-- modules/ts/src/ts_func.cpp | 4 ++-- 21 files changed, 70 insertions(+), 61 deletions(-) diff --git a/3rdparty/libtiff/CMakeLists.txt b/3rdparty/libtiff/CMakeLists.txt index 7d7febac7a..a241dd6f91 100644 --- a/3rdparty/libtiff/CMakeLists.txt +++ b/3rdparty/libtiff/CMakeLists.txt @@ -86,7 +86,7 @@ else() endif() ocv_warnings_disable(CMAKE_C_FLAGS -Wno-unused-but-set-variable -Wmissing-prototypes -Wmissing-declarations -Wundef -Wunused -Wsign-compare - -Wcast-align -Wshadow -Wno-maybe-uninitialized -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast) + -Wcast-align -Wshadow -Wno-maybe-uninitialized -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -Wmisleading-indentation) ocv_warnings_disable(CMAKE_C_FLAGS -Wunused-parameter) # clang ocv_warnings_disable(CMAKE_CXX_FLAGS -Wmissing-declarations -Wunused-parameter) ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4018 /wd4100 /wd4127 /wd4311 /wd4701 /wd4706) # vs2005 @@ -95,7 +95,7 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4267 /wd4305 /wd4306) # vs2008 Win64 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4703) # vs2012 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4456 /wd4457 /wd4312) # vs2015 -ocv_warnings_disable(CMAKE_C_FLAGS /wd4267 /wd4244 /wd4018) +ocv_warnings_disable(CMAKE_C_FLAGS /wd4267 /wd4244 /wd4018 /wd4311 /wd4312) if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt index 85f750d1d7..dddf3738c4 100644 --- a/3rdparty/openexr/CMakeLists.txt +++ b/3rdparty/openexr/CMakeLists.txt @@ -37,8 +37,8 @@ endif() source_group("Include" FILES ${lib_hdrs} ) source_group("Src" FILES ${lib_srcs}) -ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Wunused -Wsign-compare -Wundef -Wmissing-declarations -Wuninitialized -Wswitch -Wparentheses -Warray-bounds -Wextra) -ocv_warnings_disable(CMAKE_CXX_FLAGS -Wdeprecated-declarations) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Wunused -Wsign-compare -Wundef -Wmissing-declarations -Wuninitialized -Wswitch -Wparentheses -Warray-bounds -Wextra + -Wdeprecated-declarations -Wmisleading-indentation) ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4018 /wd4099 /wd4100 /wd4101 /wd4127 /wd4189 /wd4245 /wd4305 /wd4389 /wd4512 /wd4701 /wd4702 /wd4706 /wd4800) # vs2005 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4334) # vs2005 Win64 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244) # vs2008 diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 3f7cbf2352..499061e28c 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -95,6 +95,7 @@ if(CMAKE_COMPILER_IS_GNUCXX) add_extra_compiler_option(-Wno-narrowing) add_extra_compiler_option(-Wno-delete-non-virtual-dtor) add_extra_compiler_option(-Wno-unnamed-type-template-args) + add_extra_compiler_option(-Wno-comment) add_extra_compiler_option(-Wno-array-bounds) add_extra_compiler_option(-Wno-aggressive-loop-optimizations) endif() diff --git a/modules/calib3d/src/calibinit.cpp b/modules/calib3d/src/calibinit.cpp index 000ac5435d..a189213403 100644 --- a/modules/calib3d/src/calibinit.cpp +++ b/modules/calib3d/src/calibinit.cpp @@ -1036,13 +1036,15 @@ icvRemoveQuadFromGroup(CvCBQuad **quads, int count, CvCBQuad *q0) q->neighbors[j] = 0; q->count--; for(int k = 0; k < 4; k++ ) + { if( q0->neighbors[k] == q ) { q0->neighbors[k] = 0; q0->count--; break; } - break; + } + break; } } } diff --git a/modules/calib3d/test/test_cameracalibration.cpp b/modules/calib3d/test/test_cameracalibration.cpp index 0cc5701bf1..d358e8fd94 100644 --- a/modules/calib3d/test/test_cameracalibration.cpp +++ b/modules/calib3d/test/test_cameracalibration.cpp @@ -1339,6 +1339,7 @@ bool CV_StereoCalibrationTest::checkPandROI( int test_case_idx, const Mat& M, co undistortPoints(Mat(pts), upts, M, D, R, P ); for( k = 0; k < N*N; k++ ) + { if( upts[k].x < -imgsize.width*eps || upts[k].x > imgsize.width*(1+eps) || upts[k].y < -imgsize.height*eps || upts[k].y > imgsize.height*(1+eps) ) { @@ -1346,6 +1347,7 @@ bool CV_StereoCalibrationTest::checkPandROI( int test_case_idx, const Mat& M, co test_case_idx, pts[k].x, pts[k].y, upts[k].x, upts[k].y); return false; } + } // step 2. check that all the points inside ROI belong to the original source image Mat temp(imgsize, CV_8U), utemp, map1, map2; diff --git a/modules/core/include/opencv2/core/cuda_devptrs.hpp b/modules/core/include/opencv2/core/cuda_devptrs.hpp index 15340455e2..d54a32876f 100644 --- a/modules/core/include/opencv2/core/cuda_devptrs.hpp +++ b/modules/core/include/opencv2/core/cuda_devptrs.hpp @@ -122,27 +122,23 @@ namespace cv typedef PtrStep PtrStepf; typedef PtrStep PtrStepi; - #if defined __GNUC__ - #define __CV_GPU_DEPR_BEFORE__ - #define __CV_GPU_DEPR_AFTER__ __attribute__ ((deprecated)) + #define CV_GPU_DEPRECATED __attribute__ ((deprecated)) #elif defined(__MSVC__) //|| defined(__CUDACC__) #pragma deprecated(DevMem2D_) - #define __CV_GPU_DEPR_BEFORE__ __declspec(deprecated) - #define __CV_GPU_DEPR_AFTER__ + #define CV_GPU_DEPRECATED __declspec(deprecated) #else - #define __CV_GPU_DEPR_BEFORE__ - #define __CV_GPU_DEPR_AFTER__ + #define CV_GPU_DEPRECATED #endif - template struct __CV_GPU_DEPR_BEFORE__ DevMem2D_ : public PtrStepSz + template struct DevMem2D_ : public PtrStepSz { - DevMem2D_() {} - DevMem2D_(int rows_, int cols_, T* data_, size_t step_) : PtrStepSz(rows_, cols_, data_, step_) {} + CV_GPU_DEPRECATED DevMem2D_() {} + CV_GPU_DEPRECATED DevMem2D_(int rows_, int cols_, T* data_, size_t step_) : PtrStepSz(rows_, cols_, data_, step_) {} template - explicit __CV_GPU_DEPR_BEFORE__ DevMem2D_(const DevMem2D_& d) : PtrStepSz(d.rows, d.cols, (T*)d.data, d.step) {} - } __CV_GPU_DEPR_AFTER__ ; + explicit CV_GPU_DEPRECATED DevMem2D_(const DevMem2D_& d) : PtrStepSz(d.rows, d.cols, (T*)d.data, d.step) {} + }; typedef DevMem2D_ DevMem2Db; typedef DevMem2Db DevMem2D; @@ -174,8 +170,7 @@ namespace cv typedef PtrElemStep_ PtrElemStepf; typedef PtrElemStep_ PtrElemStepi; -//#undef __CV_GPU_DEPR_BEFORE__ -//#undef __CV_GPU_DEPR_AFTER__ +//#undef CV_GPU_DEPRECATED namespace device { diff --git a/modules/core/include/opencv2/core/gpumat.hpp b/modules/core/include/opencv2/core/gpumat.hpp index 68647d9bf1..6679ab2a29 100644 --- a/modules/core/include/opencv2/core/gpumat.hpp +++ b/modules/core/include/opencv2/core/gpumat.hpp @@ -277,10 +277,9 @@ namespace cv { namespace gpu template operator PtrStep<_Tp>() const; // Deprecated function - __CV_GPU_DEPR_BEFORE__ template operator DevMem2D_<_Tp>() const __CV_GPU_DEPR_AFTER__; - __CV_GPU_DEPR_BEFORE__ template operator PtrStep_<_Tp>() const __CV_GPU_DEPR_AFTER__; - #undef __CV_GPU_DEPR_BEFORE__ - #undef __CV_GPU_DEPR_AFTER__ + template CV_GPU_DEPRECATED operator DevMem2D_<_Tp>() const; + template CV_GPU_DEPRECATED operator PtrStep_<_Tp>() const; + #undef CV_GPU_DEPRECATED /*! includes several bit-fields: - the magic signature diff --git a/modules/core/include/opencv2/core/internal.hpp b/modules/core/include/opencv2/core/internal.hpp index c2c89613ac..4933654735 100644 --- a/modules/core/include/opencv2/core/internal.hpp +++ b/modules/core/include/opencv2/core/internal.hpp @@ -292,7 +292,7 @@ namespace cv return classname##_info_var; \ } \ \ - static ::cv::AlgorithmInfo& classname##_info_auto = classname##_info(); \ + CV_ATTR_USED static ::cv::AlgorithmInfo& classname##_info_auto = classname##_info(); \ \ ::cv::AlgorithmInfo* classname::info() const \ { \ diff --git a/modules/core/include/opencv2/core/types_c.h b/modules/core/include/opencv2/core/types_c.h index 771715d5df..0e2de71d37 100644 --- a/modules/core/include/opencv2/core/types_c.h +++ b/modules/core/include/opencv2/core/types_c.h @@ -43,6 +43,15 @@ #ifndef __OPENCV_CORE_TYPES_H__ #define __OPENCV_CORE_TYPES_H__ +#if defined(__GNUC__) && !defined(COMPILER_ICC) +# define CV_ATTR_UNUSED __attribute__((unused)) +# define CV_ATTR_USED __attribute__((used)) +#else +# define CV_ATTR_UNUSED +# define CV_ATTR_USED +#endif + + #if !defined _CRT_SECURE_NO_DEPRECATE && defined _MSC_VER # if _MSC_VER > 1300 # define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio 2005 warnings */ diff --git a/modules/core/test/test_ds.cpp b/modules/core/test/test_ds.cpp index ded52583a2..bbe75ad871 100644 --- a/modules/core/test/test_ds.cpp +++ b/modules/core/test/test_ds.cpp @@ -56,7 +56,7 @@ static void cvTsSimpleSeqShiftAndCopy( CvTsSimpleSeq* seq, int from_idx, int to_ (seq->count - from_idx)*elem_size ); } seq->count += to_idx - from_idx; - if( elem && to_idx > from_idx ) + if( elem ) memcpy( seq->array + from_idx*elem_size, elem, (to_idx - from_idx)*elem_size ); } diff --git a/modules/flann/include/opencv2/flann/any.h b/modules/flann/include/opencv2/flann/any.h index 7e3fd797af..cf7707a2fa 100644 --- a/modules/flann/include/opencv2/flann/any.h +++ b/modules/flann/include/opencv2/flann/any.h @@ -80,7 +80,7 @@ struct big_any_policy : typed_base_any_policy { virtual void static_delete(void** x) { - if (* x) delete (* reinterpret_cast(x)); *x = NULL; + if (* x) { delete (* reinterpret_cast(x)); *x = NULL; } } virtual void copy_from_value(void const* src, void** dest) { diff --git a/modules/flann/include/opencv2/flann/flann.hpp b/modules/flann/include/opencv2/flann/flann.hpp index d053488ed4..3b5634c382 100644 --- a/modules/flann/include/opencv2/flann/flann.hpp +++ b/modules/flann/include/opencv2/flann/flann.hpp @@ -225,43 +225,49 @@ int GenericIndex::radiusSearch(const Mat& query, Mat& indices, Mat& di * @deprecated Use GenericIndex class instead */ template -class -#ifndef _MSC_VER - FLANN_DEPRECATED -#endif - Index_ { +class Index_ { public: typedef typename L2::ElementType ElementType; typedef typename L2::ResultType DistanceType; + FLANN_DEPRECATED Index_(const Mat& features, const ::cvflann::IndexParams& params); + FLANN_DEPRECATED ~Index_(); + FLANN_DEPRECATED void knnSearch(const vector& query, vector& indices, vector& dists, int knn, const ::cvflann::SearchParams& params); + FLANN_DEPRECATED void knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const ::cvflann::SearchParams& params); + FLANN_DEPRECATED int radiusSearch(const vector& query, vector& indices, vector& dists, DistanceType radius, const ::cvflann::SearchParams& params); + FLANN_DEPRECATED int radiusSearch(const Mat& query, Mat& indices, Mat& dists, DistanceType radius, const ::cvflann::SearchParams& params); + FLANN_DEPRECATED void save(std::string filename) { if (nnIndex_L1) nnIndex_L1->save(filename); if (nnIndex_L2) nnIndex_L2->save(filename); } + FLANN_DEPRECATED int veclen() const { if (nnIndex_L1) return nnIndex_L1->veclen(); if (nnIndex_L2) return nnIndex_L2->veclen(); } + FLANN_DEPRECATED int size() const { if (nnIndex_L1) return nnIndex_L1->size(); if (nnIndex_L2) return nnIndex_L2->size(); } + FLANN_DEPRECATED ::cvflann::IndexParams getParameters() { if (nnIndex_L1) return nnIndex_L1->getParameters(); @@ -269,7 +275,8 @@ public: } - FLANN_DEPRECATED const ::cvflann::IndexParams* getIndexParameters() + FLANN_DEPRECATED + const ::cvflann::IndexParams* getIndexParameters() { if (nnIndex_L1) return nnIndex_L1->getIndexParameters(); if (nnIndex_L2) return nnIndex_L2->getIndexParameters(); @@ -281,10 +288,6 @@ private: ::cvflann::Index< L1 >* nnIndex_L1; }; -#ifdef _MSC_VER -template -class FLANN_DEPRECATED Index_; -#endif template Index_::Index_(const Mat& dataset, const ::cvflann::IndexParams& params) diff --git a/modules/highgui/src/cap_v4l.cpp b/modules/highgui/src/cap_v4l.cpp index 4093219ca6..ed5c09c442 100644 --- a/modules/highgui/src/cap_v4l.cpp +++ b/modules/highgui/src/cap_v4l.cpp @@ -380,12 +380,11 @@ static void icvInitCapture_V4L() { deviceHandle = open(deviceName, O_RDONLY); if (deviceHandle != -1) { /* This device does indeed exist - add it to the total so far */ - // add indexList - indexList|=(1 << CameraNumber); - numCameras++; - } - if (deviceHandle != -1) - close(deviceHandle); + // add indexList + indexList|=(1 << CameraNumber); + numCameras++; + close(deviceHandle); + } /* Set up to test the next /dev/video source in line */ CameraNumber++; } /* End while */ diff --git a/modules/legacy/test/test_optflow.cpp b/modules/legacy/test/test_optflow.cpp index 3d74ff6b56..4eb0a13540 100644 --- a/modules/legacy/test/test_optflow.cpp +++ b/modules/legacy/test/test_optflow.cpp @@ -166,6 +166,7 @@ double showFlowAndCalcError(const string& name, const Mat& gray, const Mat& flow bool all = true; Mat inner = flow(where); for(int y = 0; y < inner.rows; ++y) + { for(int x = 0; x < inner.cols; ++x) { const Point2f f = inner.at(y, x); @@ -178,12 +179,14 @@ double showFlowAndCalcError(const string& name, const Mat& gray, const Mat& flow double a = atan2(f.y, f.x); error += fabs(angle - a); } - double res = all ? numeric_limits::max() : error / (inner.cols * inner.rows); + } - if (writeError) - cout << "Error " + name << " = " << res << endl; + double res = all ? numeric_limits::max() : error / (inner.cols * inner.rows); - return res; + if (writeError) + cout << "Error " + name << " = " << res << endl; + + return res; } diff --git a/modules/legacy/test/test_stereomatching.cpp b/modules/legacy/test/test_stereomatching.cpp index a6524bb712..7513bbb1e5 100644 --- a/modules/legacy/test/test_stereomatching.cpp +++ b/modules/legacy/test/test_stereomatching.cpp @@ -461,7 +461,9 @@ void CV_StereoMatchingTest::run(int) int dispScaleFactor = datasetsParams[datasetName].dispScaleFactor; Mat tmp; trueLeftDisp.convertTo( tmp, CV_32FC1, 1.f/dispScaleFactor ); trueLeftDisp = tmp; tmp.release(); if( !trueRightDisp.empty() ) + { trueRightDisp.convertTo( tmp, CV_32FC1, 1.f/dispScaleFactor ); trueRightDisp = tmp; tmp.release(); + } Mat leftDisp, rightDisp; int ignBorder = max(runStereoMatchingAlgorithm(leftImg, rightImg, leftDisp, rightDisp, ci), EVAL_IGNORE_BORDER); diff --git a/modules/ocl/src/mssegmentation.cpp b/modules/ocl/src/mssegmentation.cpp index 5edca3e2f3..71c793ca28 100644 --- a/modules/ocl/src/mssegmentation.cpp +++ b/modules/ocl/src/mssegmentation.cpp @@ -71,8 +71,8 @@ namespace vector rank; vector size; private: - DjSets(const DjSets &) {} - DjSets operator =(const DjSets &); + DjSets(const DjSets &); // = delete + DjSets& operator =(const DjSets &); // = delete }; template @@ -139,13 +139,6 @@ namespace // Implementation // - DjSets DjSets::operator = (const DjSets &/*obj*/) - { - //cout << "Invalid DjSets constructor\n"; - CV_Error(-1, "Invalid DjSets constructor\n"); - return *this; - } - DjSets::DjSets(int n) : parent(n), rank(n, 0), size(n, 1) { for (int i = 0; i < n; ++i) diff --git a/modules/ocl/test/utility.hpp b/modules/ocl/test/utility.hpp index 6591456ee0..8766920023 100644 --- a/modules/ocl/test/utility.hpp +++ b/modules/ocl/test/utility.hpp @@ -296,7 +296,7 @@ CV_FLAGS(DftFlags, DFT_INVERSE, DFT_SCALE, DFT_ROWS, DFT_COMPLEX_OUTPUT, DFT_REA }; \ \ int GTEST_TEST_CLASS_NAME_(test_case_name, \ - test_name)::gtest_registering_dummy_ = \ + test_name)::gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() \ diff --git a/modules/stitching/src/matchers.cpp b/modules/stitching/src/matchers.cpp index e0e4779403..29ce8e4836 100644 --- a/modules/stitching/src/matchers.cpp +++ b/modules/stitching/src/matchers.cpp @@ -50,6 +50,7 @@ using namespace cv::gpu; #ifdef HAVE_OPENCV_NONFREE #include "opencv2/nonfree/nonfree.hpp" +CV_ATTR_USED static bool makeUseOfNonfree = initModule_nonfree(); #endif diff --git a/modules/ts/include/opencv2/ts/gpu_test.hpp b/modules/ts/include/opencv2/ts/gpu_test.hpp index 01737bc951..705722a202 100644 --- a/modules/ts/include/opencv2/ts/gpu_test.hpp +++ b/modules/ts/include/opencv2/ts/gpu_test.hpp @@ -190,7 +190,7 @@ namespace cvtest GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ }; \ int GTEST_TEST_CLASS_NAME_(test_case_name, \ - test_name)::gtest_registering_dummy_ = \ + test_name)::gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() \ { \ diff --git a/modules/ts/include/opencv2/ts/ts_gtest.h b/modules/ts/include/opencv2/ts/ts_gtest.h index 75453d204e..0690698d2a 100644 --- a/modules/ts/include/opencv2/ts/ts_gtest.h +++ b/modules/ts/include/opencv2/ts/ts_gtest.h @@ -17026,14 +17026,14 @@ internal::CartesianProductHolder10 \ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ - int gtest_##prefix##test_case_name##_dummy_ = \ + int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ diff --git a/modules/ts/src/ts_func.cpp b/modules/ts/src/ts_func.cpp index a4fa5c388a..d11fdc3966 100644 --- a/modules/ts/src/ts_func.cpp +++ b/modules/ts/src/ts_func.cpp @@ -1757,7 +1757,7 @@ cmpUlpsFlt_(const int* src1, const int* src2, size_t total, int imaxdiff, size_t for( i = 0; i < total; i++ ) { int a = src1[i], b = src2[i]; - if( a < 0 ) a ^= C; if( b < 0 ) b ^= C; + if( a < 0 ) { a ^= C; } if( b < 0 ) { b ^= C; } int diff = std::abs(a - b); if( realmaxdiff < diff ) { @@ -1779,7 +1779,7 @@ cmpUlpsFlt_(const int64* src1, const int64* src2, size_t total, int imaxdiff, si for( i = 0; i < total; i++ ) { int64 a = src1[i], b = src2[i]; - if( a < 0 ) a ^= C; if( b < 0 ) b ^= C; + if( a < 0 ) { a ^= C; } if( b < 0 ) { b ^= C; } double diff = fabs((double)a - (double)b); if( realmaxdiff < diff ) { From 497d0fd2e7fc4f1ad11bf2ab5245073a52059c01 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 10 Nov 2016 20:04:08 +0300 Subject: [PATCH 58/96] build: OSSpinLock deprecation warning --- modules/core/src/system.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index f5a1af2ac4..e552723ed8 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -908,6 +908,11 @@ int _interlockedExchangeAdd(int* addr, int delta) #elif defined __APPLE__ +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + #include struct Mutex::Impl @@ -923,6 +928,10 @@ struct Mutex::Impl int refcount; }; +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + #elif defined __linux__ && !defined ANDROID && !defined __LINUXTHREADS_OLD__ struct Mutex::Impl From 19270eeab41e678e3bae64f55c941fa95222e364 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 15 Nov 2016 16:13:30 +0300 Subject: [PATCH 59/96] warnings --- apps/haartraining/createsamples.cpp | 5 +++++ modules/core/src/gpumat.cpp | 2 +- modules/gpu/include/opencv2/gpu/gpu.hpp | 10 ++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/haartraining/createsamples.cpp b/apps/haartraining/createsamples.cpp index 4d01fbd10f..f0a8eabe52 100644 --- a/apps/haartraining/createsamples.cpp +++ b/apps/haartraining/createsamples.cpp @@ -52,6 +52,11 @@ #include #include +// std::auto_ptr +#if defined(__GNUC__) && __GNUC__ >= 6 +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + using namespace std; #include "cvhaartraining.h" diff --git a/modules/core/src/gpumat.cpp b/modules/core/src/gpumat.cpp index 96691919fd..5065deb58a 100644 --- a/modules/core/src/gpumat.cpp +++ b/modules/core/src/gpumat.cpp @@ -700,7 +700,7 @@ void cv::gpu::GpuMat::create(int _rows, int _cols, int _type) size_t esz = elemSize(); - void* devPtr; + void* devPtr = NULL; gpuFuncTable()->mallocPitch(&devPtr, &step, esz * cols, rows); // Single row must be continuous diff --git a/modules/gpu/include/opencv2/gpu/gpu.hpp b/modules/gpu/include/opencv2/gpu/gpu.hpp index de16982627..088b5242d2 100644 --- a/modules/gpu/include/opencv2/gpu/gpu.hpp +++ b/modules/gpu/include/opencv2/gpu/gpu.hpp @@ -54,6 +54,12 @@ #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/features2d/features2d.hpp" +// std::auto_ptr +#if defined(__GNUC__) && __GNUC__ >= 6 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + namespace cv { namespace gpu { //////////////////////////////// CudaMem //////////////////////////////// @@ -2527,4 +2533,8 @@ CV_EXPORTS void calcWobbleSuppressionMaps( } // namespace cv +#if defined(__GNUC__) && __GNUC__ >= 6 +#pragma GCC diagnostic pop +#endif + #endif /* __OPENCV_GPU_HPP__ */ From a42be1f9bd02a67688cb6b5be833b0d7059026ce Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 14 Nov 2016 18:59:18 +0300 Subject: [PATCH 60/96] backport ARM toolchain from master --- platforms/linux/aarch64-gnu.toolchain.cmake | 4 + platforms/linux/arm-gnueabi.toolchain.cmake | 92 +---------------- platforms/linux/arm.toolchain.cmake | 97 ++++++++++++++++++ platforms/linux/gnu.toolchain.cmake | 106 ++++++++++++++++++++ 4 files changed, 210 insertions(+), 89 deletions(-) create mode 100644 platforms/linux/aarch64-gnu.toolchain.cmake create mode 100644 platforms/linux/arm.toolchain.cmake create mode 100644 platforms/linux/gnu.toolchain.cmake diff --git a/platforms/linux/aarch64-gnu.toolchain.cmake b/platforms/linux/aarch64-gnu.toolchain.cmake new file mode 100644 index 0000000000..ae16337ce7 --- /dev/null +++ b/platforms/linux/aarch64-gnu.toolchain.cmake @@ -0,0 +1,4 @@ +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version") +set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple") +include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake") diff --git a/platforms/linux/arm-gnueabi.toolchain.cmake b/platforms/linux/arm-gnueabi.toolchain.cmake index 2c5b7406d8..90217f005d 100644 --- a/platforms/linux/arm-gnueabi.toolchain.cmake +++ b/platforms/linux/arm-gnueabi.toolchain.cmake @@ -1,89 +1,3 @@ -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR arm) - -set(GCC_COMPILER_VERSION "4.6" CACHE STRING "GCC Compiler version") - -set(FLOAT_ABI_SUFFIX "") - -if (NOT SOFTFP) - set(FLOAT_ABI_SUFFIX "hf") -endif() - -set(CMAKE_C_COMPILER arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION}) -set(CMAKE_CXX_COMPILER arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++-${GCC_COMPILER_VERSION}) -set(ARM_LINUX_SYSROOT /usr/arm-linux-gnueabi${FLOAT_ABI_SUFFIX} CACHE PATH "ARM cross compilation system root") - -set(CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags") -set(CMAKE_C_FLAGS "" CACHE STRING "c flags") -set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags") -set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags") -set(CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags") - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi") - -set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_SHARED_LINKER_FLAGS}") -set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_MODULE_LINKER_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_EXE_LINKER_FLAGS}") - -if(USE_NEON) - message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." ) - set(ENABLE_NEON TRUE) -elseif(USE_VFPV3) - message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." ) - set(ENABLE_VFPV3 TRUE) -endif() - -set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT}) - -if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR}) - set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR}) -endif() - -set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." ) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) - -# macro to find programs on the host OS -macro( find_host_program ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) - if( CMAKE_HOST_WIN32 ) - SET( WIN32 1 ) - SET( UNIX ) - elseif( CMAKE_HOST_APPLE ) - SET( APPLE 1 ) - SET( UNIX ) - endif() - find_program( ${ARGN} ) - SET( WIN32 ) - SET( APPLE ) - SET( UNIX 1 ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) -endmacro() - -# macro to find packages on the host OS -macro( find_host_package ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) - if( CMAKE_HOST_WIN32 ) - SET( WIN32 1 ) - SET( UNIX ) - elseif( CMAKE_HOST_APPLE ) - SET( APPLE 1 ) - SET( UNIX ) - endif() - find_package( ${ARGN} ) - SET( WIN32 ) - SET( APPLE ) - SET( UNIX 1 ) - set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) - set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) -endmacro() +set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version") +set(GNU_MACHINE "arm-linux-gnueabi" CACHE STRING "GNU compiler triple") +include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake") diff --git a/platforms/linux/arm.toolchain.cmake b/platforms/linux/arm.toolchain.cmake new file mode 100644 index 0000000000..75c9194dde --- /dev/null +++ b/platforms/linux/arm.toolchain.cmake @@ -0,0 +1,97 @@ +if(COMMAND toolchain_save_config) + return() # prevent recursive call +endif() + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR) + set(CMAKE_SYSTEM_PROCESSOR arm) +else() + #message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}") +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake") + +if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm AND NOT ARM_IGNORE_FP) + set(FLOAT_ABI_SUFFIX "") + if(NOT SOFTFP) + set(FLOAT_ABI_SUFFIX "hf") + endif() +endif() + +if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x") + set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}") +endif() + +if(NOT DEFINED CMAKE_C_COMPILER) + find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-gcc${__GCC_VER_SUFFIX}) +else() + #message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined") +endif() +if(NOT DEFINED CMAKE_CXX_COMPILER) + find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-g++${__GCC_VER_SUFFIX}) +else() + #message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined") +endif() +if(NOT DEFINED CMAKE_LINKER) + find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld) +else() + #message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined") +endif() +if(NOT DEFINED CMAKE_AR) + find_program(CMAKE_AR NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar) +else() + #message(WARNING "CMAKE_AR=${CMAKE_AR} is defined") +endif() + +if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE) + set(ARM_LINUX_SYSROOT /usr/${GNU_MACHINE}${FLOAT_ABI_SUFFIX}) +endif() + +if(NOT DEFINED CMAKE_CXX_FLAGS) + set(CMAKE_CXX_FLAGS "" CACHE INTERAL "") + set(CMAKE_C_FLAGS "" CACHE INTERAL "") + set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERAL "") + set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERAL "") + set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERAL "") + + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi") + if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm) + set(CMAKE_CXX_FLAGS "-mthumb ${CMAKE_CXX_FLAGS}") + set(CMAKE_C_FLAGS "-mthumb ${CMAKE_C_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc") + endif() + if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm) + set(ARM_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) + set(ARM_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") + endif() + set(CMAKE_SHARED_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}") +else() + #message(WARNING "CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' is defined") +endif() + +if(USE_NEON) + message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." ) + set(ENABLE_NEON TRUE) +elseif(USE_VFPV3) + message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." ) + set(ENABLE_VFPV3 TRUE) +endif() + +set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT}) + +if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR}) +endif() + +set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS} + ARM_LINUX_SYSROOT + ENABLE_NEON + ENABLE_VFPV3 + CUDA_TOOLKIT_ROOT_DIR +) +toolchain_save_config() diff --git a/platforms/linux/gnu.toolchain.cmake b/platforms/linux/gnu.toolchain.cmake new file mode 100644 index 0000000000..4050d83f61 --- /dev/null +++ b/platforms/linux/gnu.toolchain.cmake @@ -0,0 +1,106 @@ +cmake_minimum_required(VERSION 2.8) + +# load settings in case of "try compile" +set(TOOLCHAIN_CONFIG_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toolchain.config.cmake") +get_property(__IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE) +if(__IN_TRY_COMPILE) + include("${CMAKE_CURRENT_SOURCE_DIR}/../toolchain.config.cmake" OPTIONAL) # CMAKE_BINARY_DIR is different + macro(toolchain_save_config) + # nothing + endmacro() +else() + macro(toolchain_save_config) + set(__config "#message(\"Load TOOLCHAIN config...\")\n") + get_cmake_property(__variableNames VARIABLES) + set(__vars_list ${ARGN}) + list(APPEND __vars_list + ${TOOLCHAIN_CONFIG_VARS} + CMAKE_SYSTEM_NAME + CMAKE_SYSTEM_VERSION + CMAKE_SYSTEM_PROCESSOR + CMAKE_C_COMPILER + CMAKE_CXX_COMPILER + CMAKE_C_FLAGS + CMAKE_CXX_FLAGS + CMAKE_SHARED_LINKER_FLAGS + CMAKE_MODULE_LINKER_FLAGS + CMAKE_EXE_LINKER_FLAGS + CMAKE_SKIP_RPATH + CMAKE_FIND_ROOT_PATH + GCC_COMPILER_VERSION + ) + foreach(__var ${__variableNames}) + foreach(_v ${__vars_list}) + if("x${__var}" STREQUAL "x${_v}") + if(${__var} MATCHES " ") + set(__config "${__config}set(${__var} \"${${__var}}\")\n") + else() + set(__config "${__config}set(${__var} ${${__var}})\n") + endif() + endif() + endforeach() + endforeach() + if(EXISTS "${TOOLCHAIN_CONFIG_FILE}") + file(READ "${TOOLCHAIN_CONFIG_FILE}" __config_old) + endif() + if("${__config_old}" STREQUAL "${__config}") + # nothing + else() + #message("Update TOOLCHAIN config: ${__config}") + file(WRITE "${TOOLCHAIN_CONFIG_FILE}" "${__config}") + endif() + unset(__config) + unset(__config_old) + unset(__vars_list) + unset(__variableNames) + endmacro() +endif() # IN_TRY_COMPILE + +set(CMAKE_SKIP_RPATH TRUE) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + +# macro to find programs on the host OS +macro(find_host_program) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + if(CMAKE_HOST_WIN32) + SET(WIN32 1) + SET(UNIX) + elseif(CMAKE_HOST_APPLE) + SET(APPLE 1) + SET(UNIX) + endif() + find_program(${ARGN}) + SET(WIN32) + SET(APPLE) + SET(UNIX 1) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endmacro() + +# macro to find packages on the host OS +macro(find_host_package) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + if(CMAKE_HOST_WIN32) + SET(WIN32 1) + SET(UNIX) + elseif(CMAKE_HOST_APPLE) + SET(APPLE 1) + SET(UNIX) + endif() + find_package(${ARGN}) + SET(WIN32) + SET(APPLE) + SET(UNIX 1) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endmacro() + +set(CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries.") From 0a543c553112cd2791f56bd6bb380f77a4b3df4f Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 15 Nov 2016 18:51:17 +0300 Subject: [PATCH 61/96] test: fix Legacy_StereoGC.regression assertion --- modules/legacy/test/test_stereomatching.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/legacy/test/test_stereomatching.cpp b/modules/legacy/test/test_stereomatching.cpp index 7513bbb1e5..2a1d905cbe 100644 --- a/modules/legacy/test/test_stereomatching.cpp +++ b/modules/legacy/test/test_stereomatching.cpp @@ -532,7 +532,7 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca // rightDisp is not used in current test virsion int code = cvtest::TS::OK; assert( fs.isOpened() ); - assert( trueLeftDisp.type() == CV_32FC1 && trueRightDisp.type() == CV_32FC1 ); + assert( trueLeftDisp.type() == CV_32FC1 && (trueRightDisp.empty() || trueRightDisp.type() == CV_32FC1) ); assert( leftDisp.type() == CV_32FC1 && rightDisp.type() == CV_32FC1 ); // get masks for unknown ground truth disparity values From 3ea4f72e35c7bd7cd866c44b43461896f2ab7c65 Mon Sep 17 00:00:00 2001 From: Tomoaki Teshima Date: Fri, 20 May 2016 18:17:22 +0900 Subject: [PATCH 62/96] fix Core_MulSpectrum test on 64bit ARM + release mode * fix issue 6536 * increase threshold in particular tests due to the difference of fmsub and fsub --- modules/core/test/test_dxt.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/modules/core/test/test_dxt.cpp b/modules/core/test/test_dxt.cpp index 33ddb02660..2aaabbf0f8 100644 --- a/modules/core/test/test_dxt.cpp +++ b/modules/core/test/test_dxt.cpp @@ -778,6 +778,9 @@ public: protected: void run_func(); void prepare_to_validation( int test_case_idx ); +#if defined(__aarch64__) && defined(NDEBUG) + double get_success_error_level( int test_case_idx, int i, int j ); +#endif }; @@ -785,6 +788,31 @@ CxCore_MulSpectrumsTest::CxCore_MulSpectrumsTest() : CxCore_DXTBaseTest( true, t { } +#if defined(__aarch64__) && defined(NDEBUG) +double CxCore_MulSpectrumsTest::get_success_error_level( int test_case_idx, int i, int j ) +{ + int elem_depth = CV_MAT_DEPTH(cvGetElemType(test_array[i][j])); + if( elem_depth <= CV_32F ) + { + return ArrayTest::get_success_error_level( test_case_idx, i, j ); + } + switch( test_case_idx ) + { + // Usual threshold is too strict for these test cases due to the difference of fmsub and fsub + case 399: + case 420: + return DBL_EPSILON * 20000; + case 65: + case 161: + case 287: + case 351: + case 458: + return DBL_EPSILON * 10000; + default: + return ArrayTest::get_success_error_level( test_case_idx, i, j ); + } +} +#endif void CxCore_MulSpectrumsTest::run_func() { From f21f153a5f18bc82e129ab5e7a9dd2965b91c2b7 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 21 Nov 2016 14:31:26 +0300 Subject: [PATCH 63/96] test: backport check for Image_KernelSize_GaborFilter2d perf test --- modules/imgproc/perf/perf_filter2d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/perf/perf_filter2d.cpp b/modules/imgproc/perf/perf_filter2d.cpp index 98992e98e5..2c20e1c451 100644 --- a/modules/imgproc/perf/perf_filter2d.cpp +++ b/modules/imgproc/perf/perf_filter2d.cpp @@ -70,5 +70,5 @@ PERF_TEST_P( Image_KernelSize, GaborFilter2d, filter2D(sourceImage, filteredImage, CV_32F, gaborKernel); } - SANITY_CHECK(filteredImage, 1e-3); + SANITY_CHECK(filteredImage, 1e-6, ERROR_RELATIVE); } From 8e22b1791964c37293981a350395e76d0f919f31 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 23 Nov 2016 14:20:06 +0300 Subject: [PATCH 64/96] java: backport test changes from master --- .../src/org/opencv/test/OpenCVTestCase.java | 43 +++++++++++++++++-- .../src/org/opencv/test/core/CoreTest.java | 2 +- .../src/org/opencv/test/core/MatTest.java | 4 +- .../org/opencv/test/imgproc/ImgprocTest.java | 8 ++-- modules/java/test/build.xml | 16 +++++-- .../src/org/opencv/test/OpenCVTestCase.java | 43 +++++++++++++++++-- 6 files changed, 99 insertions(+), 17 deletions(-) diff --git a/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java b/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java index 5c932110d3..198dac2ac1 100644 --- a/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java +++ b/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java @@ -26,6 +26,11 @@ import org.opencv.highgui.Highgui; import android.util.Log; public class OpenCVTestCase extends TestCase { + + public static class TestSkipException extends RuntimeException { + public TestSkipException() {} + } + //change to 'true' to unblock fail on fail("Not yet implemented") public static final boolean passNYI = true; @@ -182,12 +187,40 @@ public class OpenCVTestCase extends TestCase { protected void runTest() throws Throwable { // Do nothing if the precondition does not hold. if (isTestCaseEnabled) { - super.runTest(); + try { + super.runTest(); + } catch (TestSkipException ex) { + Log.w(TAG, "Test case \"" + this.getClass().getName() + "\" skipped!"); + assertTrue(true); + } } else { Log.e(TAG, "Test case \"" + this.getClass().getName() + "\" disabled!"); } } + public void runBare() throws Throwable { + Throwable exception = null; + try { + setUp(); + } catch (TestSkipException ex) { + Log.w(TAG, "Test case \"" + this.getClass().getName() + "\" skipped!"); + assertTrue(true); + return; + } + try { + runTest(); + } catch (Throwable running) { + exception = running; + } finally { + try { + tearDown(); + } catch (Throwable tearingDown) { + if (exception == null) exception = tearingDown; + } + } + if (exception != null) throw exception; + } + protected Mat getMat(int type, double... vals) { return new Mat(matSize, matSize, type, new Scalar(vals)); @@ -205,6 +238,10 @@ public class OpenCVTestCase extends TestCase { TestCase.fail(msg); } + public static void assertGE(double v1, double v2) { + assertTrue("Failed: " + v1 + " >= " + v2, v1 >= v2); + } + public static void assertListEquals(List list1, List list2) { if (list1.size() != list2.size()) { throw new UnsupportedOperationException(); @@ -419,10 +456,10 @@ public class OpenCVTestCase extends TestCase { if (isEqualityMeasured) assertTrue("Max difference between expected and actiual Mats is "+ maxDiff + ", that bigger than " + eps, - Core.checkRange(diff, true, 0.0, eps)); + maxDiff <= eps); else assertFalse("Max difference between expected and actiual Mats is "+ maxDiff + ", that less than " + eps, - Core.checkRange(diff, true, 0.0, eps)); + maxDiff <= eps); } protected static String readFile(String path) { diff --git a/modules/java/android_test/src/org/opencv/test/core/CoreTest.java b/modules/java/android_test/src/org/opencv/test/core/CoreTest.java index 45e435330c..83511b995b 100644 --- a/modules/java/android_test/src/org/opencv/test/core/CoreTest.java +++ b/modules/java/android_test/src/org/opencv/test/core/CoreTest.java @@ -2052,7 +2052,7 @@ public class CoreTest extends OpenCVTestCase { }; Mat roots = new Mat(); - assertEquals(0.0, Core.solvePoly(coeffs, roots)); + assertGE(1e-6, Math.abs(Core.solvePoly(coeffs, roots))); truth = new Mat(3, 1, CvType.CV_32FC2) { { diff --git a/modules/java/android_test/src/org/opencv/test/core/MatTest.java b/modules/java/android_test/src/org/opencv/test/core/MatTest.java index a2570f4342..610f0eb7eb 100644 --- a/modules/java/android_test/src/org/opencv/test/core/MatTest.java +++ b/modules/java/android_test/src/org/opencv/test/core/MatTest.java @@ -488,13 +488,13 @@ public class MatTest extends OpenCVTestCase { public void testIsContinuous() { assertTrue(gray0.isContinuous()); - Mat subMat = gray0.submat(0, 0, gray0.rows() / 2, gray0.cols() / 2); + Mat subMat = gray0.submat(0, gray0.rows() / 2, 0, gray0.cols() / 2); assertFalse(subMat.isContinuous()); } public void testIsSubmatrix() { assertFalse(gray0.isSubmatrix()); - Mat subMat = gray0.submat(0, 0, gray0.rows() / 2, gray0.cols() / 2); + Mat subMat = gray0.submat(0, gray0.rows() / 2, 0, gray0.cols() / 2); assertTrue(subMat.isSubmatrix()); } diff --git a/modules/java/android_test/src/org/opencv/test/imgproc/ImgprocTest.java b/modules/java/android_test/src/org/opencv/test/imgproc/ImgprocTest.java index 7eed06abd9..ac2fc18d26 100644 --- a/modules/java/android_test/src/org/opencv/test/imgproc/ImgprocTest.java +++ b/modules/java/android_test/src/org/opencv/test/imgproc/ImgprocTest.java @@ -165,7 +165,7 @@ public class ImgprocTest extends OpenCVTestCase { double arcLength = Imgproc.arcLength(curve, false); - assertEquals(5.656854152679443, arcLength); + assertEquals(5.656854152679443, arcLength, EPS); } public void testBilateralFilterMatMatIntDoubleDouble() { @@ -367,7 +367,7 @@ public class ImgprocTest extends OpenCVTestCase { double distance = Imgproc.compareHist(H1, H2, Imgproc.CV_COMP_CORREL); - assertEquals(1., distance); + assertEquals(1., distance, EPS); } public void testContourAreaMat() { @@ -376,7 +376,7 @@ public class ImgprocTest extends OpenCVTestCase { double area = Imgproc.contourArea(contour); - assertEquals(45., area); + assertEquals(45., area, EPS); } public void testContourAreaMatBoolean() { @@ -385,7 +385,7 @@ public class ImgprocTest extends OpenCVTestCase { double area = Imgproc.contourArea(contour, true); - assertEquals(45., area); + assertEquals(45., area, EPS); // TODO_: write better test } diff --git a/modules/java/test/build.xml b/modules/java/test/build.xml index d3f826cf00..dac4d4b455 100644 --- a/modules/java/test/build.xml +++ b/modules/java/test/build.xml @@ -1,5 +1,7 @@ + + @@ -12,7 +14,7 @@ - + @@ -34,8 +36,8 @@ - - + + @@ -45,12 +47,18 @@ - + + + + + + + diff --git a/modules/java/test/src/org/opencv/test/OpenCVTestCase.java b/modules/java/test/src/org/opencv/test/OpenCVTestCase.java index a9b5041189..df0bb04cfa 100644 --- a/modules/java/test/src/org/opencv/test/OpenCVTestCase.java +++ b/modules/java/test/src/org/opencv/test/OpenCVTestCase.java @@ -28,6 +28,11 @@ import org.opencv.features2d.KeyPoint; import org.opencv.highgui.Highgui; public class OpenCVTestCase extends TestCase { + + public static class TestSkipException extends RuntimeException { + public TestSkipException() {} + } + //change to 'true' to unblock fail on fail("Not yet implemented") public static final boolean passNYI = true; @@ -212,12 +217,40 @@ public class OpenCVTestCase extends TestCase { protected void runTest() throws Throwable { // Do nothing if the precondition does not hold. if (isTestCaseEnabled) { - super.runTest(); + try { + super.runTest(); + } catch (TestSkipException ex) { + OpenCVTestRunner.Log(TAG + " :: " + "Test case \"" + this.getClass().getName() + "\" skipped!"); + assertTrue(true); + } } else { OpenCVTestRunner.Log(TAG + " :: " + "Test case \"" + this.getClass().getName() + "\" disabled!"); } } + public void runBare() throws Throwable { + Throwable exception = null; + try { + setUp(); + } catch (TestSkipException ex) { + OpenCVTestRunner.Log(TAG + " :: " + "Test case \"" + this.getClass().getName() + "\" skipped!"); + assertTrue(true); + return; + } + try { + runTest(); + } catch (Throwable running) { + exception = running; + } finally { + try { + tearDown(); + } catch (Throwable tearingDown) { + if (exception == null) exception = tearingDown; + } + } + if (exception != null) throw exception; + } + protected Mat getMat(int type, double... vals) { return new Mat(matSize, matSize, type, new Scalar(vals)); @@ -235,6 +268,10 @@ public class OpenCVTestCase extends TestCase { TestCase.fail(msg); } + public static void assertGE(double v1, double v2) { + assertTrue("Failed: " + v1 + " >= " + v2, v1 >= v2); + } + public static void assertListEquals(List list1, List list2) { if (list1.size() != list2.size()) { throw new UnsupportedOperationException(); @@ -449,10 +486,10 @@ public class OpenCVTestCase extends TestCase { if (isEqualityMeasured) assertTrue("Max difference between expected and actiual Mats is "+ maxDiff + ", that bigger than " + eps, - Core.checkRange(diff, true, 0.0, eps)); + maxDiff <= eps); else assertFalse("Max difference between expected and actiual Mats is "+ maxDiff + ", that less than " + eps, - Core.checkRange(diff, true, 0.0, eps)); + maxDiff <= eps); } protected static String readFile(String path) { From a3bfa6f566da184ddceba6583f357125a2f21b9a Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 8 Nov 2016 18:00:03 +0300 Subject: [PATCH 65/96] cmake: ccache --- CMakeLists.txt | 2 ++ cmake/OpenCVCompilerOptions.cmake | 34 +++++++++++++++++++++++++++++ cmake/OpenCVDetectCXXCompiler.cmake | 4 ---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 007b80d4da..91a6462012 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,7 @@ OCV_OPTION(INSTALL_TESTS "Install accuracy and performance test binar # OpenCV build options # =================================================== +OCV_OPTION(ENABLE_CCACHE "Use ccache" (UNIX AND NOT IOS AND (CMAKE_GENERATOR MATCHES "Makefile" OR CMAKE_GENERATOR MATCHES "Ninja")) ) OCV_OPTION(ENABLE_DYNAMIC_CUDA "Enabled dynamic CUDA linkage" ON IF ANDROID ) OCV_OPTION(ENABLE_PRECOMPILED_HEADERS "Use precompiled headers" ON IF (NOT IOS) ) OCV_OPTION(ENABLE_SOLUTION_FOLDERS "Solution folder in Visual Studio or in other IDEs" (MSVC_IDE OR CMAKE_GENERATOR MATCHES Xcode) IF (CMAKE_VERSION VERSION_GREATER "2.8.0") ) @@ -731,6 +732,7 @@ else() status(" Linker flags (Release):" ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}) status(" Linker flags (Debug):" ${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}) endif() +status(" ccache:" CMAKE_COMPILER_IS_CCACHE THEN YES ELSE NO) status(" Precompiled headers:" PCHSupport_FOUND AND ENABLE_PRECOMPILED_HEADERS THEN YES ELSE NO) # ========================== OpenCV modules ========================== diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 499061e28c..57d142eb0b 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -1,3 +1,33 @@ +if(ENABLE_CCACHE AND NOT CMAKE_COMPILER_IS_CCACHE) + # This works fine with Unix Makefiles and Ninja generators + find_host_program(CCACHE_PROGRAM ccache) + if(CCACHE_PROGRAM) + message(STATUS "Looking for ccache - found (${CCACHE_PROGRAM})") + get_property(__OLD_RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE) + if(__OLD_RULE_LAUNCH_COMPILE) + message(STATUS "Can't replace CMake compiler launcher") + else() + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") + # NOTE: Actually this check doesn't work as expected. + # "RULE_LAUNCH_COMPILE" is ignored by CMake during try_compile() step. + # ocv_check_compiler_flag(CXX "" IS_CCACHE_WORKS) + set(IS_CCACHE_WORKS 1) + if(IS_CCACHE_WORKS) + set(CMAKE_COMPILER_IS_CCACHE 1) + else() + message(STATUS "Unable to compile program with enabled ccache, reverting...") + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${__OLD_RULE_LAUNCH_COMPILE}") + endif() + else() + message(STATUS "Looking for ccache - not found") + endif() + endif() +endif() + +if((CMAKE_COMPILER_IS_CLANGCXX OR CMAKE_COMPILER_IS_CLANGCC OR CMAKE_COMPILER_IS_CCACHE) AND NOT CMAKE_GENERATOR MATCHES "Xcode") + set(ENABLE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) +endif() + if(MINGW OR (X86 AND UNIX AND NOT APPLE)) # mingw compiler is known to produce unstable SSE code with -O3 hence we are trying to use -O2 instead if(CMAKE_COMPILER_IS_GNUCXX) @@ -111,6 +141,10 @@ if(CMAKE_COMPILER_IS_GNUCXX) add_extra_compiler_option(-pthread) endif() + if(CMAKE_COMPILER_IS_CLANGCXX) + add_extra_compiler_option(-Qunused-arguments) + endif() + if(OPENCV_WARNINGS_ARE_ERRORS) add_extra_compiler_option(-Werror) endif() diff --git a/cmake/OpenCVDetectCXXCompiler.cmake b/cmake/OpenCVDetectCXXCompiler.cmake index aa7a8b6a6f..b53f8d7363 100644 --- a/cmake/OpenCVDetectCXXCompiler.cmake +++ b/cmake/OpenCVDetectCXXCompiler.cmake @@ -14,10 +14,6 @@ if(CMAKE_C_COMPILER_ID STREQUAL "Clang") set(CMAKE_COMPILER_IS_CLANGCC 1) endif() -if((CMAKE_COMPILER_IS_CLANGCXX OR CMAKE_COMPILER_IS_CLANGCC) AND NOT CMAKE_GENERATOR MATCHES "Xcode") - set(ENABLE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) -endif() - # ---------------------------------------------------------------------------- # Detect Intel ICC compiler -- for -fPIC in 3rdparty ( UNIX ONLY ): # see include/opencv/cxtypes.h file for related ICC & CV_ICC defines. From da75d129fe0e5238f9263e4cd6339b446ba8d3ad Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 15 Nov 2016 16:13:36 +0300 Subject: [PATCH 66/96] java: fix Calib3d test --- .../org/opencv/test/calib3d/Calib3dTest.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/modules/java/android_test/src/org/opencv/test/calib3d/Calib3dTest.java b/modules/java/android_test/src/org/opencv/test/calib3d/Calib3dTest.java index db806b6fc9..b79a99625b 100644 --- a/modules/java/android_test/src/org/opencv/test/calib3d/Calib3dTest.java +++ b/modules/java/android_test/src/org/opencv/test/calib3d/Calib3dTest.java @@ -249,9 +249,22 @@ public class Calib3dTest extends OpenCVTestCase { Mat fm = Calib3d.findFundamentalMat(pts, pts); - truth = new Mat(3, 3, CvType.CV_64F); - truth.put(0, 0, 0, -0.577, 0.288, 0.577, 0, 0.288, -0.288, -0.288, 0); - assertMatEqual(truth, fm, EPS); + // Check definition of fundamental matrix: + // [p2; 1]T * F * [p1; 1] = 0 + // (p2 == p1 in this testcase) + for (int i = 0; i < pts.rows(); i++) + { + Mat pt = new Mat(3, 1, fm.type()); + pt.put(0, 0, pts.get(i, 0)[0], pts.get(i, 0)[1], 1); + + Mat pt_t = pt.t(); + + Mat tmp = new Mat(); + Mat res = new Mat(); + Core.gemm(pt_t, fm, 1.0, new Mat(), 0.0, tmp); + Core.gemm(tmp, pt, 1.0, new Mat(), 0.0, res); + assertTrue(Math.abs(res.get(0, 0)[0]) <= 1e-6); + } } public void testFindFundamentalMatListOfPointListOfPointInt() { From 4a759abe393f85bbcfcc79171c73a3c98fdfb810 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 21 Oct 2016 17:57:33 +0300 Subject: [PATCH 67/96] Revert "Fix for VTK6.2 issue." This reverts commit f45da9866a94dbf52f5fb955bea67fce913ca515. --- modules/viz/src/vtk/vtkCocoaInteractorFix.mm | 237 ++++++------------- 1 file changed, 69 insertions(+), 168 deletions(-) diff --git a/modules/viz/src/vtk/vtkCocoaInteractorFix.mm b/modules/viz/src/vtk/vtkCocoaInteractorFix.mm index 481baf96ba..dad41b073e 100644 --- a/modules/viz/src/vtk/vtkCocoaInteractorFix.mm +++ b/modules/viz/src/vtk/vtkCocoaInteractorFix.mm @@ -1,54 +1,48 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// - // - // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. - // - // By downloading, copying, installing or using the software you agree to this license. - // If you do not agree to this license, do not download, install, - // copy or use the software. - // - // - // License Agreement - // For Open Source Computer Vision Library - // - // Copyright (C) 2013, OpenCV Foundation, all rights reserved. - // Third party copyrights are property of their respective owners. - // - // Redistribution and use in source and binary forms, with or without modification, - // are permitted provided that the following conditions are met: - // - // * Redistribution's of source code must retain the above copyright notice, - // this list of conditions and the following disclaimer. - // - // * Redistribution's in binary form must reproduce the above copyright notice, - // this list of conditions and the following disclaimer in the documentation - // and/or other materials provided with the distribution. - // - // * The name of the copyright holders may not be used to endorse or promote products - // derived from this software without specific prior written permission. - // - // This software is provided by the copyright holders and contributors "as is" and - // any express or implied warranties, including, but not limited to, the implied - // warranties of merchantability and fitness for a particular purpose are disclaimed. - // In no event shall the Intel Corporation or contributors be liable for any direct, - // indirect, incidental, special, exemplary, or consequential damages - // (including, but not limited to, procurement of substitute goods or services; - // loss of use, data, or profits; or business interruption) however caused - // and on any theory of liability, whether in contract, strict liability, - // or tort (including negligence or otherwise) arising in any way out of - // the use of this software, even if advised of the possibility of such damage. - // - // Authors: - // * Anatoly Baksheev, Itseez Inc. myname.mysurname <> mycompany.com - // - // This workaround code was taken from PCL library(www.pointclouds.org) - // - // Modified by Jasper Shemilt to work with VTK 6.2 - // The fix was needed because GetCocoaServer has been moved from - // vtkCocoaRenderWindowInteractor to vtkCocoaRenderWindow in VTK 6.2. - // This alteration to VTK happened almost a year ago according to the gitHub - // commit a3e9fc9. - // - //M*/ +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2013, OpenCV Foundation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +// Authors: +// * Anatoly Baksheev, Itseez Inc. myname.mysurname <> mycompany.com +// +// This workaround code was taken from PCL library(www.pointclouds.org) +// +//M*/ #import #include @@ -124,14 +118,14 @@ [application stop:application]; NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined - location:NSMakePoint(0.0,0.0) - modifierFlags:0 - timestamp:0 - windowNumber:-1 - context:nil - subtype:0 - data1:0 - data2:0]; + location:NSMakePoint(0.0,0.0) + modifierFlags:0 + timestamp:0 + windowNumber:-1 + context:nil + subtype:0 + data1:0 + data2:0]; [application postEvent:event atStart:YES]; } @@ -160,121 +154,30 @@ //---------------------------------------------------------------------------- -#if VTK_MAJOR_VERSION >= 6 && VTK_MINOR_VERSION >=2 - namespace cv { namespace viz +{ + class vtkCocoaRenderWindowInteractorFix : public vtkCocoaRenderWindowInteractor { - class vtkCocoaRenderWindowInteractorFix : public vtkCocoaRenderWindowInteractor - { - public: - static vtkCocoaRenderWindowInteractorFix *New (); - vtkTypeMacro (vtkCocoaRenderWindowInteractorFix, vtkCocoaRenderWindowInteractor) + public: + static vtkCocoaRenderWindowInteractorFix *New (); + vtkTypeMacro (vtkCocoaRenderWindowInteractorFix, vtkCocoaRenderWindowInteractor) - virtual void Start (); - virtual void TerminateApp (); + virtual void Start (); + virtual void TerminateApp (); - protected: - vtkCocoaRenderWindowInteractorFix () {} - ~vtkCocoaRenderWindowInteractorFix () {} + protected: + vtkCocoaRenderWindowInteractorFix () {} + ~vtkCocoaRenderWindowInteractorFix () {} - private: - vtkCocoaRenderWindowInteractorFix (const vtkCocoaRenderWindowInteractorFix&); // Not implemented. - void operator = (const vtkCocoaRenderWindowInteractorFix&); // Not implemented. - }; + private: + vtkCocoaRenderWindowInteractorFix (const vtkCocoaRenderWindowInteractorFix&); // Not implemented. + void operator = (const vtkCocoaRenderWindowInteractorFix&); // Not implemented. + }; - vtkStandardNewMacro (vtkCocoaRenderWindowInteractorFix) + vtkStandardNewMacro (vtkCocoaRenderWindowInteractorFix) - vtkSmartPointer vtkCocoaRenderWindowInteractorNew(); - - class vtkCocoaRenderWindowFix : public vtkCocoaRenderWindow - { - public: - static vtkCocoaRenderWindowFix *New (); - vtkTypeMacro ( vtkCocoaRenderWindowFix, vtkCocoaRenderWindow) - - virtual vtkCocoaServerFix * GetCocoaServer (); - virtual void SetCocoaServer (void* ); - - protected: - vtkCocoaRenderWindowFix () {} - ~vtkCocoaRenderWindowFix () {} - - private: - vtkCocoaRenderWindowFix (const vtkCocoaRenderWindowInteractorFix&); // Not implemented. - void operator = (const vtkCocoaRenderWindowFix&); // Not implemented. - }; - - vtkStandardNewMacro (vtkCocoaRenderWindowFix) - - vtkSmartPointer vtkCocoaRenderWindowNew(); - }} - -vtkCocoaServerFix * cv::viz::vtkCocoaRenderWindowFix::GetCocoaServer () -{ - return reinterpret_cast (this->GetCocoaServer ()); -} - -void cv::viz::vtkCocoaRenderWindowFix::SetCocoaServer (void* server) -{ - this->SetCocoaServer (server); -} - -void cv::viz::vtkCocoaRenderWindowInteractorFix::Start () -{ - vtkCocoaRenderWindowFix* renWin = vtkCocoaRenderWindowFix::SafeDownCast(this->GetRenderWindow ()); - if (renWin != NULL) - { - vtkCocoaServerFix *server = reinterpret_cast (renWin->GetCocoaServer ()); - if (!renWin->GetCocoaServer ()) - { - server = [vtkCocoaServerFix cocoaServerWithRenderWindow:renWin]; - renWin->SetCocoaServer (reinterpret_cast (server)); - } - - [server start]; - } -} - -void cv::viz::vtkCocoaRenderWindowInteractorFix::TerminateApp () -{ - vtkCocoaRenderWindowFix *renWin = vtkCocoaRenderWindowFix::SafeDownCast (this->RenderWindow); - if (renWin) - { - vtkCocoaServerFix *server = reinterpret_cast (renWin->GetCocoaServer ()); - [server stop]; - } -} - -vtkSmartPointer cv::viz::vtkCocoaRenderWindowInteractorNew() -{ - return vtkSmartPointer::New(); -} - -#else -namespace cv { namespace viz - { - class vtkCocoaRenderWindowInteractorFix : public vtkCocoaRenderWindowInteractor - { - public: - static vtkCocoaRenderWindowInteractorFix *New (); - vtkTypeMacro (vtkCocoaRenderWindowInteractorFix, vtkCocoaRenderWindowInteractor) - - virtual void Start (); - virtual void TerminateApp (); - - protected: - vtkCocoaRenderWindowInteractorFix () {} - ~vtkCocoaRenderWindowInteractorFix () {} - - private: - vtkCocoaRenderWindowInteractorFix (const vtkCocoaRenderWindowInteractorFix&); // Not implemented. - void operator = (const vtkCocoaRenderWindowInteractorFix&); // Not implemented. - }; - - vtkStandardNewMacro (vtkCocoaRenderWindowInteractorFix) - - vtkSmartPointer vtkCocoaRenderWindowInteractorNew(); - }} + vtkSmartPointer vtkCocoaRenderWindowInteractorNew(); +}} void cv::viz::vtkCocoaRenderWindowInteractorFix::Start () { @@ -306,5 +209,3 @@ vtkSmartPointer cv::viz::vtkCocoaRenderWindowInteract { return vtkSmartPointer::New(); } - -#endif From 6fb75c677b9ed1c1e2907c418224c9fdfa06a94d Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 21 Oct 2016 18:19:15 +0300 Subject: [PATCH 68/96] viz: update for VTK6.2+ PCL PR 1205 --- modules/viz/src/vtk/vtkCocoaInteractorFix.mm | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/modules/viz/src/vtk/vtkCocoaInteractorFix.mm b/modules/viz/src/vtk/vtkCocoaInteractorFix.mm index dad41b073e..99e3c0d1a7 100644 --- a/modules/viz/src/vtk/vtkCocoaInteractorFix.mm +++ b/modules/viz/src/vtk/vtkCocoaInteractorFix.mm @@ -50,6 +50,13 @@ #include #include +namespace cv { namespace viz { + vtkSmartPointer vtkCocoaRenderWindowInteractorNew(); +}} // namespace + +#if ((VTK_MAJOR_VERSION < 6) || ((VTK_MAJOR_VERSION == 6) && (VTK_MINOR_VERSION < 2))) + + //---------------------------------------------------------------------------- @interface vtkCocoaServerFix : NSObject { @@ -175,8 +182,6 @@ namespace cv { namespace viz }; vtkStandardNewMacro (vtkCocoaRenderWindowInteractorFix) - - vtkSmartPointer vtkCocoaRenderWindowInteractorNew(); }} void cv::viz::vtkCocoaRenderWindowInteractorFix::Start () @@ -209,3 +214,13 @@ vtkSmartPointer cv::viz::vtkCocoaRenderWindowInteract { return vtkSmartPointer::New(); } + + +#else + +vtkSmartPointer cv::viz::vtkCocoaRenderWindowInteractorNew() +{ + return vtkSmartPointer::New(); +} + +#endif From 11b642fb8cc342f9f4e33ab0cf8f1383dba5da5d Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 21 Oct 2016 18:22:07 +0300 Subject: [PATCH 69/96] viz: eliminate warnings from tutorial code --- samples/cpp/tutorial_code/viz/creating_widgets.cpp | 2 +- samples/cpp/tutorial_code/viz/launching_viz.cpp | 2 +- samples/cpp/tutorial_code/viz/transformations.cpp | 4 ++-- samples/cpp/tutorial_code/viz/widget_pose.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/cpp/tutorial_code/viz/creating_widgets.cpp b/samples/cpp/tutorial_code/viz/creating_widgets.cpp index 9ee6c54364..db6fb489a0 100644 --- a/samples/cpp/tutorial_code/viz/creating_widgets.cpp +++ b/samples/cpp/tutorial_code/viz/creating_widgets.cpp @@ -24,7 +24,7 @@ using namespace std; * @function help * @brief Display instructions to use this tutorial program */ -void help() +static void help() { cout << "--------------------------------------------------------------------------" << endl diff --git a/samples/cpp/tutorial_code/viz/launching_viz.cpp b/samples/cpp/tutorial_code/viz/launching_viz.cpp index 55a3ddee2c..4cc90febfb 100644 --- a/samples/cpp/tutorial_code/viz/launching_viz.cpp +++ b/samples/cpp/tutorial_code/viz/launching_viz.cpp @@ -14,7 +14,7 @@ using namespace std; * @function help * @brief Display instructions to use this tutorial program */ -void help() +static void help() { cout << "--------------------------------------------------------------------------" << endl diff --git a/samples/cpp/tutorial_code/viz/transformations.cpp b/samples/cpp/tutorial_code/viz/transformations.cpp index d8713fddc1..fe26c4ebee 100644 --- a/samples/cpp/tutorial_code/viz/transformations.cpp +++ b/samples/cpp/tutorial_code/viz/transformations.cpp @@ -15,7 +15,7 @@ using namespace std; * @function help * @brief Display instructions to use this tutorial program */ -void help() +static void help() { cout << "--------------------------------------------------------------------------" << endl @@ -31,7 +31,7 @@ void help() * @function cvcloud_load * @brief load bunny.ply */ -Mat cvcloud_load() +static Mat cvcloud_load() { Mat cloud(1, 1889, CV_32FC3); ifstream ifs("bunny.ply"); diff --git a/samples/cpp/tutorial_code/viz/widget_pose.cpp b/samples/cpp/tutorial_code/viz/widget_pose.cpp index 3ecead8d93..d36f4fe376 100644 --- a/samples/cpp/tutorial_code/viz/widget_pose.cpp +++ b/samples/cpp/tutorial_code/viz/widget_pose.cpp @@ -15,7 +15,7 @@ using namespace std; * @function help * @brief Display instructions to use this tutorial program */ -void help() +static void help() { cout << "--------------------------------------------------------------------------" << endl From e878b60dbcd3116b7ab6bd456d29228655bcdb00 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 15 Nov 2016 18:55:23 +0300 Subject: [PATCH 70/96] core: drop type/dims/rows/cols information in Mat::release() --- modules/core/include/opencv2/core/mat.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index 631c698081..bebe2262b2 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -368,6 +368,16 @@ inline void Mat::release() data = datastart = dataend = datalimit = 0; for(int i = 0; i < dims; i++) size.p[i] = 0; +#ifdef _DEBUG + flags = MAGIC_VAL; + dims = rows = cols = 0; + if (step.p != step.buf) + { + fastFree(step.p); + step.p = step.buf; + size.p = &rows; + } +#endif refcount = 0; } From 56ed8b172137cd737c393cd0d5978922c822a310 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 15 Nov 2016 22:25:42 +0300 Subject: [PATCH 71/96] calib3d: fix fisheye for test fisheyeTest.stereoCalibrateFixIntrinsic --- modules/calib3d/src/fisheye.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/calib3d/src/fisheye.cpp b/modules/calib3d/src/fisheye.cpp index 9882cd8792..a2f117b028 100644 --- a/modules/calib3d/src/fisheye.cpp +++ b/modules/calib3d/src/fisheye.cpp @@ -1028,8 +1028,10 @@ double cv::fisheye::stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayO int a = cv::countNonZero(intrinsicLeft.isEstimate); int b = cv::countNonZero(intrinsicRight.isEstimate); cv::Mat deltas = J2_inv * J.t() * e; - intrinsicLeft = intrinsicLeft + deltas.rowRange(0, a); - intrinsicRight = intrinsicRight + deltas.rowRange(a, a + b); + if (a > 0) + intrinsicLeft = intrinsicLeft + deltas.rowRange(0, a); + if (b > 0) + intrinsicRight = intrinsicRight + deltas.rowRange(a, a + b); omcur = omcur + cv::Vec3d(deltas.rowRange(a + b, a + b + 3)); Tcur = Tcur + cv::Vec3d(deltas.rowRange(a + b + 3, a + b + 6)); for (int image_idx = 0; image_idx < n_images; ++image_idx) From 90da5933165c4bc1b5cc91547bb5123a01478cfd Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 25 Nov 2016 16:16:25 +0300 Subject: [PATCH 72/96] highgui: g_thread_create deprecated warning --- modules/highgui/src/window_gtk.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index bb692249c0..cfdf3e82a9 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -480,9 +480,13 @@ CV_IMPL int cvStartWindowThread(){ // conditional that indicates a key has been pressed cond_have_key = g_cond_new(); +#if !GLIB_CHECK_VERSION(2, 32, 0) // this is the window update thread window_thread = g_thread_create((GThreadFunc) icvWindowThreadLoop, NULL, TRUE, NULL); +#else + window_thread = g_thread_new("OpenCV window update", (GThreadFunc)icvWindowThreadLoop, NULL); +#endif } thread_started = window_thread!=NULL; return thread_started; From e5041abe550c3c4c6dcb3208b8b6bb987089fd39 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sun, 27 Nov 2016 20:42:39 +0300 Subject: [PATCH 73/96] cmake: remove outdated pkg-config module --- CMakeLists.txt | 4 - cmake/OpenCVFindPkgConfig.cmake | 365 -------------------------------- cmake/OpenCVUtils.cmake | 7 + 3 files changed, 7 insertions(+), 369 deletions(-) delete mode 100644 cmake/OpenCVFindPkgConfig.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 91a6462012..2dd3668348 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -445,10 +445,6 @@ endif(WIN32 AND NOT MINGW) # CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC.. # ---------------------------------------------------------------------------- if(UNIX) - include(cmake/OpenCVFindPkgConfig.cmake OPTIONAL) - include(CheckFunctionExists) - include(CheckIncludeFile) - if(NOT APPLE) CHECK_INCLUDE_FILE(pthread.h HAVE_LIBPTHREAD) if(ANDROID) diff --git a/cmake/OpenCVFindPkgConfig.cmake b/cmake/OpenCVFindPkgConfig.cmake deleted file mode 100644 index 7e439fd8dc..0000000000 --- a/cmake/OpenCVFindPkgConfig.cmake +++ /dev/null @@ -1,365 +0,0 @@ -# -# OpenCV note: the file has been extracted from CMake 2.6.2 distribution. -# It is used to build OpenCV with CMake 2.4.x -# - -# - a pkg-config module for CMake -# -# Usage: -# pkg_check_modules( [REQUIRED] []*) -# checks for all the given modules -# -# pkg_search_module( [REQUIRED] []*) -# checks for given modules and uses the first working one -# -# When the 'REQUIRED' argument was set, macros will fail with an error -# when module(s) could not be found -# -# It sets the following variables: -# PKG_CONFIG_FOUND ... true if pkg-config works on the system -# PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program -# _FOUND ... set to 1 if module(s) exist -# -# For the following variables two sets of values exist; first one is the -# common one and has the given PREFIX. The second set contains flags -# which are given out when pkgconfig was called with the '--static' -# option. -# _LIBRARIES ... only the libraries (w/o the '-l') -# _LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') -# _LDFLAGS ... all required linker flags -# _LDFLAGS_OTHER ... all other linker flags -# _INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') -# _CFLAGS ... all required cflags -# _CFLAGS_OTHER ... the other compiler flags -# -# = for common case -# = _STATIC for static linking -# -# There are some special variables whose prefix depends on the count -# of given modules. When there is only one module, stays -# unchanged. When there are multiple modules, the prefix will be -# changed to _: -# _VERSION ... version of the module -# _PREFIX ... prefix-directory of the module -# _INCLUDEDIR ... include-dir of the module -# _LIBDIR ... lib-dir of the module -# -# = when |MODULES| == 1, else -# = _ -# -# A parameter can have the following formats: -# {MODNAME} ... matches any version -# {MODNAME}>={VERSION} ... at least version is required -# {MODNAME}={VERSION} ... exactly version is required -# {MODNAME}<={VERSION} ... modules must not be newer than -# -# Examples -# pkg_check_modules (GLIB2 glib-2.0) -# -# pkg_check_modules (GLIB2 glib-2.0>=2.10) -# requires at least version 2.10 of glib2 and defines e.g. -# GLIB2_VERSION=2.10.3 -# -# pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0) -# requires both glib2 and gtk2, and defines e.g. -# FOO_glib-2.0_VERSION=2.10.3 -# FOO_gtk+-2.0_VERSION=2.8.20 -# -# pkg_check_modules (XRENDER REQUIRED xrender) -# defines e.g.: -# XRENDER_LIBRARIES=Xrender;X11 -# XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp -# -# pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2) - - -# Copyright (C) 2006 Enrico Scholz -# -# Redistribution and use, with or without modification, are permitted -# provided that the following conditions are met: -# -# 1. Redistributions must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. The name of the author may not be used to endorse or promote -# products derived from this software without specific prior -# written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER -# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -### Common stuff #### -set(PKG_CONFIG_VERSION 1) -set(PKG_CONFIG_FOUND 0) - -find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable") -mark_as_advanced(PKG_CONFIG_EXECUTABLE) - -if(PKG_CONFIG_EXECUTABLE) - set(PKG_CONFIG_FOUND 1) -endif(PKG_CONFIG_EXECUTABLE) - - -# Unsets the given variables -macro(_pkgconfig_unset var) - set(${var} "" CACHE INTERNAL "") -endmacro(_pkgconfig_unset) - -macro(_pkgconfig_set var value) - set(${var} ${value} CACHE INTERNAL "") -endmacro(_pkgconfig_set) - -# Invokes pkgconfig, cleans up the result and sets variables -macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp) - set(_pkgconfig_invoke_result) - - execute_process( - COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist} - OUTPUT_VARIABLE _pkgconfig_invoke_result - RESULT_VARIABLE _pkgconfig_failed) - - if (_pkgconfig_failed) - set(_pkgconfig_${_varname} "") - _pkgconfig_unset(${_prefix}_${_varname}) - else(_pkgconfig_failed) - string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") - string(REGEX REPLACE " +$" "" _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") - - if (NOT ${_regexp} STREQUAL "") - string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") - endif(NOT ${_regexp} STREQUAL "") - - separate_arguments(_pkgconfig_invoke_result) - - #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}") - set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result}) - _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}") - endif(_pkgconfig_failed) -endmacro(_pkgconfig_invoke) - -# Invokes pkgconfig two times; once without '--static' and once with -# '--static' -macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp) - _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) - _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN}) -endmacro(_pkgconfig_invoke_dyn) - -# Splits given arguments into options and a package list -macro(_pkgconfig_parse_options _result _is_req) - set(${_is_req} 0) - - foreach(_pkg ${ARGN}) - if (_pkg STREQUAL "REQUIRED") - set(${_is_req} 1) - endif (_pkg STREQUAL "REQUIRED") - endforeach(_pkg ${ARGN}) - - set(${_result} ${ARGN}) - list(REMOVE_ITEM ${_result} "REQUIRED") -endmacro(_pkgconfig_parse_options) - -### -macro(_pkg_check_modules_internal _is_required _is_silent _prefix) - _pkgconfig_unset(${_prefix}_FOUND) - _pkgconfig_unset(${_prefix}_VERSION) - _pkgconfig_unset(${_prefix}_PREFIX) - _pkgconfig_unset(${_prefix}_INCLUDEDIR) - _pkgconfig_unset(${_prefix}_LIBDIR) - _pkgconfig_unset(${_prefix}_LIBS) - _pkgconfig_unset(${_prefix}_LIBS_L) - _pkgconfig_unset(${_prefix}_LIBS_PATHS) - _pkgconfig_unset(${_prefix}_LIBS_OTHER) - _pkgconfig_unset(${_prefix}_CFLAGS) - _pkgconfig_unset(${_prefix}_CFLAGS_I) - _pkgconfig_unset(${_prefix}_CFLAGS_OTHER) - _pkgconfig_unset(${_prefix}_STATIC_LIBDIR) - _pkgconfig_unset(${_prefix}_STATIC_LIBS) - _pkgconfig_unset(${_prefix}_STATIC_LIBS_L) - _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS) - _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER) - _pkgconfig_unset(${_prefix}_STATIC_CFLAGS) - _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I) - _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER) - - # create a better addressable variable of the modules and calculate its size - set(_pkg_check_modules_list ${ARGN}) - list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt) - - if(PKG_CONFIG_EXECUTABLE) - # give out status message telling checked module - if (NOT ${_is_silent}) - if (_pkg_check_modules_cnt EQUAL 1) - message(STATUS "checking for module '${_pkg_check_modules_list}'") - else(_pkg_check_modules_cnt EQUAL 1) - message(STATUS "checking for modules '${_pkg_check_modules_list}'") - endif(_pkg_check_modules_cnt EQUAL 1) - endif(NOT ${_is_silent}) - - set(_pkg_check_modules_packages) - set(_pkg_check_modules_failed) - - # iterate through module list and check whether they exist and match the required version - foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list}) - set(_pkg_check_modules_exist_query) - - # check whether version is given - if (_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") - string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") - string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _pkg_check_modules_pkg_op "${_pkg_check_modules_pkg}") - string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _pkg_check_modules_pkg_ver "${_pkg_check_modules_pkg}") - else(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") - set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") - set(_pkg_check_modules_pkg_op) - set(_pkg_check_modules_pkg_ver) - endif(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") - - # handle the operands - if (_pkg_check_modules_pkg_op STREQUAL ">=") - list(APPEND _pkg_check_modules_exist_query --atleast-version) - endif(_pkg_check_modules_pkg_op STREQUAL ">=") - - if (_pkg_check_modules_pkg_op STREQUAL "=") - list(APPEND _pkg_check_modules_exist_query --exact-version) - endif(_pkg_check_modules_pkg_op STREQUAL "=") - - if (_pkg_check_modules_pkg_op STREQUAL "<=") - list(APPEND _pkg_check_modules_exist_query --max-version) - endif(_pkg_check_modules_pkg_op STREQUAL "<=") - - # create the final query which is of the format: - # * --atleast-version - # * --exact-version - # * --max-version - # * --exists - if (_pkg_check_modules_pkg_op) - list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_ver}") - else(_pkg_check_modules_pkg_op) - list(APPEND _pkg_check_modules_exist_query --exists) - endif(_pkg_check_modules_pkg_op) - - _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION) - _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX) - _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR) - _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR) - - list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}") - list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}") - - # execute the query - execute_process( - COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query} - RESULT_VARIABLE _pkgconfig_retval) - - # evaluate result and tell failures - if (_pkgconfig_retval) - if(NOT ${_is_silent}) - message(STATUS " package '${_pkg_check_modules_pkg}' not found") - endif(NOT ${_is_silent}) - - set(_pkg_check_modules_failed 1) - endif(_pkgconfig_retval) - endforeach(_pkg_check_modules_pkg) - - if(_pkg_check_modules_failed) - # fail when requested - if (${_is_required}) - message(SEND_ERROR "A required package was not found") - endif (${_is_required}) - else(_pkg_check_modules_failed) - # when we are here, we checked whether requested modules - # exist. Now, go through them and set variables - - _pkgconfig_set(${_prefix}_FOUND 1) - list(LENGTH _pkg_check_modules_packages pkg_count) - - # iterate through all modules again and set individual variables - foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages}) - # handle case when there is only one package required - if (pkg_count EQUAL 1) - set(_pkg_check_prefix "${_prefix}") - else(pkg_count EQUAL 1) - set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}") - endif(pkg_count EQUAL 1) - - _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion ) - _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" PREFIX "" --variable=prefix ) - _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" INCLUDEDIR "" --variable=includedir ) - _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" LIBDIR "" --variable=libdir ) - - message(STATUS " found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}") - endforeach(_pkg_check_modules_pkg) - - # set variables which are combined for multiple modules - _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l ) - _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L ) - _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs ) - _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other ) - - _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I ) - _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags ) - _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other ) - endif(_pkg_check_modules_failed) - else(PKG_CONFIG_EXECUTABLE) - if (${_is_required}) - message(SEND_ERROR "pkg-config tool not found") - endif (${_is_required}) - endif(PKG_CONFIG_EXECUTABLE) -endmacro(_pkg_check_modules_internal) - -### -### User visible macros start here -### - -### -macro(pkg_check_modules _prefix _module0) - # check cached value - if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) - _pkgconfig_parse_options (_pkg_modules _pkg_is_required "${_module0}" ${ARGN}) - _pkg_check_modules_internal("${_pkg_is_required}" 0 "${_prefix}" ${_pkg_modules}) - - _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) - endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) -endmacro(pkg_check_modules) - -### -macro(pkg_search_module _prefix _module0) - # check cached value - if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) - set(_pkg_modules_found 0) - _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required "${_module0}" ${ARGN}) - - message(STATUS "checking for one of the modules '${_pkg_modules_alt}'") - - # iterate through all modules and stop at the first working one. - foreach(_pkg_alt ${_pkg_modules_alt}) - if(NOT _pkg_modules_found) - _pkg_check_modules_internal(0 1 "${_prefix}" "${_pkg_alt}") - endif(NOT _pkg_modules_found) - - if (${_prefix}_FOUND) - set(_pkg_modules_found 1) - endif(${_prefix}_FOUND) - endforeach(_pkg_alt) - - if (NOT ${_prefix}_FOUND) - if(${_pkg_is_required}) - message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found") - endif(${_pkg_is_required}) - endif(NOT ${_prefix}_FOUND) - - _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) - endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION} OR NOT ${_prefix}_FOUND) -endmacro(pkg_search_module) - -### Local Variables: -### mode: cmake -### End: diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index 0241c43c1c..9797ff3ec0 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -1,3 +1,10 @@ +include(CheckFunctionExists) +include(CheckIncludeFile) + +if(UNIX) + find_package(PkgConfig) +endif() + # Search packages for host system instead of packages for target system # in case of cross compilation thess macro should be defined by toolchain file if(NOT COMMAND find_host_package) From 36d7712c2c4906af43be108c8581648ceed1ec04 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sun, 27 Nov 2016 21:15:40 +0300 Subject: [PATCH 74/96] cmake: CMakeVars.txt (for debugging purpose) --- CMakeLists.txt | 3 +++ cmake/OpenCVUtils.cmake | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 91a6462012..41f1d25bb4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1107,3 +1107,6 @@ endif() # ---------------------------------------------------------------------------- include(cmake/OpenCVPackaging.cmake) + +# This should be the last command +ocv_cmake_dump_vars("" TOFILE "CMakeVars.txt") diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index 0241c43c1c..ce2cfaea8a 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -11,6 +11,37 @@ if(NOT COMMAND find_host_program) endmacro() endif() +if(NOT COMMAND cmake_parse_arguments) + include(CMakeParseArguments OPTIONAL) # CMake 2.8.3+ +endif() + +# Debugging function +function(ocv_cmake_dump_vars) + set(VARS "") + get_cmake_property(_variableNames VARIABLES) + if(COMMAND cmake_parse_arguments222) + cmake_parse_arguments(DUMP "" "TOFILE" "" ${ARGN}) + set(regex "${DUMP_UNPARSED_ARGUMENTS}") + else() + set(regex "${ARGV0}") + if(ARGV1 STREQUAL "TOFILE") + set(DUMP_TOFILE "${ARGV2}") + endif() + endif() + string(TOLOWER "${regex}" regex_lower) + foreach(_variableName ${_variableNames}) + string(TOLOWER "${_variableName}" _variableName_lower) + if(_variableName MATCHES "${regex}" OR _variableName_lower MATCHES "${regex_lower}") + set(VARS "${VARS}${_variableName}=${${_variableName}}\n") + endif() + endforeach() + if(DUMP_TOFILE) + file(WRITE ${CMAKE_BINARY_DIR}/${DUMP_TOFILE} "${VARS}") + else() + message(AUTHOR_WARNING "${VARS}") + endif() +endfunction() + # assert macro # Note: it doesn't support lists in arguments # Usage samples: From 5ac15f09ed96c57cfecbfc1b7b5ca3102f5b58a2 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 15 Jan 2016 14:03:48 +0300 Subject: [PATCH 75/96] cmake: add DEBUG_PRE/DEBUG_POST commands handling Useful for debug purposes: cmake -DDEBUG_POST="ocv_cmake_dump_vars(CUDA)" . cmake -DCMAKE_PRE="ocv_cmake_dump_vars(\"OPENCL|opencl\")" . --- CMakeLists.txt | 3 +++ cmake/OpenCVUtils.cmake | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 41f1d25bb4..fe43ce03b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,8 @@ endif() include(cmake/OpenCVUtils.cmake) +ocv_cmake_eval(DEBUG_PRE ONCE) + ocv_clear_vars(OpenCVModules_TARGETS) # ---------------------------------------------------------------------------- @@ -1110,3 +1112,4 @@ include(cmake/OpenCVPackaging.cmake) # This should be the last command ocv_cmake_dump_vars("" TOFILE "CMakeVars.txt") +ocv_cmake_eval(DEBUG_POST ONCE) diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index ce2cfaea8a..093e8b7858 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -42,6 +42,16 @@ function(ocv_cmake_dump_vars) endif() endfunction() +function(ocv_cmake_eval var_name) + if(DEFINED ${var_name}) + file(WRITE "${CMAKE_BINARY_DIR}/CMakeCommand-${var_name}.cmake" ${${var_name}}) + include("${CMAKE_BINARY_DIR}/CMakeCommand-${var_name}.cmake") + endif() + if(";${ARGN};" MATCHES ";ONCE;") + unset(${var_name} CACHE) + endif() +endfunction() + # assert macro # Note: it doesn't support lists in arguments # Usage samples: From 32f568308a9022419aa6e1c4cb0c6989b9ab559e Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sun, 27 Nov 2016 23:31:04 +0300 Subject: [PATCH 76/96] cmake: cleanup ffmpeg detection --- 3rdparty/ffmpeg/ffmpeg_version.cmake | 22 ++++---- CMakeLists.txt | 15 +++--- cmake/OpenCVFindLibsVideo.cmake | 72 ++++++++----------------- cmake/OpenCVUtils.cmake | 38 +++++++++++++ cmake/checks/ffmpeg_test.cpp | 24 +++++++++ cmake/templates/cvconfig.h.in | 6 --- modules/highgui/src/cap_ffmpeg_impl.hpp | 3 ++ 7 files changed, 104 insertions(+), 76 deletions(-) create mode 100644 cmake/checks/ffmpeg_test.cpp diff --git a/3rdparty/ffmpeg/ffmpeg_version.cmake b/3rdparty/ffmpeg/ffmpeg_version.cmake index 48fba2b913..56fb31c80c 100644 --- a/3rdparty/ffmpeg/ffmpeg_version.cmake +++ b/3rdparty/ffmpeg/ffmpeg_version.cmake @@ -1,13 +1,11 @@ -set(HAVE_FFMPEG 1) -set(HAVE_FFMPEG_CODEC 1) -set(HAVE_FFMPEG_FORMAT 1) -set(HAVE_FFMPEG_UTIL 1) -set(HAVE_FFMPEG_SWSCALE 1) -set(HAVE_FFMPEG_RESAMPLE 0) -set(HAVE_GENTOO_FFMPEG 1) +set(FFMPEG_libavcodec_FOUND 1) +set(FFMPEG_libavformat_FOUND 1) +set(FFMPEG_libavutil_FOUND 1) +set(FFMPEG_libswscale_FOUND 1) +set(FFMPEG_libavresample_FOUND 1) -set(ALIASOF_libavcodec_VERSION 55.18.102) -set(ALIASOF_libavformat_VERSION 55.12.100) -set(ALIASOF_libavutil_VERSION 52.38.100) -set(ALIASOF_libswscale_VERSION 2.3.100) -set(ALIASOF_libavresample_VERSION 1.0.1) \ No newline at end of file +set(FFMPEG_libavcodec_VERSION 55.18.102) +set(FFMPEG_libavformat_VERSION 55.12.100) +set(FFMPEG_libavutil_VERSION 52.38.100) +set(FFMPEG_libswscale_VERSION 2.3.100) +set(FFMPEG_libavresample_VERSION 1.0.1) diff --git a/CMakeLists.txt b/CMakeLists.txt index 91a6462012..c58e520791 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -882,19 +882,18 @@ if(ANDROID) endif() endif() -if(DEFINED WITH_FFMPEG) +if(DEFINED WITH_FFMPEG OR HAVE_FFMPEG) if(WIN32) status(" FFMPEG:" WITH_FFMPEG THEN "YES (prebuilt binaries)" ELSE NO) else() status(" FFMPEG:" HAVE_FFMPEG THEN YES ELSE NO) endif() - status(" codec:" HAVE_FFMPEG_CODEC THEN "YES (ver ${ALIASOF_libavcodec_VERSION})" ELSE NO) - status(" format:" HAVE_FFMPEG_FORMAT THEN "YES (ver ${ALIASOF_libavformat_VERSION})" ELSE NO) - status(" util:" HAVE_FFMPEG_UTIL THEN "YES (ver ${ALIASOF_libavutil_VERSION})" ELSE NO) - status(" swscale:" HAVE_FFMPEG_SWSCALE THEN "YES (ver ${ALIASOF_libswscale_VERSION})" ELSE NO) - status(" resample:" HAVE_FFMPEG_RESAMPLE THEN "YES (ver ${ALIASOF_libavresample_VERSION})" ELSE NO) - status(" gentoo-style:" HAVE_GENTOO_FFMPEG THEN YES ELSE NO) -endif(DEFINED WITH_FFMPEG) + status(" avcodec:" FFMPEG_libavcodec_FOUND THEN "YES (ver ${FFMPEG_libavcodec_VERSION})" ELSE NO) + status(" avformat:" FFMPEG_libavformat_FOUND THEN "YES (ver ${FFMPEG_libavformat_VERSION})" ELSE NO) + status(" avutil:" FFMPEG_libavutil_FOUND THEN "YES (ver ${FFMPEG_libavutil_VERSION})" ELSE NO) + status(" swscale:" FFMPEG_libswscale_FOUND THEN "YES (ver ${FFMPEG_libswscale_VERSION})" ELSE NO) + status(" avresample:" FFMPEG_libavresample_FOUND THEN "YES (ver ${FFMPEG_libavresample_VERSION})" ELSE NO) +endif() if(DEFINED WITH_GSTREAMER) status(" GStreamer:" HAVE_GSTREAMER THEN "" ELSE NO) diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake index 5430759f39..cadc74eb74 100644 --- a/cmake/OpenCVFindLibsVideo.cmake +++ b/cmake/OpenCVFindLibsVideo.cmake @@ -190,63 +190,35 @@ if(WITH_XIMEA) endif(WITH_XIMEA) # --- FFMPEG --- -ocv_clear_vars(HAVE_FFMPEG HAVE_FFMPEG_CODEC HAVE_FFMPEG_FORMAT HAVE_FFMPEG_UTIL HAVE_FFMPEG_SWSCALE HAVE_FFMPEG_RESAMPLE HAVE_GENTOO_FFMPEG HAVE_FFMPEG_FFMPEG) +ocv_clear_vars(HAVE_FFMPEG) if(WITH_FFMPEG) if(WIN32 AND NOT ARM) include("${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg_version.cmake") - elseif(UNIX) - CHECK_MODULE(libavcodec HAVE_FFMPEG_CODEC) - CHECK_MODULE(libavformat HAVE_FFMPEG_FORMAT) - CHECK_MODULE(libavutil HAVE_FFMPEG_UTIL) - CHECK_MODULE(libswscale HAVE_FFMPEG_SWSCALE) - CHECK_MODULE(libavresample HAVE_FFMPEG_RESAMPLE) - - CHECK_INCLUDE_FILE(libavformat/avformat.h HAVE_GENTOO_FFMPEG) - CHECK_INCLUDE_FILE(ffmpeg/avformat.h HAVE_FFMPEG_FFMPEG) - if(NOT HAVE_GENTOO_FFMPEG AND NOT HAVE_FFMPEG_FFMPEG) - if(EXISTS /usr/include/ffmpeg/libavformat/avformat.h OR HAVE_FFMPEG_SWSCALE) - set(HAVE_GENTOO_FFMPEG TRUE) - endif() + set(HAVE_FFMPEG TRUE) + elseif(PKG_CONFIG_FOUND) + ocv_check_modules(FFMPEG libavcodec libavformat libavutil libswscale) + ocv_check_modules(FFMPEG_libavresample libavresample) + if(FFMPEG_libavresample_FOUND) + ocv_append_build_options(FFMPEG FFMPEG_libavresample) endif() - if(HAVE_FFMPEG_CODEC AND HAVE_FFMPEG_FORMAT AND HAVE_FFMPEG_UTIL AND HAVE_FFMPEG_SWSCALE) - set(HAVE_FFMPEG TRUE) - endif() - if(HAVE_FFMPEG) - # Find the bzip2 library because it is required on some systems - FIND_LIBRARY(BZIP2_LIBRARIES NAMES bz2 bzip2) - if(NOT BZIP2_LIBRARIES) - # Do an other trial - FIND_FILE(BZIP2_LIBRARIES NAMES libbz2.so.1 PATHS /lib) + try_compile(__VALID_FFMPEG + "${OpenCV_BINARY_DIR}" + "${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp" + CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}" + "-DLINK_DIRECTORIES:STRING=${FFMPEG_LIBRARY_DIRS}" + "-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}" + OUTPUT_VARIABLE TRY_OUT + ) + if(NOT __VALID_FFMPEG) + #message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}") + message(STATUS "WARNING: Can't build ffmpeg test code") + else() + ocv_append_build_options(HIGHGUI FFMPEG) endif() - else() - find_path(FFMPEG_INCLUDE_DIR "libavformat/avformat.h" - PATHS /usr/local /usr /opt - PATH_SUFFIXES include - DOC "The path to FFMPEG headers") - if(FFMPEG_INCLUDE_DIR) - set(HAVE_GENTOO_FFMPEG TRUE) - set(FFMPEG_LIB_DIR "${FFMPEG_INCLUDE_DIR}/../lib" CACHE PATH "Full path of FFMPEG library directory") - find_library(FFMPEG_CODEC_LIB "avcodec" HINTS "${FFMPEG_LIB_DIR}") - find_library(FFMPEG_FORMAT_LIB "avformat" HINTS "${FFMPEG_LIB_DIR}") - find_library(FFMPEG_UTIL_LIB "avutil" HINTS "${FFMPEG_LIB_DIR}") - find_library(FFMPEG_SWSCALE_LIB "swscale" HINTS "${FFMPEG_LIB_DIR}") - if(FFMPEG_CODEC_LIB AND FFMPEG_FORMAT_LIB AND - FFMPEG_UTIL_LIB AND FFMPEG_SWSCALE_LIB) - set(ALIASOF_libavcodec_VERSION "Unknown") - set(ALIASOF_libavformat_VERSION "Unknown") - set(ALIASOF_libavutil_VERSION "Unknown") - set(ALIASOF_libswscale_VERSION "Unknown") - set(HAVE_FFMPEG 1) - endif() - endif(FFMPEG_INCLUDE_DIR) - if(HAVE_FFMPEG) - set(HIGHGUI_LIBRARIES ${HIGHGUI_LIBRARIES} - ${FFMPEG_CODEC_LIB} ${FFMPEG_FORMAT_LIB} - ${FFMPEG_UTIL_LIB} ${FFMPEG_SWSCALE_LIB}) - ocv_include_directories(${FFMPEG_INCLUDE_DIR}) - endif(HAVE_FFMPEG) endif() + else() + message(STATUS "Can't find ffmpeg - 'pkg-config' utility is missing") endif() endif(WITH_FFMPEG) diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index 0241c43c1c..bf62628df7 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -230,6 +230,44 @@ macro(OCV_OPTION variable description value) unset(__value) endmacro() +# Usage: ocv_append_build_options(HIGHGUI FFMPEG) +macro(ocv_append_build_options var_prefix pkg_prefix) + foreach(suffix INCLUDE_DIRS LIBRARIES LIBRARY_DIRS) + if(${pkg_prefix}_${suffix}) + list(APPEND ${var_prefix}_${suffix} ${${pkg_prefix}_${suffix}}) + list(REMOVE_DUPLICATES ${var_prefix}_${suffix}) + endif() + endforeach() +endmacro() + +# Usage is similar to CMake 'pkg_check_modules' command +# It additionally controls HAVE_${define} and ${define}_${modname}_FOUND variables +macro(ocv_check_modules define) + unset(HAVE_${define}) + foreach(m ${ARGN}) + if (m MATCHES "(.*[^><])(>=|=|<=)(.*)") + set(__modname "${CMAKE_MATCH_1}") + else() + set(__modname "${m}") + endif() + unset(${define}_${__modname}_FOUND) + endforeach() + pkg_check_modules(${define} ${ARGN}) + if(${define}_FOUND) + set(HAVE_${define} 1) + endif() + foreach(m ${ARGN}) + if (m MATCHES "(.*[^><])(>=|=|<=)(.*)") + set(__modname "${CMAKE_MATCH_1}") + else() + set(__modname "${m}") + endif() + if(NOT DEFINED ${define}_${__modname}_FOUND AND ${define}_FOUND) + set(${define}_${__modname}_FOUND 1) + endif() + endforeach() +endmacro() + # Macros that checks if module have been installed. # After it adds module to build and define diff --git a/cmake/checks/ffmpeg_test.cpp b/cmake/checks/ffmpeg_test.cpp new file mode 100644 index 0000000000..7b49c38c7a --- /dev/null +++ b/cmake/checks/ffmpeg_test.cpp @@ -0,0 +1,24 @@ +#include + +extern "C" { +#include +#include +#include +} + +#define CALC_FFMPEG_VERSION(a,b,c) ( a<<16 | b<<8 | c ) + +static void test() +{ + AVFormatContext* c = 0; + AVCodec* avcodec = 0; + AVFrame* frame = 0; + +#if LIBAVFORMAT_BUILD >= CALC_FFMPEG_VERSION(52, 111, 0) + int err = avformat_open_input(&c, "", NULL, NULL); +#else + int err = av_open_input_file(&c, "", NULL, 0, NULL); +#endif +} + +int main() { test(); return 0; } diff --git a/cmake/templates/cvconfig.h.in b/cmake/templates/cvconfig.h.in index caea7da3e7..c2277babb6 100644 --- a/cmake/templates/cvconfig.h.in +++ b/cmake/templates/cvconfig.h.in @@ -61,12 +61,6 @@ /* FFMpeg video library */ #cmakedefine HAVE_FFMPEG -/* ffmpeg's libswscale */ -#cmakedefine HAVE_FFMPEG_SWSCALE - -/* ffmpeg in Gentoo */ -#cmakedefine HAVE_GENTOO_FFMPEG - /* GStreamer multimedia framework */ #cmakedefine HAVE_GSTREAMER diff --git a/modules/highgui/src/cap_ffmpeg_impl.hpp b/modules/highgui/src/cap_ffmpeg_impl.hpp index a934faaa91..24b51c7d28 100644 --- a/modules/highgui/src/cap_ffmpeg_impl.hpp +++ b/modules/highgui/src/cap_ffmpeg_impl.hpp @@ -40,6 +40,9 @@ // //M*/ +#define HAVE_FFMPEG_SWSCALE +#define HAVE_GENTOO_FFMPEG + #include "cap_ffmpeg_api.hpp" #include #include From 2d28bb41711365c98c8b4b7f60ad979d292b376f Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 29 Nov 2016 00:54:15 +0300 Subject: [PATCH 77/96] ipp: disable compilation with IPP 9+ --- cmake/OpenCVFindIPP.cmake | 17 ++++++++--------- modules/core/include/opencv2/core/internal.hpp | 4 ++++ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/cmake/OpenCVFindIPP.cmake b/cmake/OpenCVFindIPP.cmake index db02e6acbf..a944b84979 100644 --- a/cmake/OpenCVFindIPP.cmake +++ b/cmake/OpenCVFindIPP.cmake @@ -85,8 +85,6 @@ function(get_ipp_version _ROOT_DIR) message(STATUS "found IPP: ${_MAJOR}.${_MINOR}.${_BUILD} [${_VERSION_STR}]") message(STATUS "at: ${_ROOT_DIR}") - return() - endfunction() @@ -129,8 +127,6 @@ function(set_ipp_old_libraries) ${IPP_LIB_PREFIX}${IPP_PREFIX}${IPPCORE}${IPP_ARCH}${IPP_SUFFIX}${IPP_LIB_SUFFIX} PARENT_SCOPE) - return() - endfunction() @@ -173,7 +169,6 @@ function(set_ipp_new_libraries _LATEST_VERSION) ${IPP_LIB_PREFIX}svml${CMAKE_SHARED_LIBRARY_SUFFIX}) endif() set(IPP_LIBRARIES ${IPP_LIBRARIES} PARENT_SCOPE) - return() endfunction() @@ -208,7 +203,7 @@ function(set_ipp_variables _LATEST_VERSION) set(IPP_LIBRARIES ${IPP_LIBRARIES} PARENT_SCOPE) message(STATUS "IPP libs: ${IPP_LIBRARIES}") - else() + elseif(${_LATEST_VERSION} VERSION_LESS "9.0") # message(STATUS "new") # set INCLUDE and LIB folders @@ -229,7 +224,10 @@ function(set_ipp_variables _LATEST_VERSION) endif() if (UNIX) - get_filename_component(INTEL_COMPILER_LIBRARY_DIR ${IPP_ROOT_DIR}/../lib REALPATH) + get_filename_component(INTEL_COMPILER_LIBRARY_DIR ${IPP_ROOT_DIR}/../compiler/lib REALPATH) + if(NOT EXISTS "${INTEL_COMPILER_LIBRARY_DIR}") + get_filename_component(INTEL_COMPILER_LIBRARY_DIR ${IPP_ROOT_DIR}/../lib REALPATH) + endif() if (IPP_X64) if(NOT EXISTS ${INTEL_COMPILER_LIBRARY_DIR}/intel64) message(SEND_ERROR "Intel compiler EM64T libraries not found") @@ -253,10 +251,11 @@ function(set_ipp_variables _LATEST_VERSION) set(IPP_LIBRARIES ${IPP_LIBRARIES} PARENT_SCOPE) message(STATUS "IPP libs: ${IPP_LIBRARIES}") + else() + message(STATUS "IPP: version ${_LATEST_VERSION} is not supported (${IPP_ROOT_DIR})") + set(IPP_FOUND 0 PARENT_SCOPE) endif() - return() - endfunction() diff --git a/modules/core/include/opencv2/core/internal.hpp b/modules/core/include/opencv2/core/internal.hpp index 4933654735..4ebc3a03ab 100644 --- a/modules/core/include/opencv2/core/internal.hpp +++ b/modules/core/include/opencv2/core/internal.hpp @@ -104,6 +104,10 @@ CV_INLINE IppiSize ippiSize(const cv::Size & _size) return size; } +#if IPP_VERSION_MAJOR >= 9 // IPP 9+ is not supported +#undef HAVE_IPP +#undef IPP_VERSION_MAJOR +#endif #endif #ifndef IPPI_CALL From d42d155c16ffd532edd89f3810c563539b654959 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 6 Dec 2016 17:42:00 +0300 Subject: [PATCH 78/96] java: fix PATH environment variable --- modules/java/test/build.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/java/test/build.xml b/modules/java/test/build.xml index dac4d4b455..6d7430634f 100644 --- a/modules/java/test/build.xml +++ b/modules/java/test/build.xml @@ -1,4 +1,5 @@ + @@ -39,7 +40,7 @@ - + From a05444618c6888e9e5c0f6ffd24c79f9ee12fb8f Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 10 Nov 2016 15:39:18 +0300 Subject: [PATCH 79/96] test: tvl1 test check update --- modules/video/test/test_tvl1optflow.cpp | 37 +++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/modules/video/test/test_tvl1optflow.cpp b/modules/video/test/test_tvl1optflow.cpp index 67dc7fe973..bf7e835df3 100644 --- a/modules/video/test/test_tvl1optflow.cpp +++ b/modules/video/test/test_tvl1optflow.cpp @@ -115,35 +115,39 @@ namespace return !cvIsNaN(u.x) && !cvIsNaN(u.y) && (fabs(u.x) < 1e9) && (fabs(u.y) < 1e9); } - double calcRMSE(const Mat_& flow1, const Mat_& flow2) + void check(const Mat_& gold, const Mat_& flow, double threshold = 0.1, double expectedAccuracy = 0.95) { - double sum = 0.0; - int counter = 0; + threshold = threshold*threshold; - for (int i = 0; i < flow1.rows; ++i) + size_t gold_counter = 0; + size_t valid_counter = 0; + + for (int i = 0; i < gold.rows; ++i) { - for (int j = 0; j < flow1.cols; ++j) + for (int j = 0; j < gold.cols; ++j) { - const Point2f u1 = flow1(i, j); - const Point2f u2 = flow2(i, j); + const Point2f u1 = gold(i, j); + const Point2f u2 = flow(i, j); - if (isFlowCorrect(u1) && isFlowCorrect(u2)) + if (isFlowCorrect(u1)) { - const Point2f diff = u1 - u2; - sum += diff.ddot(diff); - ++counter; + gold_counter++; + if (isFlowCorrect(u2)) + { + const Point2f diff = u1 - u2; + double err = diff.ddot(diff); + if (err <= threshold) + valid_counter++; + } } } } - - return sqrt(sum / (1e-9 + counter)); + EXPECT_GE(valid_counter, expectedAccuracy * gold_counter); } } TEST(Video_calcOpticalFlowDual_TVL1, Regression) { - const double MAX_RMSE = 0.02; - const string frame1_path = TS::ptr()->get_data_path() + "optflow/RubberWhale1.png"; const string frame2_path = TS::ptr()->get_data_path() + "optflow/RubberWhale2.png"; const string gold_flow_path = TS::ptr()->get_data_path() + "optflow/tvl1_flow.flo"; @@ -167,7 +171,6 @@ TEST(Video_calcOpticalFlowDual_TVL1, Regression) ASSERT_EQ(gold.rows, flow.rows); ASSERT_EQ(gold.cols, flow.cols); - const double err = calcRMSE(gold, flow); - EXPECT_LE(err, MAX_RMSE); + check(gold, flow); #endif } From 10d1b33a808f298a0ae0740968145df3179c2ce2 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 10 Nov 2016 15:41:44 +0300 Subject: [PATCH 80/96] perf: remove tvl1 check for magic numbers, reduce number of samples --- modules/video/perf/perf_tvl1optflow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/video/perf/perf_tvl1optflow.cpp b/modules/video/perf/perf_tvl1optflow.cpp index 36f16d9943..4895ff455e 100644 --- a/modules/video/perf/perf_tvl1optflow.cpp +++ b/modules/video/perf/perf_tvl1optflow.cpp @@ -24,7 +24,7 @@ PERF_TEST_P(ImagePair, OpticalFlowDual_TVL1, testing::Values(impair("cv/optflow/ Ptr tvl1 = createOptFlow_DualTVL1(); - TEST_CYCLE_N(10) tvl1->calc(frame1, frame2, flow); + TEST_CYCLE() tvl1->calc(frame1, frame2, flow); - SANITY_CHECK(flow, 0.5); + SANITY_CHECK_NOTHING(); } From ab260dafd22c54221c925c64f5cc168f9906f1fe Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Thu, 1 Dec 2016 16:41:21 +0300 Subject: [PATCH 81/96] Fixed Intel C++ 17 build in VS2015 --- 3rdparty/openexr/CMakeLists.txt | 5 +++++ cmake/OpenCVDetectCXXCompiler.cmake | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt index dddf3738c4..194d46f28a 100644 --- a/3rdparty/openexr/CMakeLists.txt +++ b/3rdparty/openexr/CMakeLists.txt @@ -49,6 +49,11 @@ if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") endif() +if(MSVC AND CV_ICC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qrestrict") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qrestrict") +endif() + add_library(IlmImf STATIC ${lib_hdrs} ${lib_srcs}) target_link_libraries(IlmImf ${ZLIB_LIBRARIES}) diff --git a/cmake/OpenCVDetectCXXCompiler.cmake b/cmake/OpenCVDetectCXXCompiler.cmake index b53f8d7363..a2c427c9ed 100644 --- a/cmake/OpenCVDetectCXXCompiler.cmake +++ b/cmake/OpenCVDetectCXXCompiler.cmake @@ -38,7 +38,7 @@ if(UNIX) endif() endif() -if(MSVC AND CMAKE_C_COMPILER MATCHES "icc") +if(MSVC AND CMAKE_C_COMPILER MATCHES "icc|icl") set(CV_ICC __INTEL_COMPILER_FOR_WINDOWS) endif() From c6af179afc4e4edc558e31af765caf8da22956b6 Mon Sep 17 00:00:00 2001 From: Patrik Huber Date: Tue, 6 Dec 2016 00:04:24 +0000 Subject: [PATCH 82/96] Added VS2017 support (MSVC 1910) --- cmake/OpenCVConfig.cmake | 2 ++ cmake/OpenCVDetectCXXCompiler.cmake | 2 ++ 2 files changed, 4 insertions(+) diff --git a/cmake/OpenCVConfig.cmake b/cmake/OpenCVConfig.cmake index e2ce60f9fd..9069a72936 100644 --- a/cmake/OpenCVConfig.cmake +++ b/cmake/OpenCVConfig.cmake @@ -81,6 +81,8 @@ if(MSVC) set(OpenCV_RUNTIME vc12) elseif(MSVC_VERSION EQUAL 1900) set(OpenCV_RUNTIME vc14) + elseif(MSVC_VERSION EQUAL 1910) + set(OpenCV_RUNTIME vc15) endif() elseif(MINGW) set(OpenCV_RUNTIME mingw) diff --git a/cmake/OpenCVDetectCXXCompiler.cmake b/cmake/OpenCVDetectCXXCompiler.cmake index b53f8d7363..87f955c8d4 100644 --- a/cmake/OpenCVDetectCXXCompiler.cmake +++ b/cmake/OpenCVDetectCXXCompiler.cmake @@ -138,6 +138,8 @@ if(MSVC) set(OpenCV_RUNTIME vc12) elseif(MSVC_VERSION EQUAL 1900) set(OpenCV_RUNTIME vc14) + elseif(MSVC_VERSION EQUAL 1910) + set(OpenCV_RUNTIME vc15) endif() elseif(MINGW) set(OpenCV_RUNTIME mingw) From 21f3531b17017fd5559ced15e5c41ee2e8635517 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 7 Dec 2016 19:27:19 +0300 Subject: [PATCH 83/96] core: fix inplace support in mulSpectrums --- modules/core/src/dxt.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index 90eb392f58..b94f65a1e9 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -1905,6 +1905,12 @@ void cv::mulSpectrums( InputArray _srcA, InputArray _srcB, _dst.create( srcA.rows, srcA.cols, type ); Mat dst = _dst.getMat(); + // correct inplace support + if (dst.data == srcA.data) + srcA = srcA.clone(); + if (dst.data == srcB.data) + srcB = srcB.clone(); + bool is_1d = (flags & DFT_ROWS) || (rows == 1 || (cols == 1 && srcA.isContinuous() && srcB.isContinuous() && dst.isContinuous())); From ab429d2e73f5f683e7cb989468f158a52d835d6e Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 7 Dec 2016 19:55:40 +0300 Subject: [PATCH 84/96] test: fix inplace in 'mulComplex' from test_dxt --- modules/core/test/test_dxt.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/modules/core/test/test_dxt.cpp b/modules/core/test/test_dxt.cpp index 2aaabbf0f8..1b2995a541 100644 --- a/modules/core/test/test_dxt.cpp +++ b/modules/core/test/test_dxt.cpp @@ -419,9 +419,6 @@ static void fixCCS( Mat& mat, int cols, int flags ) } } -#if defined _MSC_VER && _MSC_VER >= 1700 -#pragma optimize("", off) -#endif static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags ) { dst.create(src1.rows, src1.cols, src1.type()); @@ -430,12 +427,27 @@ static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags ) CV_Assert( src1.size == src2.size && src1.type() == src2.type() && (src1.type() == CV_32FC2 || src1.type() == CV_64FC2) ); + const Mat* src1_ = &src1; + Mat src1_tmp; + if (dst.data == src1.data) + { + src1_tmp = src1.clone(); + src1_ = &src1_tmp; + } + const Mat* src2_ = &src2; + Mat src2_tmp; + if (dst.data == src2.data) + { + src2_tmp = src2.clone(); + src2_ = &src2_tmp; + } + for( i = 0; i < dst.rows; i++ ) { if( depth == CV_32F ) { - const float* a = src1.ptr(i); - const float* b = src2.ptr(i); + const float* a = src1_->ptr(i); + const float* b = src2_->ptr(i); float* c = dst.ptr(i); if( !(flags & CV_DXT_MUL_CONJ) ) @@ -459,8 +471,8 @@ static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags ) } else { - const double* a = src1.ptr(i); - const double* b = src2.ptr(i); + const double* a = src1_->ptr(i); + const double* b = src2_->ptr(i); double* c = dst.ptr(i); if( !(flags & CV_DXT_MUL_CONJ) ) @@ -484,9 +496,6 @@ static void mulComplex( const Mat& src1, const Mat& src2, Mat& dst, int flags ) } } } -#if defined _MSC_VER && _MSC_VER >= 1700 -#pragma optimize("", on) -#endif } From 62c9ff25e59a32a740751bcbd1577565ab23bab7 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 7 Dec 2016 19:59:16 +0300 Subject: [PATCH 85/96] core: added inplace check in 'divSpectrums' --- modules/imgproc/src/phasecorr.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/imgproc/src/phasecorr.cpp b/modules/imgproc/src/phasecorr.cpp index 87e4d3080e..48d19fa3c1 100644 --- a/modules/imgproc/src/phasecorr.cpp +++ b/modules/imgproc/src/phasecorr.cpp @@ -167,6 +167,9 @@ static void divSpectrums( InputArray _srcA, InputArray _srcB, OutputArray _dst, _dst.create( srcA.rows, srcA.cols, type ); Mat dst = _dst.getMat(); + CV_Assert(dst.data != srcA.data); // non-inplace check + CV_Assert(dst.data != srcB.data); // non-inplace check + bool is_1d = (flags & DFT_ROWS) || (rows == 1 || (cols == 1 && srcA.isContinuous() && srcB.isContinuous() && dst.isContinuous())); From 6946f510fe134b55989cf0268b6cbfad6ea6d2e4 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 8 Dec 2016 13:20:38 +0300 Subject: [PATCH 86/96] mulSpectrums: refactor code --- modules/core/src/dxt.cpp | 271 ++++++++++++++++++++------------------- 1 file changed, 138 insertions(+), 133 deletions(-) diff --git a/modules/core/src/dxt.cpp b/modules/core/src/dxt.cpp index b94f65a1e9..ea587b1870 100644 --- a/modules/core/src/dxt.cpp +++ b/modules/core/src/dxt.cpp @@ -1891,13 +1891,131 @@ void cv::idft( InputArray src, OutputArray dst, int flags, int nonzero_rows ) dft( src, dst, flags | DFT_INVERSE, nonzero_rows ); } +namespace { + +#define VAL(buf, elem) (((T*)((char*)data ## buf + (step ## buf * (elem))))[0]) +#define MUL_SPECTRUMS_COL(A, B, C) \ + VAL(C, 0) = VAL(A, 0) * VAL(B, 0); \ + for (size_t j = 1; j <= rows - 2; j += 2) \ + { \ + double a_re = VAL(A, j), a_im = VAL(A, j + 1); \ + double b_re = VAL(B, j), b_im = VAL(B, j + 1); \ + if (conjB) b_im = -b_im; \ + double c_re = a_re * b_re - a_im * b_im; \ + double c_im = a_re * b_im + a_im * b_re; \ + VAL(C, j) = (T)c_re; VAL(C, j + 1) = (T)c_im; \ + } \ + if ((rows & 1) == 0) \ + VAL(C, rows-1) = VAL(A, rows-1) * VAL(B, rows-1) + +template static inline +void mulSpectrums_processCol_noinplace(const T* dataA, const T* dataB, T* dataC, size_t stepA, size_t stepB, size_t stepC, size_t rows) +{ + MUL_SPECTRUMS_COL(A, B, C); +} + +template static inline +void mulSpectrums_processCol_inplaceA(const T* dataB, T* dataAC, size_t stepB, size_t stepAC, size_t rows) +{ + MUL_SPECTRUMS_COL(AC, B, AC); +} +template static inline +void mulSpectrums_processCol(const T* dataA, const T* dataB, T* dataC, size_t stepA, size_t stepB, size_t stepC, size_t rows) +{ + if (inplaceA) + mulSpectrums_processCol_inplaceA(dataB, dataC, stepB, stepC, rows); + else + mulSpectrums_processCol_noinplace(dataA, dataB, dataC, stepA, stepB, stepC, rows); +} +#undef MUL_SPECTRUMS_COL +#undef VAL + +template static inline +void mulSpectrums_processCols(const T* dataA, const T* dataB, T* dataC, size_t stepA, size_t stepB, size_t stepC, size_t rows, size_t cols) +{ + mulSpectrums_processCol(dataA, dataB, dataC, stepA, stepB, stepC, rows); + if ((cols & 1) == 0) + { + mulSpectrums_processCol(dataA + cols - 1, dataB + cols - 1, dataC + cols - 1, stepA, stepB, stepC, rows); + } +} + +#define VAL(buf, elem) (data ## buf[(elem)]) +#define MUL_SPECTRUMS_ROW(A, B, C) \ + for (size_t j = j0; j < j1; j += 2) \ + { \ + double a_re = VAL(A, j), a_im = VAL(A, j + 1); \ + double b_re = VAL(B, j), b_im = VAL(B, j + 1); \ + if (conjB) b_im = -b_im; \ + double c_re = a_re * b_re - a_im * b_im; \ + double c_im = a_re * b_im + a_im * b_re; \ + VAL(C, j) = (T)c_re; VAL(C, j + 1) = (T)c_im; \ + } +template static inline +void mulSpectrums_processRow_noinplace(const T* dataA, const T* dataB, T* dataC, size_t j0, size_t j1) +{ + MUL_SPECTRUMS_ROW(A, B, C); +} +template static inline +void mulSpectrums_processRow_inplaceA(const T* dataB, T* dataAC, size_t j0, size_t j1) +{ + MUL_SPECTRUMS_ROW(AC, B, AC); +} +template static inline +void mulSpectrums_processRow(const T* dataA, const T* dataB, T* dataC, size_t j0, size_t j1) +{ + if (inplaceA) + mulSpectrums_processRow_inplaceA(dataB, dataC, j0, j1); + else + mulSpectrums_processRow_noinplace(dataA, dataB, dataC, j0, j1); +} +#undef MUL_SPECTRUMS_ROW +#undef VAL + +template static inline +void mulSpectrums_processRows(const T* dataA, const T* dataB, T* dataC, size_t stepA, size_t stepB, size_t stepC, size_t rows, size_t cols, size_t j0, size_t j1, bool is_1d_CN1) +{ + while (rows-- > 0) + { + if (is_1d_CN1) + dataC[0] = dataA[0]*dataB[0]; + mulSpectrums_processRow(dataA, dataB, dataC, j0, j1); + if (is_1d_CN1 && (cols & 1) == 0) + dataC[j1] = dataA[j1]*dataB[j1]; + + dataA = (const T*)(((char*)dataA) + stepA); + dataB = (const T*)(((char*)dataB) + stepB); + dataC = (T*)(((char*)dataC) + stepC); + } +} + + +template static inline +void mulSpectrums_Impl_(const T* dataA, const T* dataB, T* dataC, size_t stepA, size_t stepB, size_t stepC, size_t rows, size_t cols, size_t j0, size_t j1, bool is_1d, bool isCN1) +{ + if (!is_1d && isCN1) + { + mulSpectrums_processCols(dataA, dataB, dataC, stepA, stepB, stepC, rows, cols); + } + mulSpectrums_processRows(dataA, dataB, dataC, stepA, stepB, stepC, rows, cols, j0, j1, is_1d && isCN1); +} +template static inline +void mulSpectrums_Impl(const T* dataA, const T* dataB, T* dataC, size_t stepA, size_t stepB, size_t stepC, size_t rows, size_t cols, size_t j0, size_t j1, bool is_1d, bool isCN1) +{ + if (dataA == dataC) + mulSpectrums_Impl_(dataA, dataB, dataC, stepA, stepB, stepC, rows, cols, j0, j1, is_1d, isCN1); + else + mulSpectrums_Impl_(dataA, dataB, dataC, stepA, stepB, stepC, rows, cols, j0, j1, is_1d, isCN1); +} + +} // namespace + void cv::mulSpectrums( InputArray _srcA, InputArray _srcB, OutputArray _dst, int flags, bool conjB ) { Mat srcA = _srcA.getMat(), srcB = _srcB.getMat(); int depth = srcA.depth(), cn = srcA.channels(), type = srcA.type(); - int rows = srcA.rows, cols = srcA.cols; - int j, k; + size_t rows = srcA.rows, cols = srcA.cols; CV_Assert( type == srcB.type() && srcA.size() == srcB.size() ); CV_Assert( type == CV_32FC1 || type == CV_32FC2 || type == CV_64FC1 || type == CV_64FC2 ); @@ -1906,154 +2024,41 @@ void cv::mulSpectrums( InputArray _srcA, InputArray _srcB, Mat dst = _dst.getMat(); // correct inplace support - if (dst.data == srcA.data) - srcA = srcA.clone(); + // Case 'dst.data == srcA.data' is handled by implementation, + // because it is used frequently (filter2D, matchTemplate) if (dst.data == srcB.data) - srcB = srcB.clone(); + srcB = srcB.clone(); // workaround for B only - bool is_1d = (flags & DFT_ROWS) || (rows == 1 || (cols == 1 && - srcA.isContinuous() && srcB.isContinuous() && dst.isContinuous())); + bool is_1d = (flags & DFT_ROWS) + || (rows == 1) + || (cols == 1 && srcA.isContinuous() && srcB.isContinuous() && dst.isContinuous()); if( is_1d && !(flags & DFT_ROWS) ) cols = cols + rows - 1, rows = 1; - int ncols = cols*cn; - int j0 = cn == 1; - int j1 = ncols - (cols % 2 == 0 && cn == 1); + bool isCN1 = cn == 1; + size_t j0 = isCN1 ? 1 : 0; + size_t j1 = cols*cn - (((cols & 1) == 0 && cn == 1) ? 1 : 0); - if( depth == CV_32F ) + if (depth == CV_32F) { const float* dataA = (const float*)srcA.data; const float* dataB = (const float*)srcB.data; float* dataC = (float*)dst.data; - - size_t stepA = srcA.step/sizeof(dataA[0]); - size_t stepB = srcB.step/sizeof(dataB[0]); - size_t stepC = dst.step/sizeof(dataC[0]); - - if( !is_1d && cn == 1 ) - { - for( k = 0; k < (cols % 2 ? 1 : 2); k++ ) - { - if( k == 1 ) - dataA += cols - 1, dataB += cols - 1, dataC += cols - 1; - dataC[0] = dataA[0]*dataB[0]; - if( rows % 2 == 0 ) - dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA]*dataB[(rows-1)*stepB]; - if( !conjB ) - for( j = 1; j <= rows - 2; j += 2 ) - { - double re = (double)dataA[j*stepA]*dataB[j*stepB] - - (double)dataA[(j+1)*stepA]*dataB[(j+1)*stepB]; - double im = (double)dataA[j*stepA]*dataB[(j+1)*stepB] + - (double)dataA[(j+1)*stepA]*dataB[j*stepB]; - dataC[j*stepC] = (float)re; dataC[(j+1)*stepC] = (float)im; - } - else - for( j = 1; j <= rows - 2; j += 2 ) - { - double re = (double)dataA[j*stepA]*dataB[j*stepB] + - (double)dataA[(j+1)*stepA]*dataB[(j+1)*stepB]; - double im = (double)dataA[(j+1)*stepA]*dataB[j*stepB] - - (double)dataA[j*stepA]*dataB[(j+1)*stepB]; - dataC[j*stepC] = (float)re; dataC[(j+1)*stepC] = (float)im; - } - if( k == 1 ) - dataA -= cols - 1, dataB -= cols - 1, dataC -= cols - 1; - } - } - - for( ; rows--; dataA += stepA, dataB += stepB, dataC += stepC ) - { - if( is_1d && cn == 1 ) - { - dataC[0] = dataA[0]*dataB[0]; - if( cols % 2 == 0 ) - dataC[j1] = dataA[j1]*dataB[j1]; - } - - if( !conjB ) - for( j = j0; j < j1; j += 2 ) - { - double re = (double)dataA[j]*dataB[j] - (double)dataA[j+1]*dataB[j+1]; - double im = (double)dataA[j+1]*dataB[j] + (double)dataA[j]*dataB[j+1]; - dataC[j] = (float)re; dataC[j+1] = (float)im; - } - else - for( j = j0; j < j1; j += 2 ) - { - double re = (double)dataA[j]*dataB[j] + (double)dataA[j+1]*dataB[j+1]; - double im = (double)dataA[j+1]*dataB[j] - (double)dataA[j]*dataB[j+1]; - dataC[j] = (float)re; dataC[j+1] = (float)im; - } - } + if (!conjB) + mulSpectrums_Impl(dataA, dataB, dataC, srcA.step, srcB.step, dst.step, rows, cols, j0, j1, is_1d, isCN1); + else + mulSpectrums_Impl(dataA, dataB, dataC, srcA.step, srcB.step, dst.step, rows, cols, j0, j1, is_1d, isCN1); } else { const double* dataA = (const double*)srcA.data; const double* dataB = (const double*)srcB.data; double* dataC = (double*)dst.data; - - size_t stepA = srcA.step/sizeof(dataA[0]); - size_t stepB = srcB.step/sizeof(dataB[0]); - size_t stepC = dst.step/sizeof(dataC[0]); - - if( !is_1d && cn == 1 ) - { - for( k = 0; k < (cols % 2 ? 1 : 2); k++ ) - { - if( k == 1 ) - dataA += cols - 1, dataB += cols - 1, dataC += cols - 1; - dataC[0] = dataA[0]*dataB[0]; - if( rows % 2 == 0 ) - dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA]*dataB[(rows-1)*stepB]; - if( !conjB ) - for( j = 1; j <= rows - 2; j += 2 ) - { - double re = dataA[j*stepA]*dataB[j*stepB] - - dataA[(j+1)*stepA]*dataB[(j+1)*stepB]; - double im = dataA[j*stepA]*dataB[(j+1)*stepB] + - dataA[(j+1)*stepA]*dataB[j*stepB]; - dataC[j*stepC] = re; dataC[(j+1)*stepC] = im; - } - else - for( j = 1; j <= rows - 2; j += 2 ) - { - double re = dataA[j*stepA]*dataB[j*stepB] + - dataA[(j+1)*stepA]*dataB[(j+1)*stepB]; - double im = dataA[(j+1)*stepA]*dataB[j*stepB] - - dataA[j*stepA]*dataB[(j+1)*stepB]; - dataC[j*stepC] = re; dataC[(j+1)*stepC] = im; - } - if( k == 1 ) - dataA -= cols - 1, dataB -= cols - 1, dataC -= cols - 1; - } - } - - for( ; rows--; dataA += stepA, dataB += stepB, dataC += stepC ) - { - if( is_1d && cn == 1 ) - { - dataC[0] = dataA[0]*dataB[0]; - if( cols % 2 == 0 ) - dataC[j1] = dataA[j1]*dataB[j1]; - } - - if( !conjB ) - for( j = j0; j < j1; j += 2 ) - { - double re = dataA[j]*dataB[j] - dataA[j+1]*dataB[j+1]; - double im = dataA[j+1]*dataB[j] + dataA[j]*dataB[j+1]; - dataC[j] = re; dataC[j+1] = im; - } - else - for( j = j0; j < j1; j += 2 ) - { - double re = dataA[j]*dataB[j] + dataA[j+1]*dataB[j+1]; - double im = dataA[j+1]*dataB[j] - dataA[j]*dataB[j+1]; - dataC[j] = re; dataC[j+1] = im; - } - } + if (!conjB) + mulSpectrums_Impl(dataA, dataB, dataC, srcA.step, srcB.step, dst.step, rows, cols, j0, j1, is_1d, isCN1); + else + mulSpectrums_Impl(dataA, dataB, dataC, srcA.step, srcB.step, dst.step, rows, cols, j0, j1, is_1d, isCN1); } } From 26fbaada0a4d3b9d1013cd5515c9e0dc413d0a2a Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 8 Dec 2016 18:02:57 +0300 Subject: [PATCH 87/96] cmake: disable warning C4127 for MSVS < 2015 --- cmake/OpenCVCompilerOptions.cmake | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 57d142eb0b..06992c2de0 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -341,8 +341,13 @@ if(MSVC) string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") - if(NOT ENABLE_NOISY_WARNINGS AND MSVC_VERSION EQUAL 1400) - ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4510 /wd4610 /wd4312 /wd4201 /wd4244 /wd4328 /wd4267) + if(NOT ENABLE_NOISY_WARNINGS) + if(MSVC_VERSION EQUAL 1400) + ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4510 /wd4610 /wd4312 /wd4201 /wd4244 /wd4328 /wd4267) + endif() + if(MSVC_VERSION LESS 1900) # MSVS2015 + ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127) # warning C4127: conditional expression is constant + endif() endif() # allow extern "C" functions throw exceptions From 7bceef715c9d14353b134a42e236bd2782d9e511 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sat, 10 Dec 2016 15:53:57 +0300 Subject: [PATCH 88/96] test: fix mulSpectrums error tolerance --- modules/core/test/test_dxt.cpp | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/modules/core/test/test_dxt.cpp b/modules/core/test/test_dxt.cpp index 1b2995a541..dad12ce1d0 100644 --- a/modules/core/test/test_dxt.cpp +++ b/modules/core/test/test_dxt.cpp @@ -787,9 +787,7 @@ public: protected: void run_func(); void prepare_to_validation( int test_case_idx ); -#if defined(__aarch64__) && defined(NDEBUG) double get_success_error_level( int test_case_idx, int i, int j ); -#endif }; @@ -797,31 +795,19 @@ CxCore_MulSpectrumsTest::CxCore_MulSpectrumsTest() : CxCore_DXTBaseTest( true, t { } -#if defined(__aarch64__) && defined(NDEBUG) double CxCore_MulSpectrumsTest::get_success_error_level( int test_case_idx, int i, int j ) { + (void)test_case_idx; + CV_Assert(i == OUTPUT); + CV_Assert(j == 0); int elem_depth = CV_MAT_DEPTH(cvGetElemType(test_array[i][j])); - if( elem_depth <= CV_32F ) - { - return ArrayTest::get_success_error_level( test_case_idx, i, j ); - } - switch( test_case_idx ) - { - // Usual threshold is too strict for these test cases due to the difference of fmsub and fsub - case 399: - case 420: - return DBL_EPSILON * 20000; - case 65: - case 161: - case 287: - case 351: - case 458: - return DBL_EPSILON * 10000; - default: - return ArrayTest::get_success_error_level( test_case_idx, i, j ); - } + CV_Assert(elem_depth == CV_32F || elem_depth == CV_64F); + + element_wise_relative_error = false; + double maxInputValue = 1000; // ArrayTest::get_minmax_bounds + double err = 8 * maxInputValue; // result = A*B + C*D + return (elem_depth == CV_32F ? FLT_EPSILON : DBL_EPSILON) * err; } -#endif void CxCore_MulSpectrumsTest::run_func() { From ffcf866e2f64397bc25dc609e1b2765b474b6784 Mon Sep 17 00:00:00 2001 From: bedbad Date: Mon, 12 Dec 2016 14:29:53 -0500 Subject: [PATCH 89/96] Merge pull request #7754 from LAZI-2240:toupstream2.4 Introducing boundingRect2f() (#7754) * Introducing boundingRect2f to return exact bounding float rectangle for RotatedRect * Introducing boundingRect2f to return exact bounding float rectangle for RotatedRect * Introducing boundingRect2f() - update * Introducing boundingRect2f to return exact bounding float rectangle for RotatedRect * Introducing boundingRect2f() - update - tested --- modules/core/include/opencv2/core/core.hpp | 4 +++- modules/core/src/matrix.cpp | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 591d50ade6..0e8091a54d 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -910,8 +910,10 @@ public: //! returns 4 vertices of the rectangle void points(Point2f pts[]) const; - //! returns the minimal up-right rectangle containing the rotated rectangle + //! returns the minimal up-right integer rectangle containing the rotated rectangle Rect boundingRect() const; + //! returns the minimal (exact) floating point rectangle containing the rotated rectangle, not intended for use with images + Rect_ boundingRect2f() const; //! conversion to the old-style CvBox2D structure operator CvBox2D() const; diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 57abffc3ca..aee377f665 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -4277,6 +4277,16 @@ Rect RotatedRect::boundingRect() const return r; } + +Rect_ RotatedRect::boundingRect2f() const +{ + Point2f pt[4]; + points(pt); + Rect_ r(Point_(min(min(min(pt[0].x, pt[1].x), pt[2].x), pt[3].x), min(min(min(pt[0].y, pt[1].y), pt[2].y), pt[3].y)), + Point_(max(max(max(pt[0].x, pt[1].x), pt[2].x), pt[3].x), max(max(max(pt[0].y, pt[1].y), pt[2].y), pt[3].y))); + return r; +} + } /* End of file. */ From 7241b90dec00d673c8f348abd8a50bde4161daea Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 9 Dec 2016 20:03:05 +0300 Subject: [PATCH 90/96] cmake: special target to build/install docs only --- CMakeLists.txt | 14 ++++++++------ doc/CMakeLists.txt | 14 +++++++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c6c8adb3d1..3f2ceb9184 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -278,12 +278,14 @@ if (ANDROID) endif() endif() -if(ANDROID OR WIN32) - set(OPENCV_DOC_INSTALL_PATH doc) -elseif(INSTALL_TO_MANGLED_PATHS) - set(OPENCV_DOC_INSTALL_PATH share/OpenCV-${OPENCV_VERSION}/doc) -else() - set(OPENCV_DOC_INSTALL_PATH share/OpenCV/doc) +if(NOT DEFINED OPENCV_DOC_INSTALL_PATH) + if(ANDROID OR WIN32) + set(OPENCV_DOC_INSTALL_PATH doc) + elseif(INSTALL_TO_MANGLED_PATHS) + set(OPENCV_DOC_INSTALL_PATH share/OpenCV-${OPENCV_VERSION}/doc) + else() + set(OPENCV_DOC_INSTALL_PATH share/OpenCV/doc) + endif() endif() if(WIN32) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 29d5a0a1e1..ebb3855740 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -49,7 +49,7 @@ if(BUILD_DOCS AND HAVE_SPHINX) function(ocv_doc_add_file_to_fake_root source destination) add_custom_command( OUTPUT "${DOC_FAKE_ROOT}/${destination}" - COMMAND "${CMAKE_COMMAND}" -E copy "${source}" "${DOC_FAKE_ROOT}/${destination}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${source}" "${DOC_FAKE_ROOT}/${destination}" DEPENDS "${source}" COMMENT "Copying ${destination} to fake root..." VERBATIM @@ -184,4 +184,16 @@ if(HAVE_DOC_GENERATOR) foreach(f ${OPTIONAL_DOC_LIST}) install(FILES "${f}" DESTINATION "${OPENCV_DOC_INSTALL_PATH}" OPTIONAL COMPONENT docs) endforeach() + + # Alias to build/install docs only + set(__deps "") + foreach(target docs html_docs doxygen) + if(TARGET ${target}) + list(APPEND __deps ${target}) + endif() + endforeach() + add_custom_target(install_docs + DEPENDS ${__deps} + COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=docs -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" + ) endif(HAVE_DOC_GENERATOR) From 03beff06ff5824b35707b7f878766cd9317a596c Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 7 Dec 2016 12:44:31 +0300 Subject: [PATCH 91/96] build: disable warnings (Ubuntu 16.04 + CUDA 8.0) Examples: - NPP_staging.cu:1606:105: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - NCVHaarObjectDetection.hpp:95:37: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] --- modules/gpu/CMakeLists.txt | 2 +- modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/gpu/CMakeLists.txt b/modules/gpu/CMakeLists.txt index caec0efa5a..ce3c8fb2f2 100644 --- a/modules/gpu/CMakeLists.txt +++ b/modules/gpu/CMakeLists.txt @@ -29,7 +29,7 @@ if(HAVE_CUDA) source_group("Src\\NVidia" FILES ${ncv_files}) ocv_include_directories("src/nvidia" "src/nvidia/core" "src/nvidia/NPP_staging" ${CUDA_INCLUDE_DIRS}) - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations -Wshadow -Wunused-parameter /wd4211 /wd4201 /wd4100 /wd4505 /wd4408) + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations -Wshadow -Wunused-parameter -Wstrict-aliasing /wd4211 /wd4201 /wd4100 /wd4505 /wd4408) if(MSVC) if(NOT ENABLE_NOISY_WARNINGS) diff --git a/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp b/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp index 8436630d73..b63ba64760 100644 --- a/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp +++ b/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp @@ -59,6 +59,11 @@ #ifndef _ncvhaarobjectdetection_hpp_ #define _ncvhaarobjectdetection_hpp_ +#ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif + #include #include "NCV.hpp" @@ -458,5 +463,8 @@ NCV_EXPORTS NCVStatus ncvHaarStoreNVBIN_host(const std::string &filename, NCVVector &h_HaarFeatures); +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif #endif // _ncvhaarobjectdetection_hpp_ From d206e84a130057cf7b6e7537205c5a96b176ca65 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 24 Nov 2016 20:33:56 +0300 Subject: [PATCH 92/96] cmake: use -fp-model precise with ICC --- cmake/OpenCVCompilerOptions.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 06992c2de0..15523c68a8 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -97,6 +97,10 @@ if(BUILD_TINY_GPU_MODULE) add_definitions(-DOPENCV_TINY_GPU_MODULE) endif() +if(CV_ICC AND NOT ENABLE_FAST_MATH) + add_extra_compiler_option("-fp-model precise") +endif() + if(CMAKE_COMPILER_IS_GNUCXX) # High level of warnings. add_extra_compiler_option(-W) From 041502e42c7eb28fdbb821695204ed2dfe8730a0 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 7 Dec 2016 13:16:44 +0300 Subject: [PATCH 93/96] build: eliminate ICC warnings --- cmake/OpenCVCompilerOptions.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index 15523c68a8..5d41e75418 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -368,4 +368,10 @@ if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4589") # Constructor of abstract class ... ignores initializer for virtual base class 'cv::Algorithm' set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4359") # Alignment specifier is less than actual alignment (4), and will be ignored endif() + + if(CV_ICC AND NOT ENABLE_NOISY_WARNINGS) + foreach(flags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_DEBUG) + string(REGEX REPLACE "( |^)/W[0-9]+( |$)" "\\1\\2" ${flags} "${${flags}}") + endforeach() + endif() endif() From cc09f5a7de4147b461cccea15bb9d8d2270611c9 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 15 Dec 2016 18:09:44 +0200 Subject: [PATCH 94/96] Merge pull request #7854 from alalek:backports_2016 (2.4) Backports from master branch (#7854) --- 3rdparty/libjasper/CMakeLists.txt | 2 + 3rdparty/libjasper/jas_cm.c | 1 - 3rdparty/libjasper/jas_stream.c | 7 +- 3rdparty/libjpeg/CMakeLists.txt | 2 + 3rdparty/libpng/CMakeLists.txt | 2 + 3rdparty/libtiff/CMakeLists.txt | 2 + 3rdparty/openexr/CMakeLists.txt | 2 + 3rdparty/tbb/CMakeLists.txt | 2 + 3rdparty/zlib/CMakeLists.txt | 2 + apps/CMakeLists.txt | 1 + apps/haartraining/CMakeLists.txt | 2 + apps/traincascade/CMakeLists.txt | 2 + apps/version/CMakeLists.txt | 32 + apps/version/opencv_version.cpp | 28 + cmake/OpenCVModule.cmake | 3 + cmake/OpenCVUtils.cmake | 58 +- modules/calib3d/src/calibration.cpp | 6 +- modules/calib3d/src/fisheye.cpp | 6 + modules/contrib/src/basicretinafilter.cpp | 100 +- modules/contrib/src/basicretinafilter.hpp | 32 +- modules/contrib/src/imagelogpolprojection.cpp | 4 +- modules/contrib/src/magnoretinafilter.cpp | 20 +- modules/contrib/src/magnoretinafilter.hpp | 12 +- modules/contrib/src/parvoretinafilter.cpp | 10 +- modules/contrib/src/parvoretinafilter.hpp | 2 +- modules/contrib/src/retinacolor.cpp | 36 +- modules/contrib/src/retinacolor.hpp | 14 +- modules/contrib/src/retinafilter.cpp | 20 +- modules/contrib/src/stereovar.cpp | 12 +- modules/contrib/src/templatebuffer.hpp | 26 +- .../core/include/opencv2/core/internal.hpp | 2 +- modules/core/src/arithm.cpp | 8 + modules/core/src/drawing.cpp | 2 +- modules/core/test/test_countnonzero.cpp | 3 - modules/gpu/CMakeLists.txt | 2 + modules/highgui/src/cap_avfoundation_mac.mm | 2 - modules/highgui/src/cap_dc1394.cpp | 42 +- modules/highgui/src/grfmt_jpeg2000.cpp | 25 +- modules/java/CMakeLists.txt | 3 + .../src/java/android+JavaCameraView.java | 8 +- modules/ml/include/opencv2/ml/ml.hpp | 10 + modules/nonfree/src/surf_ocl.cpp | 6 +- modules/ocl/CMakeLists.txt | 2 +- modules/ocl/include/opencv2/ocl/ocl.hpp | 9 + modules/ocl/src/bgfg_mog.cpp | 1 - .../src/cl_runtime/cl_runtime_opencl_impl.hpp | 517 ++++++---- .../ocl/src/cl_runtime/clamdblas_runtime.cpp | 953 ++++++++++++------ .../ocl/src/cl_runtime/clamdfft_runtime.cpp | 381 ++++--- .../ocl/src/cl_runtime/generator/common.py | 47 +- modules/ocl/src/haar.cpp | 1 - modules/python/src2/cv2.cpp | 2 +- modules/python/src2/hdr_parser.py | 2 +- modules/stitching/CMakeLists.txt | 1 + .../include/opencv2/stitching/stitcher.hpp | 9 + modules/ts/include/opencv2/ts/ts_perf.hpp | 4 +- modules/ts/src/ts_gtest.cpp | 4 +- modules/video/test/test_tvl1optflow.cpp | 2 +- modules/viz/src/precomp.hpp | 2 +- modules/viz/src/vtk/vtkCloudMatSource.cpp | 2 +- samples/cpp/stitching_detailed.cpp | 11 +- samples/ocl/stereo_match.cpp | 1 - 61 files changed, 1546 insertions(+), 966 deletions(-) create mode 100644 apps/version/CMakeLists.txt create mode 100644 apps/version/opencv_version.cpp diff --git a/3rdparty/libjasper/CMakeLists.txt b/3rdparty/libjasper/CMakeLists.txt index 7b3dcb08a5..bd7d0abbf2 100644 --- a/3rdparty/libjasper/CMakeLists.txt +++ b/3rdparty/libjasper/CMakeLists.txt @@ -38,6 +38,8 @@ set_target_properties(${JASPER_LIBRARY} PROPERTIES OUTPUT_NAME ${JASPER_LIBRARY} DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME ${JASPER_LIBRARY} + COMPILE_PDB_NAME_DEBUG "${JASPER_LIBRARY}${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) diff --git a/3rdparty/libjasper/jas_cm.c b/3rdparty/libjasper/jas_cm.c index dc23ead895..16d4a502df 100644 --- a/3rdparty/libjasper/jas_cm.c +++ b/3rdparty/libjasper/jas_cm.c @@ -842,7 +842,6 @@ static int jas_cmshapmat_apply(jas_cmpxform_t *pxform, jas_cmreal_t *in, *dst++ = a2; } } else { -assert(0); while (--cnt >= 0) { a0 = *src++; src++; diff --git a/3rdparty/libjasper/jas_stream.c b/3rdparty/libjasper/jas_stream.c index ca1239c7d9..3ba7a837db 100644 --- a/3rdparty/libjasper/jas_stream.c +++ b/3rdparty/libjasper/jas_stream.c @@ -345,6 +345,7 @@ jas_stream_t *jas_stream_tmpfile() { jas_stream_t *stream; jas_stream_fileobj_t *obj; + char *tmpname; if (!(stream = jas_stream_create())) { return 0; @@ -365,10 +366,12 @@ jas_stream_t *jas_stream_tmpfile() #ifdef _WIN32 /* Choose a file name. */ - tmpnam(obj->pathname); + tmpname = tempnam(NULL, NULL); + strcpy(obj->pathname, tmpname); + free(tmpname); /* Open the underlying file. */ - if ((obj->fd = open(obj->pathname, O_CREAT | O_EXCL | O_RDWR | O_TRUNC | O_BINARY, + if ((obj->fd = open(obj->pathname, O_CREAT | O_EXCL | O_RDWR | O_TRUNC | O_BINARY | O_TEMPORARY | _O_SHORT_LIVED, JAS_STREAM_PERMS)) < 0) { jas_stream_destroy(stream); return 0; diff --git a/3rdparty/libjpeg/CMakeLists.txt b/3rdparty/libjpeg/CMakeLists.txt index 25800b66d4..0277a98ede 100644 --- a/3rdparty/libjpeg/CMakeLists.txt +++ b/3rdparty/libjpeg/CMakeLists.txt @@ -31,6 +31,8 @@ ocv_warnings_disable(CMAKE_C_FLAGS -Wunused-parameter -Wshift-negative-value) # set_target_properties(${JPEG_LIBRARY} PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY} DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME ${JPEG_LIBRARY} + COMPILE_PDB_NAME_DEBUG "${JPEG_LIBRARY}${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) diff --git a/3rdparty/libpng/CMakeLists.txt b/3rdparty/libpng/CMakeLists.txt index bd243c34a4..2d4430423f 100644 --- a/3rdparty/libpng/CMakeLists.txt +++ b/3rdparty/libpng/CMakeLists.txt @@ -49,6 +49,8 @@ ocv_warnings_disable(CMAKE_C_FLAGS -Wcast-align) set_target_properties(${PNG_LIBRARY} PROPERTIES OUTPUT_NAME ${PNG_LIBRARY} DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME ${PNG_LIBRARY} + COMPILE_PDB_NAME_DEBUG "${PNG_LIBRARY}${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) diff --git a/3rdparty/libtiff/CMakeLists.txt b/3rdparty/libtiff/CMakeLists.txt index a241dd6f91..b0e076f9b2 100644 --- a/3rdparty/libtiff/CMakeLists.txt +++ b/3rdparty/libtiff/CMakeLists.txt @@ -108,6 +108,8 @@ set_target_properties(${TIFF_LIBRARY} PROPERTIES OUTPUT_NAME "${TIFF_LIBRARY}" DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME ${TIFF_LIBRARY} + COMPILE_PDB_NAME_DEBUG "${TIFF_LIBRARY}${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt index 194d46f28a..9387616d3d 100644 --- a/3rdparty/openexr/CMakeLists.txt +++ b/3rdparty/openexr/CMakeLists.txt @@ -61,6 +61,8 @@ set_target_properties(IlmImf PROPERTIES OUTPUT_NAME "IlmImf" DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME "IlmImf" + COMPILE_PDB_NAME_DEBUG "IlmImf${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) diff --git a/3rdparty/tbb/CMakeLists.txt b/3rdparty/tbb/CMakeLists.txt index 1fd31fa476..de71e575df 100644 --- a/3rdparty/tbb/CMakeLists.txt +++ b/3rdparty/tbb/CMakeLists.txt @@ -245,6 +245,8 @@ endif() set_target_properties(tbb PROPERTIES OUTPUT_NAME tbb DEBUG_POSTFIX "${tbb_debug_postfix}" + COMPILE_PDB_NAME tbb + COMPILE_PDB_NAME_DEBUG "tbb${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} ) diff --git a/3rdparty/zlib/CMakeLists.txt b/3rdparty/zlib/CMakeLists.txt index bd37e0abaf..3376c3efda 100644 --- a/3rdparty/zlib/CMakeLists.txt +++ b/3rdparty/zlib/CMakeLists.txt @@ -87,6 +87,8 @@ ocv_warnings_disable(CMAKE_C_FLAGS -Wshorten-64-to-32 -Wattributes -Wstrict-prot set_target_properties(${ZLIB_LIBRARY} PROPERTIES OUTPUT_NAME ${ZLIB_LIBRARY} DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME ${ZLIB_LIBRARY} + COMPILE_PDB_NAME_DEBUG "${ZLIB_LIBRARY}${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} ) diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 773a0b1a07..e14254ff77 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -4,3 +4,4 @@ add_subdirectory(haartraining) add_subdirectory(traincascade) add_subdirectory(annotation) add_subdirectory(visualisation) +add_subdirectory(version) diff --git a/apps/haartraining/CMakeLists.txt b/apps/haartraining/CMakeLists.txt index 122d01ebfe..a70ae44166 100644 --- a/apps/haartraining/CMakeLists.txt +++ b/apps/haartraining/CMakeLists.txt @@ -10,6 +10,8 @@ project(haartraining) ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${OpenCV_SOURCE_DIR}/include/opencv") ocv_include_modules(${OPENCV_HAARTRAINING_DEPS}) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-private-field) + if(WIN32) link_directories(${CMAKE_CURRENT_BINARY_DIR}) endif() diff --git a/apps/traincascade/CMakeLists.txt b/apps/traincascade/CMakeLists.txt index 857604af14..e6dac7ef9a 100644 --- a/apps/traincascade/CMakeLists.txt +++ b/apps/traincascade/CMakeLists.txt @@ -10,6 +10,8 @@ project(traincascade) ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${OpenCV_SOURCE_DIR}/include/opencv") ocv_include_modules(${OPENCV_TRAINCASCADE_DEPS}) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Woverloaded-virtual) + set(traincascade_files traincascade.cpp cascadeclassifier.cpp cascadeclassifier.h boost.cpp boost.h features.cpp traincascade_features.h diff --git a/apps/version/CMakeLists.txt b/apps/version/CMakeLists.txt new file mode 100644 index 0000000000..40c659d135 --- /dev/null +++ b/apps/version/CMakeLists.txt @@ -0,0 +1,32 @@ +SET(OPENCV_APPLICATION_DEPS opencv_core) +ocv_check_dependencies(${OPENCV_APPLICATION_DEPS}) + +if(NOT OCV_DEPENDENCIES_FOUND) + return() +endif() + +project(opencv_version) +set(the_target opencv_version) + +ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${OpenCV_SOURCE_DIR}/include/opencv") +ocv_include_modules(${OPENCV_APPLICATION_DEPS}) + +file(GLOB SRCS *.cpp) + +add_executable(${the_target} ${SRCS}) +target_link_libraries(${the_target} ${OPENCV_APPLICATION_DEPS}) + +set_target_properties(${the_target} PROPERTIES + DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} + OUTPUT_NAME "opencv_version") + +set_target_properties(${the_target} PROPERTIES FOLDER "applications") + +if(INSTALL_CREATE_DISTRIB) + if(BUILD_SHARED_LIBS) + install(TARGETS ${the_target} RUNTIME DESTINATION ${OPENCV_BIN_INSTALL_PATH} CONFIGURATIONS Release COMPONENT libs) + endif() +else() + install(TARGETS ${the_target} RUNTIME DESTINATION ${OPENCV_BIN_INSTALL_PATH} COMPONENT libs) +endif() diff --git a/apps/version/opencv_version.cpp b/apps/version/opencv_version.cpp new file mode 100644 index 0000000000..f0428bf35a --- /dev/null +++ b/apps/version/opencv_version.cpp @@ -0,0 +1,28 @@ +// 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 + +#include + +int main(int argc, const char** argv) +{ + cv::CommandLineParser parser(argc, argv, + "{ h|help | false | show this help message }" + "{ v|verbose | false | show build configuration log }" + ); + if (parser.get("help")) + { + parser.printParams(); + } + else if (parser.get("verbose")) + { + std::cout << cv::getBuildInformation().c_str() << std::endl; + } + else + { + std::cout << CV_VERSION << std::endl; + } + return 0; +} diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake index 418bf46fdb..925731b7c6 100644 --- a/cmake/OpenCVModule.cmake +++ b/cmake/OpenCVModule.cmake @@ -591,7 +591,10 @@ macro(ocv_create_module) set_target_properties(${the_module} PROPERTIES OUTPUT_NAME "${the_module}${OPENCV_DLLVERSION}" DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + COMPILE_PDB_NAME "${the_module}${OPENCV_DLLVERSION}" + COMPILE_PDB_NAME_DEBUG "${the_module}${OPENCV_DLLVERSION}${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} + COMPILE_PDB_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} ) diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index 6690195d86..b266a62372 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -117,7 +117,7 @@ set(OCV_COMPILER_FAIL_REGEX "[Uu]nknown option" # HP "[Ww]arning: [Oo]ption" # SunPro "command option .* is not recognized" # XL - "not supported in this configuration; ignored" # AIX + "not supported in this configuration, ignored" # AIX (';' is replaced with ',') "File with unknown suffix passed to linker" # PGI "WARNING: unknown flag:" # Open64 ) @@ -156,12 +156,25 @@ MACRO(ocv_check_compiler_flag LANG FLAG RESULT) COMPILE_DEFINITIONS "${FLAG}" OUTPUT_VARIABLE OUTPUT) - FOREACH(_regex ${OCV_COMPILER_FAIL_REGEX}) - IF("${OUTPUT}" MATCHES "${_regex}") - SET(${RESULT} 0) - break() - ENDIF() - ENDFOREACH() + if(${RESULT}) + string(REPLACE ";" "," OUTPUT_LINES "${OUTPUT}") + string(REPLACE "\n" ";" OUTPUT_LINES "${OUTPUT_LINES}") + foreach(_regex ${OCV_COMPILER_FAIL_REGEX}) + if(NOT ${RESULT}) + break() + endif() + foreach(_line ${OUTPUT_LINES}) + if("${_line}" MATCHES "${_regex}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Build output check failed:\n" + " Regex: '${_regex}'\n" + " Output line: '${_line}'\n") + set(${RESULT} 0) + break() + endif() + endforeach() + endforeach() + endif() IF(${RESULT}) SET(${RESULT} 1 CACHE INTERNAL "Test ${RESULT}") @@ -169,6 +182,13 @@ MACRO(ocv_check_compiler_flag LANG FLAG RESULT) ELSE(${RESULT}) MESSAGE(STATUS "Performing Test ${RESULT} - Failed") SET(${RESULT} "" CACHE INTERNAL "Test ${RESULT}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Compilation failed:\n" + " source file: '${_fname}'\n" + " check option: '${FLAG}'\n" + "===== BUILD LOG =====\n" + "${OUTPUT}\n" + "===== END =====\n\n") ENDIF(${RESULT}) else() SET(${RESULT} 0) @@ -611,16 +631,22 @@ function(ocv_install_target) # message(STATUS "Process ${__target} dst=${__dst}...") if(DEFINED __dst) - get_target_property(fname ${__target} LOCATION_DEBUG) - if(fname MATCHES "\\.lib$") - string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}") - install(FILES ${fname} DESTINATION ${__dst} CONFIGURATIONS Debug) - endif() + # If CMake version is >=3.1.0 or <2.8.12. + if(NOT CMAKE_VERSION VERSION_LESS 3.1.0 OR CMAKE_VERSION VERSION_LESS 2.8.12) + get_target_property(fname ${__target} LOCATION_DEBUG) + if(fname MATCHES "\\.lib$") + string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}") + install(FILES "${fname}" DESTINATION "${__dst}" CONFIGURATIONS Debug) + endif() - get_target_property(fname ${__target} LOCATION_RELEASE) - if(fname MATCHES "\\.lib$") - string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}") - install(FILES ${fname} DESTINATION ${__dst} CONFIGURATIONS Release) + get_target_property(fname ${__target} LOCATION_RELEASE) + if(fname MATCHES "\\.lib$") + string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}") + install(FILES "${fname}" DESTINATION "${__dst}" CONFIGURATIONS Release) + endif() + else() + # CMake 2.8.12 broke PDB support for STATIC libraries from MSVS, fix was introduced in CMake 3.1.0. + message(WARNING "PDB's are not supported from this version of CMake, use CMake version later then 3.1.0 or before 2.8.12.") endif() endif() endif() diff --git a/modules/calib3d/src/calibration.cpp b/modules/calib3d/src/calibration.cpp index b9cb224973..4d7085cd66 100644 --- a/modules/calib3d/src/calibration.cpp +++ b/modules/calib3d/src/calibration.cpp @@ -1014,7 +1014,7 @@ CV_IMPL void cvProjectPoints2( const CvMat* objectPoints, { if( dpdc_p ) { - dpdc_p[0] = 1; dpdc_p[1] = 0; + dpdc_p[0] = 1; dpdc_p[1] = 0; // dp_xdc_x; dp_xdc_y dpdc_p[dpdc_step] = 0; dpdc_p[dpdc_step+1] = 1; dpdc_p += dpdc_step*2; @@ -1024,7 +1024,7 @@ CV_IMPL void cvProjectPoints2( const CvMat* objectPoints, { if( fixedAspectRatio ) { - dpdf_p[0] = 0; dpdf_p[1] = xd*aspectRatio; + dpdf_p[0] = 0; dpdf_p[1] = xd*aspectRatio; // dp_xdf_x; dp_xdf_y dpdf_p[dpdf_step] = 0; dpdf_p[dpdf_step+1] = yd; } @@ -1614,6 +1614,8 @@ CV_IMPL double cvCalibrateCamera2( const CvMat* objectPoints, param[4] = k[0]; param[5] = k[1]; param[6] = k[2]; param[7] = k[3]; param[8] = k[4]; param[9] = k[5]; param[10] = k[6]; param[11] = k[7]; + if(flags & CALIB_FIX_ASPECT_RATIO) + mask[0] = 0; if( flags & CV_CALIB_FIX_FOCAL_LENGTH ) mask[0] = mask[1] = 0; if( flags & CV_CALIB_FIX_PRINCIPAL_POINT ) diff --git a/modules/calib3d/src/fisheye.cpp b/modules/calib3d/src/fisheye.cpp index a2f117b028..096c93e765 100644 --- a/modules/calib3d/src/fisheye.cpp +++ b/modules/calib3d/src/fisheye.cpp @@ -369,6 +369,12 @@ void cv::fisheye::undistortPoints( InputArray distorted, OutputArray undistorted double scale = 1.0; double theta_d = sqrt(pw[0]*pw[0] + pw[1]*pw[1]); + + // the current camera model is only valid up to 180° FOV + // for larger FOV the loop below does not converge + // clip values so we still get plausible results for super fisheye images > 180° + theta_d = min(max(-CV_PI/2., theta_d), CV_PI/2.); + if (theta_d > 1e-8) { // compensate distortion iteratively diff --git a/modules/contrib/src/basicretinafilter.cpp b/modules/contrib/src/basicretinafilter.cpp index 4abe261393..037212b3d9 100644 --- a/modules/contrib/src/basicretinafilter.cpp +++ b/modules/contrib/src/basicretinafilter.cpp @@ -325,7 +325,7 @@ void BasicRetinaFilter::_localLuminanceAdaptation(float *inputOutputFrame, const /* const float *localLuminancePTR=localLuminance; float *inputOutputFramePTR=inputOutputFrame; - for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputOutputFramePTR) + for (unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputOutputFramePTR) { float X0=*(localLuminancePTR++)*_localLuminanceFactor+_localLuminanceAddon; *(inputOutputFramePTR) = (_maxInputValue+X0)**inputOutputFramePTR/(*inputOutputFramePTR +X0+0.00000000001); @@ -352,7 +352,7 @@ void BasicRetinaFilter::_localLuminanceAdaptation(const float *inputFrame, const const float *localLuminancePTR=localLuminance; const float *inputFramePTR=inputFrame; float *outputFramePTR=outputFrame; - for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputFramePTR, ++outputFramePTR) + for (unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputFramePTR, ++outputFramePTR) { float X0=*(localLuminancePTR++)*_localLuminanceFactor+_localLuminanceAddon; // TODO : the following line can lead to a divide by zero ! A small offset is added, take care if the offset is too large in case of High Dynamic Range images which can use very small values... @@ -369,7 +369,7 @@ void BasicRetinaFilter::_localLuminanceAdaptationPosNegValues(const float *input const float *inputFramePTR=inputFrame; float *outputFramePTR=outputFrame; float factor=_maxInputValue*2.0f/(float)CV_PI; - for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputFramePTR) + for (unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputFramePTR) { float X0=*(localLuminancePTR++)*_localLuminanceFactor+_localLuminanceAddon; *(outputFramePTR++) = factor*atan(*inputFramePTR/X0);//(_maxInputValue+X0)**inputFramePTR/(*inputFramePTR +X0); @@ -454,8 +454,8 @@ void BasicRetinaFilter::_horizontalCausalFilter(float *outputFrame, unsigned int //#pragma omp parallel for for (unsigned int IDrow=IDrowStart; IDrow squaring horizontal causal filter void BasicRetinaFilter::_squaringHorizontalCausalFilter(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd) { - register float* outputPTR=outputFrame+IDrowStart*_filterOutput.getNBcolumns(); - register const float* inputPTR=inputFrame+IDrowStart*_filterOutput.getNBcolumns(); + float* outputPTR=outputFrame+IDrowStart*_filterOutput.getNBcolumns(); + const float* inputPTR=inputFrame+IDrowStart*_filterOutput.getNBcolumns(); for (unsigned int IDrow=IDrowStart; IDrow &ImageLogPolProjection::runProjection(const std::valarray &ImageLogPolProjection::runProjection(const std::valarraygetNBpixels(); ++IDpixel) { @@ -198,10 +198,10 @@ const std::valarray &MagnoRetinaFilter::runFilter(const std::valarray &ParvoRetinaFilter::runFilter(const std::valarray &multiplexed // -> first set demultiplexed frame to 0 _demultiplexedTempBuffer=0; // -> demultiplex process - register unsigned int *colorSamplingPRT=&_colorSampling[0]; - register const float *multiplexedColorFramePtr=get_data(multiplexedColorFrame); + unsigned int *colorSamplingPRT=&_colorSampling[0]; + const float *multiplexedColorFramePtr=get_data(multiplexedColorFrame); for (unsigned int indexa=0; indexa<_filterOutput.getNBpixels() ; ++indexa) _demultiplexedTempBuffer[*(colorSamplingPRT++)]=*(multiplexedColorFramePtr++); @@ -279,9 +279,9 @@ void RetinaColor::runColorDemultiplexing(const std::valarray &multiplexed }*/ // normalize by the photoreceptors local density and retrieve the local luminance - register float *chrominancePTR= &_chrominance[0]; - register float *colorLocalDensityPTR= &_colorLocalDensity[0]; - register float *luminance= &(*_luminance)[0]; + float *chrominancePTR= &_chrominance[0]; + float *colorLocalDensityPTR= &_colorLocalDensity[0]; + float *luminance= &(*_luminance)[0]; if (!adaptiveFiltering)// compute the gradient on the luminance { if (_samplingMethod==RETINA_COLOR_RANDOM) @@ -325,7 +325,7 @@ void RetinaColor::runColorDemultiplexing(const std::valarray &multiplexed }else { - register const float *multiplexedColorFramePTR= get_data(multiplexedColorFrame); + const float *multiplexedColorFramePTR= get_data(multiplexedColorFrame); for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance, ++multiplexedColorFramePTR) { // normalize by photoreceptors density @@ -408,8 +408,8 @@ void RetinaColor::runColorDemultiplexing(const std::valarray &multiplexed void RetinaColor::runColorMultiplexing(const std::valarray &demultiplexedInputFrame, std::valarray &multiplexedFrame) { // multiply each color layer by its bayer mask - register unsigned int *colorSamplingPTR= &_colorSampling[0]; - register float *multiplexedFramePTR= &multiplexedFrame[0]; + unsigned int *colorSamplingPTR= &_colorSampling[0]; + float *multiplexedFramePTR= &multiplexedFrame[0]; for (unsigned int indexp=0; indexp<_filterOutput.getNBpixels(); ++indexp) *(multiplexedFramePTR++)=demultiplexedInputFrame[*(colorSamplingPTR++)]; } @@ -436,8 +436,8 @@ void RetinaColor::clipRGBOutput_0_maxInputValue(float *inputOutputBuffer, const #ifdef MAKE_PARALLEL // call the TemplateBuffer TBB clipping method cv::parallel_for_(cv::Range(0,_filterOutput.getNBpixels()*3), Parallel_clipBufferValues(inputOutputBuffer, 0, maxInputValue)); #else - register float *inputOutputBufferPTR=inputOutputBuffer; - for (register unsigned int jf = 0; jf < _filterOutput.getNBpixels()*3; ++jf, ++inputOutputBufferPTR) + float *inputOutputBufferPTR=inputOutputBuffer; + for (unsigned int jf = 0; jf < _filterOutput.getNBpixels()*3; ++jf, ++inputOutputBufferPTR) { if (*inputOutputBufferPTR>maxInputValue) *inputOutputBufferPTR=maxInputValue; @@ -583,12 +583,12 @@ void RetinaColor::_adaptiveHorizontalCausalFilter_addInput(const float *inputFra #ifdef MAKE_PARALLEL cv::parallel_for_(cv::Range(IDrowStart,IDrowEnd), Parallel_adaptiveHorizontalCausalFilter_addInput(inputFrame, outputFrame, &_imageGradient[0], _filterOutput.getNBcolumns())); #else - register float* outputPTR=outputFrame+IDrowStart*_filterOutput.getNBcolumns(); - register const float* inputPTR=inputFrame+IDrowStart*_filterOutput.getNBcolumns(); - register const float *imageGradientPTR= &_imageGradient[0]+IDrowStart*_filterOutput.getNBcolumns(); + float* outputPTR=outputFrame+IDrowStart*_filterOutput.getNBcolumns(); + const float* inputPTR=inputFrame+IDrowStart*_filterOutput.getNBcolumns(); + const float *imageGradientPTR= &_imageGradient[0]+IDrowStart*_filterOutput.getNBcolumns(); for (unsigned int IDrow=IDrowStart; IDrow(y); float *pDst = dst.ptr(y); - for (register int x = 0; x < src.cols; x++) + for (int x = 0; x < src.cols; x++) pDst[x] = 0.5f*l / sqrtf(l*l + pSrc[x]*pSrc[x]); } return dst; @@ -121,10 +121,10 @@ static Mat getG_c(Mat &src, float l) static Mat getG_p(Mat &src, float l) { Mat dst(src.size(), src.type()); - for (register int y = 0; y < src.rows; y++) { + for (int y = 0; y < src.rows; y++) { float *pSrc = src.ptr(y); float *pDst = dst.ptr(y); - for (register int x = 0; x < src.cols; x++) + for (int x = 0; x < src.cols; x++) pDst[x] = 0.5f*l*l / (l*l + pSrc[x]*pSrc[x]); } return dst; @@ -132,7 +132,7 @@ static Mat getG_p(Mat &src, float l) void StereoVar::VariationalSolver(Mat &I1, Mat &I2, Mat &I2x, Mat &u, int level) { - register int n, x, y; + int n, x, y; float gl = 1, gr = 1, gu = 1, gd = 1, gc = 4; Mat g_c, g_p; Mat U; diff --git a/modules/contrib/src/templatebuffer.hpp b/modules/contrib/src/templatebuffer.hpp index 8a85b54943..1e8ead199a 100644 --- a/modules/contrib/src/templatebuffer.hpp +++ b/modules/contrib/src/templatebuffer.hpp @@ -89,8 +89,8 @@ public: : bufferToClip(bufferToProcess), minValue(min), maxValue(max){} virtual void operator()( const cv::Range &r ) const { - register type *inputOutputBufferPTR=bufferToClip+r.start; - for (register int jf = r.start; jf != r.end; ++jf, ++inputOutputBufferPTR) + type *inputOutputBufferPTR=bufferToClip+r.start; + for (int jf = r.start; jf != r.end; ++jf, ++inputOutputBufferPTR) { if (*inputOutputBufferPTR>maxValue) *inputOutputBufferPTR=maxValue; @@ -428,8 +428,8 @@ namespace cv type maxValue=inputOutputBuffer[0], minValue=inputOutputBuffer[0]; // get the min and max value - register type *inputOutputBufferPTR=inputOutputBuffer; - for (register size_t j = 0; j struct OpNot T operator()( T a, T ) const { return ~a; } }; + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#endif static inline void fixSteps(Size sz, size_t elemSize, size_t& step1, size_t& step2, size_t& step) { if( sz.height == 1 ) step1 = step2 = step = sz.width*elemSize; } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif static void add8u( const uchar* src1, size_t step1, const uchar* src2, size_t step2, diff --git a/modules/core/src/drawing.cpp b/modules/core/src/drawing.cpp index e847abd92c..5c712ad16e 100644 --- a/modules/core/src/drawing.cpp +++ b/modules/core/src/drawing.cpp @@ -1845,7 +1845,7 @@ void drawMarker(Mat& img, Point position, const Scalar& color, int markerType, i case MARKER_TRIANGLE_UP: line(img, Point(position.x-(markerSize/2), position.y+(markerSize/2)), Point(position.x+(markerSize/2), position.y+(markerSize/2)), color, thickness, line_type); line(img, Point(position.x+(markerSize/2), position.y+(markerSize/2)), Point(position.x, position.y-(markerSize/2)), color, thickness, line_type); - line(img, Point(position.x, position.y-(markerSize/2)), Point(position.x-(markerSize/2), position.y-(markerSize/2)), color, thickness, line_type); + line(img, Point(position.x, position.y-(markerSize/2)), Point(position.x-(markerSize/2), position.y+(markerSize/2)), color, thickness, line_type); break; // The triangle down marker case diff --git a/modules/core/test/test_countnonzero.cpp b/modules/core/test/test_countnonzero.cpp index 176d324c9e..0b8210322d 100644 --- a/modules/core/test/test_countnonzero.cpp +++ b/modules/core/test/test_countnonzero.cpp @@ -52,9 +52,6 @@ using namespace std; #define sign(a) a > 0 ? 1 : a == 0 ? 0 : -1 -const int FLOAT_TYPE [2] = {CV_32F, CV_64F}; -const int INT_TYPE [5] = {CV_8U, CV_8S, CV_16U, CV_16S, CV_32S}; - #define MAX_WIDTH 100 #define MAX_HEIGHT 100 diff --git a/modules/gpu/CMakeLists.txt b/modules/gpu/CMakeLists.txt index ce3c8fb2f2..d8dceb8267 100644 --- a/modules/gpu/CMakeLists.txt +++ b/modules/gpu/CMakeLists.txt @@ -22,6 +22,8 @@ source_group("Src\\Cuda" FILES ${lib_cuda} ${lib_cuda_hdrs}) source_group("Device" FILES ${lib_device_hdrs}) source_group("Device\\Detail" FILES ${lib_device_hdrs_detail}) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-private-field) + if(HAVE_CUDA) file(GLOB_RECURSE ncv_srcs "src/nvidia/*.cpp" "src/nvidia/*.h*") file(GLOB_RECURSE ncv_cuda "src/nvidia/*.cu") diff --git a/modules/highgui/src/cap_avfoundation_mac.mm b/modules/highgui/src/cap_avfoundation_mac.mm index 5b24263cfe..b5e3ffc262 100644 --- a/modules/highgui/src/cap_avfoundation_mac.mm +++ b/modules/highgui/src/cap_avfoundation_mac.mm @@ -118,7 +118,6 @@ private: int height; int settingWidth; int settingHeight; - OSType mInputPixelFormat; int started; }; @@ -165,7 +164,6 @@ private: CMTime mFrameTimestamp; size_t mFrameNum; - OSType mInputPixelFormat; int started; }; diff --git a/modules/highgui/src/cap_dc1394.cpp b/modules/highgui/src/cap_dc1394.cpp index 9706bd12e3..7b1640055c 100644 --- a/modules/highgui/src/cap_dc1394.cpp +++ b/modules/highgui/src/cap_dc1394.cpp @@ -907,10 +907,10 @@ b = b > 255 ? 255 : b uyv2bgr(const unsigned char *src, unsigned char *dest, unsigned long long int NumPixels) { - register int i = NumPixels + (NumPixels << 1) - 1; - register int j = NumPixels + (NumPixels << 1) - 1; - register int y, u, v; - register int r, g, b; + int i = NumPixels + (NumPixels << 1) - 1; + int j = NumPixels + (NumPixels << 1) - 1; + int y, u, v; + int r, g, b; while (i > 0) { v = src[i--] - 128; @@ -927,10 +927,10 @@ uyv2bgr(const unsigned char *src, unsigned char *dest, uyvy2bgr(const unsigned char *src, unsigned char *dest, unsigned long long int NumPixels) { - register int i = (NumPixels << 1) - 1; - register int j = NumPixels + (NumPixels << 1) - 1; - register int y0, y1, u, v; - register int r, g, b; + int i = (NumPixels << 1) - 1; + int j = NumPixels + (NumPixels << 1) - 1; + int y0, y1, u, v; + int r, g, b; while (i > 0) { y1 = src[i--]; @@ -953,10 +953,10 @@ uyvy2bgr(const unsigned char *src, unsigned char *dest, uyyvyy2bgr(const unsigned char *src, unsigned char *dest, unsigned long long int NumPixels) { - register int i = NumPixels + (NumPixels >> 1) - 1; - register int j = NumPixels + (NumPixels << 1) - 1; - register int y0, y1, y2, y3, u, v; - register int r, g, b; + int i = NumPixels + (NumPixels >> 1) - 1; + int j = NumPixels + (NumPixels << 1) - 1; + int y0, y1, y2, y3, u, v; + int r, g, b; while (i > 0) { y3 = src[i--]; @@ -988,9 +988,9 @@ uyyvyy2bgr(const unsigned char *src, unsigned char *dest, y2bgr(const unsigned char *src, unsigned char *dest, unsigned long long int NumPixels) { - register int i = NumPixels - 1; - register int j = NumPixels + (NumPixels << 1) - 1; - register int y; + int i = NumPixels - 1; + int j = NumPixels + (NumPixels << 1) - 1; + int y; while (i > 0) { y = src[i--]; @@ -1004,9 +1004,9 @@ y2bgr(const unsigned char *src, unsigned char *dest, y162bgr(const unsigned char *src, unsigned char *dest, unsigned long long int NumPixels, int bits) { - register int i = (NumPixels << 1) - 1; - register int j = NumPixels + (NumPixels << 1) - 1; - register int y; + int i = (NumPixels << 1) - 1; + int j = NumPixels + (NumPixels << 1) - 1; + int y; while (i > 0) { y = src[i--]; @@ -1022,9 +1022,9 @@ y162bgr(const unsigned char *src, unsigned char *dest, rgb482bgr(const unsigned char *src, unsigned char *dest, unsigned long long int NumPixels, int bits) { - register int i = (NumPixels << 1) - 1; - register int j = NumPixels + (NumPixels << 1) - 1; - register int y; + int i = (NumPixels << 1) - 1; + int j = NumPixels + (NumPixels << 1) - 1; + int y; while (i > 0) { y = src[i--]; diff --git a/modules/highgui/src/grfmt_jpeg2000.cpp b/modules/highgui/src/grfmt_jpeg2000.cpp index da5d718dc5..1044289f07 100644 --- a/modules/highgui/src/grfmt_jpeg2000.cpp +++ b/modules/highgui/src/grfmt_jpeg2000.cpp @@ -45,6 +45,7 @@ #ifdef HAVE_JASPER #include "grfmt_jpeg2000.hpp" +#include "opencv2/imgproc.hpp" #ifdef WIN32 #define JAS_WIN_MSVC_BUILD 1 @@ -159,6 +160,21 @@ bool Jpeg2KDecoder::readData( Mat& img ) jas_stream_t* stream = (jas_stream_t*)m_stream; jas_image_t* image = (jas_image_t*)m_image; +#ifndef WIN32 + // At least on some Linux instances the + // system libjasper segfaults when + // converting color to grey. + // We do this conversion manually at the end. + Mat clr; + if (CV_MAT_CN(img.type()) < CV_MAT_CN(this->type())) + { + clr.create(img.size().height, img.size().width, this->type()); + color = true; + data = clr.ptr(); + step = (int)clr.step; + } +#endif + if( stream && image ) { bool convert; @@ -171,7 +187,7 @@ bool Jpeg2KDecoder::readData( Mat& img ) else { convert = (jas_clrspc_fam( jas_image_clrspc( image ) ) != JAS_CLRSPC_FAM_GRAY); - colorspace = JAS_CLRSPC_SGRAY; // TODO GENGRAY or SGRAY? + colorspace = JAS_CLRSPC_SGRAY; // TODO GENGRAY or SGRAY? (GENGRAY fails on Win.) } // convert to the desired colorspace @@ -256,6 +272,13 @@ bool Jpeg2KDecoder::readData( Mat& img ) close(); +#ifndef WIN32 + if (!clr.empty()) + { + cv::cvtColor(clr, img, COLOR_BGR2GRAY); + } +#endif + return result; } diff --git a/modules/java/CMakeLists.txt b/modules/java/CMakeLists.txt index 63d5db1283..f82bdcd32f 100644 --- a/modules/java/CMakeLists.txt +++ b/modules/java/CMakeLists.txt @@ -286,6 +286,9 @@ else(ANDROID) endif(ANDROID) # step 5: build native part +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-const-variable -Woverloaded-virtual) + + add_library(${the_module} SHARED ${handwrittren_h_sources} ${handwrittren_cpp_sources} ${generated_cpp_sources} ${copied_files} "${JAR_FILE}" "${JAR_FILE}.dephelper") diff --git a/modules/java/generator/src/java/android+JavaCameraView.java b/modules/java/generator/src/java/android+JavaCameraView.java index fca29db6eb..f4405c3501 100644 --- a/modules/java/generator/src/java/android+JavaCameraView.java +++ b/modules/java/generator/src/java/android+JavaCameraView.java @@ -328,6 +328,7 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb @Override public void run() { do { + boolean hasFrame = false; synchronized (JavaCameraView.this) { try { while (!mCameraFrameReady && !mStopThread) { @@ -337,11 +338,14 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb e.printStackTrace(); } if (mCameraFrameReady) + { mChainIdx = 1 - mChainIdx; + mCameraFrameReady = false; + hasFrame = true; + } } - if (!mStopThread && mCameraFrameReady) { - mCameraFrameReady = false; + if (!mStopThread && hasFrame) { if (!mFrameChain[1 - mChainIdx].empty()) deliverAndDrawFrame(mCameraFrame[1 - mChainIdx]); } diff --git a/modules/ml/include/opencv2/ml/ml.hpp b/modules/ml/include/opencv2/ml/ml.hpp index d86ecde4fd..b10b1a9cf7 100644 --- a/modules/ml/include/opencv2/ml/ml.hpp +++ b/modules/ml/include/opencv2/ml/ml.hpp @@ -46,6 +46,12 @@ #ifdef __cplusplus +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverloaded-virtual" +#endif + + #include #include #include @@ -2141,6 +2147,10 @@ CV_EXPORTS bool initModule_ml(void); } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + #endif // __cplusplus #endif // __OPENCV_ML_HPP__ diff --git a/modules/nonfree/src/surf_ocl.cpp b/modules/nonfree/src/surf_ocl.cpp index add1b56a1f..3c8002a97b 100644 --- a/modules/nonfree/src/surf_ocl.cpp +++ b/modules/nonfree/src/surf_ocl.cpp @@ -273,11 +273,7 @@ private: const oclMat _img; // make a copy for non-image2d_t supported platform - SURF_OCL_Invoker &operator= (const SURF_OCL_Invoker &right) - { - (*this) = right; - return *this; - } // remove warning C4512 + SURF_OCL_Invoker &operator= (const SURF_OCL_Invoker &right); // = delete; }; cv::ocl::SURF_OCL::SURF_OCL() diff --git a/modules/ocl/CMakeLists.txt b/modules/ocl/CMakeLists.txt index db9d64e1e8..c56fc62579 100644 --- a/modules/ocl/CMakeLists.txt +++ b/modules/ocl/CMakeLists.txt @@ -8,4 +8,4 @@ ocv_define_module(ocl opencv_core opencv_imgproc opencv_features2d opencv_objdet if(TARGET opencv_test_ocl) target_link_libraries(opencv_test_ocl "${OPENCL_LIBRARIES}") endif() -ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Woverloaded-virtual -Wunused-private-field) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index e8eb3e8599..9261ca2ed4 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -53,6 +53,11 @@ #include "opencv2/features2d/features2d.hpp" #include "opencv2/ml/ml.hpp" +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverloaded-virtual" +#endif + namespace cv { namespace ocl @@ -1995,4 +2000,8 @@ namespace cv # pragma warning( pop) #endif +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + #endif /* __OPENCV_OCL_HPP__ */ diff --git a/modules/ocl/src/bgfg_mog.cpp b/modules/ocl/src/bgfg_mog.cpp index de9fe84744..3a98bdf06b 100644 --- a/modules/ocl/src/bgfg_mog.cpp +++ b/modules/ocl/src/bgfg_mog.cpp @@ -100,7 +100,6 @@ namespace mog const float defaultBackgroundRatio = 0.7f; const float defaultVarThreshold = 2.5f * 2.5f; const float defaultNoiseSigma = 30.0f * 0.5f; - const float defaultInitialWeight = 0.05f; } void cv::ocl::BackgroundSubtractor::operator()(const oclMat&, oclMat&, float) { diff --git a/modules/ocl/src/cl_runtime/cl_runtime_opencl_impl.hpp b/modules/ocl/src/cl_runtime/cl_runtime_opencl_impl.hpp index 2282dc5f33..f2057a6665 100644 --- a/modules/ocl/src/cl_runtime/cl_runtime_opencl_impl.hpp +++ b/modules/ocl/src/cl_runtime/cl_runtime_opencl_impl.hpp @@ -186,217 +186,348 @@ const char* opencl_fn_names[] = { namespace { // generated by parser_cl.py -template -struct opencl_fn0 -{ - typedef _R (CL_API_CALL*FN)(); - static _R CL_API_CALL switch_fn() - { return ((FN)opencl_check_fn(ID))(); } -}; +#define opencl_fn0(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(); } \ -template -struct opencl_fn1 -{ - typedef _R (CL_API_CALL*FN)(_T1); - static _R CL_API_CALL switch_fn(_T1 p1) - { return ((FN)opencl_check_fn(ID))(p1); } -}; +#define opencl_fn1(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1); } \ -template -struct opencl_fn2 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2) - { return ((FN)opencl_check_fn(ID))(p1, p2); } -}; +#define opencl_fn2(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2); } \ -template -struct opencl_fn3 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3); } -}; +#define opencl_fn3(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3); } \ -template -struct opencl_fn4 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4); } -}; +#define opencl_fn4(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4); } \ -template -struct opencl_fn5 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5); } -}; +#define opencl_fn5(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5); } \ -template -struct opencl_fn6 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6); } -}; +#define opencl_fn6(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6); } \ -template -struct opencl_fn7 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7); } -}; +#define opencl_fn7(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7); } \ -template -struct opencl_fn8 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8); } -}; +#define opencl_fn8(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8); } \ -template -struct opencl_fn9 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } -}; +#define opencl_fn9(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } \ -template -struct opencl_fn10 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } -}; +#define opencl_fn10(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } \ -template -struct opencl_fn11 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } -}; +#define opencl_fn11(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } \ -template -struct opencl_fn12 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } -}; +#define opencl_fn12(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } \ -template -struct opencl_fn13 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } -}; +#define opencl_fn13(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } \ -template -struct opencl_fn14 -{ - typedef _R (CL_API_CALL*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14); - static _R CL_API_CALL switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14) - { return ((FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } -}; +#define opencl_fn14(ID, _R, decl_args) \ + typedef _R (CL_API_CALL*ID##FN)decl_args; \ + static _R CL_API_CALL ID##_switch_fn decl_args \ + { return ((ID##FN)opencl_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } \ } // generated by parser_cl.py -cl_int (CL_API_CALL*clGetPlatformIDs)(cl_uint, cl_platform_id*, cl_uint*) = opencl_fn3::switch_fn; -cl_int (CL_API_CALL*clGetPlatformInfo)(cl_platform_id, cl_platform_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clGetDeviceIDs)(cl_platform_id, cl_device_type, cl_uint, cl_device_id*, cl_uint*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clGetDeviceInfo)(cl_device_id, cl_device_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clCreateSubDevices)(cl_device_id, const cl_device_partition_property*, cl_uint, cl_device_id*, cl_uint*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clRetainDevice)(cl_device_id) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseDevice)(cl_device_id) = opencl_fn1::switch_fn; -cl_context (CL_API_CALL*clCreateContext)(const cl_context_properties*, cl_uint, const cl_device_id*, void (CL_CALLBACK*) (const char*, const void*, size_t, void*), void*, cl_int*) = opencl_fn6::switch_fn; -cl_context (CL_API_CALL*clCreateContextFromType)(const cl_context_properties*, cl_device_type, void (CL_CALLBACK*) (const char*, const void*, size_t, void*), void*, cl_int*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clRetainContext)(cl_context) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseContext)(cl_context) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clGetContextInfo)(cl_context, cl_context_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_command_queue (CL_API_CALL*clCreateCommandQueue)(cl_context, cl_device_id, cl_command_queue_properties, cl_int*) = opencl_fn4::switch_fn; -cl_int (CL_API_CALL*clRetainCommandQueue)(cl_command_queue) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseCommandQueue)(cl_command_queue) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clGetCommandQueueInfo)(cl_command_queue, cl_command_queue_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_mem (CL_API_CALL*clCreateBuffer)(cl_context, cl_mem_flags, size_t, void*, cl_int*) = opencl_fn5::switch_fn; -cl_mem (CL_API_CALL*clCreateSubBuffer)(cl_mem, cl_mem_flags, cl_buffer_create_type, const void*, cl_int*) = opencl_fn5::switch_fn; -cl_mem (CL_API_CALL*clCreateImage)(cl_context, cl_mem_flags, const cl_image_format*, const cl_image_desc*, void*, cl_int*) = opencl_fn6::switch_fn; -cl_int (CL_API_CALL*clRetainMemObject)(cl_mem) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseMemObject)(cl_mem) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clGetSupportedImageFormats)(cl_context, cl_mem_flags, cl_mem_object_type, cl_uint, cl_image_format*, cl_uint*) = opencl_fn6::switch_fn; -cl_int (CL_API_CALL*clGetMemObjectInfo)(cl_mem, cl_mem_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clGetImageInfo)(cl_mem, cl_image_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clSetMemObjectDestructorCallback)(cl_mem, void (CL_CALLBACK*) (cl_mem, void*), void*) = opencl_fn3::switch_fn; -cl_sampler (CL_API_CALL*clCreateSampler)(cl_context, cl_bool, cl_addressing_mode, cl_filter_mode, cl_int*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clRetainSampler)(cl_sampler) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseSampler)(cl_sampler) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clGetSamplerInfo)(cl_sampler, cl_sampler_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_program (CL_API_CALL*clCreateProgramWithSource)(cl_context, cl_uint, const char**, const size_t*, cl_int*) = opencl_fn5::switch_fn; -cl_program (CL_API_CALL*clCreateProgramWithBinary)(cl_context, cl_uint, const cl_device_id*, const size_t*, const unsigned char**, cl_int*, cl_int*) = opencl_fn7::switch_fn; -cl_program (CL_API_CALL*clCreateProgramWithBuiltInKernels)(cl_context, cl_uint, const cl_device_id*, const char*, cl_int*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clRetainProgram)(cl_program) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseProgram)(cl_program) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clBuildProgram)(cl_program, cl_uint, const cl_device_id*, const char*, void (CL_CALLBACK*) (cl_program, void*), void*) = opencl_fn6::switch_fn; -cl_int (CL_API_CALL*clCompileProgram)(cl_program, cl_uint, const cl_device_id*, const char*, cl_uint, const cl_program*, const char**, void (CL_CALLBACK*) (cl_program, void*), void*) = opencl_fn9::switch_fn; -cl_program (CL_API_CALL*clLinkProgram)(cl_context, cl_uint, const cl_device_id*, const char*, cl_uint, const cl_program*, void (CL_CALLBACK*) (cl_program, void*), void*, cl_int*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clUnloadPlatformCompiler)(cl_platform_id) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clGetProgramInfo)(cl_program, cl_program_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clGetProgramBuildInfo)(cl_program, cl_device_id, cl_program_build_info, size_t, void*, size_t*) = opencl_fn6::switch_fn; -cl_kernel (CL_API_CALL*clCreateKernel)(cl_program, const char*, cl_int*) = opencl_fn3::switch_fn; -cl_int (CL_API_CALL*clCreateKernelsInProgram)(cl_program, cl_uint, cl_kernel*, cl_uint*) = opencl_fn4::switch_fn; -cl_int (CL_API_CALL*clRetainKernel)(cl_kernel) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseKernel)(cl_kernel) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clSetKernelArg)(cl_kernel, cl_uint, size_t, const void*) = opencl_fn4::switch_fn; -cl_int (CL_API_CALL*clGetKernelInfo)(cl_kernel, cl_kernel_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clGetKernelArgInfo)(cl_kernel, cl_uint, cl_kernel_arg_info, size_t, void*, size_t*) = opencl_fn6::switch_fn; -cl_int (CL_API_CALL*clGetKernelWorkGroupInfo)(cl_kernel, cl_device_id, cl_kernel_work_group_info, size_t, void*, size_t*) = opencl_fn6::switch_fn; -cl_int (CL_API_CALL*clWaitForEvents)(cl_uint, const cl_event*) = opencl_fn2::switch_fn; -cl_int (CL_API_CALL*clGetEventInfo)(cl_event, cl_event_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_event (CL_API_CALL*clCreateUserEvent)(cl_context, cl_int*) = opencl_fn2::switch_fn; -cl_int (CL_API_CALL*clRetainEvent)(cl_event) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clReleaseEvent)(cl_event) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clSetUserEventStatus)(cl_event, cl_int) = opencl_fn2::switch_fn; -cl_int (CL_API_CALL*clSetEventCallback)(cl_event, cl_int, void (CL_CALLBACK*) (cl_event, cl_int, void*), void*) = opencl_fn4::switch_fn; -cl_int (CL_API_CALL*clGetEventProfilingInfo)(cl_event, cl_profiling_info, size_t, void*, size_t*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clFlush)(cl_command_queue) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clFinish)(cl_command_queue) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clEnqueueReadBuffer)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clEnqueueReadBufferRect)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*) = opencl_fn14::switch_fn; -cl_int (CL_API_CALL*clEnqueueWriteBuffer)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clEnqueueWriteBufferRect)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*) = opencl_fn14::switch_fn; -cl_int (CL_API_CALL*clEnqueueFillBuffer)(cl_command_queue, cl_mem, const void*, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clEnqueueCopyBuffer)(cl_command_queue, cl_mem, cl_mem, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clEnqueueCopyBufferRect)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*) = opencl_fn13::switch_fn; -cl_int (CL_API_CALL*clEnqueueReadImage)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*) = opencl_fn11::switch_fn; -cl_int (CL_API_CALL*clEnqueueWriteImage)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*) = opencl_fn11::switch_fn; -cl_int (CL_API_CALL*clEnqueueFillImage)(cl_command_queue, cl_mem, const void*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = opencl_fn8::switch_fn; -cl_int (CL_API_CALL*clEnqueueCopyImage)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clEnqueueCopyImageToBuffer)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, size_t, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clEnqueueCopyBufferToImage)(cl_command_queue, cl_mem, cl_mem, size_t, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -void* (CL_API_CALL*clEnqueueMapBuffer)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t, cl_uint, const cl_event*, cl_event*, cl_int*) = opencl_fn10::switch_fn; -void* (CL_API_CALL*clEnqueueMapImage)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, const size_t*, const size_t*, size_t*, size_t*, cl_uint, const cl_event*, cl_event*, cl_int*) = opencl_fn12::switch_fn; -cl_int (CL_API_CALL*clEnqueueUnmapMemObject)(cl_command_queue, cl_mem, void*, cl_uint, const cl_event*, cl_event*) = opencl_fn6::switch_fn; -cl_int (CL_API_CALL*clEnqueueMigrateMemObjects)(cl_command_queue, cl_uint, const cl_mem*, cl_mem_migration_flags, cl_uint, const cl_event*, cl_event*) = opencl_fn7::switch_fn; -cl_int (CL_API_CALL*clEnqueueNDRangeKernel)(cl_command_queue, cl_kernel, cl_uint, const size_t*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = opencl_fn9::switch_fn; -cl_int (CL_API_CALL*clEnqueueTask)(cl_command_queue, cl_kernel, cl_uint, const cl_event*, cl_event*) = opencl_fn5::switch_fn; -cl_int (CL_API_CALL*clEnqueueNativeKernel)(cl_command_queue, void (CL_CALLBACK*) (void*), void*, size_t, cl_uint, const cl_mem*, const void**, cl_uint, const cl_event*, cl_event*) = opencl_fn10::switch_fn; -cl_int (CL_API_CALL*clEnqueueMarkerWithWaitList)(cl_command_queue, cl_uint, const cl_event*, cl_event*) = opencl_fn4::switch_fn; -cl_int (CL_API_CALL*clEnqueueBarrierWithWaitList)(cl_command_queue, cl_uint, const cl_event*, cl_event*) = opencl_fn4::switch_fn; -void* (CL_API_CALL*clGetExtensionFunctionAddressForPlatform)(cl_platform_id, const char*) = opencl_fn2::switch_fn; -cl_mem (CL_API_CALL*clCreateImage2D)(cl_context, cl_mem_flags, const cl_image_format*, size_t, size_t, size_t, void*, cl_int*) = opencl_fn8::switch_fn; -cl_mem (CL_API_CALL*clCreateImage3D)(cl_context, cl_mem_flags, const cl_image_format*, size_t, size_t, size_t, size_t, size_t, void*, cl_int*) = opencl_fn10::switch_fn; -cl_int (CL_API_CALL*clEnqueueMarker)(cl_command_queue, cl_event*) = opencl_fn2::switch_fn; -cl_int (CL_API_CALL*clEnqueueWaitForEvents)(cl_command_queue, cl_uint, const cl_event*) = opencl_fn3::switch_fn; -cl_int (CL_API_CALL*clEnqueueBarrier)(cl_command_queue) = opencl_fn1::switch_fn; -cl_int (CL_API_CALL*clUnloadCompiler)() = opencl_fn0::switch_fn; -void* (CL_API_CALL*clGetExtensionFunctionAddress)(const char*) = opencl_fn1::switch_fn; +opencl_fn3(OPENCL_FN_clGetPlatformIDs, cl_int, (cl_uint p1, cl_platform_id* p2, cl_uint* p3)) +cl_int (CL_API_CALL*clGetPlatformIDs)(cl_uint, cl_platform_id*, cl_uint*) = + OPENCL_FN_clGetPlatformIDs_switch_fn; +opencl_fn5(OPENCL_FN_clGetPlatformInfo, cl_int, (cl_platform_id p1, cl_platform_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetPlatformInfo)(cl_platform_id, cl_platform_info, size_t, void*, size_t*) = + OPENCL_FN_clGetPlatformInfo_switch_fn; +opencl_fn5(OPENCL_FN_clGetDeviceIDs, cl_int, (cl_platform_id p1, cl_device_type p2, cl_uint p3, cl_device_id* p4, cl_uint* p5)) +cl_int (CL_API_CALL*clGetDeviceIDs)(cl_platform_id, cl_device_type, cl_uint, cl_device_id*, cl_uint*) = + OPENCL_FN_clGetDeviceIDs_switch_fn; +opencl_fn5(OPENCL_FN_clGetDeviceInfo, cl_int, (cl_device_id p1, cl_device_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetDeviceInfo)(cl_device_id, cl_device_info, size_t, void*, size_t*) = + OPENCL_FN_clGetDeviceInfo_switch_fn; +opencl_fn5(OPENCL_FN_clCreateSubDevices, cl_int, (cl_device_id p1, const cl_device_partition_property* p2, cl_uint p3, cl_device_id* p4, cl_uint* p5)) +cl_int (CL_API_CALL*clCreateSubDevices)(cl_device_id, const cl_device_partition_property*, cl_uint, cl_device_id*, cl_uint*) = + OPENCL_FN_clCreateSubDevices_switch_fn; +opencl_fn1(OPENCL_FN_clRetainDevice, cl_int, (cl_device_id p1)) +cl_int (CL_API_CALL*clRetainDevice)(cl_device_id) = + OPENCL_FN_clRetainDevice_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseDevice, cl_int, (cl_device_id p1)) +cl_int (CL_API_CALL*clReleaseDevice)(cl_device_id) = + OPENCL_FN_clReleaseDevice_switch_fn; +opencl_fn6(OPENCL_FN_clCreateContext, cl_context, (const cl_context_properties* p1, cl_uint p2, const cl_device_id* p3, void (CL_CALLBACK*p4) (const char*, const void*, size_t, void*), void* p5, cl_int* p6)) +cl_context (CL_API_CALL*clCreateContext)(const cl_context_properties*, cl_uint, const cl_device_id*, void (CL_CALLBACK*) (const char*, const void*, size_t, void*), void*, cl_int*) = + OPENCL_FN_clCreateContext_switch_fn; +opencl_fn5(OPENCL_FN_clCreateContextFromType, cl_context, (const cl_context_properties* p1, cl_device_type p2, void (CL_CALLBACK*p3) (const char*, const void*, size_t, void*), void* p4, cl_int* p5)) +cl_context (CL_API_CALL*clCreateContextFromType)(const cl_context_properties*, cl_device_type, void (CL_CALLBACK*) (const char*, const void*, size_t, void*), void*, cl_int*) = + OPENCL_FN_clCreateContextFromType_switch_fn; +opencl_fn1(OPENCL_FN_clRetainContext, cl_int, (cl_context p1)) +cl_int (CL_API_CALL*clRetainContext)(cl_context) = + OPENCL_FN_clRetainContext_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseContext, cl_int, (cl_context p1)) +cl_int (CL_API_CALL*clReleaseContext)(cl_context) = + OPENCL_FN_clReleaseContext_switch_fn; +opencl_fn5(OPENCL_FN_clGetContextInfo, cl_int, (cl_context p1, cl_context_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetContextInfo)(cl_context, cl_context_info, size_t, void*, size_t*) = + OPENCL_FN_clGetContextInfo_switch_fn; +opencl_fn4(OPENCL_FN_clCreateCommandQueue, cl_command_queue, (cl_context p1, cl_device_id p2, cl_command_queue_properties p3, cl_int* p4)) +cl_command_queue (CL_API_CALL*clCreateCommandQueue)(cl_context, cl_device_id, cl_command_queue_properties, cl_int*) = + OPENCL_FN_clCreateCommandQueue_switch_fn; +opencl_fn1(OPENCL_FN_clRetainCommandQueue, cl_int, (cl_command_queue p1)) +cl_int (CL_API_CALL*clRetainCommandQueue)(cl_command_queue) = + OPENCL_FN_clRetainCommandQueue_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseCommandQueue, cl_int, (cl_command_queue p1)) +cl_int (CL_API_CALL*clReleaseCommandQueue)(cl_command_queue) = + OPENCL_FN_clReleaseCommandQueue_switch_fn; +opencl_fn5(OPENCL_FN_clGetCommandQueueInfo, cl_int, (cl_command_queue p1, cl_command_queue_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetCommandQueueInfo)(cl_command_queue, cl_command_queue_info, size_t, void*, size_t*) = + OPENCL_FN_clGetCommandQueueInfo_switch_fn; +opencl_fn5(OPENCL_FN_clCreateBuffer, cl_mem, (cl_context p1, cl_mem_flags p2, size_t p3, void* p4, cl_int* p5)) +cl_mem (CL_API_CALL*clCreateBuffer)(cl_context, cl_mem_flags, size_t, void*, cl_int*) = + OPENCL_FN_clCreateBuffer_switch_fn; +opencl_fn5(OPENCL_FN_clCreateSubBuffer, cl_mem, (cl_mem p1, cl_mem_flags p2, cl_buffer_create_type p3, const void* p4, cl_int* p5)) +cl_mem (CL_API_CALL*clCreateSubBuffer)(cl_mem, cl_mem_flags, cl_buffer_create_type, const void*, cl_int*) = + OPENCL_FN_clCreateSubBuffer_switch_fn; +opencl_fn6(OPENCL_FN_clCreateImage, cl_mem, (cl_context p1, cl_mem_flags p2, const cl_image_format* p3, const cl_image_desc* p4, void* p5, cl_int* p6)) +cl_mem (CL_API_CALL*clCreateImage)(cl_context, cl_mem_flags, const cl_image_format*, const cl_image_desc*, void*, cl_int*) = + OPENCL_FN_clCreateImage_switch_fn; +opencl_fn1(OPENCL_FN_clRetainMemObject, cl_int, (cl_mem p1)) +cl_int (CL_API_CALL*clRetainMemObject)(cl_mem) = + OPENCL_FN_clRetainMemObject_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseMemObject, cl_int, (cl_mem p1)) +cl_int (CL_API_CALL*clReleaseMemObject)(cl_mem) = + OPENCL_FN_clReleaseMemObject_switch_fn; +opencl_fn6(OPENCL_FN_clGetSupportedImageFormats, cl_int, (cl_context p1, cl_mem_flags p2, cl_mem_object_type p3, cl_uint p4, cl_image_format* p5, cl_uint* p6)) +cl_int (CL_API_CALL*clGetSupportedImageFormats)(cl_context, cl_mem_flags, cl_mem_object_type, cl_uint, cl_image_format*, cl_uint*) = + OPENCL_FN_clGetSupportedImageFormats_switch_fn; +opencl_fn5(OPENCL_FN_clGetMemObjectInfo, cl_int, (cl_mem p1, cl_mem_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetMemObjectInfo)(cl_mem, cl_mem_info, size_t, void*, size_t*) = + OPENCL_FN_clGetMemObjectInfo_switch_fn; +opencl_fn5(OPENCL_FN_clGetImageInfo, cl_int, (cl_mem p1, cl_image_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetImageInfo)(cl_mem, cl_image_info, size_t, void*, size_t*) = + OPENCL_FN_clGetImageInfo_switch_fn; +opencl_fn3(OPENCL_FN_clSetMemObjectDestructorCallback, cl_int, (cl_mem p1, void (CL_CALLBACK*p2) (cl_mem, void*), void* p3)) +cl_int (CL_API_CALL*clSetMemObjectDestructorCallback)(cl_mem, void (CL_CALLBACK*) (cl_mem, void*), void*) = + OPENCL_FN_clSetMemObjectDestructorCallback_switch_fn; +opencl_fn5(OPENCL_FN_clCreateSampler, cl_sampler, (cl_context p1, cl_bool p2, cl_addressing_mode p3, cl_filter_mode p4, cl_int* p5)) +cl_sampler (CL_API_CALL*clCreateSampler)(cl_context, cl_bool, cl_addressing_mode, cl_filter_mode, cl_int*) = + OPENCL_FN_clCreateSampler_switch_fn; +opencl_fn1(OPENCL_FN_clRetainSampler, cl_int, (cl_sampler p1)) +cl_int (CL_API_CALL*clRetainSampler)(cl_sampler) = + OPENCL_FN_clRetainSampler_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseSampler, cl_int, (cl_sampler p1)) +cl_int (CL_API_CALL*clReleaseSampler)(cl_sampler) = + OPENCL_FN_clReleaseSampler_switch_fn; +opencl_fn5(OPENCL_FN_clGetSamplerInfo, cl_int, (cl_sampler p1, cl_sampler_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetSamplerInfo)(cl_sampler, cl_sampler_info, size_t, void*, size_t*) = + OPENCL_FN_clGetSamplerInfo_switch_fn; +opencl_fn5(OPENCL_FN_clCreateProgramWithSource, cl_program, (cl_context p1, cl_uint p2, const char** p3, const size_t* p4, cl_int* p5)) +cl_program (CL_API_CALL*clCreateProgramWithSource)(cl_context, cl_uint, const char**, const size_t*, cl_int*) = + OPENCL_FN_clCreateProgramWithSource_switch_fn; +opencl_fn7(OPENCL_FN_clCreateProgramWithBinary, cl_program, (cl_context p1, cl_uint p2, const cl_device_id* p3, const size_t* p4, const unsigned char** p5, cl_int* p6, cl_int* p7)) +cl_program (CL_API_CALL*clCreateProgramWithBinary)(cl_context, cl_uint, const cl_device_id*, const size_t*, const unsigned char**, cl_int*, cl_int*) = + OPENCL_FN_clCreateProgramWithBinary_switch_fn; +opencl_fn5(OPENCL_FN_clCreateProgramWithBuiltInKernels, cl_program, (cl_context p1, cl_uint p2, const cl_device_id* p3, const char* p4, cl_int* p5)) +cl_program (CL_API_CALL*clCreateProgramWithBuiltInKernels)(cl_context, cl_uint, const cl_device_id*, const char*, cl_int*) = + OPENCL_FN_clCreateProgramWithBuiltInKernels_switch_fn; +opencl_fn1(OPENCL_FN_clRetainProgram, cl_int, (cl_program p1)) +cl_int (CL_API_CALL*clRetainProgram)(cl_program) = + OPENCL_FN_clRetainProgram_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseProgram, cl_int, (cl_program p1)) +cl_int (CL_API_CALL*clReleaseProgram)(cl_program) = + OPENCL_FN_clReleaseProgram_switch_fn; +opencl_fn6(OPENCL_FN_clBuildProgram, cl_int, (cl_program p1, cl_uint p2, const cl_device_id* p3, const char* p4, void (CL_CALLBACK*p5) (cl_program, void*), void* p6)) +cl_int (CL_API_CALL*clBuildProgram)(cl_program, cl_uint, const cl_device_id*, const char*, void (CL_CALLBACK*) (cl_program, void*), void*) = + OPENCL_FN_clBuildProgram_switch_fn; +opencl_fn9(OPENCL_FN_clCompileProgram, cl_int, (cl_program p1, cl_uint p2, const cl_device_id* p3, const char* p4, cl_uint p5, const cl_program* p6, const char** p7, void (CL_CALLBACK*p8) (cl_program, void*), void* p9)) +cl_int (CL_API_CALL*clCompileProgram)(cl_program, cl_uint, const cl_device_id*, const char*, cl_uint, const cl_program*, const char**, void (CL_CALLBACK*) (cl_program, void*), void*) = + OPENCL_FN_clCompileProgram_switch_fn; +opencl_fn9(OPENCL_FN_clLinkProgram, cl_program, (cl_context p1, cl_uint p2, const cl_device_id* p3, const char* p4, cl_uint p5, const cl_program* p6, void (CL_CALLBACK*p7) (cl_program, void*), void* p8, cl_int* p9)) +cl_program (CL_API_CALL*clLinkProgram)(cl_context, cl_uint, const cl_device_id*, const char*, cl_uint, const cl_program*, void (CL_CALLBACK*) (cl_program, void*), void*, cl_int*) = + OPENCL_FN_clLinkProgram_switch_fn; +opencl_fn1(OPENCL_FN_clUnloadPlatformCompiler, cl_int, (cl_platform_id p1)) +cl_int (CL_API_CALL*clUnloadPlatformCompiler)(cl_platform_id) = + OPENCL_FN_clUnloadPlatformCompiler_switch_fn; +opencl_fn5(OPENCL_FN_clGetProgramInfo, cl_int, (cl_program p1, cl_program_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetProgramInfo)(cl_program, cl_program_info, size_t, void*, size_t*) = + OPENCL_FN_clGetProgramInfo_switch_fn; +opencl_fn6(OPENCL_FN_clGetProgramBuildInfo, cl_int, (cl_program p1, cl_device_id p2, cl_program_build_info p3, size_t p4, void* p5, size_t* p6)) +cl_int (CL_API_CALL*clGetProgramBuildInfo)(cl_program, cl_device_id, cl_program_build_info, size_t, void*, size_t*) = + OPENCL_FN_clGetProgramBuildInfo_switch_fn; +opencl_fn3(OPENCL_FN_clCreateKernel, cl_kernel, (cl_program p1, const char* p2, cl_int* p3)) +cl_kernel (CL_API_CALL*clCreateKernel)(cl_program, const char*, cl_int*) = + OPENCL_FN_clCreateKernel_switch_fn; +opencl_fn4(OPENCL_FN_clCreateKernelsInProgram, cl_int, (cl_program p1, cl_uint p2, cl_kernel* p3, cl_uint* p4)) +cl_int (CL_API_CALL*clCreateKernelsInProgram)(cl_program, cl_uint, cl_kernel*, cl_uint*) = + OPENCL_FN_clCreateKernelsInProgram_switch_fn; +opencl_fn1(OPENCL_FN_clRetainKernel, cl_int, (cl_kernel p1)) +cl_int (CL_API_CALL*clRetainKernel)(cl_kernel) = + OPENCL_FN_clRetainKernel_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseKernel, cl_int, (cl_kernel p1)) +cl_int (CL_API_CALL*clReleaseKernel)(cl_kernel) = + OPENCL_FN_clReleaseKernel_switch_fn; +opencl_fn4(OPENCL_FN_clSetKernelArg, cl_int, (cl_kernel p1, cl_uint p2, size_t p3, const void* p4)) +cl_int (CL_API_CALL*clSetKernelArg)(cl_kernel, cl_uint, size_t, const void*) = + OPENCL_FN_clSetKernelArg_switch_fn; +opencl_fn5(OPENCL_FN_clGetKernelInfo, cl_int, (cl_kernel p1, cl_kernel_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetKernelInfo)(cl_kernel, cl_kernel_info, size_t, void*, size_t*) = + OPENCL_FN_clGetKernelInfo_switch_fn; +opencl_fn6(OPENCL_FN_clGetKernelArgInfo, cl_int, (cl_kernel p1, cl_uint p2, cl_kernel_arg_info p3, size_t p4, void* p5, size_t* p6)) +cl_int (CL_API_CALL*clGetKernelArgInfo)(cl_kernel, cl_uint, cl_kernel_arg_info, size_t, void*, size_t*) = + OPENCL_FN_clGetKernelArgInfo_switch_fn; +opencl_fn6(OPENCL_FN_clGetKernelWorkGroupInfo, cl_int, (cl_kernel p1, cl_device_id p2, cl_kernel_work_group_info p3, size_t p4, void* p5, size_t* p6)) +cl_int (CL_API_CALL*clGetKernelWorkGroupInfo)(cl_kernel, cl_device_id, cl_kernel_work_group_info, size_t, void*, size_t*) = + OPENCL_FN_clGetKernelWorkGroupInfo_switch_fn; +opencl_fn2(OPENCL_FN_clWaitForEvents, cl_int, (cl_uint p1, const cl_event* p2)) +cl_int (CL_API_CALL*clWaitForEvents)(cl_uint, const cl_event*) = + OPENCL_FN_clWaitForEvents_switch_fn; +opencl_fn5(OPENCL_FN_clGetEventInfo, cl_int, (cl_event p1, cl_event_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetEventInfo)(cl_event, cl_event_info, size_t, void*, size_t*) = + OPENCL_FN_clGetEventInfo_switch_fn; +opencl_fn2(OPENCL_FN_clCreateUserEvent, cl_event, (cl_context p1, cl_int* p2)) +cl_event (CL_API_CALL*clCreateUserEvent)(cl_context, cl_int*) = + OPENCL_FN_clCreateUserEvent_switch_fn; +opencl_fn1(OPENCL_FN_clRetainEvent, cl_int, (cl_event p1)) +cl_int (CL_API_CALL*clRetainEvent)(cl_event) = + OPENCL_FN_clRetainEvent_switch_fn; +opencl_fn1(OPENCL_FN_clReleaseEvent, cl_int, (cl_event p1)) +cl_int (CL_API_CALL*clReleaseEvent)(cl_event) = + OPENCL_FN_clReleaseEvent_switch_fn; +opencl_fn2(OPENCL_FN_clSetUserEventStatus, cl_int, (cl_event p1, cl_int p2)) +cl_int (CL_API_CALL*clSetUserEventStatus)(cl_event, cl_int) = + OPENCL_FN_clSetUserEventStatus_switch_fn; +opencl_fn4(OPENCL_FN_clSetEventCallback, cl_int, (cl_event p1, cl_int p2, void (CL_CALLBACK*p3) (cl_event, cl_int, void*), void* p4)) +cl_int (CL_API_CALL*clSetEventCallback)(cl_event, cl_int, void (CL_CALLBACK*) (cl_event, cl_int, void*), void*) = + OPENCL_FN_clSetEventCallback_switch_fn; +opencl_fn5(OPENCL_FN_clGetEventProfilingInfo, cl_int, (cl_event p1, cl_profiling_info p2, size_t p3, void* p4, size_t* p5)) +cl_int (CL_API_CALL*clGetEventProfilingInfo)(cl_event, cl_profiling_info, size_t, void*, size_t*) = + OPENCL_FN_clGetEventProfilingInfo_switch_fn; +opencl_fn1(OPENCL_FN_clFlush, cl_int, (cl_command_queue p1)) +cl_int (CL_API_CALL*clFlush)(cl_command_queue) = + OPENCL_FN_clFlush_switch_fn; +opencl_fn1(OPENCL_FN_clFinish, cl_int, (cl_command_queue p1)) +cl_int (CL_API_CALL*clFinish)(cl_command_queue) = + OPENCL_FN_clFinish_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueReadBuffer, cl_int, (cl_command_queue p1, cl_mem p2, cl_bool p3, size_t p4, size_t p5, void* p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueReadBuffer)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueReadBuffer_switch_fn; +opencl_fn14(OPENCL_FN_clEnqueueReadBufferRect, cl_int, (cl_command_queue p1, cl_mem p2, cl_bool p3, const size_t* p4, const size_t* p5, const size_t* p6, size_t p7, size_t p8, size_t p9, size_t p10, void* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +cl_int (CL_API_CALL*clEnqueueReadBufferRect)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueReadBufferRect_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueWriteBuffer, cl_int, (cl_command_queue p1, cl_mem p2, cl_bool p3, size_t p4, size_t p5, const void* p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueWriteBuffer)(cl_command_queue, cl_mem, cl_bool, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueWriteBuffer_switch_fn; +opencl_fn14(OPENCL_FN_clEnqueueWriteBufferRect, cl_int, (cl_command_queue p1, cl_mem p2, cl_bool p3, const size_t* p4, const size_t* p5, const size_t* p6, size_t p7, size_t p8, size_t p9, size_t p10, const void* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +cl_int (CL_API_CALL*clEnqueueWriteBufferRect)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueWriteBufferRect_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueFillBuffer, cl_int, (cl_command_queue p1, cl_mem p2, const void* p3, size_t p4, size_t p5, size_t p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueFillBuffer)(cl_command_queue, cl_mem, const void*, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueFillBuffer_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueCopyBuffer, cl_int, (cl_command_queue p1, cl_mem p2, cl_mem p3, size_t p4, size_t p5, size_t p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueCopyBuffer)(cl_command_queue, cl_mem, cl_mem, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueCopyBuffer_switch_fn; +opencl_fn13(OPENCL_FN_clEnqueueCopyBufferRect, cl_int, (cl_command_queue p1, cl_mem p2, cl_mem p3, const size_t* p4, const size_t* p5, const size_t* p6, size_t p7, size_t p8, size_t p9, size_t p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +cl_int (CL_API_CALL*clEnqueueCopyBufferRect)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, const size_t*, size_t, size_t, size_t, size_t, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueCopyBufferRect_switch_fn; +opencl_fn11(OPENCL_FN_clEnqueueReadImage, cl_int, (cl_command_queue p1, cl_mem p2, cl_bool p3, const size_t* p4, const size_t* p5, size_t p6, size_t p7, void* p8, cl_uint p9, const cl_event* p10, cl_event* p11)) +cl_int (CL_API_CALL*clEnqueueReadImage)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, size_t, size_t, void*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueReadImage_switch_fn; +opencl_fn11(OPENCL_FN_clEnqueueWriteImage, cl_int, (cl_command_queue p1, cl_mem p2, cl_bool p3, const size_t* p4, const size_t* p5, size_t p6, size_t p7, const void* p8, cl_uint p9, const cl_event* p10, cl_event* p11)) +cl_int (CL_API_CALL*clEnqueueWriteImage)(cl_command_queue, cl_mem, cl_bool, const size_t*, const size_t*, size_t, size_t, const void*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueWriteImage_switch_fn; +opencl_fn8(OPENCL_FN_clEnqueueFillImage, cl_int, (cl_command_queue p1, cl_mem p2, const void* p3, const size_t* p4, const size_t* p5, cl_uint p6, const cl_event* p7, cl_event* p8)) +cl_int (CL_API_CALL*clEnqueueFillImage)(cl_command_queue, cl_mem, const void*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueFillImage_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueCopyImage, cl_int, (cl_command_queue p1, cl_mem p2, cl_mem p3, const size_t* p4, const size_t* p5, const size_t* p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueCopyImage)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueCopyImage_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueCopyImageToBuffer, cl_int, (cl_command_queue p1, cl_mem p2, cl_mem p3, const size_t* p4, const size_t* p5, size_t p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueCopyImageToBuffer)(cl_command_queue, cl_mem, cl_mem, const size_t*, const size_t*, size_t, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueCopyImageToBuffer_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueCopyBufferToImage, cl_int, (cl_command_queue p1, cl_mem p2, cl_mem p3, size_t p4, const size_t* p5, const size_t* p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueCopyBufferToImage)(cl_command_queue, cl_mem, cl_mem, size_t, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueCopyBufferToImage_switch_fn; +opencl_fn10(OPENCL_FN_clEnqueueMapBuffer, void*, (cl_command_queue p1, cl_mem p2, cl_bool p3, cl_map_flags p4, size_t p5, size_t p6, cl_uint p7, const cl_event* p8, cl_event* p9, cl_int* p10)) +void* (CL_API_CALL*clEnqueueMapBuffer)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, size_t, size_t, cl_uint, const cl_event*, cl_event*, cl_int*) = + OPENCL_FN_clEnqueueMapBuffer_switch_fn; +opencl_fn12(OPENCL_FN_clEnqueueMapImage, void*, (cl_command_queue p1, cl_mem p2, cl_bool p3, cl_map_flags p4, const size_t* p5, const size_t* p6, size_t* p7, size_t* p8, cl_uint p9, const cl_event* p10, cl_event* p11, cl_int* p12)) +void* (CL_API_CALL*clEnqueueMapImage)(cl_command_queue, cl_mem, cl_bool, cl_map_flags, const size_t*, const size_t*, size_t*, size_t*, cl_uint, const cl_event*, cl_event*, cl_int*) = + OPENCL_FN_clEnqueueMapImage_switch_fn; +opencl_fn6(OPENCL_FN_clEnqueueUnmapMemObject, cl_int, (cl_command_queue p1, cl_mem p2, void* p3, cl_uint p4, const cl_event* p5, cl_event* p6)) +cl_int (CL_API_CALL*clEnqueueUnmapMemObject)(cl_command_queue, cl_mem, void*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueUnmapMemObject_switch_fn; +opencl_fn7(OPENCL_FN_clEnqueueMigrateMemObjects, cl_int, (cl_command_queue p1, cl_uint p2, const cl_mem* p3, cl_mem_migration_flags p4, cl_uint p5, const cl_event* p6, cl_event* p7)) +cl_int (CL_API_CALL*clEnqueueMigrateMemObjects)(cl_command_queue, cl_uint, const cl_mem*, cl_mem_migration_flags, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueMigrateMemObjects_switch_fn; +opencl_fn9(OPENCL_FN_clEnqueueNDRangeKernel, cl_int, (cl_command_queue p1, cl_kernel p2, cl_uint p3, const size_t* p4, const size_t* p5, const size_t* p6, cl_uint p7, const cl_event* p8, cl_event* p9)) +cl_int (CL_API_CALL*clEnqueueNDRangeKernel)(cl_command_queue, cl_kernel, cl_uint, const size_t*, const size_t*, const size_t*, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueNDRangeKernel_switch_fn; +opencl_fn5(OPENCL_FN_clEnqueueTask, cl_int, (cl_command_queue p1, cl_kernel p2, cl_uint p3, const cl_event* p4, cl_event* p5)) +cl_int (CL_API_CALL*clEnqueueTask)(cl_command_queue, cl_kernel, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueTask_switch_fn; +opencl_fn10(OPENCL_FN_clEnqueueNativeKernel, cl_int, (cl_command_queue p1, void (CL_CALLBACK*p2) (void*), void* p3, size_t p4, cl_uint p5, const cl_mem* p6, const void** p7, cl_uint p8, const cl_event* p9, cl_event* p10)) +cl_int (CL_API_CALL*clEnqueueNativeKernel)(cl_command_queue, void (CL_CALLBACK*) (void*), void*, size_t, cl_uint, const cl_mem*, const void**, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueNativeKernel_switch_fn; +opencl_fn4(OPENCL_FN_clEnqueueMarkerWithWaitList, cl_int, (cl_command_queue p1, cl_uint p2, const cl_event* p3, cl_event* p4)) +cl_int (CL_API_CALL*clEnqueueMarkerWithWaitList)(cl_command_queue, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueMarkerWithWaitList_switch_fn; +opencl_fn4(OPENCL_FN_clEnqueueBarrierWithWaitList, cl_int, (cl_command_queue p1, cl_uint p2, const cl_event* p3, cl_event* p4)) +cl_int (CL_API_CALL*clEnqueueBarrierWithWaitList)(cl_command_queue, cl_uint, const cl_event*, cl_event*) = + OPENCL_FN_clEnqueueBarrierWithWaitList_switch_fn; +opencl_fn2(OPENCL_FN_clGetExtensionFunctionAddressForPlatform, void*, (cl_platform_id p1, const char* p2)) +void* (CL_API_CALL*clGetExtensionFunctionAddressForPlatform)(cl_platform_id, const char*) = + OPENCL_FN_clGetExtensionFunctionAddressForPlatform_switch_fn; +opencl_fn8(OPENCL_FN_clCreateImage2D, cl_mem, (cl_context p1, cl_mem_flags p2, const cl_image_format* p3, size_t p4, size_t p5, size_t p6, void* p7, cl_int* p8)) +cl_mem (CL_API_CALL*clCreateImage2D)(cl_context, cl_mem_flags, const cl_image_format*, size_t, size_t, size_t, void*, cl_int*) = + OPENCL_FN_clCreateImage2D_switch_fn; +opencl_fn10(OPENCL_FN_clCreateImage3D, cl_mem, (cl_context p1, cl_mem_flags p2, const cl_image_format* p3, size_t p4, size_t p5, size_t p6, size_t p7, size_t p8, void* p9, cl_int* p10)) +cl_mem (CL_API_CALL*clCreateImage3D)(cl_context, cl_mem_flags, const cl_image_format*, size_t, size_t, size_t, size_t, size_t, void*, cl_int*) = + OPENCL_FN_clCreateImage3D_switch_fn; +opencl_fn2(OPENCL_FN_clEnqueueMarker, cl_int, (cl_command_queue p1, cl_event* p2)) +cl_int (CL_API_CALL*clEnqueueMarker)(cl_command_queue, cl_event*) = + OPENCL_FN_clEnqueueMarker_switch_fn; +opencl_fn3(OPENCL_FN_clEnqueueWaitForEvents, cl_int, (cl_command_queue p1, cl_uint p2, const cl_event* p3)) +cl_int (CL_API_CALL*clEnqueueWaitForEvents)(cl_command_queue, cl_uint, const cl_event*) = + OPENCL_FN_clEnqueueWaitForEvents_switch_fn; +opencl_fn1(OPENCL_FN_clEnqueueBarrier, cl_int, (cl_command_queue p1)) +cl_int (CL_API_CALL*clEnqueueBarrier)(cl_command_queue) = + OPENCL_FN_clEnqueueBarrier_switch_fn; +opencl_fn0(OPENCL_FN_clUnloadCompiler, cl_int, ()) +cl_int (CL_API_CALL*clUnloadCompiler)() = + OPENCL_FN_clUnloadCompiler_switch_fn; +opencl_fn1(OPENCL_FN_clGetExtensionFunctionAddress, void*, (const char* p1)) +void* (CL_API_CALL*clGetExtensionFunctionAddress)(const char*) = + OPENCL_FN_clGetExtensionFunctionAddress_switch_fn; // generated by parser_cl.py void* opencl_fn_ptrs[] = { diff --git a/modules/ocl/src/cl_runtime/clamdblas_runtime.cpp b/modules/ocl/src/cl_runtime/clamdblas_runtime.cpp index 1256000c8c..5cb59d0621 100644 --- a/modules/ocl/src/cl_runtime/clamdblas_runtime.cpp +++ b/modules/ocl/src/cl_runtime/clamdblas_runtime.cpp @@ -423,368 +423,649 @@ static void* openclamdblas_check_fn(int ID) namespace { // generated by parser_clamdblas.py -template -struct openclamdblas_fn0 -{ - typedef _R (*FN)(); - static _R switch_fn() - { return ((FN)openclamdblas_check_fn(ID))(); } -}; +#define openclamdblas_fn0(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(); } \ -template -struct openclamdblas_fn1 -{ - typedef _R (*FN)(_T1); - static _R switch_fn(_T1 p1) - { return ((FN)openclamdblas_check_fn(ID))(p1); } -}; +#define openclamdblas_fn1(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1); } \ -template -struct openclamdblas_fn2 -{ - typedef _R (*FN)(_T1, _T2); - static _R switch_fn(_T1 p1, _T2 p2) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2); } -}; +#define openclamdblas_fn2(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2); } \ -template -struct openclamdblas_fn3 -{ - typedef _R (*FN)(_T1, _T2, _T3); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3); } -}; +#define openclamdblas_fn3(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3); } \ -template -struct openclamdblas_fn4 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4); } -}; +#define openclamdblas_fn4(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4); } \ -template -struct openclamdblas_fn5 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5); } -}; +#define openclamdblas_fn5(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5); } \ -template -struct openclamdblas_fn6 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6); } -}; +#define openclamdblas_fn6(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6); } \ -template -struct openclamdblas_fn7 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7); } -}; +#define openclamdblas_fn7(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7); } \ -template -struct openclamdblas_fn8 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8); } -}; +#define openclamdblas_fn8(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8); } \ -template -struct openclamdblas_fn9 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } -}; +#define openclamdblas_fn9(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } \ -template -struct openclamdblas_fn10 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } -}; +#define openclamdblas_fn10(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } \ -template -struct openclamdblas_fn11 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } -}; +#define openclamdblas_fn11(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } \ -template -struct openclamdblas_fn12 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } -}; +#define openclamdblas_fn12(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } \ -template -struct openclamdblas_fn13 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } -}; +#define openclamdblas_fn13(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } \ -template -struct openclamdblas_fn14 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } -}; +#define openclamdblas_fn14(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } \ -template -struct openclamdblas_fn15 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } -}; +#define openclamdblas_fn15(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } \ -template -struct openclamdblas_fn16 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } -}; +#define openclamdblas_fn16(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } \ -template -struct openclamdblas_fn17 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } -}; +#define openclamdblas_fn17(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } \ -template -struct openclamdblas_fn18 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } -}; +#define openclamdblas_fn18(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } \ -template -struct openclamdblas_fn19 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } -}; +#define openclamdblas_fn19(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } \ -template -struct openclamdblas_fn20 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19, _T20 p20) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } -}; +#define openclamdblas_fn20(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } \ -template -struct openclamdblas_fn21 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20, _T21); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19, _T20 p20, _T21 p21) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21); } -}; +#define openclamdblas_fn21(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21); } \ -template -struct openclamdblas_fn22 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20, _T21, _T22); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19, _T20 p20, _T21 p21, _T22 p22) - { return ((FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22); } -}; +#define openclamdblas_fn22(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdblas_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22); } \ } // generated by parser_clamdblas.py -clAmdBlasStatus (*clAmdBlasGetVersion)(cl_uint*, cl_uint*, cl_uint*) = openclamdblas_fn3::switch_fn; -clAmdBlasStatus (*clAmdBlasSetup)() = openclamdblas_fn0::switch_fn; -void (*clAmdBlasTeardown)() = openclamdblas_fn0::switch_fn; -cl_ulong (*clAmdBlasAddScratchImage)(cl_context, size_t, size_t, clAmdBlasStatus*) = openclamdblas_fn4::switch_fn; -clAmdBlasStatus (*clAmdBlasRemoveScratchImage)(cl_ulong) = openclamdblas_fn1::switch_fn; -clAmdBlasStatus (*clAmdBlasSswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasDswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasCswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasZswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasSscal)(size_t, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn10::switch_fn; -clAmdBlasStatus (*clAmdBlasDscal)(size_t, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn10::switch_fn; -clAmdBlasStatus (*clAmdBlasCscal)(size_t, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn10::switch_fn; -clAmdBlasStatus (*clAmdBlasZscal)(size_t, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn10::switch_fn; -clAmdBlasStatus (*clAmdBlasCsscal)(size_t, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn10::switch_fn; -clAmdBlasStatus (*clAmdBlasZdscal)(size_t, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn10::switch_fn; -clAmdBlasStatus (*clAmdBlasScopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasDcopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasCcopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasZcopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasSaxpy)(size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasDaxpy)(size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasCaxpy)(size_t, cl_float2, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasZaxpy)(size_t, cl_double2, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasSdot)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasDdot)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasCdotu)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasZdotu)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasCdotc)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasZdotc)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasSrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasDrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasCrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasZrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn13::switch_fn; -clAmdBlasStatus (*clAmdBlasSrotmg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasDrotmg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasSrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_float, cl_float, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasDrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_double, cl_double, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasCsrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_float, cl_float, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasZdrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_double, cl_double, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasSrotm)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, const cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasDrotm)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, const cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasSnrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasDnrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasScnrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasDznrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasiSamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasiDamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasiCamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasiZamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasSasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasDasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasScasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasDzasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn12::switch_fn; -clAmdBlasStatus (*clAmdBlasSgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasDgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasCgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, const cl_mem, size_t, int, FloatComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasZgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, const cl_mem, size_t, int, DoubleComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasSgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasDgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasCgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, FloatComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasZgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, DoubleComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasSsymv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasDsymv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasSsymvEx)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasDsymvEx)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasChemv)(clAmdBlasOrder, clAmdBlasUplo, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, FloatComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasZhemv)(clAmdBlasOrder, clAmdBlasUplo, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, DoubleComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasStrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasDtrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasCtrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasZtrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasStrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasDtrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasCtrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasZtrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasSger)(clAmdBlasOrder, size_t, size_t, cl_float, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasDger)(clAmdBlasOrder, size_t, size_t, cl_double, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasCgeru)(clAmdBlasOrder, size_t, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZgeru)(clAmdBlasOrder, size_t, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasCgerc)(clAmdBlasOrder, size_t, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZgerc)(clAmdBlasOrder, size_t, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasSsyr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasDsyr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasCher)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasZher)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasSsyr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasDsyr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasCher2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZher2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasStpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasDtpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasCtpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasZtpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasStpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasDtpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasCtpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasZtpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn15::switch_fn; -clAmdBlasStatus (*clAmdBlasSspmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasDspmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasChpmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float2, const cl_mem, size_t, const cl_mem, size_t, int, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZhpmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double2, const cl_mem, size_t, const cl_mem, size_t, int, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasSspr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasDspr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasChpr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasZhpr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn14::switch_fn; -clAmdBlasStatus (*clAmdBlasSspr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasDspr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasChpr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasZhpr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasSgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasDgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasCgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasZgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasStbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasDtbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasCtbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZtbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasSsbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasDsbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasChbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasZhbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn20::switch_fn; -clAmdBlasStatus (*clAmdBlasStbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasDtbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasCtbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasZtbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasSgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, cl_float, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasDgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, cl_double, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasCgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, FloatComplex, const cl_mem, size_t, const cl_mem, size_t, FloatComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasZgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, DoubleComplex, const cl_mem, size_t, const cl_mem, size_t, DoubleComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasSgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasDgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasCgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, FloatComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasZgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, DoubleComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn22::switch_fn; -clAmdBlasStatus (*clAmdBlasStrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasDtrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasCtrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasZtrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasStrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasDtrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasCtrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasZtrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasStrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasDtrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasCtrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasZtrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn17::switch_fn; -clAmdBlasStatus (*clAmdBlasStrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasDtrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasCtrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasZtrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn19::switch_fn; -clAmdBlasStatus (*clAmdBlasSsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, cl_float, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasDsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, cl_double, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasCsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, FloatComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasZsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, DoubleComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn16::switch_fn; -clAmdBlasStatus (*clAmdBlasSsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasDsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasCsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, FloatComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, DoubleComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasSsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, cl_float, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasDsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, cl_double, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasCsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, const cl_mem, size_t, FloatComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, const cl_mem, size_t, DoubleComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasSsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasDsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasCsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, FloatComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasZsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, DoubleComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasSsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasDsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasCsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasZsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasChemm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasZhemm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasCherk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, float, const cl_mem, size_t, size_t, float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasZherk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, double, const cl_mem, size_t, size_t, double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn18::switch_fn; -clAmdBlasStatus (*clAmdBlasCher2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; -clAmdBlasStatus (*clAmdBlasZher2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = openclamdblas_fn21::switch_fn; +openclamdblas_fn3(OPENCLAMDBLAS_FN_clAmdBlasGetVersion, clAmdBlasStatus, (cl_uint* p1, cl_uint* p2, cl_uint* p3)) +clAmdBlasStatus (*clAmdBlasGetVersion)(cl_uint*, cl_uint*, cl_uint*) = + OPENCLAMDBLAS_FN_clAmdBlasGetVersion_switch_fn; +openclamdblas_fn0(OPENCLAMDBLAS_FN_clAmdBlasSetup, clAmdBlasStatus, ()) +clAmdBlasStatus (*clAmdBlasSetup)() = + OPENCLAMDBLAS_FN_clAmdBlasSetup_switch_fn; +openclamdblas_fn0(OPENCLAMDBLAS_FN_clAmdBlasTeardown, void, ()) +void (*clAmdBlasTeardown)() = + OPENCLAMDBLAS_FN_clAmdBlasTeardown_switch_fn; +openclamdblas_fn4(OPENCLAMDBLAS_FN_clAmdBlasAddScratchImage, cl_ulong, (cl_context p1, size_t p2, size_t p3, clAmdBlasStatus* p4)) +cl_ulong (*clAmdBlasAddScratchImage)(cl_context, size_t, size_t, clAmdBlasStatus*) = + OPENCLAMDBLAS_FN_clAmdBlasAddScratchImage_switch_fn; +openclamdblas_fn1(OPENCLAMDBLAS_FN_clAmdBlasRemoveScratchImage, clAmdBlasStatus, (cl_ulong p1)) +clAmdBlasStatus (*clAmdBlasRemoveScratchImage)(cl_ulong) = + OPENCLAMDBLAS_FN_clAmdBlasRemoveScratchImage_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasSswap, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasSswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSswap_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasDswap, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasDswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDswap_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasCswap, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasCswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCswap_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasZswap, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasZswap)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZswap_switch_fn; +openclamdblas_fn10(OPENCLAMDBLAS_FN_clAmdBlasSscal, clAmdBlasStatus, (size_t p1, cl_float p2, cl_mem p3, size_t p4, int p5, cl_uint p6, cl_command_queue* p7, cl_uint p8, const cl_event* p9, cl_event* p10)) +clAmdBlasStatus (*clAmdBlasSscal)(size_t, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSscal_switch_fn; +openclamdblas_fn10(OPENCLAMDBLAS_FN_clAmdBlasDscal, clAmdBlasStatus, (size_t p1, cl_double p2, cl_mem p3, size_t p4, int p5, cl_uint p6, cl_command_queue* p7, cl_uint p8, const cl_event* p9, cl_event* p10)) +clAmdBlasStatus (*clAmdBlasDscal)(size_t, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDscal_switch_fn; +openclamdblas_fn10(OPENCLAMDBLAS_FN_clAmdBlasCscal, clAmdBlasStatus, (size_t p1, cl_float2 p2, cl_mem p3, size_t p4, int p5, cl_uint p6, cl_command_queue* p7, cl_uint p8, const cl_event* p9, cl_event* p10)) +clAmdBlasStatus (*clAmdBlasCscal)(size_t, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCscal_switch_fn; +openclamdblas_fn10(OPENCLAMDBLAS_FN_clAmdBlasZscal, clAmdBlasStatus, (size_t p1, cl_double2 p2, cl_mem p3, size_t p4, int p5, cl_uint p6, cl_command_queue* p7, cl_uint p8, const cl_event* p9, cl_event* p10)) +clAmdBlasStatus (*clAmdBlasZscal)(size_t, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZscal_switch_fn; +openclamdblas_fn10(OPENCLAMDBLAS_FN_clAmdBlasCsscal, clAmdBlasStatus, (size_t p1, cl_float p2, cl_mem p3, size_t p4, int p5, cl_uint p6, cl_command_queue* p7, cl_uint p8, const cl_event* p9, cl_event* p10)) +clAmdBlasStatus (*clAmdBlasCsscal)(size_t, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCsscal_switch_fn; +openclamdblas_fn10(OPENCLAMDBLAS_FN_clAmdBlasZdscal, clAmdBlasStatus, (size_t p1, cl_double p2, cl_mem p3, size_t p4, int p5, cl_uint p6, cl_command_queue* p7, cl_uint p8, const cl_event* p9, cl_event* p10)) +clAmdBlasStatus (*clAmdBlasZdscal)(size_t, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZdscal_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasScopy, clAmdBlasStatus, (size_t p1, const cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasScopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasScopy_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasDcopy, clAmdBlasStatus, (size_t p1, const cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasDcopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDcopy_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasCcopy, clAmdBlasStatus, (size_t p1, const cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasCcopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCcopy_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasZcopy, clAmdBlasStatus, (size_t p1, const cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasZcopy)(size_t, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZcopy_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasSaxpy, clAmdBlasStatus, (size_t p1, cl_float p2, const cl_mem p3, size_t p4, int p5, cl_mem p6, size_t p7, int p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasSaxpy)(size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSaxpy_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasDaxpy, clAmdBlasStatus, (size_t p1, cl_double p2, const cl_mem p3, size_t p4, int p5, cl_mem p6, size_t p7, int p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasDaxpy)(size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDaxpy_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasCaxpy, clAmdBlasStatus, (size_t p1, cl_float2 p2, const cl_mem p3, size_t p4, int p5, cl_mem p6, size_t p7, int p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasCaxpy)(size_t, cl_float2, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCaxpy_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasZaxpy, clAmdBlasStatus, (size_t p1, cl_double2 p2, const cl_mem p3, size_t p4, int p5, cl_mem p6, size_t p7, int p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasZaxpy)(size_t, cl_double2, const cl_mem, size_t, int, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZaxpy_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasSdot, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, const cl_mem p7, size_t p8, int p9, cl_mem p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasSdot)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSdot_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasDdot, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, const cl_mem p7, size_t p8, int p9, cl_mem p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasDdot)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDdot_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasCdotu, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, const cl_mem p7, size_t p8, int p9, cl_mem p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasCdotu)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCdotu_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasZdotu, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, const cl_mem p7, size_t p8, int p9, cl_mem p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasZdotu)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZdotu_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasCdotc, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, const cl_mem p7, size_t p8, int p9, cl_mem p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasCdotc)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCdotc_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasZdotc, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, const cl_mem p7, size_t p8, int p9, cl_mem p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasZdotc)(size_t, cl_mem, size_t, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZdotc_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasSrotg, clAmdBlasStatus, (cl_mem p1, size_t p2, cl_mem p3, size_t p4, cl_mem p5, size_t p6, cl_mem p7, size_t p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasSrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSrotg_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasDrotg, clAmdBlasStatus, (cl_mem p1, size_t p2, cl_mem p3, size_t p4, cl_mem p5, size_t p6, cl_mem p7, size_t p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasDrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDrotg_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasCrotg, clAmdBlasStatus, (cl_mem p1, size_t p2, cl_mem p3, size_t p4, cl_mem p5, size_t p6, cl_mem p7, size_t p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasCrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCrotg_switch_fn; +openclamdblas_fn13(OPENCLAMDBLAS_FN_clAmdBlasZrotg, clAmdBlasStatus, (cl_mem p1, size_t p2, cl_mem p3, size_t p4, cl_mem p5, size_t p6, cl_mem p7, size_t p8, cl_uint p9, cl_command_queue* p10, cl_uint p11, const cl_event* p12, cl_event* p13)) +clAmdBlasStatus (*clAmdBlasZrotg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZrotg_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasSrotmg, clAmdBlasStatus, (cl_mem p1, size_t p2, cl_mem p3, size_t p4, cl_mem p5, size_t p6, const cl_mem p7, size_t p8, cl_mem p9, size_t p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasSrotmg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSrotmg_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasDrotmg, clAmdBlasStatus, (cl_mem p1, size_t p2, cl_mem p3, size_t p4, cl_mem p5, size_t p6, const cl_mem p7, size_t p8, cl_mem p9, size_t p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasDrotmg)(cl_mem, size_t, cl_mem, size_t, cl_mem, size_t, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDrotmg_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasSrot, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_float p8, cl_float p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasSrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_float, cl_float, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSrot_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasDrot, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_double p8, cl_double p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasDrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_double, cl_double, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDrot_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasCsrot, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_float p8, cl_float p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasCsrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_float, cl_float, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCsrot_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasZdrot, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, cl_double p8, cl_double p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasZdrot)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, cl_double, cl_double, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZdrot_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasSrotm, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasSrotm)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, const cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSrotm_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasDrotm, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, int p4, cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasDrotm)(size_t, cl_mem, size_t, int, cl_mem, size_t, int, const cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDrotm_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasSnrm2, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasSnrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSnrm2_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasDnrm2, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasDnrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDnrm2_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasScnrm2, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasScnrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasScnrm2_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasDznrm2, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasDznrm2)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDznrm2_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasiSamax, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasiSamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasiSamax_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasiDamax, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasiDamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasiDamax_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasiCamax, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasiCamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasiCamax_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasiZamax, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasiZamax)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasiZamax_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasSasum, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasSasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSasum_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasDasum, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasDasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDasum_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasScasum, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasScasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasScasum_switch_fn; +openclamdblas_fn12(OPENCLAMDBLAS_FN_clAmdBlasDzasum, clAmdBlasStatus, (size_t p1, cl_mem p2, size_t p3, const cl_mem p4, size_t p5, int p6, cl_mem p7, cl_uint p8, cl_command_queue* p9, cl_uint p10, const cl_event* p11, cl_event* p12)) +clAmdBlasStatus (*clAmdBlasDzasum)(size_t, cl_mem, size_t, const cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDzasum_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasSgemv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, cl_float p5, const cl_mem p6, size_t p7, const cl_mem p8, size_t p9, int p10, cl_float p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasSgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSgemv_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasDgemv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, cl_double p5, const cl_mem p6, size_t p7, const cl_mem p8, size_t p9, int p10, cl_double p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasDgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDgemv_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasCgemv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, FloatComplex p5, const cl_mem p6, size_t p7, const cl_mem p8, size_t p9, int p10, FloatComplex p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasCgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, const cl_mem, size_t, int, FloatComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCgemv_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasZgemv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, DoubleComplex p5, const cl_mem p6, size_t p7, const cl_mem p8, size_t p9, int p10, DoubleComplex p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasZgemv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, const cl_mem, size_t, int, DoubleComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZgemv_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasSgemvEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, cl_float p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, cl_float p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasSgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSgemvEx_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasDgemvEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, cl_double p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, cl_double p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasDgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDgemvEx_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasCgemvEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, FloatComplex p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, FloatComplex p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasCgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, FloatComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCgemvEx_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasZgemvEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, DoubleComplex p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, DoubleComplex p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasZgemvEx)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, DoubleComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZgemvEx_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasSsymv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, const cl_mem p7, size_t p8, int p9, cl_float p10, cl_mem p11, size_t p12, int p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasSsymv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsymv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasDsymv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, const cl_mem p7, size_t p8, int p9, cl_double p10, cl_mem p11, size_t p12, int p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasDsymv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsymv_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasSsymvEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, size_t p7, const cl_mem p8, size_t p9, int p10, cl_float p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasSsymvEx)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsymvEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasDsymvEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, size_t p7, const cl_mem p8, size_t p9, int p10, cl_double p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasDsymvEx)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsymvEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasChemv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, FloatComplex p4, const cl_mem p5, size_t p6, size_t p7, const cl_mem p8, size_t p9, int p10, FloatComplex p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasChemv)(clAmdBlasOrder, clAmdBlasUplo, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, FloatComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasChemv_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasZhemv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, DoubleComplex p4, const cl_mem p5, size_t p6, size_t p7, const cl_mem p8, size_t p9, int p10, DoubleComplex p11, cl_mem p12, size_t p13, int p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasZhemv)(clAmdBlasOrder, clAmdBlasUplo, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, int, DoubleComplex, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZhemv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasStrmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_mem p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasStrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStrmv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasDtrmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_mem p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasDtrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtrmv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasCtrmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_mem p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasCtrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtrmv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasZtrmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_mem p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasZtrmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtrmv_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasStrsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasStrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStrsv_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasDtrsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasDtrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtrsv_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasCtrsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasCtrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtrsv_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasZtrsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, size_t p8, cl_mem p9, size_t p10, int p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasZtrsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtrsv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasSger, clAmdBlasStatus, (clAmdBlasOrder p1, size_t p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasSger)(clAmdBlasOrder, size_t, size_t, cl_float, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSger_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasDger, clAmdBlasStatus, (clAmdBlasOrder p1, size_t p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasDger)(clAmdBlasOrder, size_t, size_t, cl_double, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDger_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasCgeru, clAmdBlasStatus, (clAmdBlasOrder p1, size_t p2, size_t p3, cl_float2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasCgeru)(clAmdBlasOrder, size_t, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCgeru_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZgeru, clAmdBlasStatus, (clAmdBlasOrder p1, size_t p2, size_t p3, cl_double2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZgeru)(clAmdBlasOrder, size_t, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZgeru_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasCgerc, clAmdBlasStatus, (clAmdBlasOrder p1, size_t p2, size_t p3, cl_float2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasCgerc)(clAmdBlasOrder, size_t, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCgerc_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZgerc, clAmdBlasStatus, (clAmdBlasOrder p1, size_t p2, size_t p3, cl_double2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZgerc)(clAmdBlasOrder, size_t, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZgerc_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasSsyr, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, size_t p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasSsyr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsyr_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasDsyr, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, size_t p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasDsyr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsyr_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasCher, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, size_t p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasCher)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCher_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasZher, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, size_t p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasZher)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZher_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasSsyr2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasSsyr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsyr2_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasDsyr2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasDsyr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsyr2_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasCher2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasCher2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCher2_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZher2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZher2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZher2_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasStpmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_mem p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasStpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStpmv_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasDtpmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_mem p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasDtpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtpmv_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasCtpmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_mem p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasCtpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtpmv_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasZtpmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_mem p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasZtpmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtpmv_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasStpsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasStpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStpsv_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasDtpsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasDtpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtpsv_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasCtpsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasCtpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtpsv_switch_fn; +openclamdblas_fn15(OPENCLAMDBLAS_FN_clAmdBlasZtpsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, const cl_mem p6, size_t p7, cl_mem p8, size_t p9, int p10, cl_uint p11, cl_command_queue* p12, cl_uint p13, const cl_event* p14, cl_event* p15)) +clAmdBlasStatus (*clAmdBlasZtpsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, const cl_mem, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtpsv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasSspmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, const cl_mem p7, size_t p8, int p9, cl_float p10, cl_mem p11, size_t p12, int p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasSspmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSspmv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasDspmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, const cl_mem p7, size_t p8, int p9, cl_double p10, cl_mem p11, size_t p12, int p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasDspmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDspmv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasChpmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float2 p4, const cl_mem p5, size_t p6, const cl_mem p7, size_t p8, int p9, cl_float2 p10, cl_mem p11, size_t p12, int p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasChpmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float2, const cl_mem, size_t, const cl_mem, size_t, int, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasChpmv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZhpmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double2 p4, const cl_mem p5, size_t p6, const cl_mem p7, size_t p8, int p9, cl_double2 p10, cl_mem p11, size_t p12, int p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZhpmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double2, const cl_mem, size_t, const cl_mem, size_t, int, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZhpmv_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasSspr, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasSspr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSspr_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasDspr, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasDspr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDspr_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasChpr, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasChpr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasChpr_switch_fn; +openclamdblas_fn14(OPENCLAMDBLAS_FN_clAmdBlasZhpr, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, int p7, cl_mem p8, size_t p9, cl_uint p10, cl_command_queue* p11, cl_uint p12, const cl_event* p13, cl_event* p14)) +clAmdBlasStatus (*clAmdBlasZhpr)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZhpr_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasSspr2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasSspr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSspr2_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasDspr2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasDspr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDspr2_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasChpr2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_float2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasChpr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_float2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasChpr2_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasZhpr2, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, cl_double2 p4, const cl_mem p5, size_t p6, int p7, const cl_mem p8, size_t p9, int p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasZhpr2)(clAmdBlasOrder, clAmdBlasUplo, size_t, cl_double2, const cl_mem, size_t, int, const cl_mem, size_t, int, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZhpr2_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasSgbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, size_t p5, size_t p6, cl_float p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, int p13, cl_float p14, cl_mem p15, size_t p16, int p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasSgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSgbmv_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasDgbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, size_t p5, size_t p6, cl_double p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, int p13, cl_double p14, cl_mem p15, size_t p16, int p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasDgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDgbmv_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasCgbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, size_t p5, size_t p6, cl_float2 p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, int p13, cl_float2 p14, cl_mem p15, size_t p16, int p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasCgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCgbmv_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasZgbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, size_t p3, size_t p4, size_t p5, size_t p6, cl_double2 p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, int p13, cl_double2 p14, cl_mem p15, size_t p16, int p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasZgbmv)(clAmdBlasOrder, clAmdBlasTranspose, size_t, size_t, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZgbmv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasStbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_mem p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasStbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStbmv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasDtbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_mem p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasDtbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtbmv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasCtbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_mem p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasCtbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtbmv_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZtbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_mem p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZtbmv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_mem, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtbmv_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasSsbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, size_t p4, cl_float p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, cl_float p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasSsbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsbmv_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasDsbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, size_t p4, cl_double p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, cl_double p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasDsbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsbmv_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasChbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, size_t p4, cl_float2 p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, cl_float2 p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasChbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_float2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasChbmv_switch_fn; +openclamdblas_fn20(OPENCLAMDBLAS_FN_clAmdBlasZhbmv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, size_t p3, size_t p4, cl_double2 p5, const cl_mem p6, size_t p7, size_t p8, const cl_mem p9, size_t p10, int p11, cl_double2 p12, cl_mem p13, size_t p14, int p15, cl_uint p16, cl_command_queue* p17, cl_uint p18, const cl_event* p19, cl_event* p20)) +clAmdBlasStatus (*clAmdBlasZhbmv)(clAmdBlasOrder, clAmdBlasUplo, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, int, cl_double2, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZhbmv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasStbsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasStbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStbsv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasDtbsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasDtbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtbsv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasCtbsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasCtbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtbsv_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasZtbsv, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, clAmdBlasDiag p4, size_t p5, size_t p6, const cl_mem p7, size_t p8, size_t p9, cl_mem p10, size_t p11, int p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasZtbsv)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, const cl_mem, size_t, size_t, cl_mem, size_t, int, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtbsv_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasSgemm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, cl_float p7, const cl_mem p8, size_t p9, const cl_mem p10, size_t p11, cl_float p12, cl_mem p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasSgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, cl_float, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSgemm_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasDgemm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, cl_double p7, const cl_mem p8, size_t p9, const cl_mem p10, size_t p11, cl_double p12, cl_mem p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasDgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, cl_double, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDgemm_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasCgemm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, FloatComplex p7, const cl_mem p8, size_t p9, const cl_mem p10, size_t p11, FloatComplex p12, cl_mem p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasCgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, FloatComplex, const cl_mem, size_t, const cl_mem, size_t, FloatComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCgemm_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasZgemm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, DoubleComplex p7, const cl_mem p8, size_t p9, const cl_mem p10, size_t p11, DoubleComplex p12, cl_mem p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasZgemm)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, DoubleComplex, const cl_mem, size_t, const cl_mem, size_t, DoubleComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZgemm_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasSgemmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, cl_float p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, size_t p13, cl_float p14, cl_mem p15, size_t p16, size_t p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasSgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSgemmEx_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasDgemmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, cl_double p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, size_t p13, cl_double p14, cl_mem p15, size_t p16, size_t p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasDgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDgemmEx_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasCgemmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, FloatComplex p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, size_t p13, FloatComplex p14, cl_mem p15, size_t p16, size_t p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasCgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, FloatComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCgemmEx_switch_fn; +openclamdblas_fn22(OPENCLAMDBLAS_FN_clAmdBlasZgemmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasTranspose p2, clAmdBlasTranspose p3, size_t p4, size_t p5, size_t p6, DoubleComplex p7, const cl_mem p8, size_t p9, size_t p10, const cl_mem p11, size_t p12, size_t p13, DoubleComplex p14, cl_mem p15, size_t p16, size_t p17, cl_uint p18, cl_command_queue* p19, cl_uint p20, const cl_event* p21, cl_event* p22)) +clAmdBlasStatus (*clAmdBlasZgemmEx)(clAmdBlasOrder, clAmdBlasTranspose, clAmdBlasTranspose, size_t, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, DoubleComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZgemmEx_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasStrmm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_float p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasStrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStrmm_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasDtrmm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_double p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasDtrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtrmm_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasCtrmm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, FloatComplex p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasCtrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtrmm_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasZtrmm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, DoubleComplex p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasZtrmm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtrmm_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasStrmmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_float p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasStrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStrmmEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasDtrmmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_double p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasDtrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtrmmEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasCtrmmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, FloatComplex p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasCtrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtrmmEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasZtrmmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, DoubleComplex p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasZtrmmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtrmmEx_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasStrsm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_float p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasStrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStrsm_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasDtrsm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_double p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasDtrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtrsm_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasCtrsm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, FloatComplex p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasCtrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtrsm_switch_fn; +openclamdblas_fn17(OPENCLAMDBLAS_FN_clAmdBlasZtrsm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, DoubleComplex p8, const cl_mem p9, size_t p10, cl_mem p11, size_t p12, cl_uint p13, cl_command_queue* p14, cl_uint p15, const cl_event* p16, cl_event* p17)) +clAmdBlasStatus (*clAmdBlasZtrsm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtrsm_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasStrsmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_float p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasStrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_float, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasStrsmEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasDtrsmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, cl_double p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasDtrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, cl_double, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDtrsmEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasCtrsmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, FloatComplex p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasCtrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCtrsmEx_switch_fn; +openclamdblas_fn19(OPENCLAMDBLAS_FN_clAmdBlasZtrsmEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, clAmdBlasTranspose p4, clAmdBlasDiag p5, size_t p6, size_t p7, DoubleComplex p8, const cl_mem p9, size_t p10, size_t p11, cl_mem p12, size_t p13, size_t p14, cl_uint p15, cl_command_queue* p16, cl_uint p17, const cl_event* p18, cl_event* p19)) +clAmdBlasStatus (*clAmdBlasZtrsmEx)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, clAmdBlasTranspose, clAmdBlasDiag, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZtrsmEx_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasSsyrk, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_float p6, const cl_mem p7, size_t p8, cl_float p9, cl_mem p10, size_t p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasSsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, cl_float, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsyrk_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasDsyrk, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_double p6, const cl_mem p7, size_t p8, cl_double p9, cl_mem p10, size_t p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasDsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, cl_double, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsyrk_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasCsyrk, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, FloatComplex p6, const cl_mem p7, size_t p8, FloatComplex p9, cl_mem p10, size_t p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasCsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, FloatComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCsyrk_switch_fn; +openclamdblas_fn16(OPENCLAMDBLAS_FN_clAmdBlasZsyrk, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, DoubleComplex p6, const cl_mem p7, size_t p8, DoubleComplex p9, cl_mem p10, size_t p11, cl_uint p12, cl_command_queue* p13, cl_uint p14, const cl_event* p15, cl_event* p16)) +clAmdBlasStatus (*clAmdBlasZsyrk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, DoubleComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZsyrk_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasSsyrkEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_float p6, const cl_mem p7, size_t p8, size_t p9, cl_float p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasSsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsyrkEx_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasDsyrkEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_double p6, const cl_mem p7, size_t p8, size_t p9, cl_double p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasDsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsyrkEx_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasCsyrkEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, FloatComplex p6, const cl_mem p7, size_t p8, size_t p9, FloatComplex p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasCsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, FloatComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCsyrkEx_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZsyrkEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, DoubleComplex p6, const cl_mem p7, size_t p8, size_t p9, DoubleComplex p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZsyrkEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, DoubleComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZsyrkEx_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasSsyr2k, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_float p6, const cl_mem p7, size_t p8, const cl_mem p9, size_t p10, cl_float p11, cl_mem p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasSsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, const cl_mem, size_t, cl_float, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsyr2k_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasDsyr2k, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_double p6, const cl_mem p7, size_t p8, const cl_mem p9, size_t p10, cl_double p11, cl_mem p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasDsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, const cl_mem, size_t, cl_double, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsyr2k_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasCsyr2k, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, FloatComplex p6, const cl_mem p7, size_t p8, const cl_mem p9, size_t p10, FloatComplex p11, cl_mem p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasCsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, const cl_mem, size_t, FloatComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCsyr2k_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZsyr2k, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, DoubleComplex p6, const cl_mem p7, size_t p8, const cl_mem p9, size_t p10, DoubleComplex p11, cl_mem p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZsyr2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, const cl_mem, size_t, DoubleComplex, cl_mem, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZsyr2k_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasSsyr2kEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_float p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_float p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasSsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsyr2kEx_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasDsyr2kEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, cl_double p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_double p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasDsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsyr2kEx_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasCsyr2kEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, FloatComplex p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, FloatComplex p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasCsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, FloatComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCsyr2kEx_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasZsyr2kEx, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, DoubleComplex p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, DoubleComplex p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasZsyr2kEx)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, DoubleComplex, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZsyr2kEx_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasSsymm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, size_t p4, size_t p5, cl_float p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_float p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasSsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_float, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasSsymm_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasDsymm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, size_t p4, size_t p5, cl_double p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_double p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasDsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_double, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasDsymm_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasCsymm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, size_t p4, size_t p5, cl_float2 p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_float2 p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasCsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCsymm_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasZsymm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, size_t p4, size_t p5, cl_double2 p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_double2 p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasZsymm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZsymm_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasChemm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, size_t p4, size_t p5, cl_float2 p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_float2 p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasChemm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_float2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasChemm_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasZhemm, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasSide p2, clAmdBlasUplo p3, size_t p4, size_t p5, cl_double2 p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_double2 p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasZhemm)(clAmdBlasOrder, clAmdBlasSide, clAmdBlasUplo, size_t, size_t, cl_double2, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double2, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZhemm_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasCherk, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, float p6, const cl_mem p7, size_t p8, size_t p9, float p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasCherk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, float, const cl_mem, size_t, size_t, float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCherk_switch_fn; +openclamdblas_fn18(OPENCLAMDBLAS_FN_clAmdBlasZherk, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, double p6, const cl_mem p7, size_t p8, size_t p9, double p10, cl_mem p11, size_t p12, size_t p13, cl_uint p14, cl_command_queue* p15, cl_uint p16, const cl_event* p17, cl_event* p18)) +clAmdBlasStatus (*clAmdBlasZherk)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, double, const cl_mem, size_t, size_t, double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZherk_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasCher2k, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, FloatComplex p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_float p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasCher2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, FloatComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_float, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasCher2k_switch_fn; +openclamdblas_fn21(OPENCLAMDBLAS_FN_clAmdBlasZher2k, clAmdBlasStatus, (clAmdBlasOrder p1, clAmdBlasUplo p2, clAmdBlasTranspose p3, size_t p4, size_t p5, DoubleComplex p6, const cl_mem p7, size_t p8, size_t p9, const cl_mem p10, size_t p11, size_t p12, cl_double p13, cl_mem p14, size_t p15, size_t p16, cl_uint p17, cl_command_queue* p18, cl_uint p19, const cl_event* p20, cl_event* p21)) +clAmdBlasStatus (*clAmdBlasZher2k)(clAmdBlasOrder, clAmdBlasUplo, clAmdBlasTranspose, size_t, size_t, DoubleComplex, const cl_mem, size_t, size_t, const cl_mem, size_t, size_t, cl_double, cl_mem, size_t, size_t, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*) = + OPENCLAMDBLAS_FN_clAmdBlasZher2k_switch_fn; // generated by parser_clamdblas.py void* openclamdblas_fn_ptrs[] = { diff --git a/modules/ocl/src/cl_runtime/clamdfft_runtime.cpp b/modules/ocl/src/cl_runtime/clamdfft_runtime.cpp index f0fa769b7d..7e12078e2e 100644 --- a/modules/ocl/src/cl_runtime/clamdfft_runtime.cpp +++ b/modules/ocl/src/cl_runtime/clamdfft_runtime.cpp @@ -137,225 +137,220 @@ static void* openclamdfft_check_fn(int ID) namespace { // generated by parser_clamdfft.py -template -struct openclamdfft_fn0 -{ - typedef _R (*FN)(); - static _R switch_fn() - { return ((FN)openclamdfft_check_fn(ID))(); } -}; +#define openclamdfft_fn0(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(); } \ -template -struct openclamdfft_fn1 -{ - typedef _R (*FN)(_T1); - static _R switch_fn(_T1 p1) - { return ((FN)openclamdfft_check_fn(ID))(p1); } -}; +#define openclamdfft_fn1(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1); } \ -template -struct openclamdfft_fn2 -{ - typedef _R (*FN)(_T1, _T2); - static _R switch_fn(_T1 p1, _T2 p2) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2); } -}; +#define openclamdfft_fn2(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2); } \ -template -struct openclamdfft_fn3 -{ - typedef _R (*FN)(_T1, _T2, _T3); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3); } -}; +#define openclamdfft_fn3(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3); } \ -template -struct openclamdfft_fn4 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4); } -}; +#define openclamdfft_fn4(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4); } \ -template -struct openclamdfft_fn5 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5); } -}; +#define openclamdfft_fn5(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5); } \ -template -struct openclamdfft_fn6 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6); } -}; +#define openclamdfft_fn6(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6); } \ -template -struct openclamdfft_fn7 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7); } -}; +#define openclamdfft_fn7(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7); } \ -template -struct openclamdfft_fn8 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8); } -}; +#define openclamdfft_fn8(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8); } \ -template -struct openclamdfft_fn9 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } -}; +#define openclamdfft_fn9(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9); } \ -template -struct openclamdfft_fn10 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } -}; +#define openclamdfft_fn10(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); } \ -template -struct openclamdfft_fn11 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } -}; +#define openclamdfft_fn11(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); } \ -template -struct openclamdfft_fn12 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } -}; +#define openclamdfft_fn12(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); } \ -template -struct openclamdfft_fn13 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } -}; +#define openclamdfft_fn13(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); } \ -template -struct openclamdfft_fn14 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } -}; +#define openclamdfft_fn14(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); } \ -template -struct openclamdfft_fn15 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } -}; +#define openclamdfft_fn15(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); } \ -template -struct openclamdfft_fn16 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } -}; +#define openclamdfft_fn16(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16); } \ -template -struct openclamdfft_fn17 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } -}; +#define openclamdfft_fn17(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17); } \ -template -struct openclamdfft_fn18 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } -}; +#define openclamdfft_fn18(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18); } \ -template -struct openclamdfft_fn19 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } -}; +#define openclamdfft_fn19(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19); } \ -template -struct openclamdfft_fn20 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19, _T20 p20) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } -}; +#define openclamdfft_fn20(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); } \ -template -struct openclamdfft_fn21 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20, _T21); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19, _T20 p20, _T21 p21) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21); } -}; +#define openclamdfft_fn21(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21); } \ -template -struct openclamdfft_fn22 -{ - typedef _R (*FN)(_T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9, _T10, _T11, _T12, _T13, _T14, _T15, _T16, _T17, _T18, _T19, _T20, _T21, _T22); - static _R switch_fn(_T1 p1, _T2 p2, _T3 p3, _T4 p4, _T5 p5, _T6 p6, _T7 p7, _T8 p8, _T9 p9, _T10 p10, _T11 p11, _T12 p12, _T13 p13, _T14 p14, _T15 p15, _T16 p16, _T17 p17, _T18 p18, _T19 p19, _T20 p20, _T21 p21, _T22 p22) - { return ((FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22); } -}; +#define openclamdfft_fn22(ID, _R, decl_args) \ + typedef _R (*ID##FN)decl_args; \ + static _R ID##_switch_fn decl_args \ + { return ((ID##FN)openclamdfft_check_fn(ID))(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22); } \ } // generated by parser_clamdfft.py -clAmdFftStatus (*clAmdFftSetup)(const clAmdFftSetupData*) = openclamdfft_fn1::switch_fn; -clAmdFftStatus (*clAmdFftTeardown)() = openclamdfft_fn0::switch_fn; -clAmdFftStatus (*clAmdFftGetVersion)(cl_uint*, cl_uint*, cl_uint*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftCreateDefaultPlan)(clAmdFftPlanHandle*, cl_context, const clAmdFftDim, const size_t*) = openclamdfft_fn4::switch_fn; -clAmdFftStatus (*clAmdFftCopyPlan)(clAmdFftPlanHandle*, cl_context, clAmdFftPlanHandle) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftBakePlan)(clAmdFftPlanHandle, cl_uint, cl_command_queue*, void (CL_CALLBACK*) (clAmdFftPlanHandle plHandle, void* user_data), void*) = openclamdfft_fn5::switch_fn; -clAmdFftStatus (*clAmdFftDestroyPlan)(clAmdFftPlanHandle*) = openclamdfft_fn1::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanContext)(const clAmdFftPlanHandle, cl_context*) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanPrecision)(const clAmdFftPlanHandle, clAmdFftPrecision*) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanPrecision)(clAmdFftPlanHandle, clAmdFftPrecision) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanScale)(const clAmdFftPlanHandle, clAmdFftDirection, cl_float*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanScale)(clAmdFftPlanHandle, clAmdFftDirection, cl_float) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanBatchSize)(const clAmdFftPlanHandle, size_t*) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanBatchSize)(clAmdFftPlanHandle, size_t) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanDim)(const clAmdFftPlanHandle, clAmdFftDim*, cl_uint*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanDim)(clAmdFftPlanHandle, const clAmdFftDim) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanLength)(const clAmdFftPlanHandle, const clAmdFftDim, size_t*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanLength)(clAmdFftPlanHandle, const clAmdFftDim, const size_t*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanInStride)(const clAmdFftPlanHandle, const clAmdFftDim, size_t*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanInStride)(clAmdFftPlanHandle, const clAmdFftDim, size_t*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanOutStride)(const clAmdFftPlanHandle, const clAmdFftDim, size_t*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanOutStride)(clAmdFftPlanHandle, const clAmdFftDim, size_t*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanDistance)(const clAmdFftPlanHandle, size_t*, size_t*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanDistance)(clAmdFftPlanHandle, size_t, size_t) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftGetLayout)(const clAmdFftPlanHandle, clAmdFftLayout*, clAmdFftLayout*) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftSetLayout)(clAmdFftPlanHandle, clAmdFftLayout, clAmdFftLayout) = openclamdfft_fn3::switch_fn; -clAmdFftStatus (*clAmdFftGetResultLocation)(const clAmdFftPlanHandle, clAmdFftResultLocation*) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftSetResultLocation)(clAmdFftPlanHandle, clAmdFftResultLocation) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftGetPlanTransposeResult)(const clAmdFftPlanHandle, clAmdFftResultTransposed*) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftSetPlanTransposeResult)(clAmdFftPlanHandle, clAmdFftResultTransposed) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftGetTmpBufSize)(const clAmdFftPlanHandle, size_t*) = openclamdfft_fn2::switch_fn; -clAmdFftStatus (*clAmdFftEnqueueTransform)(clAmdFftPlanHandle, clAmdFftDirection, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*, cl_mem*, cl_mem*, cl_mem) = openclamdfft_fn10::switch_fn; +openclamdfft_fn1(OPENCLAMDFFT_FN_clAmdFftSetup, clAmdFftStatus, (const clAmdFftSetupData* p1)) +clAmdFftStatus (*clAmdFftSetup)(const clAmdFftSetupData*) = + OPENCLAMDFFT_FN_clAmdFftSetup_switch_fn; +openclamdfft_fn0(OPENCLAMDFFT_FN_clAmdFftTeardown, clAmdFftStatus, ()) +clAmdFftStatus (*clAmdFftTeardown)() = + OPENCLAMDFFT_FN_clAmdFftTeardown_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetVersion, clAmdFftStatus, (cl_uint* p1, cl_uint* p2, cl_uint* p3)) +clAmdFftStatus (*clAmdFftGetVersion)(cl_uint*, cl_uint*, cl_uint*) = + OPENCLAMDFFT_FN_clAmdFftGetVersion_switch_fn; +openclamdfft_fn4(OPENCLAMDFFT_FN_clAmdFftCreateDefaultPlan, clAmdFftStatus, (clAmdFftPlanHandle* p1, cl_context p2, const clAmdFftDim p3, const size_t* p4)) +clAmdFftStatus (*clAmdFftCreateDefaultPlan)(clAmdFftPlanHandle*, cl_context, const clAmdFftDim, const size_t*) = + OPENCLAMDFFT_FN_clAmdFftCreateDefaultPlan_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftCopyPlan, clAmdFftStatus, (clAmdFftPlanHandle* p1, cl_context p2, clAmdFftPlanHandle p3)) +clAmdFftStatus (*clAmdFftCopyPlan)(clAmdFftPlanHandle*, cl_context, clAmdFftPlanHandle) = + OPENCLAMDFFT_FN_clAmdFftCopyPlan_switch_fn; +openclamdfft_fn5(OPENCLAMDFFT_FN_clAmdFftBakePlan, clAmdFftStatus, (clAmdFftPlanHandle p1, cl_uint p2, cl_command_queue* p3, void (CL_CALLBACK*p4) (clAmdFftPlanHandle plHandle, void* user_data), void* p5)) +clAmdFftStatus (*clAmdFftBakePlan)(clAmdFftPlanHandle, cl_uint, cl_command_queue*, void (CL_CALLBACK*) (clAmdFftPlanHandle plHandle, void* user_data), void*) = + OPENCLAMDFFT_FN_clAmdFftBakePlan_switch_fn; +openclamdfft_fn1(OPENCLAMDFFT_FN_clAmdFftDestroyPlan, clAmdFftStatus, (clAmdFftPlanHandle* p1)) +clAmdFftStatus (*clAmdFftDestroyPlan)(clAmdFftPlanHandle*) = + OPENCLAMDFFT_FN_clAmdFftDestroyPlan_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftGetPlanContext, clAmdFftStatus, (const clAmdFftPlanHandle p1, cl_context* p2)) +clAmdFftStatus (*clAmdFftGetPlanContext)(const clAmdFftPlanHandle, cl_context*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanContext_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftGetPlanPrecision, clAmdFftStatus, (const clAmdFftPlanHandle p1, clAmdFftPrecision* p2)) +clAmdFftStatus (*clAmdFftGetPlanPrecision)(const clAmdFftPlanHandle, clAmdFftPrecision*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanPrecision_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftSetPlanPrecision, clAmdFftStatus, (clAmdFftPlanHandle p1, clAmdFftPrecision p2)) +clAmdFftStatus (*clAmdFftSetPlanPrecision)(clAmdFftPlanHandle, clAmdFftPrecision) = + OPENCLAMDFFT_FN_clAmdFftSetPlanPrecision_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetPlanScale, clAmdFftStatus, (const clAmdFftPlanHandle p1, clAmdFftDirection p2, cl_float* p3)) +clAmdFftStatus (*clAmdFftGetPlanScale)(const clAmdFftPlanHandle, clAmdFftDirection, cl_float*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanScale_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftSetPlanScale, clAmdFftStatus, (clAmdFftPlanHandle p1, clAmdFftDirection p2, cl_float p3)) +clAmdFftStatus (*clAmdFftSetPlanScale)(clAmdFftPlanHandle, clAmdFftDirection, cl_float) = + OPENCLAMDFFT_FN_clAmdFftSetPlanScale_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftGetPlanBatchSize, clAmdFftStatus, (const clAmdFftPlanHandle p1, size_t* p2)) +clAmdFftStatus (*clAmdFftGetPlanBatchSize)(const clAmdFftPlanHandle, size_t*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanBatchSize_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftSetPlanBatchSize, clAmdFftStatus, (clAmdFftPlanHandle p1, size_t p2)) +clAmdFftStatus (*clAmdFftSetPlanBatchSize)(clAmdFftPlanHandle, size_t) = + OPENCLAMDFFT_FN_clAmdFftSetPlanBatchSize_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetPlanDim, clAmdFftStatus, (const clAmdFftPlanHandle p1, clAmdFftDim* p2, cl_uint* p3)) +clAmdFftStatus (*clAmdFftGetPlanDim)(const clAmdFftPlanHandle, clAmdFftDim*, cl_uint*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanDim_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftSetPlanDim, clAmdFftStatus, (clAmdFftPlanHandle p1, const clAmdFftDim p2)) +clAmdFftStatus (*clAmdFftSetPlanDim)(clAmdFftPlanHandle, const clAmdFftDim) = + OPENCLAMDFFT_FN_clAmdFftSetPlanDim_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetPlanLength, clAmdFftStatus, (const clAmdFftPlanHandle p1, const clAmdFftDim p2, size_t* p3)) +clAmdFftStatus (*clAmdFftGetPlanLength)(const clAmdFftPlanHandle, const clAmdFftDim, size_t*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanLength_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftSetPlanLength, clAmdFftStatus, (clAmdFftPlanHandle p1, const clAmdFftDim p2, const size_t* p3)) +clAmdFftStatus (*clAmdFftSetPlanLength)(clAmdFftPlanHandle, const clAmdFftDim, const size_t*) = + OPENCLAMDFFT_FN_clAmdFftSetPlanLength_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetPlanInStride, clAmdFftStatus, (const clAmdFftPlanHandle p1, const clAmdFftDim p2, size_t* p3)) +clAmdFftStatus (*clAmdFftGetPlanInStride)(const clAmdFftPlanHandle, const clAmdFftDim, size_t*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanInStride_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftSetPlanInStride, clAmdFftStatus, (clAmdFftPlanHandle p1, const clAmdFftDim p2, size_t* p3)) +clAmdFftStatus (*clAmdFftSetPlanInStride)(clAmdFftPlanHandle, const clAmdFftDim, size_t*) = + OPENCLAMDFFT_FN_clAmdFftSetPlanInStride_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetPlanOutStride, clAmdFftStatus, (const clAmdFftPlanHandle p1, const clAmdFftDim p2, size_t* p3)) +clAmdFftStatus (*clAmdFftGetPlanOutStride)(const clAmdFftPlanHandle, const clAmdFftDim, size_t*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanOutStride_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftSetPlanOutStride, clAmdFftStatus, (clAmdFftPlanHandle p1, const clAmdFftDim p2, size_t* p3)) +clAmdFftStatus (*clAmdFftSetPlanOutStride)(clAmdFftPlanHandle, const clAmdFftDim, size_t*) = + OPENCLAMDFFT_FN_clAmdFftSetPlanOutStride_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetPlanDistance, clAmdFftStatus, (const clAmdFftPlanHandle p1, size_t* p2, size_t* p3)) +clAmdFftStatus (*clAmdFftGetPlanDistance)(const clAmdFftPlanHandle, size_t*, size_t*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanDistance_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftSetPlanDistance, clAmdFftStatus, (clAmdFftPlanHandle p1, size_t p2, size_t p3)) +clAmdFftStatus (*clAmdFftSetPlanDistance)(clAmdFftPlanHandle, size_t, size_t) = + OPENCLAMDFFT_FN_clAmdFftSetPlanDistance_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftGetLayout, clAmdFftStatus, (const clAmdFftPlanHandle p1, clAmdFftLayout* p2, clAmdFftLayout* p3)) +clAmdFftStatus (*clAmdFftGetLayout)(const clAmdFftPlanHandle, clAmdFftLayout*, clAmdFftLayout*) = + OPENCLAMDFFT_FN_clAmdFftGetLayout_switch_fn; +openclamdfft_fn3(OPENCLAMDFFT_FN_clAmdFftSetLayout, clAmdFftStatus, (clAmdFftPlanHandle p1, clAmdFftLayout p2, clAmdFftLayout p3)) +clAmdFftStatus (*clAmdFftSetLayout)(clAmdFftPlanHandle, clAmdFftLayout, clAmdFftLayout) = + OPENCLAMDFFT_FN_clAmdFftSetLayout_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftGetResultLocation, clAmdFftStatus, (const clAmdFftPlanHandle p1, clAmdFftResultLocation* p2)) +clAmdFftStatus (*clAmdFftGetResultLocation)(const clAmdFftPlanHandle, clAmdFftResultLocation*) = + OPENCLAMDFFT_FN_clAmdFftGetResultLocation_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftSetResultLocation, clAmdFftStatus, (clAmdFftPlanHandle p1, clAmdFftResultLocation p2)) +clAmdFftStatus (*clAmdFftSetResultLocation)(clAmdFftPlanHandle, clAmdFftResultLocation) = + OPENCLAMDFFT_FN_clAmdFftSetResultLocation_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftGetPlanTransposeResult, clAmdFftStatus, (const clAmdFftPlanHandle p1, clAmdFftResultTransposed* p2)) +clAmdFftStatus (*clAmdFftGetPlanTransposeResult)(const clAmdFftPlanHandle, clAmdFftResultTransposed*) = + OPENCLAMDFFT_FN_clAmdFftGetPlanTransposeResult_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftSetPlanTransposeResult, clAmdFftStatus, (clAmdFftPlanHandle p1, clAmdFftResultTransposed p2)) +clAmdFftStatus (*clAmdFftSetPlanTransposeResult)(clAmdFftPlanHandle, clAmdFftResultTransposed) = + OPENCLAMDFFT_FN_clAmdFftSetPlanTransposeResult_switch_fn; +openclamdfft_fn2(OPENCLAMDFFT_FN_clAmdFftGetTmpBufSize, clAmdFftStatus, (const clAmdFftPlanHandle p1, size_t* p2)) +clAmdFftStatus (*clAmdFftGetTmpBufSize)(const clAmdFftPlanHandle, size_t*) = + OPENCLAMDFFT_FN_clAmdFftGetTmpBufSize_switch_fn; +openclamdfft_fn10(OPENCLAMDFFT_FN_clAmdFftEnqueueTransform, clAmdFftStatus, (clAmdFftPlanHandle p1, clAmdFftDirection p2, cl_uint p3, cl_command_queue* p4, cl_uint p5, const cl_event* p6, cl_event* p7, cl_mem* p8, cl_mem* p9, cl_mem p10)) +clAmdFftStatus (*clAmdFftEnqueueTransform)(clAmdFftPlanHandle, clAmdFftDirection, cl_uint, cl_command_queue*, cl_uint, const cl_event*, cl_event*, cl_mem*, cl_mem*, cl_mem) = + OPENCLAMDFFT_FN_clAmdFftEnqueueTransform_switch_fn; // generated by parser_clamdfft.py void* openclamdfft_fn_ptrs[] = { diff --git a/modules/ocl/src/cl_runtime/generator/common.py b/modules/ocl/src/cl_runtime/generator/common.py index 19b21454c8..98341bcc09 100644 --- a/modules/ocl/src/cl_runtime/generator/common.py +++ b/modules/ocl/src/cl_runtime/generator/common.py @@ -79,6 +79,15 @@ def postProcessParameters(fns): del parts[-1] fn['params'][i] = ' '.join(parts) + +callback_check = re.compile(r'([^\(]*\(.*)(\* *)(\).*\(.*\))') + +def getTypeWithParam(t, p): + if callback_check.match(t): + return callback_check.sub(r'\1 *' + p + r'\3', t) + return t + ' ' + p + + # # Generator helpers # @@ -155,31 +164,29 @@ def generateFnDeclaration(fns): def generateFnDefinition(fns, lprefix='opencl_fn', uprefix='OPENCL_FN'): print '// generated by %s' % os.path.basename(sys.argv[0]) for fn in fns: - print '%s%s (%s *%s)(%s) = %s%d<%s_%s, %s%s>::switch_fn;' % \ - ((' '.join(fn['modifiers'] + ' ') if len(fn['modifiers']) > 0 else ''), - ' '.join(fn['ret']), ' '.join(fn['calling']), fn['name'], ', '.join(fn['params']), \ - lprefix, len(fn['params']), uprefix, fn['name'], ' '.join(fn['ret']), ('' if len(fn['params']) == 0 else ', ' + ', '.join(fn['params']))) + commentStr = '' + decl_args = [] + for (i, t) in enumerate(fn['params']): + decl_args.append(getTypeWithParam(t, 'p%d' % (i+1))) + decl_args_str = '(' + (', '.join(decl_args)) + ')' + print '%s%s%d(%s_%s, %s, %s)' % \ + (commentStr, lprefix, len(fn['params']), uprefix, fn['name'], \ + ' '.join(fn['ret']), decl_args_str) + print commentStr + ('%s%s (%s *%s)(%s) =\n%s %s_%s_switch_fn;' % \ + ((' '.join(fn['modifiers'] + ' ') if len(fn['modifiers']) > 0 else ''), + ' '.join(fn['ret']), ' '.join(fn['calling']), fn['name'], ', '.join(fn['params']), \ + commentStr, uprefix, fn['name'])) @outputToString def generateTemplates(sz, lprefix, switch_name, calling_convention=''): print '// generated by %s' % os.path.basename(sys.argv[0]) for sz in range(sz): - template_params = ['int ID', 'typename _R'] - types = [] - types_with_params = [] - params = [] - for i in range(1, sz + 1): - template_params.append('typename _T%d' % i) - types.append('_T%d' % i) - types_with_params.append('_T%d p%d' % (i, i)) - params.append('p%d' % i) - print 'template <%s>' % ', '.join(template_params) - print 'struct %s%d' % (lprefix, sz) - print '{' - print ' typedef _R (%s *FN)(%s);' % (calling_convention, ', '.join(types)) - print ' static _R %s switch_fn(%s)' % (calling_convention, ', '.join(types_with_params)) - print ' { return ((FN)%s(ID))(%s); }' % (switch_name, ', '.join(params)) - print '};' + template_params = ['ID', '_R', 'decl_args'] + params = ['p%d' % (i + 1) for i in range(0, sz)] + print '#define %s%d(%s) \\' % (lprefix, sz, ', '.join(template_params)) + print ' typedef _R (%s *ID##FN)decl_args; \\' % (calling_convention) + print ' static _R %s ID##_switch_fn decl_args \\' % (calling_convention) + print ' { return ((ID##FN)%s(ID))(%s); } \\' % (switch_name, ', '.join(params)) print '' @outputToString diff --git a/modules/ocl/src/haar.cpp b/modules/ocl/src/haar.cpp index 5cf641d721..b6baeefdaa 100644 --- a/modules/ocl/src/haar.cpp +++ b/modules/ocl/src/haar.cpp @@ -235,7 +235,6 @@ typedef struct _ALIGNED_ON(64) GpuHidHaarClassifierCascade } GpuHidHaarClassifierCascade; #endif -const int icv_object_win_border = 1; const float icv_stage_threshold_bias = 0.0001f; double globaltime = 0; diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index 04cea39d16..40c49bc6e3 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -290,7 +290,7 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow if( type < 0 ) { - if( typenum == NPY_INT64 || typenum == NPY_UINT64 || type == NPY_LONG ) + if( typenum == NPY_INT64 || typenum == NPY_UINT64 || typenum == NPY_LONG ) { needcopy = needcast = true; new_typenum = NPY_INT; diff --git a/modules/python/src2/hdr_parser.py b/modules/python/src2/hdr_parser.py index 14da8873c3..e3a909e3b6 100755 --- a/modules/python/src2/hdr_parser.py +++ b/modules/python/src2/hdr_parser.py @@ -241,7 +241,7 @@ class CppHeaderParser(object): l = l[:npos] + l[npos3+1:] l = self.batch_replace(l, [("CV_EXPORTS_W", ""), ("CV_EXPORTS", ""), ("public virtual ", " "), ("public ", " "), ("::", ".")]).strip() - ll = re.split(r'\s*[,:]?\s*', l) + ll = re.split(r'\s+|\s*[,:]\s*', l) ll = [le for le in ll if le] classname = ll[1] bases = ll[2:] diff --git a/modules/stitching/CMakeLists.txt b/modules/stitching/CMakeLists.txt index fc8b2fcf96..6776cb8f15 100644 --- a/modules/stitching/CMakeLists.txt +++ b/modules/stitching/CMakeLists.txt @@ -1,4 +1,5 @@ set(the_description "Images stitching") +ocv_warnings_disable(CMAKE_CXX_FLAGS -Woverloaded-virtual) if(ENABLE_DYNAMIC_CUDA) add_definitions(-DDYNAMIC_CUDA_SUPPORT) ocv_define_module(stitching opencv_imgproc opencv_features2d opencv_calib3d opencv_objdetect OPTIONAL opencv_nonfree) diff --git a/modules/stitching/include/opencv2/stitching/stitcher.hpp b/modules/stitching/include/opencv2/stitching/stitcher.hpp index e274deb173..7f9af24edf 100644 --- a/modules/stitching/include/opencv2/stitching/stitcher.hpp +++ b/modules/stitching/include/opencv2/stitching/stitcher.hpp @@ -43,6 +43,11 @@ #ifndef __OPENCV_STITCHING_STITCHER_HPP__ #define __OPENCV_STITCHING_STITCHER_HPP__ +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Woverloaded-virtual" +#endif + #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/stitching/warpers.hpp" @@ -171,4 +176,8 @@ private: } // namespace cv +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + #endif // __OPENCV_STITCHING_STITCHER_HPP__ diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index 18309061e1..eddb0ed71e 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -166,7 +166,7 @@ private: } \ private: int val_; \ }; \ - inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } } + static inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } } #define CV_FLAGS(class_name, ...) \ namespace { \ @@ -195,7 +195,7 @@ private: } \ private: int val_; \ }; \ - inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } } + static inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } } CV_ENUM(MatDepth, CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F, CV_USRTYPE1) diff --git a/modules/ts/src/ts_gtest.cpp b/modules/ts/src/ts_gtest.cpp index 50c8808aff..fd1469c72d 100644 --- a/modules/ts/src/ts_gtest.cpp +++ b/modules/ts/src/ts_gtest.cpp @@ -7945,7 +7945,7 @@ namespace internal { // of them. const char kPathSeparator = '\\'; const char kAlternatePathSeparator = '/'; -const char kPathSeparatorString[] = "\\"; +//const char kPathSeparatorString[] = "\\"; const char kAlternatePathSeparatorString[] = "/"; # if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory. You should not use @@ -7959,7 +7959,7 @@ const char kCurrentDirectoryString[] = ".\\"; # endif // GTEST_OS_WINDOWS_MOBILE #else const char kPathSeparator = '/'; -const char kPathSeparatorString[] = "/"; +//const char kPathSeparatorString[] = "/"; const char kCurrentDirectoryString[] = "./"; #endif // GTEST_OS_WINDOWS diff --git a/modules/video/test/test_tvl1optflow.cpp b/modules/video/test/test_tvl1optflow.cpp index bf7e835df3..3f57218700 100644 --- a/modules/video/test/test_tvl1optflow.cpp +++ b/modules/video/test/test_tvl1optflow.cpp @@ -52,9 +52,9 @@ namespace { // first four bytes, should be the same in little endian const float FLO_TAG_FLOAT = 202021.25f; // check for this when READING the file +#ifdef DUMP const char FLO_TAG_STRING[] = "PIEH"; // use this when WRITING the file -#ifdef DUMP // binary file format for flow data specified here: // http://vision.middlebury.edu/flow/data/ void writeOpticalFlowToFile(const Mat_& flow, const string& fileName) diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp index feaca852e3..d95c8355a1 100644 --- a/modules/viz/src/precomp.hpp +++ b/modules/viz/src/precomp.hpp @@ -280,7 +280,7 @@ namespace cv scalars->SetName("Colors"); scalars->SetNumberOfComponents(3); scalars->SetNumberOfTuples((vtkIdType)size); - scalars->SetArray(color_data->val, (vtkIdType)(size * 3), 0); + scalars->SetArray(color_data->val, (vtkIdType)(size * 3), 0, vtkUnsignedCharArray::VTK_DATA_ARRAY_DELETE); return scalars; } diff --git a/modules/viz/src/vtk/vtkCloudMatSource.cpp b/modules/viz/src/vtk/vtkCloudMatSource.cpp index 1d8ab7894c..98eeed3dbe 100644 --- a/modules/viz/src/vtk/vtkCloudMatSource.cpp +++ b/modules/viz/src/vtk/vtkCloudMatSource.cpp @@ -235,7 +235,7 @@ void cv::viz::vtkCloudMatSource::filterNanColorsCopy(const Mat& cloud_colors, co scalars->SetName("Colors"); scalars->SetNumberOfComponents(3); scalars->SetNumberOfTuples(total); - scalars->SetArray(array->val, total * 3, 0); + scalars->SetArray(array->val, total * 3, 0, vtkUnsignedCharArray::VTK_DATA_ARRAY_DELETE); } template diff --git a/samples/cpp/stitching_detailed.cpp b/samples/cpp/stitching_detailed.cpp index 60b73b35c9..7ab9202c04 100644 --- a/samples/cpp/stitching_detailed.cpp +++ b/samples/cpp/stitching_detailed.cpp @@ -46,16 +46,7 @@ #include #include "opencv2/opencv_modules.hpp" #include "opencv2/highgui/highgui.hpp" -#include "opencv2/stitching/detail/autocalib.hpp" -#include "opencv2/stitching/detail/blenders.hpp" -#include "opencv2/stitching/detail/camera.hpp" -#include "opencv2/stitching/detail/exposure_compensate.hpp" -#include "opencv2/stitching/detail/matchers.hpp" -#include "opencv2/stitching/detail/motion_estimators.hpp" -#include "opencv2/stitching/detail/seam_finders.hpp" -#include "opencv2/stitching/detail/util.hpp" -#include "opencv2/stitching/detail/warpers.hpp" -#include "opencv2/stitching/warpers.hpp" +#include "opencv2/stitching.hpp" using namespace std; using namespace cv; diff --git a/samples/ocl/stereo_match.cpp b/samples/ocl/stereo_match.cpp index 7a5c105199..5c56e173c7 100644 --- a/samples/ocl/stereo_match.cpp +++ b/samples/ocl/stereo_match.cpp @@ -66,7 +66,6 @@ private: string out_img; enum {BM, BP, CSBP} method; int ndisp; // Max disparity + 1 - enum {GPU, CPU} type; }; int main(int argc, char** argv) From b06bd501445b027ac498bcb46dea0aa0461adc8e Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 14 Dec 2016 14:49:19 +0300 Subject: [PATCH 95/96] cmake: update PDB support condition Unfortunately there is no stable support for installation of PDB files in CMake. This patch is just eliminate problems with modern versions. --- cmake/OpenCVUtils.cmake | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index b266a62372..55a7acdaaf 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -607,8 +607,11 @@ function(ocv_install_target) set(${__package}_TARGETS "${${__package}_TARGETS}" CACHE INTERNAL "List of ${__package} targets") endif() - if(INSTALL_CREATE_DISTRIB) - if(MSVC AND NOT BUILD_SHARED_LIBS) + if(MSVS) + if(NOT INSTALL_IGNORE_PDB AND + (INSTALL_PDB OR + (INSTALL_CREATE_DISTRIB AND NOT BUILD_SHARED_LIBS) + )) set(__target "${ARGV0}") set(isArchive 0) @@ -636,13 +639,13 @@ function(ocv_install_target) get_target_property(fname ${__target} LOCATION_DEBUG) if(fname MATCHES "\\.lib$") string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}") - install(FILES "${fname}" DESTINATION "${__dst}" CONFIGURATIONS Debug) + install(FILES "${fname}" DESTINATION "${__dst}" CONFIGURATIONS Debug OPTIONAL) endif() get_target_property(fname ${__target} LOCATION_RELEASE) if(fname MATCHES "\\.lib$") string(REGEX REPLACE "\\.lib$" ".pdb" fname "${fname}") - install(FILES "${fname}" DESTINATION "${__dst}" CONFIGURATIONS Release) + install(FILES "${fname}" DESTINATION "${__dst}" CONFIGURATIONS Release OPTIONAL) endif() else() # CMake 2.8.12 broke PDB support for STATIC libraries from MSVS, fix was introduced in CMake 3.1.0. From 8444c2380371c8f27cf906ab419aeb12667bac30 Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Wed, 14 Dec 2016 12:55:00 +0300 Subject: [PATCH 96/96] fixed segfault at ORB::compute() near image's border --- modules/features2d/src/orb.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/features2d/src/orb.cpp b/modules/features2d/src/orb.cpp index b69354b786..cfee52c2b3 100644 --- a/modules/features2d/src/orb.cpp +++ b/modules/features2d/src/orb.cpp @@ -736,7 +736,9 @@ void ORB::operator()( InputArray _image, InputArray _mask, vector& _ke //ROI handling const int HARRIS_BLOCK_SIZE = 9; int halfPatchSize = patchSize / 2; - int border = std::max(edgeThreshold, std::max(halfPatchSize, HARRIS_BLOCK_SIZE/2))+1; + // sqrt(2.0) is for handling patch rotation + int descPatchSize = cvCeil(halfPatchSize*sqrt(2.0)); + int border = std::max(edgeThreshold, std::max(descPatchSize, HARRIS_BLOCK_SIZE/2))+1; Mat image = _image.getMat(), mask = _mask.getMat(); if( image.type() != CV_8UC1 )