android13/hardware/rockchip/libpq/include/rkpq_api.h

572 lines
30 KiB
C
Executable File

//
/////////////////////////////////////////////////////////////////////////
// Copyright(c) 2022 by Rockchip Corp. All right reserved.
//
// This file is Rock-chip's property. It contains Rock-chip's trade secret,
// proprietary and confidential information.
// The information and code contained in this file is only for authorized
// Rock-chip employees to design, create, modify, or review.
// DO NOT DISTRIBUTE, DO NOT DUPLICATE OR TRANSMIT IN ANY FORM WITHOUT
// PROPER AUTHORIZATION.
// If you are not an intended recipient of this file, you must not copy,
// distribute, modify, or take any action in reliance on it.
// If you have received this file in error, please immediately notify
// Rock-chip and permanently delete the original and any copy of any file
// and any printout thereof.
//
//////////////////////////////////////////////////////////////////////////
//
// Last update 2022-10-21
#pragma once
#ifndef __RKPQ_API_H_
#define __RKPQ_API_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* Definition of flags for rkpq_init()
*/
#define RKPQ_FLAG_DEFAULT 0x00000000
#define RKPQ_FLAG_PERF_DETAIL 0x00000001 /* reserved */
#define RKPQ_FLAG_HIGH_PERFORM 0x00000002 /* fuse some PQ modules to achive high performence */
#define RKPQ_FLAG_CALC_MEAN_LUMA 0x00000008 /* calculate mean luma value (full-range) when processing */
#define RKPQ_FLAG_CVT_RANGE_ONLY 0x00000010 /* convert between full and limited range only, no PQ modules to run */
/**
* Definition of const numbers
*/
#define RKPQ_MAX_PLANE_NUM 3 // max number of planes supported. Only support {NV24, NV12, RGBA} right now!
#define RKPQ_MAX_PERFORM_NUM 32 // max number of proc performence count
#define RKPQ_MAX_IMG_FMT_NUM 32 // max number of supported image formats
#define RKPQ_MAX_CLR_SPC_NUM 32 // max number of supported color spaces
#define RKPQ_MAX_PQ_MODULE_NUM 32 // max number of supported PQ modules
#define RKPQ_DCI_LUT_SIZE 33 // valid DCI_Y LUT range [0:32]
#define RKPQ_ACM_LUT_LENGTH_Y 9 // valid ACM_Y LUT range [0:8]
#define RKPQ_ACM_LUT_LENGTH_H 65 // valid ACM_H LUT range [0:64]
#define RKPQ_ACM_LUT_LENGTH_S 13 // valid ACM_S LUT range [0:12]
#define RKPQ_SHP_PEAKING_BAND_NUM 4 // number of valid bands for Sharp module
#define RKPQ_ZME_COEF_LENGTH 8 // valid ZME coefs range [0:7]
/**
* Forward declaration
*/
typedef void* rkpq_context;
struct _RKPQ_CSC_CFG;
struct _RKPQ_DCI_CFG;
struct _RKPQ_ACM_CFG;
struct _RKPQ_SHP_CFG;
struct _RKPQ_SR_CFG;
struct _RKPQ_ZME_CFG;
/**
* the PQ modules, use rkpq_query() to check if supported
*/
typedef enum _rkpq_module
{
RKPQ_MODULE_CSC, /* Color Space Convert */
RKPQ_MODULE_SHP, /* Sharpen */
RKPQ_MODULE_DCI, /* Dynamic Contrast Improvement */
RKPQ_MODULE_ACM, /* Auto Color Management */
RKPQ_MODULE_SR, /* Super Resolution */
RKPQ_MODULE_ZME, /* Zoom Manage Engine */
// RKPQ_MODULE_3DLUT, /* 3D LUT | TODO */
RKPQ_MODULE_MAX, /* the max PQ module value, please DO NOT use this item! */
} rkpq_module;
/**
* the query commands, see rkpq_query() for more detail infos
*/
typedef enum _rkpq_query_cmd
{
RKPQ_QUERY_SDK_VERSION = 0, /* get the SDK version info */
RKPQ_QUERY_PERF_INFO, /* get the performence info after rkpq_proc() */
RKPQ_QUERY_IMG_FMT_INPUT_SUPPORT, /* get the supported image formats for input */
RKPQ_QUERY_IMG_FMT_OUTPUT_SUPPORT, /* get the supported image formats for output */
RKPQ_QUERY_IMG_FMT_CHANGE_SUPPORT, /* get the flag if enable change image format when running */
// RKPQ_QUERY_IMG_RES_INPUT_SUPPORT, /* get the supported image resolutions for input */
// RKPQ_QUERY_IMG_RES_OUTPUT_SUPPORT, /* get the supported image resolutions for output */
RKPQ_QUERY_IMG_RES_CHANGE_SUPPORT, /* get the flag if enable change image resolution when running */
RKPQ_QUERY_IMG_COLOR_SPACE_SUPPORT, /* get the supported image color space */
RKPQ_QUERY_IMG_BUF_INFO, /* get the image buffer infos with known image format & size */
RKPQ_QUERY_IMG_ALIGNMENT_OCL, /* get the OpenCL image alignment size in width, unit: pixel */
RKPQ_QUERY_RKNN_SUPPORT, /* get the RKNN supported flag for SR */
RKPQ_QUERY_MEAN_LUMA, /* get the mean luma value (full-range) of the output image after rkpq_proc() */
RKPQ_QUERY_MODULES_SUPPORT, /* get the supported PQ modules */
// RKPQ_QUERY_3DLUT_AI_TABLE, /* get the 3D-LUT table from RKNN result */
RKPQ_QUERY_MAX, /* the max query command value, please DO NOT use this item! */
} rkpq_query_cmd;
/**
* the image formats supported
* @Detail:
* - bpp means 'bits per pixel',
* - bpc means 'bits per component'.
*/
typedef enum _rkpq_image_format
{
// YUV
RKPQ_IMG_FMT_YUV_MIN = 0, /* the min YUV format value, please DO NOT use this item! */
RKPQ_IMG_FMT_NV24 = 0, /* YUV444SP, 2 plane YCbCr, 24bpp/8 bpc, non-subsampled Cr:Cb plane */
RKPQ_IMG_FMT_NV16, /* YUV422SP, 2 plane YCbCr, 16bpp/8 bpc, 2x1 subsampled Cr:Cb plane */
RKPQ_IMG_FMT_NV12, /* YUV420SP, 2 plane YCbCr, 12bpp/8 bpc, 2x2 subsampled Cr:Cb plane */
RKPQ_IMG_FMT_NV15, /* YUV420SP, 2 plane YCbCr, 15bpp/10bpc, 10bit packed data */
RKPQ_IMG_FMT_NV20, /* YUV422SP, 2 plane YCbCr, 20bpp/10bpc, 10bit packed data, output supported only */ /* reserved */
RKPQ_IMG_FMT_NV30, /* YUV444SP, 2 plane YCbCr, 30bpp/10bpc, 10bit packed data, output supported only */
RKPQ_IMG_FMT_P010, /* YUV420SP, 2 plane YCbCr, 24bpp/16bpc, 10bit unpacked data with MSB aligned, output supported only */
RKPQ_IMG_FMT_P210, /* YUV422SP, 2 plane YCbCr, 32bpp/16bpc, 10bit unpacked data with MSB aligned, output supported only */ /* reserved */
RKPQ_IMG_FMT_Q410, /* YUV444P , 3 plane YCbCr, 48bpp/16bpc, 10bit unpacked data with MSB aligned, output supported only */
RKPQ_IMG_FMT_YUV_MAX, /* the max YUV format value, please DO NOT use this item! */
// RGB
RKPQ_IMG_FMT_RGB_MIN = 1000,/* the min RGB format value, please DO NOT use this item! */
RKPQ_IMG_FMT_RGBA = 1000, /* RGBA8888, 32bpp */
RKPQ_IMG_FMT_RG24, /* RGB888, 24bpp */
RKPQ_IMG_FMT_BG24, /* BGR888, 24bpp */
RKPQ_IMG_FMT_AB30, /* ABGR2101010, reserved */
RKPQ_IMG_FMT_RGB_MAX, /* the max RGB format value, please DO NOT use this item! */
} rkpq_img_fmt;
/**
* the color space supported
*/
typedef enum _rkpq_color_space
{
RKPQ_CLR_SPC_YUV_601_LIMITED, /* ITU-R BT.601 (Limited-range) for SDTV (720P) */
RKPQ_CLR_SPC_YUV_601_FULL, /* ITU-R BT.601 Full-range for SDTV (720P) */
RKPQ_CLR_SPC_YUV_709_LIMITED, /* ITU-R BT.709 (Limited-range) for HDTV (1080P) */
RKPQ_CLR_SPC_YUV_709_FULL, /* ITU-R BT.709 Full-range for HDTV (1080P) */
RKPQ_CLR_SPC_YUV_2020_LIMITED, /* reserved. ITU-R BT.2020 (Limited-range) for UHDTV (4K/8K) */
RKPQ_CLR_SPC_YUV_2020_FULL, /* reserved. ITU-R BT.2020 Full-range for UHDTV (4K/8K) */
RKPQ_CLR_SPC_RGB_LIMITED, /* RGB Limited-range */
RKPQ_CLR_SPC_RGB_FULL, /* RGB Full-range */
RKPQ_CLR_SPC_MAX, /* the max color space value, please DO NOT use this item! */
} rkpq_clr_spc;
/**
* the information for RKPQ_QUERY_SDK_VERSION
*/
typedef struct _rkpq_version_info
{
uint32_t nVerMajor; /* the major number */
uint32_t nVerMinor; /* the minor number */
uint32_t nVerRvson; /* the revision number */
char sVerInfo[64]; /* the full version info string */
} rkpq_version_info;
/**
* the information for RKPQ_QUERY_PERF_INFO
*/
typedef struct _rkpq_perf_info
{
float fTimeCostInit; /* cost time of rkpq_init() interface */
float fTimeCostDeinit; /* invalid */
float fTimeCostProcs[RKPQ_MAX_PERFORM_NUM];
} rkpq_perf_info;
/**
* the information for RKPQ_QUERY_IMG_FMT_INPUT_SUPPORT & RKPQ_QUERY_IMG_FMT_OUTPUT_SUPPORT
*/
typedef struct _rkpq_imgfmt_info
{
int32_t aValidFmts[RKPQ_MAX_IMG_FMT_NUM]; /* see rkldc_img_fmt */
uint32_t nValidFmtNum; /* number of valid formats, <= RKPQ_MAX_IMG_FMT_NUM */
} rkpq_imgfmt_info;
/**
* the information for RKPQ_QUERY_IMG_COLOR_SPACE_SUPPORT
*/
typedef struct _rkpq_clrspc_info
{
int32_t aValidSpcs[RKPQ_MAX_CLR_SPC_NUM]; /* see rkpq_clr_spc */
uint32_t nValidSpcNum; /* number of valid color spaces, <= RKPQ_MAX_CLR_SPCE_NUM */
} rkpq_clrspc_info;
/**
* the information for RKPQ_QUERY_IMG_BUF_INFO
* @Detail: bpc means 'bits per component'
*/
typedef struct _rkpq_imgbuf_info
{
uint32_t nColorSpace; /* [i] see rkpq_clr_spc */
uint32_t nPixFmt; /* [i] see rkpq_img_fmt */
uint32_t nPixWid; /* [i] pixel width */
uint32_t nPixHgt; /* [i] pixel height */
uint32_t nEleDepth; /* [i] element depth (bpc), unit: bit */
uint32_t nAlignment; /* [i] buffer alignment length / row pitch, unit: byte */
uint32_t aWidStrides[RKPQ_MAX_PLANE_NUM]; /* [i/o] image padding width of each plane, unit: byte. aWidStrides[0] always >= nPixWid.
Set aWidStrides[0] if padding exist, and aWidStrides[1:2] will be auto updated according to `nPixFmt`.
If aWidStrides[0] = 0, all the values will be updated with `nAlignment`. */
uint32_t aHgtStrides[RKPQ_MAX_PLANE_NUM]; /* [i/o] image padding height of each plane, unit: line.
Set aHgtStrides[0] if padding exist, and aHgtStrides[1:2] will be auto updated according to `nPixFmt`.
If aHgtStrides[0] = 0, it will be updated equal to `nPixHgt`. */
uint32_t nPixWidStrd; /* [o] pixel width stride with padding, unit: pixel */
uint32_t nPlaneNum; /* [o] number of valid planes */
size_t nFrameSize; /* [o] full frame size, unit: byte */
size_t aPlaneSizes[RKPQ_MAX_PLANE_NUM]; /* [o] size of each plane, unit: byte */
uint32_t aPlaneElems[RKPQ_MAX_PLANE_NUM]; /* [o] element number of each plane */
} rkpq_imgbuf_info;
/**
* the information for RKPQ_QUERY_MODULES_SUPPORT
*/
typedef struct _rkpq_module_info
{
int32_t aValidMods[RKPQ_MAX_PQ_MODULE_NUM]; /* see rkpq_module */
uint32_t nValidModNum; /* number of valid PQ modules, <= RKPQ_MAX_PQ_MODULE_NUM */
} rkpq_module_info;
/**
* init parameters
*/
typedef struct _RKPQ_Init_Params
{
rkpq_imgbuf_info stSrcImgInfo; /* [i] src image buffer info */
rkpq_imgbuf_info stDstImgInfo; /* [i] dst image buffer info */
// init flag
uint32_t nInitFlag; /* [i] see RKPQ_FLAG_XXXX */
} RKPQ_Init_Params;
/**
* proc parameters
*/
typedef struct _RKPQ_Proc_Params
{
// Data information
uint32_t nFrameIdx; /* [i] image index in the video sequence */
uint8_t *pImgSrcs[RKPQ_MAX_PLANE_NUM]; /* [i] plane pointers of src buffer */
int32_t fdImgSrc; /* [i] file descriptor, used to import hardware buffer */
uint32_t nSrcBufSize; /* [i] src buffer size, it should be >= stSrcImgInfo::nFrameSize! unit: byte */
uint8_t *pImgDsts[RKPQ_MAX_PLANE_NUM]; /* [i] plane pointers of dst buffer */
int32_t fdImgDst; /* [i] file descriptor, used to import hardware buffer */
uint32_t nDstBufSize; /* [i] dst buffer size, it should be >= stDstImgInfo::nFrameSize! unit: byte */
// Proc flags
uint32_t bEnablePropControl; /* [i] enable real-time control with adb properties. PQTool will not work if set to 1 */
uint32_t bEnableSliderControl; /* [i] enable real-time control with PQTool */
uint32_t bEnableCalcMeanLuma; /* [i] enable calculate mean luma value (full-range) of output image, */
/* init flag 'RKPQ_FLAG_CALC_MEAN_LUMA' shoule be set in 'RKPQ_Init_Params::nInitFlag' */
uint32_t bEnableConvertFLOnly; /* [i] enable convert input image range between full and limited, */
/* init flag 'RKPQ_FLAG_CVT_RANGE_ONLY' shoule be set in 'RKPQ_Init_Params::nInitFlag' */
uint32_t nProcWidth; /* [i] proc width ref to 'stSrcImgInfo::nPixWid', range: [0, 9600], unit: pixel */
uint32_t bIsIntraFrame; /* [i] if the video frame is the intra frame */
uint32_t aReservedFlags[24]; /* reserved array, for new flags added in the future */
// return values
uint32_t nMeanLuma; /* [o] return the mean luma value (full-range) after rkpq_proc() */
// Module configurations
_RKPQ_CSC_CFG *pConfigCSC; /* [i] set to NULL if donot want to open this module */
_RKPQ_DCI_CFG *pConfigDCI; /* [i] set to NULL if donot want to open this module */
_RKPQ_ACM_CFG *pConfigACM; /* [i] set to NULL if donot want to open this module */
_RKPQ_SHP_CFG *pConfigSHP; /* [i] set to NULL if donot want to open this module */
_RKPQ_SR_CFG *pConfigSR; /* [i] set to NULL if donot want to open this module */
_RKPQ_ZME_CFG *pConfigZME; /* [i] set to NULL if donot want to open this module */
// TODO: add new module here
} RKPQ_Proc_Params;
/**
* the configurations for PQ modules
*/
/* CSC configuration */
typedef struct _RKPQ_CSC_CFG
{
// M4_BOOL_DESC("bEnableCSC", "1")
bool bEnableCSC;
// M4_NUMBER_DESC("nBrightness", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nBrightness;
// M4_NUMBER_DESC("nHue", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nHue;
// M4_NUMBER_DESC("nContrast", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nContrast;
// M4_NUMBER_DESC("nSaturation", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nSaturation;
// M4_NUMBER_DESC("nRGain", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nRGain;
// M4_NUMBER_DESC("nGGain", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nGGain;
// M4_NUMBER_DESC("nBGain", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nBGain;
// M4_NUMBER_DESC("nROffset", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nROffset;
// M4_NUMBER_DESC("nGOffset", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nGOffset;
// M4_NUMBER_DESC("nBOffset", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nBOffset;
void setDefault();
} RKPQ_CSC_CFG;
/* DCI configuration */
typedef struct _RKPQ_DCI_CFG
{
// M4_BOOL_DESC("bEnableDCI", "1")
bool bEnableDCI;
// M4_ARRAY_MARK_DESC("aWgtCoefLow", "u16", M4_SIZE(1,33), M4_RANGE(0, 1024), "[0,54,109,163,217,265,312,359,406,444,481,519,556,587,618,648,679,708,738,767,796,819,842,864,887,903,918,934,949,959,969,979,989]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aWgtCoefLow[RKPQ_DCI_LUT_SIZE];
// M4_ARRAY_MARK_DESC("aWgtCoefMid", "u16", M4_SIZE(1,33), M4_RANGE(0, 1024), "[0,20,40,60,80,112,145,178,211,269,327,384,442,490,538,582,626,663,701,738,775,798,821,843,866,885,905,924,943,963,983,1003,1023]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aWgtCoefMid[RKPQ_DCI_LUT_SIZE];
// M4_ARRAY_MARK_DESC("aWgtCoefHigh", "u16", M4_SIZE(1,33), M4_RANGE(0, 1024), "[0,9,17,26,35,57,80,102,125,151,178,205,232,261,289,318,346,379,412,445,478,508,538,571,607,643,685,733,793,856,916,970,1023]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aWgtCoefHigh[RKPQ_DCI_LUT_SIZE];
// M4_ARRAY_MARK_DESC("aWeightLow", "u16", M4_SIZE(1,32), M4_RANGE(0, 32), "[16, 16, 16, 16, 14, 12, 10, 8, 6, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aWeightLow[RKPQ_DCI_LUT_SIZE - 1];
// M4_ARRAY_MARK_DESC("aWeightMid", "u16", M4_SIZE(1,32), M4_RANGE(0, 32), "[0, 0, 0, 0, 3, 6, 9, 12, 15, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 15, 12, 9, 6, 3, 0, 0, 0, 0]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aWeightMid[RKPQ_DCI_LUT_SIZE - 1];
// M4_ARRAY_MARK_DESC("aWeightHigh", "u16", M4_SIZE(1,32), M4_RANGE(0, 32), "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aWeightHigh[RKPQ_DCI_LUT_SIZE - 1];
/* only for env vars below: */
uint32_t nContrastGlobal; /* Range: [0, 511], default: 256. */
uint32_t nContrastDark; /* Range: [0, 511], default: 256. */
uint32_t nContrastLight; /* Range: [0, 511], default: 256. */
void setDefault();
} RKPQ_DCI_CFG;
/* ACM configuration */
typedef struct _RKPQ_ACM_CFG
{
// M4_BOOL_DESC("bEnableACM", "1")
bool bEnableACM;
// M4_ARRAY_MARK_DESC("aTableDeltaYbyH", "u8", M4_SIZE(1,65), M4_RANGE(0, 255), "[128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableDeltaYbyH[RKPQ_ACM_LUT_LENGTH_H];
// M4_ARRAY_MARK_DESC("aTableDeltaHbyH", "u8", M4_SIZE(1,65), M4_RANGE(0, 127), "[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableDeltaHbyH[RKPQ_ACM_LUT_LENGTH_H];
// M4_ARRAY_MARK_DESC("aTableDeltaSbyH", "u8", M4_SIZE(1,65), M4_RANGE(0, 255), "[128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableDeltaSbyH[RKPQ_ACM_LUT_LENGTH_H];
// M4_ARRAY_MARK_DESC("aTableGainYbyY", "u8", M4_SIZE(1,9), M4_RANGE(0, 128), "[128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableGainYbyY[RKPQ_ACM_LUT_LENGTH_Y];
// M4_ARRAY_MARK_DESC("aTableGainHbyY", "u8", M4_SIZE(1,9), M4_RANGE(0, 128), "[128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableGainHbyY[RKPQ_ACM_LUT_LENGTH_Y];
// M4_ARRAY_MARK_DESC("aTableGainSbyY", "u8", M4_SIZE(1,9), M4_RANGE(0, 128), "[128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableGainSbyY[RKPQ_ACM_LUT_LENGTH_Y];
// M4_ARRAY_MARK_DESC("aTableGainYbyS", "u8", M4_SIZE(1,13), M4_RANGE(0, 128), "[128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableGainYbyS[RKPQ_ACM_LUT_LENGTH_S];
// M4_ARRAY_MARK_DESC("aTableGainHbyS", "u8", M4_SIZE(1,13), M4_RANGE(0, 128), "[128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableGainHbyS[RKPQ_ACM_LUT_LENGTH_S];
// M4_ARRAY_MARK_DESC("aTableGainSbyS", "u8", M4_SIZE(1,13), M4_RANGE(0, 128), "[128, 128, 128, 128, 128, 128, 128, 128, 128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint8_t aTableGainSbyS[RKPQ_ACM_LUT_LENGTH_S];
// M4_NUMBER_DESC("nLumGain", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nLumGain;
// M4_NUMBER_DESC("nHueGain", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nHueGain;
// M4_NUMBER_DESC("nSatGain", "u32", M4_RANGE(0,511), "256", M4_DIGIT(0))
uint32_t nSatGain;
/* only for env vars below: */
uint32_t nHueRed; /* Range: [0, 511], default: 256. */
uint32_t nHueGreen; /* Range: [0, 511], default: 256. */
uint32_t nHueBlue; /* Range: [0, 511], default: 256. */
uint32_t nHueSkin; /* Range: [0, 511], default: 256. */
uint32_t nSaturation; /* Range: [0, 511], default: 256. */
void setDefault();
} RKPQ_ACM_CFG;
/* Sharp configuration */
typedef struct _RKPQ_SHP_CFG
{
// M4_BOOL_DESC("bEnableSHP", "1")
bool bEnableSHP;
// M4_NUMBER_DESC("nPeakingGain", "u32", M4_RANGE(0,1024), "256", M4_DIGIT(0))
uint32_t nPeakingGain;
// M4_BOOL_DESC("bEnableShootCtrl", "1")
bool bEnableShootCtrl;
// M4_NUMBER_DESC("nShootCtrlOver", "u32", M4_RANGE(0,128), "36", M4_DIGIT(0))
uint32_t nShootCtrlOver;
// M4_NUMBER_DESC("nShootCtrlUnder", "u32", M4_RANGE(0,128), "36", M4_DIGIT(0))
uint32_t nShootCtrlUnder;
// M4_BOOL_DESC("bEnableCoringCtrl", "1")
bool bEnableCoringCtrl;
// M4_ARRAY_MARK_DESC("aCoringCtrlRatio", "u16", M4_SIZE(1,4), M4_RANGE(512, 2048), "[2048,2048,2048,2048]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aCoringCtrlRatio[RKPQ_SHP_PEAKING_BAND_NUM];
// M4_ARRAY_MARK_DESC("aCoringCtrlZero", "u16", M4_SIZE(1,4), M4_RANGE(0, 32), "[4,4,4,4]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aCoringCtrlZero[RKPQ_SHP_PEAKING_BAND_NUM];
// M4_ARRAY_MARK_DESC("aCoringCtrlThrd", "u16", M4_SIZE(1,4), M4_RANGE(0, 64), "[40,40,40,40]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aCoringCtrlThrd[RKPQ_SHP_PEAKING_BAND_NUM];
// M4_BOOL_DESC("bEnableGainCtrl", "1")
bool bEnableGainCtrl;
// M4_ARRAY_MARK_DESC("aGainCtrlPos", "u16", M4_SIZE(1,4), M4_RANGE(0, 2048), "[1024,1024,1024,1024]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aGainCtrlPos[RKPQ_SHP_PEAKING_BAND_NUM];
// M4_BOOL_DESC("bEnableLimitCtrl", "0")
bool bEnableLimitCtrl;
// M4_ARRAY_MARK_DESC("aLimitCtrlPos0", "u16", M4_SIZE(1,4), M4_RANGE(0, 127), "[64,64,64,64]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aLimitCtrlPos0[RKPQ_SHP_PEAKING_BAND_NUM];
// M4_ARRAY_MARK_DESC("aLimitCtrlPos1", "u16", M4_SIZE(1,4), M4_RANGE(0, 127), "[120,120,120,120]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aLimitCtrlPos1[RKPQ_SHP_PEAKING_BAND_NUM];
// M4_ARRAY_MARK_DESC("aLimitCtrlBndPos", "u16", M4_SIZE(1,4), M4_RANGE(0, 127), "[65,65,65,65]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aLimitCtrlBndPos[RKPQ_SHP_PEAKING_BAND_NUM];
// M4_ARRAY_MARK_DESC("aLimitCtrlRatio", "u16", M4_SIZE(1,4), M4_RANGE(0, 512), "[128,128,128,128]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
uint16_t aLimitCtrlRatio[RKPQ_SHP_PEAKING_BAND_NUM];
void setDefault();
} RKPQ_SHP_CFG;
/* SR configuration */
typedef struct _RKPQ_SR_CFG
{
// M4_BOOL_DESC("bEnableSR", "1")
bool bEnableSR;
/* dir filter & interp */
// M4_BOOL_DESC("bEnableDirFilter", "1")
bool bEnableDirFilter;
// M4_NUMBER_DESC("nEdgeThreshold", "u32", M4_RANGE(0,255), "30", M4_DIGIT(0))
uint32_t nEdgeThreshold;
// M4_NUMBER_DESC("nSinglePixelRetain", "u32", M4_RANGE(5,20), "10", M4_DIGIT(0))
uint32_t nSinglePixelRetain;
// M4_NUMBER_DESC("nSinglePixelAband", "u32", M4_RANGE(180,220), "200", M4_DIGIT(0))
uint32_t nSinglePixelAband; /* not work, Reserved */
// M4_NUMBER_DESC("nMinNeighborCandNum", "u32", M4_RANGE(1,5), "3", M4_DIGIT(0))
uint32_t nMinNeighborCandNum;
// M4_NUMBER_DESC("nMinMainDirPercent", "u32", M4_RANGE(0,255), "128", M4_DIGIT(0))
uint32_t nMinMainDirPercent;
/* RKNN-based SR */
// M4_BOOL_DESC("bEnableRknnSR", "1")
bool bEnableRknnSR;
// M4_BOOL_DESC("bEnableUsm", "1")
bool bEnableUsm;
// M4_NUMBER_DESC("nUsmGain", "u32", M4_RANGE(0,255), "128", M4_DIGIT(0))
uint32_t nUsmGain;
// M4_NUMBER_DESC("nUsmCtrlOver", "u32", M4_RANGE(0,255), "128", M4_DIGIT(0))
uint32_t nUsmCtrlOver;
// M4_NUMBER_DESC("nUsmCtrlUnder", "u32", M4_RANGE(0,255), "128", M4_DIGIT(0))
uint32_t nUsmCtrlUnder;
// M4_NUMBER_DESC("nColorStrength", "u32", M4_RANGE(0,256), "128", M4_DIGIT(0))
uint32_t nColorStrength;
// M4_NUMBER_DESC("nEdgeStrength", "u32", M4_RANGE(0,256), "128", M4_DIGIT(0))
uint32_t nEdgeStrength;
/* for future use */
uint32_t aReservedData[20];
void setDefault();
} RKPQ_SR_CFG;
/* Scaler configuration */
typedef struct _RKPQ_ZME_CFG
{
// M4_BOOL_DESC("bEnableSR", "1")
bool bEnableZME;
// M4_BOOL_DESC("bEnableDeringing", "1")
bool bEnableDeringing;
// M4_ARRAY_MARK_DESC("aVerCoefs", "s16", M4_SIZE(1, 8), M4_RANGE(0, 512), "[-8, -20, 404, 180, -52, 8, 0, 0]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
int16_t aVerCoefs[RKPQ_ZME_COEF_LENGTH];
// M4_ARRAY_MARK_DESC("aHorCoefs", "s16", M4_SIZE(1, 8), M4_RANGE(0, 512), "[4, -8, -20, 400, 180, -56, 12, 0]", M4_DIGIT(0), M4_DYNAMIC(1), "curve_table")
int16_t aHorCoefs[RKPQ_ZME_COEF_LENGTH];
/* for future use */
uint32_t aReservedData[23];
void setDefault();
} RKPQ_ZME_CFG;
/**
* @Function: rkpq_init()
* @Descrptn: rkpq_context initialization, create a rkpq_context instance.
* @Params:
* rkpq_context *pContext - the pq handle of context
* RKPQ_Init_Params *pInitParam - the API initialize parameters
* @Return: error code, 0 indicates everything is ok.
*/
int rkpq_init(rkpq_context *pContext, RKPQ_Init_Params *pInitParam);
/**
* @Function: rkpq_proc()
* @Descrptn: call a rkpq_context instance to execute.
* @Params:
* rkpq_context context - the pq handle of context
* RKPQ_API_Params pProcParam - the API execute parameters
* @Return: error code, 0 indicates everything is ok.
*/
int rkpq_proc(rkpq_context context, RKPQ_Proc_Params *pProcParam);
/**
* @Function: rkpq_deinit()
* @Descrptn: release rkpq_context resource created by rkpq_init().
* @Params:
* rkpq_context context - the pq handle of context
* @Return: error code, 0 indicates everything is ok.
*/
int rkpq_deinit(rkpq_context context);
/**
* @Function: rkpq_query()
* @Descrptn: query the information about image, buffer or others.
* @Params:
* rkpq_context context - the pq handle of context
* rkpq_query_cmd cmd - the query command, see rkpq_query_cmd
* size_t size - the buffer size of retuned information
* void* info - the buffer pointer of retuned information value
* @Return: error code, 0 indicates everything is ok.
* @Detail: the detail explanation of the arguments lists below:
* | Query Command | Need A Context | Return Type |
* | --------------------------------- | ----------------- | ----------------- |
* | RKPQ_QUERY_SDK_VERSION | no | rkpq_version_info |
* | RKPQ_QUERY_PERF_INFO | YES | rkpq_perf_info |
* | RKPQ_QUERY_IMG_FMT_INPUT_SUPPORT | no | rkpq_imgfmt_info |
* | RKPQ_QUERY_IMG_FMT_OUTPUT_SUPPORT | no | rkpq_imgfmt_info |
* | RKPQ_QUERY_IMG_FMT_CHANGE_SUPPORT | no | uint32_t |
* | RKPQ_QUERY_IMG_RES_CHANGE_SUPPORT | no | uint32_t |
* | RKPQ_QUERY_IMG_COLOR_SPACE_SUPPORT| no | rkpq_clrspc_info |
* | RKPQ_QUERY_IMG_BUF_INFO | no | rkpq_imgbuf_info |
* | RKPQ_QUERY_IMG_ALIGNMENT_OCL | YES | uint32_t |
* | RKPQ_QUERY_RKNN_SUPPORT | YES | uint32_t |
* | RKPQ_QUERY_MEAN_LUMA | YES | uint32_t |
* | RKPQ_QUERY_MODULES_SUPPORT | YES | rkpq_module_info |
* | RKPQ_QUERY_3DLUT_AI_TABLE | YES | uint16_t[14739] |
*/
int rkpq_query(rkpq_context context, rkpq_query_cmd cmd, size_t size, void* info);
/**
* @Function: rkpq_set_default_cfg()
* @Descrptn: set the module configurations to default values.
* @Params:
* rkpq_context context - the pq handle of context
* RKPQ_API_Params pProcParam - the API execute parameters
* @Return: error code, 0 indicates everything is ok.
*/
int rkpq_set_default_cfg(RKPQ_Proc_Params *pProcParam);
/**
* @Function: rkpq_set_loglevel()
* @Descrptn: set the log level.
* @Params:
* int logLevel - the log level, valid range: [0, 4]
* @Return: error code, 0 indicates everything is ok.
*/
int rkpq_set_loglevel(int logLevel);
#ifdef __cplusplus
}
#endif
#endif // __RKPQ_API_H_