blob: d1161f6414116d3c210484f08043ccde3526b852 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.cts.deviceinfo;
import android.content.Context;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.BlackLevelPattern;
import android.hardware.camera2.params.ColorSpaceTransform;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.hardware.camera2.params.MultiResolutionStreamConfigurationMap;
import android.hardware.camera2.params.MultiResolutionStreamInfo;
import android.media.CamcorderProfile;
import android.os.Build;
import android.util.Log;
import android.util.Rational;
import android.util.Size;
import android.util.SizeF;
import android.util.Range;
import com.android.compatibility.common.deviceinfo.DeviceInfo;
import com.android.compatibility.common.util.DeviceInfoStore;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
/**
* Camera information collector.
*/
public final class CameraDeviceInfo extends DeviceInfo {
private static final String TAG = "CameraDeviceInfo";
private final static class CameraCharacteristicsStorer {
private CameraManager mCameraManager;
private DeviceInfoStore mStore;
public CameraCharacteristicsStorer(CameraManager cameraManager, DeviceInfoStore store) {
if (cameraManager == null || store == null) {
throw new IllegalArgumentException("can not create an CameraMetadataGetter object"
+ " with null CameraManager or null DeviceInfoStore");
}
mCameraManager = cameraManager;
mStore = store;
}
public void storeCameraInfo(String cameraId) throws Exception {
try {
CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(cameraId);
mStore.startGroup(); // per camera chars
mStore.addResult("cameraId", cameraId);
storeCameraChars(chars);
mStore.endGroup(); // per camera chars
} catch (CameraAccessException e) {
Log.e(TAG,
"Unable to get camera camera static info, skip this camera, error: "
+ e.getMessage());
}
return;
}
public void storePhysicalCameraInfo(String cameraId, List<String> logicalCameras)
throws Exception {
try {
CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(cameraId);
mStore.startGroup(); // per camera chars
mStore.addResult("cameraId", cameraId);
mStore.addListResult("parentLogicalCameraIds", logicalCameras);
storeCameraChars(chars);
mStore.endGroup(); // per camera chars
} catch (CameraAccessException e) {
Log.e(TAG,
"Unable to get camera camera static info, skip this camera, error: "
+ e.getMessage());
}
return;
}
private void storeRational(
Rational rat, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.addResult("numerator", rat.getNumerator());
mStore.addResult("denominator", rat.getDenominator());
mStore.endGroup();
}
private void storeSize(
Size size, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.addResult("width", size.getWidth());
mStore.addResult("height", size.getHeight());
mStore.endGroup();
}
private void storeSizeF(
SizeF size, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.addResult("width", size.getWidth());
mStore.addResult("height", size.getHeight());
mStore.endGroup();
}
private void storeRect(
Rect rect, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.addResult("left", rect.left);
mStore.addResult("right", rect.right);
mStore.addResult("top", rect.top);
mStore.addResult("bottom", rect.bottom);
mStore.endGroup();
}
private void storeStreamConfigurationMap(
StreamConfigurationMap map, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
int fmts[] = map.getOutputFormats();
if (fmts != null) {
mStore.startArray("availableStreamConfigurations");
for (int fi = 0; fi < Array.getLength(fmts); fi++) {
Size sizes[] = map.getOutputSizes(fmts[fi]);
if (sizes != null) {
for (int si = 0; si < Array.getLength(sizes); si++) {
mStore.startGroup();
mStore.addResult("format", fmts[fi]);
mStore.addResult("width", sizes[si].getWidth());
mStore.addResult("height", sizes[si].getHeight());
mStore.addResult("input", false);
mStore.addResult("minFrameDuration",
map.getOutputMinFrameDuration(fmts[fi], sizes[si]));
mStore.endGroup();
}
}
}
mStore.endArray();
}
Size[] highSpeedVideoSizes = map.getHighSpeedVideoSizes();
if (highSpeedVideoSizes != null && highSpeedVideoSizes.length > 0) {
mStore.startArray("availableHighSpeedVideoConfigurations");
for (int i = 0; i < highSpeedVideoSizes.length; i++) {
Range<Integer>[] fpsRanges = map.getHighSpeedVideoFpsRangesFor(
highSpeedVideoSizes[i]);
if (fpsRanges != null && fpsRanges.length > 0) {
for (int j = 0; j < fpsRanges.length; j++) {
mStore.startGroup();
mStore.addResult("width", highSpeedVideoSizes[i].getWidth());
mStore.addResult("height", highSpeedVideoSizes[i].getHeight());
mStore.addResult("minFps", fpsRanges[j].getLower());
mStore.addResult("maxFps", fpsRanges[j].getUpper());
mStore.endGroup();
}
}
}
mStore.endArray();
}
int inputFmts[] = map.getInputFormats();
if (inputFmts != null && inputFmts.length > 0) {
mStore.startArray("availableInputConfigurations");
for (int i = 0 ; i < inputFmts.length; i++) {
Size[] inputSizes = map.getInputSizes(inputFmts[i]);
if (inputSizes != null && inputSizes.length > 0) {
for (int j = 0; j < inputSizes.length; j++) {
mStore.startGroup();
mStore.addResult("inputFormat", inputFmts[i]);
mStore.addResult("inputWidth", inputSizes[j].getWidth());
mStore.addResult("inputHeight", inputSizes[j].getHeight());
mStore.endGroup();
}
}
}
mStore.endArray();
mStore.startArray("availableInputOutputFormatsMap");
for (int i = 0 ; i < inputFmts.length; i++) {
int[] outputFmts = map.getValidOutputFormatsForInput(inputFmts[i]);
if (outputFmts != null && outputFmts.length > 0) {
for (int j = 0; j < outputFmts.length; j++) {
mStore.startGroup();
mStore.addResult("inputFormat", inputFmts[i]);
mStore.addResult("outputFormat", outputFmts[j]);
mStore.endGroup();
}
}
}
mStore.endArray();
}
mStore.endGroup();
}
private void storeRangeFloat(
Range<Float> range, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.addResult("lower", range.getLower());
mStore.addResult("upper", range.getUpper());
mStore.endGroup();
}
private void storeRangeInt(
Range<Integer> range, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.addResult("lower", range.getLower());
mStore.addResult("upper", range.getUpper());
mStore.endGroup();
}
private void storeRangeLong(
Range<Long> range, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.addResult("lower", range.getLower());
mStore.addResult("upper", range.getUpper());
mStore.endGroup();
}
private void storeColorSpaceTransform(
ColorSpaceTransform xform, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.startArray("elements");
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
storeRational((Rational) xform.getElement(col, row), null);
}
}
mStore.endArray();
mStore.endGroup();
}
private void storeBlackLevelPattern(
BlackLevelPattern pat, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
int patVals[] = new int[4];
pat.copyTo(patVals, 0);
mStore.addArrayResult("black_level_pattern", patVals);
mStore.endGroup();
}
private void storeMultiResStreamConfigurationMap(
MultiResolutionStreamConfigurationMap map, String protoName) throws Exception {
if (protoName == null) {
mStore.startGroup();
} else {
mStore.startGroup(protoName);
}
mStore.startArray("availableMultiResolutionConfigurations");
int[] fmts = map.getOutputFormats();
if (fmts != null) {
for (int fi = 0; fi < Array.getLength(fmts); fi++) {
Collection<MultiResolutionStreamInfo> streamInfo = map.getOutputInfo(fmts[fi]);
if (streamInfo != null) {
for (MultiResolutionStreamInfo oneStream : streamInfo) {
mStore.startGroup();
mStore.addResult("format", fmts[fi]);
mStore.addResult("width", oneStream.getWidth());
mStore.addResult("height", oneStream.getHeight());
mStore.addResult("cameraId", oneStream.getPhysicalCameraId());
mStore.addResult("input", false);
mStore.endGroup();
}
}
}
}
int[] inputFmts = map.getInputFormats();
if (inputFmts != null) {
for (int fi = 0; fi < Array.getLength(inputFmts); fi++) {
Collection<MultiResolutionStreamInfo> streamInfo =
map.getInputInfo(inputFmts[fi]);
if (streamInfo != null) {
for (MultiResolutionStreamInfo oneStream : streamInfo) {
mStore.startGroup();
mStore.addResult("format", inputFmts[fi]);
mStore.addResult("width", oneStream.getWidth());
mStore.addResult("height", oneStream.getHeight());
mStore.addResult("cameraId", oneStream.getPhysicalCameraId());
mStore.addResult("input", true);
mStore.endGroup();
}
}
}
}
mStore.endArray();
mStore.endGroup();
}
private static String getKeyName(Object keyObj) {
return ((CameraCharacteristics.Key) keyObj).getName();
}
private static Object getKeyValue(CameraCharacteristics chars, Object keyObj) {
return chars.get((CameraCharacteristics.Key) keyObj);
}
private void storeEntry(Type keyType, Object keyObj,
CameraCharacteristics chars) throws Exception {
String keyName = getKeyName(keyObj);
String protoName = keyName.replace('.', '_');
Object keyValue = getKeyValue(chars, keyObj);
if (keyValue == null) {
return;
}
if (keyType == int.class || keyType == Integer.class) {
mStore.addResult(protoName, (int) keyValue);
return;
} else if (keyType == float.class || keyType == Float.class) {
mStore.addResult(protoName, (float) keyValue);
return;
} else if (keyType == long.class || keyType == Long.class) {
mStore.addResult(protoName, (long) keyValue);
return;
} else if (keyType == double.class || keyType == Double.class) {
mStore.addResult(protoName, (double) keyValue);
return;
} else if (keyType == boolean.class || keyType == Boolean.class) {
mStore.addResult(protoName, (boolean) keyValue);
return;
} else if (keyType == byte.class || keyType == Byte.class) {
// Infostore does not support byte, convert to int32 and save
int intValue = (int) ((byte) keyValue);
mStore.addResult(protoName, intValue);
return;
} else if (keyType == Rational.class) {
storeRational((Rational) keyValue, protoName);
return;
} else if (keyType == Size.class) {
storeSize((Size) keyValue, protoName);
return;
} else if (keyType == SizeF.class) {
storeSizeF((SizeF) keyValue, protoName);
return;
} else if (keyType == Rect.class) {
storeRect((Rect) keyValue, protoName);
return;
} else if (keyType == StreamConfigurationMap.class) {
storeStreamConfigurationMap(
(StreamConfigurationMap) keyValue, protoName);
return;
} else if (keyType instanceof ParameterizedType &&
((ParameterizedType) keyType).getRawType() == Range.class &&
((ParameterizedType) keyType).getActualTypeArguments()[0] == Float.class) {
storeRangeFloat((Range<Float>) keyValue, protoName);
return;
} else if (keyType instanceof ParameterizedType &&
((ParameterizedType) keyType).getRawType() == Range.class &&
((ParameterizedType) keyType).getActualTypeArguments()[0] == Integer.class) {
storeRangeInt((Range<Integer>) keyValue, protoName);
return;
} else if (keyType instanceof ParameterizedType &&
((ParameterizedType) keyType).getRawType() == Range.class &&
((ParameterizedType) keyType).getActualTypeArguments()[0] == Long.class) {
storeRangeLong((Range<Long>) keyValue, protoName);
return;
} else if (keyType == ColorSpaceTransform.class) {
storeColorSpaceTransform((ColorSpaceTransform) keyValue, protoName);
return;
} else if (keyType == BlackLevelPattern.class) {
storeBlackLevelPattern((BlackLevelPattern) keyValue, protoName);
return;
} else if (keyType == MultiResolutionStreamConfigurationMap.class) {
storeMultiResStreamConfigurationMap(
(MultiResolutionStreamConfigurationMap) keyValue, protoName);
} else {
Log.w(TAG, "Storing unsupported key type: " + keyType +
" for keyName: " + keyName);
return;
}
}
private void storeArrayEntry(Type keyType, Object keyObj,
CameraCharacteristics chars) throws Exception {
String keyName = getKeyName(keyObj);
String protoName = keyName.replace('.', '_');
Object keyValue = getKeyValue(chars, keyObj);
if (keyValue == null) {
return;
}
int arrayLen = Array.getLength(keyValue);
if (arrayLen == 0) {
return;
}
Type elmtType = ((GenericArrayType) keyType).getGenericComponentType();
if (elmtType == int.class) {
mStore.addArrayResult(protoName, (int[]) keyValue);
return;
} else if (elmtType == float.class) {
mStore.addArrayResult(protoName, (float[]) keyValue);
return;
} else if (elmtType == long.class) {
mStore.addArrayResult(protoName, (long[]) keyValue);
return;
} else if (elmtType == double.class) {
mStore.addArrayResult(protoName, (double[]) keyValue);
return;
} else if (elmtType == boolean.class) {
mStore.addArrayResult(protoName, (boolean[]) keyValue);
return;
} else if (elmtType == byte.class) {
// Infostore does not support byte, convert to int32 and save
int[] intValues = new int[arrayLen];
for (int i = 0; i < arrayLen; i++) {
intValues[i] = (int) ((byte) Array.get(keyValue, i));
}
mStore.addArrayResult(protoName, intValues);
return;
} else if (elmtType == Rational.class) {
mStore.startArray(protoName);
for (int i = 0; i < arrayLen; i++) {
storeRational((Rational) Array.get(keyValue, i), null);
}
mStore.endArray();
return;
} else if (elmtType == Size.class) {
mStore.startArray(protoName);
for (int i = 0; i < arrayLen; i++) {
storeSize((Size) Array.get(keyValue, i), null);
}
mStore.endArray();
return;
} else if (elmtType == Rect.class) {
mStore.startArray(protoName);
for (int i = 0; i < arrayLen; i++) {
storeRect((Rect) Array.get(keyValue, i), null);
}
mStore.endArray();
return;
} else if (elmtType instanceof ParameterizedType &&
((ParameterizedType) elmtType).getRawType() == Range.class &&
((ParameterizedType) elmtType).getActualTypeArguments()[0] == Integer.class) {
mStore.startArray(protoName);
for (int i = 0; i < arrayLen; i++) {
storeRangeInt((Range<Integer>) Array.get(keyValue, i), null);
}
mStore.endArray();
return;
} else if (elmtType == BlackLevelPattern.class) {
mStore.startArray(protoName);
for (int i = 0; i < arrayLen; i++) {
storeBlackLevelPattern((BlackLevelPattern) Array.get(keyValue, i), null);
}
mStore.endArray();
return;
} else {
Log.w(TAG, "Storing unsupported array type: " + elmtType +
" for keyName: " + keyName);
return;
}
}
private void storeCameraChars(
CameraCharacteristics chars) throws Exception {
HashSet<String> charsKeyNames = getAllCharacteristicsKeyNames();
Field[] allFields = chars.getClass().getDeclaredFields();
for (Field field : allFields) {
if (Modifier.isPublic(field.getModifiers()) &&
Modifier.isStatic(field.getModifiers()) &&
field.getType() == CameraCharacteristics.Key.class &&
field.getGenericType() instanceof ParameterizedType) {
ParameterizedType paramType = (ParameterizedType) field.getGenericType();
Type[] argTypes = paramType.getActualTypeArguments();
if (argTypes.length > 0) {
try {
Type keyType = argTypes[0];
Object keyObj = field.get(chars);
String keyName = getKeyName(keyObj);
if (charsKeyNames.contains(keyName)) {
if (keyType instanceof GenericArrayType) {
storeArrayEntry(keyType, keyObj, chars);
} else {
storeEntry(keyType, keyObj, chars);
}
}
} catch (IllegalAccessException e) {
throw new IllegalStateException(
"Access error for field: " + field + ": ", e);
}
}
}
}
}
}
@Override
protected void collectDeviceInfo(DeviceInfoStore store) throws Exception {
store.addResult("profile_480p", CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P));
store.addResult("profile_720p", CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P));
store.addResult("profile_1080p", CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P));
store.addResult("profile_cif", CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_CIF));
store.addResult("profile_qcif", CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_QCIF));
store.addResult("profile_qvga", CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_QVGA));
CameraManager cameraManager = (CameraManager)
getContext().getSystemService(Context.CAMERA_SERVICE);
try {
String[] cameraIdList = cameraManager.getCameraIdList();
HashMap<String, ArrayList<String>> physicalLogicalIdMap =
new HashMap<String, ArrayList<String>>();
store.addResult("num_of_camera", cameraIdList.length);
if (cameraIdList.length > 0) {
CameraCharacteristicsStorer charsStorer =
new CameraCharacteristicsStorer(cameraManager, store);
store.startArray("per_camera_info");
for (int i = 0; i < cameraIdList.length; i++) {
charsStorer.storeCameraInfo(cameraIdList[i]);
// Get the physical camera ids
CameraCharacteristics ch = cameraManager.getCameraCharacteristics(
cameraIdList[i]);
for (String physicalId : ch.getPhysicalCameraIds()) {
if (physicalLogicalIdMap.get(physicalId) == null) {
physicalLogicalIdMap.put(physicalId, new ArrayList<String>());
}
physicalLogicalIdMap.get(physicalId).add(cameraIdList[i]);
}
}
store.endArray(); // per_camera_info
// Store characteristics for hidden physical camera ids
for (int i = 0; i < cameraIdList.length; ++i) {
physicalLogicalIdMap.remove(cameraIdList[i]);
}
if (physicalLogicalIdMap.size() > 0) {
store.addResult("num_of_hidden_physical_camera", physicalLogicalIdMap.size());
store.startArray("per_hidden_physical_camera_info");
for (String physicalId : physicalLogicalIdMap.keySet()) {
charsStorer.storePhysicalCameraInfo(physicalId,
physicalLogicalIdMap.get(physicalId));
}
store.endArray(); // per_hidden_physical_camera_info
}
}
} catch (CameraAccessException e) {
Log.e(TAG,
"Unable to get camera camera ID list, error: "
+ e.getMessage());
}
}
/*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* The key entries below this point are generated from metadata
* definitions in /system/media/camera/docs. Do not modify by hand or
* modify the comment blocks at the start or end.
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
private static HashSet<String> getAllCharacteristicsKeyNames() {
HashSet<String> charsKeyNames = new HashSet<String>();
charsKeyNames.add(CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_MAX_REGIONS_AE.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_MAX_REGIONS_AF.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AVAILABLE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_CAPABILITIES.getName());
charsKeyNames.add(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE.getName());
charsKeyNames.add(CameraCharacteristics.EDGE_AVAILABLE_EDGE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.FLASH_INFO_AVAILABLE.getName());
charsKeyNames.add(CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL.getName());
charsKeyNames.add(CameraCharacteristics.FLASH_INFO_STRENGTH_DEFAULT_LEVEL.getName());
charsKeyNames.add(CameraCharacteristics.HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES.getName());
charsKeyNames.add(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES.getName());
charsKeyNames.add(CameraCharacteristics.LENS_FACING.getName());
charsKeyNames.add(CameraCharacteristics.LENS_POSE_REFERENCE.getName());
charsKeyNames.add(CameraCharacteristics.LENS_DISTORTION_MAXIMUM_RESOLUTION.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INTRINSIC_CALIBRATION_MAXIMUM_RESOLUTION.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE.getName());
charsKeyNames.add(CameraCharacteristics.LENS_INFO_FOCUS_DISTANCE_CALIBRATION.getName());
charsKeyNames.add(CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_RAW.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_PROC_STALLING.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_MAX_NUM_INPUT_STREAMS.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES.getName());
charsKeyNames.add(CameraCharacteristics.REQUEST_RECOMMENDED_TEN_BIT_DYNAMIC_RANGE_PROFILE.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_CROPPING_TYPE.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_MANDATORY_STREAM_COMBINATIONS.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_AVAILABLE_ROTATE_AND_CROP_MODES.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_DEFAULT_SECURE_IMAGE_SIZE.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP_MAXIMUM_RESOLUTION.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_MANDATORY_MAXIMUM_RESOLUTION_STREAM_COMBINATIONS.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_MANDATORY_TEN_BIT_OUTPUT_STREAM_COMBINATIONS.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_MANDATORY_PREVIEW_STABILIZATION_OUTPUT_STREAM_COMBINATIONS.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES.getName());
charsKeyNames.add(CameraCharacteristics.SCALER_MANDATORY_USE_CASE_STREAM_COMBINATIONS.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT1.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_REFERENCE_ILLUMINANT2.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_CALIBRATION_TRANSFORM1.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_CALIBRATION_TRANSFORM2.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_COLOR_TRANSFORM1.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_COLOR_TRANSFORM2.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_FORWARD_MATRIX1.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_FORWARD_MATRIX2.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_BLACK_LEVEL_PATTERN.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_ORIENTATION.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_OPTICAL_BLACK_REGIONS.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_COLOR_FILTER_ARRANGEMENT.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_WHITE_LEVEL.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_LENS_SHADING_APPLIED.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE_MAXIMUM_RESOLUTION.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION.getName());
charsKeyNames.add(CameraCharacteristics.SENSOR_INFO_BINNING_FACTOR.getName());
charsKeyNames.add(CameraCharacteristics.SHADING_AVAILABLE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES.getName());
charsKeyNames.add(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT.getName());
charsKeyNames.add(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES.getName());
charsKeyNames.add(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES.getName());
charsKeyNames.add(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_OIS_DATA_MODES.getName());
charsKeyNames.add(CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS.getName());
charsKeyNames.add(CameraCharacteristics.TONEMAP_AVAILABLE_TONE_MAP_MODES.getName());
charsKeyNames.add(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL.getName());
charsKeyNames.add(CameraCharacteristics.INFO_VERSION.getName());
charsKeyNames.add(CameraCharacteristics.INFO_DEVICE_STATE_SENSOR_ORIENTATION_MAP.getName());
charsKeyNames.add(CameraCharacteristics.SYNC_MAX_LATENCY.getName());
charsKeyNames.add(CameraCharacteristics.REPROCESS_MAX_CAPTURE_STALL.getName());
charsKeyNames.add(CameraCharacteristics.DEPTH_DEPTH_IS_EXCLUSIVE.getName());
charsKeyNames.add(CameraCharacteristics.LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE.getName());
charsKeyNames.add(CameraCharacteristics.DISTORTION_CORRECTION_AVAILABLE_MODES.getName());
charsKeyNames.add(CameraCharacteristics.AUTOMOTIVE_LOCATION.getName());
charsKeyNames.add(CameraCharacteristics.AUTOMOTIVE_LENS_FACING.getName());
return charsKeyNames;
}
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
}