aboutsummaryrefslogtreecommitdiff
path: root/include/linux/vcodec/vcodec_OAL_v2.h
blob: 59f86daa83169cf899608779ca1a4ec9890db7a3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
#ifndef VCODEC_OAL_V2_H
#define VCODEC_OAL_V2_H
#define IN
#define OUT

#ifndef NULL
#define NULL 0
#endif

#include "vcodec_if_v2.h"

#ifdef WIN32
#include <windows.h>

#endif
#define VCODEC_OAL_VERSION 20140812
#define VCODEC_ASSERT(expr, a) do {if(!(expr)) rVCODEC_OAL_Function.VCodecAssertFail(__FILE__, __LINE__, a); } while (0)

typedef enum
{
    VCODEC_OAL_H264_DEC,
    VCODEC_OAL_HEVC_DEC,
	VCODEC_OAL_VP8_DEC ,
	VCODEC_OAL_VP9_DEC ,
	VCODEC_OAL_RMVB_DEC ,
	VCODEC_OAL_MPEG2_DEC ,
	VCODEC_OAL_MPEG4_DEC,
	VCODEC_OAL_H264_ENC,
    VCODEC_OAL_HEVC_ENC,
	VCODEC_OAL_VP8_ENC ,
	VCODEC_OAL_VP9_ENC ,
	VCODEC_OAL_MPEG4_ENC,
	NUM_OF_VCODEC_OAL_CODEC_TYP,
} VCODEC_OAL_CODEC_TYPE;

typedef struct
{
	VCODEC_OAL_CODEC_TYPE eCodec;
	void *reserve1;
	void *reserve2;
	void *reserve3;
	void *reserve4;
}VCODEC_OAL_HW_CTR_INFO_T;

void VCodecQueryMemType(IN void            *pBuffer_VA,
                        IN unsigned int    u4Size,
                        OUT VCODEC_MEMORY_TYPE_T *peMemType
                       );

void VCodecQueryPhysicalAddr(IN void       *pBuffer_VA,
                             OUT void     **pBufferOut_PA
                            );

// VCodecSwitchMemType - return 0 if success.
//                       return -1 if failed, but pBufferOut_VA will be assigned with pBuffer_VA
int VCodecSwitchMemType(IN void            *pBuffer_VA,
                        IN unsigned int    u4Size,
                        IN VCODEC_MEMORY_TYPE_T eMemType,
                        OUT void           **pBufferOut_VA
                       );

// VCodecFlushCachedBuffer - u4Size is in byte
void VCodecFlushCachedBuffer(IN void         *pBuffer_VA,
                             IN unsigned int u4Size
                            );

// VCodecInvalidateCachedBuffer - u4Size is in byte
void VCodecInvalidateCachedBuffer(IN void         *pBuffer_VA,
                                  IN unsigned int  u4Size
                                 );

void VCodecFlushCachedBufferAll(void);

void VCodecInvalidateCachedBufferAll(void);

void VCodecFlushInvalidateCacheBufferAll(void);

void  VCodecMemSet(IN void                *pBuffer_VA,
                   IN char                cValue,
                   IN unsigned int        u4Length
                  );

void  VCodecMemCopy(IN void             *pvDest ,
                    IN const void       *pvSrc ,
                    IN unsigned int      u4Length
                   );
typedef struct
{
    void *pBuffer_PA;                  ///< [IN]     The physical memory address
    unsigned int u4MemSize;      ///< [IN]     The memory size to be mapped
    void *pBuffer_VA;               ///< [OUT]     The mapped virtual memory address
} VCODEC_OAL_MMAP_T;

void VCodecMMAP(VCODEC_OAL_MMAP_T *prParam);
void VCodecUnMMAP(VCODEC_OAL_MMAP_T *prParam);


typedef enum
{
    VCODEC_OAL_VDEC,
    VCODEC_OAL_VENC
} VCODEC_OAL_CODEC;

typedef struct
{
    unsigned int u4ReadAddr;            /// [IN]    memory source address in VA
    unsigned int u4ReadData;            /// [OUT]   memory data
} VCODEC_OAL_MEM_STAUTS_T;

