Parameters.cpp revision 6f854608d26d7abcce5e46396c7260ed7b250653
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 612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableProcessedSizes = 622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2); 632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableProcessedSizes.count) return NO_INIT; 642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick more intelligently 662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth = availableProcessedSizes.data.i32[0]; 672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewHeight = availableProcessedSizes.data.i32[1]; 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; 782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableProcessedSizes.count; i += 2) { 792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPreviewSizes += ","; 802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes += String8::format("%dx%d", 812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableProcessedSizes.data.i32[i], 822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableProcessedSizes.data.i32[i+1]); 832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes); 862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES, 872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewSizes); 882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFpsRanges = 912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFpsRanges.count) return NO_INIT; 932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFpsRange[0] = availableFpsRanges.data.i32[0]; 952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFpsRange[1] = availableFpsRanges.data.i32[1]; 962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8::format("%d,%d", 99c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala previewFpsRange[0] * kFpsToApiScale, 100c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala previewFpsRange[1] * kFpsToApiScale)); 1012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFpsRange; 1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPreviewFpsRange += ","; 1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFpsRange += String8::format("(%d,%d)", 107c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala availableFpsRanges.data.i32[i] * kFpsToApiScale, 108c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala availableFpsRanges.data.i32[i+1] * kFpsToApiScale); 1092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, 1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFpsRange); 1122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FORMAT, 1162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatEnumToString(previewFormat)); // NV21 1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewTransform = degToTransform(0, 1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala cameraFacing == CAMERA_FACING_FRONT); 1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 1222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 1252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFormats; 1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 1272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFormats.count; i++) { 1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedPreviewFormats += ","; 1292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 1302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFormats.data.i32[i]) { 1312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422SP; 1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: 1402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV422I; 1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: 1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: 1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGB565; 1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: 1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats += 1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_RGBA8888; 1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 1622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableFormats.data.i32[i]); 1642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats); 1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // still have to do something sane for them 1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 175d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala // NOTE: Not scaled like FPS range values are. 176af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]); 1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 178af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin previewFps); 1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 181af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin SortedVector<int32_t> sortedPreviewFrameRates; 182af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFrameRates; 1842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 185af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // from the [min, max] fps range use the max value 186af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int fps = fpsFromRange(availableFpsRanges.data.i32[i], 187af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFpsRanges.data.i32[i+1]); 188af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 189af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // de-dupe frame rates 190af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) { 191af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin sortedPreviewFrameRates.add(fps); 192af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 193af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 194af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin continue; 195af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 196af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 197af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (sortedPreviewFrameRates.size() > 1) { 198af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin supportedPreviewFrameRates += ","; 199af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 200af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 2012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 202af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin fps); 203af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 204af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: Supported preview frame rates: %s", 205af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, supportedPreviewFrameRates.string()); 2062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates); 2092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegSizes = 2122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 2132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 2142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick maximum 2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureWidth = availableJpegSizes.data.i32[0]; 2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight = availableJpegSizes.data.i32[1]; 2182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureSize(pictureWidth, 2202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight); 2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPictureSizes; 2242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 2252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 2272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegSizes.data.i32[i], 2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 2292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 2312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes); 2322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 2362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 2372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbnailSizes = 239f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4); 2402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 2412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick default thumbnail size sensibly 2432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 2442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 2452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 2472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0]); 2482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 2492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1]); 2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedJpegThumbSizes; 2532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 2542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 2552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 2572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 2582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 2602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes); 2612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality = 90; 2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality); 2662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality = 90; 2672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality); 2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation = 0; 2702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation); 2722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsEnabled = false; 2742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcessingMethod = "unknown"; 2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala wbMode = ANDROID_CONTROL_AWB_AUTO; 2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableWhiteBalanceModes = 2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedWhiteBalance; 2852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_AUTO: 2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_INCANDESCENT: 2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 2962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_FLUORESCENT: 2992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 3052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_DAYLIGHT: 3072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_TWILIGHT: 3152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_SHADE: 3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Skipping values not mappable to v1 API 3232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AWB_OFF: 3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance); 3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala effectMode = ANDROID_CONTROL_EFFECT_OFF; 3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE); 3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffects = 3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableEffects.count) return NO_INIT; 3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedEffects; 3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedEffects += ","; 3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_OFF: 3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE; 3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_MONO: 3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_MONO; 3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_NEGATIVE: 3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SOLARIZE: 3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_SEPIA: 3692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SEPIA; 3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_POSTERIZE: 3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_WHITEBOARD: 3772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_BLACKBOARD: 3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_EFFECT_AQUA: 3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_AQUA; 3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableEffects.data.u8[i]); 3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAntibandingModes = 4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableAntibandingModes.count) return NO_INIT; 4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedAntibanding; 4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 4102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_OFF: 4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_50HZ: 4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_60HZ: 4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AE_ANTIBANDING_AUTO: 4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 4302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding); 4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableSceneModes.count) return NO_INIT; 4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool noSceneModes = false; 4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala noSceneModes = true; 4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not in old API 4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableSceneModes.data.u8[i]); 5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!noSceneModes) { 5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes); 5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!flashAvailable.count) return NO_INIT; 5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableAeModes.count) return NO_INIT; 5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (flashAvailable.data.u8[0]) { 5456f854608d26d7abcce5e46396c7260ed7b250653Alex Ray flashMode = Parameters::FLASH_MODE_OFF; 5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 5476f854608d26d7abcce5e46396c7260ed7b250653Alex Ray CameraParameters::FLASH_MODE_OFF); 5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableAeModes.data.u8[i] == 5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) { 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes); 5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala flashMode = Parameters::FLASH_MODE_OFF; 5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1); 5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!minFocusDistance.count) return NO_INIT; 5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAfModes = 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableAfModes.count) return NO_INIT; 5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Fixed-focus lens 5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_FIXED; 5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_AUTO; 5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY); 5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AF_AUTO: 5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AF_MACRO: 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AF_EDOF: 6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 6172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not supported in old API 6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_AF_OFF: 6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableAfModes.data.u8[i]); 6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes); 6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 63295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala shadowFocusMode = FOCUS_MODE_INVALID; 6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t max3aRegions = 6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6387d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin int32_t maxNumFocusAreas = 0; 6397d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (focusMode != Parameters::FOCUS_MODE_FIXED) { 6407d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin maxNumFocusAreas = max3aRegions.data.i32[0]; 6417d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 6427d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas); 6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.clear(); 6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.add(Parameters::Area(0,0,0,0,0)); 6472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS); 6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t sensorSize = 6562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2); 6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!sensorSize.count) return NO_INIT; 6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // The fields of view here assume infinity focus, maximum wide angle 6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float horizFov = 180 / M_PI * 6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength)); 6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float vertFov = 180 / M_PI * 6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength)); 6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 6652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation = 0; 6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation); 6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 6722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2); 6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 6742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 6772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationStep = 6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1); 6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoExposureLock = false; 6892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoWhiteBalanceLock = false; 6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala max3aRegions.data.i32[0]); 7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom = 0; 7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, zoom); 7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 711018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, /*minCount*/1, /*maxCount*/1); 7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 zoomRatios; 7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoom = 1.f; 7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (NUM_ZOOM_STEPS-1); 7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) zoomRatios += ","; 7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom += zoomIncrement; 7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Infinity,Infinity,Infinity"); 7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces); 7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 0); 7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 7462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableVideoStabilizationModes.count) return NO_INIT; 7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala storeMetadataInBuffers = true; 7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala playShutterSound = true; 7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFaceDetect = false; 7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFocusMoveMessages = false; 773da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala afTriggerCounter = 1; 7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala currentAfTriggerId = -1; 7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 776da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala precaptureTriggerCounter = 1; 777da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewCallbackFlags = 0; 7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 780b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala char value[PROPERTY_VALUE_MAX]; 7812f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala property_get("camera.disable_zsl_mode", value, "0"); 782b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala if (!strcmp(value,"1")) { 7832f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala ALOGI("Camera %d: Disabling ZSL mode", cameraId); 784b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala zslMode = false; 7852f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala } else { 7862f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala zslMode = true; 787b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala } 788e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 789e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter lightFx = LIGHTFX_NONE; 790e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter 7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = STOPPED; 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala paramsFlattened = params.flatten(); 7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const { 7998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return paramsFlattened; 8008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 8018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() { 8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t activeArraySize = 8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2); 8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!activeArraySize.count) return NO_INIT; 8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t arrayWidth = activeArraySize.data.i32[0]; 8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t arrayHeight = activeArraySize.data.i32[1]; 8092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFaceDetectModes = 8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES); 8122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFaceDetectModes.count) return NO_INIT; 8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t bestFaceDetectMode = 8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_OFF; 8162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) { 8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFaceDetectModes.data.u8[i]) { 8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_STATS_FACE_DETECTION_OFF: 8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_STATS_FACE_DETECTION_SIMPLE: 8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (bestFaceDetectMode != 8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_FULL) { 8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_SIMPLE; 8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 8272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_STATS_FACE_DETECTION_FULL: 8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_STATS_FACE_DETECTION_FULL; 8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown face detect mode %d:", 8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFaceDetectModes.data.u8[i]); 8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return NO_INIT; 8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxFacesDetected = 8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1); 8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxFacesDetected.count) return NO_INIT; 8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t maxFaces = maxFacesDetected.data.i32[0]; 8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 8468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 8478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t sceneModeOverrides = 8488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES); 8498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 8508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 8518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool fixedLens = (minFocusDistance.data.f[0] == 0); 8528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 8538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count > 0) { 8548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // sceneModeOverrides is defined to have 3 entries for each scene mode, 8558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // which are AE, AWB, and AF override modes the HAL wants for that scene 8568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // mode. 8578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala const size_t kModesPerSceneMode = 3; 8588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeOverrides.count != 8598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count * kModesPerSceneMode) { 8608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override list is an " 8618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala "unexpected size: %d (expected %d)", __FUNCTION__, 8628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, sceneModeOverrides.count, 8638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala availableSceneModes.count); 8648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return NO_INIT; 8658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 8668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (size_t i = 0; i < availableSceneModes.count; i++) { 8678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala DeviceInfo::OverrideModes modes; 8688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t aeMode = 8698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0]; 8708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(aeMode) { 8718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AE_ON: 8728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_OFF; 8738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 8748a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AE_ON_AUTO_FLASH: 8758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_AUTO; 8768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 8778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AE_ON_ALWAYS_FLASH: 8788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_ON; 8798a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 8808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE: 8818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_RED_EYE; 8828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 8838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 8848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__, 8858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala aeMode); 8868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.flashMode = FLASH_MODE_INVALID; 8878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 8888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 8898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.wbMode = 8908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1]; 8918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t afMode = 8928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2]; 8938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch(afMode) { 8948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AF_OFF: 8958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = fixedLens ? 8968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY; 8978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 8988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AF_AUTO: 8998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AF_MACRO: 9008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 9018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 9028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AF_EDOF: 9038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = static_cast<focusMode_t>(afMode); 9048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 9058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 9068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__, 9078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala afMode); 9088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes.focusMode = FOCUS_MODE_INVALID; 9098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala break; 9108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 9118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i], 9128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala modes); 9138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 9148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 9158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayWidth = arrayWidth; 9172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayHeight = arrayHeight; 9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.bestFaceDetectMode = bestFaceDetectMode; 9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces = maxFaces; 9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 923e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() { 924e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala camera_metadata_ro_entry_t entry; 925e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO); 926e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1); 927e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled", 928e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 929e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 930e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT); 931e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1); 932e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled", 933e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala cameraId); 934e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 9357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION); 9367373cbe85e617345f7002256a4be389fe62af913Igor Murashkin quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1); 9377373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion" 9387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " enabled", cameraId); 9397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 940e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala return OK; 941e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala} 942e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala 9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag, 9442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t minCount, size_t maxCount) const { 9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t entry = info->find(tag); 9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (CC_UNLIKELY( entry.count == 0 )) { 9492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x)", 9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag); 9562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (CC_UNLIKELY( 9572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 9582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 9592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 9632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 9642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 9652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 9662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 9672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return entry; 9692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 9702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) { 9722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9748a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala CameraParameters newParams(paramString); 9752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only parameters 9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // such as supported preview sizes, etc. Should probably produce an error if 9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // they're changed. 9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Extract and verify new parameters */ 9812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t i; 9832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters validatedParams(*this); 9852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_SIZE 9872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewSize(&validatedParams.previewWidth, 9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewHeight); 9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewWidth != previewWidth || 9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight != previewHeight) { 9922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 9932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 9942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight, 9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth, validatedParams.previewHeight); 9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewSizes = 10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 10022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 10032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewSizes.data.i32[i] == 10042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth) && 10052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewSizes.data.i32[i+1] == 10062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight)) break; 10072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewSizes.count) { 10092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewWidth, 10112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight); 10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1016af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // RECORDING_HINT (always supported) 1017af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint = boolFromString( 1018af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 1019af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bool recordingHintChanged = validatedParams.recordingHint != recordingHint; 1020af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV_IF(recordingHintChanged, "%s: Recording hint changed to %d", 1021af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, recordingHintChanged); 1022af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FPS_RANGE 10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool fpsRangeChanged = false; 10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0], 10262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewFpsRange[1]); 1027c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[0] /= kFpsToApiScale; 1028c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala validatedParams.previewFpsRange[1] /= kFpsToApiScale; 1029c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala 10302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFpsRange[0] != previewFpsRange[0] || 10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] != previewFpsRange[1]) { 10322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fpsRangeChanged = true; 10332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewFpsRanges = 10342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 10352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 10362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 10372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0]) && 10382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 10392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]) ) { 10402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 10412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 10442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 10452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFpsRange[0], 10462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]); 10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1049af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFps = 1050af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin fpsFromRange(validatedParams.previewFpsRange[0], 1051af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[1]); 10528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.setPreviewFrameRate(validatedParams.previewFps); 10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FORMAT 10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFormat = 10572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatStringToEnum(newParams.getPreviewFormat()); 10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFormat != previewFormat) { 10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 10612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active!", __FUNCTION__); 10622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableFormats.data.i32[i] == validatedParams.previewFormat) 10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableFormats.count) { 10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 10722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), 10732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFormat); 10742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FRAME_RATE 10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Deprecated, only use if the preview fps range is unchanged this time. 10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // The single-value FPS is the same as the minimum of the range. 10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!fpsRangeChanged) { 1082d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala validatedParams.previewFps = newParams.getPreviewFrameRate(); 1083af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (validatedParams.previewFps != previewFps || recordingHintChanged) { 10842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFrameRates = 10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 1086af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin /** 1087af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is set, find the range that encompasses 1088af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * previewFps with the largest min index. 1089af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1090af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * If recording hint is not set, find the range with previewFps 1091af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * with the smallest min index. 1092af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * 1093af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * Either way, in case of multiple ranges, break the tie by 1094af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin * selecting the smaller range. 1095af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin */ 1096af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin int targetFps = validatedParams.previewFps; 1097af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // all ranges which have targetFps 1098af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Vector<Range> candidateRanges; 10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 1100af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = { 1101af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i], 1102af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin availableFrameRates.data.i32[i+1] 1103af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin }; 1104af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1105af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min <= targetFps && targetFps <= r.max) { 1106af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin candidateRanges.push(r); 1107af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1109af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (candidateRanges.isEmpty()) { 11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 11112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFps); 11122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1114af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // most applicable range with targetFps 1115af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range bestRange = candidateRanges[0]; 1116af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin for (i = 1; i < candidateRanges.size(); ++i) { 1117af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin Range r = candidateRanges[i]; 1118af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1119af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by largest minIndex in recording mode 1120af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (validatedParams.recordingHint) { 1121af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min > bestRange.min) { 1122af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1123af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1124af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1125af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1126af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1127af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1128af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin // Find by smallest minIndex in preview mode 1129af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else { 1130af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin if (r.min < bestRange.min) { 1131af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1132af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1133af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 1134af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange = r; 1135af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1136af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1137af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin } 1138af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0] = 1140af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.min; 11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] = 1142af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin bestRange.max; 1143af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 1144af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d", 1145af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin __FUNCTION__, 1146af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[0], 1147af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.previewFpsRange[1], 1148af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin validatedParams.recordingHint); 11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1150260f267288502b73d1920a3701be2038753125b5Eino-Ville Talvala newParams.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 1151260f267288502b73d1920a3701be2038753125b5Eino-Ville Talvala String8::format("%d,%d", 1152260f267288502b73d1920a3701be2038753125b5Eino-Ville Talvala validatedParams.previewFpsRange[0] * kFpsToApiScale, 1153260f267288502b73d1920a3701be2038753125b5Eino-Ville Talvala validatedParams.previewFpsRange[1] * kFpsToApiScale)); 1154af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 11552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PICTURE_SIZE 11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPictureSize(&validatedParams.pictureWidth, 11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.pictureHeight); 11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.pictureWidth == pictureWidth || 11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight == pictureHeight) { 11622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePictureSizes = 11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePictureSizes.data.i32[i] == 11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureWidth) && 11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePictureSizes.data.i32[i+1] == 11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight)) break; 11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePictureSizes.count) { 11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.pictureWidth, 11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight); 11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0] = 11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] = 11822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] || 11842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) { 11852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbSizes = 11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 11872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 11882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableJpegThumbSizes.data.i32[i] == 11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0]) && 11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableJpegThumbSizes.data.i32[i+1] == 11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1])) break; 11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 11952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegThumbSize[0], 11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1]); 11972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 12022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbQuality = 12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 12042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegThumbQuality < 0 || 12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbQuality > 100) { 12062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegThumbQuality); 12082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_QUALITY 12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegQuality = 12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 12142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegQuality < 0 || validatedParams.jpegQuality > 100) { 12152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 12162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegQuality); 12172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ROTATION 12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation = 12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegRotation != 0 && 12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 90 && 12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 180 && 12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 270) { 12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 12282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegRotation); 12292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS 12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLatStr = 12352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLatStr != NULL) { 12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLongStr = 12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsAltitudeStr = 12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 12412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsTimeStr = 12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 12432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsProcMethodStr = 12442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 12452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLongStr == NULL || 12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr == NULL || 12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsTimeStr == NULL || 12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcMethodStr == NULL) { 12492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *endPtr; 12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 12612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 12632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 12642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 12672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr); 12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 12772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsProcessingMethod = gpsProcMethodStr; 12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = true; 12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 12832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = false; 12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EFFECT 12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.effectMode = effectModeStringToEnum( 12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode != effectMode) { 12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffectModes = 12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break; 12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableEffectModes.count) { 12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ANTIBANDING 13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.antibandingMode = abModeStringToEnum( 13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode != antibandingMode) { 13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAbModes = 13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode == availableAbModes.data.u8[i]) 13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAbModes.count) { 13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // SCENE_MODE 13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode = sceneModeStringToEnum( 13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode != sceneMode && 13252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode != 13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) { 13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode == availableSceneModes.data.u8[i]) 13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableSceneModes.count) { 13342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 13362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeSet = 13418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FLASH_MODE 13448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 13458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = 13468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 13478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).flashMode; 13488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 13498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = FLASH_MODE_INVALID; 13508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 13518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.flashMode == FLASH_MODE_INVALID) { 13528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.flashMode = flashModeStringToEnum( 13538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 13548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 13558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode != flashMode) { 13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 13582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1); 13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.flashMode != Parameters::FLASH_MODE_OFF) { 13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 13622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "No flash on device", __FUNCTION__, 13632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 13642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) { 13662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 13672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 13682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 13692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode == availableAeModes.data.u8[i]) 13702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 13712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAeModes.count) { 13732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 13762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == -1) { 13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 13802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 13812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 13858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_FLASH_MODE, 13868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala flashModeEnumToString(validatedParams.flashMode)); 13878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 13888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 13898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // WHITE_BALANCE 13908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 13918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = 13928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 13938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).wbMode; 13948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 13958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = ANDROID_CONTROL_AWB_OFF; 13968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 13978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode == ANDROID_CONTROL_AWB_OFF) { 13988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.wbMode = wbModeStringToEnum( 13998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 14008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 14018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode != wbMode) { 14028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala camera_metadata_ro_entry_t availableWbModes = 14038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 14048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 14058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.wbMode == availableWbModes.data.u8[i]) break; 14068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 14078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (i == availableWbModes.count) { 14088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 14098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, 14108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 14118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 14128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 14138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 14148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_WHITE_BALANCE, 14158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala wbModeEnumToString(validatedParams.wbMode)); 14162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_MODE 14198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (sceneModeSet) { 14208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = 14218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala fastInfo.sceneModeOverrides. 14228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala valueFor(validatedParams.sceneMode).focusMode; 14238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } else { 14248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = FOCUS_MODE_INVALID; 14258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 14268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (validatedParams.focusMode == FOCUS_MODE_INVALID) { 14278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala validatedParams.focusMode = focusModeStringToEnum( 14288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE) ); 14298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != focusMode) { 14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = -1; 14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) { 14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE); 14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "fixed focus lens", 14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.focusMode != 14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY) { 14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocusModes = 14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode == 14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFocusModes.data.u8[i]) break; 14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableFocusModes.count) { 14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 145795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala // Always reset shadow focus mode to avoid reverting settings 145895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala shadowFocusMode = FOCUS_MODE_INVALID; 14598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Update in case of override 14608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala newParams.set(CameraParameters::KEY_FOCUS_MODE, 14618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala focusModeEnumToString(validatedParams.focusMode)); 14622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 14632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = currentAfTriggerId; 14642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_AREAS 14672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 14682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.focusingAreas); 14692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t max3aRegions = 14702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 14712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) res = validateAreas(validatedParams.focusingAreas, 14727d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin max3aRegions, AREA_KIND_FOCUS); 14732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 14742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 14752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 14762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EXPOSURE_COMPENSATION 14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.exposureCompensation = 14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE); 14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((validatedParams.exposureCompensation < 14852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]) || 14862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (validatedParams.exposureCompensation > 14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1])) { 14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.exposureCompensation); 14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 14942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoExposureLock = boolFromString( 14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoWhiteBalanceLock = boolFromString( 14992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // METERING_AREAS 15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.meteringAreas); 15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) { 15057d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin res = validateAreas(validatedParams.meteringAreas, max3aRegions, 15067d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AREA_KIND_METERING); 15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ZOOM 15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 1517709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin if (validatedParams.zoom < 0 1518709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) { 15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.zoom); 15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_SIZE 15252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getVideoSize(&validatedParams.videoWidth, 15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.videoHeight); 15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoWidth != videoWidth || 15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight != videoHeight) { 15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state == RECORD) { 15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoSizes = 15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableVideoSizes.count; i += 2 ) { 15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableVideoSizes.data.i32[i] == 15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoWidth) && 15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableVideoSizes.data.i32[i+1] == 15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight)) break; 15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableVideoSizes.count) { 15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.videoWidth, 15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight); 15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_STABILIZATION 15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoStabilization = boolFromString( 15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoStabilization && 15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableVideoStabilizationModes.count == 1) { 15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Update internal parameters */ 15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *this = validatedParams; 15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala // Need to flatten again in case of overrides 15658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala paramsFlattened = newParams.flatten(); 15668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala params = newParams; 15678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1571da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const { 1572da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 1573da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 1574da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1575da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t metadataMode = ANDROID_REQUEST_METADATA_FULL; 1576da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_REQUEST_METADATA_MODE, 1577da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &metadataMode, 1); 1578da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1579da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1580da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 1581da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala previewFpsRange, 2); 1582da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1583da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 158496150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqWbLock = autoWhiteBalanceLock ? 158596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF; 158696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_LOCK, 158796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqWbLock, 1); 158896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 1589da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_EFFECT_MODE, 1590da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &effectMode, 1); 1591da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1592da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 1593da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &antibandingMode, 1); 1594da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1595da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 159661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // android.hardware.Camera requires that when face detect is enabled, the 159761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // camera is in a face-priority mode. HAL2 splits this into separate parts 159861c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // (face detection statistics and face priority scene mode). Map from other 159961c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala // to the other. 16008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala bool sceneModeActive = 16018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 160261c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala uint8_t reqControlMode = ANDROID_CONTROL_AUTO; 16038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (enableFaceDetect || sceneModeActive) { 160461c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala reqControlMode = ANDROID_CONTROL_USE_SCENE_MODE; 160561c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala } 1606da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_MODE, 1607da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqControlMode, 1); 1608da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 160961c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala 1610d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala uint8_t reqSceneMode = 16118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala sceneModeActive ? sceneMode : 1612d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY : 1613d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala (uint8_t)ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 161461c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala res = request->update(ANDROID_CONTROL_SCENE_MODE, 161561c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala &reqSceneMode, 1); 161661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala if (res != OK) return res; 1617da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1618da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqFlashMode = ANDROID_FLASH_OFF; 16198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t reqAeMode = ANDROID_CONTROL_AE_OFF; 1620da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (flashMode) { 1621da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_OFF: 1622da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqAeMode = ANDROID_CONTROL_AE_ON; break; 1623da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 1624da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqAeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break; 1625da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_ON: 1626da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqAeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break; 1627da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 1628da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqAeMode = ANDROID_CONTROL_AE_ON; 1629da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFlashMode = ANDROID_FLASH_TORCH; 1630da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1631da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 1632da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqAeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break; 1633da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 1634da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 1635da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala cameraId, flashMode); 16368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 1637da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1638da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_FLASH_MODE, 1639da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFlashMode, 1); 1640da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1641da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_MODE, 1642da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqAeMode, 1); 1643da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1644da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 164596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala uint8_t reqAeLock = autoExposureLock ? 164696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF; 164796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_LOCK, 164896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala &reqAeLock, 1); 16498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 16508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 16518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_MODE, 16528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala &wbMode, 1); 16538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala if (res != OK) return res; 165496150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala 1655da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala float reqFocusDistance = 0; // infinity focus in diopters 16568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala uint8_t reqFocusMode = ANDROID_CONTROL_AF_OFF; 1657da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala switch (focusMode) { 1658da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 1659da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 1660da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1661da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1662da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 1663da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusMode = focusMode; 1664da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1665da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 1666da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 1667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusMode = ANDROID_CONTROL_AF_OFF; 1668da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 1669da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala default: 16708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 16718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala cameraId, focusMode); 16728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return BAD_VALUE; 1673da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1674da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_LENS_FOCUS_DISTANCE, 1675da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusDistance, 1); 1676da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1677da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_MODE, 1678da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFocusMode, 1); 1679da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1680da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1681da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqFocusingAreasSize = focusingAreas.size() * 5; 1682da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize]; 1683da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t i = 0; i < reqFocusingAreasSize; i += 5) { 1684da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (focusingAreas[i].weight != 0) { 1685da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 1686da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedXToArray(focusingAreas[i].left); 1687da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 1688da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedYToArray(focusingAreas[i].top); 1689da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 1690da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedXToArray(focusingAreas[i].right); 1691da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 1692da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedYToArray(focusingAreas[i].bottom); 1693da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 1694da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 0] = 0; 1695da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 1] = 0; 1696da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 2] = 0; 1697da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 3] = 0; 1698da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1699da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas[i + 4] = focusingAreas[i].weight; 1700da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1701da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_REGIONS, 1702da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqFocusingAreas, reqFocusingAreasSize); 1703da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1704da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqFocusingAreas; 1705da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1706da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_EXP_COMPENSATION, 1707da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &exposureCompensation, 1); 1708da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1709da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1710da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala size_t reqMeteringAreasSize = meteringAreas.size() * 5; 1711da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize]; 1712da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t i = 0; i < reqMeteringAreasSize; i += 5) { 1713da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (meteringAreas[i].weight != 0) { 1714da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 1715da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedXToArray(meteringAreas[i].left); 1716da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 1717da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedYToArray(meteringAreas[i].top); 1718da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 1719da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedXToArray(meteringAreas[i].right); 1720da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 1721da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala normalizedYToArray(meteringAreas[i].bottom); 1722da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 1723da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 0] = 0; 1724da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 1] = 0; 1725da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 2] = 0; 1726da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 3] = 0; 1727da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1728da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas[i + 4] = meteringAreas[i].weight; 1729da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1730da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_REGIONS, 1731da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas, reqMeteringAreasSize); 1732da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1733da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1734da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_REGIONS, 1735da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqMeteringAreas, reqMeteringAreasSize); 1736da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1737da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala delete[] reqMeteringAreas; 1738da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 17397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin /* don't include jpeg thumbnail size - it's valid for 17407373cbe85e617345f7002256a4be389fe62af913Igor Murashkin it to be set to (0,0), meaning 'no thumbnail' */ 17417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion crop = calculateCropRegion( (CropRegion::Outputs)( 17427373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_PREVIEW | 17437373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_VIDEO | 17447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion::OUTPUT_PICTURE )); 1745018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin int32_t reqCropRegion[3] = { crop.left, crop.top, crop.width }; 1746da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_SCALER_CROP_REGION, 1747da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala reqCropRegion, 3); 1748da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1749da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1750da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqVstabMode = videoStabilization ? 1751da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_ON : 1752da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 1753da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 1754da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqVstabMode, 1); 1755da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1756da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1757da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t reqFaceDetectMode = enableFaceDetect ? 1758da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala fastInfo.bestFaceDetectMode : 1759da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala (uint8_t)ANDROID_STATS_FACE_DETECTION_OFF; 1760da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request->update(ANDROID_STATS_FACE_DETECT_MODE, 1761da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &reqFaceDetectMode, 1); 1762da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) return res; 1763da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1764da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 1765da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 1766da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 1767ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const { 1768ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala status_t res; 1769ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 1770ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE, 1771ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala jpegThumbSize, 2); 1772ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1773ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY, 1774ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegThumbQuality, 1); 1775ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1776ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update(ANDROID_JPEG_QUALITY, 1777ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegQuality, 1); 1778ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1779ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1780ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_ORIENTATION, 1781ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &jpegRotation, 1); 1782ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1783ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 1784ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (gpsEnabled) { 1785ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1786ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 1787ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsCoordinates, 3); 1788ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1789ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1790ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 1791ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala &gpsTimestamp, 1); 1792ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1793ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->update( 1794ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 1795ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala gpsProcessingMethod); 1796ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1797ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } else { 1798ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_COORDINATES); 1799ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1800ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP); 1801ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1802ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 1803ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala if (res != OK) return res; 1804ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala } 1805ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala return OK; 1806ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala} 1807ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 1808ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala 18092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) { 18102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 18112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(state) { 18122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 18132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 18142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 18152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 18172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 18182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 18192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 18202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return "Unknown state!"; 18212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR 18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) { 18272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 18284a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !format ? 18294a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : 18302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 18312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 18322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 18332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 18342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 18352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 18362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 18372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 18382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 18392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 18402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 18412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 18422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 18432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 18442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 18452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 18462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) { 18482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *fmt; 18492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(format) { 18502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 18512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 18522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 18542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 18552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 18572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 18582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 18602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 18612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 18632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 18642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 18662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 18672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 18692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 18702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 18712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 18732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 18742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, format); 18752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = NULL; 18762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 18772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 18782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return fmt; 18792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 18802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 18812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) { 18822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 18834a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !wbMode ? 18844a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala ANDROID_CONTROL_AWB_AUTO : 18852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 18862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_AUTO : 18872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 18882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_INCANDESCENT : 18892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 18902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_FLUORESCENT : 18912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 18922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_WARM_FLUORESCENT : 18932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 18942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_DAYLIGHT : 18952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 18962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT : 18972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 18982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_TWILIGHT : 18992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 19002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AWB_SHADE : 19012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 19022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 19032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) { 19058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (wbMode) { 19068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_AUTO: 19078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_AUTO; 19088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_INCANDESCENT: 19098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_INCANDESCENT; 19108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_FLUORESCENT: 19118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_FLUORESCENT; 19128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_WARM_FLUORESCENT: 19138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 19148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_DAYLIGHT: 19158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_DAYLIGHT; 19168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT: 19178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 19188a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_TWILIGHT: 19198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_TWILIGHT; 19208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case ANDROID_CONTROL_AWB_SHADE: 19218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::WHITE_BALANCE_SHADE; 19228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 19238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown AWB mode enum: %d", 19248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, wbMode); 19258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 19268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 19278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 19288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 19292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) { 19302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 19314a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !effectMode ? 19324a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala ANDROID_CONTROL_EFFECT_OFF : 19332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 19342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_OFF : 19352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 19362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_MONO : 19372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 19382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_NEGATIVE : 19392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 19402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SOLARIZE : 19412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 19422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_SEPIA : 19432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 19442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_POSTERIZE : 19452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 19462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_WHITEBOARD : 19472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 19482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_BLACKBOARD : 19492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 19502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_EFFECT_AQUA : 19512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 19522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 19532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) { 19552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 19564a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !abMode ? 19574a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 19582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 19592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_AUTO : 19602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 19612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_OFF : 19622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 19632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_50HZ : 19642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 19652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_AE_ANTIBANDING_60HZ : 19662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 19672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 19682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) { 19702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 19714a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !sceneMode ? 19724a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 19732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 19742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 19752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 19762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 19772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 19782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 19792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 19802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 19812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 19822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 19832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 19842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 19852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 19862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 19872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 19882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 19892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 19902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 19912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 19922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 19932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 19942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 19952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 19962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 19972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 19982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 19992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 20002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 20012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 20022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 20032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 20042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 20052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 20062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum( 20092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *flashMode) { 20102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 20114a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !flashMode ? 20124a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::FLASH_MODE_INVALID : 20132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 20142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 20152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 20162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 20172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 20182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_ON : 20192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 20202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 20212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 20222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 20232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 20242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) { 20278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (flashMode) { 20288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_OFF: 20298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_OFF; 20308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_AUTO: 20318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_AUTO; 20328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_ON: 20338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_ON; 20348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_RED_EYE: 20358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_RED_EYE; 20368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FLASH_MODE_TORCH: 20378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FLASH_MODE_TORCH; 20388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 20398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown flash mode enum %d", 20408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, flashMode); 20418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 20428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 20438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 20448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 20452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum( 20462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *focusMode) { 20472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 20484a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala !focusMode ? 20494a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID : 20502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 20512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 20522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 20532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 20542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 20552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 20562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 20572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 20582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 20592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 20602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 20612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 20622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 20632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 20642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 20652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) { 20688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala switch (focusMode) { 20698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_AUTO: 20708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_AUTO; 20718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_MACRO: 20728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_MACRO; 20738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_VIDEO: 20748a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 20758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_CONTINUOUS_PICTURE: 20768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 20778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_EDOF: 20788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_EDOF; 20798a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_INFINITY: 20808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_INFINITY; 20818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala case FOCUS_MODE_FIXED: 20828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return CameraParameters::FOCUS_MODE_FIXED; 20838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala default: 20848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala ALOGE("%s: Unknown focus mode enum: %d", 20858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala __FUNCTION__, focusMode); 20868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala return "unknown"; 20878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala } 20888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala} 20898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala 20902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr, 20912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Parameters::Area> *areas) { 20922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 20932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->clear(); 20942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areasCStr == NULL) { 20952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 20962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(); 20972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 20982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 20992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 areasStr(areasCStr); 21002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 21012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala while (areaStart != 0) { 21022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 21032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *numEnd; 21042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int vals[NUM_FIELDS]; 21052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 21062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 21072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 21082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 21092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala area = numEnd + 1; 21102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(Parameters::Area( 21122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 21132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 21142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 21162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas, 21197d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin size_t maxRegions, 21207d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin AreaKind areaKind) const { 21212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Definition of valid area can be found in 21222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // include/camera/CameraParameters.h 21232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 21242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 1) { 21252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas[0].left == 0 && 21262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].top == 0 && 21272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].right == 0 && 21282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].bottom == 0 && 21292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].weight == 0) { 21302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 21312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 21322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21347d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 21357d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin // fixed focus can only set (0,0,0,0,0) focus area 21367d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) { 21377d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin return BAD_VALUE; 21387d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin } 21397d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin 21402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() > maxRegions) { 21412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 21422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, areas.size()); 21432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 21442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 21472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala a != areas.end(); a++) { 21482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 21492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 21502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 21512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 21522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 21532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 21542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 21552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 21572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) { 21602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return !boolStr ? false : 21612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 21622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala false; 21632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) { 21662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!mirror) { 21672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) return 0; 21682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 21692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 21702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 21712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 21722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 21732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 21742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 21752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 21762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 21772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 21782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 21792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 21802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 21822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 21832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return -1; 21842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21867373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const { 21877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds" 21887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", x); 21897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 21907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 21917373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' " 21927373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "is out of bounds (upper = %d)", x, previewCrop.width); 21937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 21947373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = x + previewCrop.left; 21957373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 21967373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth), 21977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value X = '%d' is out of bounds (upper = %d)", 21987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayWidth); 21997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 22007373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22027373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const { 22037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds " 22047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "(lower = 0)", y); 22057373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22067373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 22077373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is " 22087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "out of bounds (upper = %d)", y, previewCrop.height); 22097373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22107373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = y + previewCrop.top; 22117373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22127373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight), 22137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)", 22147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ret, fastInfo.arrayHeight); 22157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 22177373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22187373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22207373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const { 22217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 22227373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (previewCrop.width - 1) / 2000; 22237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22257373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const { 22267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 22277373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (previewCrop.height - 1) / 2000; 22287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22307373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayXToCrop(int x) const { 22317373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 22327373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return x - previewCrop.left; 22337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22357373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayYToCrop(int y) const { 22367373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 22377373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return y - previewCrop.top; 22387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22407373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToNormalized(int x) const { 22417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 22427373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return x * 2000 / (previewCrop.width - 1) - 1000; 22437373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22457373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToNormalized(int y) const { 22467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 22477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return y * 2000 / (previewCrop.height - 1) - 1000; 22487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin} 22497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const { 22517373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = cropXToNormalized(arrayXToCrop(width)); 22527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22537373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of " 22547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "lower bounds %d", ret); 22557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of " 22567373cbe85e617345f7002256a4be389fe62af913Igor Murashkin "upper bounds %d", ret); 22577373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22587373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 22597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 22607373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return width * 2000 / (fastInfo.arrayWidth - 1) - 1000; 22617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 22627373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22637373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 22642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const { 22677373cbe85e617345f7002256a4be389fe62af913Igor Murashkin int ret = cropYToNormalized(arrayYToCrop(height)); 22687373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22697373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of lower bounds" 22707373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " %d", ret); 22717373cbe85e617345f7002256a4be389fe62af913Igor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of upper bounds" 22727373cbe85e617345f7002256a4be389fe62af913Igor Murashkin " %d", ret); 22737373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22747373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 22757373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 22767373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return height * 2000 / (fastInfo.arrayHeight - 1) - 1000; 22777373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 22787373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return ret; 22802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const { 22837373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22847373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 22857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 22867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000; 22877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 22887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return cropXToArray(normalizedXToCrop(x)); 22902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const { 22937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 22947373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if (quirks.meteringCropRegion) { 22957373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000; 22967373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 22977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 22987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin return cropYToArray(normalizedYToCrop(y)); 22992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23017373cbe85e617345f7002256a4be389fe62af913Igor MurashkinParameters::CropRegion Parameters::calculateCropRegion( 23027373cbe85e617345f7002256a4be389fe62af913Igor Murashkin Parameters::CropRegion::Outputs outputs) const { 2303018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2304018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2305018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2306018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Need to convert zoom index into a crop rectangle. The rectangle is 2307018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // chosen to maximize its area on the sensor 2308018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2309018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin camera_metadata_ro_entry_t maxDigitalZoom = 2310018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM); 2311018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // For each zoom step by how many pixels more do we change the zoom 2312018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2313018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (NUM_ZOOM_STEPS-1); 2314018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w) 2315018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // via interpolating zoom step into a zoom ratio 2316018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float zoomRatio = 1 + zoomIncrement * zoom; 2317018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]), 2318018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f", 2319018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomRatio); 2320018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2321018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, " 2322018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin "previewHeight=%d, activeWidth=%d, activeHeight=%d", 2323018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth, 2324018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight); 2325018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2326018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin /* 2327018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * Assumption: On the HAL side each stream buffer calculates its crop 2328018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * rectangle as follows: 2329018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * cropRect = (zoomLeft, zoomRight, 2330018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * zoomWidth, zoomHeight * zoomWidth / outputWidth); 2331018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * 2332018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * Note that if zoomWidth > bufferWidth, the new cropHeight > zoomHeight 2333018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * (we can then get into trouble if the cropHeight > arrayHeight). 2334018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * By selecting the zoomRatio based on the smallest outputRatio, we 2335018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * guarantee this will never happen. 2336018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin */ 2337018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2338018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Enumerate all possible output sizes, select the one with the smallest 2339018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // aspect ratio 2340018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float minOutputWidth, minOutputHeight, minOutputRatio; 2341018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin { 2342018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputSizes[][2] = { 2343018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin { previewWidth, previewHeight }, 2344018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin { videoWidth, videoHeight }, 23457373cbe85e617345f7002256a4be389fe62af913Igor Murashkin { jpegThumbSize[0], jpegThumbSize[1] }, 2346018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin { pictureWidth, pictureHeight }, 2347018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin }; 2348018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2349018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth = outputSizes[0][0]; 2350018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight = outputSizes[0][1]; 2351018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputRatio = minOutputWidth / minOutputHeight; 2352018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin for (unsigned int i = 0; 2353018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin i < sizeof(outputSizes) / sizeof(outputSizes[0]); 2354018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ++i) { 2355018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 23567373cbe85e617345f7002256a4be389fe62af913Igor Murashkin // skip over outputs we don't want to consider for the crop region 23577373cbe85e617345f7002256a4be389fe62af913Igor Murashkin if ( !((1 << i) & outputs) ) { 23587373cbe85e617345f7002256a4be389fe62af913Igor Murashkin continue; 23597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin } 23607373cbe85e617345f7002256a4be389fe62af913Igor Murashkin 2361018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputWidth = outputSizes[i][0]; 2362018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputHeight = outputSizes[i][1]; 2363018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float outputRatio = outputWidth / outputHeight; 2364018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2365018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin if (minOutputRatio > outputRatio) { 2366018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputRatio = outputRatio; 2367018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth = outputWidth; 2368018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight = outputHeight; 2369018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2370018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2371018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // and then use this output ratio instead of preview output ratio 2372018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Enumerating output ratio %f = %f / %f, min is %f", 2373018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin outputRatio, outputWidth, outputHeight, minOutputRatio); 2374018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2375018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2376018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2377018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin /* Ensure that the width/height never go out of bounds 2378018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * by scaling across a diffent dimension if an out-of-bounds 2379018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * possibility exists. 2380018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * 2381018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by 2382018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * calculating the zoomWidth from zoomHeight we'll actually get a 2383018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin * zoomheight > arrayheight 2384018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin */ 2385018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight; 2386018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin if (minOutputRatio >= arrayRatio) { 2387018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Adjust the height based on the width 2388018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomWidth = fastInfo.arrayWidth / zoomRatio; 2389018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = zoomWidth * 2390018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputHeight / minOutputWidth; 2391018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2392018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } else { 2393018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // Adjust the width based on the height 2394018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomHeight = fastInfo.arrayHeight / zoomRatio; 2395018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomWidth = zoomHeight * 2396018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin minOutputWidth / minOutputHeight; 2397018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin } 2398018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin // centering the zoom area within the active area 2399018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2; 2400018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2; 2401018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2402018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d", 2403018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom); 2404018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2405018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2406018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight }; 2407018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin return crop; 2408018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin} 2409018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin 2410af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkinint32_t Parameters::fpsFromRange(int32_t min, int32_t max) const { 2411af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin return max; 2412af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin} 2413af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin 24142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2 24152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android 2416