tegra_hal.hpp 89 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862
  1. /*
  2. * By downloading, copying, installing or using the software you agree to this license.
  3. * If you do not agree to this license, do not download, install,
  4. * copy or use the software.
  5. *
  6. *
  7. * License Agreement
  8. * For Open Source Computer Vision Library
  9. * (3-clause BSD License)
  10. *
  11. * Copyright (C) 2016, NVIDIA Corporation, all rights reserved.
  12. * Third party copyrights are property of their respective owners.
  13. *
  14. * Redistribution and use in source and binary forms, with or without modification,
  15. * are permitted provided that the following conditions are met:
  16. *
  17. * * Redistributions of source code must retain the above copyright notice,
  18. * this list of conditions and the following disclaimer.
  19. *
  20. * * Redistributions in binary form must reproduce the above copyright notice,
  21. * this list of conditions and the following disclaimer in the documentation
  22. * and/or other materials provided with the distribution.
  23. *
  24. * * Neither the names of the copyright holders nor the names of the contributors
  25. * may be used to endorse or promote products derived from this software
  26. * without specific prior written permission.
  27. *
  28. * This software is provided by the copyright holders and contributors "as is" and
  29. * any express or implied warranties, including, but not limited to, the implied
  30. * warranties of merchantability and fitness for a particular purpose are disclaimed.
  31. * In no event shall copyright holders or contributors be liable for any direct,
  32. * indirect, incidental, special, exemplary, or consequential damages
  33. * (including, but not limited to, procurement of substitute goods or services;
  34. * loss of use, data, or profits; or business interruption) however caused
  35. * and on any theory of liability, whether in contract, strict liability,
  36. * or tort (including negligence or otherwise) arising in any way out of
  37. * the use of this software, even if advised of the possibility of such damage.
  38. */
  39. #ifndef _tegra_hal_H_INCLUDED_
  40. #define _tegra_hal_H_INCLUDED_
  41. #define CAROTENE_NS carotene_o4t
  42. #include "carotene/functions.hpp"
  43. #include <cstddef>
  44. #include <cstring>
  45. #include <vector>
  46. #include <opencv2/core/base.hpp>
  47. #define RANGE_DATA(type, base, step) reinterpret_cast<type*>(const_cast<char *>(reinterpret_cast<const char *>(base)) + static_cast<size_t>(range.start) * step)
  48. #define PARALLEL_CORE 0
  49. #if PARALLEL_CORE
  50. #define SRC_ARG1 ST * src1_data_, size_t src1_step_,
  51. #define SRC_STORE1 src1_data(src1_data_), src1_step(src1_step_),
  52. #define SRC_VAR1 ST * src1_data; \
  53. size_t src1_step;
  54. #define SRC_ARG2 ST * src1_data_, size_t src1_step_, \
  55. ST * src2_data_, size_t src2_step_,
  56. #define SRC_STORE2 src1_data(src1_data_), src1_step(src1_step_), \
  57. src2_data(src2_data_), src2_step(src2_step_),
  58. #define SRC_VAR2 ST * src1_data; \
  59. size_t src1_step; \
  60. ST * src2_data; \
  61. size_t src2_step;
  62. #define DST_ARG1 DT * dst1_data_, size_t dst1_step_,
  63. #define DST_STORE1 dst1_data(dst1_data_), dst1_step(dst1_step_),
  64. #define DST_VAR1 DT * dst1_data; \
  65. size_t dst1_step;
  66. #define SCALE_ARG0
  67. #define SCALE_STORE0
  68. #define SCALE_VAR0
  69. #define SCALE_ARG1 , double scale_
  70. #define SCALE_STORE1 , scale(scale_)
  71. #define SCALE_VAR1 double scale;
  72. #define SCALE_ARG3 , const double *scales_
  73. #define SCALE_STORE3 , scales(scales_, scales_ + 3)
  74. #define SCALE_VAR3 std::vector<double> scales;
  75. #define TegraGenOp_Invoker(name, func, src_cnt, dst_cnt, scale_cnt, ...) \
  76. template <typename ST, typename DT> \
  77. class TegraGenOp_##name##_Invoker : public cv::ParallelLoopBody \
  78. { \
  79. public: \
  80. TegraGenOp_##name##_Invoker(SRC_ARG##src_cnt \
  81. DST_ARG##dst_cnt \
  82. int width_, int height_ \
  83. SCALE_ARG##scale_cnt) : \
  84. cv::ParallelLoopBody(), SRC_STORE##src_cnt \
  85. DST_STORE##dst_cnt \
  86. width(width_), height(height_) \
  87. SCALE_STORE##scale_cnt {} \
  88. virtual void operator()(const cv::Range& range) const \
  89. { \
  90. CAROTENE_NS::func(CAROTENE_NS::Size2D(width, range.end-range.start), __VA_ARGS__); \
  91. } \
  92. private: \
  93. SRC_VAR##src_cnt \
  94. DST_VAR##dst_cnt \
  95. int width, height; \
  96. SCALE_VAR##scale_cnt \
  97. const TegraGenOp_##name##_Invoker& operator= (const TegraGenOp_##name##_Invoker&); \
  98. };
  99. #define TegraBinaryOp_Invoker(name, func) TegraGenOp_Invoker(name, func, 2, 1, 0, \
  100. RANGE_DATA(ST, src1_data, src1_step), src1_step, \
  101. RANGE_DATA(ST, src2_data, src2_step), src2_step, \
  102. RANGE_DATA(DT, dst1_data, dst1_step), dst1_step )
  103. #define TegraBinaryOp_InvokerVAArg(name, func, ...) TegraGenOp_Invoker(name, func, 2, 1, 0, \
  104. RANGE_DATA(ST, src1_data, src1_step), src1_step, \
  105. RANGE_DATA(ST, src2_data, src2_step), src2_step, \
  106. RANGE_DATA(DT, dst1_data, dst1_step), dst1_step, __VA_ARGS__)
  107. #define TEGRA_BINARYOP(type, op, src1, sz1, src2, sz2, dst, sz, w, h) \
  108. ( \
  109. CAROTENE_NS::isSupportedConfiguration() ? \
  110. parallel_for_(Range(0, h), \
  111. TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, src2, sz2, dst, sz, w, h), \
  112. (w * h) / static_cast<double>(1<<16)), \
  113. CV_HAL_ERROR_OK \
  114. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  115. )
  116. TegraBinaryOp_InvokerVAArg(add, add, CAROTENE_NS::CONVERT_POLICY_SATURATE) /*Original addition use saturated operator, so use the same from CAROTENE*/
  117. TegraBinaryOp_Invoker(addf, add)
  118. TegraBinaryOp_InvokerVAArg(sub, sub, CAROTENE_NS::CONVERT_POLICY_SATURATE) /*Original addition use saturated operator, so use the same from CAROTENE*/
  119. TegraBinaryOp_Invoker(subf, sub)
  120. TegraBinaryOp_Invoker(max, max)
  121. TegraBinaryOp_Invoker(min, min)
  122. TegraBinaryOp_Invoker(absDiff, absDiff)
  123. TegraBinaryOp_Invoker(bitwiseAnd, bitwiseAnd)
  124. TegraBinaryOp_Invoker(bitwiseOr, bitwiseOr)
  125. TegraBinaryOp_Invoker(bitwiseXor, bitwiseXor)
  126. #define TegraUnaryOp_Invoker(name, func) TegraGenOp_Invoker(name, func, 1, 1, 0, \
  127. RANGE_DATA(ST, src1_data, src1_step), src1_step, \
  128. RANGE_DATA(DT, dst1_data, dst1_step), dst1_step )
  129. TegraUnaryOp_Invoker(bitwiseNot, bitwiseNot)
  130. #define TEGRA_UNARYOP(type, op, src1, sz1, dst, sz, w, h) \
  131. ( \
  132. CAROTENE_NS::isSupportedConfiguration() ? \
  133. parallel_for_(Range(0, h), \
  134. TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, dst, sz, w, h), \
  135. (w * h) / static_cast<double>(1<<16)), \
  136. CV_HAL_ERROR_OK \
  137. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  138. )
  139. #undef cv_hal_add8u
  140. #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)
  141. #undef cv_hal_add8s
  142. #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)
  143. #undef cv_hal_add16u
  144. #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)
  145. #undef cv_hal_add16s
  146. #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)
  147. #undef cv_hal_add32s
  148. #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)
  149. #undef cv_hal_add32f
  150. #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)
  151. //#undef cv_hal_add64f
  152. //#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)
  153. #undef cv_hal_sub8u
  154. #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)
  155. #undef cv_hal_sub8s
  156. #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)
  157. #undef cv_hal_sub16u
  158. #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)
  159. #undef cv_hal_sub16s
  160. #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)
  161. #undef cv_hal_sub32s
  162. #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)
  163. #undef cv_hal_sub32f
  164. #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)
  165. //#undef cv_hal_sub64f
  166. //#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)
  167. #undef cv_hal_max8u
  168. #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)
  169. #undef cv_hal_max8s
  170. #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)
  171. #undef cv_hal_max16u
  172. #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)
  173. #undef cv_hal_max16s
  174. #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)
  175. #undef cv_hal_max32s
  176. #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)
  177. #undef cv_hal_max32f
  178. #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)
  179. //#undef cv_hal_max64f
  180. //#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)
  181. #undef cv_hal_min8u
  182. #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)
  183. #undef cv_hal_min8s
  184. #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)
  185. #undef cv_hal_min16u
  186. #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)
  187. #undef cv_hal_min16s
  188. #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)
  189. #undef cv_hal_min32s
  190. #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)
  191. #undef cv_hal_min32f
  192. #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)
  193. //#undef cv_hal_min64f
  194. //#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)
  195. #undef cv_hal_absdiff8u
  196. #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)
  197. #undef cv_hal_absdiff8s
  198. #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)
  199. #undef cv_hal_absdiff16u
  200. #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)
  201. #undef cv_hal_absdiff16s
  202. #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)
  203. #undef cv_hal_absdiff32s
  204. #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)
  205. #undef cv_hal_absdiff32f
  206. #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)
  207. //#undef cv_hal_absdiff64f
  208. //#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)
  209. #undef cv_hal_and8u
  210. #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)
  211. #undef cv_hal_or8u
  212. #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)
  213. #undef cv_hal_xor8u
  214. #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)
  215. #undef cv_hal_not8u
  216. #define cv_hal_not8u(src1, sz1, dst, sz, w, h) TEGRA_UNARYOP(CAROTENE_NS::u8, bitwiseNot, src1, sz1, dst, sz, w, h)
  217. TegraBinaryOp_Invoker(cmpEQ, cmpEQ)
  218. TegraBinaryOp_Invoker(cmpNE, cmpNE)
  219. TegraBinaryOp_Invoker(cmpGT, cmpGT)
  220. TegraBinaryOp_Invoker(cmpGE, cmpGE)
  221. TegraGenOp_Invoker(cmpLT, cmpGT, 2, 1, 0, RANGE_DATA(ST, src2_data, src2_step), src2_step, \
  222. RANGE_DATA(ST, src1_data, src1_step), src1_step, \
  223. RANGE_DATA(DT, dst1_data, dst1_step), dst1_step)
  224. TegraGenOp_Invoker(cmpLE, cmpGE, 2, 1, 0, RANGE_DATA(ST, src2_data, src2_step), src2_step, \
  225. RANGE_DATA(ST, src1_data, src1_step), src1_step, \
  226. RANGE_DATA(DT, dst1_data, dst1_step), dst1_step)
  227. #define TEGRA_CMP(type, src1, sz1, src2, sz2, dst, sz, w, h, op) \
  228. ( \
  229. CAROTENE_NS::isSupportedConfiguration() ? \
  230. ((op) == cv::CMP_EQ) ? \
  231. parallel_for_(Range(0, h), \
  232. TegraGenOp_cmpEQ_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \
  233. (w * h) / static_cast<double>(1<<16)), \
  234. CV_HAL_ERROR_OK : \
  235. ((op) == cv::CMP_NE) ? \
  236. parallel_for_(Range(0, h), \
  237. TegraGenOp_cmpNE_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \
  238. (w * h) / static_cast<double>(1<<16)), \
  239. CV_HAL_ERROR_OK : \
  240. ((op) == cv::CMP_GT) ? \
  241. parallel_for_(Range(0, h), \
  242. TegraGenOp_cmpGT_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \
  243. (w * h) / static_cast<double>(1<<16)), \
  244. CV_HAL_ERROR_OK : \
  245. ((op) == cv::CMP_GE) ? \
  246. parallel_for_(Range(0, h), \
  247. TegraGenOp_cmpGE_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \
  248. (w * h) / static_cast<double>(1<<16)), \
  249. CV_HAL_ERROR_OK : \
  250. ((op) == cv::CMP_LT) ? \
  251. parallel_for_(Range(0, h), \
  252. TegraGenOp_cmpLT_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \
  253. (w * h) / static_cast<double>(1<<16)), \
  254. CV_HAL_ERROR_OK : \
  255. ((op) == cv::CMP_LE) ? \
  256. parallel_for_(Range(0, h), \
  257. TegraGenOp_cmpLE_Invoker<const type, CAROTENE_NS::u8>(src1, sz1, src2, sz2, dst, sz, w, h), \
  258. (w * h) / static_cast<double>(1<<16)), \
  259. CV_HAL_ERROR_OK : \
  260. CV_HAL_ERROR_NOT_IMPLEMENTED \
  261. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  262. )
  263. #undef cv_hal_cmp8u
  264. #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)
  265. #undef cv_hal_cmp8s
  266. #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)
  267. #undef cv_hal_cmp16u
  268. #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)
  269. #undef cv_hal_cmp16s
  270. #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)
  271. #undef cv_hal_cmp32s
  272. #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)
  273. #undef cv_hal_cmp32f
  274. #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)
  275. //#undef cv_hal_cmp64f
  276. //#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)
  277. #define TegraBinaryOpScale_Invoker(name, func, scale_cnt, ...) TegraGenOp_Invoker(name, func, 2, 1, scale_cnt, \
  278. RANGE_DATA(ST, src1_data, src1_step), src1_step, \
  279. RANGE_DATA(ST, src2_data, src2_step), src2_step, \
  280. RANGE_DATA(DT, dst1_data, dst1_step), dst1_step, __VA_ARGS__)
  281. #define TEGRA_BINARYOPSCALE(type, op, src1, sz1, src2, sz2, dst, sz, w, h, scales) \
  282. ( \
  283. CAROTENE_NS::isSupportedConfiguration() ? \
  284. parallel_for_(Range(0, h), \
  285. TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, src2, sz2, dst, sz, w, h, scales), \
  286. (w * h) / static_cast<double>(1<<16)), \
  287. CV_HAL_ERROR_OK \
  288. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  289. )
  290. TegraBinaryOpScale_Invoker(mul, mul, 1, scale, CAROTENE_NS::CONVERT_POLICY_SATURATE)
  291. TegraBinaryOpScale_Invoker(mulf, mul, 1, scale)
  292. TegraBinaryOpScale_Invoker(div, div, 1, scale, CAROTENE_NS::CONVERT_POLICY_SATURATE)
  293. TegraBinaryOpScale_Invoker(divf, div, 1, scale)
  294. #define TegraUnaryOpScale_Invoker(name, func, scale_cnt, ...) TegraGenOp_Invoker(name, func, 1, 1, scale_cnt, \
  295. RANGE_DATA(ST, src1_data, src1_step), src1_step, \
  296. RANGE_DATA(DT, dst1_data, dst1_step), dst1_step, __VA_ARGS__)
  297. #define TEGRA_UNARYOPSCALE(type, op, src1, sz1, dst, sz, w, h, scales) \
  298. ( \
  299. CAROTENE_NS::isSupportedConfiguration() ? \
  300. parallel_for_(Range(0, h), \
  301. TegraGenOp_##op##_Invoker<const type, type>(src1, sz1, dst, sz, w, h, scales), \
  302. (w * h) / static_cast<double>(1<<16)), \
  303. CV_HAL_ERROR_OK \
  304. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  305. )
  306. TegraUnaryOpScale_Invoker(recip, reciprocal, 1, scale, CAROTENE_NS::CONVERT_POLICY_SATURATE)
  307. TegraUnaryOpScale_Invoker(recipf, reciprocal, 1, scale)
  308. #undef cv_hal_mul8u
  309. #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)
  310. #undef cv_hal_mul8s
  311. #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)
  312. #undef cv_hal_mul16u
  313. #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)
  314. #undef cv_hal_mul16s
  315. #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)
  316. #undef cv_hal_mul32s
  317. #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)
  318. #undef cv_hal_mul32f
  319. #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)
  320. //#undef cv_hal_mul64f
  321. //#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)
  322. #undef cv_hal_div8u
  323. #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)
  324. #undef cv_hal_div8s
  325. #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)
  326. #undef cv_hal_div16u
  327. #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)
  328. #undef cv_hal_div16s
  329. #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)
  330. #undef cv_hal_div32s
  331. #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)
  332. #undef cv_hal_div32f
  333. #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)
  334. //#undef cv_hal_div64f
  335. //#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)
  336. #undef cv_hal_recip8u
  337. #define cv_hal_recip8u(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::u8, recip, src1, sz1, dst, sz, w, h, scales)
  338. #undef cv_hal_recip8s
  339. #define cv_hal_recip8s(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::s8, recip, src1, sz1, dst, sz, w, h, scales)
  340. #undef cv_hal_recip16u
  341. #define cv_hal_recip16u(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::u16, recip, src1, sz1, dst, sz, w, h, scales)
  342. #undef cv_hal_recip16s
  343. #define cv_hal_recip16s(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::s16, recip, src1, sz1, dst, sz, w, h, scales)
  344. #undef cv_hal_recip32s
  345. #define cv_hal_recip32s(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::s32, recip, src1, sz1, dst, sz, w, h, scales)
  346. #undef cv_hal_recip32f
  347. #define cv_hal_recip32f(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::f32, recipf, src1, sz1, dst, sz, w, h, scales)
  348. //#undef cv_hal_recip64f
  349. //#define cv_hal_recip64f(src1, sz1, dst, sz, w, h, scales) TEGRA_UNARYOPSCALE(CAROTENE_NS::f64, recipf, src1, sz1, dst, sz, w, h, scales)
  350. TegraBinaryOpScale_Invoker(addWeighted, addWeighted, 3, scales[0], scales[1], scales[2])
  351. #undef cv_hal_addWeighted8u
  352. #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)
  353. #undef cv_hal_addWeighted8s
  354. #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)
  355. #undef cv_hal_addWeighted16u
  356. #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)
  357. #undef cv_hal_addWeighted16s
  358. #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)
  359. #undef cv_hal_addWeighted32s
  360. #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)
  361. //#undef cv_hal_addWeighted32f
  362. //#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)
  363. //#undef cv_hal_addWeighted64f
  364. //#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)
  365. #else
  366. #define TEGRA_ADD(src1, sz1, src2, sz2, dst, sz, w, h) \
  367. ( \
  368. CAROTENE_NS::isSupportedConfiguration() ? \
  369. CAROTENE_NS::add(CAROTENE_NS::Size2D(w, h), \
  370. src1, sz1, \
  371. src2, sz2, \
  372. dst, sz, \
  373. CAROTENE_NS::CONVERT_POLICY_SATURATE), /*Original addition use saturated operator*/ \
  374. /*so use the same from CAROTENE*/ \
  375. CV_HAL_ERROR_OK \
  376. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  377. )
  378. #define TEGRA_ADDF(src1, sz1, src2, sz2, dst, sz, w, h) \
  379. ( \
  380. CAROTENE_NS::isSupportedConfiguration() ? \
  381. CAROTENE_NS::add(CAROTENE_NS::Size2D(w, h), \
  382. src1, sz1, \
  383. src2, sz2, \
  384. dst, sz), \
  385. CV_HAL_ERROR_OK \
  386. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  387. )
  388. #define TEGRA_SUB(src1, sz1, src2, sz2, dst, sz, w, h) \
  389. ( \
  390. CAROTENE_NS::isSupportedConfiguration() ? \
  391. CAROTENE_NS::sub(CAROTENE_NS::Size2D(w, h), \
  392. src1, sz1, \
  393. src2, sz2, \
  394. dst, sz, \
  395. CAROTENE_NS::CONVERT_POLICY_SATURATE), /*Original addition use saturated operator*/ \
  396. /*so use the same from CAROTENE*/ \
  397. CV_HAL_ERROR_OK \
  398. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  399. )
  400. #define TEGRA_SUBF(src1, sz1, src2, sz2, dst, sz, w, h) \
  401. ( \
  402. CAROTENE_NS::isSupportedConfiguration() ? \
  403. CAROTENE_NS::sub(CAROTENE_NS::Size2D(w, h), \
  404. src1, sz1, \
  405. src2, sz2, \
  406. dst, sz), \
  407. CV_HAL_ERROR_OK \
  408. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  409. )
  410. #define TEGRA_MAX(src1, sz1, src2, sz2, dst, sz, w, h) \
  411. ( \
  412. CAROTENE_NS::isSupportedConfiguration() ? \
  413. CAROTENE_NS::max(CAROTENE_NS::Size2D(w, h), \
  414. src1, sz1, \
  415. src2, sz2, \
  416. dst, sz), \
  417. CV_HAL_ERROR_OK \
  418. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  419. )
  420. #define TEGRA_MIN(src1, sz1, src2, sz2, dst, sz, w, h) \
  421. ( \
  422. CAROTENE_NS::isSupportedConfiguration() ? \
  423. CAROTENE_NS::min(CAROTENE_NS::Size2D(w, h), \
  424. src1, sz1, \
  425. src2, sz2, \
  426. dst, sz), \
  427. CV_HAL_ERROR_OK \
  428. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  429. )
  430. #define TEGRA_ABSDIFF(src1, sz1, src2, sz2, dst, sz, w, h) \
  431. ( \
  432. CAROTENE_NS::isSupportedConfiguration() ? \
  433. CAROTENE_NS::absDiff(CAROTENE_NS::Size2D(w, h), \
  434. src1, sz1, \
  435. src2, sz2, \
  436. dst, sz), \
  437. CV_HAL_ERROR_OK \
  438. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  439. )
  440. #define TEGRA_AND(src1, sz1, src2, sz2, dst, sz, w, h) \
  441. ( \
  442. CAROTENE_NS::isSupportedConfiguration() ? \
  443. CAROTENE_NS::bitwiseAnd(CAROTENE_NS::Size2D(w, h), \
  444. src1, sz1, \
  445. src2, sz2, \
  446. dst, sz), \
  447. CV_HAL_ERROR_OK \
  448. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  449. )
  450. #define TEGRA_OR(src1, sz1, src2, sz2, dst, sz, w, h) \
  451. ( \
  452. CAROTENE_NS::isSupportedConfiguration() ? \
  453. CAROTENE_NS::bitwiseOr(CAROTENE_NS::Size2D(w, h), \
  454. src1, sz1, \
  455. src2, sz2, \
  456. dst, sz), \
  457. CV_HAL_ERROR_OK \
  458. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  459. )
  460. #define TEGRA_XOR(src1, sz1, src2, sz2, dst, sz, w, h) \
  461. ( \
  462. CAROTENE_NS::isSupportedConfiguration() ? \
  463. CAROTENE_NS::bitwiseXor(CAROTENE_NS::Size2D(w, h), \
  464. src1, sz1, \
  465. src2, sz2, \
  466. dst, sz), \
  467. CV_HAL_ERROR_OK \
  468. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  469. )
  470. #define TEGRA_NOT(src1, sz1, dst, sz, w, h) \
  471. ( \
  472. CAROTENE_NS::isSupportedConfiguration() ? \
  473. CAROTENE_NS::bitwiseNot(CAROTENE_NS::Size2D(w, h), \
  474. src1, sz1, \
  475. dst, sz), \
  476. CV_HAL_ERROR_OK \
  477. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  478. )
  479. #undef cv_hal_add8u
  480. #define cv_hal_add8u TEGRA_ADD
  481. #undef cv_hal_add8s
  482. #define cv_hal_add8s TEGRA_ADD
  483. #undef cv_hal_add16u
  484. #define cv_hal_add16u TEGRA_ADD
  485. #undef cv_hal_add16s
  486. #define cv_hal_add16s TEGRA_ADD
  487. #undef cv_hal_add32s
  488. #define cv_hal_add32s TEGRA_ADD
  489. #undef cv_hal_add32f
  490. #define cv_hal_add32f TEGRA_ADDF
  491. //#undef cv_hal_add64f
  492. //#define cv_hal_add64f TEGRA_ADDF
  493. #undef cv_hal_sub8u
  494. #define cv_hal_sub8u TEGRA_SUB
  495. #undef cv_hal_sub8s
  496. #define cv_hal_sub8s TEGRA_SUB
  497. #undef cv_hal_sub16u
  498. #define cv_hal_sub16u TEGRA_SUB
  499. #undef cv_hal_sub16s
  500. #define cv_hal_sub16s TEGRA_SUB
  501. #undef cv_hal_sub32s
  502. #define cv_hal_sub32s TEGRA_SUB
  503. #undef cv_hal_sub32f
  504. #define cv_hal_sub32f TEGRA_SUBF
  505. //#undef cv_hal_sub64f
  506. //#define cv_hal_sub64f TEGRA_SUBF
  507. #undef cv_hal_max8u
  508. #define cv_hal_max8u TEGRA_MAX
  509. #undef cv_hal_max8s
  510. #define cv_hal_max8s TEGRA_MAX
  511. #undef cv_hal_max16u
  512. #define cv_hal_max16u TEGRA_MAX
  513. #undef cv_hal_max16s
  514. #define cv_hal_max16s TEGRA_MAX
  515. #undef cv_hal_max32s
  516. #define cv_hal_max32s TEGRA_MAX
  517. #undef cv_hal_max32f
  518. #define cv_hal_max32f TEGRA_MAX
  519. //#undef cv_hal_max64f
  520. //#define cv_hal_max64f TEGRA_MAX
  521. #undef cv_hal_min8u
  522. #define cv_hal_min8u TEGRA_MIN
  523. #undef cv_hal_min8s
  524. #define cv_hal_min8s TEGRA_MIN
  525. #undef cv_hal_min16u
  526. #define cv_hal_min16u TEGRA_MIN
  527. #undef cv_hal_min16s
  528. #define cv_hal_min16s TEGRA_MIN
  529. #undef cv_hal_min32s
  530. #define cv_hal_min32s TEGRA_MIN
  531. #undef cv_hal_min32f
  532. #define cv_hal_min32f TEGRA_MIN
  533. //#undef cv_hal_min64f
  534. //#define cv_hal_min64f TEGRA_MIN
  535. #undef cv_hal_absdiff8u
  536. #define cv_hal_absdiff8u TEGRA_ABSDIFF
  537. #undef cv_hal_absdiff8s
  538. #define cv_hal_absdiff8s TEGRA_ABSDIFF
  539. #undef cv_hal_absdiff16u
  540. #define cv_hal_absdiff16u TEGRA_ABSDIFF
  541. #undef cv_hal_absdiff16s
  542. #define cv_hal_absdiff16s TEGRA_ABSDIFF
  543. #undef cv_hal_absdiff32s
  544. #define cv_hal_absdiff32s TEGRA_ABSDIFF
  545. #undef cv_hal_absdiff32f
  546. #define cv_hal_absdiff32f TEGRA_ABSDIFF
  547. //#undef cv_hal_absdiff64f
  548. //#define cv_hal_absdiff64f TEGRA_ABSDIFF
  549. #undef cv_hal_and8u
  550. #define cv_hal_and8u TEGRA_AND
  551. #undef cv_hal_or8u
  552. #define cv_hal_or8u TEGRA_OR
  553. #undef cv_hal_xor8u
  554. #define cv_hal_xor8u TEGRA_XOR
  555. #undef cv_hal_not8u
  556. #define cv_hal_not8u TEGRA_NOT
  557. #define TEGRA_CMP(src1, sz1, src2, sz2, dst, sz, w, h, op) \
  558. ( \
  559. CAROTENE_NS::isSupportedConfiguration() ? \
  560. ((op) == cv::CMP_EQ) ? \
  561. CAROTENE_NS::cmpEQ(CAROTENE_NS::Size2D(w, h), \
  562. src1, sz1, \
  563. src2, sz2, \
  564. dst, sz), \
  565. CV_HAL_ERROR_OK : \
  566. ((op) == cv::CMP_NE) ? \
  567. CAROTENE_NS::cmpNE(CAROTENE_NS::Size2D(w, h), \
  568. src1, sz1, \
  569. src2, sz2, \
  570. dst, sz), \
  571. CV_HAL_ERROR_OK : \
  572. ((op) == cv::CMP_GT) ? \
  573. CAROTENE_NS::cmpGT(CAROTENE_NS::Size2D(w, h), \
  574. src1, sz1, \
  575. src2, sz2, \
  576. dst, sz), \
  577. CV_HAL_ERROR_OK : \
  578. ((op) == cv::CMP_GE) ? \
  579. CAROTENE_NS::cmpGE(CAROTENE_NS::Size2D(w, h), \
  580. src1, sz1, \
  581. src2, sz2, \
  582. dst, sz), \
  583. CV_HAL_ERROR_OK : \
  584. ((op) == cv::CMP_LT) ? \
  585. CAROTENE_NS::cmpGT(CAROTENE_NS::Size2D(w, h), \
  586. src2, sz2, \
  587. src1, sz1, \
  588. dst, sz), \
  589. CV_HAL_ERROR_OK : \
  590. ((op) == cv::CMP_LE) ? \
  591. CAROTENE_NS::cmpGE(CAROTENE_NS::Size2D(w, h), \
  592. src2, sz2, \
  593. src1, sz1, \
  594. dst, sz), \
  595. CV_HAL_ERROR_OK : \
  596. CV_HAL_ERROR_NOT_IMPLEMENTED \
  597. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  598. )
  599. #undef cv_hal_cmp8u
  600. #define cv_hal_cmp8u TEGRA_CMP
  601. #undef cv_hal_cmp8s
  602. #define cv_hal_cmp8s TEGRA_CMP
  603. #undef cv_hal_cmp16u
  604. #define cv_hal_cmp16u TEGRA_CMP
  605. #undef cv_hal_cmp16s
  606. #define cv_hal_cmp16s TEGRA_CMP
  607. #undef cv_hal_cmp32s
  608. #define cv_hal_cmp32s TEGRA_CMP
  609. #undef cv_hal_cmp32f
  610. #define cv_hal_cmp32f TEGRA_CMP
  611. //#undef cv_hal_cmp64f
  612. //#define cv_hal_cmp64f TEGRA_CMP
  613. #define TEGRA_MUL(src1, sz1, src2, sz2, dst, sz, w, h, scale) \
  614. ( \
  615. CAROTENE_NS::isSupportedConfiguration() ? \
  616. CAROTENE_NS::mul(CAROTENE_NS::Size2D(w, h), \
  617. src1, sz1, \
  618. src2, sz2, \
  619. dst, sz, \
  620. scale, \
  621. CAROTENE_NS::CONVERT_POLICY_SATURATE), \
  622. CV_HAL_ERROR_OK \
  623. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  624. )
  625. #define TEGRA_MULF(src1, sz1, src2, sz2, dst, sz, w, h, scale) \
  626. ( \
  627. CAROTENE_NS::isSupportedConfiguration() ? \
  628. CAROTENE_NS::mul(CAROTENE_NS::Size2D(w, h), \
  629. src1, sz1, \
  630. src2, sz2, \
  631. dst, sz, \
  632. (float)scale), \
  633. CV_HAL_ERROR_OK \
  634. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  635. )
  636. #define TEGRA_DIV(src1, sz1, src2, sz2, dst, sz, w, h, scale) \
  637. ( \
  638. CAROTENE_NS::isSupportedConfiguration() ? \
  639. CAROTENE_NS::div(CAROTENE_NS::Size2D(w, h), \
  640. src1, sz1, \
  641. src2, sz2, \
  642. dst, sz, \
  643. scale, \
  644. CAROTENE_NS::CONVERT_POLICY_SATURATE), \
  645. CV_HAL_ERROR_OK \
  646. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  647. )
  648. #define TEGRA_DIVF(src1, sz1, src2, sz2, dst, sz, w, h, scale) \
  649. ( \
  650. CAROTENE_NS::isSupportedConfiguration() ? \
  651. CAROTENE_NS::div(CAROTENE_NS::Size2D(w, h), \
  652. src1, sz1, \
  653. src2, sz2, \
  654. dst, sz, \
  655. (float)scale), \
  656. CV_HAL_ERROR_OK \
  657. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  658. )
  659. #define TEGRA_RECIP(src2, sz2, dst, sz, w, h, scale) \
  660. ( \
  661. CAROTENE_NS::isSupportedConfiguration() ? \
  662. CAROTENE_NS::reciprocal(CAROTENE_NS::Size2D(w, h), \
  663. src2, sz2, \
  664. dst, sz, \
  665. scale, \
  666. CAROTENE_NS::CONVERT_POLICY_SATURATE), \
  667. CV_HAL_ERROR_OK \
  668. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  669. )
  670. #define TEGRA_RECIPF(src2, sz2, dst, sz, w, h, scale) \
  671. ( \
  672. CAROTENE_NS::isSupportedConfiguration() ? \
  673. CAROTENE_NS::reciprocal(CAROTENE_NS::Size2D(w, h), \
  674. src2, sz2, \
  675. dst, sz, \
  676. (float)scale), \
  677. CV_HAL_ERROR_OK \
  678. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  679. )
  680. #undef cv_hal_mul8u
  681. #define cv_hal_mul8u TEGRA_MUL
  682. #undef cv_hal_mul8s
  683. #define cv_hal_mul8s TEGRA_MUL
  684. #undef cv_hal_mul16u
  685. #define cv_hal_mul16u TEGRA_MUL
  686. #undef cv_hal_mul16s
  687. #define cv_hal_mul16s TEGRA_MUL
  688. #undef cv_hal_mul32s
  689. #define cv_hal_mul32s TEGRA_MUL
  690. #undef cv_hal_mul32f
  691. #define cv_hal_mul32f TEGRA_MULF
  692. //#undef cv_hal_mul64f
  693. //#define cv_hal_mul64f TEGRA_MULF
  694. #undef cv_hal_div8u
  695. #define cv_hal_div8u TEGRA_DIV
  696. #undef cv_hal_div8s
  697. #define cv_hal_div8s TEGRA_DIV
  698. #undef cv_hal_div16u
  699. #define cv_hal_div16u TEGRA_DIV
  700. #undef cv_hal_div16s
  701. #define cv_hal_div16s TEGRA_DIV
  702. #undef cv_hal_div32s
  703. #define cv_hal_div32s TEGRA_DIV
  704. #undef cv_hal_div32f
  705. #define cv_hal_div32f TEGRA_DIVF
  706. //#undef cv_hal_div64f
  707. //#define cv_hal_div64f TEGRA_DIVF
  708. #undef cv_hal_recip8u
  709. #define cv_hal_recip8u TEGRA_RECIP
  710. #undef cv_hal_recip8s
  711. #define cv_hal_recip8s TEGRA_RECIP
  712. #undef cv_hal_recip16u
  713. #define cv_hal_recip16u TEGRA_RECIP
  714. #undef cv_hal_recip16s
  715. #define cv_hal_recip16s TEGRA_RECIP
  716. #undef cv_hal_recip32s
  717. #define cv_hal_recip32s TEGRA_RECIP
  718. #undef cv_hal_recip32f
  719. #define cv_hal_recip32f TEGRA_RECIPF
  720. //#undef cv_hal_recip64f
  721. //#define cv_hal_recip64f TEGRA_RECIPF
  722. #define TEGRA_ADDWEIGHTED(src1, sz1, src2, sz2, dst, sz, w, h, scales) \
  723. ( \
  724. CAROTENE_NS::isSupportedConfiguration() ? \
  725. CAROTENE_NS::addWeighted(CAROTENE_NS::Size2D(w, h), \
  726. src1, sz1, \
  727. src2, sz2, \
  728. dst, sz, \
  729. ((double *)scales)[0], ((double *)scales)[1], ((double *)scales)[2]), \
  730. CV_HAL_ERROR_OK \
  731. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  732. )
  733. #undef cv_hal_addWeighted8u
  734. #define cv_hal_addWeighted8u TEGRA_ADDWEIGHTED
  735. #undef cv_hal_addWeighted8s
  736. #define cv_hal_addWeighted8s TEGRA_ADDWEIGHTED
  737. #undef cv_hal_addWeighted16u
  738. #define cv_hal_addWeighted16u TEGRA_ADDWEIGHTED
  739. #undef cv_hal_addWeighted16s
  740. #define cv_hal_addWeighted16s TEGRA_ADDWEIGHTED
  741. #undef cv_hal_addWeighted32s
  742. #define cv_hal_addWeighted32s TEGRA_ADDWEIGHTED
  743. //#undef cv_hal_addWeighted32f
  744. //#define cv_hal_addWeighted32f TEGRA_ADDWEIGHTED
  745. //#undef cv_hal_addWeighted64f
  746. //#define cv_hal_addWeighted64f TEGRA_ADDWEIGHTED
  747. #endif //PARALLEL_CORE
  748. #define ROW_SRC_ARG1 const ST * src1_data_
  749. #define ROW_SRC_STORE1 , src1_data(src1_data_)
  750. #define ROW_SRC_VAR1 const ST * src1_data;
  751. #define ROW_SRC_ARG2 ROW_SRC_ARG1 \
  752. , const ST * src2_data_
  753. #define ROW_SRC_STORE2 ROW_SRC_STORE1 \
  754. , src2_data(src2_data_)
  755. #define ROW_SRC_VAR2 ROW_SRC_VAR1 \
  756. const ST * src2_data;
  757. #define ROW_SRC_ARG3 ROW_SRC_ARG2 \
  758. , const ST * src3_data_
  759. #define ROW_SRC_STORE3 ROW_SRC_STORE2 \
  760. , src3_data(src3_data_)
  761. #define ROW_SRC_VAR3 ROW_SRC_VAR2 \
  762. const ST * src3_data;
  763. #define ROW_SRC_ARG4 ROW_SRC_ARG3 \
  764. , const ST * src4_data_
  765. #define ROW_SRC_STORE4 ROW_SRC_STORE3 \
  766. , src4_data(src4_data_)
  767. #define ROW_SRC_VAR4 ROW_SRC_VAR3 \
  768. const ST * src4_data;
  769. #define ROW_DST_ARG1 , DT * dst1_data_
  770. #define ROW_DST_STORE1 , dst1_data(dst1_data_)
  771. #define ROW_DST_VAR1 DT * dst1_data;
  772. #define ROW_DST_ARG2 ROW_DST_ARG1 \
  773. , DT * dst2_data_
  774. #define ROW_DST_STORE2 ROW_DST_STORE1 \
  775. , dst2_data(dst2_data_)
  776. #define ROW_DST_VAR2 ROW_DST_VAR1 \
  777. DT * dst2_data;
  778. #define ROW_DST_ARG3 ROW_DST_ARG2 \
  779. , DT * dst3_data_
  780. #define ROW_DST_STORE3 ROW_DST_STORE2 \
  781. , dst3_data(dst3_data_)
  782. #define ROW_DST_VAR3 ROW_DST_VAR2 \
  783. DT * dst3_data;
  784. #define ROW_DST_ARG4 ROW_DST_ARG3 \
  785. , DT * dst4_data_
  786. #define ROW_DST_STORE4 ROW_DST_STORE3 \
  787. , dst4_data(dst4_data_)
  788. #define ROW_DST_VAR4 ROW_DST_VAR3 \
  789. DT * dst4_data;
  790. #define ROW_VAL_ARG0
  791. #define ROW_VAL_STORE0
  792. #define ROW_VAL_VAR0
  793. #define ROW_VAL_ARG1 , double val_
  794. #define ROW_VAL_STORE1 , val(val_)
  795. #define ROW_VAL_VAR1 double val;
  796. #define TegraRowOp_Invoker(name, func, src_cnt, dst_cnt, val_cnt, ...) \
  797. template <typename ST, typename DT> \
  798. class TegraRowOp_##name##_Invoker : public cv::ParallelLoopBody \
  799. { \
  800. public: \
  801. TegraRowOp_##name##_Invoker(ROW_SRC_ARG##src_cnt \
  802. ROW_DST_ARG##dst_cnt \
  803. ROW_VAL_ARG##val_cnt) : \
  804. cv::ParallelLoopBody() ROW_SRC_STORE##src_cnt \
  805. ROW_DST_STORE##dst_cnt \
  806. ROW_VAL_STORE##val_cnt {} \
  807. virtual void operator()(const cv::Range& range) const \
  808. { \
  809. CAROTENE_NS::func(CAROTENE_NS::Size2D(range.end-range.start, 1), __VA_ARGS__); \
  810. } \
  811. private: \
  812. ROW_SRC_VAR##src_cnt \
  813. ROW_DST_VAR##dst_cnt \
  814. ROW_VAL_VAR##val_cnt \
  815. const TegraRowOp_##name##_Invoker& operator= (const TegraRowOp_##name##_Invoker&); \
  816. };
  817. #define TEGRA_SPLIT(src, dst, len, cn) \
  818. ( \
  819. CAROTENE_NS::isSupportedConfiguration() ? \
  820. cn == 2 ? \
  821. CAROTENE_NS::split2(CAROTENE_NS::Size2D(len, 1), \
  822. src, len, \
  823. dst[0], len, \
  824. dst[1], len), \
  825. CV_HAL_ERROR_OK : \
  826. cn == 3 ? \
  827. CAROTENE_NS::split3(CAROTENE_NS::Size2D(len, 1), \
  828. src, len, \
  829. dst[0], len, \
  830. dst[1], len, \
  831. dst[2], len), \
  832. CV_HAL_ERROR_OK : \
  833. cn == 4 ? \
  834. CAROTENE_NS::split4(CAROTENE_NS::Size2D(len, 1), \
  835. src, len, \
  836. dst[0], len, \
  837. dst[1], len, \
  838. dst[2], len, \
  839. dst[3], len), \
  840. CV_HAL_ERROR_OK : \
  841. CV_HAL_ERROR_NOT_IMPLEMENTED \
  842. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  843. )
  844. TegraRowOp_Invoker(split2, split2, 1, 2, 0, RANGE_DATA(ST, src1_data, 2*sizeof(ST)), range.end-range.start,
  845. RANGE_DATA(DT, dst1_data, sizeof(DT)), range.end-range.start,
  846. RANGE_DATA(DT, dst2_data, sizeof(DT)), range.end-range.start)
  847. TegraRowOp_Invoker(split3, split3, 1, 3, 0, RANGE_DATA(ST, src1_data, 3*sizeof(ST)), range.end-range.start,
  848. RANGE_DATA(DT, dst1_data, sizeof(DT)), range.end-range.start,
  849. RANGE_DATA(DT, dst2_data, sizeof(DT)), range.end-range.start,
  850. RANGE_DATA(DT, dst3_data, sizeof(DT)), range.end-range.start)
  851. TegraRowOp_Invoker(split4, split4, 1, 4, 0, RANGE_DATA(ST, src1_data, 4*sizeof(ST)), range.end-range.start,
  852. RANGE_DATA(DT, dst1_data, sizeof(DT)), range.end-range.start,
  853. RANGE_DATA(DT, dst2_data, sizeof(DT)), range.end-range.start,
  854. RANGE_DATA(DT, dst3_data, sizeof(DT)), range.end-range.start,
  855. RANGE_DATA(DT, dst4_data, sizeof(DT)), range.end-range.start)
  856. #define TEGRA_SPLIT64S(type, src, dst, len, cn) \
  857. ( \
  858. CAROTENE_NS::isSupportedConfiguration() ? \
  859. cn == 2 ? \
  860. parallel_for_(Range(0, len), \
  861. TegraRowOp_split2_Invoker<const type, type>(src, dst[0], dst[1]), \
  862. (len) / static_cast<double>(1<<16)), \
  863. CV_HAL_ERROR_OK : \
  864. cn == 3 ? \
  865. parallel_for_(Range(0, len), \
  866. TegraRowOp_split3_Invoker<const type, type>(src, dst[0], dst[1], dst[2]), \
  867. (len) / static_cast<double>(1<<16)), \
  868. CV_HAL_ERROR_OK : \
  869. cn == 4 ? \
  870. parallel_for_(Range(0, len), \
  871. TegraRowOp_split4_Invoker<const type, type>(src, dst[0], dst[1], dst[2], dst[3]), \
  872. (len) / static_cast<double>(1<<16)), \
  873. CV_HAL_ERROR_OK : \
  874. CV_HAL_ERROR_NOT_IMPLEMENTED \
  875. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  876. )
  877. #define TEGRA_MERGE(src, dst, len, cn) \
  878. ( \
  879. CAROTENE_NS::isSupportedConfiguration() ? \
  880. cn == 2 ? \
  881. CAROTENE_NS::combine2(CAROTENE_NS::Size2D(len, 1), \
  882. src[0], len, \
  883. src[1], len, \
  884. dst, len), \
  885. CV_HAL_ERROR_OK : \
  886. cn == 3 ? \
  887. CAROTENE_NS::combine3(CAROTENE_NS::Size2D(len, 1), \
  888. src[0], len, \
  889. src[1], len, \
  890. src[2], len, \
  891. dst, len), \
  892. CV_HAL_ERROR_OK : \
  893. cn == 4 ? \
  894. CAROTENE_NS::combine4(CAROTENE_NS::Size2D(len, 1), \
  895. src[0], len, \
  896. src[1], len, \
  897. src[2], len, \
  898. src[3], len, \
  899. dst, len), \
  900. CV_HAL_ERROR_OK : \
  901. CV_HAL_ERROR_NOT_IMPLEMENTED \
  902. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  903. )
  904. TegraRowOp_Invoker(combine2, combine2, 2, 1, 0, RANGE_DATA(ST, src1_data, sizeof(ST)), range.end-range.start,
  905. RANGE_DATA(ST, src2_data, sizeof(ST)), range.end-range.start,
  906. RANGE_DATA(DT, dst1_data, 2*sizeof(DT)), range.end-range.start)
  907. TegraRowOp_Invoker(combine3, combine3, 3, 1, 0, RANGE_DATA(ST, src1_data, sizeof(ST)), range.end-range.start,
  908. RANGE_DATA(ST, src2_data, sizeof(ST)), range.end-range.start,
  909. RANGE_DATA(ST, src3_data, sizeof(ST)), range.end-range.start,
  910. RANGE_DATA(DT, dst1_data, 3*sizeof(DT)), range.end-range.start)
  911. TegraRowOp_Invoker(combine4, combine4, 4, 1, 0, RANGE_DATA(ST, src1_data, sizeof(ST)), range.end-range.start,
  912. RANGE_DATA(ST, src2_data, sizeof(ST)), range.end-range.start,
  913. RANGE_DATA(ST, src3_data, sizeof(ST)), range.end-range.start,
  914. RANGE_DATA(ST, src4_data, sizeof(ST)), range.end-range.start,
  915. RANGE_DATA(DT, dst1_data, 4*sizeof(DT)), range.end-range.start)
  916. #define TEGRA_MERGE64S(type, src, dst, len, cn) \
  917. ( \
  918. CAROTENE_NS::isSupportedConfiguration() ? \
  919. cn == 2 ? \
  920. parallel_for_(Range(0, len), \
  921. TegraRowOp_combine2_Invoker<const type, type>(src[0], src[1], dst), \
  922. (len) / static_cast<double>(1<<16)), \
  923. CV_HAL_ERROR_OK : \
  924. cn == 3 ? \
  925. parallel_for_(Range(0, len), \
  926. TegraRowOp_combine3_Invoker<const type, type>(src[0], src[1], src[2], dst), \
  927. (len) / static_cast<double>(1<<16)), \
  928. CV_HAL_ERROR_OK : \
  929. cn == 4 ? \
  930. parallel_for_(Range(0, len), \
  931. TegraRowOp_combine4_Invoker<const type, type>(src[0], src[1], src[2], src[3], dst), \
  932. (len) / static_cast<double>(1<<16)), \
  933. CV_HAL_ERROR_OK : \
  934. CV_HAL_ERROR_NOT_IMPLEMENTED \
  935. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  936. )
  937. #undef cv_hal_split8u
  938. #define cv_hal_split8u TEGRA_SPLIT
  939. #undef cv_hal_split16u
  940. #define cv_hal_split16u TEGRA_SPLIT
  941. #undef cv_hal_split32s
  942. #define cv_hal_split32s TEGRA_SPLIT
  943. #undef cv_hal_split64s
  944. #define cv_hal_split64s(src, dst, len, cn) TEGRA_SPLIT64S(CAROTENE_NS::s64, src, dst, len, cn)
  945. #undef cv_hal_merge8u
  946. #define cv_hal_merge8u TEGRA_MERGE
  947. #undef cv_hal_merge16u
  948. #define cv_hal_merge16u TEGRA_MERGE
  949. #undef cv_hal_merge32s
  950. #define cv_hal_merge32s TEGRA_MERGE
  951. #undef cv_hal_merge64s
  952. #define cv_hal_merge64s(src, dst, len, cn) TEGRA_MERGE64S(CAROTENE_NS::s64, src, dst, len, cn)
  953. TegraRowOp_Invoker(phase, phase, 2, 1, 1, RANGE_DATA(ST, src1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,
  954. RANGE_DATA(ST, src2_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,
  955. RANGE_DATA(DT, dst1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start, val)
  956. #define TEGRA_FASTATAN(y, x, dst, len, angleInDegrees) \
  957. ( \
  958. CAROTENE_NS::isSupportedConfiguration() ? \
  959. parallel_for_(Range(0, len), \
  960. TegraRowOp_phase_Invoker<const CAROTENE_NS::f32, CAROTENE_NS::f32>(x, y, dst, angleInDegrees ? 1.0f : M_PI/180), \
  961. (len) / static_cast<double>(1<<16)), \
  962. CV_HAL_ERROR_OK \
  963. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  964. )
  965. #undef cv_hal_fastAtan32f
  966. #define cv_hal_fastAtan32f TEGRA_FASTATAN
  967. TegraRowOp_Invoker(magnitude, magnitude, 2, 1, 0, RANGE_DATA(ST, src1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,
  968. RANGE_DATA(ST, src2_data, sizeof(CAROTENE_NS::f32)), range.end-range.start,
  969. RANGE_DATA(DT, dst1_data, sizeof(CAROTENE_NS::f32)), range.end-range.start)
  970. #define TEGRA_MAGNITUDE(x, y, dst, len) \
  971. ( \
  972. CAROTENE_NS::isSupportedConfiguration() ? \
  973. parallel_for_(Range(0, len), \
  974. TegraRowOp_magnitude_Invoker<const CAROTENE_NS::f32, CAROTENE_NS::f32>(x, y, dst), \
  975. (len) / static_cast<double>(1<<16)), \
  976. CV_HAL_ERROR_OK \
  977. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  978. )
  979. #undef cv_hal_magnitude32f
  980. #define cv_hal_magnitude32f TEGRA_MAGNITUDE
  981. #if defined OPENCV_IMGPROC_HAL_INTERFACE_H
  982. struct cvhalFilter2D;
  983. struct FilterCtx
  984. {
  985. CAROTENE_NS::Size2D ksize;
  986. CAROTENE_NS::s16* kernel_data;
  987. CAROTENE_NS::BORDER_MODE border;
  988. };
  989. inline int TEGRA_FILTERINIT(cvhalFilter2D **context, uchar *kernel_data, size_t kernel_step, int kernel_type, int kernel_width, int kernel_height,
  990. int 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)
  991. {
  992. if(!context || !kernel_data || allowSubmatrix || allowInplace ||
  993. src_type != CV_8UC1 || dst_type != CV_8UC1 ||
  994. delta != 0 || anchor_x != kernel_width / 2 || anchor_y != kernel_height / 2 )
  995. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  996. FilterCtx* ctx = new FilterCtx;
  997. if(!ctx)
  998. return CV_HAL_ERROR_UNKNOWN;
  999. ctx->ksize.width = kernel_width;
  1000. ctx->ksize.height = kernel_height;
  1001. switch(borderType)
  1002. {
  1003. case CV_HAL_BORDER_CONSTANT:
  1004. ctx->border = CAROTENE_NS::BORDER_MODE_CONSTANT;
  1005. break;
  1006. case CV_HAL_BORDER_REPLICATE:
  1007. ctx->border = CAROTENE_NS::BORDER_MODE_REPLICATE;
  1008. break;
  1009. case CV_HAL_BORDER_REFLECT:
  1010. ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT;
  1011. break;
  1012. case CV_HAL_BORDER_WRAP:
  1013. ctx->border = CAROTENE_NS::BORDER_MODE_WRAP;
  1014. break;
  1015. case CV_HAL_BORDER_REFLECT_101:
  1016. ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT101;
  1017. break;
  1018. default:
  1019. delete ctx;
  1020. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1021. }
  1022. if(!CAROTENE_NS::isConvolutionSupported(CAROTENE_NS::Size2D(max_width, max_height), ctx->ksize, ctx->border))
  1023. {
  1024. delete ctx;
  1025. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1026. }
  1027. ctx->kernel_data = new CAROTENE_NS::s16[kernel_width*kernel_height];
  1028. if(!ctx->kernel_data)
  1029. return CV_HAL_ERROR_UNKNOWN;
  1030. switch(kernel_type)
  1031. {
  1032. case CV_8UC1:
  1033. convert(ctx->ksize, (CAROTENE_NS::u8*)kernel_data, kernel_step, ctx->kernel_data, kernel_width);
  1034. break;
  1035. case CV_8SC1:
  1036. convert(ctx->ksize, (CAROTENE_NS::s8*)kernel_data, kernel_step, ctx->kernel_data, kernel_width);
  1037. break;
  1038. case CV_16UC1:
  1039. for(int j = 0; j < kernel_height; ++j)
  1040. {
  1041. std::memcpy(ctx->kernel_data + kernel_width * j, kernel_data + kernel_step * j, kernel_width * sizeof(int16_t));
  1042. }
  1043. break;
  1044. default:
  1045. delete[] ctx->kernel_data;
  1046. delete ctx;
  1047. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1048. }
  1049. *context = (cvhalFilter2D*)(ctx);
  1050. return CV_HAL_ERROR_OK;
  1051. }
  1052. inline int TEGRA_FILTERFREE(cvhalFilter2D *context)
  1053. {
  1054. if(context)
  1055. {
  1056. if(((FilterCtx*)context)->kernel_data)
  1057. delete[] ((FilterCtx*)context)->kernel_data;
  1058. delete (FilterCtx*)context;
  1059. return CV_HAL_ERROR_OK;
  1060. }
  1061. else
  1062. {
  1063. return CV_HAL_ERROR_UNKNOWN;
  1064. }
  1065. }
  1066. #define TEGRA_FILTERIMPL(context, src_data, src_step, dst_data, dst_step, width, height, full_width, full_height, offset_x, offset_y) \
  1067. ( \
  1068. (void)full_width, (void)full_height, (void)offset_x, (void)offset_y, \
  1069. context && CAROTENE_NS::isConvolutionSupported(CAROTENE_NS::Size2D(width, height), ((FilterCtx*)context)->ksize, ((FilterCtx*)context)->border) ? \
  1070. CAROTENE_NS::convolution(CAROTENE_NS::Size2D(width, height), \
  1071. src_data, src_step, \
  1072. dst_data, dst_step, \
  1073. ((FilterCtx*)context)->border, 0, \
  1074. ((FilterCtx*)context)->ksize, ((FilterCtx*)context)->kernel_data, 1), \
  1075. CV_HAL_ERROR_OK \
  1076. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1077. )
  1078. #undef cv_hal_filterInit
  1079. #define cv_hal_filterInit TEGRA_FILTERINIT
  1080. #undef cv_hal_filter
  1081. #define cv_hal_filter TEGRA_FILTERIMPL
  1082. #undef cv_hal_filterFree
  1083. #define cv_hal_filterFree TEGRA_FILTERFREE
  1084. struct SepFilterCtx
  1085. {
  1086. int16_t kernelx_data[3];
  1087. int16_t kernely_data[3];
  1088. CAROTENE_NS::BORDER_MODE border;
  1089. };
  1090. inline int TEGRA_SEPFILTERINIT(cvhalFilter2D **context, int src_type, int dst_type, int kernel_type,
  1091. uchar *kernelx_data, int kernelx_length,
  1092. uchar *kernely_data, int kernely_length,
  1093. int anchor_x, int anchor_y, double delta, int borderType)
  1094. {
  1095. if(!context || !kernelx_data || !kernely_data || src_type != CV_8UC1 || dst_type != CV_16SC1 ||
  1096. kernelx_length != 3 || kernely_length != 3 ||
  1097. delta != 0 || anchor_x != 1 || anchor_y != 1)
  1098. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1099. SepFilterCtx* ctx = new SepFilterCtx;
  1100. if(!ctx)
  1101. return CV_HAL_ERROR_UNKNOWN;
  1102. switch(borderType)
  1103. {
  1104. case CV_HAL_BORDER_CONSTANT:
  1105. ctx->border = CAROTENE_NS::BORDER_MODE_CONSTANT;
  1106. break;
  1107. case CV_HAL_BORDER_REPLICATE:
  1108. ctx->border = CAROTENE_NS::BORDER_MODE_REPLICATE;
  1109. break;
  1110. case CV_HAL_BORDER_REFLECT:
  1111. ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT;
  1112. break;
  1113. case CV_HAL_BORDER_WRAP:
  1114. ctx->border = CAROTENE_NS::BORDER_MODE_WRAP;
  1115. break;
  1116. case CV_HAL_BORDER_REFLECT_101:
  1117. ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT101;
  1118. break;
  1119. default:
  1120. delete ctx;
  1121. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1122. }
  1123. if(!CAROTENE_NS::isSeparableFilter3x3Supported(CAROTENE_NS::Size2D(16, 16), ctx->border, 3, 3))
  1124. {
  1125. delete ctx;
  1126. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1127. }
  1128. switch(kernel_type)
  1129. {
  1130. case CV_8UC1:
  1131. ctx->kernelx_data[0]=kernelx_data[0];
  1132. ctx->kernelx_data[1]=kernelx_data[1];
  1133. ctx->kernelx_data[2]=kernelx_data[2];
  1134. ctx->kernely_data[0]=kernely_data[0];
  1135. ctx->kernely_data[1]=kernely_data[1];
  1136. ctx->kernely_data[2]=kernely_data[2];
  1137. break;
  1138. case CV_8SC1:
  1139. ctx->kernelx_data[0]=((char*)kernelx_data)[0];
  1140. ctx->kernelx_data[1]=((char*)kernelx_data)[1];
  1141. ctx->kernelx_data[2]=((char*)kernelx_data)[2];
  1142. ctx->kernely_data[0]=((char*)kernely_data)[0];
  1143. ctx->kernely_data[1]=((char*)kernely_data)[1];
  1144. ctx->kernely_data[2]=((char*)kernely_data)[2];
  1145. break;
  1146. case CV_16UC1:
  1147. ctx->kernelx_data[0]=((int16_t*)kernelx_data)[0];
  1148. ctx->kernelx_data[1]=((int16_t*)kernelx_data)[1];
  1149. ctx->kernelx_data[2]=((int16_t*)kernelx_data)[2];
  1150. ctx->kernely_data[0]=((int16_t*)kernely_data)[0];
  1151. ctx->kernely_data[1]=((int16_t*)kernely_data)[1];
  1152. ctx->kernely_data[2]=((int16_t*)kernely_data)[2];
  1153. break;
  1154. default:
  1155. delete ctx;
  1156. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1157. }
  1158. *context = (cvhalFilter2D*)(ctx);
  1159. return CV_HAL_ERROR_OK;
  1160. }
  1161. inline int TEGRA_SEPFILTERFREE(cvhalFilter2D *context)
  1162. {
  1163. if(context)
  1164. {
  1165. delete (SepFilterCtx*)context;
  1166. return CV_HAL_ERROR_OK;
  1167. }
  1168. else
  1169. {
  1170. return CV_HAL_ERROR_UNKNOWN;
  1171. }
  1172. }
  1173. #define TEGRA_SEPFILTERIMPL(context, src_data, src_step, dst_data, dst_step, width, height, full_width, full_height, offset_x, offset_y) \
  1174. ( \
  1175. context && CAROTENE_NS::isSeparableFilter3x3Supported(CAROTENE_NS::Size2D(width, height), ((SepFilterCtx*)context)->border, 3, 3, \
  1176. CAROTENE_NS::Margin(offset_x, full_width - width - offset_x, offset_y, full_height - height - offset_y)) ? \
  1177. CAROTENE_NS::SeparableFilter3x3(CAROTENE_NS::Size2D(width, height), \
  1178. src_data, src_step, \
  1179. (CAROTENE_NS::s16*)dst_data, dst_step, \
  1180. 3, 3, ((SepFilterCtx*)context)->kernelx_data, ((SepFilterCtx*)context)->kernely_data, \
  1181. ((SepFilterCtx*)context)->border, 0, \
  1182. CAROTENE_NS::Margin(offset_x, full_width - width - offset_x, offset_y, full_height - height - offset_y)), \
  1183. CV_HAL_ERROR_OK \
  1184. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1185. )
  1186. #undef cv_hal_sepFilterInit
  1187. #define cv_hal_sepFilterInit TEGRA_SEPFILTERINIT
  1188. #undef cv_hal_sepFilter
  1189. #define cv_hal_sepFilter TEGRA_SEPFILTERIMPL
  1190. #undef cv_hal_sepFilterFree
  1191. #define cv_hal_sepFilterFree TEGRA_SEPFILTERFREE
  1192. struct MorphCtx
  1193. {
  1194. int operation;
  1195. int channels;
  1196. CAROTENE_NS::Size2D ksize;
  1197. int anchor_x, anchor_y;
  1198. CAROTENE_NS::BORDER_MODE border;
  1199. uchar borderValues[4];
  1200. };
  1201. inline int TEGRA_MORPHINIT(cvhalFilter2D **context, int operation, int src_type, int dst_type, int, int,
  1202. int kernel_type, uchar *kernel_data, size_t kernel_step, int kernel_width, int kernel_height, int anchor_x, int anchor_y,
  1203. int borderType, const double borderValue[4], int iterations, bool allowSubmatrix, bool allowInplace)
  1204. {
  1205. if(!context || !kernel_data || src_type != dst_type ||
  1206. CV_MAT_DEPTH(src_type) != CV_8U || src_type < 0 || (src_type >> CV_CN_SHIFT) > 3 ||
  1207. allowSubmatrix || allowInplace || iterations != 1 ||
  1208. !CAROTENE_NS::isSupportedConfiguration())
  1209. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1210. switch(CV_MAT_DEPTH(kernel_type))
  1211. {
  1212. case CV_8U:
  1213. if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), kernel_data, kernel_step) != kernel_width * kernel_height)
  1214. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1215. break;
  1216. case CV_16U:
  1217. if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (uint16_t*)kernel_data, kernel_step) != kernel_width * kernel_height)
  1218. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1219. break;
  1220. case CV_32S:
  1221. if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (int32_t*)kernel_data, kernel_step) != kernel_width * kernel_height)
  1222. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1223. break;
  1224. case CV_32F:
  1225. if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (float*)kernel_data, kernel_step) != kernel_width * kernel_height)
  1226. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1227. break;
  1228. case CV_64F:
  1229. if(CAROTENE_NS::countNonZero(CAROTENE_NS::Size2D(kernel_width, kernel_height), (double*)kernel_data, kernel_step) != kernel_width * kernel_height)
  1230. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1231. break;
  1232. default:
  1233. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1234. }
  1235. MorphCtx* ctx = new MorphCtx;
  1236. if(!ctx)
  1237. return CV_HAL_ERROR_UNKNOWN;
  1238. ctx->channels = (src_type >> CV_CN_SHIFT) + 1;
  1239. ctx->ksize.width = kernel_width;
  1240. ctx->ksize.height = kernel_height;
  1241. ctx->anchor_x = anchor_x;
  1242. ctx->anchor_y = anchor_y;
  1243. switch(operation)
  1244. {
  1245. case CV_HAL_MORPH_ERODE:
  1246. case CV_HAL_MORPH_DILATE:
  1247. ctx->operation = operation;
  1248. break;
  1249. default:
  1250. delete ctx;
  1251. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1252. }
  1253. switch(borderType)
  1254. {
  1255. case CV_HAL_BORDER_CONSTANT:
  1256. ctx->border = CAROTENE_NS::BORDER_MODE_CONSTANT;
  1257. if( borderValue[0] == DBL_MAX && borderValue[1] == DBL_MAX && borderValue[2] == DBL_MAX && borderValue[3] == DBL_MAX )
  1258. {
  1259. if( operation == CV_HAL_MORPH_ERODE )
  1260. for(int i = 0; i < ctx->channels; ++i)
  1261. ctx->borderValues[i] = (CAROTENE_NS::u8)UCHAR_MAX;
  1262. else
  1263. for(int i = 0; i < ctx->channels; ++i)
  1264. ctx->borderValues[i] = 0;
  1265. }
  1266. else
  1267. {
  1268. for(int i = 0; i < ctx->channels; ++i)
  1269. ctx->borderValues[i] = (CAROTENE_NS::u8)cv::saturate_cast<uchar>(borderValue[i]);
  1270. }
  1271. break;
  1272. case CV_HAL_BORDER_REPLICATE:
  1273. ctx->border = CAROTENE_NS::BORDER_MODE_REPLICATE;
  1274. break;
  1275. case CV_HAL_BORDER_REFLECT:
  1276. ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT;
  1277. break;
  1278. case CV_HAL_BORDER_WRAP:
  1279. ctx->border = CAROTENE_NS::BORDER_MODE_WRAP;
  1280. break;
  1281. case CV_HAL_BORDER_REFLECT_101:
  1282. ctx->border = CAROTENE_NS::BORDER_MODE_REFLECT101;
  1283. break;
  1284. default:
  1285. delete ctx;
  1286. return CV_HAL_ERROR_NOT_IMPLEMENTED;
  1287. }
  1288. *context = (cvhalFilter2D*)(ctx);
  1289. return CV_HAL_ERROR_OK;
  1290. }
  1291. inline int TEGRA_MORPHFREE(cvhalFilter2D *context)
  1292. {
  1293. if(context)
  1294. {
  1295. delete (MorphCtx*)context;
  1296. return CV_HAL_ERROR_OK;
  1297. }
  1298. else
  1299. {
  1300. return CV_HAL_ERROR_UNKNOWN;
  1301. }
  1302. }
  1303. #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) \
  1304. ( \
  1305. (void)dst_full_width, (void)dst_full_height, (void)dst_roi_x, (void)dst_roi_y, \
  1306. context && CAROTENE_NS::isSupportedConfiguration() ? \
  1307. ((MorphCtx*)context)->operation == CV_HAL_MORPH_ERODE ? \
  1308. CAROTENE_NS::erode(CAROTENE_NS::Size2D(width, height), ((MorphCtx*)context)->channels, \
  1309. src_data, src_step, dst_data, dst_step, \
  1310. ((MorphCtx*)context)->ksize, ((MorphCtx*)context)->anchor_x, ((MorphCtx*)context)->anchor_y, \
  1311. ((MorphCtx*)context)->border, ((MorphCtx*)context)->border, ((MorphCtx*)context)->borderValues, \
  1312. CAROTENE_NS::Margin(src_roi_x, src_full_width - width - src_roi_x, src_roi_y, src_full_height - height - src_roi_y)), \
  1313. CV_HAL_ERROR_OK : \
  1314. ((MorphCtx*)context)->operation == CV_HAL_MORPH_DILATE ? \
  1315. CAROTENE_NS::dilate(CAROTENE_NS::Size2D(width, height), ((MorphCtx*)context)->channels, \
  1316. src_data, src_step, dst_data, dst_step, \
  1317. ((MorphCtx*)context)->ksize, ((MorphCtx*)context)->anchor_x, ((MorphCtx*)context)->anchor_y, \
  1318. ((MorphCtx*)context)->border, ((MorphCtx*)context)->border, ((MorphCtx*)context)->borderValues, \
  1319. CAROTENE_NS::Margin(src_roi_x, src_full_width - width - src_roi_x, src_roi_y, src_full_height - height - src_roi_y)), \
  1320. CV_HAL_ERROR_OK : \
  1321. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1322. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1323. )
  1324. #undef cv_hal_morphInit
  1325. #define cv_hal_morphInit TEGRA_MORPHINIT
  1326. #undef cv_hal_morph
  1327. #define cv_hal_morph TEGRA_MORPHIMPL
  1328. #undef cv_hal_morphFree
  1329. #define cv_hal_morphFree TEGRA_MORPHFREE
  1330. #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) \
  1331. ( \
  1332. interpolation == CV_HAL_INTER_LINEAR ? \
  1333. CV_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)) && \
  1334. inv_scale_x > 0 && inv_scale_y > 0 && \
  1335. (dst_width - 0.5)/inv_scale_x - 0.5 < src_width && (dst_height - 0.5)/inv_scale_y - 0.5 < src_height && \
  1336. (dst_width + 0.5)/inv_scale_x + 0.5 >= src_width && (dst_height + 0.5)/inv_scale_y + 0.5 >= src_height && \
  1337. std::abs(dst_width / inv_scale_x - src_width) < 0.1 && std::abs(dst_height / inv_scale_y - src_height) < 0.1 ? \
  1338. CAROTENE_NS::resizeLinearOpenCV(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1339. src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, ((src_type >> CV_CN_SHIFT) + 1)), \
  1340. CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1341. interpolation == CV_HAL_INTER_AREA ? \
  1342. CV_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)) && \
  1343. std::abs(dst_width / inv_scale_x - src_width) < 0.1 && std::abs(dst_height / inv_scale_y - src_height) < 0.1 ? \
  1344. CAROTENE_NS::resizeAreaOpenCV(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1345. src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, ((src_type >> CV_CN_SHIFT) + 1)), \
  1346. CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1347. /*nearest neighbour interpolation disabled due to rounding accuracy issues*/ \
  1348. /*interpolation == CV_HAL_INTER_NEAREST ? \
  1349. (src_type == CV_8UC1 || src_type == CV_8SC1) && CAROTENE_NS::isResizeNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height), 1) ? \
  1350. CAROTENE_NS::resizeNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1351. src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, 1), \
  1352. CV_HAL_ERROR_OK : \
  1353. (src_type == CV_8UC3 || src_type == CV_8SC3) && CAROTENE_NS::isResizeNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height), 3) ? \
  1354. CAROTENE_NS::resizeNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1355. src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, 3), \
  1356. CV_HAL_ERROR_OK : \
  1357. (src_type == CV_8UC4 || src_type == CV_8SC4 || src_type == CV_16UC2 || src_type == CV_16SC2 || src_type == CV_32SC1) && \
  1358. CAROTENE_NS::isResizeNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height), 4) ? \
  1359. CAROTENE_NS::resizeNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1360. src_data, src_step, dst_data, dst_step, 1.0/inv_scale_x, 1.0/inv_scale_y, 4), \
  1361. CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED :*/ \
  1362. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1363. )
  1364. #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) \
  1365. ( \
  1366. interpolation == CV_HAL_INTER_NEAREST ? \
  1367. (src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \
  1368. CAROTENE_NS::isWarpAffineNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \
  1369. CAROTENE_NS::warpAffineNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1370. src_data, src_step, \
  1371. std::vector<float>(M+0,M+6).data(), \
  1372. dst_data, dst_step, \
  1373. borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \
  1374. (CAROTENE_NS::u8)borderValue[0]), \
  1375. CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1376. interpolation == CV_HAL_INTER_LINEAR ? \
  1377. (src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \
  1378. CAROTENE_NS::isWarpAffineLinearSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \
  1379. CAROTENE_NS::warpAffineLinear(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1380. src_data, src_step, \
  1381. std::vector<float>(M+0,M+6).data(), \
  1382. dst_data, dst_step, \
  1383. borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \
  1384. (CAROTENE_NS::u8)borderValue[0]), \
  1385. CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1386. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1387. )
  1388. #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) \
  1389. ( \
  1390. interpolation == CV_HAL_INTER_NEAREST ? \
  1391. (src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \
  1392. CAROTENE_NS::isWarpPerspectiveNearestNeighborSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \
  1393. CAROTENE_NS::warpPerspectiveNearestNeighbor(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1394. src_data, src_step, \
  1395. std::vector<float>(M+0,M+9).data(), \
  1396. dst_data, dst_step, \
  1397. borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \
  1398. (CAROTENE_NS::u8)borderValue[0]), \
  1399. CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1400. interpolation == CV_HAL_INTER_LINEAR ? \
  1401. (src_type == CV_8UC1 || src_type == CV_8SC1) && (borderType == CV_HAL_BORDER_REPLICATE || borderType == CV_HAL_BORDER_CONSTANT) && \
  1402. CAROTENE_NS::isWarpPerspectiveLinearSupported(CAROTENE_NS::Size2D(src_width, src_height)) ? \
  1403. CAROTENE_NS::warpPerspectiveLinear(CAROTENE_NS::Size2D(src_width, src_height), CAROTENE_NS::Size2D(dst_width, dst_height), \
  1404. src_data, src_step, \
  1405. std::vector<float>(M+0,M+9).data(), \
  1406. dst_data, dst_step, \
  1407. borderType == CV_HAL_BORDER_REPLICATE ? CAROTENE_NS::BORDER_MODE_REPLICATE : CAROTENE_NS::BORDER_MODE_CONSTANT, \
  1408. (CAROTENE_NS::u8)borderValue[0]), \
  1409. CV_HAL_ERROR_OK : CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1410. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1411. )
  1412. #undef cv_hal_resize
  1413. #define cv_hal_resize TEGRA_RESIZE
  1414. //warpAffine/warpPerspective disabled due to rounding accuracy issue
  1415. //#undef cv_hal_warpAffine
  1416. //#define cv_hal_warpAffine TEGRA_WARPAFFINE
  1417. //#undef cv_hal_warpPerspective
  1418. //#define cv_hal_warpPerspective TEGRA_WARPPERSPECTIVE
  1419. #define TegraCvtColor_Invoker(name, func, ...) \
  1420. class TegraCvtColor_##name##_Invoker : public cv::ParallelLoopBody \
  1421. { \
  1422. public: \
  1423. TegraCvtColor_##name##_Invoker(const uchar * src_data_, size_t src_step_, uchar * dst_data_, size_t dst_step_, int width_, int height_) : \
  1424. cv::ParallelLoopBody(), src_data(src_data_), src_step(src_step_), dst_data(dst_data_), dst_step(dst_step_), width(width_), height(height_) {} \
  1425. virtual void operator()(const cv::Range& range) const CV_OVERRIDE \
  1426. { \
  1427. CAROTENE_NS::func(CAROTENE_NS::Size2D(width, range.end-range.start), __VA_ARGS__); \
  1428. } \
  1429. private: \
  1430. const uchar * src_data; \
  1431. size_t src_step; \
  1432. uchar * dst_data; \
  1433. size_t dst_step; \
  1434. int width, height; \
  1435. const TegraCvtColor_##name##_Invoker& operator= (const TegraCvtColor_##name##_Invoker&); \
  1436. };
  1437. TegraCvtColor_Invoker(rgb2bgr, rgb2bgr, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1438. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1439. TegraCvtColor_Invoker(rgb2bgrx, rgb2bgrx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1440. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1441. TegraCvtColor_Invoker(rgb2rgbx, rgb2rgbx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1442. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1443. TegraCvtColor_Invoker(rgbx2bgr, rgbx2bgr, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1444. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1445. TegraCvtColor_Invoker(rgbx2rgb, rgbx2rgb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1446. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1447. TegraCvtColor_Invoker(rgbx2bgrx, rgbx2bgrx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1448. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1449. #define TEGRA_CVTBGRTOBGR(src_data, src_step, dst_data, dst_step, width, height, depth, scn, dcn, swapBlue) \
  1450. ( \
  1451. depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \
  1452. scn == 3 ? \
  1453. dcn == 3 ? \
  1454. swapBlue ? \
  1455. parallel_for_(Range(0, height), \
  1456. TegraCvtColor_rgb2bgr_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1457. (width * height) / static_cast<double>(1<<16)), \
  1458. CV_HAL_ERROR_OK : \
  1459. CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1460. dcn == 4 ? \
  1461. (swapBlue ? \
  1462. parallel_for_(Range(0, height), \
  1463. TegraCvtColor_rgb2bgrx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1464. (width * height) / static_cast<double>(1<<16)) : \
  1465. parallel_for_(Range(0, height), \
  1466. TegraCvtColor_rgb2rgbx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1467. (width * height) / static_cast<double>(1<<16)) ), \
  1468. CV_HAL_ERROR_OK : \
  1469. CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1470. scn == 4 ? \
  1471. dcn == 3 ? \
  1472. (swapBlue ? \
  1473. parallel_for_(Range(0, height), \
  1474. TegraCvtColor_rgbx2bgr_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1475. (width * height) / static_cast<double>(1<<16)) : \
  1476. parallel_for_(Range(0, height), \
  1477. TegraCvtColor_rgbx2rgb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1478. (width * height) / static_cast<double>(1<<16)) ), \
  1479. CV_HAL_ERROR_OK : \
  1480. dcn == 4 ? \
  1481. swapBlue ? \
  1482. parallel_for_(Range(0, height), \
  1483. TegraCvtColor_rgbx2bgrx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1484. (width * height) / static_cast<double>(1<<16)), \
  1485. CV_HAL_ERROR_OK : \
  1486. CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1487. CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1488. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1489. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1490. )
  1491. TegraCvtColor_Invoker(rgb2bgr565, rgb2bgr565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1492. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1493. TegraCvtColor_Invoker(rgb2rgb565, rgb2rgb565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1494. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1495. TegraCvtColor_Invoker(rgbx2bgr565, rgbx2bgr565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1496. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1497. TegraCvtColor_Invoker(rgbx2rgb565, rgbx2rgb565, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1498. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1499. #define TEGRA_CVTBGRTOBGR565(src_data, src_step, dst_data, dst_step, width, height, scn, swapBlue, greenBits) \
  1500. ( \
  1501. greenBits == 6 && CAROTENE_NS::isSupportedConfiguration() ? \
  1502. scn == 3 ? \
  1503. (swapBlue ? \
  1504. parallel_for_(Range(0, height), \
  1505. TegraCvtColor_rgb2bgr565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1506. (width * height) / static_cast<double>(1<<16)) : \
  1507. parallel_for_(Range(0, height), \
  1508. TegraCvtColor_rgb2rgb565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1509. (width * height) / static_cast<double>(1<<16)) ), \
  1510. CV_HAL_ERROR_OK : \
  1511. scn == 4 ? \
  1512. (swapBlue ? \
  1513. parallel_for_(Range(0, height), \
  1514. TegraCvtColor_rgbx2bgr565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1515. (width * height) / static_cast<double>(1<<16)) : \
  1516. parallel_for_(Range(0, height), \
  1517. TegraCvtColor_rgbx2rgb565_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1518. (width * height) / static_cast<double>(1<<16)) ), \
  1519. CV_HAL_ERROR_OK : \
  1520. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1521. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1522. )
  1523. TegraCvtColor_Invoker(rgb2gray, rgb2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1524. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1525. TegraCvtColor_Invoker(bgr2gray, bgr2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1526. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1527. TegraCvtColor_Invoker(rgbx2gray, rgbx2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1528. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1529. TegraCvtColor_Invoker(bgrx2gray, bgrx2gray, CAROTENE_NS::COLOR_SPACE_BT601, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1530. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1531. #define TEGRA_CVTBGRTOGRAY(src_data, src_step, dst_data, dst_step, width, height, depth, scn, swapBlue) \
  1532. ( \
  1533. depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \
  1534. scn == 3 ? \
  1535. (swapBlue ? \
  1536. parallel_for_(Range(0, height), \
  1537. TegraCvtColor_rgb2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1538. (width * height) / static_cast<double>(1<<16)) : \
  1539. parallel_for_(Range(0, height), \
  1540. TegraCvtColor_bgr2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1541. (width * height) / static_cast<double>(1<<16)) ), \
  1542. CV_HAL_ERROR_OK : \
  1543. scn == 4 ? \
  1544. (swapBlue ? \
  1545. parallel_for_(Range(0, height), \
  1546. TegraCvtColor_rgbx2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1547. (width * height) / static_cast<double>(1<<16)) : \
  1548. parallel_for_(Range(0, height), \
  1549. TegraCvtColor_bgrx2gray_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1550. (width * height) / static_cast<double>(1<<16)) ), \
  1551. CV_HAL_ERROR_OK : \
  1552. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1553. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1554. )
  1555. TegraCvtColor_Invoker(gray2rgb, gray2rgb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1556. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1557. TegraCvtColor_Invoker(gray2rgbx, gray2rgbx, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1558. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1559. #define TEGRA_CVTGRAYTOBGR(src_data, src_step, dst_data, dst_step, width, height, depth, dcn) \
  1560. ( \
  1561. depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \
  1562. dcn == 3 ? \
  1563. parallel_for_(Range(0, height), \
  1564. TegraCvtColor_gray2rgb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1565. (width * height) / static_cast<double>(1<<16)), \
  1566. CV_HAL_ERROR_OK : \
  1567. dcn == 4 ? \
  1568. parallel_for_(Range(0, height), \
  1569. TegraCvtColor_gray2rgbx_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1570. (width * height) / static_cast<double>(1<<16)), \
  1571. CV_HAL_ERROR_OK : \
  1572. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1573. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1574. )
  1575. TegraCvtColor_Invoker(rgb2ycrcb, rgb2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1576. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1577. TegraCvtColor_Invoker(bgr2ycrcb, bgr2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1578. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1579. TegraCvtColor_Invoker(rgbx2ycrcb, rgbx2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1580. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1581. TegraCvtColor_Invoker(bgrx2ycrcb, bgrx2ycrcb, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1582. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step)
  1583. #define TEGRA_CVTBGRTOYUV(src_data, src_step, dst_data, dst_step, width, height, depth, scn, swapBlue, isCbCr) \
  1584. ( \
  1585. isCbCr && depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \
  1586. scn == 3 ? \
  1587. (swapBlue ? \
  1588. parallel_for_(Range(0, height), \
  1589. TegraCvtColor_rgb2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1590. (width * height) / static_cast<double>(1<<16)) : \
  1591. parallel_for_(Range(0, height), \
  1592. TegraCvtColor_bgr2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1593. (width * height) / static_cast<double>(1<<16)) ), \
  1594. CV_HAL_ERROR_OK : \
  1595. scn == 4 ? \
  1596. (swapBlue ? \
  1597. parallel_for_(Range(0, height), \
  1598. TegraCvtColor_rgbx2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1599. (width * height) / static_cast<double>(1<<16)) : \
  1600. parallel_for_(Range(0, height), \
  1601. TegraCvtColor_bgrx2ycrcb_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1602. (width * height) / static_cast<double>(1<<16)) ), \
  1603. CV_HAL_ERROR_OK : \
  1604. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1605. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1606. )
  1607. TegraCvtColor_Invoker(rgb2hsv, rgb2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1608. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)
  1609. TegraCvtColor_Invoker(bgr2hsv, bgr2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1610. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)
  1611. TegraCvtColor_Invoker(rgbx2hsv, rgbx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1612. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)
  1613. TegraCvtColor_Invoker(bgrx2hsv, bgrx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1614. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 180)
  1615. TegraCvtColor_Invoker(rgb2hsvf, rgb2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1616. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)
  1617. TegraCvtColor_Invoker(bgr2hsvf, bgr2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1618. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)
  1619. TegraCvtColor_Invoker(rgbx2hsvf, rgbx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1620. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)
  1621. TegraCvtColor_Invoker(bgrx2hsvf, bgrx2hsv, src_data + static_cast<size_t>(range.start) * src_step, src_step, \
  1622. dst_data + static_cast<size_t>(range.start) * dst_step, dst_step, 256)
  1623. #define TEGRA_CVTBGRTOHSV(src_data, src_step, dst_data, dst_step, width, height, depth, scn, swapBlue, isFullRange, isHSV) \
  1624. ( \
  1625. isHSV && depth == CV_8U && CAROTENE_NS::isSupportedConfiguration() ? \
  1626. scn == 3 ? \
  1627. (swapBlue ? \
  1628. isFullRange ? \
  1629. parallel_for_(Range(0, height), \
  1630. TegraCvtColor_rgb2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1631. (width * height) / static_cast<double>(1<<16)) : \
  1632. parallel_for_(Range(0, height), \
  1633. TegraCvtColor_rgb2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1634. (width * height) / static_cast<double>(1<<16)) : \
  1635. isFullRange ? \
  1636. parallel_for_(Range(0, height), \
  1637. TegraCvtColor_bgr2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1638. (width * height) / static_cast<double>(1<<16)) : \
  1639. parallel_for_(Range(0, height), \
  1640. TegraCvtColor_bgr2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1641. (width * height) / static_cast<double>(1<<16)) ), \
  1642. CV_HAL_ERROR_OK : \
  1643. scn == 4 ? \
  1644. (swapBlue ? \
  1645. isFullRange ? \
  1646. parallel_for_(Range(0, height), \
  1647. TegraCvtColor_rgbx2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1648. (width * height) / static_cast<double>(1<<16)) : \
  1649. parallel_for_(Range(0, height), \
  1650. TegraCvtColor_rgbx2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1651. (width * height) / static_cast<double>(1<<16)) : \
  1652. isFullRange ? \
  1653. parallel_for_(Range(0, height), \
  1654. TegraCvtColor_bgrx2hsvf_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1655. (width * height) / static_cast<double>(1<<16)) : \
  1656. parallel_for_(Range(0, height), \
  1657. TegraCvtColor_bgrx2hsv_Invoker(src_data, src_step, dst_data, dst_step, width, height), \
  1658. (width * height) / static_cast<double>(1<<16)) ), \
  1659. CV_HAL_ERROR_OK : \
  1660. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1661. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1662. )
  1663. #define TEGRA_CVT2PYUVTOBGR_EX(y_data, y_step, uv_data, uv_step, dst_data, dst_step, dst_width, dst_height, dcn, swapBlue, uIdx) \
  1664. ( \
  1665. CAROTENE_NS::isSupportedConfiguration() ? \
  1666. dcn == 3 ? \
  1667. uIdx == 0 ? \
  1668. (swapBlue ? \
  1669. CAROTENE_NS::yuv420i2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1670. y_data, y_step, \
  1671. uv_data, uv_step, \
  1672. dst_data, dst_step) : \
  1673. CAROTENE_NS::yuv420i2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1674. y_data, y_step, \
  1675. uv_data, uv_step, \
  1676. dst_data, dst_step)), \
  1677. CV_HAL_ERROR_OK : \
  1678. uIdx == 1 ? \
  1679. (swapBlue ? \
  1680. CAROTENE_NS::yuv420sp2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1681. y_data, y_step, \
  1682. uv_data, uv_step, \
  1683. dst_data, dst_step) : \
  1684. CAROTENE_NS::yuv420sp2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1685. y_data, y_step, \
  1686. uv_data, uv_step, \
  1687. dst_data, dst_step)), \
  1688. CV_HAL_ERROR_OK : \
  1689. CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1690. dcn == 4 ? \
  1691. uIdx == 0 ? \
  1692. (swapBlue ? \
  1693. CAROTENE_NS::yuv420i2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1694. y_data, y_step, \
  1695. uv_data, uv_step, \
  1696. dst_data, dst_step) : \
  1697. CAROTENE_NS::yuv420i2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1698. y_data, y_step, \
  1699. uv_data, uv_step, \
  1700. dst_data, dst_step)), \
  1701. CV_HAL_ERROR_OK : \
  1702. uIdx == 1 ? \
  1703. (swapBlue ? \
  1704. CAROTENE_NS::yuv420sp2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1705. y_data, y_step, \
  1706. uv_data, uv_step, \
  1707. dst_data, dst_step) : \
  1708. CAROTENE_NS::yuv420sp2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \
  1709. y_data, y_step, \
  1710. uv_data, uv_step, \
  1711. dst_data, dst_step)), \
  1712. CV_HAL_ERROR_OK : \
  1713. CV_HAL_ERROR_NOT_IMPLEMENTED : \
  1714. CV_HAL_ERROR_NOT_IMPLEMENTED \
  1715. : CV_HAL_ERROR_NOT_IMPLEMENTED \
  1716. )
  1717. #define TEGRA_CVT2PYUVTOBGR(src_data, src_step, dst_data, dst_step, dst_width, dst_height, dcn, swapBlue, uIdx) \
  1718. TEGRA_CVT2PYUVTOBGR_EX(src_data, src_step, src_data + src_step * dst_height, src_step, dst_data, dst_step, \
  1719. dst_width, dst_height, dcn, swapBlue, uIdx);
  1720. #undef cv_hal_cvtBGRtoBGR
  1721. #define cv_hal_cvtBGRtoBGR TEGRA_CVTBGRTOBGR
  1722. #undef cv_hal_cvtBGRtoBGR5x5
  1723. #define cv_hal_cvtBGRtoBGR5x5 TEGRA_CVTBGRTOBGR565
  1724. #undef cv_hal_cvtBGRtoGray
  1725. #define cv_hal_cvtBGRtoGray TEGRA_CVTBGRTOGRAY
  1726. #undef cv_hal_cvtGraytoBGR
  1727. #define cv_hal_cvtGraytoBGR TEGRA_CVTGRAYTOBGR
  1728. #if 0 // bit-exact tests are failed
  1729. #undef cv_hal_cvtBGRtoYUV
  1730. #define cv_hal_cvtBGRtoYUV TEGRA_CVTBGRTOYUV
  1731. #endif
  1732. #undef cv_hal_cvtBGRtoHSV
  1733. #define cv_hal_cvtBGRtoHSV TEGRA_CVTBGRTOHSV
  1734. #if 0 // bit-exact tests are failed
  1735. #undef cv_hal_cvtTwoPlaneYUVtoBGR
  1736. #define cv_hal_cvtTwoPlaneYUVtoBGR TEGRA_CVT2PYUVTOBGR
  1737. #undef cv_hal_cvtTwoPlaneYUVtoBGREx
  1738. #define cv_hal_cvtTwoPlaneYUVtoBGREx TEGRA_CVT2PYUVTOBGR_EX
  1739. #endif
  1740. #endif // OPENCV_IMGPROC_HAL_INTERFACE_H
  1741. #endif