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) { 2410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (i != 0) supportedPreviewFpsRange += ","; 2420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin supportedPreviewFpsRange += String8::format("(%d,%d)", 2430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin availableFpsRanges.data.i32[i] * kFpsToApiScale, 2440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin availableFpsRanges.data.i32[i+1] * kFpsToApiScale); 2450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 2470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin supportedPreviewFpsRange); 2480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 251af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin SortedVector<int32_t> sortedPreviewFrameRates; 252af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFrameRates; 2542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 255af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // from the [min, max] fps range use the max value 256af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int fps = fpsFromRange(availableFpsRanges.data.i32[i], 257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFpsRanges.data.i32[i+1]); 258af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 259af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // de-dupe frame rates 260af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) { 261af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin sortedPreviewFrameRates.add(fps); 262af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 263af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 264af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin continue; 265af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 266af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 267af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.size() > 1) { 268af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin supportedPreviewFrameRates += ","; 269af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 270af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 272af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin fps); 273af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 274af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: Supported preview frame rates: %s", 275af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, supportedPreviewFrameRates.string()); 2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates); 2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 281cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Size> availableJpegSizes = getAvailableJpegSizes(); 282cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (!availableJpegSizes.size()) return NO_INIT; 2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick maximum 285cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh pictureWidth = availableJpegSizes[0].width; 286cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh pictureHeight = availableJpegSizes[0].height; 2873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 2883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 2893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = false; 2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureSize(pictureWidth, 2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight); 2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPictureSizes; 296cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < availableJpegSizes.size(); i++) { 2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 299cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableJpegSizes[i].width, 300cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh availableJpegSizes[i].height); 3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes); 3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 3072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 3082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbnailSizes = 311f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4); 3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3149fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He // Pick the largest thumbnail size that matches still image aspect ratio. 3159fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0, 3169fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Invalid picture size, %d x %d", pictureWidth, pictureHeight); 3179fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight; 3189fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size thumbnailSize = 3199fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He getMaxSizeForRatio( 3209fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He picAspectRatio, 3219fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He &availableJpegThumbnailSizes.data.i32[0], 3229fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He availableJpegThumbnailSizes.count); 3239fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[0] = thumbnailSize.width; 3249fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[1] = thumbnailSize.height; 3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0]); 3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1]); 3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedJpegThumbSizes; 3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes); 3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality = 90; 3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality); 3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality = 90; 3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality); 3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation = 0; 3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation); 3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsEnabled = false; 354a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[0] = 0.0; 355a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[1] = 0.0; 356a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[2] = 0.0; 357a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsTimestamp = 0; 3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcessingMethod = "unknown"; 3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 361d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin wbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableWhiteBalanceModes = 366211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 367211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableWhiteBalanceModes.count) { 368211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 369211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::WHITE_BALANCE_AUTO); 370211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedWhiteBalance; 3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 377d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 381d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 385d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 389d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 393d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 397d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 401d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 405d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Skipping values not mappable to v1 API 410d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_OFF: 4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance); 4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 425d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE); 4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffects = 430211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false); 431211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableEffects.count) { 432211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, 433211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::EFFECT_NONE); 434211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedEffects; 4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedEffects += ","; 4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 441d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_OFF: 4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE; 4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 445d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_MONO: 4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_MONO; 4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 449d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE: 4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 453d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE: 4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 457d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SEPIA: 4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SEPIA; 4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 461d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE: 4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 465d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD: 4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 469d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD: 4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 473d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_AQUA: 4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_AQUA; 4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableEffects.data.u8[i]); 4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 487d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAntibandingModes = 492211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false); 493211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableAntibandingModes.count) { 494211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 495211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::ANTIBANDING_OFF); 496211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedAntibanding; 4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 503d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF: 5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 507d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ: 5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 511d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ: 5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 515d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO: 5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding); 5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 531c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED; 5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 536211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 537211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableSceneModes.count) { 538211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.remove(CameraParameters::KEY_SCENE_MODE); 539211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool noSceneModes = false; 5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 547c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk case ANDROID_CONTROL_SCENE_MODE_DISABLED: 5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala noSceneModes = true; 5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not in old API 5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 614af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_HDR: 615af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala supportedSceneModes += 616af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala CameraParameters::SCENE_MODE_HDR; 617af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala break; 6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableSceneModes.data.u8[i]); 6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!noSceneModes) { 6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes); 629cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin } else { 630cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin params.remove(CameraParameters::KEY_SCENE_MODE); 6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 634211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool isFlashAvailable = false; 6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 636211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false); 637211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (flashAvailable.count) { 638211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray isFlashAvailable = flashAvailable.data.u8[0]; 639211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 642211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false); 6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 644248f9ce1b6052889dd55e7701f908477d16d6ff4Eino-Ville Talvala flashMode = Parameters::FLASH_MODE_OFF; 645211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (isFlashAvailable) { 6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 6476f854608d26d7abcce5e46396c7260ed7b250653Alex Ray CameraParameters::FLASH_MODE_OFF); 6482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableAeModes.data.u8[i] == 656d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes); 6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 665b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // No flash means null flash mode and supported flash modes keys, so 666b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // remove them just to be safe 667b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala params.remove(CameraParameters::KEY_FLASH_MODE); 668b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala params.remove(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 672211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false); 6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAfModes = 675211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false); 6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 677211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) { 6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Fixed-focus lens 6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_FIXED; 6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_AUTO; 6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 68880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh String8 supportedFocusModes; 68980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh bool addComma = false; 69080ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh camera_metadata_ro_entry_t focusDistanceCalibration = 69180ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, false); 69280ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh 69380ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh if (focusDistanceCalibration.count && 69480ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh focusDistanceCalibration.data.u8[0] != 69580ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED) { 69680ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh supportedFocusModes += CameraParameters::FOCUS_MODE_INFINITY; 69780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh addComma = true; 69880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh } 6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 704d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 708d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 712d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 716d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 720d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not supported in old API 725d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableAfModes.data.u8[i]); 7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes); 7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 738d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 73995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala shadowFocusMode = FOCUS_MODE_INVALID; 7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 741ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS, 742ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION); 743ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT; 7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7457d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin int32_t maxNumFocusAreas = 0; 7467d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (focusMode != Parameters::FOCUS_MODE_FIXED) { 747ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk maxNumFocusAreas = max3aRegions.data.i32[Parameters::REGION_AF]; 7487d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 7497d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas); 7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.clear(); 7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.add(Parameters::Area(0,0,0,0,0)); 7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 756211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, false); 7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7621f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 7631f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 7641f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 7651f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate field of views!", __FUNCTION__); 7661f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return res; 7671f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation = 0; 7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation); 7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 777d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2); 7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationStep = 786d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1); 7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoExposureLock = false; 7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoWhiteBalanceLock = false; 8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 807ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk max3aRegions.data.i32[Parameters::REGION_AE]); 8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 8092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom = 0; 8122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, zoom); 8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 816d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1); 8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 zoomRatios; 8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoom = 1.f; 8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (NUM_ZOOM_STEPS-1); 8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) zoomRatios += ","; 8272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom += zoomIncrement; 8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 83782edd5431951f461058c07b73c0dbc093aa45c99Igor Murashkin CameraParameters::FALSE); 8382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Infinity,Infinity,Infinity"); 8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces); 8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 0); 8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 850a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala recordingHint = false; 8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 857a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala videoStabilization = false; 8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 862211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 863211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 8662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 8748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen videoFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 8752cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala videoDataSpace = HAL_DATASPACE_V0_BT709; 876d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala videoBufferMode = hardware::ICamera::VIDEO_BUFFER_MODE_DATA_CALLBACK_YUV; 8772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala playShutterSound = true; 8782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFaceDetect = false; 8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFocusMoveMessages = false; 881da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala afTriggerCounter = 1; 8822b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala afStateCounter = 0; 8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala currentAfTriggerId = -1; 884a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala afInMotion = false; 8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 886da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala precaptureTriggerCounter = 1; 887da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 8882b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala takePictureCounter = 0; 8892b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewCallbackFlags = 0; 891a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala previewCallbackOneShot = false; 8923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala previewCallbackSurface = false; 8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 894355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh Size maxJpegSize = getMaxSize(getAvailableJpegSizes()); 895355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(maxJpegSize); 896355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 897355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh slowJpegMode = false; 898355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (minFrameDurationNs > kSlowJpegModeThreshold) { 899355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh slowJpegMode = true; 900355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // Slow jpeg devices does not support video snapshot without 901355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // slowing down preview. 902355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh // TODO: support video size video snapshot only? 903355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 904355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh CameraParameters::FALSE); 905355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 906355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 907afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He char value[PROPERTY_VALUE_MAX]; 908afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He property_get("camera.disable_zsl_mode", value, "0"); 909355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (!strcmp(value,"1") || slowJpegMode) { 910afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He ALOGI("Camera %d: Disabling ZSL mode", cameraId); 911b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala zslMode = false; 9122f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala } else { 913afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He zslMode = true; 914b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala } 915e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 916355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh ALOGI("%s: zslMode: %d slowJpegMode %d", __FUNCTION__, zslMode, slowJpegMode); 917355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = STOPPED; 9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala paramsFlattened = params.flatten(); 9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 9232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 9242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const { 9268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return paramsFlattened; 9278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 9288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 9292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() { 9302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t activeArraySize = 93203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4); 9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!activeArraySize.count) return NO_INIT; 93403e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayWidth; 93503e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayHeight; 93603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray if (activeArraySize.count == 2) { 937e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!", 938e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray __FUNCTION__, cameraId); 93903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[0]; 94003e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[1]; 94103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else if (activeArraySize.count == 4) { 94203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[2]; 94303e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[3]; 94403e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else return NO_INIT; 9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9460181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // We'll set the target FPS range for still captures to be as wide 9470181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // as possible to give the HAL maximum latitude for exposure selection 9480181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 9490181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 9500181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) { 9510181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala return NO_INIT; 9520181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 9530181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 9540181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t bestStillCaptureFpsRange[2] = { 9550181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[0], availableFpsRanges.data.i32[1] 9560181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala }; 9570181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t curRange = 9580181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0]; 9590181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala for (size_t i = 2; i < availableFpsRanges.count; i += 2) { 9600181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t nextRange = 9610181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[i + 1] - 9620181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[i]; 9630181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if ( (nextRange > curRange) || // Maximize size of FPS range first 9640181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala (nextRange == curRange && // Then minimize low-end FPS 9650181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[0] > availableFpsRanges.data.i32[i])) { 9660181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 9670181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[0] = availableFpsRanges.data.i32[i]; 9680181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[1] = availableFpsRanges.data.i32[i + 1]; 9690181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala curRange = nextRange; 9700181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 9710181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 9720181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFaceDetectModes = 974211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0, 975211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t bestFaceDetectMode = 978d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) { 9802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFaceDetectModes.data.u8[i]) { 981d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF: 9822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 983d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE: 9842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (bestFaceDetectMode != 985d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) { 9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 987d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE; 9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 990d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL: 9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 992d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL; 9932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 9942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown face detect mode %d:", 9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFaceDetectModes.data.u8[i]); 9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return NO_INIT; 9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1002211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray int32_t maxFaces = 0; 10032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxFacesDetected = 1004211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false); 1005211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (maxFacesDetected.count) { 1006211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray maxFaces = maxFacesDetected.data.i32[0]; 1007211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 1010211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 10118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t sceneModeOverrides = 1012211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false); 10138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 1014211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false); 1015211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool fixedLens = minFocusDistance.count == 0 || 1016211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray minFocusDistance.data.f[0] == 0; 10178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 1018176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala camera_metadata_ro_entry_t focusDistanceCalibration = 1019176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, 1020176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala false); 1021176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala bool canFocusInfinity = (focusDistanceCalibration.count && 1022176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala focusDistanceCalibration.data.u8[0] != 1023176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED); 1024176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala 10251f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 10261f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS); 10271f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 10281f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 1029cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> availableFormats = getAvailableOutputFormats(); 1030cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (!availableFormats.size()) return NO_INIT; 10314a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 10324a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 10338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count > 0) { 10348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // sceneModeOverrides is defined to have 3 entries for each scene mode, 10358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // which are AE, AWB, and AF override modes the HAL wants for that scene 10368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // mode. 10378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala const size_t kModesPerSceneMode = 3; 10388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count != 10398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count * kModesPerSceneMode) { 10408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override list is an " 1041e5729fac81c8a984e984fefc90afc64135817d4fColin Cross "unexpected size: %zu (expected %zu)", __FUNCTION__, 10428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, sceneModeOverrides.count, 104319fdbfcf8af3ca689c3c62b88059ac5d3c6907d1Hubert Rzezniczak availableSceneModes.count * kModesPerSceneMode); 10448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return NO_INIT; 10458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (size_t i = 0; i < availableSceneModes.count; i++) { 10478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala DeviceInfo::OverrideModes modes; 10488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t aeMode = 10498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0]; 10508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(aeMode) { 1051d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON: 10528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_OFF; 10538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1054d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH: 10558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_AUTO; 10568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1057d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH: 10588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_ON; 10598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1060d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: 10618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_RED_EYE; 10628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 10648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__, 10658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala aeMode); 10668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_INVALID; 10678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.wbMode = 10708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1]; 10718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t afMode = 10728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2]; 10738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(afMode) { 1074d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 1075176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala if (!fixedLens && !canFocusInfinity) { 1076176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override lists asks for" 1077176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala " fixed focus on a device with focuser but not" 1078176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala " calibrated for infinity focus", __FUNCTION__, 1079176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala cameraId); 1080176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala return NO_INIT; 1081176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala } 10828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = fixedLens ? 10838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY; 10848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 1085d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 1086d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 1087d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1088d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1089d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 10908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = static_cast<focusMode_t>(afMode); 10918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 10938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__, 10948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala afMode); 10958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = FOCUS_MODE_INVALID; 10968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 10978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i], 10998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes); 11008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 11018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 11028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayWidth = arrayWidth; 11042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayHeight = arrayHeight; 11050181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0]; 11060181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1]; 11072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.bestFaceDetectMode = bestFaceDetectMode; 11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces = maxFaces; 11091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 11101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // Find smallest (widest-angle) focal length to use as basis of still 11111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // picture FOV reporting. 11121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[0]; 11131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala for (size_t i = 1; i < availableFocalLengths.count; i++) { 11141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) { 11151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[i]; 11161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 11171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 11181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 11194a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888 11204a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = false; 1121cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableFormats.size(); i++) { 1122cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableFormats[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) { 11234a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = true; 11244a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala break; 11254a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 11264a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 11274a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGV("Camera %d: Flexible YUV %s supported", 11284a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala cameraId, fastInfo.useFlexibleYuv ? "is" : "is not"); 11294a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 11322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1133e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() { 1134e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 1135e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO); 1136e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1); 1137e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled", 1138e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1139e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 1140e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT); 1141e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1); 1142e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled", 1143e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1144e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 11457373cbe85e617345f7002256a4be389fe62af913Igor Murashkin entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION); 11467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1); 11477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion" 11487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " enabled", cameraId); 11497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 1150fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 1151fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1); 1152fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult" 1153fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala " enabled", cameraId); 1154fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1155e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala return OK; 1156e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala} 1157e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag, 1159d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin size_t minCount, size_t maxCount, bool required) const { 11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t entry = info->find(tag); 11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1162d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin if (CC_UNLIKELY( entry.count == 0 ) && required) { 11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x)", 11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag); 11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (CC_UNLIKELY( 11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 1178e5729fac81c8a984e984fefc90afc64135817d4fColin Cross "Expected between %zu and %zu values, but got %zu values", 11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return entry; 11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 11842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) { 11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 11872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters2 newParams(paramString); 11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only parameters 11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // such as supported preview sizes, etc. Should probably produce an error if 11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // they're changed. 11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Extract and verify new parameters */ 11952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t i; 11972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters validatedParams(*this); 11992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_SIZE 12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewSize(&validatedParams.previewWidth, 12022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewHeight); 12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewWidth != previewWidth || 12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight != previewHeight) { 12062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 12082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 12092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 12102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight, 12112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth, validatedParams.previewHeight); 12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12143ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (i = 0; i < availablePreviewSizes.size(); i++) { 12153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if ((availablePreviewSizes[i].width == 12162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth) && 12173ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He (availablePreviewSizes[i].height == 12182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight)) break; 12192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12203ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (i == availablePreviewSizes.size()) { 12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewWidth, 12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight); 12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1228af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // RECORDING_HINT (always supported) 1229af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint = boolFromString( 1230af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 12310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin IF_ALOGV() { // Avoid unused variable warning 12320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin bool recordingHintChanged = 12330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.recordingHint != recordingHint; 12340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (recordingHintChanged) { 12350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Recording hint changed to %d", 12360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, validatedParams.recordingHint); 12370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 12380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1239af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FPS_RANGE 1241d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 12420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 12430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Use the single FPS value if it was set later than the range. 12440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Otherwise, use the range value. 12450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 12460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin bool fpsUseSingleValue; 12470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 12480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *fpsRange, *fpsSingle; 12490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsRange = newParams.get(CameraParameters::KEY_PREVIEW_FRAME_RATE); 12510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsSingle = newParams.get(CameraParameters::KEY_PREVIEW_FPS_RANGE); 12520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 12540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Pick either the range or the single key if only one was set. 12550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 12560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * If both are set, pick the one that has greater set order. 12570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 12580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (fpsRange == NULL && fpsSingle == NULL) { 12590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("%s: FPS was not set. One of %s or %s must be set.", 12600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, CameraParameters::KEY_PREVIEW_FRAME_RATE, 12610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FPS_RANGE); 12620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return BAD_VALUE; 12630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (fpsRange == NULL) { 12640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = true; 12650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: FPS range not set, using FPS single value", 12660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__); 12670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (fpsSingle == NULL) { 12680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = false; 12690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: FPS single not set, using FPS range value", 12700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__); 12710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else { 12720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int fpsKeyOrder; 12730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin res = newParams.compareSetOrder( 12740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FRAME_RATE, 12750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin CameraParameters::KEY_PREVIEW_FPS_RANGE, 12760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin &fpsKeyOrder); 12770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin LOG_ALWAYS_FATAL_IF(res != OK, "Impossibly bad FPS keys"); 12780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsUseSingleValue = (fpsKeyOrder > 0); 12800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 12810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1282d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 12830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS value is used from '%s'", 12840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, fpsUseSingleValue ? "single" : "range"); 12850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0], 12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewFpsRange[1]); 12880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1289c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[0] /= kFpsToApiScale; 1290c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[1] /= kFpsToApiScale; 1291c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala 12920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Ignore the FPS range if the FPS single has higher precedence 12930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (!fpsUseSingleValue) { 12940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS range (%d, %d)", __FUNCTION__, 12950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0], 12960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1]); 1297d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewFpsRanges = 12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0]) && 13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]) ) { 13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFpsRange[0], 13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]); 13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FORMAT 13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFormat = 13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatStringToEnum(newParams.getPreviewFormat()); 13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFormat != previewFormat) { 13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active!", __FUNCTION__); 13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1325cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> availableFormats = getAvailableOutputFormats(); 13264a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // If using flexible YUV, always support NV21/YV12. Otherwise, check 13274a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // HAL's list. 13284a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (! (fastInfo.useFlexibleYuv && 13294a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala (validatedParams.previewFormat == 13304a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP || 13314a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat == 13324a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YV12) ) ) { 13334a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Not using flexible YUV format, so check explicitly 1334cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (i = 0; i < availableFormats.size(); i++) { 1335cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableFormats[i] == validatedParams.previewFormat) break; 13364a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 1337cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (i == availableFormats.size()) { 13384a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 13394a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), 13404a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat); 13414a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala return BAD_VALUE; 13424a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // PREVIEW_FRAME_RATE Deprecated 13470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // - Use only if the single FPS value was set later than the FPS range 13480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (fpsUseSingleValue) { 1349d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int previewFps = newParams.getPreviewFrameRate(); 13500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Preview FPS single value requested: %d", 13510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin __FUNCTION__, previewFps); 13520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin { 13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFrameRates = 13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 1355af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin /** 1356af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is set, find the range that encompasses 1357af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * previewFps with the largest min index. 1358af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1359af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is not set, find the range with previewFps 1360af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * with the smallest min index. 1361af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1362af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * Either way, in case of multiple ranges, break the tie by 1363af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * selecting the smaller range. 1364af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin */ 1365d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 1366d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala // all ranges which have previewFps 1367af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Vector<Range> candidateRanges; 13682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 1369af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = { 1370af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i], 1371af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i+1] 1372af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin }; 1373af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1374d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala if (r.min <= previewFps && previewFps <= r.max) { 1375af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin candidateRanges.push(r); 1376af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1378af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (candidateRanges.isEmpty()) { 13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 1380d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala __FUNCTION__, previewFps); 13812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1383af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // most applicable range with targetFps 1384af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range bestRange = candidateRanges[0]; 1385af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin for (i = 1; i < candidateRanges.size(); ++i) { 1386af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = candidateRanges[i]; 1387af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1388af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by largest minIndex in recording mode 1389af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (validatedParams.recordingHint) { 1390af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min > bestRange.min) { 1391af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1392af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1393af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1394af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1395af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1396af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1397af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by smallest minIndex in preview mode 1398af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 1399af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min < bestRange.min) { 1400af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1401af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1402af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1403af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1404af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1405af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1406af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1407af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0] = 1409af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.min; 14102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] = 1411af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.max; 1412af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1413af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d", 1414af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, 1415af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[0], 1416af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[1], 1417af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint); 14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /** 14220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Update Preview FPS and Preview FPS ranges based on 14230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * what we actually set. 14240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 14250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * This updates the API-visible (Camera.Parameters#getParameters) values of 14260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * the FPS fields, not only the internal versions. 14270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * 14280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Order matters: The value that was set last takes precedence. 14290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * - If the client does a setParameters(getParameters()) we retain 14300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * the same order for preview FPS. 14310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */ 14320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (!fpsUseSingleValue) { 14330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set fps single, then fps range (range wins) 14340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFrameRate( 14350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin fpsFromRange(/*min*/validatedParams.previewFpsRange[0], 14360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin /*max*/validatedParams.previewFpsRange[1])); 14370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFpsRange( 14380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0] * kFpsToApiScale, 14390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1] * kFpsToApiScale); 14400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else { 14410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set fps range, then fps single (single wins) 14420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFpsRange( 14430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[0] * kFpsToApiScale, 14440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin validatedParams.previewFpsRange[1] * kFpsToApiScale); 14450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Set this to the same value, but with higher priority 14460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.setPreviewFrameRate( 14470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin newParams.getPreviewFrameRate()); 14480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 14490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PICTURE_SIZE 14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPictureSize(&validatedParams.pictureWidth, 14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.pictureHeight); 14533ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (validatedParams.pictureWidth != pictureWidth || 14543ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh validatedParams.pictureHeight != pictureHeight) { 1455cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Size> availablePictureSizes = getAvailableJpegSizes(); 1456cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (i = 0; i < availablePictureSizes.size(); i++) { 1457cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if ((availablePictureSizes[i].width == 14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureWidth) && 1459cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh (availablePictureSizes[i].height == 14602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight)) break; 14612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1462cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (i == availablePictureSizes.size()) { 14632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 14642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.pictureWidth, 14652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight); 14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 14712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0] = 14722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 14732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] = 14742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 14752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] || 14762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) { 14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbSizes = 14782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableJpegThumbSizes.data.i32[i] == 14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0]) && 14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableJpegThumbSizes.data.i32[i+1] == 14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1])) break; 14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 14862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegThumbSize[0], 14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1]); 14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 1494c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 1495c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1496c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 1498c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 14992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1501c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegThumbQuality = quality; 15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_QUALITY 1504c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 1505c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1506c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 1508c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1511c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegQuality = quality; 15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ROTATION 15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation = 15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegRotation != 0 && 15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 90 && 15182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 180 && 15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 270) { 15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegRotation); 15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS 15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLatStr = 15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLatStr != NULL) { 15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLongStr = 15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsAltitudeStr = 15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsTimeStr = 15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsProcMethodStr = 15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLongStr == NULL || 15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr == NULL || 15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsTimeStr == NULL || 15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcMethodStr == NULL) { 15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *endPtr; 15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr); 15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsProcessingMethod = gpsProcMethodStr; 15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = true; 15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = false; 15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EFFECT 15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.effectMode = effectModeStringToEnum( 15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode != effectMode) { 15832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffectModes = 15842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 15862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break; 15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableEffectModes.count) { 15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ANTIBANDING 15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.antibandingMode = abModeStringToEnum( 15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode != antibandingMode) { 16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAbModes = 16012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode == availableAbModes.data.u8[i]) 16042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAbModes.count) { 16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // SCENE_MODE 16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode = sceneModeStringToEnum( 16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode != sceneMode && 16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode != 1619c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED) { 16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode == availableSceneModes.data.u8[i]) 16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableSceneModes.count) { 16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeSet = 1634c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED; 16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FLASH_MODE 16378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 16388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = 16398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 16408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).flashMode; 16418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 16428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = FLASH_MODE_INVALID; 16438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.flashMode == FLASH_MODE_INVALID) { 16458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = flashModeStringToEnum( 16468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 16478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 16492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode != flashMode) { 16502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 1651d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1); 1652b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala bool isFlashAvailable = 1653b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE; 1654b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala if (!isFlashAvailable && 16552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.flashMode != Parameters::FLASH_MODE_OFF) { 16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 16572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "No flash on device", __FUNCTION__, 16582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 16592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) { 16612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 16622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 16632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode == availableAeModes.data.u8[i]) 16652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 16662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAeModes.count) { 16682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 16692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 16702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 16712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == -1) { 16742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 16752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 16762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 16772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1679b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala // Update in case of override, but only if flash is supported 1680b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala if (isFlashAvailable) { 1681b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala newParams.set(CameraParameters::KEY_FLASH_MODE, 1682b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala flashModeEnumToString(validatedParams.flashMode)); 1683b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala } 16848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 16868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // WHITE_BALANCE 16878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 16888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = 16898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 16908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).wbMode; 16918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 1692d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF; 16938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 1694d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) { 16958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = wbModeStringToEnum( 16968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 16978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 16988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode != wbMode) { 16998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableWbModes = 1700211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 17018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 17028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode == availableWbModes.data.u8[i]) break; 17038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 17048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (i == availableWbModes.count) { 17058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 17068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, 17078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 17088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 17098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 17108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 17118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_WHITE_BALANCE, 17128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala wbModeEnumToString(validatedParams.wbMode)); 17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_MODE 17168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 17178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = 17188a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 17198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).focusMode; 17208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 17218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = FOCUS_MODE_INVALID; 17228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 17238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.focusMode == FOCUS_MODE_INVALID) { 17248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = focusModeStringToEnum( 17258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE) ); 17268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 17272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != focusMode) { 17282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = -1; 17292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) { 17302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 1731211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, 1732211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 1733211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) { 17342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 17352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "fixed focus lens", 17362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.focusMode != 17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY) { 17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocusModes = 17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 17442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode == 17452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFocusModes.data.u8[i]) break; 17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableFocusModes.count) { 17482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 17502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 17512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1755d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 175695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // Always reset shadow focus mode to avoid reverting settings 1757d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.shadowFocusMode = FOCUS_MODE_INVALID; 17588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 17598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_FOCUS_MODE, 17608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala focusModeEnumToString(validatedParams.focusMode)); 17612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 17622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = currentAfTriggerId; 17632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_AREAS 17662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.focusingAreas); 1768ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAfRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1769ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 1770ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AF]; 17712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) res = validateAreas(validatedParams.focusingAreas, 1772ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk maxAfRegions, AREA_KIND_FOCUS); 17732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 17752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 17762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EXPOSURE_COMPENSATION 17802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.exposureCompensation = 17812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 17822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 1783d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE); 17842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((validatedParams.exposureCompensation < 17852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]) || 17862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (validatedParams.exposureCompensation > 17872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1])) { 17882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 17892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.exposureCompensation); 17902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 17912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 17922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 17942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoExposureLock = boolFromString( 17952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 17962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 17982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoWhiteBalanceLock = boolFromString( 17992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 18002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // METERING_AREAS 1802ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAeRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1803ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 1804ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AE]; 18052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 18062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.meteringAreas); 18072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) { 1808ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = validateAreas(validatedParams.meteringAreas, maxAeRegions, 18097d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AREA_KIND_METERING); 18102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 18122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 18132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 18142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 18152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ZOOM 18192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 1820709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin if (validatedParams.zoom < 0 1821709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) { 18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.zoom); 18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_SIZE 18282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getVideoSize(&validatedParams.videoWidth, 18292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.videoHeight); 18302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoWidth != videoWidth || 18312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight != videoHeight) { 18322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state == RECORD) { 1833c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He ALOGW("%s: Video size cannot be updated (from %d x %d to %d x %d)" 1834c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He " when recording is active! Ignore the size update!", 1835c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He __FUNCTION__, videoWidth, videoHeight, validatedParams.videoWidth, 18362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight); 1837c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoWidth = videoWidth; 1838c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight = videoHeight; 1839c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He newParams.setVideoSize(videoWidth, videoHeight); 1840c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } else { 1841c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He for (i = 0; i < availableVideoSizes.size(); i++) { 1842c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He if ((availableVideoSizes[i].width == 1843c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoWidth) && 1844c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He (availableVideoSizes[i].height == 1845c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight)) break; 1846c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } 1847c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He if (i == availableVideoSizes.size()) { 1848c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He ALOGE("%s: Requested video size %d x %d is not supported", 1849c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He __FUNCTION__, validatedParams.videoWidth, 1850c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He validatedParams.videoHeight); 1851c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He return BAD_VALUE; 1852c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He } 18532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_STABILIZATION 18572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoStabilization = boolFromString( 18582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 18592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 1860211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 1861211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoStabilization && 18632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableVideoStabilizationModes.count == 1) { 18642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 18652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Update internal parameters */ 18682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *this = validatedParams; 18703ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh updateOverriddenJpegSize(); 18712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18721f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** Update external parameters calculated from the internal ones */ 18731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 18741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // HORIZONTAL/VERTICAL FIELD OF VIEW 18751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 18761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 18771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 18781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate FOVs", __FUNCTION__); 18791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // continue so parameters are at least consistent 18801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 18811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, 18821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizFov); 18831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, 18841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertFov); 18851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov); 18861f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 18878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Need to flatten again in case of overrides 18888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala paramsFlattened = newParams.flatten(); 18898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala params = newParams; 18908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 18912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 18922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 18932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1894da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const { 1895da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 1896da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 1897da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 189803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 189903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Mixin default important security values 190003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * - android.led.transmit = defaulted ON 190103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 190203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS, 1903d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*minimumCount*/0, 1904d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*maximumCount*/0, 1905d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*required*/false); 190603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin for(size_t i = 0; i < entry.count; ++i) { 190703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t led = entry.data.u8[i]; 190803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 190903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin switch(led) { 191003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // Transmit LED is unconditionally on when using 191103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // the android.hardware.Camera API 191203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: { 191303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON; 191403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin res = request->update(ANDROID_LED_TRANSMIT, 191503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin &transmitDefault, 1); 191603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin if (res != OK) return res; 191703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin break; 191803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 191903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 192003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 192103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 192203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 192303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Construct metadata from parameters 192403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 192503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 1926d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 1927da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_REQUEST_METADATA_MODE, 1928da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &metadataMode, 1); 1929da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1930da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 19310181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_entry_t intent = 19320181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala request->find(ANDROID_CONTROL_CAPTURE_INTENT); 1933c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi 1934c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi if (intent.count == 0) return BAD_VALUE; 1935c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi 19360181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) { 19370181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 19380181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange, 2); 19390181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } else { 19400181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 19410181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala previewFpsRange, 2); 19420181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 1943da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1944da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 194596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqWbLock = autoWhiteBalanceLock ? 194696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF; 194796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_LOCK, 194896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqWbLock, 1); 194996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 1950da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_EFFECT_MODE, 1951da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &effectMode, 1); 1952da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1953da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 1954da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &antibandingMode, 1); 1955da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1956da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 195761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // android.hardware.Camera requires that when face detect is enabled, the 1958d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala // camera is in a face-priority mode. HAL3.x splits this into separate parts 195961c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // (face detection statistics and face priority scene mode). Map from other 196061c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // to the other. 19618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeActive = 1962c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 1963d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO; 19648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (enableFaceDetect || sceneModeActive) { 1965d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE; 196661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala } 1967da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_MODE, 1968da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqControlMode, 1); 1969da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 197061c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala 1971d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala uint8_t reqSceneMode = 19728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeActive ? sceneMode : 1973d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY : 1974c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 197561c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala res = request->update(ANDROID_CONTROL_SCENE_MODE, 197661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala &reqSceneMode, 1); 197761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala if (res != OK) return res; 1978da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1979d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF; 1980d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF; 1981da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (flashMode) { 1982da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_OFF: 1983d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break; 1984da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 1985d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break; 1986da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_ON: 1987d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break; 1988da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 1989d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; 1990d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFlashMode = ANDROID_FLASH_MODE_TORCH; 1991da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1992da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 1993d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break; 1994da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 1995da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 1996da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala cameraId, flashMode); 19978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 1998da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1999da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_FLASH_MODE, 2000da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFlashMode, 1); 2001da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2002da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_MODE, 2003da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqAeMode, 1); 2004da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2005da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 200696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqAeLock = autoExposureLock ? 200796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF; 200896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_LOCK, 200996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqAeLock, 1); 20108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 20118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 20128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_MODE, 20138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala &wbMode, 1); 20148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 201596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 2016da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala float reqFocusDistance = 0; // infinity focus in diopters 2017d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 2018da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (focusMode) { 2019da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 2020da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 2021da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 2022da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 2023da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 2024da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusMode = focusMode; 2025da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 2026da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 2027da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 2028d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 2029da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 2030da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 20318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 20328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, focusMode); 20338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 2034da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2035da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_LENS_FOCUS_DISTANCE, 2036da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusDistance, 1); 2037da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2038da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_MODE, 2039da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusMode, 1); 2040da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2041da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2042da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqFocusingAreasSize = focusingAreas.size() * 5; 2043da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize]; 2044894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) { 2045894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (focusingAreas[j].weight != 0) { 2046da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 2047894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].left); 2048da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 2049894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].top); 2050da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 2051894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].right); 2052da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 2053894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].bottom); 2054da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 2055da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 0; 2056da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 0; 2057da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 0; 2058da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 0; 2059da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2060894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqFocusingAreas[i + 4] = focusingAreas[j].weight; 2061da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2062da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_REGIONS, 2063da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas, reqFocusingAreasSize); 2064da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2065da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqFocusingAreas; 2066da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2067d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 2068da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &exposureCompensation, 1); 2069da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2070da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2071da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqMeteringAreasSize = meteringAreas.size() * 5; 2072da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize]; 2073894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) { 2074894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (meteringAreas[j].weight != 0) { 2075da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 2076894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].left); 2077da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 2078894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].top); 2079da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 2080894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].right); 2081da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 2082894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].bottom); 2083da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 2084da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 0; 2085da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 0; 2086da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 0; 2087da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 0; 2088da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2089894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqMeteringAreas[i + 4] = meteringAreas[j].weight; 2090da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 2091da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_REGIONS, 2092da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas, reqMeteringAreasSize); 2093da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2094da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2095ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk // Set awb regions to be the same as the metering regions if allowed 2096ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk size_t maxAwbRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 2097ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk Parameters::NUM_REGION, Parameters::NUM_REGION). 2098ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk data.i32[Parameters::REGION_AWB]; 2099ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (maxAwbRegions > 0) { 2100ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (maxAwbRegions >= meteringAreas.size()) { 2101ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = request->update(ANDROID_CONTROL_AWB_REGIONS, 2102ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk reqMeteringAreas, reqMeteringAreasSize); 2103ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } else { 2104ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk // Ensure the awb regions are zeroed if the region count is too high. 2105ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk int32_t zeroedAwbAreas[5] = {0, 0, 0, 0, 0}; 2106ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk res = request->update(ANDROID_CONTROL_AWB_REGIONS, 2107ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk zeroedAwbAreas, sizeof(zeroedAwbAreas)/sizeof(int32_t)); 2108ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } 2109ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk if (res != OK) return res; 2110ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk } 2111ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk 2112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqMeteringAreas; 2113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2114d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion crop = calculateCropRegion(/*previewOnly*/ false); 211505bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin int32_t reqCropRegion[4] = { 2116c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.left), 2117c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.top), 211805bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.width), 211905bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.height) 2120c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala }; 2121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_SCALER_CROP_REGION, 212205bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin reqCropRegion, 4); 2123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqVstabMode = videoStabilization ? 2126d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON : 2127d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 2128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 2129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqVstabMode, 1); 2130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqFaceDetectMode = enableFaceDetect ? 2133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala fastInfo.bestFaceDetectMode : 2134d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 2135d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE, 2136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFaceDetectMode, 1); 2137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 2138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 2140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 2141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 2142ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const { 2143ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala status_t res; 2144ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2145ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE, 2146ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala jpegThumbSize, 2); 2147ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2148ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY, 2149ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegThumbQuality, 1); 2150ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2151ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_QUALITY, 2152ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegQuality, 1); 2153ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2154ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2155ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 2156ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegRotation, 1); 2157ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2158ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2159ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (gpsEnabled) { 2160ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2161ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 2162ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsCoordinates, 3); 2163ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2164ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2165ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 2166ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &gpsTimestamp, 1); 2167ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2168ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 2169ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 2170ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsProcessingMethod); 2171ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2172ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } else { 2173ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_COORDINATES); 2174ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2175ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP); 2176ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2177ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 2178ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 2179ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } 2180ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala return OK; 2181ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala} 2182ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 21833ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::overrideJpegSizeByVideoSize() { 21843ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (pictureSizeOverriden) { 21853ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has been overridden. Skip overriding"); 21863ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 21873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 21883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = true; 21903ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 21913ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 21923ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = videoWidth; 21933ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = videoHeight; 21943ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // This change of picture size is invisible to app layer. 21953ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Do not update app visible params 21963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 21973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 21983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 21993ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::updateOverriddenJpegSize() { 22003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (!pictureSizeOverriden) { 22013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has not been overridden. Skip checking"); 22023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 22033ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 22043ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 22053ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidthLastSet = pictureWidth; 22063ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeightLastSet = pictureHeight; 22073ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 22083ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (pictureWidth <= videoWidth && pictureHeight <= videoHeight) { 22093ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh // Picture size is now smaller than video size. No need to override anymore 22103ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return recoverOverriddenJpegSize(); 22113ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 22123ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 22133ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = videoWidth; 22143ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = videoHeight; 22153ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 22163ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 22173ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 22183ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh 22193ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::recoverOverriddenJpegSize() { 22203ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh if (!pictureSizeOverriden) { 22213ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh ALOGV("Picture size has not been overridden. Skip recovering"); 22223ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 22233ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh } 22243ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureSizeOverriden = false; 22253ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureWidth = pictureWidthLastSet; 22263ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh pictureHeight = pictureHeightLastSet; 22273ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh return OK; 22283ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh} 2229ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 2230092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yehbool Parameters::isJpegSizeOverridden() { 2231092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh return pictureSizeOverriden; 2232092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh} 2233092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh 22342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) { 22352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 22362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(state) { 22372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 22382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 22392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 22402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 22412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 22422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 22432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 22442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 22452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return "Unknown state!"; 22462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR 22492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) { 2252b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk return CameraParameters::previewFormatToEnum(format); 22532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) { 22562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *fmt; 22572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(format) { 22582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 22592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 22602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 22622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 22632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 22652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 22662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 22682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 22692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 22712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 22722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 22742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 22752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 2276a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 22772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 22782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 22792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 22812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, format); 22832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = NULL; 22842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 22852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return fmt; 22872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) { 22902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 22914a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !wbMode ? 2292d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 22932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 2294d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 22952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 2296d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_INCANDESCENT : 22972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 2298d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_FLUORESCENT : 22992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 2300d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT : 23012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 2302d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_DAYLIGHT : 23032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 2304d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT : 23052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 2306d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_TWILIGHT : 23072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 2308d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_SHADE : 23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 23102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) { 23138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (wbMode) { 2314d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 23158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_AUTO; 2316d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 23178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_INCANDESCENT; 2318d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 23198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_FLUORESCENT; 2320d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 23218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 2322d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 23238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_DAYLIGHT; 2324d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 23258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 2326d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 23278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_TWILIGHT; 2328d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 23298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_SHADE; 23308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 23318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown AWB mode enum: %d", 23328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, wbMode); 23338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 23348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 23358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 23368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 23372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) { 23382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 23394a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !effectMode ? 2340d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 23412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 2342d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 23432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 2344d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_MONO : 23452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 2346d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_NEGATIVE : 23472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 2348d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SOLARIZE : 23492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 2350d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SEPIA : 23512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 2352d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_POSTERIZE : 23532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 2354d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD : 23552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 2356d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD : 23572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 2358d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_AQUA : 23592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 23602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) { 23632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 23644a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !abMode ? 2365d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 23662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 2367d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 23682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 2369d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF : 23702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 2371d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ : 23722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 2373d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ : 23742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 23752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) { 23782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 23794a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !sceneMode ? 2380c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 23812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 2382c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 23832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 23842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 23852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 23862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 23872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 23882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 23892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 23902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 23912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 23922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 23932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 23942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 23952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 23962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 23972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 23982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 23992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 24002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 24012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 24022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 24032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 24042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 24052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 24062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 24072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 24082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 24092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 24102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 24112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 24122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 2413af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_HDR) ? 2414af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_HDR: 24152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 24162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum( 24192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *flashMode) { 24202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 24214a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !flashMode ? 2422b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 24232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 24242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 24252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 24262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 24272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 24282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_ON : 24292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 24302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 24312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 24322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 24332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 24342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) { 24378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (flashMode) { 24388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_OFF: 24398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_OFF; 24408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_AUTO: 24418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_AUTO; 24428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_ON: 24438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_ON; 24448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_RED_EYE: 24458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_RED_EYE; 24468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_TORCH: 24478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_TORCH; 24488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 24498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown flash mode enum %d", 24508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, flashMode); 24518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 24528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 24538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 24548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 24552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum( 24562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *focusMode) { 24572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 24584a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !focusMode ? 24594a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID : 24602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 24612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 24622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 24632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 24642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 24652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 24662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 24672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 24682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 24692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 24702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 24712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 24722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 24732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 24742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 24752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) { 24788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (focusMode) { 24798a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_AUTO: 24808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_AUTO; 24818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_MACRO: 24828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_MACRO; 24838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_VIDEO: 24848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 24858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_PICTURE: 24868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 24878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_EDOF: 24888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_EDOF; 24898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_INFINITY: 24908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_INFINITY; 24918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_FIXED: 24928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_FIXED; 24938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 24948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown focus mode enum: %d", 24958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, focusMode); 24968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 24978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 24988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 24998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 25002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr, 25012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Parameters::Area> *areas) { 25022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 25032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->clear(); 25042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areasCStr == NULL) { 25052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 25062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(); 25072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 25082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 areasStr(areasCStr); 25102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 25112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala while (areaStart != 0) { 25122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 25132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *numEnd; 25142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int vals[NUM_FIELDS]; 25152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 25162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 25172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 25182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 25192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala area = numEnd + 1; 25202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(Parameters::Area( 25222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 25232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 25242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 25262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas, 25297d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin size_t maxRegions, 25307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AreaKind areaKind) const { 25312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Definition of valid area can be found in 25322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // include/camera/CameraParameters.h 25332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 25342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 1) { 25352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas[0].left == 0 && 25362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].top == 0 && 25372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].right == 0 && 25382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].bottom == 0 && 25392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].weight == 0) { 25402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 25412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 25422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25447d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 25457d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin // fixed focus can only set (0,0,0,0,0) focus area 25467d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) { 25477d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin return BAD_VALUE; 25487d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 25497d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 25502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() > maxRegions) { 2551e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGE("%s: Too many areas requested: %zu", 25522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, areas.size()); 25532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 25542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 25572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala a != areas.end(); a++) { 25582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 25592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 25602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 25612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 25622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 25632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 25642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 25652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 25672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) { 25702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return !boolStr ? false : 25712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 25722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala false; 25732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) { 25762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!mirror) { 25772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) return 0; 25782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 25792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 25802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 25812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 25822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 25832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 25842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 25852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 25862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 25872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 25882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 25892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 25902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 25922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 25932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return -1; 25942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 25952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 25967373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const { 25977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds" 25987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", x); 25997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 2600d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 26017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' " 26021f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "is out of bounds (upper = %f)", x, previewCrop.width); 26037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = x + previewCrop.left; 26057373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26067373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth), 26077373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value X = '%d' is out of bounds (upper = %d)", 26087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayWidth); 26097373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 26107373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26117373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26127373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const { 26137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds " 26147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", y); 26157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 2616d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 26177373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is " 26181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "out of bounds (upper = %f)", y, previewCrop.height); 26197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26207373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = y + previewCrop.top; 26217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26227373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight), 26237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)", 26247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayHeight); 26257373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 26277373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26307373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const { 2631d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 26327373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (previewCrop.width - 1) / 2000; 26337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26357373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const { 2636d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true); 26377373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (previewCrop.height - 1) / 2000; 26387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26405e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedXToArray(int x) const { 26417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26425e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen // Work-around for HAL pre-scaling the coordinates themselves 26435e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen if (quirks.meteringCropRegion) { 26445e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000; 26455e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } 26467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26475e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return cropXToArray(normalizedXToCrop(x)); 26487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 26497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26505e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedYToArray(int y) const { 26517373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 26527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 26535e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000; 26547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26565e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return cropYToArray(normalizedYToCrop(y)); 26572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26605e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu ChenParameters::CropRegion Parameters::calculatePreviewCrop( 26615e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen const CropRegion &scalerCrop) const { 26625e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen float left, top, width, height; 26635e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen float previewAspect = static_cast<float>(previewWidth) / previewHeight; 26645e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen float cropAspect = scalerCrop.width / scalerCrop.height; 26657373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26665e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen if (previewAspect > cropAspect) { 26675e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen width = scalerCrop.width; 26685e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen height = cropAspect * scalerCrop.height / previewAspect; 26695e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen 26705e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen left = scalerCrop.left; 26715e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen top = scalerCrop.top + (scalerCrop.height - height) / 2; 26725e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } else { 26735e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen width = previewAspect * scalerCrop.width / cropAspect; 26745e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen height = scalerCrop.height; 26755e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen 26765e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen left = scalerCrop.left + (scalerCrop.width - width) / 2; 26775e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen top = scalerCrop.top; 26787373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26805e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen CropRegion previewCrop = {left, top, width, height}; 26812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26825e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return previewCrop; 26835e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen} 26847373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 26855e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayXToNormalizedWithCrop(int x, 26865e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen const CropRegion &scalerCrop) const { 26877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 26887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 26895e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return x * 2000 / (fastInfo.arrayWidth - 1) - 1000; 26905e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } else { 26915e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen CropRegion previewCrop = calculatePreviewCrop(scalerCrop); 26925e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (x - previewCrop.left) * 2000 / (previewCrop.width - 1) - 1000; 26937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 26952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 26965e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayYToNormalizedWithCrop(int y, 26975e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen const CropRegion &scalerCrop) const { 26987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 26997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 27005e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return y * 2000 / (fastInfo.arrayHeight - 1) - 1000; 27015e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen } else { 27025e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen CropRegion previewCrop = calculatePreviewCrop(scalerCrop); 27035e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen return (y - previewCrop.top) * 2000 / (previewCrop.height - 1) - 1000; 27047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 27052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 27062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 27070cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun Hestatus_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) { 27083ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (info == NULL) { 27093ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Static metadata is not initialized", __FUNCTION__); 27103ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return NO_INIT; 27113ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 27123ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes == NULL) { 27133ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Input size is null", __FUNCTION__); 27143ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 27153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2716cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sizes->clear(); 2717cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2718cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2719cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs = getStreamConfigurations(); 2720cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i=0; i < scs.size(); i++) { 2721cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const StreamConfiguration &sc = scs[i]; 2722cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT && 2723cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && 2724cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sc.width <= limit.width && sc.height <= limit.height) { 2725cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size sz = {sc.width, sc.height}; 2726cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sizes->push(sz); 27273ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2728cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2729cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 2730cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const size_t SIZE_COUNT = sizeof(Size) / sizeof(int); 2731cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableProcessedSizes = 2732cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, SIZE_COUNT); 2733cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (availableProcessedSizes.count < SIZE_COUNT) return BAD_VALUE; 2734cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2735cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size filteredSize; 2736cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh for (size_t i = 0; i < availableProcessedSizes.count; i += SIZE_COUNT) { 2737cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh filteredSize.width = availableProcessedSizes.data.i32[i]; 2738cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh filteredSize.height = availableProcessedSizes.data.i32[i+1]; 2739cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh // Need skip the preview sizes that are too large. 2740cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (filteredSize.width <= limit.width && 2741cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh filteredSize.height <= limit.height) { 2742cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sizes->push(filteredSize); 2743cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2744cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 27453ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 2746cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 27473ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes->isEmpty()) { 27483ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("generated preview size list is empty!!"); 27493ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 27503ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 27513ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return OK; 27523ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He} 27533ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 27549fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun HeParameters::Size Parameters::getMaxSizeForRatio( 27559fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float ratio, const int32_t* sizeArray, size_t count) { 27569fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL"); 27579fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number"); 27589fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 27599fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size maxSize = {0, 0}; 27609fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He for (size_t i = 0; i < count; i += 2) { 27619fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (sizeArray[i] > 0 && sizeArray[i+1] > 0) { 27629fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1]; 27639fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) { 27649fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[i]; 27659fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[i+1]; 27669fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27679fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27689fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27699fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 27709fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (maxSize.width == 0 || maxSize.height == 0) { 27719fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[0]; 27729fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[1]; 27739fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOGW("Unable to find the size to match the given aspect ratio %f." 27749fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Fall back to %d x %d", ratio, maxSize.width, maxSize.height); 27759fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 27769fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 27779fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He return maxSize; 27789fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He} 27799fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 2780355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia YehParameters::Size Parameters::getMaxSize(const Vector<Parameters::Size> &sizes) { 2781355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh Size maxSize = {-1, -1}; 2782355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < sizes.size(); i++) { 2783355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (sizes[i].width > maxSize.width || 2784355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh (sizes[i].width == maxSize.width && sizes[i].height > maxSize.height )) { 2785355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh maxSize = sizes[i]; 2786355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2787355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2788355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return maxSize; 2789355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh} 2790355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 2791cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::StreamConfiguration> Parameters::getStreamConfigurations() { 2792cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_CONFIGURATION_SIZE = 4; 2793cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_FORMAT_OFFSET = 0; 2794cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_WIDTH_OFFSET = 1; 2795cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_HEIGHT_OFFSET = 2; 2796cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int STREAM_IS_INPUT_OFFSET = 3; 2797cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs; 2798cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) { 2799cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh ALOGE("StreamConfiguration is only valid after device HAL 3.2!"); 2800cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return scs; 2801cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2802cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2803cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableStreamConfigs = 2804cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 2805355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) { 2806cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET]; 2807cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET]; 2808cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET]; 2809cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET]; 2810cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh StreamConfiguration sc = {format, width, height, isInput}; 2811cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh scs.add(sc); 2812cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2813cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return scs; 2814cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 2815cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2816355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yehint64_t Parameters::getJpegStreamMinFrameDurationNs(Parameters::Size size) { 2817355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2818355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh const int STREAM_DURATION_SIZE = 4; 2819355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh const int STREAM_FORMAT_OFFSET = 0; 2820355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh const int STREAM_WIDTH_OFFSET = 1; 2821355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh const int STREAM_HEIGHT_OFFSET = 2; 2822355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh const int STREAM_DURATION_OFFSET = 3; 2823355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh camera_metadata_ro_entry_t availableStreamMinDurations = 2824355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS); 2825355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < availableStreamMinDurations.count; i+= STREAM_DURATION_SIZE) { 2826355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int64_t format = availableStreamMinDurations.data.i64[i + STREAM_FORMAT_OFFSET]; 2827355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int64_t width = availableStreamMinDurations.data.i64[i + STREAM_WIDTH_OFFSET]; 2828355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int64_t height = availableStreamMinDurations.data.i64[i + STREAM_HEIGHT_OFFSET]; 2829355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh int64_t duration = availableStreamMinDurations.data.i64[i + STREAM_DURATION_OFFSET]; 2830355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (format == HAL_PIXEL_FORMAT_BLOB && width == size.width && height == size.height) { 2831355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return duration; 2832355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2833355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2834355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } else { 2835355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh Vector<Size> availableJpegSizes = getAvailableJpegSizes(); 2836355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh size_t streamIdx = availableJpegSizes.size(); 2837355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < availableJpegSizes.size(); i++) { 2838355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (availableJpegSizes[i].width == size.width && 2839355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh availableJpegSizes[i].height == size.height) { 2840355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh streamIdx = i; 2841355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh break; 2842355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2843355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2844355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (streamIdx != availableJpegSizes.size()) { 2845355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh camera_metadata_ro_entry_t jpegMinDurations = 2846355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS); 2847355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh if (streamIdx < jpegMinDurations.count) { 2848355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return jpegMinDurations.data.i64[streamIdx]; 2849355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2850355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2851355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh } 2852355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh ALOGE("%s: cannot find min frame duration for jpeg size %dx%d", 2853355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh __FUNCTION__, size.width, size.height); 2854355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh return -1; 2855355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh} 2856355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh 2857cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehSortedVector<int32_t> Parameters::getAvailableOutputFormats() { 2858cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh SortedVector<int32_t> outputFormats; // Non-duplicated output formats 2859cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2860cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs = getStreamConfigurations(); 2861355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < scs.size(); i++) { 2862cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const StreamConfiguration &sc = scs[i]; 2863cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) { 2864cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh outputFormats.add(sc.format); 2865cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2866cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2867cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 2868cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableFormats = staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 2869355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < availableFormats.count; i++) { 2870cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh outputFormats.add(availableFormats.data.i32[i]); 2871cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2872cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2873cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return outputFormats; 2874cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 2875cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2876cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::Size> Parameters::getAvailableJpegSizes() { 2877cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<Parameters::Size> jpegSizes; 2878cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) { 2879cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Vector<StreamConfiguration> scs = getStreamConfigurations(); 2880355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < scs.size(); i++) { 2881cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const StreamConfiguration &sc = scs[i]; 2882cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT && 2883cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh sc.format == HAL_PIXEL_FORMAT_BLOB) { 2884cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size sz = {sc.width, sc.height}; 2885cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh jpegSizes.add(sz); 2886cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2887cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2888cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } else { 2889cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int JPEG_SIZE_ENTRY_COUNT = 2; 2890cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int WIDTH_OFFSET = 0; 2891cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh const int HEIGHT_OFFSET = 1; 2892cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh camera_metadata_ro_entry_t availableJpegSizes = 2893cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 2894355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh for (size_t i = 0; i < availableJpegSizes.count; i+= JPEG_SIZE_ENTRY_COUNT) { 2895cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int width = availableJpegSizes.data.i32[i + WIDTH_OFFSET]; 2896cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh int height = availableJpegSizes.data.i32[i + HEIGHT_OFFSET]; 2897cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size sz = {width, height}; 2898cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh jpegSizes.add(sz); 2899cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2900cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh } 2901cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh return jpegSizes; 2902cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh} 2903cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2904d48521fc2f7c34623a745728a07dad728da49254Eino-Ville TalvalaParameters::CropRegion Parameters::calculateCropRegion(bool previewOnly) const { 2905018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2906018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2907018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2908018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Need to convert zoom index into a crop rectangle. The rectangle is 2909018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // chosen to maximize its area on the sensor 2910018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2911018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin camera_metadata_ro_entry_t maxDigitalZoom = 2912d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM); 2913018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // For each zoom step by how many pixels more do we change the zoom 2914018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2915018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (NUM_ZOOM_STEPS-1); 2916018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w) 2917018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // via interpolating zoom step into a zoom ratio 2918018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomRatio = 1 + zoomIncrement * zoom; 2919018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]), 2920018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f", 2921018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomRatio); 2922018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2923018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, " 2924018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "previewHeight=%d, activeWidth=%d, activeHeight=%d", 2925018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth, 2926018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight); 2927018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2928d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala if (previewOnly) { 2929d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Calculate a tight crop region for the preview stream only 2930d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala float previewRatio = static_cast<float>(previewWidth) / previewHeight; 2931018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2932d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala /* Ensure that the width/height never go out of bounds 2933d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * by scaling across a diffent dimension if an out-of-bounds 2934d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * possibility exists. 2935d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * 2936d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by 2937d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * calculating the zoomWidth from zoomHeight we'll actually get a 2938d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala * zoomheight > arrayheight 2939d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala */ 2940d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight; 2941d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala if (previewRatio >= arrayRatio) { 2942d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Adjust the height based on the width 2943d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomWidth = fastInfo.arrayWidth / zoomRatio; 2944d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomHeight = zoomWidth * 2945d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala previewHeight / previewWidth; 2946018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2947d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala } else { 2948d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Adjust the width based on the height 2949d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomHeight = fastInfo.arrayHeight / zoomRatio; 2950d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomWidth = zoomHeight * 2951d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala previewWidth / previewHeight; 2952018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2953018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } else { 2954d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // Calculate the global crop region with a shape matching the active 2955d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // array. 2956d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala zoomWidth = fastInfo.arrayWidth / zoomRatio; 2957018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = fastInfo.arrayHeight / zoomRatio; 2958018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2959d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala 2960d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala // center the zoom area within the active area 2961018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2; 2962018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2; 2963018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2964018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d", 2965018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom); 2966018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2967018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight }; 2968018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin return crop; 2969018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin} 2970018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 29711f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov) 29721f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala const { 29731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t sensorSize = 29741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2); 29751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 29761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 29771bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen camera_metadata_ro_entry_t pixelArraySize = 29781bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen staticInfo(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 2, 2); 29791bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen if (!pixelArraySize.count) return NO_INIT; 29801bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen 29811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float arrayAspect = static_cast<float>(fastInfo.arrayWidth) / 29821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.arrayHeight; 29831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float stillAspect = static_cast<float>(pictureWidth) / pictureHeight; 29841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect); 29851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 29861f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // The crop factors from the full sensor array to the still picture crop 29871f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // region 29881f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizCropFactor = 1.f; 29891f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float vertCropFactor = 1.f; 29901f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 29911f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 29921f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Need to calculate the still image field of view based on the total pixel 29931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * array field of view, and the relative aspect ratios of the pixel array 29941f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * and output streams. 29951f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * 29961f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Special treatment for quirky definition of crop region and relative 29971f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * stream cropping. 29981f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 29991f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (quirks.meteringCropRegion) { 3000c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Use max of preview and video as first crop 3001c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float previewAspect = static_cast<float>(previewWidth) / previewHeight; 3002c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float videoAspect = static_cast<float>(videoWidth) / videoHeight; 3003c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (videoAspect > previewAspect) { 3004c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray previewAspect = videoAspect; 3005c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 3006c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // First crop sensor to preview aspect ratio 3007c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (arrayAspect < previewAspect) { 3008c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor = arrayAspect / previewAspect; 3009c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 3010c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor = previewAspect / arrayAspect; 3011c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 3012c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Second crop to still aspect ratio 3013c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (stillAspect < previewAspect) { 3014c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor *= stillAspect / previewAspect; 3015c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 3016c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor *= previewAspect / stillAspect; 30171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 30181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } else { 30191f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 30201f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Crop are just a function of just the still/array relative aspect 30211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * ratios. Since each stream will maximize its area within the crop 30221f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * region, and for FOV we assume a full-sensor crop region, we only ever 30231f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * crop the FOV either vertically or horizontally, never both. 30241f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 30251f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor = (arrayAspect > stillAspect) ? 30261f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (stillAspect / arrayAspect) : 1.f; 30271f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertCropFactor = (arrayAspect < stillAspect) ? 30281f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (arrayAspect / stillAspect) : 1.f; 30291f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 30301bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen 30311bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen /** 30321bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen * Convert the crop factors w.r.t the active array size to the crop factors 30331bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen * w.r.t the pixel array size. 30341bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen */ 30351bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen horizCropFactor *= (static_cast<float>(fastInfo.arrayWidth) / 30361bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen pixelArraySize.data.i32[0]); 30371bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen vertCropFactor *= (static_cast<float>(fastInfo.arrayHeight) / 30381bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen pixelArraySize.data.i32[1]); 30391bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen 30401f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Horiz crop factor: %f, vert crop fact: %f", 30411f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor, vertCropFactor); 30421f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 30431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Basic field of view formula is: 30441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * angle of view = 2 * arctangent ( d / 2f ) 30451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * where d is the physical sensor dimension of interest, and f is 30461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * the focal length. This only applies to rectilinear sensors, for focusing 30471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * at distances >> f, etc. 30481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 30491f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (horizFov != NULL) { 30501f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *horizFov = 180 / M_PI * 2 * 30511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(horizCropFactor * sensorSize.data.f[0] / 30521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 30531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 30541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (vertFov != NULL) { 30551f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *vertFov = 180 / M_PI * 2 * 30561f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(vertCropFactor * sensorSize.data.f[1] / 30571f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 30581f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 30591f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return OK; 30601f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala} 30611f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 3062ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const { 3063af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin return max; 3064af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin} 3065af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 30662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2 30672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android 3068