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