typedef struct
{
    unsigned int u4HWIsCompleted;                         ///< [IOUT]    HW is Completed or not, set by driver & clear by codec (0: not completed or still in lock status; 1: HW is completed or in unlock status)
    unsigned int u4HWIsTimeout;                            ///< [OUT]    HW is Timeout or not, set by driver & clear by codec (0: not in timeout status; 1: HW is in timeout status)
    unsigned int u4NumOfRegister;       ///< [IN]     Number of HW register need to store;
    VCODEC_OAL_MEM_STAUTS_T *pHWStatus;  ///< [OUT]    HW status based on input address.
} VCODEC_OAL_HW_REGISTER_T;

typedef struct
{
    void *pvHandle;                  ///< [IN]     The video codec handle
    void *pvIsrFunction;            ///< [IN]     The isr function
    unsigned int u4TimeoutMs;       ///< [IN]     The timeout in ms
    VCODEC_OAL_CODEC eCodec; ///< [IN]     VDEC or VENC interrupt
} VCODEC_OAL_ISR_T;

// return value: HW is completed (1) or not (0) when function return
int VCodecWaitISR(VCODEC_OAL_ISR_T *prParam);


typedef struct
{
    void *pvHandle;                               ///< [IN]     The video codec handle
    unsigned int u4TimeoutMs;             ///< [IN]     The timeout ms
} VCODEC_OAL_HW_LOCK_T;

// return value: HW is completed (1) or not (0) when function return
int VCodecLockHW(VCODEC_OAL_HW_LOCK_T *prParam);

// return value: HW is completed (1) or not (0) when function return
int VCodecUnLockHW(VCODEC_OAL_HW_LOCK_T *prParam);


void VCodecInitHWLock(VCODEC_OAL_HW_REGISTER_T *prParam);

void VCodecDeInitHWLock(VCODEC_OAL_HW_REGISTER_T *prParam);


/****** Pthread define******/
#ifdef WIN32
#define VCODEC_PTHREAD_PROCESS_PRIVATE  0
#define VCODEC_PTHREAD_PROCESS_SHARED   1
#define VCODEC_PTHREAD_CREATE_JOINABLE  0
#define VCODEC_PTHREAD_CREATE_DETACHED  1
#define VCODEC_PTHREAD_SCOPE_PROCESS    0
#define VCODEC_PTHREAD_SCOPE_SYSTEM     1
#define VCODEC_PTHREAD_ONCE_INIT    0
typedef volatile int  VCODEC_PTHREAD_ONCE_T;

typedef int VCODEC_PTHREAD_ATTR_T;

typedef int VCODEC_PTHREAD_MUTEXATTR_T;
typedef int VCODEC_PTHREAD_CONDATTR_T;
typedef CRITICAL_SECTION VCODEC_PTHREAD_MUTEX_T;

typedef struct
{
    void *handle;
    void *(*func)( void* arg );
    void *arg;
    void *ret;
} VCODEC_PTHREAD_T;


typedef struct
{
  int interlock;
  VCODEC_PTHREAD_MUTEX_T mutex;
}VCODEC_PTHREAD_SPINLOCK_T;
typedef struct
{
    void *ptr;
} VCODEC_PTHREAD_COND_T;
#elif defined(ANDROID)
#define VCODEC_PTHREAD_PROCESS_PRIVATE  0
#define VCODEC_PTHREAD_PROCESS_SHARED   1
#define VCODEC_PTHREAD_CREATE_JOINABLE  0
#define VCODEC_PTHREAD_CREATE_DETACHED  1
#define VCODEC_PTHREAD_SCOPE_PROCESS    0
#define VCODEC_PTHREAD_SCOPE_SYSTEM     1
#define VCODEC_PTHREAD_ONCE_INIT    0
typedef long VCODEC_PTHREAD_T;
typedef volatile int  VCODEC_PTHREAD_ONCE_T;
typedef long VCODEC_PTHREAD_MUTEXATTR_T;
typedef long VCODEC_PTHREAD_CONDATTR_T;
typedef struct
{
    unsigned int flags;
    void *stack_base;
    unsigned int stack_size;
    unsigned int guard_size;
    unsigned int sched_policy;
    unsigned int sched_priority;
} VCODEC_PTHREAD_ATTR_T;

typedef struct
{
    int volatile value;
} VCODEC_PTHREAD_MUTEX_T;

typedef struct
{
    int volatile value;
} VCODEC_PTHREAD_COND_T;

