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

项目场景:

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: 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将在第四步中进行说明。

  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 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()
    
  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_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了。

  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 会走相应流程完成我们的功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值