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 &params)
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