typedef struct
{
    int interlock;
    VCODEC_PTHREAD_MUTEX_T mutex;
} VCODEC_PTHREAD_SPINLOCK_T;
/****** End of Pthread define******/
#elif defined(LINUX)
#define VCODEC_PTHREAD_CREATE_JOINABLE  0
#define VCODEC_PTHREAD_CREATE_DETACHED  1
#define VCODEC_SIZEOF_PTHREAD_ATTR_T 36
#define VCODEC_SIZEOF_PTHREAD_MUTEX_T 24
#define VCODEC_SIZEOF_PTHREAD_MUTEXATTR_T 4
#define VCODEC_SIZEOF_PTHREAD_COND_T 48
#define VCODEC_SIZEOF_PTHREAD_COND_COMPAT_T 12
#define VCODEC_SIZEOF_PTHREAD_CONDATTR_T 4
typedef unsigned long int VCODEC_PTHREAD_T;
typedef union
{
  char __size[VCODEC_SIZEOF_PTHREAD_ATTR_T];
  long int _align;
} VCODEC_PTHREAD_ATTR_T;
typedef struct VCODEC_PTHREAD_INTERNAL_SLIST
{
  struct VCODEC_PTHREAD_INTERNAL_SLIST *__next;
} VCODEC_PTHREAD_SLIST_T;
typedef union
{
  struct VCODEC_PTHREAD_MUTEX_S
  {
    int __lock;
    unsigned int __count;
    int __owner;
    int __kind;
    unsigned int __nusers;
    __extension__ union
    {
      int __spins;
      VCODEC_PTHREAD_SLIST_T __list;
    };
  } __data;
  char __size[VCODEC_SIZEOF_PTHREAD_MUTEX_T];
  long int _align;
} VCODEC_PTHREAD_MUTEX_T;
typedef union
{
  char __size[VCODEC_SIZEOF_PTHREAD_MUTEXATTR_T];
  long int _align;
} VCODEC_PTHREAD_MUTEXATTR_T;
typedef union
{
  struct
  {
    int __lock;
    unsigned int __futex;
    __extension__ unsigned long long int __total_seq;
    __extension__ unsigned long long int __wakeup_seq;
    __extension__ unsigned long long int __woken_seq;
    void *__mutex;
    unsigned int __nwaiters;
    unsigned int __broadcast_seq;
  } __data;
  char __size[VCODEC_SIZEOF_PTHREAD_COND_T];
  __extension__ long long int _align;
} VCODEC_PTHREAD_COND_T;
typedef union
{
  char __size[VCODEC_SIZEOF_PTHREAD_CONDATTR_T];
  long int _align;
} VCODEC_PTHREAD_CONDATTR_T;
typedef int VCODEC_PTHREAD_ONCE_T;
typedef volatile int VCODEC_PTHREAD_SPINLOCK_T;
#else
#error "platform undefined. @ vcodec_OAL.h"
#endif //endif WIN32


typedef enum
{
    VCODEC_OAL_ERROR_NONE,
    VCODEC_OAL_ERROR_ERROR,
    VCODEC_OAL_ERROR_ASSERT_FAIL,
    VCODEC_OAL_ERROR_ATTR_NOT_SUPPORT,
    NUM_OF_VCODEC_OAL_ERROR_TYPE
} VCODEC_OAL_ERROR_T;

/* Semaphore */

typedef struct
{
    volatile unsigned int  count;
} VCODEC_OAL_SEM_T;


int VCodecPthread_attr_init(OUT VCODEC_PTHREAD_ATTR_T *attr);
int VCodecPthread_attr_destroy(IN VCODEC_PTHREAD_ATTR_T *attr);
int VCodecPthread_attr_getdetachstate(IN const VCODEC_PTHREAD_ATTR_T *attr,
                                      OUT int *detachstate);
int VCodecPthread_attr_setdetachstate(IN VCODEC_PTHREAD_ATTR_T *attr,
                                      IN  int detachstate);
int VCodecPthread_create(OUT VCODEC_PTHREAD_T *thread,
                         IN  const VCODEC_PTHREAD_ATTR_T *attr,
                         IN  void * (*start_routine)(void *),
                         IN  void *arg);
