1 /*******************************************************************************
2 * Copyright 2016-2019 Intel Corporation.
3 *
4 * This software and the related documents are Intel copyrighted materials, and
5 * your use of them is governed by the express license under which they were
6 * provided to you (License). Unless the License provides otherwise, you may not
7 * use, modify, copy, publish, distribute, disclose or transmit this software or
8 * the related documents without Intel's prior written permission.
9 *
10 * This software and the related documents are provided as is, with no express
11 * or implied warranties, other than those that are expressly stated in the
12 * License.
13 *******************************************************************************/
14
15 #include "iw/iw_image_op.h"
16 #include "iw_owni.h"
17
18 IW_DECL(IppStatus) llwiScale(const void *pSrc, int srcStep, IppDataType srcType, void *pDst, int dstStep, IppDataType dstType,
19 IppiSize size, int channels, Ipp64f mulVal, Ipp64f addVal, IppHintAlgorithm algoMode);
20
21 /**/////////////////////////////////////////////////////////////////////////////
22 // iwiScale
23 ///////////////////////////////////////////////////////////////////////////// */
iwiScale_GetScaleVals(IppDataType srcType,IppDataType dstType,Ipp64f * pMulVal,Ipp64f * pAddVal)24 IW_DECL(IppStatus) iwiScale_GetScaleVals(IppDataType srcType, IppDataType dstType, Ipp64f *pMulVal, Ipp64f *pAddVal)
25 {
26 Ipp64f srcRange = 1, dstRange = 1;
27 Ipp64f srcMin = 0, dstMin = 0;
28
29 if(!pMulVal || !pAddVal)
30 return ippStsNullPtrErr;
31
32 if(srcType == dstType)
33 {
34 *pMulVal = 1;
35 *pAddVal = 0;
36 }
37
38 if(!iwTypeIsFloat(srcType))
39 {
40 srcRange = iwTypeGetRange(srcType);
41 srcMin = iwTypeGetMin(srcType);
42 }
43 if(!iwTypeIsFloat(dstType))
44 {
45 dstRange = iwTypeGetRange(dstType);
46 dstMin = iwTypeGetMin(dstType);
47 }
48 if(!srcRange || !dstRange)
49 return ippStsDataTypeErr;
50
51 *pMulVal = dstRange/srcRange;
52 *pAddVal = dstMin - srcMin*(*pMulVal);
53
54 return ippStsNoErr;
55 }
56
iwiScale(const IwiImage * pSrcImage,IwiImage * pDstImage,Ipp64f mulVal,Ipp64f addVal,const IwiScaleParams * pAuxParams,const IwiTile * pTile)57 IW_DECL(IppStatus) iwiScale(const IwiImage *pSrcImage, IwiImage *pDstImage, Ipp64f mulVal, Ipp64f addVal, const IwiScaleParams *pAuxParams, const IwiTile *pTile)
58 {
59 IppStatus status;
60 IwiScaleParams auxParams;
61
62 status = owniCheckImageRead(pSrcImage);
63 if(status)
64 return status;
65 status = owniCheckImageWrite(pDstImage);
66 if(status)
67 return status;
68
69 if((pSrcImage->m_ptrConst == pDstImage->m_ptrConst) && (pSrcImage->m_dataType != pDstImage->m_dataType))
70 return ippStsInplaceModeNotSupportedErr;
71
72 if(pSrcImage->m_channels != pDstImage->m_channels)
73 return ippStsBadArgErr;
74
75 if(pAuxParams)
76 auxParams = *pAuxParams;
77 else
78 iwiScale_SetDefaultParams(&auxParams);
79
80 if(auxParams.algoMode == ippAlgHintNone)
81 {
82 int hasScale = ((IPP_ABS(mulVal-1) > IPP_EPS_64F) || (IPP_ABS(addVal) > IPP_EPS_64F));
83 if(hasScale && (pDstImage->m_typeSize >= 4 && pDstImage->m_dataType != ipp32f))
84 auxParams.algoMode = ippAlgHintAccurate;
85 else
86 auxParams.algoMode = ippAlgHintFast;
87 }
88
89 {
90 const void *pSrc = pSrcImage->m_ptrConst;
91 void *pDst = pDstImage->m_ptr;
92 IwiSize size = owniGetMinSize(&pSrcImage->m_size, &pDstImage->m_size);
93
94 if(pTile && pTile->m_initialized != ownTileInitNone)
95 {
96 if(pTile->m_initialized == ownTileInitSimple)
97 {
98 IwiRoi dstRoi = pTile->m_dstRoi;
99
100 if(!owniTile_BoundToSize(&dstRoi, &size))
101 return ippStsNoOperation;
102
103 pSrc = iwiImage_GetPtrConst(pSrcImage, dstRoi.y, dstRoi.x, 0);
104 pDst = iwiImage_GetPtr(pDstImage, dstRoi.y, dstRoi.x, 0);
105 }
106 else if(pTile->m_initialized == ownTileInitPipe)
107 {
108 IwiRoi srcLim;
109 IwiRoi dstLim;
110 iwiTilePipeline_GetBoundedSrcRoi(pTile, &srcLim);
111 iwiTilePipeline_GetBoundedDstRoi(pTile, &dstLim);
112
113 pSrc = iwiImage_GetPtrConst(pSrcImage, srcLim.y, srcLim.x, 0);
114 pDst = iwiImage_GetPtr(pDstImage, dstLim.y, dstLim.x, 0);
115
116 size = owniGetMinSizeFromRect(&srcLim, &dstLim);
117 }
118 else
119 return ippStsContextMatchErr;
120 }
121
122 // Long compatibility check
123 {
124 IppiSize _size;
125
126 status = ownLongCompatCheckValue(pSrcImage->m_step, NULL);
127 if(status < 0)
128 return status;
129
130 status = ownLongCompatCheckValue(pDstImage->m_step, NULL);
131 if(status < 0)
132 return status;
133
134 status = owniLongCompatCheckSize(size, &_size);
135 if(status < 0)
136 return status;
137
138 return llwiScale(pSrc, (int)pSrcImage->m_step, pSrcImage->m_dataType, pDst, (int)pDstImage->m_step, pDstImage->m_dataType, _size, pSrcImage->m_channels, mulVal, addVal, auxParams.algoMode);
139 }
140 }
141 }
142
143
144 /**/////////////////////////////////////////////////////////////////////////////
145 // Low-Level Wrappers
146 ///////////////////////////////////////////////////////////////////////////// */
llwiScale(const void * pSrc,int srcStep,IppDataType srcType,void * pDst,int dstStep,IppDataType dstType,IppiSize size,int channels,Ipp64f mulVal,Ipp64f addVal,IppHintAlgorithm algoMode)147 IW_DECL(IppStatus) llwiScale(const void *pSrc, int srcStep, IppDataType srcType, void *pDst, int dstStep, IppDataType dstType,
148 IppiSize size, int channels, Ipp64f mulVal, Ipp64f addVal, IppHintAlgorithm algoMode)
149 {
150 size.width = size.width*channels;
151
152 if(pSrc == pDst)
153 {
154 #if IPP_VERSION_COMPLEX >= 20170001
155 switch(srcType)
156 {
157 case ipp8u: return ippiScaleC_8u_C1IR ((Ipp8u*)pSrc, srcStep, mulVal, addVal, size, algoMode);
158 case ipp8s: return ippiScaleC_8s_C1IR ((Ipp8s*)pSrc, srcStep, mulVal, addVal, size, algoMode);
159 case ipp16u: return ippiScaleC_16u_C1IR((Ipp16u*)pSrc, srcStep, mulVal, addVal, size, algoMode);
160 case ipp16s: return ippiScaleC_16s_C1IR((Ipp16s*)pSrc, srcStep, mulVal, addVal, size, algoMode);
161 case ipp32s: return ippiScaleC_32s_C1IR((Ipp32s*)pSrc, srcStep, mulVal, addVal, size, algoMode);
162 case ipp32f: return ippiScaleC_32f_C1IR((Ipp32f*)pSrc, srcStep, mulVal, addVal, size, algoMode);
163 case ipp64f: return ippiScaleC_64f_C1IR((Ipp64f*)pSrc, srcStep, mulVal, addVal, size, algoMode);
164 default: return ippStsDataTypeErr;
165 }
166 #else
167 return ippStsInplaceModeNotSupportedErr;
168 #endif
169 }
170 else
171 {
172 switch(srcType)
173 {
174 case ipp8u:
175 switch(dstType)
176 {
177 case ipp8u: return ippiScaleC_8u_C1R ((Ipp8u*)pSrc, srcStep, mulVal, addVal, (Ipp8u*)pDst, dstStep, size, algoMode);
178 case ipp8s: return ippiScaleC_8u8s_C1R ((Ipp8u*)pSrc, srcStep, mulVal, addVal, (Ipp8s*)pDst, dstStep, size, algoMode);
179 case ipp16u: return ippiScaleC_8u16u_C1R((Ipp8u*)pSrc, srcStep, mulVal, addVal, (Ipp16u*)pDst, dstStep, size, algoMode);
180 case ipp16s: return ippiScaleC_8u16s_C1R((Ipp8u*)pSrc, srcStep, mulVal, addVal, (Ipp16s*)pDst, dstStep, size, algoMode);
181 case ipp32s: return ippiScaleC_8u32s_C1R((Ipp8u*)pSrc, srcStep, mulVal, addVal, (Ipp32s*)pDst, dstStep, size, algoMode);
182 case ipp32f: return ippiScaleC_8u32f_C1R((Ipp8u*)pSrc, srcStep, mulVal, addVal, (Ipp32f*)pDst, dstStep, size, algoMode);
183 case ipp64f: return ippiScaleC_8u64f_C1R((Ipp8u*)pSrc, srcStep, mulVal, addVal, (Ipp64f*)pDst, dstStep, size, algoMode);
184 default: return ippStsDataTypeErr;
185 }
186 case ipp8s:
187 switch(dstType)
188 {
189 case ipp8u: return ippiScaleC_8s8u_C1R ((Ipp8s*)pSrc, srcStep, mulVal, addVal, (Ipp8u*)pDst, dstStep, size, algoMode);
190 case ipp8s: return ippiScaleC_8s_C1R ((Ipp8s*)pSrc, srcStep, mulVal, addVal, (Ipp8s*)pDst, dstStep, size, algoMode);
191 case ipp16u: return ippiScaleC_8s16u_C1R((Ipp8s*)pSrc, srcStep, mulVal, addVal, (Ipp16u*)pDst, dstStep, size, algoMode);
192 case ipp16s: return ippiScaleC_8s16s_C1R((Ipp8s*)pSrc, srcStep, mulVal, addVal, (Ipp16s*)pDst, dstStep, size, algoMode);
193 case ipp32s: return ippiScaleC_8s32s_C1R((Ipp8s*)pSrc, srcStep, mulVal, addVal, (Ipp32s*)pDst, dstStep, size, algoMode);
194 case ipp32f: return ippiScaleC_8s32f_C1R((Ipp8s*)pSrc, srcStep, mulVal, addVal, (Ipp32f*)pDst, dstStep, size, algoMode);
195 case ipp64f: return ippiScaleC_8s64f_C1R((Ipp8s*)pSrc, srcStep, mulVal, addVal, (Ipp64f*)pDst, dstStep, size, algoMode);
196 default: return ippStsDataTypeErr;
197 }
198 case ipp16u:
199 switch(dstType)
200 {
201 case ipp8u: return ippiScaleC_16u8u_C1R ((Ipp16u*)pSrc, srcStep, mulVal, addVal, (Ipp8u*)pDst, dstStep, size, algoMode);
202 case ipp8s: return ippiScaleC_16u8s_C1R ((Ipp16u*)pSrc, srcStep, mulVal, addVal, (Ipp8s*)pDst, dstStep, size, algoMode);
203 case ipp16u: return ippiScaleC_16u_C1R ((Ipp16u*)pSrc, srcStep, mulVal, addVal, (Ipp16u*)pDst, dstStep, size, algoMode);
204 case ipp16s: return ippiScaleC_16u16s_C1R((Ipp16u*)pSrc, srcStep, mulVal, addVal, (Ipp16s*)pDst, dstStep, size, algoMode);
205 case ipp32s: return ippiScaleC_16u32s_C1R((Ipp16u*)pSrc, srcStep, mulVal, addVal, (Ipp32s*)pDst, dstStep, size, algoMode);
206 case ipp32f: return ippiScaleC_16u32f_C1R((Ipp16u*)pSrc, srcStep, mulVal, addVal, (Ipp32f*)pDst, dstStep, size, algoMode);
207 case ipp64f: return ippiScaleC_16u64f_C1R((Ipp16u*)pSrc, srcStep, mulVal, addVal, (Ipp64f*)pDst, dstStep, size, algoMode);
208 default: return ippStsDataTypeErr;
209 }
210 case ipp16s:
211 switch(dstType)
212 {
213 case ipp8u: return ippiScaleC_16s8u_C1R ((Ipp16s*)pSrc, srcStep, mulVal, addVal, (Ipp8u*)pDst, dstStep, size, algoMode);
214 case ipp8s: return ippiScaleC_16s8s_C1R ((Ipp16s*)pSrc, srcStep, mulVal, addVal, (Ipp8s*)pDst, dstStep, size, algoMode);
215 case ipp16u: return ippiScaleC_16s16u_C1R((Ipp16s*)pSrc, srcStep, mulVal, addVal, (Ipp16u*)pDst, dstStep, size, algoMode);
216 case ipp16s: return ippiScaleC_16s_C1R ((Ipp16s*)pSrc, srcStep, mulVal, addVal, (Ipp16s*)pDst, dstStep, size, algoMode);
217 case ipp32s: return ippiScaleC_16s32s_C1R((Ipp16s*)pSrc, srcStep, mulVal, addVal, (Ipp32s*)pDst, dstStep, size, algoMode);
218 case ipp32f: return ippiScaleC_16s32f_C1R((Ipp16s*)pSrc, srcStep, mulVal, addVal, (Ipp32f*)pDst, dstStep, size, algoMode);
219 case ipp64f: return ippiScaleC_16s64f_C1R((Ipp16s*)pSrc, srcStep, mulVal, addVal, (Ipp64f*)pDst, dstStep, size, algoMode);
220 default: return ippStsDataTypeErr;
221 }
222 case ipp32s:
223 switch(dstType)
224 {
225 case ipp8u: return ippiScaleC_32s8u_C1R ((Ipp32s*)pSrc, srcStep, mulVal, addVal, (Ipp8u*)pDst, dstStep, size, algoMode);
226 case ipp8s: return ippiScaleC_32s8s_C1R ((Ipp32s*)pSrc, srcStep, mulVal, addVal, (Ipp8s*)pDst, dstStep, size, algoMode);
227 case ipp16u: return ippiScaleC_32s16u_C1R((Ipp32s*)pSrc, srcStep, mulVal, addVal, (Ipp16u*)pDst, dstStep, size, algoMode);
228 case ipp16s: return ippiScaleC_32s16s_C1R((Ipp32s*)pSrc, srcStep, mulVal, addVal, (Ipp16s*)pDst, dstStep, size, algoMode);
229 case ipp32s: return ippiScaleC_32s_C1R ((Ipp32s*)pSrc, srcStep, mulVal, addVal, (Ipp32s*)pDst, dstStep, size, algoMode);
230 case ipp32f: return ippiScaleC_32s32f_C1R((Ipp32s*)pSrc, srcStep, mulVal, addVal, (Ipp32f*)pDst, dstStep, size, algoMode);
231 case ipp64f: return ippiScaleC_32s64f_C1R((Ipp32s*)pSrc, srcStep, mulVal, addVal, (Ipp64f*)pDst, dstStep, size, algoMode);
232 default: return ippStsDataTypeErr;
233 }
234 case ipp32f:
235 switch(dstType)
236 {
237 case ipp8u: return ippiScaleC_32f8u_C1R ((Ipp32f*)pSrc, srcStep, mulVal, addVal, (Ipp8u*)pDst, dstStep, size, algoMode);
238 case ipp8s: return ippiScaleC_32f8s_C1R ((Ipp32f*)pSrc, srcStep, mulVal, addVal, (Ipp8s*)pDst, dstStep, size, algoMode);
239 case ipp16u: return ippiScaleC_32f16u_C1R((Ipp32f*)pSrc, srcStep, mulVal, addVal, (Ipp16u*)pDst, dstStep, size, algoMode);
240 case ipp16s: return ippiScaleC_32f16s_C1R((Ipp32f*)pSrc, srcStep, mulVal, addVal, (Ipp16s*)pDst, dstStep, size, algoMode);
241 case ipp32s: return ippiScaleC_32f32s_C1R((Ipp32f*)pSrc, srcStep, mulVal, addVal, (Ipp32s*)pDst, dstStep, size, algoMode);
242 case ipp32f: return ippiScaleC_32f_C1R ((Ipp32f*)pSrc, srcStep, mulVal, addVal, (Ipp32f*)pDst, dstStep, size, algoMode);
243 case ipp64f: return ippiScaleC_32f64f_C1R((Ipp32f*)pSrc, srcStep, mulVal, addVal, (Ipp64f*)pDst, dstStep, size, algoMode);
244 default: return ippStsDataTypeErr;
245 }
246 case ipp64f:
247 switch(dstType)
248 {
249 case ipp8u: return ippiScaleC_64f8u_C1R ((Ipp64f*)pSrc, srcStep, mulVal, addVal, (Ipp8u*)pDst, dstStep, size, algoMode);
250 case ipp8s: return ippiScaleC_64f8s_C1R ((Ipp64f*)pSrc, srcStep, mulVal, addVal, (Ipp8s*)pDst, dstStep, size, algoMode);
251 case ipp16u: return ippiScaleC_64f16u_C1R((Ipp64f*)pSrc, srcStep, mulVal, addVal, (Ipp16u*)pDst, dstStep, size, algoMode);
252 case ipp16s: return ippiScaleC_64f16s_C1R((Ipp64f*)pSrc, srcStep, mulVal, addVal, (Ipp16s*)pDst, dstStep, size, algoMode);
253 case ipp32s: return ippiScaleC_64f32s_C1R((Ipp64f*)pSrc, srcStep, mulVal, addVal, (Ipp32s*)pDst, dstStep, size, algoMode);
254 case ipp32f: return ippiScaleC_64f32f_C1R((Ipp64f*)pSrc, srcStep, mulVal, addVal, (Ipp32f*)pDst, dstStep, size, algoMode);
255 case ipp64f: return ippiScaleC_64f_C1R ((Ipp64f*)pSrc, srcStep, mulVal, addVal, (Ipp64f*)pDst, dstStep, size, algoMode);
256 default: return ippStsDataTypeErr;
257 }
258 default: return ippStsDataTypeErr;
259 }
260 }
261 }
262