android.scaler.streamConfigurationMap Key值的来源
一、背景
在开发camera app时,app获取preview的YUV数据,当从KEY CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP的StreamConfigurationMap中获取类型为SurfaceHolder.class的size时,发现它少于picture size,代码如下:
CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = mCharacteristics.get(cameraId).get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] size = map.getOutputSizes(SurfaceHolder.class);
获取的outsize如果少于picture size,如果camera app选择在app中对预览数据进行处理而呈现给用户的话,它将会造成成取景的窗口小于拍照生成图片的窗口。
二、StreamConfigurationMap中数据的来源
StreamConfigurationMap包含有各种camera streamconfig的数据 ,一般我们只知道这些数据来源于camera metadata,从代码看,我们能知道StreamConfigurationMap包含camera metadata中SCALER_AVAILABLE_STREAM_CONFIGURATIONS、SCALER_AVAILABLE_MIN_FRAME_DURATIONS、SCALER_AVAILABLE_STALL_DURATIONS、DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS、DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS、DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS、CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS和SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP这些键值。
LINUX/android/frameworks/base/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
// Use Command pattern here to avoid lots of expensive if/equals checks in get for overridden
// metadata.
private static final HashMap<Key<?>, GetCommand> sGetCommandMap =
new HashMap<Key<?>, GetCommand>();
static {
......
sGetCommandMap.put(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getNativeKey(),
new GetCommand() {
@Override
@Suppr