1c5e268c6Sopenharmony_ci/* 2c5e268c6Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3c5e268c6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c5e268c6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c5e268c6Sopenharmony_ci * You may obtain a copy of the License at 6c5e268c6Sopenharmony_ci * 7c5e268c6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c5e268c6Sopenharmony_ci * 9c5e268c6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c5e268c6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c5e268c6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c5e268c6Sopenharmony_ci * See the License for the specific language governing permissions and 13c5e268c6Sopenharmony_ci * limitations under the License. 14c5e268c6Sopenharmony_ci */ 15c5e268c6Sopenharmony_ci 16c5e268c6Sopenharmony_ci#ifndef OHOS_CAMERA_METADATA_UTILS_H 17c5e268c6Sopenharmony_ci#define OHOS_CAMERA_METADATA_UTILS_H 18c5e268c6Sopenharmony_ci 19c5e268c6Sopenharmony_ci#include <iostream> 20c5e268c6Sopenharmony_ci#include <list> 21c5e268c6Sopenharmony_ci#include <map> 22c5e268c6Sopenharmony_ci#include <vector> 23c5e268c6Sopenharmony_ci 24c5e268c6Sopenharmony_ci#include "camera_metadata_info.h" 25c5e268c6Sopenharmony_ci#include "message_parcel.h" 26c5e268c6Sopenharmony_ci 27c5e268c6Sopenharmony_cinamespace OHOS::Camera { 28c5e268c6Sopenharmony_ciclass MetadataUtils { 29c5e268c6Sopenharmony_cipublic: 30c5e268c6Sopenharmony_ci static bool EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> &metadata, 31c5e268c6Sopenharmony_ci MessageParcel &data); 32c5e268c6Sopenharmony_ci static void DecodeCameraMetadata(MessageParcel &data, std::shared_ptr<CameraMetadata> &metadata); 33c5e268c6Sopenharmony_ci 34c5e268c6Sopenharmony_ci static std::string EncodeToString(std::shared_ptr<CameraMetadata> metadata); 35c5e268c6Sopenharmony_ci static std::shared_ptr<CameraMetadata> DecodeFromString(std::string setting); 36c5e268c6Sopenharmony_ci static bool ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> &metadata, 37c5e268c6Sopenharmony_ci std::vector<uint8_t>& cameraAbility); 38c5e268c6Sopenharmony_ci static void ConvertVecToMetadata(const std::vector<uint8_t>& cameraAbility, 39c5e268c6Sopenharmony_ci std::shared_ptr<CameraMetadata> &metadata); 40c5e268c6Sopenharmony_ci static void FreeMetadataBuffer(camera_metadata_item_t &entry); 41c5e268c6Sopenharmony_ci 42c5e268c6Sopenharmony_ci template <class T> static void WriteData(T data, std::vector<uint8_t>& cameraAbility); 43c5e268c6Sopenharmony_ci template <class T> static void ReadData(T &data, int32_t &index, const std::vector<uint8_t>& cameraAbility); 44c5e268c6Sopenharmony_ciprivate: 45c5e268c6Sopenharmony_ci static bool WriteMetadata(const camera_metadata_item_t &item, MessageParcel &data); 46c5e268c6Sopenharmony_ci static bool ReadMetadata(camera_metadata_item_t &item, MessageParcel &data); 47c5e268c6Sopenharmony_ci static void ItemDataToBuffer(const camera_metadata_item_t &item, void **buffer); 48c5e268c6Sopenharmony_ci static void WriteMetadataDataToVec(const camera_metadata_item_t &entry, std::vector<uint8_t>& cameraAbility); 49c5e268c6Sopenharmony_ci static void ReadMetadataDataFromVec(int32_t &index, camera_metadata_item_t &entry, 50c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility); 51c5e268c6Sopenharmony_ci static int copyEncodeToStringMem(common_metadata_header_t *meta, char *encodeData, int32_t encodeDataLen); 52c5e268c6Sopenharmony_ci static int copyDecodeFromStringMem(common_metadata_header_t *meta, char *decodeData, 53c5e268c6Sopenharmony_ci char *decodeMetadataData, uint32_t totalLen); 54c5e268c6Sopenharmony_ci}; 55c5e268c6Sopenharmony_ci 56c5e268c6Sopenharmony_citemplate <class T> 57c5e268c6Sopenharmony_civoid MetadataUtils::WriteData(T data, std::vector<uint8_t>& cameraAbility) 58c5e268c6Sopenharmony_ci{ 59c5e268c6Sopenharmony_ci T dataTemp = data; 60c5e268c6Sopenharmony_ci uint8_t *dataPtr = reinterpret_cast<uint8_t *>(&dataTemp); 61c5e268c6Sopenharmony_ci for (size_t j = 0; j < sizeof(T); j++) { 62c5e268c6Sopenharmony_ci cameraAbility.push_back(*(dataPtr + j)); 63c5e268c6Sopenharmony_ci } 64c5e268c6Sopenharmony_ci} 65c5e268c6Sopenharmony_ci 66c5e268c6Sopenharmony_citemplate <class T> 67c5e268c6Sopenharmony_civoid MetadataUtils::ReadData(T &data, int32_t &index, const std::vector<uint8_t>& cameraAbility) 68c5e268c6Sopenharmony_ci{ 69c5e268c6Sopenharmony_ci constexpr uint32_t typeLen = sizeof(T); 70c5e268c6Sopenharmony_ci uint8_t array[typeLen] = {0}; 71c5e268c6Sopenharmony_ci T *ptr = nullptr; 72c5e268c6Sopenharmony_ci for (size_t j = 0; j < sizeof(T); j++) { 73c5e268c6Sopenharmony_ci array[j] = cameraAbility.at(index++); 74c5e268c6Sopenharmony_ci } 75c5e268c6Sopenharmony_ci ptr = reinterpret_cast<T *>(array); 76c5e268c6Sopenharmony_ci data = *ptr; 77c5e268c6Sopenharmony_ci} 78c5e268c6Sopenharmony_ci} // namespace Camera 79c5e268c6Sopenharmony_ci#endif // OHOS_CAMERA_METADATA_UTILS_H 80