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" 33d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICamera.h> 340cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/MediaProfiles.h> 350cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/mediarecorder.h> 362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android { 382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 { 392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId, 412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int cameraFacing) : 422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraId(cameraId), 432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraFacing(cameraFacing), 442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala info(NULL) { 452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() { 482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 50cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehstatus_t Parameters::initialize(const CameraMetadata *info, int deviceVersion) { 512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (info->entryCount() == 0) { 542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: No static information provided!", __FUNCTION__); 552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::info = info; 58cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh mDeviceVersion = deviceVersion; 592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = buildFastInfo(); 612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) return res; 622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 63e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala res = buildQuirks(); 64e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (res != OK) return res; 65e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 663ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He const Size MAX_PREVIEW_SIZE = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT }; 670cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He // Treat the H.264 max size as the max supported video size. 680cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He MediaProfiles *videoEncoderProfiles = MediaProfiles::getInstance(); 6944d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh Vector<video_encoder> encoders = videoEncoderProfiles->getVideoEncoders(); 7044d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh int32_t maxVideoWidth = 0; 7144d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh int32_t maxVideoHeight = 0; 7244d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh for (size_t i = 0; i < encoders.size(); i++) { 7344d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh int width = videoEncoderProfiles->getVideoEncoderParamByName( 7444d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh "enc.vid.width.max", encoders[i]); 7544d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh int height = videoEncoderProfiles->getVideoEncoderParamByName( 7644d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh "enc.vid.height.max", encoders[i]); 7744d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh // Treat width/height separately here to handle the case where different 7844d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh // profile might report max size of different aspect ratio 7944d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh if (width > maxVideoWidth) { 8044d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh maxVideoWidth = width; 8144d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh } 8244d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh if (height > maxVideoHeight) { 8344d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh maxVideoHeight = height; 8444d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh } 8544d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh } 8644d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh // This is just an upper bound and may not be an actually valid video size 8744d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh const Size VIDEO_SIZE_UPPER_BOUND = {maxVideoWidth, maxVideoHeight}; 880cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He 890cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He res = getFilteredSizes(MAX_PREVIEW_SIZE, &availablePreviewSizes); 900cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He if (res != OK) return res; 9144d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh res = getFilteredSizes(VIDEO_SIZE_UPPER_BOUND, &availableVideoSizes); 923ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (res != OK) return res; 932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 94a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala // Select initial preview and video size that's under the initial bound and 95a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala // on the list of both preview and recording sizes 96a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewWidth = 0; 97a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewHeight = 0; 98a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala for (size_t i = 0 ; i < availablePreviewSizes.size(); i++) { 99a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala int newWidth = availablePreviewSizes[i].width; 100a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala int newHeight = availablePreviewSizes[i].height; 101a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala if (newWidth >= previewWidth && newHeight >= previewHeight && 102a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala newWidth <= MAX_INITIAL_PREVIEW_WIDTH && 103a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala newHeight <= MAX_INITIAL_PREVIEW_HEIGHT) { 104a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala for (size_t j = 0; j < availableVideoSizes.size(); j++) { 105a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala if (availableVideoSizes[j].width == newWidth && 106a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala availableVideoSizes[j].height == newHeight) { 107a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewWidth = newWidth; 108a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala previewHeight = newHeight; 109a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 110a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 111a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 112a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 113a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala if (previewWidth == 0) { 114a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala ALOGE("%s: No initial preview size can be found!", __FUNCTION__); 115a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala return BAD_VALUE; 116a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala } 1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala videoWidth = previewWidth; 1182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala videoHeight = previewHeight; 1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPreviewSize(previewWidth, previewHeight); 1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setVideoSize(videoWidth, videoHeight); 1222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8::format("%dx%d", 1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight)); 1252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewSizes; 1273ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (size_t i = 0; i < availablePreviewSizes.size(); i++) { 1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 1292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 1303ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He availablePreviewSizes[i].width, 1313ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He availablePreviewSizes[i].height); 1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1333ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGV("Supported preview sizes are: %s", supportedPreviewSizes.string()); 1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes); 1360cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He 1370cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He String8 supportedVideoSizes; 1380cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He for (size_t i = 0; i < availableVideoSizes.size(); i++) { 1390cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He if (i != 0) supportedVideoSizes += ","; 1400cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He supportedVideoSizes += String8::format("%dx%d", 1410cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He availableVideoSizes[i].width, 1420cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He availableVideoSizes[i].height); 1430cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He } 1440cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He ALOGV("Supported video sizes are: %s", supportedVideoSizes.string()); 1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 1460cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He supportedVideoSizes); 1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatEnumToString(previewFormat)); // NV21 1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewTransform = degToTransform(0, 1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraFacing == CAMERA_FACING_FRONT); 1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFormats; 162cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> outputFormats = getAvailableOutputFormats(); 1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 164cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < outputFormats.size(); i++) { 1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 167cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh switch (outputFormats[i]) { 1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 1912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1924a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_420_888: 1934a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Flexible YUV allows both YV12 and NV21 1944a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += 1954a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1964a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += ","; 1974a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += 1984a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1994a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala break; 200a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala // Not advertizing JPEG, RAW16, etc, for preview formats 2014a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 202a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 2032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 2042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 2052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 2062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 2082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 209cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh __FUNCTION__, cameraId, outputFormats[i]); 2102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 2112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 2122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 2152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats); 2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 218652f7d7ebd9a8cec067588c2a232e49710d5cd83Yin-Chia Yeh previewFpsRange[0] = fastInfo.bestStillCaptureFpsRange[0]; 219652f7d7ebd9a8cec067588c2a232e49710d5cd83Yin-Chia Yeh previewFpsRange[1] = fastInfo.bestStillCaptureFpsRange[1]; 2200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // still have to do something sane for them 2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 224d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala // NOTE: Not scaled like FPS range values are. 225d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]); 2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 227af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin previewFps); 2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // PREVIEW_FPS_RANGE 2300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // -- Order matters. Set range after single value to so that a roundtrip 2310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // of setParameters(getParameters()) would keep the FPS range in higher 2320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // order. 2330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 2340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8::format("%d,%d", 2350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin previewFpsRange[0] * kFpsToApiScale, 2360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin previewFpsRange[1] * kFpsToApiScale)); 2370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 2390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 supportedPreviewFpsRange; 2400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin for (size_t i=0; i < availableFpsRanges.count; i += 2) { 2414f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He if (!isFpsSupported(availablePreviewSizes, 2424f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, availableFpsRanges.data.i32[i+1])) { 2434f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He continue; 2444f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He } 245c067179b6a402fc0c284cfae886058a6738e9b20Yin-Chia Yeh if (supportedPreviewFpsRange.length() > 0) { 246c067179b6a402fc0c284cfae886058a6738e9b20Yin-Chia Yeh supportedPreviewFpsRange += ","; 247c067179b6a402fc0c284cfae886058a6738e9b20Yin-Chia Yeh } 2480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin supportedPreviewFpsRange += String8::format("(%d,%d)", 2490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin availableFpsRanges.data.i32[i] * kFpsToApiScale, 2500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin availableFpsRanges.data.i32[i+1] * kFpsToApiScale); 2510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 2530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin supportedPreviewFpsRange); 2540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin SortedVector<int32_t> sortedPreviewFrameRates; 258af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFrameRates; 2602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 261af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // from the [min, max] fps range use the max value 262af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int fps = fpsFromRange(availableFpsRanges.data.i32[i], 263af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFpsRanges.data.i32[i+1]); 2644f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He if (!isFpsSupported(availablePreviewSizes, 2654f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, fps)) { 2664f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He continue; 2674f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He } 268af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // de-dupe frame rates 269af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) { 270af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin sortedPreviewFrameRates.add(fps); 271af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 272af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 273af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin continue; 274af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 275af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 276af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.size() > 1) { 277af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin supportedPreviewFrameRates += ","; 278af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 279af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 281af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin fps); 282af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 283af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: Supported preview frame rates: %s", 284af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, supportedPreviewFrameRates.string()); 2852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates); 2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 290cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Size> availableJpegSizes = getAvailableJpegSizes(); 291cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (!availableJpegSizes.size()) return NO_INIT; 2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick maximum 294cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh pictureWidth = availableJpegSizes[0].width; 295cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh pictureHeight = availableJpegSizes[0].height; 2963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 2973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 2983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = false; 2992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureSize(pictureWidth, 3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight); 3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPictureSizes; 305cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableJpegSizes.size(); i++) { 3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 3072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 308cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableJpegSizes[i].width, 309cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableJpegSizes[i].height); 3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes); 3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbnailSizes = 320f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4); 3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3239fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He // Pick the largest thumbnail size that matches still image aspect ratio. 3249fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0, 3259fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Invalid picture size, %d x %d", pictureWidth, pictureHeight); 3269fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight; 3279fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size thumbnailSize = 3289fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He getMaxSizeForRatio( 3299fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He picAspectRatio, 3309fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He &availableJpegThumbnailSizes.data.i32[0], 3319fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He availableJpegThumbnailSizes.count); 3329fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[0] = thumbnailSize.width; 3339fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[1] = thumbnailSize.height; 3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0]); 3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1]); 3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedJpegThumbSizes; 3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes); 3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality = 90; 3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality); 3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality = 90; 3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality); 3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation = 0; 3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation); 3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsEnabled = false; 363a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[0] = 0.0; 364a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[1] = 0.0; 365a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[2] = 0.0; 366a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsTimestamp = 0; 3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcessingMethod = "unknown"; 3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 3692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 370d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin wbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableWhiteBalanceModes = 375211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 376211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableWhiteBalanceModes.count) { 377211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 378211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::WHITE_BALANCE_AUTO); 379211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedWhiteBalance; 3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 386d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 390d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 394d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 398d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 402d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 406d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 410d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 414d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Skipping values not mappable to v1 API 419d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_OFF: 4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance); 4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 434d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE); 4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffects = 439211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false); 440211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableEffects.count) { 441211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, 442211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::EFFECT_NONE); 443211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedEffects; 4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedEffects += ","; 4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 450d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_OFF: 4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE; 4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 454d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_MONO: 4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_MONO; 4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 458d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE: 4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 462d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE: 4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 466d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SEPIA: 4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SEPIA; 4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 470d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE: 4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 474d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD: 4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 478d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD: 4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 482d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_AQUA: 4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_AQUA; 4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableEffects.data.u8[i]); 4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 496d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAntibandingModes = 501211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false); 502211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableAntibandingModes.count) { 503211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 504211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::ANTIBANDING_OFF); 505211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedAntibanding; 5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 512d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF: 5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 516d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ: 5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 520d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ: 5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 524d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO: 5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding); 5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 540c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED; 5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 545211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 546211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableSceneModes.count) { 547211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.remove(CameraParameters::KEY_SCENE_MODE); 548211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool noSceneModes = false; 5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 556c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk case ANDROID_CONTROL_SCENE_MODE_DISABLED: 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala noSceneModes = true; 5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not in old API 5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 623af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_HDR: 624af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala supportedSceneModes += 625af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala CameraParameters::SCENE_MODE_HDR; 626af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala break; 6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableSceneModes.data.u8[i]); 6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!noSceneModes) { 6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes); 638cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin } else { 639cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin params.remove(CameraParameters::KEY_SCENE_MODE); 6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 643211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool isFlashAvailable = false; 6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 645211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false); 646211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (flashAvailable.count) { 647211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray isFlashAvailable = flashAvailable.data.u8[0]; 648211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 651211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false); 6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 653248f9ce1b6052889dd55e7701f908477d16d6ff4Eino-Ville Talvala flashMode = Parameters::FLASH_MODE_OFF; 654211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (isFlashAvailable) { 6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 6566f854608d26d7abcce5e46396c7260ed7b250653Alex Ray CameraParameters::FLASH_MODE_OFF); 6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableAeModes.data.u8[i] == 665d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 6722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes); 6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 674b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // No flash means null flash mode and supported flash modes keys, so 675b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // remove them just to be safe 676b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala params.remove(CameraParameters::KEY_FLASH_MODE); 677b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala params.remove(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 681211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false); 6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAfModes = 684211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false); 6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 686211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) { 6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Fixed-focus lens 6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_FIXED; 6892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_AUTO; 6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 69780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh String8 supportedFocusModes; 69880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh bool addComma = false; 69980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh camera_metadata_ro_entry_t focusDistanceCalibration = 70080ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, false); 70180ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh 70280ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh if (focusDistanceCalibration.count && 70380ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh focusDistanceCalibration.data.u8[0] != 70480ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED) { 70580ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh supportedFocusModes += CameraParameters::FOCUS_MODE_INFINITY; 70680ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh addComma = true; 70780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh } 7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 713d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 717d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 721d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 725d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 729d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not supported in old API 734d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableAfModes.data.u8[i]); 7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes); 7462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 747d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 74895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala shadowFocusMode = FOCUS_MODE_INVALID; 7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 750ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS, 751ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION); 752ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT; 7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7547d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin int32_t maxNumFocusAreas = 0; 7557d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (focusMode != Parameters::FOCUS_MODE_FIXED) { 756ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk maxNumFocusAreas = max3aRegions.data.i32[Parameters::REGION_AF]; 7577d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 7587d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas); 7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.clear(); 7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.add(Parameters::Area(0,0,0,0,0)); 7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 764c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (fastInfo.isExternalCamera) { 765c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, -1.0); 766c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } else { 767c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh camera_metadata_ro_entry_t availableFocalLengths = 768c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, false); 769c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (!availableFocalLengths.count) return NO_INIT; 770c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh 771c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh float minFocalLength = availableFocalLengths.data.f[0]; 772c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 773c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } 7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 7771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 7781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 7791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate field of views!", __FUNCTION__); 7801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return res; 7811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation = 0; 7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation); 7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 791d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2); 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationStep = 800d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1); 8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoExposureLock = false; 8082638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev autoExposureLockAvailable = false; 8092638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev camera_metadata_ro_entry_t exposureLockAvailable = 8102638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev staticInfo(ANDROID_CONTROL_AE_LOCK_AVAILABLE, 1, 1); 8112638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev if ((0 < exposureLockAvailable.count) && 8122638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev (ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE == 8132638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev exposureLockAvailable.data.u8[0])) { 8142638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 8152638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev CameraParameters::FALSE); 8162638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 8172638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev CameraParameters::TRUE); 8182638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev autoExposureLockAvailable = true; 8192638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } else { 8202638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 8212638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev CameraParameters::FALSE); 8222638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } 8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoWhiteBalanceLock = false; 8252638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev autoWhiteBalanceLockAvailable = false; 8262638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev camera_metadata_ro_entry_t whitebalanceLockAvailable = 8272638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev staticInfo(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, 1, 1); 8282638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev if ((0 < whitebalanceLockAvailable.count) && 8292638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev (ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE == 8302638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev whitebalanceLockAvailable.data.u8[0])) { 8312638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 8322638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev CameraParameters::FALSE); 8332638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 8342638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev CameraParameters::TRUE); 8352638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev autoWhiteBalanceLockAvailable = true; 8362638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } else { 8372638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 8382638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev CameraParameters::FALSE); 8392638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } 8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 843ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk max3aRegions.data.i32[Parameters::REGION_AE]); 8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom = 0; 8485b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev zoomAvailable = false; 8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 850d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1); 8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8535b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev if (fabs(maxDigitalZoom.data.f[0] - 1.f) > 0.00001f) { 8545b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev params.set(CameraParameters::KEY_ZOOM, zoom); 8555b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 8565b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev 8575b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev { 8585b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev String8 zoomRatios; 8595b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev float zoom = 1.f; 8605b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 8615b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev (NUM_ZOOM_STEPS-1); 8625b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev bool addComma = false; 8635b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 8645b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev if (addComma) zoomRatios += ","; 8655b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev addComma = true; 8665b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 8675b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev zoom += zoomIncrement; 8685b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev } 8695b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8725b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 8735b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev CameraParameters::TRUE); 8745b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev zoomAvailable = true; 8755b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev } else { 8765b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 8775b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev CameraParameters::FALSE); 8785b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev } 8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 88082edd5431951f461058c07b73c0dbc093aa45c99Igor Murashkin CameraParameters::FALSE); 8812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Infinity,Infinity,Infinity"); 8842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces); 8872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 0); 8892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 893a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala recordingHint = false; 8942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 8952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 900a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala videoStabilization = false; 9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 905211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 906211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 9102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 9178cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen videoFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 9182cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala videoDataSpace = HAL_DATASPACE_V0_BT709; 919d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala videoBufferMode = hardware::ICamera::VIDEO_BUFFER_MODE_DATA_CALLBACK_YUV; 9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala playShutterSound = true; 9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFaceDetect = false; 9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFocusMoveMessages = false; 924da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala afTriggerCounter = 1; 9252b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala afStateCounter = 0; 9262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala currentAfTriggerId = -1; 927a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala afInMotion = false; 9282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 929da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala precaptureTriggerCounter = 1; 930da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 9312b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala takePictureCounter = 0; 9322b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewCallbackFlags = 0; 934a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala previewCallbackOneShot = false; 9353ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala previewCallbackSurface = false; 9362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 937355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh Size maxJpegSize = getMaxSize(getAvailableJpegSizes()); 938355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(maxJpegSize); 939355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 940355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh slowJpegMode = false; 941355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (minFrameDurationNs > kSlowJpegModeThreshold) { 942355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh slowJpegMode = true; 943355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // Slow jpeg devices does not support video snapshot without 944355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // slowing down preview. 945355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // TODO: support video size video snapshot only? 946355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 947355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh CameraParameters::FALSE); 948355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 949355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 9502efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang isZslReprocessPresent = false; 9512d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev camera_metadata_ro_entry_t availableCapabilities = 9522d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev staticInfo(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 9532d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev if (0 < availableCapabilities.count) { 9542d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev const uint8_t *caps = availableCapabilities.data.u8; 9552d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev for (size_t i = 0; i < availableCapabilities.count; i++) { 9562d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING == 9577b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala caps[i]) { 9582d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev isZslReprocessPresent = true; 9592d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev break; 9602d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev } 9612d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev } 9622d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev } 9632d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev 9647b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala isDistortionCorrectionSupported = false; 9657b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala camera_metadata_ro_entry_t distortionCorrectionModes = 9667b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala staticInfo(ANDROID_DISTORTION_CORRECTION_AVAILABLE_MODES); 9677b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala for (size_t i = 0; i < distortionCorrectionModes.count; i++) { 9687b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala if (distortionCorrectionModes.data.u8[i] != 9697b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala ANDROID_DISTORTION_CORRECTION_MODE_OFF) { 9707b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala isDistortionCorrectionSupported = true; 9717b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala break; 9727b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala } 9737b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala } 9747b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala 975fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen if (isDeviceZslSupported || slowJpegMode || 976fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen property_get_bool("camera.disable_zsl_mode", false)) { 977afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He ALOGI("Camera %d: Disabling ZSL mode", cameraId); 978c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala allowZslMode = false; 9792f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala } else { 9802d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev allowZslMode = isZslReprocessPresent; 981b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala } 982e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 983c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala ALOGI("%s: allowZslMode: %d slowJpegMode %d", __FUNCTION__, allowZslMode, slowJpegMode); 984355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 9852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = STOPPED; 9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala paramsFlattened = params.flatten(); 9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const { 9938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return paramsFlattened; 9948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 9958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() { 9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t activeArraySize = 99903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4); 10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!activeArraySize.count) return NO_INIT; 100103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayWidth; 100203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayHeight; 100303e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray if (activeArraySize.count == 2) { 1004e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!", 1005e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray __FUNCTION__, cameraId); 100603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[0]; 100703e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[1]; 100803e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else if (activeArraySize.count == 4) { 100903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[2]; 101003e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[3]; 101103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else return NO_INIT; 10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // We'll set the target FPS range for still captures to be as wide 10140181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // as possible to give the HAL maximum latitude for exposure selection 10150181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 10160181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 10170181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) { 10180181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala return NO_INIT; 10190181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 10200181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 10212efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang // Get supported preview fps ranges, up to default maximum. 102249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He Vector<Size> supportedPreviewSizes; 102349aac43b4a323a8702d93b7cf878252905dc3987Zhijun He Vector<FpsRange> supportedPreviewFpsRanges; 102449aac43b4a323a8702d93b7cf878252905dc3987Zhijun He const Size PREVIEW_SIZE_BOUND = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT }; 102549aac43b4a323a8702d93b7cf878252905dc3987Zhijun He status_t res = getFilteredSizes(PREVIEW_SIZE_BOUND, &supportedPreviewSizes); 102649aac43b4a323a8702d93b7cf878252905dc3987Zhijun He if (res != OK) return res; 102749aac43b4a323a8702d93b7cf878252905dc3987Zhijun He for (size_t i=0; i < availableFpsRanges.count; i += 2) { 102849aac43b4a323a8702d93b7cf878252905dc3987Zhijun He if (!isFpsSupported(supportedPreviewSizes, 10292efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, availableFpsRanges.data.i32[i+1]) || 10302efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang availableFpsRanges.data.i32[i+1] > MAX_DEFAULT_FPS) { 103149aac43b4a323a8702d93b7cf878252905dc3987Zhijun He continue; 103249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He } 103349aac43b4a323a8702d93b7cf878252905dc3987Zhijun He FpsRange fpsRange = {availableFpsRanges.data.i32[i], availableFpsRanges.data.i32[i+1]}; 103449aac43b4a323a8702d93b7cf878252905dc3987Zhijun He supportedPreviewFpsRanges.add(fpsRange); 103549aac43b4a323a8702d93b7cf878252905dc3987Zhijun He } 103649aac43b4a323a8702d93b7cf878252905dc3987Zhijun He if (supportedPreviewFpsRanges.size() == 0) { 103749aac43b4a323a8702d93b7cf878252905dc3987Zhijun He ALOGE("Supported preview fps range is empty"); 103849aac43b4a323a8702d93b7cf878252905dc3987Zhijun He return NO_INIT; 103949aac43b4a323a8702d93b7cf878252905dc3987Zhijun He } 104049aac43b4a323a8702d93b7cf878252905dc3987Zhijun He 10410181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t bestStillCaptureFpsRange[2] = { 104249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He supportedPreviewFpsRanges[0].low, supportedPreviewFpsRanges[0].high 10430181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala }; 10440181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t curRange = 10450181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0]; 104649aac43b4a323a8702d93b7cf878252905dc3987Zhijun He for (size_t i = 1; i < supportedPreviewFpsRanges.size(); i ++) { 10470181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t nextRange = 104849aac43b4a323a8702d93b7cf878252905dc3987Zhijun He supportedPreviewFpsRanges[i].high - 104949aac43b4a323a8702d93b7cf878252905dc3987Zhijun He supportedPreviewFpsRanges[i].low; 10500181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if ( (nextRange > curRange) || // Maximize size of FPS range first 10510181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala (nextRange == curRange && // Then minimize low-end FPS 105249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He bestStillCaptureFpsRange[0] > supportedPreviewFpsRanges[i].low)) { 10530181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 105449aac43b4a323a8702d93b7cf878252905dc3987Zhijun He bestStillCaptureFpsRange[0] = supportedPreviewFpsRanges[i].low; 105549aac43b4a323a8702d93b7cf878252905dc3987Zhijun He bestStillCaptureFpsRange[1] = supportedPreviewFpsRanges[i].high; 10560181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala curRange = nextRange; 10570181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 10580181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 10590181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFaceDetectModes = 1061211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0, 1062211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t bestFaceDetectMode = 1065d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) { 10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFaceDetectModes.data.u8[i]) { 1068d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF: 10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1070d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE: 10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (bestFaceDetectMode != 1072d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) { 10732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 1074d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE; 10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1077d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL: 10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 1079d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL; 10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 10822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown face detect mode %d:", 10832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 10842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFaceDetectModes.data.u8[i]); 10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return NO_INIT; 10862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1089211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray int32_t maxFaces = 0; 10902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxFacesDetected = 1091211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false); 1092211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (maxFacesDetected.count) { 1093211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray maxFaces = maxFacesDetected.data.i32[0]; 1094211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 1097211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 10988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t sceneModeOverrides = 1099211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false); 11008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 1101211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false); 1102211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool fixedLens = minFocusDistance.count == 0 || 1103211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray minFocusDistance.data.f[0] == 0; 11048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 1105176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala camera_metadata_ro_entry_t focusDistanceCalibration = 1106176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, 1107176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala false); 1108176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala bool canFocusInfinity = (focusDistanceCalibration.count && 1109176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala focusDistanceCalibration.data.u8[0] != 1110176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED); 1111176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala 1112c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh 1113c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh camera_metadata_ro_entry_t hwLevel = staticInfo(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL); 1114c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (!hwLevel.count) return NO_INIT; 1115c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh fastInfo.isExternalCamera = 1116c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh hwLevel.data.u8[0] == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL; 1117c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh 11181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 1119c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, /*required*/false); 1120c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (!availableFocalLengths.count && !fastInfo.isExternalCamera) return NO_INIT; 11211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 1122cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> availableFormats = getAvailableOutputFormats(); 1123cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (!availableFormats.size()) return NO_INIT; 11244a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 11254a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 11268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count > 0) { 11278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // sceneModeOverrides is defined to have 3 entries for each scene mode, 11288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // which are AE, AWB, and AF override modes the HAL wants for that scene 11298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // mode. 11308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala const size_t kModesPerSceneMode = 3; 11318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count != 11328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count * kModesPerSceneMode) { 11338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override list is an " 1134e5729fac81c8a984e984fefc90afc64135817d4fColin Cross "unexpected size: %zu (expected %zu)", __FUNCTION__, 11358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, sceneModeOverrides.count, 113619fdbfcf8af3ca689c3c62b88059ac5d3c6907d1Hubert Rzezniczak availableSceneModes.count * kModesPerSceneMode); 11378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return NO_INIT; 11388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 11398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (size_t i = 0; i < availableSceneModes.count; i++) { 11408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala DeviceInfo::OverrideModes modes; 11418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t aeMode = 11428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0]; 11438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(aeMode) { 1144d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON: 11458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_OFF; 11468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1147d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH: 11488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_AUTO; 11498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1150d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH: 11518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_ON; 11528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1153d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: 11548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_RED_EYE; 11558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 11568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 11578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__, 11588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala aeMode); 11598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_INVALID; 11608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 11618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 11628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.wbMode = 11638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1]; 11648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t afMode = 11658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2]; 11668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(afMode) { 1167d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 1168176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala if (!fixedLens && !canFocusInfinity) { 1169176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override lists asks for" 1170176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala " fixed focus on a device with focuser but not" 1171176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala " calibrated for infinity focus", __FUNCTION__, 1172176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala cameraId); 1173176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala return NO_INIT; 1174176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala } 11758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = fixedLens ? 11768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY; 11778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1178d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 1179d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 1180d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1181d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1182d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 11838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = static_cast<focusMode_t>(afMode); 11848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 11858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 11868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__, 11878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala afMode); 11888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = FOCUS_MODE_INVALID; 11898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 11908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 11918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i], 11928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes); 11938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 11948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 11958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayWidth = arrayWidth; 11972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayHeight = arrayHeight; 11980181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0]; 11990181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1]; 12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.bestFaceDetectMode = bestFaceDetectMode; 12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces = maxFaces; 12021f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 12031f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // Find smallest (widest-angle) focal length to use as basis of still 12041f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // picture FOV reporting. 1205c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (fastInfo.isExternalCamera) { 1206c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh fastInfo.minFocalLength = -1.0; 1207c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } else { 1208c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh fastInfo.minFocalLength = availableFocalLengths.data.f[0]; 1209c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh for (size_t i = 1; i < availableFocalLengths.count; i++) { 1210c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) { 1211c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh fastInfo.minFocalLength = availableFocalLengths.data.f[i]; 1212c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } 12131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 12141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 12151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 12164a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888 12174a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = false; 1218cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableFormats.size(); i++) { 1219cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableFormats[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) { 12204a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = true; 12214a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala break; 12224a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 12234a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 12244a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGV("Camera %d: Flexible YUV %s supported", 12254a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala cameraId, fastInfo.useFlexibleYuv ? "is" : "is not"); 12264a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 1227c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala fastInfo.maxJpegSize = getMaxSize(getAvailableJpegSizes()); 1228c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala 122966814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh isZslReprocessPresent = false; 123066814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh camera_metadata_ro_entry_t availableCapabilities = 123166814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh staticInfo(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 123266814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh if (0 < availableCapabilities.count) { 123366814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh const uint8_t *caps = availableCapabilities.data.u8; 123466814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh for (size_t i = 0; i < availableCapabilities.count; i++) { 123566814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING == 12367b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala caps[i]) { 123766814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh isZslReprocessPresent = true; 123866814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh break; 123966814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } 124066814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } 124166814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } 124266814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh if (isZslReprocessPresent) { 124366814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh Vector<StreamConfiguration> scs = getStreamConfigurations(); 124466814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh Size maxPrivInputSize = {0, 0}; 124566814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh for (const auto& sc : scs) { 124666814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT && 124766814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 124866814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh if (sc.width * sc.height > maxPrivInputSize.width * maxPrivInputSize.height) { 124966814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh maxPrivInputSize = {sc.width, sc.height}; 125066814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } 125166814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } 125266814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } 125366814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh fastInfo.maxZslSize = maxPrivInputSize; 125466814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } else { 125566814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh fastInfo.maxZslSize = {0, 0}; 125666814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh } 125766814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh 12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1261e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() { 1262e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 1263e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO); 1264e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1); 1265e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled", 1266e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1267e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 1268e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT); 1269e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1); 1270e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled", 1271e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1272e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 12737373cbe85e617345f7002256a4be389fe62af913Igor Murashkin entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION); 12747373cbe85e617345f7002256a4be389fe62af913Igor Murashkin quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1); 12757373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion" 12767373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " enabled", cameraId); 12777373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 1278fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 1279fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1); 1280fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult" 1281fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala " enabled", cameraId); 1282fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1283e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala return OK; 1284e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala} 1285e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag, 1287d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin size_t minCount, size_t maxCount, bool required) const { 12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t entry = info->find(tag); 128971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const camera_metadata_t *metaBuffer = info->getAndLock(); 12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1291d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin if (CC_UNLIKELY( entry.count == 0 ) && required) { 129271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const char* tagSection = get_local_camera_metadata_section_name(tag, 129371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev metaBuffer); 12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 129571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const char* tagName = get_local_camera_metadata_tag_name(tag, 129671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev metaBuffer); 12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x)", 13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag); 13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (CC_UNLIKELY( 13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 130471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const char* tagSection = get_local_camera_metadata_section_name(tag, 130571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev metaBuffer); 13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 130771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const char* tagName = get_local_camera_metadata_tag_name(tag, 130871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev metaBuffer); 13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 1311e5729fac81c8a984e984fefc90afc64135817d4fColin Cross "Expected between %zu and %zu values, but got %zu values", 13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 131471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev info->unlock(metaBuffer); 13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return entry; 13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) { 13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters2 newParams(paramString); 13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only parameters 13252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // such as supported preview sizes, etc. Should probably produce an error if 13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // they're changed. 13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Extract and verify new parameters */ 13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t i; 13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters validatedParams(*this); 13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_SIZE 13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewSize(&validatedParams.previewWidth, 13362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewHeight); 13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewWidth != previewWidth || 13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight != previewHeight) { 13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 13412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight, 13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth, validatedParams.previewHeight); 13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13483ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (i = 0; i < availablePreviewSizes.size(); i++) { 13493ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if ((availablePreviewSizes[i].width == 13502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth) && 13513ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He (availablePreviewSizes[i].height == 13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight)) break; 13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13543ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (i == availablePreviewSizes.size()) { 13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewWidth, 13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight); 13582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1362af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // RECORDING_HINT (always supported) 1363af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint = boolFromString( 1364af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 13650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin IF_ALOGV() { // Avoid unused variable warning 13660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin bool recordingHintChanged = 13670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.recordingHint != recordingHint; 13680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (recordingHintChanged) { 13690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Recording hint changed to %d", 13700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, validatedParams.recordingHint); 13710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 13720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1373af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FPS_RANGE 1375d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 13760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 13770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Use the single FPS value if it was set later than the range. 13780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Otherwise, use the range value. 13790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 13800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin bool fpsUseSingleValue; 13810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 13820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *fpsRange, *fpsSingle; 13830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1384b915da10831802013d670d6a316727e7b2e1a74eGigon Bae fpsSingle = newParams.get(CameraParameters::KEY_PREVIEW_FRAME_RATE); 1385b915da10831802013d670d6a316727e7b2e1a74eGigon Bae fpsRange = newParams.get(CameraParameters::KEY_PREVIEW_FPS_RANGE); 13860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 13870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 13880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Pick either the range or the single key if only one was set. 13890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 13900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * If both are set, pick the one that has greater set order. 13910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 13920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (fpsRange == NULL && fpsSingle == NULL) { 13930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("%s: FPS was not set. One of %s or %s must be set.", 13940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, CameraParameters::KEY_PREVIEW_FRAME_RATE, 13950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FPS_RANGE); 13960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return BAD_VALUE; 13970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (fpsRange == NULL) { 13980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = true; 13990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: FPS range not set, using FPS single value", 14000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__); 14010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (fpsSingle == NULL) { 14020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = false; 14030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: FPS single not set, using FPS range value", 14040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__); 14050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else { 14060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int fpsKeyOrder; 14070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin res = newParams.compareSetOrder( 14080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FRAME_RATE, 14090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FPS_RANGE, 14100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin &fpsKeyOrder); 14110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin LOG_ALWAYS_FATAL_IF(res != OK, "Impossibly bad FPS keys"); 14120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 14130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = (fpsKeyOrder > 0); 14140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 14150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1416d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 14170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS value is used from '%s'", 14180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, fpsUseSingleValue ? "single" : "range"); 14190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0], 14212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewFpsRange[1]); 14220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1423c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[0] /= kFpsToApiScale; 1424c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[1] /= kFpsToApiScale; 1425c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala 14260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Ignore the FPS range if the FPS single has higher precedence 14270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (!fpsUseSingleValue) { 14280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS range (%d, %d)", __FUNCTION__, 14290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0], 14300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1]); 1431d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewFpsRanges = 14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0]) && 14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]) ) { 14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFpsRange[0], 14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]); 14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FORMAT 14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFormat = 14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatStringToEnum(newParams.getPreviewFormat()); 14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFormat != previewFormat) { 14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active!", __FUNCTION__); 14572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1459cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> availableFormats = getAvailableOutputFormats(); 14604a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // If using flexible YUV, always support NV21/YV12. Otherwise, check 14614a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // HAL's list. 14624a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (! (fastInfo.useFlexibleYuv && 14634a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala (validatedParams.previewFormat == 14644a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP || 14654a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat == 14664a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YV12) ) ) { 14674a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Not using flexible YUV format, so check explicitly 1468cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (i = 0; i < availableFormats.size(); i++) { 1469cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableFormats[i] == validatedParams.previewFormat) break; 14704a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 1471cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (i == availableFormats.size()) { 14724a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 14734a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), 14744a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat); 14754a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala return BAD_VALUE; 14764a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // PREVIEW_FRAME_RATE Deprecated 14810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // - Use only if the single FPS value was set later than the FPS range 14820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (fpsUseSingleValue) { 1483d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int previewFps = newParams.getPreviewFrameRate(); 14840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS single value requested: %d", 14850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, previewFps); 14860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFrameRates = 14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 1489af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin /** 1490af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is set, find the range that encompasses 1491af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * previewFps with the largest min index. 1492af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1493af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is not set, find the range with previewFps 1494af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * with the smallest min index. 1495af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1496af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * Either way, in case of multiple ranges, break the tie by 1497af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * selecting the smaller range. 14982efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang * 14992efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang * Always select range within 30fps if one exists. 1500af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin */ 1501d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 1502d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala // all ranges which have previewFps 1503af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Vector<Range> candidateRanges; 15042efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang Vector<Range> candidateFastRanges; 15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 1506af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = { 1507af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i], 1508af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i+1] 1509af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin }; 15102efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang if (!isFpsSupported(availablePreviewSizes, 15112efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, r.max)) { 15122efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang continue; 15132efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang } 1514af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1515d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala if (r.min <= previewFps && previewFps <= r.max) { 15162efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang if (r.max <= MAX_DEFAULT_FPS) { 15172efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang candidateRanges.push(r); 15182efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang } else { 15192efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang candidateFastRanges.push(r); 15202efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang } 1521af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15232efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang if (candidateRanges.isEmpty() && candidateFastRanges.isEmpty()) { 15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 1525d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala __FUNCTION__, previewFps); 15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1528af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 15292efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang // most applicable range with targetFps 15302efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang Vector<Range>& ranges = 15312efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang candidateRanges.size() > 0 ? candidateRanges : candidateFastRanges; 15322efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang Range bestRange = ranges[0]; 15332efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang for (i = 1; i < ranges.size(); ++i) { 15342efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang Range r = ranges[i]; 1535af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by largest minIndex in recording mode 1536af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (validatedParams.recordingHint) { 1537af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min > bestRange.min) { 1538af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1539af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1540af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1541af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1542af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1543af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1544af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by smallest minIndex in preview mode 1545af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 1546af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min < bestRange.min) { 1547af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1548af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1549af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1550af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1551af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1552af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1553af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1554af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0] = 1556af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.min; 15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] = 1558af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.max; 1559af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1560af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d", 1561af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, 1562af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[0], 1563af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[1], 1564af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint); 15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 15690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Update Preview FPS and Preview FPS ranges based on 15700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * what we actually set. 15710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 15720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * This updates the API-visible (Camera.Parameters#getParameters) values of 15730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * the FPS fields, not only the internal versions. 15740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 15750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Order matters: The value that was set last takes precedence. 15760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * - If the client does a setParameters(getParameters()) we retain 15770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * the same order for preview FPS. 15780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 15790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (!fpsUseSingleValue) { 15800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set fps single, then fps range (range wins) 15810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFrameRate( 15820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsFromRange(/*min*/validatedParams.previewFpsRange[0], 15830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /*max*/validatedParams.previewFpsRange[1])); 15840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFpsRange( 15850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0] * kFpsToApiScale, 15860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1] * kFpsToApiScale); 15870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else { 15880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set fps range, then fps single (single wins) 15890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFpsRange( 15900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0] * kFpsToApiScale, 15910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1] * kFpsToApiScale); 15920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set this to the same value, but with higher priority 15930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFrameRate( 15940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.getPreviewFrameRate()); 15950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 15960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PICTURE_SIZE 15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPictureSize(&validatedParams.pictureWidth, 15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.pictureHeight); 16003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (validatedParams.pictureWidth != pictureWidth || 16013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh validatedParams.pictureHeight != pictureHeight) { 1602cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Size> availablePictureSizes = getAvailableJpegSizes(); 1603cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (i = 0; i < availablePictureSizes.size(); i++) { 1604cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if ((availablePictureSizes[i].width == 16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureWidth) && 1606cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (availablePictureSizes[i].height == 16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight)) break; 16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1609cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (i == availablePictureSizes.size()) { 16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.pictureWidth, 16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight); 16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0] = 16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] = 16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] || 16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) { 16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbSizes = 16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableJpegThumbSizes.data.i32[i] == 16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0]) && 16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableJpegThumbSizes.data.i32[i+1] == 16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1])) break; 16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 16342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegThumbSize[0], 16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1]); 16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 1641c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 1642c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1643c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 1645c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 16462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1648c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegThumbQuality = quality; 16492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_QUALITY 1651c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 1652c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1653c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 1655c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1658c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegQuality = quality; 16592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ROTATION 16612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation = 16622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 16632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegRotation != 0 && 16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 90 && 16652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 180 && 16662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 270) { 16672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 16682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegRotation); 16692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS 16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLatStr = 16752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 16762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLatStr != NULL) { 16772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLongStr = 16782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 16792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsAltitudeStr = 16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 16812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsTimeStr = 16822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 16832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsProcMethodStr = 16842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 16852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLongStr == NULL || 16862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr == NULL || 16872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsTimeStr == NULL || 16882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcMethodStr == NULL) { 16892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 16902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 16912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *endPtr; 16942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 16952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 16982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 17012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 17022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 17032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 17042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 17072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 17082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 17092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 17102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr); 17112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 17142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 17152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 17162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 17172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsProcessingMethod = gpsProcMethodStr; 17202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = true; 17222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 17232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = false; 17242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EFFECT 17272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.effectMode = effectModeStringToEnum( 17282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 17292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode != effectMode) { 17302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffectModes = 17312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 17322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 17332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break; 17342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableEffectModes.count) { 17362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 17372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 17392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ANTIBANDING 17442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.antibandingMode = abModeStringToEnum( 17452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode != antibandingMode) { 17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAbModes = 17482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 17502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode == availableAbModes.data.u8[i]) 17512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 17522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAbModes.count) { 17542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 17552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 17572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // SCENE_MODE 17622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode = sceneModeStringToEnum( 17632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode != sceneMode && 17652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode != 1766c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED) { 17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 17682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 17692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 17702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode == availableSceneModes.data.u8[i]) 17712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 17722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableSceneModes.count) { 17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 17752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 17772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeSet = 1781c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED; 17822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FLASH_MODE 17848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 17858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = 17868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 17878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).flashMode; 17888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 17898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = FLASH_MODE_INVALID; 17908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 17918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.flashMode == FLASH_MODE_INVALID) { 17928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = flashModeStringToEnum( 17938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 17948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 17958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 17962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode != flashMode) { 17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 1798d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1); 1799b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala bool isFlashAvailable = 1800b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE; 1801b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala if (!isFlashAvailable && 18022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.flashMode != Parameters::FLASH_MODE_OFF) { 18032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 18042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "No flash on device", __FUNCTION__, 18052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 18062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 18072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) { 18082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 18092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 18102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 18112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode == availableAeModes.data.u8[i]) 18122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAeModes.count) { 18152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 18172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 18182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 18192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == -1) { 18212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1826b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // Update in case of override, but only if flash is supported 1827b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala if (isFlashAvailable) { 1828b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala newParams.set(CameraParameters::KEY_FLASH_MODE, 1829b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala flashModeEnumToString(validatedParams.flashMode)); 1830b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala } 18318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 18328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 18338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // WHITE_BALANCE 18348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 18358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = 18368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 18378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).wbMode; 18388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 1839d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF; 18408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 1841d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) { 18428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = wbModeStringToEnum( 18438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 18448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 18458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode != wbMode) { 18468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableWbModes = 1847211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 18488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 18498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode == availableWbModes.data.u8[i]) break; 18508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 18518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (i == availableWbModes.count) { 18528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 18538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, 18548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 18558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 18568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 18578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 18588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_WHITE_BALANCE, 18598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala wbModeEnumToString(validatedParams.wbMode)); 18602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_MODE 18638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 18648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = 18658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 18668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).focusMode; 18678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 18688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = FOCUS_MODE_INVALID; 18698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 18708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.focusMode == FOCUS_MODE_INVALID) { 18718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = focusModeStringToEnum( 18728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE) ); 18738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 18742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != focusMode) { 18752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = -1; 18762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) { 18772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 1878211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, 1879211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 1880211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) { 18812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 18822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "fixed focus lens", 18832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 18842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 18852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 18862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.focusMode != 18872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY) { 18882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocusModes = 18892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 18902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 18912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode == 18922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFocusModes.data.u8[i]) break; 18932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableFocusModes.count) { 18952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 18962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 18972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 18982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 18992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1902d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 190395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // Always reset shadow focus mode to avoid reverting settings 1904d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.shadowFocusMode = FOCUS_MODE_INVALID; 19058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 19068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_FOCUS_MODE, 19078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala focusModeEnumToString(validatedParams.focusMode)); 19082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 19092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = currentAfTriggerId; 19102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_AREAS 19132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 19142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.focusingAreas); 1915ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAfRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1916ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 1917ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AF]; 19182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) res = validateAreas(validatedParams.focusingAreas, 1919ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk maxAfRegions, AREA_KIND_FOCUS); 19202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 19212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 19222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 19232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 19242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EXPOSURE_COMPENSATION 19272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.exposureCompensation = 19282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 19292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 1930d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE); 19312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((validatedParams.exposureCompensation < 19322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]) || 19332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (validatedParams.exposureCompensation > 19342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1])) { 19352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 19362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.exposureCompensation); 19372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 19382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19402638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev if (autoExposureLockAvailable) { 19412638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev validatedParams.autoExposureLock = boolFromString( 19422638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 19432638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } else if (nullptr != 19442638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)){ 19452638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev ALOGE("%s: Requested auto exposure lock is not supported", 19462638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev __FUNCTION__); 19472638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev return BAD_VALUE; 19482638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } 19492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19502638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev if (autoWhiteBalanceLockAvailable) { 19512638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev validatedParams.autoWhiteBalanceLock = boolFromString( 19522638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 19532638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } else if (nullptr != 19542638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) { 19552638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev ALOGE("%s: Requested auto whitebalance lock is not supported", 19562638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev __FUNCTION__); 19572638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev return BAD_VALUE; 19582638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } 19592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // METERING_AREAS 1961ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAeRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1962ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 1963ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AE]; 19642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 19652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.meteringAreas); 19662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) { 1967ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = validateAreas(validatedParams.meteringAreas, maxAeRegions, 19687d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AREA_KIND_METERING); 19692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 19712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 19722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 19732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 19742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 19752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ZOOM 19785b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev if (zoomAvailable) { 19795b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 19805b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev if (validatedParams.zoom < 0 19815b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) { 19825b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev ALOGE("%s: Requested zoom level %d is not supported", 19835b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev __FUNCTION__, validatedParams.zoom); 19845b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev return BAD_VALUE; 19855b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev } 19862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_SIZE 19892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getVideoSize(&validatedParams.videoWidth, 19902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.videoHeight); 19912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoWidth != videoWidth || 19922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight != videoHeight) { 19932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state == RECORD) { 1994c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He ALOGW("%s: Video size cannot be updated (from %d x %d to %d x %d)" 1995c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He " when recording is active! Ignore the size update!", 1996c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He __FUNCTION__, videoWidth, videoHeight, validatedParams.videoWidth, 19972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight); 1998c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoWidth = videoWidth; 1999c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight = videoHeight; 2000c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He newParams.setVideoSize(videoWidth, videoHeight); 2001c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } else { 2002c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He for (i = 0; i < availableVideoSizes.size(); i++) { 2003c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He if ((availableVideoSizes[i].width == 2004c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoWidth) && 2005c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He (availableVideoSizes[i].height == 2006c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight)) break; 2007c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } 2008c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He if (i == availableVideoSizes.size()) { 2009c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He ALOGE("%s: Requested video size %d x %d is not supported", 2010c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He __FUNCTION__, validatedParams.videoWidth, 2011c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight); 2012c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He return BAD_VALUE; 2013c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } 20142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 20152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 20162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_STABILIZATION 20182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoStabilization = boolFromString( 20192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 20202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 2021211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 2022211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 20232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoStabilization && 20242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableVideoStabilizationModes.count == 1) { 20252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 20262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 20272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Update internal parameters */ 20292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *this = validatedParams; 20313ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh updateOverriddenJpegSize(); 20322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** Update external parameters calculated from the internal ones */ 20341f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 20351f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // HORIZONTAL/VERTICAL FIELD OF VIEW 20361f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 20371f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 20381f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 20391f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate FOVs", __FUNCTION__); 20401f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // continue so parameters are at least consistent 20411f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 20421f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, 20431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizFov); 20441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, 20451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertFov); 20461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov); 20471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 20488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Need to flatten again in case of overrides 20498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala paramsFlattened = newParams.flatten(); 20508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala params = newParams; 20518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 20522efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang slowJpegMode = false; 20532efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang Size pictureSize = { pictureWidth, pictureHeight }; 20542efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(pictureSize); 20552efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang if (previewFpsRange[1] > 1e9/minFrameDurationNs + FPS_MARGIN) { 20562efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang slowJpegMode = true; 20572efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang } 2058fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen if (isDeviceZslSupported || slowJpegMode || 2059fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen property_get_bool("camera.disable_zsl_mode", false)) { 20602efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang allowZslMode = false; 20612efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang } else { 20622efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang allowZslMode = isZslReprocessPresent; 20632efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang } 20642efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang ALOGV("%s: allowZslMode: %d slowJpegMode %d", __FUNCTION__, allowZslMode, slowJpegMode); 20652efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang 20662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 20672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2069da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const { 2070da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 2071da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 2072da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 207303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 207403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Mixin default important security values 207503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * - android.led.transmit = defaulted ON 207603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 207703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS, 2078d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*minimumCount*/0, 2079d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*maximumCount*/0, 2080d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*required*/false); 208103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin for(size_t i = 0; i < entry.count; ++i) { 208203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t led = entry.data.u8[i]; 208303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 208403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin switch(led) { 208503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // Transmit LED is unconditionally on when using 208603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // the android.hardware.Camera API 208703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: { 208803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON; 208903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin res = request->update(ANDROID_LED_TRANSMIT, 209003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin &transmitDefault, 1); 209103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin if (res != OK) return res; 209203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin break; 209303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 209403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 209503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 209603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 209703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 209803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Construct metadata from parameters 209903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 210003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 2101d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 2102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_REQUEST_METADATA_MODE, 2103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &metadataMode, 1); 2104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 21060181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_entry_t intent = 21070181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala request->find(ANDROID_CONTROL_CAPTURE_INTENT); 2108c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi 2109c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi if (intent.count == 0) return BAD_VALUE; 2110c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi 21117b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala uint8_t distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_OFF; 21120181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) { 21130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 21140181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange, 2); 21157b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_HIGH_QUALITY; 21160181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } else { 21170181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 21180181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala previewFpsRange, 2); 21197b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_FAST; 21200181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 2121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 21237b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala if (isDistortionCorrectionSupported) { 21247b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala res = request->update(ANDROID_DISTORTION_CORRECTION_MODE, 21257b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala &distortionMode, 1); 21267b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala if (res != OK) return res; 21277b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala } 21287b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala 21292638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev if (autoWhiteBalanceLockAvailable) { 21302638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev uint8_t reqWbLock = autoWhiteBalanceLock ? 21312638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF; 21322638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev res = request->update(ANDROID_CONTROL_AWB_LOCK, 21332638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev &reqWbLock, 1); 21342638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } 213596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 2136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_EFFECT_MODE, 2137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &effectMode, 1); 2138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 2140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &antibandingMode, 1); 2141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 214361c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // android.hardware.Camera requires that when face detect is enabled, the 2144d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // camera is in a face-priority mode. HAL3.x splits this into separate parts 214561c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // (face detection statistics and face priority scene mode). Map from other 214661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // to the other. 21478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeActive = 2148c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 2149d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO; 21508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (enableFaceDetect || sceneModeActive) { 2151d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE; 215261c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala } 2153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_MODE, 2154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqControlMode, 1); 2155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 215661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala 2157d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala uint8_t reqSceneMode = 21588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeActive ? sceneMode : 2159d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY : 2160c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 216161c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala res = request->update(ANDROID_CONTROL_SCENE_MODE, 216261c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala &reqSceneMode, 1); 216361c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala if (res != OK) return res; 2164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2165d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF; 2166d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF; 2167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (flashMode) { 2168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_OFF: 2169d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break; 2170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 2171d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break; 2172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_ON: 2173d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break; 2174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 2175d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; 2176d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFlashMode = ANDROID_FLASH_MODE_TORCH; 2177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 2178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 2179d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break; 2180da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 2181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 2182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala cameraId, flashMode); 21838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 2184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_FLASH_MODE, 2186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFlashMode, 1); 2187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_MODE, 2189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqAeMode, 1); 2190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 21922638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev if (autoExposureLockAvailable) { 21932638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev uint8_t reqAeLock = autoExposureLock ? 21942638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF; 21952638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev res = request->update(ANDROID_CONTROL_AE_LOCK, 21962638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev &reqAeLock, 1); 21972638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev if (res != OK) return res; 21982638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev } 21998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 22008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_MODE, 22018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala &wbMode, 1); 22028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 220396150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 2204da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala float reqFocusDistance = 0; // infinity focus in diopters 2205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 2206da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (focusMode) { 2207da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 2208da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 2209da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 2210da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 2211da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 2212da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusMode = focusMode; 2213da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 2214da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 2215da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 2216d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 2217da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 2218da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 22198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 22208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, focusMode); 22218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 2222da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2223da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_LENS_FOCUS_DISTANCE, 2224da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusDistance, 1); 2225da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2226da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_MODE, 2227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusMode, 1); 2228da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2229da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2230da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqFocusingAreasSize = focusingAreas.size() * 5; 2231da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize]; 2232894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) { 2233894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (focusingAreas[j].weight != 0) { 2234da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 2235894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].left); 2236da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 2237894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].top); 2238da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 2239894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].right); 2240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 2241894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].bottom); 2242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 2243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 0; 2244da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 0; 2245da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 0; 2246da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 0; 2247da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2248894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqFocusingAreas[i + 4] = focusingAreas[j].weight; 2249da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2250da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_REGIONS, 2251da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas, reqFocusingAreasSize); 2252da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2253da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqFocusingAreas; 2254da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2255d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 2256da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &exposureCompensation, 1); 2257da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2258da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2259da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqMeteringAreasSize = meteringAreas.size() * 5; 2260da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize]; 2261894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) { 2262894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (meteringAreas[j].weight != 0) { 2263da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 2264894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].left); 2265da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 2266894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].top); 2267da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 2268894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].right); 2269da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 2270894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].bottom); 22710a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X // Requested size may be zero by rounding error with/without zooming. 22720a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X // The ae regions should be at least 1 if metering width/height is not zero. 22730a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X if (reqMeteringAreas[i + 0] == reqMeteringAreas[i + 2]) { 22740a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X reqMeteringAreas[i + 2]++; 22750a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X } 22760a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X if (reqMeteringAreas[i + 1] == reqMeteringAreas[i + 3]) { 22770a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X reqMeteringAreas[i + 3]++; 22780a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X } 2279da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 2280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 0; 2281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 0; 2282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 0; 2283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 0; 2284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2285894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqMeteringAreas[i + 4] = meteringAreas[j].weight; 2286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_REGIONS, 2288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas, reqMeteringAreasSize); 2289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2291ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk // Set awb regions to be the same as the metering regions if allowed 2292ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAwbRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 2293ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 2294ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AWB]; 2295ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (maxAwbRegions > 0) { 2296ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (maxAwbRegions >= meteringAreas.size()) { 2297ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = request->update(ANDROID_CONTROL_AWB_REGIONS, 2298ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk reqMeteringAreas, reqMeteringAreasSize); 2299ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } else { 2300ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk // Ensure the awb regions are zeroed if the region count is too high. 2301ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk int32_t zeroedAwbAreas[5] = {0, 0, 0, 0, 0}; 2302ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = request->update(ANDROID_CONTROL_AWB_REGIONS, 2303ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk zeroedAwbAreas, sizeof(zeroedAwbAreas)/sizeof(int32_t)); 2304ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } 2305ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (res != OK) return res; 2306ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } 2307ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk 2308da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqMeteringAreas; 2309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2310d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion crop = calculateCropRegion(/*previewOnly*/ false); 231105bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin int32_t reqCropRegion[4] = { 2312c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.left), 2313c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.top), 231405bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.width), 231505bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.height) 2316c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala }; 2317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_SCALER_CROP_REGION, 231805bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin reqCropRegion, 4); 2319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqVstabMode = videoStabilization ? 2322d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON : 2323d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 2324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 2325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqVstabMode, 1); 2326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2327da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqFaceDetectMode = enableFaceDetect ? 2329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala fastInfo.bestFaceDetectMode : 2330d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 2331d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE, 2332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFaceDetectMode, 1); 2333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2334da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2335da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 2336da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 2337da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2338ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const { 2339ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala status_t res; 2340ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2341ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE, 2342ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala jpegThumbSize, 2); 2343ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2344ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY, 2345ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegThumbQuality, 1); 2346ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2347ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_QUALITY, 2348ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegQuality, 1); 2349ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2350ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2351ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 2352ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegRotation, 1); 2353ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2354ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2355ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (gpsEnabled) { 2356ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2357ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 2358ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsCoordinates, 3); 2359ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2360ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2361ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 2362ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &gpsTimestamp, 1); 2363ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2364ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2365ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 2366ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsProcessingMethod); 2367ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2368ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } else { 2369ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_COORDINATES); 2370ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2371ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP); 2372ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2373ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 2374ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2375ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } 2376ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala return OK; 2377ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala} 2378ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 23793ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::overrideJpegSizeByVideoSize() { 23803ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (pictureSizeOverriden) { 23813ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has been overridden. Skip overriding"); 23823ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 23833ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 23843ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 23853ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = true; 23863ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 23873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 23883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = videoWidth; 23893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = videoHeight; 23903ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // This change of picture size is invisible to app layer. 23913ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Do not update app visible params 23923ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 23933ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 23943ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 23953ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::updateOverriddenJpegSize() { 23963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (!pictureSizeOverriden) { 23973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has not been overridden. Skip checking"); 23983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 23993ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 24003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 24013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 24023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 24033ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 24043ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (pictureWidth <= videoWidth && pictureHeight <= videoHeight) { 24053ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Picture size is now smaller than video size. No need to override anymore 24063ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return recoverOverriddenJpegSize(); 24073ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 24083ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 24093ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = videoWidth; 24103ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = videoHeight; 24113ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 24123ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 24133ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 24143ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 24153ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::recoverOverriddenJpegSize() { 24163ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (!pictureSizeOverriden) { 24173ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has not been overridden. Skip recovering"); 24183ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 24193ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 24203ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = false; 24213ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = pictureWidthLastSet; 24223ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = pictureHeightLastSet; 24233ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 24243ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 2425ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2426092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yehbool Parameters::isJpegSizeOverridden() { 2427092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh return pictureSizeOverriden; 2428092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh} 2429092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh 2430c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvalabool Parameters::useZeroShutterLag() const { 2431c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala // If ZSL mode is disabled, don't use it 2432c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if (!allowZslMode) return false; 2433c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala // If recording hint is enabled, don't do ZSL 2434c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if (recordingHint) return false; 2435c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala // If still capture size is no bigger than preview or video size, 2436c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala // don't do ZSL 2437c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if (pictureWidth <= previewWidth || pictureHeight <= previewHeight || 2438c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala pictureWidth <= videoWidth || pictureHeight <= videoHeight) { 2439c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala return false; 2440c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala } 2441c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala // If still capture size is less than quarter of max, don't do ZSL 2442c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala if ((pictureWidth * pictureHeight) < 2443c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala (fastInfo.maxJpegSize.width * fastInfo.maxJpegSize.height / 4) ) { 2444c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala return false; 2445c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala } 2446c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala return true; 2447c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala} 2448c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala 24492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) { 24502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 24512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(state) { 24522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 24532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 24542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 24552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 24562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 24572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 24582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 24592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 24602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return "Unknown state!"; 24612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 24622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 24632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR 24642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) { 2467b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk return CameraParameters::previewFormatToEnum(format); 24682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) { 24712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *fmt; 24722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(format) { 24732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 24742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 24752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 24762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 24772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 24782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 24792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 24802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 24812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 24822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 24832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 24842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 24852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 24862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 24872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 24882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 24892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 24902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 2491a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 24922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 24932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 24942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 24952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 24962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 24972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, format); 24982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = NULL; 24992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 25002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return fmt; 25022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) { 25052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 25064a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !wbMode ? 2507d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 25082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 2509d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 25102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 2511d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_INCANDESCENT : 25122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 2513d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_FLUORESCENT : 25142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 2515d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT : 25162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 2517d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_DAYLIGHT : 25182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 2519d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT : 25202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 2521d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_TWILIGHT : 25222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 2523d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_SHADE : 25242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 25252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) { 25288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (wbMode) { 2529d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 25308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_AUTO; 2531d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 25328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_INCANDESCENT; 2533d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 25348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_FLUORESCENT; 2535d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 25368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 2537d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 25388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_DAYLIGHT; 2539d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 25408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 2541d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 25428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_TWILIGHT; 2543d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 25448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_SHADE; 25458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 25468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown AWB mode enum: %d", 25478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, wbMode); 25488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 25498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 25508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 25518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 25522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) { 25532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 25544a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !effectMode ? 2555d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 25562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 2557d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 25582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 2559d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_MONO : 25602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 2561d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_NEGATIVE : 25622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 2563d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SOLARIZE : 25642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 2565d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SEPIA : 25662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 2567d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_POSTERIZE : 25682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 2569d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD : 25702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 2571d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD : 25722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 2573d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_AQUA : 25742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 25752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) { 25782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 25794a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !abMode ? 2580d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 25812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 2582d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 25832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 2584d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF : 25852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 2586d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ : 25872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 2588d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ : 25892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 25902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) { 25932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 25944a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !sceneMode ? 2595c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 25962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 2597c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 25982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 25992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 26002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 26012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 26022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 26032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 26042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 26052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 26062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 26072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 26082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 26092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 26102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 26112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 26122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 26132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 26142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 26152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 26162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 26172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 26182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 26192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 26202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 26212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 26222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 26232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 26242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 26252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 26262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 26272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 2628af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_HDR) ? 2629af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_HDR: 26302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 26312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum( 26342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *flashMode) { 26352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 26364a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !flashMode ? 2637b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 26382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 26392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 26402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 26412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 26422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 26432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_ON : 26442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 26452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 26462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 26472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 26482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 26492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) { 26528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (flashMode) { 26538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_OFF: 26548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_OFF; 26558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_AUTO: 26568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_AUTO; 26578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_ON: 26588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_ON; 26598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_RED_EYE: 26608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_RED_EYE; 26618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_TORCH: 26628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_TORCH; 26638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 26648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown flash mode enum %d", 26658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, flashMode); 26668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 26678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 26688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 26698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 26702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum( 26712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *focusMode) { 26722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 26734a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !focusMode ? 26744a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID : 26752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 26762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 26772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 26782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 26792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 26802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 26812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 26822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 26832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 26842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 26852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 26862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 26872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 26882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 26892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 26902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) { 26938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (focusMode) { 26948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_AUTO: 26958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_AUTO; 26968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_MACRO: 26978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_MACRO; 26988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_VIDEO: 26998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 27008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_PICTURE: 27018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 27028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_EDOF: 27038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_EDOF; 27048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_INFINITY: 27058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_INFINITY; 27068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_FIXED: 27078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_FIXED; 27088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 27098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown focus mode enum: %d", 27108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, focusMode); 27118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 27128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 27138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 27148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 27152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr, 27162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Parameters::Area> *areas) { 27172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 27182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->clear(); 27192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areasCStr == NULL) { 27202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 27212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(); 27222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 27232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 27242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 areasStr(areasCStr); 27252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 27262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala while (areaStart != 0) { 27272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 27282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *numEnd; 27292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int vals[NUM_FIELDS]; 27302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 27312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 27322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 27332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 27342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala area = numEnd + 1; 27352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 27362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(Parameters::Area( 27372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 27382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 27392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 27402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 27412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 27422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 27432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas, 27447d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin size_t maxRegions, 27457d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AreaKind areaKind) const { 27462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Definition of valid area can be found in 27472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // include/camera/CameraParameters.h 27482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 27492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 1) { 27502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas[0].left == 0 && 27512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].top == 0 && 27522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].right == 0 && 27532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].bottom == 0 && 27542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].weight == 0) { 27552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 27562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 27572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 27582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 27597d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 27607d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin // fixed focus can only set (0,0,0,0,0) focus area 27617d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) { 27627d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin return BAD_VALUE; 27637d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 27647d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 27652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() > maxRegions) { 2766e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGE("%s: Too many areas requested: %zu", 27672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, areas.size()); 27682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 27692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 27702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 27712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 27722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala a != areas.end(); a++) { 27732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 27742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 27752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 27762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 27772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 27782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 27792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 27802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 27812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 27822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 27832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 27842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) { 27852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return !boolStr ? false : 27862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 27872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala false; 27882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 27892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 27902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) { 27912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!mirror) { 27922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) return 0; 27932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 27942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 27952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 27962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 27972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 27982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 27992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 28002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 28012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 28022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 28032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 28042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 28052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 28062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 28072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 28082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return -1; 28092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 28102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 28117373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const { 28127373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds" 28137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", x); 28147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 2815d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 28167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' " 28171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "is out of bounds (upper = %f)", x, previewCrop.width); 28187373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = x + previewCrop.left; 28207373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth), 28227373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value X = '%d' is out of bounds (upper = %d)", 28237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayWidth); 28247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 28257373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 28267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28277373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const { 28287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds " 28297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", y); 28307373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 2831d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 28327373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is " 28331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "out of bounds (upper = %f)", y, previewCrop.height); 28347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = y + previewCrop.top; 28367373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28377373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight), 28387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)", 28397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayHeight); 28407373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 28427373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28437373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 28447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28457373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const { 2846d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 28477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (previewCrop.width - 1) / 2000; 28487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 28497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28507373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const { 2851d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 28527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (previewCrop.height - 1) / 2000; 28537373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 28547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28555e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedXToArray(int x) const { 28567373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28575e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // Work-around for HAL pre-scaling the coordinates themselves 28585e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen if (quirks.meteringCropRegion) { 28595e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000; 28605e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } 28617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28625e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return cropXToArray(normalizedXToCrop(x)); 28637373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 28647373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28655e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedYToArray(int y) const { 28667373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 28677373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 28685e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000; 28697373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 28707373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28715e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return cropYToArray(normalizedYToCrop(y)); 28722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 28732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 28747373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28755e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu ChenParameters::CropRegion Parameters::calculatePreviewCrop( 28765e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen const CropRegion &scalerCrop) const { 28775e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen float left, top, width, height; 28785e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen float previewAspect = static_cast<float>(previewWidth) / previewHeight; 28795e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen float cropAspect = scalerCrop.width / scalerCrop.height; 28807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28815e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen if (previewAspect > cropAspect) { 28825e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen width = scalerCrop.width; 28835e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen height = cropAspect * scalerCrop.height / previewAspect; 28845e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen 28855e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen left = scalerCrop.left; 28865e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen top = scalerCrop.top + (scalerCrop.height - height) / 2; 28875e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } else { 28885e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen width = previewAspect * scalerCrop.width / cropAspect; 28895e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen height = scalerCrop.height; 28905e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen 28915e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen left = scalerCrop.left + (scalerCrop.width - width) / 2; 28925e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen top = scalerCrop.top; 28937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 28947373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 28955e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen CropRegion previewCrop = {left, top, width, height}; 28962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 28975e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return previewCrop; 28985e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen} 28997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 29005e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayXToNormalizedWithCrop(int x, 29015e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen const CropRegion &scalerCrop) const { 29027373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 29037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 29045e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return x * 2000 / (fastInfo.arrayWidth - 1) - 1000; 29055e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } else { 29065e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen CropRegion previewCrop = calculatePreviewCrop(scalerCrop); 29075e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (x - previewCrop.left) * 2000 / (previewCrop.width - 1) - 1000; 29087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 29092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 29102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 29115e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayYToNormalizedWithCrop(int y, 29125e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen const CropRegion &scalerCrop) const { 29137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 29147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 29155e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return y * 2000 / (fastInfo.arrayHeight - 1) - 1000; 29165e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } else { 29175e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen CropRegion previewCrop = calculatePreviewCrop(scalerCrop); 29185e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (y - previewCrop.top) * 2000 / (previewCrop.height - 1) - 1000; 29197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 29202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 29212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 29220cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun Hestatus_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) { 29233ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (info == NULL) { 29243ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Static metadata is not initialized", __FUNCTION__); 29253ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return NO_INIT; 29263ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 29273ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes == NULL) { 29283ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Input size is null", __FUNCTION__); 29293ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 29303ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2931cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sizes->clear(); 2932cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 29337e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev Vector<StreamConfiguration> scs = getStreamConfigurations(); 29347e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev for (size_t i=0; i < scs.size(); i++) { 29357e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev const StreamConfiguration &sc = scs[i]; 29367e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT && 29377e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && 29387e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev sc.width <= limit.width && sc.height <= limit.height) { 2939c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh int64_t minFrameDuration = getMinFrameDurationNs( 2940c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh {sc.width, sc.height}, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED); 2941c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (minFrameDuration > MAX_PREVIEW_RECORD_DURATION_NS) { 2942c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh // Filter slow sizes from preview/record 2943c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh continue; 2944c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } 2945c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh sizes->push({sc.width, sc.height}); 2946cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 29473ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2948cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 29493ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes->isEmpty()) { 29503ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("generated preview size list is empty!!"); 29513ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 29523ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 29533ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return OK; 29543ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He} 29553ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 29569fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun HeParameters::Size Parameters::getMaxSizeForRatio( 29579fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float ratio, const int32_t* sizeArray, size_t count) { 29589fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL"); 29599fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number"); 29609fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 29619fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size maxSize = {0, 0}; 29629fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He for (size_t i = 0; i < count; i += 2) { 29639fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (sizeArray[i] > 0 && sizeArray[i+1] > 0) { 29649fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1]; 29659fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) { 29669fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[i]; 29679fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[i+1]; 29689fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 29699fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 29709fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 29719fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 29729fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (maxSize.width == 0 || maxSize.height == 0) { 29739fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[0]; 29749fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[1]; 29759fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOGW("Unable to find the size to match the given aspect ratio %f." 29769fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Fall back to %d x %d", ratio, maxSize.width, maxSize.height); 29779fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 29789fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 29799fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He return maxSize; 29809fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He} 29819fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 2982355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia YehParameters::Size Parameters::getMaxSize(const Vector<Parameters::Size> &sizes) { 2983355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh Size maxSize = {-1, -1}; 2984355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < sizes.size(); i++) { 2985355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (sizes[i].width > maxSize.width || 2986355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh (sizes[i].width == maxSize.width && sizes[i].height > maxSize.height )) { 2987355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh maxSize = sizes[i]; 2988355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2989355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2990355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return maxSize; 2991355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh} 2992355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 2993cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::StreamConfiguration> Parameters::getStreamConfigurations() { 2994cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_CONFIGURATION_SIZE = 4; 2995cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_FORMAT_OFFSET = 0; 2996cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_WIDTH_OFFSET = 1; 2997cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_HEIGHT_OFFSET = 2; 2998cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_IS_INPUT_OFFSET = 3; 2999cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs; 3000cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 3001cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableStreamConfigs = 3002cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 3003355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) { 3004cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET]; 3005cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET]; 3006cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET]; 3007cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET]; 3008cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh StreamConfiguration sc = {format, width, height, isInput}; 3009cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh scs.add(sc); 3010cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 3011cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return scs; 3012cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 3013cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 3014355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yehint64_t Parameters::getJpegStreamMinFrameDurationNs(Parameters::Size size) { 30157e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev return getMinFrameDurationNs(size, HAL_PIXEL_FORMAT_BLOB); 3016355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh} 3017355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 30184f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun Heint64_t Parameters::getMinFrameDurationNs(Parameters::Size size, int fmt) { 30194f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He const int STREAM_DURATION_SIZE = 4; 30204f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He const int STREAM_FORMAT_OFFSET = 0; 30214f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He const int STREAM_WIDTH_OFFSET = 1; 30224f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He const int STREAM_HEIGHT_OFFSET = 2; 30234f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He const int STREAM_DURATION_OFFSET = 3; 30244f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He camera_metadata_ro_entry_t availableStreamMinDurations = 30254f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He staticInfo(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS); 30264f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He for (size_t i = 0; i < availableStreamMinDurations.count; i+= STREAM_DURATION_SIZE) { 30274f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He int64_t format = availableStreamMinDurations.data.i64[i + STREAM_FORMAT_OFFSET]; 30284f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He int64_t width = availableStreamMinDurations.data.i64[i + STREAM_WIDTH_OFFSET]; 30294f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He int64_t height = availableStreamMinDurations.data.i64[i + STREAM_HEIGHT_OFFSET]; 30304f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He int64_t duration = availableStreamMinDurations.data.i64[i + STREAM_DURATION_OFFSET]; 30314f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He if (format == fmt && width == size.width && height == size.height) { 30324f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He return duration; 30334f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He } 30344f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He } 30354f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He 30364f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He return -1; 30374f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He} 30384f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He 30394f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun Hebool Parameters::isFpsSupported(const Vector<Size> &sizes, int format, int32_t fps) { 30404f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He // Get min frame duration for each size and check if the given fps range can be supported. 30414f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He for (size_t i = 0 ; i < sizes.size(); i++) { 30424f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He int64_t minFrameDuration = getMinFrameDurationNs(sizes[i], format); 30434f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He if (minFrameDuration <= 0) { 30444f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He ALOGE("Min frame duration (%" PRId64") for size (%dx%d) and format 0x%x is wrong!", 30454f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He minFrameDuration, sizes[i].width, sizes[i].height, format); 30464f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He return false; 30474f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He } 30484f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He int32_t maxSupportedFps = 1e9 / minFrameDuration; 304984eb96049ce0690334530ad916e22d6933c0223bZhijun He // Add some margin here for the case where the hal supports 29.xxxfps. 305084eb96049ce0690334530ad916e22d6933c0223bZhijun He maxSupportedFps += FPS_MARGIN; 30514f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He if (fps > maxSupportedFps) { 30524f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He return false; 30534f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He } 30544f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He } 30554f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He return true; 30564f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He} 30574f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He 3058cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehSortedVector<int32_t> Parameters::getAvailableOutputFormats() { 3059cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> outputFormats; // Non-duplicated output formats 30607e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev Vector<StreamConfiguration> scs = getStreamConfigurations(); 30617e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev for (size_t i = 0; i < scs.size(); i++) { 30627e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev const StreamConfiguration &sc = scs[i]; 30637e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) { 30647e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev outputFormats.add(sc.format); 3065cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 3066cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 30677e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev 3068cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return outputFormats; 3069cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 3070cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 3071cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::Size> Parameters::getAvailableJpegSizes() { 3072cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Parameters::Size> jpegSizes; 30737e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev Vector<StreamConfiguration> scs = getStreamConfigurations(); 30747e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev for (size_t i = 0; i < scs.size(); i++) { 30757e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev const StreamConfiguration &sc = scs[i]; 30767e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT && 30777e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev sc.format == HAL_PIXEL_FORMAT_BLOB) { 30787e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev Size sz = {sc.width, sc.height}; 3079cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh jpegSizes.add(sz); 3080cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 3081cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 30827e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev 3083cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return jpegSizes; 3084cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 3085cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 3086d48521fc2f7c34623a745728a07dad728da49254Eino-Ville TalvalaParameters::CropRegion Parameters::calculateCropRegion(bool previewOnly) const { 3087018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3088018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomLeft, zoomTop, zoomWidth, zoomHeight; 3089018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3090018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Need to convert zoom index into a crop rectangle. The rectangle is 3091018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // chosen to maximize its area on the sensor 3092018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3093018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin camera_metadata_ro_entry_t maxDigitalZoom = 3094d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM); 3095018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // For each zoom step by how many pixels more do we change the zoom 3096018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 3097018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (NUM_ZOOM_STEPS-1); 3098018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w) 3099018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // via interpolating zoom step into a zoom ratio 3100018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomRatio = 1 + zoomIncrement * zoom; 3101018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]), 3102018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f", 3103018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomRatio); 3104018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3105018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, " 3106018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "previewHeight=%d, activeWidth=%d, activeHeight=%d", 3107018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth, 3108018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight); 3109018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3110d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala if (previewOnly) { 3111d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Calculate a tight crop region for the preview stream only 3112d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala float previewRatio = static_cast<float>(previewWidth) / previewHeight; 3113018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3114d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala /* Ensure that the width/height never go out of bounds 3115d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * by scaling across a diffent dimension if an out-of-bounds 3116d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * possibility exists. 3117d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * 3118d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by 3119d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * calculating the zoomWidth from zoomHeight we'll actually get a 3120d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * zoomheight > arrayheight 3121d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala */ 3122d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight; 3123d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala if (previewRatio >= arrayRatio) { 3124d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Adjust the height based on the width 3125d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomWidth = fastInfo.arrayWidth / zoomRatio; 3126d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomHeight = zoomWidth * 3127d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala previewHeight / previewWidth; 3128018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3129d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala } else { 3130d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Adjust the width based on the height 3131d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomHeight = fastInfo.arrayHeight / zoomRatio; 3132d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomWidth = zoomHeight * 3133d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala previewWidth / previewHeight; 3134018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 3135018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } else { 3136d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Calculate the global crop region with a shape matching the active 3137d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // array. 3138d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomWidth = fastInfo.arrayWidth / zoomRatio; 3139018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = fastInfo.arrayHeight / zoomRatio; 3140018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 3141d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala 3142d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // center the zoom area within the active area 3143018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2; 3144018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2; 3145018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3146018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d", 3147018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom); 3148018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 3149018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight }; 3150018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin return crop; 3151018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin} 3152018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 31531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov) 31541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala const { 3155c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (fastInfo.isExternalCamera) { 3156c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (horizFov != NULL) { 3157c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh *horizFov = -1.0; 3158c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } 3159c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh if (vertFov != NULL) { 3160c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh *vertFov = -1.0; 3161c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } 3162c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh return OK; 3163c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh } 3164c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh 31651f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t sensorSize = 31661f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2); 31671f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 31681f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 31691bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen camera_metadata_ro_entry_t pixelArraySize = 31701bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen staticInfo(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 2, 2); 31711bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen if (!pixelArraySize.count) return NO_INIT; 31721bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen 31731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float arrayAspect = static_cast<float>(fastInfo.arrayWidth) / 31741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.arrayHeight; 31751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float stillAspect = static_cast<float>(pictureWidth) / pictureHeight; 31761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect); 31771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 31781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // The crop factors from the full sensor array to the still picture crop 31791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // region 31801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizCropFactor = 1.f; 31811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float vertCropFactor = 1.f; 31821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 31831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 31841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Need to calculate the still image field of view based on the total pixel 31851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * array field of view, and the relative aspect ratios of the pixel array 31861f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * and output streams. 31871f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * 31881f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Special treatment for quirky definition of crop region and relative 31891f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * stream cropping. 31901f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 31911f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (quirks.meteringCropRegion) { 3192c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Use max of preview and video as first crop 3193c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float previewAspect = static_cast<float>(previewWidth) / previewHeight; 3194c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float videoAspect = static_cast<float>(videoWidth) / videoHeight; 3195c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (videoAspect > previewAspect) { 3196c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray previewAspect = videoAspect; 3197c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 3198c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // First crop sensor to preview aspect ratio 3199c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (arrayAspect < previewAspect) { 3200c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor = arrayAspect / previewAspect; 3201c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 3202c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor = previewAspect / arrayAspect; 3203c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 3204c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Second crop to still aspect ratio 3205c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (stillAspect < previewAspect) { 3206c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor *= stillAspect / previewAspect; 3207c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 3208c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor *= previewAspect / stillAspect; 32091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 32101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } else { 32111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 32121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Crop are just a function of just the still/array relative aspect 32131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * ratios. Since each stream will maximize its area within the crop 32141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * region, and for FOV we assume a full-sensor crop region, we only ever 32151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * crop the FOV either vertically or horizontally, never both. 32161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 32171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor = (arrayAspect > stillAspect) ? 32181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (stillAspect / arrayAspect) : 1.f; 32191f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertCropFactor = (arrayAspect < stillAspect) ? 32201f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (arrayAspect / stillAspect) : 1.f; 32211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 32221bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen 32231bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen /** 32241bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen * Convert the crop factors w.r.t the active array size to the crop factors 32251bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen * w.r.t the pixel array size. 32261bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen */ 32271bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen horizCropFactor *= (static_cast<float>(fastInfo.arrayWidth) / 32281bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen pixelArraySize.data.i32[0]); 32291bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen vertCropFactor *= (static_cast<float>(fastInfo.arrayHeight) / 32301bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen pixelArraySize.data.i32[1]); 32311bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen 32321f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Horiz crop factor: %f, vert crop fact: %f", 32331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor, vertCropFactor); 32341f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 32351f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Basic field of view formula is: 32361f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * angle of view = 2 * arctangent ( d / 2f ) 32371f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * where d is the physical sensor dimension of interest, and f is 32381f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * the focal length. This only applies to rectilinear sensors, for focusing 32391f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * at distances >> f, etc. 32401f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 32411f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (horizFov != NULL) { 32421f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *horizFov = 180 / M_PI * 2 * 32431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(horizCropFactor * sensorSize.data.f[0] / 32441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 32451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 32461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (vertFov != NULL) { 32471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *vertFov = 180 / M_PI * 2 * 32481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(vertCropFactor * sensorSize.data.f[1] / 32491f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 32501f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 32511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return OK; 32521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala} 32531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 3254ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const { 3255af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin return max; 3256af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin} 3257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 32582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2 32592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android 3260