#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; 
 | 
} 
 |