int  VCodecPthread_kill(IN VCODEC_PTHREAD_T tid, IN  int sig);
void VCodecPthread_exit(OUT void *retval);
int  VCodecPthread_join(IN  VCODEC_PTHREAD_T thid, OUT void **ret_val);
int  VCodecPthread_once(IN VCODEC_PTHREAD_ONCE_T  *once_control,  IN void (*init_routine)(void));
VCODEC_PTHREAD_T VCodecPthread_self(void);
int VCodecPthread_mutexattr_init(OUT VCODEC_PTHREAD_MUTEXATTR_T *attr);
int VCodecPthread_mutexattr_destroy(IN VCODEC_PTHREAD_MUTEXATTR_T *attr);
int VCodecPthread_mutex_init(OUT VCODEC_PTHREAD_MUTEX_T *mutex, IN  const VCODEC_PTHREAD_MUTEXATTR_T *attr);
int VCodecPthread_mutex_destroy(IN VCODEC_PTHREAD_MUTEX_T *mutex);
int VCodecPthread_mutex_lock(IN VCODEC_PTHREAD_MUTEX_T *mutex);
int VCodecPthread_mutex_unlock(IN VCODEC_PTHREAD_MUTEX_T *mutex);
int VCodecPthread_mutex_trylock(IN VCODEC_PTHREAD_MUTEX_T *mutex);
int VCodecPthread_spin_init(OUT VCODEC_PTHREAD_SPINLOCK_T *lock, IN  int pshared);
int VCodecPthread_spin_destroy(IN VCODEC_PTHREAD_SPINLOCK_T *lock);
int VCodecPthread_spin_lock(IN VCODEC_PTHREAD_SPINLOCK_T *lock);
int VCodecPthread_spin_trylock(IN VCODEC_PTHREAD_SPINLOCK_T *lock);
int VCodecPthread_spin_unlock(IN VCODEC_PTHREAD_SPINLOCK_T *lock);
int VCodecPthread_condattr_init(OUT VCODEC_PTHREAD_CONDATTR_T *attr);
int VCodecPthread_condattr_destroy(IN VCODEC_PTHREAD_CONDATTR_T *attr);
int VCodecPthread_cond_init(OUT VCODEC_PTHREAD_COND_T *cond, IN const VCODEC_PTHREAD_CONDATTR_T *attr);
int VCodecPthread_cond_destroy(IN VCODEC_PTHREAD_COND_T *cond);
int VCodecPthread_cond_broadcast(IN VCODEC_PTHREAD_COND_T *cond);
int VCodecPthread_cond_signal(IN VCODEC_PTHREAD_COND_T *cond);
int VCodecPthread_cond_wait(IN VCODEC_PTHREAD_COND_T *cond, IN VCODEC_PTHREAD_MUTEX_T *mutex);

VCODEC_OAL_ERROR_T VCodecBindingCore(IN  VCODEC_PTHREAD_T tid,
                                     IN  unsigned int u4Mask);
VCODEC_OAL_ERROR_T VCodecDeBindingCore(IN  VCODEC_PTHREAD_T tid);
VCODEC_OAL_ERROR_T VCodecGetAffinity(IN  VCODEC_PTHREAD_T tid,
                                     OUT  unsigned int *pu4Mask,
                                     OUT  unsigned int *pu4SetMask);
VCODEC_OAL_ERROR_T VCodecCoreLoading(IN  int s4CPUid,
                                     OUT int *ps4Loading);
VCODEC_OAL_ERROR_T VCodecCoreNumber(OUT int *ps4CPUNums);
void VCodecSleep(IN unsigned int u4Tick);
int VCodec_sem_init(IN VCODEC_OAL_SEM_T *sem,
                    IN int pshared,
                    IN unsigned int value);
int VCodec_sem_destroy(IN VCODEC_OAL_SEM_T *sem);
int VCodec_sem_post(IN VCODEC_OAL_SEM_T *sem);
int VCodec_sem_wait(IN VCODEC_OAL_SEM_T *sem);

int VCodecCheck_Version(IN int version);

#define VCodecOALPrintf(...) rVCODEC_OAL_Function.VCodecPrintf(__VA_ARGS__);

