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