/* * Copyright (c) 2021 Rockchip, Inc. All Rights Reserved. * * 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. */ #ifdef RKAIQ #include "sample_isp.h" #include "rkadk_log.h" #include #include #include #include #include #include #include #include #include typedef struct { RKADK_S32 s32CamId; RKADK_U32 u32StartCnt; pthread_mutex_t aiqCtxMutex; int gsLDCMode; rk_aiq_sys_ctx_t *pstAiqCtx; } SAMPLE_ISP_HANDLE_S; rk_aiq_wb_gain_t stGsWbAutoGain = {2.083900, 1.000000, 1.000000, 2.018500}; static SAMPLE_ISP_HANDLE_S gstIspHandle[RKADK_MAX_SENSOR_CNT] = { {-1, 0, PTHREAD_MUTEX_INITIALIZER, -1, NULL}, {-1, 0, PTHREAD_MUTEX_INITIALIZER, -1, NULL}, {-1, 0, PTHREAD_MUTEX_INITIALIZER, -1, NULL}}; typedef enum _SHUTTERSPEED_TYPE_E { SHUTTERSPEED_1_25 = 0, SHUTTERSPEED_1_30, SHUTTERSPEED_1_75, SHUTTERSPEED_1_100, SHUTTERSPEED_1_120, SHUTTERSPEED_1_150, SHUTTERSPEED_1_250, SHUTTERSPEED_1_300, SHUTTERSPEED_1_425, SHUTTERSPEED_1_600, SHUTTERSPEED_1_1000, SHUTTERSPEED_1_1250, SHUTTERSPEED_1_1750, SHUTTERSPEED_1_2500, SHUTTERSPEED_1_3000, SHUTTERSPEED_1_6000, SHUTTERSPEED_1_10000, SHUTTERSPEED_BUTT } SHUTTERSPEED_TYPE_E; typedef struct rk_SHUTTER_ATTR_S { SHUTTERSPEED_TYPE_E enShutterSpeed; float fExposureTime; } SHUTTER_ATTR_S; static SHUTTER_ATTR_S g_stShutterAttr[SHUTTERSPEED_BUTT] = { {SHUTTERSPEED_1_25, 1.0 / 25.0}, {SHUTTERSPEED_1_30, 1.0 / 30.0}, {SHUTTERSPEED_1_75, 1.0 / 75.0}, {SHUTTERSPEED_1_100, 1.0 / 100.0}, {SHUTTERSPEED_1_120, 1.0 / 120.0}, {SHUTTERSPEED_1_150, 1.0 / 150.0}, {SHUTTERSPEED_1_250, 1.0 / 250.0}, {SHUTTERSPEED_1_300, 1.0 / 300.0}, {SHUTTERSPEED_1_425, 1.0 / 425.0}, {SHUTTERSPEED_1_600, 1.0 / 600.0}, {SHUTTERSPEED_1_1000, 1.0 / 1000.0}, {SHUTTERSPEED_1_1250, 1.0 / 1250.0}, {SHUTTERSPEED_1_1750, 1.0 / 1750.0}, {SHUTTERSPEED_1_2500, 1.0 / 2500.0}, {SHUTTERSPEED_1_3000, 1.0 / 3000.0}, {SHUTTERSPEED_1_6000, 1.0 / 6000.0}, {SHUTTERSPEED_1_10000, 1.0 / 10000.0}}; static int SAMPLE_ISP_FindUsableIdx(RKADK_U32 u32CamId) { for (int i = 0; i < RKADK_MAX_SENSOR_CNT; i++) { if (gstIspHandle[i].s32CamId == -1) { RKADK_LOGP("find usable index[%d] u32CamId[%d]", i, u32CamId); return i; } } return -1; } static int SAMPLE_ISP_GetIdx(RKADK_U32 u32CamId) { for (int i = 0; i < RKADK_MAX_SENSOR_CNT; i++) { if (gstIspHandle[i].s32CamId == (RKADK_S32)u32CamId) { RKADK_LOGP("find matched index[%d] u32CamId[%d]", i, u32CamId); return i; } } return -1; } static int SAMPLE_ISP_Init(RKADK_U32 u32CamId, SAMPLE_ISP_PARAM stIspParam) { int ret; char hdrStr[16]; rk_aiq_sys_ctx_t *pstAiqCtx; rk_aiq_static_info_t atAiqStaticInfo; setlinebuf(stdout); // must set HDR_MODE, before init snprintf(hdrStr, sizeof(hdrStr), "%d", (int)stIspParam.WDRMode); setenv("HDR_MODE", hdrStr, 1); ret = rk_aiq_uapi2_sysctl_enumStaticMetasByPhyId(u32CamId, &atAiqStaticInfo); if (ret) { RKADK_LOGE("rk_aiq_uapi2_sysctl_enumStaticMetasByPhyId u32CamId[%d] failed[%d]", u32CamId, ret); return ret; } #if defined(RV1106_1103) rk_aiq_tb_info_t tb_info; memset(&tb_info, 0, sizeof(rk_aiq_tb_info_t)); tb_info.magic = sizeof(rk_aiq_tb_info_t) - 2; tb_info.is_start_once = false; tb_info.is_pre_aiq = false; tb_info.rtt_share_addr = 0; tb_info.prd_type = RK_AIQ_PRD_TYPE_SINGLE_FRAME; if (stIspParam.iqFileDir != NULL) { RKADK_LOGP("rkaiq use iqfiles from %s", stIspParam.iqFileDir); tb_info.iq_bin_mode = RK_AIQ_META_NOT_FULL_IQ_BIN; } ret = rk_aiq_uapi2_sysctl_preInit_tb_info(atAiqStaticInfo.sensor_info.sensor_name, &tb_info); if (ret != 0) RKADK_LOGE("rk_aiq_uapi2_sysctl_preInit_tb_info failed %#X!", ret); #endif RKADK_LOGP("CamId: %d, sensor_name is %s, iqfiles is %s", u32CamId, atAiqStaticInfo.sensor_info.sensor_name, stIspParam.iqFileDir); if(stIspParam.bMultiCam) { ret = rk_aiq_uapi2_sysctl_preInit_devBufCnt(atAiqStaticInfo.sensor_info.sensor_name, "rkraw_rx", 2); if (ret) RKADK_LOGE("rk_aiq_uapi2_sysctl_preInit_devBufCnt u32CamId[%d] failed[%d]", u32CamId, ret); } pstAiqCtx = rk_aiq_uapi2_sysctl_init(atAiqStaticInfo.sensor_info.sensor_name, stIspParam.iqFileDir, NULL, NULL); if (!pstAiqCtx) { RKADK_LOGE("rk_aiq_uapi2_sysctl2_init u32CamId[%d] failed", u32CamId); return -1; } if (stIspParam.bMultiCam) rk_aiq_uapi2_sysctl_setMulCamConc(pstAiqCtx, true); gstIspHandle[u32CamId].pstAiqCtx = pstAiqCtx; RKADK_LOGP("u32CamId[%d] aiq init done", u32CamId); return 0; } static int SAMPLE_ISP_Run(RKADK_U32 u32CamId, rk_aiq_working_mode_t WDRMode) { int ret; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); ret = rk_aiq_uapi2_sysctl_prepare(gstIspHandle[u32CamId].pstAiqCtx, 0, 0, WDRMode); if (ret) { RKADK_LOGE("rkaiq engine prepare u32CamId[%d] failed[%d]", u32CamId, ret); gstIspHandle[u32CamId].pstAiqCtx = NULL; return ret; } ret = rk_aiq_uapi2_sysctl_start(gstIspHandle[u32CamId].pstAiqCtx); if (ret) { RKADK_LOGE("rk_aiq_uapi2_sysctl_start u32CamId[%d] failed[%d]", u32CamId, ret); gstIspHandle[u32CamId].pstAiqCtx = NULL; return ret; } RKADK_LOGP("u32CamId[%d] aiq prepare and start done", u32CamId); return 0; } #if defined(RV1106_1103) || defined(RV1103B) int SAMPLE_ISP_SET_FrameRate(RKADK_U32 u32CamId, RKADK_U32 uFps) { int ret = 0; Uapi_ExpSwAttrV2_t expSwAttr; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("u32CamId[%d] uFps %d", u32CamId, uFps); ret = rk_aiq_user_api2_ae_getExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, &expSwAttr); expSwAttr.stAuto.stFrmRate.isFpsFix = true; expSwAttr.stAuto.stFrmRate.FpsValue = uFps; ret = rk_aiq_user_api2_ae_setExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, expSwAttr); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } #else int SAMPLE_ISP_SET_FrameRate(RKADK_U32 u32CamId, RKADK_U32 uFps) { int ret = 0; frameRateInfo_t info; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("u32CamId[%d] uFps %d", u32CamId, uFps); memset(&info, 0, sizeof(frameRateInfo_t)); info.mode = OP_MANUAL; info.fps = uFps; ret = rk_aiq_uapi2_setFrameRate(gstIspHandle[u32CamId].pstAiqCtx, info); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } #endif int SAMPLE_ISP_Start(RKADK_U32 u32CamId, SAMPLE_ISP_PARAM stIspParam) { int index, ret; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_POINTER(stIspParam.iqFileDir, RKADK_FAILURE); index = SAMPLE_ISP_GetIdx(u32CamId); if (index < 0) { index = SAMPLE_ISP_FindUsableIdx(u32CamId); if (index < 0) { RKADK_LOGE("u32CamId[%d] not find usable index", u32CamId); return -1; } } if (gstIspHandle[index].u32StartCnt != 0) { gstIspHandle[index].u32StartCnt++; RKADK_LOGP("u32CamId[%d] u32StartCnt: %d", u32CamId, gstIspHandle[index].u32StartCnt); return 0; } ret = SAMPLE_ISP_Init(u32CamId, stIspParam); if (ret) { RKADK_LOGE("SAMPLE_ISP_Init u32CamId[%d] failed[%d]", u32CamId, ret); return ret; } ret = SAMPLE_ISP_Run(u32CamId, stIspParam.WDRMode); if (ret) { RKADK_LOGE("SAMPLE_ISP_Run u32CamId[%d] failed[%d]", u32CamId, ret); return ret; } ret = SAMPLE_ISP_SET_FrameRate(u32CamId, stIspParam.fps); if (ret) { RKADK_LOGE("SAMPLE_ISP_SET_FrameRate u32CamId[%d] failed[%d]", u32CamId, ret); return ret; } gstIspHandle[index].s32CamId = u32CamId; gstIspHandle[index].u32StartCnt++; RKADK_LOGP("u32CamId[%d] done!", u32CamId); return 0; } int SAMPLE_ISP_Stop(RKADK_U32 u32CamId) { int index, ret; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); index = SAMPLE_ISP_GetIdx(u32CamId); if (index < 0) { RKADK_LOGE("not find matched u32CamId[%d]", u32CamId); return -1; } if (gstIspHandle[index].u32StartCnt > 1) { gstIspHandle[index].u32StartCnt--; RKADK_LOGP("u32CamId[%d] u32StartCnt: %d", u32CamId, gstIspHandle[index].u32StartCnt); return 0; } ret = rk_aiq_uapi2_sysctl_stop(gstIspHandle[u32CamId].pstAiqCtx, false); if (ret) { RKADK_LOGE("rk_aiq_uapi2_sysctl_stop u32CamId[%d] failed[%d]", u32CamId, ret); return ret; } rk_aiq_uapi2_sysctl_deinit(gstIspHandle[u32CamId].pstAiqCtx); gstIspHandle[u32CamId].pstAiqCtx = NULL; gstIspHandle[index].s32CamId = -1; gstIspHandle[index].u32StartCnt = 0; RKADK_LOGP("u32CamId[%d] done!", u32CamId); return 0; } int SAMPLE_ISP_GET_MirrorFlip(RKADK_U32 u32CamId, bool *mirror, bool *flip) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_getMirrorFlip(gstIspHandle[u32CamId].pstAiqCtx, mirror, flip); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_MirrorFlip(RKADK_U32 u32CamId, bool mirror, bool flip) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("mirror=%d, flip=%d", mirror, flip); ret = rk_aiq_uapi2_setMirrorFlip(gstIspHandle[u32CamId].pstAiqCtx, mirror, flip, 4); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GetAINrParams(RKADK_U32 u32CamId, rk_ainr_param *param) { int ret; RKADK_CHECK_POINTER(param, RKADK_FAILURE); RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); ret = rk_aiq_uapi2_sysctl_getAinrParams(gstIspHandle[u32CamId].pstAiqCtx, param); if (ret) { printf("rk_aiq_uapi2_sysctl_getAinrParams failed[%x]", ret); return ret; } return 0; } #if defined(RV1106_1103) || defined(RV1103B) || defined(RV1126_1109) int SAMPLE_ISP_UpdateIq(RKADK_U32 u32CamId, char *iqfile) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_POINTER(iqfile, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("iqfile: %s", iqfile); ret = rk_aiq_uapi2_sysctl_updateIq(gstIspHandle[u32CamId].pstAiqCtx, iqfile); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_FecEn(RKADK_U32 u32CamId, bool bFECEnable) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("bFECEnable %d", bFECEnable); ret = rk_aiq_uapi2_setFecEn(gstIspHandle[u32CamId].pstAiqCtx, bFECEnable); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_FecBypass(RKADK_U32 u32CamId, bool bypass) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("bypass=%d", bypass); ret = rk_aiq_uapi2_setFecBypass(gstIspHandle[u32CamId].pstAiqCtx, bypass); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GET_FecAttrib(RKADK_U32 u32CamId, rk_aiq_fec_attrib_t *attr) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_POINTER(attr, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); memset(attr, 0, sizeof(rk_aiq_fec_attrib_t)); ret = rk_aiq_user_api2_afec_GetAttrib(gstIspHandle[u32CamId].pstAiqCtx, attr); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GET_AeExpResInfo(RKADK_U32 u32CamId, Uapi_ExpQueryInfo_t *pstExpInfo) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_POINTER(pstExpInfo, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); memset(pstExpInfo, 0, sizeof(Uapi_ExpQueryInfo_t)); ret = rk_aiq_user_api2_ae_queryExpResInfo(gstIspHandle[u32CamId].pstAiqCtx, pstExpInfo); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_DumpExpInfo(RKADK_U32 u32CamId, rk_aiq_working_mode_t WDRMode) { int ret = 0; Uapi_ExpQueryInfo_t stExpInfo; rk_aiq_wb_cct_t stCCT; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); ret = rk_aiq_user_api2_ae_queryExpResInfo(gstIspHandle[u32CamId].pstAiqCtx, &stExpInfo); ret |= rk_aiq_user_api2_awb_GetCCT(gstIspHandle[u32CamId].pstAiqCtx, &stCCT); /* if (WDRMode == RK_AIQ_WORKING_MODE_NORMAL) { sprintf(aStr, "M:%.0f-%.1f LM:%.1f CT:%.1f", stExpInfo.CurExpInfo.LinearExp.exp_real_params.integration_time * 1000 * 1000, stExpInfo.CurExpInfo.LinearExp.exp_real_params.analog_gain, stExpInfo.MeanLuma, stCCT.CCT); } else { sprintf(aStr, "S:%.0f-%.1f M:%.0f-%.1f L:%.0f-%.1f SLM:%.1f MLM:%.1f " "LLM:%.1f CT:%.1f", stExpInfo.CurExpInfo.HdrExp[0].exp_real_params.integration_time * 1000 * 1000, stExpInfo.CurExpInfo.HdrExp[0].exp_real_params.analog_gain, stExpInfo.CurExpInfo.HdrExp[1].exp_real_params.integration_time * 1000 * 1000, stExpInfo.CurExpInfo.HdrExp[1].exp_real_params.analog_gain, stExpInfo.CurExpInfo.HdrExp[2].exp_real_params.integration_time * 1000 * 1000, stExpInfo.CurExpInfo.HdrExp[2].exp_real_params.analog_gain, stExpInfo.HdrMeanLuma[0], stExpInfo.HdrMeanLuma[1], stExpInfo.HdrMeanLuma[2], stCCT.CCT); } RKADK_LOGP("isp exp dump: %s", aStr); */ return ret; } int SAMPLE_ISP_EnableLdch(RKADK_U32 u32CamId, bool on, RKADK_U32 level) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("on = %d, ldc level = %d", on, level); if (level < 1) level = 1; else if (level > 255) level = 255; ret = rk_aiq_uapi2_setLdchEn(gstIspHandle[u32CamId].pstAiqCtx, on); if (on) ret |= rk_aiq_uapi2_setLdchCorrectLevel(gstIspHandle[u32CamId].pstAiqCtx, level); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GET_LdchAttrib(RKADK_U32 u32CamId, rk_aiq_ldch_attrib_t *attr) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_POINTER(attr, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); memset(attr, 0, sizeof(rk_aiq_ldch_attrib_t)); ret = rk_aiq_user_api2_aldch_GetAttrib(gstIspHandle[u32CamId].pstAiqCtx, attr); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } /*only support switch between HDR and normal*/ int SAMPLE_ISP_SET_WDRModeDyn(RKADK_U32 u32CamId, rk_aiq_working_mode_t WDRMode) { int ret = 0; /* RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_sysctl_swWorkingModeDyn(gstIspHandle[u32CamId].pstAiqCtx, WDRMode); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); */ return ret; } int SAMPLE_ISP_SET_Brightness(RKADK_U32 u32CamId, RKADK_U32 value) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); // value[0,255], default 128 ret = rk_aiq_uapi2_setBrightness(gstIspHandle[u32CamId].pstAiqCtx, value); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_Contrast(RKADK_U32 u32CamId, RKADK_U32 value) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); // value[0,255], default 128 ret = rk_aiq_uapi2_setContrast(gstIspHandle[u32CamId].pstAiqCtx, value); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_Saturation(RKADK_U32 u32CamId, RKADK_U32 value) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); // value[0,255], default 128 ret = rk_aiq_uapi2_setSaturation(gstIspHandle[u32CamId].pstAiqCtx, value); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_Sharpness(RKADK_U32 u32CamId, RKADK_U32 value) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); // value[0,100], default 50 ret = rk_aiq_uapi2_setSharpness(gstIspHandle[u32CamId].pstAiqCtx, value); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_ManualExposureAutoGain(RKADK_U32 u32CamId, RKADK_U32 u32Shutter) { int ret = 0; Uapi_ExpSwAttrV2_t stExpSwAttr; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_user_api2_ae_getExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, &stExpSwAttr); stExpSwAttr.AecOpType = RK_AIQ_OP_MODE_MANUAL; stExpSwAttr.stManual.LinearAE.ManualGainEn = false; stExpSwAttr.stManual.LinearAE.ManualTimeEn = true; stExpSwAttr.stManual.LinearAE.TimeValue = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; stExpSwAttr.stManual.HdrAE.ManualGainEn = false; stExpSwAttr.stManual.HdrAE.ManualTimeEn = true; stExpSwAttr.stManual.HdrAE.TimeValue[0] = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; stExpSwAttr.stManual.HdrAE.TimeValue[1] = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; stExpSwAttr.stManual.HdrAE.TimeValue[2] = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; ret |= rk_aiq_user_api2_ae_setExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, stExpSwAttr); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_ManualExposureManualGain(RKADK_U32 u32CamId, RKADK_U32 u32Shutter, RKADK_U32 u32Gain) { int ret = 0; Uapi_ExpSwAttrV2_t stExpSwAttr; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_user_api2_ae_getExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, &stExpSwAttr); stExpSwAttr.AecOpType = RK_AIQ_OP_MODE_MANUAL; stExpSwAttr.stManual.LinearAE.ManualGainEn = true; stExpSwAttr.stManual.LinearAE.ManualTimeEn = true; stExpSwAttr.stManual.LinearAE.TimeValue = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; //(1+gain)*4;//gain[0~255] -> GainValue[1~1024] stExpSwAttr.stManual.LinearAE.GainValue = (1.0 + u32Gain); stExpSwAttr.stManual.HdrAE.ManualGainEn = true; stExpSwAttr.stManual.HdrAE.ManualTimeEn = true; stExpSwAttr.stManual.HdrAE.TimeValue[0] = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; stExpSwAttr.stManual.HdrAE.TimeValue[1] = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; stExpSwAttr.stManual.HdrAE.TimeValue[2] = g_stShutterAttr[u32Shutter % SHUTTERSPEED_BUTT].fExposureTime; //(1+gain)*4;//gain[0~255] -> GainValue[1~1024] stExpSwAttr.stManual.HdrAE.GainValue[0] = (1.0 + u32Gain); //(1+gain)*4;//gain[0~255] -> GainValue[1~1024] stExpSwAttr.stManual.HdrAE.GainValue[1] = (1.0 + u32Gain); //(1+gain)*4;//gain[0~255] -> GainValue[1~1024] stExpSwAttr.stManual.HdrAE.GainValue[2] = (1.0 + u32Gain); ret |= rk_aiq_user_api2_ae_setExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, stExpSwAttr); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_AutoExposure(RKADK_U32 u32CamId) { int ret = 0; Uapi_ExpSwAttrV2_t stExpSwAttr; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_user_api2_ae_getExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, &stExpSwAttr); stExpSwAttr.AecOpType = RK_AIQ_OP_MODE_AUTO; ret |= rk_aiq_user_api2_ae_setExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, stExpSwAttr); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_Exposure(RKADK_U32 u32CamId, bool bIsAutoExposure, RKADK_U32 bIsAGC, RKADK_U32 u32ElectronicShutter, RKADK_U32 u32Agc) { int ret = 0; if (!bIsAutoExposure) { if (bIsAGC) { ret = SAMPLE_ISP_SET_ManualExposureAutoGain(u32CamId, u32ElectronicShutter); } else { ret = SAMPLE_ISP_SET_ManualExposureManualGain( u32CamId, u32ElectronicShutter, u32Agc); } } else { ret = SAMPLE_ISP_SET_AutoExposure(u32CamId); } return ret; } int SAMPLE_ISP_SET_BackLight(RKADK_U32 u32CamId, bool bEnable, RKADK_U32 u32Strength) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); if (bEnable) { ret = rk_aiq_uapi2_setBLCMode(gstIspHandle[u32CamId].pstAiqCtx, true, AE_MEAS_AREA_AUTO); usleep(30000); // u32Strength: [1~100] ret |= rk_aiq_uapi2_setBLCStrength(gstIspHandle[u32CamId].pstAiqCtx, u32Strength); } else { ret = rk_aiq_uapi2_setBLCMode(gstIspHandle[u32CamId].pstAiqCtx, false, AE_MEAS_AREA_AUTO); } pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_LightInhibition(RKADK_U32 u32CamId, bool bEnable, unsigned char u8Strength, unsigned char u8Level) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); if (bEnable) { ret = rk_aiq_uapi2_setHLCMode(gstIspHandle[u32CamId].pstAiqCtx, true); if (!ret) { // u8Strength: [0~100] ret = rk_aiq_uapi2_setHLCStrength(gstIspHandle[u32CamId].pstAiqCtx, u8Strength); // u8Level: [0~10] ret = rk_aiq_uapi2_setDarkAreaBoostStrth(gstIspHandle[u32CamId].pstAiqCtx, u8Level); } } else { ret = rk_aiq_uapi2_setHLCMode(gstIspHandle[u32CamId].pstAiqCtx, false); } pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_DarkAreaBoostStrth(RKADK_U32 u32CamId, RKADK_U32 level) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); if (level < 0) level = 0; else if (level > 10) level = 10; RKADK_LOGP("level = %d", level); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_setDarkAreaBoostStrth(gstIspHandle[u32CamId].pstAiqCtx, level); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GET_DarkAreaBoostStrth(RKADK_U32 u32CamId, RKADK_U32 *level) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_getDarkAreaBoostStrth(gstIspHandle[u32CamId].pstAiqCtx, level); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_CpslCfg(RKADK_U32 u32CamId, rk_aiq_cpsl_cfg_t *cpsl) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_POINTER(cpsl, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_sysctl_setCpsLtCfg(gstIspHandle[u32CamId].pstAiqCtx, cpsl); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_OpenColorCloseLed(RKADK_U32 u32CamId) { int ret = 0; rk_aiq_cpsl_cfg_t stCpslCfg; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); memset(&stCpslCfg, 0, sizeof(rk_aiq_cpsl_cfg_t)); stCpslCfg.lght_src = RK_AIQ_CPSLS_IR; stCpslCfg.mode = RK_AIQ_OP_MODE_MANUAL; stCpslCfg.gray_on = false; stCpslCfg.u.m.on = 0; stCpslCfg.u.m.strength_led = 0; stCpslCfg.u.m.strength_ir = 0; ret = rk_aiq_uapi2_sysctl_setCpsLtCfg(gstIspHandle[u32CamId].pstAiqCtx, &stCpslCfg); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_GrayOpenLed(RKADK_U32 u32CamId, unsigned char u8Strength) { int ret = 0; rk_aiq_cpsl_cfg_t stCpslCfg; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); memset(&stCpslCfg, 0, sizeof(rk_aiq_cpsl_cfg_t)); stCpslCfg.mode = RK_AIQ_OP_MODE_MANUAL; stCpslCfg.lght_src = RK_AIQ_CPSLS_IR; stCpslCfg.gray_on = true; stCpslCfg.u.m.on = 1; stCpslCfg.u.m.strength_led = u8Strength / 5 + 3; stCpslCfg.u.m.strength_ir = u8Strength / 5 + 3; ret = rk_aiq_uapi2_sysctl_setCpsLtCfg(gstIspHandle[u32CamId].pstAiqCtx, &stCpslCfg); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_AutoWhiteBalance(RKADK_U32 u32CamId) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_setWBMode(gstIspHandle[u32CamId].pstAiqCtx, OP_AUTO); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_ManualWhiteBalance(RKADK_U32 u32CamId, RKADK_U32 u32RGain, RKADK_U32 u32GGain, RKADK_U32 u32BGain) { int ret = 0; rk_aiq_wb_gain_t gain; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); u32RGain = (u32RGain == 0) ? 1 : u32RGain; u32GGain = (u32GGain == 0) ? 1 : u32GGain; u32BGain = (u32BGain == 0) ? 1 : u32BGain; // gain.bgain = (b_gain / 255.0f) * 4;//[0,255]->(0.0, 4.0] // gain.grgain = (g_gain / 255.0f) * 4;//[0,255]->(0.0, 4.0] // gain.gbgain = (g_gain / 255.0f) * 4;//[0,255]->(0.0, 4.0] // gain.rgain = (r_gain / 255.0f) * 4;//[0,255]->(0.0, 4.0] //[0,255]->(0.0, 4.0] gain.rgain = (u32RGain / 128.0f) * stGsWbAutoGain.rgain; //[0,255]->(0.0, 4.0] gain.grgain = (u32GGain / 128.0f) * stGsWbAutoGain.grgain; //[0,255]->(0.0, 4.0] gain.gbgain = (u32GGain / 128.0f) * stGsWbAutoGain.gbgain; //[0,255]->(0.0, 4.0] gain.bgain = (u32BGain / 128.0f) * stGsWbAutoGain.bgain; RKADK_LOGP("convert gain r g g b %f, %f, %f, %f", gain.rgain, gain.grgain, gain.gbgain, gain.bgain); RKADK_LOGP("auto gain r g g b %f, %f, %f, %f", stGsWbAutoGain.rgain, stGsWbAutoGain.grgain, stGsWbAutoGain.gbgain, stGsWbAutoGain.bgain); ret = rk_aiq_uapi2_setMWBGain(gstIspHandle[u32CamId].pstAiqCtx, &gain); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GET_WhiteBalanceGain(RKADK_U32 u32CamId, rk_aiq_wb_gain_t *gain) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); RKADK_LOGP("Rgain = %f, Grgain = %f, Gbgain = %f, Bgain = %f", gain->rgain, gain->grgain, gain->gbgain, gain->bgain); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_getWBGain(gstIspHandle[u32CamId].pstAiqCtx, gain); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } // mode 0:off, 1:2d, 2:3d, 3: 2d+3d int SAMPLE_ISP_SET_DNRStrength(RKADK_U32 u32CamId, RKADK_U32 u32Mode, RKADK_U32 u322DValue, RKADK_U32 u323Dvalue) { int ret = 0; RKADK_U32 u322DnrDefaultLevel = 50; RKADK_U32 u323DnrDefaultLevel = 50; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); RKADK_U32 u32_2d_value = (u322DValue / 128.0f) * u322DnrDefaultLevel; RKADK_U32 u32_3d_value = (u323Dvalue / 128.0f) * u323DnrDefaultLevel; RKADK_LOGP("mode = %d n_2d_value = %d n_3d_value = %d", u32Mode, u322DValue, u323Dvalue); RKADK_LOGP("u_2d_value = %d n_3d_value = %d", u32_2d_value, u32_3d_value); RKADK_LOGP("u322DnrDefaultLevel = %d u323DnrDefaultLevel = %d", u322DnrDefaultLevel, u323DnrDefaultLevel); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); if (u32Mode == 0) { ret = rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_NR, true); // 2D ret |= rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_TNR, true); // 3D ret |= rk_aiq_uapi2_setMSpaNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u322DnrDefaultLevel); //[0,100] ret |= rk_aiq_uapi2_setMTNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u323DnrDefaultLevel); //[0,100] } else if (u32Mode == 1) { // 2D ret = rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_NR, true); // 2D ret |= rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_TNR, true); // 3D ret |= rk_aiq_uapi2_setMSpaNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u32_2d_value); //[0,255] -> [0,100] ret |= rk_aiq_uapi2_setMTNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u323DnrDefaultLevel); } else if (u32Mode == 2) { // 3D ret = rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_NR, true); // 2D ret |= rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_TNR, true); // 3D ret |= rk_aiq_uapi2_setMSpaNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u322DnrDefaultLevel); //[0,100]->[0,255] ret |= rk_aiq_uapi2_setMTNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u32_3d_value); } else if (u32Mode == 3) { // 2D+3D ret = rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_NR, true); // 2D ret |= rk_aiq_uapi2_sysctl_setModuleCtl(gstIspHandle[u32CamId].pstAiqCtx, RK_MODULE_TNR, true); // 3D ret |= rk_aiq_uapi2_setMSpaNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u32_2d_value); //[0,255] -> [0,100] ret |= rk_aiq_uapi2_setMTNRStrth(gstIspHandle[u32CamId].pstAiqCtx, true, u32_3d_value); //[0,255] -> [0,100] } pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GET_DNRStrength(RKADK_U32 u32CamId, RKADK_U32 *u322DValue, RKADK_U32 *u323Dvalue) { int ret = 0; bool on; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_getMSpaNRStrth(gstIspHandle[u32CamId].pstAiqCtx, &on, u322DValue); ret |= rk_aiq_uapi2_getMTNRStrth(gstIspHandle[u32CamId].pstAiqCtx, &on, u323Dvalue); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_Flicker(RKADK_U32 u32CamId, unsigned char u32Flicker) { int ret = 0; Uapi_ExpSwAttrV2_t expSwAttr; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); if (u32Flicker == 0) { // NTSC(60HZ) ret = rk_aiq_uapi2_setExpPwrLineFreqMode(gstIspHandle[u32CamId].pstAiqCtx, EXP_PWR_LINE_FREQ_60HZ); ret = rk_aiq_user_api2_ae_getExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, &expSwAttr); expSwAttr.stAuto.stFrmRate.isFpsFix = true; expSwAttr.stAuto.stFrmRate.FpsValue = 30; ret = rk_aiq_user_api2_ae_setExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, expSwAttr); } else if (u32Flicker == 1) { // PAL(50HZ) ret = rk_aiq_uapi2_setExpPwrLineFreqMode(gstIspHandle[u32CamId].pstAiqCtx, EXP_PWR_LINE_FREQ_50HZ); ret = rk_aiq_user_api2_ae_getExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, &expSwAttr); expSwAttr.stAuto.stFrmRate.isFpsFix = true; expSwAttr.stAuto.stFrmRate.FpsValue = 25; ret = rk_aiq_user_api2_ae_setExpSwAttr(gstIspHandle[u32CamId].pstAiqCtx, expSwAttr); } pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } // mode 0 0ff 1 manual 2 auto int SAMPLE_ISP_EnableDefog(RKADK_U32 u32CamId, bool on, opMode_t mode, RKADK_U32 level) { int ret = 0; adehaze_sw_v12_t attr; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); RKADK_LOGP("defog on = %d, mode = %d, level = %d", on, mode, level); if (on && mode == 1) { attr.mode = DEHAZE_API_MANUAL; if (level < 1) level = 1; else if (level > 100) level = 100; } else { attr.mode = DEHAZE_API_AUTO; } ret = rk_aiq_user_api2_adehaze_v12_setSwAttrib(gstIspHandle[u32CamId].pstAiqCtx, &attr); if (on && mode == 1) ret = rk_aiq_uapi2_setMDehazeStrth(gstIspHandle[u32CamId].pstAiqCtx, level); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_GET_MDhzStrth(RKADK_U32 u32CamId, bool *on, RKADK_U32 *level) { int ret = 0; adehaze_sw_v12_t attr; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_user_api2_adehaze_v12_getSwAttrib(gstIspHandle[u32CamId].pstAiqCtx, &attr); if (attr.mode == DEHAZE_API_MANUAL) *on = true; else *on =false; if (*on) ret = rk_aiq_uapi2_getMDehazeStrth(gstIspHandle[u32CamId].pstAiqCtx, level); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_Correction(RKADK_U32 u32CamId, RKADK_S32 u32Mode, RKADK_U32 u32Value) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); if (gstIspHandle[u32CamId].gsLDCMode != u32Mode) { if (u32Mode) { ret = rk_aiq_uapi2_setLdchEn(gstIspHandle[u32CamId].pstAiqCtx, true); } else { ret = rk_aiq_uapi2_setLdchEn(gstIspHandle[u32CamId].pstAiqCtx, false); } gstIspHandle[u32CamId].gsLDCMode = u32Mode; } if (u32Mode) { ret |= rk_aiq_uapi2_setLdchCorrectLevel(gstIspHandle[u32CamId].pstAiqCtx, (u32Value < 2 ? 2 : u32Value)); } pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_BypassStreamRotation(RKADK_U32 u32CamId, int S32Rotation) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); rk_aiq_rotation_t rk_rotation = RK_AIQ_ROTATION_0; if (S32Rotation == 0) { rk_rotation = RK_AIQ_ROTATION_0; } else if (S32Rotation == 90) { rk_rotation = RK_AIQ_ROTATION_90; } else if (S32Rotation == 270) { rk_rotation = RK_AIQ_ROTATION_270; } pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_sysctl_setSharpFbcRotation(gstIspHandle[u32CamId].pstAiqCtx, rk_rotation); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SET_Crop(RKADK_U32 u32CamId, rk_aiq_rect_t rect) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); ret = rk_aiq_uapi2_sysctl_setCrop(gstIspHandle[u32CamId].pstAiqCtx, rect); pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_Get_AiqHandle(RKADK_U32 u32CamId, RKADK_MW_PTR *ppAiqCtx) { int ret = 0; RKADK_CHECK_CAMERAID(u32CamId, RKADK_FAILURE); RKADK_CHECK_INIT(gstIspHandle[u32CamId].pstAiqCtx, RKADK_FAILURE); pthread_mutex_lock(&gstIspHandle[u32CamId].aiqCtxMutex); *ppAiqCtx = (RKADK_MW_PTR)gstIspHandle[u32CamId].pstAiqCtx; pthread_mutex_unlock(&gstIspHandle[u32CamId].aiqCtxMutex); return ret; } int SAMPLE_ISP_SingleFrame(RKADK_U32 u32CamId) { if (u32CamId >= RKADK_MAX_SENSOR_CNT) { printf("Invalid u32CamId[%d]", u32CamId); return -1; } if (!gstIspHandle[u32CamId].pstAiqCtx) { printf("pstAiqCtx not init"); return -1; } RKADK_LOGP("enter rk_aiq_uapi2_sysctl_pause"); rk_aiq_uapi2_sysctl_pause(gstIspHandle[u32CamId].pstAiqCtx, true); return 0; } int SAMPLE_ISP_MultiFrame(RKADK_U32 u32CamId) { if (u32CamId >= RKADK_MAX_SENSOR_CNT) { printf("Invalid u32CamId[%d]", u32CamId); return -1; } if (!gstIspHandle[u32CamId].pstAiqCtx) { printf("pstAiqCtx not init"); return -1; } RKADK_LOGP("enter rk_aiq_uapi2_sysctl_resume"); rk_aiq_uapi2_sysctl_resume(gstIspHandle[u32CamId].pstAiqCtx); return 0; } #endif #endif