| /* |
| * 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 VENDOR_TAG_DESCRIPTOR_H |
| |
| #include <binder/Parcelable.h> |
| #include <utils/Vector.h> |
| #include <utils/KeyedVector.h> |
| #include <utils/String8.h> |
| #include <utils/RefBase.h> |
| #include <system/camera_vendor_tags.h> |
| #include <unordered_map> |
| #include <stdint.h> |
| |
| namespace android { |
| |
| class VendorTagDescriptor; |
| |
| namespace hardware { |
| namespace camera2 { |
| namespace params { |
| |
| /** |
| * VendorTagDescriptor objects are parcelable containers for the vendor tag |
| * definitions provided, and are typically used to pass the vendor tag |
| * information enumerated by the HAL to clients of the camera service. |
| */ |
| class VendorTagDescriptor : public Parcelable { |
| public: |
| virtual ~VendorTagDescriptor(); |
| |
| VendorTagDescriptor(); |
| VendorTagDescriptor(const VendorTagDescriptor& src); |
| VendorTagDescriptor& operator=(const VendorTagDescriptor& rhs); |
| |
| void copyFrom(const VendorTagDescriptor& src); |
| |
| /** |
| * The following 'get*' methods implement the corresponding |
| * functions defined in |
| * system/media/camera/include/system/camera_vendor_tags.h |
| */ |
| |
| // Returns the number of vendor tags defined. |
| int getTagCount() const; |
| |
| // Returns an array containing the id's of vendor tags defined. |
| void getTagArray(uint32_t* tagArray) const; |
| |
| // Returns the section name string for a given vendor tag id. |
| const char* getSectionName(uint32_t tag) const; |
| |
| // Returns the tag name string for a given vendor tag id. |
| const char* getTagName(uint32_t tag) const; |
| |
| // Returns the tag type for a given vendor tag id. |
| int getTagType(uint32_t tag) const; |
| |
| /** |
| * Write the VendorTagDescriptor object into the given parcel. |
| * |
| * Returns OK on success, or a negative error code. |
| */ |
| virtual status_t writeToParcel( |
| /*out*/ |
| android::Parcel* parcel) const override; |
| |
| /** |
| * Convenience method to get a vector containing all vendor tag |
| * sections, or an empty vector if none are defined. |
| * The pointer is valid for the lifetime of the VendorTagDescriptor, |
| * or until readParcel or copyFrom is invoked. |
| */ |
| const SortedVector<String8>* getAllSectionNames() const; |
| |
| /** |
| * Lookup the tag id for a given tag name and section. |
| * |
| * Returns OK on success, or a negative error code. |
| */ |
| status_t lookupTag(const String8& name, const String8& section, /*out*/uint32_t* tag) const; |
| |
| /** |
| * Dump the currently configured vendor tags to a file descriptor. |
| */ |
| void dump(int fd, int verbosity, int indentation) const; |
| |
| /** |
| * Read values VendorTagDescriptor object from the given parcel. |
| * |
| * Returns OK on success, or a negative error code. |
| */ |
| virtual status_t readFromParcel(const android::Parcel* parcel) override; |
| |
| protected: |
| KeyedVector<String8, KeyedVector<String8, uint32_t>*> mReverseMapping; |
| KeyedVector<uint32_t, String8> mTagToNameMap; |
| KeyedVector<uint32_t, uint32_t> mTagToSectionMap; // Value is offset in mSections |
| KeyedVector<uint32_t, int32_t> mTagToTypeMap; |
| SortedVector<String8> mSections; |
| // must be int32_t to be compatible with Parcel::writeInt32 |
| int32_t mTagCount; |
| |
| vendor_tag_ops mVendorOps; |
| }; |
| } /* namespace params */ |
| } /* namespace camera2 */ |
| } /* namespace hardware */ |
| |
| /** |
| * This version of VendorTagDescriptor must be stored in Android sp<>, and adds support for using it |
| * as a global tag descriptor. |
| * |
| * It's a child class of the basic hardware::camera2::params::VendorTagDescriptor since basic |
| * Parcelable objects cannot require being kept in an sp<> and still work with auto-generated AIDL |
| * interface implementations. |
| */ |
| class VendorTagDescriptor : |
| public ::android::hardware::camera2::params::VendorTagDescriptor, |
| public LightRefBase<VendorTagDescriptor> { |
| |
| public: |
| |
| /** |
| * Create a VendorTagDescriptor object from the given vendor_tag_ops_t |
| * struct. |
| * |
| * Returns OK on success, or a negative error code. |
| */ |
| static status_t createDescriptorFromOps(const vendor_tag_ops_t* vOps, |
| /*out*/ |
| sp<VendorTagDescriptor>& descriptor); |
| |
| /** |
| * Sets the global vendor tag descriptor to use for this process. |
| * Camera metadata operations that access vendor tags will use the |
| * vendor tag definitions set this way. |
| * |
| * Returns OK on success, or a negative error code. |
| */ |
| static status_t setAsGlobalVendorTagDescriptor(const sp<VendorTagDescriptor>& desc); |
| |
| /** |
| * Returns the global vendor tag descriptor used by this process. |
| * This will contain NULL if no vendor tags are defined. |
| */ |
| static sp<VendorTagDescriptor> getGlobalVendorTagDescriptor(); |
| |
| /** |
| * Clears the global vendor tag descriptor used by this process. |
| */ |
| static void clearGlobalVendorTagDescriptor(); |
| |
| }; |
| |
| namespace hardware { |
| namespace camera2 { |
| namespace params { |
| |
| class VendorTagDescriptorCache : public Parcelable { |
| public: |
| |
| VendorTagDescriptorCache() {}; |
| |
| int32_t addVendorDescriptor(metadata_vendor_id_t id, |
| sp<android::VendorTagDescriptor> desc); |
| |
| int32_t getVendorTagDescriptor( |
| metadata_vendor_id_t id, |
| sp<android::VendorTagDescriptor> *desc /*out*/); |
| |
| // Parcelable interface |
| status_t writeToParcel(Parcel* parcel) const override; |
| status_t readFromParcel(const Parcel* parcel) override; |
| |
| // Returns the number of vendor tags defined. |
| int getTagCount(metadata_vendor_id_t id) const; |
| |
| // Returns an array containing the id's of vendor tags defined. |
| void getTagArray(uint32_t* tagArray, metadata_vendor_id_t id) const; |
| |
| // Returns the section name string for a given vendor tag id. |
| const char* getSectionName(uint32_t tag, metadata_vendor_id_t id) const; |
| |
| // Returns the tag name string for a given vendor tag id. |
| const char* getTagName(uint32_t tag, metadata_vendor_id_t id) const; |
| |
| // Returns the tag type for a given vendor tag id. |
| int getTagType(uint32_t tag, metadata_vendor_id_t id) const; |
| |
| /** |
| * Dump the currently configured vendor tags to a file descriptor. |
| */ |
| void dump(int fd, int verbosity, int indentation) const; |
| |
| protected: |
| std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> mVendorMap; |
| struct vendor_tag_cache_ops mVendorCacheOps; |
| }; |
| |
| } /* namespace params */ |
| } /* namespace camera2 */ |
| } /* namespace hardware */ |
| |
| class VendorTagDescriptorCache : |
| public ::android::hardware::camera2::params::VendorTagDescriptorCache, |
| public LightRefBase<VendorTagDescriptorCache> { |
| public: |
| |
| /** |
| * Sets the global vendor tag descriptor cache to use for this process. |
| * Camera metadata operations that access vendor tags will use the |
| * vendor tag definitions set this way. |
| * |
| * Returns OK on success, or a negative error code. |
| */ |
| static status_t setAsGlobalVendorTagCache( |
| const sp<VendorTagDescriptorCache>& cache); |
| |
| /** |
| * Returns the global vendor tag cache used by this process. |
| * This will contain NULL if no vendor tags are defined. |
| */ |
| static sp<VendorTagDescriptorCache> getGlobalVendorTagCache(); |
| |
| /** |
| * Clears the global vendor tag cache used by this process. |
| */ |
| static void clearGlobalVendorTagCache(); |
| |
| }; |
| |
| } /* namespace android */ |
| |
| #define VENDOR_TAG_DESCRIPTOR_H |
| #endif /* VENDOR_TAG_DESCRIPTOR_H */ |