Home | History | Annotate | Download | only in impl
      1 /*
      2  * Copyright (C) 2015 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 #ifndef _ACAMERA_METADATA_H
     17 #define _ACAMERA_METADATA_H
     18 
     19 #include <unordered_set>
     20 
     21 #include <sys/types.h>
     22 #include <utils/Mutex.h>
     23 #include <utils/RefBase.h>
     24 #include <utils/Vector.h>
     25 #include <camera/CameraMetadata.h>
     26 
     27 #include <camera/NdkCameraMetadata.h>
     28 
     29 using namespace android;
     30 
     31 /**
     32  * ACameraMetadata opaque struct definition
     33  * Leave outside of android namespace because it's NDK struct
     34  */
     35 struct ACameraMetadata : public RefBase {
     36   public:
     37     typedef enum {
     38         ACM_CHARACTERISTICS, // Read only
     39         ACM_REQUEST,         // Read/Write
     40         ACM_RESULT,          // Read only
     41     } ACAMERA_METADATA_TYPE;
     42 
     43     // Takes ownership of pass-in buffer
     44     ACameraMetadata(camera_metadata_t *buffer, ACAMERA_METADATA_TYPE type);
     45     // Clone
     46     ACameraMetadata(const ACameraMetadata& other) :
     47             mData(other.mData), mType(other.mType) {};
     48 
     49     camera_status_t getConstEntry(uint32_t tag, ACameraMetadata_const_entry* entry) const;
     50 
     51     camera_status_t update(uint32_t tag, uint32_t count, const uint8_t* data);
     52     camera_status_t update(uint32_t tag, uint32_t count, const int32_t* data);
     53     camera_status_t update(uint32_t tag, uint32_t count, const float* data);
     54     camera_status_t update(uint32_t tag, uint32_t count, const double* data);
     55     camera_status_t update(uint32_t tag, uint32_t count, const int64_t* data);
     56     camera_status_t update(uint32_t tag, uint32_t count, const ACameraMetadata_rational* data);
     57 
     58     camera_status_t getTags(/*out*/int32_t* numTags,
     59                             /*out*/const uint32_t** tags) const;
     60 
     61     bool isNdkSupportedCapability(const int32_t capability);
     62     static inline bool isVendorTag(const uint32_t tag);
     63     static bool isCaptureRequestTag(const uint32_t tag);
     64     void filterUnsupportedFeatures(); // Hide features not yet supported by NDK
     65     void filterStreamConfigurations(); // Hide input streams, translate hal format to NDK formats
     66 
     67     const CameraMetadata& getInternalData() const;
     68 
     69     template<typename INTERNAL_T, typename NDK_T>
     70     camera_status_t updateImpl(uint32_t tag, uint32_t count, const NDK_T* data) {
     71         if (mType != ACM_REQUEST) {
     72             ALOGE("Error: Write to metadata is only allowed for capture request!");
     73             return ACAMERA_ERROR_INVALID_PARAMETER;
     74         }
     75         if (!isCaptureRequestTag(tag)) {
     76             ALOGE("Error: tag %d is not writable!", tag);
     77             return ACAMERA_ERROR_INVALID_PARAMETER;
     78         }
     79 
     80         Mutex::Autolock _l(mLock);
     81 
     82         status_t ret = OK;
     83         if (count == 0 && data == nullptr) {
     84             ret = mData.erase(tag);
     85         } else {
     86             // Here we have to use reinterpret_cast because the NDK data type is
     87             // exact copy of internal data type but they do not inherit from each other
     88             ret = mData.update(tag, reinterpret_cast<const INTERNAL_T*>(data), count);
     89         }
     90 
     91         if (ret == OK) {
     92             mTags.clear();
     93             return ACAMERA_OK;
     94         } else {
     95             return ACAMERA_ERROR_INVALID_PARAMETER;
     96         }
     97     }
     98 
     99   private:
    100     // guard access of public APIs: get/update/getTags
    101     mutable Mutex    mLock;
    102     CameraMetadata   mData;
    103     mutable Vector<uint32_t> mTags; // updated in getTags, cleared by update
    104     const ACAMERA_METADATA_TYPE mType;
    105 
    106     static std::unordered_set<uint32_t> sSystemTags;
    107 };
    108 
    109 #endif // _ACAMERA_METADATA_H
    110