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, 178c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh new int[] { COLOR_CORRECTION_ABERRATION_MODE_FAST, 179c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY }); 180e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 181e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * control.ae* 182e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 183a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mapControlAe(m, p); 184e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 18583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * control.af* 18683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 18783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin mapControlAf(m, p); 18883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /* 189e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * control.awb* 190e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 191a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin mapControlAwb(m, p); 192e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 193e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * control.* 194e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * - Anything that doesn't have a set of related fields 195e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 196e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin mapControlOther(m, p); 197e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 198e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * lens.* 199e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 2001788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin mapLens(m, p); 201e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 202e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * flash.* 203e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 2041788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin mapFlash(m, p); 2051dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk /* 2061dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk * jpeg.* 2071dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk */ 2081dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk mapJpeg(m, p); 209e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 210e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 211442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * noiseReduction.* 212442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 213442395751d46aa0f569ad479202a84713a260be0Igor Murashkin m.set(NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, 214c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh new int[] { NOISE_REDUCTION_MODE_FAST, 215c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh NOISE_REDUCTION_MODE_HIGH_QUALITY}); 216442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 217442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 218df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.* 219df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 220df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin mapScaler(m, p); 221df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 222df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 223df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * sensor.* 224df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 225df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin mapSensor(m, p); 226df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 227df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 2280a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * statistics.* 2290a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 2300a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin mapStatistics(m, p); 2310a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 2320a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 233e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * sync.* 234e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 235e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin mapSync(m, p); 2367f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 2377f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk /* 2387f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk * info.supportedHardwareLevel 2397f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk */ 2407ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin m.set(INFO_SUPPORTED_HARDWARE_LEVEL, INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY); 2417f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 2427f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk /* 2437f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk * scaler.availableStream*, scaler.available*Durations, sensor.info.maxFrameDuration 2447f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk */ 2457f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk mapScalerStreamConfigs(m, p); 2467f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 247d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin // Order matters below: Put this last so that we can read the metadata set previously 248d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 249d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin /* 250d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin * request.* 251d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin */ 252d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin mapRequest(m, p); 253d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 2544961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 2554961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 256df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapScalerStreamConfigs(CameraMetadataNative m, Camera.Parameters p) { 2574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 2584961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin ArrayList<StreamConfiguration> availableStreamConfigs = new ArrayList<>(); 2594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin /* 2604961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Implementation-defined (preview, recording, etc) -> use camera1 preview sizes 2614961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * YUV_420_888 cpu callbacks -> use camera1 preview sizes 2624961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Other preview callbacks (CPU) -> use camera1 preview sizes 2634961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * JPEG still capture -> use camera1 still capture sizes 2644961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * 2654961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Use platform-internal format constants here, since StreamConfigurationMap does the 2664961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * remapping to public format constants. 2674961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */ 268df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<Camera.Size> previewSizes = p.getSupportedPreviewSizes(); 269a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin List<Camera.Size> jpegSizes = p.getSupportedPictureSizes(); 270a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin /* 271a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * Work-around for b/17589233: 272a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - Some HALs's largest preview size aspect ratio does not match the largest JPEG size AR 273a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - This causes a large amount of problems with focus/metering because it's relative to 274a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * preview, making the difference between the JPEG and preview viewport inaccessible 275a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - This boils down to metering or focusing areas being "arbitrarily" cropped 276a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * in the capture result. 277a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * - Work-around the HAL limitations by removing all of the largest preview sizes 278a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin * until we get one with the same aspect ratio as the jpeg size. 279a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin */ 280a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin { 281a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin SizeAreaComparator areaComparator = new SizeAreaComparator(); 282a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 283a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Sort preview to min->max 284a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Collections.sort(previewSizes, areaComparator); 285a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 286a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Camera.Size maxJpegSize = SizeAreaComparator.findLargestByArea(jpegSizes); 287a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin float jpegAspectRatio = maxJpegSize.width * 1.0f / maxJpegSize.height; 288a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 289a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 290a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Log.v(TAG, String.format("mapScalerStreamConfigs - largest JPEG area %dx%d, AR=%f", 291a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin maxJpegSize.width, maxJpegSize.height, jpegAspectRatio)); 292a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 293a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 294a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Now remove preview sizes from the end (largest->smallest) until aspect ratio matches 295a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin while (!previewSizes.isEmpty()) { 296a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin int index = previewSizes.size() - 1; // max is always at the end 297a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Camera.Size size = previewSizes.get(index); 298a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 299a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin float previewAspectRatio = size.width * 1.0f / size.height; 300a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 301a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin if (Math.abs(jpegAspectRatio - previewAspectRatio) >= 302a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin PREVIEW_ASPECT_RATIO_TOLERANCE) { 303a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin previewSizes.remove(index); // Assume removing from end is O(1) 304a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 305a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 306a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Log.v(TAG, String.format( 307a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin "mapScalerStreamConfigs - removed preview size %dx%d, AR=%f " 308a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin + "was not the same", 309a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin size.width, size.height, previewAspectRatio)); 310a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 311a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } else { 312a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin break; 313a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 314a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 315a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 316a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin if (previewSizes.isEmpty()) { 317a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Fall-back to the original faulty behavior, but at least work 318a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Log.w(TAG, "mapScalerStreamConfigs - failed to find any preview size matching " + 319a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin "JPEG aspect ratio " + jpegAspectRatio); 320a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin previewSizes = p.getSupportedPreviewSizes(); 321a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 322a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 323a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin // Sort again, this time in descending order max->min 324a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Collections.sort(previewSizes, Collections.reverseOrder(areaComparator)); 325a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin } 326a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin 3274961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, 3284961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, previewSizes); 3294961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, 3304961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin ImageFormat.YUV_420_888, previewSizes); 3314961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin for (int format : p.getSupportedPreviewFormats()) { 332ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala if (ImageFormat.isPublicFormat(format) && format != ImageFormat.NV21) { 3334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, format, previewSizes); 334a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala } else if (DEBUG) { 3354961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin /* 3364961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Do not add any formats unknown to us 3374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * (since it would fail runtime checks in StreamConfigurationMap) 3384961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */ 339ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala Log.v(TAG, 340ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala String.format("mapStreamConfigs - Skipping format %x", format)); 3414961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 3424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 3433e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 3444961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin appendStreamConfig(availableStreamConfigs, 3454961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin HAL_PIXEL_FORMAT_BLOB, p.getSupportedPictureSizes()); 346e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 347e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * scaler.availableStreamConfigurations 348e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3494961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin m.set(SCALER_AVAILABLE_STREAM_CONFIGURATIONS, 3504961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin availableStreamConfigs.toArray(new StreamConfiguration[0])); 3513e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 352e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 353e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * scaler.availableMinFrameDurations 354e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3553e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk // No frame durations available 3563e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk m.set(SCALER_AVAILABLE_MIN_FRAME_DURATIONS, new StreamConfigurationDuration[0]); 3573e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 3583e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk StreamConfigurationDuration[] jpegStalls = 3593e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk new StreamConfigurationDuration[jpegSizes.size()]; 3603e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk int i = 0; 3615776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk long longestStallDuration = -1; 3623e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk for (Camera.Size s : jpegSizes) { 3635776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk long stallDuration = calculateJpegStallDuration(s); 3643e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk jpegStalls[i++] = new StreamConfigurationDuration(HAL_PIXEL_FORMAT_BLOB, s.width, 3655776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk s.height, stallDuration); 3665776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk if (longestStallDuration < stallDuration) { 3675776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk longestStallDuration = stallDuration; 3685776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 3693e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk } 370e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 371e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * scaler.availableStallDurations 372e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3733e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk // Set stall durations for jpeg, other formats use default stall duration 3743e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk m.set(SCALER_AVAILABLE_STALL_DURATIONS, jpegStalls); 3755776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 376e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 377e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * sensor.info.maxFrameDuration 378e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 3795776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk m.set(SENSOR_INFO_MAX_FRAME_DURATION, longestStallDuration); 3805776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 3815776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 3825776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk @SuppressWarnings({"unchecked"}) 383a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private static void mapControlAe(CameraMetadataNative m, Camera.Parameters p) { 384a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 385a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * control.aeAvailableAntiBandingModes 386a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 3875776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk List<String> antiBandingModes = p.getSupportedAntibanding(); 388df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (antiBandingModes != null && antiBandingModes.size() > 0) { // antibanding is optional 389df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] modes = new int[antiBandingModes.size()]; 3905776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk int j = 0; 3915776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk for (String mode : antiBandingModes) { 3925776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk int convertedMode = convertAntiBandingMode(mode); 393a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG && convertedMode == -1) { 394ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala Log.v(TAG, "Antibanding mode " + ((mode == null) ? "NULL" : mode) + 3955776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk " not supported, skipping..."); 3965776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } else { 3975776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk modes[j++] = convertedMode; 3985776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 3995776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 4005776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk m.set(CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, Arrays.copyOf(modes, j)); 401df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else { 402df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, new int[0]); 4035776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 404a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 405a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 406df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control.aeAvailableTargetFpsRanges 407a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 408df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 409df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<int[]> fpsRanges = p.getSupportedPreviewFpsRange(); 410df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (fpsRanges == null) { 411df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin throw new AssertionError("Supported FPS ranges cannot be null."); 412df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 413df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int rangesSize = fpsRanges.size(); 414df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (rangesSize <= 0) { 415df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin throw new AssertionError("At least one FPS range must be supported."); 416df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 417df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Range<Integer>[] ranges = new Range[rangesSize]; 418df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int i = 0; 419df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin for (int[] r : fpsRanges) { 420ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh ranges[i++] = Range.create( 421ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh (int) Math.floor(r[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] / 1000.0), 422ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh (int) Math.ceil(r[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] / 1000.0)); 423df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 424df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, ranges); 425a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 426a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 427df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 428df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control.aeAvailableModes 429df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 430df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 431df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<String> flashModes = p.getSupportedFlashModes(); 432df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 433df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin String[] flashModeStrings = new String[] { 43449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin Camera.Parameters.FLASH_MODE_OFF, 435df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_AUTO, 436df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_ON, 437df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_RED_EYE, 438df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Map these manually 439df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters.FLASH_MODE_TORCH, 440a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin }; 441df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] flashModeInts = new int[] { 442df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON, 443df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON_AUTO_FLASH, 44449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin CONTROL_AE_MODE_ON_ALWAYS_FLASH, 445df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE 446df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin }; 447df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] aeAvail = ArrayUtils.convertStringListToIntArray( 448df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin flashModes, flashModeStrings, flashModeInts); 449df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 450df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // No flash control -> AE is always on 451df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (aeAvail == null || aeAvail.length == 0) { 452df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin aeAvail = new int[] { 453df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CONTROL_AE_MODE_ON 454df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin }; 455df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 456a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 457df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Note that AE_MODE_OFF is never available. 458df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(CONTROL_AE_AVAILABLE_MODES, aeAvail); 459df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 4603e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4613e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /* 4623e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * control.aeCompensationRanges 4633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin */ 4643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 4653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin int min = p.getMinExposureCompensation(); 4663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin int max = p.getMaxExposureCompensation(); 4673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin m.set(CONTROL_AE_COMPENSATION_RANGE, Range.create(min, max)); 4693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 4703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /* 4723e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * control.aeCompensationStep 4733e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin */ 4743e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 4753e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin float step = p.getExposureCompensationStep(); 4763e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4773e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin m.set(CONTROL_AE_COMPENSATION_STEP, ParamsUtils.createRational(step)); 4783e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 479d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 480d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh /* 481d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh * control.aeLockAvailable 482d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh */ 483d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh { 484d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh boolean aeLockAvailable = p.isAutoExposureLockSupported(); 485d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 486d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AE_LOCK_AVAILABLE, aeLockAvailable); 487d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 488a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 489a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 49083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 49183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin @SuppressWarnings({"unchecked"}) 49283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin private static void mapControlAf(CameraMetadataNative m, Camera.Parameters p) { 49383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /* 49483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * control.afAvailableModes 49583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 49683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 49783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin List<String> focusModes = p.getSupportedFocusModes(); 49883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 49983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String[] focusModeStrings = new String[] { 50083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_AUTO, 50183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE, 50283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO, 50383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_EDOF, 50483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_INFINITY, 50583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_MACRO, 50683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Camera.Parameters.FOCUS_MODE_FIXED, 50783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin }; 50883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 50983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int[] focusModeInts = new int[] { 51083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_AUTO, 51183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_CONTINUOUS_PICTURE, 51283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_CONTINUOUS_VIDEO, 51383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_EDOF, 51483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_OFF, 51583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_MACRO, 51683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin CONTROL_AF_MODE_OFF 51783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin }; 51883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 51983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin List<Integer> afAvail = ArrayUtils.convertStringListToIntList( 52083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin focusModes, focusModeStrings, focusModeInts); 52183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 52283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // No AF modes supported? That's unpossible! 52383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (afAvail == null || afAvail.size() == 0) { 52483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, "No AF modes supported (HAL bug); defaulting to AF_MODE_OFF only"); 52583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin afAvail = new ArrayList<Integer>(/*capacity*/1); 52683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin afAvail.add(CONTROL_AF_MODE_OFF); 52783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 52883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 52983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin m.set(CONTROL_AF_AVAILABLE_MODES, ArrayUtils.toIntArray(afAvail)); 53083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 531a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 53283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "mapControlAf - control.afAvailableModes set to " + 53383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin ListUtils.listToString(afAvail)); 53483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 53583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 53683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 53783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 538a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin private static void mapControlAwb(CameraMetadataNative m, Camera.Parameters p) { 539733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 540733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * control.awbAvailableModes 541733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 542733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 543733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 544733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin List<String> wbModes = p.getSupportedWhiteBalance(); 545733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 546733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin String[] wbModeStrings = new String[] { 547733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_AUTO , 548733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_INCANDESCENT , 549733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_FLUORESCENT , 550733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT , 551733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_DAYLIGHT , 552733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT , 553733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_TWILIGHT , 554733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Camera.Parameters.WHITE_BALANCE_SHADE , 555733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin }; 556733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 557733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin int[] wbModeInts = new int[] { 558733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_AUTO, 559733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_INCANDESCENT , 560733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_FLUORESCENT , 561733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_WARM_FLUORESCENT , 562733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_DAYLIGHT , 563733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_CLOUDY_DAYLIGHT , 564733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_TWILIGHT , 565733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin CONTROL_AWB_MODE_SHADE , 566733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // Note that CONTROL_AWB_MODE_OFF is unsupported 567733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin }; 568733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 569733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin List<Integer> awbAvail = ArrayUtils.convertStringListToIntList( 570733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin wbModes, wbModeStrings, wbModeInts); 571733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 572733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // No AWB modes supported? That's unpossible! 573733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin if (awbAvail == null || awbAvail.size() == 0) { 574733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.w(TAG, "No AWB modes supported (HAL bug); defaulting to AWB_MODE_AUTO only"); 575733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin awbAvail = new ArrayList<Integer>(/*capacity*/1); 576733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin awbAvail.add(CONTROL_AWB_MODE_AUTO); 577733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 578733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 579733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(CONTROL_AWB_AVAILABLE_MODES, ArrayUtils.toIntArray(awbAvail)); 580733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 581a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 582733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.v(TAG, "mapControlAwb - control.awbAvailableModes set to " + 583733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin ListUtils.listToString(awbAvail)); 584733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 585d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 586d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 587d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh /* 588d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh * control.awbLockAvailable 589d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh */ 590d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh { 591d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh boolean awbLockAvailable = p.isAutoWhiteBalanceLockSupported(); 592d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 593d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AWB_LOCK_AVAILABLE, awbLockAvailable); 594d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 595a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 5965776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 5975776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 598e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapControlOther(CameraMetadataNative m, Camera.Parameters p) { 5990cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh /* 6000a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * android.control.availableVideoStabilizationModes 6010a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 6020a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin { 6030a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin int stabModes[] = p.isVideoStabilizationSupported() ? 6040a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin new int[] { CONTROL_VIDEO_STABILIZATION_MODE_OFF, 6050a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin CONTROL_VIDEO_STABILIZATION_MODE_ON } : 6060a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin new int[] { CONTROL_VIDEO_STABILIZATION_MODE_OFF }; 6070a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 6080a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin m.set(CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, stabModes); 6090a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 6100a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 6110a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 6120cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh * android.control.maxRegions 6130cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh */ 614d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin final int AE = 0, AWB = 1, AF = 2; 615d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 6160cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh int[] maxRegions = new int[3]; 617d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AE] = p.getMaxNumMeteringAreas(); 618d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AWB] = 0; // AWB regions not supported in API1 619d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AF] = p.getMaxNumFocusAreas(); 620d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 621d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin if (LIE_ABOUT_AE_MAX_REGIONS) { 622d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AE] = 0; 623d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin } 624d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin if (LIE_ABOUT_AF_MAX_REGIONS) { 625d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin maxRegions[AF] = 0; 626d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin } 627d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 6280cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh m.set(CONTROL_MAX_REGIONS, maxRegions); 629d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin 6303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /* 6313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk * android.control.availableEffects 6323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk */ 6333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk List<String> effectModes = p.getSupportedColorEffects(); 6343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int[] supportedEffectModes = (effectModes == null) ? new int[0] : 6353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk ArrayUtils.convertStringListToIntArray(effectModes, sLegacyEffectMode, 6363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk sEffectModes); 6373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk m.set(CONTROL_AVAILABLE_EFFECTS, supportedEffectModes); 6383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 6393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /* 6403fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk * android.control.availableSceneModes 6413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk */ 642d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh int maxNumDetectedFaces = p.getMaxNumDetectedFaces(); 6433fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk List<String> sceneModes = p.getSupportedSceneModes(); 6448c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin List<Integer> supportedSceneModes = 6458c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin ArrayUtils.convertStringListToIntList(sceneModes, sLegacySceneModes, sSceneModes); 646d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 647d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh // Special case where the only scene mode listed is AUTO => no scene mode 648d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (sceneModes != null && sceneModes.size() == 1 && 6495f391188dc67c80f89cbab737c552ba7373586e4wei zheng dong sceneModes.get(0).equals(Parameters.SCENE_MODE_AUTO)) { 650d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh supportedSceneModes = null; 6518c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin } 652d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 653d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh boolean sceneModeSupported = true; 654d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (supportedSceneModes == null && maxNumDetectedFaces == 0) { 655d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh sceneModeSupported = false; 6568c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin } 657d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 658d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (sceneModeSupported) { 659d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (supportedSceneModes == null) { 660d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh supportedSceneModes = new ArrayList<Integer>(); 661d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 662d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (maxNumDetectedFaces > 0) { // always supports FACE_PRIORITY when face detecting 663d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh supportedSceneModes.add(CONTROL_SCENE_MODE_FACE_PRIORITY); 664d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 665d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh // Remove all DISABLED occurrences 666d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh if (supportedSceneModes.contains(CONTROL_SCENE_MODE_DISABLED)) { 667d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh while(supportedSceneModes.remove(new Integer(CONTROL_SCENE_MODE_DISABLED))) {} 668d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 669d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AVAILABLE_SCENE_MODES, ArrayUtils.toIntArray(supportedSceneModes)); 670d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } else { 671d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AVAILABLE_SCENE_MODES, new int[] {CONTROL_SCENE_MODE_DISABLED}); 672d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh } 673d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh 674d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh /* 675d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh * android.control.availableModes 676d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh */ 677d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh m.set(CONTROL_AVAILABLE_MODES, sceneModeSupported ? 678d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh new int[] { CONTROL_MODE_AUTO, CONTROL_MODE_USE_SCENE_MODE } : 679d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh new int[] { CONTROL_MODE_AUTO }); 6804961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 6814961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin 6821788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin private static void mapLens(CameraMetadataNative m, Camera.Parameters p) { 6831788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin /* 6841788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin * We can tell if the lens is fixed focus; 6851788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin * but if it's not, we can't tell the minimum focus distance, so leave it null then. 6861788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin */ 687a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 688d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "mapLens - focus-mode='" + p.getFocusMode() + "'"); 689d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 690d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 691d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin if (Camera.Parameters.FOCUS_MODE_FIXED.equals(p.getFocusMode())) { 692e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 693e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * lens.info.minimumFocusDistance 694e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 6951788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin m.set(LENS_INFO_MINIMUM_FOCUS_DISTANCE, LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS); 696d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 697a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 698d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "mapLens - lens.info.minimumFocusDistance = 0"); 699d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 700d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } else { 701a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 702d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "mapLens - lens.info.minimumFocusDistance is unknown"); 703d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 7041788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin } 7056a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 7066a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk float[] focalLengths = new float[] { p.getFocalLength() }; 7076a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(LENS_INFO_AVAILABLE_FOCAL_LENGTHS, focalLengths); 7081788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin } 7091788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin 7101788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin private static void mapFlash(CameraMetadataNative m, Camera.Parameters p) { 7111788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin boolean flashAvailable = false; 7121788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin List<String> supportedFlashModes = p.getSupportedFlashModes(); 713df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 7141788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin if (supportedFlashModes != null) { 7151788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin // If only 'OFF' is available, we don't really have flash support 716df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin flashAvailable = !ListUtils.listElementsEqualTo( 717df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin supportedFlashModes, Camera.Parameters.FLASH_MODE_OFF); 718a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 719a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 720e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 721e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * flash.info.available 722e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 7231788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin m.set(FLASH_INFO_AVAILABLE, flashAvailable); 7241788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin } 7251788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin 7261dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk private static void mapJpeg(CameraMetadataNative m, Camera.Parameters p) { 7271dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk List<Camera.Size> thumbnailSizes = p.getSupportedJpegThumbnailSizes(); 7281dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 7291dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (thumbnailSizes != null) { 7301dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Size[] sizes = convertSizeListToArray(thumbnailSizes); 731a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin Arrays.sort(sizes, new android.hardware.camera2.utils.SizeAreaComparator()); 7321dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk m.set(JPEG_AVAILABLE_THUMBNAIL_SIZES, sizes); 7331dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 7341dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 7351dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 736e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapRequest(CameraMetadataNative m, Parameters p) { 737e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 738e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.availableCapabilities 739e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 740e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin int[] capabilities = { REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE }; 741e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_AVAILABLE_CAPABILITIES, capabilities); 742e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 743e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 7446c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * request.availableCharacteristicsKeys 7456c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin */ 7466c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin { 7476c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin // TODO: check if the underlying key is supported before listing a key as available 7486c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 7496c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin // Note: We only list public keys. Native HALs should list ALL keys regardless of visibility. 7506c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 7516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin Key<?> availableKeys[] = new Key<?>[] { 752442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES , 7536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES , 7546c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES , 7556c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES , 7566c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE , 7576c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP , 75871c605c54abfb182e2b38142f3cf98a6fc1ea75cYin-Chia Yeh CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE , 7596c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES , 7606c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS , 761854b523e11ecfb7393d2596a912668a10bae9b41Yin-Chia Yeh CameraCharacteristics.CONTROL_AVAILABLE_MODES , 7626c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES , 7636c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES , 7646c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES , 76571c605c54abfb182e2b38142f3cf98a6fc1ea75cYin-Chia Yeh CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE , 7666c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.CONTROL_MAX_REGIONS , 7676c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.FLASH_INFO_AVAILABLE , 7686c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL , 7696c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES , 7706c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.LENS_FACING , 7716c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS , 772442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES , 7736c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES , 7746c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS , 7756c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT , 7766c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH , 7776c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM , 7786c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin// CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP , 7796c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SCALER_CROPPING_TYPE , 7806c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES , 7816c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE , 7826c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE , 7836c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE , 784442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE , 7856c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SENSOR_ORIENTATION , 7866c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES , 7876c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT , 7886c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CameraCharacteristics.SYNC_MAX_LATENCY , 7896c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin }; 790d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin List<Key<?>> characteristicsKeys = new ArrayList<>(Arrays.asList(availableKeys)); 791d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 792d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin /* 793d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin * Add the conditional keys 794d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin */ 795d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin if (m.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE) != null) { 796d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin characteristicsKeys.add(LENS_INFO_MINIMUM_FOCUS_DISTANCE); 797d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 798d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 799d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin m.set(REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, 800d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin getTagsForKeys(characteristicsKeys.toArray(new Key<?>[0]))); 8016c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 8026c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 8036c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin /* 8046c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * request.availableRequestKeys 8056c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin */ 8066c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin { 807808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureRequest.Key<?> defaultAvailableKeys[] = new CaptureRequest.Key<?>[] { 808442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, 8096c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, 8106c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 8116c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_LOCK, 8126c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_MODE, 8136c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, 8146c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AF_MODE, 8156c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AF_TRIGGER, 8166c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AWB_LOCK, 8176c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_AWB_MODE, 8186c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_CAPTURE_INTENT, 8196c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_EFFECT_MODE, 8206c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_MODE, 8216c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_SCENE_MODE, 8226c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, 8236c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.FLASH_MODE, 8246c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_GPS_COORDINATES, 8256c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_GPS_PROCESSING_METHOD, 8266c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_GPS_TIMESTAMP, 8276c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_ORIENTATION, 8286c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_QUALITY, 8296c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_THUMBNAIL_QUALITY, 8306c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.JPEG_THUMBNAIL_SIZE, 8316c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.LENS_FOCAL_LENGTH, 832442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureRequest.NOISE_REDUCTION_MODE, 8336c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.SCALER_CROP_REGION, 8346c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureRequest.STATISTICS_FACE_DETECT_MODE, 8356c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin }; 836808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh ArrayList<CaptureRequest.Key<?>> availableKeys = 837808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new ArrayList<CaptureRequest.Key<?>>(Arrays.asList(defaultAvailableKeys)); 838808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 839808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumMeteringAreas() > 0) { 840808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureRequest.CONTROL_AE_REGIONS); 841808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 842808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumFocusAreas() > 0) { 843808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureRequest.CONTROL_AF_REGIONS); 844808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 845808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 846808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureRequest.Key<?> availableRequestKeys[] = 847808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new CaptureRequest.Key<?>[availableKeys.size()]; 848808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.toArray(availableRequestKeys); 849808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh m.set(REQUEST_AVAILABLE_REQUEST_KEYS, getTagsForKeys(availableRequestKeys)); 8506c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 8516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 8526c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin /* 8536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin * request.availableResultKeys 8546c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin */ 8556c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin { 856808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureResult.Key<?> defaultAvailableKeys[] = new CaptureResult.Key<?>[] { 857442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureResult.COLOR_CORRECTION_ABERRATION_MODE , 8586c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_ANTIBANDING_MODE , 8596c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION , 8606c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_LOCK , 8616c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AE_MODE , 8626c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AF_MODE , 8636c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AF_STATE , 8646c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AWB_MODE , 8656c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_AWB_LOCK , 8666c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.CONTROL_MODE , 8676c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.FLASH_MODE , 8686c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_GPS_COORDINATES , 8696c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_GPS_PROCESSING_METHOD , 8706c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_GPS_TIMESTAMP , 8716c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_ORIENTATION , 8726c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_QUALITY , 8736c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.JPEG_THUMBNAIL_QUALITY , 8746c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.LENS_FOCAL_LENGTH , 875442395751d46aa0f569ad479202a84713a260be0Igor Murashkin CaptureResult.NOISE_REDUCTION_MODE , 8766c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.REQUEST_PIPELINE_DEPTH , 8776c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.SCALER_CROP_REGION , 8786c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.SENSOR_TIMESTAMP , 8796c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin CaptureResult.STATISTICS_FACE_DETECT_MODE , 8806c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin// CaptureResult.STATISTICS_FACES , 8816c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin }; 882808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh List<CaptureResult.Key<?>> availableKeys = 883808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new ArrayList<CaptureResult.Key<?>>(Arrays.asList(defaultAvailableKeys)); 884808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 885808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumMeteringAreas() > 0) { 886808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureResult.CONTROL_AE_REGIONS); 887808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 888808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh if (p.getMaxNumFocusAreas() > 0) { 889808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.add(CaptureResult.CONTROL_AF_REGIONS); 890808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh } 891808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh 892808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh CaptureResult.Key<?> availableResultKeys[] = 893808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh new CaptureResult.Key<?>[availableKeys.size()]; 894808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh availableKeys.toArray(availableResultKeys); 895808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh m.set(REQUEST_AVAILABLE_RESULT_KEYS, getTagsForKeys(availableResultKeys)); 8966c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 8976c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 8986c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin /* 899e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.maxNumOutputStreams 900e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 901e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin int[] outputStreams = { 902e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* RAW */ 903e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_RAW, 904e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* Processed & Not-Stalling */ 905e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC, 906e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* Processed & Stalling */ 907e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC_STALL, 908e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin }; 909e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_MAX_NUM_OUTPUT_STREAMS, outputStreams); 910e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 911e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 912e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.maxNumInputStreams 913e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 914e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_MAX_NUM_INPUT_STREAMS, REQUEST_MAX_NUM_INPUT_STREAMS_COUNT); 915e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 916e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 917733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * request.partialResultCount 918733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 919733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(REQUEST_PARTIAL_RESULT_COUNT, 1); // No partial results supported 920733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 921733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 922e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * request.pipelineMaxDepth 923e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 924e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(REQUEST_PIPELINE_MAX_DEPTH, 925e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin (byte)(REQUEST_PIPELINE_MAX_DEPTH_HAL1 + REQUEST_PIPELINE_MAX_DEPTH_OURS)); 926e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin } 927e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 928df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapScaler(CameraMetadataNative m, Parameters p) { 929df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 930df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.availableMaxDigitalZoom 931df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 932df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, ParameterUtils.getMaxZoomRatio(p)); 933df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 934df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 935df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.croppingType = CENTER_ONLY 936df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 937df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SCALER_CROPPING_TYPE, SCALER_CROPPING_TYPE_CENTER_ONLY); 938df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 939df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 940df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapSensor(CameraMetadataNative m, Parameters p) { 941df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Use the largest jpeg size (by area) for both active array and pixel array 942df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Size largestJpegSize = getLargestSupportedJpegSizeByArea(p); 943df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 944df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * sensor.info.activeArraySize 945df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 946df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 947df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Rect activeArrayRect = ParamsUtils.createRect(largestJpegSize); 948df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SENSOR_INFO_ACTIVE_ARRAY_SIZE, activeArrayRect); 949df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 950df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 951df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 952733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * sensor.availableTestPatternModes 953733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 954733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 955733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // Only "OFF" test pattern mode is available 956733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(SENSOR_AVAILABLE_TEST_PATTERN_MODES, new int[] { SENSOR_TEST_PATTERN_MODE_OFF }); 957733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 958733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 959733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 960df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * sensor.info.pixelArraySize 961df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 962df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin m.set(SENSOR_INFO_PIXEL_ARRAY_SIZE, largestJpegSize); 9637336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 9647336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin /* 9657336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin * sensor.info.physicalSize 9667336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin */ 9677336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin { 9687336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin /* 9697336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin * Assume focal length is at infinity focus and that the lens is rectilinear. 9707336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin */ 9717336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin float focalLength = p.getFocalLength(); // in mm 9727336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin double angleHor = p.getHorizontalViewAngle() * Math.PI / 180; // to radians 9737336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin double angleVer = p.getVerticalViewAngle() * Math.PI / 180; // to radians 9747336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 9757336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin float height = (float)Math.abs(2 * focalLength * Math.tan(angleVer / 2)); 9767336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin float width = (float)Math.abs(2 * focalLength * Math.tan(angleHor / 2)); 9777336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 9787336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin m.set(SENSOR_INFO_PHYSICAL_SIZE, new SizeF(width, height)); // in mm 9797336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 980442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 981442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 982442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * sensor.info.timestampSource 983442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 984442395751d46aa0f569ad479202a84713a260be0Igor Murashkin { 985442395751d46aa0f569ad479202a84713a260be0Igor Murashkin m.set(SENSOR_INFO_TIMESTAMP_SOURCE, SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN); 986442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 987df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 988df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 9890a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin private static void mapStatistics(CameraMetadataNative m, Parameters p) { 9900a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 9910a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * statistics.info.availableFaceDetectModes 9920a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 9930a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin int[] fdModes; 9940a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 9950a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin if (p.getMaxNumDetectedFaces() > 0) { 9960a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin fdModes = new int[] { 9970a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin STATISTICS_FACE_DETECT_MODE_OFF, 9980a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin STATISTICS_FACE_DETECT_MODE_SIMPLE 9990a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin // FULL is never-listed, since we have no way to query it statically 10000a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin }; 10010a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } else { 10020a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin fdModes = new int[] { 10030a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin STATISTICS_FACE_DETECT_MODE_OFF 10040a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin }; 10050a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 10060a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin m.set(STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, fdModes); 10070a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 10080a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /* 10090a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin * statistics.info.maxFaceCount 10100a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin */ 10110a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin m.set(STATISTICS_INFO_MAX_FACE_COUNT, p.getMaxNumDetectedFaces()); 10120a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 10130a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 1014e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin private static void mapSync(CameraMetadataNative m, Parameters p) { 1015e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin /* 1016e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin * sync.maxLatency 1017e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin */ 1018e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin m.set(SYNC_MAX_LATENCY, SYNC_MAX_LATENCY_UNKNOWN); 1019e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin } 1020e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin 10214961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin private static void appendStreamConfig( 10224961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin ArrayList<StreamConfiguration> configs, int format, List<Camera.Size> sizes) { 10234961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin for (Camera.Size size : sizes) { 10244961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin StreamConfiguration config = 10254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin new StreamConfiguration(format, size.width, size.height, /*input*/false); 10264961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin configs.add(config); 10274961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 10284961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin } 10293e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk 10303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static String[] sLegacySceneModes = { 10313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_AUTO, 10323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_ACTION, 10333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_PORTRAIT, 10343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_LANDSCAPE, 10353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_NIGHT, 10363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_NIGHT_PORTRAIT, 10373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_THEATRE, 10383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_BEACH, 10393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_SNOW, 10403fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_SUNSET, 10413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_STEADYPHOTO, 10423fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_FIREWORKS, 10433fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_SPORTS, 10443fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_PARTY, 10453fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_CANDLELIGHT, 10463fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.SCENE_MODE_BARCODE, 1047ff99a0add9700b423a0da3e332840e3907ae96a5Ruben Brunk Parameters.SCENE_MODE_HDR, 10483fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 10493fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10503fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static int[] sSceneModes = { 10513fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED, 10523fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_ACTION, 10533fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_PORTRAIT, 10543fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_LANDSCAPE, 10553fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT, 10563fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT_PORTRAIT, 10573fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_THEATRE, 10583fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_BEACH, 10593fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_SNOW, 10603fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_SUNSET, 10613fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_STEADYPHOTO, 10623fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_FIREWORKS, 10633fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_SPORTS, 10643fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_PARTY, 10653fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_CANDLELIGHT, 10663fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_BARCODE, 1067ff99a0add9700b423a0da3e332840e3907ae96a5Ruben Brunk CameraCharacteristics.CONTROL_SCENE_MODE_HDR, 10683fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 10693fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10703fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static int convertSceneModeFromLegacy(String mode) { 10713fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (mode == null) { 10723fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED; 10733fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10743fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sLegacySceneModes, mode); 10753fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 10763fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return UNKNOWN_MODE; 10773fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10783fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sSceneModes[index]; 10793fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10803fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10813fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static String convertSceneModeToLegacy(int mode) { 10828c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin if (mode == CONTROL_SCENE_MODE_FACE_PRIORITY) { 10838c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin // OK: Let LegacyFaceDetectMapper handle turning face detection on/off 10848c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin return Parameters.SCENE_MODE_AUTO; 10858c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin } 10868c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin 10873fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sSceneModes, mode); 10883fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 10893fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return null; 10903fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10913fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sLegacySceneModes[index]; 10923fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 10933fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 10943fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static String[] sLegacyEffectMode = { 10953fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_NONE, 10963fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_MONO, 10973fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_NEGATIVE, 10983fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_SOLARIZE, 10993fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_SEPIA, 11003fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_POSTERIZE, 11013fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_WHITEBOARD, 11023fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_BLACKBOARD, 11033fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Parameters.EFFECT_AQUA, 11043fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 11053fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11063fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk private final static int[] sEffectModes = { 11073fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_OFF, 11083fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_MONO, 11093fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_NEGATIVE, 11103fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_SOLARIZE, 11113fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_SEPIA, 11123fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_POSTERIZE, 11133fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_WHITEBOARD, 11143fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_BLACKBOARD, 11153fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk CameraCharacteristics.CONTROL_EFFECT_MODE_AQUA, 11163fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk }; 11173fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11183fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static int convertEffectModeFromLegacy(String mode) { 11193fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (mode == null) { 11203fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return CameraCharacteristics.CONTROL_EFFECT_MODE_OFF; 11213fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11223fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sLegacyEffectMode, mode); 11233fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 11243fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return UNKNOWN_MODE; 11253fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11263fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sEffectModes[index]; 11273fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11283fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11293fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk static String convertEffectModeToLegacy(int mode) { 11303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int index = ArrayUtils.getArrayIndex(sEffectModes, mode); 11313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (index < 0) { 11323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return null; 11333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk return sLegacyEffectMode[index]; 11353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 11363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 11373e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk /** 1138df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Convert the ae antibanding mode from api1 into api2. 1139df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1140df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param mode the api1 mode, {@code null} is allowed and will return {@code -1}. 1141df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1142df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @return The api2 value, or {@code -1} by default if conversion failed 11435776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk */ 1144df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static int convertAntiBandingMode(String mode) { 11455776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk if (mode == null) { 11465776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return -1; 11475776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 1148df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1149df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin switch (mode) { 11505776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_OFF: { 11515776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_OFF; 11525776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11535776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_50HZ: { 11545776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_50HZ; 11555776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11565776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_60HZ: { 11575776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_60HZ; 11585776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11595776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk case Camera.Parameters.ANTIBANDING_AUTO: { 11605776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return CONTROL_AE_ANTIBANDING_MODE_AUTO; 11615776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11625776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk default: { 1163df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Log.w(TAG, "convertAntiBandingMode - Unknown antibanding mode " + mode); 11645776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return -1; 11655776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11665776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11675776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11685776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 11695776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk /** 1170df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Convert the ae antibanding mode from api1 into api2. 1171df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1172df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param mode the api1 mode, {@code null} is allowed and will return {@code MODE_OFF}. 1173df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 1174df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @return The api2 value, or {@code MODE_OFF} by default if conversion failed 11755776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk */ 1176df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin static int convertAntiBandingModeOrDefault(String mode) { 1177df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int antiBandingMode = convertAntiBandingMode(mode); 1178df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (antiBandingMode == -1) { 1179df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return CONTROL_AE_ANTIBANDING_MODE_OFF; 11805776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11815776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 1182df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return antiBandingMode; 1183df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 11845776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 11855776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk private static int[] convertAeFpsRangeToLegacy(Range<Integer> fpsRange) { 11865776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk int[] legacyFps = new int[2]; 11875776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk legacyFps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower(); 11885776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk legacyFps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper(); 11895776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk return legacyFps; 11905776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 11915776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 11925776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk /** 11933e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk * Return the stall duration for a given output jpeg size in nanoseconds. 11943e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk * 11953e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk * <p>An 8mp image is chosen to have a stall duration of 0.8 seconds.</p> 11963e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk */ 11973e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk private static long calculateJpegStallDuration(Camera.Size size) { 11983e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk long baseDuration = APPROXIMATE_CAPTURE_DELAY_MS * NS_PER_MS; // 200ms for capture 11993e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk long area = size.width * (long) size.height; 1200e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin long stallPerArea = APPROXIMATE_JPEG_ENCODE_TIME_MS * NS_PER_MS / 1201e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin APPROXIMATE_SENSOR_AREA_PX; // 600ms stall for 8mp 12023e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk return baseDuration + area * stallPerArea; 12033e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk } 12045776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk 12055776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk /** 1206df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Set the legacy parameters using the {@link LegacyRequest legacy request}. 12075776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk * 1208df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>The legacy request's parameters are changed as a side effect of calling this 1209df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * method.</p> 12105776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk * 1211df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param request a non-{@code null} legacy request 12125776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk */ 1213df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin public static void convertRequestMetadata(LegacyRequest request) { 1214df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin LegacyRequestMapper.convertRequestMetadata(request); 1215a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1216a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 12176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk private static final int[] sAllowedTemplates = { 12186a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CameraDevice.TEMPLATE_PREVIEW, 12196a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CameraDevice.TEMPLATE_STILL_CAPTURE, 12206a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CameraDevice.TEMPLATE_RECORD, 12216a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // Disallowed templates in legacy mode: 12226a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // CameraDevice.TEMPLATE_VIDEO_SNAPSHOT, 12236a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, 12246a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // CameraDevice.TEMPLATE_MANUAL 12256a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk }; 12266a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1227a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /** 1228a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * Create a request template 1229a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1230a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param c a non-{@code null} camera characteristics for this camera 1231a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @param templateId a non-negative template ID 1232a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1233a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @return a non-{@code null} request template 1234a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1235a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @throws IllegalArgumentException if {@code templateId} was invalid 1236a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * 1237a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * @see android.hardware.camera2.CameraDevice#TEMPLATE_MANUAL 1238a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 1239a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin public static CameraMetadataNative createRequestTemplate( 1240a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraCharacteristics c, int templateId) { 12416a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (!ArrayUtils.contains(sAllowedTemplates, templateId)) { 1242a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin throw new IllegalArgumentException("templateId out of range"); 1243a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1244a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1245a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin CameraMetadataNative m = new CameraMetadataNative(); 1246a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1247a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin /* 1248a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * NOTE: If adding new code here and it needs to query the static info, 1249a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * query the camera characteristics, so we can reuse this for api2 code later 1250a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin * to create our own templates in the framework 1251a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin */ 1252a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 12536a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 12546a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * control.* 12556a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 12566a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1257733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // control.awbMode 1258733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin m.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO); 1259733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // AWB is always unconditionally available in API1 devices 1260a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 12616a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeAntibandingMode 12626a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CONTROL_AE_ANTIBANDING_MODE_AUTO); 12636a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12646a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeExposureCompensation 12656a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0); 12666a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12676a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeLock 12686a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_LOCK, false); 12696a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12706a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aePrecaptureTrigger 12716a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_IDLE); 12726a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12736a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.afTrigger 12746a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_IDLE); 12756a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12766a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.awbMode 12776a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AWB_MODE, CONTROL_AWB_MODE_AUTO); 12786a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12796a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.awbLock 12806a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AWB_LOCK, false); 12816a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12826a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeRegions, control.awbRegions, control.afRegions 12836a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk { 12846a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Rect activeArray = c.get(SENSOR_INFO_ACTIVE_ARRAY_SIZE); 12856a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk MeteringRectangle[] activeRegions = new MeteringRectangle[] { 12866a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk new MeteringRectangle(/*x*/0, /*y*/0, /*width*/activeArray.width() - 1, 1287e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk /*height*/activeArray.height() - 1,/*weight*/0)}; 12886a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_REGIONS, activeRegions); 12896a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AWB_REGIONS, activeRegions); 12906a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AF_REGIONS, activeRegions); 12916a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 12926a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 12936a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.captureIntent 12947336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin { 12957336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin int captureIntent; 12967336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin switch (templateId) { 12977336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CameraDevice.TEMPLATE_PREVIEW: 12987336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW; 12997336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 13007336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CameraDevice.TEMPLATE_STILL_CAPTURE: 13017336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 13027336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 13037336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CameraDevice.TEMPLATE_RECORD: 13047336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 13057336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 13067336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin default: 13077336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin // Can't get anything else since it's guarded by the IAE check 13087336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin throw new AssertionError("Impossible; keep in sync with sAllowedTemplates"); 13097336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 13107336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin m.set(CaptureRequest.CONTROL_CAPTURE_INTENT, captureIntent); 13117336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 13126a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1313a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // control.aeMode 1314a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin m.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 1315a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // AE is always unconditionally available in API1 devices 1316a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 13176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.mode 13186a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_MODE, CONTROL_MODE_AUTO); 13196a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1320a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // control.afMode 1321a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin { 1322a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin Float minimumFocusDistance = c.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE); 1323a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1324a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin int afMode; 1325a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin if (minimumFocusDistance != null && 1326a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin minimumFocusDistance == LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS) { 1327a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // Cannot control auto-focus with fixed-focus cameras 1328a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin afMode = CameraMetadata.CONTROL_AF_MODE_OFF; 1329a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } else { 1330a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // If a minimum focus distance is reported; the camera must have AF 1331a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin afMode = CameraMetadata.CONTROL_AF_MODE_AUTO; 13326a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13336a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (templateId == CameraDevice.TEMPLATE_RECORD || 13346a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk templateId == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) { 13356a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES), 13366a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CONTROL_AF_MODE_CONTINUOUS_VIDEO)) { 13376a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO; 13386a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13396a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } else if (templateId == CameraDevice.TEMPLATE_PREVIEW || 13406a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) { 13416a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES), 13426a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk CONTROL_AF_MODE_CONTINUOUS_PICTURE)) { 13436a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE; 13446a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13456a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 1346a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1347a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 1348a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 1349d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin Log.v(TAG, "createRequestTemplate (templateId=" + templateId + ")," + 1350d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin " afMode=" + afMode + ", minimumFocusDistance=" + minimumFocusDistance); 1351d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin } 1352d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin 1353a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin m.set(CaptureRequest.CONTROL_AF_MODE, afMode); 1354a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin } 1355a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin 13566a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk { 13576a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // control.aeTargetFpsRange 13586a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Range<Integer>[] availableFpsRange = c. 13596a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 13606a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13616a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // Pick FPS range with highest max value, tiebreak on higher min value 13626a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Range<Integer> bestRange = availableFpsRange[0]; 13636a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk for (Range<Integer> r : availableFpsRange) { 13646a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (bestRange.getUpper() < r.getUpper()) { 13656a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk bestRange = r; 13666a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } else if (bestRange.getUpper() == r.getUpper() && 13676a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk bestRange.getLower() < r.getLower()) { 13686a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk bestRange = r; 13696a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13706a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13716a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestRange); 13726a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 13736a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 1374981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin // control.sceneMode -- DISABLED is always available 1375981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin m.set(CaptureRequest.CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_DISABLED); 1376981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin 13776a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 13786a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * statistics.* 13796a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 13806a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13816a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // statistics.faceDetectMode 13826a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, STATISTICS_FACE_DETECT_MODE_OFF); 13836a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13846a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 13856a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * flash.* 13866a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 13876a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13886a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // flash.mode 13896a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.FLASH_MODE, FLASH_MODE_OFF); 13906a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 13916a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk /* 1392e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk * noiseReduction.* 1393e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk */ 1394c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh if (templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) { 1395c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh m.set(CaptureRequest.NOISE_REDUCTION_MODE, NOISE_REDUCTION_MODE_HIGH_QUALITY); 1396c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh } else { 1397c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh m.set(CaptureRequest.NOISE_REDUCTION_MODE, NOISE_REDUCTION_MODE_FAST); 1398c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh } 1399c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh 1400c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh /* 1401c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh * colorCorrection.* 1402c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh */ 1403c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh if (templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) { 1404c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh m.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, 1405c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY); 1406c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh } else { 1407c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh m.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, 1408c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh COLOR_CORRECTION_ABERRATION_MODE_FAST); 1409c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh } 1410e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk 1411e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk /* 14126a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk * lens.* 14136a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk */ 14146a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 14156a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // lens.focalLength 14166a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk m.set(CaptureRequest.LENS_FOCAL_LENGTH, 14176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk c.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0]); 14186a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk 14193adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala /* 14203adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala * jpeg.* 14213adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala */ 14223adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala 14233adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala // jpeg.thumbnailSize - set smallest non-zero size if possible 14243adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala Size[] sizes = c.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES); 14253adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala m.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, (sizes.length > 1) ? sizes[1] : sizes[0]); 14263adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala 1427a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin // TODO: map other request template values 1428a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin return m; 14295776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk } 14306c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14316c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin private static int[] getTagsForKeys(Key<?>[] keys) { 14326c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin int[] tags = new int[keys.length]; 14336c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14346c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin for (int i = 0; i < keys.length; ++i) { 14356c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin tags[i] = keys[i].getNativeKey().getTag(); 14366c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14376c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14386c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin return tags; 14396c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14406c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14416c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin private static int[] getTagsForKeys(CaptureRequest.Key<?>[] keys) { 14426c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin int[] tags = new int[keys.length]; 14436c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14446c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin for (int i = 0; i < keys.length; ++i) { 14456c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin tags[i] = keys[i].getNativeKey().getTag(); 14466c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14476c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14486c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin return tags; 14496c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14506c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin private static int[] getTagsForKeys(CaptureResult.Key<?>[] keys) { 14526c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin int[] tags = new int[keys.length]; 14536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14546c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin for (int i = 0; i < keys.length; ++i) { 14556c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin tags[i] = keys[i].getNativeKey().getTag(); 14566c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 14576c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin 14586c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin return tags; 14596c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin } 146083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 146183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /** 146283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * Convert the requested AF mode into its equivalent supported parameter. 146383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * 146483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param mode {@code CONTROL_AF_MODE} 146583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @param supportedFocusModes list of camera1's supported focus modes 146683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin * @return the stringified af mode, or {@code null} if its not supported 146783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin */ 146883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin static String convertAfModeToLegacy(int mode, List<String> supportedFocusModes) { 146983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (supportedFocusModes == null || supportedFocusModes.isEmpty()) { 147083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, "No focus modes supported; API1 bug"); 147183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return null; 147283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 147383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 147483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String param = null; 147583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin switch (mode) { 147683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_AUTO: 147783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_AUTO; 147883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 147983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_CONTINUOUS_PICTURE: 148083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_CONTINUOUS_PICTURE; 148183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 148283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_CONTINUOUS_VIDEO: 148383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_CONTINUOUS_VIDEO; 148483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 148583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_EDOF: 148683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_EDOF; 148783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 148883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_MACRO: 148983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_MACRO; 149083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin break; 149183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin case CONTROL_AF_MODE_OFF: 149283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (supportedFocusModes.contains(Parameters.FOCUS_MODE_FIXED)) { 149383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_FIXED; 149483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } else { 149583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = Parameters.FOCUS_MODE_INFINITY; 149683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 149783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 149883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 149983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (!supportedFocusModes.contains(param)) { 150083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // Weed out bad user input by setting to the first arbitrary focus mode 150183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String defaultMode = supportedFocusModes.get(0); 150283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, 150383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String.format( 150483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "convertAfModeToLegacy - ignoring unsupported mode %d, " + 150583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "defaulting to %s", mode, defaultMode)); 150683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin param = defaultMode; 150783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 150883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 150983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin return param; 151083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 15114961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin} 1512