10370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin/*
20370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * Copyright (C) 2014 The Android Open Source Project
30370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin *
40370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
50370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * you may not use this file except in compliance with the License.
60370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * You may obtain a copy of the License at
70370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin *
80370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
90370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin *
100370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * Unless required by applicable law or agreed to in writing, software
110370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
120370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * See the License for the specific language governing permissions and
140370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * limitations under the License.
150370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin */
160370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
170370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#ifndef ANDROID_HARDWARE_CAMERA_PARAMETERS2_H
180370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#define ANDROID_HARDWARE_CAMERA_PARAMETERS2_H
190370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
200370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#include <utils/Vector.h>
210370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#include <utils/String8.h>
220370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#include "CameraParameters.h"
230370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
240370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinnamespace android {
250370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
260370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin/**
270370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * A copy of CameraParameters plus ABI-breaking changes. Needed
280370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * because some camera HALs directly link to CameraParameters and cannot
290370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin * tolerate an ABI change.
300370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin */
310370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinclass CameraParameters2
320370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin{
330370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinpublic:
340370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    CameraParameters2();
350370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    CameraParameters2(const String8 &params) { unflatten(params); }
360370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    ~CameraParameters2();
370370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
380370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    String8 flatten() const;
390370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void unflatten(const String8 &params);
400370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
410370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void set(const char *key, const char *value);
420370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void set(const char *key, int value);
430370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setFloat(const char *key, float value);
440370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Look up string value by key.
450370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // -- The string remains valid until the next set/remove of the same key,
460370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    //    or until the map gets cleared.
470370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *get(const char *key) const;
480370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    int getInt(const char *key) const;
490370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    float getFloat(const char *key) const;
500370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
510370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Compare the order that key1 was set vs the order that key2 was set.
520370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    //
530370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Sets the order parameter to an integer less than, equal to, or greater
540370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // than zero if key1's set order was respectively, to be less than, to
550370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // match, or to be greater than key2's set order.
560370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    //
570370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Error codes:
580370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    //  * NAME_NOT_FOUND - if either key has not been set previously
590370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    //  * BAD_VALUE - if any of the parameters are NULL
600370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    status_t compareSetOrder(const char *key1, const char *key2,
610370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            /*out*/
620370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            int *order) const;
630370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
640370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void remove(const char *key);
650370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
660370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setPreviewSize(int width, int height);
670370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getPreviewSize(int *width, int *height) const;
680370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getSupportedPreviewSizes(Vector<Size> &sizes) const;
690370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
700370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Set the dimensions in pixels to the given width and height
710370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // for video frames. The given width and height must be one
720370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // of the supported dimensions returned from
730370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // getSupportedVideoSizes(). Must not be called if
740370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // getSupportedVideoSizes() returns an empty Vector of Size.
750370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setVideoSize(int width, int height);
760370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Retrieve the current dimensions (width and height)
770370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // in pixels for video frames, which must be one of the
780370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // supported dimensions returned from getSupportedVideoSizes().
790370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Must not be called if getSupportedVideoSizes() returns an
800370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // empty Vector of Size.
810370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getVideoSize(int *width, int *height) const;
820370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Retrieve a Vector of supported dimensions (width and height)
830370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // in pixels for video frames. If sizes returned from the method
840370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // is empty, the camera does not support calls to setVideoSize()
850370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // or getVideoSize(). In adddition, it also indicates that
860370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // the camera only has a single output, and does not have
870370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // separate output for video frames and preview frame.
880370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getSupportedVideoSizes(Vector<Size> &sizes) const;
890370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Retrieve the preferred preview size (width and height) in pixels
900370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // for video recording. The given width and height must be one of
910370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // supported preview sizes returned from getSupportedPreviewSizes().
920370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Must not be called if getSupportedVideoSizes() returns an empty
930370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Vector of Size. If getSupportedVideoSizes() returns an empty
940370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Vector of Size, the width and height returned from this method
950370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // is invalid, and is "-1x-1".
960370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getPreferredPreviewSizeForVideo(int *width, int *height) const;
970370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
980370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setPreviewFrameRate(int fps);
990370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    int getPreviewFrameRate() const;
1000370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getPreviewFpsRange(int *min_fps, int *max_fps) const;
1010370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setPreviewFpsRange(int min_fps, int max_fps);
1020370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setPreviewFormat(const char *format);
1030370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *getPreviewFormat() const;
1040370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setPictureSize(int width, int height);
1050370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getPictureSize(int *width, int *height) const;
1060370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void getSupportedPictureSizes(Vector<Size> &sizes) const;
1070370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void setPictureFormat(const char *format);
1080370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    const char *getPictureFormat() const;
1090370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1100370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    void dump() const;
1110370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    status_t dump(int fd, const Vector<String16>& args) const;
1120370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1130370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkinprivate:
1140370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1150370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    // Quick and dirty map that maintains insertion order
1160370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    template <typename KeyT, typename ValueT>
1170370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    struct OrderedKeyedVector {
1180370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1190370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ssize_t add(const KeyT& key, const ValueT& value) {
1200370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return mList.add(Pair(key, value));
1210370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1220370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1230370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        size_t size() const {
1240370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return mList.size();
1250370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1260370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1270370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        const KeyT& keyAt(size_t idx) const {
1280370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return mList[idx].mKey;
1290370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1300370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1310370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        const ValueT& valueAt(size_t idx) const {
1320370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return mList[idx].mValue;
1330370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1340370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1350370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        const ValueT& valueFor(const KeyT& key) const {
1360370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            ssize_t i = indexOfKey(key);
1370370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            LOG_ALWAYS_FATAL_IF(i<0, "%s: key not found", __PRETTY_FUNCTION__);
1380370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1390370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return valueAt(i);
1400370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1410370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1420370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ssize_t indexOfKey(const KeyT& key) const {
1430370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                size_t vectorIdx = 0;
1440370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                for (; vectorIdx < mList.size(); ++vectorIdx) {
1450370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                    if (mList[vectorIdx].mKey == key) {
1460370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                        return (ssize_t) vectorIdx;
1470370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                    }
1480370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                }
1490370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1500370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                return NAME_NOT_FOUND;
1510370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1520370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1530370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ssize_t removeItem(const KeyT& key) {
1540370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            size_t vectorIdx = (size_t) indexOfKey(key);
1550370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1560370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            if (vectorIdx < 0) {
1570370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                return vectorIdx;
1580370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            }
1590370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1600370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return mList.removeAt(vectorIdx);
1610370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1620370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1630370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        void clear() {
1640370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            mList.clear();
1650370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1660370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1670370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        // Same as removing and re-adding. The key's index changes to max.
1680370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        ssize_t replaceValueFor(const KeyT& key, const ValueT& value) {
1690370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            removeItem(key);
1700370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            return add(key, value);
1710370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        }
1720370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1730370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    private:
1740370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1750370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        struct Pair {
1760370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            Pair() : mKey(), mValue() {}
1770370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            Pair(const KeyT& key, const ValueT& value) :
1780370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                    mKey(key),
1790370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin                    mValue(value) {}
1800370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            KeyT   mKey;
1810370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin            ValueT mValue;
1820370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        };
1830370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1840370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin        Vector<Pair> mList;
1850370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    };
1860370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
1870370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    /**
1880370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     * Order matters: Keys that are set() later are stored later in the map.
1890370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     *
1900370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     * If two keys have meaning that conflict, then the later-set key
1910370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     * wins.
1920370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     *
1930370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     * For example, preview FPS and preview FPS range conflict since only
1940370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     * we only want to use the FPS range if that's the last thing that was set.
1950370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     * So in that case, only use preview FPS range if it was set later than
1960370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     * the preview FPS.
1970370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin     */
1980370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin    OrderedKeyedVector<String8,String8>    mMap;
1990370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin};
2000370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2010370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin}; // namespace android
2020370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin
2030370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin#endif
204