Coverage Report

Created: 2025-07-23 08:18

/src/openh264/codec/processing/interface/IWelsVP.h
Line
Count
Source (jump to first uncovered line)
1
/*!
2
 * \copy
3
 *     Copyright (c)  2004-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
 * \file        :  IWelsVP.h
33
 *
34
 * \brief       :  Interface of wels video processor class
35
 *
36
 * \date        :  2011/01/04
37
 *
38
 * \description :  1. should support both C/C++ style interface
39
 *                 2. should concern with the feature extension requirement
40
 *                 3. should care the usage of "char"==>
41
 *                     1) value char  : signed char/unsigned char
42
 *                     2) string char : char
43
 *
44
 *************************************************************************************
45
 */
46
47
#ifndef IWELSVP_H_
48
#define IWELSVP_H_
49
50
0
#define WELSVP_MAJOR_VERSION   1
51
0
#define WELSVP_MINOR_VERSION   1
52
0
#define WELSVP_VERSION         ((WELSVP_MAJOR_VERSION << 8) + WELSVP_MINOR_VERSION)
53
54
typedef enum {
55
  RET_SUCCESS          =  0,
56
  RET_FAILED           = -1,
57
  RET_INVALIDPARAM     = -2,
58
  RET_OUTOFMEMORY      = -3,
59
  RET_NOTSUPPORTED     = -4,
60
  RET_UNEXPECTED       = -5,
61
  RET_NEEDREINIT       = -6
62
} EResult;
63
64
typedef enum {
65
  VIDEO_FORMAT_NULL       = 0,   /* invalid format   */
66
  /*rgb color formats*/
67
  VIDEO_FORMAT_RGB        = 1,   /* rgb 24bits       */
68
  VIDEO_FORMAT_RGBA       = 2,   /* rgba             */
69
  VIDEO_FORMAT_RGB555     = 3,   /* rgb555           */
70
  VIDEO_FORMAT_RGB565     = 4,   /* rgb565           */
71
  VIDEO_FORMAT_BGR        = 5,   /* bgr 24bits       */
72
  VIDEO_FORMAT_BGRA       = 6,   /* bgr 32bits       */
73
  VIDEO_FORMAT_ABGR       = 7,   /* abgr             */
74
  VIDEO_FORMAT_ARGB       = 8,   /* argb             */
75
76
  /*yuv color formats*/
77
  VIDEO_FORMAT_YUY2       = 20,   /* yuy2             */
78
  VIDEO_FORMAT_YVYU       = 21,   /* yvyu             */
79
  VIDEO_FORMAT_UYVY       = 22,   /* uyvy             */
80
  VIDEO_FORMAT_I420       = 23,   /* yuv 4:2:0 planar */
81
  VIDEO_FORMAT_YV12       = 24,   /* yuv 4:2:0 planar */
82
  VIDEO_FORMAT_INTERNAL   = 25,   /* Only Used for SVC decoder testbed */
83
  VIDEO_FORMAT_NV12       = 26,   /* y planar + uv packed */
84
  VIDEO_FORMAT_I422       = 27,   /* yuv 4:2:2 planar */
85
  VIDEO_FORMAT_I444       = 28,   /* yuv 4:4:4 planar */
86
  VIDEO_FORMAT_YUYV       = 20,   /* yuv 4:2:2 packed */
87
88
  VIDEO_FORMAT_RGB24      = 1,
89
  VIDEO_FORMAT_RGB32      = 2,
90
  VIDEO_FORMAT_RGB24_INV  = 5,
91
  VIDEO_FORMAT_RGB32_INV  = 6,
92
  VIDEO_FORMAT_RGB555_INV = 7,
93
  VIDEO_FORMAT_RGB565_INV = 8,
94
  VIDEO_FORMAT_YUV2       = 21,
95
  VIDEO_FORMAT_420        = 23,
96
97
  VIDEO_FORMAT_VFlip      = 0x80000000
98
} EVideoFormat;
99
100
typedef enum {
101
  BUFFER_HOSTMEM  = 0,
102
  BUFFER_SURFACE
103
} EPixMapBufferProperty;
104
105
typedef struct {
106
  int iRectTop;
107
  int iRectLeft;
108
  int iRectWidth;
109
  int iRectHeight;
110
} SRect;
111
112
typedef struct {
113
  void*        pPixel[3];
114
  int          iSizeInBits;
115
  int          iStride[3];
116
  SRect        sRect;
117
  EVideoFormat eFormat;
118
  EPixMapBufferProperty eProperty;//not use? to remove? but how about the size of SPixMap?
119
} SPixMap;
120
121
typedef enum {
122
  METHOD_NULL              = 0,
123
  METHOD_COLORSPACE_CONVERT    ,//not support yet
124
  METHOD_DENOISE              ,
125
  METHOD_SCENE_CHANGE_DETECTION_VIDEO ,
126
  METHOD_SCENE_CHANGE_DETECTION_SCREEN ,
127
  METHOD_DOWNSAMPLE            ,
128
  METHOD_VAA_STATISTICS        ,
129
  METHOD_BACKGROUND_DETECTION  ,
130
  METHOD_ADAPTIVE_QUANT ,
131
  METHOD_COMPLEXITY_ANALYSIS   ,
132
  METHOD_COMPLEXITY_ANALYSIS_SCREEN,
133
  METHOD_IMAGE_ROTATE          ,
134
  METHOD_SCROLL_DETECTION,
135
  METHOD_MASK
136
} EMethods;
137
138
//-----------------------------------------------------------------//
139
//  Algorithm parameters define
140
//-----------------------------------------------------------------//
141
142
typedef enum {
143
  SIMILAR_SCENE,   //similar scene
144
  MEDIUM_CHANGED_SCENE,   //medium changed scene
145
  LARGE_CHANGED_SCENE     //large changed scene
146
} ESceneChangeIdc;
147
148
typedef enum {
149
  NO_STATIC,  // motion block
150
  COLLOCATED_STATIC, // collocated static block
151
  SCROLLED_STATIC,  // scrolled static block
152
  BLOCK_STATIC_IDC_ALL
153
} EStaticBlockIdc;
154
155
typedef struct {
156
  SRect sMaskRect;
157
  bool bMaskInfoAvailable;
158
  int iScrollMvX;
159
  int iScrollMvY;
160
  bool bScrollDetectFlag; // 0:false ; 1:ltr; 2: scene change
161
} SScrollDetectionParam;
162
163
typedef struct {
164
  ESceneChangeIdc eSceneChangeIdc; // SIMILAR_SCENE, MEDIUM_CHANGED_SCENE, LARGE_CHANGED_SCENE
165
  int             iMotionBlockNum; // Number of motion blocks
166
  long long       iFrameComplexity; // frame complexity
167
  unsigned char* pStaticBlockIdc;   // static block idc
168
  SScrollDetectionParam sScrollResult; //results from scroll detection
169
} SSceneChangeResult;
170
171
typedef struct {
172
  unsigned char* pCurY;             // Y data of current frame
173
  unsigned char* pRefY;             // Y data of pRef frame for diff calc
174
  int (*pSad8x8)[4];                // sad of 8x8, every 4 in the same 16x16 get together
175
  int* pSsd16x16;                   // sum of square difference of 16x16
176
  int* pSum16x16;                   // sum of 16x16
177
  int* pSumOfSquare16x16;           // sum of square of 16x16
178
  int   (*pSumOfDiff8x8)[4];
179
  unsigned char (*pMad8x8)[4];
180
  int iFrameSad;                    // sad of frame
181
} SVAACalcResult;
182
183
typedef struct {
184
  int iCalcVar;
185
  int iCalcBgd;
186
  int iCalcSsd;
187
  int iReserved;
188
  SVAACalcResult*  pCalcResult;
189
} SVAACalcParam;
190
191
typedef struct {
192
  signed char*     pBackgroundMbFlag;
193
  SVAACalcResult*  pCalcRes;
194
} SBGDInterface;
195
196
typedef enum {
197
  AQ_QUALITY_MODE,   //Quality mode
198
  AQ_BITRATE_MODE    //Bitrate mode
199
} EAQModes;
200
201
typedef struct {
202
  unsigned short    uiMotionIndex;
203
  unsigned short    uiTextureIndex;
204
} SMotionTextureUnit;
205
206
typedef struct {
207
  int                  iAdaptiveQuantMode; // 0:quality mode, 1:bitrates mode
208
  SVAACalcResult*      pCalcResult;
209
  SMotionTextureUnit*  pMotionTextureUnit;
210
211
  signed char*      pMotionTextureIndexToDeltaQp;
212
  int               iAverMotionTextureIndexToDeltaQp; // *AQ_STEP_INT_MULTIPLY
213
} SAdaptiveQuantizationParam;
214
215
typedef enum {
216
  FRAME_SAD     =  0,
217
  GOM_SAD       = -1,
218
  GOM_VAR       = -2
219
} EComplexityAnalysisMode;
220
221
typedef struct {
222
  int  iComplexityAnalysisMode;
223
  int  iCalcBgd;
224
  int  iMbNumInGom;
225
  long long  iFrameComplexity;
226
  int*  pGomComplexity;
227
  int*  pGomForegroundBlockNum;
228
  signed char*  pBackgroundMbFlag;
229
  unsigned int* uiRefMbType;
230
  SVAACalcResult*  pCalcResult;
231
} SComplexityAnalysisParam;
232
233
typedef struct {
234
  int  iMbRowInGom;
235
  int*  pGomComplexity;
236
  int  iGomNumInFrame;
237
  long long  iFrameComplexity; //255*255(MaxMbSAD)*36864(MaxFS) make the highest bit of 32-bit integer 1
238
  int  iIdrFlag;
239
  SScrollDetectionParam sScrollResult;
240
} SComplexityAnalysisScreenParam;
241
/////////////////////////////////////////////////////////////////////////////////////////////
242
243
typedef struct {
244
  void*    pCtx;
245
  EResult (*Init) (void* pCtx, int iType, void* pCfg);
246
  EResult (*Uninit) (void* pCtx, int iType);
247
  EResult (*Flush) (void* pCtx, int iType);
248
  EResult (*Process) (void* pCtx, int iType, SPixMap* pSrc, SPixMap* dst);
249
  EResult (*Get) (void* pCtx, int iType, void* pParam);
250
  EResult (*Set) (void* pCtx, int iType, void* pParam);
251
  EResult (*SpecialFeature) (void* pCtx, int iType, void* pIn, void* pOut);
252
} IWelsVPc;
253
254
#if defined(__cplusplus) && !defined(CINTERFACE)  /* C++ style interface */
255
256
class IWelsVP {
257
 public:
258
0
  virtual ~IWelsVP() {}
259
260
 public:
261
  virtual EResult Init (int iType, void* pCfg) = 0;
262
  virtual EResult Uninit (int iType) = 0;
263
  virtual EResult Flush (int iType) = 0;
264
  virtual EResult Process (int iType, SPixMap* pSrc, SPixMap* dst) = 0;
265
  virtual EResult Get (int iType, void* pParam) = 0;
266
  virtual EResult Set (int iType, void* pParam) = 0;
267
  virtual EResult SpecialFeature (int iType, void* pIn, void* pOut) = 0;
268
};
269
270
/* Recommend to invoke the interface via the micro for convenient */
271
#define IWelsVPFunc_Init(p, a, b)                  (p)->Init(a, b)
272
#define IWelsVPFunc_Uninit(p, a)                   (p)->Uninit(a)
273
#define IWelsVPFunc_Flush(p, a)                    (p)->Flush(a)
274
#define IWelsVPFunc_Process(p, a, b, c)            (p)->Process(a, b, c)
275
#define IWelsVPFunc_Get(p, a, b)                   (p)->Get(a, b)
276
#define IWelsVPFunc_Set(p, a, b)                   (p)->Set(a, b)
277
#define IWelsVPFunc_SpecialFeature(p, a, b, c)     (p)->SpecialFeature(a, b, c)
278
279
/* C++ interface version */
280
0
#define WELSVP_INTERFACE_VERION                    (0x8000 + (WELSVP_VERSION & 0x7fff))
281
#define WELSVP_EXTERNC_BEGIN                       extern "C" {
282
#define WELSVP_EXTERNC_END                         }
283
284
#else    /* C style interface */
285
286
/* Recommend to invoke the interface via the micro for convenient */
287
#define IWelsVPFunc_Init(p, a, b)                  (p)->Init(p->h, a, b)
288
#define IWelsVPFunc_Uninit(p, a)                   (p)->Uninit(p->h, a)
289
#define IWelsVPFunc_Flush(p, a)                    (p)->Flush(p->h, a)
290
#define IWelsVPFunc_Process(p, a, b, c)            (p)->Process(p->h, a, b, c)
291
#define IWelsVPFunc_Get(p, a, b)                   (p)->Get(p->h, a, b)
292
#define IWelsVPFunc_Set(p, a, b)                   (p)->Set(p->h, a, b)
293
#define IWelsVPFunc_SpecialFeature(p, a, b, c)     (p)->SpecialFeature(p->h, a, b, c)
294
295
/* C interface version */
296
#define WELSVP_INTERFACE_VERION                    (0x0001 + (WELSVP_VERSION & 0x7fff))
297
#define WELSVP_EXTERNC_BEGIN
298
#define WELSVP_EXTERNC_END
299
300
#endif
301
302
WELSVP_EXTERNC_BEGIN
303
EResult WelsCreateVpInterface (void** ppCtx, int iVersion /*= WELSVP_INTERFACE_VERION*/);
304
EResult WelsDestroyVpInterface (void* pCtx , int iVersion /*= WELSVP_INTERFACE_VERION*/);
305
WELSVP_EXTERNC_END
306
307
//////////////////////////////////////////////////////////////////////////////////////////////
308
#endif // IWELSVP_H_
309
310