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 17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-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 2169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Log.h> 2269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Trace.h> 2363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin#include <utils/Vector.h> 2463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin#include <utils/SortedVector.h> 2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <math.h> 272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <stdlib.h> 28c33e4b59c48aff4c531ba33d03066b0fe101b8bfEino-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 58596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala res = buildQuirks(); 59596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala if (res != OK) return res; 60596cb97dff006229f10db8bd7306f4d228f96dfdEino-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", 99b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala previewFpsRange[0] * kFpsToApiScale, 100b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-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)", 107b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala availableFpsRanges.data.i32[i] * kFpsToApiScale, 108b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-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; 15592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_420_888: 15692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala // Flexible YUV allows both YV12 and NV21 15792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala supportedPreviewFormats += 15892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420P; 15992086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala supportedPreviewFormats += ","; 16092086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala supportedPreviewFormats += 16192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_YUV420SP; 16292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala break; 1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats 16492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_BLOB: 1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown preview format: %x", 1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableFormats.data.i32[i]); 1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFormats); 1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but 1822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // still have to do something sane for them 1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 184823b786e8558b7e73d9096cdd629e8896226e422Eino-Ville Talvala // NOTE: Not scaled like FPS range values are. 18563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]); 1862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE, 18763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin previewFps); 1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 19063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin SortedVector<int32_t> sortedPreviewFrameRates; 19163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 1922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPreviewFrameRates; 1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableFpsRanges.count; i += 2) { 19463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin // from the [min, max] fps range use the max value 19563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin int fps = fpsFromRange(availableFpsRanges.data.i32[i], 19663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin availableFpsRanges.data.i32[i+1]); 19763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 19863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin // de-dupe frame rates 19963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) { 20063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin sortedPreviewFrameRates.add(fps); 20163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 20263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin else { 20363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin continue; 20463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 20563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 20663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (sortedPreviewFrameRates.size() > 1) { 20763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin supportedPreviewFrameRates += ","; 20863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 20963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 2102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates += String8::format("%d", 21163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin fps); 21263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 21363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin ALOGV("%s: Supported preview frame rates: %s", 21463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin __FUNCTION__, supportedPreviewFrameRates.string()); 2152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, 2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPreviewFrameRates); 2182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegSizes = 2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2); 2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegSizes.count) return NO_INIT; 2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick maximum 2252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureWidth = availableJpegSizes.data.i32[0]; 2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight = availableJpegSizes.data.i32[1]; 2272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureSize(pictureWidth, 2292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala pictureHeight); 2302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedPictureSizes; 2332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegSizes.count; i += 2) { 2342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedPictureSizes += ","; 2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes += String8::format("%dx%d", 2362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegSizes.data.i32[i], 2372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegSizes.data.i32[i+1]); 2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 2402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedPictureSizes); 2412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 2442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 2452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_JPEG); 2462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbnailSizes = 248a1e4e309e9a32afa3a26576fa592789168db182eEino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4); 2492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableJpegThumbnailSizes.count) return NO_INIT; 2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Pick default thumbnail size sensibly 2522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0]; 2532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1]; 2542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[0]); 2572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 2582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbSize[1]); 2592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedJpegThumbSizes; 2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) { 2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i != 0) supportedJpegThumbSizes += ","; 2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes += String8::format("%dx%d", 2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i], 2662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableJpegThumbnailSizes.data.i32[i+1]); 2672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedJpegThumbSizes); 2702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality = 90; 2732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, 2742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegThumbQuality); 2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality = 90; 2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_JPEG_QUALITY, 2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegQuality); 2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation = 0; 2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ROTATION, 2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala jpegRotation); 2812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsEnabled = false; 2834cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala gpsCoordinates[0] = 0.0; 2844cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala gpsCoordinates[1] = 0.0; 2854cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala gpsCoordinates[2] = 0.0; 2864cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala gpsTimestamp = 0; 2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcessingMethod = "unknown"; 2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS fields in CameraParameters are not set by implementation 2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2902d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin wbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_WHITE_BALANCE, 2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO); 2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableWhiteBalanceModes = 2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 2962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedWhiteBalance; 2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 2992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableWhiteBalanceModes.count; i++) { 3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedWhiteBalance += ","; 3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableWhiteBalanceModes.data.u8[i]) { 3032d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_AUTO; 3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3072d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 3082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_INCANDESCENT; 3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3112d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_FLUORESCENT; 3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3192d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_DAYLIGHT; 3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3232d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3272d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_TWILIGHT; 3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance += 3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::WHITE_BALANCE_SHADE; 3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Skipping values not mappable to v1 API 3362d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_OFF: 3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown white balance value: %d", 3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableWhiteBalanceModes.data.u8[i]); 3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedWhiteBalance); 3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3512d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EFFECT, 3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE); 3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffects = 3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableEffects.count) return NO_INIT; 3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedEffects; 3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableEffects.count; i++) { 3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedEffects += ","; 3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableEffects.data.u8[i]) { 3652d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_OFF: 3662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NONE; 3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3692d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_MONO: 3702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_MONO; 3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3732d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE: 3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_NEGATIVE; 3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3772d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE: 3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SOLARIZE; 3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3812d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_SEPIA: 3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_SEPIA; 3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3852d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE: 3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_POSTERIZE; 3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3892d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD: 3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_WHITEBOARD; 3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3932d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD: 3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_BLACKBOARD; 3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 3972d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_EFFECT_MODE_AQUA: 3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedEffects += 3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::EFFECT_AQUA; 4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown effect value: %d", 4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableEffects.data.u8[i]); 4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects); 4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4112d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ANTIBANDING, 4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO); 4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAntibandingModes = 4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableAntibandingModes.count) return NO_INIT; 4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedAntibanding; 4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAntibandingModes.count; i++) { 4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedAntibanding += ","; 4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAntibandingModes.data.u8[i]) { 4252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF: 4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_OFF; 4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ: 4302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_50HZ; 4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ: 4342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_60HZ; 4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO: 4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding += 4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::ANTIBANDING_AUTO; 4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown antibanding value: %d", 4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableAntibandingModes.data.u8[i]); 4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, 4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedAntibanding); 4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 453c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SCENE_MODE, 4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_AUTO); 4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableSceneModes.count) return NO_INIT; 4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO); 4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool noSceneModes = false; 4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableSceneModes.count; i++) { 4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedSceneModes += ","; 4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableSceneModes.data.u8[i]) { 4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala noSceneModes = true; 4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not in old API 4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_ACTION: 4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_ACTION; 4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PORTRAIT: 4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PORTRAIT; 4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE: 4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_LANDSCAPE; 4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT: 4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT; 4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT: 4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_NIGHT_PORTRAIT; 4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_THEATRE: 4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_THEATRE; 4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BEACH: 5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BEACH; 5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SNOW: 5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SNOW; 5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SUNSET: 5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SUNSET; 5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO: 5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_STEADYPHOTO; 5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_FIREWORKS: 5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_FIREWORKS; 5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_SPORTS: 5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_SPORTS; 5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_PARTY: 5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_PARTY; 5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT: 5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_CANDLELIGHT; 5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case ANDROID_CONTROL_SCENE_MODE_BARCODE: 5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes += 5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::SCENE_MODE_BARCODE; 5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown scene mode value: %d", 5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableSceneModes.data.u8[i]); 5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!noSceneModes) { 5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedSceneModes); 546b08a63931f22a1e934b32e8fb8de9ab4877d5258Igor Murashkin } else { 547b08a63931f22a1e934b32e8fb8de9ab4877d5258Igor Murashkin params.remove(CameraParameters::KEY_SCENE_MODE); 5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 5522d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1); 5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!flashAvailable.count) return NO_INIT; 5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableAeModes.count) return NO_INIT; 5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (flashAvailable.data.u8[0]) { 5602814a4dc0dd45007ce62871af08b98214cd1692cAlex Ray flashMode = Parameters::FLASH_MODE_OFF; 5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 5622814a4dc0dd45007ce62871af08b98214cd1692cAlex Ray CameraParameters::FLASH_MODE_OFF); 5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF); 5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + 5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_AUTO + 5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_ON + 5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "," + CameraParameters::FLASH_MODE_TORCH; 5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAeModes.count; i++) { 5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableAeModes.data.u8[i] == 5712d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes = supportedFlashModes + "," + 5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_RED_EYE; 5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFlashModes); 5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala flashMode = Parameters::FLASH_MODE_OFF; 5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FLASH_MODE, 5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FLASH_MODE_OFF); 5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 5882d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 1, 1); 5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!minFocusDistance.count) return NO_INIT; 5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAfModes = 5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableAfModes.count) return NO_INIT; 5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Fixed-focus lens 5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_FIXED; 5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_FIXED); 6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusMode = Parameters::FOCUS_MODE_AUTO; 6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_MODE, 6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO); 6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY); 6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = true; 6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < availableAfModes.count; i++) { 6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) supportedFocusModes += ","; 6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableAfModes.data.u8[i]) { 6132d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_AUTO; 6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6172d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_MACRO; 6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6212d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes += 6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FOCUS_MODE_EDOF; 6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Not supported in old API 6342d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 6382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("%s: Camera %d: Unknown AF mode value: %d", 6392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, availableAfModes.data.u8[i]); 6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = false; 6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala supportedFocusModes); 6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 647f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 6484c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala shadowFocusMode = FOCUS_MODE_INVALID; 6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t max3aRegions = 6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1); 6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!max3aRegions.count) return NO_INIT; 6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 654572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin int32_t maxNumFocusAreas = 0; 655572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin if (focusMode != Parameters::FOCUS_MODE_FIXED) { 656572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin maxNumFocusAreas = max3aRegions.data.i32[0]; 657572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin } 658572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas); 6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_AREAS, 6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.clear(); 6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala focusingAreas.add(Parameters::Area(0,0,0,0,0)); 6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 6652d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS); 6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float minFocalLength = availableFocalLengths.data.f[0]; 6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength); 6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 671a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala float horizFov, vertFov; 672a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 673a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (res != OK) { 674a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala ALOGE("%s: Can't calculate field of views!", __FUNCTION__); 675a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala return res; 676a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 6772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov); 6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov); 6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation = 0; 6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, 6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensation); 6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 6862d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2); 6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationRange.count) return NO_INIT; 6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, 6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1]); 6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, 6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]); 6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationStep = 6952d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1); 6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!exposureCompensationStep.count) return NO_INIT; 6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, 6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (float)exposureCompensationStep.data.r[0].numerator / 7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationStep.data.r[0].denominator); 7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoExposureLock = false; 7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, 7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, 7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala autoWhiteBalanceLock = false; 7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, 7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, 7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0)); 7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, 7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala max3aRegions.data.i32[0]); 7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_METERING_AREAS, 7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "(0,0,0,0,0)"); 7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom = 0; 7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM, zoom); 7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1); 7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxDigitalZoom = 7252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1); 7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxDigitalZoom.count) return NO_INIT; 7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala { 7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 zoomRatios; 7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoom = 1.f; 7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) / 7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (NUM_ZOOM_STEPS-1); 7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool addComma = false; 7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i=0; i < NUM_ZOOM_STEPS; i++) { 7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (addComma) zoomRatios += ","; 7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala addComma = true; 7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoomRatios += String8::format("%d", static_cast<int>(zoom * 100)); 7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala zoom += zoomIncrement; 7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios); 7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_ZOOM_SUPPORTED, 7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, 7460ad293aac9af377606fb4aa752b95547a8462791Igor Murashkin CameraParameters::FALSE); 7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_FOCUS_DISTANCES, 7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Infinity,Infinity,Infinity"); 7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, 7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces); 7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, 7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 0); 7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE); 7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7594cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala recordingHint = false; 7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_RECORDING_HINT, 7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, 7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7664cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala videoStabilization = false; 7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION, 7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableVideoStabilizationModes.count) return NO_INIT; 7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (availableVideoStabilizationModes.count > 1) { 7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::TRUE); 7772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, 7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CameraParameters::FALSE); 7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Set up initial state for non-Camera.Parameters state variables 7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala storeMetadataInBuffers = true; 7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala playShutterSound = true; 7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFaceDetect = false; 7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala enableFocusMoveMessages = false; 78969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala afTriggerCounter = 1; 7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala currentAfTriggerId = -1; 7914cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala afInMotion = false; 7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 79369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala precaptureTriggerCounter = 1; 79469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewCallbackFlags = 0; 7964cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala previewCallbackOneShot = false; 7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 798059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin camera_metadata_ro_entry_t supportedHardwareLevel = 799059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin staticInfo(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL); 800059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin if (!supportedHardwareLevel.count || (supportedHardwareLevel.data.u8[0] == 801059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)) { 802059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin ALOGI("Camera %d: ZSL mode disabled for limited mode HALs", cameraId); 803c33e4b59c48aff4c531ba33d03066b0fe101b8bfEino-Ville Talvala zslMode = false; 804a2acc96eadc02228b8a3366de3d05d3a6a81272cEino-Ville Talvala } else { 805059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin char value[PROPERTY_VALUE_MAX]; 806059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin property_get("camera.disable_zsl_mode", value, "0"); 807059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin if (!strcmp(value,"1")) { 808059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin ALOGI("Camera %d: Disabling ZSL mode", cameraId); 809059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin zslMode = false; 810059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin } else { 811059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin zslMode = true; 812059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin } 813c33e4b59c48aff4c531ba33d03066b0fe101b8bfEino-Ville Talvala } 814c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 815c3dbf1a40df85b75e5805382838a90416f69730fJames Painter lightFx = LIGHTFX_NONE; 816c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala state = STOPPED; 8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala paramsFlattened = params.flatten(); 8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 824c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville TalvalaString8 Parameters::get() const { 825c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return paramsFlattened; 826c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala} 827c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() { 8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t activeArraySize = 8312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 2); 8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!activeArraySize.count) return NO_INIT; 8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t arrayWidth = activeArraySize.data.i32[0]; 8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t arrayHeight = activeArraySize.data.i32[1]; 8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFaceDetectModes = 8372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES); 8382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!availableFaceDetectModes.count) return NO_INIT; 8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala uint8_t bestFaceDetectMode = 8412d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) { 8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch (availableFaceDetectModes.data.u8[i]) { 8442d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF: 8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 8462d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE: 8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (bestFaceDetectMode != 8482d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) { 8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 8502d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE; 8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 8532d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL: 8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bestFaceDetectMode = 8552d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_STATISTICS_FACE_DETECT_MODE_FULL; 8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown face detect mode %d:", 8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, cameraId, 8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFaceDetectModes.data.u8[i]); 8612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return NO_INIT; 8622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t maxFacesDetected = 8662d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1, 1); 8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!maxFacesDetected.count) return NO_INIT; 8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int32_t maxFaces = maxFacesDetected.data.i32[0]; 8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 871c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 872c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 873c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala camera_metadata_ro_entry_t sceneModeOverrides = 874c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES); 875c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 8762d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE); 877c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala bool fixedLens = (minFocusDistance.data.f[0] == 0); 878c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 879a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 880a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS); 881a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 882a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 88392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 88492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 88592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala if (!availableFormats.count) return NO_INIT; 88692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala 88792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala 888c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (sceneModeOverrides.count > 0) { 889c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // sceneModeOverrides is defined to have 3 entries for each scene mode, 890c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // which are AE, AWB, and AF override modes the HAL wants for that scene 891c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // mode. 892c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala const size_t kModesPerSceneMode = 3; 893c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (sceneModeOverrides.count != 894c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala availableSceneModes.count * kModesPerSceneMode) { 895c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Camera %d: Scene mode override list is an " 896c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala "unexpected size: %d (expected %d)", __FUNCTION__, 897c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala cameraId, sceneModeOverrides.count, 898c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala availableSceneModes.count); 899c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return NO_INIT; 900c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 901c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala for (size_t i = 0; i < availableSceneModes.count; i++) { 902c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala DeviceInfo::OverrideModes modes; 903c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala uint8_t aeMode = 904c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0]; 905c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala switch(aeMode) { 9062d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_MODE_ON: 907c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.flashMode = FLASH_MODE_OFF; 908c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 9092d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH: 910c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.flashMode = FLASH_MODE_AUTO; 911c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 9122d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH: 913c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.flashMode = FLASH_MODE_ON; 914c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 9152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: 916c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.flashMode = FLASH_MODE_RED_EYE; 917c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 918c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala default: 919c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__, 920c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala aeMode); 921c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.flashMode = FLASH_MODE_INVALID; 922c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 923c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 924c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.wbMode = 925c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1]; 926c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala uint8_t afMode = 927c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2]; 928c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala switch(afMode) { 9292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_OFF: 930c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.focusMode = fixedLens ? 931c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY; 932c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 9332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_AUTO: 9342d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_MACRO: 9352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 9362d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 9372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AF_MODE_EDOF: 938c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.focusMode = static_cast<focusMode_t>(afMode); 939c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 940c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala default: 941c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__, 942c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala afMode); 943c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes.focusMode = FOCUS_MODE_INVALID; 944c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala break; 945c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 946c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i], 947c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala modes); 948c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 949c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 950c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayWidth = arrayWidth; 9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.arrayHeight = arrayHeight; 9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.bestFaceDetectMode = bestFaceDetectMode; 9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fastInfo.maxFaces = maxFaces; 955a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 956a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala // Find smallest (widest-angle) focal length to use as basis of still 957a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala // picture FOV reporting. 958a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[0]; 959a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala for (size_t i = 1; i < availableFocalLengths.count; i++) { 960a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) { 961a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala fastInfo.minFocalLength = availableFocalLengths.data.f[i]; 962a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 963a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 964a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 96592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888 96692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala fastInfo.useFlexibleYuv = false; 96792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala for (size_t i = 0; i < availableFormats.count; i++) { 96892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala if (availableFormats.data.i32[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) { 96992086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala fastInfo.useFlexibleYuv = true; 97092086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala break; 97192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala } 97292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala } 97392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala ALOGV("Camera %d: Flexible YUV %s supported", 97492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala cameraId, fastInfo.useFlexibleYuv ? "is" : "is not"); 97592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala 9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 979596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvalastatus_t Parameters::buildQuirks() { 980596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala camera_metadata_ro_entry_t entry; 981596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO); 982596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1); 983596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled", 984596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala cameraId); 985596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala 986596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT); 987596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1); 988596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled", 989596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala cameraId); 990596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala 9913a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION); 9923a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1); 9933a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion" 9943a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin " enabled", cameraId); 9953a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 996596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala return OK; 997596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala} 998596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala 9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag, 100037b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin size_t minCount, size_t maxCount, bool required) const { 10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t entry = info->find(tag); 10022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 100337b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin if (CC_UNLIKELY( entry.count == 0 ) && required) { 10042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 10052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 10062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 10072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Error finding static metadata entry '%s.%s' (%x)", 10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag); 10112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (CC_UNLIKELY( 10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (minCount != 0 && entry.count < minCount) || 10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (maxCount != 0 && entry.count > maxCount) ) ) { 10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagSection = get_camera_metadata_section_name(tag); 10152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagSection == NULL) tagSection = "<unknown>"; 10162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* tagName = get_camera_metadata_tag_name(tag); 10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (tagName == NULL) tagName = "<unknown>"; 10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("Malformed static metadata entry '%s.%s' (%x):" 10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "Expected between %d and %d values, but got %d values", 10202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala tagSection, tagName, tag, minCount, maxCount, entry.count); 10212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return entry; 10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1026c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalastatus_t Parameters::set(const String8& paramString) { 10272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala status_t res; 10282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1029c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala CameraParameters newParams(paramString); 10302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // TODO: Currently ignoring any changes to supposedly read-only parameters 10322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // such as supported preview sizes, etc. Should probably produce an error if 10332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // they're changed. 10342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Extract and verify new parameters */ 10362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t i; 10382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters validatedParams(*this); 10402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_SIZE 10422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewSize(&validatedParams.previewWidth, 10432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewHeight); 10442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 10452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewWidth != previewWidth || 10462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight != previewHeight) { 10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview size cannot be updated when preview " 10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active! (Currently %d x %d, requested %d x %d", 10502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 10512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala previewWidth, previewHeight, 10522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth, validatedParams.previewHeight); 10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 10542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewSizes = 10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 10572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewSizes.count; i += 2 ) { 10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewSizes.data.i32[i] == 10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewWidth) && 10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewSizes.data.i32[i+1] == 10612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight)) break; 10622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewSizes.count) { 10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview size %d x %d is not supported", 10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewWidth, 10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewHeight); 10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 107163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin // RECORDING_HINT (always supported) 107263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin validatedParams.recordingHint = boolFromString( 107363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin newParams.get(CameraParameters::KEY_RECORDING_HINT) ); 107463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin bool recordingHintChanged = validatedParams.recordingHint != recordingHint; 107563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin ALOGV_IF(recordingHintChanged, "%s: Recording hint changed to %d", 107663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin __FUNCTION__, recordingHintChanged); 107763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FPS_RANGE 10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala bool fpsRangeChanged = false; 10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0], 10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.previewFpsRange[1]); 1082b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala validatedParams.previewFpsRange[0] /= kFpsToApiScale; 1083b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala validatedParams.previewFpsRange[1] /= kFpsToApiScale; 1084b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala 10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFpsRange[0] != previewFpsRange[0] || 10862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] != previewFpsRange[1]) { 10872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fpsRangeChanged = true; 10882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePreviewFpsRanges = 10892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2); 10902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePreviewFpsRanges.count; i += 2) { 10912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePreviewFpsRanges.data.i32[i] == 10922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0]) && 10932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePreviewFpsRanges.data.i32[i+1] == 10942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]) ) { 10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 10962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 10982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePreviewFpsRanges.count) { 10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview FPS range %d - %d is not supported", 11002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFpsRange[0], 11012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1]); 11022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 110463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin validatedParams.previewFps = 110563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin fpsFromRange(validatedParams.previewFpsRange[0], 110663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin validatedParams.previewFpsRange[1]); 1107c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.setPreviewFrameRate(validatedParams.previewFps); 11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FORMAT 11112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFormat = 11122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala formatStringToEnum(newParams.getPreviewFormat()); 11132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.previewFormat != previewFormat) { 11142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state >= PREVIEW) { 11152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Preview format cannot be updated when preview " 11162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "is active!", __FUNCTION__); 11172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFormats = 11202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS); 112192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala // If using flexible YUV, always support NV21/YV12. Otherwise, check 112292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala // HAL's list. 112392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala if (! (fastInfo.useFlexibleYuv && 112492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala (validatedParams.previewFormat == 112592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP || 112692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala validatedParams.previewFormat == 112792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12) ) ) { 112892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala // Not using flexible YUV format, so check explicitly 112992086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala for (i = 0; i < availableFormats.count; i++) { 113092086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala if (availableFormats.data.i32[i] == 113192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala validatedParams.previewFormat) break; 113292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala } 113392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala if (i == availableFormats.count) { 113492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala ALOGE("%s: Requested preview format %s (0x%x) is not supported", 113592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala __FUNCTION__, newParams.getPreviewFormat(), 113692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala validatedParams.previewFormat); 113792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala return BAD_VALUE; 113892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala } 11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PREVIEW_FRAME_RATE 11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Deprecated, only use if the preview fps range is unchanged this time. 11442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // The single-value FPS is the same as the minimum of the range. 11452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!fpsRangeChanged) { 1146823b786e8558b7e73d9096cdd629e8896226e422Eino-Ville Talvala validatedParams.previewFps = newParams.getPreviewFrameRate(); 114763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (validatedParams.previewFps != previewFps || recordingHintChanged) { 11482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFrameRates = 11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); 115063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin /** 115163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * If recording hint is set, find the range that encompasses 115263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * previewFps with the largest min index. 115363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * 115463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * If recording hint is not set, find the range with previewFps 115563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * with the smallest min index. 115663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * 115763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * Either way, in case of multiple ranges, break the tie by 115863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin * selecting the smaller range. 115963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin */ 116063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin int targetFps = validatedParams.previewFps; 116163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin // all ranges which have targetFps 116263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin Vector<Range> candidateRanges; 11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFrameRates.count; i+=2) { 116463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin Range r = { 116563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin availableFrameRates.data.i32[i], 116663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin availableFrameRates.data.i32[i+1] 116763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin }; 116863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 116963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (r.min <= targetFps && targetFps <= r.max) { 117063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin candidateRanges.push(r); 117163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 117363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (candidateRanges.isEmpty()) { 11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested preview frame rate %d is not supported", 11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.previewFps); 11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 117863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin // most applicable range with targetFps 117963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin Range bestRange = candidateRanges[0]; 118063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin for (i = 1; i < candidateRanges.size(); ++i) { 118163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin Range r = candidateRanges[i]; 118263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 118363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin // Find by largest minIndex in recording mode 118463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (validatedParams.recordingHint) { 118563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (r.min > bestRange.min) { 118663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin bestRange = r; 118763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 118863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 118963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin bestRange = r; 119063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 119163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 119263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin // Find by smallest minIndex in preview mode 119363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin else { 119463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin if (r.min < bestRange.min) { 119563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin bestRange = r; 119663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 119763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin else if (r.min == bestRange.min && r.max < bestRange.max) { 119863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin bestRange = r; 119963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 120063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 120163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin } 120263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[0] = 120463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin bestRange.min; 12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.previewFpsRange[1] = 120663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin bestRange.max; 120763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 120863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d", 120963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin __FUNCTION__, 121063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin validatedParams.previewFpsRange[0], 121163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin validatedParams.previewFpsRange[1], 121263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin validatedParams.recordingHint); 12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 121402b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala newParams.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 121502b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala String8::format("%d,%d", 121602b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala validatedParams.previewFpsRange[0] * kFpsToApiScale, 121702b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala validatedParams.previewFpsRange[1] * kFpsToApiScale)); 121863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 12192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // PICTURE_SIZE 12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getPictureSize(&validatedParams.pictureWidth, 12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.pictureHeight); 12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.pictureWidth == pictureWidth || 12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight == pictureHeight) { 12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availablePictureSizes = 12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES); 12282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availablePictureSizes.count; i+=2) { 12292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availablePictureSizes.data.i32[i] == 12302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureWidth) && 12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availablePictureSizes.data.i32[i+1] == 12322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight)) break; 12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availablePictureSizes.count) { 12352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture size %d x %d is not supported", 12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.pictureWidth, 12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.pictureHeight); 12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_WIDTH/HEIGHT 12432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0] = 12442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 12452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] = 12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] || 12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) { 12492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableJpegThumbSizes = 12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES); 12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableJpegThumbSizes.count; i+=2) { 12522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableJpegThumbSizes.data.i32[i] == 12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[0]) && 12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableJpegThumbSizes.data.i32[i+1] == 12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1])) break; 12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableJpegThumbSizes.count) { 12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported", 12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegThumbSize[0], 12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegThumbSize[1]); 12612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_THUMBNAIL_QUALITY 1266eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 1267eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala // also makes sure quality fits in uint8_t 1268eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala if (quality < 0 || quality > 100) { 12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG thumbnail quality %d is not supported", 1270eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala __FUNCTION__, quality); 12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1273eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala validatedParams.jpegThumbQuality = quality; 12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // JPEG_QUALITY 1276eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 1277eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala // also makes sure quality fits in uint8_t 1278eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala if (quality < 0 || quality > 100) { 12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested JPEG quality %d is not supported", 1280eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala __FUNCTION__, quality); 12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1283eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala validatedParams.jpegQuality = quality; 12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ROTATION 12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation = 12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_ROTATION); 12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.jpegRotation != 0 && 12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 90 && 12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 180 && 12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.jpegRotation != 270) { 12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested picture rotation angle %d is not supported", 12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.jpegRotation); 12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // GPS 12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLatStr = 13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LATITUDE); 13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLatStr != NULL) { 13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsLongStr = 13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_LONGITUDE); 13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsAltitudeStr = 13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_ALTITUDE); 13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsTimeStr = 13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_TIMESTAMP); 13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *gpsProcMethodStr = 13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (gpsLongStr == NULL || 13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr == NULL || 13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsTimeStr == NULL || 13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsProcMethodStr == NULL) { 13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Incomplete set of GPS parameters provided", 13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *endPtr; 13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr); 13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLatStr) { 13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr); 13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr); 13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsLongStr) { 13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr); 13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr); 13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsAltitudeStr) { 13342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__, 13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala gpsAltitudeStr); 13362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10); 13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || endPtr == gpsTimeStr) { 13412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr); 13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsProcessingMethod = gpsProcMethodStr; 13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = true; 13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.gpsEnabled = false; 13492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EFFECT 13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.effectMode = effectModeStringToEnum( 13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode != effectMode) { 13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableEffectModes = 13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS); 13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableEffectModes.count; i++) { 13582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break; 13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableEffectModes.count) { 13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested effect mode \"%s\" is not supported", 13622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 13632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_EFFECT) ); 13642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ANTIBANDING 13692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.antibandingMode = abModeStringToEnum( 13702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING) ); 13712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode != antibandingMode) { 13722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAbModes = 13732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES); 13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAbModes.count; i++) { 13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.antibandingMode == availableAbModes.data.u8[i]) 13762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAbModes.count) { 13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested antibanding mode \"%s\" is not supported", 13802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 13812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_ANTIBANDING)); 13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // SCENE_MODE 13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode = sceneModeStringToEnum( 13882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE) ); 13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode != sceneMode && 13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.sceneMode != 13912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) { 13922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableSceneModes = 13932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES); 13942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableSceneModes.count; i++) { 13952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.sceneMode == availableSceneModes.data.u8[i]) 13962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 13972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 13982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableSceneModes.count) { 13992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested scene mode \"%s\" is not supported", 14002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_SCENE_MODE)); 14022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1405c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala bool sceneModeSet = 1406c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 14072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FLASH_MODE 1409c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (sceneModeSet) { 1410c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.flashMode = 1411c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala fastInfo.sceneModeOverrides. 1412c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala valueFor(validatedParams.sceneMode).flashMode; 1413c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } else { 1414c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.flashMode = FLASH_MODE_INVALID; 1415c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 1416c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (validatedParams.flashMode == FLASH_MODE_INVALID) { 1417c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.flashMode = flashModeStringToEnum( 1418c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE) ); 1419c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 1420c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 14212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode != flashMode) { 14222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t flashAvailable = 14232d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1); 14242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!flashAvailable.data.u8[0] && 14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.flashMode != Parameters::FLASH_MODE_OFF) { 14262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported: " 14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "No flash on device", __FUNCTION__, 14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) { 14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableAeModes = 14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES); 14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableAeModes.count; i++) { 14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.flashMode == availableAeModes.data.u8[i]) 14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableAeModes.count) { 14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is not supported", 14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.flashMode == -1) { 14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested flash mode \"%s\" is unknown", 14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FLASH_MODE)); 14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1449c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // Update in case of override 1450c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.set(CameraParameters::KEY_FLASH_MODE, 1451c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala flashModeEnumToString(validatedParams.flashMode)); 1452c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 1453c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 1454c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // WHITE_BALANCE 1455c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (sceneModeSet) { 1456c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.wbMode = 1457c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala fastInfo.sceneModeOverrides. 1458c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala valueFor(validatedParams.sceneMode).wbMode; 1459c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } else { 14602d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF; 1461c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 14622d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) { 1463c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.wbMode = wbModeStringToEnum( 1464c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE) ); 1465c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 1466c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (validatedParams.wbMode != wbMode) { 1467c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala camera_metadata_ro_entry_t availableWbModes = 1468c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES); 1469c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala for (i = 0; i < availableWbModes.count; i++) { 1470c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (validatedParams.wbMode == availableWbModes.data.u8[i]) break; 1471c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 1472c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (i == availableWbModes.count) { 1473c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Requested white balance mode %s is not supported", 1474c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala __FUNCTION__, 1475c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.get(CameraParameters::KEY_WHITE_BALANCE)); 1476c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return BAD_VALUE; 1477c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 1478c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // Update in case of override 1479c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.set(CameraParameters::KEY_WHITE_BALANCE, 1480c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala wbModeEnumToString(validatedParams.wbMode)); 14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_MODE 1484c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (sceneModeSet) { 1485c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.focusMode = 1486c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala fastInfo.sceneModeOverrides. 1487c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala valueFor(validatedParams.sceneMode).focusMode; 1488c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } else { 1489c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.focusMode = FOCUS_MODE_INVALID; 1490c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 1491c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (validatedParams.focusMode == FOCUS_MODE_INVALID) { 1492c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala validatedParams.focusMode = focusModeStringToEnum( 1493c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE) ); 1494c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != focusMode) { 14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = -1; 14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) { 14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t minFocusDistance = 14992d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE); 15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (minFocusDistance.data.f[0] == 0) { 15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not available: " 15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala "fixed focus lens", 15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (validatedParams.focusMode != 15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY) { 15082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableFocusModes = 15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES); 15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableFocusModes.count; i++) { 15112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.focusMode == 15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableFocusModes.data.u8[i]) break; 15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableFocusModes.count) { 15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus mode \"%s\" is not supported", 15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_FOCUS_MODE)); 15182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 1522f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; 15234c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala // Always reset shadow focus mode to avoid reverting settings 1524f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala validatedParams.shadowFocusMode = FOCUS_MODE_INVALID; 1525c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // Update in case of override 1526c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala newParams.set(CameraParameters::KEY_FOCUS_MODE, 1527c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala focusModeEnumToString(validatedParams.focusMode)); 15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { 15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.currentAfTriggerId = currentAfTriggerId; 15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // FOCUS_AREAS 15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS), 15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.focusingAreas); 15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala size_t max3aRegions = 15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0]; 15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) res = validateAreas(validatedParams.focusingAreas, 1538572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin max3aRegions, AREA_KIND_FOCUS); 15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested focus areas are malformed: %s", 15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS)); 15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // EXPOSURE_COMPENSATION 15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.exposureCompensation = 15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t exposureCompensationRange = 15492d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE); 15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((validatedParams.exposureCompensation < 15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[0]) || 15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (validatedParams.exposureCompensation > 15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala exposureCompensationRange.data.i32[1])) { 15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested exposure compensation index is out of bounds: %d", 15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.exposureCompensation); 15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_EXPOSURE_LOCK (always supported) 15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoExposureLock = boolFromString( 15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); 15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // AUTO_WHITEBALANCE_LOCK (always supported) 15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.autoWhiteBalanceLock = boolFromString( 15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); 15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // METERING_AREAS 15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS), 15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.meteringAreas); 15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res == OK) { 1571572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin res = validateAreas(validatedParams.meteringAreas, max3aRegions, 1572572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin AREA_KIND_METERING); 15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (res != OK) { 15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested metering areas are malformed: %s", 15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, 15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_METERING_AREAS)); 15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // ZOOM 15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM); 1583cfdd84284394cecdb33cf121fe6d4205da84c761Igor Murashkin if (validatedParams.zoom < 0 1584cfdd84284394cecdb33cf121fe6d4205da84c761Igor Murashkin || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) { 15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested zoom level %d is not supported", 15862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.zoom); 15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_SIZE 15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.getVideoSize(&validatedParams.videoWidth, 15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala &validatedParams.videoHeight); 15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoWidth != videoWidth || 15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight != videoHeight) { 15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (state == RECORD) { 15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video size cannot be updated when recording is active!", 15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__); 15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoSizes = 16012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES); 16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (i = 0; i < availableVideoSizes.count; i += 2 ) { 16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if ((availableVideoSizes.data.i32[i] == 16042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoWidth) && 16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala (availableVideoSizes.data.i32[i+1] == 16062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight)) break; 16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (i == availableVideoSizes.count) { 16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Requested video size %d x %d is not supported", 16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, validatedParams.videoWidth, 16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoHeight); 16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // VIDEO_STABILIZATION 16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala validatedParams.videoStabilization = boolFromString( 16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) ); 16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala camera_metadata_ro_entry_t availableVideoStabilizationModes = 16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES); 16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (validatedParams.videoStabilization && 16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala availableVideoStabilizationModes.count == 1) { 16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Video stabilization not supported", __FUNCTION__); 16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1626c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // LIGHTFX 1627c3dbf1a40df85b75e5805382838a90416f69730fJames Painter validatedParams.lightFx = lightFxStringToEnum( 1628c3dbf1a40df85b75e5805382838a90416f69730fJames Painter newParams.get(CameraParameters::KEY_LIGHTFX)); 1629c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala /** Update internal parameters */ 16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *this = validatedParams; 16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 1634a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala /** Update external parameters calculated from the internal ones */ 1635a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 1636a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala // HORIZONTAL/VERTICAL FIELD OF VIEW 1637a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala float horizFov, vertFov; 1638a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala res = calculatePictureFovs(&horizFov, &vertFov); 1639a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (res != OK) { 1640a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala ALOGE("%s: Can't calculate FOVs", __FUNCTION__); 1641a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala // continue so parameters are at least consistent 1642a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 1643a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, 1644a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala horizFov); 1645a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, 1646a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala vertFov); 1647a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov); 1648a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 1649c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala // Need to flatten again in case of overrides 1650c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala paramsFlattened = newParams.flatten(); 1651c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala params = newParams; 1652c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 16532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 16552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 165669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const { 165769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 165869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 165969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 1660b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin /** 1661b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin * Mixin default important security values 1662b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin * - android.led.transmit = defaulted ON 1663b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin */ 1664b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS, 166537b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin /*minimumCount*/0, 166637b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin /*maximumCount*/0, 166737b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin /*required*/false); 1668b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin for(size_t i = 0; i < entry.count; ++i) { 1669b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin uint8_t led = entry.data.u8[i]; 1670b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin 1671b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin switch(led) { 1672b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin // Transmit LED is unconditionally on when using 1673b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin // the android.hardware.Camera API 1674b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: { 1675b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON; 1676b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin res = request->update(ANDROID_LED_TRANSMIT, 1677b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin &transmitDefault, 1); 1678b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin if (res != OK) return res; 1679b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin break; 1680b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin } 1681b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin } 1682b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin } 1683b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin 1684b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin /** 1685b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin * Construct metadata from parameters 1686b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin */ 1687b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin 16882d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 168969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_REQUEST_METADATA_MODE, 169069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &metadataMode, 1); 169169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 169269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 169369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 169469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala previewFpsRange, 2); 169569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 169669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 16972d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala uint8_t reqWbLock = autoWhiteBalanceLock ? 16982d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF; 16992d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_LOCK, 17002d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala &reqWbLock, 1); 17012d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala 170269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_EFFECT_MODE, 170369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &effectMode, 1); 170469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 170569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 170669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &antibandingMode, 1); 170769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 170869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17092a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala // android.hardware.Camera requires that when face detect is enabled, the 17102a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala // camera is in a face-priority mode. HAL2 splits this into separate parts 17112a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala // (face detection statistics and face priority scene mode). Map from other 17122a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala // to the other. 1713c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala bool sceneModeActive = 1714c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 17152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO; 1716c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (enableFaceDetect || sceneModeActive) { 17172d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE; 17182a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala } 171969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_MODE, 172069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &reqControlMode, 1); 172169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 17222a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala 1723063886eed72c1a12ff73953561d662b47e8230d5Eino-Ville Talvala uint8_t reqSceneMode = 1724c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala sceneModeActive ? sceneMode : 1725063886eed72c1a12ff73953561d662b47e8230d5Eino-Ville Talvala enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY : 1726063886eed72c1a12ff73953561d662b47e8230d5Eino-Ville Talvala (uint8_t)ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED; 17272a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala res = request->update(ANDROID_CONTROL_SCENE_MODE, 17282a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala &reqSceneMode, 1); 17292a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala if (res != OK) return res; 173069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF; 17322d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF; 173369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala switch (flashMode) { 173469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FLASH_MODE_OFF: 17352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break; 173669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FLASH_MODE_AUTO: 17372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break; 173869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FLASH_MODE_ON: 17392d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break; 174069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FLASH_MODE_TORCH: 17412d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON; 17422d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqFlashMode = ANDROID_FLASH_MODE_TORCH; 174369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 174469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FLASH_MODE_RED_EYE: 17452d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break; 174669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala default: 174769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__, 174869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala cameraId, flashMode); 1749c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return BAD_VALUE; 175069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 175169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_FLASH_MODE, 175269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &reqFlashMode, 1); 175369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 175469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_MODE, 175569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &reqAeMode, 1); 175669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 175769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17582d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala uint8_t reqAeLock = autoExposureLock ? 17592d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF; 17602d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_LOCK, 17612d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala &reqAeLock, 1); 1762c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (res != OK) return res; 1763c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 1764c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala res = request->update(ANDROID_CONTROL_AWB_MODE, 1765c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala &wbMode, 1); 1766c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala if (res != OK) return res; 17672d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala 176869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala float reqFocusDistance = 0; // infinity focus in diopters 17692d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 177069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala switch (focusMode) { 177169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FOCUS_MODE_AUTO: 177269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FOCUS_MODE_MACRO: 177369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 177469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 177569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FOCUS_MODE_EDOF: 177669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusMode = focusMode; 177769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 177869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FOCUS_MODE_INFINITY: 177969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala case Parameters::FOCUS_MODE_FIXED: 17802d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 178169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 178269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala default: 1783c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__, 1784c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala cameraId, focusMode); 1785c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return BAD_VALUE; 178669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 178769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_LENS_FOCUS_DISTANCE, 178869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &reqFocusDistance, 1); 178969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 179069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_MODE, 179169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &reqFocusMode, 1); 179269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 179369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 179469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala size_t reqFocusingAreasSize = focusingAreas.size() * 5; 179569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize]; 179669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (size_t i = 0; i < reqFocusingAreasSize; i += 5) { 179769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (focusingAreas[i].weight != 0) { 179869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 0] = 179969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedXToArray(focusingAreas[i].left); 180069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 1] = 180169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedYToArray(focusingAreas[i].top); 180269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 2] = 180369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedXToArray(focusingAreas[i].right); 180469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 3] = 180569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedYToArray(focusingAreas[i].bottom); 180669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 180769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 0] = 0; 180869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 1] = 0; 180969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 2] = 0; 181069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 3] = 0; 181169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 181269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas[i + 4] = focusingAreas[i].weight; 181369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 181469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AF_REGIONS, 181569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqFocusingAreas, reqFocusingAreasSize); 181669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 181769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala delete[] reqFocusingAreas; 181869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18192d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 182069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &exposureCompensation, 1); 182169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 182269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 182369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala size_t reqMeteringAreasSize = meteringAreas.size() * 5; 182469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize]; 182569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala for (size_t i = 0; i < reqMeteringAreasSize; i += 5) { 182669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (meteringAreas[i].weight != 0) { 182769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 0] = 182869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedXToArray(meteringAreas[i].left); 182969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 1] = 183069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedYToArray(meteringAreas[i].top); 183169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 2] = 183269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedXToArray(meteringAreas[i].right); 183369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 3] = 183469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala normalizedYToArray(meteringAreas[i].bottom); 183569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 183669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 0] = 0; 183769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 1] = 0; 183869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 2] = 0; 183969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 3] = 0; 184069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 184169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas[i + 4] = meteringAreas[i].weight; 184269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 184369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_AE_REGIONS, 184469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala reqMeteringAreas, reqMeteringAreasSize); 184569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 184669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 184769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala delete[] reqMeteringAreas; 184869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18493a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin /* don't include jpeg thumbnail size - it's valid for 18503a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin it to be set to (0,0), meaning 'no thumbnail' */ 18513a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion crop = calculateCropRegion( (CropRegion::Outputs)( 18523a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion::OUTPUT_PREVIEW | 18533a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion::OUTPUT_VIDEO | 18543a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion::OUTPUT_PICTURE )); 1855be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin int32_t reqCropRegion[4] = { 1856eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala static_cast<int32_t>(crop.left), 1857eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala static_cast<int32_t>(crop.top), 1858be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin static_cast<int32_t>(crop.width), 1859be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin static_cast<int32_t>(crop.height) 1860eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala }; 186169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_SCALER_CROP_REGION, 1862be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin reqCropRegion, 4); 186369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 186469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 186569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala uint8_t reqVstabMode = videoStabilization ? 18662d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON : 18672d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 186869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 186969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &reqVstabMode, 1); 187069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 187169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 187269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala uint8_t reqFaceDetectMode = enableFaceDetect ? 187369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala fastInfo.bestFaceDetectMode : 18742d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 18752d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE, 187669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &reqFaceDetectMode, 1); 187769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) return res; 187869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 187969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 188069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 188169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 1882db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const { 1883db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala status_t res; 1884db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala 1885db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE, 1886db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala jpegThumbSize, 2); 1887db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1888db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY, 1889db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala &jpegThumbQuality, 1); 1890db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1891db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->update(ANDROID_JPEG_QUALITY, 1892db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala &jpegQuality, 1); 1893db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1894db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->update( 1895db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala ANDROID_JPEG_ORIENTATION, 1896db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala &jpegRotation, 1); 1897db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1898db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala 1899db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (gpsEnabled) { 1900db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->update( 1901db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala ANDROID_JPEG_GPS_COORDINATES, 1902db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala gpsCoordinates, 3); 1903db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1904db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->update( 1905db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala ANDROID_JPEG_GPS_TIMESTAMP, 1906db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala &gpsTimestamp, 1); 1907db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1908db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->update( 1909db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala ANDROID_JPEG_GPS_PROCESSING_METHOD, 1910db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala gpsProcessingMethod); 1911db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1912db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala } else { 1913db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_COORDINATES); 1914db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1915db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP); 1916db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1917db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD); 1918db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) return res; 1919db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala } 1920db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala return OK; 1921db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala} 1922db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala 1923db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala 19242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) { 19252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break; 19262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(state) { 19272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(DISCONNECTED) 19282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STOPPED) 19292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW) 19302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(PREVIEW) 19312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(RECORD) 19322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(STILL_CAPTURE) 19332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT) 19342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 19352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return "Unknown state!"; 19362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR 19392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 19402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) { 19422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 19434c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !format ? 19444c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : 19452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ? 19462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16 19472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ? 19482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21 19492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ? 19502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YCbCr_422_I : // YUY2 19512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ? 19522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_YV12 : // YV12 19532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ? 19542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RGB_565 : // RGB565 19552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ? 19562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RGBA_8888 : // RGB8888 19572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ? 19582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala HAL_PIXEL_FORMAT_RAW_SENSOR : // Raw sensor data 19592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 19602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 19612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) { 19632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *fmt; 19642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala switch(format) { 19652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 19662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422SP; 19672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 19692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420SP; 19702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 19722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV422I; 19732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_YV12: // YV12 19752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_YUV420P; 19762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGB_565: // RGB565 19782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGB565; 19792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RGBA_8888: // RGBA8888 19812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_RGBA8888; 19822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala case HAL_PIXEL_FORMAT_RAW_SENSOR: 19842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGW("Raw sensor preview format requested."); 19852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB; 19862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala default: 19882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Unknown preview format: %x", 19892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, format); 19902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala fmt = NULL; 19912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala break; 19922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 19932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return fmt; 19942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 19952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 19962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) { 19972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 19984c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !wbMode ? 19992d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 20002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ? 20012d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_AUTO : 20022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ? 20032d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_INCANDESCENT : 20042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ? 20052d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_FLUORESCENT : 20062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ? 20072d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT : 20082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ? 20092d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_DAYLIGHT : 20102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ? 20112d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT : 20122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ? 20132d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_TWILIGHT : 20142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ? 20152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AWB_MODE_SHADE : 20162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 20172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2019c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) { 2020c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala switch (wbMode) { 20212d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_AUTO: 2022c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_AUTO; 20232d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 2024c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_INCANDESCENT; 20252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 2026c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_FLUORESCENT; 20272d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT: 2028c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT; 20292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 2030c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_DAYLIGHT; 20312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT: 2032c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT; 20332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_TWILIGHT: 2034c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_TWILIGHT; 20352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin case ANDROID_CONTROL_AWB_MODE_SHADE: 2036c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::WHITE_BALANCE_SHADE; 2037c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala default: 2038c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Unknown AWB mode enum: %d", 2039c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala __FUNCTION__, wbMode); 2040c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return "unknown"; 2041c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 2042c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala} 2043c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 20442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) { 20452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 20464c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !effectMode ? 20472d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 20482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NONE) ? 20492d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_OFF : 20502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_MONO) ? 20512d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_MONO : 20522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ? 20532d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_NEGATIVE : 20542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ? 20552d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_SOLARIZE : 20562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ? 20572d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_SEPIA : 20582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ? 20592d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_POSTERIZE : 20602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ? 20612d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD : 20622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ? 20632d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD : 20642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ? 20652d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_EFFECT_MODE_AQUA : 20662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 20672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) { 20702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 20714c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !abMode ? 20722d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 20732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ? 20742d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO : 20752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ? 20762d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF : 20772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ? 20782d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ : 20792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ? 20802d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ : 20812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 20822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 20832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 20842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) { 20852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 20864c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !sceneMode ? 20874c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 20882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? 20892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED : 20902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? 20912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_ACTION : 20922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? 20932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PORTRAIT : 20942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ? 20952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_LANDSCAPE : 20962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ? 20972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT : 20982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ? 20992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT : 21002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ? 21012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_THEATRE : 21022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ? 21032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BEACH : 21042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ? 21052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SNOW : 21062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ? 21072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SUNSET : 21082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ? 21092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO : 21102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ? 21112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_FIREWORKS : 21122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ? 21132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_SPORTS : 21142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ? 21152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_PARTY : 21162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ? 21172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT : 21182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ? 21192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ANDROID_CONTROL_SCENE_MODE_BARCODE: 21202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala -1; 21212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 21232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum( 21242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *flashMode) { 21252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 21264c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !flashMode ? 21274c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala Parameters::FLASH_MODE_INVALID : 21282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ? 21292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_OFF : 21302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ? 21312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_AUTO : 21322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ? 21332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_ON : 21342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ? 21352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_RED_EYE : 21362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ? 21372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_TORCH : 21382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FLASH_MODE_INVALID; 21392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2141c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) { 2142c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala switch (flashMode) { 2143c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FLASH_MODE_OFF: 2144c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FLASH_MODE_OFF; 2145c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FLASH_MODE_AUTO: 2146c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FLASH_MODE_AUTO; 2147c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FLASH_MODE_ON: 2148c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FLASH_MODE_ON; 2149c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FLASH_MODE_RED_EYE: 2150c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FLASH_MODE_RED_EYE; 2151c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FLASH_MODE_TORCH: 2152c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FLASH_MODE_TORCH; 2153c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala default: 2154c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Unknown flash mode enum %d", 2155c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala __FUNCTION__, flashMode); 2156c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return "unknown"; 2157c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 2158c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala} 2159c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 21602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum( 21612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char *focusMode) { 21622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return 21634c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !focusMode ? 21644c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID : 21652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ? 21662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_AUTO : 21672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ? 21682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INFINITY : 21692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ? 21702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_MACRO : 21712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ? 21722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_FIXED : 21732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ? 21742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_EDOF : 21752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ? 21762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_VIDEO : 21772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ? 21782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_CONTINUOUS_PICTURE : 21792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Parameters::FOCUS_MODE_INVALID; 21802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 21812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 2182c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) { 2183c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala switch (focusMode) { 2184c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FOCUS_MODE_AUTO: 2185c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FOCUS_MODE_AUTO; 2186c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FOCUS_MODE_MACRO: 2187c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FOCUS_MODE_MACRO; 2188c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FOCUS_MODE_CONTINUOUS_VIDEO: 2189c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 2190c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FOCUS_MODE_CONTINUOUS_PICTURE: 2191c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 2192c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FOCUS_MODE_EDOF: 2193c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FOCUS_MODE_EDOF; 2194c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FOCUS_MODE_INFINITY: 2195c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FOCUS_MODE_INFINITY; 2196c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala case FOCUS_MODE_FIXED: 2197c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return CameraParameters::FOCUS_MODE_FIXED; 2198c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala default: 2199c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala ALOGE("%s: Unknown focus mode enum: %d", 2200c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala __FUNCTION__, focusMode); 2201c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala return "unknown"; 2202c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala } 2203c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala} 2204c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala 2205c3dbf1a40df85b75e5805382838a90416f69730fJames PainterParameters::Parameters::lightFxMode_t Parameters::lightFxStringToEnum( 2206c3dbf1a40df85b75e5805382838a90416f69730fJames Painter const char *lightFxMode) { 2207c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return 22084c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala !lightFxMode ? 22094c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala Parameters::LIGHTFX_NONE : 2210c3dbf1a40df85b75e5805382838a90416f69730fJames Painter !strcmp(lightFxMode, CameraParameters::LIGHTFX_LOWLIGHT) ? 2211c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Parameters::LIGHTFX_LOWLIGHT : 2212c3dbf1a40df85b75e5805382838a90416f69730fJames Painter !strcmp(lightFxMode, CameraParameters::LIGHTFX_HDR) ? 2213c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Parameters::LIGHTFX_HDR : 2214c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Parameters::LIGHTFX_NONE; 2215c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 2216c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 22172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr, 22182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala Vector<Parameters::Area> *areas) { 22192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala static const size_t NUM_FIELDS = 5; 22202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->clear(); 22212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areasCStr == NULL) { 22222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // If no key exists, use default (0,0,0,0,0) 22232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(); 22242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 22252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala String8 areasStr(areasCStr); 22272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ssize_t areaStart = areasStr.find("(", 0) + 1; 22282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala while (areaStart != 0) { 22292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala const char* area = areasStr.string() + areaStart; 22302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala char *numEnd; 22312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala int vals[NUM_FIELDS]; 22322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (size_t i = 0; i < NUM_FIELDS; i++) { 22332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala errno = 0; 22342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[i] = strtol(area, &numEnd, 10); 22352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (errno || numEnd == area) return BAD_VALUE; 22362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala area = numEnd + 1; 22372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas->push(Parameters::Area( 22392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala vals[0], vals[1], vals[2], vals[3], vals[4]) ); 22402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areaStart = areasStr.find("(", areaStart) + 1; 22412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 22432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas, 2246572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin size_t maxRegions, 2247572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin AreaKind areaKind) const { 22482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Definition of valid area can be found in 22492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // include/camera/CameraParameters.h 22502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 0) return BAD_VALUE; 22512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() == 1) { 22522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas[0].left == 0 && 22532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].top == 0 && 22542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].right == 0 && 22552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].bottom == 0 && 22562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala areas[0].weight == 0) { 22572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala // Single (0,0,0,0,0) entry is always valid (== driver decides) 22582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 22592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 2261572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin 2262572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin // fixed focus can only set (0,0,0,0,0) focus area 2263572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) { 2264572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin return BAD_VALUE; 2265572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin } 2266572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin 22672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (areas.size() > maxRegions) { 22682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Too many areas requested: %d", 22692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala __FUNCTION__, areas.size()); 22702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return BAD_VALUE; 22712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala for (Vector<Parameters::Area>::const_iterator a = areas.begin(); 22742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala a != areas.end(); a++) { 22752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->weight < 1 || a->weight > 1000) return BAD_VALUE; 22762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left < -1000 || a->left > 1000) return BAD_VALUE; 22772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top < -1000 || a->top > 1000) return BAD_VALUE; 22782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->right < -1000 || a->right > 1000) return BAD_VALUE; 22792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE; 22802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->left >= a->right) return BAD_VALUE; 22812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (a->top >= a->bottom) return BAD_VALUE; 22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 22832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return OK; 22842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) { 22872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return !boolStr ? false : 22882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala !strcmp(boolStr, CameraParameters::TRUE) ? true : 22892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala false; 22902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 22912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 22922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) { 22932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (!mirror) { 22942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) return 0; 22952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 90) return HAL_TRANSFORM_ROT_90; 22962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 180) return HAL_TRANSFORM_ROT_180; 22972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala else if (degrees == 270) return HAL_TRANSFORM_ROT_270; 22982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else { // Do mirror (horizontal flip) 22992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala if (degrees == 0) { // FLIP_H and ROT_0 23002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H; 23012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 90) { // FLIP_H and ROT_90 23022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90; 23032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 180) { // FLIP_H and ROT_180 23042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V; 23052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } else if (degrees == 270) { // FLIP_H and ROT_270 23062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90; 23072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala } 23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala ALOGE("%s: Bad input: %d", __FUNCTION__, degrees); 23102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala return -1; 23112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23133a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropXToArray(int x) const { 23143a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds" 23153a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin "(lower = 0)", x); 23163a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23173a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23183a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' " 2319a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala "is out of bounds (upper = %f)", x, previewCrop.width); 23203a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23213a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin int ret = x + previewCrop.left; 23223a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23233a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth), 23243a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin "Calculated pixel array value X = '%d' is out of bounds (upper = %d)", 23253a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ret, fastInfo.arrayWidth); 23263a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return ret; 23273a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23283a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23293a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropYToArray(int y) const { 23303a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds " 23313a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin "(lower = 0)", y); 23323a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23333a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23343a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is " 2335a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala "out of bounds (upper = %f)", y, previewCrop.height); 23363a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23373a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin int ret = y + previewCrop.top; 23383a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23393a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight), 23403a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)", 23413a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ret, fastInfo.arrayHeight); 23423a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23433a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return ret; 23443a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23453a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23463a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23473a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::normalizedXToCrop(int x) const { 23483a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23493a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return (x + 1000) * (previewCrop.width - 1) / 2000; 23503a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23513a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23523a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::normalizedYToCrop(int y) const { 23533a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23543a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return (y + 1000) * (previewCrop.height - 1) / 2000; 23553a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23563a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23573a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::arrayXToCrop(int x) const { 23583a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23593a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return x - previewCrop.left; 23603a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23613a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23623a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::arrayYToCrop(int y) const { 23633a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23643a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return y - previewCrop.top; 23653a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23663a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23673a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropXToNormalized(int x) const { 23683a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23693a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return x * 2000 / (previewCrop.width - 1) - 1000; 23703a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23713a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23723a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropYToNormalized(int y) const { 23733a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW); 23743a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return y * 2000 / (previewCrop.height - 1) - 1000; 23753a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin} 23763a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const { 23783a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin int ret = cropXToNormalized(arrayXToCrop(width)); 23793a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23803a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of " 23813a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin "lower bounds %d", ret); 23823a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of " 23833a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin "upper bounds %d", ret); 23843a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23853a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 23863a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin if (quirks.meteringCropRegion) { 23873a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return width * 2000 / (fastInfo.arrayWidth - 1) - 1000; 23883a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin } 23893a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23903a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return ret; 23912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 23922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 23932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const { 23943a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin int ret = cropYToNormalized(arrayYToCrop(height)); 23953a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 23963a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of lower bounds" 23973a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin " %d", ret); 23983a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of upper bounds" 23993a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin " %d", ret); 24003a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 24013a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 24023a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin if (quirks.meteringCropRegion) { 24033a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return height * 2000 / (fastInfo.arrayHeight - 1) - 1000; 24043a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin } 24053a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 24063a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return ret; 24072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const { 24103a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 24113a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 24123a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin if (quirks.meteringCropRegion) { 24133a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000; 24143a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin } 24153a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 24163a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return cropXToArray(normalizedXToCrop(x)); 24172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const { 24203a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin // Work-around for HAL pre-scaling the coordinates themselves 24213a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin if (quirks.meteringCropRegion) { 24223a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000; 24233a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin } 24243a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 24253a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin return cropYToArray(normalizedYToCrop(y)); 24262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala} 24272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala 24283a6e45320685b36bb266bbf8fa548f4474d90d6cIgor MurashkinParameters::CropRegion Parameters::calculateCropRegion( 24293a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin Parameters::CropRegion::Outputs outputs) const { 2430e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2431e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float zoomLeft, zoomTop, zoomWidth, zoomHeight; 2432e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2433e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // Need to convert zoom index into a crop rectangle. The rectangle is 2434e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // chosen to maximize its area on the sensor 2435e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2436e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin camera_metadata_ro_entry_t maxDigitalZoom = 24372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM); 2438e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // For each zoom step by how many pixels more do we change the zoom 2439e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) / 2440e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin (NUM_ZOOM_STEPS-1); 2441e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w) 2442e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // via interpolating zoom step into a zoom ratio 2443e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float zoomRatio = 1 + zoomIncrement * zoom; 2444e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]), 2445e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f", 2446e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin maxDigitalZoom.data.f[0], zoomRatio); 2447e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2448e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, " 2449e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin "previewHeight=%d, activeWidth=%d, activeHeight=%d", 2450e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth, 2451e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight); 2452e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2453e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin /* 2454e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * Assumption: On the HAL side each stream buffer calculates its crop 2455e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * rectangle as follows: 2456e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * cropRect = (zoomLeft, zoomRight, 2457e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * zoomWidth, zoomHeight * zoomWidth / outputWidth); 2458e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * 2459e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * Note that if zoomWidth > bufferWidth, the new cropHeight > zoomHeight 2460e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * (we can then get into trouble if the cropHeight > arrayHeight). 2461e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * By selecting the zoomRatio based on the smallest outputRatio, we 2462e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * guarantee this will never happen. 2463e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin */ 2464e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2465e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // Enumerate all possible output sizes, select the one with the smallest 2466e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // aspect ratio 2467e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float minOutputWidth, minOutputHeight, minOutputRatio; 2468e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin { 2469e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float outputSizes[][2] = { 2470eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala { static_cast<float>(previewWidth), 2471eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala static_cast<float>(previewHeight) }, 2472eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala { static_cast<float>(videoWidth), 2473eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala static_cast<float>(videoHeight) }, 2474eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala { static_cast<float>(jpegThumbSize[0]), 2475eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala static_cast<float>(jpegThumbSize[1]) }, 2476eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala { static_cast<float>(pictureWidth), 2477eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala static_cast<float>(pictureHeight) }, 2478e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin }; 2479e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2480e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputWidth = outputSizes[0][0]; 2481e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputHeight = outputSizes[0][1]; 2482e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputRatio = minOutputWidth / minOutputHeight; 2483e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin for (unsigned int i = 0; 2484e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin i < sizeof(outputSizes) / sizeof(outputSizes[0]); 2485e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin ++i) { 2486e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 24873a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin // skip over outputs we don't want to consider for the crop region 24883a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin if ( !((1 << i) & outputs) ) { 24893a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin continue; 24903a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin } 24913a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin 2492e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float outputWidth = outputSizes[i][0]; 2493e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float outputHeight = outputSizes[i][1]; 2494e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float outputRatio = outputWidth / outputHeight; 2495e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2496e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin if (minOutputRatio > outputRatio) { 2497e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputRatio = outputRatio; 2498e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputWidth = outputWidth; 2499e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputHeight = outputHeight; 2500e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin } 2501e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2502e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // and then use this output ratio instead of preview output ratio 2503e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin ALOGV("Enumerating output ratio %f = %f / %f, min is %f", 2504e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin outputRatio, outputWidth, outputHeight, minOutputRatio); 2505e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin } 2506e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin } 2507e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2508e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin /* Ensure that the width/height never go out of bounds 2509e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * by scaling across a diffent dimension if an out-of-bounds 2510e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * possibility exists. 2511e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * 2512e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by 2513e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * calculating the zoomWidth from zoomHeight we'll actually get a 2514e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin * zoomheight > arrayheight 2515e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin */ 2516e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight; 2517e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin if (minOutputRatio >= arrayRatio) { 2518e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // Adjust the height based on the width 2519e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin zoomWidth = fastInfo.arrayWidth / zoomRatio; 2520e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin zoomHeight = zoomWidth * 2521e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputHeight / minOutputWidth; 2522e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2523e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin } else { 2524e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // Adjust the width based on the height 2525e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin zoomHeight = fastInfo.arrayHeight / zoomRatio; 2526e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin zoomWidth = zoomHeight * 2527e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin minOutputWidth / minOutputHeight; 2528e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin } 2529e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin // centering the zoom area within the active area 2530e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2; 2531e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2; 2532e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2533e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d", 2534e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom); 2535e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2536e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2537e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight }; 2538e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin return crop; 2539e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin} 2540e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin 2541a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov) 2542a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala const { 2543a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala camera_metadata_ro_entry_t sensorSize = 2544a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2); 2545a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (!sensorSize.count) return NO_INIT; 2546a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 2547a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala camera_metadata_ro_entry_t availableFocalLengths = 2548a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS); 2549a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (!availableFocalLengths.count) return NO_INIT; 2550a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 2551a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala float arrayAspect = static_cast<float>(fastInfo.arrayWidth) / 2552a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala fastInfo.arrayHeight; 2553a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala float stillAspect = static_cast<float>(pictureWidth) / pictureHeight; 2554a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect); 2555a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 2556a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala // The crop factors from the full sensor array to the still picture crop 2557a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala // region 2558a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala float horizCropFactor = 1.f; 2559a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala float vertCropFactor = 1.f; 2560a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 2561a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala /** 2562a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * Need to calculate the still image field of view based on the total pixel 2563a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * array field of view, and the relative aspect ratios of the pixel array 2564a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * and output streams. 2565a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * 2566a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * Special treatment for quirky definition of crop region and relative 2567a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * stream cropping. 2568a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala */ 2569a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (quirks.meteringCropRegion) { 25704ad015003cbab4ee6889b803225648c76a156193Alex Ray // Use max of preview and video as first crop 25714ad015003cbab4ee6889b803225648c76a156193Alex Ray float previewAspect = static_cast<float>(previewWidth) / previewHeight; 25724ad015003cbab4ee6889b803225648c76a156193Alex Ray float videoAspect = static_cast<float>(videoWidth) / videoHeight; 25734ad015003cbab4ee6889b803225648c76a156193Alex Ray if (videoAspect > previewAspect) { 25744ad015003cbab4ee6889b803225648c76a156193Alex Ray previewAspect = videoAspect; 25754ad015003cbab4ee6889b803225648c76a156193Alex Ray } 25764ad015003cbab4ee6889b803225648c76a156193Alex Ray // First crop sensor to preview aspect ratio 25774ad015003cbab4ee6889b803225648c76a156193Alex Ray if (arrayAspect < previewAspect) { 25784ad015003cbab4ee6889b803225648c76a156193Alex Ray vertCropFactor = arrayAspect / previewAspect; 25794ad015003cbab4ee6889b803225648c76a156193Alex Ray } else { 25804ad015003cbab4ee6889b803225648c76a156193Alex Ray horizCropFactor = previewAspect / arrayAspect; 25814ad015003cbab4ee6889b803225648c76a156193Alex Ray } 25824ad015003cbab4ee6889b803225648c76a156193Alex Ray // Second crop to still aspect ratio 25834ad015003cbab4ee6889b803225648c76a156193Alex Ray if (stillAspect < previewAspect) { 25844ad015003cbab4ee6889b803225648c76a156193Alex Ray horizCropFactor *= stillAspect / previewAspect; 25854ad015003cbab4ee6889b803225648c76a156193Alex Ray } else { 25864ad015003cbab4ee6889b803225648c76a156193Alex Ray vertCropFactor *= previewAspect / stillAspect; 2587a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 2588a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } else { 2589a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala /** 2590a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * Crop are just a function of just the still/array relative aspect 2591a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * ratios. Since each stream will maximize its area within the crop 2592a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * region, and for FOV we assume a full-sensor crop region, we only ever 2593a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * crop the FOV either vertically or horizontally, never both. 2594a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala */ 2595a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala horizCropFactor = (arrayAspect > stillAspect) ? 2596a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala (stillAspect / arrayAspect) : 1.f; 2597a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala vertCropFactor = (arrayAspect < stillAspect) ? 2598a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala (arrayAspect / stillAspect) : 1.f; 2599a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 2600a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala ALOGV("Horiz crop factor: %f, vert crop fact: %f", 2601a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala horizCropFactor, vertCropFactor); 2602a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala /** 2603a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * Basic field of view formula is: 2604a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * angle of view = 2 * arctangent ( d / 2f ) 2605a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * where d is the physical sensor dimension of interest, and f is 2606a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * the focal length. This only applies to rectilinear sensors, for focusing 2607a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala * at distances >> f, etc. 2608a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala */ 2609a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (horizFov != NULL) { 2610a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala *horizFov = 180 / M_PI * 2 * 2611a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala atanf(horizCropFactor * sensorSize.data.f[0] / 2612a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala (2 * fastInfo.minFocalLength)); 2613a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 2614a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala if (vertFov != NULL) { 2615a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala *vertFov = 180 / M_PI * 2 * 2616a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala atanf(vertCropFactor * sensorSize.data.f[1] / 2617a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala (2 * fastInfo.minFocalLength)); 2618a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala } 2619a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala return OK; 2620a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala} 2621a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala 2622ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const { 262363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin return max; 262463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin} 262563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin 26262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2 26272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android 2628