android中Camera获取系统支持的情景模式

     在我们调相机时, 经常有测试提出相机的模型情景模式不支持。下面我们来分析下怎样看android系统相机的情景模式。我们以MTK的实现为例。


    在底层mediatek/proprietary/custom/mt8127/hal/sendepfeature/ov2680_raw/config.ftbl.ov2680_mipi_raw.h 这个文件定义的我们的相机支持哪些情景模式

#if 1
    //  Scene Mode
    FTABLE_CONFIG_AS_TYPE_OF_DEFAULT_VALUES(
        KEY_AS_(MtkCameraParameters::KEY_SCENE_MODE), 
        SCENE_AS_DEFAULT_SCENE(
            ITEM_AS_DEFAULT_(MtkCameraParameters::SCENE_MODE_AUTO), 
            ITEM_AS_VALUES_(
                MtkCameraParameters::SCENE_MODE_AUTO, 
//                MtkCameraParameters::SCENE_MODE_NORMAL, 
                MtkCameraParameters::SCENE_MODE_PORTRAIT,       
                MtkCameraParameters::SCENE_MODE_LANDSCAPE, 
                MtkCameraParameters::SCENE_MODE_NIGHT,          
                MtkCameraParameters::SCENE_MODE_NIGHT_PORTRAIT, 
                MtkCameraParameters::SCENE_MODE_THEATRE,        
                MtkCameraParameters::SCENE_MODE_BEACH, 
                MtkCameraParameters::SCENE_MODE_SNOW,           
                MtkCameraParameters::SCENE_MODE_SUNSET, 
                MtkCameraParameters::SCENE_MODE_STEADYPHOTO,    
//                MtkCameraParameters::SCENE_MODE_FIREWORKS, 
                MtkCameraParameters::SCENE_MODE_SPORTS,         
                MtkCameraParameters::SCENE_MODE_PARTY, 
                MtkCameraParameters::SCENE_MODE_CANDLELIGHT, 
//                MtkCameraParameters::SCENE_MODE_HDR, 
            )
        ), 
    )
#endif

  这个文件定义的我们的相机支持的哪些情景模式,SCENE_MODE_HDR,, HDR模式, SCENE_MODE_NIGHT夜景模式........


   有了这个后, android framework会根据这些做相应的处理, 然后传入到上层, 上层java就可以判断我们是否能支持该模式,

  在hal层, CameraHardwareInterface.h中

         

status_t initialize(hw_module_t *module)
{
   ......
   camera_module_t *cameraModule = reinterpret_cast<camera_module_t *>(module);
   camera_info info;
   status_t res = cameraModule->get_camera_info(atoi(mName.string()), &info);
   ......
}

  这里进行初始化Camera的相关信息, 我们所需要的情景模式保存在结构体 camera_info中。

  在CameraService.cpp中getCameraCharacteristics()方法中获取CameraInfo信息

status_t CameraService::getCameraCharacteristics(int cameraId,
                                                CameraMetadata* cameraInfo) {
    if (!cameraInfo) {
        ALOGE("%s: cameraInfo is NULL", __FUNCTION__);
        return BAD_VALUE;
    }

    if (!mModule) {
        ALOGE("%s: camera hardware module doesn't exist", __FUNCTION__);
        return -ENODEV;
    }

    if (cameraId < 0 || cameraId >= mNumberOfCameras) {
        ALOGE("%s: Invalid camera id: %d", __FUNCTION__, cameraId);
        return BAD_VALUE;
    }

    int facing;
    status_t ret = OK;
    if (mModule->common.module_api_version < CAMERA_MODULE_API_VERSION_2_0 ||
            getDeviceVersion(cameraId, &facing) <= CAMERA_DEVICE_API_VERSION_2_1 ) {
        /**
         * Backwards compatibility mode for old HALs:
         * - Convert CameraInfo into static CameraMetadata properties.
         * - Retrieve cached CameraParameters for this camera.  If none exist,
         *   attempt to open CameraClient and retrieve the CameraParameters.
         * - Convert cached CameraParameters into static CameraMetadata
         *   properties.
         */
        ALOGI("%s: Switching to HAL1 shim implementation...", __FUNCTION__);

        if ((ret = generateShimMetadata(cameraId, cameraInfo)) != OK) {
            return ret;
        }

    } else {
        /**
         * Normal HAL 2.1+ codepath.
         */
        struct camera_info info;
        ret = filterGetInfoErrorCode(mModule->get_camera_info(cameraId, &info));
        *cameraInfo = info.static_camera_characteristics;
    }

    return ret;
}

   

  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。