1 /* 2 * Copyright (c) 2022 Samsung Electronics Co., Ltd. 3 * All Rights Reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * - Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * - Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * - Neither the name of the copyright owner, nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef __OAPV_H__3342320849320483827648324783920483920432847382948__ 33 #define __OAPV_H__3342320849320483827648324783920483920432847382948__ 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 #ifdef OAPV_STATIC_DEFINE 40 #define OAPV_EXPORT 41 #else 42 #include <oapv/oapv_exports.h> 43 #endif 44 45 46 /* size of macroblock */ 47 #define OAPV_LOG2_MB (4) 48 #define OAPV_LOG2_MB_W (4) 49 #define OAPV_LOG2_MB_H (4) 50 #define OAPV_MB_W (1 << OAPV_LOG2_MB_W) 51 #define OAPV_MB_H (1 << OAPV_LOG2_MB_H) 52 #define OAPV_MB_D (OAPV_MB_W * OAPV_MB_H) 53 54 /* size of block */ 55 #define OAPV_LOG2_BLK (3) 56 #define OAPV_LOG2_BLK_W (3) 57 #define OAPV_LOG2_BLK_H (3) 58 #define OAPV_BLK_W (1 << OAPV_LOG2_BLK) 59 #define OAPV_BLK_H (1 << OAPV_LOG2_BLK) 60 #define OAPV_BLK_D (OAPV_BLK_W * OAPV_BLK_H) 61 62 /* size of tile */ 63 #define OAPV_MAX_TILE_ROWS (20) 64 #define OAPV_MAX_TILE_COLS (20) 65 #define OAPV_MAX_TILES (OAPV_MAX_TILE_ROWS * OAPV_MAX_TILE_COLS) 66 #define OAPV_MIN_TILE_W_MB (16) 67 #define OAPV_MIN_TILE_H_MB (8) 68 69 /* maximum number of thread */ 70 #define OAPV_MAX_THREADS (32) 71 72 /***************************************************************************** 73 * return values and error code 74 *****************************************************************************/ 75 #define OAPV_OK (0) 76 #define OAPV_ERR (-1) /* generic error */ 77 #define OAPV_ERR_INVALID_ARGUMENT (-101) 78 #define OAPV_ERR_OUT_OF_MEMORY (-102) 79 #define OAPV_ERR_REACHED_MAX (-103) 80 #define OAPV_ERR_UNSUPPORTED (-104) 81 #define OAPV_ERR_UNEXPECTED (-105) 82 #define OAPV_ERR_UNSUPPORTED_COLORSPACE (-201) 83 #define OAPV_ERR_MALFORMED_BITSTREAM (-202) 84 #define OAPV_ERR_OUT_OF_BS_BUF (-203) /* too small bitstream buffer */ 85 #define OAPV_ERR_NOT_FOUND (-204) 86 #define OAPV_ERR_FAILED_SYSCALL (-301) /* failed system call */ 87 #define OAPV_ERR_UNKNOWN (-32767) /* unknown error */ 88 89 /* return value checking */ 90 #define OAPV_SUCCEEDED(ret) ((ret) >= OAPV_OK) 91 #define OAPV_FAILED(ret) ((ret) < OAPV_OK) 92 93 /***************************************************************************** 94 * color spaces 95 * - value format = (endian << 14) | (bit-depth << 8) | (color format) 96 * - endian (1bit): little endian = 0, big endian = 1 97 * - bit-depth (6bit): 0~63 98 * - color format (8bit): 0~255 99 *****************************************************************************/ 100 /* color formats */ 101 #define OAPV_CF_UNKNOWN (0) /* unknown color format */ 102 #define OAPV_CF_YCBCR400 (10) /* Y only */ 103 #define OAPV_CF_YCBCR420 (11) /* YCbCr 420 */ 104 #define OAPV_CF_YCBCR422 (12) /* YCBCR 422 narrow chroma*/ 105 #define OAPV_CF_YCBCR444 (13) /* YCBCR 444*/ 106 #define OAPV_CF_YCBCR4444 (14) /* YCBCR 4444*/ 107 #define OAPV_CF_YCBCR422N OAPV_CF_YCBCR422 108 #define OAPV_CF_YCBCR422W (18) /* YCBCR422 wide chroma */ 109 #define OAPV_CF_PLANAR2 (20) /* Planar Y, Combined CB-CR, 422 */ 110 111 /* macro for color space */ 112 #define OAPV_CS_GET_FORMAT(cs) (((cs) >> 0) & 0xFF) 113 #define OAPV_CS_GET_BIT_DEPTH(cs) (((cs) >> 8) & 0x3F) 114 #define OAPV_CS_GET_BYTE_DEPTH(cs) ((OAPV_CS_GET_BIT_DEPTH(cs) + 7) >> 3) 115 #define OAPV_CS_GET_ENDIAN(cs) (((cs) >> 14) & 0x1) 116 #define OAPV_CS_SET(f, bit, e) (((e) << 14) | ((bit) << 8) | (f)) 117 #define OAPV_CS_SET_FORMAT(cs, v) (((cs) & ~0xFF) | ((v) << 0)) 118 #define OAPV_CS_SET_BIT_DEPTH(cs, v) (((cs) & ~(0x3F << 8)) | ((v) << 8)) 119 #define OAPV_CS_SET_ENDIAN(cs, v) (((cs) & ~(0x1 << 14)) | ((v) << 14)) 120 121 /* pre-defined color spaces */ 122 #define OAPV_CS_UNKNOWN OAPV_CS_SET(0, 0, 0) 123 #define OAPV_CS_YCBCR400 OAPV_CS_SET(OAPV_CF_YCBCR400, 8, 0) 124 #define OAPV_CS_YCBCR420 OAPV_CS_SET(OAPV_CF_YCBCR420, 8, 0) 125 #define OAPV_CS_YCBCR422 OAPV_CS_SET(OAPV_CF_YCBCR422, 8, 0) 126 #define OAPV_CS_YCBCR444 OAPV_CS_SET(OAPV_CF_YCBCR444, 8, 0) 127 #define OAPV_CS_YCBCR4444 OAPV_CS_SET(OAPV_CF_YCBCR4444, 8, 0) 128 #define OAPV_CS_YCBCR400_10LE OAPV_CS_SET(OAPV_CF_YCBCR400, 10, 0) 129 #define OAPV_CS_YCBCR420_10LE OAPV_CS_SET(OAPV_CF_YCBCR420, 10, 0) 130 #define OAPV_CS_YCBCR422_10LE OAPV_CS_SET(OAPV_CF_YCBCR422, 10, 0) 131 #define OAPV_CS_YCBCR444_10LE OAPV_CS_SET(OAPV_CF_YCBCR444, 10, 0) 132 #define OAPV_CS_YCBCR4444_10LE OAPV_CS_SET(OAPV_CF_YCBCR4444, 10, 0) 133 #define OAPV_CS_YCBCR400_12LE OAPV_CS_SET(OAPV_CF_YCBCR400, 12, 0) 134 #define OAPV_CS_YCBCR420_12LE OAPV_CS_SET(OAPV_CF_YCBCR420, 12, 0) 135 #define OAPV_CS_YCBCR400_14LE OAPV_CS_SET(OAPV_CF_YCBCR400, 14, 0) 136 #define OAPV_CS_YCBCR420_14LE OAPV_CS_SET(OAPV_CF_YCBCR420, 14, 0) 137 #define OAPV_CS_P210 OAPV_CS_SET(OAPV_CF_PLANAR2, 10, 0) 138 139 /* max number of color channel: ex) YCbCr4444 -> 4 channels */ 140 #define OAPV_MAX_CC (4) 141 142 /***************************************************************************** 143 * config types 144 *****************************************************************************/ 145 #define OAPV_CFG_SET_QP (201) 146 #define OAPV_CFG_SET_BPS (202) 147 #define OAPV_CFG_SET_FPS_NUM (204) 148 #define OAPV_CFG_SET_FPS_DEN (205) 149 #define OAPV_CFG_SET_QP_MIN (208) 150 #define OAPV_CFG_SET_QP_MAX (209) 151 #define OAPV_CFG_SET_USE_FRM_HASH (301) 152 #define OAPV_CFG_GET_QP_MIN (600) 153 #define OAPV_CFG_GET_QP_MAX (601) 154 #define OAPV_CFG_GET_QP (602) 155 #define OAPV_CFG_GET_RCT (603) 156 #define OAPV_CFG_GET_BPS (604) 157 #define OAPV_CFG_GET_FPS_NUM (605) 158 #define OAPV_CFG_GET_FPS_DEN (606) 159 #define OAPV_CFG_GET_WIDTH (701) 160 #define OAPV_CFG_GET_HEIGHT (702) 161 162 /***************************************************************************** 163 * HLS configs 164 *****************************************************************************/ 165 #define OAPV_MAX_GRP_SIZE ((1 << 16) - 1) // 0xFFFF reserved 166 167 /***************************************************************************** 168 * PBU types 169 *****************************************************************************/ 170 #define OAPV_PBU_TYPE_RESERVED (0) 171 #define OAPV_PBU_TYPE_PRIMARY_FRAME (1) 172 #define OAPV_PBU_TYPE_NON_PRIMARY_FRAME (2) 173 #define OAPV_PBU_TYPE_PREVIEW_FRAME (25) 174 #define OAPV_PBU_TYPE_DEPTH_FRAME (26) 175 #define OAPV_PBU_TYPE_ALPHA_FRAME (27) 176 #define OAPV_PBU_TYPE_AU_INFO (65) 177 #define OAPV_PBU_TYPE_METADATA (66) 178 #define OAPV_PBU_TYPE_FILLER (67) 179 #define OAPV_PBU_TYPE_UNKNOWN (-1) 180 #define OAPV_PBU_NUMS (10) 181 182 #define OAPV_PBU_FRAME_TYPE_NUM (5) 183 184 /***************************************************************************** 185 * metadata types 186 *****************************************************************************/ 187 #define OAPV_METADATA_ITU_T_T35 (4) 188 #define OAPV_METADATA_MDCV (5) 189 #define OAPV_METADATA_CLL (6) 190 #define OAPV_METADATA_FILLER (10) 191 #define OAPV_METADATA_USER_DEFINED (170) 192 193 /***************************************************************************** 194 * profiles 195 *****************************************************************************/ 196 #define OAPV_PROFILE_422_10 (33) 197 198 /***************************************************************************** 199 * optimization level control 200 *****************************************************************************/ 201 #define OAPV_PRESET_FASTEST (0) 202 #define OAPV_PRESET_FAST (1) 203 #define OAPV_PRESET_MEDIUM (2) 204 #define OAPV_PRESET_SLOW (3) 205 #define OAPV_PRESET_PLACEBO (4) 206 #define OAPV_PRESET_DEFAULT OAPV_PRESET_MEDIUM 207 208 /***************************************************************************** 209 * rate-control types 210 *****************************************************************************/ 211 #define OAPV_RC_CQP (0) 212 #define OAPV_RC_ABR (1) 213 214 /***************************************************************************** 215 * type and macro for media time 216 *****************************************************************************/ 217 typedef long long oapv_mtime_t; /* in 100-nanosec unit */ 218 219 /***************************************************************************** 220 * image buffer format 221 * 222 * baddr 223 * +---------------------------------------------------+ --- 224 * | | ^ 225 * | | | | 226 * | a v | | 227 * | --- +-----------------------------------+ --- | | 228 * | ^ | (x, y) | y | | 229 * | | | +---------------------------+ + --- | | 230 * | | | | | | ^ | | 231 * | | | | /\ | | | | | 232 * | | | | / \ | | | | | 233 * | | | | / \ | | | | | 234 * | | | +--------------------+ | | | 235 * | ah | | \ / | | h | e 236 * | | | +----------------+ | | | 237 * | | | | | | | | | | | 238 * | | | | @ O O @ | | | | | 239 * | | | | \ ~ / | | v | | 240 * | | | +---------------------------+ | --- | | 241 * | v | | | | 242 * | --- +---+-------------------------------+ | | 243 * | ->| x |<----------- w ----------->| | | 244 * | |<--------------- aw -------------->| | | 245 * | | v 246 * +---------------------------------------------------+ --- 247 * 248 * |<---------------------- s ------------------------>| 249 * 250 * - x, y, w, aw, h, ah : unit of pixel 251 * - s, e : unit of byte 252 *****************************************************************************/ 253 254 typedef struct oapv_imgb oapv_imgb_t; 255 struct oapv_imgb { 256 int cs; /* color space */ 257 int np; /* number of plane */ 258 /* width (in unit of pixel) */ 259 int w[OAPV_MAX_CC]; 260 /* height (in unit of pixel) */ 261 int h[OAPV_MAX_CC]; 262 /* X position of left top (in unit of pixel) */ 263 int x[OAPV_MAX_CC]; 264 /* Y postion of left top (in unit of pixel) */ 265 int y[OAPV_MAX_CC]; 266 /* buffer stride (in unit of byte) */ 267 int s[OAPV_MAX_CC]; 268 /* buffer elevation (in unit of byte) */ 269 int e[OAPV_MAX_CC]; 270 /* address of each plane */ 271 void *a[OAPV_MAX_CC]; 272 273 /* hash data for signature */ 274 unsigned char hash[OAPV_MAX_CC][16]; 275 276 /* time-stamps */ 277 oapv_mtime_t ts[4]; 278 279 int ndata[4]; /* arbitrary data, if needs */ 280 void *pdata[4]; /* arbitrary adedress if needs */ 281 282 /* aligned width (in unit of pixel) */ 283 int aw[OAPV_MAX_CC]; 284 /* aligned height (in unit of pixel) */ 285 int ah[OAPV_MAX_CC]; 286 287 /* left padding size (in unit of pixel) */ 288 int padl[OAPV_MAX_CC]; 289 /* right padding size (in unit of pixel) */ 290 int padr[OAPV_MAX_CC]; 291 /* up padding size (in unit of pixel) */ 292 int padu[OAPV_MAX_CC]; 293 /* bottom padding size (in unit of pixel) */ 294 int padb[OAPV_MAX_CC]; 295 296 /* address of actual allocated buffer */ 297 void *baddr[OAPV_MAX_CC]; 298 /* actual allocated buffer size */ 299 int bsize[OAPV_MAX_CC]; 300 301 /* life cycle management */ 302 int refcnt; 303 int (*addref)(oapv_imgb_t *imgb); 304 int (*getref)(oapv_imgb_t *imgb); 305 int (*release)(oapv_imgb_t *imgb); 306 }; 307 308 typedef struct oapv_frm oapv_frm_t; 309 struct oapv_frm { 310 oapv_imgb_t *imgb; 311 int pbu_type; 312 int group_id; 313 }; 314 315 #define OAPV_MAX_NUM_FRAMES (16) // max number of frames in an access unit 316 #define OAPV_MAX_NUM_METAS (16) // max number of metadata in an access unit 317 318 typedef struct oapv_frms oapv_frms_t; 319 struct oapv_frms { 320 int num_frms; // number of frames 321 oapv_frm_t frm[OAPV_MAX_NUM_FRAMES]; // container of frames 322 }; 323 324 /***************************************************************************** 325 * Bitstream buffer 326 *****************************************************************************/ 327 typedef struct oapv_bitb oapv_bitb_t; 328 struct oapv_bitb { 329 /* user space address indicating buffer */ 330 void *addr; 331 /* physical address indicating buffer, if any */ 332 void *pddr; 333 /* byte size of buffer memory */ 334 int bsize; 335 /* byte size of bitstream in buffer */ 336 int ssize; 337 /* bitstream has an error? */ 338 int err; 339 /* arbitrary data, if needs */ 340 int ndata[4]; 341 /* arbitrary address, if needs */ 342 void *pdata[4]; 343 /* time-stamps */ 344 oapv_mtime_t ts[4]; 345 }; 346 347 /***************************************************************************** 348 * brief information of frame 349 *****************************************************************************/ 350 typedef struct oapv_frm_info oapv_frm_info_t; 351 struct oapv_frm_info { 352 int w; 353 int h; 354 int cs; 355 int pbu_type; 356 int group_id; 357 int profile_idc; 358 int level_idc; 359 int band_idc; 360 int chroma_format_idc; 361 int bit_depth; 362 int capture_time_distance; 363 /* custom quantization matrix */ 364 int use_q_matrix; 365 unsigned char q_matrix[OAPV_MAX_CC][OAPV_BLK_D]; // only meaningful if use_q_matrix is true 366 /* color description values */ 367 int color_description_present_flag; 368 unsigned char color_primaries; // only meaningful if color_description_present_flag is true 369 unsigned char transfer_characteristics; // only meaningful if color_description_present_flag is true 370 unsigned char matrix_coefficients; // only meaningful if color_description_present_flag is true 371 int full_range_flag; // only meaningful if color_description_present_flag is true 372 }; 373 374 typedef struct oapv_au_info oapv_au_info_t; 375 struct oapv_au_info { 376 int num_frms; // number of frames 377 oapv_frm_info_t frm_info[OAPV_MAX_NUM_FRAMES]; 378 }; 379 380 /***************************************************************************** 381 * coding parameters 382 *****************************************************************************/ 383 typedef struct oapve_param oapve_param_t; 384 struct oapve_param { 385 /* profile_idc */ 386 int profile_idc; 387 /* level */ 388 int level_idc; 389 /* band */ 390 int band_idc; 391 /* width of input frame */ 392 int w; 393 /* height of input frame */ 394 int h; 395 /* frame rate (Hz) numerator, denominator */ 396 int fps_num; 397 int fps_den; 398 /* rate control type */ 399 int rc_type; 400 /* quantization parameters : 0 ~ (63 + (bitdepth - 10)*6) 401 - 10bit input: 0 ~ 63 402 - 12bit input: 0 ~ 75 403 */ 404 unsigned char qp; 405 /* quantization parameter offsets */ 406 signed char qp_offset_c1; 407 /* quantization parameter offsets */ 408 signed char qp_offset_c2; 409 /* quantization parameter offsets */ 410 signed char qp_offset_c3; 411 /* bitrate (unit: kbps) */ 412 int bitrate; 413 /* use filler data for tight constant bitrate */ 414 int use_filler; 415 /* use quantization matrix */ 416 int use_q_matrix; 417 unsigned char q_matrix[OAPV_MAX_CC][OAPV_BLK_D]; // raster-scan order 418 /* color space */ 419 int csp; 420 int tile_cols; 421 int tile_rows; 422 int tile_w_mb; 423 int tile_h_mb; 424 int preset; 425 /* color description values */ 426 int color_description_present_flag; 427 unsigned char color_primaries; 428 unsigned char transfer_characteristics; 429 unsigned char matrix_coefficients; 430 int full_range_flag; 431 }; 432 433 /***************************************************************************** 434 * description for encoder creation 435 *****************************************************************************/ 436 typedef struct oapve_cdesc oapve_cdesc_t; 437 struct oapve_cdesc { 438 int max_bs_buf_size; // max bitstream buffer size 439 int max_num_frms; // max number of frames to be encoded 440 int threads; // number of threads 441 oapve_param_t param[OAPV_MAX_NUM_FRAMES]; // encoding parameters 442 }; 443 444 /***************************************************************************** 445 * encoding status 446 *****************************************************************************/ 447 typedef struct oapve_stat oapve_stat_t; 448 struct oapve_stat { 449 int write; // byte size of encoded bitstream 450 oapv_au_info_t aui; // information of encoded frames 451 int frm_size[OAPV_MAX_NUM_FRAMES]; // bitstream byte size of each frame 452 }; 453 454 /***************************************************************************** 455 * description for decoder creation 456 *****************************************************************************/ 457 typedef struct oapvd_cdesc oapvd_cdesc_t; 458 struct oapvd_cdesc { 459 int threads; // number of threads 460 }; 461 462 /***************************************************************************** 463 * decoding status 464 *****************************************************************************/ 465 typedef struct oapvd_stat oapvd_stat_t; 466 struct oapvd_stat { 467 int read; // byte size of decoded bitstream (read size) 468 oapv_au_info_t aui; // information of decoded frames 469 int frm_size[OAPV_MAX_NUM_FRAMES]; // bitstream byte size of each frame 470 }; 471 472 /***************************************************************************** 473 * metadata payload 474 *****************************************************************************/ 475 typedef struct oapvm_payload oapvm_payload_t; 476 struct oapvm_payload { 477 int group_id; // group ID 478 int type; // payload type 479 unsigned char uuid[16]; // UUID for user-defined metadata payload 480 void *data; // address of metadata payload 481 int data_size; // byte size of metadata payload 482 }; 483 484 /***************************************************************************** 485 * interface for metadata container 486 *****************************************************************************/ 487 typedef void *oapvm_t; /* instance identifier for OAPV metadata container */ 488 489 oapvm_t OAPV_EXPORT oapvm_create(int *err); 490 void OAPV_EXPORT oapvm_delete(oapvm_t mid); 491 void OAPV_EXPORT oapvm_rem_all(oapvm_t mid); 492 int OAPV_EXPORT oapvm_set(oapvm_t mid, int group_id, int type, void *data, int size, unsigned char *uuid); 493 int OAPV_EXPORT oapvm_get(oapvm_t mid, int group_id, int type, void **data, int *size, unsigned char *uuid); 494 int OAPV_EXPORT oapvm_rem(oapvm_t mid, int group_id, int type, unsigned char *uuid); 495 int OAPV_EXPORT oapvm_set_all(oapvm_t mid, oapvm_payload_t *pld, int num_plds); 496 int OAPV_EXPORT oapvm_get_all(oapvm_t mid, oapvm_payload_t *pld, int *num_plds); 497 498 /***************************************************************************** 499 * interface for encoder 500 *****************************************************************************/ 501 typedef void *oapve_t; /* instance identifier for OAPV encoder */ 502 503 oapve_t OAPV_EXPORT oapve_create(oapve_cdesc_t *cdesc, int *err); 504 void OAPV_EXPORT oapve_delete(oapve_t eid); 505 int OAPV_EXPORT oapve_config(oapve_t eid, int cfg, void *buf, int *size); 506 int OAPV_EXPORT oapve_param_default(oapve_param_t *param); 507 int OAPV_EXPORT oapve_encode(oapve_t eid, oapv_frms_t *ifrms, oapvm_t mid, oapv_bitb_t *bitb, oapve_stat_t *stat, oapv_frms_t *rfrms); 508 509 /***************************************************************************** 510 * interface for decoder 511 *****************************************************************************/ 512 typedef void *oapvd_t; /* instance identifier for OAPV decoder */ 513 514 oapvd_t OAPV_EXPORT oapvd_create(oapvd_cdesc_t *cdesc, int *err); 515 void OAPV_EXPORT oapvd_delete(oapvd_t did); 516 int OAPV_EXPORT oapvd_config(oapvd_t did, int cfg, void *buf, int *size); 517 int OAPV_EXPORT oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid, oapvd_stat_t *stat); 518 519 /***************************************************************************** 520 * interface for utility 521 *****************************************************************************/ 522 int OAPV_EXPORT oapvd_info(void *au, int au_size, oapv_au_info_t *aui); 523 524 #ifdef __cplusplus 525 } /* extern "C" */ 526 #endif 527 528 #endif /* __OAPV_H__3342320849320483827648324783920483920432847382948__ */ 529