MTKAndroidP平台实现应用单独控制Camera某些效果参数
项目场景:
Application调用Camera对书本、试卷拍照或者预览获取对应照片,然后进行识别
问题描述:
Application调用Camera对书本、试卷拍照或者预览得到的照片识别率比较低
原因分析:
照片的锐化度不够,从而导致识别率比较低
解决方案:
增加照片的锐化度。如果直接增加照片的锐化度,会导致其他场景锐化度也增加,另外同时也会增加其他场景的noise。考虑到这些,所以让Application通过CameraMetadata控制自己所需的效果参数生效。
方案实现:
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相关参数即可满足条件。
代码中进行动态控制参数是否生效
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将在第四步中进行说明。
新增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()
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了。
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某些效果参数相关推荐
- 开发者说 | 地平线程序员奶爸带你玩转机器人开发平台 —— 第一期 手势控制
在地平线工作了4年多了,原本是冲着地平线机器人,机器人这三个字来的地平线,结果很长一段时间地平线都没搞机器人,我倒是给孩子买了不少机器人. 比如这个, 手势操控机器人,东西不错,很便宜,但是得带个手套 ...
- Unity使用陀螺仪控制Camera
App中使用陀螺仪控制Camera: using UnityEngine; using System.Collections; public class cameraRotation : MonoBe ...
- Nginx多站点虚拟主机实现单独启动停止php-fpm、单独控制权限设置
Nginx多站点虚拟主机实现单独启动停止php-fpm.单独控制权限设置 来源:osyunwei.com 作者:qihang01 发表于:2012-08-19 21:26 点击: 说明: 站点1:bb ...
- vue统一或单独控制接口请求时间
先说统一 这里将请求时间统一控制在12秒 var instance = axios.create({ timeout: 1000 * 12 }); instance.defaults.headers. ...
- 基于凌鸥平台的120° 方波控制 BLDC 无感 比较器反电动势过零点
基于凌鸥平台的120° 方波控制 BLDC 无感 比较器反电动势过零点 :95800668808014970MCTianci
- 上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,
上位机与PLC 通讯源码 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通讯,, ...
- 上位机与PLC 通讯源码DEMO 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制
上位机与PLC 通讯源码DEMO 上位机与三菱PLC,西门子PLC通讯 同时一起通讯,单独控制,三菱采用官方MX 通讯,支持三菱FX系列,A系列,Q系列,L系列,R系列,全系系列,各种串口和各种网口通 ...
- android 控制app声音,Android底层开发之APP音量单独控制
Android底层开发之APP音量单独控制 目前Android的音乐播放软件都的音量控制都是随着系统的总Master音量变化的.想要实现和windows中一样,每个APP的媒体音量可以单独控制. 控制 ...
- Unity 触屏手势控制Camera平移旋转缩放
Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...
最新文章
- 毕业十年后,我忍不住出了一份程序员的高考试卷
- 福特数据总监:汽车业的大数据框架如何构建?
- 环境变量设置及第三方模块安装
- 什么是Spring Integration?
- 【渝粤教育】国家开放大学2019年春季 4有机合成单元反应 参考试题
- 我们精心整理的2019最新全栈资料!首次公布
- UI自动化,你值得拥有
- 自动化刷EOS资金盘(类Fomo3D)游戏
- python弹出窗口的代码_Python+selenium(7)-弹出窗口的代码封装,PythonSelenium,七,弹窗...
- java异常以及处理
- 和计算机相关的英文名字女孩,简单好听寓意好的英文名字女孩
- i5 12400f参数 i512400f评测
- 【腾讯优测干货分享】微信小程序之自动化亲密接触
- Docker基础、进阶笔记,为k8s的学习预预热
- Python之条件竞争
- 2021 TWeb 腾讯前端技术大会精彩回顾(附PPT)
- c++小游戏合集(AI)
- P2P下载技术-BT协议与Magnet磁力链接
- 从escrow.com购买域名的经验
- 医院PACS系统源码,PACS源码,带3D重建PACS系统源码