LegacyRequestMapper.java revision 6a7d8c42890451e01ca7b4baba03d430808265bc
1df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/* 2df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Copyright (C) 2014 The Android Open Source Project 3df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 4df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * you may not use this file except in compliance with the License. 6df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * You may obtain a copy of the License at 7df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 8df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 10df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Unless required by applicable law or agreed to in writing, software 11df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * See the License for the specific language governing permissions and 14df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * limitations under the License. 15df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 16df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 17df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpackage android.hardware.camera2.legacy; 18df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 19df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.graphics.Rect; 20df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.Camera; 21df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.Camera.Parameters; 22df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.CameraCharacteristics; 23df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.CaptureRequest; 24df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.params.MeteringRectangle; 25df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.utils.ListUtils; 2683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkinimport android.hardware.camera2.utils.ParamsUtils; 27df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Log; 28df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Range; 29df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Size; 30df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 31df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.ArrayList; 32df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.Arrays; 33df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.List; 343e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkinimport java.util.Objects; 35df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 36df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static com.android.internal.util.Preconditions.*; 37df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static android.hardware.camera2.CaptureRequest.*; 38df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 39df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/** 40df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Provide legacy-specific implementations of camera2 CaptureRequest for legacy devices. 41df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 4283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin@SuppressWarnings("deprecation") 43df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpublic class LegacyRequestMapper { 44df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static final String TAG = "LegacyRequestMapper"; 45df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE); 46df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 47df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 48df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Set the legacy parameters using the {@link LegacyRequest legacy request}. 49df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 50df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>The legacy request's parameters are changed as a side effect of calling this 51df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * method.</p> 52df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 53df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param legacyRequest a non-{@code null} legacy request 54df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 55df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin public static void convertRequestMetadata(LegacyRequest legacyRequest) { 56df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CameraCharacteristics characteristics = legacyRequest.characteristics; 57df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CaptureRequest request = legacyRequest.captureRequest; 58df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Size previewSize = legacyRequest.previewSize; 59df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters params = legacyRequest.parameters; 60df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 617ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Rect activeArray = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); 627ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 63df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 64df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.cropRegion 65df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 667ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.ZoomData zoomData; 67df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 687ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin zoomData = ParameterUtils.convertScalerCropRegion(activeArray, 697ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin request.get(SCALER_CROP_REGION), 707ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin previewSize, 717ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin params); 72df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 73df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (params.isZoomSupported()) { 747ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin params.setZoom(zoomData.zoomIndex); 75df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else if (VERBOSE) { 76df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Log.v(TAG, "convertRequestToMetadata - zoom is not supported"); 77df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 78df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 79df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 80df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 81df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 82df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control.ae* 83df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 84df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.aeAntibandingMode 85df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 86df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin String legacyMode; 87df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Integer antiBandingMode = request.get(CONTROL_AE_ANTIBANDING_MODE); 88df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (antiBandingMode != null) { 89df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyMode = convertAeAntiBandingModeToLegacy(antiBandingMode); 90df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else { 91df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyMode = ListUtils.listSelectFirstFrom(params.getSupportedAntibanding(), 92df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin new String[] { 93df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_AUTO, 94df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_OFF, 95df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_50HZ, 96df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_60HZ, 97df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin }); 98df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 99df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 100df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (legacyMode != null) { 101df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin params.setAntibanding(legacyMode); 102df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 103df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 104df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 105df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 1067ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin * control.aeRegions, afRegions 107df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 108df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 1097ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // aeRegions 1107ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin { 1116a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // Use aeRegions if available, fall back to using awbRegions if present 1127ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle[] aeRegions = request.get(CONTROL_AE_REGIONS); 1136a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (request.get(CONTROL_AWB_REGIONS) != null) { 1146a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Log.w(TAG, "convertRequestMetadata - control.awbRegions setting is not " + 1156a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk "supported, ignoring value"); 1166a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 1177ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin int maxNumMeteringAreas = params.getMaxNumMeteringAreas(); 1187ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<Camera.Area> meteringAreaList = convertMeteringRegionsToLegacy( 1197ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin activeArray, zoomData, aeRegions, maxNumMeteringAreas, 1207ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin /*regionName*/"AE"); 121df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 122df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin params.setMeteringAreas(meteringAreaList); 1237ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 124df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1257ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // afRegions 1267ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin { 1277ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle[] afRegions = request.get(CONTROL_AF_REGIONS); 1287ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin int maxNumFocusAreas = params.getMaxNumFocusAreas(); 1297ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<Camera.Area> focusAreaList = convertMeteringRegionsToLegacy( 1307ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin activeArray, zoomData, afRegions, maxNumFocusAreas, 1317ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin /*regionName*/"AF"); 1327ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 1337ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin params.setFocusAreas(focusAreaList); 134df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 135df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 136df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 137df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.aeTargetFpsRange 138df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Range<Integer> aeFpsRange = request.get(CONTROL_AE_TARGET_FPS_RANGE); 139df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (aeFpsRange != null) { 140df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] legacyFps = convertAeFpsRangeToLegacy(aeFpsRange); 1417f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 1427f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk // TODO - Should we enforce that all HAL1 devices must include (30, 30) FPS range? 1437f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk boolean supported = false; 1447f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk for(int[] range : params.getSupportedPreviewFpsRange()) { 1457f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk if (legacyFps[0] == range[0] && legacyFps[1] == range[1]) { 1467f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk supported = true; 1477f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk break; 1487f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 1497f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 1507f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk if (supported) { 1517f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk params.setPreviewFpsRange(legacyFps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], 1527f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk legacyFps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); 1537f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk params.setRecordingHint(false); 1547f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } else { 1557f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk Log.w(TAG, "Unsupported FPS range set [" + legacyFps[0] + "," + legacyFps[1] + "]"); 1567f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk params.setRecordingHint(true); 1577f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 158df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 159df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 160df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 161df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control 162df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 163df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // control.aeExposureCompensation 1653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 1663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Range<Integer> compensationRange = 1673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE); 16883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int compensation = ParamsUtils.getOrDefault(request, 1693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin CONTROL_AE_EXPOSURE_COMPENSATION, 1703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*defaultValue*/0); 1713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 1725d2fa0e0b5db09323a706f914bd268a764070425Lajos Molnar if (!compensationRange.contains(compensation)) { 1733e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Log.w(TAG, 1743e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin "convertRequestMetadata - control.aeExposureCompensation " + 1753e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin "is out of range, ignoring value"); 1763e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin compensation = 0; 1773e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 1783e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 1793e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setExposureCompensation(compensation); 1803e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 1813e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 1823e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // control.aeLock 1833e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 1843e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Boolean aeLock = getIfSupported(request, CONTROL_AE_LOCK, /*defaultValue*/false, 1853e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.isAutoExposureLockSupported(), 1863e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*allowedValue*/false); 1873e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 1883e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (aeLock != null) { 1893e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setAutoExposureLock(aeLock); 1903e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 1913e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 19249a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin if (VERBOSE) { 19349a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.aeLock set to " + aeLock); 19449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin } 19549a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin 1963e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // TODO: Don't add control.aeLock to availableRequestKeys if it's not supported 1973e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 1983e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 199df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.aeMode, flash.mode 200df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin mapAeAndFlashMode(request, /*out*/params); 201df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 20283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // control.afMode 20383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 20483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int afMode = ParamsUtils.getOrDefault(request, CONTROL_AF_MODE, 20583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /*defaultValue*/CONTROL_AF_MODE_OFF); 20683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String focusMode = LegacyMetadataMapper.convertAfModeToLegacy(afMode, 20783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin params.getSupportedFocusModes()); 20883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 20983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (focusMode != null) { 21083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin params.setFocusMode(focusMode); 21183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 21283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 21383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE) { 21483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.afMode " 21583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + afMode + " mapped to " + focusMode); 21683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 21783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 21883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 219df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.awbLock 2203e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 2213e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Boolean awbLock = getIfSupported(request, CONTROL_AWB_LOCK, /*defaultValue*/false, 2223e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.isAutoWhiteBalanceLockSupported(), 2233e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*allowedValue*/false); 224df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 2253e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (awbLock != null) { 2263e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setAutoWhiteBalanceLock(awbLock); 2273e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2283e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2293e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // TODO: Don't add control.awbLock to availableRequestKeys if it's not supported 2303e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 23183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 23283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // lens.focusDistance 23383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 23483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin boolean infinityFocusSupported = 23583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin ListUtils.listContains(params.getSupportedFocusModes(), 23683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Parameters.FOCUS_MODE_INFINITY); 23783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Float focusDistance = getIfSupported(request, LENS_FOCUS_DISTANCE, 23883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /*defaultValue*/0f, infinityFocusSupported, /*allowedValue*/0f); 23983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 24083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (focusDistance == null || focusDistance != 0f) { 24183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, 24283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "convertRequestToMetadata - Ignoring android.lens.focusDistance " 24383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + infinityFocusSupported + ", only 0.0f is supported"); 24483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 24583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 2463fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 2473fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // control.sceneMode, control.mode 2483fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk { 2493fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // TODO: Map FACE_PRIORITY scene mode to face detection. 2503fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 2513fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (params.getSupportedSceneModes() != null) { 2523fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int controlMode = ParamsUtils.getOrDefault(request, CONTROL_MODE, 2533fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /*defaultValue*/CONTROL_MODE_AUTO); 2543fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String modeToSet; 2553fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk switch (controlMode) { 2563fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk case CONTROL_MODE_USE_SCENE_MODE: { 2573fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int sceneMode = ParamsUtils.getOrDefault(request, CONTROL_SCENE_MODE, 2583fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /*defaultValue*/CONTROL_SCENE_MODE_DISABLED); 2593fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String legacySceneMode = LegacyMetadataMapper. 2603fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk convertSceneModeToLegacy(sceneMode); 2613fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (legacySceneMode != null) { 2623fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = legacySceneMode; 2633fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } else { 2643fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 2653fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Skipping unknown requested scene mode: " + sceneMode); 2663fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2673fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk break; 2683fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2693fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk case CONTROL_MODE_AUTO: { 2703fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 2713fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk break; 2723fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2733fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk default: { 2743fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Control mode " + controlMode + 2753fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk " is unsupported, defaulting to AUTO"); 2763fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 2773fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2783fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2793fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setSceneMode(modeToSet); 2803fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2813fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2823fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 2833fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // control.effectMode 2843fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk { 2853fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (params.getSupportedColorEffects() != null) { 2863fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int effectMode = ParamsUtils.getOrDefault(request, CONTROL_EFFECT_MODE, 2873fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /*defaultValue*/CONTROL_EFFECT_MODE_OFF); 2883fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String legacyEffectMode = LegacyMetadataMapper.convertEffectModeToLegacy(effectMode); 2893fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (legacyEffectMode != null) { 2903fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setColorEffect(legacyEffectMode); 2913fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } else { 2923fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setColorEffect(Parameters.EFFECT_NONE); 2933fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Skipping unknown requested effect mode: " + effectMode); 2943fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2953fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 2963fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 297df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 298df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 2997ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin private static List<Camera.Area> convertMeteringRegionsToLegacy( 3007ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Rect activeArray, ParameterUtils.ZoomData zoomData, 3017ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle[] meteringRegions, int maxNumMeteringAreas, String regionName) { 3027ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (meteringRegions == null || maxNumMeteringAreas <= 0) { 3037ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (maxNumMeteringAreas > 0) { 3047ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return Arrays.asList(ParameterUtils.CAMERA_AREA_DEFAULT); 3057ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } else { 3067ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return null; 3077ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3087ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3097ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 3107ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // Add all non-zero weight regions to the list 3117ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<MeteringRectangle> meteringRectangleList = new ArrayList<>(); 3127ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin for (MeteringRectangle rect : meteringRegions) { 3137ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (rect.getMeteringWeight() != MeteringRectangle.METERING_WEIGHT_DONT_CARE) { 3147ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin meteringRectangleList.add(rect); 3157ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3167ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3177ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 3187ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // Ignore any regions beyond our maximum supported count 3197ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin int countMeteringAreas = 3207ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Math.min(maxNumMeteringAreas, meteringRectangleList.size()); 3217ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<Camera.Area> meteringAreaList = new ArrayList<>(countMeteringAreas); 3227ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 3237ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin for (int i = 0; i < countMeteringAreas; ++i) { 3247ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle rect = meteringRectangleList.get(i); 3257ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 3267ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.MeteringData meteringData = 3277ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.convertMeteringRectangleToLegacy(activeArray, rect, zoomData); 3287ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin meteringAreaList.add(meteringData.meteringArea); 3297ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3307ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 3317ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (maxNumMeteringAreas < meteringRectangleList.size()) { 3327ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Log.w(TAG, 3337ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin "convertMeteringRegionsToLegacy - Too many requested " + regionName + 3347ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin " regions, ignoring all beyond the first " + maxNumMeteringAreas); 3357ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3367ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 3377ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (VERBOSE) { 3387ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Log.v(TAG, "convertMeteringRegionsToLegacy - " + regionName + " areas = " 3397ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin + ParameterUtils.stringFromAreaList(meteringAreaList)); 3407ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3417ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 3427ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return meteringAreaList; 3437ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 3447ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 345df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapAeAndFlashMode(CaptureRequest r, /*out*/Parameters p) { 34683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int flashMode = ParamsUtils.getOrDefault(r, FLASH_MODE, FLASH_MODE_OFF); 34783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int aeMode = ParamsUtils.getOrDefault(r, CONTROL_AE_MODE, CONTROL_AE_MODE_ON); 348df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 349df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<String> supportedFlashModes = p.getSupportedFlashModes(); 350df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 351396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin String flashModeSetting = null; 352396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 353396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin // Flash is OFF by default, on cameras that support flash 354396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_OFF)) { 355396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_OFF; 356396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 357396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 358df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 359df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Map all of the control.aeMode* enums, but ignore AE_MODE_OFF since we never support it 360df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 361df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 362df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Ignore flash.mode controls unless aeMode == ON 363df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (aeMode == CONTROL_AE_MODE_ON) { 364396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (flashMode == FLASH_MODE_TORCH) { 365396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_TORCH)) { 366396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_TORCH; 367396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 368396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == TORCH;" + 369396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 370396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 371396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (flashMode == FLASH_MODE_SINGLE) { 372396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) { 373396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_ON; 374396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 375396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == SINGLE;" + 376396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 377396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 378396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 379396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin // Use the default FLASH_MODE_OFF 380396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 381396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_ALWAYS_FLASH) { 382396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) { 383396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_ON; 384396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 385396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_ALWAYS_FLASH;" + 386396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 387396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 388396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH) { 389396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_AUTO)) { 390396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_AUTO; 391396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 392396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH;" + 393396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 394df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 395396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 396396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_RED_EYE)) { 397396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_RED_EYE; 398396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 399396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH_REDEYE;" 400396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + "camera does not support it"); 401396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 402df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else { 403df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Default to aeMode == ON, flash = OFF 404396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 405396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 406396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (flashModeSetting != null) { 407396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin p.setFlashMode(flashModeSetting); 408396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 409396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 410396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (VERBOSE) { 411396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.v(TAG, 412396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "mapAeAndFlashMode - set flash.mode (api1) to " + flashModeSetting 413396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + ", requested (api2) " + flashMode 414396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + ", supported (api1) " + ListUtils.listToString(supportedFlashModes)); 415df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 416df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 417df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 418df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 419df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Returns null if the anti-banding mode enum is not supported. 420df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 421df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static String convertAeAntiBandingModeToLegacy(int mode) { 422df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin switch (mode) { 423df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_OFF: { 424df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_OFF; 425df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 426df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_50HZ: { 427df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_50HZ; 428df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 429df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_60HZ: { 430df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_60HZ; 431df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 432df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_AUTO: { 433df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_AUTO; 434df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 435df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin default: { 436df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return null; 437df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 438df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 439df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 440df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 441df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static int[] convertAeFpsRangeToLegacy(Range<Integer> fpsRange) { 442df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] legacyFps = new int[2]; 443df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyFps[Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower(); 444df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyFps[Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper(); 445df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return legacyFps; 446df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 447df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 4483e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /** 4493e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * Return {@code null} if the value is not supported, otherwise return the retrieved key's 4503e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * value from the request (or the default value if it wasn't set). 4513e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * 4523e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * <p>If the fetched value in the request is equivalent to {@code allowedValue}, 4533e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * then omit the warning (e.g. turning off AF lock on a camera 4543e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * that always has the AF lock turned off is a silent no-op), but still return {@code null}.</p> 4553e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * 4563e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * <p>Logs a warning to logcat if the key is not supported by api1 camera device.</p. 4573e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin */ 4583e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin private static <T> T getIfSupported( 4593e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin CaptureRequest r, CaptureRequest.Key<T> key, T defaultValue, boolean isSupported, 4603e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin T allowedValue) { 46183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin T val = ParamsUtils.getOrDefault(r, key, defaultValue); 4623e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (!isSupported) { 4643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (!Objects.equals(val, allowedValue)) { 4653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Log.w(TAG, key.getName() + " is not supported; ignoring requested value " + val); 4663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 4673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin return null; 4683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 4693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 4703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin return val; 4713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 472df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin} 473