標籤:
在我們調相機時, 經常有測試提出相機的模型情景模式不支援。下面我們來分析下怎樣看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;}
android中Camera擷取系統支援的情景模式