项目场景:

Application调用Camera对书本、试卷拍照或者预览获取对应照片,然后进行识别


问题描述:

Application调用Camera对书本、试卷拍照或者预览得到的照片识别率比较低


原因分析:

照片的锐化度不够,从而导致识别率比较低


解决方案:

增加照片的锐化度。如果直接增加照片的锐化度,会导致其他场景锐化度也增加,另外同时也会增加其他场景的noise。考虑到这些,所以让Application通过CameraMetadata控制自己所需的效果参数生效。


方案实现:

  1. Camera Tuning Param参数确认
    其中Camera Tuning Param由Camera Tuning 工程师确认如下:
    vendor/mediatek/proprietary/custom/mt6771/hal/imgsensor/ver1/s5k3l6_mipi_raw/Scene_Capture/s5k3l6mipiraw_Scene_Capture_ISP_YUV.cpp
    vendor/mediatek/proprietary/custom/mt6771/hal/imgsensor/ver1/s5k3l6_mipi_raw/Scene_Preview/s5k3l6mipiraw_Scene_Preview_ISP_YUV.cpp

    const ISP_NVRAM_UDM_T s5k3l6mipiraw_UDM_0080 = {.intp_crs  ={.bits={.UDM_CDG_SL=4, .UDM_CDG_OFST=20, .UDM_CDG_RAT=16, .UDM_CD_KNL=0, .rsv_18=0, .UDM_BYP=0, .UDM_MN_MODE=0}},
    .intp_nat  ={.bits={.UDM_HL_OFST=63, .UDM_L0_SL=6, .UDM_L0_OFST=0, .UDM_CD_SLL=3, .UDM_CD_SLC=10, .rsv_30=0}},
    .intp_aug  ={.bits={.UDM_DN_OFST=0, .UDM_L2_SL=6, .UDM_L2_OFST=0, .UDM_L1_SL=6, .UDM_L1_OFST=0}},
    .luma_lut1 ={.bits={.UDM_LM_Y2=256, .UDM_LM_Y1=384, .UDM_LM_Y0=511, .rsv_27=0}},
    .luma_lut2 ={.bits={.UDM_LM_Y5=32, .UDM_LM_Y4=64, .UDM_LM_Y3=128, .rsv_27=0}},
    .sl_ctl    ={.bits={.UDM_SL_EN=0, .UDM_SL_HR=16, .UDM_SL_Y2=255, .UDM_SL_Y1=255, .rsv_22=0}},
    .hftd_ctl  ={.bits={.UDM_CORE_TH1=0, .UDM_HD_GN2=16, .UDM_HD_GN1=16, .UDM_HT_GN2=16, .UDM_HT_GN1=16, .rsv_28=0}},
    .nr_str    ={.bits={.UDM_N2_STR=0, .UDM_N1_STR=0, .UDM_N0_STR=0, .UDM_XTK_SL=5, .UDM_XTK_OFST=32, .UDM_XTK_RAT=16}},
    .nr_act    ={.bits={.UDM_NGR=0, .UDM_NSL=5, .UDM_N2_OFST=0, .UDM_N1_OFST=0, .UDM_N0_OFST=0}},
    .hf_str    ={.bits={.UDM_CORE_TH2=0, .UDM_HI_RAT=0, .UDM_H3_GN=0, .UDM_H2_GN=0, .UDM_H1_GN=0, .UDM_HA_STR=0}},
    .hf_act1   ={.bits={.UDM_H2_UPB=220, .UDM_H2_LWB=52, .UDM_H1_UPB=80, .UDM_H1_LWB=20}},
    .hf_act2   ={.bits={.UDM_HSLL=5, .UDM_HSLR=5, .UDM_H3_UPB=255, .UDM_H3_LWB=52, .rsv_24=0}},
    .clip      ={.bits={.UDM_CLIP_TH=100, .UDM_UN_TH=32, .UDM_OV_TH=223, .rsv_24=0}},
    .dsb       ={.bits={.UDM_SC_RAT=0, .UDM_SL_RAT=0, .UDM_FL_MODE=0, .rsv_11=0}},
    .p1_act    ={.bits={.UDM_P1_UPB=85, .UDM_P1_LWB=85, .rsv_16=0}},
    .lr_rat    ={.bits={.UDM_LR_RAT=15, .rsv_4=0}},
    .hftd_ctl2 ={.bits={.UDM_HD_GN3=16, .UDM_HFRB_GN=16, .rsv_12=0}},
    .est_ctl   ={.bits={.UDM_P2_CLIP=0, .UDM_P1_BLD=0, .rsv_6=0}},
    .int_ctl   ={.bits={.UDM_INT_LTH=3, .UDM_INT_CDTH=5, .rsv_8=0}},
    .ee        ={.bits={.UDM_HPOS_GN=16, .UDM_HNEG_GN=16, .rsv_10=0}}};
    

    修改hf_str相关参数即可满足条件。

  2. 代码中进行动态控制参数是否生效
    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/isp_tuning/paramctrl/paramctrl_per_frame.cpp

    MBOOL
    Paramctrl::
    prepareHw_PerFrame_UDM(const RAWIspCamInfo& rIspCamInfo)
    {char value[PROPERTY_VALUE_MAX] = {'\0'};property_get("vendor.isp.udm.disable", value, "0"); // 0: enable, 1: disableMBOOL bDisable = atoi(value);MBOOL fgRPGEnable = rIspCamInfo.fgRPGEnable;ISP_MGR_UDM_T& rUdm = ISP_MGR_UDM_T::getInstance(m_eSensorDev);//add begin by zhangjc for udm controlchar noahUdm[PROPERTY_VALUE_MAX];property_get("vendor.isp.Udm.disable", noahUdm, "0"); // 0: disable, 1: enableMBOOL udmDisable = atoi(noahUdm);char noahUdmDebug[PROPERTY_VALUE_MAX];property_get("vendor.isp.Udm.debug.disable", noahUdmDebug, "0"); // 0: disable, 1: enableMBOOL udmDisableDebug = atoi(noahUdm);//add end by zhangjc for udm controlCAM_LOGD_IF(m_bDebugEnable, "[%s] fgRPGEnable(%d)", __FUNCTION__, fgRPGEnable);// Get default NVRAM parametergetISPIndex(eIDX_LowerIso_LowerZoom , rIspCamInfo, EModule_UDM, m_ISP_INT.sUdm.u2LowerIso_LowerZoom, m_bMappingQueryFlag);ISP_NVRAM_UDM_T udm = m_rIspParam.ISPRegs.UDM[m_ISP_INT.sUdm.u2LowerIso_LowerZoom];
    if(rIspCamInfo.i4P2InImgFmt == 0){//Interpolation ISP moduleif (isIspInterpolation(rIspCamInfo)){getISPIndex(eIDX_UpperIso_UpperZoom , rIspCamInfo, EModule_UDM, m_ISP_INT.sUdm.u2UpperIso_UpperZoom, m_bMappingQueryFlag);getISPIndex(eIDX_LowerIso_UpperZoom , rIspCamInfo, EModule_UDM, m_ISP_INT.sUdm.u2LowerIso_UpperZoom, m_bMappingQueryFlag);getISPIndex(eIDX_UpperIso_LowerZoom , rIspCamInfo, EModule_UDM, m_ISP_INT.sUdm.u2UpperIso_LowerZoom, m_bMappingQueryFlag);m_ParamIdx_P2.UDM = m_ISP_INT.sUdm.u2LowerIso_LowerZoom;CAM_LOGD_IF(m_bDebugEnable,"%s(): rIspCamInfo.rAEInfo.u4RealISOValue = %d, u2UpperIso_UpperZoom = %d, u2LowerIso_UpperZoom = %d, u2UpperIso_LowerZoom = %d, u2LowerIso_LowerZoom = %d\n",__FUNCTION__, rIspCamInfo.rAEInfo.u4RealISOValue,m_ISP_INT.sUdm.u2UpperIso_UpperZoom,m_ISP_INT.sUdm.u2LowerIso_UpperZoom,m_ISP_INT.sUdm.u2UpperIso_LowerZoom,m_ISP_INT.sUdm.u2LowerIso_LowerZoom);ISP_NVRAM_UDM_INT_T rInt_Param;rInt_Param.u4RealISO           = rIspCamInfo.rAEInfo.u4RealISOValue;rInt_Param.u4UpperISO          = m_rIspParam.ISPRegs.Iso_Env.IDX_Partition[rIspCamInfo.eIdx_ISO_U]; // Upper ISOrInt_Param.u4LowerISO          = m_rIspParam.ISPRegs.Iso_Env.IDX_Partition[rIspCamInfo.eIdx_ISO_L]; // Lower ISOrInt_Param.i4ZoomRatio_x100    = rIspCamInfo.i4ZoomRatio_x100;rInt_Param.u4UpperZoom         = m_rIspParam.ISPRegs.Zoom_Env.IDX_Partition[rIspCamInfo.eIdx_Zoom_U];rInt_Param.u4LowerZoom         = m_rIspParam.ISPRegs.Zoom_Env.IDX_Partition[rIspCamInfo.eIdx_Zoom_L];rInt_Param.rUpperIso_UpperZoom = m_rIspParam.ISPRegs.UDM[m_ISP_INT.sUdm.u2UpperIso_UpperZoom];rInt_Param.rLowerIso_UpperZoom = m_rIspParam.ISPRegs.UDM[m_ISP_INT.sUdm.u2LowerIso_UpperZoom];rInt_Param.rUpperIso_LowerZoom = m_rIspParam.ISPRegs.UDM[m_ISP_INT.sUdm.u2UpperIso_LowerZoom];rInt_Param.rLowerIso_LowerZoom = m_rIspParam.ISPRegs.UDM[m_ISP_INT.sUdm.u2LowerIso_LowerZoom];AAA_TRACE_ALG(SmoothUDM);SmoothUDM(rInt_Param, udm);AAA_TRACE_END_ALG;}else{getISPIndex(eIDX_LowerIso_LowerZoom , rIspCamInfo, EModule_UDM, m_ParamIdx_P2.UDM, m_bMappingQueryFlag);udm = m_rIspParam.ISPRegs.UDM[m_ParamIdx_P2.UDM];}// Invoke callback for customers to modify.if  ( isDynamicTuning() ){   //  Dynamic Tuning: Enablem_pIspTuningCustom->refine_UDM(rIspCamInfo, m_IspNvramMgr, udm);}// FG mode protectionif (fgRPGEnable){udm.dsb.bits.UDM_FL_MODE = 1;udm.dsb.bits.UDM_SL_RAT = 16;udm.dsb.bits.UDM_SC_RAT = 16;}else {udm.dsb.bits.UDM_FL_MODE = 0;}if ((!rUdm.isCCTEnable()) || (bDisable) ||(!(m_pFeatureCtrl[rIspCamInfo.rMapping_Info.eIspProfile] & M_UDM_EN))) // bypass UDM    //(m_u4RawFmtType == SENSOR_RAW_MONO)?{udm.intp_crs.bits.UDM_BYP = 1;}//add begin by zhangjc for fgUdmEnableif(udmDisable || rIspCamInfo.fgUdmEnable){CAM_LOGD_IF(udmDisableDebug, "[%s] udmDisable(%d) &&& fgUdmEnable(%d)", __FUNCTION__, udmDisable, rIspCamInfo.fgUdmEnable);udm.hf_str.bits.UDM_HI_RAT = 14;udm.hf_str.bits.UDM_H3_GN = 31;udm.hf_str.bits.UDM_H2_GN = 31;udm.hf_str.bits.UDM_H1_GN = 31;udm.hf_str.bits.UDM_HA_STR = 14;}else{CAM_LOGD_IF(udmDisableDebug, "[%s] else else udmDisable(%d) &&& fgUdmEnable(%d)", __FUNCTION__, udmDisable, rIspCamInfo.fgUdmEnable);}//add end by zhangjc for fgUdmEnable// Load it to ISP manager buffer.rUdm.put(udm);
    }return  MTRUE;
    }
    

    在这里我们可以通过SystemProperties来debug参数是否生效,不难发现最终实现后的代码参数由fgUdmEnable来控制是否生效,fgUdmEnable将在第四步中进行说明。

  3. 新增CameraMetadata:
    其中涉及文件如下且修改如下:
    vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/utils/metadata/client/mtk_metadata_tag.h

        MTK_3A_FEATURE_AE_ROI               = MTK_3A_FEATURE_START,MTK_3A_FEATURE_AF_ROI,MTK_3A_FEATURE_AWB_ROI,MTK_3A_FEATURE_AE_REQUEST_ISO_SPEED,MTK_3A_FEATURE_AE_AVAILABLE_METERING,MTK_3A_FEATURE_AE_REQUEST_METERING_MODE,MTK_3A_FEATURE_AE_AVERAGE_BRIGHTNESS,MTK_3A_FEATURE_AWB_AVAILABL_RANGE,MTK_3A_FEATURE_AWB_REQUEST_VALUE,MTK_3A_FEATURE_LENS_AVAILABLE_FOCAL_LENGTHS_35MM,//add begin by zhangjcMTK_CONTROL_ISP_UDM,//add end by zhangjcMTK_3A_FEATURE_END,
    

    在这里我们是将新增的MTK_CONTROL_ISP_UDM插入了MTK_3A_FEATURE,需要注意一下,这 个决定了后面Metadata的String。

    vendor/mediatek/proprietary/hardware/mtkcam/utils/metadata/vendortag/VendorTagTable.h

    static auto& _3AFeature_()
    {static const std::map<uint32_t, VendorTag_t>sInst = {_TAG_(MTK_3A_FEATURE_AE_ROI,"aeroi",    TYPE_INT32),_TAG_(MTK_3A_FEATURE_AF_ROI,"afroi",    TYPE_INT32),_TAG_(MTK_3A_FEATURE_AWB_ROI,"awbroi",   TYPE_INT32),_TAG_(MTK_3A_FEATURE_AE_REQUEST_ISO_SPEED,"aeIsoSpeed",   TYPE_INT32),_TAG_(MTK_3A_FEATURE_AE_AVAILABLE_METERING,"aeAvailableMetering",   TYPE_BYTE),_TAG_(MTK_3A_FEATURE_AE_REQUEST_METERING_MODE,"aeMeteringMode",   TYPE_BYTE),_TAG_(MTK_3A_FEATURE_AE_AVERAGE_BRIGHTNESS,"aeAverageBrightness",   TYPE_INT32),_TAG_(MTK_3A_FEATURE_AWB_AVAILABL_RANGE,"awbAvailableRange",   TYPE_INT32),_TAG_(MTK_3A_FEATURE_AWB_REQUEST_VALUE,"awbValue",   TYPE_INT32),//add begin by zhangjc_TAG_(MTK_CONTROL_ISP_UDM,"UdmValue", TYPE_INT32)//add end by zhangjc};//return sInst;
    }
    

    在这里我们只看到了我们新增的部分字符串为UdmValue,那么对应metadata的完整字符串是什么呢?这里去找到**3AFeature**即可,如下:

    _SECTION_( "com.mediatek.3afeature",MTK_3A_FEATURE_START,MTK_3A_FEATURE_END,_3AFeature_() ),
    

    这样我们就可以知道完整的字符串为"com.mediatek.3afeature.UdmValue"。
    vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/utils/metadata/client/mtk_metadata_tag_info.inl

    // add begin by zhangjc
    _IMP_TAG_INFO_( MTK_CONTROL_ISP_UDM,MINT32,     "UdmValue")
    // add end by zhangjc
    

    到这里添加完成后,metadata的整个流程并没有走完,还有下面一步,应用层才能真正的获取到对应的metadata.
    vendor/mediatek/proprietary/custom/mt6771/hal/imgsensor_metadata/s5k3l6_mipi_raw/config_static_metadata_request_commonType.h

     CONFIG_METADATA_BEGIN(MTK_REQUEST_AVAILABLE_REQUEST_KEYS)//new hiddenCONFIG_ENTRY_VALUE(MTK_COLOR_CORRECTION_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_COLOR_CORRECTION_TRANSFORM, MINT32)CONFIG_ENTRY_VALUE(MTK_COLOR_CORRECTION_GAINS, MINT32)CONFIG_ENTRY_VALUE(MTK_COLOR_CORRECTION_ABERRATION_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_ANTIBANDING_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_EXPOSURE_COMPENSATION, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_LOCK, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_REGIONS, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_TARGET_FPS_RANGE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_PRECAPTURE_TRIGGER, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_REGIONS, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_TRIGGER, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_LOCK, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_REGIONS, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_CAPTURE_INTENT, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_EFFECT_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_SCENE_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_CONTROL_VIDEO_STABILIZATION_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_DEMOSAIC_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_EDGE_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_EDGE_STRENGTH, MINT32)CONFIG_ENTRY_VALUE(MTK_FLASH_FIRING_POWER, MINT32)CONFIG_ENTRY_VALUE(MTK_FLASH_FIRING_TIME, MINT32)CONFIG_ENTRY_VALUE(MTK_FLASH_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_HOT_PIXEL_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_JPEG_GPS_COORDINATES, MINT32)CONFIG_ENTRY_VALUE(MTK_JPEG_GPS_PROCESSING_METHOD, MINT32)CONFIG_ENTRY_VALUE(MTK_JPEG_GPS_TIMESTAMP, MINT32)CONFIG_ENTRY_VALUE(MTK_JPEG_ORIENTATION, MINT32)CONFIG_ENTRY_VALUE(MTK_JPEG_QUALITY, MINT32)CONFIG_ENTRY_VALUE(MTK_JPEG_THUMBNAIL_QUALITY, MINT32)CONFIG_ENTRY_VALUE(MTK_JPEG_THUMBNAIL_SIZE, MINT32)CONFIG_ENTRY_VALUE(MTK_LENS_APERTURE, MINT32)CONFIG_ENTRY_VALUE(MTK_LENS_FILTER_DENSITY, MINT32)CONFIG_ENTRY_VALUE(MTK_LENS_FOCAL_LENGTH, MINT32)CONFIG_ENTRY_VALUE(MTK_LENS_FOCUS_DISTANCE, MINT32)CONFIG_ENTRY_VALUE(MTK_LENS_OPTICAL_STABILIZATION_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_NOISE_REDUCTION_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_NOISE_REDUCTION_STRENGTH, MINT32)CONFIG_ENTRY_VALUE(MTK_REQUEST_ID, MINT32)CONFIG_ENTRY_VALUE(MTK_REQUEST_METADATA_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_SCALER_CROP_REGION, MINT32)CONFIG_ENTRY_VALUE(MTK_SENSOR_EXPOSURE_TIME, MINT32)CONFIG_ENTRY_VALUE(MTK_SENSOR_FRAME_DURATION, MINT32)CONFIG_ENTRY_VALUE(MTK_SENSOR_SENSITIVITY, MINT32)CONFIG_ENTRY_VALUE(MTK_SENSOR_TEST_PATTERN_DATA, MINT32)CONFIG_ENTRY_VALUE(MTK_SENSOR_TEST_PATTERN_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_SHADING_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_SHADING_STRENGTH, MINT32)CONFIG_ENTRY_VALUE(MTK_STATISTICS_FACE_DETECT_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_STATISTICS_HISTOGRAM_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_STATISTICS_SHARPNESS_MAP_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_STATISTICS_HOT_PIXEL_MAP_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_STATISTICS_LENS_SHADING_MAP_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_TONEMAP_CURVE_BLUE, MINT32)CONFIG_ENTRY_VALUE(MTK_TONEMAP_CURVE_GREEN, MINT32)CONFIG_ENTRY_VALUE(MTK_TONEMAP_CURVE_RED, MINT32)CONFIG_ENTRY_VALUE(MTK_TONEMAP_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_LED_TRANSMIT, MINT32)CONFIG_ENTRY_VALUE(MTK_BLACK_LEVEL_LOCK, MINT32)// vendor tag// face featureCONFIG_ENTRY_VALUE(MTK_FACE_FEATURE_GESTURE_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_FACE_FEATURE_SMILE_DETECT_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_FACE_FEATURE_ASD_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_FACE_FEATURE_FORCE_FACE_3A, MINT32)// MFNR featureCONFIG_ENTRY_VALUE(MTK_MFNR_FEATURE_MFB_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_MFNR_FEATURE_AIS_MODE, MINT32)// 3DNRCONFIG_ENTRY_VALUE(MTK_NR_FEATURE_3DNR_MODE, MINT32)//CSHOTCONFIG_ENTRY_VALUE(MTK_CSHOT_FEATURE_CAPTURE, MINT32)//p2done callbackCONFIG_ENTRY_VALUE(MTK_CONTROL_CAPTURE_EARLY_NOTIFICATION_TRIGGER, MINT32)//postviewCONFIG_ENTRY_VALUE(MTK_CONTROL_CAPTURE_POSTVIEW_SIZE, MINT32)//bgservice prereleaseCONFIG_ENTRY_VALUE(MTK_BGSERVICE_FEATURE_PRERELEASE, MINT32)CONFIG_ENTRY_VALUE(MTK_BGSERVICE_FEATURE_IMAGEREADERID, MINT32)// 3A FeatureCONFIG_ENTRY_VALUE(MTK_3A_FEATURE_AE_REQUEST_ISO_SPEED, MINT32)CONFIG_ENTRY_VALUE(MTK_3A_FEATURE_AE_REQUEST_METERING_MODE, MINT32)CONFIG_ENTRY_VALUE(MTK_3A_FEATURE_AWB_REQUEST_VALUE, MINT32)//add begin by zhangjcCONFIG_ENTRY_VALUE(MTK_CONTROL_ISP_UDM, MINT32)//add end by zhangjcCONFIG_METADATA_END()
    
  4. hal3实现metadata控制isp
    涉及文件及流程如下:
    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/common/hal3a/v1.0/Hal3AAdapter3.cpp

            ...case MTK_STATISTICS_LENS_SHADING_MAP_MODE:{MUINT8 u1ShadingMapMode = entry.itemAt(0, Type2Type<MUINT8>());MY_LOGD_IF(mParams.u1ShadingMapMode != u1ShadingMapMode, "[%s] MTK_STATISTICS_LENS_SHADING_MAP_MODE(%d -> %d)", __FUNCTION__, mParams.u1ShadingMapMode, u1ShadingMapMode);mParams.u1ShadingMapMode = u1ShadingMapMode;}break;case MTK_FACE_FEATURE_FORCE_FACE_3A:{mParams.i4ForceFace3A = entry.itemAt(0, Type2Type<MINT32>());MY_LOGD_IF(1, "[%s] MTK_FACE_FEATURE_FORCE_FACE_3A(%d)", __FUNCTION__, mParams.i4ForceFace3A);}break;// add UDM by noah_zhangjccase MTK_CONTROL_ISP_UDM:{mParams.isUdmEnable = entry.itemAt(0, Type2Type<MINT32>());MY_LOGD_IF(1, "[%s] MTK_CONTROL_ISP_UDM(%d)", __FUNCTION__, mParams.isUdmEnable);}break;...
    

    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/wrapper/Hal3ARawImp.cpp

    MBOOL
    Hal3ARawImp::
    setParams(Param_T const &rNewParam, MBOOL bUpdateScenario __unused)
    {   ...F(IspTuningMgr::getInstance().setIspProfile, eIspProfile);//add begin by zhangjc for udmMBOOL noah3ARawUdm = ::property_get_int32("vendor.hal3.debug.udm.3aRaw", 0);if(rNewParam.isUdmEnable == 1 || noah3ARawUdm){CAM_LOGD_IF(m_3ALogEnable,"[%s] set setUdmEnale true !!! ", __FUNCTION__);IspTuningMgr::getInstance().setUdmEnale(m_i4SensorDev, MTRUE);}else{CAM_LOGD_IF(m_3ALogEnable,"[%s] set setUdmEnale false !!! ", __FUNCTION__);IspTuningMgr::getInstance().setUdmEnale(m_i4SensorDev, MFALSE);}//add end by zhangjc for udm...return MTRUE;
    }
    

    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/isp_tuning/isp_tuning_mgr.cpp

       //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //add setUdmEnale begin by zhangjc
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    MBOOL IspTuningMgr::setUdmEnale(MINT32 const i4SensorDev, MBOOL const UdmEnable){CAM_LOGD_IF(m_bDebugEnable,"%s(setUdmEnale:%d)\n", __FUNCTION__, UdmEnable);if (i4SensorDev & ESensorDev_Main) {if (m_pParamctrl_Main) {m_pParamctrl_Main->setUdmEnale(UdmEnable);}else {CAM_LOGE("m_pParamctrl_Main is NULL");return MFALSE;}}else if (i4SensorDev & ESensorDev_Sub) {if (m_pParamctrl_Sub) {m_pParamctrl_Sub->setUdmEnale(UdmEnable);}else {CAM_LOGE("m_pParamctrl_Sub is NULL");return MFALSE;}}else if (i4SensorDev & ESensorDev_MainSecond) {if (m_pParamctrl_Main2) {m_pParamctrl_Main2->setUdmEnale(UdmEnable);}else {CAM_LOGE("m_pParamctrl_Main2 is NULL");return MFALSE;}}else if (i4SensorDev & ESensorDev_SubSecond) {if (m_pParamctrl_Sub2) {m_pParamctrl_Sub2->setUdmEnale(UdmEnable);}else {CAM_LOGE("m_pParamctrl_Sub2 is NULL");return MFALSE;}}else if (i4SensorDev & ESensorDev_MainThird) {if (m_pParamctrl_Main3) {m_pParamctrl_Main3->setUdmEnale(UdmEnable);}else {CAM_LOGE("m_pParamctrl_Main3 is NULL");return MFALSE;}}else {CAM_LOGE("Err IspTuningMgr::setUdmEnale()\n");return MFALSE;}return MTRUE;
    }
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //add setUdmEnale end by zhangjc
    //
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    MBOOL IspTuningMgr::setNoiseReductionMode(MINT32 const i4SensorDev, MINT32 i4NRMode)
    ...
    

    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/isp_tuning/paramctrl/paramctrl_attributes.cpp

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //
    //add setUdmEnale begin by zhangjc
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    MERROR_ENUM
    Paramctrl::
    setUdmEnale(MBOOL UdmEnable)
    {CAM_LOGD_IF(m_bDebugEnable, "%s(setUdmEnale : %d)\n", __FUNCTION__, UdmEnable);m_rIspCamInfo.fgUdmEnable = UdmEnable;return MERR_OK;
    }
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //add setUdmEnale end by zhangjc
    //
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    MBOOL
    Paramctrl::
    getIspGamma(NS3Av3::S3ACtrl_GetIspGamma* pParams) const
    ...
    

    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/isp_tuning/paramctrl/paramctrl_per_frame.cpp

    paramctrl_per_frame.cpp的修改在第2步已经给出,就不重复了。于此整体流程是通了,但是这些修改并不能编译过,一些变量及方法需要定义,涉及文件及修改如下:
    vendor/mediatek/proprietary/hardware/mtkcam/aaa/include/private/aaa_hal_private.h

    ...
    MBOOL   bIsDummyFrame;
    MINT32  i4FlashCalEn;    // flash calibration enable
    MINT32  isUdmEnable;    //add by zhangjc
    Param_T(): i4MagicNum(0), i4MagicNumCur(0), u4HalFlag(0)..., i4FlashCalEn(0)//add isUdmEnable by zhangjc, isUdmEnable(0)...
    

    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/isp_tuning/isp_tuning_mgr.h

    /*** @brief set Udm mode* @param [in] UdmEnable * @add by zhangjc*/
    MBOOL setUdmEnale(MINT32 const i4SensorDev, MBOOL const UdmEnable);
    /*** @brief set noise reduction mode* @param [in] i4NRMode noise reduction mode*/
    MBOOL setNoiseReductionMode(MINT32 const i4SensorDev, MINT32 i4NRMode);
    ...
    

    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/isp_tuning/paramctrl/inc/paramctrl.h

    //add setUdmEnale begin by zhangjc
    virtual MERROR_ENUM setUdmEnale(MBOOL UdmEnable);
    //add setUdmEnale end by zhangjc
    virtual MERROR_ENUM setNoiseReductionMode(MINT32 i4NRMode);
    ...
    

    vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_50/isp_tuning/paramctrl/inc/paramctrl_if.h

    //add setUdmEnale begin by zhangjc
    virtual MERROR_ENUM setUdmEnale(MBOOL UdmEnable) = 0;
    //add setUdmEnale end by zhangjc
    virtual MERROR_ENUM setNoiseReductionMode(MINT32 i4NRMode) = 0;
    ...
    

    vendor/mediatek/proprietary/custom/mt6771/hal/inc/isp_tuning/ver1/isp_tuning_cam_info.h

    struct RAWIspCamInfo : public IspCamInfo
    {public:...MBOOL                fgHDR;MBOOL                fgDbsEn;MBOOL                fgUdmEnable;    //add by zhangjcmtk_camera_metadata_enum_android_control_mode_t  eControlMode;
    public:
    RAWIspCamInfo()
    : IspCamInfo()//, eIdx_ISO(eIDX_ISO_0)...//add fgUdmEnable by zhangjc, fgUdmEnable(MFALSE), eControlMode(MTK_CONTROL_MODE_OFF)...
    

    到这里基本上就实现了由Application自行控制Camera该效果参数是否调用了。在第5不则是介绍应用如何调用metadata了。

  5. Application调用metadata并传递使能值

       private static final String CAMERA_REQUEST_UDM_KEY = "com.mediatek.3afeature.noahUdmValue";private static final int[] CAMERA_BOOKE_UDM_OFF = new int[]{0};private static final int[] CAMERA_BOOKE_UDM_ON = new int[]{1};private CaptureRequest.Key<int[]> mCameraUdmKey = null ;private void initCameraUdmKey(Activity activity) throws CameraAccessException {CameraManager manager = (CameraManager)     activity.getSystemService(Context.CAMERA_SERVICE);CameraCharacteristics characteristics = manager.getCameraCharacteristics("1");mCameraUdmKey =  getRequestKey(characteristics,NOAH_REQUEST_UDM_KEY);}public static CaptureRequest.Key<int[]> getRequestKey(CameraCharacteristics characteristics, String key) {if (characteristics == null) {LogHelperUtil.i(TAG, "[getRequestKey] characteristics is null");return null;}CaptureRequest.Key<int[]> keyP2NotificationRequest = null;List<CaptureRequest.Key<?>> requestKeyList =characteristics.getAvailableCaptureRequestKeys();if (requestKeyList == null) {LogHelperUtil.i(TAG, "[getRequestKey] No keys!");return null;}for (CaptureRequest.Key<?> requestKey : requestKeyList) {if (requestKey.getName().equals(key)) {keyP2NotificationRequest = (CaptureRequest.Key<int[]>)               requestKey;}}return  keyP2NotificationRequest;}private void SetCameraUdm(CaptureRequest.Builder builder,boolean bool){if(mCameraUdmKey != null){LogHelperUtil.i(TAG,"mCameraUdmKey exist ");if(bool){builder.set(mCameraUdmKey, CAMERA_BOOKE_UDM_ON);}else{builder.set(mCameraUdmKey, CAMERA_BOOKE_UDM_OFF);}}else{LogHelperUtil.i(TAG,"mCameraUdmKey not exist ");}}
    

    只需要在openCamera之前调用initCameraUdmKey获取对应的metadata Key,然后再预览之前调用SetCameraUdm将对应值设置下去即可,这样hal3 会走相应流程完成我们的功能。

MTKAndroidP平台实现应用单独控制Camera某些效果参数相关推荐

  1. 开发者说 | 地平线程序员奶爸带你玩转机器人开发平台 —— 第一期 手势控制

    在地平线工作了4年多了,原本是冲着地平线机器人,机器人这三个字来的地平线,结果很长一段时间地平线都没搞机器人,我倒是给孩子买了不少机器人. 比如这个, 手势操控机器人,东西不错,很便宜,但是得带个手套 ...

  2. Unity使用陀螺仪控制Camera

    App中使用陀螺仪控制Camera: using UnityEngine; using System.Collections; public class cameraRotation : MonoBe ...

  3. Nginx多站点虚拟主机实现单独启动停止php-fpm、单独控制权限设置

    Nginx多站点虚拟主机实现单独启动停止php-fpm.单独控制权限设置 来源:osyunwei.com 作者:qihang01 发表于:2012-08-19 21:26 点击: 说明: 站点1:bb ...

  4. vue统一或单独控制接口请求时间

    先说统一 这里将请求时间统一控制在12秒 var instance = axios.create({ timeout: 1000 * 12 }); instance.defaults.headers. ...

  5. 基于凌鸥平台的120° 方波控制 BLDC 无感 比较器反电动势过零点

    基于凌鸥平台的120° 方波控制 BLDC 无感 比较器反电动势过零点 :95800668808014970MCTianci

  6. 上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,

    上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通讯,, ...

  7. 上位机与PLC 通讯源码DEMO 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制

    上位机与PLC 通讯源码DEMO 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通 ...

  8. android 控制app声音,Android底层开发之APP音量单独控制

    Android底层开发之APP音量单独控制 目前Android的音乐播放软件都的音量控制都是随着系统的总Master音量变化的.想要实现和windows中一样,每个APP的媒体音量可以单独控制. 控制 ...

  9. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

最新文章

  1. 毕业十年后,我忍不住出了一份程序员的高考试卷
  2. 福特数据总监:汽车业的大数据框架如何构建?
  3. 环境变量设置及第三方模块安装
  4. 什么是Spring Integration?
  5. 【渝粤教育】国家开放大学2019年春季 4有机合成单元反应 参考试题
  6. 我们精心整理的2019最新全栈资料!首次公布
  7. UI自动化,你值得拥有
  8. 自动化刷EOS资金盘(类Fomo3D)游戏
  9. python弹出窗口的代码_Python+selenium(7)-弹出窗口的代码封装,PythonSelenium,七,弹窗...
  10. java异常以及处理
  11. 和计算机相关的英文名字女孩,简单好听寓意好的英文名字女孩
  12. i5 12400f参数 i512400f评测
  13. 【腾讯优测干货分享】微信小程序之自动化亲密接触
  14. Docker基础、进阶笔记,为k8s的学习预预热
  15. Python之条件竞争
  16. 2021 TWeb 腾讯前端技术大会精彩回顾(附PPT)
  17. c++小游戏合集(AI)
  18. P2P下载技术-BT协议与Magnet磁力链接
  19. 从escrow.com购买域名的经验
  20. 医院PACS系统源码,PACS源码,带3D重建PACS系统源码

热门文章

  1. 关于stm32f4xx的片上外设I2C模块用作主模式下BUSY位总是置1的解决方法
  2. SSL证书怎么购买?
  3. Arduino Uno 实验4——电位器
  4. linux进程时钟时间,Linux的时钟
  5. ellipse()用法
  6. 微信小程序:修改按钮BUTTON尺寸
  7. Java上路09-多线程
  8. QT开发调用FDTI ftd2xx.dll库
  9. 【持续更新】pip install报错解决汇总
  10. moment如何转换时间戳 毫秒换成为秒的时间戳