#include "rk_aiq_uapi_amerge_int.h" #include "rk_aiq_types_amerge_algo_prvt.h" bool IfMergeDataEqu ( int* pInput, int len ) { bool equ = true; for(int i = 0; i < len - 1; i++) if(pInput[i] != pInput[i + 1]) equ = false; return equ; } XCamReturn rk_aiq_uapi_amerge_SetTool ( CalibDbV2_merge_t* pStore, CalibDbV2_merge_t* pInput ) { XCamReturn ret = XCAM_RETURN_NO_ERROR; //oe curve int OECurveLen[3]; OECurveLen[0] = pInput->MergeTuningPara.OECurve.EnvLv_len; OECurveLen[1] = pInput->MergeTuningPara.OECurve.Smooth_len; OECurveLen[2] = pInput->MergeTuningPara.OECurve.Offset_len; bool OECurveLenEqu = IfMergeDataEqu(OECurveLen, 3); if(!OECurveLenEqu) { LOGE_AMERGE("%s: Input Merge OECurve Data length is NOT EQUAL !!!\n", __FUNCTION__ ); return XCAM_RETURN_ERROR_FAILED; } if(pStore->MergeTuningPara.OECurve.EnvLv_len != pInput->MergeTuningPara.OECurve.EnvLv_len) { //free free(pStore->MergeTuningPara.OECurve.EnvLv); free(pStore->MergeTuningPara.OECurve.Smooth); free(pStore->MergeTuningPara.OECurve.Offset); //malloc pStore->MergeTuningPara.OECurve.EnvLv = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.OECurve.EnvLv_len); pStore->MergeTuningPara.OECurve.Smooth = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.OECurve.EnvLv_len); pStore->MergeTuningPara.OECurve.Offset = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.OECurve.EnvLv_len); } //store len pStore->MergeTuningPara.OECurve.EnvLv_len = pInput->MergeTuningPara.OECurve.EnvLv_len; pStore->MergeTuningPara.OECurve.Smooth_len = pInput->MergeTuningPara.OECurve.EnvLv_len; pStore->MergeTuningPara.OECurve.Offset_len = pInput->MergeTuningPara.OECurve.EnvLv_len; memcpy(pStore->MergeTuningPara.OECurve.EnvLv, pInput->MergeTuningPara.OECurve.EnvLv, sizeof(float)*pInput->MergeTuningPara.OECurve.EnvLv_len); memcpy(pStore->MergeTuningPara.OECurve.Smooth, pInput->MergeTuningPara.OECurve.Smooth, sizeof(float)*pInput->MergeTuningPara.OECurve.EnvLv_len); memcpy(pStore->MergeTuningPara.OECurve.Offset, pInput->MergeTuningPara.OECurve.Offset, sizeof(float)*pInput->MergeTuningPara.OECurve.EnvLv_len); //md curve int MDCurveLen[5]; MDCurveLen[0] = pInput->MergeTuningPara.MDCurve.MoveCoef_len; MDCurveLen[1] = pInput->MergeTuningPara.MDCurve.LM_smooth_len; MDCurveLen[2] = pInput->MergeTuningPara.MDCurve.LM_offset_len; MDCurveLen[3] = pInput->MergeTuningPara.MDCurve.MS_smooth_len; MDCurveLen[4] = pInput->MergeTuningPara.MDCurve.MS_offset_len; bool MDCurveLenEqu = IfMergeDataEqu(MDCurveLen, 5); if(!MDCurveLenEqu) { LOGE_AMERGE("%s: Input Merge MDCurve Data length is NOT EQUAL !!!\n", __FUNCTION__ ); return XCAM_RETURN_ERROR_FAILED; } if(pStore->MergeTuningPara.MDCurve.MoveCoef_len != pInput->MergeTuningPara.MDCurve.MoveCoef_len) { //free free(pStore->MergeTuningPara.MDCurve.MoveCoef); free(pStore->MergeTuningPara.MDCurve.MS_smooth); free(pStore->MergeTuningPara.MDCurve.MS_offset); free(pStore->MergeTuningPara.MDCurve.LM_smooth); free(pStore->MergeTuningPara.MDCurve.LM_offset); //malloc pStore->MergeTuningPara.MDCurve.MoveCoef = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.MDCurve.MoveCoef_len); pStore->MergeTuningPara.MDCurve.MS_smooth = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.MDCurve.MoveCoef_len); pStore->MergeTuningPara.MDCurve.MS_offset = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.MDCurve.MoveCoef_len); pStore->MergeTuningPara.MDCurve.LM_smooth = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.MDCurve.MoveCoef_len); pStore->MergeTuningPara.MDCurve.LM_offset = (float *) malloc(sizeof(float) * pInput->MergeTuningPara.MDCurve.MoveCoef_len); } //store len pStore->MergeTuningPara.MDCurve.MoveCoef_len = pInput->MergeTuningPara.MDCurve.MoveCoef_len; pStore->MergeTuningPara.MDCurve.MS_smooth_len = pInput->MergeTuningPara.MDCurve.MoveCoef_len; pStore->MergeTuningPara.MDCurve.MS_offset_len = pInput->MergeTuningPara.MDCurve.MoveCoef_len; pStore->MergeTuningPara.MDCurve.LM_smooth_len = pInput->MergeTuningPara.MDCurve.MoveCoef_len; pStore->MergeTuningPara.MDCurve.LM_offset_len = pInput->MergeTuningPara.MDCurve.MoveCoef_len; memcpy(pStore->MergeTuningPara.MDCurve.MoveCoef, pInput->MergeTuningPara.MDCurve.MoveCoef, sizeof(float)*pInput->MergeTuningPara.MDCurve.MoveCoef_len); memcpy(pStore->MergeTuningPara.MDCurve.MS_smooth, pInput->MergeTuningPara.MDCurve.MS_smooth, sizeof(float)*pInput->MergeTuningPara.MDCurve.MoveCoef_len); memcpy(pStore->MergeTuningPara.MDCurve.MS_offset, pInput->MergeTuningPara.MDCurve.MS_offset, sizeof(float)*pInput->MergeTuningPara.MDCurve.MoveCoef_len); memcpy(pStore->MergeTuningPara.MDCurve.LM_smooth, pInput->MergeTuningPara.MDCurve.LM_smooth, sizeof(float)*pInput->MergeTuningPara.MDCurve.MoveCoef_len); memcpy(pStore->MergeTuningPara.MDCurve.LM_offset, pInput->MergeTuningPara.MDCurve.LM_offset, sizeof(float)*pInput->MergeTuningPara.MDCurve.MoveCoef_len); pStore->MergeTuningPara.OECurve_damp = pInput->MergeTuningPara.OECurve_damp; pStore->MergeTuningPara.MDCurveLM_damp = pInput->MergeTuningPara.MDCurveLM_damp; pStore->MergeTuningPara.MDCurveMS_damp = pInput->MergeTuningPara.MDCurveMS_damp; return ret; } XCamReturn rk_aiq_uapi_amerge_SetAttrib ( RkAiqAlgoContext* ctx, amerge_attrib_t attr, bool need_sync ) { XCamReturn ret = XCAM_RETURN_NO_ERROR; if(ctx == NULL) { LOGE_AMERGE("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return XCAM_RETURN_ERROR_PARAM; } AmergeContext_t* pAmergeCtx = (AmergeContext_t*)(ctx->AmergeInstConfig.hAmerge); //Todo pAmergeCtx->mergeAttr.opMode = attr.opMode; if(attr.opMode == MERGE_OPMODE_TOOL) ret = rk_aiq_uapi_amerge_SetTool(&pAmergeCtx->mergeAttr.stTool, &attr.stTool); if (attr.opMode == MERGE_OPMODE_AUTO) { pAmergeCtx->mergeAttr.stAuto.bUpdateMge = attr.stAuto.bUpdateMge; memcpy(&pAmergeCtx->mergeAttr.stAuto.stMgeAuto, &attr.stAuto.stMgeAuto, sizeof(amgeAttr_t)); } else pAmergeCtx->mergeAttr.stAuto.bUpdateMge = false; if (attr.opMode == MERGE_OPMODE_MANU) { pAmergeCtx->mergeAttr.stManual.bUpdateMge = attr.stManual.bUpdateMge; memcpy(&pAmergeCtx->mergeAttr.stManual.stMgeManual, &attr.stManual.stMgeManual, sizeof(mmgeAttr_t)); } else pAmergeCtx->mergeAttr.stManual.bUpdateMge = false; return ret; } XCamReturn rk_aiq_uapi_amerge_GetAttrib ( RkAiqAlgoContext* ctx, amerge_attrib_t* attr ) { XCamReturn ret = XCAM_RETURN_NO_ERROR; if(ctx == NULL || attr == NULL) { LOGE_AMERGE("%s(%d): null pointer\n", __FUNCTION__, __LINE__); return XCAM_RETURN_ERROR_PARAM; } AmergeContext_t* pAmergeCtx = (AmergeContext_t*)ctx->AmergeInstConfig.hAmerge; attr->opMode = pAmergeCtx->mergeAttr.opMode; memcpy(&attr->stAuto.stMgeAuto, &pAmergeCtx->mergeAttr.stAuto.stMgeAuto, sizeof(amgeAttr_t)); memcpy(&attr->stManual.stMgeManual, &pAmergeCtx->mergeAttr.stManual.stMgeManual, sizeof(mmgeAttr_t)); ret = rk_aiq_uapi_amerge_SetTool(&attr->stTool, &pAmergeCtx->mergeAttr.stTool); memcpy(&attr->CtlInfo, &pAmergeCtx->mergeAttr.CtlInfo, sizeof(MergeCurrCtlData_t)); memcpy(&attr->RegInfo, &pAmergeCtx->mergeAttr.RegInfo, sizeof(MergeCurrRegData_t)); return ret; }