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 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"; 45a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala private static final boolean DEBUG = false; 46df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 4789bb63f395ec069aca597fad62128efb0b7684e3Igor Murashkin /** Default quality for android.jpeg.quality, android.jpeg.thumbnailQuality */ 481dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk private static final byte DEFAULT_JPEG_QUALITY = 85; 491dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 50df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 51df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Set the legacy parameters using the {@link LegacyRequest legacy request}. 52df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 53df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * <p>The legacy request's parameters are changed as a side effect of calling this 54df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * method.</p> 55df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * 56df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * @param legacyRequest a non-{@code null} legacy request 57df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 58df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin public static void convertRequestMetadata(LegacyRequest legacyRequest) { 59df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CameraCharacteristics characteristics = legacyRequest.characteristics; 60df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin CaptureRequest request = legacyRequest.captureRequest; 61df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Size previewSize = legacyRequest.previewSize; 62df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Camera.Parameters params = legacyRequest.parameters; 63df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 647ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Rect activeArray = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); 657ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 66df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 67df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * scaler.cropRegion 68df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 697ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.ZoomData zoomData; 70df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin { 717ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin zoomData = ParameterUtils.convertScalerCropRegion(activeArray, 727ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin request.get(SCALER_CROP_REGION), 737ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin previewSize, 747ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin params); 75df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 76df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (params.isZoomSupported()) { 777ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin params.setZoom(zoomData.zoomIndex); 78a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala } else if (DEBUG) { 79df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin Log.v(TAG, "convertRequestToMetadata - zoom is not supported"); 80df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 81df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 82df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 83442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 84442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * colorCorrection.* 85442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 86442395751d46aa0f569ad479202a84713a260be0Igor Murashkin // colorCorrection.aberrationMode 87442395751d46aa0f569ad479202a84713a260be0Igor Murashkin { 88442395751d46aa0f569ad479202a84713a260be0Igor Murashkin int aberrationMode = ParamsUtils.getOrDefault(request, 89442395751d46aa0f569ad479202a84713a260be0Igor Murashkin COLOR_CORRECTION_ABERRATION_MODE, 90442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /*defaultValue*/COLOR_CORRECTION_ABERRATION_MODE_FAST); 91442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 92c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh if (aberrationMode != COLOR_CORRECTION_ABERRATION_MODE_FAST && 93c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh aberrationMode != COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY) { 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 166ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh int[] rangeToApply = null; 1677f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk for(int[] range : params.getSupportedPreviewFpsRange()) { 168ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh // Round range up/down to integer FPS value 169ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh int intRangeLow = (int) Math.floor(range[0] / 1000.0) * 1000; 170ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh int intRangeHigh = (int) Math.ceil(range[1] / 1000.0) * 1000; 171ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh if (legacyFps[0] == intRangeLow && legacyFps[1] == intRangeHigh) { 172ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh rangeToApply = range; 1737f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk break; 1747f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 1757f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 176ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh if (rangeToApply != null) { 177ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh params.setPreviewFpsRange(rangeToApply[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], 178ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh rangeToApply[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); 1797f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } else { 1807f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk Log.w(TAG, "Unsupported FPS range set [" + legacyFps[0] + "," + legacyFps[1] + "]"); 1817f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk } 182df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 183df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 184df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 185df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * control 186df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 187df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 1883e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // control.aeExposureCompensation 1893e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 1903e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Range<Integer> compensationRange = 1913e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE); 19283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int compensation = ParamsUtils.getOrDefault(request, 1933e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin CONTROL_AE_EXPOSURE_COMPENSATION, 1943e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*defaultValue*/0); 1953e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 1965d2fa0e0b5db09323a706f914bd268a764070425Lajos Molnar if (!compensationRange.contains(compensation)) { 1973e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Log.w(TAG, 1983e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin "convertRequestMetadata - control.aeExposureCompensation " + 1993e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin "is out of range, ignoring value"); 2003e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin compensation = 0; 2013e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2023e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2033e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setExposureCompensation(compensation); 2043e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2053e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2063e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // control.aeLock 2073e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 2083e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Boolean aeLock = getIfSupported(request, CONTROL_AE_LOCK, /*defaultValue*/false, 2093e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.isAutoExposureLockSupported(), 2103e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*allowedValue*/false); 2113e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2123e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (aeLock != null) { 2133e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setAutoExposureLock(aeLock); 2143e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2153e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 216a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 21749a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.aeLock set to " + aeLock); 21849a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin } 21949a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin 2203e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // TODO: Don't add control.aeLock to availableRequestKeys if it's not supported 2213e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2223e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 223df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.aeMode, flash.mode 224df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin mapAeAndFlashMode(request, /*out*/params); 225df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 22683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // control.afMode 22783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 22883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int afMode = ParamsUtils.getOrDefault(request, CONTROL_AF_MODE, 22983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /*defaultValue*/CONTROL_AF_MODE_OFF); 23083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin String focusMode = LegacyMetadataMapper.convertAfModeToLegacy(afMode, 23183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin params.getSupportedFocusModes()); 23283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 23383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (focusMode != null) { 23483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin params.setFocusMode(focusMode); 23583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 23683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 237a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 23883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.afMode " 23983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + afMode + " mapped to " + focusMode); 24083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 24183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 24283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 243733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // control.awbMode 244733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 245733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Integer awbMode = getIfSupported(request, CONTROL_AWB_MODE, 246733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /*defaultValue*/CONTROL_AWB_MODE_AUTO, 247733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin params.getSupportedWhiteBalance() != null, 248733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /*allowedValue*/CONTROL_AWB_MODE_AUTO); 249733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 250733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin String whiteBalanceMode = null; 251733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin if (awbMode != null) { // null iff AWB is not supported by camera1 api 252733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin whiteBalanceMode = convertAwbModeToLegacy(awbMode); 253733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin params.setWhiteBalance(whiteBalanceMode); 254733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 255733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 256a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 257733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.v(TAG, "convertRequestToMetadata - control.awbMode " 258733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin + awbMode + " mapped to " + whiteBalanceMode); 259733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 260733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 261733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 262df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // control.awbLock 2633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin { 2643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Boolean awbLock = getIfSupported(request, CONTROL_AWB_LOCK, /*defaultValue*/false, 2653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.isAutoWhiteBalanceLockSupported(), 2663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /*allowedValue*/false); 267df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 2683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (awbLock != null) { 2693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin params.setAutoWhiteBalanceLock(awbLock); 2703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 2713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 2723e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin // TODO: Don't add control.awbLock to availableRequestKeys if it's not supported 2733e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 27483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 2757336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin // control.captureIntent 2767336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin { 2777336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin int captureIntent = ParamsUtils.getOrDefault(request, 2787336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin CONTROL_CAPTURE_INTENT, 2797336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin /*defaultValue*/CONTROL_CAPTURE_INTENT_PREVIEW); 2807336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 2817336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = filterSupportedCaptureIntent(captureIntent); 2827336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 2837336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin params.setRecordingHint( 2847336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent == CONTROL_CAPTURE_INTENT_VIDEO_RECORD || 2857336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent == CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT); 2867336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 2877336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 2880a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin // control.videoStabilizationMode 2890a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin { 2900a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin Integer stabMode = getIfSupported(request, CONTROL_VIDEO_STABILIZATION_MODE, 2910a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /*defaultValue*/CONTROL_VIDEO_STABILIZATION_MODE_OFF, 2920a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin params.isVideoStabilizationSupported(), 2930a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin /*allowedValue*/CONTROL_VIDEO_STABILIZATION_MODE_OFF); 2940a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 2950a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin if (stabMode != null) { 2960a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin params.setVideoStabilization(stabMode == CONTROL_VIDEO_STABILIZATION_MODE_ON); 2970a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 2980a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin } 2990a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin 30083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin // lens.focusDistance 30183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin { 30283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin boolean infinityFocusSupported = 30383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin ListUtils.listContains(params.getSupportedFocusModes(), 30483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Parameters.FOCUS_MODE_INFINITY); 30583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Float focusDistance = getIfSupported(request, LENS_FOCUS_DISTANCE, 30683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin /*defaultValue*/0f, infinityFocusSupported, /*allowedValue*/0f); 30783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin 30883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin if (focusDistance == null || focusDistance != 0f) { 30983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin Log.w(TAG, 31083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin "convertRequestToMetadata - Ignoring android.lens.focusDistance " 31183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin + infinityFocusSupported + ", only 0.0f is supported"); 31283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 31383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin } 3143fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 3153fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // control.sceneMode, control.mode 3163fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk { 3173fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // TODO: Map FACE_PRIORITY scene mode to face detection. 3183fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 3193fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (params.getSupportedSceneModes() != null) { 3203fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int controlMode = ParamsUtils.getOrDefault(request, CONTROL_MODE, 3213fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /*defaultValue*/CONTROL_MODE_AUTO); 3223fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String modeToSet; 3233fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk switch (controlMode) { 3243fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk case CONTROL_MODE_USE_SCENE_MODE: { 3253fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int sceneMode = ParamsUtils.getOrDefault(request, CONTROL_SCENE_MODE, 3268c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin /*defaultValue*/CONTROL_SCENE_MODE_DISABLED); 3273fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String legacySceneMode = LegacyMetadataMapper. 3283fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk convertSceneModeToLegacy(sceneMode); 3293fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (legacySceneMode != null) { 3303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = legacySceneMode; 3313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } else { 3323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 3333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Skipping unknown requested scene mode: " + sceneMode); 3343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk break; 3363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk case CONTROL_MODE_AUTO: { 3383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 3393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk break; 3403fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk default: { 3423fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Control mode " + controlMode + 3433fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk " is unsupported, defaulting to AUTO"); 3443fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk modeToSet = Parameters.SCENE_MODE_AUTO; 3453fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3463fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3473fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setSceneMode(modeToSet); 3483fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3493fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3503fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk 3513fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk // control.effectMode 3523fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk { 3533fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (params.getSupportedColorEffects() != null) { 3543fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk int effectMode = ParamsUtils.getOrDefault(request, CONTROL_EFFECT_MODE, 3553fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk /*defaultValue*/CONTROL_EFFECT_MODE_OFF); 3563fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk String legacyEffectMode = LegacyMetadataMapper.convertEffectModeToLegacy(effectMode); 3573fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk if (legacyEffectMode != null) { 3583fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setColorEffect(legacyEffectMode); 3593fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } else { 3603fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk params.setColorEffect(Parameters.EFFECT_NONE); 3613fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk Log.w(TAG, "Skipping unknown requested effect mode: " + effectMode); 3623fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3633fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 3643fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk } 365733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 366733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /* 367733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin * sensor 368733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin */ 369733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 370733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin // sensor.testPattern 371733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin { 372733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin int testPatternMode = ParamsUtils.getOrDefault(request, SENSOR_TEST_PATTERN_MODE, 373733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin /*defaultValue*/SENSOR_TEST_PATTERN_MODE_OFF); 374733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin if (testPatternMode != SENSOR_TEST_PATTERN_MODE_OFF) { 375733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.w(TAG, "convertRequestToMetadata - ignoring sensor.testPatternMode " 376733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin + testPatternMode + "; only OFF is supported"); 377733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 378733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 3791dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 3801dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk /* 3811dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk * jpeg.* 3821dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk */ 3831dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 3841dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.gpsLocation 3851dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 3861dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Location location = request.get(JPEG_GPS_LOCATION); 3871dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (location != null) { 3881dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (checkForCompleteGpsData(location)) { 3891dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsAltitude(location.getAltitude()); 3901dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsLatitude(location.getLatitude()); 3911dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsLongitude(location.getLongitude()); 3921dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsProcessingMethod(location.getProvider().toUpperCase()); 3931dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setGpsTimestamp(location.getTime()); 3941dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } else { 3951dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Log.w(TAG, "Incomplete GPS parameters provided in location " + location); 3961dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 3971dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } else { 3981dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.removeGpsData(); 3991dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4001dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4011dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4021dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.orientation 4031dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 40409a6bed6c6e613edfda6cb45499c4277e4446513Ruben Brunk Integer orientation = request.get(CaptureRequest.JPEG_ORIENTATION); 40509a6bed6c6e613edfda6cb45499c4277e4446513Ruben Brunk params.setRotation(ParamsUtils.getOrDefault(request, JPEG_ORIENTATION, 40609a6bed6c6e613edfda6cb45499c4277e4446513Ruben Brunk (orientation == null) ? 0 : orientation)); 4071dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4081dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4091dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.quality 4101dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 4111dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setJpegQuality(0xFF & ParamsUtils.getOrDefault(request, JPEG_QUALITY, 4121dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk DEFAULT_JPEG_QUALITY)); 4131dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4141dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4151dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.thumbnailQuality 4161dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 41789bb63f395ec069aca597fad62128efb0b7684e3Igor Murashkin params.setJpegThumbnailQuality(0xFF & ParamsUtils.getOrDefault(request, 41889bb63f395ec069aca597fad62128efb0b7684e3Igor Murashkin JPEG_THUMBNAIL_QUALITY, DEFAULT_JPEG_QUALITY)); 4191dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4201dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4211dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // jpeg.thumbnailSize 4221dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk { 4231dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk List<Camera.Size> sizes = params.getSupportedJpegThumbnailSizes(); 4241dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4251dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (sizes != null && sizes.size() > 0) { 4261dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Size s = request.get(JPEG_THUMBNAIL_SIZE); 4271dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk boolean invalidSize = (s == null) ? false : !ParameterUtils.containsSize(sizes, 4281dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk s.getWidth(), s.getHeight()); 4291dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (invalidSize) { 4301dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk Log.w(TAG, "Invalid JPEG thumbnail size set " + s + ", skipping thumbnail..."); 4311dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4321dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk if (s == null || invalidSize) { 4331dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk // (0,0) = "no thumbnail" in Camera API 1 4341dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setJpegThumbnailSize(/*width*/0, /*height*/0); 4351dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } else { 4361dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk params.setJpegThumbnailSize(s.getWidth(), s.getHeight()); 4371dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4381dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4391dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 440442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 441442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /* 442442395751d46aa0f569ad479202a84713a260be0Igor Murashkin * noiseReduction.* 443442395751d46aa0f569ad479202a84713a260be0Igor Murashkin */ 444442395751d46aa0f569ad479202a84713a260be0Igor Murashkin // noiseReduction.mode 445442395751d46aa0f569ad479202a84713a260be0Igor Murashkin { 446442395751d46aa0f569ad479202a84713a260be0Igor Murashkin int mode = ParamsUtils.getOrDefault(request, 447442395751d46aa0f569ad479202a84713a260be0Igor Murashkin NOISE_REDUCTION_MODE, 448442395751d46aa0f569ad479202a84713a260be0Igor Murashkin /*defaultValue*/NOISE_REDUCTION_MODE_FAST); 449442395751d46aa0f569ad479202a84713a260be0Igor Murashkin 450c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh if (mode != NOISE_REDUCTION_MODE_FAST && 451c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh mode != NOISE_REDUCTION_MODE_HIGH_QUALITY) { 452442395751d46aa0f569ad479202a84713a260be0Igor Murashkin Log.w(TAG, "convertRequestToMetadata - Ignoring unsupported " + 453442395751d46aa0f569ad479202a84713a260be0Igor Murashkin "noiseReduction.mode = " + mode); 454442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 455442395751d46aa0f569ad479202a84713a260be0Igor Murashkin } 4561dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk } 4571dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk 4581dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk private static boolean checkForCompleteGpsData(Location location) { 4591dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk return location != null && location.getProvider() != null && location.getTime() != 0; 460df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 461df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 4627336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin static int filterSupportedCaptureIntent(int captureIntent) { 4637336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin switch (captureIntent) { 4647336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_CUSTOM: 4657336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_PREVIEW: 4667336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_STILL_CAPTURE: 4677336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_VIDEO_RECORD: 4687336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT: 4697336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin break; 4707336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG: 4717336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin case CONTROL_CAPTURE_INTENT_MANUAL: 4727336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW; 4737336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin Log.w(TAG, "Unsupported control.captureIntent value " + captureIntent 4747336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin + "; default to PREVIEW"); 4757336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin default: 4767336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW; 4777336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin Log.w(TAG, "Unknown control.captureIntent value " + captureIntent 4787336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin + "; default to PREVIEW"); 4797336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 4807336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 4817336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin return captureIntent; 4827336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin } 4837336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin 4847ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin private static List<Camera.Area> convertMeteringRegionsToLegacy( 4857ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Rect activeArray, ParameterUtils.ZoomData zoomData, 4867ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle[] meteringRegions, int maxNumMeteringAreas, String regionName) { 4877ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (meteringRegions == null || maxNumMeteringAreas <= 0) { 4887ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (maxNumMeteringAreas > 0) { 4897ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return Arrays.asList(ParameterUtils.CAMERA_AREA_DEFAULT); 4907ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } else { 4917ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return null; 4927ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 4937ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 4947ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 4957ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // Add all non-zero weight regions to the list 4967ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<MeteringRectangle> meteringRectangleList = new ArrayList<>(); 4977ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin for (MeteringRectangle rect : meteringRegions) { 4987ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (rect.getMeteringWeight() != MeteringRectangle.METERING_WEIGHT_DONT_CARE) { 4997ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin meteringRectangleList.add(rect); 5007ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5017ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5027ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 50397b5301b093000e74f70f1db0453eec3610b4215Ruben Brunk if (meteringRectangleList.size() == 0) { 50497b5301b093000e74f70f1db0453eec3610b4215Ruben Brunk Log.w(TAG, "Only received metering rectangles with weight 0."); 50597b5301b093000e74f70f1db0453eec3610b4215Ruben Brunk return Arrays.asList(ParameterUtils.CAMERA_AREA_DEFAULT); 50697b5301b093000e74f70f1db0453eec3610b4215Ruben Brunk } 50797b5301b093000e74f70f1db0453eec3610b4215Ruben Brunk 5087ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin // Ignore any regions beyond our maximum supported count 5097ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin int countMeteringAreas = 5107ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Math.min(maxNumMeteringAreas, meteringRectangleList.size()); 5117ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin List<Camera.Area> meteringAreaList = new ArrayList<>(countMeteringAreas); 5127ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5137ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin for (int i = 0; i < countMeteringAreas; ++i) { 5147ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin MeteringRectangle rect = meteringRectangleList.get(i); 5157ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5167ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.MeteringData meteringData = 5177ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin ParameterUtils.convertMeteringRectangleToLegacy(activeArray, rect, zoomData); 5187ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin meteringAreaList.add(meteringData.meteringArea); 5197ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5207ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5217ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin if (maxNumMeteringAreas < meteringRectangleList.size()) { 5227ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Log.w(TAG, 5237ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin "convertMeteringRegionsToLegacy - Too many requested " + regionName + 5247ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin " regions, ignoring all beyond the first " + maxNumMeteringAreas); 5257ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5267ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 527a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 5287ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin Log.v(TAG, "convertMeteringRegionsToLegacy - " + regionName + " areas = " 5297ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin + ParameterUtils.stringFromAreaList(meteringAreaList)); 5307ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5317ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 5327ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin return meteringAreaList; 5337ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin } 5347ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin 535df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static void mapAeAndFlashMode(CaptureRequest r, /*out*/Parameters p) { 53683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int flashMode = ParamsUtils.getOrDefault(r, FLASH_MODE, FLASH_MODE_OFF); 53783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin int aeMode = ParamsUtils.getOrDefault(r, CONTROL_AE_MODE, CONTROL_AE_MODE_ON); 538df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 539df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin List<String> supportedFlashModes = p.getSupportedFlashModes(); 540df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 541396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin String flashModeSetting = null; 542396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 543396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin // Flash is OFF by default, on cameras that support flash 544396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_OFF)) { 545396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_OFF; 546396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 547396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 548df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /* 549df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Map all of the control.aeMode* enums, but ignore AE_MODE_OFF since we never support it 550df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 551df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 552df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Ignore flash.mode controls unless aeMode == ON 553df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin if (aeMode == CONTROL_AE_MODE_ON) { 554396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (flashMode == FLASH_MODE_TORCH) { 555396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_TORCH)) { 556396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_TORCH; 557396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 558396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == TORCH;" + 559396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 560396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 561396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (flashMode == FLASH_MODE_SINGLE) { 562396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) { 563396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_ON; 564396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 565396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore flash.mode == SINGLE;" + 566396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 567396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 568396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 569396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin // Use the default FLASH_MODE_OFF 570396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 571396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_ALWAYS_FLASH) { 572396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_ON)) { 573396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_ON; 574396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 575396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_ALWAYS_FLASH;" + 576396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 577396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 578396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH) { 579396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_AUTO)) { 580396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_AUTO; 581396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 582396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH;" + 583396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "camera does not support it"); 584df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 585396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else if (aeMode == CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 586396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (ListUtils.listContains(supportedFlashModes, Parameters.FLASH_MODE_RED_EYE)) { 587396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin flashModeSetting = Parameters.FLASH_MODE_RED_EYE; 588396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } else { 589396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.w(TAG, "mapAeAndFlashMode - Ignore control.aeMode == ON_AUTO_FLASH_REDEYE;" 590396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + "camera does not support it"); 591396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 592df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } else { 593df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin // Default to aeMode == ON, flash = OFF 594396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 595396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 596396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin if (flashModeSetting != null) { 597396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin p.setFlashMode(flashModeSetting); 598396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin } 599396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin 600a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala if (DEBUG) { 601396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin Log.v(TAG, 602396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin "mapAeAndFlashMode - set flash.mode (api1) to " + flashModeSetting 603396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + ", requested (api2) " + flashMode 604396532ffb80f70c336b3564e5bac4c09d3be07ffIgor Murashkin + ", supported (api1) " + ListUtils.listToString(supportedFlashModes)); 605df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 606df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 607df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 608df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin /** 609df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin * Returns null if the anti-banding mode enum is not supported. 610df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin */ 611df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static String convertAeAntiBandingModeToLegacy(int mode) { 612df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin switch (mode) { 613df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_OFF: { 614df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_OFF; 615df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 616df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_50HZ: { 617df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_50HZ; 618df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 619df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_60HZ: { 620df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_60HZ; 621df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 622df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin case CONTROL_AE_ANTIBANDING_MODE_AUTO: { 623df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return Parameters.ANTIBANDING_AUTO; 624df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 625df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin default: { 626df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return null; 627df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 628df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 629df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 630df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 631df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin private static int[] convertAeFpsRangeToLegacy(Range<Integer> fpsRange) { 632df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin int[] legacyFps = new int[2]; 633ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh legacyFps[Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower() * 1000; 634ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh legacyFps[Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper() * 1000; 635df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin return legacyFps; 636df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin } 637df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin 638733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin private static String convertAwbModeToLegacy(int mode) { 639733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin switch (mode) { 640733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_AUTO: 641733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_AUTO; 642733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_INCANDESCENT: 643733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_INCANDESCENT; 644733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_FLUORESCENT: 645733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_FLUORESCENT; 646733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_WARM_FLUORESCENT: 647733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT; 648733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_DAYLIGHT: 649733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_DAYLIGHT; 650733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 651733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT; 652733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin case CONTROL_AWB_MODE_TWILIGHT: 653733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_TWILIGHT; 65472a23d7b50afe2c2eba999da718864dce79f44bdRuben Brunk case CONTROL_AWB_MODE_SHADE: 65572a23d7b50afe2c2eba999da718864dce79f44bdRuben Brunk return Parameters.WHITE_BALANCE_SHADE; 656733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin default: 657733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin Log.w(TAG, "convertAwbModeToLegacy - unrecognized control.awbMode" + mode); 658733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin return Camera.Parameters.WHITE_BALANCE_AUTO; 659733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 660733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin } 661733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 662733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin 6633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin /** 6643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * Return {@code null} if the value is not supported, otherwise return the retrieved key's 6653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * value from the request (or the default value if it wasn't set). 6663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * 6673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * <p>If the fetched value in the request is equivalent to {@code allowedValue}, 6683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * then omit the warning (e.g. turning off AF lock on a camera 6693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * that always has the AF lock turned off is a silent no-op), but still return {@code null}.</p> 6703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * 6713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin * <p>Logs a warning to logcat if the key is not supported by api1 camera device.</p. 6723e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin */ 6733e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin private static <T> T getIfSupported( 6743e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin CaptureRequest r, CaptureRequest.Key<T> key, T defaultValue, boolean isSupported, 6753e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin T allowedValue) { 67683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin T val = ParamsUtils.getOrDefault(r, key, defaultValue); 6773e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 6783e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (!isSupported) { 6793e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin if (!Objects.equals(val, allowedValue)) { 6803e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin Log.w(TAG, key.getName() + " is not supported; ignoring requested value " + val); 6813e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 6823e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin return null; 6833e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 6843e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin 6853e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin return val; 6863e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin } 687df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin} 688