Showing the changes to codec/processing/src/common (16 of 124 files). Show all
Unified · Split
| @@ -0,0 +1,301 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include "WelsFrameWork.h" | ||
| 34 | #include "cpu.h" | ||
| 35 | #include "../denoise/denoise.h" | ||
| 36 | #include "../downsample/downsample.h" | ||
| 37 | #include "../scenechangedetection/SceneChangeDetection.h" | ||
| 38 | #include "../vaacalc/vaacalculation.h" | ||
| 39 | #include "../backgounddetection/BackgroundDetection.h" | ||
| 40 | #include "../adaptivequantization/AdaptiveQuantization.h" | ||
| 41 | #include "../complexityanalysis/ComplexityAnalysis.h" | ||
| 42 | #include "../imagerotate/imagerotate.h" | ||
| 43 | |||
| 44 | |||
| 45 | /* interface API implement */ | ||
| 46 | |||
| 47 | EResult WELSAPI CreateVpInterface (void** ppCtx, int iVersion) { | ||
| 48 | if (iVersion & 0x8000) | ||
| 49 | return nsWelsVP::CreateSpecificVpInterface ((IWelsVP**)ppCtx); | ||
| 50 | else if (iVersion & 0x7fff) | ||
| 51 | return nsWelsVP::CreateSpecificVpInterface ((IWelsVPc**)ppCtx); | ||
| 52 | else | ||
| 53 | return RET_INVALIDPARAM; | ||
| 54 | } | ||
| 55 | |||
| 56 | EResult WELSAPI DestroyVpInterface (void* pCtx, int iVersion) { | ||
| 57 | if (iVersion & 0x8000) | ||
| 58 | return nsWelsVP::DestroySpecificVpInterface ((IWelsVP*)pCtx); | ||
| 59 | else if (iVersion & 0x7fff) | ||
| 60 | return nsWelsVP::DestroySpecificVpInterface ((IWelsVPc*)pCtx); | ||
| 61 | else | ||
| 62 | return RET_INVALIDPARAM; | ||
| 63 | } | ||
| 64 | |||
| 65 | WELSVP_NAMESPACE_BEGIN | ||
| 66 | |||
| 67 | /////////////////////////////////////////////////////////////////////// | ||
| 68 | |||
| 69 | EResult CreateSpecificVpInterface (IWelsVP** ppCtx) { | ||
| 70 | EResult eReturn = RET_FAILED; | ||
| 71 | |||
| 72 | CVpFrameWork* pFr = new CVpFrameWork (1, eReturn); | ||
| 73 | if (pFr) { | ||
| 74 | *ppCtx = (IWelsVP*)pFr; | ||
| 75 | eReturn = RET_SUCCESS; | ||
| 76 | } | ||
| 77 | |||
| 78 | return eReturn; | ||
| 79 | } | ||
| 80 | |||
| 81 | EResult DestroySpecificVpInterface (IWelsVP* pCtx) { | ||
| 82 | _SafeDelete (pCtx); | ||
| 83 | |||
| 84 | return RET_SUCCESS; | ||
| 85 | } | ||
| 86 | |||
| 87 | /////////////////////////////////////////////////////////////////////////////// | ||
| 88 | |||
| 89 | CVpFrameWork::CVpFrameWork (uint32_t uiThreadsNum, EResult& eReturn) { | ||
| 90 | int32_t iCoreNum = 1; | ||
| 91 | #ifndef X86_ASM | ||
| 92 | uint32_t uiCPUFlag = 0; | ||
| 93 | #else | ||
| 94 | uint32_t uiCPUFlag = WelsCPUFeatureDetect (&iCoreNum); | ||
| 95 | #endif | ||
| 96 | |||
| 97 | for (int32_t i = 0; i < MAX_STRATEGY_NUM; i++) { | ||
| 98 | IStrategy* pStrategy = m_pStgChain[i]; | ||
| 99 | pStrategy = CreateStrategy (WelsStaticCast (EMethods, i + 1), uiCPUFlag); | ||
| 100 | m_pStgChain[i] = pStrategy; | ||
| 101 | } | ||
| 102 | |||
| 103 | WelsMutexInit (&m_mutes); | ||
| 104 | |||
| 105 | eReturn = RET_SUCCESS; | ||
| 106 | } | ||
| 107 | |||
| 108 | CVpFrameWork::~CVpFrameWork() { | ||
| 109 | for (int32_t i = 0; i < MAX_STRATEGY_NUM; i++) { | ||
| 110 | if (m_pStgChain[i]) { | ||
| 111 | Uninit (m_pStgChain[i]->m_eMethod); | ||
| 112 | _SafeDelete (m_pStgChain[i]); | ||
| 113 | } | ||
| 114 | } | ||
| 115 | |||
| 116 | WelsMutexDestroy (&m_mutes); | ||
| 117 | } | ||
| 118 | |||
| 119 | EResult CVpFrameWork::Init (int32_t iType, void* pCfg) { | ||
| 120 | EResult eReturn = RET_SUCCESS; | ||
| 121 | int32_t iCurIdx = WelsStaticCast (int32_t, WelsVpGetValidMethod (iType)) - 1; | ||
| 122 | |||
| 123 | Uninit (iType); | ||
| 124 | |||
| 125 | WelsMutexLock (&m_mutes); | ||
| 126 | |||
| 127 | IStrategy* pStrategy = m_pStgChain[iCurIdx]; | ||
| 128 | if (pStrategy) | ||
| 129 | eReturn = pStrategy->Init (0, pCfg); | ||
| 130 | |||
| 131 | WelsMutexUnlock (&m_mutes); | ||
| 132 | |||
| 133 | return eReturn; | ||
| 134 | } | ||
| 135 | |||
| 136 | EResult CVpFrameWork::Uninit (int32_t iType) { | ||
| 137 | EResult eReturn = RET_SUCCESS; | ||
| 138 | int32_t iCurIdx = WelsStaticCast (int32_t, WelsVpGetValidMethod (iType)) - 1; | ||
| 139 | |||
| 140 | WelsMutexLock (&m_mutes); | ||
| 141 | |||
| 142 | IStrategy* pStrategy = m_pStgChain[iCurIdx]; | ||
| 143 | if (pStrategy) | ||
| 144 | eReturn = pStrategy->Uninit (0); | ||
| 145 | |||
| 146 | WelsMutexUnlock (&m_mutes); | ||
| 147 | |||
| 148 | return eReturn; | ||
| 149 | } | ||
| 150 | |||
| 151 | EResult CVpFrameWork::Flush (int32_t iType) { | ||
| 152 | EResult eReturn = RET_SUCCESS; | ||
| 153 | |||
| 154 | return eReturn; | ||
| 155 | } | ||
| 156 | |||
| 157 | EResult CVpFrameWork::Process (int32_t iType, SPixMap* pSrcPixMap, SPixMap* pDstPixMap) { | ||
| 158 | EResult eReturn = RET_NOTSUPPORTED; | ||
| 159 | EMethods eMethod = WelsVpGetValidMethod (iType); | ||
| 160 | int32_t iCurIdx = WelsStaticCast (int32_t, eMethod) - 1; | ||
| 161 | SPixMap sSrcPic; | ||
| 162 | SPixMap sDstPic; | ||
| 163 | memset (&sSrcPic, 0, sizeof (sSrcPic)); // confirmed_safe_unsafe_usage | ||
| 164 | memset (&sDstPic, 0, sizeof (sDstPic)); // confirmed_safe_unsafe_usage | ||
| 165 | |||
| 166 | if (pSrcPixMap) sSrcPic = *pSrcPixMap; | ||
| 167 | if (pDstPixMap) sDstPic = *pDstPixMap; | ||
| 168 | if (!CheckValid (eMethod, sSrcPic, sDstPic)) | ||
| 169 | return RET_INVALIDPARAM; | ||
| 170 | |||
| 171 | WelsMutexLock (&m_mutes); | ||
| 172 | |||
| 173 | IStrategy* pStrategy = m_pStgChain[iCurIdx]; | ||
| 174 | if (pStrategy) | ||
| 175 | eReturn = pStrategy->Process (0, &sSrcPic, &sDstPic); | ||
| 176 | |||
| 177 | WelsMutexUnlock (&m_mutes); | ||
| 178 | |||
| 179 | return eReturn; | ||
| 180 | } | ||
| 181 | |||
| 182 | EResult CVpFrameWork::Get (int32_t iType, void* pParam) { | ||
| 183 | EResult eReturn = RET_SUCCESS; | ||
| 184 | int32_t iCurIdx = WelsStaticCast (int32_t, WelsVpGetValidMethod (iType)) - 1; | ||
| 185 | |||
| 186 | if (!pParam) | ||
| 187 | return RET_INVALIDPARAM; | ||
| 188 | |||
| 189 | WelsMutexLock (&m_mutes); | ||
| 190 | |||
| 191 | IStrategy* pStrategy = m_pStgChain[iCurIdx]; | ||
| 192 | if (pStrategy) | ||
| 193 | eReturn = pStrategy->Get (0, pParam); | ||
| 194 | |||
| 195 | WelsMutexUnlock (&m_mutes); | ||
| 196 | |||
| 197 | return eReturn; | ||
| 198 | } | ||
| 199 | |||
| 200 | EResult CVpFrameWork::Set (int32_t iType, void* pParam) { | ||
| 201 | EResult eReturn = RET_SUCCESS; | ||
| 202 | int32_t iCurIdx = WelsStaticCast (int32_t, WelsVpGetValidMethod (iType)) - 1; | ||
| 203 | |||
| 204 | if (!pParam) | ||
| 205 | return RET_INVALIDPARAM; | ||
| 206 | |||
| 207 | WelsMutexLock (&m_mutes); | ||
| 208 | |||
| 209 | IStrategy* pStrategy = m_pStgChain[iCurIdx]; | ||
| 210 | if (pStrategy) | ||
| 211 | eReturn = pStrategy->Set (0, pParam); | ||
| 212 | |||
| 213 | WelsMutexUnlock (&m_mutes); | ||
| 214 | |||
| 215 | return eReturn; | ||
| 216 | } | ||
| 217 | |||
| 218 | EResult CVpFrameWork::SpecialFeature (int32_t iType, void* pIn, void* pOut) { | ||
| 219 | EResult eReturn = RET_SUCCESS; | ||
| 220 | |||
| 221 | return eReturn; | ||
| 222 | } | ||
| 223 | |||
| 224 | bool_t CVpFrameWork::CheckValid (EMethods eMethod, SPixMap& pSrcPixMap, SPixMap& pDstPixMap) { | ||
| 225 | bool_t eReturn = FALSE; | ||
| 226 | |||
| 227 | if (eMethod == METHOD_NULL) | ||
| 228 | goto exit; | ||
| 229 | |||
| 230 | if (eMethod != METHOD_COLORSPACE_CONVERT) { | ||
| 231 | if (pSrcPixMap.pPixel[0]) { | ||
| 232 | if (pSrcPixMap.eFormat != VIDEO_FORMAT_I420 && pSrcPixMap.eFormat != VIDEO_FORMAT_YV12) | ||
| 233 | goto exit; | ||
| 234 | } | ||
| 235 | if (pSrcPixMap.pPixel[0] && pDstPixMap.pPixel[0]) { | ||
| 236 | if (pDstPixMap.eFormat != pSrcPixMap.eFormat) | ||
| 237 | goto exit; | ||
| 238 | } | ||
| 239 | } | ||
| 240 | |||
| 241 | if (pSrcPixMap.pPixel[0]) { | ||
| 242 | if (pSrcPixMap.sRect.iRectWidth <= 0 || pSrcPixMap.sRect.iRectWidth > MAX_WIDTH || pSrcPixMap.sRect.iRectHeight <= 0 | ||
| 243 | || pSrcPixMap.sRect.iRectHeight > MAX_HEIGHT) | ||
| 244 | goto exit; | ||
| 245 | if (pSrcPixMap.sRect.iRectTop >= pSrcPixMap.sRect.iRectHeight | ||
| 246 | || pSrcPixMap.sRect.iRectLeft >= pSrcPixMap.sRect.iRectWidth || pSrcPixMap.sRect.iRectWidth > pSrcPixMap.iStride[0]) | ||
| 247 | goto exit; | ||
| 248 | } | ||
| 249 | if (pDstPixMap.pPixel[0]) { | ||
| 250 | if (pDstPixMap.sRect.iRectWidth <= 0 || pDstPixMap.sRect.iRectWidth > MAX_WIDTH || pDstPixMap.sRect.iRectHeight <= 0 | ||
| 251 | || pDstPixMap.sRect.iRectHeight > MAX_HEIGHT) | ||
| 252 | goto exit; | ||
| 253 | if (pDstPixMap.sRect.iRectTop >= pDstPixMap.sRect.iRectHeight | ||
| 254 | || pDstPixMap.sRect.iRectLeft >= pDstPixMap.sRect.iRectWidth || pDstPixMap.sRect.iRectWidth > pDstPixMap.iStride[0]) | ||
| 255 | goto exit; | ||
| 256 | } | ||
| 257 | eReturn = TRUE; | ||
| 258 | |||
| 259 | exit: | ||
| 260 | return eReturn; | ||
| 261 | } | ||
| 262 | |||
| 263 | IStrategy* CVpFrameWork::CreateStrategy (EMethods m_eMethod, int32_t iCpuFlag) { | ||
| 264 | IStrategy* pStrategy = NULL; | ||
| 265 | |||
| 266 | switch (m_eMethod) { | ||
| 267 | case METHOD_COLORSPACE_CONVERT: | ||
| 268 | //not support yet | ||
| 269 | break; | ||
| 270 | case METHOD_DENOISE: | ||
| 271 | pStrategy = WelsDynamicCast (IStrategy*, new CDenoiser (iCpuFlag)); | ||
| 272 | break; | ||
| 273 | case METHOD_SCENE_CHANGE_DETECTION: | ||
| 274 | pStrategy = WelsDynamicCast (IStrategy*, new CSceneChangeDetection (iCpuFlag)); | ||
| 275 | break; | ||
| 276 | case METHOD_DOWNSAMPLE: | ||
| 277 | pStrategy = WelsDynamicCast (IStrategy*, new CDownsampling (iCpuFlag)); | ||
| 278 | break; | ||
| 279 | case METHOD_VAA_STATISTICS: | ||
| 280 | pStrategy = WelsDynamicCast (IStrategy*, new CVAACalculation (iCpuFlag)); | ||
| 281 | break; | ||
| 282 | case METHOD_BACKGROUND_DETECTION: | ||
| 283 | pStrategy = WelsDynamicCast (IStrategy*, new CBackgroundDetection (iCpuFlag)); | ||
| 284 | break; | ||
| 285 | case METHOD_ADAPTIVE_QUANT: | ||
| 286 | pStrategy = WelsDynamicCast (IStrategy*, new CAdaptiveQuantization (iCpuFlag)); | ||
| 287 | break; | ||
| 288 | case METHOD_COMPLEXITY_ANALYSIS: | ||
| 289 | pStrategy = WelsDynamicCast (IStrategy*, new CComplexityAnalysis (iCpuFlag)); | ||
| 290 | break; | ||
| 291 | case METHOD_IMAGE_ROTATE: | ||
| 292 | pStrategy = WelsDynamicCast (IStrategy*, new CImageRotating (iCpuFlag)); | ||
| 293 | break; | ||
| 294 | default: | ||
| 295 | break; | ||
| 296 | } | ||
| 297 | |||
| 298 | return pStrategy; | ||
| 299 | } | ||
| 300 | |||
| 301 | WELSVP_NAMESPACE_END | ||
| @@ -0,0 +1,130 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2011-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file : WelsFrameWork.h | ||
| 32 | * | ||
| 33 | * \brief : framework of wels video processor class | ||
| 34 | * | ||
| 35 | * \date : 2011/01/04 | ||
| 36 | * | ||
| 37 | * \description : | ||
| 38 | * | ||
| 39 | ************************************************************************************* | ||
| 40 | */ | ||
| 41 | |||
| 42 | #ifndef WELSVP_WELSFRAMEWORK_H | ||
| 43 | #define WELSVP_WELSFRAMEWORK_H | ||
| 44 | |||
| 45 | #include "../../interface/IWelsVP.h" | ||
| 46 | #include "util.h" | ||
| 47 | #include "thread.h" | ||
| 48 | |||
| 49 | WELSVP_NAMESPACE_BEGIN | ||
| 50 | |||
| 51 | EResult CreateSpecificVpInterface (IWelsVP** ppCtx); | ||
| 52 | EResult DestroySpecificVpInterface (IWelsVP* pCtx); | ||
| 53 | |||
| 54 | EResult CreateSpecificVpInterface (IWelsVPc** ppCtx); | ||
| 55 | EResult DestroySpecificVpInterface (IWelsVPc* pCtx); | ||
| 56 | |||
| 57 | #define MAX_STRATEGY_NUM (METHOD_MASK - 1) | ||
| 58 | |||
| 59 | class IStrategy : public IWelsVP { | ||
| 60 | public: | ||
| 61 | IStrategy() { | ||
| 62 | m_eMethod = METHOD_NULL; | ||
| 63 | m_eFormat = VIDEO_FORMAT_I420; | ||
| 64 | m_iIndex = 0; | ||
| 65 | m_bInit = FALSE; | ||
| 66 | }; | ||
| 67 | |||
| 68 | virtual ~IStrategy() {} | ||
| 69 | |||
| 70 | public: | ||
| 71 | virtual EResult Init (int32_t iType, void* pCfg) { | ||
| 72 | return RET_SUCCESS; | ||
| 73 | } | ||
| 74 | virtual EResult Uninit (int32_t iType) { | ||
| 75 | return RET_SUCCESS; | ||
| 76 | } | ||
| 77 | virtual EResult Flush (int32_t iType) { | ||
| 78 | return RET_SUCCESS; | ||
| 79 | } | ||
| 80 | virtual EResult Get (int32_t iType, void* pParam) { | ||
| 81 | return RET_SUCCESS; | ||
| 82 | } | ||
| 83 | virtual EResult Set (int32_t iType, void* pParam) { | ||
| 84 | return RET_SUCCESS; | ||
| 85 | } | ||
| 86 | virtual EResult SpecialFeature (int32_t iType, void* pIn, void* pOut) { | ||
| 87 | return RET_SUCCESS; | ||
| 88 | } | ||
| 89 | virtual EResult Process (int32_t iType, SPixMap* pSrc, SPixMap* pDst) = 0; | ||
| 90 | |||
| 91 | public: | ||
| 92 | EMethods m_eMethod; | ||
| 93 | EVideoFormat m_eFormat; | ||
| 94 | int32_t m_iIndex; | ||
| 95 | bool_t m_bInit; | ||
| 96 | }; | ||
| 97 | |||
| 98 | class CVpFrameWork : public IWelsVP { | ||
| 99 | public: | ||
| 100 | CVpFrameWork (uint32_t uiThreadsNum, EResult& ret); | ||
| 101 | ~CVpFrameWork(); | ||
| 102 | |||
| 103 | public: | ||
| 104 | EResult Init (int32_t iType, void* pCfg); | ||
| 105 | |||
| 106 | EResult Uninit (int32_t iType); | ||
| 107 | |||
| 108 | EResult Flush (int32_t iType); | ||
| 109 | |||
| 110 | EResult Process (int32_t iType, SPixMap* pSrc, SPixMap* pDst); | ||
| 111 | |||
| 112 | EResult Get (int32_t iType, void* pParam); | ||
| 113 | |||
| 114 | EResult Set (int32_t iType, void* pParam); | ||
| 115 | |||
| 116 | EResult SpecialFeature (int32_t iType, void* pIn, void* pOut); | ||
| 117 | |||
| 118 | private: | ||
| 119 | bool_t CheckValid (EMethods eMethod, SPixMap& sSrc, SPixMap& sDst); | ||
| 120 | IStrategy* CreateStrategy (EMethods eMethod, int32_t iCpuFlag); | ||
| 121 | |||
| 122 | private: | ||
| 123 | IStrategy* m_pStgChain[MAX_STRATEGY_NUM]; | ||
| 124 | |||
| 125 | WELS_MUTEX m_mutes; | ||
| 126 | }; | ||
| 127 | |||
| 128 | WELSVP_NAMESPACE_END | ||
| 129 | |||
| 130 | #endif | ||
| @@ -0,0 +1,96 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include "WelsFrameWork.h" | ||
| 34 | |||
| 35 | /////////////////////////////////////////////////////////////////////// | ||
| 36 | |||
| 37 | WELSVP_NAMESPACE_BEGIN | ||
| 38 | |||
| 39 | EResult Init (void* pCtx, int32_t iType, void* pCfg) { | ||
| 40 | return pCtx ? WelsStaticCast (IWelsVP*, pCtx)->Init (iType, pCfg) : RET_INVALIDPARAM; | ||
| 41 | } | ||
| 42 | EResult Uninit (void* pCtx, int32_t iType) { | ||
| 43 | return pCtx ? WelsStaticCast (IWelsVP*, pCtx)->Uninit (iType) : RET_INVALIDPARAM; | ||
| 44 | } | ||
| 45 | EResult Flush (void* pCtx, int32_t iType) { | ||
| 46 | return pCtx ? WelsStaticCast (IWelsVP*, pCtx)->Flush (iType) : RET_INVALIDPARAM; | ||
| 47 | } | ||
| 48 | EResult Process (void* pCtx, int32_t iType, SPixMap* pSrc, SPixMap* dst) { | ||
| 49 | return pCtx ? WelsStaticCast (IWelsVP*, pCtx)->Process (iType, pSrc, dst) : RET_INVALIDPARAM; | ||
| 50 | } | ||
| 51 | EResult Get (void* pCtx, int32_t iType, void* pParam) { | ||
| 52 | return pCtx ? WelsStaticCast (IWelsVP*, pCtx)->Get (iType, pParam) : RET_INVALIDPARAM; | ||
| 53 | } | ||
| 54 | EResult Set (void* pCtx, int32_t iType, void* pParam) { | ||
| 55 | return pCtx ? WelsStaticCast (IWelsVP*, pCtx)->Set (iType, pParam) : RET_INVALIDPARAM; | ||
| 56 | } | ||
| 57 | EResult SpecialFeature (void* pCtx, int32_t iType, void* pIn, void* pOut) { | ||
| 58 | return pCtx ? WelsStaticCast (IWelsVP*, pCtx)->SpecialFeature (iType, pIn, pOut) : RET_INVALIDPARAM; | ||
| 59 | } | ||
| 60 | |||
| 61 | /////////////////////////////////////////////////////////////////////////////// | ||
| 62 | |||
| 63 | EResult CreateSpecificVpInterface (IWelsVPc** pCtx) { | ||
| 64 | EResult ret = RET_FAILED; | ||
| 65 | IWelsVP* pWelsVP = NULL; | ||
| 66 | |||
| 67 | ret = CreateSpecificVpInterface (&pWelsVP); | ||
| 68 | if (ret == RET_SUCCESS) { | ||
| 69 | IWelsVPc* pVPc = new IWelsVPc; | ||
| 70 | if (pVPc) { | ||
| 71 | pVPc->Init = Init; | ||
| 72 | pVPc->Uninit = Uninit; | ||
| 73 | pVPc->Flush = Flush; | ||
| 74 | pVPc->Process = Process; | ||
| 75 | pVPc->Get = Get; | ||
| 76 | pVPc->Set = Set; | ||
| 77 | pVPc->SpecialFeature = SpecialFeature; | ||
| 78 | pVPc->pCtx = WelsStaticCast (void*, pWelsVP); | ||
| 79 | *pCtx = pVPc; | ||
| 80 | } else | ||
| 81 | ret = RET_OUTOFMEMORY; | ||
| 82 | } | ||
| 83 | |||
| 84 | return ret; | ||
| 85 | } | ||
| 86 | |||
| 87 | EResult DestroySpecificVpInterface (IWelsVPc* pCtx) { | ||
| 88 | if (pCtx) { | ||
| 89 | DestroySpecificVpInterface (WelsStaticCast (IWelsVP*, pCtx->pCtx)); | ||
| 90 | _SafeDelete (pCtx); | ||
| 91 | } | ||
| 92 | |||
| 93 | return RET_SUCCESS; | ||
| 94 | } | ||
| 95 | |||
| 96 | WELSVP_NAMESPACE_END | ||
Binary file not shown.
| @@ -0,0 +1,36 @@ | |||
| 1 | ;*! | ||
| 2 | ;* \copy | ||
| 3 | ;* Copyright (c) 2011-2013, Cisco Systems | ||
| 4 | ;* All rights reserved. | ||
| 5 | ;* | ||
| 6 | ;* Redistribution and use in source and binary forms, with or without | ||
| 7 | ;* modification, are permitted provided that the following conditions | ||
| 8 | ;* are met: | ||
| 9 | ;* | ||
| 10 | ;* * Redistributions of source code must retain the above copyright | ||
| 11 | ;* notice, this list of conditions and the following disclaimer. | ||
| 12 | ;* | ||
| 13 | ;* * Redistributions in binary form must reproduce the above copyright | ||
| 14 | ;* notice, this list of conditions and the following disclaimer in | ||
| 15 | ;* the documentation and/or other materials provided with the | ||
| 16 | ;* distribution. | ||
| 17 | ;* | ||
| 18 | ;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | ;* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | ;* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | ;* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | ;* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | ;* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | ;* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | ;* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | ;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | ;* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | ;* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | ;* POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | ;* | ||
| 31 | ;* | ||
| 32 | |||
| 33 | LIBRARY welsvp.dll | ||
| 34 | EXPORTS | ||
| 35 | CreateVpInterface PRIVATE | ||
| 36 | DestroyVpInterface PRIVATE | ||
| @@ -0,0 +1,115 @@ | |||
| 1 | // Microsoft Visual C++ generated resource script. | ||
| 2 | // | ||
| 3 | #include "resource.h" | ||
| 4 | |||
| 5 | #define APSTUDIO_READONLY_SYMBOLS | ||
| 6 | ///////////////////////////////////////////////////////////////////////////// | ||
| 7 | // | ||
| 8 | // Generated from the TEXTINCLUDE 2 resource. | ||
| 9 | // | ||
| 10 | #include "windows.h" | ||
| 11 | |||
| 12 | ///////////////////////////////////////////////////////////////////////////// | ||
| 13 | #undef APSTUDIO_READONLY_SYMBOLS | ||
| 14 | |||
| 15 | ///////////////////////////////////////////////////////////////////////////// | ||
| 16 | // Chinese (P.R.C.) resources | ||
| 17 | |||
| 18 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) | ||
| 19 | #ifdef _WIN32 | ||
| 20 | LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED | ||
| 21 | #pragma code_page(936) | ||
| 22 | #endif //_WIN32 | ||
| 23 | |||
| 24 | #ifdef APSTUDIO_INVOKED | ||
| 25 | ///////////////////////////////////////////////////////////////////////////// | ||
| 26 | // | ||
| 27 | // TEXTINCLUDE | ||
| 28 | // | ||
| 29 | |||
| 30 | 1 TEXTINCLUDE | ||
| 31 | BEGIN | ||
| 32 | "resource.h\0" | ||
| 33 | END | ||
| 34 | |||
| 35 | 2 TEXTINCLUDE | ||
| 36 | BEGIN | ||
| 37 | "#include ""windows.h""\r\n" | ||
| 38 | "\0" | ||
| 39 | END | ||
| 40 | |||
| 41 | 3 TEXTINCLUDE | ||
| 42 | BEGIN | ||
| 43 | "\r\n" | ||
| 44 | "\0" | ||
| 45 | END | ||
| 46 | |||
| 47 | #endif // APSTUDIO_INVOKED | ||
| 48 | |||
| 49 | #endif // Chinese (P.R.C.) resources | ||
| 50 | ///////////////////////////////////////////////////////////////////////////// | ||
| 51 | |||
| 52 | |||
| 53 | ///////////////////////////////////////////////////////////////////////////// | ||
| 54 | // English (U.S.) resources | ||
| 55 | |||
| 56 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) | ||
| 57 | #ifdef _WIN32 | ||
| 58 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US | ||
| 59 | #pragma code_page(1252) | ||
| 60 | #endif //_WIN32 | ||
| 61 | |||
| 62 | ///////////////////////////////////////////////////////////////////////////// | ||
| 63 | // | ||
| 64 | // Version | ||
| 65 | // | ||
| 66 | |||
| 67 | VS_VERSION_INFO VERSIONINFO | ||
| 68 | FILEVERSION 0,0,0,0 | ||
| 69 | PRODUCTVERSION 0,0,0,0 | ||
| 70 | FILEFLAGSMASK 0x3fL | ||
| 71 | #ifdef _DEBUG | ||
| 72 | FILEFLAGS 0x1L | ||
| 73 | #else | ||
| 74 | FILEFLAGS 0x0L | ||
| 75 | #endif | ||
| 76 | FILEOS 0x40004L | ||
| 77 | FILETYPE 0x2L | ||
| 78 | FILESUBTYPE 0x0L | ||
| 79 | BEGIN | ||
| 80 | BLOCK "StringFileInfo" | ||
| 81 | BEGIN | ||
| 82 | BLOCK "040904b0" | ||
| 83 | BEGIN | ||
| 84 | VALUE "Comments", "Cisco OpenH264 video preprocessing" | ||
| 85 | VALUE "CompanyName", "Cisco Systems" | ||
| 86 | VALUE "FileDescription", "Cisco OpenH264 video preprocessing" | ||
| 87 | VALUE "FileVersion", "0, 0, 0, 0" | ||
| 88 | VALUE "InternalName", "welsvp.dll" | ||
| 89 | VALUE "LegalCopyright", "� 2011-2015 Cisco and/or its affiliates. All rights reserved." | ||
| 90 | VALUE "OriginalFilename", "welsvp.dll" | ||
| 91 | VALUE "ProductName", "Cisco OpenH264 video preprocessing" | ||
| 92 | VALUE "ProductVersion", "0, 0, 0, 0" | ||
| 93 | END | ||
| 94 | END | ||
| 95 | BLOCK "VarFileInfo" | ||
| 96 | BEGIN | ||
| 97 | VALUE "Translation", 0x409, 1200 | ||
| 98 | END | ||
| 99 | END | ||
| 100 | |||
| 101 | #endif // English (U.S.) resources | ||
| 102 | ///////////////////////////////////////////////////////////////////////////// | ||
| 103 | |||
| 104 | |||
| 105 | |||
| 106 | #ifndef APSTUDIO_INVOKED | ||
| 107 | ///////////////////////////////////////////////////////////////////////////// | ||
| 108 | // | ||
| 109 | // Generated from the TEXTINCLUDE 3 resource. | ||
| 110 | // | ||
| 111 | |||
| 112 | |||
| 113 | ///////////////////////////////////////////////////////////////////////////// | ||
| 114 | #endif // not APSTUDIO_INVOKED | ||
| 115 | |||
| @@ -0,0 +1,196 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2009-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file cpu.c | ||
| 32 | * | ||
| 33 | * \brief CPU compatibility detection | ||
| 34 | * | ||
| 35 | * \date 04/29/2009 Created | ||
| 36 | * | ||
| 37 | ************************************************************************************* | ||
| 38 | */ | ||
| 39 | |||
| 40 | #include "util.h" | ||
| 41 | #include "cpu.h" | ||
| 42 | |||
| 43 | WELSVP_NAMESPACE_BEGIN | ||
| 44 | |||
| 45 | #define CPU_Vender_AMD "AuthenticAMD" | ||
| 46 | #define CPU_Vender_INTEL "GenuineIntel" | ||
| 47 | #define CPU_Vender_CYRIX "CyrixInstead" | ||
| 48 | |||
| 49 | |||
| 50 | #if defined(X86_ASM) | ||
| 51 | |||
| 52 | uint32_t WelsCPUFeatureDetect (int32_t* pNumberOfLogicProcessors) { | ||
| 53 | uint32_t uiCPU = 0; | ||
| 54 | uint32_t uiFeatureA = 0, uiFeatureB = 0, uiFeatureC = 0, uiFeatureD = 0; | ||
| 55 | int32_t CacheLineSize = 0; | ||
| 56 | int8_t chVenderName[16] = { 0 }; | ||
| 57 | |||
| 58 | if (!WelsCPUIdVerify()) { | ||
| 59 | /* cpuid is not supported in cpu */ | ||
| 60 | return 0; | ||
| 61 | } | ||
| 62 | |||
| 63 | WelsCPUId (0, &uiFeatureA, (uint32_t*)&chVenderName[0], (uint32_t*)&chVenderName[8], (uint32_t*)&chVenderName[4]); | ||
| 64 | if (uiFeatureA == 0) { | ||
| 65 | /* maximum input value for basic cpuid information */ | ||
| 66 | return 0; | ||
| 67 | } | ||
| 68 | |||
| 69 | WelsCPUId (1, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD); | ||
| 70 | if ((uiFeatureD & 0x00800000) == 0) { | ||
| 71 | /* Basic MMX technology is not support in cpu, mean nothing for us so return here */ | ||
| 72 | return 0; | ||
| 73 | } | ||
| 74 | |||
| 75 | uiCPU = WELS_CPU_MMX; | ||
| 76 | if (uiFeatureD & 0x02000000) { | ||
| 77 | /* SSE technology is identical to AMD MMX extensions */ | ||
| 78 | uiCPU |= WELS_CPU_MMXEXT | WELS_CPU_SSE; | ||
| 79 | } | ||
| 80 | if (uiFeatureD & 0x04000000) { | ||
| 81 | /* SSE2 support here */ | ||
| 82 | uiCPU |= WELS_CPU_SSE2; | ||
| 83 | } | ||
| 84 | if (uiFeatureD & 0x00000001) { | ||
| 85 | /* x87 FPU on-chip checking */ | ||
| 86 | uiCPU |= WELS_CPU_FPU; | ||
| 87 | } | ||
| 88 | if (uiFeatureD & 0x00008000) { | ||
| 89 | /* CMOV instruction checking */ | ||
| 90 | uiCPU |= WELS_CPU_CMOV; | ||
| 91 | } | ||
| 92 | if (!strcmp ((const str_t*)chVenderName, CPU_Vender_INTEL)) { // confirmed_safe_unsafe_usage | ||
| 93 | if (uiFeatureD & 0x10000000) { | ||
| 94 | /* Multi-Threading checking: contains of multiple logic processors */ | ||
| 95 | uiCPU |= WELS_CPU_HTT; | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | if (uiFeatureC & 0x00000001) { | ||
| 100 | /* SSE3 support here */ | ||
| 101 | uiCPU |= WELS_CPU_SSE3; | ||
| 102 | } | ||
| 103 | if (uiFeatureC & 0x00000200) { | ||
| 104 | /* SSSE3 support here */ | ||
| 105 | uiCPU |= WELS_CPU_SSSE3; | ||
| 106 | } | ||
| 107 | if (uiFeatureC & 0x00080000) { | ||
| 108 | /* SSE4.1 support here, 45nm Penryn processor */ | ||
| 109 | uiCPU |= WELS_CPU_SSE41; | ||
| 110 | } | ||
| 111 | if (uiFeatureC & 0x00100000) { | ||
| 112 | /* SSE4.2 support here, next generation Nehalem processor */ | ||
| 113 | uiCPU |= WELS_CPU_SSE42; | ||
| 114 | } | ||
| 115 | if (WelsCPUSupportAVX (uiFeatureA, uiFeatureC)) { // | ||
| 116 | /* AVX supported */ | ||
| 117 | uiCPU |= WELS_CPU_AVX; | ||
| 118 | } | ||
| 119 | if (WelsCPUSupportFMA (uiFeatureA, uiFeatureC)) { // | ||
| 120 | /* AVX FMA supported */ | ||
| 121 | uiCPU |= WELS_CPU_FMA; | ||
| 122 | } | ||
| 123 | if (uiFeatureC & 0x02000000) { | ||
| 124 | /* AES checking */ | ||
| 125 | uiCPU |= WELS_CPU_AES; | ||
| 126 | } | ||
| 127 | if (uiFeatureC & 0x00400000) { | ||
| 128 | /* MOVBE checking */ | ||
| 129 | uiCPU |= WELS_CPU_MOVBE; | ||
| 130 | } | ||
| 131 | |||
| 132 | if (pNumberOfLogicProcessors != NULL) { | ||
| 133 | // HTT enabled on chip | ||
| 134 | *pNumberOfLogicProcessors = (uiFeatureB & 0x00ff0000) >> 16; // feature bits: 23-16 on returned EBX | ||
| 135 | } | ||
| 136 | |||
| 137 | WelsCPUId (0x80000000, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD); | ||
| 138 | |||
| 139 | if ((!strcmp ((const str_t*)chVenderName, CPU_Vender_AMD)) | ||
| 140 | && (uiFeatureA >= 0x80000001)) { // confirmed_safe_unsafe_usage | ||
| 141 | WelsCPUId (0x80000001, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD); | ||
| 142 | if (uiFeatureD & 0x00400000) { | ||
| 143 | uiCPU |= WELS_CPU_MMXEXT; | ||
| 144 | } | ||
| 145 | if (uiFeatureD & 0x80000000) { | ||
| 146 | uiCPU |= WELS_CPU_3DNOW; | ||
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 150 | if (!strcmp ((const str_t*)chVenderName, CPU_Vender_INTEL)) { // confirmed_safe_unsafe_usage | ||
| 151 | int32_t family, model; | ||
| 152 | |||
| 153 | WelsCPUId (1, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD); | ||
| 154 | family = ((uiFeatureA >> 8) & 0xf) + ((uiFeatureA >> 20) & 0xff); | ||
| 155 | model = ((uiFeatureA >> 4) & 0xf) + ((uiFeatureA >> 12) & 0xf0); | ||
| 156 | |||
| 157 | if ((family == 6) && (model == 9 || model == 13 || model == 14)) { | ||
| 158 | uiCPU &= ~ (WELS_CPU_SSE2 | WELS_CPU_SSE3); | ||
| 159 | } | ||
| 160 | } | ||
| 161 | |||
| 162 | // get cache line size | ||
| 163 | if ((!strcmp ((const str_t*)chVenderName, CPU_Vender_INTEL)) | ||
| 164 | || ! (strcmp ((const str_t*)chVenderName, CPU_Vender_CYRIX))) { // confirmed_safe_unsafe_usage | ||
| 165 | WelsCPUId (1, &uiFeatureA, &uiFeatureB, &uiFeatureC, &uiFeatureD); | ||
| 166 | |||
| 167 | CacheLineSize = (uiFeatureB & 0xff00) >> | ||
| 168 | 5; // ((clflush_line_size >> 8) << 3), CLFLUSH_line_size * 8 = CacheLineSize_in_byte | ||
| 169 | |||
| 170 | if (CacheLineSize == 128) { | ||
| 171 | uiCPU |= WELS_CPU_CACHELINE_128; | ||
| 172 | } else if (CacheLineSize == 64) { | ||
| 173 | uiCPU |= WELS_CPU_CACHELINE_64; | ||
| 174 | } else if (CacheLineSize == 32) { | ||
| 175 | uiCPU |= WELS_CPU_CACHELINE_32; | ||
| 176 | } else if (CacheLineSize == 16) { | ||
| 177 | uiCPU |= WELS_CPU_CACHELINE_16; | ||
| 178 | } | ||
| 179 | } | ||
| 180 | |||
| 181 | return uiCPU; | ||
| 182 | } | ||
| 183 | |||
| 184 | |||
| 185 | void WelsCPURestore (const uint32_t kuiCPU) { | ||
| 186 | if (kuiCPU & (WELS_CPU_MMX | WELS_CPU_MMXEXT | WELS_CPU_3DNOW | WELS_CPU_3DNOWEXT)) { | ||
| 187 | WelsEmms(); | ||
| 188 | } | ||
| 189 | } | ||
| 190 | |||
| 191 | #endif | ||
| 192 | |||
| 193 | |||
| 194 | WELSVP_NAMESPACE_END | ||
| 195 | |||
| 196 | |||
| @@ -0,0 +1,102 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2009-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file cpu.h | ||
| 32 | * | ||
| 33 | * \brief CPU feature compatibility detection | ||
| 34 | * | ||
| 35 | * \date 04/29/2009 Created | ||
| 36 | * | ||
| 37 | ************************************************************************************* | ||
| 38 | */ | ||
| 39 | |||
| 40 | #ifndef WELSVP_CPU_H | ||
| 41 | #define WELSVP_CPU_H | ||
| 42 | |||
| 43 | #include "typedef.h" | ||
| 44 | |||
| 45 | WELSVP_NAMESPACE_BEGIN | ||
| 46 | |||
| 47 | /* | ||
| 48 | * WELS CPU feature flags | ||
| 49 | */ | ||
| 50 | #define WELS_CPU_MMX 0x00000001 /* mmx */ | ||
| 51 | #define WELS_CPU_MMXEXT 0x00000002 /* mmx-ext*/ | ||
| 52 | #define WELS_CPU_SSE 0x00000004 /* sse */ | ||
| 53 | #define WELS_CPU_SSE2 0x00000008 /* sse 2 */ | ||
| 54 | #define WELS_CPU_SSE3 0x00000010 /* sse 3 */ | ||
| 55 | #define WELS_CPU_SSE41 0x00000020 /* sse 4.1 */ | ||
| 56 | #define WELS_CPU_3DNOW 0x00000040 /* 3dnow! */ | ||
| 57 | #define WELS_CPU_3DNOWEXT 0x00000080 /* 3dnow! ext */ | ||
| 58 | #define WELS_CPU_ALTIVEC 0x00000100 /* altivec */ | ||
| 59 | #define WELS_CPU_SSSE3 0x00000200 /* ssse3 */ | ||
| 60 | #define WELS_CPU_SSE42 0x00000400 /* sse 4.2 */ | ||
| 61 | |||
| 62 | /* CPU features application extensive */ | ||
| 63 | #define WELS_CPU_AVX 0x00000800 /* Advanced Vector eXtentions */ | ||
| 64 | #define WELS_CPU_FPU 0x00001000 /* x87-FPU on chip */ | ||
| 65 | #define WELS_CPU_HTT 0x00002000 /* Hyper-Threading Technology (HTT), Multi-threading enabled feature: | ||
| 66 | physical processor package is capable of supporting more than one logic processor | ||
| 67 | */ | ||
| 68 | #define WELS_CPU_CMOV 0x00004000 /* Conditional Move Instructions, | ||
| 69 | also if x87-FPU is present at indicated by the CPUID.FPU feature bit, then FCOMI and FCMOV are supported | ||
| 70 | */ | ||
| 71 | #define WELS_CPU_MOVBE 0x00008000 /* MOVBE instruction */ | ||
| 72 | #define WELS_CPU_AES 0x00010000 /* AES instruction extensions */ | ||
| 73 | #define WELS_CPU_FMA 0x00020000 /* AVX VEX FMA instruction sets */ | ||
| 74 | |||
| 75 | #define WELS_CPU_CACHELINE_16 0x10000000 /* CacheLine Size 16 */ | ||
| 76 | #define WELS_CPU_CACHELINE_32 0x20000000 /* CacheLine Size 32 */ | ||
| 77 | #define WELS_CPU_CACHELINE_64 0x40000000 /* CacheLine Size 64 */ | ||
| 78 | #define WELS_CPU_CACHELINE_128 0x80000000 /* CacheLine Size 128 */ | ||
| 79 | |||
| 80 | /* | ||
| 81 | * Interfaces for CPU core feature detection as below | ||
| 82 | */ | ||
| 83 | |||
| 84 | #ifdef X86_ASM | ||
| 85 | WELSVP_EXTERN_C_BEGIN | ||
| 86 | |||
| 87 | int32_t WelsCPUIdVerify(); | ||
| 88 | |||
| 89 | void WelsCPUId (uint32_t uiIndex, uint32_t* pFeatureA, uint32_t* pFeatureB, uint32_t* pFeatureC, uint32_t* pFeatureD); | ||
| 90 | int32_t WelsCPUSupportAVX (uint32_t eax, uint32_t ecx); | ||
| 91 | int32_t WelsCPUSupportFMA (uint32_t eax, uint32_t ecx); | ||
| 92 | |||
| 93 | void WelsEmms(); | ||
| 94 | |||
| 95 | WELSVP_EXTERN_C_END | ||
| 96 | #endif | ||
| 97 | |||
| 98 | uint32_t WelsCPUFeatureDetect (int32_t* pNumberOfLogicProcessors); | ||
| 99 | |||
| 100 | WELSVP_NAMESPACE_END | ||
| 101 | |||
| 102 | #endif | ||
| @@ -0,0 +1,117 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include "memory.h" | ||
| 34 | |||
| 35 | WELSVP_NAMESPACE_BEGIN | ||
| 36 | ///////////////////////////////////////////////////////////////////////////////// | ||
| 37 | |||
| 38 | void* WelsMalloc (const uint32_t kuiSize, str_t* pTag) { | ||
| 39 | const int32_t kiSizeVoidPointer = sizeof (void**); | ||
| 40 | const int32_t kiSizeInt32 = sizeof (int32_t); | ||
| 41 | const int32_t kiAlignedBytes = ALIGNBYTES - 1; | ||
| 42 | |||
| 43 | uint8_t* pBuf = (uint8_t*) ::malloc (kuiSize + kiAlignedBytes + kiSizeVoidPointer + kiSizeInt32); | ||
| 44 | uint8_t* pAlignedBuf = NULL; | ||
| 45 | |||
| 46 | if (NULL == pBuf) | ||
| 47 | return NULL; | ||
| 48 | |||
| 49 | // to fill zero values | ||
| 50 | WelsMemset (pBuf, 0, kuiSize + kiAlignedBytes + kiSizeVoidPointer + kiSizeInt32); | ||
| 51 | |||
| 52 | pAlignedBuf = pBuf + kiAlignedBytes + kiSizeVoidPointer + kiSizeInt32; | ||
| 53 | pAlignedBuf -= WelsCastFromPointer (pAlignedBuf) & kiAlignedBytes; | ||
| 54 | * ((void**) (pAlignedBuf - kiSizeVoidPointer)) = pBuf; | ||
| 55 | * ((int32_t*) (pAlignedBuf - (kiSizeVoidPointer + kiSizeInt32))) = kuiSize; | ||
| 56 | |||
| 57 | return (pAlignedBuf); | ||
| 58 | } | ||
| 59 | |||
| 60 | ///////////////////////////////////////////////////////////////////////////// | ||
| 61 | |||
| 62 | void WelsFree (void* pPointer, str_t* pTag) { | ||
| 63 | if (pPointer) { | ||
| 64 | ::free (* (((void**) pPointer) - 1)); | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | ///////////////////////////////////////////////////////////////////////////// | ||
| 69 | |||
| 70 | void* InternalReallocate (void* pPointer, const uint32_t kuiSize, str_t* pTag) { | ||
| 71 | uint32_t iOldSize = 0; | ||
| 72 | uint8_t* pNew = NULL; | ||
| 73 | if (pPointer != NULL) | ||
| 74 | iOldSize = * ((int32_t*) ((uint8_t*) pPointer - sizeof (void**) - sizeof (int32_t))); | ||
| 75 | else | ||
| 76 | return WelsMalloc (kuiSize, pTag); | ||
| 77 | |||
| 78 | pNew = (uint8_t*)WelsMalloc (kuiSize, pTag); | ||
| 79 | if (0 == pNew) { | ||
| 80 | if (iOldSize > 0 && kuiSize > 0 && iOldSize >= kuiSize) | ||
| 81 | return (pPointer); | ||
| 82 | return 0; | ||
| 83 | } else if (iOldSize > 0 && kuiSize > 0) | ||
| 84 | memcpy (pNew, pPointer, (iOldSize < kuiSize) ? iOldSize : kuiSize); | ||
| 85 | else | ||
| 86 | return 0; | ||
| 87 | |||
| 88 | WelsFree (pPointer, pTag); | ||
| 89 | return (pNew); | ||
| 90 | } | ||
| 91 | |||
| 92 | ///////////////////////////////////////////////////////////////////////////// | ||
| 93 | |||
| 94 | void* WelsRealloc (void* pPointer, uint32_t* pRealSize, const uint32_t kuiSize, str_t* pTag) { | ||
| 95 | const uint32_t kuiOldSize = *pRealSize; | ||
| 96 | uint32_t kuiNewSize = 0; | ||
| 97 | void* pLocalPointer = NULL; | ||
| 98 | if (kuiOldSize >= kuiSize) // large enough of original block, so do nothing | ||
| 99 | return (pPointer); | ||
| 100 | |||
| 101 | // new request | ||
| 102 | kuiNewSize = kuiSize + 15; | ||
| 103 | kuiNewSize -= (kuiNewSize & 15); | ||
| 104 | kuiNewSize += 32; | ||
| 105 | |||
| 106 | pLocalPointer = InternalReallocate (pPointer, kuiNewSize, pTag); | ||
| 107 | if (NULL != pLocalPointer) { | ||
| 108 | *pRealSize = kuiNewSize; | ||
| 109 | return (pLocalPointer); | ||
| 110 | } else { | ||
| 111 | return NULL; | ||
| 112 | } | ||
| 113 | |||
| 114 | return NULL; // something wrong | ||
| 115 | } | ||
| 116 | |||
| 117 | WELSVP_NAMESPACE_END | ||
| @@ -0,0 +1,110 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2011-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file : memory.h | ||
| 32 | * | ||
| 33 | * \brief : memory definition for wels video processor class | ||
| 34 | * | ||
| 35 | * \date : 2011/02/22 | ||
| 36 | * | ||
| 37 | * \description : | ||
| 38 | * | ||
| 39 | ************************************************************************************* | ||
| 40 | */ | ||
| 41 | |||
| 42 | #ifndef WELSVP_MEMORY_H | ||
| 43 | #define WELSVP_MEMORY_H | ||
| 44 | |||
| 45 | #include "util.h" | ||
| 46 | #include "typedef.h" | ||
| 47 | |||
| 48 | WELSVP_NAMESPACE_BEGIN | ||
| 49 | |||
| 50 | inline_t void* WelsMemset (void* pPointer, int32_t iValue, uint32_t uiSize) { | ||
| 51 | return ::memset (pPointer, iValue, uiSize); | ||
| 52 | } | ||
| 53 | |||
| 54 | inline_t void* WelsMemcpy (void* pDst, const void* kpSrc, uint32_t uiSize) { | ||
| 55 | return ::memcpy (pDst, kpSrc, uiSize); | ||
| 56 | } | ||
| 57 | |||
| 58 | inline_t int32_t WelsMemcmp (const void* kpBuf1, const void* kpBuf2, uint32_t uiSize) { | ||
| 59 | return ::memcmp (kpBuf1, kpBuf2, uiSize); | ||
| 60 | } | ||
| 61 | |||
| 62 | /*! | ||
| 63 | ************************************************************************************* | ||
| 64 | * \brief malloc with zero filled utilization in Wels | ||
| 65 | * | ||
| 66 | * \param i_size uiSize of memory block required | ||
| 67 | * | ||
| 68 | * \return allocated memory pointer exactly, failed in case of NULL return | ||
| 69 | * | ||
| 70 | * \note N/A | ||
| 71 | ************************************************************************************* | ||
| 72 | */ | ||
| 73 | void* WelsMalloc (const uint32_t kuiSize, str_t* pTag = NULL); | ||
| 74 | |||
| 75 | /*! | ||
| 76 | ************************************************************************************* | ||
| 77 | * \brief free utilization in Wels | ||
| 78 | * | ||
| 79 | * \param p data pointer to be free. | ||
| 80 | * i.e, uint8_t *p = actual data to be free, argv = &p. | ||
| 81 | * | ||
| 82 | * \return NONE | ||
| 83 | * | ||
| 84 | * \note N/A | ||
| 85 | ************************************************************************************* | ||
| 86 | */ | ||
| 87 | void WelsFree (void* pPointer, str_t* pTag = NULL); | ||
| 88 | |||
| 89 | /*! | ||
| 90 | ************************************************************************************* | ||
| 91 | * \brief reallocation in Wels. Do nothing and continue using old block | ||
| 92 | * in case the block is large enough currently | ||
| 93 | * | ||
| 94 | * \param p memory block required in old time | ||
| 95 | * \param i_size new uiSize of memory block requested | ||
| 96 | * \param sz_real pointer to the old uiSize of memory block | ||
| 97 | * | ||
| 98 | * \return reallocated memory pointer exactly, failed in case of NULL return | ||
| 99 | * | ||
| 100 | * \note N/A | ||
| 101 | ************************************************************************************* | ||
| 102 | */ | ||
| 103 | void* WelsRealloc (void* pPointer, uint32_t* pRealSize, const uint32_t kuiSize, str_t* pTag = NULL); | ||
| 104 | |||
| 105 | ////////////////////////////////////////////////////////////////////////////////////// | ||
| 106 | WELSVP_NAMESPACE_END | ||
| 107 | |||
| 108 | #endif | ||
| 109 | |||
| 110 | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | //{{NO_DEPENDENCIES}} | ||
| 2 | // Microsoft Visual C++ generated include file. | ||
| 3 | // Used by WelsVP.rc | ||
| 4 | // | ||
| 5 | |||
| 6 | // Next default values for new objects | ||
| 7 | // | ||
| 8 | #ifdef APSTUDIO_INVOKED | ||
| 9 | #ifndef APSTUDIO_READONLY_SYMBOLS | ||
| 10 | #define _APS_NEXT_RESOURCE_VALUE 101 | ||
| 11 | #define _APS_NEXT_COMMAND_VALUE 40001 | ||
| 12 | #define _APS_NEXT_CONTROL_VALUE 1000 | ||
| 13 | #define _APS_NEXT_SYMED_VALUE 101 | ||
| 14 | #endif | ||
| 15 | #endif | ||
| @@ -0,0 +1,93 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2009-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file thread.cpp | ||
| 32 | * | ||
| 33 | * \brief Interfaces introduced in thread programming | ||
| 34 | * | ||
| 35 | * \date 11/17/2009 Created | ||
| 36 | * | ||
| 37 | ************************************************************************************* | ||
| 38 | */ | ||
| 39 | |||
| 40 | #include "thread.h" | ||
| 41 | |||
| 42 | WELSVP_NAMESPACE_BEGIN | ||
| 43 | |||
| 44 | #if defined(_WIN32) | ||
| 45 | |||
| 46 | WELS_THREAD_ERROR_CODE WelsMutexInit (WELS_MUTEX* mutex) { | ||
| 47 | InitializeCriticalSection (mutex); | ||
| 48 | |||
| 49 | return WELS_THREAD_ERROR_OK; | ||
| 50 | } | ||
| 51 | |||
| 52 | WELS_THREAD_ERROR_CODE WelsMutexLock (WELS_MUTEX* mutex) { | ||
| 53 | EnterCriticalSection (mutex); | ||
| 54 | |||
| 55 | return WELS_THREAD_ERROR_OK; | ||
| 56 | } | ||
| 57 | |||
| 58 | WELS_THREAD_ERROR_CODE WelsMutexUnlock (WELS_MUTEX* mutex) { | ||
| 59 | LeaveCriticalSection (mutex); | ||
| 60 | |||
| 61 | return WELS_THREAD_ERROR_OK; | ||
| 62 | } | ||
| 63 | |||
| 64 | WELS_THREAD_ERROR_CODE WelsMutexDestroy (WELS_MUTEX* mutex) { | ||
| 65 | DeleteCriticalSection (mutex); | ||
| 66 | |||
| 67 | return WELS_THREAD_ERROR_OK; | ||
| 68 | } | ||
| 69 | |||
| 70 | #elif defined(__GNUC__) | ||
| 71 | |||
| 72 | WELS_THREAD_ERROR_CODE WelsMutexInit (WELS_MUTEX* mutex) { | ||
| 73 | return pthread_mutex_init (mutex, NULL); | ||
| 74 | } | ||
| 75 | |||
| 76 | WELS_THREAD_ERROR_CODE WelsMutexLock (WELS_MUTEX* mutex) { | ||
| 77 | return pthread_mutex_lock (mutex); | ||
| 78 | } | ||
| 79 | |||
| 80 | WELS_THREAD_ERROR_CODE WelsMutexUnlock (WELS_MUTEX* mutex) { | ||
| 81 | return pthread_mutex_unlock (mutex); | ||
| 82 | } | ||
| 83 | |||
| 84 | WELS_THREAD_ERROR_CODE WelsMutexDestroy (WELS_MUTEX* mutex) { | ||
| 85 | return pthread_mutex_destroy (mutex); | ||
| 86 | } | ||
| 87 | |||
| 88 | #endif | ||
| 89 | |||
| 90 | WELSVP_NAMESPACE_END | ||
| 91 | |||
| 92 | |||
| 93 | |||
| @@ -0,0 +1,89 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2009-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file thread.h | ||
| 32 | * | ||
| 33 | * \brief Interfaces introduced in thread programming | ||
| 34 | * | ||
| 35 | * \date 11/17/2009 Created | ||
| 36 | * | ||
| 37 | ************************************************************************************* | ||
| 38 | */ | ||
| 39 | |||
| 40 | #ifndef WELSVP_THREAD_H | ||
| 41 | #define WELSVP_THREAD_H | ||
| 42 | |||
| 43 | #include "typedef.h" | ||
| 44 | |||
| 45 | #if defined(_WIN32) | ||
| 46 | |||
| 47 | #include <windows.h> | ||
| 48 | |||
| 49 | #elif defined(__GNUC__) | ||
| 50 | |||
| 51 | #include <stdlib.h> | ||
| 52 | #include <unistd.h> | ||
| 53 | #include <pthread.h> | ||
| 54 | #include <semaphore.h> | ||
| 55 | #include <signal.h> | ||
| 56 | #include <errno.h> | ||
| 57 | |||
| 58 | #endif//WIN32 | ||
| 59 | |||
| 60 | WELSVP_NAMESPACE_BEGIN | ||
| 61 | |||
| 62 | #if defined(_WIN32) | ||
| 63 | |||
| 64 | typedef HANDLE WELS_THREAD_HANDLE; | ||
| 65 | typedef CRITICAL_SECTION WELS_MUTEX; | ||
| 66 | |||
| 67 | #elif defined(__GNUC__) | ||
| 68 | |||
| 69 | typedef pthread_t WELS_THREAD_HANDLE; | ||
| 70 | typedef pthread_mutex_t WELS_MUTEX; | ||
| 71 | |||
| 72 | #endif | ||
| 73 | |||
| 74 | typedef long_t WELS_THREAD_ERROR_CODE; | ||
| 75 | |||
| 76 | #define WELS_THREAD_ERROR_OK 0 | ||
| 77 | #define WELS_THREAD_ERROR_GENERIAL ((unsigned long)(-1)) | ||
| 78 | #define WELS_THREAD_ERROR_WAIT_OBJECT_0 0 | ||
| 79 | #define WELS_THREAD_ERROR_WAIT_TIMEOUT ((unsigned long)0x00000102L) | ||
| 80 | #define WELS_THREAD_ERROR_WAIT_FAILED WELS_THREAD_ERROR_GENERIAL | ||
| 81 | |||
| 82 | WELS_THREAD_ERROR_CODE WelsMutexInit (WELS_MUTEX* mutex); | ||
| 83 | WELS_THREAD_ERROR_CODE WelsMutexLock (WELS_MUTEX* mutex); | ||
| 84 | WELS_THREAD_ERROR_CODE WelsMutexUnlock (WELS_MUTEX* mutex); | ||
| 85 | WELS_THREAD_ERROR_CODE WelsMutexDestroy (WELS_MUTEX* mutex); | ||
| 86 | |||
| 87 | WELSVP_NAMESPACE_END | ||
| 88 | |||
| 89 | #endif | ||
| @@ -0,0 +1,102 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2011-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file : typedef.h | ||
| 32 | * | ||
| 33 | * \brief : basic type definition | ||
| 34 | * | ||
| 35 | * \date : 2011/01/04 | ||
| 36 | * | ||
| 37 | * \description : 1. Define basic type with platform-independent; | ||
| 38 | * 2. Define specific namespace to avoid name pollution; | ||
| 39 | * 3. C++ ONLY; | ||
| 40 | * | ||
| 41 | ************************************************************************************* | ||
| 42 | */ | ||
| 43 | |||
| 44 | #ifndef WELSVP_TYPEDEF_H | ||
| 45 | #define WELSVP_TYPEDEF_H | ||
| 46 | |||
| 47 | #define WELSVP_EXTERN_C_BEGIN extern "C" { | ||
| 48 | #define WELSVP_EXTERN_C_END } | ||
| 49 | |||
| 50 | #define WELSVP_NAMESPACE_BEGIN namespace nsWelsVP { | ||
| 51 | #define WELSVP_NAMESPACE_END } | ||
| 52 | |||
| 53 | WELSVP_NAMESPACE_BEGIN | ||
| 54 | |||
| 55 | #if ( defined(_WIN32) || defined(_WIN32) ) && defined(_MSC_VER) | ||
| 56 | |||
| 57 | typedef char int8_t ; | ||
| 58 | typedef unsigned char uint8_t ; | ||
| 59 | typedef short int16_t ; | ||
| 60 | typedef unsigned short uint16_t ; | ||
| 61 | typedef int int32_t ; | ||
| 62 | typedef unsigned int uint32_t ; | ||
| 63 | typedef __int64 int64_t ; | ||
| 64 | typedef unsigned __int64 uint64_t ; | ||
| 65 | #define inline_t _inline | ||
| 66 | |||
| 67 | #else // GCC | ||
| 68 | |||
| 69 | typedef signed char int8_t | ||
| 70 | ; // [comment]: some compilers may identify the type "char" as "unsigned char" as default, so declare it explicit | ||
| 71 | typedef unsigned char uint8_t ; | ||
| 72 | typedef signed short int16_t ; | ||
| 73 | typedef unsigned short uint16_t ; | ||
| 74 | typedef signed int int32_t ; | ||
| 75 | typedef unsigned int uint32_t ; | ||
| 76 | typedef long long int64_t ; | ||
| 77 | typedef unsigned long long uint64_t ; | ||
| 78 | #define inline_t inline | ||
| 79 | |||
| 80 | #endif | ||
| 81 | |||
| 82 | typedef char str_t ; // [comment]: specific use plain char only for character parameters | ||
| 83 | typedef long long_t ; | ||
| 84 | typedef int32_t bool_t ; | ||
| 85 | |||
| 86 | #if defined(_WIN32) || defined(_MACH_PLATFORM) || defined(__GNUC__) | ||
| 87 | typedef float float_t ; | ||
| 88 | typedef double double_t ; | ||
| 89 | #endif | ||
| 90 | |||
| 91 | #ifndef NULL | ||
| 92 | #define NULL 0 | ||
| 93 | #endif | ||
| 94 | |||
| 95 | enum { | ||
| 96 | FALSE = 0, | ||
| 97 | TRUE = !FALSE | ||
| 98 | }; | ||
| 99 | |||
| 100 | WELSVP_NAMESPACE_END | ||
| 101 | |||
| 102 | #endif | ||
| @@ -0,0 +1,45 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | */ | ||
| 32 | |||
| 33 | #include "util.h" | ||
| 34 | |||
| 35 | WELSVP_NAMESPACE_BEGIN | ||
| 36 | ///////////////////////////////////////////////////////////////////////////////// | ||
| 37 | |||
| 38 | |||
| 39 | int32_t WelsStrCmp (const str_t* kpStr1, const str_t* kpStr2) { | ||
| 40 | return ::strcmp (kpStr1, kpStr2); | ||
| 41 | } | ||
| 42 | |||
| 43 | |||
| 44 | ///////////////////////////////////////////////////////////////////////////////// | ||
| 45 | WELSVP_NAMESPACE_END | ||
| @@ -0,0 +1,107 @@ | |||
| 1 | /*! | ||
| 2 | * \copy | ||
| 3 | * Copyright (c) 2011-2013, Cisco Systems | ||
| 4 | * All rights reserved. | ||
| 5 | * | ||
| 6 | * Redistribution and use in source and binary forms, with or without | ||
| 7 | * modification, are permitted provided that the following conditions | ||
| 8 | * are met: | ||
| 9 | * | ||
| 10 | * * Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * | ||
| 13 | * * Redistributions in binary form must reproduce the above copyright | ||
| 14 | * notice, this list of conditions and the following disclaimer in | ||
| 15 | * the documentation and/or other materials provided with the | ||
| 16 | * distribution. | ||
| 17 | * | ||
| 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 19 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 20 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
| 21 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 22 | * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | ||
| 24 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 25 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 26 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | ||
| 28 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 29 | * POSSIBILITY OF SUCH DAMAGE. | ||
| 30 | * | ||
| 31 | * \file : util.h | ||
| 32 | * | ||
| 33 | * \brief : utils for wels video processor class | ||
| 34 | * | ||
| 35 | * \date : 2011/01/04 | ||
| 36 | * | ||
| 37 | * \description : | ||
| 38 | * | ||
| 39 | ************************************************************************************* | ||
| 40 | */ | ||
| 41 | |||
| 42 | #ifndef WELSVP_UTIL_H | ||
| 43 | #define WELSVP_UTIL_H | ||
| 44 | |||
| 45 | #include <stdio.h> | ||
| 46 | #include <stdlib.h> | ||
| 47 | #include <string.h> | ||
| 48 | #include <stdarg.h> | ||
| 49 | #include <assert.h> | ||
| 50 | |||
| 51 | #include "typedef.h" | ||
| 52 | #include "memory.h" | ||
| 53 | #include "../../interface/IWelsVP.h" | ||
| 54 | |||
| 55 | WELSVP_NAMESPACE_BEGIN | ||
| 56 | |||
| 57 | #define MAX_WIDTH (4096) | ||
| 58 | #define MAX_HEIGHT (2304)//MAX_FS_LEVEL51 (36864); MAX_FS_LEVEL51*256/4096 = 2304 | ||
| 59 | #define MB_WIDTH_LUMA (16) | ||
| 60 | #define PESN (1e-6) // desired float precision | ||
| 61 | |||
| 62 | #define MB_TYPE_INTRA4x4 0x00000001 | ||
| 63 | #define MB_TYPE_INTRA16x16 0x00000002 | ||
| 64 | #define MB_TYPE_INTRA_PCM 0x00000004 | ||
| 65 | #define MB_TYPE_INTRA (MB_TYPE_INTRA4x4 | MB_TYPE_INTRA16x16 | MB_TYPE_INTRA_PCM) | ||
| 66 | #define IS_INTRA(type) ((type)&MB_TYPE_INTRA) | ||
| 67 | |||
| 68 | #define WELS_MAX(x, y) ((x) > (y) ? (x) : (y)) | ||
| 69 | #define WELS_MIN(x, y) ((x) < (y) ? (x) : (y)) | ||
| 70 | #define WELS_SIGN(a) ((long_t)(a) >> 31) | ||
| 71 | #define WELS_ABS(a) ((WELS_SIGN(a) ^ (long_t)(a)) - WELS_SIGN(a)) | ||
| 72 | #define WELS_CLAMP(x, minv, maxv) WELS_MIN(WELS_MAX(x, minv), maxv) | ||
| 73 | |||
| 74 | #define ALIGNBYTES (16) /* Worst case is requiring alignment to an 16 byte boundary */ | ||
| 75 | #define WELS_ALIGN(iInput) ((iInput+(ALIGNMENT-1)) & ~(ALIGNMENT-1)) | ||
| 76 | #define WELS_ALIGN2(iInput) ((iInput+1) & ~1) | ||
| 77 | #define WELS_ALIGN4(iInput) ((iInput+3) & ~3) | ||
| 78 | #define WELS_ALIGN8(iInput) ((iInput+7) & ~7) | ||
| 79 | |||
| 80 | #define WelsCastFromPointer(p) (reinterpret_cast<long_t>(p)) | ||
| 81 | #define WelsStaticCast(type, p) (static_cast<type>(p)) | ||
| 82 | #define WelsDynamicCast(type, p) (dynamic_cast<type>(p)) | ||
| 83 | |||
| 84 | #define GET_METHOD(x) ((x) & 0xff) // mask method as the lowest 8bits | ||
| 85 | #define GET_SPECIAL(x) (((x) >> 8) & 0xff) // mask special flag as 8bits | ||
| 86 | |||
| 87 | inline_t EMethods WelsVpGetValidMethod (int32_t a) { | ||
| 88 | int32_t iMethod = GET_METHOD (a); | ||
| 89 | return WelsStaticCast (EMethods, WELS_CLAMP (iMethod, METHOD_NULL + 1, METHOD_MASK - 1)); | ||
| 90 | } | ||
| 91 | |||
| 92 | |||
| 93 | #define _SafeFree(p) if (p) { WelsFree(p); (p) = NULL; } | ||
| 94 | #define _SafeDelete(p) if (p) { delete (p); (p) = NULL; } | ||
| 95 | |||
| 96 | |||
| 97 | ////////////////////////////////////////////////////////////////////////////////////// | ||
| 98 | |||
| 99 | int32_t WelsStrCmp (const str_t* kpStr1, const str_t* kpStr2); | ||
| 100 | |||
| 101 | |||
| 102 | ////////////////////////////////////////////////////////////////////////////////////// | ||
| 103 | WELSVP_NAMESPACE_END | ||
| 104 | |||
| 105 | #endif | ||
| 106 | |||
| 107 | |||