14961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin/*
24961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Copyright (C) 2014 The Android Open Source Project
34961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin *
44961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
54961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * you may not use this file except in compliance with the License.
64961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * You may obtain a copy of the License at
74961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin *
84961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
94961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin *
104961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Unless required by applicable law or agreed to in writing, software
114961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
124961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * See the License for the specific language governing permissions and
144961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * limitations under the License.
154961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */
164961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
174961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinpackage android.hardware.camera2.legacy;
184961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
194961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.graphics.ImageFormat;
20e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunkimport android.graphics.PixelFormat;
21df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.graphics.Rect;
224961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.Camera;
234961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.Camera.CameraInfo;
24e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkinimport android.hardware.Camera.Parameters;
254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.CameraCharacteristics;
26a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.hardware.camera2.CameraDevice;
27a296fece2b974a11bc624fd67b275863f17df867Igor Murashkinimport android.hardware.camera2.CameraMetadata;
285776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunkimport android.hardware.camera2.CaptureRequest;
296c76f58f31635c19c14ae161f96dad2082537860Igor Murashkinimport android.hardware.camera2.CaptureResult;
304961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.impl.CameraMetadataNative;
316a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunkimport android.hardware.camera2.params.MeteringRectangle;
324961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.params.StreamConfiguration;
334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.hardware.camera2.params.StreamConfigurationDuration;
34df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.utils.ArrayUtils;
35df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.utils.ListUtils;
36df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.hardware.camera2.utils.ParamsUtils;
374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport android.util.Log;
385776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunkimport android.util.Range;
39df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport android.util.Size;
407336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkinimport android.util.SizeF;
414961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport java.util.ArrayList;
435776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunkimport java.util.Arrays;
441dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunkimport java.util.Collections;
454961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport java.util.List;
464961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
474961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport static com.android.internal.util.Preconditions.*;
484961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinimport static android.hardware.camera2.CameraCharacteristics.*;
49df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkinimport static android.hardware.camera2.legacy.ParameterUtils.*;
504961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
514961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin/**
524961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * Provide legacy-specific implementations of camera2 metadata for legacy devices, such as the
534961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin * camera characteristics.
544961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin */
5583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin@SuppressWarnings("deprecation")
564961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkinpublic class LegacyMetadataMapper {
574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    private static final String TAG = "LegacyMetadataMapper";
58a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala    private static final boolean DEBUG = false;
594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
60e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final long NS_PER_MS = 1000000;
61e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
624961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    // from graphics.h
63e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public static final int HAL_PIXEL_FORMAT_RGBA_8888 = PixelFormat.RGBA_8888;
64e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public static final int HAL_PIXEL_FORMAT_BGRA_8888 = 0x5;
65e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public static final int HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED = 0x22;
66e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public static final int HAL_PIXEL_FORMAT_BLOB = 0x21;
674961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
681788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin    // for metadata
691788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin    private static final float LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS = 0.0f;
701788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin
71e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final int REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_RAW = 0; // no raw support
72e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final int REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC = 3; // preview, video, cb
73e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final int REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC_STALL = 1; // 1 jpeg only
74e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final int REQUEST_MAX_NUM_INPUT_STREAMS_COUNT = 0; // no reprocessing
75e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
76e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    /** Assume 3 HAL1 stages: Exposure, Read-out, Post-Processing */
77e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final int REQUEST_PIPELINE_MAX_DEPTH_HAL1 = 3;
78e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    /** Assume 3 shim stages: Preview input, Split output, Format conversion for output */
79e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final int REQUEST_PIPELINE_MAX_DEPTH_OURS = 3;
80e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    /* TODO: Update above maxDepth values once we do more performance measurements */
81e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
82e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    // For approximating JPEG stall durations
83e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final long APPROXIMATE_CAPTURE_DELAY_MS = 200; // 200 milliseconds
84e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final long APPROXIMATE_SENSOR_AREA_PX = (1 << 23); // 8 megapixels
85e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static final long APPROXIMATE_JPEG_ENCODE_TIME_MS = 600; // 600 milliseconds
863e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk
873fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    static final int UNKNOWN_MODE = -1;
883fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
89a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin    // Maximum difference between a preview size aspect ratio and a jpeg size aspect ratio
90a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin    private static final float PREVIEW_ASPECT_RATIO_TOLERANCE = 0.01f;
91a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
92a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    /*
93a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * Development hijinks: Lie about not supporting certain capabilities
94a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
95a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * - Unblock some CTS tests from running whose main intent is not the metadata itself
96a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
97a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * TODO: Remove these constants and strip out any code that previously relied on them
98a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * being set to true.
99a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     */
10049a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin    static final boolean LIE_ABOUT_AE_STATE = false;
1017ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin    static final boolean LIE_ABOUT_AE_MAX_REGIONS = false;
10283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    static final boolean LIE_ABOUT_AF = false;
10383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    static final boolean LIE_ABOUT_AF_MAX_REGIONS = false;
10449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin    static final boolean LIE_ABOUT_AWB_STATE = false;
105733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin    static final boolean LIE_ABOUT_AWB = false;
106a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
107a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
108a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    /**
109a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * Create characteristics for a legacy device by mapping the {@code parameters}
110a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * and {@code info}
111a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
112a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @param parameters A non-{@code null} parameters set
113a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @param info Camera info with camera facing direction and angle of orientation
114a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
115a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @return static camera characteristics for a camera device
116a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
117a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @throws NullPointerException if any of the args were {@code null}
118a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     */
119a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    public static CameraCharacteristics createCharacteristics(Camera.Parameters parameters,
120a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            CameraInfo info) {
121a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        checkNotNull(parameters, "parameters must not be null");
122a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        checkNotNull(info, "info must not be null");
123a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
124a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        String paramStr = parameters.flatten();
125a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        android.hardware.CameraInfo outerInfo = new android.hardware.CameraInfo();
126a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        outerInfo.info = info;
127a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
128a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        return createCharacteristics(paramStr, outerInfo);
129a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    }
130a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
1314961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    /**
1324961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     * Create characteristics for a legacy device by mapping the {@code parameters}
1334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     * and {@code info}
1344961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     *
1354961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     * @param parameters A string parseable by {@link Camera.Parameters#unflatten}
1364961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     * @param info Camera info with camera facing direction and angle of orientation
1374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     * @return static camera characteristics for a camera device
1384961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     *
1394961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     * @throws NullPointerException if any of the args were {@code null}
1404961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin     */
1414961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    public static CameraCharacteristics createCharacteristics(String parameters,
1424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            android.hardware.CameraInfo info) {
1434961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        checkNotNull(parameters, "parameters must not be null");
1444961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        checkNotNull(info, "info must not be null");
1454961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        checkNotNull(info.info, "info.info must not be null");
1464961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1474961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        CameraMetadataNative m = new CameraMetadataNative();
1484961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
149e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        mapCharacteristicsFromInfo(m, info.info);
1504961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1514961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        Camera.Parameters params = Camera.getEmptyParameters();
1524961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        params.unflatten(parameters);
153e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        mapCharacteristicsFromParameters(m, params);
1544961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
155a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala        if (DEBUG) {
1564961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            Log.v(TAG, "createCharacteristics metadata:");
1574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            Log.v(TAG, "--------------------------------------------------- (start)");
1584961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            m.dumpToLog();
1594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            Log.v(TAG, "--------------------------------------------------- (end)");
1604961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        }
1614961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
1624961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        return new CameraCharacteristics(m);
1634961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
1644961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
165e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static void mapCharacteristicsFromInfo(CameraMetadataNative m, CameraInfo i) {
1664961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        m.set(LENS_FACING, i.facing == CameraInfo.CAMERA_FACING_BACK ?
1674961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                LENS_FACING_BACK : LENS_FACING_FRONT);
1684961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        m.set(SENSOR_ORIENTATION, i.orientation);
1694961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
1704961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
171e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static void mapCharacteristicsFromParameters(CameraMetadataNative m,
172e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin            Camera.Parameters p) {
173442395751d46aa0f569ad479202a84713a260be0Igor Murashkin
174442395751d46aa0f569ad479202a84713a260be0Igor Murashkin        /*
175442395751d46aa0f569ad479202a84713a260be0Igor Murashkin         * colorCorrection.*
176442395751d46aa0f569ad479202a84713a260be0Igor Murashkin         */
177442395751d46aa0f569ad479202a84713a260be0Igor Murashkin        m.set(COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
178c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh                new int[] { COLOR_CORRECTION_ABERRATION_MODE_FAST,
179c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh                            COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY });
180e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
181e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * control.ae*
182e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
183a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        mapControlAe(m, p);
184e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
18583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin         * control.af*
18683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin         */
18783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        mapControlAf(m, p);
18883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        /*
189e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * control.awb*
190e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
191a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        mapControlAwb(m, p);
192e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
193e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * control.*
194e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * - Anything that doesn't have a set of related fields
195e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
196e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        mapControlOther(m, p);
197e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
198e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * lens.*
199e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
2001788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        mapLens(m, p);
201e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
202e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * flash.*
203e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
2041788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        mapFlash(m, p);
2051dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk        /*
2061dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk         * jpeg.*
2071dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk         */
2081dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk        mapJpeg(m, p);
209e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
210e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
211442395751d46aa0f569ad479202a84713a260be0Igor Murashkin         * noiseReduction.*
212442395751d46aa0f569ad479202a84713a260be0Igor Murashkin         */
213442395751d46aa0f569ad479202a84713a260be0Igor Murashkin        m.set(NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
214c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh                new int[] { NOISE_REDUCTION_MODE_FAST,
215c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh                            NOISE_REDUCTION_MODE_HIGH_QUALITY});
216442395751d46aa0f569ad479202a84713a260be0Igor Murashkin
217442395751d46aa0f569ad479202a84713a260be0Igor Murashkin        /*
218df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * scaler.*
219df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         */
220df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        mapScaler(m, p);
221df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
222df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        /*
223df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * sensor.*
224df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         */
225df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        mapSensor(m, p);
226df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
227df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        /*
2280a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         * statistics.*
2290a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         */
2300a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        mapStatistics(m, p);
2310a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin
2320a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        /*
233e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * sync.*
234e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
235e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        mapSync(m, p);
2367f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk
2377f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk        /*
2387f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk         * info.supportedHardwareLevel
2397f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk         */
2407ee78d1ee3ee068897b9313af2ed6446675c1be0Igor Murashkin        m.set(INFO_SUPPORTED_HARDWARE_LEVEL, INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY);
2417f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk
2427f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk        /*
2437f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk         * scaler.availableStream*, scaler.available*Durations, sensor.info.maxFrameDuration
2447f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk         */
2457f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk        mapScalerStreamConfigs(m, p);
2467f2372bd85445967ac6cb8c9519ebd1405aaa233Ruben Brunk
247d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin        // Order matters below: Put this last so that we can read the metadata set previously
248d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin
249d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin        /*
250d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin         * request.*
251d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin         */
252d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin        mapRequest(m, p);
253d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin
2544961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
2554961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
256df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    private static void mapScalerStreamConfigs(CameraMetadataNative m, Camera.Parameters p) {
2574961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
2584961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        ArrayList<StreamConfiguration> availableStreamConfigs = new ArrayList<>();
2594961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        /*
2604961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         * Implementation-defined (preview, recording, etc) -> use camera1 preview sizes
2614961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         * YUV_420_888 cpu callbacks -> use camera1 preview sizes
2624961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         * Other preview callbacks (CPU) -> use camera1 preview sizes
2634961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         * JPEG still capture -> use camera1 still capture sizes
2644961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         *
2654961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         * Use platform-internal format constants here, since StreamConfigurationMap does the
2664961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         * remapping to public format constants.
2674961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin         */
268df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        List<Camera.Size> previewSizes = p.getSupportedPreviewSizes();
269a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin        List<Camera.Size> jpegSizes = p.getSupportedPictureSizes();
270a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin        /*
271a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         * Work-around for b/17589233:
272a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         * - Some HALs's largest preview size aspect ratio does not match the largest JPEG size AR
273a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         * - This causes a large amount of problems with focus/metering because it's relative to
274a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         *   preview, making the difference between the JPEG and preview viewport inaccessible
275a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         * - This boils down to metering or focusing areas being "arbitrarily" cropped
276a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         *   in the capture result.
277a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         * - Work-around the HAL limitations by removing all of the largest preview sizes
278a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         *   until we get one with the same aspect ratio as the jpeg size.
279a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin         */
280a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin        {
281a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            SizeAreaComparator areaComparator = new SizeAreaComparator();
282a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
283a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            // Sort preview to min->max
284a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            Collections.sort(previewSizes, areaComparator);
285a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
286a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            Camera.Size maxJpegSize = SizeAreaComparator.findLargestByArea(jpegSizes);
287a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            float jpegAspectRatio = maxJpegSize.width * 1.0f / maxJpegSize.height;
288a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
289a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala            if (DEBUG) {
290a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                Log.v(TAG, String.format("mapScalerStreamConfigs - largest JPEG area %dx%d, AR=%f",
291a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                        maxJpegSize.width, maxJpegSize.height, jpegAspectRatio));
292a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            }
293a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
294a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            // Now remove preview sizes from the end (largest->smallest) until aspect ratio matches
295a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            while (!previewSizes.isEmpty()) {
296a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                int index = previewSizes.size() - 1; // max is always at the end
297a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                Camera.Size size = previewSizes.get(index);
298a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
299a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                float previewAspectRatio = size.width * 1.0f / size.height;
300a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
301a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                if (Math.abs(jpegAspectRatio - previewAspectRatio) >=
302a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                        PREVIEW_ASPECT_RATIO_TOLERANCE) {
303a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                    previewSizes.remove(index); // Assume removing from end is O(1)
304a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
305a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala                    if (DEBUG) {
306a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                        Log.v(TAG, String.format(
307a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                                "mapScalerStreamConfigs - removed preview size %dx%d, AR=%f "
308a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                                        + "was not the same",
309a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                                size.width, size.height, previewAspectRatio));
310a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                    }
311a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                } else {
312a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                    break;
313a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                }
314a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            }
315a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
316a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            if (previewSizes.isEmpty()) {
317a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                // Fall-back to the original faulty behavior, but at least work
318a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                Log.w(TAG, "mapScalerStreamConfigs - failed to find any preview size matching " +
319a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                        "JPEG aspect ratio " + jpegAspectRatio);
320a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin                previewSizes = p.getSupportedPreviewSizes();
321a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            }
322a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
323a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            // Sort again, this time in descending order max->min
324a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            Collections.sort(previewSizes, Collections.reverseOrder(areaComparator));
325a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin        }
326a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin
3274961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        appendStreamConfig(availableStreamConfigs,
3284961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, previewSizes);
3294961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        appendStreamConfig(availableStreamConfigs,
3304961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                ImageFormat.YUV_420_888, previewSizes);
3314961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        for (int format : p.getSupportedPreviewFormats()) {
332ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala            if (ImageFormat.isPublicFormat(format) && format != ImageFormat.NV21) {
3334961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                appendStreamConfig(availableStreamConfigs, format, previewSizes);
334a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala            } else if (DEBUG) {
3354961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                /*
3364961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                 *  Do not add any formats unknown to us
3374961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                 * (since it would fail runtime checks in StreamConfigurationMap)
3384961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                 */
339ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala                Log.v(TAG,
340ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala                        String.format("mapStreamConfigs - Skipping format %x", format));
3414961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            }
3424961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        }
3433e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk
3444961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        appendStreamConfig(availableStreamConfigs,
3454961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                HAL_PIXEL_FORMAT_BLOB, p.getSupportedPictureSizes());
346e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
347e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * scaler.availableStreamConfigurations
348e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
3494961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        m.set(SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
3504961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                availableStreamConfigs.toArray(new StreamConfiguration[0]));
3513e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk
352e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
353e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * scaler.availableMinFrameDurations
354e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
3553e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        // No frame durations available
3563e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        m.set(SCALER_AVAILABLE_MIN_FRAME_DURATIONS, new StreamConfigurationDuration[0]);
3573e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk
3583e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        StreamConfigurationDuration[] jpegStalls =
3593e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk                new StreamConfigurationDuration[jpegSizes.size()];
3603e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        int i = 0;
3615776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        long longestStallDuration = -1;
3623e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        for (Camera.Size s : jpegSizes) {
3635776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            long stallDuration =  calculateJpegStallDuration(s);
3643e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk            jpegStalls[i++] = new StreamConfigurationDuration(HAL_PIXEL_FORMAT_BLOB, s.width,
3655776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                    s.height, stallDuration);
3665776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            if (longestStallDuration < stallDuration) {
3675776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                longestStallDuration = stallDuration;
3685776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            }
3693e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        }
370e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
371e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * scaler.availableStallDurations
372e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
3733e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        // Set stall durations for jpeg, other formats use default stall duration
3743e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        m.set(SCALER_AVAILABLE_STALL_DURATIONS, jpegStalls);
3755776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
376e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
377e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * sensor.info.maxFrameDuration
378e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
3795776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        m.set(SENSOR_INFO_MAX_FRAME_DURATION, longestStallDuration);
3805776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    }
3815776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
3825776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    @SuppressWarnings({"unchecked"})
383a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    private static void mapControlAe(CameraMetadataNative m, Camera.Parameters p) {
384a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        /*
385a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin         * control.aeAvailableAntiBandingModes
386a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin         */
3875776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        List<String> antiBandingModes = p.getSupportedAntibanding();
388df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (antiBandingModes != null && antiBandingModes.size() > 0) { // antibanding is optional
389df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            int[] modes = new int[antiBandingModes.size()];
3905776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            int j = 0;
3915776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            for (String mode : antiBandingModes) {
3925776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                int convertedMode = convertAntiBandingMode(mode);
393a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala                if (DEBUG && convertedMode == -1) {
394ccf6e88eec6081f83b21e97d930205fa5419583eEino-Ville Talvala                    Log.v(TAG, "Antibanding mode " + ((mode == null) ? "NULL" : mode) +
3955776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                            " not supported, skipping...");
3965776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                } else {
3975776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                    modes[j++] = convertedMode;
3985776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                }
3995776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            }
4005776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            m.set(CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, Arrays.copyOf(modes, j));
401df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        } else {
402df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            m.set(CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, new int[0]);
4035776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        }
404a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
405a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        /*
406df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * control.aeAvailableTargetFpsRanges
407a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin         */
408df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        {
409df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            List<int[]> fpsRanges = p.getSupportedPreviewFpsRange();
410df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            if (fpsRanges == null) {
411df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                throw new AssertionError("Supported FPS ranges cannot be null.");
412df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            }
413df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            int rangesSize = fpsRanges.size();
414df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            if (rangesSize <= 0) {
415df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                throw new AssertionError("At least one FPS range must be supported.");
416df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            }
417df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            Range<Integer>[] ranges = new Range[rangesSize];
418df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            int i = 0;
419df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            for (int[] r : fpsRanges) {
420ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh                ranges[i++] = Range.create(
421ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh                        (int) Math.floor(r[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] / 1000.0),
422ec743ee9a4b3111056b0ba9d2fa8e11d8c6c51aaYin-Chia Yeh                        (int) Math.ceil(r[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] / 1000.0));
423df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            }
424df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            m.set(CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, ranges);
425a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        }
426a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
427df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        /*
428df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * control.aeAvailableModes
429df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         */
430df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        {
431df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            List<String> flashModes = p.getSupportedFlashModes();
432df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
433df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            String[] flashModeStrings = new String[] {
43449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin                    Camera.Parameters.FLASH_MODE_OFF,
435df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    Camera.Parameters.FLASH_MODE_AUTO,
436df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    Camera.Parameters.FLASH_MODE_ON,
437df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    Camera.Parameters.FLASH_MODE_RED_EYE,
438df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    // Map these manually
439df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    Camera.Parameters.FLASH_MODE_TORCH,
440a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            };
441df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            int[] flashModeInts = new int[] {
442df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    CONTROL_AE_MODE_ON,
443df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    CONTROL_AE_MODE_ON_AUTO_FLASH,
44449a1d7b7de171246bb5a644c688ad944ead73062Igor Murashkin                    CONTROL_AE_MODE_ON_ALWAYS_FLASH,
445df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE
446df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            };
447df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            int[] aeAvail = ArrayUtils.convertStringListToIntArray(
448df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    flashModes, flashModeStrings, flashModeInts);
449df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
450df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            // No flash control -> AE is always on
451df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            if (aeAvail == null || aeAvail.length == 0) {
452df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                aeAvail = new int[] {
453df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                        CONTROL_AE_MODE_ON
454df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                };
455df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            }
456a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
457df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            // Note that AE_MODE_OFF is never available.
458df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            m.set(CONTROL_AE_AVAILABLE_MODES, aeAvail);
459df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
4603e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin
4613e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin        /*
4623e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin         * control.aeCompensationRanges
4633e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin         */
4643e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin        {
4653e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin            int min = p.getMinExposureCompensation();
4663e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin            int max = p.getMaxExposureCompensation();
4673e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin
4683e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin            m.set(CONTROL_AE_COMPENSATION_RANGE, Range.create(min, max));
4693e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin        }
4703e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin
4713e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin        /*
4723e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin         * control.aeCompensationStep
4733e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin         */
4743e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin        {
4753e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin            float step = p.getExposureCompensationStep();
4763e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin
4773e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin            m.set(CONTROL_AE_COMPENSATION_STEP, ParamsUtils.createRational(step));
4783e280b4bb23be4e5e66ea6381fd63c74fdbd927eIgor Murashkin        }
479d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
480d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        /*
481d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh         * control.aeLockAvailable
482d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh         */
483d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        {
484d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            boolean aeLockAvailable = p.isAutoExposureLockSupported();
485d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
486d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            m.set(CONTROL_AE_LOCK_AVAILABLE, aeLockAvailable);
487d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        }
488a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    }
489a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
49083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
49183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    @SuppressWarnings({"unchecked"})
49283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    private static void mapControlAf(CameraMetadataNative m, Camera.Parameters p) {
49383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        /*
49483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin         * control.afAvailableModes
49583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin         */
49683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        {
49783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            List<String> focusModes = p.getSupportedFocusModes();
49883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
49983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            String[] focusModeStrings = new String[] {
50083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Camera.Parameters.FOCUS_MODE_AUTO,
50183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE,
50283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO,
50383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Camera.Parameters.FOCUS_MODE_EDOF,
50483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Camera.Parameters.FOCUS_MODE_INFINITY,
50583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Camera.Parameters.FOCUS_MODE_MACRO,
50683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    Camera.Parameters.FOCUS_MODE_FIXED,
50783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            };
50883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
50983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            int[] focusModeInts = new int[] {
51083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    CONTROL_AF_MODE_AUTO,
51183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    CONTROL_AF_MODE_CONTINUOUS_PICTURE,
51283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    CONTROL_AF_MODE_CONTINUOUS_VIDEO,
51383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    CONTROL_AF_MODE_EDOF,
51483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    CONTROL_AF_MODE_OFF,
51583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    CONTROL_AF_MODE_MACRO,
51683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    CONTROL_AF_MODE_OFF
51783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            };
51883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
51983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            List<Integer> afAvail = ArrayUtils.convertStringListToIntList(
52083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    focusModes, focusModeStrings, focusModeInts);
52183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
52283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            // No AF modes supported? That's unpossible!
52383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            if (afAvail == null || afAvail.size() == 0) {
52483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                Log.w(TAG, "No AF modes supported (HAL bug); defaulting to AF_MODE_OFF only");
52583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                afAvail = new ArrayList<Integer>(/*capacity*/1);
52683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                afAvail.add(CONTROL_AF_MODE_OFF);
52783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            }
52883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
52983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            m.set(CONTROL_AF_AVAILABLE_MODES, ArrayUtils.toIntArray(afAvail));
53083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
531a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala            if (DEBUG) {
53283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                Log.v(TAG, "mapControlAf - control.afAvailableModes set to " +
53383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                        ListUtils.listToString(afAvail));
53483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            }
53583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
53683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    }
53783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
538a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    private static void mapControlAwb(CameraMetadataNative m, Camera.Parameters p) {
539733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        /*
540733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin         * control.awbAvailableModes
541733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin         */
542733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
543733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        {
544733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            List<String> wbModes = p.getSupportedWhiteBalance();
545733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
546733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            String[] wbModeStrings = new String[] {
547733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_AUTO                    ,
548733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_INCANDESCENT            ,
549733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_FLUORESCENT             ,
550733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_WARM_FLUORESCENT        ,
551733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_DAYLIGHT                ,
552733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT         ,
553733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_TWILIGHT                ,
554733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    Camera.Parameters.WHITE_BALANCE_SHADE                   ,
555733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            };
556733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
557733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            int[] wbModeInts = new int[] {
558733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_AUTO,
559733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_INCANDESCENT            ,
560733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_FLUORESCENT             ,
561733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_WARM_FLUORESCENT        ,
562733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_DAYLIGHT                ,
563733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_CLOUDY_DAYLIGHT         ,
564733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_TWILIGHT                ,
565733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    CONTROL_AWB_MODE_SHADE                   ,
566733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                    // Note that CONTROL_AWB_MODE_OFF is unsupported
567733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            };
568733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
569733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            List<Integer> awbAvail = ArrayUtils.convertStringListToIntList(
570733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                        wbModes, wbModeStrings, wbModeInts);
571733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
572733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            // No AWB modes supported? That's unpossible!
573733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            if (awbAvail == null || awbAvail.size() == 0) {
574733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                Log.w(TAG, "No AWB modes supported (HAL bug); defaulting to AWB_MODE_AUTO only");
575733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                awbAvail = new ArrayList<Integer>(/*capacity*/1);
576733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                awbAvail.add(CONTROL_AWB_MODE_AUTO);
577733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            }
578733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
579733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            m.set(CONTROL_AWB_AVAILABLE_MODES, ArrayUtils.toIntArray(awbAvail));
580733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
581a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala            if (DEBUG) {
582733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                Log.v(TAG, "mapControlAwb - control.awbAvailableModes set to " +
583733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin                        ListUtils.listToString(awbAvail));
584733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            }
585d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
586d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
587d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            /*
588d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh             * control.awbLockAvailable
589d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh             */
590d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            {
591d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh                boolean awbLockAvailable = p.isAutoWhiteBalanceLockSupported();
592d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
593d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh                m.set(CONTROL_AWB_LOCK_AVAILABLE, awbLockAvailable);
594d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            }
595a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        }
5965776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    }
5975776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
598e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static void mapControlOther(CameraMetadataNative m, Camera.Parameters p) {
5990cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh        /*
6000a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         * android.control.availableVideoStabilizationModes
6010a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         */
6020a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        {
6030a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin            int stabModes[] = p.isVideoStabilizationSupported() ?
6040a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                    new int[] { CONTROL_VIDEO_STABILIZATION_MODE_OFF,
6050a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                                CONTROL_VIDEO_STABILIZATION_MODE_ON } :
6060a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                    new int[] { CONTROL_VIDEO_STABILIZATION_MODE_OFF };
6070a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin
6080a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin            m.set(CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, stabModes);
6090a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        }
6100a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin
6110a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        /*
6120cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh         * android.control.maxRegions
6130cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh         */
614d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        final int AE = 0, AWB = 1, AF = 2;
615d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin
6160cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh        int[] maxRegions = new int[3];
617d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        maxRegions[AE] = p.getMaxNumMeteringAreas();
618d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        maxRegions[AWB] = 0; // AWB regions not supported in API1
619d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        maxRegions[AF] = p.getMaxNumFocusAreas();
620d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin
621d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        if (LIE_ABOUT_AE_MAX_REGIONS) {
622d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin            maxRegions[AE] = 0;
623d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        }
624d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        if (LIE_ABOUT_AF_MAX_REGIONS) {
625d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin            maxRegions[AF] = 0;
626d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin        }
627d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin
6280cd62d65dc08fb0b47d834fe295de36868a7def5Yin-Chia Yeh        m.set(CONTROL_MAX_REGIONS, maxRegions);
629d25388c1556ea22821cfb05ab783efaad6652840Igor Murashkin
6303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        /*
6313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk         * android.control.availableEffects
6323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk         */
6333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        List<String> effectModes = p.getSupportedColorEffects();
6343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        int[] supportedEffectModes = (effectModes == null) ? new int[0] :
6353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk                ArrayUtils.convertStringListToIntArray(effectModes, sLegacyEffectMode,
6363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk                        sEffectModes);
6373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        m.set(CONTROL_AVAILABLE_EFFECTS, supportedEffectModes);
6383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
6393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        /*
6403fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk         * android.control.availableSceneModes
6413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk         */
642d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        int maxNumDetectedFaces = p.getMaxNumDetectedFaces();
6433fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        List<String> sceneModes = p.getSupportedSceneModes();
6448c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin        List<Integer> supportedSceneModes =
6458c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin                ArrayUtils.convertStringListToIntList(sceneModes, sLegacySceneModes, sSceneModes);
646d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
647d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        // Special case where the only scene mode listed is AUTO => no scene mode
648d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        if (sceneModes != null && sceneModes.size() == 1 &&
6495f391188dc67c80f89cbab737c552ba7373586e4wei zheng dong                sceneModes.get(0).equals(Parameters.SCENE_MODE_AUTO)) {
650d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            supportedSceneModes = null;
6518c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin        }
652d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
653d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        boolean sceneModeSupported = true;
654d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        if (supportedSceneModes == null && maxNumDetectedFaces == 0) {
655d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            sceneModeSupported = false;
6568c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin        }
657d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
658d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        if (sceneModeSupported) {
659d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            if (supportedSceneModes == null) {
660d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh                supportedSceneModes = new ArrayList<Integer>();
661d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            }
662d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            if (maxNumDetectedFaces > 0) { // always supports FACE_PRIORITY when face detecting
663d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh                supportedSceneModes.add(CONTROL_SCENE_MODE_FACE_PRIORITY);
664d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            }
665d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            // Remove all DISABLED occurrences
666d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            if (supportedSceneModes.contains(CONTROL_SCENE_MODE_DISABLED)) {
667d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh                while(supportedSceneModes.remove(new Integer(CONTROL_SCENE_MODE_DISABLED))) {}
668d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            }
669d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            m.set(CONTROL_AVAILABLE_SCENE_MODES, ArrayUtils.toIntArray(supportedSceneModes));
670d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        } else {
671d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh            m.set(CONTROL_AVAILABLE_SCENE_MODES, new int[] {CONTROL_SCENE_MODE_DISABLED});
672d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        }
673d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh
674d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        /*
675d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh         * android.control.availableModes
676d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh         */
677d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh        m.set(CONTROL_AVAILABLE_MODES, sceneModeSupported ?
678d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh                new int[] { CONTROL_MODE_AUTO, CONTROL_MODE_USE_SCENE_MODE } :
679d9fc67ce3c1498a911df39675b61b96ec1364f08Yin-Chia Yeh                new int[] { CONTROL_MODE_AUTO });
6804961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
6814961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin
6821788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin    private static void mapLens(CameraMetadataNative m, Camera.Parameters p) {
6831788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        /*
6841788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin         *  We can tell if the lens is fixed focus;
6851788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin         *  but if it's not, we can't tell the minimum focus distance, so leave it null then.
6861788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin         */
687a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala        if (DEBUG) {
688d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            Log.v(TAG, "mapLens - focus-mode='" + p.getFocusMode() + "'");
689d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin        }
690d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin
691d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin        if (Camera.Parameters.FOCUS_MODE_FIXED.equals(p.getFocusMode())) {
692e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin            /*
693e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin             * lens.info.minimumFocusDistance
694e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin             */
6951788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin            m.set(LENS_INFO_MINIMUM_FOCUS_DISTANCE, LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS);
696d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin
697a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala            if (DEBUG) {
698d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin                Log.v(TAG, "mapLens - lens.info.minimumFocusDistance = 0");
699d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            }
700d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin        } else {
701a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala            if (DEBUG) {
702d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin                Log.v(TAG, "mapLens - lens.info.minimumFocusDistance is unknown");
703d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            }
7041788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        }
7056a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
7066a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        float[] focalLengths = new float[] { p.getFocalLength() };
7076a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(LENS_INFO_AVAILABLE_FOCAL_LENGTHS, focalLengths);
7081788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin    }
7091788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin
7101788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin    private static void mapFlash(CameraMetadataNative m, Camera.Parameters p) {
7111788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        boolean flashAvailable = false;
7121788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        List<String> supportedFlashModes = p.getSupportedFlashModes();
713df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
7141788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        if (supportedFlashModes != null) {
7151788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin            // If only 'OFF' is available, we don't really have flash support
716df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            flashAvailable = !ListUtils.listElementsEqualTo(
717df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                    supportedFlashModes, Camera.Parameters.FLASH_MODE_OFF);
718a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        }
719a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
720e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
721e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * flash.info.available
722e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
7231788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin        m.set(FLASH_INFO_AVAILABLE, flashAvailable);
7241788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin    }
7251788b0466b029dafd728ce8b097d419c132c1b9eIgor Murashkin
7261dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk    private static void mapJpeg(CameraMetadataNative m, Camera.Parameters p) {
7271dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk        List<Camera.Size> thumbnailSizes = p.getSupportedJpegThumbnailSizes();
7281dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk
7291dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk        if (thumbnailSizes != null) {
7301dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk            Size[] sizes = convertSizeListToArray(thumbnailSizes);
731a0496d34ffc5153bf933cacbd4be71a4a1bd4041Igor Murashkin            Arrays.sort(sizes, new android.hardware.camera2.utils.SizeAreaComparator());
7321dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk            m.set(JPEG_AVAILABLE_THUMBNAIL_SIZES, sizes);
7331dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk        }
7341dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk    }
7351dc1326eaedd11ffd8f85927b8f0195f4f7598d3Ruben Brunk
736e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static void mapRequest(CameraMetadataNative m, Parameters p) {
737e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
738e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * request.availableCapabilities
739e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
740e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        int[] capabilities = { REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE };
741e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        m.set(REQUEST_AVAILABLE_CAPABILITIES, capabilities);
742e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
743e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
7446c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin         * request.availableCharacteristicsKeys
7456c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin         */
7466c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        {
7476c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            // TODO: check if the underlying key is supported before listing a key as available
7486c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
7496c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            // Note: We only list public keys. Native HALs should list ALL keys regardless of visibility.
7506c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
7516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            Key<?> availableKeys[] = new Key<?>[] {
752442395751d46aa0f569ad479202a84713a260be0Igor Murashkin                    CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES     ,
7536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES          ,
7546c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES                      ,
7556c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES          ,
7566c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE                   ,
7576c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP                    ,
75871c605c54abfb182e2b38142f3cf98a6fc1ea75cYin-Chia Yeh                    CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE                       ,
7596c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES                      ,
7606c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS                       ,
761854b523e11ecfb7393d2596a912668a10bae9b41Yin-Chia Yeh                    CameraCharacteristics.CONTROL_AVAILABLE_MODES                         ,
7626c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES                   ,
7636c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES     ,
7646c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES                     ,
76571c605c54abfb182e2b38142f3cf98a6fc1ea75cYin-Chia Yeh                    CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE                      ,
7666c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.CONTROL_MAX_REGIONS                             ,
7676c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.FLASH_INFO_AVAILABLE                            ,
7686c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL                   ,
7696c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES                  ,
7706c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.LENS_FACING                                     ,
7716c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS               ,
772442395751d46aa0f569ad479202a84713a260be0Igor Murashkin                    CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES ,
7736c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES                  ,
7746c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS                  ,
7756c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT                    ,
7766c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH                      ,
7776c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM               ,
7786c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin//                    CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP                 ,
7796c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SCALER_CROPPING_TYPE                            ,
7806c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES             ,
7816c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE                   ,
7826c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE                       ,
7836c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE                    ,
784442395751d46aa0f569ad479202a84713a260be0Igor Murashkin                    CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE                    ,
7856c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SENSOR_ORIENTATION                              ,
7866c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES     ,
7876c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT                  ,
7886c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CameraCharacteristics.SYNC_MAX_LATENCY                                ,
7896c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            };
790d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            List<Key<?>> characteristicsKeys = new ArrayList<>(Arrays.asList(availableKeys));
791d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin
792d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            /*
793d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin             * Add the conditional keys
794d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin             */
795d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            if (m.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE) != null) {
796d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin                characteristicsKeys.add(LENS_INFO_MINIMUM_FOCUS_DISTANCE);
797d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            }
798d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin
799d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            m.set(REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
800d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin                    getTagsForKeys(characteristicsKeys.toArray(new Key<?>[0])));
8016c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        }
8026c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
8036c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        /*
8046c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin         * request.availableRequestKeys
8056c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin         */
8066c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        {
807808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            CaptureRequest.Key<?> defaultAvailableKeys[] = new CaptureRequest.Key<?>[] {
808442395751d46aa0f569ad479202a84713a260be0Igor Murashkin                    CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE,
8096c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AE_ANTIBANDING_MODE,
8106c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,
8116c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AE_LOCK,
8126c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AE_MODE,
8136c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
8146c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AF_MODE,
8156c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AF_TRIGGER,
8166c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AWB_LOCK,
8176c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_AWB_MODE,
8186c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_CAPTURE_INTENT,
8196c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_EFFECT_MODE,
8206c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_MODE,
8216c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_SCENE_MODE,
8226c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
8236c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.FLASH_MODE,
8246c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.JPEG_GPS_COORDINATES,
8256c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.JPEG_GPS_PROCESSING_METHOD,
8266c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.JPEG_GPS_TIMESTAMP,
8276c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.JPEG_ORIENTATION,
8286c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.JPEG_QUALITY,
8296c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.JPEG_THUMBNAIL_QUALITY,
8306c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.JPEG_THUMBNAIL_SIZE,
8316c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.LENS_FOCAL_LENGTH,
832442395751d46aa0f569ad479202a84713a260be0Igor Murashkin                    CaptureRequest.NOISE_REDUCTION_MODE,
8336c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.SCALER_CROP_REGION,
8346c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureRequest.STATISTICS_FACE_DETECT_MODE,
8356c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            };
836808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            ArrayList<CaptureRequest.Key<?>> availableKeys =
837808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                    new ArrayList<CaptureRequest.Key<?>>(Arrays.asList(defaultAvailableKeys));
838808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh
839808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            if (p.getMaxNumMeteringAreas() > 0) {
840808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                availableKeys.add(CaptureRequest.CONTROL_AE_REGIONS);
841808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            }
842808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            if (p.getMaxNumFocusAreas() > 0) {
843808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                availableKeys.add(CaptureRequest.CONTROL_AF_REGIONS);
844808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            }
845808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh
846808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            CaptureRequest.Key<?> availableRequestKeys[] =
847808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                    new CaptureRequest.Key<?>[availableKeys.size()];
848808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            availableKeys.toArray(availableRequestKeys);
849808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            m.set(REQUEST_AVAILABLE_REQUEST_KEYS, getTagsForKeys(availableRequestKeys));
8506c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        }
8516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
8526c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        /*
8536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin         * request.availableResultKeys
8546c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin         */
8556c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        {
856808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            CaptureResult.Key<?> defaultAvailableKeys[] = new CaptureResult.Key<?>[] {
857442395751d46aa0f569ad479202a84713a260be0Igor Murashkin                    CaptureResult.COLOR_CORRECTION_ABERRATION_MODE                 ,
8586c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AE_ANTIBANDING_MODE                      ,
8596c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION                 ,
8606c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AE_LOCK                                  ,
8616c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AE_MODE                                  ,
8626c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AF_MODE                                  ,
8636c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AF_STATE                                 ,
8646c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AWB_MODE                                 ,
8656c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_AWB_LOCK                                 ,
8666c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.CONTROL_MODE                                     ,
8676c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.FLASH_MODE                                       ,
8686c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.JPEG_GPS_COORDINATES                             ,
8696c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.JPEG_GPS_PROCESSING_METHOD                       ,
8706c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.JPEG_GPS_TIMESTAMP                               ,
8716c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.JPEG_ORIENTATION                                 ,
8726c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.JPEG_QUALITY                                     ,
8736c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.JPEG_THUMBNAIL_QUALITY                           ,
8746c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.LENS_FOCAL_LENGTH                                ,
875442395751d46aa0f569ad479202a84713a260be0Igor Murashkin                    CaptureResult.NOISE_REDUCTION_MODE                             ,
8766c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.REQUEST_PIPELINE_DEPTH                           ,
8776c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.SCALER_CROP_REGION                               ,
8786c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.SENSOR_TIMESTAMP                                 ,
8796c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin                    CaptureResult.STATISTICS_FACE_DETECT_MODE                      ,
8806c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin//                    CaptureResult.STATISTICS_FACES                                 ,
8816c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            };
882808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            List<CaptureResult.Key<?>> availableKeys =
883808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                    new ArrayList<CaptureResult.Key<?>>(Arrays.asList(defaultAvailableKeys));
884808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh
885808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            if (p.getMaxNumMeteringAreas() > 0) {
886808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                availableKeys.add(CaptureResult.CONTROL_AE_REGIONS);
887808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            }
888808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            if (p.getMaxNumFocusAreas() > 0) {
889808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                availableKeys.add(CaptureResult.CONTROL_AF_REGIONS);
890808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            }
891808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh
892808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            CaptureResult.Key<?> availableResultKeys[] =
893808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh                    new CaptureResult.Key<?>[availableKeys.size()];
894808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            availableKeys.toArray(availableResultKeys);
895808150f066b53da1573e8b1fbd6b377d0fc229f8Yin-Chia Yeh            m.set(REQUEST_AVAILABLE_RESULT_KEYS, getTagsForKeys(availableResultKeys));
8966c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        }
8976c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
8986c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        /*
899e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * request.maxNumOutputStreams
900e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
901e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        int[] outputStreams = {
902e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                /* RAW */
903e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_RAW,
904e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                /* Processed & Not-Stalling */
905e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC,
906e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                /* Processed & Stalling */
907e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                REQUEST_MAX_NUM_OUTPUT_STREAMS_COUNT_PROC_STALL,
908e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        };
909e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        m.set(REQUEST_MAX_NUM_OUTPUT_STREAMS, outputStreams);
910e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
911e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
912e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * request.maxNumInputStreams
913e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
914e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        m.set(REQUEST_MAX_NUM_INPUT_STREAMS, REQUEST_MAX_NUM_INPUT_STREAMS_COUNT);
915e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
916e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
917733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin         * request.partialResultCount
918733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin         */
919733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        m.set(REQUEST_PARTIAL_RESULT_COUNT, 1); // No partial results supported
920733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
921733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        /*
922e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * request.pipelineMaxDepth
923e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
924e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        m.set(REQUEST_PIPELINE_MAX_DEPTH,
925e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                (byte)(REQUEST_PIPELINE_MAX_DEPTH_HAL1 + REQUEST_PIPELINE_MAX_DEPTH_OURS));
926e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    }
927e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
928df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    private static void mapScaler(CameraMetadataNative m, Parameters p) {
929df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        /*
930df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * scaler.availableMaxDigitalZoom
931df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         */
932df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        m.set(SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, ParameterUtils.getMaxZoomRatio(p));
933df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
934df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        /*
935df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * scaler.croppingType = CENTER_ONLY
936df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         */
937df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        m.set(SCALER_CROPPING_TYPE, SCALER_CROPPING_TYPE_CENTER_ONLY);
938df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
939df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
940df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    private static void mapSensor(CameraMetadataNative m, Parameters p) {
941df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        // Use the largest jpeg size (by area) for both active array and pixel array
942df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        Size largestJpegSize = getLargestSupportedJpegSizeByArea(p);
943df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        /*
944df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * sensor.info.activeArraySize
945df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         */
946df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        {
947df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            Rect activeArrayRect = ParamsUtils.createRect(largestJpegSize);
948df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            m.set(SENSOR_INFO_ACTIVE_ARRAY_SIZE, activeArrayRect);
949df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        }
950df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
951df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        /*
952733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin         * sensor.availableTestPatternModes
953733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin         */
954733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        {
955733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            // Only "OFF" test pattern mode is available
956733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin            m.set(SENSOR_AVAILABLE_TEST_PATTERN_MODES, new int[] { SENSOR_TEST_PATTERN_MODE_OFF });
957733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        }
958733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin
959733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        /*
960df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         * sensor.info.pixelArraySize
961df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin         */
962df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        m.set(SENSOR_INFO_PIXEL_ARRAY_SIZE, largestJpegSize);
9637336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin
9647336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin        /*
9657336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin         * sensor.info.physicalSize
9667336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin         */
9677336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin        {
9687336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            /*
9697336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin             * Assume focal length is at infinity focus and that the lens is rectilinear.
9707336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin             */
9717336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            float focalLength = p.getFocalLength(); // in mm
9727336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            double angleHor = p.getHorizontalViewAngle() * Math.PI / 180; // to radians
9737336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            double angleVer = p.getVerticalViewAngle() * Math.PI / 180; // to radians
9747336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin
9757336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            float height = (float)Math.abs(2 * focalLength * Math.tan(angleVer / 2));
9767336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            float width = (float)Math.abs(2 * focalLength * Math.tan(angleHor / 2));
9777336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin
9787336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            m.set(SENSOR_INFO_PHYSICAL_SIZE, new SizeF(width, height)); // in mm
9797336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin        }
980442395751d46aa0f569ad479202a84713a260be0Igor Murashkin
981442395751d46aa0f569ad479202a84713a260be0Igor Murashkin        /*
982442395751d46aa0f569ad479202a84713a260be0Igor Murashkin         * sensor.info.timestampSource
983442395751d46aa0f569ad479202a84713a260be0Igor Murashkin         */
984442395751d46aa0f569ad479202a84713a260be0Igor Murashkin        {
985442395751d46aa0f569ad479202a84713a260be0Igor Murashkin            m.set(SENSOR_INFO_TIMESTAMP_SOURCE, SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN);
986442395751d46aa0f569ad479202a84713a260be0Igor Murashkin        }
987df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
988df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
9890a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin    private static void mapStatistics(CameraMetadataNative m, Parameters p) {
9900a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        /*
9910a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         * statistics.info.availableFaceDetectModes
9920a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         */
9930a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        int[] fdModes;
9940a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin
9950a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        if (p.getMaxNumDetectedFaces() > 0) {
9960a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin            fdModes = new int[] {
9970a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                STATISTICS_FACE_DETECT_MODE_OFF,
9980a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                STATISTICS_FACE_DETECT_MODE_SIMPLE
9990a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                // FULL is never-listed, since we have no way to query it statically
10000a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin            };
10010a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        } else {
10020a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin            fdModes = new int[] {
10030a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin                STATISTICS_FACE_DETECT_MODE_OFF
10040a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin            };
10050a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        }
10060a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        m.set(STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, fdModes);
10070a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin
10080a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        /*
10090a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         * statistics.info.maxFaceCount
10100a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin         */
10110a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin        m.set(STATISTICS_INFO_MAX_FACE_COUNT, p.getMaxNumDetectedFaces());
10120a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin    }
10130a1ef4dbf39aa3dfae1a91daf972ae3457ce27feIgor Murashkin
1014e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    private static void mapSync(CameraMetadataNative m, Parameters p) {
1015e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        /*
1016e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         * sync.maxLatency
1017e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin         */
1018e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        m.set(SYNC_MAX_LATENCY, SYNC_MAX_LATENCY_UNKNOWN);
1019e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin    }
1020e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin
10214961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    private static void appendStreamConfig(
10224961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            ArrayList<StreamConfiguration> configs, int format, List<Camera.Size> sizes) {
10234961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        for (Camera.Size size : sizes) {
10244961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            StreamConfiguration config =
10254961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin                    new StreamConfiguration(format, size.width, size.height, /*input*/false);
10264961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin            configs.add(config);
10274961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin        }
10284961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin    }
10293e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk
10303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    private final static String[] sLegacySceneModes = {
10313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_AUTO,
10323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_ACTION,
10333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_PORTRAIT,
10343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_LANDSCAPE,
10353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_NIGHT,
10363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_NIGHT_PORTRAIT,
10373fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_THEATRE,
10383fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_BEACH,
10393fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_SNOW,
10403fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_SUNSET,
10413fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_STEADYPHOTO,
10423fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_FIREWORKS,
10433fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_SPORTS,
10443fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_PARTY,
10453fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_CANDLELIGHT,
10463fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.SCENE_MODE_BARCODE,
1047ff99a0add9700b423a0da3e332840e3907ae96a5Ruben Brunk        Parameters.SCENE_MODE_HDR,
10483fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    };
10493fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
10503fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    private final static int[] sSceneModes = {
10513fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED,
10523fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_ACTION,
10533fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_PORTRAIT,
10543fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_LANDSCAPE,
10553fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT,
10563fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT_PORTRAIT,
10573fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_THEATRE,
10583fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_BEACH,
10593fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_SNOW,
10603fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_SUNSET,
10613fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_STEADYPHOTO,
10623fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_FIREWORKS,
10633fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_SPORTS,
10643fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_PARTY,
10653fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_CANDLELIGHT,
10663fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_BARCODE,
1067ff99a0add9700b423a0da3e332840e3907ae96a5Ruben Brunk        CameraCharacteristics.CONTROL_SCENE_MODE_HDR,
10683fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    };
10693fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
10703fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    static int convertSceneModeFromLegacy(String mode) {
10713fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        if (mode == null) {
10723fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk            return CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED;
10733fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        }
10743fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        int index = ArrayUtils.getArrayIndex(sLegacySceneModes, mode);
10753fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        if (index < 0) {
10763fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk            return UNKNOWN_MODE;
10773fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        }
10783fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        return sSceneModes[index];
10793fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    }
10803fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
10813fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    static String convertSceneModeToLegacy(int mode) {
10828c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin        if (mode == CONTROL_SCENE_MODE_FACE_PRIORITY) {
10838c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin            // OK: Let LegacyFaceDetectMapper handle turning face detection on/off
10848c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin            return Parameters.SCENE_MODE_AUTO;
10858c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin        }
10868c4486c14134e81999c8e732fcee3bd7e89ffb69Igor Murashkin
10873fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        int index = ArrayUtils.getArrayIndex(sSceneModes, mode);
10883fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        if (index < 0) {
10893fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk            return null;
10903fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        }
10913fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        return sLegacySceneModes[index];
10923fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    }
10933fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
10943fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    private final static String[] sLegacyEffectMode = {
10953fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_NONE,
10963fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_MONO,
10973fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_NEGATIVE,
10983fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_SOLARIZE,
10993fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_SEPIA,
11003fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_POSTERIZE,
11013fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_WHITEBOARD,
11023fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_BLACKBOARD,
11033fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        Parameters.EFFECT_AQUA,
11043fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    };
11053fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
11063fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    private final static int[] sEffectModes = {
11073fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_OFF,
11083fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_MONO,
11093fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_NEGATIVE,
11103fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_SOLARIZE,
11113fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_SEPIA,
11123fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_POSTERIZE,
11133fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_WHITEBOARD,
11143fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_BLACKBOARD,
11153fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        CameraCharacteristics.CONTROL_EFFECT_MODE_AQUA,
11163fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    };
11173fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
11183fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    static int convertEffectModeFromLegacy(String mode) {
11193fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        if (mode == null) {
11203fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk            return CameraCharacteristics.CONTROL_EFFECT_MODE_OFF;
11213fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        }
11223fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        int index = ArrayUtils.getArrayIndex(sLegacyEffectMode, mode);
11233fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        if (index < 0) {
11243fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk            return UNKNOWN_MODE;
11253fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        }
11263fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        return sEffectModes[index];
11273fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    }
11283fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
11293fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    static String convertEffectModeToLegacy(int mode) {
11303fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        int index = ArrayUtils.getArrayIndex(sEffectModes, mode);
11313fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        if (index < 0) {
11323fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk            return null;
11333fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        }
11343fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk        return sLegacyEffectMode[index];
11353fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk    }
11363fe9eba9044c0b20ed349a4b9094bf1fa7942cdfRuben Brunk
11373e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk    /**
1138df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * Convert the ae antibanding mode from api1 into api2.
1139df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
1140df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @param mode the api1 mode, {@code null} is allowed and will return {@code -1}.
1141df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
1142df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @return The api2 value, or {@code -1} by default if conversion failed
11435776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk     */
1144df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    private static int convertAntiBandingMode(String mode) {
11455776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        if (mode == null) {
11465776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            return -1;
11475776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        }
1148df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin
1149df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        switch (mode) {
11505776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            case Camera.Parameters.ANTIBANDING_OFF: {
11515776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                return CONTROL_AE_ANTIBANDING_MODE_OFF;
11525776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            }
11535776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            case Camera.Parameters.ANTIBANDING_50HZ: {
11545776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                return CONTROL_AE_ANTIBANDING_MODE_50HZ;
11555776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            }
11565776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            case Camera.Parameters.ANTIBANDING_60HZ: {
11575776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                return CONTROL_AE_ANTIBANDING_MODE_60HZ;
11585776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            }
11595776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            case Camera.Parameters.ANTIBANDING_AUTO: {
11605776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                return CONTROL_AE_ANTIBANDING_MODE_AUTO;
11615776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            }
11625776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            default: {
1163df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin                Log.w(TAG, "convertAntiBandingMode - Unknown antibanding mode " + mode);
11645776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk                return -1;
11655776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk            }
11665776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        }
11675776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    }
11685776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
11695776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    /**
1170df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * Convert the ae antibanding mode from api1 into api2.
1171df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
1172df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @param mode the api1 mode, {@code null} is allowed and will return {@code MODE_OFF}.
1173df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     *
1174df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @return The api2 value, or {@code MODE_OFF} by default if conversion failed
11755776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk     */
1176df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    static int convertAntiBandingModeOrDefault(String mode) {
1177df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        int antiBandingMode = convertAntiBandingMode(mode);
1178df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        if (antiBandingMode == -1) {
1179df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin            return CONTROL_AE_ANTIBANDING_MODE_OFF;
11805776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        }
11815776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
1182df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        return antiBandingMode;
1183df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    }
11845776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
11855776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    private static int[] convertAeFpsRangeToLegacy(Range<Integer> fpsRange) {
11865776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        int[] legacyFps = new int[2];
11875776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        legacyFps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] = fpsRange.getLower();
11885776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        legacyFps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX] = fpsRange.getUpper();
11895776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk        return legacyFps;
11905776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    }
11915776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
11925776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    /**
11933e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk     * Return the stall duration for a given output jpeg size in nanoseconds.
11943e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk     *
11953e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk     * <p>An 8mp image is chosen to have a stall duration of 0.8 seconds.</p>
11963e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk     */
11973e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk    private static long calculateJpegStallDuration(Camera.Size size) {
11983e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        long baseDuration = APPROXIMATE_CAPTURE_DELAY_MS * NS_PER_MS; // 200ms for capture
11993e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        long area = size.width * (long) size.height;
1200e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin        long stallPerArea = APPROXIMATE_JPEG_ENCODE_TIME_MS * NS_PER_MS /
1201e1968f6f9d80013ffa9a64b0d1fb5579db18e721Igor Murashkin                APPROXIMATE_SENSOR_AREA_PX; // 600ms stall for 8mp
12023e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk        return baseDuration + area * stallPerArea;
12033e4fed203fe7c945c53c6d6bb9f160932a1d15b3Ruben Brunk    }
12045776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk
12055776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    /**
1206df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * Set the legacy parameters using the {@link LegacyRequest legacy request}.
12075776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk     *
1208df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * <p>The legacy request's parameters are changed as a side effect of calling this
1209df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * method.</p>
12105776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk     *
1211df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin     * @param request a non-{@code null} legacy request
12125776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk     */
1213df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin    public static void convertRequestMetadata(LegacyRequest request) {
1214df6242e374b81e802a38cb891477f05d3e4b3cbcIgor Murashkin        LegacyRequestMapper.convertRequestMetadata(request);
1215a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    }
1216a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
12176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk    private static final int[] sAllowedTemplates = {
12186a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            CameraDevice.TEMPLATE_PREVIEW,
12196a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            CameraDevice.TEMPLATE_STILL_CAPTURE,
12206a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            CameraDevice.TEMPLATE_RECORD,
12216a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            // Disallowed templates in legacy mode:
12226a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            // CameraDevice.TEMPLATE_VIDEO_SNAPSHOT,
12236a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            // CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
12246a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            // CameraDevice.TEMPLATE_MANUAL
12256a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk    };
12266a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
1227a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    /**
1228a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * Create a request template
1229a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
1230a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @param c a non-{@code null} camera characteristics for this camera
1231a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @param templateId a non-negative template ID
1232a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
1233a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @return a non-{@code null} request template
1234a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
1235a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @throws IllegalArgumentException if {@code templateId} was invalid
1236a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     *
1237a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     * @see android.hardware.camera2.CameraDevice#TEMPLATE_MANUAL
1238a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin     */
1239a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin    public static CameraMetadataNative createRequestTemplate(
1240a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            CameraCharacteristics c, int templateId) {
12416a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        if (!ArrayUtils.contains(sAllowedTemplates, templateId)) {
1242a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            throw new IllegalArgumentException("templateId out of range");
1243a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        }
1244a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
1245a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        CameraMetadataNative m = new CameraMetadataNative();
1246a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
1247a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        /*
1248a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin         * NOTE: If adding new code here and it needs to query the static info,
1249a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin         * query the camera characteristics, so we can reuse this for api2 code later
1250a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin         * to create our own templates in the framework
1251a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin         */
1252a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
12536a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        /*
12546a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         * control.*
12556a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         */
12566a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
1257733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        // control.awbMode
1258733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        m.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO);
1259733341bf0db89c93ee1341ddfca9b0c49731c836Igor Murashkin        // AWB is always unconditionally available in API1 devices
1260a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
12616a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.aeAntibandingMode
12626a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CONTROL_AE_ANTIBANDING_MODE_AUTO);
12636a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12646a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.aeExposureCompensation
12656a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
12666a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12676a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.aeLock
12686a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_AE_LOCK, false);
12696a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12706a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.aePrecaptureTrigger
12716a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
12726a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12736a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.afTrigger
12746a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_IDLE);
12756a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12766a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.awbMode
12776a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_AWB_MODE, CONTROL_AWB_MODE_AUTO);
12786a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12796a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.awbLock
12806a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_AWB_LOCK, false);
12816a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12826a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.aeRegions, control.awbRegions, control.afRegions
12836a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        {
12846a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            Rect activeArray = c.get(SENSOR_INFO_ACTIVE_ARRAY_SIZE);
12856a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            MeteringRectangle[] activeRegions =  new MeteringRectangle[] {
12866a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    new MeteringRectangle(/*x*/0, /*y*/0, /*width*/activeArray.width() - 1,
1287e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk                    /*height*/activeArray.height() - 1,/*weight*/0)};
12886a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            m.set(CaptureRequest.CONTROL_AE_REGIONS, activeRegions);
12896a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            m.set(CaptureRequest.CONTROL_AWB_REGIONS, activeRegions);
12906a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            m.set(CaptureRequest.CONTROL_AF_REGIONS, activeRegions);
12916a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        }
12926a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
12936a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.captureIntent
12947336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin        {
12957336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            int captureIntent;
12967336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            switch (templateId) {
12977336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                case CameraDevice.TEMPLATE_PREVIEW:
12987336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    captureIntent = CONTROL_CAPTURE_INTENT_PREVIEW;
12997336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    break;
13007336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                case CameraDevice.TEMPLATE_STILL_CAPTURE:
13017336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    captureIntent = CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
13027336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    break;
13037336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                case CameraDevice.TEMPLATE_RECORD:
13047336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    captureIntent = CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
13057336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    break;
13067336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                default:
13077336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    // Can't get anything else since it's guarded by the IAE check
13087336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin                    throw new AssertionError("Impossible; keep in sync with sAllowedTemplates");
13097336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            }
13107336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin            m.set(CaptureRequest.CONTROL_CAPTURE_INTENT, captureIntent);
13117336f470e3486dbbbc787a2c3ac68a567bc392e8Igor Murashkin        }
13126a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
1313a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        // control.aeMode
1314a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        m.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
1315a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        // AE is always unconditionally available in API1 devices
1316a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
13176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // control.mode
13186a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.CONTROL_MODE, CONTROL_MODE_AUTO);
13196a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
1320a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        // control.afMode
1321a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        {
1322a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            Float minimumFocusDistance = c.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE);
1323a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
1324a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            int afMode;
1325a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            if (minimumFocusDistance != null &&
1326a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin                    minimumFocusDistance == LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS) {
1327a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin                // Cannot control auto-focus with fixed-focus cameras
1328a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin                afMode = CameraMetadata.CONTROL_AF_MODE_OFF;
1329a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            } else {
1330a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin                // If a minimum focus distance is reported; the camera must have AF
1331a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin                afMode = CameraMetadata.CONTROL_AF_MODE_AUTO;
13326a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
13336a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                if (templateId == CameraDevice.TEMPLATE_RECORD ||
13346a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                        templateId == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
13356a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES),
13366a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                            CONTROL_AF_MODE_CONTINUOUS_VIDEO)) {
13376a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                        afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO;
13386a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    }
13396a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                } else if (templateId == CameraDevice.TEMPLATE_PREVIEW ||
13406a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                        templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) {
13416a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES),
13426a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                            CONTROL_AF_MODE_CONTINUOUS_PICTURE)) {
13436a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                        afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
13446a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    }
13456a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                }
1346a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            }
1347a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
1348a78791f22af6c6985d186494737468bb19b69540Eino-Ville Talvala            if (DEBUG) {
1349d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin                Log.v(TAG, "createRequestTemplate (templateId=" + templateId + ")," +
1350d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin                        " afMode=" + afMode + ", minimumFocusDistance=" + minimumFocusDistance);
1351d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin            }
1352d42a5fd3e7fff38dbc8a82484dac53bfbcb61ac4Igor Murashkin
1353a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin            m.set(CaptureRequest.CONTROL_AF_MODE, afMode);
1354a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        }
1355a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin
13566a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        {
13576a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            // control.aeTargetFpsRange
13586a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            Range<Integer>[] availableFpsRange = c.
13596a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
13606a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
13616a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            // Pick FPS range with highest max value, tiebreak on higher min value
13626a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            Range<Integer> bestRange = availableFpsRange[0];
13636a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            for (Range<Integer> r : availableFpsRange) {
13646a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                if (bestRange.getUpper() < r.getUpper()) {
13656a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    bestRange = r;
13666a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                } else if (bestRange.getUpper() == r.getUpper() &&
13676a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                        bestRange.getLower() < r.getLower()) {
13686a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                    bestRange = r;
13696a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                }
13706a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            }
13716a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk            m.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestRange);
13726a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        }
13736a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
1374981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin        // control.sceneMode -- DISABLED is always available
1375981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin        m.set(CaptureRequest.CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_DISABLED);
1376981952d07aa38d3779a5e88ffeb223fc364cd89fIgor Murashkin
13776a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        /*
13786a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         * statistics.*
13796a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         */
13806a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
13816a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // statistics.faceDetectMode
13826a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, STATISTICS_FACE_DETECT_MODE_OFF);
13836a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
13846a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        /*
13856a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         * flash.*
13866a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         */
13876a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
13886a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // flash.mode
13896a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.FLASH_MODE, FLASH_MODE_OFF);
13906a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
13916a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        /*
1392e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk         * noiseReduction.*
1393e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk         */
1394c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        if (templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) {
1395c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh            m.set(CaptureRequest.NOISE_REDUCTION_MODE, NOISE_REDUCTION_MODE_HIGH_QUALITY);
1396c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        } else {
1397c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh            m.set(CaptureRequest.NOISE_REDUCTION_MODE, NOISE_REDUCTION_MODE_FAST);
1398c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        }
1399c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh
1400c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        /*
1401c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        * colorCorrection.*
1402c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        */
1403c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        if (templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) {
1404c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh            m.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE,
1405c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh                    COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY);
1406c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        } else {
1407c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh            m.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE,
1408c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh                    COLOR_CORRECTION_ABERRATION_MODE_FAST);
1409c885b5b12029768966840679b4d0c63602bdf020Yin-Chia Yeh        }
1410e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
1411e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        /*
14126a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         * lens.*
14136a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk         */
14146a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
14156a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        // lens.focalLength
14166a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk        m.set(CaptureRequest.LENS_FOCAL_LENGTH,
14176a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk                c.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0]);
14186a7d8c42890451e01ca7b4baba03d430808265bcRuben Brunk
14193adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala        /*
14203adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala         * jpeg.*
14213adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala         */
14223adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala
14233adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala        // jpeg.thumbnailSize - set smallest non-zero size if possible
14243adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala        Size[] sizes = c.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES);
14253adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala        m.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, (sizes.length > 1) ? sizes[1] : sizes[0]);
14263adf18dc33c1a57983461a3f23976ca9103492c4Eino-Ville Talvala
1427a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        // TODO: map other request template values
1428a296fece2b974a11bc624fd67b275863f17df867Igor Murashkin        return m;
14295776aafc7e70c0b79c4bee2bc50f44121b37c962Ruben Brunk    }
14306c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14316c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin    private static int[] getTagsForKeys(Key<?>[] keys) {
14326c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        int[] tags = new int[keys.length];
14336c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14346c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        for (int i = 0; i < keys.length; ++i) {
14356c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            tags[i] = keys[i].getNativeKey().getTag();
14366c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        }
14376c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14386c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        return tags;
14396c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin    }
14406c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14416c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin    private static int[] getTagsForKeys(CaptureRequest.Key<?>[] keys) {
14426c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        int[] tags = new int[keys.length];
14436c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14446c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        for (int i = 0; i < keys.length; ++i) {
14456c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            tags[i] = keys[i].getNativeKey().getTag();
14466c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        }
14476c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14486c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        return tags;
14496c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin    }
14506c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14516c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin    private static int[] getTagsForKeys(CaptureResult.Key<?>[] keys) {
14526c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        int[] tags = new int[keys.length];
14536c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14546c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        for (int i = 0; i < keys.length; ++i) {
14556c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin            tags[i] = keys[i].getNativeKey().getTag();
14566c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        }
14576c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin
14586c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin        return tags;
14596c76f58f31635c19c14ae161f96dad2082537860Igor Murashkin    }
146083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
146183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    /**
146283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * Convert the requested AF mode into its equivalent supported parameter.
146383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     *
146483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @param mode {@code CONTROL_AF_MODE}
146583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @param supportedFocusModes list of camera1's supported focus modes
146683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     * @return the stringified af mode, or {@code null} if its not supported
146783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin     */
146883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    static String convertAfModeToLegacy(int mode, List<String> supportedFocusModes) {
146983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        if (supportedFocusModes == null || supportedFocusModes.isEmpty()) {
147083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            Log.w(TAG, "No focus modes supported; API1 bug");
147183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            return null;
147283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
147383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
147483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        String param = null;
147583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        switch (mode) {
147683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_MODE_AUTO:
147783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                param = Parameters.FOCUS_MODE_AUTO;
147883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
147983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_MODE_CONTINUOUS_PICTURE:
148083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                param = Parameters.FOCUS_MODE_CONTINUOUS_PICTURE;
148183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
148283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_MODE_CONTINUOUS_VIDEO:
148383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                param = Parameters.FOCUS_MODE_CONTINUOUS_VIDEO;
148483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
148583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_MODE_EDOF:
148683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                param = Parameters.FOCUS_MODE_EDOF;
148783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
148883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_MODE_MACRO:
148983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                param = Parameters.FOCUS_MODE_MACRO;
149083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                break;
149183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            case CONTROL_AF_MODE_OFF:
149283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                if (supportedFocusModes.contains(Parameters.FOCUS_MODE_FIXED)) {
149383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    param = Parameters.FOCUS_MODE_FIXED;
149483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                } else {
149583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    param = Parameters.FOCUS_MODE_INFINITY;
149683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                }
149783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
149883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
149983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        if (!supportedFocusModes.contains(param)) {
150083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            // Weed out bad user input by setting to the first arbitrary focus mode
150183d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            String defaultMode = supportedFocusModes.get(0);
150283d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            Log.w(TAG,
150383d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                    String.format(
150483d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            "convertAfModeToLegacy - ignoring unsupported mode %d, " +
150583d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin                            "defaulting to %s", mode, defaultMode));
150683d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin            param = defaultMode;
150783d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        }
150883d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin
150983d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin        return param;
151083d8639e901a24e59c9886dd6910faf3ba7adae1Igor Murashkin    }
15114961bc88d7bab869a5296789d26fcfa31ad5f644Igor Murashkin}
1512