| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_HARDWARE_CAMERA_PARAMETERS2_H |
| #define ANDROID_HARDWARE_CAMERA_PARAMETERS2_H |
| |
| #include <utils/Vector.h> |
| #include <utils/String8.h> |
| #include "CameraParameters.h" |
| |
| namespace android { |
| |
| /** |
| * A copy of CameraParameters plus ABI-breaking changes. Needed |
| * because some camera HALs directly link to CameraParameters and cannot |
| * tolerate an ABI change. |
| */ |
| class CameraParameters2 |
| { |
| public: |
| CameraParameters2(); |
| CameraParameters2(const String8 ¶ms) { unflatten(params); } |
| ~CameraParameters2(); |
| |
| String8 flatten() const; |
| void unflatten(const String8 ¶ms); |
| |
| void set(const char *key, const char *value); |
| void set(const char *key, int value); |
| void setFloat(const char *key, float value); |
| // Look up string value by key. |
| // -- The string remains valid until the next set/remove of the same key, |
| // or until the map gets cleared. |
| const char *get(const char *key) const; |
| int getInt(const char *key) const; |
| float getFloat(const char *key) const; |
| |
| // Compare the order that key1 was set vs the order that key2 was set. |
| // |
| // Sets the order parameter to an integer less than, equal to, or greater |
| // than zero if key1's set order was respectively, to be less than, to |
| // match, or to be greater than key2's set order. |
| // |
| // Error codes: |
| // * NAME_NOT_FOUND - if either key has not been set previously |
| // * BAD_VALUE - if any of the parameters are NULL |
| status_t compareSetOrder(const char *key1, const char *key2, |
| /*out*/ |
| int *order) const; |
| |
| void remove(const char *key); |
| |
| void setPreviewSize(int width, int height); |
| void getPreviewSize(int *width, int *height) const; |
| void getSupportedPreviewSizes(Vector<Size> &sizes) const; |
| |
| // Set the dimensions in pixels to the given width and height |
| // for video frames. The given width and height must be one |
| // of the supported dimensions returned from |
| // getSupportedVideoSizes(). Must not be called if |
| // getSupportedVideoSizes() returns an empty Vector of Size. |
| void setVideoSize(int width, int height); |
| // Retrieve the current dimensions (width and height) |
| // in pixels for video frames, which must be one of the |
| // supported dimensions returned from getSupportedVideoSizes(). |
| // Must not be called if getSupportedVideoSizes() returns an |
| // empty Vector of Size. |
| void getVideoSize(int *width, int *height) const; |
| // Retrieve a Vector of supported dimensions (width and height) |
| // in pixels for video frames. If sizes returned from the method |
| // is empty, the camera does not support calls to setVideoSize() |
| // or getVideoSize(). In adddition, it also indicates that |
| // the camera only has a single output, and does not have |
| // separate output for video frames and preview frame. |
| void getSupportedVideoSizes(Vector<Size> &sizes) const; |
| // Retrieve the preferred preview size (width and height) in pixels |
| // for video recording. The given width and height must be one of |
| // supported preview sizes returned from getSupportedPreviewSizes(). |
| // Must not be called if getSupportedVideoSizes() returns an empty |
| // Vector of Size. If getSupportedVideoSizes() returns an empty |
| // Vector of Size, the width and height returned from this method |
| // is invalid, and is "-1x-1". |
| void getPreferredPreviewSizeForVideo(int *width, int *height) const; |
| |
| void setPreviewFrameRate(int fps); |
| int getPreviewFrameRate() const; |
| void getPreviewFpsRange(int *min_fps, int *max_fps) const; |
| void setPreviewFpsRange(int min_fps, int max_fps); |
| void setPreviewFormat(const char *format); |
| const char *getPreviewFormat() const; |
| void setPictureSize(int width, int height); |
| void getPictureSize(int *width, int *height) const; |
| void getSupportedPictureSizes(Vector<Size> &sizes) const; |
| void setPictureFormat(const char *format); |
| const char *getPictureFormat() const; |
| |
| void dump() const; |
| status_t dump(int fd, const Vector<String16>& args) const; |
| |
| private: |
| |
| // Quick and dirty map that maintains insertion order |
| template <typename KeyT, typename ValueT> |
| struct OrderedKeyedVector { |
| |
| ssize_t add(const KeyT& key, const ValueT& value) { |
| return mList.add(Pair(key, value)); |
| } |
| |
| size_t size() const { |
| return mList.size(); |
| } |
| |
| const KeyT& keyAt(size_t idx) const { |
| return mList[idx].mKey; |
| } |
| |
| const ValueT& valueAt(size_t idx) const { |
| return mList[idx].mValue; |
| } |
| |
| const ValueT& valueFor(const KeyT& key) const { |
| ssize_t i = indexOfKey(key); |
| LOG_ALWAYS_FATAL_IF(i<0, "%s: key not found", __PRETTY_FUNCTION__); |
| |
| return valueAt(i); |
| } |
| |
| ssize_t indexOfKey(const KeyT& key) const { |
| size_t vectorIdx = 0; |
| for (; vectorIdx < mList.size(); ++vectorIdx) { |
| if (mList[vectorIdx].mKey == key) { |
| return (ssize_t) vectorIdx; |
| } |
| } |
| |
| return NAME_NOT_FOUND; |
| } |
| |
| ssize_t removeItem(const KeyT& key) { |
| size_t vectorIdx = (size_t) indexOfKey(key); |
| |
| if (vectorIdx < 0) { |
| return vectorIdx; |
| } |
| |
| return mList.removeAt(vectorIdx); |
| } |
| |
| void clear() { |
| mList.clear(); |
| } |
| |
| // Same as removing and re-adding. The key's index changes to max. |
| ssize_t replaceValueFor(const KeyT& key, const ValueT& value) { |
| removeItem(key); |
| return add(key, value); |
| } |
| |
| private: |
| |
| struct Pair { |
| Pair() : mKey(), mValue() {} |
| Pair(const KeyT& key, const ValueT& value) : |
| mKey(key), |
| mValue(value) {} |
| KeyT mKey; |
| ValueT mValue; |
| }; |
| |
| Vector<Pair> mList; |
| }; |
| |
| /** |
| * Order matters: Keys that are set() later are stored later in the map. |
| * |
| * If two keys have meaning that conflict, then the later-set key |
| * wins. |
| * |
| * For example, preview FPS and preview FPS range conflict since only |
| * we only want to use the FPS range if that's the last thing that was set. |
| * So in that case, only use preview FPS range if it was set later than |
| * the preview FPS. |
| */ |
| OrderedKeyedVector<String8,String8> mMap; |
| }; |
| |
| }; // namespace android |
| |
| #endif |