在我们调相机时, 经常有测试提出相机的模型情景模式不支持。下面我们来分析下怎样看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;
}