xref: /aosp_15_r20/frameworks/av/camera/ndk/impl/ACameraMetadata.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker #ifndef _ACAMERA_METADATA_H
17*ec779b8eSAndroid Build Coastguard Worker #define _ACAMERA_METADATA_H
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <unordered_set>
20*ec779b8eSAndroid Build Coastguard Worker #include <vector>
21*ec779b8eSAndroid Build Coastguard Worker #include <memory>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <utils/Mutex.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h>
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker #ifdef __ANDROID_VNDK__
29*ec779b8eSAndroid Build Coastguard Worker #include <CameraMetadata.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/frameworks/cameraservice/common/VendorTag.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/frameworks/cameraservice/common/VendorTagSection.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/frameworks/cameraservice/common/ProviderIdAndVendorTagSections.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <VendorTagDescriptor.h>
34*ec779b8eSAndroid Build Coastguard Worker using CameraMetadata = android::hardware::camera::common::V1_0::helper::CameraMetadata;
35*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::frameworks::cameraservice::common::ProviderIdAndVendorTagSections;
36*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::camera::common::V1_0::helper::VendorTagDescriptor;
37*ec779b8eSAndroid Build Coastguard Worker using ::android::hardware::camera::common::V1_0::helper::VendorTagDescriptorCache;
38*ec779b8eSAndroid Build Coastguard Worker #else
39*ec779b8eSAndroid Build Coastguard Worker #include <camera/CameraMetadata.h>
40*ec779b8eSAndroid Build Coastguard Worker #include <camera/VendorTagDescriptor.h>
41*ec779b8eSAndroid Build Coastguard Worker #endif
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker #include <camera/NdkCameraMetadata.h>
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker using namespace android;
46*ec779b8eSAndroid Build Coastguard Worker 
47*ec779b8eSAndroid Build Coastguard Worker /**
48*ec779b8eSAndroid Build Coastguard Worker  * ACameraMetadata is an opaque struct definition.
49*ec779b8eSAndroid Build Coastguard Worker  * It is intentionally left outside of the android namespace because it's NDK struct.
50*ec779b8eSAndroid Build Coastguard Worker  */
51*ec779b8eSAndroid Build Coastguard Worker struct ACameraMetadata : public RefBase {
52*ec779b8eSAndroid Build Coastguard Worker   public:
53*ec779b8eSAndroid Build Coastguard Worker     typedef enum {
54*ec779b8eSAndroid Build Coastguard Worker         ACM_CHARACTERISTICS, // Read only
55*ec779b8eSAndroid Build Coastguard Worker         ACM_REQUEST,         // Read/Write
56*ec779b8eSAndroid Build Coastguard Worker         ACM_RESULT,          // Read only
57*ec779b8eSAndroid Build Coastguard Worker     } ACAMERA_METADATA_TYPE;
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker     // Constructs a ACameraMetadata that takes ownership of `buffer`.
60*ec779b8eSAndroid Build Coastguard Worker     ACameraMetadata(camera_metadata_t* buffer, ACAMERA_METADATA_TYPE type);
61*ec779b8eSAndroid Build Coastguard Worker 
62*ec779b8eSAndroid Build Coastguard Worker     // Constructs a ACameraMetadata that shares its data with something else, like a Java object
63*ec779b8eSAndroid Build Coastguard Worker     ACameraMetadata(const std::shared_ptr<CameraMetadata>& cameraMetadata,
64*ec779b8eSAndroid Build Coastguard Worker             ACAMERA_METADATA_TYPE type);
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker     // Copy constructor.
67*ec779b8eSAndroid Build Coastguard Worker     //
68*ec779b8eSAndroid Build Coastguard Worker     // Always makes a deep copy.
69*ec779b8eSAndroid Build Coastguard Worker     ACameraMetadata(const ACameraMetadata& other);
70*ec779b8eSAndroid Build Coastguard Worker 
71*ec779b8eSAndroid Build Coastguard Worker     ~ACameraMetadata();
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker     camera_status_t getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) const;
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker     camera_status_t update(uint32_t tag, uint32_t count, const uint8_t* data);
76*ec779b8eSAndroid Build Coastguard Worker     camera_status_t update(uint32_t tag, uint32_t count, const int32_t* data);
77*ec779b8eSAndroid Build Coastguard Worker     camera_status_t update(uint32_t tag, uint32_t count, const float* data);
78*ec779b8eSAndroid Build Coastguard Worker     camera_status_t update(uint32_t tag, uint32_t count, const double* data);
79*ec779b8eSAndroid Build Coastguard Worker     camera_status_t update(uint32_t tag, uint32_t count, const int64_t* data);
80*ec779b8eSAndroid Build Coastguard Worker     camera_status_t update(uint32_t tag, uint32_t count, const ACameraMetadata_rational* data);
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     camera_status_t getTags(/*out*/int32_t* numTags,
83*ec779b8eSAndroid Build Coastguard Worker                             /*out*/const uint32_t** tags) const;
84*ec779b8eSAndroid Build Coastguard Worker     camera_status_t
85*ec779b8eSAndroid Build Coastguard Worker     getTagFromName(const char *name, uint32_t *tag) const;
86*ec779b8eSAndroid Build Coastguard Worker 
87*ec779b8eSAndroid Build Coastguard Worker     const CameraMetadata& getInternalData() const;
88*ec779b8eSAndroid Build Coastguard Worker     bool isLogicalMultiCamera(size_t* count, const char* const** physicalCameraIds) const;
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker   private:
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker     // Common code called by constructors.
93*ec779b8eSAndroid Build Coastguard Worker     void init();
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker     // This function does not check whether the capability passed to it is valid.
96*ec779b8eSAndroid Build Coastguard Worker     // The caller must make sure that it is.
97*ec779b8eSAndroid Build Coastguard Worker     bool isNdkSupportedCapability(const int32_t capability);
98*ec779b8eSAndroid Build Coastguard Worker     static inline bool isVendorTag(const uint32_t tag);
99*ec779b8eSAndroid Build Coastguard Worker     static bool isCaptureRequestTag(const uint32_t tag);
100*ec779b8eSAndroid Build Coastguard Worker     void filterUnsupportedFeatures(); // Hide features not yet supported by NDK
101*ec779b8eSAndroid Build Coastguard Worker     void filterStreamConfigurations(); // Hide input streams, translate hal format to NDK formats
102*ec779b8eSAndroid Build Coastguard Worker     void filterDurations(uint32_t tag); // translate hal format to NDK formats
103*ec779b8eSAndroid Build Coastguard Worker     void derivePhysicalCameraIds(); // Derive array of physical ids.
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     template<typename INTERNAL_T, typename NDK_T>
updateImplACameraMetadata106*ec779b8eSAndroid Build Coastguard Worker     camera_status_t updateImpl(uint32_t tag, uint32_t count, const NDK_T* data) {
107*ec779b8eSAndroid Build Coastguard Worker         if (mType != ACM_REQUEST) {
108*ec779b8eSAndroid Build Coastguard Worker             ALOGE("Error: Write to metadata is only allowed for capture request!");
109*ec779b8eSAndroid Build Coastguard Worker             return ACAMERA_ERROR_INVALID_PARAMETER;
110*ec779b8eSAndroid Build Coastguard Worker         }
111*ec779b8eSAndroid Build Coastguard Worker         if (!isCaptureRequestTag(tag)) {
112*ec779b8eSAndroid Build Coastguard Worker             ALOGE("Error: tag %d is not writable!", tag);
113*ec779b8eSAndroid Build Coastguard Worker             return ACAMERA_ERROR_INVALID_PARAMETER;
114*ec779b8eSAndroid Build Coastguard Worker         }
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker         Mutex::Autolock _l(mLock);
117*ec779b8eSAndroid Build Coastguard Worker 
118*ec779b8eSAndroid Build Coastguard Worker         status_t ret = OK;
119*ec779b8eSAndroid Build Coastguard Worker         if (count == 0 && data == nullptr) {
120*ec779b8eSAndroid Build Coastguard Worker             ret = mData->erase(tag);
121*ec779b8eSAndroid Build Coastguard Worker         } else {
122*ec779b8eSAndroid Build Coastguard Worker             // Here we have to use reinterpret_cast because the NDK data type is
123*ec779b8eSAndroid Build Coastguard Worker             // exact copy of internal data type but they do not inherit from each other
124*ec779b8eSAndroid Build Coastguard Worker             ret = mData->update(tag, reinterpret_cast<const INTERNAL_T*>(data), count);
125*ec779b8eSAndroid Build Coastguard Worker         }
126*ec779b8eSAndroid Build Coastguard Worker 
127*ec779b8eSAndroid Build Coastguard Worker         if (ret == OK) {
128*ec779b8eSAndroid Build Coastguard Worker             mTags.clear();
129*ec779b8eSAndroid Build Coastguard Worker             return ACAMERA_OK;
130*ec779b8eSAndroid Build Coastguard Worker         } else {
131*ec779b8eSAndroid Build Coastguard Worker             return ACAMERA_ERROR_INVALID_PARAMETER;
132*ec779b8eSAndroid Build Coastguard Worker         }
133*ec779b8eSAndroid Build Coastguard Worker     }
134*ec779b8eSAndroid Build Coastguard Worker 
135*ec779b8eSAndroid Build Coastguard Worker     // Guard access of public APIs: get/update/getTags.
136*ec779b8eSAndroid Build Coastguard Worker     mutable Mutex mLock;
137*ec779b8eSAndroid Build Coastguard Worker 
138*ec779b8eSAndroid Build Coastguard Worker     std::shared_ptr<CameraMetadata> mData;
139*ec779b8eSAndroid Build Coastguard Worker 
140*ec779b8eSAndroid Build Coastguard Worker     mutable Vector<uint32_t> mTags; // Updated by `getTags()`, cleared by `update()`.
141*ec779b8eSAndroid Build Coastguard Worker     const ACAMERA_METADATA_TYPE mType;
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker     static std::unordered_set<uint32_t> sSystemTags;
144*ec779b8eSAndroid Build Coastguard Worker 
145*ec779b8eSAndroid Build Coastguard Worker     std::vector<const char*> mStaticPhysicalCameraIds;
146*ec779b8eSAndroid Build Coastguard Worker     std::vector<String8> mStaticPhysicalCameraIdValues;
147*ec779b8eSAndroid Build Coastguard Worker     sp<VendorTagDescriptor> mVTags = nullptr;
148*ec779b8eSAndroid Build Coastguard Worker };
149*ec779b8eSAndroid Build Coastguard Worker 
150*ec779b8eSAndroid Build Coastguard Worker #endif // _ACAMERA_METADATA_H
151