Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef VENDOR_TAG_DESCRIPTOR_H
     18 
     19 #include <binder/Parcelable.h>
     20 #include <utils/Vector.h>
     21 #include <utils/KeyedVector.h>
     22 #include <utils/String8.h>
     23 #include <utils/RefBase.h>
     24 #include <system/camera_vendor_tags.h>
     25 #include <unordered_map>
     26 #include <stdint.h>
     27 
     28 namespace android {
     29 
     30 class VendorTagDescriptor;
     31 
     32 namespace hardware {
     33 namespace camera2 {
     34 namespace params {
     35 
     36 /**
     37  * VendorTagDescriptor objects are parcelable containers for the vendor tag
     38  * definitions provided, and are typically used to pass the vendor tag
     39  * information enumerated by the HAL to clients of the camera service.
     40  */
     41 class VendorTagDescriptor : public Parcelable {
     42     public:
     43         virtual ~VendorTagDescriptor();
     44 
     45         VendorTagDescriptor();
     46         VendorTagDescriptor(const VendorTagDescriptor& src);
     47         VendorTagDescriptor& operator=(const VendorTagDescriptor& rhs);
     48 
     49         void copyFrom(const VendorTagDescriptor& src);
     50 
     51         /**
     52          * The following 'get*' methods implement the corresponding
     53          * functions defined in
     54          * system/media/camera/include/system/camera_vendor_tags.h
     55          */
     56 
     57         // Returns the number of vendor tags defined.
     58         int getTagCount() const;
     59 
     60         // Returns an array containing the id's of vendor tags defined.
     61         void getTagArray(uint32_t* tagArray) const;
     62 
     63         // Returns the section name string for a given vendor tag id.
     64         const char* getSectionName(uint32_t tag) const;
     65 
     66         // Returns the tag name string for a given vendor tag id.
     67         const char* getTagName(uint32_t tag) const;
     68 
     69         // Returns the tag type for a given vendor tag id.
     70         int getTagType(uint32_t tag) const;
     71 
     72         /**
     73          * Write the VendorTagDescriptor object into the given parcel.
     74          *
     75          * Returns OK on success, or a negative error code.
     76          */
     77         virtual status_t writeToParcel(
     78                 /*out*/
     79                 android::Parcel* parcel) const override;
     80 
     81         /**
     82          * Convenience method to get a vector containing all vendor tag
     83          * sections, or an empty vector if none are defined.
     84          * The pointer is valid for the lifetime of the VendorTagDescriptor,
     85          * or until readParcel or copyFrom is invoked.
     86          */
     87         const SortedVector<String8>* getAllSectionNames() const;
     88 
     89         /**
     90          * Lookup the tag id for a given tag name and section.
     91          *
     92          * Returns OK on success, or a negative error code.
     93          */
     94         status_t lookupTag(const String8& name, const String8& section, /*out*/uint32_t* tag) const;
     95 
     96         /**
     97          * Dump the currently configured vendor tags to a file descriptor.
     98          */
     99         void dump(int fd, int verbosity, int indentation) const;
    100 
    101         /**
    102          * Get Section for corresponding tag.
    103          */
    104         ssize_t getSectionIndex(uint32_t tag) const;
    105 
    106         /**
    107          * Read values VendorTagDescriptor object from the given parcel.
    108          *
    109          * Returns OK on success, or a negative error code.
    110          */
    111         virtual status_t readFromParcel(const android::Parcel* parcel) override;
    112 
    113     protected:
    114         KeyedVector<String8, KeyedVector<String8, uint32_t>*> mReverseMapping;
    115         KeyedVector<uint32_t, String8> mTagToNameMap;
    116         KeyedVector<uint32_t, uint32_t> mTagToSectionMap; // Value is offset in mSections
    117         KeyedVector<uint32_t, int32_t> mTagToTypeMap;
    118         SortedVector<String8> mSections;
    119         // must be int32_t to be compatible with Parcel::writeInt32
    120         int32_t mTagCount;
    121 
    122         vendor_tag_ops mVendorOps;
    123 };
    124 } /* namespace params */
    125 } /* namespace camera2 */
    126 } /* namespace hardware */
    127 
    128 /**
    129  * This version of VendorTagDescriptor must be stored in Android sp<>, and adds support for using it
    130  * as a global tag descriptor.
    131  *
    132  * It's a child class of the basic hardware::camera2::params::VendorTagDescriptor since basic
    133  * Parcelable objects cannot require being kept in an sp<> and still work with auto-generated AIDL
    134  * interface implementations.
    135  */
    136 class VendorTagDescriptor :
    137             public ::android::hardware::camera2::params::VendorTagDescriptor,
    138             public LightRefBase<VendorTagDescriptor> {
    139 
    140   public:
    141 
    142     /**
    143      * Create a VendorTagDescriptor object from the given vendor_tag_ops_t
    144      * struct.
    145      *
    146      * Returns OK on success, or a negative error code.
    147      */
    148     static status_t createDescriptorFromOps(const vendor_tag_ops_t* vOps,
    149             /*out*/
    150             sp<VendorTagDescriptor>& descriptor);
    151 
    152     /**
    153      * Sets the global vendor tag descriptor to use for this process.
    154      * Camera metadata operations that access vendor tags will use the
    155      * vendor tag definitions set this way.
    156      *
    157      * Returns OK on success, or a negative error code.
    158      */
    159     static status_t setAsGlobalVendorTagDescriptor(const sp<VendorTagDescriptor>& desc);
    160 
    161     /**
    162      * Returns the global vendor tag descriptor used by this process.
    163      * This will contain NULL if no vendor tags are defined.
    164      */
    165     static sp<VendorTagDescriptor> getGlobalVendorTagDescriptor();
    166 
    167     /**
    168      * Clears the global vendor tag descriptor used by this process.
    169      */
    170     static void clearGlobalVendorTagDescriptor();
    171 
    172 };
    173 
    174 namespace hardware {
    175 namespace camera2 {
    176 namespace params {
    177 
    178 class VendorTagDescriptorCache : public Parcelable {
    179   public:
    180 
    181     VendorTagDescriptorCache() {};
    182 
    183     int32_t addVendorDescriptor(metadata_vendor_id_t id,
    184             sp<android::VendorTagDescriptor> desc);
    185 
    186     int32_t getVendorTagDescriptor(
    187             metadata_vendor_id_t id,
    188             sp<android::VendorTagDescriptor> *desc /*out*/);
    189 
    190     // Parcelable interface
    191     status_t writeToParcel(Parcel* parcel) const override;
    192     status_t readFromParcel(const Parcel* parcel) override;
    193 
    194     // Returns the number of vendor tags defined.
    195     int getTagCount(metadata_vendor_id_t id) const;
    196 
    197     // Returns an array containing the id's of vendor tags defined.
    198     void getTagArray(uint32_t* tagArray, metadata_vendor_id_t id) const;
    199 
    200     // Returns the section name string for a given vendor tag id.
    201     const char* getSectionName(uint32_t tag, metadata_vendor_id_t id) const;
    202 
    203     // Returns the tag name string for a given vendor tag id.
    204     const char* getTagName(uint32_t tag, metadata_vendor_id_t id) const;
    205 
    206     // Returns the tag type for a given vendor tag id.
    207     int getTagType(uint32_t tag, metadata_vendor_id_t id) const;
    208 
    209     /**
    210      * Dump the currently configured vendor tags to a file descriptor.
    211      */
    212     void dump(int fd, int verbosity, int indentation) const;
    213 
    214     const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> &
    215             getVendorIdsAndTagDescriptors();
    216 
    217   protected:
    218     std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> mVendorMap;
    219     struct vendor_tag_cache_ops mVendorCacheOps;
    220 };
    221 
    222 } /* namespace params */
    223 } /* namespace camera2 */
    224 } /* namespace hardware */
    225 
    226 class VendorTagDescriptorCache :
    227         public ::android::hardware::camera2::params::VendorTagDescriptorCache,
    228         public LightRefBase<VendorTagDescriptorCache> {
    229   public:
    230 
    231     /**
    232      * Sets the global vendor tag descriptor cache to use for this process.
    233      * Camera metadata operations that access vendor tags will use the
    234      * vendor tag definitions set this way.
    235      *
    236      * Returns OK on success, or a negative error code.
    237      */
    238     static status_t setAsGlobalVendorTagCache(
    239             const sp<VendorTagDescriptorCache>& cache);
    240 
    241     /**
    242      * Returns the global vendor tag cache used by this process.
    243      * This will contain NULL if no vendor tags are defined.
    244      */
    245     static sp<VendorTagDescriptorCache> getGlobalVendorTagCache();
    246 
    247     /**
    248      * Clears the global vendor tag cache used by this process.
    249      */
    250     static void clearGlobalVendorTagCache();
    251 
    252 };
    253 
    254 } /* namespace android */
    255 
    256 #define VENDOR_TAG_DESCRIPTOR_H
    257 #endif /* VENDOR_TAG_DESCRIPTOR_H */
    258