diff --git a/camera/metadata/include/camera_metadata_info.h b/camera/metadata/include/camera_metadata_info.h index 2be92e512dceed54187a03857dead7988504c26a..6b6d362e83cdbd222dcab1564b5d23072a80af81 100644 --- a/camera/metadata/include/camera_metadata_info.h +++ b/camera/metadata/include/camera_metadata_info.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "camera_metadata_operator.h" static constexpr uint32_t MAX_SUPPORTED_TAGS = 1000; @@ -31,7 +32,7 @@ static constexpr uint32_t MIN_VEC_SIZE = 12; MaxAlignment(MaxAlignment(DATA_ALIGNMENT, METADATA_ALIGNMENT), ITEM_ALIGNMENT) namespace OHOS::Camera { -class CameraMetadata { +class CameraMetadata : public Parcelable { public: CameraMetadata(size_t itemCapacity, size_t dataCapacity); ~CameraMetadata(); @@ -41,6 +42,8 @@ public: common_metadata_header_t *get(); const common_metadata_header_t *get() const; bool isValid() const; + bool Marshalling(Parcel &parcel) const override; + static CameraMetadata* Unmarshalling(Parcel &parcel); private: common_metadata_header_t *metadata_; diff --git a/camera/metadata/include/metadata_utils.h b/camera/metadata/include/metadata_utils.h index 0c33995daf968beab260420cf877dcc5d75b13f4..10f94f97460e5a59783df385cee4b69e45d62120 100644 --- a/camera/metadata/include/metadata_utils.h +++ b/camera/metadata/include/metadata_utils.h @@ -32,6 +32,8 @@ public: MessageParcel &data); static void DecodeCameraMetadata(MessageParcel &data, std::shared_ptr &metadata); + static void ReadCameraMetadata(MessageParcel &data, common_metadata_header_t *meta, uint32_t tagCount); + static bool WriteCameraMetadata(const common_metadata_header_t* meta, MessageParcel &data); static std::string EncodeToString(std::shared_ptr metadata); static std::shared_ptr DecodeFromString(std::string setting); static bool ConvertMetadataToVec(const std::shared_ptr &metadata, diff --git a/camera/metadata/src/camera_metadata_info.cpp b/camera/metadata/src/camera_metadata_info.cpp index 882f4997f327d166a64f1abfffb6d7eb1fc38d98..a6cca93e1e1b2ac9cbdb7045b8e019f32e9e8311 100644 --- a/camera/metadata/src/camera_metadata_info.cpp +++ b/camera/metadata/src/camera_metadata_info.cpp @@ -23,6 +23,7 @@ #include #include "camera_metadata_item_info.h" #include "camera_vendor_tag.h" +#include "metadata_utils.h" namespace OHOS::Camera { static std::mutex g_mtx; @@ -532,6 +533,41 @@ bool CameraMetadata::isValid() const return metadata_ != nullptr; } +bool CameraMetadata::Marshalling(Parcel &parcel) const +{ + return MetadataUtils::WriteCameraMetadata(metadata_, static_cast(parcel)); +} + +CameraMetadata* CameraMetadata::Unmarshalling(Parcel &parcel) +{ + uint32_t tagCount = parcel.ReadUint32(); + uint32_t itemCapacity = parcel.ReadUint32(); + uint32_t dataCapacity = parcel.ReadUint32(); + + if (tagCount > MAX_SUPPORTED_TAGS) { + tagCount = MAX_SUPPORTED_TAGS; + METADATA_ERR_LOG("CameraMetadata::Unmarshalling tagCount is more than supported value"); + } + + if (itemCapacity > MAX_ITEM_CAPACITY) { + itemCapacity = MAX_ITEM_CAPACITY; + METADATA_ERR_LOG("CameraMetadata::Unmarshalling itemCapacity is more than supported value"); + } + + if (dataCapacity > MAX_DATA_CAPACITY) { + dataCapacity = MAX_DATA_CAPACITY; + METADATA_ERR_LOG("CameraMetadata::Unmarshalling dataCapacity is more than supported value"); + } + CameraMetadata* metadata = new (std::nothrow) CameraMetadata(itemCapacity, dataCapacity); + if (metadata == nullptr) { + METADATA_ERR_LOG("CameraMetadata::Unmarshalling metadata is nullptr"); + return nullptr; + } + MetadataUtils::ReadCameraMetadata(static_cast(parcel), metadata->get(), tagCount); + + return metadata; +} + uint32_t CameraMetadata::AlignTo(uint32_t val, uint32_t alignment) { return static_cast((static_cast(val) + ((alignment) - 1)) & ~((alignment) - 1)); diff --git a/camera/metadata/src/metadata_utils.cpp b/camera/metadata/src/metadata_utils.cpp index 521fc0d760f6a982e83301fbadd67b538ae18091..d71a43185c46c95792ce35877b7ec30e25aab41b 100644 --- a/camera/metadata/src/metadata_utils.cpp +++ b/camera/metadata/src/metadata_utils.cpp @@ -117,16 +117,10 @@ bool MetadataUtils::ConvertMetadataToVec(const std::shared_ptr & return true; } -bool MetadataUtils::EncodeCameraMetadata(const std::shared_ptr &metadata, - MessageParcel &data) +bool MetadataUtils::WriteCameraMetadata(const common_metadata_header_t* meta, MessageParcel &data) { - if (metadata == nullptr) { - return false; - } - bool bRet = true; uint32_t tagCount = 0; - common_metadata_header_t *meta = metadata->get(); if (meta != nullptr) { tagCount = GetCameraMetadataItemCount(meta); bRet = bRet && data.WriteUint32(tagCount); @@ -151,6 +145,17 @@ bool MetadataUtils::EncodeCameraMetadata(const std::shared_ptr & return bRet; } +bool MetadataUtils::EncodeCameraMetadata(const std::shared_ptr &metadata, + MessageParcel &data) +{ + if (metadata == nullptr) { + return false; + } + + common_metadata_header_t *meta = metadata->get(); + return WriteCameraMetadata(meta, data); +} + static void ReadMetadataDataFromVecUInt8(int32_t &index, camera_metadata_item_t &entry, const std::vector& cameraAbility) { @@ -311,25 +316,10 @@ void MetadataUtils::ConvertVecToMetadata(const std::vector& cameraAbili } } -void MetadataUtils::DecodeCameraMetadata(MessageParcel &data, std::shared_ptr &metadata) +void MetadataUtils::ReadCameraMetadata(MessageParcel &data, common_metadata_header_t *meta, uint32_t tagCount) { - uint32_t tagCount = data.ReadUint32(); - uint32_t itemCapacity = data.ReadUint32(); - uint32_t dataCapacity = data.ReadUint32(); - - if (tagCount > MAX_SUPPORTED_TAGS) { - tagCount = MAX_SUPPORTED_TAGS; - METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata tagCount is more than supported value"); - } - - if (itemCapacity > MAX_ITEM_CAPACITY) { - itemCapacity = MAX_ITEM_CAPACITY; - METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata itemCapacity is more than supported value"); - } - - if (dataCapacity > MAX_DATA_CAPACITY) { - dataCapacity = MAX_DATA_CAPACITY; - METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata dataCapacity is more than supported value"); + if (meta == nullptr) { + return; } std::vector items; @@ -341,14 +331,12 @@ void MetadataUtils::DecodeCameraMetadata(MessageParcel &data, std::shared_ptr MAX_SUPPORTED_ITEMS) { item.count = MAX_SUPPORTED_ITEMS; - METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata item.count is more than supported value"); + METADATA_ERR_LOG("MetadataUtils::ReadCameraMetadata item.count is more than supported value"); } MetadataUtils::ReadMetadata(item, data); items.push_back(item); } - metadata = std::make_shared(itemCapacity, dataCapacity); - common_metadata_header_t *meta = metadata->get(); for (auto &item_ : items) { void *buffer = nullptr; MetadataUtils::ItemDataToBuffer(item_, &buffer); @@ -357,6 +345,35 @@ void MetadataUtils::DecodeCameraMetadata(MessageParcel &data, std::shared_ptr &metadata) +{ + uint32_t tagCount = data.ReadUint32(); + uint32_t itemCapacity = data.ReadUint32(); + uint32_t dataCapacity = data.ReadUint32(); + + if (tagCount > MAX_SUPPORTED_TAGS) { + tagCount = MAX_SUPPORTED_TAGS; + METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata tagCount is more than supported value"); + } + + if (itemCapacity > MAX_ITEM_CAPACITY) { + itemCapacity = MAX_ITEM_CAPACITY; + METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata itemCapacity is more than supported value"); + } + + if (dataCapacity > MAX_DATA_CAPACITY) { + dataCapacity = MAX_DATA_CAPACITY; + METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata dataCapacity is more than supported value"); + } + + metadata = std::make_shared(itemCapacity, dataCapacity); + if (metadata == nullptr) { + METADATA_ERR_LOG("CameraMetadata::Unmarshalling metadata is nullptr"); + return; + } + ReadCameraMetadata(data, metadata->get(), tagCount); +} + bool MetadataUtils::WriteMetadata(const camera_metadata_item_t &item, MessageParcel &data) { bool bRet = false;