12e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala/* 22e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 32e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * 42e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 52e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * you may not use this file except in compliance with the License. 62e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * You may obtain a copy of the License at 72e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * 82e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 92e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * 102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * See the License for the specific language governing permissions and 142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * limitations under the License. 152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala */ 162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2PARAMETERS_H 182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2PARAMETERS_H 192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <system/graphics.h> 212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2236802bd18b7b4e8c87fa019c7e3068bee330d174Dan Albert#include <utils/Compat.h> 232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <utils/Errors.h> 2436802bd18b7b4e8c87fa019c7e3068bee330d174Dan Albert#include <utils/KeyedVector.h> 252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <utils/Mutex.h> 262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <utils/String8.h> 272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <utils/Vector.h> 2836802bd18b7b4e8c87fa019c7e3068bee330d174Dan Albert 298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala#include <camera/CameraParameters.h> 300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include <camera/CameraParameters2.h> 317efa520c76e6a1f6b3146404cc6aca5a8353583aIgor Murashkin#include <camera/CameraMetadata.h> 322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android { 342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 { 352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** 37da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Current camera state; this is the full state of the Camera under the old 380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * camera API (contents of the CameraParameters2 object in a more-efficient 39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * format, plus other state). The enum values are mostly based off the 40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * corresponding camera2 enums, not the camera1 strings. A few are defined here 41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * if they don't cleanly map to camera2 values. 42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastruct Parameters { 44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala /** 45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Parameters and other state 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int cameraId; 482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int cameraFacing; 492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int previewWidth, previewHeight; 512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t previewFpsRange[2]; 522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int previewFormat; 532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int previewTransform; // set by CAMERA_CMD_SET_DISPLAY_ORIENTATION 552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int pictureWidth, pictureHeight; 573ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Store the picture size before they are overriden by video snapshot 583ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh int pictureWidthLastSet, pictureHeightLastSet; 593ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh bool pictureSizeOverriden; 602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t jpegThumbSize[2]; 62c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala uint8_t jpegQuality, jpegThumbQuality; 632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t jpegRotation; 642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool gpsEnabled; 662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala double gpsCoordinates[3]; 672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int64_t gpsTimestamp; 682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 gpsProcessingMethod; 692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t wbMode; 712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t effectMode; 722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t antibandingMode; 732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t sceneMode; 742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enum flashMode_t { 762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FLASH_MODE_OFF = 0, 772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FLASH_MODE_AUTO, 782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FLASH_MODE_ON, 792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FLASH_MODE_TORCH, 80d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin FLASH_MODE_RED_EYE = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, 812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FLASH_MODE_INVALID = -1 822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } flashMode; 832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enum focusMode_t { 85d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin FOCUS_MODE_AUTO = ANDROID_CONTROL_AF_MODE_AUTO, 86d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin FOCUS_MODE_MACRO = ANDROID_CONTROL_AF_MODE_MACRO, 87d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin FOCUS_MODE_CONTINUOUS_VIDEO = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, 88d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin FOCUS_MODE_CONTINUOUS_PICTURE = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, 89d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin FOCUS_MODE_EDOF = ANDROID_CONTROL_AF_MODE_EDOF, 902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FOCUS_MODE_INFINITY, 912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FOCUS_MODE_FIXED, 922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala FOCUS_MODE_INVALID = -1 932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } focusMode; 942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 95d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala uint8_t focusState; // Latest focus state from HAL 96d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala 9795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // For use with triggerAfWithAuto quirk 9895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala focusMode_t shadowFocusMode; 9995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala 1002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala struct Area { 1012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int left, top, right, bottom; 1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int weight; 1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Area() {} 1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Area(int left, int top, int right, int bottom, int weight): 1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala left(left), top(top), right(right), bottom(bottom), 1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala weight(weight) {} 107ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala bool isEmpty() const { 108ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala return (left == 0) && (top == 0) && (right == 0) && (bottom == 0); 109ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala } 1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala }; 1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Area> focusingAreas; 1122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1133ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He struct Size { 1143ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He int32_t width; 1153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He int32_t height; 1163ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He }; 1173ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 11849aac43b4a323a8702d93b7cf878252905dc3987Zhijun He struct FpsRange { 11949aac43b4a323a8702d93b7cf878252905dc3987Zhijun He int32_t low; 12049aac43b4a323a8702d93b7cf878252905dc3987Zhijun He int32_t high; 12149aac43b4a323a8702d93b7cf878252905dc3987Zhijun He }; 12249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He 1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t exposureCompensation; 1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool autoExposureLock; 1252638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev bool autoExposureLockAvailable; 1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool autoWhiteBalanceLock; 1272638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev bool autoWhiteBalanceLockAvailable; 1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 129ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk // 3A region types, for use with ANDROID_CONTROL_MAX_REGIONS 130ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk enum region_t { 131ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk REGION_AE = 0, 132ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk REGION_AWB, 133ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk REGION_AF, 134ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk NUM_REGION // Number of region types 135ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } region; 136ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk 1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Area> meteringAreas; 1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int zoom; 1405b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev bool zoomAvailable; 1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1428cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen int videoWidth, videoHeight, videoFormat; 1438cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen android_dataspace videoDataSpace; 1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool recordingHint; 1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool videoStabilization; 1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters2 params; 1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 paramsFlattened; 1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // These parameters are also part of the camera API-visible state, but not 1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // directly listed in Camera.Parameters 1538cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen // One of ICamera::VIDEO_BUFFER_MODE_* 1548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen int32_t videoBufferMode; 1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool playShutterSound; 1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool enableFaceDetect; 1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool enableFocusMoveMessages; 1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int afTriggerCounter; 1602b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int afStateCounter; 1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int currentAfTriggerId; 1622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool afInMotion; 1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int precaptureTriggerCounter; 165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1662b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala int takePictureCounter; 1672b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint32_t previewCallbackFlags; 1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool previewCallbackOneShot; 1703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala bool previewCallbackSurface; 1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 172c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala bool allowZslMode; 173355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // Whether the jpeg stream is slower than 30FPS and can slow down preview. 174c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala // When slowJpegMode is true, allowZslMode must be false to avoid slowing down preview. 175355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh bool slowJpegMode; 1762efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang // Whether ZSL reprocess is supported by the device. 1772efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang bool isZslReprocessPresent; 178fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen // Whether the device supports enableZsl. 179fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen bool isDeviceZslSupported; 1807b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala // Whether the device supports geometric distortion correction 1817b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala bool isDistortionCorrectionSupported; 182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Overall camera state 1842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enum State { 1852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala DISCONNECTED, 1862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala STOPPED, 1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala WAITING_FOR_PREVIEW_WINDOW, 1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala PREVIEW, 1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala RECORD, 1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala STILL_CAPTURE, 1912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala VIDEO_SNAPSHOT 1922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } state; 1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Number of zoom steps to simulate 19501831d233c84da7f9092e62f143626918a5a747eZhijun He static const unsigned int NUM_ZOOM_STEPS = 100; 1963ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He // Max preview size allowed 197a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala // This is set to a 1:1 value to allow for any aspect ratio that has 198a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala // a max long side of 1920 pixels 1993ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He static const unsigned int MAX_PREVIEW_WIDTH = 1920; 200a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala static const unsigned int MAX_PREVIEW_HEIGHT = 1920; 201a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala // Initial max preview/recording size bound 202a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala static const int MAX_INITIAL_PREVIEW_WIDTH = 1920; 203a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala static const int MAX_INITIAL_PREVIEW_HEIGHT = 1080; 2049fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He // Aspect ratio tolerance 20536802bd18b7b4e8c87fa019c7e3068bee330d174Dan Albert static const CONSTEXPR float ASPECT_RATIO_TOLERANCE = 0.001; 206355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // Threshold for slow jpeg mode 207355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh static const int64_t kSlowJpegModeThreshold = 33400000LL; // 33.4 ms 2082efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang // Margin for checking FPS 2092efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang static const int32_t FPS_MARGIN = 1; 2102efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang // Max FPS for default parameters 2112efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang static const int32_t MAX_DEFAULT_FPS = 30; 212c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh // Minimum FPS for a size to be listed in supported preview/video sizes 213c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh // Set to slightly less than 30.0 to have some tolerance margin 214c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh static constexpr double MIN_PREVIEW_RECORD_FPS = 29.97; 215c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh // Maximum frame duration for a size to be listed in supported preview/video sizes 216c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh static constexpr int64_t MAX_PREVIEW_RECORD_DURATION_NS = 1e9 / MIN_PREVIEW_RECORD_FPS; 2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Full static camera info, object owned by someone else, such as 2192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Camera2Device. 2202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const CameraMetadata *info; 2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Fast-access static device information; this is a subset of the 2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // information available through the staticInfo() method, used for 2242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // frequently-accessed values or values that have to be calculated from the 2252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // static information. 2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala struct DeviceInfo { 2272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t arrayWidth; 2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t arrayHeight; 2290181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t bestStillCaptureFpsRange[2]; 2302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t bestFaceDetectMode; 2312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t maxFaces; 2328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala struct OverrideModes { 2338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala flashMode_t flashMode; 2348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t wbMode; 2358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala focusMode_t focusMode; 2368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala OverrideModes(): 2378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala flashMode(FLASH_MODE_INVALID), 238d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin wbMode(ANDROID_CONTROL_AWB_MODE_OFF), 2398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala focusMode(FOCUS_MODE_INVALID) { 2408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 2418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala }; 2428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala DefaultKeyedVector<uint8_t, OverrideModes> sceneModeOverrides; 243c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh bool isExternalCamera; 2441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float minFocalLength; 2454a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala bool useFlexibleYuv; 246c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala Size maxJpegSize; 24766814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh Size maxZslSize; 2482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } fastInfo; 2492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Quirks information; these are short-lived flags to enable workarounds for 2518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // incomplete HAL implementations 2528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala struct Quirks { 2538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool triggerAfWithAuto; 2548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool useZslFormat; 2557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin bool meteringCropRegion; 256fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool partialResults; 2578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } quirks; 2588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 259da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala /** 260da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Parameter manipulation and setup methods 261da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters(int cameraId, int cameraFacing); 2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ~Parameters(); 2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Sets up default parameters 267cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh status_t initialize(const CameraMetadata *info, int deviceVersion); 2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 269e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala // Build fast-access device static info from static info 2702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t buildFastInfo(); 271e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala // Query for quirks from static info 272e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala status_t buildQuirks(); 2732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Get entry from camera static characteristics information. min/maxCount 2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // are used for error checking the number of values in the entry. 0 for 2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // max/minCount means to do no bounds check in that direction. In case of 2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // error, the entry data pointer is null and the count is 0. 2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t staticInfo(uint32_t tag, 279d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin size_t minCount=0, size_t maxCount=0, bool required=true) const; 2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Validate and update camera parameters based on new settings 2828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala status_t set(const String8 ¶mString); 2838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 2848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Retrieve the current settings 2858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala String8 get() const; 2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Update passed-in request for common parameters 288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t updateRequest(CameraMetadata *request) const; 289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 290ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala // Add/update JPEG entries in metadata 291ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala status_t updateRequestJpeg(CameraMetadata *request) const; 292ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2933ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh /* Helper functions to override jpeg size for video snapshot */ 2943ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Override jpeg size by video size. Called during startRecording. 2953ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh status_t overrideJpegSizeByVideoSize(); 2963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Recover overridden jpeg size. Called during stopRecording. 2973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh status_t recoverOverriddenJpegSize(); 298092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh // if video snapshot size is currently overridden 299092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh bool isJpegSizeOverridden(); 300c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala // whether zero shutter lag should be used for non-recording operation 301c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala bool useZeroShutterLag() const; 3023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 303d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Calculate the crop region rectangle, either tightly about the preview 304d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // resolution, or a region just based on the active array; both take 305d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // into account the current zoom level. 306018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin struct CropRegion { 307018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float left; 308018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float top; 309018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float width; 310018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float height; 311018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin }; 312d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion calculateCropRegion(bool previewOnly) const; 313018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // Calculate the field of view of the high-resolution JPEG capture 3151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala status_t calculatePictureFovs(float *horizFov, float *vertFov) const; 3161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Static methods for debugging and converting between camera1 and camera2 3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // parameters 3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const char *getStateName(State state); 3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static int formatStringToEnum(const char *format); 3232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const char *formatEnumToString(int format); 3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static int wbModeStringToEnum(const char *wbMode); 3268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala static const char* wbModeEnumToString(uint8_t wbMode); 3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static int effectModeStringToEnum(const char *effectMode); 3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static int abModeStringToEnum(const char *abMode); 3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static int sceneModeStringToEnum(const char *sceneMode); 3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static flashMode_t flashModeStringToEnum(const char *flashMode); 3318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala static const char* flashModeEnumToString(flashMode_t flashMode); 3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static focusMode_t focusModeStringToEnum(const char *focusMode); 3338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala static const char* focusModeEnumToString(focusMode_t focusMode); 3341aecbcb23d6304b1c86bd7ee8f6c5352d8d356ccEino-Ville Talvala 3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static status_t parseAreas(const char *areasCStr, 3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Area> *areas); 3377d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 3387d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin enum AreaKind 3397d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin { 3407d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AREA_KIND_FOCUS, 3417d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AREA_KIND_METERING 3427d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin }; 3437d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin status_t validateAreas(const Vector<Area> &areas, 3447d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin size_t maxRegions, 3457d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AreaKind areaKind) const; 3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static bool boolFromString(const char *boolStr); 3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Map from camera orientation + facing to gralloc transform enum 3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static int degToTransform(int degrees, bool mirror); 3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 351d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala // API specifies FPS ranges are done in fixed point integer, with LSB = 0.001. 352d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala // Note that this doesn't apply to the (deprecated) single FPS value. 353c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala static const int kFpsToApiScale = 1000; 354c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala 3555e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // Transform from (-1000,-1000)-(1000,1000) normalized coords from camera 356d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // API to HAL3 (0,0)-(activePixelArray.width/height) coordinates 3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int normalizedXToArray(int x) const; 3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int normalizedYToArray(int y) const; 359af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 3605e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // Transform from HAL3 (0,0)-(activePixelArray.width/height) coordinates to 3615e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // (-1000,-1000)-(1000,1000) normalized coordinates given a scaler crop 3625e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // region. 3635e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen int arrayXToNormalizedWithCrop(int x, const CropRegion &scalerCrop) const; 3645e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen int arrayYToNormalizedWithCrop(int y, const CropRegion &scalerCrop) const; 3655e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen 366af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin struct Range { 367af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int min; 368af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int max; 369af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin }; 370af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 371af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int32_t fpsFromRange(int32_t min, int32_t max) const; 372af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 3737373cbe85e617345f7002256a4be389fe62af913Igor Murashkinprivate: 3747373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 3755e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // Convert from viewfinder crop-region relative array coordinates 376d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // to HAL3 sensor array coordinates 3777373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int cropXToArray(int x) const; 3787373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int cropYToArray(int y) const; 3797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 3805e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // Convert from camera API (-1000,1000)-(1000,1000) normalized coords 3815e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // to viewfinder crop-region relative array coordinates 3827373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int normalizedXToCrop(int x) const; 3837373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int normalizedYToCrop(int y) const; 3843ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 3855e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // Given a scaler crop region, calculate preview crop region based on 3865e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // preview aspect ratio. 3875e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen CropRegion calculatePreviewCrop(const CropRegion &scalerCrop) const; 3885e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen 3893ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He Vector<Size> availablePreviewSizes; 3900cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He Vector<Size> availableVideoSizes; 3913ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He // Get size list (that are no larger than limit) from static metadata. 392c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh // This method filtered size with minFrameDuration < MAX_PREVIEW_RECORD_DURATION_NS 3930cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He status_t getFilteredSizes(Size limit, Vector<Size> *sizes); 3949fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He // Get max size (from the size array) that matches the given aspect ratio. 3959fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size getMaxSizeForRatio(float ratio, const int32_t* sizeArray, size_t count); 396cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 3973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Helper function for overriding jpeg size for video snapshot 3983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Check if overridden jpeg size needs to be updated after Parameters::set. 3993ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // The behavior of this function is tailored to the implementation of Parameters::set. 4003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Do not use this function for other purpose. 4013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh status_t updateOverriddenJpegSize(); 4023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 403cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh struct StreamConfiguration { 404cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t format; 405cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t width; 406cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t height; 407cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t isInput; 408cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh }; 409355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 410cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Helper function extract available stream configuration 411cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Only valid since device HAL version 3.2 412cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // returns an empty Vector if device HAL version does support it 413cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> getStreamConfigurations(); 414cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 415355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // Helper function to get minimum frame duration for a jpeg size 416355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // return -1 if input jpeg size cannot be found in supported size list 417355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int64_t getJpegStreamMinFrameDurationNs(Parameters::Size size); 418355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 4194f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He // Helper function to get minimum frame duration for a size/format combination 4204f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He // return -1 if input size/format combination cannot be found. 4214f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He int64_t getMinFrameDurationNs(Parameters::Size size, int format); 4224f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He 4234f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He // Helper function to check if a given fps is supported by all the sizes with 4244f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He // the same format. 4254f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He // return true if the device doesn't support min frame duration metadata tag. 4264f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He bool isFpsSupported(const Vector<Size> &size, int format, int32_t fps); 4274f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He 428cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Helper function to get non-duplicated available output formats 429cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> getAvailableOutputFormats(); 430cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Helper function to get available output jpeg sizes 431cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Size> getAvailableJpegSizes(); 432355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // Helper function to get maximum size in input Size vector. 433355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // The maximum size is defined by comparing width first, when width ties comparing height. 434355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh Size getMaxSize(const Vector<Size>& sizes); 435cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 436cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int mDeviceVersion; 4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; 4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala// This class encapsulates the Parameters class so that it can only be accessed 4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala// by constructing a Lock object, which locks the SharedParameter's mutex. 4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaclass SharedParameters { 4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public: 4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala SharedParameters(int cameraId, int cameraFacing): 4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mParameters(cameraId, cameraFacing) { 4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala template<typename S, typename P> 4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala class BaseLock { 4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala public: 4505404ee174dd6b5e312d3a97bc63c2bc8d142012bChih-Hung Hsieh explicit BaseLock(S &p): 4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mParameters(p.mParameters), 4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mSharedParameters(p) { 4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mSharedParameters.mLock.lock(); 4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ~BaseLock() { 4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mSharedParameters.mLock.unlock(); 4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala P &mParameters; 4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala private: 4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Disallow copying, default construction 4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala BaseLock(); 4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala BaseLock(const BaseLock &); 4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala BaseLock &operator=(const BaseLock &); 4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala S &mSharedParameters; 4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala }; 4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala typedef BaseLock<SharedParameters, Parameters> Lock; 4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala typedef BaseLock<const SharedParameters, const Parameters> ReadLock; 4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Access static info, read-only and immutable, so no lock needed 4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t staticInfo(uint32_t tag, 4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t minCount=0, size_t maxCount=0) const { 4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return mParameters.staticInfo(tag, minCount, maxCount); 4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Only use for dumping or other debugging 4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const Parameters &unsafeAccess() { 4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return mParameters; 4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala private: 4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters mParameters; 4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala mutable Mutex mLock; 4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; 4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2 4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android 4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#endif 490