10370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin/*
20370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin**
30370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** Copyright 2008, The Android Open Source Project
40370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin**
50370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** Licensed under the Apache License, Version 2.0 (the "License");
60370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** you may not use this file except in compliance with the License.
70370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** You may obtain a copy of the License at
80370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin**
90370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin**     http://www.apache.org/licenses/LICENSE-2.0
100370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin**
110370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** Unless required by applicable law or agreed to in writing, software
120370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** distributed under the License is distributed on an "AS IS" BASIS,
130370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** See the License for the specific language governing permissions and
150370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin** limitations under the License.
160370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin*/
170370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
180370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#define LOG_TAG "CameraParams2"
190370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin// #define LOG_NDEBUG 0
200370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#include <utils/Log.h>
210370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
220370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#include <string.h>
230370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#include <stdlib.h>
240370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#include <camera/CameraParameters2.h>
250370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
260370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinnamespace android {
270370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
280370be96e33ea0c8fb4069e704deccce43b7403cIgor MurashkinCameraParameters2::CameraParameters2()
290370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                : mMap()
300370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
310370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
320370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
330370be96e33ea0c8fb4069e704deccce43b7403cIgor MurashkinCameraParameters2::~CameraParameters2()
340370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
350370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
360370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
370370be96e33ea0c8fb4069e704deccce43b7403cIgor MurashkinString8 CameraParameters2::flatten() const
380370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
390370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    String8 flattened("");
400370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    size_t size = mMap.size();
410370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
420370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    for (size_t i = 0; i < size; i++) {
430370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        String8 k, v;
440370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        k = mMap.keyAt(i);
450370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        v = mMap.valueAt(i);
460370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
470370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        flattened += k;
480370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        flattened += "=";
490370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        flattened += v;
500370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        if (i != size-1)
510370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            flattened += ";";
520370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
530370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
540370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    ALOGV("%s: Flattened params = %s", __FUNCTION__, flattened.string());
550370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
560370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return flattened;
570370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
580370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
590370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::unflatten(const String8 &params)
600370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
610370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *a = params.string();
620370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *b;
630370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
640370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    mMap.clear();
650370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
660370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    for (;;) {
670370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        // Find the bounds of the key name.
680370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        b = strchr(a, '=');
690370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        if (b == 0)
700370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            break;
710370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
720370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        // Create the key string.
730370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        String8 k(a, (size_t)(b-a));
740370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
750370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        // Find the value.
760370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        a = b+1;
770370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        b = strchr(a, ';');
780370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        if (b == 0) {
790370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            // If there's no semicolon, this is the last item.
800370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            String8 v(a);
810370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            mMap.add(k, v);
820370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            break;
830370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
840370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
850370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        String8 v(a, (size_t)(b-a));
860370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        mMap.add(k, v);
870370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        a = b+1;
880370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
890370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
900370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
910370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
920370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::set(const char *key, const char *value)
930370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
940370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // XXX i think i can do this with strspn()
950370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (strchr(key, '=') || strchr(key, ';')) {
960370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        //XXX ALOGE("Key \"%s\"contains invalid character (= or ;)", key);
970370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return;
980370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
990370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1000370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (strchr(value, '=') || strchr(value, ';')) {
1010370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        //XXX ALOGE("Value \"%s\"contains invalid character (= or ;)", value);
1020370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return;
1030370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
1040370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1050370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Replacing a value updates the key's order to be the new largest order
1060370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    ssize_t res = mMap.replaceValueFor(String8(key), String8(value));
1070370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    LOG_ALWAYS_FATAL_IF(res < 0, "replaceValueFor(%s,%s) failed", key, value);
1080370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1090370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1100370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::set(const char *key, int value)
1110370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
1120370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char str[16];
1130370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    sprintf(str, "%d", value);
1140370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(key, str);
1150370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1160370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1170370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setFloat(const char *key, float value)
1180370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
1190370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char str[16];  // 14 should be enough. We overestimate to be safe.
1200370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    snprintf(str, sizeof(str), "%g", value);
1210370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(key, str);
1220370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1230370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1240370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinconst char *CameraParameters2::get(const char *key) const
1250370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
1260370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    ssize_t idx = mMap.indexOfKey(String8(key));
1270370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (idx < 0) {
1280370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return NULL;
1290370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    } else {
1300370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return mMap.valueAt(idx).string();
1310370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
1320370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1330370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1340370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinint CameraParameters2::getInt(const char *key) const
1350370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
1360370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *v = get(key);
1370370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (v == 0)
1380370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return -1;
1390370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return strtol(v, 0, 0);
1400370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1410370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1420370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinfloat CameraParameters2::getFloat(const char *key) const
1430370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
1440370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *v = get(key);
1450370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (v == 0) return -1;
1460370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return strtof(v, 0);
1470370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1480370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1490370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinstatus_t CameraParameters2::compareSetOrder(const char *key1, const char *key2,
1500370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        int *order) const {
1510370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (key1 == NULL) {
1520370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ALOGE("%s: key1 must not be NULL", __FUNCTION__);
1530370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return BAD_VALUE;
1540370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    } else if (key2 == NULL) {
1550370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ALOGE("%s: key2 must not be NULL", __FUNCTION__);
1560370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return BAD_VALUE;
1570370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    } else if (order == NULL) {
1580370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ALOGE("%s: order must not be NULL", __FUNCTION__);
1590370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return BAD_VALUE;
1600370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
1610370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1620370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    ssize_t index1 = mMap.indexOfKey(String8(key1));
1630370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    ssize_t index2 = mMap.indexOfKey(String8(key2));
1640370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (index1 < 0) {
1650370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ALOGW("%s: Key1 (%s) was not set", __FUNCTION__, key1);
1660370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return NAME_NOT_FOUND;
1670370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    } else if (index2 < 0) {
1680370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ALOGW("%s: Key2 (%s) was not set", __FUNCTION__, key2);
1690370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return NAME_NOT_FOUND;
1700370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
1710370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1720370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *order = (index1 == index2) ? 0  :
1730370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin             (index1 < index2)  ? -1 :
1740370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin             1;
1750370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1760370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return OK;
1770370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1780370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1790370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::remove(const char *key)
1800370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
1810370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    mMap.removeItem(String8(key));
1820370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
1830370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1840370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin// Parse string like "640x480" or "10000,20000"
1850370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinstatic int parse_pair(const char *str, int *first, int *second, char delim,
1860370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                      char **endptr = NULL)
1870370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
1880370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Find the first integer.
1890370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char *end;
1900370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    int w = (int)strtol(str, &end, 10);
1910370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // If a delimeter does not immediately follow, give up.
1920370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (*end != delim) {
1930370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ALOGE("Cannot find delimeter (%c) in str=%s", delim, str);
1940370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return -1;
1950370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
1960370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1970370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Find the second integer, immediately after the delimeter.
1980370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    int h = (int)strtol(end+1, &end, 10);
1990370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2000370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *first = w;
2010370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *second = h;
2020370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2030370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (endptr) {
2040370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        *endptr = end;
2050370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
2060370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2070370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return 0;
2080370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2090370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2100370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinstatic void parseSizesList(const char *sizesStr, Vector<Size> &sizes)
2110370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2120370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (sizesStr == 0) {
2130370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        return;
2140370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
2150370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2160370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char *sizeStartPtr = (char *)sizesStr;
2170370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2180370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    while (true) {
2190370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        int width, height;
2200370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        int success = parse_pair(sizeStartPtr, &width, &height, 'x',
2210370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                                 &sizeStartPtr);
2220370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        if (success == -1 || (*sizeStartPtr != ',' && *sizeStartPtr != '\0')) {
2230370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            ALOGE("Picture sizes string \"%s\" contains invalid character.", sizesStr);
2240370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return;
2250370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
2260370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        sizes.push(Size(width, height));
2270370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2280370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        if (*sizeStartPtr == '\0') {
2290370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return;
2300370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
2310370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        sizeStartPtr++;
2320370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
2330370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2340370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2350370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setPreviewSize(int width, int height)
2360370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2370370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char str[32];
2380370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    sprintf(str, "%dx%d", width, height);
2390370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(CameraParameters::KEY_PREVIEW_SIZE, str);
2400370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2410370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2420370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getPreviewSize(int *width, int *height) const
2430370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2440370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *width = *height = -1;
2450370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Get the current string, if it doesn't exist, leave the -1x-1
2460370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *p = get(CameraParameters::KEY_PREVIEW_SIZE);
2470370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (p == 0)  return;
2480370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parse_pair(p, width, height, 'x');
2490370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2500370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2510370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getPreferredPreviewSizeForVideo(int *width, int *height) const
2520370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2530370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *width = *height = -1;
2540370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *p = get(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO);
2550370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (p == 0)  return;
2560370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parse_pair(p, width, height, 'x');
2570370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2580370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2590370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getSupportedPreviewSizes(Vector<Size> &sizes) const
2600370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2610370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *previewSizesStr = get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES);
2620370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parseSizesList(previewSizesStr, sizes);
2630370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2640370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2650370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setVideoSize(int width, int height)
2660370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2670370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char str[32];
2680370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    sprintf(str, "%dx%d", width, height);
2690370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(CameraParameters::KEY_VIDEO_SIZE, str);
2700370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2710370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2720370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getVideoSize(int *width, int *height) const
2730370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2740370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *width = *height = -1;
2750370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *p = get(CameraParameters::KEY_VIDEO_SIZE);
2760370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (p == 0) return;
2770370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parse_pair(p, width, height, 'x');
2780370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2790370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2800370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getSupportedVideoSizes(Vector<Size> &sizes) const
2810370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2820370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *videoSizesStr = get(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES);
2830370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parseSizesList(videoSizesStr, sizes);
2840370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2850370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2860370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setPreviewFrameRate(int fps)
2870370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2880370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(CameraParameters::KEY_PREVIEW_FRAME_RATE, fps);
2890370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2900370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2910370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinint CameraParameters2::getPreviewFrameRate() const
2920370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2930370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return getInt(CameraParameters::KEY_PREVIEW_FRAME_RATE);
2940370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
2950370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2960370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getPreviewFpsRange(int *min_fps, int *max_fps) const
2970370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
2980370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *min_fps = *max_fps = -1;
2990370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *p = get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
3000370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (p == 0) return;
3010370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parse_pair(p, min_fps, max_fps, ',');
3020370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3030370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3040370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setPreviewFpsRange(int min_fps, int max_fps)
3050370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3060370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    String8 str = String8::format("%d,%d", min_fps, max_fps);
3070370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(CameraParameters::KEY_PREVIEW_FPS_RANGE, str.string());
3080370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3090370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3100370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setPreviewFormat(const char *format)
3110370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3120370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(CameraParameters::KEY_PREVIEW_FORMAT, format);
3130370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3140370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3150370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinconst char *CameraParameters2::getPreviewFormat() const
3160370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3170370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return get(CameraParameters::KEY_PREVIEW_FORMAT);
3180370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3190370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3200370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setPictureSize(int width, int height)
3210370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3220370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char str[32];
3230370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    sprintf(str, "%dx%d", width, height);
3240370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(CameraParameters::KEY_PICTURE_SIZE, str);
3250370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3260370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3270370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getPictureSize(int *width, int *height) const
3280370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3290370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    *width = *height = -1;
3300370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Get the current string, if it doesn't exist, leave the -1x-1
3310370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *p = get(CameraParameters::KEY_PICTURE_SIZE);
3320370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    if (p == 0) return;
3330370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parse_pair(p, width, height, 'x');
3340370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3350370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3360370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::getSupportedPictureSizes(Vector<Size> &sizes) const
3370370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3380370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *pictureSizesStr = get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES);
3390370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    parseSizesList(pictureSizesStr, sizes);
3400370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3410370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3420370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::setPictureFormat(const char *format)
3430370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3440370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    set(CameraParameters::KEY_PICTURE_FORMAT, format);
3450370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3460370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3470370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinconst char *CameraParameters2::getPictureFormat() const
3480370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3490370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return get(CameraParameters::KEY_PICTURE_FORMAT);
3500370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3510370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3520370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinvoid CameraParameters2::dump() const
3530370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3540370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    ALOGD("dump: mMap.size = %d", mMap.size());
3550370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    for (size_t i = 0; i < mMap.size(); i++) {
3560370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        String8 k, v;
3570370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        k = mMap.keyAt(i);
3580370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        v = mMap.valueAt(i);
3590370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ALOGD("%s: %s\n", k.string(), v.string());
3600370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
3610370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3620370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3630370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinstatus_t CameraParameters2::dump(int fd, const Vector<String16>& args) const
3640370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
3650370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const size_t SIZE = 256;
3660370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    char buffer[SIZE];
3670370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    String8 result;
3680370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    snprintf(buffer, 255, "CameraParameters2::dump: mMap.size = %zu\n", mMap.size());
3690370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    result.append(buffer);
3700370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    for (size_t i = 0; i < mMap.size(); i++) {
3710370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        String8 k, v;
3720370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        k = mMap.keyAt(i);
3730370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        v = mMap.valueAt(i);
3740370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        snprintf(buffer, 255, "\t%s: %s\n", k.string(), v.string());
3750370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        result.append(buffer);
3760370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    }
3770370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    write(fd, result.string(), result.size());
3780370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    return NO_ERROR;
3790370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}
3800370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
3810370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}; // namespace android
382