Path: blob/master/3rdparty/carotene/hal/tegra_hal.hpp
16337 views
/*1* By downloading, copying, installing or using the software you agree to this license.2* If you do not agree to this license, do not download, install,3* copy or use the software.4*5*6* License Agreement7* For Open Source Computer Vision Library8* (3-clause BSD License)9*10* Copyright (C) 2016, NVIDIA Corporation, all rights reserved.11* Third party copyrights are property of their respective owners.12*13* Redistribution and use in source and binary forms, with or without modification,14* are permitted provided that the following conditions are met:15*16* * Redistributions of source code must retain the above copyright notice,17* this list of conditions and the following disclaimer.18*19* * Redistributions in binary form must reproduce the above copyright notice,20* this list of conditions and the following disclaimer in the documentation21* and/or other materials provided with the distribution.22*23* * Neither the names of the copyright holders nor the names of the contributors24* may be used to endorse or promote products derived from this software25* without specific prior written permission.26*27* This software is provided by the copyright holders and contributors "as is" and28* any express or implied warranties, including, but not limited to, the implied29* warranties of merchantability and fitness for a particular purpose are disclaimed.30* In no event shall copyright holders or contributors be liable for any direct,31* indirect, incidental, special, exemplary, or consequential damages32* (including, but not limited to, procurement of substitute goods or services;33* loss of use, data, or profits; or business interruption) however caused34* and on any theory of liability, whether in contract, strict liability,35* or tort (including negligence or otherwise) arising in any way out of36* the use of this software, even if advised of the possibility of such damage.37*/3839#ifndef _tegra_hal_H_INCLUDED_40#define _tegra_hal_H_INCLUDED_4142#define CAROTENE_NS carotene_o4t4344#include "carotene/functions.hpp"45#include <cstddef>46#include <cstring>47#include <vector>48#include <opencv2/core/base.hpp>4950#define RANGE_DATA(type, base, step) reinterpret_cast<type*>(const_cast<char *>(reinterpret_cast<const char *>(base)) + static_cast<size_t>(range.start) * step)5152#define PARALLEL_CORE 053#if PARALLEL_CORE5455#define SRC_ARG1 ST * src1_data_, size_t src1_step_,56#define SRC_STORE1 src1_data(src1_data_), src1_step(src1_step_),57#define SRC_VAR1 ST * src1_data; \58size_t src1_step;59#define SRC_ARG2 ST * src1_data_, size_t src1_step_, \60ST * src2_data_, size_t src2_step_,61#define SRC_STORE2 src1_data(src1_data_), src1_step(src1_step_), \62src2_data(src2_data_), src2_step(src2_step_),63#define SRC_VAR2 ST * src1_data; \64size_t src1_step; \65ST * src2_data; \66size_t src2_step;6768#define DST_ARG1 DT * dst1_data_, size_t dst1_step_,69#define DST_STORE1 dst1_data(dst1_data_), dst1_step(dst1_step_),70#define DST_VAR1 DT * dst1_data; \71size_t dst1_step;7273#define SCALE_ARG074#define SCALE_STORE075#define SCALE_VAR076#define SCALE_ARG1 , double scale_77#define SCALE_STORE1 , scale(scale_)78#define SCALE_VAR1 double scale;79#define SCALE_ARG3 , const double *scales_80#define SCALE_STORE3 , scales(scales_, scales_ + 3)81#define SCALE_VAR3 std::vector<double> scales;8283#define TegraGenOp_Invoker(name, func, src_cnt, dst_cnt, scale_cnt, ...) \84template <typename ST, typename DT> \85class TegraGenOp_##name##_Invoker : public cv::ParallelLoopBody \86{ \87public: \88TegraGenOp_##name##_Invoker(SRC_ARG##src_cnt \89DST_ARG##dst_cnt \90int width_, int height_ \91SCALE_ARG##scale_cnt) : \92cv::ParallelLoopBody(), SRC_STORE##src_cnt \93DST_STORE##dst_cnt \94width(width_), height(height_) \95SCALE_STORE##scale_cnt {} \96virtual void operator()(const cv::Range& range) const \97{ \98CAROTENE_NS::func(CAROTENE_NS::Size2D(width, range.end-range.start), __VA_ARGS__); \99} \100private: \101SRC_VAR##src_cnt \102DST_VAR##dst_cnt \103int width, height; \104SCALE_VAR##scale_cnt \105const TegraGenOp_##name##_Invoker& operator= (const TegraGenOp_##name##_Invoker&); \106};107108#define TegraBinaryOp_Invoker(name, func) TegraGenOp_Invoker(name, func, 2, 1, 0, \109RANGE_DATA(ST, src1_data, src1_step), src1_step, \110RANGE_DATA(ST, src2_data, src2_step), src2_step, \111RANGE_DATA(DT, dst1_data, dst1_step), dst1_step )112113#define TegraBinaryOp_InvokerVAArg(name, func, ...) TegraGenOp_Invoker(name, func, 2, 1, 0, \114RANGE_DATA(ST, src1_data, src1_step), src1_step, \115RANGE_DATA(ST, src2_data, src2_step), src2_step, \116RANGE_DATA(DT, dst1_data, dst1_step), dst1_step, __VA_ARGS__)117118#define TEGRA_BINARYOP(type, op, src1, sz1, src2, sz2, dst, sz, w, h) \119( \120CAROTENE_NS::isSupportedConfiguration() ? \121parallel_for_(Range(0, h), \122TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, src2, sz2, dst, sz, w, h), \123(w * h) / static_cast<double>(1<<16)), \124CV_HAL_ERROR_OK \125: CV_HAL_ERROR_NOT_IMPLEMENTED \126)127128TegraBinaryOp_InvokerVAArg(add, add, CAROTENE_NS::CONVERT_POLICY_SATURATE) /*Original addition use saturated operator, so use the same from CAROTENE*/129130TegraBinaryOp_Invoker(addf, add)131132TegraBinaryOp_InvokerVAArg(sub, sub, CAROTENE_NS::CONVERT_POLICY_SATURATE) /*Original addition use saturated operator, so use the same from CAROTENE*/133134TegraBinaryOp_Invoker(subf, sub)135136TegraBinaryOp_Invoker(max, max)137138TegraBinaryOp_Invoker(min, min)139140TegraBinaryOp_Invoker(absDiff, absDiff)141142TegraBinaryOp_Invoker(bitwiseAnd, bitwiseAnd)143144TegraBinaryOp_Invoker(bitwiseOr, bitwiseOr)145146TegraBinaryOp_Invoker(bitwiseXor, bitwiseXor)147148#define TegraUnaryOp_Invoker(name, func) TegraGenOp_Invoker(name, func, 1, 1, 0, \149RANGE_DATA(ST, src1_data, src1_step), src1_step, \150RANGE_DATA(DT, dst1_data, dst1_step), dst1_step )151152TegraUnaryOp_Invoker(bitwiseNot, bitwiseNot)153#define TEGRA_UNARYOP(type, op, src1, sz1, dst, sz, w, h) \154( \155CAROTENE_NS::isSupportedConfiguration() ? \156parallel_for_(Range(0, h), \157TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, dst, sz, w, h), \158(w * h) / static_cast<double>(1<<16)), \159CV_HAL_ERROR_OK \160: CV_HAL_ERROR_NOT_IMPLEMENTED \161)162163#undef cv_hal_add8u164#define cv_hal_add8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, add, src1, sz1, src2, sz2, dst, sz, w, h)165#undef cv_hal_add8s166#define cv_hal_add8s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s8, add, src1, sz1, src2, sz2, dst, sz, w, h)167#undef cv_hal_add16u168#define cv_hal_add16u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u16, add, src1, sz1, src2, sz2, dst, sz, w, h)169#undef cv_hal_add16s170#define cv_hal_add16s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s16, add, src1, sz1, src2, sz2, dst, sz, w, h)171#undef cv_hal_add32s172#define cv_hal_add32s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s32, add, src1, sz1, src2, sz2, dst, sz, w, h)173#undef cv_hal_add32f174#define cv_hal_add32f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f32, addf, src1, sz1, src2, sz2, dst, sz, w, h)175//#undef cv_hal_add64f176//#define cv_hal_add64f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f64, addf, src1, sz1, src2, sz2, dst, sz, w, h)177#undef cv_hal_sub8u178#define cv_hal_sub8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, sub, src1, sz1, src2, sz2, dst, sz, w, h)179#undef cv_hal_sub8s180#define cv_hal_sub8s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s8, sub, src1, sz1, src2, sz2, dst, sz, w, h)181#undef cv_hal_sub16u182#define cv_hal_sub16u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u16, sub, src1, sz1, src2, sz2, dst, sz, w, h)183#undef cv_hal_sub16s184#define cv_hal_sub16s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s16, sub, src1, sz1, src2, sz2, dst, sz, w, h)185#undef cv_hal_sub32s186#define cv_hal_sub32s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s32, sub, src1, sz1, src2, sz2, dst, sz, w, h)187#undef cv_hal_sub32f188#define cv_hal_sub32f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f32, subf, src1, sz1, src2, sz2, dst, sz, w, h)189//#undef cv_hal_sub64f190//#define cv_hal_sub64f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f64, subf, src1, sz1, src2, sz2, dst, sz, w, h)191#undef cv_hal_max8u192#define cv_hal_max8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, max, src1, sz1, src2, sz2, dst, sz, w, h)193#undef cv_hal_max8s194#define cv_hal_max8s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s8, max, src1, sz1, src2, sz2, dst, sz, w, h)195#undef cv_hal_max16u196#define cv_hal_max16u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u16, max, src1, sz1, src2, sz2, dst, sz, w, h)197#undef cv_hal_max16s198#define cv_hal_max16s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s16, max, src1, sz1, src2, sz2, dst, sz, w, h)199#undef cv_hal_max32s200#define cv_hal_max32s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s32, max, src1, sz1, src2, sz2, dst, sz, w, h)201#undef cv_hal_max32f202#define cv_hal_max32f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f32, max, src1, sz1, src2, sz2, dst, sz, w, h)203//#undef cv_hal_max64f204//#define cv_hal_max64f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f64, max, src1, sz1, src2, sz2, dst, sz, w, h)205#undef cv_hal_min8u206#define cv_hal_min8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, min, src1, sz1, src2, sz2, dst, sz, w, h)207#undef cv_hal_min8s208#define cv_hal_min8s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s8, min, src1, sz1, src2, sz2, dst, sz, w, h)209#undef cv_hal_min16u210#define cv_hal_min16u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u16, min, src1, sz1, src2, sz2, dst, sz, w, h)211#undef cv_hal_min16s212#define cv_hal_min16s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s16, min, src1, sz1, src2, sz2, dst, sz, w, h)213#undef cv_hal_min32s214#define cv_hal_min32s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s32, min, src1, sz1, src2, sz2, dst, sz, w, h)215#undef cv_hal_min32f216#define cv_hal_min32f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f32, min, src1, sz1, src2, sz2, dst, sz, w, h)217//#undef cv_hal_min64f218//#define cv_hal_min64f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f64, min, src1, sz1, src2, sz2, dst, sz, w, h)219#undef cv_hal_absdiff8u220#define cv_hal_absdiff8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, absDiff, src1, sz1, src2, sz2, dst, sz, w, h)221#undef cv_hal_absdiff8s222#define cv_hal_absdiff8s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s8, absDiff, src1, sz1, src2, sz2, dst, sz, w, h)223#undef cv_hal_absdiff16u224#define cv_hal_absdiff16u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u16, absDiff, src1, sz1, src2, sz2, dst, sz, w, h)225#undef cv_hal_absdiff16s226#define cv_hal_absdiff16s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s16, absDiff, src1, sz1, src2, sz2, dst, sz, w, h)227#undef cv_hal_absdiff32s228#define cv_hal_absdiff32s(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::s32, absDiff, src1, sz1, src2, sz2, dst, sz, w, h)229#undef cv_hal_absdiff32f230#define cv_hal_absdiff32f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f32, absDiff, src1, sz1, src2, sz2, dst, sz, w, h)231//#undef cv_hal_absdiff64f232//#define cv_hal_absdiff64f(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::f64, absDiff, src1, sz1, src2, sz2, dst, sz, w, h)233#undef cv_hal_and8u234#define cv_hal_and8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, bitwiseAnd, src1, sz1, src2, sz2, dst, sz, w, h)235#undef cv_hal_or8u236#define cv_hal_or8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, bitwiseOr, src1, sz1, src2, sz2, dst, sz, w, h)237#undef cv_hal_xor8u238#define cv_hal_xor8u(src1, sz1, src2, sz2, dst, sz, w, h) TEGRA_BINARYOP(CAROTENE_NS::u8, bitwiseXor, src1, sz1, src2, sz2, dst, sz, w, h)239#undef cv_hal_not8u240#define cv_hal_not8u(src1, sz1, dst, sz, w, h) TEGRA_UNARYOP(CAROTENE_NS::u8, bitwiseNot, src1, sz1, dst, sz, w, h)241242TegraBinaryOp_Invoker(cmpEQ, cmpEQ)243TegraBinaryOp_Invoker(cmpNE, cmpNE)244TegraBinaryOp_Invoker(cmpGT, cmpGT)245TegraBinaryOp_Invoker(cmpGE, cmpGE)246TegraGenOp_Invoker(cmpLT, cmpGT, 2, 1, 0, RANGE_DATA(ST, src2_data, src2_step), src2_step, \247RANGE_DATA(ST, src1_data, src1_step), src1_step, \248RANGE_DATA(DT, dst1_data, dst1_step), dst1_step)249TegraGenOp_Invoker(cmpLE, cmpGE, 2, 1, 0, RANGE_DATA(ST, src2_data, src2_step), src2_step, \250RANGE_DATA(ST, src1_data, src1_step), src1_step, \251RANGE_DATA(DT, dst1_data, dst1_step), dst1_step)252#define TEGRA_CMP(type, src1, sz1, src2, sz2, dst, sz, w, h, op) \253( \254CAROTENE_NS::isSupportedConfiguration() ? \255((op) == cv::CMP_EQ) ? \256parallel_for_(Range(0, h), \257TegraGenOp_cmpEQ_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \258(w * h) / static_cast<double>(1<<16)), \259CV_HAL_ERROR_OK : \260((op) == cv::CMP_NE) ? \261parallel_for_(Range(0, h), \262TegraGenOp_cmpNE_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \263(w * h) / static_cast<double>(1<<16)), \264CV_HAL_ERROR_OK : \265((op) == cv::CMP_GT) ? \266parallel_for_(Range(0, h), \267TegraGenOp_cmpGT_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \268(w * h) / static_cast<double>(1<<16)), \269CV_HAL_ERROR_OK : \270((op) == cv::CMP_GE) ? \271parallel_for_(Range(0, h), \272TegraGenOp_cmpGE_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \273(w * h) / static_cast<double>(1<<16)), \274CV_HAL_ERROR_OK : \275((op) == cv::CMP_LT) ? \276parallel_for_(Range(0, h), \277TegraGenOp_cmpLT_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \278(w * h) / static_cast<double>(1<<16)), \279CV_HAL_ERROR_OK : \280((op) == cv::CMP_LE) ? \281parallel_for_(Range(0, h), \282TegraGenOp_cmpLE_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \283(w * h) / static_cast<double>(1<<16)), \284CV_HAL_ERROR_OK : \285CV_HAL_ERROR_NOT_IMPLEMENTED \286: CV_HAL_ERROR_NOT_IMPLEMENTED \287)288289#undef cv_hal_cmp8u290#define cv_hal_cmp8u(src1, sz1, src2, sz2, dst, sz, w, h, op) TEGRA_CMP(CAROTENE_NS::u8, src1, sz1, src2, sz2, dst, sz, w, h, op)291#undef cv_hal_cmp8s292#define cv_hal_cmp8s(src1, sz1, src2, sz2, dst, sz, w, h, op) TEGRA_CMP(CAROTENE_NS::s8, src1, sz1, src2, sz2, dst, sz, w, h, op)293#undef cv_hal_cmp16u294#define cv_hal_cmp16u(src1, sz1, src2, sz2, dst, sz, w, h, op) TEGRA_CMP(CAROTENE_NS::u16, src1, sz1, src2, sz2, dst, sz, w, h, op)295#undef cv_hal_cmp16s296#define cv_hal_cmp16s(src1, sz1, src2, sz2, dst, sz, w, h, op) TEGRA_CMP(CAROTENE_NS::s16, src1, sz1, src2, sz2, dst, sz, w, h, op)297#undef cv_hal_cmp32s298#define cv_hal_cmp32s(src1, sz1, src2, sz2, dst, sz, w, h, op) TEGRA_CMP(CAROTENE_NS::s32, src1, sz1, src2, sz2, dst, sz, w, h, op)299#undef cv_hal_cmp32f300#define cv_hal_cmp32f(src1, sz1, src2, sz2, dst, sz, w, h, op) TEGRA_CMP(CAROTENE_NS::f32, src1, sz1, src2, sz2, dst, sz, w, h, op)301//#undef cv_hal_cmp64f302//#define cv_hal_cmp64f(src1, sz1, src2, sz2, dst, sz, w, h, op) TEGRA_CMP(CAROTENE_NS::f64, src1, sz1, src2, sz2, dst, sz, w, h, op)303304#define TegraBinaryOpScale_Invoker(name, func, scale_cnt, ...) TegraGenOp_Invoker(name, func, 2, 1, scale_cnt, \305RANGE_DATA(ST, src1_data, src1_step), src1_step, \306RANGE_DATA(ST, src2_data, src2_step), src2_step, \307RANGE_DATA(DT, dst1_data, dst1_step), dst1_step, __VA_ARGS__)308309#define TEGRA_BINARYOPSCALE(type, op, src1, sz1, src2, sz2, dst, sz, w, h, scales) \310( \311CAROTENE_NS::isSupportedConfiguration() ? \312parallel_for_(Range(0, h), \313TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, src2, sz2, dst, sz, w, h, scales), \314(w * h) / static_cast<double>(1<<16)), \315CV_HAL_ERROR_OK \316: CV_HAL_ERROR_NOT_IMPLEMENTED \317)318319TegraBinaryOpScale_Invoker(mul, mul, 1, scale, CAROTENE_NS::CONVERT_POLICY_SATURATE)320321TegraBinaryOpScale_Invoker(mulf, mul, 1, scale)322323TegraBinaryOpScale_Invoker(div, div, 1, scale, CAROTENE_NS::CONVERT_POLICY_SATURATE)324325TegraBinaryOpScale_Invoker(divf, div, 1, scale)326327#define TegraUnaryOpScale_Invoker(name, func, scale_cnt, ...) TegraGenOp_Invoker(name, func, 1, 1, scale_cnt, \328RANGE_DATA(ST, src1_data, src1_step), src1_step, \329RANGE_DATA(DT, dst1_data, dst1_step), dst1_step, __VA_ARGS__)330331#define TEGRA_UNARYOPSCALE(type, op, src1, sz1, dst, sz, w, h, scales) \332( \333CAROTENE_NS::isSupportedConfiguration() ? \334parallel_for_(Range(0, h), \335TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, dst, sz, w, h, scales), \336(w * h) / static_cast<double>(1<<16)), \337CV_HAL_ERROR_OK \338: CV_HAL_ERROR_NOT_IMPLEMENTED \339)340341TegraUnaryOpScale_Invoker(recip, reciprocal, 1, scale, CAROTENE_NS::CONVERT_POLICY_SATURATE)342343TegraUnaryOpScale_Invoker(recipf, reciprocal, 1, scale)344345#undef cv_hal_mul8u346#define cv_hal_mul8u(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::u8, mul, src1, sz1, src2, sz2, dst, sz, w, h, scales)347#undef cv_hal_mul8s348#define cv_hal_mul8s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s8, mul, src1, sz1, src2, sz2, dst, sz, w, h, scales)349#undef cv_hal_mul16u350#define cv_hal_mul16u(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::u16, mul, src1, sz1, src2, sz2, dst, sz, w, h, scales)351#undef cv_hal_mul16s352#define cv_hal_mul16s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s16, mul, src1, sz1, src2, sz2, dst, sz, w, h, scales)353#undef cv_hal_mul32s354#define cv_hal_mul32s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s32, mul, src1, sz1, src2, sz2, dst, sz, w, h, scales)355#undef cv_hal_mul32f356#define cv_hal_mul32f(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::f32, mulf, src1, sz1, src2, sz2, dst, sz, w, h, scales)357//#undef cv_hal_mul64f358//#define cv_hal_mul64f(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::f64, mulf, src1, sz1, src2, sz2, dst, sz, w, h, scales)359#undef cv_hal_div8u360#define cv_hal_div8u(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::u8, div, src1, sz1, src2, sz2, dst, sz, w, h, scales)361#undef cv_hal_div8s362#define cv_hal_div8s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s8, div, src1, sz1, src2, sz2, dst, sz, w, h, scales)363#undef cv_hal_div16u364#define cv_hal_div16u(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::u16, div, src1, sz1, src2, sz2, dst, sz, w, h, scales)365#undef cv_hal_div16s366#define cv_hal_div16s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s16, div, src1, sz1, src2, sz2, dst, sz, w, h, scales)367#undef cv_hal_div32s368#define cv_hal_div32s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s32, div, src1, sz1, src2, sz2, dst, sz, w, h, scales)369#undef cv_hal_div32f370#define cv_hal_div32f(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::f32, divf, src1, sz1, src2, sz2, dst, sz, w, h, scales)371//#undef cv_hal_div64f372//#define cv_hal_div64f(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::f64, divf, src1, sz1, src2, sz2, dst, sz, w, h, scales)373#undef cv_hal_recip8u374#define cv_hal_recip8u(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::u8, recip, src1, sz1, dst, sz, w, h, scales)375#undef cv_hal_recip8s376#define cv_hal_recip8s(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::s8, recip, src1, sz1, dst, sz, w, h, scales)377#undef cv_hal_recip16u378#define cv_hal_recip16u(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::u16, recip, src1, sz1, dst, sz, w, h, scales)379#undef cv_hal_recip16s380#define cv_hal_recip16s(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::s16, recip, src1, sz1, dst, sz, w, h, scales)381#undef cv_hal_recip32s382#define cv_hal_recip32s(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::s32, recip, src1, sz1, dst, sz, w, h, scales)383#undef cv_hal_recip32f384#define cv_hal_recip32f(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::f32, recipf, src1, sz1, dst, sz, w, h, scales)385//#undef cv_hal_recip64f386//#define cv_hal_recip64f(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::f64, recipf, src1, sz1, dst, sz, w, h, scales)387388TegraBinaryOpScale_Invoker(addWeighted, addWeighted, 3, scales[0], scales[1], scales[2])389390#undef cv_hal_addWeighted8u391#define cv_hal_addWeighted8u(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::u8, addWeighted, src1, sz1, src2, sz2, dst, sz, w, h, scales)392#undef cv_hal_addWeighted8s393#define cv_hal_addWeighted8s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s8, addWeighted, src1, sz1, src2, sz2, dst, sz, w, h, scales)394#undef cv_hal_addWeighted16u395#define cv_hal_addWeighted16u(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::u16, addWeighted, src1, sz1, src2, sz2, dst, sz, w, h, scales)396#undef cv_hal_addWeighted16s397#define cv_hal_addWeighted16s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s16, addWeighted, src1, sz1, src2, sz2, dst, sz, w, h, scales)398#undef cv_hal_addWeighted32s399#define cv_hal_addWeighted32s(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::s32, addWeighted, src1, sz1, src2, sz2, dst, sz, w, h, scales)400//#undef cv_hal_addWeighted32f401//#define cv_hal_addWeighted32f(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::f32, addWeighted, src1, sz1, src2, sz2, dst, sz, w, h, scales)402//#undef cv_hal_addWeighted64f403//#define cv_hal_addWeighted64f(src1, sz1, src2, sz2, dst, sz, w, h, scales) TEGRA_BINARYOPSCALE(CAROTENE_NS::f64, addWeighted, src1, sz1, src2, sz2, dst, sz, w, h, scales)404405#else406407#define TEGRA_ADD(src1, sz1, src2, sz2, dst, sz, w, h) \408( \409CAROTENE_NS::isSupportedConfiguration() ? \410CAROTENE_NS::add(CAROTENE_NS::Size2D(w, h), \411src1, sz1, \412src2, sz2, \413dst, sz, \414CAROTENE_NS::CONVERT_POLICY_SATURATE), /*Original addition use saturated operator*/ \415/*so use the same from CAROTENE*/ \416CV_HAL_ERROR_OK \417: CV_HAL_ERROR_NOT_IMPLEMENTED \418)419420#define TEGRA_ADDF(src1, sz1, src2, sz2, dst, sz, w, h) \421( \422CAROTENE_NS::isSupportedConfiguration() ? \423CAROTENE_NS::add(CAROTENE_NS::Size2D(w, h), \424src1, sz1, \425src2, sz2, \426dst, sz), \427CV_HAL_ERROR_OK \428: CV_HAL_ERROR_NOT_IMPLEMENTED \429)430431#define TEGRA_SUB(src1, sz1, src2, sz2, dst, sz, w, h) \432( \433CAROTENE_NS::isSupportedConfiguration() ? \434CAROTENE_NS::sub(CAROTENE_NS::Size2D(w, h), \435src1, sz1, \436src2, sz2, \437dst, sz, \438CAROTENE_NS::CONVERT_POLICY_SATURATE), /*Original addition use saturated operator*/ \439/*so use the same from CAROTENE*/ \440CV_HAL_ERROR_OK \441: CV_HAL_ERROR_NOT_IMPLEMENTED \442)443444#define TEGRA_SUBF(src1, sz1, src2, sz2, dst, sz, w, h) \445( \446CAROTENE_NS::isSupportedConfiguration() ? \447CAROTENE_NS::sub(CAROTENE_NS::Size2D(w, h), \448src1, sz1, \449src2, sz2, \450dst, sz), \451CV_HAL_ERROR_OK \452: CV_HAL_ERROR_NOT_IMPLEMENTED \453)454455#define TEGRA_MAX(src1, sz1, src2, sz2, dst, sz, w, h) \456( \457CAROTENE_NS::isSupportedConfiguration() ? \458CAROTENE_NS::max(CAROTENE_NS::Size2D(w, h), \459src1, sz1, \460src2, sz2, \461dst, sz), \462CV_HAL_ERROR_OK \463: CV_HAL_ERROR_NOT_IMPLEMENTED \464)465466#define TEGRA_MIN(src1, sz1, src2, sz2, dst, sz, w, h) \467( \468CAROTENE_NS::isSupportedConfiguration() ? \469CAROTENE_NS::min(CAROTENE_NS::Size2D(w, h), \470src1, sz1, \471src2, sz2, \472dst, sz), \473CV_HAL_ERROR_OK \474: CV_HAL_ERROR_NOT_IMPLEMENTED \475)476477#define TEGRA_ABSDIFF(src1, sz1, src2, sz2, dst, sz, w, h) \478( \479CAROTENE_NS::isSupportedConfiguration() ? \480CAROTENE_NS::absDiff(CAROTENE_NS::Size2D(w, h), \481src1, sz1, \482src2, sz2, \483dst, sz), \484CV_HAL_ERROR_OK \485: CV_HAL_ERROR_NOT_IMPLEMENTED \486)487488#define TEGRA_AND(src1, sz1, src2, sz2, dst, sz, w, h) \489( \490CAROTENE_NS::isSupportedConfiguration() ? \491CAROTENE_NS::bitwiseAnd(CAROTENE_NS::Size2D(w, h), \492src1, sz1, \493src2, sz2, \494dst, sz), \495CV_HAL_ERROR_OK \496: CV_HAL_ERROR_NOT_IMPLEMENTED \497)498#define TEGRA_OR(src1, sz1, src2, sz2, dst, sz, w, h) \499( \500CAROTENE_NS::isSupportedConfiguration() ? \501CAROTENE_NS::bitwiseOr(CAROTENE_NS::Size2D(w, h), \502src1, sz1, \503src2, sz2, \504dst, sz), \505CV_HAL_ERROR_OK \506: CV_HAL_ERROR_NOT_IMPLEMENTED \507)508509#define TEGRA_XOR(src1, sz1, src2, sz2, dst, sz, w, h) \510( \511CAROTENE_NS::isSupportedConfiguration() ? \512CAROTENE_NS::bitwiseXor(CAROTENE_NS::Size2D(w, h), \513src1, sz1, \514src2, sz2, \515dst, sz), \516CV_HAL_ERROR_OK \517: CV_HAL_ERROR_NOT_IMPLEMENTED \518)519520#define TEGRA_NOT(src1, sz1, dst, sz, w, h) \521( \522CAROTENE_NS::isSupportedConfiguration() ? \523CAROTENE_NS::bitwiseNot(CAROTENE_NS::Size2D(w, h), \524src1, sz1, \525dst, sz), \526CV_HAL_ERROR_OK \527: CV_HAL_ERROR_NOT_IMPLEMENTED \528)529530#undef cv_hal_add8u531#define cv_hal_add8u TEGRA_ADD532#undef cv_hal_add8s533#define cv_hal_add8s TEGRA_ADD534#undef cv_hal_add16u535#define cv_hal_add16u TEGRA_ADD536#undef cv_hal_add16s537#define cv_hal_add16s TEGRA_ADD538#undef cv_hal_add32s539#define cv_hal_add32s TEGRA_ADD540#undef cv_hal_add32f541#define cv_hal_add32f TEGRA_ADDF542//#undef cv_hal_add64f543//#define cv_hal_add64f TEGRA_ADDF544#undef cv_hal_sub8u545#define cv_hal_sub8u TEGRA_SUB546#undef cv_hal_sub8s547#define cv_hal_sub8s TEGRA_SUB548#undef cv_hal_sub16u549#define cv_hal_sub16u TEGRA_SUB550#undef cv_hal_sub16s551#define cv_hal_sub16s TEGRA_SUB552#undef cv_hal_sub32s553#define cv_hal_sub32s TEGRA_SUB554#undef cv_hal_sub32f555#define cv_hal_sub32f TEGRA_SUBF556//#undef cv_hal_sub64f557//#define cv_hal_sub64f TEGRA_SUBF558#undef cv_hal_max8u559#define cv_hal_max8u TEGRA_MAX560#undef cv_hal_max8s561#define cv_hal_max8s TEGRA_MAX562#undef cv_hal_max16u563#define cv_hal_max16u TEGRA_MAX564#undef cv_hal_max16s565#define cv_hal_max16s TEGRA_MAX566#undef cv_hal_max32s567#define cv_hal_max32s TEGRA_MAX568#undef cv_hal_max32f569#define cv_hal_max32f TEGRA_MAX570//#undef cv_hal_max64f571//#define cv_hal_max64f TEGRA_MAX572#undef cv_hal_min8u573#define cv_hal_min8u TEGRA_MIN574#undef cv_hal_min8s575#define cv_hal_min8s TEGRA_MIN576#undef cv_hal_min16u577#define cv_hal_min16u TEGRA_MIN578#undef cv_hal_min16s579#define cv_hal_min16s TEGRA_MIN580#undef cv_hal_min32s581#define cv_hal_min32s TEGRA_MIN582#undef cv_hal_min32f583#define cv_hal_min32f TEGRA_MIN584//#undef cv_hal_min64f585//#define cv_hal_min64f TEGRA_MIN586#undef cv_hal_absdiff8u587#define cv_hal_absdiff8u TEGRA_ABSDIFF588#undef cv_hal_absdiff8s589#define cv_hal_absdiff8s TEGRA_ABSDIFF590#undef cv_hal_absdiff16u591#define cv_hal_absdiff16u TEGRA_ABSDIFF592#undef cv_hal_absdiff16s593#define cv_hal_absdiff16s TEGRA_ABSDIFF594#undef cv_hal_absdiff32s595#define cv_hal_absdiff32s TEGRA_ABSDIFF596#undef cv_hal_absdiff32f597#define cv_hal_absdiff32f TEGRA_ABSDIFF598//#undef cv_hal_absdiff64f599//#define cv_hal_absdiff64f TEGRA_ABSDIFF600#undef cv_hal_and8u601#define cv_hal_and8u TEGRA_AND602#undef cv_hal_or8u603#define cv_hal_or8u TEGRA_OR604#undef cv_hal_xor8u605#define cv_hal_xor8u TEGRA_XOR606#undef cv_hal_not8u607#define cv_hal_not8u TEGRA_NOT608609#define TEGRA_CMP(src1, sz1, src2, sz2, dst, sz, w, h, op) \610( \611CAROTENE_NS::isSupportedConfiguration() ? \612((op) == cv::CMP_EQ) ? \613CAROTENE_NS::cmpEQ(CAROTENE_NS::Size2D(w, h), \614src1, sz1, \615src2, sz2, \616dst, sz), \617CV_HAL_ERROR_OK : \618((op) == cv::CMP_NE) ? \619CAROTENE_NS::cmpNE(CAROTENE_NS::Size2D(w, h), \620src1, sz1, \621src2, sz2, \622dst, sz), \623CV_HAL_ERROR_OK : \624((op) == cv::CMP_GT) ? \625CAROTENE_NS::cmpGT(CAROTENE_NS::Size2D(w, h), \626src1, sz1, \627src2, sz2, \628dst, sz), \629CV_HAL_ERROR_OK : \630((op) == cv::CMP_GE) ? \631CAROTENE_NS::cmpGE(CAROTENE_NS::Size2D(w, h), \632src1, sz1, \633src2, sz2, \634dst, sz), \635CV_HAL_ERROR_OK : \636((op) == cv::CMP_LT) ? \637CAROTENE_NS::cmpGT(CAROTENE_NS::Size2D(w, h), \638src2, sz2, \639src1, sz1, \640dst, sz), \641CV_HAL_ERROR_OK : \642((op) == cv::CMP_LE) ? \643CAROTENE_NS::cmpGE(CAROTENE_NS::Size2D(w, h), \644src2, sz2, \645src1, sz1, \646dst, sz), \647CV_HAL_ERROR_OK : \648CV_HAL_ERROR_NOT_IMPLEMENTED \649: CV_HAL_ERROR_NOT_IMPLEMENTED \650)651652#undef cv_hal_cmp8u653#define cv_hal_cmp8u TEGRA_CMP654#undef cv_hal_cmp8s655#define cv_hal_cmp8s TEGRA_CMP656#undef cv_hal_cmp16u657#define cv_hal_cmp16u TEGRA_CMP658#undef cv_hal_cmp16s659#define cv_hal_cmp16s TEGRA_CMP660#undef cv_hal_cmp32s661#define cv_hal_cmp32s TEGRA_CMP662#undef cv_hal_cmp32f663#define cv_hal_cmp32f TEGRA_CMP664//#undef cv_hal_cmp64f665//#define cv_hal_cmp64f TEGRA_CMP666667#define TEGRA_MUL(src1, sz1, src2, sz2, dst, sz, w, h, scale) \668( \669CAROTENE_NS::isSupportedConfiguration() ? \670CAROTENE_NS::mul(CAROTENE_NS::Size2D(w, h), \671src1, sz1, \672src2, sz2, \673dst, sz, \674scale, \675CAROTENE_NS::CONVERT_POLICY_SATURATE), \676CV_HAL_ERROR_OK \677: CV_HAL_ERROR_NOT_IMPLEMENTED \678)679680#define TEGRA_MULF(src1, sz1, src2, sz2, dst, sz, w, h, scale) \681( \682CAROTENE_NS::isSupportedConfiguration() ? \683CAROTENE_NS::mul(CAROTENE_NS::Size2D(w, h), \684src1, sz1, \685src2, sz2, \686dst, sz, \687(float)scale), \688CV_HAL_ERROR_OK \689: CV_HAL_ERROR_NOT_IMPLEMENTED \690)691692#define TEGRA_DIV(src1, sz1, src2, sz2, dst, sz, w, h, scale) \693( \694CAROTENE_NS::isSupportedConfiguration() ? \695CAROTENE_NS::div(CAROTENE_NS::Size2D(w, h), \696src1, sz1, \697src2, sz2, \698dst, sz, \699scale, \700CAROTENE_NS::CONVERT_POLICY_SATURATE), \701CV_HAL_ERROR_OK \702: CV_HAL_ERROR_NOT_IMPLEMENTED \703)704705#define TEGRA_DIVF(src1, sz1, src2, sz2, dst, sz, w, h, scale) \706( \707CAROTENE_NS::isSupportedConfiguration() ? \708CAROTENE_NS::div(CAROTENE_NS::Size2D(w, h), \709src1, sz1, \710src2, sz2, \711dst, sz, \712(float)scale), \713CV_HAL_ERROR_OK \714: CV_HAL_ERROR_NOT_IMPLEMENTED \715)716717#define TEGRA_RECIP(src2, sz2, dst, sz, w, h, scale) \718( \719CAROTENE_NS::isSupportedConfiguration() ? \720CAROTENE_NS::reciprocal(CAROTENE_NS::Size2D(w, h), \721src2, sz2, \722dst, sz, \723scale, \724CAROTENE_NS::CONVERT_POLICY_SATURATE), \725CV_HAL_ERROR_OK \726: CV_HAL_ERROR_NOT_IMPLEMENTED \727)728729#define TEGRA_RECIPF(src2, sz2, dst, sz, w, h, scale) \730( \731CAROTENE_NS::isSupportedConfiguration() ? \732CAROTENE_NS::reciprocal(CAROTENE_NS::Size2D(w, h), \733src2, sz2, \734dst, sz, \735(float)scale), \736CV_HAL_ERROR_OK \737: CV_HAL_ERROR_NOT_IMPLEMENTED \738)739740#undef cv_hal_mul8u741#define cv_hal_mul8u TEGRA_MUL742#undef cv_hal_mul8s743#define cv_hal_mul8s TEGRA_MUL744#undef cv_hal_mul16u745#define cv_hal_mul16u TEGRA_MUL746#undef cv_hal_mul16s747#define cv_hal_mul16s TEGRA_MUL748#undef cv_hal_mul32s749#define cv_hal_mul32s TEGRA_MUL750#undef cv_hal_mul32f751#define cv_hal_mul32f TEGRA_MULF752//#undef cv_hal_mul64f753//#define cv_hal_mul64f TEGRA_MULF754#undef cv_hal_div8u755#define cv_hal_div8u TEGRA_DIV756#undef cv_hal_div8s757#define cv_hal_div8s TEGRA_DIV758#undef cv_hal_div16u759#define cv_hal_div16u TEGRA_DIV760#undef cv_hal_div16s761#define cv_hal_div16s TEGRA_DIV762#undef cv_hal_div32s763#define cv_hal_div32s TEGRA_DIV764#undef cv_hal_div32f765#define cv_hal_div32f TEGRA_DIVF766//#undef cv_hal_div64f767//#define cv_hal_div64f TEGRA_DIVF768#undef cv_hal_recip8u769#define cv_hal_recip8u TEGRA_RECIP770#undef cv_hal_recip8s771#define cv_hal_recip8s TEGRA_RECIP772#undef cv_hal_recip16u773#define cv_hal_recip16u TEGRA_RECIP774#undef cv_hal_recip16s775#define cv_hal_recip16s TEGRA_RECIP776#undef cv_hal_recip32s777#define cv_hal_recip32s TEGRA_RECIP778#undef cv_hal_recip32f779#define cv_hal_recip32f TEGRA_RECIPF780//#undef cv_hal_recip64f781//#define cv_hal_recip64f TEGRA_RECIPF782783#define TEGRA_ADDWEIGHTED(src1, sz1, src2, sz2, dst, sz, w, h, scales) \784( \785CAROTENE_NS::isSupportedConfiguration() ? \786CAROTENE_NS::addWeighted(CAROTENE_NS::Size2D(w, h), \787src1, sz1, \788src2, sz2, \789dst, sz, \790((double *)scales)[0], ((double *)scales)[1], ((double *)scales)[2]), \791CV_HAL_ERROR_OK \792: CV_HAL_ERROR_NOT_IMPLEMENTED \793)794795#undef cv_hal_addWeighted8u796#define cv_hal_addWeighted8u TEGRA_ADDWEIGHTED797#undef cv_hal_addWeighted8s798#define cv_hal_addWeighted8s TEGRA_ADDWEIGHTED799#undef cv_hal_addWeighted16u800#define cv_hal_addWeighted16u TEGRA_ADDWEIGHTED801#undef cv_hal_addWeighted16s802#define cv_hal_addWeighted16s TEGRA_ADDWEIGHTED803#undef cv_hal_addWeighted32s804#define cv_hal_addWeighted32s TEGRA_ADDWEIGHTED805//#undef cv_hal_addWeighted32f806//#define cv_hal_addWeighted32f TEGRA_ADDWEIGHTED807//#undef cv_hal_addWeighted64f808//#define cv_hal_addWeighted64f TEGRA_ADDWEIGHTED809810#endif //PARALLEL_CORE811812#define ROW_SRC_ARG1 const ST * src1_data_813#define ROW_SRC_STORE1 , src1_data(src1_data_)814#define ROW_SRC_VAR1 const ST * src1_data;815#define ROW_SRC_ARG2 ROW_SRC_ARG1 \816, const ST * src2_data_817#define ROW_SRC_STORE2 ROW_SRC_STORE1 \818, src2_data(src2_data_)819#define ROW_SRC_VAR2 ROW_SRC_VAR1 \820const ST * src2_data;821#define ROW_SRC_ARG3 ROW_SRC_ARG2 \822, const ST * src3_data_823#define ROW_SRC_STORE3 ROW_SRC_STORE2 \824, src3_data(src3_data_)825#define ROW_SRC_VAR3 ROW_SRC_VAR2 \826const ST * src3_data;827#define ROW_SRC_ARG4 ROW_SRC_ARG3 \828, const ST * src4_data_829#define ROW_SRC_STORE4 ROW_SRC_STORE3 \830, src4_data(src4_data_)831#define ROW_SRC_VAR4 ROW_SRC_VAR3 \832const ST * src4_data;833834#define ROW_DST_ARG1 , DT * dst1_data_835#define ROW_DST_STORE1 , dst1_data(dst1_data_)836#define ROW_DST_VAR1 DT * dst1_data;837#define ROW_DST_ARG2 ROW_DST_ARG1 \838, DT * dst2_data_839#define ROW_DST_STORE2 ROW_DST_STORE1 \840, dst2_data(dst2_data_)841#define ROW_DST_VAR2 ROW_DST_VAR1 \842DT * dst2_data;843#define ROW_DST_ARG3 ROW_DST_ARG2 \844, DT * dst3_data_845#define ROW_DST_STORE3 ROW_DST_STORE2 \846, dst3_data(dst3_data_)847#define ROW_DST_VAR3 ROW_DST_VAR2 \848DT * dst3_data;849#define ROW_DST_ARG4 ROW_DST_ARG3 \850, DT * dst4_data_851#define ROW_DST_STORE4 ROW_DST_STORE3 \852, dst4_data(dst4_data_)853#define ROW_DST_VAR4 ROW_DST_VAR3 \854DT * dst4_data;855856#define ROW_VAL_ARG0857#define ROW_VAL_STORE0858#define ROW_VAL_VAR0859#define ROW_VAL_ARG1 , double val_860#define ROW_VAL_STORE1 , val(val_)861#define ROW_VAL_VAR1 double val;862863#define TegraRowOp_Invoker(name, func, src_cnt, dst_cnt, val_cnt, ...) \864template <typename ST, typename DT> \865class TegraRowOp_##name##_Invoker : public cv::ParallelLoopBody \866{ \867public: \868TegraRowOp_##name##_Invoker(ROW_SRC_ARG##src_cnt \869ROW_DST_ARG##dst_cnt \870ROW_VAL_ARG##val_cnt) : \871cv::ParallelLoopBody() ROW_SRC_STORE##src_cnt \872ROW_DST_STORE##dst_cnt \873ROW_VAL_STORE##val_cnt {} \874virtual void operator()(const cv::Range& range) const \875{ \876CAROTENE_NS::func(CAROTENE_NS::Size2D(range.end-range.start, 1), __VA_ARGS__); \877} \878private: \879ROW_SRC_VAR##src_cnt \880ROW_DST_VAR##dst_cnt \881ROW_VAL_VAR##val_cnt \882const TegraRowOp_##name##_Invoker& operator= (const TegraRowOp_##name##_Invoker&); \883};884885886#define TEGRA_SPLIT(src, dst, len, cn) \887( \888CAROTENE_NS::isSupportedConfiguration() ? \889cn == 2 ? \890CAROTENE_NS::split2(CAROTENE_NS::Size2D(len, 1), \891src, len, \892dst[0], len, \893dst[1], len), \894CV_HAL_ERROR_OK : \895cn == 3 ? \896CAROTENE_NS::split3(CAROTENE_NS::Size2D(len, 1), \897src, len, \898dst[0], len, \899dst[1], len, \900dst[2], len), \901CV_HAL_ERROR_OK : \902cn == 4 ? \903CAROTENE_NS::split4(CAROTENE_NS::Size2D(len, 1), \904src, len, \905dst[0], len, \906dst[1], len, \907dst[2], len, \908dst[3], len), \909CV_HAL_ERROR_OK : \910CV_HAL_ERROR_NOT_IMPLEMENTED \911: CV_HAL_ERROR_NOT_IMPLEMENTED \912)913914TegraRowOp_Invoker(split2, split2, 1, 2, 0, RANGE_DATA(ST, src1_data, 2*sizeof(ST)), range.end-range.start,915RANGE_DATA(DT, dst1_data, sizeof(DT)), range.end-range.start,916RANGE_DATA(DT, dst2_data, sizeof(DT)), range.end-range.start)917TegraRowOp_Invoker(split3, split3, 1, 3, 0, RANGE_DATA(ST, src1_data, 3*sizeof(ST)), range.end-range.start,918RANGE_DATA(DT, dst1_data, sizeof(DT)), range.end-range.start,919RANGE_DATA(DT, dst2_data, sizeof(DT)), range.end-range.start,920RANGE_DATA(DT, dst3_data, sizeof(DT)), range.end-range.start)921TegraRowOp_Invoker(split4, split4, 1, 4, 0, RANGE_DATA(ST, src1_data, 4*sizeof(ST)), range.end-range.start,922RANGE_DATA(DT, dst1_data, sizeof(DT)), range.end-range.start,923RANGE_DATA(DT, dst2_data, sizeof(DT)), range.end-range.start,924RANGE_DATA(DT, dst3_data, sizeof(DT)), range.end-range.start,925RANGE_DATA(DT, dst4_data, sizeof(DT)), range.end-range.start)926#define TEGRA_SPLIT64S(type, src, dst, len, cn) \927( \928CAROTENE_NS::isSupportedConfiguration() ? \929cn == 2 ? \930parallel_for_(Range(0, len), \931TegraRowOp_split2_Invoker<const type, type>(src, dst[0], dst[1]), \932(len) / static_cast<double>(1<<16)), \933CV_HAL_ERROR_OK : \934cn == 3 ? \935parallel_for_(Range(0, len), \936TegraRowOp_split3_Invoker<const type, type>(src, dst[0], dst[1], dst[2]), \937(len) / static_cast<double>(1<<16)), \938CV_HAL_ERROR_OK : \939cn == 4 ? \940parallel_for_(Range(0, len), \941TegraRowOp_split4_Invoker<const type, type>(src, dst[0], dst[1], dst[2], dst[3]), \942(len) / static_cast<double>(1<<16)), \943CV_HAL_ERROR_OK : \944CV_HAL_ERROR_NOT_IMPLEMENTED \945: CV_HAL_ERROR_NOT_IMPLEMENTED \946)947948#define TEGRA_MERGE(src, dst, len, cn) \949( \950CAROTENE_NS::isSupportedConfiguration() ? \951cn == 2 ? \952CAROTENE_NS::combine2(CAROTENE_NS::Size2D(len, 1), \953src[0], len, \954src[1], len, \955dst, len), \956CV_HAL_ERROR_OK : \957cn == 3 ? \958CAROTENE_NS::combine3(CAROTENE_NS::Size2D(len, 1), \959src[0], len, \960src[1], len, \961src[2], len, \962dst, len), \963CV_HAL_ERROR_OK : \964cn == 4 ? \965CAROTENE_NS::combine4(CAROTENE_NS::Size2D(len, 1), \966src[0], len, \967src[1], len, \968src[2], len, \969src[3], len, \970dst, len), \971CV_HAL_ERROR_OK : \972CV_HAL_ERROR_NOT_IMPLEMENTED \973: CV_HAL_ERROR_NOT_IMPLEMENTED \974)975976TegraRowOp_Invoker(combine2, combine2, 2, 1, 0, RANGE_DATA(ST, src1_data, sizeof(ST)), range.end-range.start,977RANGE_DATA(ST, src2_data, sizeof(ST)), range.end-range.start,978RANGE_DATA(DT, dst1_data, 2*sizeof(DT)), range.end-range.start)979TegraRowOp_Invoker(combine3, combine3, 3, 1, 0, RANGE_DATA(ST, src1_data, sizeof(ST)), range.end-range.start,980RANGE_DATA(ST, src2_data, sizeof(ST)), range.end-range.start,981RANGE_DATA(ST, src3_data, sizeof(ST)), range.end-range.start,982RANGE_DATA(DT, dst1_data, 3*sizeof(DT)), range.end-range.start)983TegraRowOp_Invoker(combine4, combine4, 4, 1, 0, RANGE_DATA(ST, src1_data, sizeof(ST)), range.end-range.start,984RANGE_DATA(ST, src2_data, sizeof(ST)), range.end-range.start,985RANGE_DATA(ST, src3_data, sizeof(ST)), range.end-range.start,986RANGE_DATA(ST, src4_data, sizeof(ST)), range.end-range.start,987RANGE_DATA(DT, dst1_data, 4*sizeof(DT)), range.end-range.start)988#define TEGRA_MERGE64S(type, src, dst, len, cn) \989( \990CAROTENE_NS::isSupportedConfiguration() ? \991cn == 2 ? \992parallel_for_(Range(0, len), \993TegraRowOp_combine2_Invoker<const type, type>(src[0], src[1], dst), \994(len) / static_cast<double>(1<<16)), \995CV_HAL_ERROR_OK : \996cn == 3 ? \997parallel_for_(Range(0, len), \998TegraRowOp_combine3_Invoker<const type, type>(src[0], src[1], src[2], dst), \999(len) / static_cast<double>(1<<16)), \1000CV_HAL_ERROR_OK : \1001cn == 4 ? \1002parallel_for_(Range(0, len), \1003TegraRowOp_combine4_Invoker<const type, type>(src[0], src[1], src[2], src[3], dst), \1004(len) / static_cast<double>(1<<16)), \1005CV_HAL_ERROR_OK : \1006CV_HAL_ERROR_NOT_IMPLEMENTED \1007: CV_HAL_ERROR_NOT_IMPLEMENTED \1008)10091010#undef cv_hal_split8u1011#define cv_hal_split8u TEGRA_SPLIT1012#undef cv_hal_split16u1013#define cv_hal_split16u TEGRA_SPLIT1014#undef cv_hal_split32s1015#define cv_hal_split32s TEGRA_SPLIT1016#undef cv_hal_split64s1017#define cv_hal_split64s(src, dst, len, cn) TEGRA_SPLIT64S(CAROTENE_NS::s64, src, dst, len, cn)10181019#undef cv_hal_merge8u1020#define cv_hal_merge8u TEGRA_MERGE1021#undef cv_hal_merge16u1022#define cv_hal_merge16u TEGRA_MERGE1023#undef cv_hal_merge32s1024#define cv_hal_merge32s TEGRA_MERGE1025#undef cv_hal_merge64s1026#define cv_hal_merge64s(src, dst, len, cn) TEGRA_MERGE64S(CAROTENE_NS::s64, src, dst, len, cn)102710281029TegraRowOp_Invoker(phase, phase, 2, 1, 1, RANGE_DATA(ST, src1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,1030RANGE_DATA(ST, src2_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,1031RANGE_DATA(DT, dst1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start, val)1032#define TEGRA_FASTATAN(y, x, dst, len, angleInDegrees) \1033( \1034CAROTENE_NS::isSupportedConfiguration() ? \1035parallel_for_(Range(0, len), \1036TegraRowOp_phase_Invoker<const CAROTENE_NS::f32, CAROTENE_NS::f32>(x, y, dst, angleInDegrees ? 1.0f : M_PI/180), \1037(len) / static_cast<double>(1<<16)), \1038CV_HAL_ERROR_OK \1039: CV_HAL_ERROR_NOT_IMPLEMENTED \1040)10411042#undef cv_hal_fastAtan32f1043#define cv_hal_fastAtan32f TEGRA_FASTATAN10441045TegraRowOp_Invoker(magnitude, magnitude, 2, 1, 0, RANGE_DATA(ST, src1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,1046RANGE_DATA(ST, src2_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,1047RANGE_DATA(DT, dst1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start)1048#define TEGRA_MAGNITUDE(x, y, dst, len) \1049( \1050CAROTENE_NS::isSupportedConfiguration() ? \1051parallel_for_(Range(0, len), \1052TegraRowOp_magnitude_Invoker<const CAROTENE_NS::f32, CAROTENE_NS::f32>(x, y, dst), \1053(len) / static_cast<double>(1<<16)), \1054CV_HAL_ERROR_OK \1055: CV_HAL_ERROR_NOT_IMPLEMENTED \1056)10571058#undef cv_hal_magnitude32f1059#define cv_hal_magnitude32f TEGRA_MAGNITUDE106010611062#if defined OPENCV_IMGPROC_HAL_INTERFACE_H10631064struct cvhalFilter2D;10651066struct FilterCtx1067{1068CAROTENE_NS::Size2D ksize;1069CAROTENE_NS::s16* kernel_data;1070CAROTENE_NS::BORDER_MODE border;1071};1072inline int TEGRA_FILTERINIT(cvhalFilter2D **context, uchar *kernel_data, size_t kernel_step, int kernel_type, int kernel_width, int kernel_height,1073int max_width, int max_height, int src_type, int dst_type, int borderType, double delta, int anchor_x, int anchor_y, bool allowSubmatrix, bool allowInplace)1074{1075if(!context || !kernel_data || allowSubmatrix || allowInplace ||1076src_type != CV_8UC1 || dst_type != CV_8UC1 ||1077delta != 0 || anchor_x != kernel_width / 2 || anchor_y != kernel_height / 2 )1078return CV_HAL_ERROR_NOT_IMPLEMENTED;10791080FilterCtx* ctx = new FilterCtx;1081if(!ctx)1082return CV_HAL_ERROR_UNKNOWN;1083ctx->ksize.width = kernel_width;1084ctx->ksize.height = kernel_height;1085switch(borderType)1086{1087case CV_HAL_BORDER_CONSTANT:1088ctx->border = CAROTENE_NS::BORDER_MODE_CONSTANT;1089break;1090case CV_HAL_BORDER_REPLICATE:1091ctx->border = CAROTENE_NS::BORDER_MODE_REPLICATE;1092break;1093case CV_HAL_BORDER_REFLECT:1094ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT;1095break;1096case CV_HAL_BORDER_WRAP:1097ctx->border = CAROTENE_NS::BORDER_MODE_WRAP;1098break;1099case CV_HAL_BORDER_REFLECT_101:1100ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT101;1101break;1102default:1103delete ctx;1104return CV_HAL_ERROR_NOT_IMPLEMENTED;1105}11061107if(!CAROTENE_NS::isConvolutionSupported(CAROTENE_NS::Size2D(max_width, max_height), ctx->ksize, ctx->border))1108{1109delete ctx;1110return CV_HAL_ERROR_NOT_IMPLEMENTED;1111}11121113ctx->kernel_data = new CAROTENE_NS::s16[kernel_width*kernel_height];1114if(!ctx->kernel_data)1115return CV_HAL_ERROR_UNKNOWN;1116switch(kernel_type)1117{1118case CV_8UC1:1119convert(ctx->ksize, (CAROTENE_NS::u8*)kernel_data, kernel_step, ctx->kernel_data, kernel_width);1120break;1121case CV_8SC1:1122convert(ctx->ksize, (CAROTENE_NS::s8*)kernel_data, kernel_step, ctx->kernel_data, kernel_width);1123break;1124case CV_16UC1:1125for(int j = 0; j < kernel_height; ++j)1126{1127std::memcpy(ctx->kernel_data + kernel_width * j, kernel_data + kernel_step * j, kernel_width * sizeof(int16_t));1128}1129default:1130delete[] ctx->kernel_data;1131delete ctx;1132return CV_HAL_ERROR_NOT_IMPLEMENTED;1133}11341135*context = (cvhalFilter2D*)(ctx);1136return CV_HAL_ERROR_OK;1137}1138inline int TEGRA_FILTERFREE(cvhalFilter2D *context)1139{1140if(context)1141{1142if(((FilterCtx*)context)->kernel_data)1143delete[] ((FilterCtx*)context)->kernel_data;1144delete (FilterCtx*)context;1145return CV_HAL_ERROR_OK;1146}1147else1148{1149return CV_HAL_ERROR_UNKNOWN;1150}1151}1152#define TEGRA_FILTERIMPL(context, src_data, src_step, dst_data, dst_step, width, height, full_width, full_height, offset_x, offset_y) \1153( \1154(void)full_width, (void)full_height, (void)offset_x, (void)offset_y, \1155context && CAROTENE_NS::isConvolutionSupported(CAROTENE_NS::Size2D(width, height), ((FilterCtx*)context)->ksize, ((FilterCtx*)context)->border) ? \1156CAROTENE_NS::convolution(CAROTENE_NS::Size2D(width, height), \1157src_data, src_step, \1158dst_data, dst_step, \1159((FilterCtx*)context)->border, 0, \1160((FilterCtx*)context)->ksize, ((FilterCtx*)context)->kernel_data, 1), \1161CV_HAL_ERROR_OK \1162: CV_HAL_ERROR_NOT_IMPLEMENTED \1163)11641165#undef cv_hal_filterInit1166#define cv_hal_filterInit TEGRA_FILTERINIT1167#undef cv_hal_filter1168#define cv_hal_filter TEGRA_FILTERIMPL1169#undef cv_hal_filterFree1170#define cv_hal_filterFree TEGRA_FILTERFREE117111721173struct SepFilterCtx1174{1175int16_t kernelx_data[3];1176int16_t kernely_data[3];1177CAROTENE_NS::BORDER_MODE border;1178};1179inline int TEGRA_SEPFILTERINIT(cvhalFilter2D **context, int src_type, int dst_type, int kernel_type,1180uchar *kernelx_data, int kernelx_length,1181uchar *kernely_data, int kernely_length,1182int anchor_x, int anchor_y, double delta, int borderType)1183{1184if(!context || !kernelx_data || !kernely_data || src_type != CV_8UC1 || dst_type != CV_16SC1 ||1185kernelx_length != 3 || kernely_length != 3 ||1186delta != 0 || anchor_x != 1 || anchor_y != 1)1187return CV_HAL_ERROR_NOT_IMPLEMENTED;11881189SepFilterCtx* ctx = new SepFilterCtx;1190if(!ctx)1191return CV_HAL_ERROR_UNKNOWN;1192switch(borderType)1193{1194case CV_HAL_BORDER_CONSTANT:1195ctx->border = CAROTENE_NS::BORDER_MODE_CONSTANT;1196break;1197case CV_HAL_BORDER_REPLICATE:1198ctx->border = CAROTENE_NS::BORDER_MODE_REPLICATE;1199break;1200case CV_HAL_BORDER_REFLECT:1201ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT;1202break;1203case CV_HAL_BORDER_WRAP:1204ctx->border = CAROTENE_NS::BORDER_MODE_WRAP;1205break;1206case CV_HAL_BORDER_REFLECT_101:1207ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT101;1208break;1209default:1210delete ctx;1211return CV_HAL_ERROR_NOT_IMPLEMENTED;1212}12131214if(!CAROTENE_NS::isSeparableFilter3x3Supported(CAROTENE_NS::Size2D(16, 16), ctx->border, 3, 3))1215{1216delete ctx;1217return CV_HAL_ERROR_NOT_IMPLEMENTED;1218}12191220switch(kernel_type)1221{1222case CV_8UC1:1223ctx->kernelx_data[0]=kernelx_data[0];1224ctx->kernelx_data[1]=kernelx_data[1];1225ctx->kernelx_data[2]=kernelx_data[2];1226ctx->kernely_data[0]=kernely_data[0];1227ctx->kernely_data[1]=kernely_data[1];1228ctx->kernely_data[2]=kernely_data[2];1229break;1230case CV_8SC1:1231ctx->kernelx_data[0]=((char*)kernelx_data)[0];1232ctx->kernelx_data[1]=((char*)kernelx_data)[1];1233ctx->kernelx_data[2]=((char*)kernelx_data)[2];1234ctx->kernely_data[0]=((char*)kernely_data)[0];1235ctx->kernely_data[1]=((char*)kernely_data)[1];1236ctx->kernely_data[2]=((char*)kernely_data)[2];1237break;1238case CV_16UC1:1239ctx->kernelx_data[0]=((int16_t*)kernelx_data)[0];1240ctx->kernelx_data[1]=((int16_t*)kernelx_data)[1];1241ctx->kernelx_data[2]=((int16_t*)kernelx_data)[2];1242ctx->kernely_data[0]=((int16_t*)kernely_data)[0];1243ctx->kernely_data[1]=((int16_t*)kernely_data)[1];1244ctx->kernely_data[2]=((int16_t*)kernely_data)[2];1245default:1246delete ctx;1247return CV_HAL_ERROR_NOT_IMPLEMENTED;1248}12491250*context = (cvhalFilter2D*)(ctx);1251return CV_HAL_ERROR_OK;1252}1253inline int TEGRA_SEPFILTERFREE(cvhalFilter2D *context)1254{1255if(context)1256{1257delete (SepFilterCtx*)context;1258return CV_HAL_ERROR_OK;1259}1260else1261{1262return CV_HAL_ERROR_UNKNOWN;1263}1264}1265#define TEGRA_SEPFILTERIMPL(context, src_data, src_step, dst_data, dst_step, width, height, full_width, full_height, offset_x, offset_y) \1266( \1267context && CAROTENE_NS::isSeparableFilter3x3Supported(CAROTENE_NS::Size2D(width, height), ((SepFilterCtx*)context)->border, 3, 3, \1268CAROTENE_NS::Margin(offset_x, full_width - width - offset_x, offset_y, full_height - height - offset_y)) ? \1269CAROTENE_NS::SeparableFilter3x3(CAROTENE_NS::Size2D(width, height), \1270src_data, src_step, \1271(CAROTENE_NS::s16*)dst_data, dst_step, \12723, 3, ((SepFilterCtx*)context)->kernelx_data, ((SepFilterCtx*)context)->kernely_data, \1273((SepFilterCtx*)context)->border, 0, \1274CAROTENE_NS::Margin(offset_x, full_width - width - offset_x, offset_y, full_height - height - offset_y)), \1275CV_HAL_ERROR_OK \1276: CV_HAL_ERROR_NOT_IMPLEMENTED \1277)12781279#undef cv_hal_sepFilterInit1280#define cv_hal_sepFilterInit TEGRA_SEPFILTERINIT1281#undef cv_hal_sepFilter1282#define cv_hal_sepFilter TEGRA_SEPFILTERIMPL1283#undef cv_hal_sepFilterFree1284#define cv_hal_sepFilterFree TEGRA_SEPFILTERFREE128512861287struct MorphCtx1288{1289int operation;1290int channels;1291CAROTENE_NS::Size2D ksize;1292int anchor_x, anchor_y;1293CAROTENE_NS::BORDER_MODE border;1294uchar borderValues[4];1295};1296inline int TEGRA_MORPHINIT(cvhalFilter2D **context, int operation, int src_type, int dst_type, int, int,1297int kernel_type, uchar *kernel_data, size_t kernel_step, int kernel_width, int kernel_height, int anchor_x, int anchor_y,1298int borderType, const double borderValue[4], int iterations, bool allowSubmatrix, bool allowInplace)1299{1300if(!context || !kernel_data || src_type != dst_type ||1301CV_MAT_DEPTH(src_type) != CV_8U || src_type < 0 || (src_type >> CV_CN_SHIFT) > 3 ||13021303allowSubmatrix || allowInplace || iterations != 1 ||1304!CAROTENE_NS::isSupportedConfiguration())1305return CV_HAL_ERROR_NOT_IMPLEMENTED;13061307switch(CV_MAT_DEPTH(kernel_type))1308{1309case CV_8U:1310if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), kernel_data, kernel_step) != kernel_width * kernel_height)1311return CV_HAL_ERROR_NOT_IMPLEMENTED;1312break;1313case CV_16U:1314if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (uint16_t*)kernel_data, kernel_step) != kernel_width * kernel_height)1315return CV_HAL_ERROR_NOT_IMPLEMENTED;1316break;1317case CV_32S:1318if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (int32_t*)kernel_data, kernel_step) != kernel_width * kernel_height)1319return CV_HAL_ERROR_NOT_IMPLEMENTED;1320break;1321case CV_32F:1322if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (float*)kernel_data, kernel_step) != kernel_width * kernel_height)1323return CV_HAL_ERROR_NOT_IMPLEMENTED;1324break;1325case CV_64F:1326if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (double*)kernel_data, kernel_step) != kernel_width * kernel_height)1327return CV_HAL_ERROR_NOT_IMPLEMENTED;1328break;1329default:1330return CV_HAL_ERROR_NOT_IMPLEMENTED;1331}13321333MorphCtx* ctx = new MorphCtx;1334if(!ctx)1335return CV_HAL_ERROR_UNKNOWN;1336ctx->channels = (src_type >> CV_CN_SHIFT) + 1;1337ctx->ksize.width = kernel_width;1338ctx->ksize.height = kernel_height;1339ctx->anchor_x = anchor_x;1340ctx->anchor_y = anchor_y;1341switch(operation)1342{1343case CV_HAL_MORPH_ERODE:1344case CV_HAL_MORPH_DILATE:1345ctx->operation = operation;1346break;1347default:1348delete ctx;1349return CV_HAL_ERROR_NOT_IMPLEMENTED;1350}1351switch(borderType)1352{1353case CV_HAL_BORDER_CONSTANT:1354ctx->border = CAROTENE_NS::BORDER_MODE_CONSTANT;1355if( borderValue[0] == DBL_MAX && borderValue[1] == DBL_MAX && borderValue[2] == DBL_MAX && borderValue[3] == DBL_MAX )1356{1357if( operation == CV_HAL_MORPH_ERODE )1358for(int i = 0; i < ctx->channels; ++i)1359ctx->borderValues[i] = (CAROTENE_NS::u8)UCHAR_MAX;1360else1361for(int i = 0; i < ctx->channels; ++i)1362ctx->borderValues[i] = 0;1363}1364else1365{1366for(int i = 0; i < ctx->channels; ++i)1367ctx->borderValues[i] = (CAROTENE_NS::u8)cv::saturate_cast<uchar>(borderValue[i]);1368}1369break;1370case CV_HAL_BORDER_REPLICATE:1371ctx->border = CAROTENE_NS::BORDER_MODE_REPLICATE;1372break;1373case CV_HAL_BORDER_REFLECT:1374ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT;1375break;1376case CV_HAL_BORDER_WRAP:1377ctx->border = CAROTENE_NS::BORDER_MODE_WRAP;1378break;1379case CV_HAL_BORDER_REFLECT_101:1380ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT101;1381break;1382default:1383delete ctx;1384return CV_HAL_ERROR_NOT_IMPLEMENTED;1385}13861387*context = (cvhalFilter2D*)(ctx);1388return CV_HAL_ERROR_OK;1389}1390inline int TEGRA_MORPHFREE(cvhalFilter2D *context)1391{1392if(context)1393{1394delete (MorphCtx*)context;1395return CV_HAL_ERROR_OK;1396}1397else1398{1399return CV_HAL_ERROR_UNKNOWN;1400}1401}1402#define TEGRA_MORPHIMPL(context, src_data, src_step, dst_data, dst_step, width, height, src_full_width, src_full_height, src_roi_x, src_roi_y, dst_full_width, dst_full_height, dst_roi_x, dst_roi_y) \1403( \1404(void)dst_full_width, (void)dst_full_height, (void)dst_roi_x, (void)dst_roi_y, \1405context && CAROTENE_NS::isSupportedConfiguration() ? \1406((MorphCtx*)context)->operation == CV_HAL_MORPH_ERODE ? \1407CAROTENE_NS::erode(CAROTENE_NS::Size2D(width, height), ((MorphCtx*)context)->channels, \1408src_data, src_step, dst_data, dst_step, \1409((MorphCtx*)context)->ksize, ((MorphCtx*)context)->anchor_x, ((MorphCtx*)context)->anchor_y, \1410((MorphCtx*)context)->border, ((MorphCtx*)context)->border, ((MorphCtx*)context)->borderValues, \1411CAROTENE_NS::Margin(src_roi_x, src_full_width - width - src_roi_x, src_roi_y, src_full_height - height - src_roi_y)), \1412CV_HAL_ERROR_OK : \1413((MorphCtx*)context)->operation == CV_HAL_MORPH_DILATE ? \1414CAROTENE_NS::dilate(CAROTENE_NS::Size2D(width, height), ((MorphCtx*)context)->channels, \1415src_data, src_step, dst_data, dst_step, \1416((MorphCtx*)context)->ksize, ((MorphCtx*)context)->anchor_x, ((MorphCtx*)context)->anchor_y, \1417((MorphCtx*)context)->border, ((MorphCtx*)context)->border, ((MorphCtx*)context)->borderValues, \1418CAROTENE_NS::Margin(src_roi_x, src_full_width - width - src_roi_x, src_roi_y, src_full_height - height - src_roi_y)), \1419CV_HAL_ERROR_OK : \1420CV_HAL_ERROR_NOT_IMPLEMENTED \1421: CV_HAL_ERROR_NOT_IMPLEMENTED \1422)14231424#undef cv_hal_morphInit1425#define cv_hal_morphInit TEGRA_MORPHINIT1426#undef cv_hal_morph1427#define cv_hal_morph TEGRA_MORPHIMPL1428#undef cv_hal_morphFree1429#define cv_hal_morphFree TEGRA_MORPHFREE1430143114321433#define TEGRA_RESIZE(src_type, src_data, src_step, src_width, src_height, dst_data, dst_step, dst_width, dst_height, inv_scale_x, inv_scale_y, interpolation) \1434( \1435interpolation == CV_HAL_INTER_LINEAR ? \1436CV_MAT_DEPTH(src_type) == CV_8U && CAROTENE_NS::isResizeLinearOpenCVSupported(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), ((src_type >> CV_CN_SHIFT) + 1)) && \1437inv_scale_x > 0 && inv_scale_y > 0 && \1438(dst_width - 0.5)/inv_scale_x - 0.5 < src_width && (dst_height - 0.5)/inv_scale_y - 0.5 < src_height && \1439(dst_width + 0.5)/inv_scale_x + 0.5 >= src_width && (dst_height + 0.5)/inv_scale_y + 0.5 >= src_height && \1440std::abs(dst_width / inv_scale_x - src_width) < 0.1 && std::abs(dst_height / inv_scale_y - src_height) < 0.1 ? \1441CAROTENE_NS::resizeLinearOpenCV(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1442src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, ((src_type >> CV_CN_SHIFT) + 1)), \1443CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \1444interpolation == CV_HAL_INTER_AREA ? \1445CV_MAT_DEPTH(src_type) == CV_8U && CAROTENE_NS::isResizeAreaSupported(1.0/inv_scale_x, 1.0/inv_scale_y, ((src_type >> CV_CN_SHIFT) + 1)) && \1446std::abs(dst_width / inv_scale_x - src_width) < 0.1 && std::abs(dst_height / inv_scale_y - src_height) < 0.1 ? \1447CAROTENE_NS::resizeAreaOpenCV(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1448src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, ((src_type >> CV_CN_SHIFT) + 1)), \1449CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \1450/*nearest neighbour interpolation disabled due to rounding accuracy issues*/ \1451/*interpolation == CV_HAL_INTER_NEAREST ? \1452(src_type == CV_8UC1 || src_type == CV_8SC1) && CAROTENE_NS::isResizeNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height), 1) ? \1453CAROTENE_NS::resizeNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1454src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, 1), \1455CV_HAL_ERROR_OK : \1456(src_type == CV_8UC3 || src_type == CV_8SC3) && CAROTENE_NS::isResizeNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height), 3) ? \1457CAROTENE_NS::resizeNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1458src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, 3), \1459CV_HAL_ERROR_OK : \1460(src_type == CV_8UC4 || src_type == CV_8SC4 || src_type == CV_16UC2 || src_type == CV_16SC2 || src_type == CV_32SC1) && \1461CAROTENE_NS::isResizeNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height), 4) ? \1462CAROTENE_NS::resizeNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1463src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, 4), \1464CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED :*/ \1465CV_HAL_ERROR_NOT_IMPLEMENTED \1466)14671468#define TEGRA_WARPAFFINE(src_type, src_data, src_step, src_width, src_height, dst_data, dst_step, dst_width, dst_height, M, interpolation, borderType, borderValue) \1469( \1470interpolation == CV_HAL_INTER_NEAREST ? \1471(src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \1472CAROTENE_NS::isWarpAffineNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \1473CAROTENE_NS::warpAffineNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1474src_data, src_step, \1475std::vector<float>(M+0,M+6).data(), \1476dst_data, dst_step, \1477borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \1478(CAROTENE_NS::u8)borderValue[0]), \1479CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \1480interpolation == CV_HAL_INTER_LINEAR ? \1481(src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \1482CAROTENE_NS::isWarpAffineLinearSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \1483CAROTENE_NS::warpAffineLinear(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1484src_data, src_step, \1485std::vector<float>(M+0,M+6).data(), \1486dst_data, dst_step, \1487borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \1488(CAROTENE_NS::u8)borderValue[0]), \1489CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \1490CV_HAL_ERROR_NOT_IMPLEMENTED \1491)14921493#define TEGRA_WARPPERSPECTIVE(src_type, src_data, src_step, src_width, src_height, dst_data, dst_step, dst_width, dst_height, M, interpolation, borderType, borderValue) \1494( \1495interpolation == CV_HAL_INTER_NEAREST ? \1496(src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \1497CAROTENE_NS::isWarpPerspectiveNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \1498CAROTENE_NS::warpPerspectiveNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1499src_data, src_step, \1500std::vector<float>(M+0,M+9).data(), \1501dst_data, dst_step, \1502borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \1503(CAROTENE_NS::u8)borderValue[0]), \1504CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \1505interpolation == CV_HAL_INTER_LINEAR ? \1506(src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \1507CAROTENE_NS::isWarpPerspectiveLinearSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \1508CAROTENE_NS::warpPerspectiveLinear(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \1509src_data, src_step, \1510std::vector<float>(M+0,M+9).data(), \1511dst_data, dst_step, \1512borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \1513(CAROTENE_NS::u8)borderValue[0]), \1514CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \1515CV_HAL_ERROR_NOT_IMPLEMENTED \1516)15171518#undef cv_hal_resize1519#define cv_hal_resize TEGRA_RESIZE1520//warpAffine/warpPerspective disabled due to rounding accuracy issue1521//#undef cv_hal_warpAffine1522//#define cv_hal_warpAffine TEGRA_WARPAFFINE1523//#undef cv_hal_warpPerspective1524//#define cv_hal_warpPerspective TEGRA_WARPPERSPECTIVE152515261527#define TegraCvtColor_Invoker(name, func, ...) \1528class TegraCvtColor_##name##_Invoker : public cv::ParallelLoopBody \1529{ \1530public: \1531TegraCvtColor_##name##_Invoker(const uchar * src_data_, size_t src_step_, uchar * dst_data_, size_t dst_step_, int width_, int height_) : \1532cv::ParallelLoopBody(), src_data(src_data_), src_step(src_step_), dst_data(dst_data_), dst_step(dst_step_), width(width_), height(height_) {} \1533virtual void operator()(const cv::Range& range) const CV_OVERRIDE \1534{ \1535CAROTENE_NS::func(CAROTENE_NS::Size2D(width, range.end-range.start), __VA_ARGS__); \1536} \1537private: \1538const uchar * src_data; \1539size_t src_step; \1540uchar * dst_data; \1541size_t dst_step; \1542int width, height; \1543const TegraCvtColor_##name##_Invoker& operator= (const TegraCvtColor_##name##_Invoker&); \1544};15451546TegraCvtColor_Invoker(rgb2bgr, rgb2bgr, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1547dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1548TegraCvtColor_Invoker(rgb2bgrx, rgb2bgrx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1549dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1550TegraCvtColor_Invoker(rgb2rgbx, rgb2rgbx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1551dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1552TegraCvtColor_Invoker(rgbx2bgr, rgbx2bgr, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1553dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1554TegraCvtColor_Invoker(rgbx2rgb, rgbx2rgb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1555dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1556TegraCvtColor_Invoker(rgbx2bgrx, rgbx2bgrx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1557dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1558#define TEGRA_CVTBGRTOBGR(src_data, src_step, dst_data, dst_step, width, height, depth, scn, dcn, swapBlue) \1559( \1560depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \1561scn == 3 ? \1562dcn == 3 ? \1563swapBlue ? \1564parallel_for_(Range(0, height), \1565TegraCvtColor_rgb2bgr_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1566(width * height) / static_cast<double>(1<<16)), \1567CV_HAL_ERROR_OK : \1568CV_HAL_ERROR_NOT_IMPLEMENTED : \1569dcn == 4 ? \1570(swapBlue ? \1571parallel_for_(Range(0, height), \1572TegraCvtColor_rgb2bgrx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1573(width * height) / static_cast<double>(1<<16)) : \1574parallel_for_(Range(0, height), \1575TegraCvtColor_rgb2rgbx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1576(width * height) / static_cast<double>(1<<16)) ), \1577CV_HAL_ERROR_OK : \1578CV_HAL_ERROR_NOT_IMPLEMENTED : \1579scn == 4 ? \1580dcn == 3 ? \1581(swapBlue ? \1582parallel_for_(Range(0, height), \1583TegraCvtColor_rgbx2bgr_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1584(width * height) / static_cast<double>(1<<16)) : \1585parallel_for_(Range(0, height), \1586TegraCvtColor_rgbx2rgb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1587(width * height) / static_cast<double>(1<<16)) ), \1588CV_HAL_ERROR_OK : \1589dcn == 4 ? \1590swapBlue ? \1591parallel_for_(Range(0, height), \1592TegraCvtColor_rgbx2bgrx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1593(width * height) / static_cast<double>(1<<16)), \1594CV_HAL_ERROR_OK : \1595CV_HAL_ERROR_NOT_IMPLEMENTED : \1596CV_HAL_ERROR_NOT_IMPLEMENTED : \1597CV_HAL_ERROR_NOT_IMPLEMENTED \1598: CV_HAL_ERROR_NOT_IMPLEMENTED \1599)16001601TegraCvtColor_Invoker(rgb2bgr565, rgb2bgr565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1602dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1603TegraCvtColor_Invoker(rgb2rgb565, rgb2rgb565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1604dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1605TegraCvtColor_Invoker(rgbx2bgr565, rgbx2bgr565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1606dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1607TegraCvtColor_Invoker(rgbx2rgb565, rgbx2rgb565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1608dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1609#define TEGRA_CVTBGRTOBGR565(src_data, src_step, dst_data, dst_step, width, height, scn, swapBlue, greenBits) \1610( \1611greenBits == 6 && CAROTENE_NS::isSupportedConfiguration() ? \1612scn == 3 ? \1613(swapBlue ? \1614parallel_for_(Range(0, height), \1615TegraCvtColor_rgb2bgr565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1616(width * height) / static_cast<double>(1<<16)) : \1617parallel_for_(Range(0, height), \1618TegraCvtColor_rgb2rgb565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1619(width * height) / static_cast<double>(1<<16)) ), \1620CV_HAL_ERROR_OK : \1621scn == 4 ? \1622(swapBlue ? \1623parallel_for_(Range(0, height), \1624TegraCvtColor_rgbx2bgr565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1625(width * height) / static_cast<double>(1<<16)) : \1626parallel_for_(Range(0, height), \1627TegraCvtColor_rgbx2rgb565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1628(width * height) / static_cast<double>(1<<16)) ), \1629CV_HAL_ERROR_OK : \1630CV_HAL_ERROR_NOT_IMPLEMENTED \1631: CV_HAL_ERROR_NOT_IMPLEMENTED \1632)16331634TegraCvtColor_Invoker(rgb2gray, rgb2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1635dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1636TegraCvtColor_Invoker(bgr2gray, bgr2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1637dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1638TegraCvtColor_Invoker(rgbx2gray, rgbx2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1639dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1640TegraCvtColor_Invoker(bgrx2gray, bgrx2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1641dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1642#define TEGRA_CVTBGRTOGRAY(src_data, src_step, dst_data, dst_step, width, height, depth, scn, swapBlue) \1643( \1644depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \1645scn == 3 ? \1646(swapBlue ? \1647parallel_for_(Range(0, height), \1648TegraCvtColor_rgb2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1649(width * height) / static_cast<double>(1<<16)) : \1650parallel_for_(Range(0, height), \1651TegraCvtColor_bgr2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1652(width * height) / static_cast<double>(1<<16)) ), \1653CV_HAL_ERROR_OK : \1654scn == 4 ? \1655(swapBlue ? \1656parallel_for_(Range(0, height), \1657TegraCvtColor_rgbx2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1658(width * height) / static_cast<double>(1<<16)) : \1659parallel_for_(Range(0, height), \1660TegraCvtColor_bgrx2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1661(width * height) / static_cast<double>(1<<16)) ), \1662CV_HAL_ERROR_OK : \1663CV_HAL_ERROR_NOT_IMPLEMENTED \1664: CV_HAL_ERROR_NOT_IMPLEMENTED \1665)16661667TegraCvtColor_Invoker(gray2rgb, gray2rgb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1668dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1669TegraCvtColor_Invoker(gray2rgbx, gray2rgbx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1670dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1671#define TEGRA_CVTGRAYTOBGR(src_data, src_step, dst_data, dst_step, width, height, depth, dcn) \1672( \1673depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \1674dcn == 3 ? \1675parallel_for_(Range(0, height), \1676TegraCvtColor_gray2rgb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1677(width * height) / static_cast<double>(1<<16)), \1678CV_HAL_ERROR_OK : \1679dcn == 4 ? \1680parallel_for_(Range(0, height), \1681TegraCvtColor_gray2rgbx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1682(width * height) / static_cast<double>(1<<16)), \1683CV_HAL_ERROR_OK : \1684CV_HAL_ERROR_NOT_IMPLEMENTED \1685: CV_HAL_ERROR_NOT_IMPLEMENTED \1686)16871688TegraCvtColor_Invoker(rgb2ycrcb, rgb2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1689dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1690TegraCvtColor_Invoker(bgr2ycrcb, bgr2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1691dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1692TegraCvtColor_Invoker(rgbx2ycrcb, rgbx2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1693dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1694TegraCvtColor_Invoker(bgrx2ycrcb, bgrx2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1695dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)1696#define TEGRA_CVTBGRTOYUV(src_data, src_step, dst_data, dst_step, width, height, depth, scn, swapBlue, isCbCr) \1697( \1698isCbCr && depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \1699scn == 3 ? \1700(swapBlue ? \1701parallel_for_(Range(0, height), \1702TegraCvtColor_rgb2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1703(width * height) / static_cast<double>(1<<16)) : \1704parallel_for_(Range(0, height), \1705TegraCvtColor_bgr2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1706(width * height) / static_cast<double>(1<<16)) ), \1707CV_HAL_ERROR_OK : \1708scn == 4 ? \1709(swapBlue ? \1710parallel_for_(Range(0, height), \1711TegraCvtColor_rgbx2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1712(width * height) / static_cast<double>(1<<16)) : \1713parallel_for_(Range(0, height), \1714TegraCvtColor_bgrx2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1715(width * height) / static_cast<double>(1<<16)) ), \1716CV_HAL_ERROR_OK : \1717CV_HAL_ERROR_NOT_IMPLEMENTED \1718: CV_HAL_ERROR_NOT_IMPLEMENTED \1719)17201721TegraCvtColor_Invoker(rgb2hsv, rgb2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1722dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)1723TegraCvtColor_Invoker(bgr2hsv, bgr2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1724dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)1725TegraCvtColor_Invoker(rgbx2hsv, rgbx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1726dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)1727TegraCvtColor_Invoker(bgrx2hsv, bgrx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1728dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)1729TegraCvtColor_Invoker(rgb2hsvf, rgb2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1730dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)1731TegraCvtColor_Invoker(bgr2hsvf, bgr2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1732dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)1733TegraCvtColor_Invoker(rgbx2hsvf, rgbx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1734dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)1735TegraCvtColor_Invoker(bgrx2hsvf, bgrx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \1736dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)1737#define TEGRA_CVTBGRTOHSV(src_data, src_step, dst_data, dst_step, width, height, depth, scn, swapBlue, isFullRange, isHSV) \1738( \1739isHSV && depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \1740scn == 3 ? \1741(swapBlue ? \1742isFullRange ? \1743parallel_for_(Range(0, height), \1744TegraCvtColor_rgb2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1745(width * height) / static_cast<double>(1<<16)) : \1746parallel_for_(Range(0, height), \1747TegraCvtColor_rgb2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1748(width * height) / static_cast<double>(1<<16)) : \1749isFullRange ? \1750parallel_for_(Range(0, height), \1751TegraCvtColor_bgr2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1752(width * height) / static_cast<double>(1<<16)) : \1753parallel_for_(Range(0, height), \1754TegraCvtColor_bgr2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1755(width * height) / static_cast<double>(1<<16)) ), \1756CV_HAL_ERROR_OK : \1757scn == 4 ? \1758(swapBlue ? \1759isFullRange ? \1760parallel_for_(Range(0, height), \1761TegraCvtColor_rgbx2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1762(width * height) / static_cast<double>(1<<16)) : \1763parallel_for_(Range(0, height), \1764TegraCvtColor_rgbx2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1765(width * height) / static_cast<double>(1<<16)) : \1766isFullRange ? \1767parallel_for_(Range(0, height), \1768TegraCvtColor_bgrx2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1769(width * height) / static_cast<double>(1<<16)) : \1770parallel_for_(Range(0, height), \1771TegraCvtColor_bgrx2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \1772(width * height) / static_cast<double>(1<<16)) ), \1773CV_HAL_ERROR_OK : \1774CV_HAL_ERROR_NOT_IMPLEMENTED \1775: CV_HAL_ERROR_NOT_IMPLEMENTED \1776)17771778#define TEGRA_CVT2PYUVTOBGR(src_data, src_step, dst_data, dst_step, dst_width, dst_height, dcn, swapBlue, uIdx) \1779( \1780CAROTENE_NS::isSupportedConfiguration() ? \1781dcn == 3 ? \1782uIdx == 0 ? \1783(swapBlue ? \1784CAROTENE_NS::yuv420i2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \1785src_data, src_step, \1786src_data + src_step * dst_height, src_step, \1787dst_data, dst_step) : \1788CAROTENE_NS::yuv420i2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \1789src_data, src_step, \1790src_data + src_step * dst_height, src_step, \1791dst_data, dst_step)), \1792CV_HAL_ERROR_OK : \1793uIdx == 1 ? \1794(swapBlue ? \1795CAROTENE_NS::yuv420sp2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \1796src_data, src_step, \1797src_data + src_step * dst_height, src_step, \1798dst_data, dst_step) : \1799CAROTENE_NS::yuv420sp2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \1800src_data, src_step, \1801src_data + src_step * dst_height, src_step, \1802dst_data, dst_step)), \1803CV_HAL_ERROR_OK : \1804CV_HAL_ERROR_NOT_IMPLEMENTED : \1805dcn == 4 ? \1806uIdx == 0 ? \1807(swapBlue ? \1808CAROTENE_NS::yuv420i2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \1809src_data, src_step, \1810src_data + src_step * dst_height, src_step, \1811dst_data, dst_step) : \1812CAROTENE_NS::yuv420i2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \1813src_data, src_step, \1814src_data + src_step * dst_height, src_step, \1815dst_data, dst_step)), \1816CV_HAL_ERROR_OK : \1817uIdx == 1 ? \1818(swapBlue ? \1819CAROTENE_NS::yuv420sp2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \1820src_data, src_step, \1821src_data + src_step * dst_height, src_step, \1822dst_data, dst_step) : \1823CAROTENE_NS::yuv420sp2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \1824src_data, src_step, \1825src_data + src_step * dst_height, src_step, \1826dst_data, dst_step)), \1827CV_HAL_ERROR_OK : \1828CV_HAL_ERROR_NOT_IMPLEMENTED : \1829CV_HAL_ERROR_NOT_IMPLEMENTED \1830: CV_HAL_ERROR_NOT_IMPLEMENTED \1831)18321833#undef cv_hal_cvtBGRtoBGR1834#define cv_hal_cvtBGRtoBGR TEGRA_CVTBGRTOBGR1835#undef cv_hal_cvtBGRtoBGR5x51836#define cv_hal_cvtBGRtoBGR5x5 TEGRA_CVTBGRTOBGR5651837#undef cv_hal_cvtBGRtoGray1838#define cv_hal_cvtBGRtoGray TEGRA_CVTBGRTOGRAY1839#undef cv_hal_cvtGraytoBGR1840#define cv_hal_cvtGraytoBGR TEGRA_CVTGRAYTOBGR1841#undef cv_hal_cvtBGRtoYUV1842#define cv_hal_cvtBGRtoYUV TEGRA_CVTBGRTOYUV1843#undef cv_hal_cvtBGRtoHSV1844#define cv_hal_cvtBGRtoHSV TEGRA_CVTBGRTOHSV1845#undef cv_hal_cvtTwoPlaneYUVtoBGR1846#define cv_hal_cvtTwoPlaneYUVtoBGR TEGRA_CVT2PYUVTOBGR18471848#endif // OPENCV_IMGPROC_HAL_INTERFACE_H18491850#endif185118521853