709 lines
29 KiB
C
709 lines
29 KiB
C
/*
|
|
* Copyright (c) 2022 Samsung Electronics Co., Ltd.
|
|
* 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.
|
|
*
|
|
* - Neither the name of the copyright owner, nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* 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 OWNER 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.
|
|
*/
|
|
|
|
#ifndef __OAPV_H__3342320849320483827648324783920483920432847382948__
|
|
#define __OAPV_H__3342320849320483827648324783920483920432847382948__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if defined(ANDROID) || defined(OAPV_STATIC_DEFINE)
|
|
#define OAPV_EXPORT
|
|
#else
|
|
#include <oapv/oapv_exports.h>
|
|
#endif
|
|
|
|
/*****************************************************************************
|
|
* version and related macro
|
|
* the version string follows the rule of API_SET.MAJOR.MINOR.PATCH
|
|
*****************************************************************************/
|
|
#define OAPV_VER_SET(apiset, major, minor, patch) \
|
|
(((apiset & 0xFF) << 24)|((major & 0xFF) << 16)|((minor & 0xFF) << 8)|\
|
|
(patch & 0xFF))
|
|
#define OAPV_VER_GET_APISET(v) (((v) >> 24) & 0xFF)
|
|
#define OAPV_VER_GET_MAJOR(v) (((v) >> 16) & 0xFF)
|
|
#define OAPV_VER_GET_MINOR(v) (((v) >> 8) & 0xFF)
|
|
#define OAPV_VER_GET_PATCH(v) (((v) >> 0) & 0xFF)
|
|
|
|
/* version numbers (should be changed in case of new release) */
|
|
#define OAPV_VER_APISET (0)
|
|
#define OAPV_VER_MAJOR (2)
|
|
#define OAPV_VER_MINOR (0)
|
|
#define OAPV_VER_PATCH (1)
|
|
|
|
/* 4-bytes version number */
|
|
#define OAPV_VER_NUM \
|
|
OAPV_VER_SET(OAPV_VER_APISET,OAPV_VER_MAJOR,OAPV_VER_MINOR,OAPV_VER_PATCH)
|
|
|
|
/* size of macroblock */
|
|
#define OAPV_LOG2_MB (4)
|
|
#define OAPV_LOG2_MB_W (4)
|
|
#define OAPV_LOG2_MB_H (4)
|
|
#define OAPV_MB_W (1 << OAPV_LOG2_MB_W)
|
|
#define OAPV_MB_H (1 << OAPV_LOG2_MB_H)
|
|
#define OAPV_MB_D (OAPV_MB_W * OAPV_MB_H)
|
|
|
|
/* size of block */
|
|
#define OAPV_LOG2_BLK (3)
|
|
#define OAPV_LOG2_BLK_W (3)
|
|
#define OAPV_LOG2_BLK_H (3)
|
|
#define OAPV_BLK_W (1 << OAPV_LOG2_BLK)
|
|
#define OAPV_BLK_H (1 << OAPV_LOG2_BLK)
|
|
#define OAPV_BLK_D (OAPV_BLK_W * OAPV_BLK_H)
|
|
|
|
/* size of tile */
|
|
#define OAPV_MAX_TILE_ROWS (20) // max number of tiles in row
|
|
#define OAPV_MAX_TILE_COLS (20) // max number of tiles in column
|
|
#define OAPV_MAX_TILES (OAPV_MAX_TILE_ROWS * OAPV_MAX_TILE_COLS)
|
|
#define OAPV_MIN_TILE_W_MB (16)
|
|
#define OAPV_MIN_TILE_H_MB (8)
|
|
#define OAPV_MIN_TILE_W (OAPV_MIN_TILE_W_MB << OAPV_LOG2_MB_W)
|
|
#define OAPV_MIN_TILE_H (OAPV_MIN_TILE_H_MB << OAPV_LOG2_MB_H)
|
|
|
|
/* maximum number of thread */
|
|
#define OAPV_MAX_THREADS (32)
|
|
|
|
/*****************************************************************************
|
|
* return values and error code
|
|
*****************************************************************************/
|
|
#define OAPV_OK (0)
|
|
#define OAPV_ERR (-1) /* generic error */
|
|
#define OAPV_ERR_INVALID_ARGUMENT (-101)
|
|
#define OAPV_ERR_OUT_OF_MEMORY (-102)
|
|
#define OAPV_ERR_REACHED_MAX (-103)
|
|
#define OAPV_ERR_UNSUPPORTED (-104)
|
|
#define OAPV_ERR_UNEXPECTED (-105)
|
|
#define OAPV_ERR_UNSUPPORTED_COLORSPACE (-201)
|
|
#define OAPV_ERR_MALFORMED_BITSTREAM (-202)
|
|
#define OAPV_ERR_OUT_OF_BS_BUF (-203) /* too small bitstream buffer */
|
|
#define OAPV_ERR_NOT_FOUND (-204)
|
|
#define OAPV_ERR_FAILED_SYSCALL (-301) /* failed system call */
|
|
#define OAPV_ERR_INVALID_PROFILE (-400)
|
|
#define OAPV_ERR_INVALID_LEVEL (-401)
|
|
#define OAPV_ERR_INVALID_WIDTH (-405) /* invalid width (like odd) */
|
|
#define OAPV_ERR_INVALID_HEIGHT (-406)
|
|
#define OAPV_ERR_INVALID_QP (-410)
|
|
#define OAPV_ERR_INVALID_FAMILY (-501) /* invalid family number */
|
|
#define OAPV_ERR_UNKNOWN (-32767) /* unknown error */
|
|
|
|
/* return value checking */
|
|
#define OAPV_SUCCEEDED(ret) ((ret) >= OAPV_OK)
|
|
#define OAPV_FAILED(ret) ((ret) < OAPV_OK)
|
|
|
|
/*****************************************************************************
|
|
* color spaces
|
|
* - value format = (endian << 14) | (bit-depth << 8) | (color format)
|
|
* - endian (1bit): little endian = 0, big endian = 1
|
|
* - bit-depth (6bit): 0~63
|
|
* - color format (8bit): 0~255
|
|
*****************************************************************************/
|
|
/* color formats */
|
|
#define OAPV_CF_UNKNOWN (0) /* unknown color format */
|
|
#define OAPV_CF_YCBCR400 (10) /* Y only */
|
|
#define OAPV_CF_YCBCR420 (11) /* YCbCr 420 */
|
|
#define OAPV_CF_YCBCR422 (12) /* YCBCR 422 narrow chroma*/
|
|
#define OAPV_CF_YCBCR444 (13) /* YCBCR 444*/
|
|
#define OAPV_CF_YCBCR4444 (14) /* YCBCR 4444*/
|
|
#define OAPV_CF_YCBCR422N OAPV_CF_YCBCR422
|
|
#define OAPV_CF_YCBCR422W (18) /* YCBCR422 wide chroma */
|
|
#define OAPV_CF_PLANAR2 (20) /* Planar Y, Combined CB-CR, 422 */
|
|
|
|
/* macro for color space */
|
|
#define OAPV_CS_GET_FORMAT(cs) (((cs) >> 0) & 0xFF)
|
|
#define OAPV_CS_GET_BIT_DEPTH(cs) (((cs) >> 8) & 0x3F)
|
|
#define OAPV_CS_GET_BYTE_DEPTH(cs) ((OAPV_CS_GET_BIT_DEPTH(cs) + 7) >> 3)
|
|
#define OAPV_CS_GET_ENDIAN(cs) (((cs) >> 14) & 0x1)
|
|
#define OAPV_CS_SET(f, bit, e) (((e) << 14) | ((bit) << 8) | (f))
|
|
#define OAPV_CS_SET_FORMAT(cs, v) (((cs) & ~0xFF) | ((v) << 0))
|
|
#define OAPV_CS_SET_BIT_DEPTH(cs, v) (((cs) & ~(0x3F << 8)) | ((v) << 8))
|
|
#define OAPV_CS_SET_ENDIAN(cs, v) (((cs) & ~(0x1 << 14)) | ((v) << 14))
|
|
|
|
/* pre-defined color spaces */
|
|
#define OAPV_CS_UNKNOWN OAPV_CS_SET(0, 0, 0)
|
|
#define OAPV_CS_YCBCR400 OAPV_CS_SET(OAPV_CF_YCBCR400, 8, 0)
|
|
#define OAPV_CS_YCBCR420 OAPV_CS_SET(OAPV_CF_YCBCR420, 8, 0)
|
|
#define OAPV_CS_YCBCR422 OAPV_CS_SET(OAPV_CF_YCBCR422, 8, 0)
|
|
#define OAPV_CS_YCBCR444 OAPV_CS_SET(OAPV_CF_YCBCR444, 8, 0)
|
|
#define OAPV_CS_YCBCR4444 OAPV_CS_SET(OAPV_CF_YCBCR4444, 8, 0)
|
|
#define OAPV_CS_YCBCR400_10LE OAPV_CS_SET(OAPV_CF_YCBCR400, 10, 0)
|
|
#define OAPV_CS_YCBCR420_10LE OAPV_CS_SET(OAPV_CF_YCBCR420, 10, 0)
|
|
#define OAPV_CS_YCBCR422_10LE OAPV_CS_SET(OAPV_CF_YCBCR422, 10, 0)
|
|
#define OAPV_CS_YCBCR444_10LE OAPV_CS_SET(OAPV_CF_YCBCR444, 10, 0)
|
|
#define OAPV_CS_YCBCR4444_10LE OAPV_CS_SET(OAPV_CF_YCBCR4444, 10, 0)
|
|
#define OAPV_CS_YCBCR400_12LE OAPV_CS_SET(OAPV_CF_YCBCR400, 12, 0)
|
|
#define OAPV_CS_YCBCR420_12LE OAPV_CS_SET(OAPV_CF_YCBCR420, 12, 0)
|
|
#define OAPV_CS_YCBCR422_12LE OAPV_CS_SET(OAPV_CF_YCBCR422, 12, 0)
|
|
#define OAPV_CS_YCBCR444_12LE OAPV_CS_SET(OAPV_CF_YCBCR444, 12, 0)
|
|
#define OAPV_CS_YCBCR4444_12LE OAPV_CS_SET(OAPV_CF_YCBCR4444, 12, 0)
|
|
#define OAPV_CS_P210 OAPV_CS_SET(OAPV_CF_PLANAR2, 10, 0)
|
|
|
|
/* max number of color channel: ex) YCbCr4444 -> 4 channels */
|
|
#define OAPV_MAX_CC (4)
|
|
|
|
/*****************************************************************************
|
|
* config types
|
|
*****************************************************************************/
|
|
#define OAPV_CFG_SET_QP (201)
|
|
#define OAPV_CFG_SET_BPS (202)
|
|
#define OAPV_CFG_SET_FPS_NUM (204)
|
|
#define OAPV_CFG_SET_FPS_DEN (205)
|
|
#define OAPV_CFG_SET_QP_MIN (208)
|
|
#define OAPV_CFG_SET_QP_MAX (209)
|
|
#define OAPV_CFG_SET_USE_FRM_HASH (301)
|
|
#define OAPV_CFG_SET_AU_BS_FMT (302)
|
|
#define OAPV_CFG_GET_QP_MIN (600)
|
|
#define OAPV_CFG_GET_QP_MAX (601)
|
|
#define OAPV_CFG_GET_QP (602)
|
|
#define OAPV_CFG_GET_RCT (603)
|
|
#define OAPV_CFG_GET_BPS (604)
|
|
#define OAPV_CFG_GET_FPS_NUM (605)
|
|
#define OAPV_CFG_GET_FPS_DEN (606)
|
|
#define OAPV_CFG_GET_WIDTH (701)
|
|
#define OAPV_CFG_GET_HEIGHT (702)
|
|
#define OAPV_CFG_GET_AU_BS_FMT (802)
|
|
|
|
/*****************************************************************************
|
|
* config values
|
|
*****************************************************************************/
|
|
/* The output from the encoder is compliant with raw_bitstream_access_unit */
|
|
#define OAPV_CFG_VAL_AU_BS_FMT_RBAU (0)
|
|
/* The output from the encoder is the only AU without bitstream format */
|
|
#define OAPV_CFG_VAL_AU_BS_FMT_NONE (1)
|
|
|
|
/*****************************************************************************
|
|
* HLS configs
|
|
*****************************************************************************/
|
|
#define OAPV_MAX_GRP_SIZE ((1 << 16) - 1) // 0xFFFF reserved
|
|
|
|
/*****************************************************************************
|
|
* PBU types
|
|
*****************************************************************************/
|
|
#define OAPV_PBU_TYPE_RESERVED (0)
|
|
#define OAPV_PBU_TYPE_PRIMARY_FRAME (1)
|
|
#define OAPV_PBU_TYPE_NON_PRIMARY_FRAME (2)
|
|
#define OAPV_PBU_TYPE_PREVIEW_FRAME (25)
|
|
#define OAPV_PBU_TYPE_DEPTH_FRAME (26)
|
|
#define OAPV_PBU_TYPE_ALPHA_FRAME (27)
|
|
#define OAPV_PBU_TYPE_AU_INFO (65)
|
|
#define OAPV_PBU_TYPE_METADATA (66)
|
|
#define OAPV_PBU_TYPE_FILLER (67)
|
|
#define OAPV_PBU_TYPE_UNKNOWN (-1)
|
|
#define OAPV_PBU_NUMS (10)
|
|
|
|
#define OAPV_PBU_FRAME_TYPE_NUM (5)
|
|
|
|
/*****************************************************************************
|
|
* metadata types
|
|
*****************************************************************************/
|
|
#define OAPV_METADATA_ITU_T_T35 (4)
|
|
#define OAPV_METADATA_MDCV (5)
|
|
#define OAPV_METADATA_CLL (6)
|
|
#define OAPV_METADATA_FILLER (10)
|
|
#define OAPV_METADATA_USER_DEFINED (170)
|
|
|
|
/*****************************************************************************
|
|
* profiles
|
|
*****************************************************************************/
|
|
#define OAPV_PROFILE_422_10 (33)
|
|
#define OAPV_PROFILE_422_12 (44)
|
|
#define OAPV_PROFILE_444_10 (55)
|
|
#define OAPV_PROFILE_444_12 (66)
|
|
#define OAPV_PROFILE_4444_10 (77)
|
|
#define OAPV_PROFILE_4444_12 (88)
|
|
#define OAPV_PROFILE_400_10 (99)
|
|
|
|
/*****************************************************************************
|
|
* family
|
|
*****************************************************************************/
|
|
#define OAPV_FAMILY_422_LQ (1)
|
|
#define OAPV_FAMILY_422_SQ (2)
|
|
#define OAPV_FAMILY_422_HQ (3)
|
|
#define OAPV_FAMILY_444_UQ (4)
|
|
|
|
/*****************************************************************************
|
|
* optimization level control
|
|
*****************************************************************************/
|
|
#define OAPV_PRESET_FASTEST (0)
|
|
#define OAPV_PRESET_FAST (1)
|
|
#define OAPV_PRESET_MEDIUM (2)
|
|
#define OAPV_PRESET_SLOW (3)
|
|
#define OAPV_PRESET_PLACEBO (4)
|
|
#define OAPV_PRESET_DEFAULT OAPV_PRESET_MEDIUM
|
|
|
|
/*****************************************************************************
|
|
* rate-control types
|
|
*****************************************************************************/
|
|
#define OAPV_RC_CQP (0)
|
|
#define OAPV_RC_ABR (1)
|
|
|
|
/*****************************************************************************
|
|
* type and macro for media time
|
|
*****************************************************************************/
|
|
typedef long long oapv_mtime_t; /* in 100-nanosec unit */
|
|
|
|
/*****************************************************************************
|
|
* image buffer format
|
|
*
|
|
* baddr
|
|
* +---------------------------------------------------+ ---
|
|
* | | ^
|
|
* | | | |
|
|
* | a v | |
|
|
* | --- +-----------------------------------+ --- | |
|
|
* | ^ | (x, y) | y | |
|
|
* | | | +---------------------------+ + --- | |
|
|
* | | | | | | ^ | |
|
|
* | | | | /\ | | | | |
|
|
* | | | | / \ | | | | |
|
|
* | | | | / \ | | | | |
|
|
* | | | +--------------------+ | | |
|
|
* | ah | | \ / | | h | e
|
|
* | | | +----------------+ | | |
|
|
* | | | | | | | | | | |
|
|
* | | | | @ O O @ | | | | |
|
|
* | | | | \ ~ / | | v | |
|
|
* | | | +---------------------------+ | --- | |
|
|
* | v | | | |
|
|
* | --- +---+-------------------------------+ | |
|
|
* | ->| x |<----------- w ----------->| | |
|
|
* | |<--------------- aw -------------->| | |
|
|
* | | v
|
|
* +---------------------------------------------------+ ---
|
|
*
|
|
* |<---------------------- s ------------------------>|
|
|
*
|
|
* - x, y, w, aw, h, ah : unit of pixel
|
|
* - s, e : unit of byte
|
|
*****************************************************************************/
|
|
|
|
typedef struct oapv_imgb oapv_imgb_t;
|
|
struct oapv_imgb {
|
|
int cs; /* color space */
|
|
int np; /* number of plane */
|
|
/* width (in unit of pixel) */
|
|
int w[OAPV_MAX_CC];
|
|
/* height (in unit of pixel) */
|
|
int h[OAPV_MAX_CC];
|
|
/* X position of left top (in unit of pixel) */
|
|
int x[OAPV_MAX_CC];
|
|
/* Y postion of left top (in unit of pixel) */
|
|
int y[OAPV_MAX_CC];
|
|
/* buffer stride (in unit of byte) */
|
|
int s[OAPV_MAX_CC];
|
|
/* buffer elevation (in unit of byte) */
|
|
int e[OAPV_MAX_CC];
|
|
/* address of each plane */
|
|
void *a[OAPV_MAX_CC];
|
|
|
|
/* hash data for signature */
|
|
unsigned char hash[OAPV_MAX_CC][16];
|
|
|
|
/* time-stamps */
|
|
oapv_mtime_t ts[4];
|
|
|
|
int ndata[4]; /* arbitrary data, if needed */
|
|
void *pdata[4]; /* arbitrary address if needed */
|
|
|
|
/* aligned width (in unit of pixel) */
|
|
int aw[OAPV_MAX_CC];
|
|
/* aligned height (in unit of pixel) */
|
|
int ah[OAPV_MAX_CC];
|
|
|
|
/* left padding size (in unit of pixel) */
|
|
int padl[OAPV_MAX_CC];
|
|
/* right padding size (in unit of pixel) */
|
|
int padr[OAPV_MAX_CC];
|
|
/* up padding size (in unit of pixel) */
|
|
int padu[OAPV_MAX_CC];
|
|
/* bottom padding size (in unit of pixel) */
|
|
int padb[OAPV_MAX_CC];
|
|
|
|
/* address of actual allocated buffer */
|
|
void *baddr[OAPV_MAX_CC];
|
|
/* actual allocated buffer size */
|
|
int bsize[OAPV_MAX_CC];
|
|
|
|
/* life cycle management */
|
|
int refcnt;
|
|
int (*addref)(oapv_imgb_t *imgb);
|
|
int (*getref)(oapv_imgb_t *imgb);
|
|
int (*release)(oapv_imgb_t *imgb);
|
|
};
|
|
|
|
typedef struct oapv_frm oapv_frm_t;
|
|
struct oapv_frm {
|
|
oapv_imgb_t *imgb;
|
|
int pbu_type;
|
|
int group_id;
|
|
};
|
|
|
|
#define OAPV_MAX_NUM_FRAMES (16) // max number of frames in an access unit
|
|
#define OAPV_MAX_NUM_METAS (16) // max number of metadata in an access unit
|
|
|
|
typedef struct oapv_frms oapv_frms_t;
|
|
struct oapv_frms {
|
|
int num_frms; // number of frames
|
|
oapv_frm_t frm[OAPV_MAX_NUM_FRAMES]; // container of frames
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* Bitstream buffer
|
|
*****************************************************************************/
|
|
typedef struct oapv_bitb oapv_bitb_t;
|
|
struct oapv_bitb {
|
|
/* user space address indicating buffer */
|
|
void *addr;
|
|
/* physical address indicating buffer, if any */
|
|
void *pddr;
|
|
/* byte size of buffer memory */
|
|
int bsize;
|
|
/* byte size of bitstream in buffer */
|
|
int ssize;
|
|
/* bitstream has an error? */
|
|
int err;
|
|
/* arbitrary data, if needs */
|
|
int ndata[4];
|
|
/* arbitrary address, if needs */
|
|
void *pdata[4];
|
|
/* time-stamps */
|
|
oapv_mtime_t ts[4];
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* brief information of frame
|
|
*****************************************************************************/
|
|
typedef struct oapv_frm_info oapv_frm_info_t;
|
|
struct oapv_frm_info {
|
|
int w;
|
|
int h;
|
|
int cs;
|
|
int pbu_type;
|
|
int group_id;
|
|
int profile_idc;
|
|
int level_idc;
|
|
int band_idc;
|
|
int chroma_format_idc;
|
|
int bit_depth;
|
|
int capture_time_distance;
|
|
// flag for custom quantization matrix
|
|
int use_q_matrix;
|
|
// q_matrix is meaningful if use_q_matrix is true
|
|
unsigned char q_matrix[OAPV_MAX_CC][OAPV_BLK_D];
|
|
// flag for color_description_present_flag */
|
|
int color_description_present_flag;
|
|
// color_primaries, transfer_characteristics, matrix_coefficients, and
|
|
// full_range_flag are meaningful if color_description_present_flag is true
|
|
unsigned char color_primaries;
|
|
unsigned char transfer_characteristics;
|
|
unsigned char matrix_coefficients;
|
|
int full_range_flag;
|
|
};
|
|
|
|
typedef struct oapv_au_info oapv_au_info_t;
|
|
struct oapv_au_info {
|
|
int num_frms; // number of frames
|
|
oapv_frm_info_t frm_info[OAPV_MAX_NUM_FRAMES];
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* constant string values for oapve_param_parse() and command-line options
|
|
*****************************************************************************/
|
|
typedef struct oapv_dict_str_int oapv_dict_str_int_t; // dictionary type
|
|
struct oapv_dict_str_int {
|
|
const char * key;
|
|
const int val;
|
|
};
|
|
|
|
static const oapv_dict_str_int_t oapv_param_opts_profile[] = {
|
|
{"422-10", OAPV_PROFILE_422_10},
|
|
{"422-12", OAPV_PROFILE_422_12},
|
|
{"444-10", OAPV_PROFILE_444_10},
|
|
{"444-12", OAPV_PROFILE_444_12},
|
|
{"4444-10", OAPV_PROFILE_4444_10},
|
|
{"4444-12", OAPV_PROFILE_4444_12},
|
|
{"400-10", OAPV_PROFILE_400_10},
|
|
{"", 0} // termination
|
|
};
|
|
|
|
static const oapv_dict_str_int_t oapv_param_opts_preset[] = {
|
|
{"fastest", OAPV_PRESET_FASTEST},
|
|
{"fast", OAPV_PRESET_FAST},
|
|
{"medium", OAPV_PRESET_MEDIUM},
|
|
{"slow", OAPV_PRESET_SLOW},
|
|
{"placebo", OAPV_PRESET_PLACEBO},
|
|
{"", 0} // termination
|
|
};
|
|
|
|
static const oapv_dict_str_int_t oapv_param_opts_color_range[] = {
|
|
{"limited", 0},
|
|
{"tv", 0}, // alternative value of "limited"
|
|
{"full", 1},
|
|
{"pc", 1}, // alternative value of "full"
|
|
{"", 0} // termination
|
|
};
|
|
|
|
static const oapv_dict_str_int_t oapv_param_opts_color_primaries[] = {
|
|
{"reserved", 0},
|
|
{"bt709", 1},
|
|
{"unspecified", 2},
|
|
{"reserved", 3},
|
|
{"bt470m", 4},
|
|
{"bt470bg", 5},
|
|
{"smpte170m", 6},
|
|
{"smpte240m", 7},
|
|
{"film", 8},
|
|
{"bt2020", 9},
|
|
{"smpte428", 10},
|
|
{"smpte431", 11},
|
|
{"smpte432", 12},
|
|
{"", 0} // termination
|
|
};
|
|
|
|
static const oapv_dict_str_int_t oapv_param_opts_color_transfer[] = {
|
|
{"reserved", 0},
|
|
{"bt709", 1},
|
|
{"unspecified", 2},
|
|
{"reserved", 3},
|
|
{"bt470m", 4},
|
|
{"bt470bg", 5},
|
|
{"smpte170m", 6},
|
|
{"smpte240m", 7},
|
|
{"linear", 8},
|
|
{"log100", 9},
|
|
{"log316", 10},
|
|
{"iec61966-2-4", 11},
|
|
{"bt1361e", 12},
|
|
{"iec61966-2-1", 13},
|
|
{"bt2020-10", 14},
|
|
{"bt2020-12", 15},
|
|
{"smpte2084", 16},
|
|
{"smpte428", 17},
|
|
{"arib-std-b67", 18},
|
|
{"", 0} // termination
|
|
};
|
|
static const oapv_dict_str_int_t oapv_param_opts_color_matrix[] = {
|
|
{"gbr", 0},
|
|
{"bt709", 1},
|
|
{"unspecified", 2},
|
|
{"reserved", 3},
|
|
{"fcc", 4},
|
|
{"bt470bg", 5},
|
|
{"smpte170m", 6},
|
|
{"smpte240m", 7},
|
|
{"ycgco", 8},
|
|
{"bt2020nc", 9},
|
|
{"bt2020c", 10},
|
|
{"smpte2085", 11},
|
|
{"chroma-derived-nc", 12},
|
|
{"chroma-derived-c", 13},
|
|
{"ictcp", 14},
|
|
{"", 0} // termination
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* coding parameters
|
|
*****************************************************************************/
|
|
#define OAPV_LEVEL_TO_LEVEL_IDC(level) (int)(((level) * 30.0) + 0.5)
|
|
#define OAPVE_PARAM_LEVEL_IDC_AUTO (0)
|
|
#define OAPVE_PARAM_QP_AUTO (255)
|
|
|
|
typedef struct oapve_param oapve_param_t;
|
|
struct oapve_param {
|
|
/* profile_idc defined in spec. */
|
|
int profile_idc;
|
|
/* level_idc defined in spec. */
|
|
int level_idc;
|
|
/* band_idc defined in spec. */
|
|
int band_idc;
|
|
/* width of input frame */
|
|
int w;
|
|
/* height of input frame */
|
|
int h;
|
|
/* frame rate (Hz) numerator, denominator */
|
|
int fps_num;
|
|
int fps_den;
|
|
/* rate control type */
|
|
int rc_type;
|
|
/* quantization parameters : 0 ~ (63 + (bitdepth - 10)*6)
|
|
- 10bit input: 0 ~ 63
|
|
- 12bit input: 0 ~ 75
|
|
*/
|
|
unsigned char qp;
|
|
/* quantization parameter offsets */
|
|
signed char qp_offset_c1;
|
|
/* quantization parameter offsets */
|
|
signed char qp_offset_c2;
|
|
/* quantization parameter offsets */
|
|
signed char qp_offset_c3;
|
|
/* bitrate (unit: kbps) */
|
|
int bitrate;
|
|
/* use filler data for tight constant bitrate */
|
|
int use_filler;
|
|
/* use quantization matrix */
|
|
int use_q_matrix;
|
|
unsigned char q_matrix[OAPV_MAX_CC][OAPV_BLK_D]; // raster-scan order
|
|
/* NOTE: tile_w and tile_h value can be changed internally,
|
|
if the values are not set properly.
|
|
the min and max values are defined in APV specification */
|
|
int tile_w; // width of tile MUST be N * MB width
|
|
int tile_h; // height of tile MUST be N * MB height
|
|
|
|
/* preset for setting trade-off between complexity and coding gain */
|
|
int preset;
|
|
/* color description values */
|
|
int color_description_present_flag;
|
|
unsigned char color_primaries;
|
|
unsigned char transfer_characteristics;
|
|
unsigned char matrix_coefficients;
|
|
int full_range_flag;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* automatic assignment of number of threads in creation of encoder & decoder
|
|
*****************************************************************************/
|
|
#define OAPV_CDESC_THREADS_AUTO 0
|
|
|
|
/*****************************************************************************
|
|
* description for encoder creation
|
|
*****************************************************************************/
|
|
typedef struct oapve_cdesc oapve_cdesc_t;
|
|
struct oapve_cdesc {
|
|
// max bitstream buffer size
|
|
int max_bs_buf_size;
|
|
// max number of frames to be encoded
|
|
int max_num_frms;
|
|
// max number of threads (or OAPV_CDESC_THREADS_AUTO for auto-assignment)
|
|
int threads;
|
|
// encoding parameters
|
|
oapve_param_t param[OAPV_MAX_NUM_FRAMES];
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* encoding status
|
|
*****************************************************************************/
|
|
typedef struct oapve_stat oapve_stat_t;
|
|
struct oapve_stat {
|
|
// byte size of encoded bitstream
|
|
int write;
|
|
// information of encoded frames
|
|
oapv_au_info_t aui;
|
|
// bitstream byte size of each frame
|
|
int frm_size[OAPV_MAX_NUM_FRAMES];
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* description for decoder creation
|
|
*****************************************************************************/
|
|
typedef struct oapvd_cdesc oapvd_cdesc_t;
|
|
struct oapvd_cdesc {
|
|
// max number of threads (or OAPV_CDESC_THREADS_AUTO for auto-assignment)
|
|
int threads;
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* decoding status
|
|
*****************************************************************************/
|
|
typedef struct oapvd_stat oapvd_stat_t;
|
|
struct oapvd_stat {
|
|
// byte size of decoded bitstream (read size)
|
|
int read;
|
|
// information of decoded frames
|
|
oapv_au_info_t aui;
|
|
// bitstream byte size of each frame
|
|
int frm_size[OAPV_MAX_NUM_FRAMES];
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* metadata payload
|
|
*****************************************************************************/
|
|
typedef struct oapvm_payload oapvm_payload_t;
|
|
struct oapvm_payload {
|
|
int group_id; // group ID
|
|
int type; // payload type
|
|
int size; // byte size of metadata payload
|
|
void *data; // address of metadata payload
|
|
unsigned char uuid[16]; // UUID for user-defined metadata payload
|
|
};
|
|
|
|
/*****************************************************************************
|
|
* interface for metadata container
|
|
*****************************************************************************/
|
|
typedef void *oapvm_t; // instance identifier for OAPV metadata container
|
|
|
|
OAPV_EXPORT oapvm_t oapvm_create(int *err);
|
|
OAPV_EXPORT void oapvm_delete(oapvm_t mid);
|
|
OAPV_EXPORT int oapvm_set(oapvm_t mid, int group_id, int type, void *data, int size);
|
|
OAPV_EXPORT int oapvm_get(oapvm_t mid, int group_id, int type, void **data, int *size, unsigned char *uuid);
|
|
OAPV_EXPORT int oapvm_rem(oapvm_t mid, int group_id, int type, unsigned char *uuid);
|
|
OAPV_EXPORT int oapvm_set_all(oapvm_t mid, oapvm_payload_t *pld, int num_plds);
|
|
OAPV_EXPORT int oapvm_get_all(oapvm_t mid, oapvm_payload_t *pld, int *num_plds);
|
|
OAPV_EXPORT void oapvm_rem_all(oapvm_t mid);
|
|
|
|
/*****************************************************************************
|
|
* interface for encoder
|
|
*****************************************************************************/
|
|
typedef void *oapve_t; /* instance identifier for OAPV encoder */
|
|
|
|
OAPV_EXPORT oapve_t oapve_create(oapve_cdesc_t *cdesc, int *err);
|
|
OAPV_EXPORT void oapve_delete(oapve_t eid);
|
|
OAPV_EXPORT int oapve_config(oapve_t eid, int cfg, void *buf, int *size);
|
|
OAPV_EXPORT int oapve_param_default(oapve_param_t *param);
|
|
OAPV_EXPORT int oapve_param_parse(oapve_param_t* param, const char* name, const char* value);
|
|
OAPV_EXPORT int oapve_encode(oapve_t eid, oapv_frms_t *ifrms, oapvm_t mid, oapv_bitb_t *bitb, oapve_stat_t *stat, oapv_frms_t *rfrms);
|
|
|
|
/*****************************************************************************
|
|
* interface for decoder
|
|
*****************************************************************************/
|
|
typedef void *oapvd_t; /* instance identifier for OAPV decoder */
|
|
|
|
OAPV_EXPORT oapvd_t oapvd_create(oapvd_cdesc_t *cdesc, int *err);
|
|
OAPV_EXPORT void oapvd_delete(oapvd_t did);
|
|
OAPV_EXPORT int oapvd_config(oapvd_t did, int cfg, void *buf, int *size);
|
|
OAPV_EXPORT int oapvd_decode(oapvd_t did, oapv_bitb_t *bitb, oapv_frms_t *ofrms, oapvm_t mid, oapvd_stat_t *stat);
|
|
|
|
/*****************************************************************************
|
|
* interface for utility
|
|
*****************************************************************************/
|
|
OAPV_EXPORT int oapvd_info(void *au, int au_size, oapv_au_info_t *aui);
|
|
OAPV_EXPORT int oapve_family_bitrate(int family, int w, int h, int fps_num, int fps_den, int * kbps);
|
|
|
|
/*****************************************************************************
|
|
* openapv version
|
|
*****************************************************************************/
|
|
OAPV_EXPORT const char *oapv_version(unsigned int *ver_num);
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
#endif /* __OAPV_H__3342320849320483827648324783920483920432847382948__ */
|