10b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin/* 20b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** 30b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** Copyright 2008, The Android Open Source Project 40b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** 50b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** Licensed under the Apache License, Version 2.0 (the "License"); 60b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** you may not use this file except in compliance with the License. 70b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** You may obtain a copy of the License at 80b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** 90b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** http://www.apache.org/licenses/LICENSE-2.0 100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** 110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** Unless required by applicable law or agreed to in writing, software 120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** distributed under the License is distributed on an "AS IS" BASIS, 130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** See the License for the specific language governing permissions and 150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin** limitations under the License. 160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin*/ 170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#define LOG_TAG "CameraParams2" 190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin// #define LOG_NDEBUG 0 200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include <utils/Log.h> 210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include <string.h> 230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include <stdlib.h> 240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include <camera/CameraParameters2.h> 250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinnamespace android { 270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor MurashkinCameraParameters2::CameraParameters2() 290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin : mMap() 300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor MurashkinCameraParameters2::~CameraParameters2() 340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor MurashkinString8 CameraParameters2::flatten() const 380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 flattened(""); 400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin size_t size = mMap.size(); 410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin for (size_t i = 0; i < size; i++) { 430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 k, v; 440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin k = mMap.keyAt(i); 450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin v = mMap.valueAt(i); 460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin flattened += k; 480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin flattened += "="; 490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin flattened += v; 500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (i != size-1) 510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin flattened += ";"; 520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGV("%s: Flattened params = %s", __FUNCTION__, flattened.string()); 550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return flattened; 570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::unflatten(const String8 ¶ms) 600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *a = params.string(); 620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *b; 630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin mMap.clear(); 650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin for (;;) { 670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Find the bounds of the key name. 680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin b = strchr(a, '='); 690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (b == 0) 700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin break; 710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Create the key string. 730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 k(a, (size_t)(b-a)); 740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Find the value. 760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin a = b+1; 770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin b = strchr(a, ';'); 780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (b == 0) { 790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // If there's no semicolon, this is the last item. 800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 v(a); 810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin mMap.add(k, v); 820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin break; 830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 v(a, (size_t)(b-a)); 860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin mMap.add(k, v); 870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin a = b+1; 880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::set(const char *key, const char *value) 930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // XXX i think i can do this with strspn() 950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (strchr(key, '=') || strchr(key, ';')) { 960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key); 970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return; 980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (strchr(value, '=') || strchr(value, ';')) { 1010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value); 1020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return; 1030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Replacing a value updates the key's order to be the new largest order 1060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ssize_t res = mMap.replaceValueFor(String8(key), String8(value)); 1070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin LOG_ALWAYS_FATAL_IF(res < 0, "replaceValueFor(%s,%s) failed", key, value); 1080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::set(const char *key, int value) 1110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 1120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char str[16]; 1130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin sprintf(str, "%d", value); 1140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(key, str); 1150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setFloat(const char *key, float value) 1180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 1190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char str[16]; // 14 should be enough. We overestimate to be safe. 1200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin snprintf(str, sizeof(str), "%g", value); 1210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(key, str); 1220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinconst char *CameraParameters2::get(const char *key) const 1250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 1260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ssize_t idx = mMap.indexOfKey(String8(key)); 1270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (idx < 0) { 1280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return NULL; 1290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else { 1300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return mMap.valueAt(idx).string(); 1310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinint CameraParameters2::getInt(const char *key) const 1350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 1360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *v = get(key); 1370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (v == 0) 1380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return -1; 1390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return strtol(v, 0, 0); 1400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinfloat CameraParameters2::getFloat(const char *key) const 1430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 1440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *v = get(key); 1450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (v == 0) return -1; 1460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return strtof(v, 0); 1470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinstatus_t CameraParameters2::compareSetOrder(const char *key1, const char *key2, 1500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int *order) const { 1510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (key1 == NULL) { 1520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("%s: key1 must not be NULL", __FUNCTION__); 1530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return BAD_VALUE; 1540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (key2 == NULL) { 1550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("%s: key2 must not be NULL", __FUNCTION__); 1560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return BAD_VALUE; 1570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (order == NULL) { 1580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("%s: order must not be NULL", __FUNCTION__); 1590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return BAD_VALUE; 1600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ssize_t index1 = mMap.indexOfKey(String8(key1)); 1630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ssize_t index2 = mMap.indexOfKey(String8(key2)); 1640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (index1 < 0) { 1650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGW("%s: Key1 (%s) was not set", __FUNCTION__, key1); 1660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return NAME_NOT_FOUND; 1670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } else if (index2 < 0) { 1680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGW("%s: Key2 (%s) was not set", __FUNCTION__, key2); 1690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return NAME_NOT_FOUND; 1700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *order = (index1 == index2) ? 0 : 1730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin (index1 < index2) ? -1 : 1740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1; 1750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return OK; 1770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::remove(const char *key) 1800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 1810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin mMap.removeItem(String8(key)); 1820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 1830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin// Parse string like "640x480" or "10000,20000" 1850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinstatic int parse_pair(const char *str, int *first, int *second, char delim, 1860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char **endptr = NULL) 1870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 1880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Find the first integer. 1890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char *end; 1900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int w = (int)strtol(str, &end, 10); 1910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // If a delimeter does not immediately follow, give up. 1920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (*end != delim) { 1930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("Cannot find delimeter (%c) in str=%s", delim, str); 1940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return -1; 1950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 1960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 1970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Find the second integer, immediately after the delimeter. 1980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int h = (int)strtol(end+1, &end, 10); 1990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *first = w; 2010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *second = h; 2020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (endptr) { 2040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *endptr = end; 2050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return 0; 2080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinstatic void parseSizesList(const char *sizesStr, Vector<Size> &sizes) 2110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (sizesStr == 0) { 2130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return; 2140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char *sizeStartPtr = (char *)sizesStr; 2170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin while (true) { 2190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int width, height; 2200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin int success = parse_pair(sizeStartPtr, &width, &height, 'x', 2210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin &sizeStartPtr); 2220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) { 2230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr); 2240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return; 2250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin sizes.push(Size(width, height)); 2270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (*sizeStartPtr == '\0') { 2290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return; 2300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin sizeStartPtr++; 2320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 2330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setPreviewSize(int width, int height) 2360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char str[32]; 2380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin sprintf(str, "%dx%d", width, height); 2390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(CameraParameters::KEY_PREVIEW_SIZE, str); 2400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getPreviewSize(int *width, int *height) const 2430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *width = *height = -1; 2450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Get the current string, if it doesn't exist, leave the -1x-1 2460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *p = get(CameraParameters::KEY_PREVIEW_SIZE); 2470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (p == 0) return; 2480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parse_pair(p, width, height, 'x'); 2490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getPreferredPreviewSizeForVideo(int *width, int *height) const 2520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *width = *height = -1; 2540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *p = get(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO); 2550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (p == 0) return; 2560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parse_pair(p, width, height, 'x'); 2570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getSupportedPreviewSizes(Vector<Size> &sizes) const 2600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *previewSizesStr = get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES); 2620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parseSizesList(previewSizesStr, sizes); 2630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setVideoSize(int width, int height) 2660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char str[32]; 2680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin sprintf(str, "%dx%d", width, height); 2690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(CameraParameters::KEY_VIDEO_SIZE, str); 2700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getVideoSize(int *width, int *height) const 2730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *width = *height = -1; 2750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *p = get(CameraParameters::KEY_VIDEO_SIZE); 2760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (p == 0) return; 2770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parse_pair(p, width, height, 'x'); 2780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getSupportedVideoSizes(Vector<Size> &sizes) const 2810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *videoSizesStr = get(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES); 2830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parseSizesList(videoSizesStr, sizes); 2840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setPreviewFrameRate(int fps) 2870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(CameraParameters::KEY_PREVIEW_FRAME_RATE, fps); 2890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinint CameraParameters2::getPreviewFrameRate() const 2920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return getInt(CameraParameters::KEY_PREVIEW_FRAME_RATE); 2940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 2950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 2960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getPreviewFpsRange(int *min_fps, int *max_fps) const 2970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 2980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *min_fps = *max_fps = -1; 2990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *p = get(CameraParameters::KEY_PREVIEW_FPS_RANGE); 3000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (p == 0) return; 3010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parse_pair(p, min_fps, max_fps, ','); 3020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setPreviewFpsRange(int min_fps, int max_fps) 3050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 str = String8::format("%d,%d", min_fps, max_fps); 3070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(CameraParameters::KEY_PREVIEW_FPS_RANGE, str.string()); 3080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setPreviewFormat(const char *format) 3110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(CameraParameters::KEY_PREVIEW_FORMAT, format); 3130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinconst char *CameraParameters2::getPreviewFormat() const 3160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return get(CameraParameters::KEY_PREVIEW_FORMAT); 3180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setPictureSize(int width, int height) 3210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char str[32]; 3230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin sprintf(str, "%dx%d", width, height); 3240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(CameraParameters::KEY_PICTURE_SIZE, str); 3250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getPictureSize(int *width, int *height) const 3280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *width = *height = -1; 3300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin // Get the current string, if it doesn't exist, leave the -1x-1 3310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *p = get(CameraParameters::KEY_PICTURE_SIZE); 3320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin if (p == 0) return; 3330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parse_pair(p, width, height, 'x'); 3340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::getSupportedPictureSizes(Vector<Size> &sizes) const 3370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const char *pictureSizesStr = get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES); 3390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin parseSizesList(pictureSizesStr, sizes); 3400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::setPictureFormat(const char *format) 3430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin set(CameraParameters::KEY_PICTURE_FORMAT, format); 3450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinconst char *CameraParameters2::getPictureFormat() const 3480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return get(CameraParameters::KEY_PICTURE_FORMAT); 3500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinvoid CameraParameters2::dump() const 3530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGD("dump: mMap.size = %d", mMap.size()); 3550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin for (size_t i = 0; i < mMap.size(); i++) { 3560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 k, v; 3570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin k = mMap.keyAt(i); 3580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin v = mMap.valueAt(i); 3590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ALOGD("%s: %s\n", k.string(), v.string()); 3600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 3610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinstatus_t CameraParameters2::dump(int fd, const Vector<String16>& args) const 3640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{ 3650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin (void)args; 3660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin const size_t SIZE = 256; 3670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin char buffer[SIZE]; 3680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 result; 3690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin snprintf(buffer, 255, "CameraParameters2::dump: mMap.size = %zu\n", mMap.size()); 3700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin result.append(buffer); 3710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin for (size_t i = 0; i < mMap.size(); i++) { 3720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 k, v; 3730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin k = mMap.keyAt(i); 3740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin v = mMap.valueAt(i); 3750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin snprintf(buffer, 255, "\t%s: %s\n", k.string(), v.string()); 3760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin result.append(buffer); 3770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin } 3780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin write(fd, result.string(), result.size()); 3790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin return NO_ERROR; 3800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin} 3810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 3820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin}; // namespace android 383