项目场景:
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: disable MBOOL 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 control char noahUdm[PROPERTY_VALUE_MAX]; property_get("vendor.isp.Udm.disable", noahUdm, "0"); // 0: disable, 1: enable MBOOL udmDisable = atoi(noahUdm); char noahUdmDebug[PROPERTY_VALUE_MAX]; property_get("vendor.isp.Udm.debug.disable", noahUdmDebug, "0"); // 0: disable, 1: enable MBOOL udmDisableDebug = atoi(noahUdm); //add end by zhangjc for udm control CAM_LOGD_IF(m_bDebugEnable, "[%s] fgRPGEnable(%d)", __FUNCTION__, fgRPGEnable); // Get default NVRAM parameter getISPIndex(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 module if (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 ISO rInt_Param.u4LowerISO = m_rIspParam.ISPRegs.Iso_Env.IDX_Partition[rIspCamInfo.eIdx_ISO_L]; // Lower ISO rInt_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: Enable m_pIspTuningCustom->refine_UDM(rIspCamInfo, m_IspNvramMgr, udm); } // FG mode protection if (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 fgUdmEnable if(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 zhangjc MTK_CONTROL_ISP_UDM, //add end by zhangjc MTK_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 hidden CONFIG_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 feature CONFIG_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 feature CONFIG_ENTRY_VALUE(MTK_MFNR_FEATURE_MFB_MODE, MINT32) CONFIG_ENTRY_VALUE(MTK_MFNR_FEATURE_AIS_MODE, MINT32) // 3DNR CONFIG_ENTRY_VALUE(MTK_NR_FEATURE_3DNR_MODE, MINT32) //CSHOT CONFIG_ENTRY_VALUE(MTK_CSHOT_FEATURE_CAPTURE, MINT32) //p2done callback CONFIG_ENTRY_VALUE(MTK_CONTROL_CAPTURE_EARLY_NOTIFICATION_TRIGGER, MINT32) //postview CONFIG_ENTRY_VALUE(MTK_CONTROL_CAPTURE_POSTVIEW_SIZE, MINT32) //bgservice prerelease CONFIG_ENTRY_VALUE(MTK_BGSERVICE_FEATURE_PRERELEASE, MINT32) CONFIG_ENTRY_VALUE(MTK_BGSERVICE_FEATURE_IMAGEREADERID, MINT32) // 3A Feature CONFIG_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 zhangjc CONFIG_ENTRY_VALUE(MTK_CONTROL_ISP_UDM, MINT32) //add end by zhangjc CONFIG_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_zhangjc case 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 udm MBOOL 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 zhangjc mtk_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 会走相应流程完成我们的功能。