Parameters.cpp revision 894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5b
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 192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala//#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" 322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android { 342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 { 352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId, 372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int cameraFacing) : 382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraId(cameraId), 392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraFacing(cameraFacing), 402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala info(NULL) { 412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() { 442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::initialize(const CameraMetadata *info) { 472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (info->entryCount() == 0) { 502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: No static information provided!", __FUNCTION__); 512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::info = info; 542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = buildFastInfo(); 562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) return res; 572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 58e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala res = buildQuirks(); 59e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala if (res != OK) return res; 60e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 613ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He const Size MAX_PREVIEW_SIZE = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT }; 623ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He res = getFilteredPreviewSizes(MAX_PREVIEW_SIZE, &availablePreviewSizes); 633ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (res != OK) return res; 642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick more intelligently 663ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He previewWidth = availablePreviewSizes[0].width; 673ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He previewHeight = availablePreviewSizes[0].height; 682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala videoWidth = previewWidth; 692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala videoHeight = previewHeight; 702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPreviewSize(previewWidth, previewHeight); 722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setVideoSize(videoWidth, videoHeight); 732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, 742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8::format("%dx%d", 752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight)); 762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewSizes; 783ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (size_t i = 0; i < availablePreviewSizes.size(); i++) { 792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 813ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He availablePreviewSizes[i].width, 823ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He availablePreviewSizes[i].height); 832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 843ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGV("Supported preview sizes are: %s", supportedPreviewSizes.string()); 852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes); 872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes); 892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFpsRange[0] = availableFpsRanges.data.i32[0]; 962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFpsRange[1] = availableFpsRanges.data.i32[1]; 972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8::format("%d,%d", 100c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala previewFpsRange[0] * kFpsToApiScale, 101c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala previewFpsRange[1] * kFpsToApiScale)); 1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFpsRange; 1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPreviewFpsRange += ","; 1072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFpsRange += String8::format("(%d,%d)", 108c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala availableFpsRanges.data.i32[i] * kFpsToApiScale, 109c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala availableFpsRanges.data.i32[i+1] * kFpsToApiScale); 1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFpsRange); 1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatEnumToString(previewFormat)); // NV21 1182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewTransform = degToTransform(0, 1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraFacing == CAMERA_FACING_FRONT); 1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFormats; 1272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFormats.count; i++) { 1292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 1302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 1312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFormats.data.i32[i]) { 1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1564a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_420_888: 1574a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Flexible YUV allows both YV12 and NV21 1584a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += 1594a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1604a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += ","; 1614a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala supportedPreviewFormats += 1624a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1634a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala break; 1642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1654a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableFormats.data.i32[i]); 1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats); 1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // still have to do something sane for them 1842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 185d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala // NOTE: Not scaled like FPS range values are. 186d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]); 1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 188af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin previewFps); 1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 191af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin SortedVector<int32_t> sortedPreviewFrameRates; 192af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFrameRates; 1942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 195af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // from the [min, max] fps range use the max value 196af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int fps = fpsFromRange(availableFpsRanges.data.i32[i], 197af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFpsRanges.data.i32[i+1]); 198af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 199af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // de-dupe frame rates 200af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) { 201af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin sortedPreviewFrameRates.add(fps); 202af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 203af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 204af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin continue; 205af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 206af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 207af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.size() > 1) { 208af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin supportedPreviewFrameRates += ","; 209af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 210af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 212af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin fps); 213af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 214af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: Supported preview frame rates: %s", 215af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, supportedPreviewFrameRates.string()); 2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates); 2192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegSizes = 2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 2242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick maximum 2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureWidth = availableJpegSizes.data.i32[0]; 2272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight = availableJpegSizes.data.i32[1]; 2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureSize(pictureWidth, 2302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight); 2312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPictureSizes; 2342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 2362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 2372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegSizes.data.i32[i], 2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 2392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 2412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes); 2422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 2452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 2462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 2472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbnailSizes = 249f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4); 2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 2512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2529fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He // Pick the largest thumbnail size that matches still image aspect ratio. 2539fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0, 2549fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Invalid picture size, %d x %d", pictureWidth, pictureHeight); 2559fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight; 2569fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size thumbnailSize = 2579fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He getMaxSizeForRatio( 2589fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He picAspectRatio, 2599fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He &availableJpegThumbnailSizes.data.i32[0], 2609fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He availableJpegThumbnailSizes.count); 2619fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[0] = thumbnailSize.width; 2629fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He jpegThumbSize[1] = thumbnailSize.height; 2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0]); 2662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 2672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1]); 2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedJpegThumbSizes; 2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 2722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 2732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 2742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes); 2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality = 90; 2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality); 2842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality = 90; 2852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality); 2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation = 0; 2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation); 2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsEnabled = false; 292a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[0] = 0.0; 293a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[1] = 0.0; 294a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsCoordinates[2] = 0.0; 295a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala gpsTimestamp = 0; 2962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcessingMethod = "unknown"; 2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 299d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin wbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableWhiteBalanceModes = 304211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 305211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableWhiteBalanceModes.count) { 306211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 307211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::WHITE_BALANCE_AUTO); 308211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedWhiteBalance; 3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 315d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 319d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 323d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 327d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 331d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 335d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 339d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 343d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Skipping values not mappable to v1 API 348d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_OFF: 3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance); 3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 363d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE); 3662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffects = 368211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false); 369211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableEffects.count) { 370211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, 371211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::EFFECT_NONE); 372211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedEffects; 3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedEffects += ","; 3772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 379d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_OFF: 3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE; 3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 383d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_MONO: 3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_MONO; 3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 387d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE: 3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 391d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE: 3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 395d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SEPIA: 3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SEPIA; 3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 399d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE: 4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 403d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD: 4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 407d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD: 4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 4102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 411d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_EFFECT_MODE_AQUA: 4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_AQUA; 4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableEffects.data.u8[i]); 4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 425d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAntibandingModes = 430211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false); 431211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableAntibandingModes.count) { 432211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 433211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray CameraParameters::ANTIBANDING_OFF); 434211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedAntibanding; 4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 441d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF: 4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 445d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ: 4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 449d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ: 4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 453d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO: 4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding); 4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 469c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED; 4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 474211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 475211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!availableSceneModes.count) { 476211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray params.remove(CameraParameters::KEY_SCENE_MODE); 477211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } else { 4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool noSceneModes = false; 4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 485c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk case ANDROID_CONTROL_SCENE_MODE_DISABLED: 4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala noSceneModes = true; 4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not in old API 4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableSceneModes.data.u8[i]); 5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!noSceneModes) { 5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes); 563cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin } else { 564cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin params.remove(CameraParameters::KEY_SCENE_MODE); 5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 568211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool isFlashAvailable = false; 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 570211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false); 571211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (flashAvailable.count) { 572211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray isFlashAvailable = flashAvailable.data.u8[0]; 573211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 576211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false); 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 578211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (isFlashAvailable) { 5796f854608d26d7abcce5e46396c7260ed7b250653Alex Ray flashMode = Parameters::FLASH_MODE_OFF; 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 5816f854608d26d7abcce5e46396c7260ed7b250653Alex Ray CameraParameters::FLASH_MODE_OFF); 5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableAeModes.data.u8[i] == 590d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes); 5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala flashMode = Parameters::FLASH_MODE_OFF; 6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 607211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false); 6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAfModes = 610211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false); 6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 612211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) { 6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Fixed-focus lens 6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_FIXED; 6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_AUTO; 6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY); 6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 630d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 634d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 638d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 6392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 642d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 646d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 6472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not supported in old API 651d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 6562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableAfModes.data.u8[i]); 6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes); 6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 664d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 66595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala shadowFocusMode = FOCUS_MODE_INVALID; 6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t max3aRegions = 6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6717d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin int32_t maxNumFocusAreas = 0; 6727d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (focusMode != Parameters::FOCUS_MODE_FIXED) { 6737d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin maxNumFocusAreas = max3aRegions.data.i32[0]; 6747d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 6757d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas); 6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 6772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.clear(); 6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.add(Parameters::Area(0,0,0,0,0)); 6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 682211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, false); 6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6881f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 6891f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 6901f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 6911f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate field of views!", __FUNCTION__); 6921f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return res; 6931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation = 0; 6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation); 7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 703d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2); 7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationStep = 712d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1); 7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoExposureLock = false; 7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoWhiteBalanceLock = false; 7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala max3aRegions.data.i32[0]); 7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom = 0; 7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, zoom); 7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 742d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1); 7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 7462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 zoomRatios; 7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoom = 1.f; 7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (NUM_ZOOM_STEPS-1); 7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) zoomRatios += ","; 7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom += zoomIncrement; 7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 76382edd5431951f461058c07b73c0dbc093aa45c99Igor Murashkin CameraParameters::FALSE); 7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Infinity,Infinity,Infinity"); 7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces); 7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 0); 7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 776a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala recordingHint = false; 7772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 783a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala videoStabilization = false; 7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 788211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 789211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala storeMetadataInBuffers = true; 8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala playShutterSound = true; 8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFaceDetect = false; 8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFocusMoveMessages = false; 806da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala afTriggerCounter = 1; 8072b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala afStateCounter = 0; 8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala currentAfTriggerId = -1; 809a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala afInMotion = false; 8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 811da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala precaptureTriggerCounter = 1; 812da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 8132b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala takePictureCounter = 0; 8142b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala 8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewCallbackFlags = 0; 816a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala previewCallbackOneShot = false; 8173ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala previewCallbackSurface = false; 8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 819afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He char value[PROPERTY_VALUE_MAX]; 820afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He property_get("camera.disable_zsl_mode", value, "0"); 821afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He if (!strcmp(value,"1")) { 822afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He ALOGI("Camera %d: Disabling ZSL mode", cameraId); 823b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala zslMode = false; 8242f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala } else { 825afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He zslMode = true; 826b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala } 827e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 828e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter lightFx = LIGHTFX_NONE; 829e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = STOPPED; 8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala paramsFlattened = params.flatten(); 8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const { 8388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return paramsFlattened; 8398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 8408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() { 8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t activeArraySize = 84403e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4); 8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!activeArraySize.count) return NO_INIT; 84603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayWidth; 84703e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray int32_t arrayHeight; 84803e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray if (activeArraySize.count == 2) { 849e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!", 850e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray __FUNCTION__, cameraId); 85103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[0]; 85203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[1]; 85303e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else if (activeArraySize.count == 4) { 85403e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayWidth = activeArraySize.data.i32[2]; 85503e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray arrayHeight = activeArraySize.data.i32[3]; 85603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray } else return NO_INIT; 8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8580181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // We'll set the target FPS range for still captures to be as wide 8590181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala // as possible to give the HAL maximum latitude for exposure selection 8600181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 8610181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 8620181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) { 8630181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala return NO_INIT; 8640181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 8650181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 8660181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t bestStillCaptureFpsRange[2] = { 8670181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[0], availableFpsRanges.data.i32[1] 8680181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala }; 8690181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t curRange = 8700181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0]; 8710181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala for (size_t i = 2; i < availableFpsRanges.count; i += 2) { 8720181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala int32_t nextRange = 8730181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[i + 1] - 8740181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala availableFpsRanges.data.i32[i]; 8750181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if ( (nextRange > curRange) || // Maximize size of FPS range first 8760181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala (nextRange == curRange && // Then minimize low-end FPS 8770181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[0] > availableFpsRanges.data.i32[i])) { 8780181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 8790181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[0] = availableFpsRanges.data.i32[i]; 8800181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala bestStillCaptureFpsRange[1] = availableFpsRanges.data.i32[i + 1]; 8810181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala curRange = nextRange; 8820181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 8830181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 8840181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala 8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFaceDetectModes = 886211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0, 887211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t bestFaceDetectMode = 890d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) { 8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFaceDetectModes.data.u8[i]) { 893d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF: 8942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 895d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE: 8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (bestFaceDetectMode != 897d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) { 8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 899d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE; 9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 902d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL: 9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 904d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL; 9052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 9062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown face detect mode %d:", 9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFaceDetectModes.data.u8[i]); 9102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return NO_INIT; 9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 914211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray int32_t maxFaces = 0; 9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxFacesDetected = 916211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false); 917211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (maxFacesDetected.count) { 918211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray maxFaces = maxFacesDetected.data.i32[0]; 919211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray } 9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 922211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false); 9238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t sceneModeOverrides = 924211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false); 9258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 926211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false); 927211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray bool fixedLens = minFocusDistance.count == 0 || 928211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray minFocusDistance.data.f[0] == 0; 9298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 9301f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 9311f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS); 9321f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 9331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 9344a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 9354a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 9364a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (!availableFormats.count) return NO_INIT; 9374a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 9384a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 9398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count > 0) { 9408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // sceneModeOverrides is defined to have 3 entries for each scene mode, 9418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // which are AE, AWB, and AF override modes the HAL wants for that scene 9428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // mode. 9438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala const size_t kModesPerSceneMode = 3; 9448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count != 9458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count * kModesPerSceneMode) { 9468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override list is an " 9478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala "unexpected size: %d (expected %d)", __FUNCTION__, 9488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, sceneModeOverrides.count, 9498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count); 9508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return NO_INIT; 9518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 9528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (size_t i = 0; i < availableSceneModes.count; i++) { 9538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala DeviceInfo::OverrideModes modes; 9548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t aeMode = 9558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0]; 9568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(aeMode) { 957d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON: 9588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_OFF; 9598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 960d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH: 9618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_AUTO; 9628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 963d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH: 9648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_ON; 9658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 966d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: 9678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_RED_EYE; 9688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 9698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 9708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__, 9718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala aeMode); 9728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_INVALID; 9738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 9748a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 9758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.wbMode = 9768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1]; 9778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t afMode = 9788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2]; 9798a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(afMode) { 980d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 9818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = fixedLens ? 9828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY; 9838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 984d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 985d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 986d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 987d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 988d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 9898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = static_cast<focusMode_t>(afMode); 9908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 9918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 9928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__, 9938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala afMode); 9948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = FOCUS_MODE_INVALID; 9958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 9968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 9978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i], 9988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes); 9998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 10018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 10022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayWidth = arrayWidth; 10032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayHeight = arrayHeight; 10040181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0]; 10050181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1]; 10062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.bestFaceDetectMode = bestFaceDetectMode; 10072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces = maxFaces; 10081f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 10091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // Find smallest (widest-angle) focal length to use as basis of still 10101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // picture FOV reporting. 10111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[0]; 10121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala for (size_t i = 1; i < availableFocalLengths.count; i++) { 10131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) { 10141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[i]; 10151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 10161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 10171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 10184a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888 10194a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = false; 10204a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala for (size_t i = 0; i < availableFormats.count; i++) { 10214a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (availableFormats.data.i32[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) { 10224a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala fastInfo.useFlexibleYuv = true; 10234a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala break; 10244a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 10254a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 10264a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGV("Camera %d: Flexible YUV %s supported", 10274a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala cameraId, fastInfo.useFlexibleYuv ? "is" : "is not"); 10284a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala 10292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 10302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1032e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() { 1033e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 1034e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO); 1035e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1); 1036e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled", 1037e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1038e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 1039e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT); 1040e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1); 1041e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled", 1042e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 1043e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 10447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION); 10457373cbe85e617345f7002256a4be389fe62af913Igor Murashkin quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1); 10467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion" 10477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " enabled", cameraId); 10487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 1049fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT); 1050fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1); 1051fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult" 1052fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala " enabled", cameraId); 1053fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 1054e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala return OK; 1055e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala} 1056e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 10572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag, 1058d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin size_t minCount, size_t maxCount, bool required) const { 10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t entry = info->find(tag); 10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1061d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin if (CC_UNLIKELY( entry.count == 0 ) && required) { 10622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x)", 10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag); 10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (CC_UNLIKELY( 10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 10722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 10732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 10742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 10762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 10772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return entry; 10822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 10832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) { 10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 10862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala CameraParameters newParams(paramString); 10882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only parameters 10902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // such as supported preview sizes, etc. Should probably produce an error if 10912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // they're changed. 10922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Extract and verify new parameters */ 10942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t i; 10962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters validatedParams(*this); 10982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_SIZE 11002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewSize(&validatedParams.previewWidth, 11012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewHeight); 11022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewWidth != previewWidth || 11042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight != previewHeight) { 11052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 11062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 11072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 11092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight, 11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth, validatedParams.previewHeight); 11112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11133ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (i = 0; i < availablePreviewSizes.size(); i++) { 11143ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if ((availablePreviewSizes[i].width == 11152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth) && 11163ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He (availablePreviewSizes[i].height == 11172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight)) break; 11182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11193ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (i == availablePreviewSizes.size()) { 11202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 11212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewWidth, 11222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight); 11232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1127af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // RECORDING_HINT (always supported) 1128af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint = boolFromString( 1129af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 1130af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bool recordingHintChanged = validatedParams.recordingHint != recordingHint; 1131af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV_IF(recordingHintChanged, "%s: Recording hint changed to %d", 1132af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, recordingHintChanged); 1133af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 11342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FPS_RANGE 11352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool fpsRangeChanged = false; 1136d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int32_t lastSetFpsRange[2]; 1137d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 1138d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala params.getPreviewFpsRange(&lastSetFpsRange[0], &lastSetFpsRange[1]); 1139d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala lastSetFpsRange[0] /= kFpsToApiScale; 1140d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala lastSetFpsRange[1] /= kFpsToApiScale; 1141d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0], 11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewFpsRange[1]); 1144c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[0] /= kFpsToApiScale; 1145c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[1] /= kFpsToApiScale; 1146c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala 1147d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala // Compare the FPS range value from the last set() to the current set() 1148d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala // to determine if the client has changed it 1149d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala if (validatedParams.previewFpsRange[0] != lastSetFpsRange[0] || 1150d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala validatedParams.previewFpsRange[1] != lastSetFpsRange[1]) { 1151d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 11522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fpsRangeChanged = true; 11532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewFpsRanges = 11542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 11552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 11562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 11572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0]) && 11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]) ) { 11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFpsRange[0], 11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]); 11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FORMAT 11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFormat = 11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatStringToEnum(newParams.getPreviewFormat()); 11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFormat != previewFormat) { 11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active!", __FUNCTION__); 11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 11824a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // If using flexible YUV, always support NV21/YV12. Otherwise, check 11834a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // HAL's list. 11844a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (! (fastInfo.useFlexibleYuv && 11854a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala (validatedParams.previewFormat == 11864a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP || 11874a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat == 11884a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala HAL_PIXEL_FORMAT_YV12) ) ) { 11894a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala // Not using flexible YUV format, so check explicitly 11904a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 11914a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (availableFormats.data.i32[i] == 11924a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat) break; 11934a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 11944a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala if (i == availableFormats.count) { 11954a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 11964a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), 11974a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala validatedParams.previewFormat); 11984a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala return BAD_VALUE; 11994a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala } 12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 120370b054021a3a22622c2710267362c5e235ed73bdEino-Ville Talvala // PREVIEW_FRAME_RATE Deprecated, only use if the preview fps range is 120470b054021a3a22622c2710267362c5e235ed73bdEino-Ville Talvala // unchanged this time. The single-value FPS is the same as the minimum of 120570b054021a3a22622c2710267362c5e235ed73bdEino-Ville Talvala // the range. To detect whether the application has changed the value of 1206d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala // previewFps, compare against their last-set preview FPS. 12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!fpsRangeChanged) { 1208d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int previewFps = newParams.getPreviewFrameRate(); 1209d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala int lastSetPreviewFps = params.getPreviewFrameRate(); 1210d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala if (previewFps != lastSetPreviewFps || recordingHintChanged) { 12112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFrameRates = 12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 1213af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin /** 1214af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is set, find the range that encompasses 1215af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * previewFps with the largest min index. 1216af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1217af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is not set, find the range with previewFps 1218af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * with the smallest min index. 1219af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1220af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * Either way, in case of multiple ranges, break the tie by 1221af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * selecting the smaller range. 1222af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin */ 1223d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala 1224d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala // all ranges which have previewFps 1225af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Vector<Range> candidateRanges; 12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 1227af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = { 1228af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i], 1229af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i+1] 1230af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin }; 1231af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1232d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala if (r.min <= previewFps && previewFps <= r.max) { 1233af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin candidateRanges.push(r); 1234af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 12352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1236af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (candidateRanges.isEmpty()) { 12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 1238d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala __FUNCTION__, previewFps); 12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1241af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // most applicable range with targetFps 1242af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range bestRange = candidateRanges[0]; 1243af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin for (i = 1; i < candidateRanges.size(); ++i) { 1244af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = candidateRanges[i]; 1245af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1246af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by largest minIndex in recording mode 1247af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (validatedParams.recordingHint) { 1248af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min > bestRange.min) { 1249af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1250af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1251af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1252af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1253af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1254af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1255af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by smallest minIndex in preview mode 1256af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 1257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min < bestRange.min) { 1258af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1259af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1260af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1261af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1262af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1263af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1264af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1265af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0] = 1267af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.min; 12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] = 1269af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.max; 1270af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1271af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d", 1272af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, 1273af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[0], 1274af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[1], 1275af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint); 12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PICTURE_SIZE 12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPictureSize(&validatedParams.pictureWidth, 12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.pictureHeight); 12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.pictureWidth == pictureWidth || 12832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight == pictureHeight) { 12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePictureSizes = 12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePictureSizes.data.i32[i] == 12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureWidth) && 12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePictureSizes.data.i32[i+1] == 12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight)) break; 12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePictureSizes.count) { 12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.pictureWidth, 12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight); 12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0] = 13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] = 13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] || 13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) { 13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbSizes = 13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableJpegThumbSizes.data.i32[i] == 13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0]) && 13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableJpegThumbSizes.data.i32[i+1] == 13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1])) break; 13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegThumbSize[0], 13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1]); 13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 1324c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 1325c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1326c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 1328c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1331c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegThumbQuality = quality; 13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_QUALITY 1334c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 1335c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala // also makes sure quality fits in uint8_t 1336c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala if (quality < 0 || quality > 100) { 13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 1338c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala __FUNCTION__, quality); 13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1341c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala validatedParams.jpegQuality = quality; 13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ROTATION 13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation = 13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegRotation != 0 && 13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 90 && 13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 180 && 13492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 270) { 13502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 13512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegRotation); 13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS 13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLatStr = 13582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLatStr != NULL) { 13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLongStr = 13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 13622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsAltitudeStr = 13632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 13642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsTimeStr = 13652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 13662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsProcMethodStr = 13672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 13682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLongStr == NULL || 13692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr == NULL || 13702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsTimeStr == NULL || 13712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcMethodStr == NULL) { 13722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 13732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *endPtr; 13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 13802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 13812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 13912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 13922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 13932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr); 13942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 13982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 13992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 14002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsProcessingMethod = gpsProcMethodStr; 14032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = true; 14052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 14062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = false; 14072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EFFECT 14102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.effectMode = effectModeStringToEnum( 14112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 14122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode != effectMode) { 14132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffectModes = 14142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 14152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 14162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break; 14172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableEffectModes.count) { 14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 14222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ANTIBANDING 14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.antibandingMode = abModeStringToEnum( 14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode != antibandingMode) { 14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAbModes = 14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode == availableAbModes.data.u8[i]) 14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAbModes.count) { 14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // SCENE_MODE 14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode = sceneModeStringToEnum( 14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode != sceneMode && 14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode != 1449c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED) { 14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode == availableSceneModes.data.u8[i]) 14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableSceneModes.count) { 14572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 14602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeSet = 1464c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED; 14652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FLASH_MODE 14678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 14688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = 14698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 14708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).flashMode; 14718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 14728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = FLASH_MODE_INVALID; 14738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 14748a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.flashMode == FLASH_MODE_INVALID) { 14758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = flashModeStringToEnum( 14768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 14778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 14788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode != flashMode) { 14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 1481d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1); 14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.flashMode != Parameters::FLASH_MODE_OFF) { 14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 14852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "No flash on device", __FUNCTION__, 14862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) { 14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 14912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 14922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode == availableAeModes.data.u8[i]) 14932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 14942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAeModes.count) { 14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == -1) { 15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 15088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_FLASH_MODE, 15098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala flashModeEnumToString(validatedParams.flashMode)); 15108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 15118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 15128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // WHITE_BALANCE 15138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 15148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = 15158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 15168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).wbMode; 15178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 1518d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF; 15198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 1520d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) { 15218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = wbModeStringToEnum( 15228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 15238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 15248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode != wbMode) { 15258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableWbModes = 1526211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false); 15278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 15288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode == availableWbModes.data.u8[i]) break; 15298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 15308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (i == availableWbModes.count) { 15318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 15328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, 15338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 15348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 15358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 15368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 15378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_WHITE_BALANCE, 15388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala wbModeEnumToString(validatedParams.wbMode)); 15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_MODE 15428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 15438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = 15448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 15458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).focusMode; 15468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 15478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = FOCUS_MODE_INVALID; 15488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 15498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.focusMode == FOCUS_MODE_INVALID) { 15508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = focusModeStringToEnum( 15518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE) ); 15528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != focusMode) { 15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = -1; 15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) { 15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 1557211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, 1558211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 1559211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) { 15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "fixed focus lens", 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.focusMode != 15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY) { 15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocusModes = 15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode == 15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFocusModes.data.u8[i]) break; 15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableFocusModes.count) { 15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1581d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 158295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // Always reset shadow focus mode to avoid reverting settings 1583d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala validatedParams.shadowFocusMode = FOCUS_MODE_INVALID; 15848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 15858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_FOCUS_MODE, 15868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala focusModeEnumToString(validatedParams.focusMode)); 15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = currentAfTriggerId; 15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_AREAS 15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.focusingAreas); 15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t max3aRegions = 15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) res = validateAreas(validatedParams.focusingAreas, 15977d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin max3aRegions, AREA_KIND_FOCUS); 15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 16012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EXPOSURE_COMPENSATION 16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.exposureCompensation = 16062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 1608d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE); 16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((validatedParams.exposureCompensation < 16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]) || 16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (validatedParams.exposureCompensation > 16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1])) { 16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.exposureCompensation); 16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoExposureLock = boolFromString( 16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoWhiteBalanceLock = boolFromString( 16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // METERING_AREAS 16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.meteringAreas); 16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) { 16307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin res = validateAreas(validatedParams.meteringAreas, max3aRegions, 16317d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AREA_KIND_METERING); 16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 16342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 16372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ZOOM 16412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 1642709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin if (validatedParams.zoom < 0 1643709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) { 16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 16452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.zoom); 16462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_SIZE 16502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getVideoSize(&validatedParams.videoWidth, 16512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.videoHeight); 16522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoWidth != videoWidth || 16532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight != videoHeight) { 16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state == RECORD) { 16552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 16572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16593ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (i = 0; i < availablePreviewSizes.size(); i++) { 16603ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if ((availablePreviewSizes[i].width == 16612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoWidth) && 16623ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He (availablePreviewSizes[i].height == 16632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight)) break; 16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16653ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (i == availablePreviewSizes.size()) { 16662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 16672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.videoWidth, 16682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight); 16692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_STABILIZATION 16742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoStabilization = boolFromString( 16752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 16762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 1677211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0, 1678211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray false); 16792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoStabilization && 16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableVideoStabilizationModes.count == 1) { 16812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 16822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1684e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter // LIGHTFX 1685e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter validatedParams.lightFx = lightFxStringToEnum( 1686e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter newParams.get(CameraParameters::KEY_LIGHTFX)); 1687e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 16882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Update internal parameters */ 16892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *this = validatedParams; 16912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16921f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** Update external parameters calculated from the internal ones */ 16931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 16941f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // HORIZONTAL/VERTICAL FIELD OF VIEW 16951f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizFov, vertFov; 16961f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 16971f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (res != OK) { 16981f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGE("%s: Can't calculate FOVs", __FUNCTION__); 16991f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // continue so parameters are at least consistent 17001f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 17011f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, 17021f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizFov); 17031f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, 17041f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertFov); 17051f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov); 17061f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 17078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Need to flatten again in case of overrides 17088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala paramsFlattened = newParams.flatten(); 17098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala params = newParams; 17108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 17112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 17122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1714da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const { 1715da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 1716da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 1717da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 171803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 171903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Mixin default important security values 172003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * - android.led.transmit = defaulted ON 172103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 172203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS, 1723d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*minimumCount*/0, 1724d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*maximumCount*/0, 1725d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin /*required*/false); 172603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin for(size_t i = 0; i < entry.count; ++i) { 172703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t led = entry.data.u8[i]; 172803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 172903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin switch(led) { 173003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // Transmit LED is unconditionally on when using 173103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin // the android.hardware.Camera API 173203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: { 173303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON; 173403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin res = request->update(ANDROID_LED_TRANSMIT, 173503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin &transmitDefault, 1); 173603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin if (res != OK) return res; 173703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin break; 173803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 173903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 174003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin } 174103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 174203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin /** 174303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin * Construct metadata from parameters 174403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin */ 174503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin 1746d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 1747da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_REQUEST_METADATA_MODE, 1748da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &metadataMode, 1); 1749da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1750da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 17510181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala camera_metadata_entry_t intent = 17520181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala request->find(ANDROID_CONTROL_CAPTURE_INTENT); 17530181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) { 17540181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 17550181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala fastInfo.bestStillCaptureFpsRange, 2); 17560181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } else { 17570181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 17580181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala previewFpsRange, 2); 17590181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala } 1760da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1761da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 176296150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqWbLock = autoWhiteBalanceLock ? 176396150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF; 176496150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_LOCK, 176596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqWbLock, 1); 176696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 1767da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_EFFECT_MODE, 1768da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &effectMode, 1); 1769da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1770da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 1771da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &antibandingMode, 1); 1772da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1773da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 177461c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // android.hardware.Camera requires that when face detect is enabled, the 177561c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // camera is in a face-priority mode. HAL2 splits this into separate parts 177661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // (face detection statistics and face priority scene mode). Map from other 177761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // to the other. 17788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeActive = 1779c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 1780d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO; 17818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (enableFaceDetect || sceneModeActive) { 1782d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE; 178361c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala } 1784da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_MODE, 1785da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqControlMode, 1); 1786da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 178761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala 1788d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala uint8_t reqSceneMode = 17898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeActive ? sceneMode : 1790d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY : 1791c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; 179261c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala res = request->update(ANDROID_CONTROL_SCENE_MODE, 179361c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala &reqSceneMode, 1); 179461c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala if (res != OK) return res; 1795da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1796d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF; 1797d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF; 1798da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (flashMode) { 1799da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_OFF: 1800d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break; 1801da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 1802d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break; 1803da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_ON: 1804d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break; 1805da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 1806d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; 1807d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFlashMode = ANDROID_FLASH_MODE_TORCH; 1808da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1809da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 1810d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break; 1811da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 1812da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 1813da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala cameraId, flashMode); 18148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 1815da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1816da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_FLASH_MODE, 1817da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFlashMode, 1); 1818da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1819da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_MODE, 1820da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqAeMode, 1); 1821da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1822da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 182396150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqAeLock = autoExposureLock ? 182496150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF; 182596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_LOCK, 182696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqAeLock, 1); 18278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 18288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 18298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_MODE, 18308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala &wbMode, 1); 18318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 183296150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 1833da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala float reqFocusDistance = 0; // infinity focus in diopters 1834d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 1835da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (focusMode) { 1836da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1837da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1838da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1839da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1840da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1841da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusMode = focusMode; 1842da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1843da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1844da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1845d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 1846da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1847da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 18488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 18498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, focusMode); 18508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 1851da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1852da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_LENS_FOCUS_DISTANCE, 1853da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusDistance, 1); 1854da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1855da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_MODE, 1856da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusMode, 1); 1857da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1858da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1859da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqFocusingAreasSize = focusingAreas.size() * 5; 1860da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize]; 1861894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) { 1862894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (focusingAreas[j].weight != 0) { 1863da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 1864894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].left); 1865da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 1866894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].top); 1867da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 1868894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(focusingAreas[j].right); 1869da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 1870894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(focusingAreas[j].bottom); 1871da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 1872da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 0; 1873da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 0; 1874da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 0; 1875da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 0; 1876da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1877894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqFocusingAreas[i + 4] = focusingAreas[j].weight; 1878da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1879da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_REGIONS, 1880da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas, reqFocusingAreasSize); 1881da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1882da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqFocusingAreas; 1883da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1884d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 1885da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &exposureCompensation, 1); 1886da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1887da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1888da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqMeteringAreasSize = meteringAreas.size() * 5; 1889da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize]; 1890894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) { 1891894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He if (meteringAreas[j].weight != 0) { 1892da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 1893894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].left); 1894da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 1895894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].top); 1896da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 1897894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedXToArray(meteringAreas[j].right); 1898da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 1899894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He normalizedYToArray(meteringAreas[j].bottom); 1900da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 1901da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 0; 1902da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 0; 1903da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 0; 1904da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 0; 1905da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1906894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He reqMeteringAreas[i + 4] = meteringAreas[j].weight; 1907da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1908da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_REGIONS, 1909da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas, reqMeteringAreasSize); 1910da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1911da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1912da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqMeteringAreas; 1913da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 19147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin /* don't include jpeg thumbnail size - it's valid for 19157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin it to be set to (0,0), meaning 'no thumbnail' */ 19167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion crop = calculateCropRegion( (CropRegion::Outputs)( 19177373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_PREVIEW | 19187373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_VIDEO | 19197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_PICTURE )); 192005bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin int32_t reqCropRegion[4] = { 1921c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.left), 1922c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<int32_t>(crop.top), 192305bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.width), 192405bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin static_cast<int32_t>(crop.height) 1925c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala }; 1926da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_SCALER_CROP_REGION, 192705bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin reqCropRegion, 4); 1928da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1929da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1930da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqVstabMode = videoStabilization ? 1931d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON : 1932d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 1933da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 1934da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqVstabMode, 1); 1935da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1936da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1937da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqFaceDetectMode = enableFaceDetect ? 1938da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala fastInfo.bestFaceDetectMode : 1939d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 1940d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE, 1941da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFaceDetectMode, 1); 1942da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1943da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1944da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 1945da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1946da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1947ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const { 1948ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala status_t res; 1949ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 1950ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE, 1951ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala jpegThumbSize, 2); 1952ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1953ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY, 1954ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegThumbQuality, 1); 1955ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1956ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_QUALITY, 1957ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegQuality, 1); 1958ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1959ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1960ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 1961ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegRotation, 1); 1962ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1963ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 1964ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (gpsEnabled) { 1965ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1966ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 1967ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsCoordinates, 3); 1968ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1969ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1970ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 1971ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &gpsTimestamp, 1); 1972ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1973ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1974ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 1975ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsProcessingMethod); 1976ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1977ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } else { 1978ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_COORDINATES); 1979ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1980ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP); 1981ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1982ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 1983ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1984ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } 1985ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala return OK; 1986ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala} 1987ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 1988ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 19892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) { 19902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 19912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(state) { 19922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 19932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 19942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 19952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 19962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 19972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 19982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 19992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 20002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return "Unknown state!"; 20012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 20032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR 20042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) { 20072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 20084a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !format ? 20094a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : 20102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 20112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 20122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 20132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 20142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 20152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 20162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 20172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 20182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 20192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 20202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 20212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 20222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 20232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 20242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 20252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) { 20282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *fmt; 20292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(format) { 20302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 20312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 20322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 20342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 20352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 20372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 20382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 20402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 20412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 20432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 20442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 20462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 20472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 20492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 20502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 20512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 20532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 20542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, format); 20552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = NULL; 20562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 20572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 20582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return fmt; 20592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) { 20622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 20634a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !wbMode ? 2064d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 20652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 2066d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 20672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 2068d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_INCANDESCENT : 20692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 2070d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_FLUORESCENT : 20712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 2072d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT : 20732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 2074d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_DAYLIGHT : 20752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 2076d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT : 20772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 2078d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_TWILIGHT : 20792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 2080d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AWB_MODE_SHADE : 20812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 20822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) { 20858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (wbMode) { 2086d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 20878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_AUTO; 2088d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 20898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_INCANDESCENT; 2090d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 20918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_FLUORESCENT; 2092d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 20938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 2094d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 20958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_DAYLIGHT; 2096d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 20978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 2098d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 20998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_TWILIGHT; 2100d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 21018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_SHADE; 21028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 21038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown AWB mode enum: %d", 21048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, wbMode); 21058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 21068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 21078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 21088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 21092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) { 21102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 21114a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !effectMode ? 2112d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 21132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 2114d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 21152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 2116d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_MONO : 21172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 2118d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_NEGATIVE : 21192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 2120d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SOLARIZE : 21212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 2122d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_SEPIA : 21232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 2124d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_POSTERIZE : 21252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 2126d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD : 21272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 2128d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD : 21292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 2130d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_EFFECT_MODE_AQUA : 21312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 21322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) { 21352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 21364a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !abMode ? 2137d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 21382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 2139d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 21402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 2141d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF : 21422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 2143d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ : 21442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 2145d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ : 21462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 21472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) { 21502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 21514a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !sceneMode ? 2152c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 21532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 2154c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED : 21552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 21562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 21572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 21582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 21592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 21602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 21612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 21622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 21632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 21642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 21652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 21662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 21672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 21682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 21692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 21702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 21712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 21722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 21732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 21742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 21752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 21762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 21772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 21782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 21792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 21802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 21812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 21822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 21832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 21842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 21852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 21862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum( 21892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *flashMode) { 21902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 21914a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !flashMode ? 21924a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::FLASH_MODE_INVALID : 21932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 21942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 21952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 21962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 21972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 21982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_ON : 21992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 22002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 22012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 22022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 22032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 22042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) { 22078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (flashMode) { 22088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_OFF: 22098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_OFF; 22108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_AUTO: 22118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_AUTO; 22128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_ON: 22138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_ON; 22148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_RED_EYE: 22158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_RED_EYE; 22168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_TORCH: 22178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_TORCH; 22188a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 22198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown flash mode enum %d", 22208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, flashMode); 22218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 22228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 22238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 22248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 22252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum( 22262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *focusMode) { 22272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 22284a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !focusMode ? 22294a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID : 22302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 22312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 22322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 22332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 22342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 22352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 22362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 22372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 22382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 22392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 22402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 22412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 22422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 22432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 22442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 22452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) { 22488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (focusMode) { 22498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_AUTO: 22508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_AUTO; 22518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_MACRO: 22528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_MACRO; 22538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_VIDEO: 22548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 22558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_PICTURE: 22568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 22578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_EDOF: 22588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_EDOF; 22598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_INFINITY: 22608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_INFINITY; 22618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_FIXED: 22628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_FIXED; 22638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 22648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown focus mode enum: %d", 22658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, focusMode); 22668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 22678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 22688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 22698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 2270e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterParameters::Parameters::lightFxMode_t Parameters::lightFxStringToEnum( 2271e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter const char *lightFxMode) { 2272e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter return 22734a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !lightFxMode ? 22744a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::LIGHTFX_NONE : 2275e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter !strcmp(lightFxMode, CameraParameters::LIGHTFX_LOWLIGHT) ? 2276e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Parameters::LIGHTFX_LOWLIGHT : 2277e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter !strcmp(lightFxMode, CameraParameters::LIGHTFX_HDR) ? 2278e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Parameters::LIGHTFX_HDR : 2279e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter Parameters::LIGHTFX_NONE; 2280e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} 2281e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr, 22832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Parameters::Area> *areas) { 22842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 22852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->clear(); 22862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areasCStr == NULL) { 22872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 22882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(); 22892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 22902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 areasStr(areasCStr); 22922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 22932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala while (areaStart != 0) { 22942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 22952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *numEnd; 22962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int vals[NUM_FIELDS]; 22972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 22982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 22992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 23002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 23012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala area = numEnd + 1; 23022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(Parameters::Area( 23042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 23052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 23062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 23082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas, 23117d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin size_t maxRegions, 23127d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AreaKind areaKind) const { 23132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Definition of valid area can be found in 23142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // include/camera/CameraParameters.h 23152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 23162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 1) { 23172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas[0].left == 0 && 23182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].top == 0 && 23192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].right == 0 && 23202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].bottom == 0 && 23212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].weight == 0) { 23222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 23232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 23242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23267d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 23277d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin // fixed focus can only set (0,0,0,0,0) focus area 23287d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) { 23297d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin return BAD_VALUE; 23307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 23317d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 23322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() > maxRegions) { 23332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 23342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, areas.size()); 23352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 23362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 23392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala a != areas.end(); a++) { 23402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 23412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 23422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 23432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 23442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 23452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 23462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 23472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 23492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) { 23522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return !boolStr ? false : 23532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 23542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala false; 23552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) { 23582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!mirror) { 23592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) return 0; 23602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 23612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 23622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 23632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 23642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 23652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 23662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 23672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 23682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 23692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 23702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 23712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 23722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 23752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return -1; 23762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23787373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const { 23797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds" 23807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", x); 23817373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 23827373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23837373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' " 23841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "is out of bounds (upper = %f)", x, previewCrop.width); 23857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 23867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = x + previewCrop.left; 23877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 23887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth), 23897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value X = '%d' is out of bounds (upper = %d)", 23907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayWidth); 23917373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 23927373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 23937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 23947373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const { 23957373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds " 23967373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", y); 23977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 23987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is " 24001f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala "out of bounds (upper = %f)", y, previewCrop.height); 24017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24027373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = y + previewCrop.top; 24037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight), 24057373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)", 24067373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayHeight); 24077373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 24097373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24107373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 24117373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24127373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const { 24137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 24147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (previewCrop.width - 1) / 2000; 24157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 24167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24177373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const { 24187373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 24197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (previewCrop.height - 1) / 2000; 24207373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 24217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24227373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayXToCrop(int x) const { 24237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 24247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return x - previewCrop.left; 24257373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 24267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24277373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayYToCrop(int y) const { 24287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 24297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return y - previewCrop.top; 24307373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 24317373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24327373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToNormalized(int x) const { 24337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 24347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return x * 2000 / (previewCrop.width - 1) - 1000; 24357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 24367373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24377373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToNormalized(int y) const { 24387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 24397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return y * 2000 / (previewCrop.height - 1) - 1000; 24407373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 24417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const { 24437373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = cropXToNormalized(arrayXToCrop(width)); 24447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24457373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of " 24467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "lower bounds %d", ret); 24477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of " 24487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "upper bounds %d", ret); 24497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24507373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 24517373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 24527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return width * 2000 / (fastInfo.arrayWidth - 1) - 1000; 24537373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 24547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 24562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const { 24597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = cropYToNormalized(arrayYToCrop(height)); 24607373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of lower bounds" 24627373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " %d", ret); 24637373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of upper bounds" 24647373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " %d", ret); 24657373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24667373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 24677373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 24687373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return height * 2000 / (fastInfo.arrayHeight - 1) - 1000; 24697373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 24707373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24717373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 24722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const { 24757373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24767373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 24777373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 24787373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000; 24797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 24807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24817373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return cropXToArray(normalizedXToCrop(x)); 24822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const { 24857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 24867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 24877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000; 24887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 24897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 24907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return cropYToArray(normalizedYToCrop(y)); 24912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24933ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun Hestatus_t Parameters::getFilteredPreviewSizes(Size limit, Vector<Size> *sizes) { 24943ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (info == NULL) { 24953ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Static metadata is not initialized", __FUNCTION__); 24963ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return NO_INIT; 24973ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 24983ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes == NULL) { 24993ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("%s: Input size is null", __FUNCTION__); 25003ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 25013ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 25023ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 25033ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He const size_t SIZE_COUNT = sizeof(Size) / sizeof(int); 25043ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He camera_metadata_ro_entry_t availableProcessedSizes = 25053ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, SIZE_COUNT); 25063ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (availableProcessedSizes.count < SIZE_COUNT) return BAD_VALUE; 25073ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 25083ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He Size previewSize; 25093ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He for (size_t i = 0; i < availableProcessedSizes.count; i += SIZE_COUNT) { 25103ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He previewSize.width = availableProcessedSizes.data.i32[i]; 25113ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He previewSize.height = availableProcessedSizes.data.i32[i+1]; 25123ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He // Need skip the preview sizes that are too large. 25133ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (previewSize.width <= limit.width && 25143ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He previewSize.height <= limit.height) { 25153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He sizes->push(previewSize); 25163ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 25173ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 25183ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He if (sizes->isEmpty()) { 25193ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He ALOGE("generated preview size list is empty!!"); 25203ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return BAD_VALUE; 25213ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He } 25223ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He return OK; 25233ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He} 25243ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He 25259fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun HeParameters::Size Parameters::getMaxSizeForRatio( 25269fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float ratio, const int32_t* sizeArray, size_t count) { 25279fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL"); 25289fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number"); 25299fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 25309fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He Size maxSize = {0, 0}; 25319fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He for (size_t i = 0; i < count; i += 2) { 25329fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (sizeArray[i] > 0 && sizeArray[i+1] > 0) { 25339fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1]; 25349fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) { 25359fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[i]; 25369fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[i+1]; 25379fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 25389fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 25399fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 25409fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 25419fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He if (maxSize.width == 0 || maxSize.height == 0) { 25429fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.width = sizeArray[0]; 25439fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He maxSize.height = sizeArray[1]; 25449fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He ALOGW("Unable to find the size to match the given aspect ratio %f." 25459fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He "Fall back to %d x %d", ratio, maxSize.width, maxSize.height); 25469fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He } 25479fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 25489fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He return maxSize; 25499fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He} 25509fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He 25517373cbe85e617345f7002256a4be389fe62af913Igor MurashkinParameters::CropRegion Parameters::calculateCropRegion( 25527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin Parameters::CropRegion::Outputs outputs) const { 2553018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2554018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2555018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2556018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Need to convert zoom index into a crop rectangle. The rectangle is 2557018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // chosen to maximize its area on the sensor 2558018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2559018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin camera_metadata_ro_entry_t maxDigitalZoom = 2560d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM); 2561018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // For each zoom step by how many pixels more do we change the zoom 2562018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2563018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (NUM_ZOOM_STEPS-1); 2564018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w) 2565018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // via interpolating zoom step into a zoom ratio 2566018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomRatio = 1 + zoomIncrement * zoom; 2567018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]), 2568018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f", 2569018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomRatio); 2570018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2571018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, " 2572018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "previewHeight=%d, activeWidth=%d, activeHeight=%d", 2573018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth, 2574018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight); 2575018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2576018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin /* 2577018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * Assumption: On the HAL side each stream buffer calculates its crop 2578018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * rectangle as follows: 2579018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * cropRect = (zoomLeft, zoomRight, 2580018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * zoomWidth, zoomHeight * zoomWidth / outputWidth); 2581018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * 2582018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * Note that if zoomWidth > bufferWidth, the new cropHeight > zoomHeight 2583018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * (we can then get into trouble if the cropHeight > arrayHeight). 2584018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * By selecting the zoomRatio based on the smallest outputRatio, we 2585018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * guarantee this will never happen. 2586018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin */ 2587018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2588018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Enumerate all possible output sizes, select the one with the smallest 2589018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // aspect ratio 2590018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float minOutputWidth, minOutputHeight, minOutputRatio; 2591018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin { 2592018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputSizes[][2] = { 2593c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(previewWidth), 2594c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(previewHeight) }, 2595c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(videoWidth), 2596c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(videoHeight) }, 2597c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(jpegThumbSize[0]), 2598c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(jpegThumbSize[1]) }, 2599c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala { static_cast<float>(pictureWidth), 2600c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala static_cast<float>(pictureHeight) }, 2601018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin }; 2602018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2603018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth = outputSizes[0][0]; 2604018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight = outputSizes[0][1]; 2605018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputRatio = minOutputWidth / minOutputHeight; 2606018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin for (unsigned int i = 0; 2607018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin i < sizeof(outputSizes) / sizeof(outputSizes[0]); 2608018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ++i) { 2609018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 26107373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // skip over outputs we don't want to consider for the crop region 26117373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if ( !((1 << i) & outputs) ) { 26127373cbe85e617345f7002256a4be389fe62af913Igor Murashkin continue; 26137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 26147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 2615018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputWidth = outputSizes[i][0]; 2616018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputHeight = outputSizes[i][1]; 2617018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputRatio = outputWidth / outputHeight; 2618018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2619018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin if (minOutputRatio > outputRatio) { 2620018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputRatio = outputRatio; 2621018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth = outputWidth; 2622018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight = outputHeight; 2623018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2624018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2625018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // and then use this output ratio instead of preview output ratio 2626018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Enumerating output ratio %f = %f / %f, min is %f", 2627018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin outputRatio, outputWidth, outputHeight, minOutputRatio); 2628018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2629018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2630018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2631018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin /* Ensure that the width/height never go out of bounds 2632018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * by scaling across a diffent dimension if an out-of-bounds 2633018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * possibility exists. 2634018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * 2635018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by 2636018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * calculating the zoomWidth from zoomHeight we'll actually get a 2637018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * zoomheight > arrayheight 2638018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin */ 2639018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight; 2640018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin if (minOutputRatio >= arrayRatio) { 2641018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Adjust the height based on the width 2642018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomWidth = fastInfo.arrayWidth / zoomRatio; 2643018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = zoomWidth * 2644018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight / minOutputWidth; 2645018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2646018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } else { 2647018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Adjust the width based on the height 2648018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = fastInfo.arrayHeight / zoomRatio; 2649018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomWidth = zoomHeight * 2650018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth / minOutputHeight; 2651018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2652018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // centering the zoom area within the active area 2653018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2; 2654018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2; 2655018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2656018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d", 2657018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom); 2658018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2659018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2660018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight }; 2661018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin return crop; 2662018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin} 2663018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 26641f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov) 26651f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala const { 26661f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala camera_metadata_ro_entry_t sensorSize = 26671f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2); 26681f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 26691f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 26701f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float arrayAspect = static_cast<float>(fastInfo.arrayWidth) / 26711f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala fastInfo.arrayHeight; 26721f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float stillAspect = static_cast<float>(pictureWidth) / pictureHeight; 26731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect); 26741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 26751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // The crop factors from the full sensor array to the still picture crop 26761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala // region 26771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float horizCropFactor = 1.f; 26781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala float vertCropFactor = 1.f; 26791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 26801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 26811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Need to calculate the still image field of view based on the total pixel 26821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * array field of view, and the relative aspect ratios of the pixel array 26831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * and output streams. 26841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * 26851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Special treatment for quirky definition of crop region and relative 26861f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * stream cropping. 26871f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 26881f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (quirks.meteringCropRegion) { 2689c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Use max of preview and video as first crop 2690c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float previewAspect = static_cast<float>(previewWidth) / previewHeight; 2691c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray float videoAspect = static_cast<float>(videoWidth) / videoHeight; 2692c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (videoAspect > previewAspect) { 2693c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray previewAspect = videoAspect; 2694c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 2695c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // First crop sensor to preview aspect ratio 2696c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (arrayAspect < previewAspect) { 2697c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor = arrayAspect / previewAspect; 2698c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 2699c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor = previewAspect / arrayAspect; 2700c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } 2701c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray // Second crop to still aspect ratio 2702c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray if (stillAspect < previewAspect) { 2703c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray horizCropFactor *= stillAspect / previewAspect; 2704c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray } else { 2705c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray vertCropFactor *= previewAspect / stillAspect; 27061f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 27071f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } else { 27081f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 27091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Crop are just a function of just the still/array relative aspect 27101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * ratios. Since each stream will maximize its area within the crop 27111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * region, and for FOV we assume a full-sensor crop region, we only ever 27121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * crop the FOV either vertically or horizontally, never both. 27131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 27141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor = (arrayAspect > stillAspect) ? 27151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (stillAspect / arrayAspect) : 1.f; 27161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala vertCropFactor = (arrayAspect < stillAspect) ? 27171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (arrayAspect / stillAspect) : 1.f; 27181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 27191f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala ALOGV("Horiz crop factor: %f, vert crop fact: %f", 27201f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala horizCropFactor, vertCropFactor); 27211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala /** 27221f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * Basic field of view formula is: 27231f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * angle of view = 2 * arctangent ( d / 2f ) 27241f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * where d is the physical sensor dimension of interest, and f is 27251f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * the focal length. This only applies to rectilinear sensors, for focusing 27261f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala * at distances >> f, etc. 27271f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala */ 27281f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (horizFov != NULL) { 27291f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *horizFov = 180 / M_PI * 2 * 27301f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(horizCropFactor * sensorSize.data.f[0] / 27311f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 27321f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 27331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala if (vertFov != NULL) { 27341f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala *vertFov = 180 / M_PI * 2 * 27351f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala atanf(vertCropFactor * sensorSize.data.f[1] / 27361f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala (2 * fastInfo.minFocalLength)); 27371f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala } 27381f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala return OK; 27391f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala} 27401f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala 2741ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const { 2742af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin return max; 2743af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin} 2744af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 27452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2 27462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android 2747