1178 lines
40 KiB
C
1178 lines
40 KiB
C
/*
|
|
* 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 <assert.h>
|
|
#include <fcntl.h>
|
|
#include <pthread.h>
|
|
#include <signal.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
|
|
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
|