| /*! |
| * \copy |
| * Copyright (c) 2004-2013, Cisco Systems |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
| * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
| * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| * |
| * |
| * \file : IWelsVP.h |
| * |
| * \brief : Interface of wels video processor class |
| * |
| * \date : 2011/01/04 |
| * |
| * \description : 1. should support both C/C++ style interface |
| * 2. should concern with the feature extension requirement |
| * 3. should care the usage of "char"==> |
| * 1) value char : signed char/unsigned char |
| * 2) string char : char |
| * |
| ************************************************************************************* |
| */ |
| |
| #ifndef IWELSVP_H_ |
| #define IWELSVP_H_ |
| |
| #define WELSVP_MAJOR_VERSION 1 |
| #define WELSVP_MINOR_VERSION 1 |
| #define WELSVP_VERSION ((WELSVP_MAJOR_VERSION << 8) + WELSVP_MINOR_VERSION) |
| |
| typedef enum { |
| RET_SUCCESS = 0, |
| RET_FAILED = -1, |
| RET_INVALIDPARAM = -2, |
| RET_OUTOFMEMORY = -3, |
| RET_NOTSUPPORTED = -4, |
| RET_UNEXPECTED = -5, |
| RET_NEEDREINIT = -6 |
| } EResult; |
| |
| typedef enum { |
| VIDEO_FORMAT_NULL = 0, /* invalid format */ |
| /*rgb color formats*/ |
| VIDEO_FORMAT_RGB = 1, /* rgb 24bits */ |
| VIDEO_FORMAT_RGBA = 2, /* rgba */ |
| VIDEO_FORMAT_RGB555 = 3, /* rgb555 */ |
| VIDEO_FORMAT_RGB565 = 4, /* rgb565 */ |
| VIDEO_FORMAT_BGR = 5, /* bgr 24bits */ |
| VIDEO_FORMAT_BGRA = 6, /* bgr 32bits */ |
| VIDEO_FORMAT_ABGR = 7, /* abgr */ |
| VIDEO_FORMAT_ARGB = 8, /* argb */ |
| |
| /*yuv color formats*/ |
| VIDEO_FORMAT_YUY2 = 20, /* yuy2 */ |
| VIDEO_FORMAT_YVYU = 21, /* yvyu */ |
| VIDEO_FORMAT_UYVY = 22, /* uyvy */ |
| VIDEO_FORMAT_I420 = 23, /* yuv 4:2:0 planar */ |
| VIDEO_FORMAT_YV12 = 24, /* yuv 4:2:0 planar */ |
| VIDEO_FORMAT_INTERNAL = 25, /* Only Used for SVC decoder testbed */ |
| VIDEO_FORMAT_NV12 = 26, /* y planar + uv packed */ |
| VIDEO_FORMAT_I422 = 27, /* yuv 4:2:2 planar */ |
| VIDEO_FORMAT_I444 = 28, /* yuv 4:4:4 planar */ |
| VIDEO_FORMAT_YUYV = 20, /* yuv 4:2:2 packed */ |
| |
| VIDEO_FORMAT_RGB24 = 1, |
| VIDEO_FORMAT_RGB32 = 2, |
| VIDEO_FORMAT_RGB24_INV = 5, |
| VIDEO_FORMAT_RGB32_INV = 6, |
| VIDEO_FORMAT_RGB555_INV = 7, |
| VIDEO_FORMAT_RGB565_INV = 8, |
| VIDEO_FORMAT_YUV2 = 21, |
| VIDEO_FORMAT_420 = 23, |
| |
| VIDEO_FORMAT_VFlip = 0x80000000 |
| } EVideoFormat; |
| |
| typedef enum { |
| BUFFER_HOSTMEM = 0, |
| BUFFER_SURFACE |
| } EPixMapBufferProperty; |
| |
| typedef struct { |
| int iRectTop; |
| int iRectLeft; |
| int iRectWidth; |
| int iRectHeight; |
| } SRect; |
| |
| typedef struct { |
| void* pPixel[3]; |
| int iSizeInBits; |
| int iStride[3]; |
| SRect sRect; |
| EVideoFormat eFormat; |
| EPixMapBufferProperty eProperty;//not use? to remove? but how about the size of SPixMap? |
| } SPixMap; |
| |
| typedef enum { |
| METHOD_NULL = 0, |
| METHOD_COLORSPACE_CONVERT ,//not support yet |
| METHOD_DENOISE , |
| METHOD_SCENE_CHANGE_DETECTION_VIDEO , |
| METHOD_SCENE_CHANGE_DETECTION_SCREEN , |
| METHOD_DOWNSAMPLE , |
| METHOD_VAA_STATISTICS , |
| METHOD_BACKGROUND_DETECTION , |
| METHOD_ADAPTIVE_QUANT , |
| METHOD_COMPLEXITY_ANALYSIS , |
| METHOD_COMPLEXITY_ANALYSIS_SCREEN, |
| METHOD_IMAGE_ROTATE , |
| METHOD_SCROLL_DETECTION, |
| METHOD_MASK |
| } EMethods; |
| |
| //-----------------------------------------------------------------// |
| // Algorithm parameters define |
| //-----------------------------------------------------------------// |
| |
| typedef enum { |
| SIMILAR_SCENE, //similar scene |
| MEDIUM_CHANGED_SCENE, //medium changed scene |
| LARGE_CHANGED_SCENE //large changed scene |
| } ESceneChangeIdc; |
| |
| typedef enum { |
| NO_STATIC, // motion block |
| COLLOCATED_STATIC, // collocated static block |
| SCROLLED_STATIC, // scrolled static block |
| BLOCK_STATIC_IDC_ALL |
| } EStaticBlockIdc; |
| |
| typedef struct { |
| SRect sMaskRect; |
| bool bMaskInfoAvailable; |
| int iScrollMvX; |
| int iScrollMvY; |
| bool bScrollDetectFlag; // 0:false ; 1:ltr; 2: scene change |
| } SScrollDetectionParam; |
| |
| typedef struct { |
| ESceneChangeIdc eSceneChangeIdc; // SIMILAR_SCENE, MEDIUM_CHANGED_SCENE, LARGE_CHANGED_SCENE |
| int iMotionBlockNum; // Number of motion blocks |
| long long iFrameComplexity; // frame complexity |
| unsigned char* pStaticBlockIdc; // static block idc |
| SScrollDetectionParam sScrollResult; //results from scroll detection |
| } SSceneChangeResult; |
| |
| typedef struct { |
| unsigned char* pCurY; // Y data of current frame |
| unsigned char* pRefY; // Y data of pRef frame for diff calc |
| int (*pSad8x8)[4]; // sad of 8x8, every 4 in the same 16x16 get together |
| int* pSsd16x16; // sum of square difference of 16x16 |
| int* pSum16x16; // sum of 16x16 |
| int* pSumOfSquare16x16; // sum of square of 16x16 |
| int (*pSumOfDiff8x8)[4]; |
| unsigned char (*pMad8x8)[4]; |
| int iFrameSad; // sad of frame |
| } SVAACalcResult; |
| |
| typedef struct { |
| int iCalcVar; |
| int iCalcBgd; |
| int iCalcSsd; |
| int iReserved; |
| SVAACalcResult* pCalcResult; |
| } SVAACalcParam; |
| |
| typedef struct { |
| signed char* pBackgroundMbFlag; |
| SVAACalcResult* pCalcRes; |
| } SBGDInterface; |
| |
| typedef enum { |
| AQ_QUALITY_MODE, //Quality mode |
| AQ_BITRATE_MODE //Bitrate mode |
| } EAQModes; |
| |
| typedef struct { |
| unsigned short uiMotionIndex; |
| unsigned short uiTextureIndex; |
| } SMotionTextureUnit; |
| |
| typedef struct { |
| int iAdaptiveQuantMode; // 0:quality mode, 1:bitrates mode |
| SVAACalcResult* pCalcResult; |
| SMotionTextureUnit* pMotionTextureUnit; |
| |
| signed char* pMotionTextureIndexToDeltaQp; |
| int iAverMotionTextureIndexToDeltaQp; // *AQ_STEP_INT_MULTIPLY |
| } SAdaptiveQuantizationParam; |
| |
| typedef enum { |
| FRAME_SAD = 0, |
| GOM_SAD = -1, |
| GOM_VAR = -2 |
| } EComplexityAnalysisMode; |
| |
| typedef struct { |
| int iComplexityAnalysisMode; |
| int iCalcBgd; |
| int iMbNumInGom; |
| long long iFrameComplexity; |
| int* pGomComplexity; |
| int* pGomForegroundBlockNum; |
| signed char* pBackgroundMbFlag; |
| unsigned int* uiRefMbType; |
| SVAACalcResult* pCalcResult; |
| } SComplexityAnalysisParam; |
| |
| typedef struct { |
| int iMbRowInGom; |
| int* pGomComplexity; |
| int iGomNumInFrame; |
| long long iFrameComplexity; //255*255(MaxMbSAD)*36864(MaxFS) make the highest bit of 32-bit integer 1 |
| int iIdrFlag; |
| SScrollDetectionParam sScrollResult; |
| } SComplexityAnalysisScreenParam; |
| ///////////////////////////////////////////////////////////////////////////////////////////// |
| |
| typedef struct { |
| void* pCtx; |
| EResult (*Init) (void* pCtx, int iType, void* pCfg); |
| EResult (*Uninit) (void* pCtx, int iType); |
| EResult (*Flush) (void* pCtx, int iType); |
| EResult (*Process) (void* pCtx, int iType, SPixMap* pSrc, SPixMap* dst); |
| EResult (*Get) (void* pCtx, int iType, void* pParam); |
| EResult (*Set) (void* pCtx, int iType, void* pParam); |
| EResult (*SpecialFeature) (void* pCtx, int iType, void* pIn, void* pOut); |
| } IWelsVPc; |
| |
| #if defined(__cplusplus) && !defined(CINTERFACE) /* C++ style interface */ |
| |
| class IWelsVP { |
| public: |
| virtual ~IWelsVP() {} |
| |
| public: |
| virtual EResult Init (int iType, void* pCfg) = 0; |
| virtual EResult Uninit (int iType) = 0; |
| virtual EResult Flush (int iType) = 0; |
| virtual EResult Process (int iType, SPixMap* pSrc, SPixMap* dst) = 0; |
| virtual EResult Get (int iType, void* pParam) = 0; |
| virtual EResult Set (int iType, void* pParam) = 0; |
| virtual EResult SpecialFeature (int iType, void* pIn, void* pOut) = 0; |
| }; |
| |
| /* Recommend to invoke the interface via the micro for convenient */ |
| #define IWelsVPFunc_Init(p, a, b) (p)->Init(a, b) |
| #define IWelsVPFunc_Uninit(p, a) (p)->Uninit(a) |
| #define IWelsVPFunc_Flush(p, a) (p)->Flush(a) |
| #define IWelsVPFunc_Process(p, a, b, c) (p)->Process(a, b, c) |
| #define IWelsVPFunc_Get(p, a, b) (p)->Get(a, b) |
| #define IWelsVPFunc_Set(p, a, b) (p)->Set(a, b) |
| #define IWelsVPFunc_SpecialFeature(p, a, b, c) (p)->SpecialFeature(a, b, c) |
| |
| /* C++ interface version */ |
| #define WELSVP_INTERFACE_VERION (0x8000 + (WELSVP_VERSION & 0x7fff)) |
| #define WELSVP_EXTERNC_BEGIN extern "C" { |
| #define WELSVP_EXTERNC_END } |
| |
| #else /* C style interface */ |
| |
| /* Recommend to invoke the interface via the micro for convenient */ |
| #define IWelsVPFunc_Init(p, a, b) (p)->Init(p->h, a, b) |
| #define IWelsVPFunc_Uninit(p, a) (p)->Uninit(p->h, a) |
| #define IWelsVPFunc_Flush(p, a) (p)->Flush(p->h, a) |
| #define IWelsVPFunc_Process(p, a, b, c) (p)->Process(p->h, a, b, c) |
| #define IWelsVPFunc_Get(p, a, b) (p)->Get(p->h, a, b) |
| #define IWelsVPFunc_Set(p, a, b) (p)->Set(p->h, a, b) |
| #define IWelsVPFunc_SpecialFeature(p, a, b, c) (p)->SpecialFeature(p->h, a, b, c) |
| |
| /* C interface version */ |
| #define WELSVP_INTERFACE_VERION (0x0001 + (WELSVP_VERSION & 0x7fff)) |
| #define WELSVP_EXTERNC_BEGIN |
| #define WELSVP_EXTERNC_END |
| |
| #endif |
| |
| WELSVP_EXTERNC_BEGIN |
| EResult WelsCreateVpInterface (void** ppCtx, int iVersion /*= WELSVP_INTERFACE_VERION*/); |
| EResult WelsDestroyVpInterface (void* pCtx , int iVersion /*= WELSVP_INTERFACE_VERION*/); |
| WELSVP_EXTERNC_END |
| |
| ////////////////////////////////////////////////////////////////////////////////////////////// |
| #endif // IWELSVP_H_ |
| |
| |