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 | + | |