LegacyRequestMapper.java revision 09a6bed6c6e613edfda6cb45499c4277e4446513
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; 271dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunkimport android.location.Location; 28df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Log; 29df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Range; 30df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Size; 31df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 32df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.ArrayList; 33df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.Arrays; 34df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport java.util.List; 353e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkinimport java.util.Objects; 36df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 37df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static com.android.internal.util.Preconditions.*; 38df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static android.hardware.camera2.CaptureRequest.*; 39df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 40df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin/** 41df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Provide legacy-specific implementations of camera2 CaptureRequest for legacy devices. 42df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 4383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin@SuppressWarnings("deprecation") 44df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinpublic class LegacyRequestMapper { 45df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static final String TAG = "LegacyRequestMapper"; 46df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE); 47df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 4889bb63f395ec069aca597fad62128efb0b7684e3Igor Murashkin /** Default quality for android.jpeg.quality, android.jpeg.thumbnailQuality */ 491dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk private static final byte DEFAULT_JPEG_QUALITY = 85; 501dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 51df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 52df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Set the legacy parameters using the {@link LegacyRequest legacy request}. 53df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 54df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>The legacy request's parameters are changed as a side effect of calling this 55df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * method.</p> 56df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 57df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param legacyRequest a non-{@code null} legacy request 58df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 59df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin public static void convertRequestMetadata(LegacyRequest legacyRequest) { 60df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CameraCharacteristics characteristics = legacyRequest.characteristics; 61df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CaptureRequest request = legacyRequest.captureRequest; 62df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Size previewSize = legacyRequest.previewSize; 63df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters params = legacyRequest.parameters; 64df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 657ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Rect activeArray = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); 667ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 67df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 68df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.cropRegion 69df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 707ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.ZoomData zoomData; 71df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 727ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin zoomData = ParameterUtils.convertScalerCropRegion(activeArray, 737ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin request.get(SCALER_CROP_REGION), 747ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin previewSize, 757ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin params); 76df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 77df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (params.isZoomSupported()) { 787ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin params.setZoom(zoomData.zoomIndex); 79df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else if (VERBOSE) { 80df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Log.v(TAG, "convertRequestToMetadata - zoom is not supported"); 81df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 82df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 83df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 84442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 85442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * colorCorrection.* 86442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 87442395751d46aa0f569ad479202a84713a260be0Igor Murashkin // colorCorrection.aberrationMode 88442395751d46aa0f569ad479202a84713a260be0Igor Murashkin { 89442395751d46aa0f569ad479202a84713a260be0Igor Murashkin int aberrationMode = ParamsUtils.getOrDefault(request, 90442395751d46aa0f569ad479202a84713a260be0Igor Murashkin COLOR_CORRECTION_ABERRATION_MODE, 91442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /*defaultValue*/COLOR_CORRECTION_ABERRATION_MODE_FAST); 92442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 93442395751d46aa0f569ad479202a84713a260be0Igor Murashkin if (aberrationMode != COLOR_CORRECTION_ABERRATION_MODE_FAST) { 94442395751d46aa0f569ad479202a84713a260be0Igor Murashkin Log.w(TAG, "convertRequestToMetadata - Ignoring unsupported " + 95442395751d46aa0f569ad479202a84713a260be0Igor Murashkin "colorCorrection.aberrationMode = " + aberrationMode); 96442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 97442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 98df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 99df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 100df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control.ae* 101df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 102df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.aeAntibandingMode 103df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 104df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin String legacyMode; 105df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Integer antiBandingMode = request.get(CONTROL_AE_ANTIBANDING_MODE); 106df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (antiBandingMode != null) { 107df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyMode = convertAeAntiBandingModeToLegacy(antiBandingMode); 108df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else { 109df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyMode = ListUtils.listSelectFirstFrom(params.getSupportedAntibanding(), 110df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin new String[] { 111df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_AUTO, 112df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_OFF, 113df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_50HZ, 114df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Parameters.ANTIBANDING_60HZ, 115df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin }); 116df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 117df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 118df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (legacyMode != null) { 119df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin params.setAntibanding(legacyMode); 120df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 121df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 122df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 123df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 1247ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin * control.aeRegions, afRegions 125df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 126df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 1277ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // aeRegions 1287ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin { 1296a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk // Use aeRegions if available, fall back to using awbRegions if present 1307ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle[] aeRegions = request.get(CONTROL_AE_REGIONS); 1316a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk if (request.get(CONTROL_AWB_REGIONS) != null) { 1326a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk Log.w(TAG, "convertRequestMetadata - control.awbRegions setting is not " + 1336a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk "supported, ignoring value"); 1346a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk } 1357ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin int maxNumMeteringAreas = params.getMaxNumMeteringAreas(); 1367ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<Camera.Area> meteringAreaList = convertMeteringRegionsToLegacy( 1377ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin activeArray, zoomData, aeRegions, maxNumMeteringAreas, 1387ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin /*regionName*/"AE"); 139df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1403968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk // WAR: for b/17252693, some devices can't handle params.setFocusAreas(null). 1413968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk if (maxNumMeteringAreas > 0) { 1423968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk params.setMeteringAreas(meteringAreaList); 1433968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk } 1447ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 145df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1467ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // afRegions 1477ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin { 1487ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle[] afRegions = request.get(CONTROL_AF_REGIONS); 1497ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin int maxNumFocusAreas = params.getMaxNumFocusAreas(); 1507ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<Camera.Area> focusAreaList = convertMeteringRegionsToLegacy( 1517ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin activeArray, zoomData, afRegions, maxNumFocusAreas, 1527ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin /*regionName*/"AF"); 1537ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 1543968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk // WAR: for b/17252693, some devices can't handle params.setFocusAreas(null). 1553968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk if (maxNumFocusAreas > 0) { 1563968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk params.setFocusAreas(focusAreaList); 1573968a3109962c8bb7bde0820af661cefd34bdb42Ruben Brunk } 158df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 159df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 160df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 161df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.aeTargetFpsRange 162df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Range<Integer> aeFpsRange = request.get(CONTROL_AE_TARGET_FPS_RANGE); 163df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (aeFpsRange != null) { 164df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] legacyFps = convertAeFpsRangeToLegacy(aeFpsRange); 1657f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk 1667f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk // TODO - Should we enforce that all HAL1 devices must include (30, 30) FPS range? 1677f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk boolean supported = false; 1687f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk for(int[] range : params.getSupportedPreviewFpsRange()) { 1697f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk if (legacyFps[0] == range[0] && legacyFps[1] == range[1]) { 1707f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk supported = true; 1717f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk break; 1727f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 1737f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 1747f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk if (supported) { 1757f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk params.setPreviewFpsRange(legacyFps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], 1767f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk legacyFps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); 1777f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } else { 1787f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk Log.w(TAG, "Unsupported FPS range set [" + legacyFps[0] + "," + legacyFps[1] + "]"); 1797f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 180df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 181df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 182df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 183df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control 184df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 185df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1863e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // control.aeExposureCompensation 1873e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 1883e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Range<Integer> compensationRange = 1893e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE); 19083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int compensation = ParamsUtils.getOrDefault(request, 1913e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin CONTROL_AE_EXPOSURE_COMPENSATION, 1923e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*defaultValue*/0); 1933e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 1945d2fa0e0b5db09323a706f914bd268a764070425Lajos Molnar if (!compensationRange.contains(compensation)) { 1953e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Log.w(TAG, 1963e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin "convertRequestMetadata - control.aeExposureCompensation " + 1973e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin "is out of range, ignoring value"); 1983e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin compensation = 0; 1993e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2003e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2013e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setExposureCompensation(compensation); 2023e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2033e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2043e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // control.aeLock 2053e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 2063e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Boolean aeLock = getIfSupported(request, CONTROL_AE_LOCK, /*defaultValue*/false, 2073e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.isAutoExposureLockSupported(), 2083e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*allowedValue*/false); 2093e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2103e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (aeLock != null) { 2113e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setAutoExposureLock(aeLock); 2123e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2133e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 21449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin if (VERBOSE) { 21549a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.aeLock set to " + aeLock); 21649a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin } 21749a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin 2183e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // TODO: Don't add control.aeLock to availableRequestKeys if it's not supported 2193e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2203e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 221df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.aeMode, flash.mode 222df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin mapAeAndFlashMode(request, /*out*/params); 223df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 22483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // control.afMode 22583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 22683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int afMode = ParamsUtils.getOrDefault(request, CONTROL_AF_MODE, 22783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /*defaultValue*/CONTROL_AF_MODE_OFF); 22883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String focusMode = LegacyMetadataMapper.convertAfModeToLegacy(afMode, 22983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin params.getSupportedFocusModes()); 23083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 23183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (focusMode != null) { 23283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin params.setFocusMode(focusMode); 23383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 23483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 23583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (VERBOSE) { 23683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.afMode " 23783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + afMode + " mapped to " + focusMode); 23883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 23983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 24083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 241733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // control.awbMode 242733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 243733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Integer awbMode = getIfSupported(request, CONTROL_AWB_MODE, 244733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /*defaultValue*/CONTROL_AWB_MODE_AUTO, 245733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin params.getSupportedWhiteBalance() != null, 246733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /*allowedValue*/CONTROL_AWB_MODE_AUTO); 247733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 248733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin String whiteBalanceMode = null; 249733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin if (awbMode != null) { // null iff AWB is not supported by camera1 api 250733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin whiteBalanceMode = convertAwbModeToLegacy(awbMode); 251733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin params.setWhiteBalance(whiteBalanceMode); 252733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 253733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 254733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin if (VERBOSE) { 255733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.awbMode " 256733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin + awbMode + " mapped to " + whiteBalanceMode); 257733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 258733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 259733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 260df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.awbLock 2613e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 2623e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Boolean awbLock = getIfSupported(request, CONTROL_AWB_LOCK, /*defaultValue*/false, 2633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.isAutoWhiteBalanceLockSupported(), 2643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*allowedValue*/false); 265df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 2663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (awbLock != null) { 2673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setAutoWhiteBalanceLock(awbLock); 2683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // TODO: Don't add control.awbLock to availableRequestKeys if it's not supported 2713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 27283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 2737336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin // control.captureIntent 2747336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin { 2757336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin int captureIntent = ParamsUtils.getOrDefault(request, 2767336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin CONTROL_CAPTURE_INTENT, 2777336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin /*defaultValue*/CONTROL_CAPTURE_INTENT_PREVIEW); 2787336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 2797336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = filterSupportedCaptureIntent(captureIntent); 2807336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 2817336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin params.setRecordingHint( 2827336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent == CONTROL_CAPTURE_INTENT_VIDEO_RECORD || 2837336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent == CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT); 2847336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 2857336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 2860a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin // control.videoStabilizationMode 2870a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin { 2880a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin Integer stabMode = getIfSupported(request, CONTROL_VIDEO_STABILIZATION_MODE, 2890a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /*defaultValue*/CONTROL_VIDEO_STABILIZATION_MODE_OFF, 2900a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin params.isVideoStabilizationSupported(), 2910a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /*allowedValue*/CONTROL_VIDEO_STABILIZATION_MODE_OFF); 2920a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 2930a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin if (stabMode != null) { 2940a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin params.setVideoStabilization(stabMode == CONTROL_VIDEO_STABILIZATION_MODE_ON); 2950a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 2960a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 2970a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 29883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // lens.focusDistance 29983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 30083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin boolean infinityFocusSupported = 30183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin ListUtils.listContains(params.getSupportedFocusModes(), 30283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Parameters.FOCUS_MODE_INFINITY); 30383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Float focusDistance = getIfSupported(request, LENS_FOCUS_DISTANCE, 30483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /*defaultValue*/0f, infinityFocusSupported, /*allowedValue*/0f); 30583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 30683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (focusDistance == null || focusDistance != 0f) { 30783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, 30883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "convertRequestToMetadata - Ignoring android.lens.focusDistance " 30983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + infinityFocusSupported + ", only 0.0f is supported"); 31083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 31183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 3123fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 3133fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // control.sceneMode, control.mode 3143fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk { 3153fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // TODO: Map FACE_PRIORITY scene mode to face detection. 3163fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 3173fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (params.getSupportedSceneModes() != null) { 3183fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int controlMode = ParamsUtils.getOrDefault(request, CONTROL_MODE, 3193fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /*defaultValue*/CONTROL_MODE_AUTO); 3203fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String modeToSet; 3213fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk switch (controlMode) { 3223fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk case CONTROL_MODE_USE_SCENE_MODE: { 3233fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int sceneMode = ParamsUtils.getOrDefault(request, CONTROL_SCENE_MODE, 3248c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin /*defaultValue*/CONTROL_SCENE_MODE_DISABLED); 3253fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String legacySceneMode = LegacyMetadataMapper. 3263fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk convertSceneModeToLegacy(sceneMode); 3273fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (legacySceneMode != null) { 3283fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = legacySceneMode; 3293fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } else { 3303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 3313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Skipping unknown requested scene mode: " + sceneMode); 3323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk break; 3343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk case CONTROL_MODE_AUTO: { 3363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 3373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk break; 3383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk default: { 3403fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Control mode " + controlMode + 3413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk " is unsupported, defaulting to AUTO"); 3423fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 3433fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3443fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3453fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setSceneMode(modeToSet); 3463fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3473fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3483fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 3493fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // control.effectMode 3503fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk { 3513fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (params.getSupportedColorEffects() != null) { 3523fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int effectMode = ParamsUtils.getOrDefault(request, CONTROL_EFFECT_MODE, 3533fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /*defaultValue*/CONTROL_EFFECT_MODE_OFF); 3543fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String legacyEffectMode = LegacyMetadataMapper.convertEffectModeToLegacy(effectMode); 3553fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (legacyEffectMode != null) { 3563fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setColorEffect(legacyEffectMode); 3573fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } else { 3583fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setColorEffect(Parameters.EFFECT_NONE); 3593fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Skipping unknown requested effect mode: " + effectMode); 3603fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3613fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3623fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 363733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 364733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 365733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * sensor 366733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 367733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 368733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // sensor.testPattern 369733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 370733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin int testPatternMode = ParamsUtils.getOrDefault(request, SENSOR_TEST_PATTERN_MODE, 371733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /*defaultValue*/SENSOR_TEST_PATTERN_MODE_OFF); 372733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin if (testPatternMode != SENSOR_TEST_PATTERN_MODE_OFF) { 373733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.w(TAG, "convertRequestToMetadata - ignoring sensor.testPatternMode " 374733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin + testPatternMode + "; only OFF is supported"); 375733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 376733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 3771dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 3781dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk /* 3791dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk * jpeg.* 3801dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk */ 3811dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 3821dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.gpsLocation 3831dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 3841dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Location location = request.get(JPEG_GPS_LOCATION); 3851dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (location != null) { 3861dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (checkForCompleteGpsData(location)) { 3871dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsAltitude(location.getAltitude()); 3881dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsLatitude(location.getLatitude()); 3891dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsLongitude(location.getLongitude()); 3901dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsProcessingMethod(location.getProvider().toUpperCase()); 3911dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsTimestamp(location.getTime()); 3921dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } else { 3931dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Log.w(TAG, "Incomplete GPS parameters provided in location " + location); 3941dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 3951dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } else { 3961dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.removeGpsData(); 3971dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 3981dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 3991dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4001dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.orientation 4011dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 40209a6bed6c6e613edfda6cb45499c4277e4446513Ruben Brunk Integer orientation = request.get(CaptureRequest.JPEG_ORIENTATION); 40309a6bed6c6e613edfda6cb45499c4277e4446513Ruben Brunk params.setRotation(ParamsUtils.getOrDefault(request, JPEG_ORIENTATION, 40409a6bed6c6e613edfda6cb45499c4277e4446513Ruben Brunk (orientation == null) ? 0 : orientation)); 4051dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4061dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4071dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.quality 4081dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 4091dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setJpegQuality(0xFF & ParamsUtils.getOrDefault(request, JPEG_QUALITY, 4101dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk DEFAULT_JPEG_QUALITY)); 4111dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4121dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4131dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.thumbnailQuality 4141dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 41589bb63f395ec069aca597fad62128efb0b7684e3Igor Murashkin params.setJpegThumbnailQuality(0xFF & ParamsUtils.getOrDefault(request, 41689bb63f395ec069aca597fad62128efb0b7684e3Igor Murashkin JPEG_THUMBNAIL_QUALITY, DEFAULT_JPEG_QUALITY)); 4171dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4181dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4191dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.thumbnailSize 4201dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 4211dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk List<Camera.Size> sizes = params.getSupportedJpegThumbnailSizes(); 4221dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4231dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (sizes != null && sizes.size() > 0) { 4241dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Size s = request.get(JPEG_THUMBNAIL_SIZE); 4251dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk boolean invalidSize = (s == null) ? false : !ParameterUtils.containsSize(sizes, 4261dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk s.getWidth(), s.getHeight()); 4271dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (invalidSize) { 4281dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Log.w(TAG, "Invalid JPEG thumbnail size set " + s + ", skipping thumbnail..."); 4291dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4301dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (s == null || invalidSize) { 4311dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // (0,0) = "no thumbnail" in Camera API 1 4321dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setJpegThumbnailSize(/*width*/0, /*height*/0); 4331dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } else { 4341dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setJpegThumbnailSize(s.getWidth(), s.getHeight()); 4351dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4361dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4371dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 438442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 439442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 440442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * noiseReduction.* 441442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 442442395751d46aa0f569ad479202a84713a260be0Igor Murashkin // noiseReduction.mode 443442395751d46aa0f569ad479202a84713a260be0Igor Murashkin { 444442395751d46aa0f569ad479202a84713a260be0Igor Murashkin int mode = ParamsUtils.getOrDefault(request, 445442395751d46aa0f569ad479202a84713a260be0Igor Murashkin NOISE_REDUCTION_MODE, 446442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /*defaultValue*/NOISE_REDUCTION_MODE_FAST); 447442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 448442395751d46aa0f569ad479202a84713a260be0Igor Murashkin if (mode != NOISE_REDUCTION_MODE_FAST) { 449442395751d46aa0f569ad479202a84713a260be0Igor Murashkin Log.w(TAG, "convertRequestToMetadata - Ignoring unsupported " + 450442395751d46aa0f569ad479202a84713a260be0Igor Murashkin "noiseReduction.mode = " + mode); 451442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 452442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 4531dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4541dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4551dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk private static boolean checkForCompleteGpsData(Location location) { 4561dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk return location != null && location.getProvider() != null && location.getTime() != 0; 457df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 458df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 4597336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin static int filterSupportedCaptureIntent(int captureIntent) { 4607336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin switch (captureIntent) { 4617336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_CUSTOM: 4627336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_PREVIEW: 4637336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_STILL_CAPTURE: 4647336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_VIDEO_RECORD: 4657336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT: 4667336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 4677336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG: 4687336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_MANUAL: 4697336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW; 4707336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin Log.w(TAG, "Unsupported control.captureIntent value " + captureIntent 4717336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin + "; default to PREVIEW"); 4727336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin default: 4737336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW; 4747336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin Log.w(TAG, "Unknown control.captureIntent value " + captureIntent 4757336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin + "; default to PREVIEW"); 4767336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 4777336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 4787336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin return captureIntent; 4797336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 4807336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 4817ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin private static List<Camera.Area> convertMeteringRegionsToLegacy( 4827ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Rect activeArray, ParameterUtils.ZoomData zoomData, 4837ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle[] meteringRegions, int maxNumMeteringAreas, String regionName) { 4847ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (meteringRegions == null || maxNumMeteringAreas <= 0) { 4857ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (maxNumMeteringAreas > 0) { 4867ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return Arrays.asList(ParameterUtils.CAMERA_AREA_DEFAULT); 4877ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } else { 4887ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return null; 4897ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 4907ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 4917ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 4927ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // Add all non-zero weight regions to the list 4937ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<MeteringRectangle> meteringRectangleList = new ArrayList<>(); 4947ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin for (MeteringRectangle rect : meteringRegions) { 4957ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (rect.getMeteringWeight() != MeteringRectangle.METERING_WEIGHT_DONT_CARE) { 4967ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin meteringRectangleList.add(rect); 4977ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 4987ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 4997ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5007ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // Ignore any regions beyond our maximum supported count 5017ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin int countMeteringAreas = 5027ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Math.min(maxNumMeteringAreas, meteringRectangleList.size()); 5037ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<Camera.Area> meteringAreaList = new ArrayList<>(countMeteringAreas); 5047ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5057ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin for (int i = 0; i < countMeteringAreas; ++i) { 5067ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle rect = meteringRectangleList.get(i); 5077ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5087ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.MeteringData meteringData = 5097ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.convertMeteringRectangleToLegacy(activeArray, rect, zoomData); 5107ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin meteringAreaList.add(meteringData.meteringArea); 5117ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5127ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5137ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (maxNumMeteringAreas < meteringRectangleList.size()) { 5147ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Log.w(TAG, 5157ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin "convertMeteringRegionsToLegacy - Too many requested " + regionName + 5167ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin " regions, ignoring all beyond the first " + maxNumMeteringAreas); 5177ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5187ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5197ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (VERBOSE) { 5207ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Log.v(TAG, "convertMeteringRegionsToLegacy - " + regionName + " areas = " 5217ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin + ParameterUtils.stringFromAreaList(meteringAreaList)); 5227ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5237ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5247ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return meteringAreaList; 5257ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5267ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 527df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapAeAndFlashMode(CaptureRequest r, /*out*/Parameters p) { 52883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int flashMode = ParamsUtils.getOrDefault(r, FLASH_MODE, FLASH_MODE_OFF); 52983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int aeMode = ParamsUtils.getOrDefault(r, CONTROL_AE_MODE, CONTROL_AE_MODE_ON); 530df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 531df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<String> supportedFlashModes = p.getSupportedFlashModes(); 532df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 533396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin String flashModeSetting = null; 534396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 535396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin // Flash is OFF by default, on cameras that support flash 536396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_OFF)) { 537396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_OFF; 538396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 539396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 540df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 541df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Map all of the control.aeMode* enums, but ignore AE_MODE_OFF since we never support it 542df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 543df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 544df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Ignore flash.mode controls unless aeMode == ON 545df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (aeMode == CONTROL_AE_MODE_ON) { 546396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (flashMode == FLASH_MODE_TORCH) { 547396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_TORCH)) { 548396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_TORCH; 549396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 550396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == TORCH;" + 551396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 552396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 553396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (flashMode == FLASH_MODE_SINGLE) { 554396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) { 555396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_ON; 556396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 557396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == SINGLE;" + 558396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 559396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 560396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 561396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin // Use the default FLASH_MODE_OFF 562396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 563396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_ALWAYS_FLASH) { 564396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) { 565396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_ON; 566396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 567396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_ALWAYS_FLASH;" + 568396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 569396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 570396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH) { 571396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_AUTO)) { 572396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_AUTO; 573396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 574396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH;" + 575396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 576df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 577396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 578396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_RED_EYE)) { 579396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_RED_EYE; 580396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 581396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH_REDEYE;" 582396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + "camera does not support it"); 583396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 584df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else { 585df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Default to aeMode == ON, flash = OFF 586396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 587396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 588396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (flashModeSetting != null) { 589396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin p.setFlashMode(flashModeSetting); 590396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 591396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 592396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (VERBOSE) { 593396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.v(TAG, 594396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "mapAeAndFlashMode - set flash.mode (api1) to " + flashModeSetting 595396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + ", requested (api2) " + flashMode 596396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + ", supported (api1) " + ListUtils.listToString(supportedFlashModes)); 597df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 598df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 599df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 600df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 601df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Returns null if the anti-banding mode enum is not supported. 602df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 603df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static String convertAeAntiBandingModeToLegacy(int mode) { 604df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin switch (mode) { 605df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_OFF: { 606df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_OFF; 607df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 608df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_50HZ: { 609df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_50HZ; 610df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 611df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_60HZ: { 612df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_60HZ; 613df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 614df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_AUTO: { 615df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_AUTO; 616df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 617df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin default: { 618df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return null; 619df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 620df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 621df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 622df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 623df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static int[] convertAeFpsRangeToLegacy(Range<Integer> fpsRange) { 624df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] legacyFps = new int[2]; 625df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyFps[Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower(); 626df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin legacyFps[Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper(); 627df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return legacyFps; 628df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 629df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 630733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin private static String convertAwbModeToLegacy(int mode) { 631733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin switch (mode) { 632733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_AUTO: 633733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_AUTO; 634733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_INCANDESCENT: 635733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_INCANDESCENT; 636733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_FLUORESCENT: 637733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_FLUORESCENT; 638733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_WARM_FLUORESCENT: 639733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT; 640733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_DAYLIGHT: 641733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_DAYLIGHT; 642733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 643733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT; 644733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_TWILIGHT: 645733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_TWILIGHT; 646733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin default: 647733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.w(TAG, "convertAwbModeToLegacy - unrecognized control.awbMode" + mode); 648733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_AUTO; 649733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 650733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 651733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 652733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 6533e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /** 6543e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * Return {@code null} if the value is not supported, otherwise return the retrieved key's 6553e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * value from the request (or the default value if it wasn't set). 6563e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * 6573e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * <p>If the fetched value in the request is equivalent to {@code allowedValue}, 6583e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * then omit the warning (e.g. turning off AF lock on a camera 6593e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * that always has the AF lock turned off is a silent no-op), but still return {@code null}.</p> 6603e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * 6613e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * <p>Logs a warning to logcat if the key is not supported by api1 camera device.</p. 6623e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin */ 6633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin private static <T> T getIfSupported( 6643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin CaptureRequest r, CaptureRequest.Key<T> key, T defaultValue, boolean isSupported, 6653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin T allowedValue) { 66683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin T val = ParamsUtils.getOrDefault(r, key, defaultValue); 6673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 6683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (!isSupported) { 6693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (!Objects.equals(val, allowedValue)) { 6703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Log.w(TAG, key.getName() + " is not supported; ignoring requested value " + val); 6713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 6723e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin return null; 6733e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 6743e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 6753e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin return val; 6763e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 677df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin} 678