10b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin/*
20b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Copyright (C) 2014 The Android Open Source Project
30b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *
40b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
50b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * you may not use this file except in compliance with the License.
60b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * You may obtain a copy of the License at
70b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *
80b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
90b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin *
100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * Unless required by applicable law or agreed to in writing, software
110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * See the License for the specific language governing permissions and
140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * limitations under the License.
150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */
160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#ifndef ANDROID_HARDWARE_CAMERA_PARAMETERS2_H
180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#define ANDROID_HARDWARE_CAMERA_PARAMETERS2_H
190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include <utils/Vector.h>
210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include <utils/String8.h>
220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#include "CameraParameters.h"
230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinnamespace android {
250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin/**
270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * A copy of CameraParameters plus ABI-breaking changes. Needed
280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * because some camera HALs directly link to CameraParameters and cannot
290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin * tolerate an ABI change.
300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin */
310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinclass CameraParameters2
320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin{
330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinpublic:
340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    CameraParameters2();
350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    CameraParameters2(const String8 &params) { unflatten(params); }
360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    ~CameraParameters2();
370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    String8 flatten() const;
390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void unflatten(const String8 &params);
400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void set(const char *key, const char *value);
420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void set(const char *key, int value);
430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setFloat(const char *key, float value);
440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Look up string value by key.
450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // -- The string remains valid until the next set/remove of the same key,
460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //    or until the map gets cleared.
470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    const char *get(const char *key) const;
480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    int getInt(const char *key) const;
490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    float getFloat(const char *key) const;
500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Compare the order that key1 was set vs the order that key2 was set.
520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //
530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Sets the order parameter to an integer less than, equal to, or greater
540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // than zero if key1's set order was respectively, to be less than, to
550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // match, or to be greater than key2's set order.
560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //
570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Error codes:
580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //  * NAME_NOT_FOUND - if either key has not been set previously
590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //  * BAD_VALUE - if any of the parameters are NULL
600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    status_t compareSetOrder(const char *key1, const char *key2,
610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            /*out*/
620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            int *order) const;
630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void remove(const char *key);
650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setPreviewSize(int width, int height);
670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getPreviewSize(int *width, int *height) const;
680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getSupportedPreviewSizes(Vector<Size> &sizes) const;
690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Set the dimensions in pixels to the given width and height
710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // for video frames. The given width and height must be one
720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // of the supported dimensions returned from
730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // getSupportedVideoSizes(). Must not be called if
740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // getSupportedVideoSizes() returns an empty Vector of Size.
750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setVideoSize(int width, int height);
760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Retrieve the current dimensions (width and height)
770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // in pixels for video frames, which must be one of the
780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // supported dimensions returned from getSupportedVideoSizes().
790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Must not be called if getSupportedVideoSizes() returns an
800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // empty Vector of Size.
810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getVideoSize(int *width, int *height) const;
820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Retrieve a Vector of supported dimensions (width and height)
830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // in pixels for video frames. If sizes returned from the method
840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // is empty, the camera does not support calls to setVideoSize()
850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // or getVideoSize(). In adddition, it also indicates that
860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // the camera only has a single output, and does not have
870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // separate output for video frames and preview frame.
880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getSupportedVideoSizes(Vector<Size> &sizes) const;
890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Retrieve the preferred preview size (width and height) in pixels
900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // for video recording. The given width and height must be one of
910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // supported preview sizes returned from getSupportedPreviewSizes().
920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Must not be called if getSupportedVideoSizes() returns an empty
930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Vector of Size. If getSupportedVideoSizes() returns an empty
940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Vector of Size, the width and height returned from this method
950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // is invalid, and is "-1x-1".
960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getPreferredPreviewSizeForVideo(int *width, int *height) const;
970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setPreviewFrameRate(int fps);
990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    int getPreviewFrameRate() const;
1000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getPreviewFpsRange(int *min_fps, int *max_fps) const;
1010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setPreviewFpsRange(int min_fps, int max_fps);
1020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setPreviewFormat(const char *format);
1030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    const char *getPreviewFormat() const;
1040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setPictureSize(int width, int height);
1050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getPictureSize(int *width, int *height) const;
1060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void getSupportedPictureSizes(Vector<Size> &sizes) const;
1070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void setPictureFormat(const char *format);
1080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    const char *getPictureFormat() const;
1090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    void dump() const;
1110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    status_t dump(int fd, const Vector<String16>& args) const;
1120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkinprivate:
1140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Quick and dirty map that maintains insertion order
1160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    template <typename KeyT, typename ValueT>
1170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    struct OrderedKeyedVector {
1180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ssize_t add(const KeyT& key, const ValueT& value) {
1200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return mList.add(Pair(key, value));
1210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        size_t size() const {
1240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return mList.size();
1250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        const KeyT& keyAt(size_t idx) const {
1280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return mList[idx].mKey;
1290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        const ValueT& valueAt(size_t idx) const {
1320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return mList[idx].mValue;
1330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        const ValueT& valueFor(const KeyT& key) const {
1360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ssize_t i = indexOfKey(key);
1370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            LOG_ALWAYS_FATAL_IF(i<0, "%s: key not found", __PRETTY_FUNCTION__);
1380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return valueAt(i);
1400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ssize_t indexOfKey(const KeyT& key) const {
1430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                size_t vectorIdx = 0;
1440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                for (; vectorIdx < mList.size(); ++vectorIdx) {
1450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    if (mList[vectorIdx].mKey == key) {
1460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                        return (ssize_t) vectorIdx;
1470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    }
1480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                }
1490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                return NAME_NOT_FOUND;
1510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ssize_t removeItem(const KeyT& key) {
1540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            size_t vectorIdx = (size_t) indexOfKey(key);
1550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            if (vectorIdx < 0) {
1570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                return vectorIdx;
1580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            }
1590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return mList.removeAt(vectorIdx);
1610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        void clear() {
1640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            mList.clear();
1650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Same as removing and re-adding. The key's index changes to max.
1680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ssize_t replaceValueFor(const KeyT& key, const ValueT& value) {
1690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            removeItem(key);
1700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return add(key, value);
1710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    private:
1740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        struct Pair {
1760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            Pair() : mKey(), mValue() {}
1770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            Pair(const KeyT& key, const ValueT& value) :
1780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    mKey(key),
1790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    mValue(value) {}
1800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            KeyT   mKey;
1810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ValueT mValue;
1820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        };
1830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        Vector<Pair> mList;
1850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    };
1860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    /**
1880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Order matters: Keys that are set() later are stored later in the map.
1890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
1900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * If two keys have meaning that conflict, then the later-set key
1910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * wins.
1920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
1930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * For example, preview FPS and preview FPS range conflict since only
1940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * we only want to use the FPS range if that's the last thing that was set.
1950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * So in that case, only use preview FPS range if it was set later than
1960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * the preview FPS.
1970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     */
1980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    OrderedKeyedVector<String8,String8>    mMap;
1990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin};
2000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin}; // namespace android
2020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin#endif
204