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 ¶ms) { unflatten(params); } 360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin ~CameraParameters2(); 370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin 380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin String8 flatten() const; 390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin void unflatten(const String8 ¶ms); 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