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 <utils/Vector.h>
20#include <utils/KeyedVector.h>
21#include <utils/String8.h>
22#include <utils/RefBase.h>
23#include <system/camera_vendor_tags.h>
24
25#include <stdint.h>
26
27namespace android {
28
29class Parcel;
30
31/**
32 * VendorTagDescriptor objects are parcelable containers for the vendor tag
33 * definitions provided, and are typically used to pass the vendor tag
34 * information enumerated by the HAL to clients of the camera service.
35 */
36class VendorTagDescriptor
37        : public LightRefBase<VendorTagDescriptor> {
38    public:
39        virtual ~VendorTagDescriptor();
40
41        /**
42         * The following 'get*' methods implement the corresponding
43         * functions defined in
44         * system/media/camera/include/system/camera_vendor_tags.h
45         */
46
47        // Returns the number of vendor tags defined.
48        int getTagCount() const;
49
50        // Returns an array containing the id's of vendor tags defined.
51        void getTagArray(uint32_t* tagArray) const;
52
53        // Returns the section name string for a given vendor tag id.
54        const char* getSectionName(uint32_t tag) const;
55
56        // Returns the tag name string for a given vendor tag id.
57        const char* getTagName(uint32_t tag) const;
58
59        // Returns the tag type for a given vendor tag id.
60        int getTagType(uint32_t tag) const;
61
62        /**
63         * Write the VendorTagDescriptor object into the given parcel.
64         *
65         * Returns OK on success, or a negative error code.
66         */
67        status_t writeToParcel(
68                /*out*/
69                Parcel* parcel) const;
70
71        /**
72         * Convenience method to get a vector containing all vendor tag
73         * sections, or an empty vector if none are defined.
74         */
75        SortedVector<String8> getAllSectionNames() const;
76
77        /**
78         * Lookup the tag id for a given tag name and section.
79         *
80         * Returns OK on success, or a negative error code.
81         */
82        status_t lookupTag(String8 name, String8 section, /*out*/uint32_t* tag) const;
83
84        /**
85         * Dump the currently configured vendor tags to a file descriptor.
86         */
87        void dump(int fd, int verbosity, int indentation) const;
88
89        // Static methods:
90
91        /**
92         * Create a VendorTagDescriptor object from the given parcel.
93         *
94         * Returns OK on success, or a negative error code.
95         */
96        static status_t createFromParcel(const Parcel* parcel,
97                /*out*/
98                sp<VendorTagDescriptor>& descriptor);
99
100        /**
101         * Create a VendorTagDescriptor object from the given vendor_tag_ops_t
102         * struct.
103         *
104         * Returns OK on success, or a negative error code.
105         */
106        static status_t createDescriptorFromOps(const vendor_tag_ops_t* vOps,
107                /*out*/
108                sp<VendorTagDescriptor>& descriptor);
109
110        /**
111         * Sets the global vendor tag descriptor to use for this process.
112         * Camera metadata operations that access vendor tags will use the
113         * vendor tag definitions set this way.
114         *
115         * Returns OK on success, or a negative error code.
116         */
117        static status_t setAsGlobalVendorTagDescriptor(const sp<VendorTagDescriptor>& desc);
118
119        /**
120         * Clears the global vendor tag descriptor used by this process.
121         */
122        static void clearGlobalVendorTagDescriptor();
123
124        /**
125         * Returns the global vendor tag descriptor used by this process.
126         * This will contain NULL if no vendor tags are defined.
127         */
128        static sp<VendorTagDescriptor> getGlobalVendorTagDescriptor();
129    protected:
130        VendorTagDescriptor();
131        KeyedVector<String8, KeyedVector<String8, uint32_t>*> mReverseMapping;
132        KeyedVector<uint32_t, String8> mTagToNameMap;
133        KeyedVector<uint32_t, uint32_t> mTagToSectionMap; // Value is offset in mSections
134        KeyedVector<uint32_t, int32_t> mTagToTypeMap;
135        SortedVector<String8> mSections;
136        // must be int32_t to be compatible with Parcel::writeInt32
137        int32_t mTagCount;
138    private:
139        vendor_tag_ops mVendorOps;
140};
141
142} /* namespace android */
143
144#define VENDOR_TAG_DESCRIPTOR_H
145#endif /* VENDOR_TAG_DESCRIPTOR_H */
146