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 ¶ms) { unflatten(params); } 360370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin ~CameraParameters2(); 370370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin 380370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin String8 flatten() const; 390370be96e33ea0c8fb4069e704deccce43b7403cIgor Murashkin void unflatten(const String8 ¶ms); 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