VCODEC_OAL_ERROR_T VCodecConfigMCIPort(IN unsigned int u4PortConfig, OUT unsigned int *pu4PortResult, IN VCODEC_CODEC_TYPE_T eCodecType);
typedef struct
{

    void (*VCodecQueryMemType)(IN void            *pBuffer_VA,
                               IN unsigned int    u4Size,
                               OUT VCODEC_MEMORY_TYPE_T *peMemType);

    void (*VCodecQueryPhysicalAddr)(IN void       *pBuffer_VA,
                                    OUT void     **pBufferOut_PA);

    // VCodecSwitchMemType - return 0 if success.
    //                       return -1 if failed, but pBufferOut_VA will be assigned with pBuffer_VA
    int (*VCodecSwitchMemType)(IN void            *pBuffer_VA,
                               IN unsigned int    u4Size,
                               IN VCODEC_MEMORY_TYPE_T eMemType,
                               OUT void           **pBufferOut_VA);

    // VCodecFlushCachedBuffer - u4Size is in byte
    void (*VCodecFlushCachedBuffer)(IN void         *pBuffer_VA,
                                    IN unsigned int u4Size);

    // VCodecInvalidateCachedBuffer - u4Size is in byte
    void (*VCodecInvalidateCachedBuffer)(IN void         *pBuffer_VA,
                                         IN unsigned int   u4Size);

    void (*VCodecFlushCachedBufferAll)(void);

    void (*VCodecInvalidateCachedBufferAll)(void);

    void (*VCodecFlushInvalidateCacheBufferAll)(void);

    void (*VCodecMemSet)(IN void                *pBuffer_VA,
                         IN char                cValue,
                         IN unsigned int        u4Length);

    void (*VCodecMemCopy)(IN void             *pvDest ,
                          IN const void      *pvSrc ,
                          IN unsigned int      u4Length);

    void (*VCodecAssertFail)(IN char *ptr,
                             IN int i4Line,
                             IN int i4Arg);

    void (*VCodecMMAP)(VCODEC_OAL_MMAP_T *prParam);
    void (*VCodecUnMMAP)(VCODEC_OAL_MMAP_T *prParam);
    int (*VCodecWaitISR)(VCODEC_OAL_ISR_T *prParam);
    int (*VCodecLockHW)(VCODEC_OAL_HW_LOCK_T *prParam);
    int (*VCodecUnLockHW)(VCODEC_OAL_HW_LOCK_T *prParam);

    void (*VCodecInitHWLock)(IN VCODEC_OAL_HW_REGISTER_T *prParam);

    void (*VCodecDeInitHWLock)(IN VCODEC_OAL_HW_REGISTER_T *prParam);
    int (*VCodecCheck_Version)(IN int version);
    /************  Multi-thread function ***********/

    /***** Thread Management Functions ******/
    int (*VCodecPthread_attr_init)(OUT VCODEC_PTHREAD_ATTR_T *attr);
    int (*VCodecPthread_attr_destroy)(IN VCODEC_PTHREAD_ATTR_T *attr);
    int (*VCodecPthread_attr_getdetachstate)(IN const VCODEC_PTHREAD_ATTR_T *attr,
                                             OUT int *detachstate);
    int (*VCodecPthread_attr_setdetachstate)(IN VCODEC_PTHREAD_ATTR_T *attr,
                                             IN  int detachstate);
    int (*VCodecPthread_create)(OUT VCODEC_PTHREAD_T *thread,
                                IN  const VCODEC_PTHREAD_ATTR_T *attr,
                                IN  void * (*start_routine)(void *),
                                IN  void *arg);
    int (*VCodecPthread_kill)(IN VCODEC_PTHREAD_T tid,
                              IN  int sig);
    void (*VCodecPthread_exit)(OUT void *retval);
    int (*VCodecPthread_join)(IN  VCODEC_PTHREAD_T thid,
                              OUT void **ret_val);
    int (*VCodecPthread_once)(IN VCODEC_PTHREAD_ONCE_T  *once_control,
                              IN void (*init_routine)(void));
    VCODEC_PTHREAD_T(*VCodecPthread_self)(void);

    /***** Mutex Functions ******/
    int (*VCodecPthread_mutexattr_init)(OUT VCODEC_PTHREAD_MUTEXATTR_T *attr);
    int (*VCodecPthread_mutexattr_destroy)(IN VCODEC_PTHREAD_MUTEXATTR_T *attr);
    int (*VCodecPthread_mutex_init)(OUT VCODEC_PTHREAD_MUTEX_T *mutex,
                                    IN  const VCODEC_PTHREAD_MUTEXATTR_T *attr);
    int (*VCodecPthread_mutex_destroy)(IN VCODEC_PTHREAD_MUTEX_T *mutex);
    int (*VCodecPthread_mutex_lock)(IN VCODEC_PTHREAD_MUTEX_T *mutex);
    int (*VCodecPthread_mutex_unlock)(IN VCODEC_PTHREAD_MUTEX_T *mutex);
    int (*VCodecPthread_mutex_trylock)(IN VCODEC_PTHREAD_MUTEX_T *mutex);

    /***** Spin Functions ******/
    int (*VCodecPthread_spin_init)(OUT VCODEC_PTHREAD_SPINLOCK_T *lock,
                                   IN  int pshared);
    int (*VCodecPthread_spin_destroy)(IN VCODEC_PTHREAD_SPINLOCK_T *lock);
    int (*VCodecPthread_spin_lock)(IN VCODEC_PTHREAD_SPINLOCK_T *lock);
    int (*VCodecPthread_spin_trylock)(IN VCODEC_PTHREAD_SPINLOCK_T *lock);
    int (*VCodecPthread_spin_unlock)(IN VCODEC_PTHREAD_SPINLOCK_T *lock);

    /***** Condition Variable Functions ******/
    int (*VCodecPthread_condattr_init)(OUT VCODEC_PTHREAD_CONDATTR_T *attr);
    int (*VCodecPthread_condattr_destroy)(IN VCODEC_PTHREAD_CONDATTR_T *attr);
    int (*VCodecPthread_cond_init)(OUT VCODEC_PTHREAD_COND_T *cond,
                                   IN  const VCODEC_PTHREAD_CONDATTR_T *attr);
    int (*VCodecPthread_cond_destroy)(IN VCODEC_PTHREAD_COND_T *cond);
    int (*VCodecPthread_cond_broadcast)(IN VCODEC_PTHREAD_COND_T *cond);
    int (*VCodecPthread_cond_signal)(IN VCODEC_PTHREAD_COND_T *cond);
    int (*VCodecPthread_cond_wait)(IN VCODEC_PTHREAD_COND_T *cond,
                                   IN  VCODEC_PTHREAD_MUTEX_T *mutex);

    /************  End of Multi-thread function ***********/

    /***** Semaphore Functions ******/

    int (*VCodec_sem_init)(IN VCODEC_OAL_SEM_T *sem,
                           IN int pshared,
                           IN unsigned int value);

    int (*VCodec_sem_destroy)(IN VCODEC_OAL_SEM_T *sem);

    int (*VCodec_sem_post)(IN VCODEC_OAL_SEM_T *sem);

    int (*VCodec_sem_wait)(IN VCODEC_OAL_SEM_T *sem);

    /***** Binding Functions ******/

    VCODEC_OAL_ERROR_T(*VCodecBindingCore)(IN  VCODEC_PTHREAD_T tid,
                                           IN  unsigned int u4SetMask);
    VCODEC_OAL_ERROR_T(*VCodecDeBindingCore)(IN  VCODEC_PTHREAD_T tid);

    VCODEC_OAL_ERROR_T(*VCodecGetAffinity)(IN  VCODEC_PTHREAD_T tid,
                                           OUT  unsigned int *pu4CPUMask,
                                           OUT  unsigned int *pu4SetMask);

    VCODEC_OAL_ERROR_T(*VCodecCoreLoading)(IN  int s4CPUid,
                                           OUT int *ps4Loading);
    VCODEC_OAL_ERROR_T(*VCodecCoreNumber)(OUT int *ps4CPUNums);
    /***** Others Functions ******/
    void (*VCodecSleep)(IN unsigned int u4Tick);

    VCODEC_OAL_ERROR_T(*VCodecConfigMCIPort)(IN unsigned int u4PortConfig, OUT unsigned int *pu4PortResult, IN VCODEC_CODEC_TYPE_T eCodecType);

    VCODEC_OAL_ERROR_T(*VCodecPrintf)(IN const char *_Format, ...);

} VCODEC_OAL_CALLBACK_T;

extern VCODEC_OAL_CALLBACK_T rVCODEC_OAL_Function;
int VCodecOALInit(IN VCODEC_OAL_CALLBACK_T *prVCODEC_OAL_Function);

#endif /* VCODEC_OAL_H */