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