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