14961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin/* 24961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Copyright (C) 2014 The Android Open Source Project 34961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * 44961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 54961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * you may not use this file except in compliance with the License. 64961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * You may obtain a copy of the License at 74961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * 84961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 94961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * 104961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Unless required by applicable law or agreed to in writing, software 114961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 124961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * See the License for the specific language governing permissions and 144961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * limitations under the License. 154961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */ 164961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 174961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinpackage android.hardware.camera2.legacy; 184961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 194961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.graphics.ImageFormat; 20e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunkimport android.graphics.PixelFormat; 21df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.graphics.Rect; 224961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.Camera; 234961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.Camera.CameraInfo; 24e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkinimport android.hardware.Camera.Parameters; 254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.CameraCharacteristics; 26a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.hardware.camera2.CameraDevice; 27a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.hardware.camera2.CameraMetadata; 285776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunkimport android.hardware.camera2.CaptureRequest; 296c76f58f31635c19c14ae161f96dad2082537860Igor Murashkinimport android.hardware.camera2.CaptureResult; 304961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.impl.CameraMetadataNative; 316a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunkimport android.hardware.camera2.params.MeteringRectangle; 324961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.params.StreamConfiguration; 334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.params.StreamConfigurationDuration; 34df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.utils.ArrayUtils; 35df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.utils.ListUtils; 36df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.utils.ParamsUtils; 374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.util.Log; 385776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunkimport android.util.Range; 39df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Size; 407336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkinimport android.util.SizeF; 414961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport java.util.ArrayList; 435776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunkimport java.util.Arrays; 441dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunkimport java.util.Collections; 454961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport java.util.List; 464961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 474961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport static com.android.internal.util.Preconditions.*; 484961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport static android.hardware.camera2.CameraCharacteristics.*; 49df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static android.hardware.camera2.legacy.ParameterUtils.*; 504961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 514961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin/** 524961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Provide legacy-specific implementations of camera2 metadata for legacy devices, such as the 534961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * camera characteristics. 544961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */ 5583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin@SuppressWarnings("deprecation") 564961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinpublic class LegacyMetadataMapper { 574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin private static final String TAG = "LegacyMetadataMapper"; 58a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala private static final boolean DEBUG = false; 594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 60e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final long NS_PER_MS = 1000000; 61e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 624961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin // from graphics.h 63e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk public static final int HAL_PIXEL_FORMAT_RGBA_8888 = PixelFormat.RGBA_8888; 64e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk public static final int HAL_PIXEL_FORMAT_BGRA_8888 = 0x5; 65e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk public static final int HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED = 0x22; 66e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk public static final int HAL_PIXEL_FORMAT_BLOB = 0x21; 674961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 681788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin // for metadata 691788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin private static final float LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS = 0.0f; 701788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin 71e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final int REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_RAW = 0; // no raw support 72e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final int REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC = 3; // preview, video, cb 73e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final int REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC_STALL = 1; // 1 jpeg only 74e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final int REQUEST_MAX_NUM_INPUT_STREAMS_COUNT = 0; // no reprocessing 75e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 76e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /** Assume 3 HAL1 stages: Exposure, Read-out, Post-Processing */ 77e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final int REQUEST_PIPELINE_MAX_DEPTH_HAL1 = 3; 78e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /** Assume 3 shim stages: Preview input, Split output, Format conversion for output */ 79e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final int REQUEST_PIPELINE_MAX_DEPTH_OURS = 3; 80e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* TODO: Update above maxDepth values once we do more performance measurements */ 81e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 82e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin // For approximating JPEG stall durations 83e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final long APPROXIMATE_CAPTURE_DELAY_MS = 200; // 200 milliseconds 84e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final long APPROXIMATE_SENSOR_AREA_PX = (1 << 23); // 8 megapixels 85e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static final long APPROXIMATE_JPEG_ENCODE_TIME_MS = 600; // 600 milliseconds 863e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 873fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static final int UNKNOWN_MODE = -1; 883fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 89a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Maximum difference between a preview size aspect ratio and a jpeg size aspect ratio 90a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin private static final float PREVIEW_ASPECT_RATIO_TOLERANCE = 0.01f; 91a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 92a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 93a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Development hijinks: Lie about not supporting certain capabilities 94a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 95a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * - Unblock some CTS tests from running whose main intent is not the metadata itself 96a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 97a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * TODO: Remove these constants and strip out any code that previously relied on them 98a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * being set to true. 99a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 10049a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin static final boolean LIE_ABOUT_AE_STATE = false; 1017ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin static final boolean LIE_ABOUT_AE_MAX_REGIONS = false; 10283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin static final boolean LIE_ABOUT_AF = false; 10383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin static final boolean LIE_ABOUT_AF_MAX_REGIONS = false; 10449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin static final boolean LIE_ABOUT_AWB_STATE = false; 105733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin static final boolean LIE_ABOUT_AWB = false; 106a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 107a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 108a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /** 109a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Create characteristics for a legacy device by mapping the {@code parameters} 110a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * and {@code info} 111a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 112a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param parameters A non-{@code null} parameters set 113a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param info Camera info with camera facing direction and angle of orientation 114a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 115a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @return static camera characteristics for a camera device 116a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 117a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @throws NullPointerException if any of the args were {@code null} 118a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 119a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public static CameraCharacteristics createCharacteristics(Camera.Parameters parameters, 120a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraInfo info) { 121a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin checkNotNull(parameters, "parameters must not be null"); 122a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin checkNotNull(info, "info must not be null"); 123a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 124a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin String paramStr = parameters.flatten(); 125a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin android.hardware.CameraInfo outerInfo = new android.hardware.CameraInfo(); 126a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin outerInfo.info = info; 127a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 128a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin return createCharacteristics(paramStr, outerInfo); 129a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 130a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1314961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin /** 1324961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Create characteristics for a legacy device by mapping the {@code parameters} 1334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * and {@code info} 1344961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * 1354961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * @param parameters A string parseable by {@link Camera.Parameters#unflatten} 1364961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * @param info Camera info with camera facing direction and angle of orientation 1374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * @return static camera characteristics for a camera device 1384961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * 1394961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * @throws NullPointerException if any of the args were {@code null} 1404961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */ 1414961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin public static CameraCharacteristics createCharacteristics(String parameters, 1424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin android.hardware.CameraInfo info) { 1434961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin checkNotNull(parameters, "parameters must not be null"); 1444961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin checkNotNull(info, "info must not be null"); 1454961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin checkNotNull(info.info, "info.info must not be null"); 1464961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1474961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin CameraMetadataNative m = new CameraMetadataNative(); 1484961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 149e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin mapCharacteristicsFromInfo(m, info.info); 1504961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1514961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin Camera.Parameters params = Camera.getEmptyParameters(); 1524961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin params.unflatten(parameters); 153e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin mapCharacteristicsFromParameters(m, params); 1544961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 155a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 1564961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin Log.v(TAG, "createCharacteristics metadata:"); 1574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin Log.v(TAG, "--------------------------------------------------- (start)"); 1584961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin m.dumpToLog(); 1594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin Log.v(TAG, "--------------------------------------------------- (end)"); 1604961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1614961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 1624961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin return new CameraCharacteristics(m); 1634961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1644961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 165e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapCharacteristicsFromInfo(CameraMetadataNative m, CameraInfo i) { 1664961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin m.set(LENS_FACING, i.facing == CameraInfo.CAMERA_FACING_BACK ? 1674961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin LENS_FACING_BACK : LENS_FACING_FRONT); 1684961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin m.set(SENSOR_ORIENTATION, i.orientation); 1694961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 1704961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 171e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapCharacteristicsFromParameters(CameraMetadataNative m, 172e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin Camera.Parameters p) { 173442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 174442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 175442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * colorCorrection.* 176442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 177442395751d46aa0f569ad479202a84713a260be0Igor Murashkin m.set(COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, 178442395751d46aa0f569ad479202a84713a260be0Igor Murashkin new int[] { COLOR_CORRECTION_ABERRATION_MODE_FAST }); 179e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 180e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * control.ae* 181e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 182a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mapControlAe(m, p); 183e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 18483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * control.af* 18583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 18683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mapControlAf(m, p); 18783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /* 188e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * control.awb* 189e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 190a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mapControlAwb(m, p); 191e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 192e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * control.* 193e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * - Anything that doesn't have a set of related fields 194e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 195e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin mapControlOther(m, p); 196e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 197e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * lens.* 198e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 1991788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin mapLens(m, p); 200e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 201e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * flash.* 202e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 2031788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin mapFlash(m, p); 2041dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk /* 2051dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk * jpeg.* 2061dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk */ 2071dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk mapJpeg(m, p); 208e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 209e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 210442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * noiseReduction.* 211442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 212442395751d46aa0f569ad479202a84713a260be0Igor Murashkin m.set(NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, 213442395751d46aa0f569ad479202a84713a260be0Igor Murashkin new int[] { NOISE_REDUCTION_MODE_FAST }); 214442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 215442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 216df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.* 217df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 218df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin mapScaler(m, p); 219df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 220df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 221df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * sensor.* 222df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 223df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin mapSensor(m, p); 224df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 225df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 2260a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * statistics.* 2270a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 2280a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin mapStatistics(m, p); 2290a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 2300a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 231e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * sync.* 232e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 233e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin mapSync(m, p); 2347f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 2357f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk /* 2367f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk * info.supportedHardwareLevel 2377f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk */ 2387ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin m.set(INFO_SUPPORTED_HARDWARE_LEVEL, INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY); 2397f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 2407f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk /* 2417f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk * scaler.availableStream*, scaler.available*Durations, sensor.info.maxFrameDuration 2427f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk */ 2437f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk mapScalerStreamConfigs(m, p); 2447f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 245d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin // Order matters below: Put this last so that we can read the metadata set previously 246d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 247d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin /* 248d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin * request.* 249d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin */ 250d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin mapRequest(m, p); 251d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 2524961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 2534961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 254df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapScalerStreamConfigs(CameraMetadataNative m, Camera.Parameters p) { 2554961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 2564961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin ArrayList<StreamConfiguration> availableStreamConfigs = new ArrayList<>(); 2574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin /* 2584961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Implementation-defined (preview, recording, etc) -> use camera1 preview sizes 2594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * YUV_420_888 cpu callbacks -> use camera1 preview sizes 2604961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Other preview callbacks (CPU) -> use camera1 preview sizes 2614961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * JPEG still capture -> use camera1 still capture sizes 2624961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * 2634961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Use platform-internal format constants here, since StreamConfigurationMap does the 2644961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * remapping to public format constants. 2654961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */ 266df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<Camera.Size> previewSizes = p.getSupportedPreviewSizes(); 267a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin List<Camera.Size> jpegSizes = p.getSupportedPictureSizes(); 268a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin /* 269a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * Work-around for b/17589233: 270a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - Some HALs's largest preview size aspect ratio does not match the largest JPEG size AR 271a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - This causes a large amount of problems with focus/metering because it's relative to 272a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * preview, making the difference between the JPEG and preview viewport inaccessible 273a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - This boils down to metering or focusing areas being "arbitrarily" cropped 274a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * in the capture result. 275a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - Work-around the HAL limitations by removing all of the largest preview sizes 276a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * until we get one with the same aspect ratio as the jpeg size. 277a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin */ 278a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin { 279a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin SizeAreaComparator areaComparator = new SizeAreaComparator(); 280a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 281a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Sort preview to min->max 282a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Collections.sort(previewSizes, areaComparator); 283a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 284a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Camera.Size maxJpegSize = SizeAreaComparator.findLargestByArea(jpegSizes); 285a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin float jpegAspectRatio = maxJpegSize.width * 1.0f / maxJpegSize.height; 286a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 287a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 288a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Log.v(TAG, String.format("mapScalerStreamConfigs - largest JPEG area %dx%d, AR=%f", 289a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin maxJpegSize.width, maxJpegSize.height, jpegAspectRatio)); 290a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 291a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 292a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Now remove preview sizes from the end (largest->smallest) until aspect ratio matches 293a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin while (!previewSizes.isEmpty()) { 294a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin int index = previewSizes.size() - 1; // max is always at the end 295a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Camera.Size size = previewSizes.get(index); 296a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 297a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin float previewAspectRatio = size.width * 1.0f / size.height; 298a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 299a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin if (Math.abs(jpegAspectRatio - previewAspectRatio) >= 300a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin PREVIEW_ASPECT_RATIO_TOLERANCE) { 301a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin previewSizes.remove(index); // Assume removing from end is O(1) 302a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 303a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 304a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Log.v(TAG, String.format( 305a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin "mapScalerStreamConfigs - removed preview size %dx%d, AR=%f " 306a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin + "was not the same", 307a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin size.width, size.height, previewAspectRatio)); 308a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 309a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } else { 310a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin break; 311a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 312a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 313a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 314a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin if (previewSizes.isEmpty()) { 315a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Fall-back to the original faulty behavior, but at least work 316a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Log.w(TAG, "mapScalerStreamConfigs - failed to find any preview size matching " + 317a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin "JPEG aspect ratio " + jpegAspectRatio); 318a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin previewSizes = p.getSupportedPreviewSizes(); 319a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 320a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 321a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Sort again, this time in descending order max->min 322a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Collections.sort(previewSizes, Collections.reverseOrder(areaComparator)); 323a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 324a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 3254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, 3264961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, previewSizes); 3274961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, 3284961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin ImageFormat.YUV_420_888, previewSizes); 3294961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin for (int format : p.getSupportedPreviewFormats()) { 330ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala if (ImageFormat.isPublicFormat(format) && format != ImageFormat.NV21) { 3314961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, format, previewSizes); 332a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala } else if (DEBUG) { 3334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin /* 3344961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Do not add any formats unknown to us 3354961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * (since it would fail runtime checks in StreamConfigurationMap) 3364961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */ 337ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala Log.v(TAG, 338ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala String.format("mapStreamConfigs - Skipping format %x", format)); 3394961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 3404961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 3413e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 3424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, 3434961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin HAL_PIXEL_FORMAT_BLOB, p.getSupportedPictureSizes()); 344e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 345e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * scaler.availableStreamConfigurations 346e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3474961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin m.set(SCALER_AVAILABLE_STREAM_CONFIGURATIONS, 3484961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin availableStreamConfigs.toArray(new StreamConfiguration[0])); 3493e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 350e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 351e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * scaler.availableMinFrameDurations 352e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3533e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk // No frame durations available 3543e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk m.set(SCALER_AVAILABLE_MIN_FRAME_DURATIONS, new StreamConfigurationDuration[0]); 3553e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 3563e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk StreamConfigurationDuration[] jpegStalls = 3573e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk new StreamConfigurationDuration[jpegSizes.size()]; 3583e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk int i = 0; 3595776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk long longestStallDuration = -1; 3603e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk for (Camera.Size s : jpegSizes) { 3615776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk long stallDuration = calculateJpegStallDuration(s); 3623e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk jpegStalls[i++] = new StreamConfigurationDuration(HAL_PIXEL_FORMAT_BLOB, s.width, 3635776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk s.height, stallDuration); 3645776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk if (longestStallDuration < stallDuration) { 3655776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk longestStallDuration = stallDuration; 3665776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 3673e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk } 368e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 369e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * scaler.availableStallDurations 370e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3713e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk // Set stall durations for jpeg, other formats use default stall duration 3723e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk m.set(SCALER_AVAILABLE_STALL_DURATIONS, jpegStalls); 3735776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 374e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 375e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * sensor.info.maxFrameDuration 376e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3775776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk m.set(SENSOR_INFO_MAX_FRAME_DURATION, longestStallDuration); 3785776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 3795776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 3805776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk @SuppressWarnings({"unchecked"}) 381a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private static void mapControlAe(CameraMetadataNative m, Camera.Parameters p) { 382a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 383a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * control.aeAvailableAntiBandingModes 384a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 3855776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk List<String> antiBandingModes = p.getSupportedAntibanding(); 386df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (antiBandingModes != null && antiBandingModes.size() > 0) { // antibanding is optional 387df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] modes = new int[antiBandingModes.size()]; 3885776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk int j = 0; 3895776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk for (String mode : antiBandingModes) { 3905776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk int convertedMode = convertAntiBandingMode(mode); 391a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG && convertedMode == -1) { 392ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala Log.v(TAG, "Antibanding mode " + ((mode == null) ? "NULL" : mode) + 3935776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk " not supported, skipping..."); 3945776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } else { 3955776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk modes[j++] = convertedMode; 3965776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 3975776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 3985776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk m.set(CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, Arrays.copyOf(modes, j)); 399df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else { 400df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, new int[0]); 4015776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 402a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 403a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 404df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control.aeAvailableTargetFpsRanges 405a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 406df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 407df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<int[]> fpsRanges = p.getSupportedPreviewFpsRange(); 408df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (fpsRanges == null) { 409df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin throw new AssertionError("Supported FPS ranges cannot be null."); 410df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 411df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int rangesSize = fpsRanges.size(); 412df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (rangesSize <= 0) { 413df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin throw new AssertionError("At least one FPS range must be supported."); 414df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 415df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Range<Integer>[] ranges = new Range[rangesSize]; 416df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int i = 0; 417df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin for (int[] r : fpsRanges) { 418ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh ranges[i++] = Range.create( 419ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh (int) Math.floor(r[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] / 1000.0), 420ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh (int) Math.ceil(r[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] / 1000.0)); 421df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 422df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, ranges); 423a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 424a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 425df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 426df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control.aeAvailableModes 427df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 428df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 429df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<String> flashModes = p.getSupportedFlashModes(); 430df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 431df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin String[] flashModeStrings = new String[] { 43249a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin Camera.Parameters.FLASH_MODE_OFF, 433df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_AUTO, 434df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_ON, 435df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_RED_EYE, 436df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Map these manually 437df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_TORCH, 438a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin }; 439df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] flashModeInts = new int[] { 440df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON, 441df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON_AUTO_FLASH, 44249a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin CONTROL_AE_MODE_ON_ALWAYS_FLASH, 443df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE 444df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin }; 445df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] aeAvail = ArrayUtils.convertStringListToIntArray( 446df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin flashModes, flashModeStrings, flashModeInts); 447df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 448df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // No flash control -> AE is always on 449df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (aeAvail == null || aeAvail.length == 0) { 450df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin aeAvail = new int[] { 451df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON 452df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin }; 453df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 454a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 455df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Note that AE_MODE_OFF is never available. 456df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(CONTROL_AE_AVAILABLE_MODES, aeAvail); 457df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 4583e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4593e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /* 4603e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * control.aeCompensationRanges 4613e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin */ 4623e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 4633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin int min = p.getMinExposureCompensation(); 4643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin int max = p.getMaxExposureCompensation(); 4653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin m.set(CONTROL_AE_COMPENSATION_RANGE, Range.create(min, max)); 4673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 4683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /* 4703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * control.aeCompensationStep 4713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin */ 4723e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 4733e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin float step = p.getExposureCompensationStep(); 4743e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4753e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin m.set(CONTROL_AE_COMPENSATION_STEP, ParamsUtils.createRational(step)); 4763e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 477d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 478d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh /* 479d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh * control.aeLockAvailable 480d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh */ 481d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh { 482d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh boolean aeLockAvailable = p.isAutoExposureLockSupported(); 483d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 484d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AE_LOCK_AVAILABLE, aeLockAvailable); 485d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 486a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 487a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 48883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 48983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin @SuppressWarnings({"unchecked"}) 49083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private static void mapControlAf(CameraMetadataNative m, Camera.Parameters p) { 49183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /* 49283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * control.afAvailableModes 49383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 49483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 49583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin List<String> focusModes = p.getSupportedFocusModes(); 49683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 49783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String[] focusModeStrings = new String[] { 49883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_AUTO, 49983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE, 50083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO, 50183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_EDOF, 50283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_INFINITY, 50383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_MACRO, 50483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_FIXED, 50583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin }; 50683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 50783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int[] focusModeInts = new int[] { 50883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_AUTO, 50983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_CONTINUOUS_PICTURE, 51083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_CONTINUOUS_VIDEO, 51183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_EDOF, 51283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_OFF, 51383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_MACRO, 51483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_OFF 51583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin }; 51683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 51783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin List<Integer> afAvail = ArrayUtils.convertStringListToIntList( 51883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin focusModes, focusModeStrings, focusModeInts); 51983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 52083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // No AF modes supported? That's unpossible! 52183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (afAvail == null || afAvail.size() == 0) { 52283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, "No AF modes supported (HAL bug); defaulting to AF_MODE_OFF only"); 52383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin afAvail = new ArrayList<Integer>(/*capacity*/1); 52483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin afAvail.add(CONTROL_AF_MODE_OFF); 52583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 52683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 52783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin m.set(CONTROL_AF_AVAILABLE_MODES, ArrayUtils.toIntArray(afAvail)); 52883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 529a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 53083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "mapControlAf - control.afAvailableModes set to " + 53183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin ListUtils.listToString(afAvail)); 53283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 53383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 53483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 53583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 536a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private static void mapControlAwb(CameraMetadataNative m, Camera.Parameters p) { 537733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 538733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * control.awbAvailableModes 539733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 540733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 541733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 542733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin List<String> wbModes = p.getSupportedWhiteBalance(); 543733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 544733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin String[] wbModeStrings = new String[] { 545733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_AUTO , 546733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_INCANDESCENT , 547733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_FLUORESCENT , 548733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT , 549733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_DAYLIGHT , 550733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT , 551733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_TWILIGHT , 552733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_SHADE , 553733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin }; 554733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 555733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin int[] wbModeInts = new int[] { 556733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_AUTO, 557733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_INCANDESCENT , 558733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_FLUORESCENT , 559733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_WARM_FLUORESCENT , 560733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_DAYLIGHT , 561733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_CLOUDY_DAYLIGHT , 562733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_TWILIGHT , 563733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_SHADE , 564733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // Note that CONTROL_AWB_MODE_OFF is unsupported 565733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin }; 566733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 567733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin List<Integer> awbAvail = ArrayUtils.convertStringListToIntList( 568733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin wbModes, wbModeStrings, wbModeInts); 569733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 570733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // No AWB modes supported? That's unpossible! 571733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin if (awbAvail == null || awbAvail.size() == 0) { 572733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.w(TAG, "No AWB modes supported (HAL bug); defaulting to AWB_MODE_AUTO only"); 573733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin awbAvail = new ArrayList<Integer>(/*capacity*/1); 574733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin awbAvail.add(CONTROL_AWB_MODE_AUTO); 575733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 576733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 577733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(CONTROL_AWB_AVAILABLE_MODES, ArrayUtils.toIntArray(awbAvail)); 578733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 579a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 580733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.v(TAG, "mapControlAwb - control.awbAvailableModes set to " + 581733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin ListUtils.listToString(awbAvail)); 582733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 583d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 584d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 585d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh /* 586d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh * control.awbLockAvailable 587d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh */ 588d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh { 589d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh boolean awbLockAvailable = p.isAutoWhiteBalanceLockSupported(); 590d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 591d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AWB_LOCK_AVAILABLE, awbLockAvailable); 592d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 593a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 5945776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 5955776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 596e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapControlOther(CameraMetadataNative m, Camera.Parameters p) { 5970cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh /* 5980a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * android.control.availableVideoStabilizationModes 5990a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 6000a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin { 6010a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin int stabModes[] = p.isVideoStabilizationSupported() ? 6020a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin new int[] { CONTROL_VIDEO_STABILIZATION_MODE_OFF, 6030a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin CONTROL_VIDEO_STABILIZATION_MODE_ON } : 6040a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin new int[] { CONTROL_VIDEO_STABILIZATION_MODE_OFF }; 6050a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 6060a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin m.set(CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, stabModes); 6070a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 6080a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 6090a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 6100cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh * android.control.maxRegions 6110cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh */ 612d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin final int AE = 0, AWB = 1, AF = 2; 613d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 6140cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh int[] maxRegions = new int[3]; 615d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AE] = p.getMaxNumMeteringAreas(); 616d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AWB] = 0; // AWB regions not supported in API1 617d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AF] = p.getMaxNumFocusAreas(); 618d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 619d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin if (LIE_ABOUT_AE_MAX_REGIONS) { 620d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AE] = 0; 621d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin } 622d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin if (LIE_ABOUT_AF_MAX_REGIONS) { 623d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AF] = 0; 624d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin } 625d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 6260cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh m.set(CONTROL_MAX_REGIONS, maxRegions); 627d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 6283fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /* 6293fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk * android.control.availableEffects 6303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk */ 6313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk List<String> effectModes = p.getSupportedColorEffects(); 6323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int[] supportedEffectModes = (effectModes == null) ? new int[0] : 6333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk ArrayUtils.convertStringListToIntArray(effectModes, sLegacyEffectMode, 6343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk sEffectModes); 6353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk m.set(CONTROL_AVAILABLE_EFFECTS, supportedEffectModes); 6363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 6373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /* 6383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk * android.control.availableSceneModes 6393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk */ 640d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh int maxNumDetectedFaces = p.getMaxNumDetectedFaces(); 6413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk List<String> sceneModes = p.getSupportedSceneModes(); 6428c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin List<Integer> supportedSceneModes = 6438c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin ArrayUtils.convertStringListToIntList(sceneModes, sLegacySceneModes, sSceneModes); 644d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 645d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh // Special case where the only scene mode listed is AUTO => no scene mode 646d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (sceneModes != null && sceneModes.size() == 1 && 647d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh sceneModes.get(0) == Parameters.SCENE_MODE_AUTO) { 648d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh supportedSceneModes = null; 6498c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin } 650d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 651d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh boolean sceneModeSupported = true; 652d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (supportedSceneModes == null && maxNumDetectedFaces == 0) { 653d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh sceneModeSupported = false; 6548c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin } 655d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 656d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (sceneModeSupported) { 657d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (supportedSceneModes == null) { 658d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh supportedSceneModes = new ArrayList<Integer>(); 659d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 660d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (maxNumDetectedFaces > 0) { // always supports FACE_PRIORITY when face detecting 661d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh supportedSceneModes.add(CONTROL_SCENE_MODE_FACE_PRIORITY); 662d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 663d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh // Remove all DISABLED occurrences 664d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (supportedSceneModes.contains(CONTROL_SCENE_MODE_DISABLED)) { 665d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh while(supportedSceneModes.remove(new Integer(CONTROL_SCENE_MODE_DISABLED))) {} 666d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 667d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AVAILABLE_SCENE_MODES, ArrayUtils.toIntArray(supportedSceneModes)); 668d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } else { 669d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AVAILABLE_SCENE_MODES, new int[] {CONTROL_SCENE_MODE_DISABLED}); 670d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 671d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 672d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh /* 673d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh * android.control.availableModes 674d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh */ 675d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AVAILABLE_MODES, sceneModeSupported ? 676d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh new int[] { CONTROL_MODE_AUTO, CONTROL_MODE_USE_SCENE_MODE } : 677d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh new int[] { CONTROL_MODE_AUTO }); 6784961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 6794961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 6801788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin private static void mapLens(CameraMetadataNative m, Camera.Parameters p) { 6811788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin /* 6821788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin * We can tell if the lens is fixed focus; 6831788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin * but if it's not, we can't tell the minimum focus distance, so leave it null then. 6841788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin */ 685a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 686d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "mapLens - focus-mode='" + p.getFocusMode() + "'"); 687d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 688d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 689d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin if (Camera.Parameters.FOCUS_MODE_FIXED.equals(p.getFocusMode())) { 690e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 691e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * lens.info.minimumFocusDistance 692e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 6931788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin m.set(LENS_INFO_MINIMUM_FOCUS_DISTANCE, LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS); 694d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 695a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 696d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "mapLens - lens.info.minimumFocusDistance = 0"); 697d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 698d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } else { 699a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 700d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "mapLens - lens.info.minimumFocusDistance is unknown"); 701d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 7021788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin } 7036a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 7046a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk float[] focalLengths = new float[] { p.getFocalLength() }; 7056a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(LENS_INFO_AVAILABLE_FOCAL_LENGTHS, focalLengths); 7061788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin } 7071788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin 7081788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin private static void mapFlash(CameraMetadataNative m, Camera.Parameters p) { 7091788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin boolean flashAvailable = false; 7101788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin List<String> supportedFlashModes = p.getSupportedFlashModes(); 711df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 7121788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin if (supportedFlashModes != null) { 7131788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin // If only 'OFF' is available, we don't really have flash support 714df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin flashAvailable = !ListUtils.listElementsEqualTo( 715df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin supportedFlashModes, Camera.Parameters.FLASH_MODE_OFF); 716a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 717a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 718e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 719e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * flash.info.available 720e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 7211788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin m.set(FLASH_INFO_AVAILABLE, flashAvailable); 7221788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin } 7231788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin 7241dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk private static void mapJpeg(CameraMetadataNative m, Camera.Parameters p) { 7251dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk List<Camera.Size> thumbnailSizes = p.getSupportedJpegThumbnailSizes(); 7261dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 7271dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (thumbnailSizes != null) { 7281dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Size[] sizes = convertSizeListToArray(thumbnailSizes); 729a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Arrays.sort(sizes, new android.hardware.camera2.utils.SizeAreaComparator()); 7301dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk m.set(JPEG_AVAILABLE_THUMBNAIL_SIZES, sizes); 7311dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 7321dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 7331dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 734e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapRequest(CameraMetadataNative m, Parameters p) { 735e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 736e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.availableCapabilities 737e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 738e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin int[] capabilities = { REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE }; 739e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_AVAILABLE_CAPABILITIES, capabilities); 740e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 741e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 7426c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * request.availableCharacteristicsKeys 7436c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin */ 7446c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin { 7456c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin // TODO: check if the underlying key is supported before listing a key as available 7466c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 7476c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin // Note: We only list public keys. Native HALs should list ALL keys regardless of visibility. 7486c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 7496c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin Key<?> availableKeys[] = new Key<?>[] { 750442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES , 7516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES , 7526c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES , 7536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES , 7546c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE , 7556c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP , 75671c605c54abfb182e2b38142f3cf98a6fc1ea75cYin-Chia Yeh CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE , 7576c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES , 7586c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS , 759854b523e11ecfb7393d2596a912668a10bae9b41Yin-Chia Yeh CameraCharacteristics.CONTROL_AVAILABLE_MODES , 7606c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES , 7616c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES , 7626c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES , 76371c605c54abfb182e2b38142f3cf98a6fc1ea75cYin-Chia Yeh CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE , 7646c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_MAX_REGIONS , 7656c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.FLASH_INFO_AVAILABLE , 7666c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL , 7676c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES , 7686c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.LENS_FACING , 7696c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS , 770442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES , 7716c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES , 7726c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS , 7736c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT , 7746c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH , 7756c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM , 7766c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin// CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP , 7776c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SCALER_CROPPING_TYPE , 7786c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES , 7796c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE , 7806c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE , 7816c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE , 782442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE , 7836c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_ORIENTATION , 7846c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES , 7856c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT , 7866c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SYNC_MAX_LATENCY , 7876c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin }; 788d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin List<Key<?>> characteristicsKeys = new ArrayList<>(Arrays.asList(availableKeys)); 789d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 790d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin /* 791d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin * Add the conditional keys 792d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin */ 793d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin if (m.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE) != null) { 794d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin characteristicsKeys.add(LENS_INFO_MINIMUM_FOCUS_DISTANCE); 795d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 796d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 797d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin m.set(REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, 798d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin getTagsForKeys(characteristicsKeys.toArray(new Key<?>[0]))); 7996c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 8006c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 8016c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin /* 8026c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * request.availableRequestKeys 8036c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin */ 8046c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin { 805808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureRequest.Key<?> defaultAvailableKeys[] = new CaptureRequest.Key<?>[] { 806442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, 8076c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, 8086c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 8096c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_LOCK, 8106c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_MODE, 8116c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, 8126c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AF_MODE, 8136c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AF_TRIGGER, 8146c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AWB_LOCK, 8156c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AWB_MODE, 8166c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_CAPTURE_INTENT, 8176c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_EFFECT_MODE, 8186c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_MODE, 8196c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_SCENE_MODE, 8206c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, 8216c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.FLASH_MODE, 8226c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_GPS_COORDINATES, 8236c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_GPS_PROCESSING_METHOD, 8246c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_GPS_TIMESTAMP, 8256c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_ORIENTATION, 8266c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_QUALITY, 8276c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_THUMBNAIL_QUALITY, 8286c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_THUMBNAIL_SIZE, 8296c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.LENS_FOCAL_LENGTH, 830442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureRequest.NOISE_REDUCTION_MODE, 8316c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.SCALER_CROP_REGION, 8326c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.STATISTICS_FACE_DETECT_MODE, 8336c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin }; 834808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh ArrayList<CaptureRequest.Key<?>> availableKeys = 835808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new ArrayList<CaptureRequest.Key<?>>(Arrays.asList(defaultAvailableKeys)); 836808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 837808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumMeteringAreas() > 0) { 838808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureRequest.CONTROL_AE_REGIONS); 839808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 840808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumFocusAreas() > 0) { 841808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureRequest.CONTROL_AF_REGIONS); 842808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 843808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 844808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureRequest.Key<?> availableRequestKeys[] = 845808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new CaptureRequest.Key<?>[availableKeys.size()]; 846808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.toArray(availableRequestKeys); 847808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh m.set(REQUEST_AVAILABLE_REQUEST_KEYS, getTagsForKeys(availableRequestKeys)); 8486c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 8496c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 8506c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin /* 8516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * request.availableResultKeys 8526c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin */ 8536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin { 854808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureResult.Key<?> defaultAvailableKeys[] = new CaptureResult.Key<?>[] { 855442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureResult.COLOR_CORRECTION_ABERRATION_MODE , 8566c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_ANTIBANDING_MODE , 8576c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION , 8586c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_LOCK , 8596c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_MODE , 8606c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AF_MODE , 8616c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AF_STATE , 8626c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AWB_MODE , 8636c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AWB_LOCK , 8646c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_MODE , 8656c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.FLASH_MODE , 8666c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_GPS_COORDINATES , 8676c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_GPS_PROCESSING_METHOD , 8686c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_GPS_TIMESTAMP , 8696c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_ORIENTATION , 8706c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_QUALITY , 8716c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_THUMBNAIL_QUALITY , 8726c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.LENS_FOCAL_LENGTH , 873442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureResult.NOISE_REDUCTION_MODE , 8746c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.REQUEST_PIPELINE_DEPTH , 8756c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.SCALER_CROP_REGION , 8766c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.SENSOR_TIMESTAMP , 8776c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.STATISTICS_FACE_DETECT_MODE , 8786c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin// CaptureResult.STATISTICS_FACES , 8796c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin }; 880808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh List<CaptureResult.Key<?>> availableKeys = 881808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new ArrayList<CaptureResult.Key<?>>(Arrays.asList(defaultAvailableKeys)); 882808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 883808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumMeteringAreas() > 0) { 884808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureResult.CONTROL_AE_REGIONS); 885808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 886808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumFocusAreas() > 0) { 887808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureResult.CONTROL_AF_REGIONS); 888808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 889808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 890808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureResult.Key<?> availableResultKeys[] = 891808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new CaptureResult.Key<?>[availableKeys.size()]; 892808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.toArray(availableResultKeys); 893808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh m.set(REQUEST_AVAILABLE_RESULT_KEYS, getTagsForKeys(availableResultKeys)); 8946c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 8956c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 8966c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin /* 897e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.maxNumOutputStreams 898e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 899e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin int[] outputStreams = { 900e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* RAW */ 901e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_RAW, 902e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* Processed & Not-Stalling */ 903e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC, 904e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* Processed & Stalling */ 905e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC_STALL, 906e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin }; 907e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_MAX_NUM_OUTPUT_STREAMS, outputStreams); 908e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 909e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 910e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.maxNumInputStreams 911e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 912e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_MAX_NUM_INPUT_STREAMS, REQUEST_MAX_NUM_INPUT_STREAMS_COUNT); 913e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 914e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 915733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * request.partialResultCount 916733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 917733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(REQUEST_PARTIAL_RESULT_COUNT, 1); // No partial results supported 918733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 919733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 920e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.pipelineMaxDepth 921e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 922e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_PIPELINE_MAX_DEPTH, 923e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin (byte)(REQUEST_PIPELINE_MAX_DEPTH_HAL1 + REQUEST_PIPELINE_MAX_DEPTH_OURS)); 924e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin } 925e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 926df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapScaler(CameraMetadataNative m, Parameters p) { 927df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 928df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.availableMaxDigitalZoom 929df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 930df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, ParameterUtils.getMaxZoomRatio(p)); 931df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 932df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 933df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.croppingType = CENTER_ONLY 934df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 935df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SCALER_CROPPING_TYPE, SCALER_CROPPING_TYPE_CENTER_ONLY); 936df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 937df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 938df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapSensor(CameraMetadataNative m, Parameters p) { 939df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Use the largest jpeg size (by area) for both active array and pixel array 940df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Size largestJpegSize = getLargestSupportedJpegSizeByArea(p); 941df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 942df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * sensor.info.activeArraySize 943df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 944df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 945df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Rect activeArrayRect = ParamsUtils.createRect(largestJpegSize); 946df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SENSOR_INFO_ACTIVE_ARRAY_SIZE, activeArrayRect); 947df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 948df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 949df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 950733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * sensor.availableTestPatternModes 951733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 952733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 953733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // Only "OFF" test pattern mode is available 954733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(SENSOR_AVAILABLE_TEST_PATTERN_MODES, new int[] { SENSOR_TEST_PATTERN_MODE_OFF }); 955733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 956733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 957733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 958df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * sensor.info.pixelArraySize 959df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 960df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SENSOR_INFO_PIXEL_ARRAY_SIZE, largestJpegSize); 9617336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 9627336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin /* 9637336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin * sensor.info.physicalSize 9647336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin */ 9657336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin { 9667336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin /* 9677336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin * Assume focal length is at infinity focus and that the lens is rectilinear. 9687336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin */ 9697336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin float focalLength = p.getFocalLength(); // in mm 9707336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin double angleHor = p.getHorizontalViewAngle() * Math.PI / 180; // to radians 9717336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin double angleVer = p.getVerticalViewAngle() * Math.PI / 180; // to radians 9727336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 9737336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin float height = (float)Math.abs(2 * focalLength * Math.tan(angleVer / 2)); 9747336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin float width = (float)Math.abs(2 * focalLength * Math.tan(angleHor / 2)); 9757336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 9767336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin m.set(SENSOR_INFO_PHYSICAL_SIZE, new SizeF(width, height)); // in mm 9777336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 978442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 979442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 980442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * sensor.info.timestampSource 981442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 982442395751d46aa0f569ad479202a84713a260be0Igor Murashkin { 983442395751d46aa0f569ad479202a84713a260be0Igor Murashkin m.set(SENSOR_INFO_TIMESTAMP_SOURCE, SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN); 984442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 985df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 986df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 9870a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin private static void mapStatistics(CameraMetadataNative m, Parameters p) { 9880a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 9890a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * statistics.info.availableFaceDetectModes 9900a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 9910a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin int[] fdModes; 9920a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 9930a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin if (p.getMaxNumDetectedFaces() > 0) { 9940a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin fdModes = new int[] { 9950a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin STATISTICS_FACE_DETECT_MODE_OFF, 9960a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin STATISTICS_FACE_DETECT_MODE_SIMPLE 9970a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin // FULL is never-listed, since we have no way to query it statically 9980a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin }; 9990a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } else { 10000a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin fdModes = new int[] { 10010a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin STATISTICS_FACE_DETECT_MODE_OFF 10020a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin }; 10030a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 10040a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin m.set(STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, fdModes); 10050a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 10060a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 10070a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * statistics.info.maxFaceCount 10080a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 10090a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin m.set(STATISTICS_INFO_MAX_FACE_COUNT, p.getMaxNumDetectedFaces()); 10100a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 10110a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 1012e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapSync(CameraMetadataNative m, Parameters p) { 1013e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 1014e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * sync.maxLatency 1015e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 1016e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(SYNC_MAX_LATENCY, SYNC_MAX_LATENCY_UNKNOWN); 1017e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin } 1018e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 10194961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin private static void appendStreamConfig( 10204961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin ArrayList<StreamConfiguration> configs, int format, List<Camera.Size> sizes) { 10214961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin for (Camera.Size size : sizes) { 10224961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin StreamConfiguration config = 10234961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin new StreamConfiguration(format, size.width, size.height, /*input*/false); 10244961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin configs.add(config); 10254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 10264961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 10273e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 10283fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static String[] sLegacySceneModes = { 10293fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_AUTO, 10303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_ACTION, 10313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_PORTRAIT, 10323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_LANDSCAPE, 10333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_NIGHT, 10343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_NIGHT_PORTRAIT, 10353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_THEATRE, 10363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_BEACH, 10373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_SNOW, 10383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_SUNSET, 10393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_STEADYPHOTO, 10403fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_FIREWORKS, 10413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_SPORTS, 10423fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_PARTY, 10433fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_CANDLELIGHT, 10443fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_BARCODE, 1045ff99a0add9700b423a0da3e332840e3907ae96a5Ruben Brunk Parameters.SCENE_MODE_HDR, 10463fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 10473fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10483fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static int[] sSceneModes = { 10493fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED, 10503fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_ACTION, 10513fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_PORTRAIT, 10523fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_LANDSCAPE, 10533fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT, 10543fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT_PORTRAIT, 10553fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_THEATRE, 10563fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_BEACH, 10573fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_SNOW, 10583fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_SUNSET, 10593fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_STEADYPHOTO, 10603fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_FIREWORKS, 10613fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_SPORTS, 10623fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_PARTY, 10633fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_CANDLELIGHT, 10643fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_BARCODE, 1065ff99a0add9700b423a0da3e332840e3907ae96a5Ruben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_HDR, 10663fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 10673fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10683fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static int convertSceneModeFromLegacy(String mode) { 10693fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (mode == null) { 10703fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED; 10713fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10723fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sLegacySceneModes, mode); 10733fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 10743fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return UNKNOWN_MODE; 10753fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10763fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sSceneModes[index]; 10773fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10783fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10793fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static String convertSceneModeToLegacy(int mode) { 10808c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin if (mode == CONTROL_SCENE_MODE_FACE_PRIORITY) { 10818c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin // OK: Let LegacyFaceDetectMapper handle turning face detection on/off 10828c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin return Parameters.SCENE_MODE_AUTO; 10838c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin } 10848c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin 10853fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sSceneModes, mode); 10863fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 10873fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return null; 10883fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10893fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sLegacySceneModes[index]; 10903fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10913fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10923fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static String[] sLegacyEffectMode = { 10933fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_NONE, 10943fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_MONO, 10953fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_NEGATIVE, 10963fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_SOLARIZE, 10973fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_SEPIA, 10983fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_POSTERIZE, 10993fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_WHITEBOARD, 11003fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_BLACKBOARD, 11013fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_AQUA, 11023fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 11033fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11043fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static int[] sEffectModes = { 11053fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_OFF, 11063fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_MONO, 11073fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_NEGATIVE, 11083fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_SOLARIZE, 11093fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_SEPIA, 11103fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_POSTERIZE, 11113fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_WHITEBOARD, 11123fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_BLACKBOARD, 11133fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_AQUA, 11143fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 11153fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11163fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static int convertEffectModeFromLegacy(String mode) { 11173fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (mode == null) { 11183fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return CameraCharacteristics.CONTROL_EFFECT_MODE_OFF; 11193fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11203fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sLegacyEffectMode, mode); 11213fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 11223fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return UNKNOWN_MODE; 11233fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11243fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sEffectModes[index]; 11253fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11263fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11273fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static String convertEffectModeToLegacy(int mode) { 11283fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sEffectModes, mode); 11293fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 11303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return null; 11313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sLegacyEffectMode[index]; 11333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11353e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk /** 1136df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Convert the ae antibanding mode from api1 into api2. 1137df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1138df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param mode the api1 mode, {@code null} is allowed and will return {@code -1}. 1139df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1140df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @return The api2 value, or {@code -1} by default if conversion failed 11415776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk */ 1142df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static int convertAntiBandingMode(String mode) { 11435776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk if (mode == null) { 11445776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return -1; 11455776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 1146df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1147df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin switch (mode) { 11485776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_OFF: { 11495776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_OFF; 11505776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11515776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_50HZ: { 11525776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_50HZ; 11535776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11545776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_60HZ: { 11555776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_60HZ; 11565776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11575776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_AUTO: { 11585776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_AUTO; 11595776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11605776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk default: { 1161df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Log.w(TAG, "convertAntiBandingMode - Unknown antibanding mode " + mode); 11625776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return -1; 11635776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11645776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11655776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11665776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 11675776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk /** 1168df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Convert the ae antibanding mode from api1 into api2. 1169df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1170df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param mode the api1 mode, {@code null} is allowed and will return {@code MODE_OFF}. 1171df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1172df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @return The api2 value, or {@code MODE_OFF} by default if conversion failed 11735776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk */ 1174df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin static int convertAntiBandingModeOrDefault(String mode) { 1175df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int antiBandingMode = convertAntiBandingMode(mode); 1176df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (antiBandingMode == -1) { 1177df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return CONTROL_AE_ANTIBANDING_MODE_OFF; 11785776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11795776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 1180df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return antiBandingMode; 1181df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 11825776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 11835776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk private static int[] convertAeFpsRangeToLegacy(Range<Integer> fpsRange) { 11845776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk int[] legacyFps = new int[2]; 11855776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk legacyFps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower(); 11865776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk legacyFps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper(); 11875776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return legacyFps; 11885776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11895776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 11905776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk /** 11913e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk * Return the stall duration for a given output jpeg size in nanoseconds. 11923e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk * 11933e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk * <p>An 8mp image is chosen to have a stall duration of 0.8 seconds.</p> 11943e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk */ 11953e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk private static long calculateJpegStallDuration(Camera.Size size) { 11963e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk long baseDuration = APPROXIMATE_CAPTURE_DELAY_MS * NS_PER_MS; // 200ms for capture 11973e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk long area = size.width * (long) size.height; 1198e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin long stallPerArea = APPROXIMATE_JPEG_ENCODE_TIME_MS * NS_PER_MS / 1199e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin APPROXIMATE_SENSOR_AREA_PX; // 600ms stall for 8mp 12003e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk return baseDuration + area * stallPerArea; 12013e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk } 12025776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 12035776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk /** 1204df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Set the legacy parameters using the {@link LegacyRequest legacy request}. 12055776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk * 1206df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>The legacy request's parameters are changed as a side effect of calling this 1207df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * method.</p> 12085776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk * 1209df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param request a non-{@code null} legacy request 12105776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk */ 1211df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin public static void convertRequestMetadata(LegacyRequest request) { 1212df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin LegacyRequestMapper.convertRequestMetadata(request); 1213a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1214a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 12156a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk private static final int[] sAllowedTemplates = { 12166a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CameraDevice.TEMPLATE_PREVIEW, 12176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CameraDevice.TEMPLATE_STILL_CAPTURE, 12186a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CameraDevice.TEMPLATE_RECORD, 12196a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // Disallowed templates in legacy mode: 12206a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // CameraDevice.TEMPLATE_VIDEO_SNAPSHOT, 12216a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, 12226a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // CameraDevice.TEMPLATE_MANUAL 12236a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk }; 12246a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1225a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /** 1226a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Create a request template 1227a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1228a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param c a non-{@code null} camera characteristics for this camera 1229a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param templateId a non-negative template ID 1230a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1231a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @return a non-{@code null} request template 1232a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1233a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @throws IllegalArgumentException if {@code templateId} was invalid 1234a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1235a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @see android.hardware.camera2.CameraDevice#TEMPLATE_MANUAL 1236a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 1237a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public static CameraMetadataNative createRequestTemplate( 1238a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraCharacteristics c, int templateId) { 12396a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (!ArrayUtils.contains(sAllowedTemplates, templateId)) { 1240a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin throw new IllegalArgumentException("templateId out of range"); 1241a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1242a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1243a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraMetadataNative m = new CameraMetadataNative(); 1244a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1245a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 1246a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * NOTE: If adding new code here and it needs to query the static info, 1247a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * query the camera characteristics, so we can reuse this for api2 code later 1248a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * to create our own templates in the framework 1249a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 1250a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 12516a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 12526a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * control.* 12536a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 12546a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1255733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // control.awbMode 1256733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO); 1257733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // AWB is always unconditionally available in API1 devices 1258a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 12596a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeAntibandingMode 12606a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CONTROL_AE_ANTIBANDING_MODE_AUTO); 12616a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12626a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeExposureCompensation 12636a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0); 12646a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12656a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeLock 12666a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_LOCK, false); 12676a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12686a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aePrecaptureTrigger 12696a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_IDLE); 12706a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12716a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.afTrigger 12726a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_IDLE); 12736a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12746a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.awbMode 12756a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AWB_MODE, CONTROL_AWB_MODE_AUTO); 12766a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12776a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.awbLock 12786a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AWB_LOCK, false); 12796a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12806a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeRegions, control.awbRegions, control.afRegions 12816a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk { 12826a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Rect activeArray = c.get(SENSOR_INFO_ACTIVE_ARRAY_SIZE); 12836a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk MeteringRectangle[] activeRegions = new MeteringRectangle[] { 12846a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk new MeteringRectangle(/*x*/0, /*y*/0, /*width*/activeArray.width() - 1, 1285e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk /*height*/activeArray.height() - 1,/*weight*/0)}; 12866a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_REGIONS, activeRegions); 12876a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AWB_REGIONS, activeRegions); 12886a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AF_REGIONS, activeRegions); 12896a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 12906a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12916a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.captureIntent 12927336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin { 12937336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin int captureIntent; 12947336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin switch (templateId) { 12957336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CameraDevice.TEMPLATE_PREVIEW: 12967336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW; 12977336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 12987336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CameraDevice.TEMPLATE_STILL_CAPTURE: 12997336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 13007336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 13017336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CameraDevice.TEMPLATE_RECORD: 13027336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 13037336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 13047336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin default: 13057336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin // Can't get anything else since it's guarded by the IAE check 13067336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin throw new AssertionError("Impossible; keep in sync with sAllowedTemplates"); 13077336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 13087336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin m.set(CaptureRequest.CONTROL_CAPTURE_INTENT, captureIntent); 13097336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 13106a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1311a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // control.aeMode 1312a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin m.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 1313a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // AE is always unconditionally available in API1 devices 1314a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 13156a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.mode 13166a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_MODE, CONTROL_MODE_AUTO); 13176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1318a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // control.afMode 1319a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin { 1320a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Float minimumFocusDistance = c.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE); 1321a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1322a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin int afMode; 1323a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin if (minimumFocusDistance != null && 1324a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin minimumFocusDistance == LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS) { 1325a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // Cannot control auto-focus with fixed-focus cameras 1326a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin afMode = CameraMetadata.CONTROL_AF_MODE_OFF; 1327a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } else { 1328a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // If a minimum focus distance is reported; the camera must have AF 1329a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin afMode = CameraMetadata.CONTROL_AF_MODE_AUTO; 13306a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13316a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (templateId == CameraDevice.TEMPLATE_RECORD || 13326a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk templateId == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) { 13336a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES), 13346a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CONTROL_AF_MODE_CONTINUOUS_VIDEO)) { 13356a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO; 13366a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13376a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } else if (templateId == CameraDevice.TEMPLATE_PREVIEW || 13386a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) { 13396a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES), 13406a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CONTROL_AF_MODE_CONTINUOUS_PICTURE)) { 13416a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE; 13426a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13436a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 1344a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1345a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1346a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 1347d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "createRequestTemplate (templateId=" + templateId + ")," + 1348d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin " afMode=" + afMode + ", minimumFocusDistance=" + minimumFocusDistance); 1349d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 1350d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 1351a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin m.set(CaptureRequest.CONTROL_AF_MODE, afMode); 1352a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1353a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 13546a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk { 13556a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeTargetFpsRange 13566a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Range<Integer>[] availableFpsRange = c. 13576a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 13586a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13596a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // Pick FPS range with highest max value, tiebreak on higher min value 13606a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Range<Integer> bestRange = availableFpsRange[0]; 13616a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk for (Range<Integer> r : availableFpsRange) { 13626a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (bestRange.getUpper() < r.getUpper()) { 13636a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk bestRange = r; 13646a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } else if (bestRange.getUpper() == r.getUpper() && 13656a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk bestRange.getLower() < r.getLower()) { 13666a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk bestRange = r; 13676a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13686a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13696a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestRange); 13706a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13716a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1372981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin // control.sceneMode -- DISABLED is always available 1373981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin m.set(CaptureRequest.CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_DISABLED); 1374981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin 13756a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 13766a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * statistics.* 13776a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 13786a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13796a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // statistics.faceDetectMode 13806a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, STATISTICS_FACE_DETECT_MODE_OFF); 13816a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13826a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 13836a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * flash.* 13846a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 13856a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13866a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // flash.mode 13876a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.FLASH_MODE, FLASH_MODE_OFF); 13886a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13896a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 1390e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk * noiseReduction.* 1391e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk */ 1392e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk m.set(CaptureRequest.NOISE_REDUCTION_MODE, NOISE_REDUCTION_MODE_FAST); 1393e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 1394e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk /* 13956a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * lens.* 13966a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 13976a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13986a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // lens.focalLength 13996a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.LENS_FOCAL_LENGTH, 14006a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk c.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0]); 14016a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 14023adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala /* 14033adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala * jpeg.* 14043adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala */ 14053adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala 14063adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala // jpeg.thumbnailSize - set smallest non-zero size if possible 14073adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala Size[] sizes = c.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES); 14083adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala m.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, (sizes.length > 1) ? sizes[1] : sizes[0]); 14093adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala 1410a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // TODO: map other request template values 1411a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin return m; 14125776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 14136c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14146c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin private static int[] getTagsForKeys(Key<?>[] keys) { 14156c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin int[] tags = new int[keys.length]; 14166c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14176c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin for (int i = 0; i < keys.length; ++i) { 14186c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin tags[i] = keys[i].getNativeKey().getTag(); 14196c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14206c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14216c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin return tags; 14226c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14236c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14246c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin private static int[] getTagsForKeys(CaptureRequest.Key<?>[] keys) { 14256c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin int[] tags = new int[keys.length]; 14266c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14276c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin for (int i = 0; i < keys.length; ++i) { 14286c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin tags[i] = keys[i].getNativeKey().getTag(); 14296c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14306c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14316c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin return tags; 14326c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14336c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14346c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin private static int[] getTagsForKeys(CaptureResult.Key<?>[] keys) { 14356c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin int[] tags = new int[keys.length]; 14366c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14376c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin for (int i = 0; i < keys.length; ++i) { 14386c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin tags[i] = keys[i].getNativeKey().getTag(); 14396c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14406c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14416c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin return tags; 14426c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 144383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 144483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** 144583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Convert the requested AF mode into its equivalent supported parameter. 144683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 144783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param mode {@code CONTROL_AF_MODE} 144883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param supportedFocusModes list of camera1's supported focus modes 144983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @return the stringified af mode, or {@code null} if its not supported 145083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 145183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin static String convertAfModeToLegacy(int mode, List<String> supportedFocusModes) { 145283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (supportedFocusModes == null || supportedFocusModes.isEmpty()) { 145383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, "No focus modes supported; API1 bug"); 145483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return null; 145583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 145683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 145783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String param = null; 145883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin switch (mode) { 145983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_AUTO: 146083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_AUTO; 146183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 146283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_CONTINUOUS_PICTURE: 146383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_CONTINUOUS_PICTURE; 146483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 146583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_CONTINUOUS_VIDEO: 146683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_CONTINUOUS_VIDEO; 146783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 146883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_EDOF: 146983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_EDOF; 147083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 147183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_MACRO: 147283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_MACRO; 147383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 147483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_OFF: 147583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (supportedFocusModes.contains(Parameters.FOCUS_MODE_FIXED)) { 147683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_FIXED; 147783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } else { 147883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_INFINITY; 147983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 148083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 148183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 148283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (!supportedFocusModes.contains(param)) { 148383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // Weed out bad user input by setting to the first arbitrary focus mode 148483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String defaultMode = supportedFocusModes.get(0); 148583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, 148683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String.format( 148783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "convertAfModeToLegacy - ignoring unsupported mode %d, " + 148883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "defaulting to %s", mode, defaultMode)); 148983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = defaultMode; 149083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 149183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 149283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return param; 149383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 14944961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin} 1495