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