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 174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-Parameters" 182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin// #define LOG_NDEBUG 0 202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Log.h> 22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Trace.h> 23af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin#include <utils/Vector.h> 24af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin#include <utils/SortedVector.h> 25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <math.h> 272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <stdlib.h> 28b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala#include <cutils/properties.h> 292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "Parameters.h" 312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "system/camera.h" 32cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh#include "hardware/camera_common.h" 330cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/MediaProfiles.h> 340cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/mediarecorder.h> 352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android { 372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 { 382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId, 402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int cameraFacing) : 412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraId(cameraId), 422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraFacing(cameraFacing), 432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala info(NULL) { 442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() { 472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 49cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehstatus_t Parameters::initialize(const CameraMetadata *info, int deviceVersion) { 502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (info->entryCount() == 0) { 532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: No static information provided!", __FUNCTION__); 542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::info = info; 57cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceVersion = deviceVersion; 582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = buildFastInfo(); 602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) return res; 612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 62e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala res = buildQuirks(); 63e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (res != OK) return res; 64e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 653ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He const Size MAX_PREVIEW_SIZE = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT }; 660cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He // Treat the H.264 max size as the max supported video size. 670cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He MediaProfiles *videoEncoderProfiles = MediaProfiles::getInstance(); 680cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He int32_t maxVideoWidth = videoEncoderProfiles->getVideoEncoderParamByName( 690cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He "enc.vid.width.max", VIDEO_ENCODER_H264); 700cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He int32_t maxVideoHeight = videoEncoderProfiles->getVideoEncoderParamByName( 710cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He "enc.vid.height.max", VIDEO_ENCODER_H264); 720cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He const Size MAX_VIDEO_SIZE = {maxVideoWidth, maxVideoHeight}; 730cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He 740cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He res = getFilteredSizes(MAX_PREVIEW_SIZE, &availablePreviewSizes); 750cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He if (res != OK) return res; 760cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He res = getFilteredSizes(MAX_VIDEO_SIZE, &availableVideoSizes); 773ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (res != OK) return res; 782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 79a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala // Select initial preview and video size that's under the initial bound and 80a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala // on the list of both preview and recording sizes 81a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewWidth = 0; 82a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewHeight = 0; 83a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala for (size_t i = 0 ; i < availablePreviewSizes.size(); i++) { 84a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala int newWidth = availablePreviewSizes[i].width; 85a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala int newHeight = availablePreviewSizes[i].height; 86a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala if (newWidth >= previewWidth && newHeight >= previewHeight && 87a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala newWidth <= MAX_INITIAL_PREVIEW_WIDTH && 88a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala newHeight <= MAX_INITIAL_PREVIEW_HEIGHT) { 89a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala for (size_t j = 0; j < availableVideoSizes.size(); j++) { 90a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala if (availableVideoSizes[j].width == newWidth && 91a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala availableVideoSizes[j].height == newHeight) { 92a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewWidth = newWidth; 93a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewHeight = newHeight; 94a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 95a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 96a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 97a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 98a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala if (previewWidth == 0) { 99a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala ALOGE("%s: No initial preview size can be found!", __FUNCTION__); 100a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala return BAD_VALUE; 101a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala videoWidth = previewWidth; 1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala videoHeight = previewHeight; 1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPreviewSize(previewWidth, previewHeight); 1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setVideoSize(videoWidth, videoHeight); 1072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 1082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8::format("%dx%d", 1092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight)); 1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewSizes; 1123ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (size_t i = 0; i < availablePreviewSizes.size(); i++) { 1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 1142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 1153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He availablePreviewSizes[i].width, 1163ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He availablePreviewSizes[i].height); 1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1183ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGV("Supported preview sizes are: %s", supportedPreviewSizes.string()); 1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes); 1210cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He 1220cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He String8 supportedVideoSizes; 1230cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He for (size_t i = 0; i < availableVideoSizes.size(); i++) { 1240cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He if (i != 0) supportedVideoSizes += ","; 1250cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He supportedVideoSizes += String8::format("%dx%d", 1260cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He availableVideoSizes[i].width, 1270cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He availableVideoSizes[i].height); 1280cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He } 1290cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He ALOGV("Supported video sizes are: %s", supportedVideoSizes.string()); 1302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1310cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He supportedVideoSizes); 1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 1362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatEnumToString(previewFormat)); // NV21 1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewTransform = degToTransform(0, 1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraFacing == CAMERA_FACING_FRONT); 1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFormats; 147cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> outputFormats = getAvailableOutputFormats(); 1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 149cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < outputFormats.size(); i++) { 1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 152cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh switch (outputFormats[i]) { 1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 1622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 1642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1774a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_420_888: 1784a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Flexible YUV allows both YV12 and NV21 1794a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += 1804a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1814a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += ","; 1824a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += 1834a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1844a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala break; 1852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1864a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 194cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh __FUNCTION__, cameraId, outputFormats[i]); 1952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 2002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats); 2012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin previewFpsRange[0] = availableFpsRanges.data.i32[0]; 2040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin previewFpsRange[1] = availableFpsRanges.data.i32[1]; 2050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 2072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // still have to do something sane for them 2082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 209d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala // NOTE: Not scaled like FPS range values are. 210d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]); 2112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 212af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin previewFps); 2132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // PREVIEW_FPS_RANGE 2150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // -- Order matters. Set range after single value to so that a roundtrip 2160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // of setParameters(getParameters()) would keep the FPS range in higher 2170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // order. 2180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 2190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8::format("%d,%d", 2200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin previewFpsRange[0] * kFpsToApiScale, 2210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin previewFpsRange[1] * kFpsToApiScale)); 2220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 2240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 supportedPreviewFpsRange; 2250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin for (size_t i=0; i < availableFpsRanges.count; i += 2) { 2260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (i != 0) supportedPreviewFpsRange += ","; 2270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin supportedPreviewFpsRange += String8::format("(%d,%d)", 2280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin availableFpsRanges.data.i32[i] * kFpsToApiScale, 2290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin availableFpsRanges.data.i32[i+1] * kFpsToApiScale); 2300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 2320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin supportedPreviewFpsRange); 2330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 236af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin SortedVector<int32_t> sortedPreviewFrameRates; 237af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFrameRates; 2392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 240af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // from the [min, max] fps range use the max value 241af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int fps = fpsFromRange(availableFpsRanges.data.i32[i], 242af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFpsRanges.data.i32[i+1]); 243af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 244af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // de-dupe frame rates 245af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) { 246af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin sortedPreviewFrameRates.add(fps); 247af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 248af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 249af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin continue; 250af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 251af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 252af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.size() > 1) { 253af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin supportedPreviewFrameRates += ","; 254af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 255af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin fps); 258af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 259af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: Supported preview frame rates: %s", 260af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, supportedPreviewFrameRates.string()); 2612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates); 2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 266cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Size> availableJpegSizes = getAvailableJpegSizes(); 267cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (!availableJpegSizes.size()) return NO_INIT; 2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick maximum 270cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh pictureWidth = availableJpegSizes[0].width; 271cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh pictureHeight = availableJpegSizes[0].height; 2723ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 2733ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 2743ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = false; 2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureSize(pictureWidth, 2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight); 2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPictureSizes; 281cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableJpegSizes.size(); i++) { 2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 284cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableJpegSizes[i].width, 285cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableJpegSizes[i].height); 2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes); 2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbnailSizes = 296f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4); 2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2999fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He // Pick the largest thumbnail size that matches still image aspect ratio. 3009fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0, 3019fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Invalid picture size, %d x %d", pictureWidth, pictureHeight); 3029fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight; 3039fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size thumbnailSize = 3049fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He getMaxSizeForRatio( 3059fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He picAspectRatio, 3069fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He &availableJpegThumbnailSizes.data.i32[0], 3079fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He availableJpegThumbnailSizes.count); 3089fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[0] = thumbnailSize.width; 3099fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[1] = thumbnailSize.height; 3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0]); 3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1]); 3152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedJpegThumbSizes; 3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 3232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes); 3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality = 90; 3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality); 3312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality = 90; 3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality); 3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation = 0; 3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation); 3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsEnabled = false; 339a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[0] = 0.0; 340a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[1] = 0.0; 341a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[2] = 0.0; 342a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsTimestamp = 0; 3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcessingMethod = "unknown"; 3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 346d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin wbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableWhiteBalanceModes = 351211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 352211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableWhiteBalanceModes.count) { 353211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 354211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::WHITE_BALANCE_AUTO); 355211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedWhiteBalance; 3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 362d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 366d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 3692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 370d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 374d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 3772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 378d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 382d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 386d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 390d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Skipping values not mappable to v1 API 395d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_OFF: 3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance); 4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 410d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE); 4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffects = 415211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false); 416211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableEffects.count) { 417211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, 418211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::EFFECT_NONE); 419211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedEffects; 4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedEffects += ","; 4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 426d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_OFF: 4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE; 4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 430d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_MONO: 4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_MONO; 4332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 434d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE: 4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 438d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE: 4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 442d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SEPIA: 4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SEPIA; 4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 446d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE: 4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 450d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD: 4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 454d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD: 4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 458d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_AQUA: 4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_AQUA; 4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableEffects.data.u8[i]); 4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 472d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAntibandingModes = 477211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false); 478211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableAntibandingModes.count) { 479211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 480211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::ANTIBANDING_OFF); 481211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedAntibanding; 4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 488d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF: 4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 492d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ: 4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 496d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ: 4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 500d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO: 5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding); 5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 516c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED; 5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 521211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 522211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableSceneModes.count) { 523211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.remove(CameraParameters::KEY_SCENE_MODE); 524211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool noSceneModes = false; 5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 532c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk case ANDROID_CONTROL_SCENE_MODE_DISABLED: 5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala noSceneModes = true; 5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not in old API 5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableSceneModes.data.u8[i]); 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!noSceneModes) { 6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes); 610cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin } else { 611cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin params.remove(CameraParameters::KEY_SCENE_MODE); 6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 615211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool isFlashAvailable = false; 6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 617211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false); 618211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (flashAvailable.count) { 619211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray isFlashAvailable = flashAvailable.data.u8[0]; 620211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 623211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false); 6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 625248f9ce1b6052889dd55e7701f908477d16d6ff4Eino-Ville Talvala flashMode = Parameters::FLASH_MODE_OFF; 626211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (isFlashAvailable) { 6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 6286f854608d26d7abcce5e46396c7260ed7b250653Alex Ray CameraParameters::FLASH_MODE_OFF); 6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableAeModes.data.u8[i] == 637d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 6382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 6392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes); 6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 646b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // No flash means null flash mode and supported flash modes keys, so 647b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // remove them just to be safe 648b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala params.remove(CameraParameters::KEY_FLASH_MODE); 649b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala params.remove(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 653211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false); 6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAfModes = 656211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false); 6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 658211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) { 6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Fixed-focus lens 6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_FIXED; 6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_AUTO; 6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 66980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh String8 supportedFocusModes; 67080ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh bool addComma = false; 67180ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh camera_metadata_ro_entry_t focusDistanceCalibration = 67280ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, false); 67380ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh 67480ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh if (focusDistanceCalibration.count && 67580ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh focusDistanceCalibration.data.u8[0] != 67680ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED) { 67780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh supportedFocusModes += CameraParameters::FOCUS_MODE_INFINITY; 67880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh addComma = true; 67980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh } 6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 685d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 689d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 693d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 697d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 701d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not supported in old API 706d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableAfModes.data.u8[i]); 7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes); 7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 719d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 72095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala shadowFocusMode = FOCUS_MODE_INVALID; 7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 722ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS, 723ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION); 724ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT; 7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7267d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin int32_t maxNumFocusAreas = 0; 7277d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (focusMode != Parameters::FOCUS_MODE_FIXED) { 728ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk maxNumFocusAreas = max3aRegions.data.i32[Parameters::REGION_AF]; 7297d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 7307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas); 7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.clear(); 7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.add(Parameters::Area(0,0,0,0,0)); 7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 737211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, false); 7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 7441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 7451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 7461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate field of views!", __FUNCTION__); 7471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return res; 7481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation = 0; 7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation); 7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 758d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2); 7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationStep = 767d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1); 7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoExposureLock = false; 7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoWhiteBalanceLock = false; 7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 788ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk max3aRegions.data.i32[Parameters::REGION_AE]); 7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom = 0; 7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, zoom); 7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 797d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1); 7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 zoomRatios; 8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoom = 1.f; 8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (NUM_ZOOM_STEPS-1); 8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) zoomRatios += ","; 8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 8092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom += zoomIncrement; 8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 8162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 81882edd5431951f461058c07b73c0dbc093aa45c99Igor Murashkin CameraParameters::FALSE); 8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Infinity,Infinity,Infinity"); 8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces); 8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 0); 8272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 831a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala recordingHint = false; 8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 838a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala videoStabilization = false; 8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 843211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 844211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 8502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala storeMetadataInBuffers = true; 8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala playShutterSound = true; 8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFaceDetect = false; 8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFocusMoveMessages = false; 861da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala afTriggerCounter = 1; 8622b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala afStateCounter = 0; 8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala currentAfTriggerId = -1; 864a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala afInMotion = false; 8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 866da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala precaptureTriggerCounter = 1; 867da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 8682b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala takePictureCounter = 0; 8692b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewCallbackFlags = 0; 871a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala previewCallbackOneShot = false; 8723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala previewCallbackSurface = false; 8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 874afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He char value[PROPERTY_VALUE_MAX]; 875afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He property_get("camera.disable_zsl_mode", value, "0"); 876afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He if (!strcmp(value,"1")) { 877afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He ALOGI("Camera %d: Disabling ZSL mode", cameraId); 878b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala zslMode = false; 8792f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala } else { 880afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He zslMode = true; 881b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala } 882e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 883e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter lightFx = LIGHTFX_NONE; 884e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = STOPPED; 8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala paramsFlattened = params.flatten(); 8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const { 8938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return paramsFlattened; 8948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 8958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() { 8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t activeArraySize = 89903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4); 9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!activeArraySize.count) return NO_INIT; 90103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayWidth; 90203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayHeight; 90303e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray if (activeArraySize.count == 2) { 904e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!", 905e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray __FUNCTION__, cameraId); 90603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[0]; 90703e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[1]; 90803e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else if (activeArraySize.count == 4) { 90903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[2]; 91003e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[3]; 91103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else return NO_INIT; 9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // We'll set the target FPS range for still captures to be as wide 9140181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // as possible to give the HAL maximum latitude for exposure selection 9150181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 9160181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 9170181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) { 9180181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala return NO_INIT; 9190181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 9200181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 9210181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t bestStillCaptureFpsRange[2] = { 9220181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[0], availableFpsRanges.data.i32[1] 9230181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala }; 9240181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t curRange = 9250181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0]; 9260181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala for (size_t i = 2; i < availableFpsRanges.count; i += 2) { 9270181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t nextRange = 9280181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[i + 1] - 9290181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[i]; 9300181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if ( (nextRange > curRange) || // Maximize size of FPS range first 9310181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala (nextRange == curRange && // Then minimize low-end FPS 9320181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[0] > availableFpsRanges.data.i32[i])) { 9330181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 9340181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[0] = availableFpsRanges.data.i32[i]; 9350181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[1] = availableFpsRanges.data.i32[i + 1]; 9360181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala curRange = nextRange; 9370181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 9380181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 9390181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 9402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFaceDetectModes = 941211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0, 942211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t bestFaceDetectMode = 945d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) { 9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFaceDetectModes.data.u8[i]) { 948d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF: 9492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 950d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE: 9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (bestFaceDetectMode != 952d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) { 9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 954d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE; 9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 957d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL: 9582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 959d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL; 9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown face detect mode %d:", 9632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 9642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFaceDetectModes.data.u8[i]); 9652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return NO_INIT; 9662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 969211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray int32_t maxFaces = 0; 9702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxFacesDetected = 971211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false); 972211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (maxFacesDetected.count) { 973211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray maxFaces = maxFacesDetected.data.i32[0]; 974211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 9752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 977211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 9788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t sceneModeOverrides = 979211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false); 9808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 981211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false); 982211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool fixedLens = minFocusDistance.count == 0 || 983211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray minFocusDistance.data.f[0] == 0; 9848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 985176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala camera_metadata_ro_entry_t focusDistanceCalibration = 986176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, 987176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala false); 988176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala bool canFocusInfinity = (focusDistanceCalibration.count && 989176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala focusDistanceCalibration.data.u8[0] != 990176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED); 991176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala 9921f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 9931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS); 9941f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 9951f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 996cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> availableFormats = getAvailableOutputFormats(); 997cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (!availableFormats.size()) return NO_INIT; 9984a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 9994a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 10008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count > 0) { 10018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // sceneModeOverrides is defined to have 3 entries for each scene mode, 10028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // which are AE, AWB, and AF override modes the HAL wants for that scene 10038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // mode. 10048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala const size_t kModesPerSceneMode = 3; 10058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count != 10068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count * kModesPerSceneMode) { 10078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override list is an " 1008e5729fac81c8a984e984fefc90afc64135817d4fColin Cross "unexpected size: %zu (expected %zu)", __FUNCTION__, 10098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, sceneModeOverrides.count, 10108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count); 10118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return NO_INIT; 10128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (size_t i = 0; i < availableSceneModes.count; i++) { 10148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala DeviceInfo::OverrideModes modes; 10158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t aeMode = 10168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0]; 10178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(aeMode) { 1018d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON: 10198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_OFF; 10208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1021d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH: 10228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_AUTO; 10238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1024d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH: 10258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_ON; 10268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1027d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: 10288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_RED_EYE; 10298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 10318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__, 10328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala aeMode); 10338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_INVALID; 10348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.wbMode = 10378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1]; 10388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t afMode = 10398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2]; 10408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(afMode) { 1041d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 1042176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala if (!fixedLens && !canFocusInfinity) { 1043176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override lists asks for" 1044176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala " fixed focus on a device with focuser but not" 1045176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala " calibrated for infinity focus", __FUNCTION__, 1046176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala cameraId); 1047176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala return NO_INIT; 1048176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala } 10498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = fixedLens ? 10508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY; 10518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1052d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 1053d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 1054d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1055d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1056d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 10578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = static_cast<focusMode_t>(afMode); 10588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 10608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__, 10618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala afMode); 10628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = FOCUS_MODE_INVALID; 10638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i], 10668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes); 10678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayWidth = arrayWidth; 10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayHeight = arrayHeight; 10720181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0]; 10730181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1]; 10742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.bestFaceDetectMode = bestFaceDetectMode; 10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces = maxFaces; 10761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 10771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // Find smallest (widest-angle) focal length to use as basis of still 10781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // picture FOV reporting. 10791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[0]; 10801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala for (size_t i = 1; i < availableFocalLengths.count; i++) { 10811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) { 10821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[i]; 10831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 10841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 10851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 10864a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888 10874a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = false; 1088cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableFormats.size(); i++) { 1089cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableFormats[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) { 10904a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = true; 10914a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala break; 10924a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 10934a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 10944a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGV("Camera %d: Flexible YUV %s supported", 10954a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala cameraId, fastInfo.useFlexibleYuv ? "is" : "is not"); 10964a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 10972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 10982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1100e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() { 1101e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 1102e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO); 1103e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1); 1104e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled", 1105e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1106e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 1107e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT); 1108e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1); 1109e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled", 1110e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1111e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 11127373cbe85e617345f7002256a4be389fe62af913Igor Murashkin entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION); 11137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1); 11147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion" 11157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " enabled", cameraId); 11167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 1117fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 1118fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1); 1119fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult" 1120fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala " enabled", cameraId); 1121fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1122e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala return OK; 1123e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala} 1124e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag, 1126d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin size_t minCount, size_t maxCount, bool required) const { 11272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t entry = info->find(tag); 11282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1129d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin if (CC_UNLIKELY( entry.count == 0 ) && required) { 11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 11322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 11332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 11342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x)", 11362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag); 11372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (CC_UNLIKELY( 11382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 11402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 11442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 1145e5729fac81c8a984e984fefc90afc64135817d4fColin Cross "Expected between %zu and %zu values, but got %zu values", 11462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 11472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return entry; 11502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 11512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) { 11532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 11542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters2 newParams(paramString); 11562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only parameters 11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // such as supported preview sizes, etc. Should probably produce an error if 11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // they're changed. 11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Extract and verify new parameters */ 11622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t i; 11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters validatedParams(*this); 11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_SIZE 11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewSize(&validatedParams.previewWidth, 11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewHeight); 11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewWidth != previewWidth || 11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight != previewHeight) { 11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight, 11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth, validatedParams.previewHeight); 11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11813ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (i = 0; i < availablePreviewSizes.size(); i++) { 11823ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if ((availablePreviewSizes[i].width == 11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth) && 11843ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He (availablePreviewSizes[i].height == 11852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight)) break; 11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11873ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (i == availablePreviewSizes.size()) { 11882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewWidth, 11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight); 11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1195af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // RECORDING_HINT (always supported) 1196af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint = boolFromString( 1197af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 11980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin IF_ALOGV() { // Avoid unused variable warning 11990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin bool recordingHintChanged = 12000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.recordingHint != recordingHint; 12010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (recordingHintChanged) { 12020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Recording hint changed to %d", 12030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, validatedParams.recordingHint); 12040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 12050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1206af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FPS_RANGE 1208d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 12090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 12100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Use the single FPS value if it was set later than the range. 12110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Otherwise, use the range value. 12120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 12130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin bool fpsUseSingleValue; 12140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 12150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *fpsRange, *fpsSingle; 12160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsRange = newParams.get(CameraParameters::KEY_PREVIEW_FRAME_RATE); 12180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsSingle = newParams.get(CameraParameters::KEY_PREVIEW_FPS_RANGE); 12190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 12210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Pick either the range or the single key if only one was set. 12220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 12230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * If both are set, pick the one that has greater set order. 12240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 12250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (fpsRange == NULL && fpsSingle == NULL) { 12260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("%s: FPS was not set. One of %s or %s must be set.", 12270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, CameraParameters::KEY_PREVIEW_FRAME_RATE, 12280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FPS_RANGE); 12290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return BAD_VALUE; 12300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (fpsRange == NULL) { 12310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = true; 12320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: FPS range not set, using FPS single value", 12330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__); 12340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (fpsSingle == NULL) { 12350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = false; 12360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: FPS single not set, using FPS range value", 12370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__); 12380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else { 12390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int fpsKeyOrder; 12400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin res = newParams.compareSetOrder( 12410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FRAME_RATE, 12420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FPS_RANGE, 12430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin &fpsKeyOrder); 12440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin LOG_ALWAYS_FATAL_IF(res != OK, "Impossibly bad FPS keys"); 12450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = (fpsKeyOrder > 0); 12470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1249d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 12500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS value is used from '%s'", 12510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, fpsUseSingleValue ? "single" : "range"); 12520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0], 12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewFpsRange[1]); 12550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1256c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[0] /= kFpsToApiScale; 1257c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[1] /= kFpsToApiScale; 1258c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala 12590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Ignore the FPS range if the FPS single has higher precedence 12600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (!fpsUseSingleValue) { 12610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS range (%d, %d)", __FUNCTION__, 12620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0], 12630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1]); 1264d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewFpsRanges = 12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 12672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0]) && 12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]) ) { 12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 12772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFpsRange[0], 12782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]); 12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FORMAT 12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFormat = 12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatStringToEnum(newParams.getPreviewFormat()); 12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFormat != previewFormat) { 12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active!", __FUNCTION__); 12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1292cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> availableFormats = getAvailableOutputFormats(); 12934a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // If using flexible YUV, always support NV21/YV12. Otherwise, check 12944a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // HAL's list. 12954a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (! (fastInfo.useFlexibleYuv && 12964a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala (validatedParams.previewFormat == 12974a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP || 12984a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat == 12994a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YV12) ) ) { 13004a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Not using flexible YUV format, so check explicitly 1301cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (i = 0; i < availableFormats.size(); i++) { 1302cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableFormats[i] == validatedParams.previewFormat) break; 13034a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 1304cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (i == availableFormats.size()) { 13054a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 13064a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), 13074a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat); 13084a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala return BAD_VALUE; 13094a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // PREVIEW_FRAME_RATE Deprecated 13140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // - Use only if the single FPS value was set later than the FPS range 13150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (fpsUseSingleValue) { 1316d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int previewFps = newParams.getPreviewFrameRate(); 13170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS single value requested: %d", 13180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, previewFps); 13190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFrameRates = 13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 1322af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin /** 1323af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is set, find the range that encompasses 1324af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * previewFps with the largest min index. 1325af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1326af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is not set, find the range with previewFps 1327af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * with the smallest min index. 1328af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1329af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * Either way, in case of multiple ranges, break the tie by 1330af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * selecting the smaller range. 1331af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin */ 1332d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 1333d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala // all ranges which have previewFps 1334af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Vector<Range> candidateRanges; 13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 1336af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = { 1337af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i], 1338af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i+1] 1339af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin }; 1340af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1341d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala if (r.min <= previewFps && previewFps <= r.max) { 1342af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin candidateRanges.push(r); 1343af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1345af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (candidateRanges.isEmpty()) { 13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 1347d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala __FUNCTION__, previewFps); 13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1350af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // most applicable range with targetFps 1351af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range bestRange = candidateRanges[0]; 1352af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin for (i = 1; i < candidateRanges.size(); ++i) { 1353af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = candidateRanges[i]; 1354af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1355af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by largest minIndex in recording mode 1356af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (validatedParams.recordingHint) { 1357af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min > bestRange.min) { 1358af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1359af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1360af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1361af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1362af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1363af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1364af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by smallest minIndex in preview mode 1365af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 1366af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min < bestRange.min) { 1367af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1368af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1369af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1370af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1371af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1372af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1373af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1374af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0] = 1376af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.min; 13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] = 1378af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.max; 1379af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1380af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d", 1381af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, 1382af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[0], 1383af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[1], 1384af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint); 13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 13890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Update Preview FPS and Preview FPS ranges based on 13900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * what we actually set. 13910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 13920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * This updates the API-visible (Camera.Parameters#getParameters) values of 13930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * the FPS fields, not only the internal versions. 13940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 13950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Order matters: The value that was set last takes precedence. 13960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * - If the client does a setParameters(getParameters()) we retain 13970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * the same order for preview FPS. 13980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 13990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (!fpsUseSingleValue) { 14000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set fps single, then fps range (range wins) 14010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFrameRate( 14020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsFromRange(/*min*/validatedParams.previewFpsRange[0], 14030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /*max*/validatedParams.previewFpsRange[1])); 14040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFpsRange( 14050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0] * kFpsToApiScale, 14060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1] * kFpsToApiScale); 14070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else { 14080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set fps range, then fps single (single wins) 14090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFpsRange( 14100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0] * kFpsToApiScale, 14110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1] * kFpsToApiScale); 14120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set this to the same value, but with higher priority 14130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFrameRate( 14140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.getPreviewFrameRate()); 14150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 14160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 14172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PICTURE_SIZE 14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPictureSize(&validatedParams.pictureWidth, 14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.pictureHeight); 14203ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (validatedParams.pictureWidth != pictureWidth || 14213ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh validatedParams.pictureHeight != pictureHeight) { 1422cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Size> availablePictureSizes = getAvailableJpegSizes(); 1423cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (i = 0; i < availablePictureSizes.size(); i++) { 1424cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if ((availablePictureSizes[i].width == 14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureWidth) && 1426cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (availablePictureSizes[i].height == 14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight)) break; 14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1429cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (i == availablePictureSizes.size()) { 14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.pictureWidth, 14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight); 14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0] = 14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] = 14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] || 14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) { 14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbSizes = 14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableJpegThumbSizes.data.i32[i] == 14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0]) && 14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableJpegThumbSizes.data.i32[i+1] == 14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1])) break; 14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegThumbSize[0], 14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1]); 14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 1461c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 1462c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1463c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 14642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 1465c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1468c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegThumbQuality = quality; 14692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_QUALITY 1471c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 1472c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1473c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 14742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 1475c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 14762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1478c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegQuality = quality; 14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ROTATION 14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation = 14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegRotation != 0 && 14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 90 && 14852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 180 && 14862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 270) { 14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegRotation); 14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS 14932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLatStr = 14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLatStr != NULL) { 14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLongStr = 14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 14992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsAltitudeStr = 15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsTimeStr = 15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsProcMethodStr = 15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLongStr == NULL || 15062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr == NULL || 15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsTimeStr == NULL || 15082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcMethodStr == NULL) { 15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 15112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *endPtr; 15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 15182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 15232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr); 15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsProcessingMethod = gpsProcMethodStr; 15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = true; 15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = false; 15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EFFECT 15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.effectMode = effectModeStringToEnum( 15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode != effectMode) { 15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffectModes = 15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break; 15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableEffectModes.count) { 15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ANTIBANDING 15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.antibandingMode = abModeStringToEnum( 15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode != antibandingMode) { 15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAbModes = 15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode == availableAbModes.data.u8[i]) 15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAbModes.count) { 15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // SCENE_MODE 15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode = sceneModeStringToEnum( 15832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 15842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode != sceneMode && 15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode != 1586c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED) { 15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode == availableSceneModes.data.u8[i]) 15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableSceneModes.count) { 15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeSet = 1601c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED; 16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FLASH_MODE 16048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 16058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = 16068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 16078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).flashMode; 16088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 16098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = FLASH_MODE_INVALID; 16108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.flashMode == FLASH_MODE_INVALID) { 16128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = flashModeStringToEnum( 16138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 16148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode != flashMode) { 16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 1618d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1); 1619b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala bool isFlashAvailable = 1620b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE; 1621b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala if (!isFlashAvailable && 16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.flashMode != Parameters::FLASH_MODE_OFF) { 16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "No flash on device", __FUNCTION__, 16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) { 16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode == availableAeModes.data.u8[i]) 16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAeModes.count) { 16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 16372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == -1) { 16412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 16422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 16432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1646b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // Update in case of override, but only if flash is supported 1647b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala if (isFlashAvailable) { 1648b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala newParams.set(CameraParameters::KEY_FLASH_MODE, 1649b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala flashModeEnumToString(validatedParams.flashMode)); 1650b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala } 16518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 16538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // WHITE_BALANCE 16548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 16558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = 16568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 16578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).wbMode; 16588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 1659d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF; 16608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 1661d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) { 16628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = wbModeStringToEnum( 16638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 16648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode != wbMode) { 16668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableWbModes = 1667211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 16688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 16698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode == availableWbModes.data.u8[i]) break; 16708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (i == availableWbModes.count) { 16728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 16738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, 16748a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 16758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 16768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 16788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_WHITE_BALANCE, 16798a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala wbModeEnumToString(validatedParams.wbMode)); 16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_MODE 16838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 16848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = 16858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 16868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).focusMode; 16878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 16888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = FOCUS_MODE_INVALID; 16898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.focusMode == FOCUS_MODE_INVALID) { 16918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = focusModeStringToEnum( 16928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE) ); 16938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != focusMode) { 16952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = -1; 16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) { 16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 1698211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, 1699211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 1700211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) { 17012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 17022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "fixed focus lens", 17032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 17052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.focusMode != 17072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY) { 17082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocusModes = 17092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 17102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 17112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode == 17122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFocusModes.data.u8[i]) break; 17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableFocusModes.count) { 17152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 17162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 17182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1722d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 172395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // Always reset shadow focus mode to avoid reverting settings 1724d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.shadowFocusMode = FOCUS_MODE_INVALID; 17258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 17268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_FOCUS_MODE, 17278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala focusModeEnumToString(validatedParams.focusMode)); 17282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 17292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = currentAfTriggerId; 17302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_AREAS 17332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 17342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.focusingAreas); 1735ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAfRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1736ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 1737ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AF]; 17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) res = validateAreas(validatedParams.focusingAreas, 1739ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk maxAfRegions, AREA_KIND_FOCUS); 17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EXPOSURE_COMPENSATION 17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.exposureCompensation = 17482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 1750d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE); 17512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((validatedParams.exposureCompensation < 17522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]) || 17532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (validatedParams.exposureCompensation > 17542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1])) { 17552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 17562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.exposureCompensation); 17572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 17612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoExposureLock = boolFromString( 17622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 17632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 17652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoWhiteBalanceLock = boolFromString( 17662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // METERING_AREAS 1769ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAeRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1770ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 1771ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AE]; 17722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 17732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.meteringAreas); 17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) { 1775ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = validateAreas(validatedParams.meteringAreas, maxAeRegions, 17767d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AREA_KIND_METERING); 17772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 17792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 17802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 17822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ZOOM 17862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 1787709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin if (validatedParams.zoom < 0 1788709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) { 17892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 17902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.zoom); 17912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_SIZE 17952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getVideoSize(&validatedParams.videoWidth, 17962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.videoHeight); 17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoWidth != videoWidth || 17982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight != videoHeight) { 17992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state == RECORD) { 1800c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He ALOGW("%s: Video size cannot be updated (from %d x %d to %d x %d)" 1801c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He " when recording is active! Ignore the size update!", 1802c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He __FUNCTION__, videoWidth, videoHeight, validatedParams.videoWidth, 18032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight); 1804c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoWidth = videoWidth; 1805c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight = videoHeight; 1806c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He newParams.setVideoSize(videoWidth, videoHeight); 1807c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } else { 1808c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He for (i = 0; i < availableVideoSizes.size(); i++) { 1809c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He if ((availableVideoSizes[i].width == 1810c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoWidth) && 1811c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He (availableVideoSizes[i].height == 1812c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight)) break; 1813c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } 1814c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He if (i == availableVideoSizes.size()) { 1815c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He ALOGE("%s: Requested video size %d x %d is not supported", 1816c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He __FUNCTION__, validatedParams.videoWidth, 1817c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight); 1818c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He return BAD_VALUE; 1819c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } 18202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_STABILIZATION 18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoStabilization = boolFromString( 18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 18262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 1827211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 1828211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 18292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoStabilization && 18302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableVideoStabilizationModes.count == 1) { 18312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 18322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1834e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // LIGHTFX 1835e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter validatedParams.lightFx = lightFxStringToEnum( 1836e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter newParams.get(CameraParameters::KEY_LIGHTFX)); 1837e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 18382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Update internal parameters */ 18392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *this = validatedParams; 18413ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh updateOverriddenJpegSize(); 18422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** Update external parameters calculated from the internal ones */ 18441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 18451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // HORIZONTAL/VERTICAL FIELD OF VIEW 18461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 18471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 18481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 18491f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate FOVs", __FUNCTION__); 18501f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // continue so parameters are at least consistent 18511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 18521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, 18531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizFov); 18541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, 18551f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertFov); 18561f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov); 18571f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 18588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Need to flatten again in case of overrides 18598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala paramsFlattened = newParams.flatten(); 18608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala params = newParams; 18618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 18632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 18642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1865da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const { 1866da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 1867da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 1868da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 186903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 187003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Mixin default important security values 187103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * - android.led.transmit = defaulted ON 187203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 187303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS, 1874d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*minimumCount*/0, 1875d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*maximumCount*/0, 1876d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*required*/false); 187703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin for(size_t i = 0; i < entry.count; ++i) { 187803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t led = entry.data.u8[i]; 187903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 188003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin switch(led) { 188103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // Transmit LED is unconditionally on when using 188203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // the android.hardware.Camera API 188303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: { 188403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON; 188503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin res = request->update(ANDROID_LED_TRANSMIT, 188603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin &transmitDefault, 1); 188703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin if (res != OK) return res; 188803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin break; 188903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 189003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 189103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 189203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 189303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 189403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Construct metadata from parameters 189503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 189603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 1897d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 1898da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_REQUEST_METADATA_MODE, 1899da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &metadataMode, 1); 1900da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1901da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 19020181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_entry_t intent = 19030181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala request->find(ANDROID_CONTROL_CAPTURE_INTENT); 1904c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi 1905c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi if (intent.count == 0) return BAD_VALUE; 1906c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi 19070181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) { 19080181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 19090181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange, 2); 19100181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } else { 19110181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 19120181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala previewFpsRange, 2); 19130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 1914da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1915da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 191696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqWbLock = autoWhiteBalanceLock ? 191796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF; 191896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_LOCK, 191996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqWbLock, 1); 192096150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 1921da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_EFFECT_MODE, 1922da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &effectMode, 1); 1923da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1924da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 1925da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &antibandingMode, 1); 1926da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1927da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 192861c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // android.hardware.Camera requires that when face detect is enabled, the 192961c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // camera is in a face-priority mode. HAL2 splits this into separate parts 193061c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // (face detection statistics and face priority scene mode). Map from other 193161c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // to the other. 19328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeActive = 1933c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 1934d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO; 19358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (enableFaceDetect || sceneModeActive) { 1936d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE; 193761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala } 1938da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_MODE, 1939da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqControlMode, 1); 1940da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 194161c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala 1942d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala uint8_t reqSceneMode = 19438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeActive ? sceneMode : 1944d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY : 1945c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 194661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala res = request->update(ANDROID_CONTROL_SCENE_MODE, 194761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala &reqSceneMode, 1); 194861c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala if (res != OK) return res; 1949da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1950d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF; 1951d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF; 1952da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (flashMode) { 1953da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_OFF: 1954d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break; 1955da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 1956d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break; 1957da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_ON: 1958d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break; 1959da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 1960d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; 1961d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFlashMode = ANDROID_FLASH_MODE_TORCH; 1962da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1963da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 1964d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break; 1965da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 1966da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 1967da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala cameraId, flashMode); 19688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 1969da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1970da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_FLASH_MODE, 1971da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFlashMode, 1); 1972da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1973da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_MODE, 1974da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqAeMode, 1); 1975da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1976da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 197796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqAeLock = autoExposureLock ? 197896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF; 197996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_LOCK, 198096150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqAeLock, 1); 19818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 19828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 19838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_MODE, 19848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala &wbMode, 1); 19858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 198696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 1987da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala float reqFocusDistance = 0; // infinity focus in diopters 1988d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 1989da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (focusMode) { 1990da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1991da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1992da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1993da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1994da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1995da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusMode = focusMode; 1996da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1997da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1998da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1999d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 2000da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 2001da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 20028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 20038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, focusMode); 20048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 2005da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2006da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_LENS_FOCUS_DISTANCE, 2007da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusDistance, 1); 2008da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2009da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_MODE, 2010da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusMode, 1); 2011da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2012da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2013da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqFocusingAreasSize = focusingAreas.size() * 5; 2014da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize]; 2015894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) { 2016894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (focusingAreas[j].weight != 0) { 2017da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 2018894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].left); 2019da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 2020894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].top); 2021da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 2022894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].right); 2023da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 2024894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].bottom); 2025da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 2026da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 0; 2027da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 0; 2028da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 0; 2029da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 0; 2030da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2031894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqFocusingAreas[i + 4] = focusingAreas[j].weight; 2032da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2033da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_REGIONS, 2034da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas, reqFocusingAreasSize); 2035da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2036da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqFocusingAreas; 2037da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2038d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 2039da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &exposureCompensation, 1); 2040da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2041da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2042da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqMeteringAreasSize = meteringAreas.size() * 5; 2043da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize]; 2044894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) { 2045894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (meteringAreas[j].weight != 0) { 2046da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 2047894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].left); 2048da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 2049894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].top); 2050da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 2051894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].right); 2052da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 2053894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].bottom); 2054da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 2055da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 0; 2056da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 0; 2057da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 0; 2058da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 0; 2059da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2060894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqMeteringAreas[i + 4] = meteringAreas[j].weight; 2061da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2062da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_REGIONS, 2063da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas, reqMeteringAreasSize); 2064da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2065da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2066ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk // Set awb regions to be the same as the metering regions if allowed 2067ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAwbRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 2068ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 2069ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AWB]; 2070ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (maxAwbRegions > 0) { 2071ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (maxAwbRegions >= meteringAreas.size()) { 2072ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = request->update(ANDROID_CONTROL_AWB_REGIONS, 2073ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk reqMeteringAreas, reqMeteringAreasSize); 2074ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } else { 2075ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk // Ensure the awb regions are zeroed if the region count is too high. 2076ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk int32_t zeroedAwbAreas[5] = {0, 0, 0, 0, 0}; 2077ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = request->update(ANDROID_CONTROL_AWB_REGIONS, 2078ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk zeroedAwbAreas, sizeof(zeroedAwbAreas)/sizeof(int32_t)); 2079ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } 2080ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (res != OK) return res; 2081ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } 2082ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk 2083da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqMeteringAreas; 2084da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 20857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin /* don't include jpeg thumbnail size - it's valid for 20867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin it to be set to (0,0), meaning 'no thumbnail' */ 20877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion crop = calculateCropRegion( (CropRegion::Outputs)( 20887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_PREVIEW | 20897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_VIDEO | 20907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_PICTURE )); 209105bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin int32_t reqCropRegion[4] = { 2092c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.left), 2093c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.top), 209405bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.width), 209505bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.height) 2096c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala }; 2097da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_SCALER_CROP_REGION, 209805bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin reqCropRegion, 4); 2099da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqVstabMode = videoStabilization ? 2102d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON : 2103d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 2104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 2105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqVstabMode, 1); 2106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqFaceDetectMode = enableFaceDetect ? 2109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala fastInfo.bestFaceDetectMode : 2110d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 2111d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE, 2112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFaceDetectMode, 1); 2113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 2116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 2117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2118ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const { 2119ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala status_t res; 2120ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2121ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE, 2122ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala jpegThumbSize, 2); 2123ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2124ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY, 2125ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegThumbQuality, 1); 2126ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2127ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_QUALITY, 2128ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegQuality, 1); 2129ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2130ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2131ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 2132ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegRotation, 1); 2133ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2134ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2135ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (gpsEnabled) { 2136ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2137ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 2138ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsCoordinates, 3); 2139ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2140ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2141ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 2142ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &gpsTimestamp, 1); 2143ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2144ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2145ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 2146ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsProcessingMethod); 2147ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2148ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } else { 2149ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_COORDINATES); 2150ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2151ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP); 2152ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2153ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 2154ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2155ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } 2156ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala return OK; 2157ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala} 2158ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 21593ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::overrideJpegSizeByVideoSize() { 21603ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (pictureSizeOverriden) { 21613ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has been overridden. Skip overriding"); 21623ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 21633ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 21643ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21653ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = true; 21663ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 21673ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 21683ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = videoWidth; 21693ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = videoHeight; 21703ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // This change of picture size is invisible to app layer. 21713ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Do not update app visible params 21723ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 21733ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 21743ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21753ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::updateOverriddenJpegSize() { 21763ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (!pictureSizeOverriden) { 21773ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has not been overridden. Skip checking"); 21783ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 21793ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 21803ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21813ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 21823ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 21833ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21843ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (pictureWidth <= videoWidth && pictureHeight <= videoHeight) { 21853ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Picture size is now smaller than video size. No need to override anymore 21863ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return recoverOverriddenJpegSize(); 21873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 21883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = videoWidth; 21903ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = videoHeight; 21913ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21923ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 21933ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 21943ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21953ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::recoverOverriddenJpegSize() { 21963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (!pictureSizeOverriden) { 21973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has not been overridden. Skip recovering"); 21983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 21993ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 22003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = false; 22013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = pictureWidthLastSet; 22023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = pictureHeightLastSet; 22033ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 22043ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 2205ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 22062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) { 22072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 22082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(state) { 22092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 22102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 22112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 22122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 22132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 22142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 22152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 22162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 22172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return "Unknown state!"; 22182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR 22212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) { 2224b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk return CameraParameters::previewFormatToEnum(format); 22252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) { 22282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *fmt; 22292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(format) { 22302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 22312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 22322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 22342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 22352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 22372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 22382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 22402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 22412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 22432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 22442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 22462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 22472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 22492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 22502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 22512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 22532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 22542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, format); 22552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = NULL; 22562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return fmt; 22592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) { 22622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 22634a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !wbMode ? 2264d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 22652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 2266d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 22672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 2268d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_INCANDESCENT : 22692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 2270d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_FLUORESCENT : 22712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 2272d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT : 22732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 2274d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_DAYLIGHT : 22752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 2276d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT : 22772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 2278d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_TWILIGHT : 22792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 2280d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_SHADE : 22812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) { 22858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (wbMode) { 2286d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 22878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_AUTO; 2288d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 22898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_INCANDESCENT; 2290d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 22918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_FLUORESCENT; 2292d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 22938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 2294d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 22958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_DAYLIGHT; 2296d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 22978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 2298d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 22998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_TWILIGHT; 2300d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 23018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_SHADE; 23028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 23038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown AWB mode enum: %d", 23048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, wbMode); 23058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 23068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 23078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 23088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) { 23102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 23114a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !effectMode ? 2312d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 23132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 2314d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 23152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 2316d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_MONO : 23172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 2318d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_NEGATIVE : 23192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 2320d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SOLARIZE : 23212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 2322d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SEPIA : 23232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 2324d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_POSTERIZE : 23252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 2326d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD : 23272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 2328d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD : 23292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 2330d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_AQUA : 23312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 23322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) { 23352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 23364a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !abMode ? 2337d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 23382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 2339d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 23402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 2341d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF : 23422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 2343d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ : 23442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 2345d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ : 23462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 23472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) { 23502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 23514a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !sceneMode ? 2352c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 23532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 2354c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 23552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 23562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 23572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 23582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 23592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 23602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 23612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 23622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 23632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 23642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 23652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 23662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 23672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 23682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 23692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 23702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 23712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 23722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 23732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 23742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 23752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 23762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 23772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 23782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 23792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 23802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 23812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 23822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 23832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 23842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 23852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 23862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum( 23892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *flashMode) { 23902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 23914a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !flashMode ? 2392b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 23932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 23942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 23952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 23962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 23972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 23982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_ON : 23992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 24002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 24012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 24022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 24032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 24042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) { 24078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (flashMode) { 24088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_OFF: 24098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_OFF; 24108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_AUTO: 24118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_AUTO; 24128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_ON: 24138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_ON; 24148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_RED_EYE: 24158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_RED_EYE; 24168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_TORCH: 24178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_TORCH; 24188a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 24198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown flash mode enum %d", 24208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, flashMode); 24218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 24228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 24238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 24248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 24252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum( 24262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *focusMode) { 24272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 24284a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !focusMode ? 24294a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID : 24302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 24312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 24322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 24332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 24342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 24352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 24362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 24372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 24382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 24392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 24402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 24412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 24422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 24432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 24442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 24452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) { 24488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (focusMode) { 24498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_AUTO: 24508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_AUTO; 24518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_MACRO: 24528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_MACRO; 24538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_VIDEO: 24548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 24558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_PICTURE: 24568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 24578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_EDOF: 24588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_EDOF; 24598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_INFINITY: 24608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_INFINITY; 24618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_FIXED: 24628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_FIXED; 24638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 24648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown focus mode enum: %d", 24658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, focusMode); 24668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 24678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 24688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 24698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 2470e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterParameters::Parameters::lightFxMode_t Parameters::lightFxStringToEnum( 2471e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter const char *lightFxMode) { 2472e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return 24734a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !lightFxMode ? 24744a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::LIGHTFX_NONE : 2475e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter !strcmp(lightFxMode, CameraParameters::LIGHTFX_LOWLIGHT) ? 2476e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Parameters::LIGHTFX_LOWLIGHT : 2477e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter !strcmp(lightFxMode, CameraParameters::LIGHTFX_HDR) ? 2478e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Parameters::LIGHTFX_HDR : 2479e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Parameters::LIGHTFX_NONE; 2480e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} 2481e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 24822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr, 24832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Parameters::Area> *areas) { 24842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 24852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->clear(); 24862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areasCStr == NULL) { 24872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 24882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(); 24892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 24902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 24912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 areasStr(areasCStr); 24922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 24932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala while (areaStart != 0) { 24942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 24952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *numEnd; 24962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int vals[NUM_FIELDS]; 24972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 24982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 24992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 25002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 25012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala area = numEnd + 1; 25022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(Parameters::Area( 25042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 25052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 25062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 25082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas, 25117d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin size_t maxRegions, 25127d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AreaKind areaKind) const { 25132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Definition of valid area can be found in 25142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // include/camera/CameraParameters.h 25152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 25162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 1) { 25172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas[0].left == 0 && 25182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].top == 0 && 25192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].right == 0 && 25202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].bottom == 0 && 25212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].weight == 0) { 25222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 25232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 25242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25267d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 25277d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin // fixed focus can only set (0,0,0,0,0) focus area 25287d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) { 25297d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin return BAD_VALUE; 25307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 25317d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 25322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() > maxRegions) { 2533e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGE("%s: Too many areas requested: %zu", 25342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, areas.size()); 25352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 25362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 25392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala a != areas.end(); a++) { 25402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 25412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 25422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 25432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 25442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 25452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 25462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 25472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 25492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) { 25522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return !boolStr ? false : 25532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 25542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala false; 25552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) { 25582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!mirror) { 25592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) return 0; 25602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 25612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 25622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 25632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 25642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 25652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 25662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 25672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 25682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 25692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 25702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 25712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 25722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 25752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return -1; 25762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25787373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const { 25797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds" 25807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", x); 25817373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 25827373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 25837373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' " 25841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "is out of bounds (upper = %f)", x, previewCrop.width); 25857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 25867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = x + previewCrop.left; 25877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 25887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth), 25897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value X = '%d' is out of bounds (upper = %d)", 25907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayWidth); 25917373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 25927373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 25937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 25947373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const { 25957373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds " 25967373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", y); 25977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 25987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 25997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is " 26001f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "out of bounds (upper = %f)", y, previewCrop.height); 26017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26027373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = y + previewCrop.top; 26037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight), 26057373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)", 26067373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayHeight); 26077373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 26097373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26107373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26117373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26127373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const { 26137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 26147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (previewCrop.width - 1) / 2000; 26157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26177373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const { 26187373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 26197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (previewCrop.height - 1) / 2000; 26207373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26227373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayXToCrop(int x) const { 26237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 26247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return x - previewCrop.left; 26257373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26277373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayYToCrop(int y) const { 26287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 26297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return y - previewCrop.top; 26307373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26317373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26327373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToNormalized(int x) const { 26337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 26347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return x * 2000 / (previewCrop.width - 1) - 1000; 26357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26367373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26377373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToNormalized(int y) const { 26387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 26397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return y * 2000 / (previewCrop.height - 1) - 1000; 26407373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const { 26437373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = cropXToNormalized(arrayXToCrop(width)); 26447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26457373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of " 26467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "lower bounds %d", ret); 26477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of " 26487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "upper bounds %d", ret); 26497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26507373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 26517373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 26527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return width * 2000 / (fastInfo.arrayWidth - 1) - 1000; 26537373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 26562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const { 26597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = cropYToNormalized(arrayYToCrop(height)); 26607373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of lower bounds" 26627373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " %d", ret); 26637373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of upper bounds" 26647373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " %d", ret); 26657373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26667373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 26677373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 26687373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return height * 2000 / (fastInfo.arrayHeight - 1) - 1000; 26697373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26707373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26717373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 26722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const { 26757373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26767373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 26777373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 26787373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000; 26797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26817373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return cropXToArray(normalizedXToCrop(x)); 26822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const { 26857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 26867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 26877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000; 26887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return cropYToArray(normalizedYToCrop(y)); 26912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26930cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun Hestatus_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) { 26943ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (info == NULL) { 26953ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Static metadata is not initialized", __FUNCTION__); 26963ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return NO_INIT; 26973ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 26983ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes == NULL) { 26993ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Input size is null", __FUNCTION__); 27003ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 27013ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2702cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sizes->clear(); 2703cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2704cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2705cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs = getStreamConfigurations(); 2706cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < scs.size(); i++) { 2707cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const StreamConfiguration &sc = scs[i]; 2708cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT && 2709cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && 2710cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sc.width <= limit.width && sc.height <= limit.height) { 2711cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size sz = {sc.width, sc.height}; 2712cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sizes->push(sz); 27133ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2714cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2715cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 2716cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const size_t SIZE_COUNT = sizeof(Size) / sizeof(int); 2717cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableProcessedSizes = 2718cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, SIZE_COUNT); 2719cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableProcessedSizes.count < SIZE_COUNT) return BAD_VALUE; 2720cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2721cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size filteredSize; 2722cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableProcessedSizes.count; i += SIZE_COUNT) { 2723cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh filteredSize.width = availableProcessedSizes.data.i32[i]; 2724cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh filteredSize.height = availableProcessedSizes.data.i32[i+1]; 2725cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Need skip the preview sizes that are too large. 2726cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (filteredSize.width <= limit.width && 2727cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh filteredSize.height <= limit.height) { 2728cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sizes->push(filteredSize); 2729cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2730cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 27313ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2732cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 27333ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes->isEmpty()) { 27343ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("generated preview size list is empty!!"); 27353ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 27363ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 27373ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return OK; 27383ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He} 27393ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 27409fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun HeParameters::Size Parameters::getMaxSizeForRatio( 27419fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float ratio, const int32_t* sizeArray, size_t count) { 27429fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL"); 27439fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number"); 27449fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 27459fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size maxSize = {0, 0}; 27469fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He for (size_t i = 0; i < count; i += 2) { 27479fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (sizeArray[i] > 0 && sizeArray[i+1] > 0) { 27489fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1]; 27499fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) { 27509fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[i]; 27519fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[i+1]; 27529fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27539fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27549fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27559fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 27569fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (maxSize.width == 0 || maxSize.height == 0) { 27579fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[0]; 27589fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[1]; 27599fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOGW("Unable to find the size to match the given aspect ratio %f." 27609fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Fall back to %d x %d", ratio, maxSize.width, maxSize.height); 27619fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27629fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 27639fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He return maxSize; 27649fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He} 27659fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 2766cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::StreamConfiguration> Parameters::getStreamConfigurations() { 2767cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_CONFIGURATION_SIZE = 4; 2768cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_FORMAT_OFFSET = 0; 2769cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_WIDTH_OFFSET = 1; 2770cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_HEIGHT_OFFSET = 2; 2771cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_IS_INPUT_OFFSET = 3; 2772cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs; 2773cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) { 2774cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh ALOGE("StreamConfiguration is only valid after device HAL 3.2!"); 2775cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return scs; 2776cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2777cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2778cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableStreamConfigs = 2779cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 2780cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) { 2781cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET]; 2782cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET]; 2783cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET]; 2784cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET]; 2785cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh StreamConfiguration sc = {format, width, height, isInput}; 2786cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh scs.add(sc); 2787cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2788cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return scs; 2789cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 2790cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2791cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehSortedVector<int32_t> Parameters::getAvailableOutputFormats() { 2792cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> outputFormats; // Non-duplicated output formats 2793cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2794cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs = getStreamConfigurations(); 2795cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < scs.size(); i++) { 2796cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const StreamConfiguration &sc = scs[i]; 2797cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) { 2798cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh outputFormats.add(sc.format); 2799cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2800cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2801cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 2802cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableFormats = staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 2803cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableFormats.count; i++) { 2804cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh outputFormats.add(availableFormats.data.i32[i]); 2805cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2806cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2807cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return outputFormats; 2808cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 2809cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2810cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::Size> Parameters::getAvailableJpegSizes() { 2811cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Parameters::Size> jpegSizes; 2812cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2813cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs = getStreamConfigurations(); 2814cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < scs.size(); i++) { 2815cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const StreamConfiguration &sc = scs[i]; 2816cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT && 2817cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sc.format == HAL_PIXEL_FORMAT_BLOB) { 2818cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size sz = {sc.width, sc.height}; 2819cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh jpegSizes.add(sz); 2820cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2821cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2822cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 2823cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int JPEG_SIZE_ENTRY_COUNT = 2; 2824cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int WIDTH_OFFSET = 0; 2825cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int HEIGHT_OFFSET = 1; 2826cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableJpegSizes = 2827cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 2828cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableJpegSizes.count; i+= JPEG_SIZE_ENTRY_COUNT) { 2829cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int width = availableJpegSizes.data.i32[i + WIDTH_OFFSET]; 2830cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int height = availableJpegSizes.data.i32[i + HEIGHT_OFFSET]; 2831cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size sz = {width, height}; 2832cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh jpegSizes.add(sz); 2833cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2834cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2835cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return jpegSizes; 2836cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 2837cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 28387373cbe85e617345f7002256a4be389fe62af913Igor MurashkinParameters::CropRegion Parameters::calculateCropRegion( 28397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin Parameters::CropRegion::Outputs outputs) const { 2840018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2841018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2842018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2843018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Need to convert zoom index into a crop rectangle. The rectangle is 2844018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // chosen to maximize its area on the sensor 2845018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2846018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin camera_metadata_ro_entry_t maxDigitalZoom = 2847d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM); 2848018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // For each zoom step by how many pixels more do we change the zoom 2849018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2850018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (NUM_ZOOM_STEPS-1); 2851018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w) 2852018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // via interpolating zoom step into a zoom ratio 2853018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomRatio = 1 + zoomIncrement * zoom; 2854018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]), 2855018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f", 2856018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomRatio); 2857018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2858018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, " 2859018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "previewHeight=%d, activeWidth=%d, activeHeight=%d", 2860018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth, 2861018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight); 2862018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2863018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin /* 2864018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * Assumption: On the HAL side each stream buffer calculates its crop 2865018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * rectangle as follows: 2866018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * cropRect = (zoomLeft, zoomRight, 2867018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * zoomWidth, zoomHeight * zoomWidth / outputWidth); 2868018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * 2869018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * Note that if zoomWidth > bufferWidth, the new cropHeight > zoomHeight 2870018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * (we can then get into trouble if the cropHeight > arrayHeight). 2871018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * By selecting the zoomRatio based on the smallest outputRatio, we 2872018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * guarantee this will never happen. 2873018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin */ 2874018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2875018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Enumerate all possible output sizes, select the one with the smallest 2876018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // aspect ratio 2877018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float minOutputWidth, minOutputHeight, minOutputRatio; 2878018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin { 2879018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputSizes[][2] = { 2880c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(previewWidth), 2881c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(previewHeight) }, 2882c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(videoWidth), 2883c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(videoHeight) }, 2884c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(jpegThumbSize[0]), 2885c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(jpegThumbSize[1]) }, 2886c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(pictureWidth), 2887c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(pictureHeight) }, 2888018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin }; 2889018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2890018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth = outputSizes[0][0]; 2891018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight = outputSizes[0][1]; 2892018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputRatio = minOutputWidth / minOutputHeight; 2893018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin for (unsigned int i = 0; 2894018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin i < sizeof(outputSizes) / sizeof(outputSizes[0]); 2895018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ++i) { 2896018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 28977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // skip over outputs we don't want to consider for the crop region 28987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if ( !((1 << i) & outputs) ) { 28997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin continue; 29007373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 29017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 2902018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputWidth = outputSizes[i][0]; 2903018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputHeight = outputSizes[i][1]; 2904018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputRatio = outputWidth / outputHeight; 2905018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2906018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin if (minOutputRatio > outputRatio) { 2907018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputRatio = outputRatio; 2908018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth = outputWidth; 2909018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight = outputHeight; 2910018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2911018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2912018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // and then use this output ratio instead of preview output ratio 2913018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Enumerating output ratio %f = %f / %f, min is %f", 2914018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin outputRatio, outputWidth, outputHeight, minOutputRatio); 2915018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2916018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2917018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2918018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin /* Ensure that the width/height never go out of bounds 2919018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * by scaling across a diffent dimension if an out-of-bounds 2920018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * possibility exists. 2921018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * 2922018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by 2923018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * calculating the zoomWidth from zoomHeight we'll actually get a 2924018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * zoomheight > arrayheight 2925018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin */ 2926018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight; 2927018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin if (minOutputRatio >= arrayRatio) { 2928018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Adjust the height based on the width 2929018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomWidth = fastInfo.arrayWidth / zoomRatio; 2930018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = zoomWidth * 2931018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight / minOutputWidth; 2932018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2933018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } else { 2934018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Adjust the width based on the height 2935018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = fastInfo.arrayHeight / zoomRatio; 2936018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomWidth = zoomHeight * 2937018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth / minOutputHeight; 2938018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2939018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // centering the zoom area within the active area 2940018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2; 2941018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2; 2942018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2943018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d", 2944018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom); 2945018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2946018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2947018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight }; 2948018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin return crop; 2949018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin} 2950018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 29511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov) 29521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala const { 29531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t sensorSize = 29541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2); 29551f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 29561f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 29571f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float arrayAspect = static_cast<float>(fastInfo.arrayWidth) / 29581f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.arrayHeight; 29591f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float stillAspect = static_cast<float>(pictureWidth) / pictureHeight; 29601f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect); 29611f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 29621f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // The crop factors from the full sensor array to the still picture crop 29631f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // region 29641f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizCropFactor = 1.f; 29651f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float vertCropFactor = 1.f; 29661f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 29671f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 29681f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Need to calculate the still image field of view based on the total pixel 29691f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * array field of view, and the relative aspect ratios of the pixel array 29701f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * and output streams. 29711f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * 29721f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Special treatment for quirky definition of crop region and relative 29731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * stream cropping. 29741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 29751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (quirks.meteringCropRegion) { 2976c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Use max of preview and video as first crop 2977c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float previewAspect = static_cast<float>(previewWidth) / previewHeight; 2978c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float videoAspect = static_cast<float>(videoWidth) / videoHeight; 2979c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (videoAspect > previewAspect) { 2980c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray previewAspect = videoAspect; 2981c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 2982c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // First crop sensor to preview aspect ratio 2983c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (arrayAspect < previewAspect) { 2984c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor = arrayAspect / previewAspect; 2985c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 2986c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor = previewAspect / arrayAspect; 2987c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 2988c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Second crop to still aspect ratio 2989c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (stillAspect < previewAspect) { 2990c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor *= stillAspect / previewAspect; 2991c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 2992c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor *= previewAspect / stillAspect; 29931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 29941f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } else { 29951f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 29961f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Crop are just a function of just the still/array relative aspect 29971f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * ratios. Since each stream will maximize its area within the crop 29981f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * region, and for FOV we assume a full-sensor crop region, we only ever 29991f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * crop the FOV either vertically or horizontally, never both. 30001f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 30011f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor = (arrayAspect > stillAspect) ? 30021f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (stillAspect / arrayAspect) : 1.f; 30031f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertCropFactor = (arrayAspect < stillAspect) ? 30041f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (arrayAspect / stillAspect) : 1.f; 30051f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 30061f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Horiz crop factor: %f, vert crop fact: %f", 30071f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor, vertCropFactor); 30081f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 30091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Basic field of view formula is: 30101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * angle of view = 2 * arctangent ( d / 2f ) 30111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * where d is the physical sensor dimension of interest, and f is 30121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * the focal length. This only applies to rectilinear sensors, for focusing 30131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * at distances >> f, etc. 30141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 30151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (horizFov != NULL) { 30161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *horizFov = 180 / M_PI * 2 * 30171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(horizCropFactor * sensorSize.data.f[0] / 30181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 30191f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 30201f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (vertFov != NULL) { 30211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *vertFov = 180 / M_PI * 2 * 30221f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(vertCropFactor * sensorSize.data.f[1] / 30231f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 30241f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 30251f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return OK; 30261f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala} 30271f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 3028ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const { 3029af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin return max; 3030af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin} 3031af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 30322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2 30332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android 3034