/* * Copyright (c) 2019 Rockchip Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef _RK_AIQ_COMM_H_ #define _RK_AIQ_COMM_H_ #include #ifdef __cplusplus #define RKAIQ_BEGIN_DECLARE extern "C" { #define RKAIQ_END_DECLARE } #else #define RKAIQ_BEGIN_DECLARE #define RKAIQ_END_DECLARE #endif RKAIQ_BEGIN_DECLARE typedef enum { BOOL_FALSE = 0, BOOL_TRUE = (!BOOL_FALSE) } bool_t; typedef int RESULT; typedef enum RKAiqResult_e { RK_AIQ_RET_SUCCESS = 0, // this has to be 0, if clauses rely on it RK_AIQ_RET_FAILURE = 1, // process failure RK_AIQ_RET_INVALID_PARM = 2, // invalid parameter RK_AIQ_RET_WRONG_CONFIG = 3, // feature not supported RK_AIQ_RET_BUSY = 4, // there's already something going on... RK_AIQ_RET_CANCELED = 5, // operation canceled RK_AIQ_RET_OUTOFMEM = 6, // out of memory RK_AIQ_RET_OUTOFRANGE = 7, // parameter/value out of range RK_AIQ_RET_NULL_POINTER = 8, // the/one/all parameter(s) is a(are) NULL pointer(s) RK_AIQ_RET_DIVISION_BY_ZERO = 9, // a divisor equals ZERO RK_AIQ_RET_NO_INPUTIMAGE = 10 // no input image } RKAiqResult_t; typedef enum RKAiqState_e { RK_AIQ_STATE_INVALID = 0, /**< initialization value */ RK_AIQ_STATE_INITIALIZED = 1, /**< instance is created, but not initialized */ RK_AIQ_STATE_STOPPED = 2, /**< instance is confiured (ready to start) or stopped */ RK_AIQ_STATE_RUNNING = 3, /**< instance is running (processes frames) */ RK_AIQ_STATE_LOCKED = 4, /**< instance is locked (for taking snapshots) */ RK_AIQ_STATE_MAX /**< max */ } RKAiqState_t; typedef enum RKAiqOPMode_e { RK_AIQ_OP_MODE_INVALID = 0, /**< initialization value */ RK_AIQ_OP_MODE_AUTO = 1, /**< instance is created, but not initialized */ RK_AIQ_OP_MODE_MANUAL = 2, /**< instance is confiured (ready to start) or stopped */ RK_AIQ_OP_MODE_MAX /**< max */ } RKAiqOPMode_t; #define ABS(a) (((a) > 0) ? (a) : (-(a))) #ifndef MIN #define MIN(a,b) ((a) > (b) ? (b) : (a)) #endif #ifndef MAX #define MAX(a,b) ((a) < (b) ? (b) : (a)) #endif #define ROUND_D(x) (long)(((double)x)+(((x) > 0) ? 0.5 : (-0.5))) #define ROUND_F(x) (int)(((float)x)+(((x) > 0) ? 0.5 : (-0.5))) #define FLOOR(a) (int)( ((double)(a) < (int)(a)) ? (int)((a)-1) : (int)(a) ) #define FLOOR_INT64(a) (long)( ((double)(a) < (long)(a)) ? (long)((a)-1) : (long)(a) ) #define INTERP1(x0, x1, ratio) ((ratio) * ((x1) - (x0)) + x0) #define CLIPBIT(a,b) ((a)>((1<<(b))-1)?((1<<(b))-1):(a)) #define SWAP(_T_,A,B) { _T_ tmp = (A); (A) = (B); (B) = tmp; } #define MIN2(a, b) ((a) > (b) ? (b) : (a)) #define CLIP(a, min_v, max_v) (((a) < (min_v)) ? (min_v) : (((a) > (max_v)) ? (max_v) : (a))) #define RETURN_RESULT_IF_DIFFERENT( cur_res, exp_res ) if ( exp_res != cur_res ) { return ( cur_res ); } #define DCT_ASSERT(exp) ((void)0) #ifndef __FLT_EPSILON__ #define __FLT_EPSILON__ 0.000000119209289550781250000000 #endif /* __FLT_EPSILON__ */ #ifndef FLT_EPSILON #define FLT_EPSILON __FLT_EPSILON__ #endif /* FLT_EPSILON */ #define DIVMIN 0.00001 typedef unsigned int uint32_t; typedef int sint32_t; typedef char sint8_t; typedef unsigned long long uint64t; /******************************************************************************/ /** * @brief A structure to represent a 5x5 matrix. * * The 25 values are laid out as follows (zero based index): * * | 00 01 02 03 04 | \n * | 05 06 07 08 09 | \n * | 10 11 12 13 14 | \n * | 15 16 17 18 19 | \n * | 20 21 22 23 24 | \n * * @note The 25 values are represented as unsigned char numbers. * *****************************************************************************/ typedef struct Cam5x5UCharMatrix_s { uint8_t uCoeff[5 * 5]; /**< array of 5x5 unsigned char values */ } Cam5x5UCharMatrix_t; typedef struct Cam15x15UCharMatrix_s { uint8_t uCoeff[15 * 15]; /**< array of 15x15 unsigned char values */ } Cam15x15UCharMatrix_t; typedef struct Cam1x3IntMatrix_s { // M4_ARRAY_DESC("Coeff", "s32", M4_SIZE(1,3), M4_RANGE(-65535,65535), "0", M4_DIGIT(0), M4_DYNAMIC(0)) int Coeff[3]; } Cam1x3IntMatrix_t; typedef struct Cam1x4IntMatrix_s { int Coeff[4]; } Cam1x4IntMatrix_t; typedef struct Cam1x6IntMatrix_s { int Coeff[6]; } Cam1x6IntMatrix_t; typedef struct Cam1x8IntMatrix_s { int Coeff[8]; } Cam1x8IntMatrix_t; typedef struct Cam1x9IntMatrix_s { int Coeff[9]; } Cam1x9IntMatrix_t; typedef struct Cam1x12IntMatrix_s { int Coeff[12]; } Cam1x12IntMatrix_t; typedef struct Cam1x17IntMatrix_s { int Coeff[17]; } Cam1x17IntMatrix_t; typedef struct Cam2x3IntMatrix_s { int Coeff[2 * 3]; } Cam2x3IntMatrix_t; typedef struct Cam3x3IntMatrix_s { int Coeff[3 * 3]; } Cam3x3IntMatrix_t; typedef struct Cam5x5IntMatrix_s { int Coeff[5 * 5]; } Cam5x5IntMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam1x1FloatMatrix_s { float fCoeff[1]; } Cam1x1FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam1x3FloatMatrix_s { // M4_ARRAY_DESC("fCoeff", "f32", M4_SIZE(1,3), M4_RANGE(-65535,65535), "0", M4_DIGIT(6), M4_DYNAMIC(0)) float fCoeff[3]; } Cam1x3FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | ... | 4 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam1x4FloatMatrix_s { // M4_ARRAY_DESC("fCoeff", "f32", M4_SIZE(1,4), M4_RANGE(-65535,65535), "0", M4_DIGIT(6), M4_DYNAMIC(0)) float fCoeff[4]; } Cam1x4FloatMatrix_t; typedef struct Cam1x5FloatMatrix_s { float fCoeff[5]; } Cam1x5FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | ... | 6 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam1x6FloatMatrix_s { float fCoeff[6]; } Cam1x6FloatMatrix_t; typedef struct Cam1x8FloatMatrix_s { float fCoeff[8]; } Cam1x8FloatMatrix_t; typedef struct Cam1x9FloatMatrix_s { float fCoeff[9]; } Cam1x9FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | ... | 15 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam1x16FloatMatrix_s { float fCoeff[16]; } Cam1x16FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam2x1FloatMatrix { // M4_ARRAY_DESC("fCoeff", "f32", M4_SIZE(1,2), M4_RANGE(-65535,65535), "0", M4_DIGIT(6), M4_DYNAMIC(0)) float fCoeff[2]; } Cam2x1FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | * | 2 | 3 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam2x2FloatMatrix { float fCoeff[4]; } Cam2x2FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam3x1FloatMatrix { float fCoeff[3]; } Cam3x1FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | * | 3 | 4 | 5 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam3x2FloatMatrix_s { float fCoeff[6]; } Cam3x2FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | * | 3 | 4 | 5 | * | 6 | 7 | 8 | * * @note Coefficients are represented as float numbers */ /*****************************************************************************/ typedef struct Cam3x3FloatMatrix_s { float fCoeff[9]; } Cam3x3FloatMatrix_t; /******************************************************************************/ /** * @brief A structure to represent a 5x5 matrix. * * The 25 values are laid out as follows (zero based index): * * | 00 01 02 03 04 | \n * | 05 06 07 08 09 | \n * | 10 11 12 13 14 | \n * | 15 16 17 18 19 | \n * | 20 21 22 23 24 | \n * * @note The 25 values are represented as float numbers. * *****************************************************************************/ typedef struct Cam5x5FloatMatrix_s { float fCoeff[25U]; /**< array of 5x5 float values */ } Cam5x5FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | .... * | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | .... * | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | .... * ... * ... * ... * | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | .... | 288 | * * @note Coefficients are represented as short numbers */ /*****************************************************************************/ typedef struct Cam17x17FloatMatrix_s { float fCoeff[17 * 17]; } Cam17x17FloatMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | * * @note Coefficients are represented as short numbers */ /*****************************************************************************/ typedef struct Cam1x3ShortMatrix_s { // M4_ARRAY_DESC("fCoeff", "s16", M4_SIZE(1,3), M4_RANGE(-65535,65535), "0", M4_DIGIT(0), M4_DYNAMIC(0)) int16_t Coeff[3]; } Cam1x3ShortMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | ... | 4 | * * @note Coefficients are represented as short numbers */ /*****************************************************************************/ typedef struct Cam1x4UShortMatrix_s { uint16_t uCoeff[4]; } Cam1x4UShortMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | ... | 16 | * * @note Coefficients are represented as short numbers */ /*****************************************************************************/ typedef struct Cam1x17UShortMatrix_s { uint16_t uCoeff[17]; } Cam1x17UShortMatrix_t; /*****************************************************************************/ /** * @brief Matrix coefficients * * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | .... * | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | .... * | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | .... * ... * ... * ... * | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | .... | 288 | * * @note Coefficients are represented as short numbers */ /*****************************************************************************/ typedef struct Cam17x17UShortMatrix_s { // M4_ARRAY_DESC("uCoeff", "u16", M4_SIZE(17,17), M4_RANGE(0,10000), "1024", M4_DIGIT(0), M4_DYNAMIC(0)) uint16_t uCoeff[17 * 17]; } Cam17x17UShortMatrix_t; typedef enum { RK_AIQ_WORKING_MODE_NORMAL, RK_AIQ_WORKING_MODE_ISP_HDR2 = 0x10, RK_AIQ_WORKING_MODE_ISP_HDR3 = 0x20, // RK_AIQ_WORKING_MODE_SENSOR_HDR = 10, // sensor built-in hdr mode } rk_aiq_working_mode_t; typedef enum { RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR = RK_AIQ_WORKING_MODE_ISP_HDR2 + 1, RK_AIQ_ISP_HDR_MODE_2_LINE_HDR = RK_AIQ_WORKING_MODE_ISP_HDR2 + 2, RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR = RK_AIQ_WORKING_MODE_ISP_HDR3 + 1, RK_AIQ_ISP_HDR_MODE_3_LINE_HDR = RK_AIQ_WORKING_MODE_ISP_HDR3 + 2, } rk_aiq_isp_hdr_mode_t; typedef enum { RK_AIQ_SENSOR_HDR_LINE_MODE_DCG, // 2frame: share the same exptime, use dual conversion gain; 3frame: DCG+VS, VS frame use individual gain & time RK_AIQ_SENSOR_HDR_LINE_MODE_STAGGER, // 2frame or 3frame } rk_aiq_sensor_hdr_line_mode_t; #define RK_AIQ_HDR_GET_WORKING_MODE(mode) (mode & 0xF0) typedef enum { RK_AIQ_ISPP_STATIC_TNR_WORKING_MODE_2TO1, RK_AIQ_ISPP_STATIC_TNR_WORKING_MODE_3TO1, } rk_aiq_ispp_static_tnr_working_mode_t; typedef enum { RK_AIQ_ISPP_STATIC_FEC_WORKING_MODE_STABLIZATION, RK_AIQ_ISPP_STATIC_FEC_WORKING_MODE_FISHEYE, } rk_aiq_ispp_static_fec_working_mode_t; typedef enum { RK_MODULE_INVAL = 0, RK_MODULE_DPCC, RK_MODULE_BLS, RK_MODULE_LSC, RK_MODULE_AWB_GAIN, RK_MODULE_CTK, RK_MODULE_GOC, RK_MODULE_SHARP, RK_MODULE_AE, RK_MODULE_AWB, RK_MODULE_NR,//10 RK_MODULE_GIC, RK_MODULE_3DLUT, RK_MODULE_LDCH, RK_MODULE_TNR,//14 RK_MODULE_FEC, RK_MODULE_RAWNR,//16 RK_MODULE_MAX } rk_aiq_module_id_t; extern int g_rkaiq_isp_hw_ver; #define CHECK_ISP_HW_V20() \ (g_rkaiq_isp_hw_ver == 20 ? true : false) #define CHECK_ISP_HW_V21() \ (g_rkaiq_isp_hw_ver == 21 ? true : false) RKAIQ_END_DECLARE #endif