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#include "metadata_utils.h" 17c5e268c6Sopenharmony_ci#include <securec.h> 18c5e268c6Sopenharmony_ci#include "metadata_log.h" 19c5e268c6Sopenharmony_ci 20c5e268c6Sopenharmony_ci#define IF_COND_PRINT_MSG_AND_RETURN(cond, msg) \ 21c5e268c6Sopenharmony_ciif (cond) { \ 22c5e268c6Sopenharmony_ci METADATA_ERR_LOG(msg); \ 23c5e268c6Sopenharmony_ci return {}; \ 24c5e268c6Sopenharmony_ci} 25c5e268c6Sopenharmony_ci 26c5e268c6Sopenharmony_cinamespace OHOS::Camera { 27c5e268c6Sopenharmony_civoid MetadataUtils::WriteMetadataDataToVec(const camera_metadata_item_t &entry, std::vector<uint8_t>& cameraAbility) 28c5e268c6Sopenharmony_ci{ 29c5e268c6Sopenharmony_ci if (entry.data_type == META_TYPE_BYTE) { 30c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 31c5e268c6Sopenharmony_ci WriteData<int8_t>(*(entry.data.u8 + i), cameraAbility); 32c5e268c6Sopenharmony_ci } 33c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_INT32) { 34c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 35c5e268c6Sopenharmony_ci WriteData<int32_t>(*(entry.data.i32 + i), cameraAbility); 36c5e268c6Sopenharmony_ci } 37c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_UINT32) { 38c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 39c5e268c6Sopenharmony_ci WriteData<uint32_t>(*(entry.data.ui32 + i), cameraAbility); 40c5e268c6Sopenharmony_ci } 41c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_FLOAT) { 42c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 43c5e268c6Sopenharmony_ci WriteData<float>(*(entry.data.f + i), cameraAbility); 44c5e268c6Sopenharmony_ci } 45c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_INT64) { 46c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 47c5e268c6Sopenharmony_ci WriteData<int64_t>(*(entry.data.i64 + i), cameraAbility); 48c5e268c6Sopenharmony_ci } 49c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_DOUBLE) { 50c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 51c5e268c6Sopenharmony_ci WriteData<double>(*(entry.data.d + i), cameraAbility); 52c5e268c6Sopenharmony_ci } 53c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_RATIONAL) { 54c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 55c5e268c6Sopenharmony_ci WriteData<int32_t>((*(entry.data.r + i)).numerator, cameraAbility); 56c5e268c6Sopenharmony_ci WriteData<int32_t>((*(entry.data.r + i)).denominator, cameraAbility); 57c5e268c6Sopenharmony_ci } 58c5e268c6Sopenharmony_ci } 59c5e268c6Sopenharmony_ci} 60c5e268c6Sopenharmony_ci 61c5e268c6Sopenharmony_cibool MetadataUtils::ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> &metadata, 62c5e268c6Sopenharmony_ci std::vector<uint8_t>& cameraAbility) 63c5e268c6Sopenharmony_ci{ 64c5e268c6Sopenharmony_ci cameraAbility.clear(); 65c5e268c6Sopenharmony_ci 66c5e268c6Sopenharmony_ci if (metadata == nullptr) { 67c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertMetadataToVec metadata is null!"); 68c5e268c6Sopenharmony_ci return false; 69c5e268c6Sopenharmony_ci } 70c5e268c6Sopenharmony_ci 71c5e268c6Sopenharmony_ci common_metadata_header_t *meta = metadata->get(); 72c5e268c6Sopenharmony_ci if (meta == nullptr) { 73c5e268c6Sopenharmony_ci WriteData<uint32_t>(0, cameraAbility); 74c5e268c6Sopenharmony_ci METADATA_WARNING_LOG("ConvertMetadataToVec tagCount is 0!"); 75c5e268c6Sopenharmony_ci return true; 76c5e268c6Sopenharmony_ci } 77c5e268c6Sopenharmony_ci 78c5e268c6Sopenharmony_ci uint32_t tagCount = GetCameraMetadataItemCount(meta); 79c5e268c6Sopenharmony_ci if (tagCount > MAX_SUPPORTED_TAGS) { 80c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertMetadataToVec tagCount out of range:%{public}d", tagCount); 81c5e268c6Sopenharmony_ci return false; 82c5e268c6Sopenharmony_ci } 83c5e268c6Sopenharmony_ci 84c5e268c6Sopenharmony_ci uint32_t itemCapacity = GetCameraMetadataItemCapacity(meta); 85c5e268c6Sopenharmony_ci if (itemCapacity > MAX_ITEM_CAPACITY) { 86c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertMetadataToVec itemCapacity out of range:%{public}d", itemCapacity); 87c5e268c6Sopenharmony_ci return false; 88c5e268c6Sopenharmony_ci } 89c5e268c6Sopenharmony_ci 90c5e268c6Sopenharmony_ci uint32_t dataCapacity = GetCameraMetadataDataSize(meta); 91c5e268c6Sopenharmony_ci if (dataCapacity > MAX_DATA_CAPACITY) { 92c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertMetadataToVec dataCapacity out of range:%{public}d", dataCapacity); 93c5e268c6Sopenharmony_ci return false; 94c5e268c6Sopenharmony_ci } 95c5e268c6Sopenharmony_ci 96c5e268c6Sopenharmony_ci WriteData<uint32_t>(tagCount, cameraAbility); 97c5e268c6Sopenharmony_ci WriteData<uint32_t>(itemCapacity, cameraAbility); 98c5e268c6Sopenharmony_ci WriteData<uint32_t>(dataCapacity, cameraAbility); 99c5e268c6Sopenharmony_ci for (uint32_t i = 0; i < tagCount; i++) { 100c5e268c6Sopenharmony_ci camera_metadata_item_t item; 101c5e268c6Sopenharmony_ci int ret = GetCameraMetadataItem(meta, i, &item); 102c5e268c6Sopenharmony_ci if (ret != CAM_META_SUCCESS) { 103c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertMetadataToVec get meta item failed!"); 104c5e268c6Sopenharmony_ci return false; 105c5e268c6Sopenharmony_ci } 106c5e268c6Sopenharmony_ci WriteData<uint32_t>(item.index, cameraAbility); 107c5e268c6Sopenharmony_ci WriteData<uint32_t>(item.item, cameraAbility); 108c5e268c6Sopenharmony_ci WriteData<uint32_t>(item.data_type, cameraAbility); 109c5e268c6Sopenharmony_ci WriteData<uint32_t>(item.count, cameraAbility); 110c5e268c6Sopenharmony_ci if (item.count > MAX_SUPPORTED_ITEMS) { 111c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertMetadataToVec item.count out of range:%{public}d item:%{public}d", 112c5e268c6Sopenharmony_ci item.count, item.item); 113c5e268c6Sopenharmony_ci return false; 114c5e268c6Sopenharmony_ci } 115c5e268c6Sopenharmony_ci WriteMetadataDataToVec(item, cameraAbility); 116c5e268c6Sopenharmony_ci } 117c5e268c6Sopenharmony_ci return true; 118c5e268c6Sopenharmony_ci} 119c5e268c6Sopenharmony_ci 120c5e268c6Sopenharmony_cibool MetadataUtils::EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> &metadata, 121c5e268c6Sopenharmony_ci MessageParcel &data) 122c5e268c6Sopenharmony_ci{ 123c5e268c6Sopenharmony_ci if (metadata == nullptr) { 124c5e268c6Sopenharmony_ci return false; 125c5e268c6Sopenharmony_ci } 126c5e268c6Sopenharmony_ci 127c5e268c6Sopenharmony_ci bool bRet = true; 128c5e268c6Sopenharmony_ci uint32_t tagCount = 0; 129c5e268c6Sopenharmony_ci common_metadata_header_t *meta = metadata->get(); 130c5e268c6Sopenharmony_ci if (meta != nullptr) { 131c5e268c6Sopenharmony_ci tagCount = GetCameraMetadataItemCount(meta); 132c5e268c6Sopenharmony_ci bRet = bRet && data.WriteUint32(tagCount); 133c5e268c6Sopenharmony_ci bRet = bRet && data.WriteUint32(GetCameraMetadataItemCapacity(meta)); 134c5e268c6Sopenharmony_ci bRet = bRet && data.WriteUint32(GetCameraMetadataDataSize(meta)); 135c5e268c6Sopenharmony_ci for (uint32_t i = 0; i < tagCount; i++) { 136c5e268c6Sopenharmony_ci camera_metadata_item_t item; 137c5e268c6Sopenharmony_ci int ret = GetCameraMetadataItem(meta, i, &item); 138c5e268c6Sopenharmony_ci if (ret != CAM_META_SUCCESS) { 139c5e268c6Sopenharmony_ci return false; 140c5e268c6Sopenharmony_ci } 141c5e268c6Sopenharmony_ci 142c5e268c6Sopenharmony_ci bRet = bRet && data.WriteUint32(item.index); 143c5e268c6Sopenharmony_ci bRet = bRet && data.WriteUint32(item.item); 144c5e268c6Sopenharmony_ci bRet = bRet && data.WriteUint32(item.data_type); 145c5e268c6Sopenharmony_ci bRet = bRet && data.WriteUint32(item.count); 146c5e268c6Sopenharmony_ci bRet = bRet && MetadataUtils::WriteMetadata(item, data); 147c5e268c6Sopenharmony_ci } 148c5e268c6Sopenharmony_ci } else { 149c5e268c6Sopenharmony_ci bRet = data.WriteUint32(tagCount); 150c5e268c6Sopenharmony_ci } 151c5e268c6Sopenharmony_ci return bRet; 152c5e268c6Sopenharmony_ci} 153c5e268c6Sopenharmony_ci 154c5e268c6Sopenharmony_cistatic void ReadMetadataDataFromVecUInt8(int32_t &index, camera_metadata_item_t &entry, 155c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 156c5e268c6Sopenharmony_ci{ 157c5e268c6Sopenharmony_ci entry.data.u8 = new(std::nothrow) uint8_t[entry.count]; 158c5e268c6Sopenharmony_ci if (entry.data.u8 != nullptr) { 159c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 160c5e268c6Sopenharmony_ci MetadataUtils::ReadData<uint8_t>(entry.data.u8[i], index, cameraAbility); 161c5e268c6Sopenharmony_ci } 162c5e268c6Sopenharmony_ci } 163c5e268c6Sopenharmony_ci} 164c5e268c6Sopenharmony_ci 165c5e268c6Sopenharmony_cistatic void ReadMetadataDataFromVecInt32(int32_t &index, camera_metadata_item_t &entry, 166c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 167c5e268c6Sopenharmony_ci{ 168c5e268c6Sopenharmony_ci entry.data.i32 = new(std::nothrow) int32_t[entry.count]; 169c5e268c6Sopenharmony_ci if (entry.data.i32 != nullptr) { 170c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 171c5e268c6Sopenharmony_ci MetadataUtils::ReadData<int32_t>(entry.data.i32[i], index, cameraAbility); 172c5e268c6Sopenharmony_ci } 173c5e268c6Sopenharmony_ci } 174c5e268c6Sopenharmony_ci} 175c5e268c6Sopenharmony_ci 176c5e268c6Sopenharmony_cistatic void ReadMetadataDataFromVecUInt32(int32_t &index, camera_metadata_item_t &entry, 177c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 178c5e268c6Sopenharmony_ci{ 179c5e268c6Sopenharmony_ci entry.data.ui32 = new(std::nothrow) uint32_t[entry.count]; 180c5e268c6Sopenharmony_ci if (entry.data.ui32 != nullptr) { 181c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 182c5e268c6Sopenharmony_ci MetadataUtils::ReadData<uint32_t>(entry.data.ui32[i], index, cameraAbility); 183c5e268c6Sopenharmony_ci } 184c5e268c6Sopenharmony_ci } 185c5e268c6Sopenharmony_ci} 186c5e268c6Sopenharmony_ci 187c5e268c6Sopenharmony_cistatic void ReadMetadataDataFromVecFloat(int32_t &index, camera_metadata_item_t &entry, 188c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 189c5e268c6Sopenharmony_ci{ 190c5e268c6Sopenharmony_ci entry.data.f = new(std::nothrow) float[entry.count]; 191c5e268c6Sopenharmony_ci if (entry.data.f != nullptr) { 192c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 193c5e268c6Sopenharmony_ci MetadataUtils::ReadData<float>(entry.data.f[i], index, cameraAbility); 194c5e268c6Sopenharmony_ci } 195c5e268c6Sopenharmony_ci } 196c5e268c6Sopenharmony_ci} 197c5e268c6Sopenharmony_ci 198c5e268c6Sopenharmony_cistatic void ReadMetadataDataFromVecInt64(int32_t &index, camera_metadata_item_t &entry, 199c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 200c5e268c6Sopenharmony_ci{ 201c5e268c6Sopenharmony_ci entry.data.i64 = new(std::nothrow) int64_t[entry.count]; 202c5e268c6Sopenharmony_ci if (entry.data.i64 != nullptr) { 203c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 204c5e268c6Sopenharmony_ci MetadataUtils::ReadData<int64_t>(entry.data.i64[i], index, cameraAbility); 205c5e268c6Sopenharmony_ci } 206c5e268c6Sopenharmony_ci } 207c5e268c6Sopenharmony_ci} 208c5e268c6Sopenharmony_ci 209c5e268c6Sopenharmony_cistatic void ReadMetadataDataFromVecDouble(int32_t &index, camera_metadata_item_t &entry, 210c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 211c5e268c6Sopenharmony_ci{ 212c5e268c6Sopenharmony_ci entry.data.d = new(std::nothrow) double[entry.count]; 213c5e268c6Sopenharmony_ci if (entry.data.d != nullptr) { 214c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 215c5e268c6Sopenharmony_ci MetadataUtils::ReadData<double>(entry.data.d[i], index, cameraAbility); 216c5e268c6Sopenharmony_ci } 217c5e268c6Sopenharmony_ci } 218c5e268c6Sopenharmony_ci} 219c5e268c6Sopenharmony_ci 220c5e268c6Sopenharmony_cistatic void ReadMetadataDataFromVecRational(int32_t &index, camera_metadata_item_t &entry, 221c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 222c5e268c6Sopenharmony_ci{ 223c5e268c6Sopenharmony_ci entry.data.r = new(std::nothrow) camera_rational_t[entry.count]; 224c5e268c6Sopenharmony_ci if (entry.data.r != nullptr) { 225c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count; i++) { 226c5e268c6Sopenharmony_ci MetadataUtils::ReadData<int32_t>(entry.data.r[i].numerator, index, cameraAbility); 227c5e268c6Sopenharmony_ci MetadataUtils::ReadData<int32_t>(entry.data.r[i].denominator, index, cameraAbility); 228c5e268c6Sopenharmony_ci } 229c5e268c6Sopenharmony_ci } 230c5e268c6Sopenharmony_ci} 231c5e268c6Sopenharmony_ci 232c5e268c6Sopenharmony_civoid MetadataUtils::ReadMetadataDataFromVec(int32_t &index, camera_metadata_item_t &entry, 233c5e268c6Sopenharmony_ci const std::vector<uint8_t>& cameraAbility) 234c5e268c6Sopenharmony_ci{ 235c5e268c6Sopenharmony_ci switch (entry.data_type) { 236c5e268c6Sopenharmony_ci case META_TYPE_BYTE: 237c5e268c6Sopenharmony_ci ReadMetadataDataFromVecUInt8(index, entry, cameraAbility); 238c5e268c6Sopenharmony_ci break; 239c5e268c6Sopenharmony_ci case META_TYPE_INT32: 240c5e268c6Sopenharmony_ci ReadMetadataDataFromVecInt32(index, entry, cameraAbility); 241c5e268c6Sopenharmony_ci break; 242c5e268c6Sopenharmony_ci case META_TYPE_UINT32: 243c5e268c6Sopenharmony_ci ReadMetadataDataFromVecUInt32(index, entry, cameraAbility); 244c5e268c6Sopenharmony_ci break; 245c5e268c6Sopenharmony_ci case META_TYPE_FLOAT: 246c5e268c6Sopenharmony_ci ReadMetadataDataFromVecFloat(index, entry, cameraAbility); 247c5e268c6Sopenharmony_ci break; 248c5e268c6Sopenharmony_ci case META_TYPE_INT64: 249c5e268c6Sopenharmony_ci ReadMetadataDataFromVecInt64(index, entry, cameraAbility); 250c5e268c6Sopenharmony_ci break; 251c5e268c6Sopenharmony_ci case META_TYPE_DOUBLE: 252c5e268c6Sopenharmony_ci ReadMetadataDataFromVecDouble(index, entry, cameraAbility); 253c5e268c6Sopenharmony_ci break; 254c5e268c6Sopenharmony_ci case META_TYPE_RATIONAL: 255c5e268c6Sopenharmony_ci ReadMetadataDataFromVecRational(index, entry, cameraAbility); 256c5e268c6Sopenharmony_ci break; 257c5e268c6Sopenharmony_ci } 258c5e268c6Sopenharmony_ci} 259c5e268c6Sopenharmony_ci 260c5e268c6Sopenharmony_civoid MetadataUtils::ConvertVecToMetadata(const std::vector<uint8_t>& cameraAbility, 261c5e268c6Sopenharmony_ci std::shared_ptr<CameraMetadata> &metadata) 262c5e268c6Sopenharmony_ci{ 263c5e268c6Sopenharmony_ci int32_t index = 0; 264c5e268c6Sopenharmony_ci uint32_t tagCount = 0; 265c5e268c6Sopenharmony_ci uint32_t itemCapacity = 0; 266c5e268c6Sopenharmony_ci uint32_t dataCapacity = 0; 267c5e268c6Sopenharmony_ci 268c5e268c6Sopenharmony_ci ReadData<uint32_t>(tagCount, index, cameraAbility); 269c5e268c6Sopenharmony_ci if (tagCount > MAX_SUPPORTED_TAGS) { 270c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertVecToMetadata tagCount out of range:%{public}d", tagCount); 271c5e268c6Sopenharmony_ci return; 272c5e268c6Sopenharmony_ci } 273c5e268c6Sopenharmony_ci ReadData<uint32_t>(itemCapacity, index, cameraAbility); 274c5e268c6Sopenharmony_ci if (itemCapacity > MAX_ITEM_CAPACITY) { 275c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertVecToMetadata itemCapacity out of range:%{public}d", itemCapacity); 276c5e268c6Sopenharmony_ci return; 277c5e268c6Sopenharmony_ci } 278c5e268c6Sopenharmony_ci ReadData<uint32_t>(dataCapacity, index, cameraAbility); 279c5e268c6Sopenharmony_ci if (dataCapacity > MAX_DATA_CAPACITY) { 280c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertVecToMetadata dataCapacity out of range:%{public}d", dataCapacity); 281c5e268c6Sopenharmony_ci return; 282c5e268c6Sopenharmony_ci } 283c5e268c6Sopenharmony_ci 284c5e268c6Sopenharmony_ci std::vector<camera_metadata_item_t> items; 285c5e268c6Sopenharmony_ci for (uint32_t i = 0; i < tagCount; i++) { 286c5e268c6Sopenharmony_ci camera_metadata_item_t item; 287c5e268c6Sopenharmony_ci ReadData<uint32_t>(item.index, index, cameraAbility); 288c5e268c6Sopenharmony_ci ReadData<uint32_t>(item.item, index, cameraAbility); 289c5e268c6Sopenharmony_ci ReadData<uint32_t>(item.data_type, index, cameraAbility); 290c5e268c6Sopenharmony_ci ReadData<uint32_t>(item.count, index, cameraAbility); 291c5e268c6Sopenharmony_ci if (item.count > MAX_SUPPORTED_ITEMS) { 292c5e268c6Sopenharmony_ci METADATA_ERR_LOG("ConvertVecToMetadata item.count out of range:%{public}d item:%{public}d", 293c5e268c6Sopenharmony_ci item.count, item.item); 294c5e268c6Sopenharmony_ci return; 295c5e268c6Sopenharmony_ci } 296c5e268c6Sopenharmony_ci ReadMetadataDataFromVec(index, item, cameraAbility); 297c5e268c6Sopenharmony_ci items.push_back(item); 298c5e268c6Sopenharmony_ci } 299c5e268c6Sopenharmony_ci 300c5e268c6Sopenharmony_ci metadata = std::make_shared<CameraMetadata>(itemCapacity, dataCapacity); 301c5e268c6Sopenharmony_ci common_metadata_header_t *meta = metadata->get(); 302c5e268c6Sopenharmony_ci for (auto &item_ : items) { 303c5e268c6Sopenharmony_ci void *buffer = nullptr; 304c5e268c6Sopenharmony_ci MetadataUtils::ItemDataToBuffer(item_, &buffer); 305c5e268c6Sopenharmony_ci (void)AddCameraMetadataItem(meta, item_.item, buffer, item_.count); 306c5e268c6Sopenharmony_ci FreeMetadataBuffer(item_); 307c5e268c6Sopenharmony_ci } 308c5e268c6Sopenharmony_ci} 309c5e268c6Sopenharmony_ci 310c5e268c6Sopenharmony_civoid MetadataUtils::DecodeCameraMetadata(MessageParcel &data, std::shared_ptr<CameraMetadata> &metadata) 311c5e268c6Sopenharmony_ci{ 312c5e268c6Sopenharmony_ci uint32_t tagCount = data.ReadUint32(); 313c5e268c6Sopenharmony_ci uint32_t itemCapacity = data.ReadUint32(); 314c5e268c6Sopenharmony_ci uint32_t dataCapacity = data.ReadUint32(); 315c5e268c6Sopenharmony_ci 316c5e268c6Sopenharmony_ci if (tagCount > MAX_SUPPORTED_TAGS) { 317c5e268c6Sopenharmony_ci tagCount = MAX_SUPPORTED_TAGS; 318c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata tagCount is more than supported value"); 319c5e268c6Sopenharmony_ci } 320c5e268c6Sopenharmony_ci 321c5e268c6Sopenharmony_ci if (itemCapacity > MAX_ITEM_CAPACITY) { 322c5e268c6Sopenharmony_ci itemCapacity = MAX_ITEM_CAPACITY; 323c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata itemCapacity is more than supported value"); 324c5e268c6Sopenharmony_ci } 325c5e268c6Sopenharmony_ci 326c5e268c6Sopenharmony_ci if (dataCapacity > MAX_DATA_CAPACITY) { 327c5e268c6Sopenharmony_ci dataCapacity = MAX_DATA_CAPACITY; 328c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata dataCapacity is more than supported value"); 329c5e268c6Sopenharmony_ci } 330c5e268c6Sopenharmony_ci 331c5e268c6Sopenharmony_ci std::vector<camera_metadata_item_t> items; 332c5e268c6Sopenharmony_ci for (uint32_t i = 0; i < tagCount; i++) { 333c5e268c6Sopenharmony_ci camera_metadata_item_t item; 334c5e268c6Sopenharmony_ci item.index = data.ReadUint32(); 335c5e268c6Sopenharmony_ci item.item = data.ReadUint32(); 336c5e268c6Sopenharmony_ci item.data_type = data.ReadUint32(); 337c5e268c6Sopenharmony_ci item.count = data.ReadUint32(); 338c5e268c6Sopenharmony_ci if (item.count > MAX_SUPPORTED_ITEMS) { 339c5e268c6Sopenharmony_ci item.count = MAX_SUPPORTED_ITEMS; 340c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata item.count is more than supported value"); 341c5e268c6Sopenharmony_ci } 342c5e268c6Sopenharmony_ci MetadataUtils::ReadMetadata(item, data); 343c5e268c6Sopenharmony_ci items.push_back(item); 344c5e268c6Sopenharmony_ci } 345c5e268c6Sopenharmony_ci 346c5e268c6Sopenharmony_ci metadata = std::make_shared<CameraMetadata>(itemCapacity, dataCapacity); 347c5e268c6Sopenharmony_ci common_metadata_header_t *meta = metadata->get(); 348c5e268c6Sopenharmony_ci for (auto &item_ : items) { 349c5e268c6Sopenharmony_ci void *buffer = nullptr; 350c5e268c6Sopenharmony_ci MetadataUtils::ItemDataToBuffer(item_, &buffer); 351c5e268c6Sopenharmony_ci (void)AddCameraMetadataItem(meta, item_.item, buffer, item_.count); 352c5e268c6Sopenharmony_ci FreeMetadataBuffer(item_); 353c5e268c6Sopenharmony_ci } 354c5e268c6Sopenharmony_ci} 355c5e268c6Sopenharmony_ci 356c5e268c6Sopenharmony_cibool MetadataUtils::WriteMetadata(const camera_metadata_item_t &item, MessageParcel &data) 357c5e268c6Sopenharmony_ci{ 358c5e268c6Sopenharmony_ci bool bRet = false; 359c5e268c6Sopenharmony_ci size_t i; 360c5e268c6Sopenharmony_ci if (item.data_type == META_TYPE_BYTE) { 361c5e268c6Sopenharmony_ci std::vector<uint8_t> byteBuffers; 362c5e268c6Sopenharmony_ci for (i = 0; i < item.count; i++) { 363c5e268c6Sopenharmony_ci byteBuffers.push_back(*(item.data.u8 + i)); 364c5e268c6Sopenharmony_ci } 365c5e268c6Sopenharmony_ci bRet = data.WriteUInt8Vector(byteBuffers); 366c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_INT32) { 367c5e268c6Sopenharmony_ci std::vector<int32_t> int32Buffers; 368c5e268c6Sopenharmony_ci for (i = 0; i < item.count; i++) { 369c5e268c6Sopenharmony_ci int32Buffers.push_back(*(item.data.i32 + i)); 370c5e268c6Sopenharmony_ci } 371c5e268c6Sopenharmony_ci bRet = data.WriteInt32Vector(int32Buffers); 372c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_FLOAT) { 373c5e268c6Sopenharmony_ci std::vector<float> floatBuffers; 374c5e268c6Sopenharmony_ci for (i = 0; i < item.count; i++) { 375c5e268c6Sopenharmony_ci floatBuffers.push_back(*(item.data.f + i)); 376c5e268c6Sopenharmony_ci } 377c5e268c6Sopenharmony_ci bRet = data.WriteFloatVector(floatBuffers); 378c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_UINT32) { 379c5e268c6Sopenharmony_ci std::vector<uint32_t> uInt32Buffers; 380c5e268c6Sopenharmony_ci for (i = 0; i < item.count; i++) { 381c5e268c6Sopenharmony_ci uInt32Buffers.push_back(*(item.data.ui32 + i)); 382c5e268c6Sopenharmony_ci } 383c5e268c6Sopenharmony_ci bRet = data.WriteUInt32Vector(uInt32Buffers); 384c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_INT64) { 385c5e268c6Sopenharmony_ci std::vector<int64_t> int64Buffers; 386c5e268c6Sopenharmony_ci for (i = 0; i < item.count; i++) { 387c5e268c6Sopenharmony_ci int64Buffers.push_back(*(item.data.i64 + i)); 388c5e268c6Sopenharmony_ci } 389c5e268c6Sopenharmony_ci bRet = data.WriteInt64Vector(int64Buffers); 390c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_DOUBLE) { 391c5e268c6Sopenharmony_ci std::vector<double> doubleBuffers; 392c5e268c6Sopenharmony_ci for (i = 0; i < item.count; i++) { 393c5e268c6Sopenharmony_ci doubleBuffers.push_back(*(item.data.d + i)); 394c5e268c6Sopenharmony_ci } 395c5e268c6Sopenharmony_ci bRet = data.WriteDoubleVector(doubleBuffers); 396c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_RATIONAL) { 397c5e268c6Sopenharmony_ci std::vector<int32_t> rationalBuffers; 398c5e268c6Sopenharmony_ci for (i = 0; i < item.count; i++) { 399c5e268c6Sopenharmony_ci rationalBuffers.push_back((*(item.data.r + i)).numerator); 400c5e268c6Sopenharmony_ci rationalBuffers.push_back((*(item.data.r + i)).denominator); 401c5e268c6Sopenharmony_ci } 402c5e268c6Sopenharmony_ci bRet = data.WriteInt32Vector(rationalBuffers); 403c5e268c6Sopenharmony_ci } 404c5e268c6Sopenharmony_ci 405c5e268c6Sopenharmony_ci return bRet; 406c5e268c6Sopenharmony_ci} 407c5e268c6Sopenharmony_ci 408c5e268c6Sopenharmony_cistd::string MetadataUtils::EncodeToString(std::shared_ptr<CameraMetadata> metadata) 409c5e268c6Sopenharmony_ci{ 410c5e268c6Sopenharmony_ci int32_t ret; 411c5e268c6Sopenharmony_ci const int32_t headerLength = sizeof(common_metadata_header_t); 412c5e268c6Sopenharmony_ci const int32_t itemLen = sizeof(camera_metadata_item_entry_t); 413c5e268c6Sopenharmony_ci const int32_t itemFixedLen = static_cast<int32_t>(offsetof(camera_metadata_item_entry_t, data)); 414c5e268c6Sopenharmony_ci 415c5e268c6Sopenharmony_ci if (metadata == nullptr || metadata->get() == nullptr) { 416c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::EncodeToString Metadata is invalid"); 417c5e268c6Sopenharmony_ci return {}; 418c5e268c6Sopenharmony_ci } 419c5e268c6Sopenharmony_ci 420c5e268c6Sopenharmony_ci common_metadata_header_t *meta = metadata->get(); 421c5e268c6Sopenharmony_ci int32_t encodeDataLen = headerLength + (itemLen * meta->item_count) + meta->data_count; 422c5e268c6Sopenharmony_ci std::string s(encodeDataLen, '\0'); 423c5e268c6Sopenharmony_ci char *encodeData = &s[0]; 424c5e268c6Sopenharmony_ci ret = memcpy_s(encodeData, encodeDataLen, meta, headerLength); 425c5e268c6Sopenharmony_ci if (ret != EOK) { 426c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for metadata header"); 427c5e268c6Sopenharmony_ci return {}; 428c5e268c6Sopenharmony_ci } 429c5e268c6Sopenharmony_ci encodeData += headerLength; 430c5e268c6Sopenharmony_ci encodeDataLen -= headerLength; 431c5e268c6Sopenharmony_ci camera_metadata_item_entry_t *item = GetMetadataItems(meta); 432c5e268c6Sopenharmony_ci for (uint32_t index = 0; index < meta->item_count; index++, item++) { 433c5e268c6Sopenharmony_ci ret = memcpy_s(encodeData, encodeDataLen, item, itemFixedLen); 434c5e268c6Sopenharmony_ci if (ret != EOK) { 435c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for item fixed fields"); 436c5e268c6Sopenharmony_ci return {}; 437c5e268c6Sopenharmony_ci } 438c5e268c6Sopenharmony_ci encodeData += itemFixedLen; 439c5e268c6Sopenharmony_ci encodeDataLen -= itemFixedLen; 440c5e268c6Sopenharmony_ci int32_t dataLen = itemLen - itemFixedLen; 441c5e268c6Sopenharmony_ci ret = memcpy_s(encodeData, encodeDataLen, &(item->data), dataLen); 442c5e268c6Sopenharmony_ci if (ret != EOK) { 443c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for item data field"); 444c5e268c6Sopenharmony_ci return {}; 445c5e268c6Sopenharmony_ci } 446c5e268c6Sopenharmony_ci encodeData += dataLen; 447c5e268c6Sopenharmony_ci encodeDataLen -= dataLen; 448c5e268c6Sopenharmony_ci } 449c5e268c6Sopenharmony_ci 450c5e268c6Sopenharmony_ci if (meta->data_count != 0) { 451c5e268c6Sopenharmony_ci ret = copyEncodeToStringMem(meta, encodeData, encodeDataLen); 452c5e268c6Sopenharmony_ci if (ret != CAM_META_SUCCESS) { 453c5e268c6Sopenharmony_ci return {}; 454c5e268c6Sopenharmony_ci } 455c5e268c6Sopenharmony_ci encodeData += meta->data_count; 456c5e268c6Sopenharmony_ci } 457c5e268c6Sopenharmony_ci METADATA_DEBUG_LOG("MetadataUtils::EncodeToString Calculated length: %{public}zu, encoded length: %{public}zu", 458c5e268c6Sopenharmony_ci s.capacity(), (encodeData - &s[0])); 459c5e268c6Sopenharmony_ci 460c5e268c6Sopenharmony_ci return s; 461c5e268c6Sopenharmony_ci} 462c5e268c6Sopenharmony_ci 463c5e268c6Sopenharmony_ciint MetadataUtils::copyEncodeToStringMem(common_metadata_header_t *meta, char *encodeData, int32_t encodeDataLen) 464c5e268c6Sopenharmony_ci{ 465c5e268c6Sopenharmony_ci uint8_t *metaMetadataData = GetMetadataData(meta); 466c5e268c6Sopenharmony_ci int32_t ret = CAM_META_SUCCESS; 467c5e268c6Sopenharmony_ci if (metaMetadataData == nullptr) { 468c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::EncodeToString GetMetadataData failed"); 469c5e268c6Sopenharmony_ci return CAM_META_FAILURE; 470c5e268c6Sopenharmony_ci } 471c5e268c6Sopenharmony_ci ret = memcpy_s(encodeData, encodeDataLen, metaMetadataData, meta->data_count); 472c5e268c6Sopenharmony_ci if (ret != EOK) { 473c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for data"); 474c5e268c6Sopenharmony_ci return CAM_META_FAILURE; 475c5e268c6Sopenharmony_ci } 476c5e268c6Sopenharmony_ci return CAM_META_SUCCESS; 477c5e268c6Sopenharmony_ci} 478c5e268c6Sopenharmony_ci 479c5e268c6Sopenharmony_cistd::shared_ptr<CameraMetadata> MetadataUtils::DecodeFromString(std::string setting) 480c5e268c6Sopenharmony_ci{ 481c5e268c6Sopenharmony_ci int32_t ret; 482c5e268c6Sopenharmony_ci uint32_t totalLen = setting.capacity(); 483c5e268c6Sopenharmony_ci const uint32_t headerLength = sizeof(common_metadata_header_t); 484c5e268c6Sopenharmony_ci const uint32_t itemLen = sizeof(camera_metadata_item_entry_t); 485c5e268c6Sopenharmony_ci const uint32_t itemFixedLen = offsetof(camera_metadata_item_entry_t, data); 486c5e268c6Sopenharmony_ci 487c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(totalLen < headerLength, 488c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Length is less than metadata header length") 489c5e268c6Sopenharmony_ci 490c5e268c6Sopenharmony_ci char *decodeData = &setting[0]; 491c5e268c6Sopenharmony_ci common_metadata_header_t header; 492c5e268c6Sopenharmony_ci ret = memcpy_s(&header, headerLength, decodeData, headerLength); 493c5e268c6Sopenharmony_ci 494c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(ret != EOK, 495c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Failed to copy memory for metadata header") 496c5e268c6Sopenharmony_ci std::shared_ptr<CameraMetadata> metadata 497c5e268c6Sopenharmony_ci = std::make_shared<CameraMetadata>(header.item_capacity, header.data_capacity); 498c5e268c6Sopenharmony_ci common_metadata_header_t *meta = metadata->get(); 499c5e268c6Sopenharmony_ci 500c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(!meta, 501c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Failed to get metadata header") 502c5e268c6Sopenharmony_ci uint32_t actualMemSize = meta->size; 503c5e268c6Sopenharmony_ci ret = memcpy_s(meta, headerLength, &header, headerLength); 504c5e268c6Sopenharmony_ci 505c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(ret != EOK, 506c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Failed to copy memory for metadata header") 507c5e268c6Sopenharmony_ci bool isItemsStartInvalid = meta->items_start >= actualMemSize || meta->items_start < headerLength; 508c5e268c6Sopenharmony_ci bool isDataStartInvalid = meta->data_start >= actualMemSize || meta->data_start < headerLength; 509c5e268c6Sopenharmony_ci bool isMetadataCountInvaild = (actualMemSize - meta->items_start) < (uint64_t)meta->item_count * itemLen || 510c5e268c6Sopenharmony_ci (actualMemSize - meta->data_start) < meta->data_count; 511c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(isItemsStartInvalid || isDataStartInvalid || isMetadataCountInvaild, 512c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString invalid item_start") 513c5e268c6Sopenharmony_ci decodeData += headerLength; 514c5e268c6Sopenharmony_ci camera_metadata_item_entry_t *item = GetMetadataItems(meta); 515c5e268c6Sopenharmony_ci for (uint32_t index = 0; index < meta->item_count; index++, item++) { 516c5e268c6Sopenharmony_ci if (totalLen < ((decodeData - &setting[0]) + itemLen)) { 517c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed at item index: %{public}u", index); 518c5e268c6Sopenharmony_ci return {}; 519c5e268c6Sopenharmony_ci } 520c5e268c6Sopenharmony_ci ret = memcpy_s(item, itemFixedLen, decodeData, itemFixedLen); 521c5e268c6Sopenharmony_ci 522c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(ret != EOK, 523c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Failed to copy memory for item fixed fields") 524c5e268c6Sopenharmony_ci decodeData += itemFixedLen; 525c5e268c6Sopenharmony_ci uint32_t dataLen = itemLen - itemFixedLen; 526c5e268c6Sopenharmony_ci ret = memcpy_s(&(item->data), dataLen, decodeData, dataLen); 527c5e268c6Sopenharmony_ci 528c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(ret != EOK, 529c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Failed to copy memory for item data field") 530c5e268c6Sopenharmony_ci decodeData += dataLen; 531c5e268c6Sopenharmony_ci } 532c5e268c6Sopenharmony_ci 533c5e268c6Sopenharmony_ci char *decodeMetadataData = &setting[0]; 534c5e268c6Sopenharmony_ci ret = copyDecodeFromStringMem(meta, decodeData, decodeMetadataData, totalLen); 535c5e268c6Sopenharmony_ci if (ret != CAM_META_SUCCESS) { 536c5e268c6Sopenharmony_ci return {}; 537c5e268c6Sopenharmony_ci } 538c5e268c6Sopenharmony_ci 539c5e268c6Sopenharmony_ci METADATA_DEBUG_LOG("MetadataUtils::DecodeFromString String length: %{public}zu, Decoded length: %{public}zu", 540c5e268c6Sopenharmony_ci setting.capacity(), (decodeData - &setting[0])); 541c5e268c6Sopenharmony_ci return metadata; 542c5e268c6Sopenharmony_ci} 543c5e268c6Sopenharmony_ci 544c5e268c6Sopenharmony_ciint MetadataUtils::copyDecodeFromStringMem(common_metadata_header_t *meta, char *decodeData, 545c5e268c6Sopenharmony_ci char *decodeMetadataData, uint32_t totalLen) 546c5e268c6Sopenharmony_ci{ 547c5e268c6Sopenharmony_ci if (meta->data_count != 0) { 548c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN( 549c5e268c6Sopenharmony_ci totalLen < static_cast<uint32_t>(((decodeData - decodeMetadataData) + meta->data_count)), 550c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Failed at data copy") 551c5e268c6Sopenharmony_ci uint8_t *metaMetadataData = GetMetadataData(meta); 552c5e268c6Sopenharmony_ci int32_t ret; 553c5e268c6Sopenharmony_ci if (metaMetadataData == nullptr) { 554c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::DecodeFromString GetMetadataData failed"); 555c5e268c6Sopenharmony_ci return CAM_META_FAILURE; 556c5e268c6Sopenharmony_ci } 557c5e268c6Sopenharmony_ci ret = memcpy_s(metaMetadataData, meta->data_count, decodeData, meta->data_count); 558c5e268c6Sopenharmony_ci 559c5e268c6Sopenharmony_ci IF_COND_PRINT_MSG_AND_RETURN(ret != EOK, 560c5e268c6Sopenharmony_ci "MetadataUtils::DecodeFromString Failed to copy memory for item data field") 561c5e268c6Sopenharmony_ci decodeData += meta->data_count; 562c5e268c6Sopenharmony_ci return CAM_META_SUCCESS; 563c5e268c6Sopenharmony_ci } 564c5e268c6Sopenharmony_ci return CAM_META_SUCCESS; 565c5e268c6Sopenharmony_ci} 566c5e268c6Sopenharmony_ci 567c5e268c6Sopenharmony_cistatic void ReadMetadataUInt8(camera_metadata_item_t &entry, MessageParcel &data) 568c5e268c6Sopenharmony_ci{ 569c5e268c6Sopenharmony_ci std::vector<uint8_t> buffers; 570c5e268c6Sopenharmony_ci data.ReadUInt8Vector(&buffers); 571c5e268c6Sopenharmony_ci entry.data.u8 = new(std::nothrow) uint8_t[entry.count]; 572c5e268c6Sopenharmony_ci if (entry.data.u8 != nullptr) { 573c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count && i < buffers.size(); i++) { 574c5e268c6Sopenharmony_ci entry.data.u8[i] = buffers.at(i); 575c5e268c6Sopenharmony_ci } 576c5e268c6Sopenharmony_ci } 577c5e268c6Sopenharmony_ci} 578c5e268c6Sopenharmony_ci 579c5e268c6Sopenharmony_cistatic void ReadMetadataInt32(camera_metadata_item_t &entry, MessageParcel &data) 580c5e268c6Sopenharmony_ci{ 581c5e268c6Sopenharmony_ci std::vector<int32_t> buffers; 582c5e268c6Sopenharmony_ci data.ReadInt32Vector(&buffers); 583c5e268c6Sopenharmony_ci entry.data.i32 = new(std::nothrow) int32_t[entry.count]; 584c5e268c6Sopenharmony_ci if (entry.data.i32 != nullptr) { 585c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count && i < buffers.size(); i++) { 586c5e268c6Sopenharmony_ci entry.data.i32[i] = buffers.at(i); 587c5e268c6Sopenharmony_ci } 588c5e268c6Sopenharmony_ci } 589c5e268c6Sopenharmony_ci} 590c5e268c6Sopenharmony_ci 591c5e268c6Sopenharmony_cistatic void ReadMetadataUInt32(camera_metadata_item_t &entry, MessageParcel &data) 592c5e268c6Sopenharmony_ci{ 593c5e268c6Sopenharmony_ci std::vector<uint32_t> buffers; 594c5e268c6Sopenharmony_ci data.ReadUInt32Vector(&buffers); 595c5e268c6Sopenharmony_ci entry.data.ui32 = new(std::nothrow) uint32_t[entry.count]; 596c5e268c6Sopenharmony_ci if (entry.data.ui32 != nullptr) { 597c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count && i < buffers.size(); i++) { 598c5e268c6Sopenharmony_ci entry.data.ui32[i] = buffers.at(i); 599c5e268c6Sopenharmony_ci } 600c5e268c6Sopenharmony_ci } 601c5e268c6Sopenharmony_ci} 602c5e268c6Sopenharmony_ci 603c5e268c6Sopenharmony_cistatic void ReadMetadataFloat(camera_metadata_item_t &entry, MessageParcel &data) 604c5e268c6Sopenharmony_ci{ 605c5e268c6Sopenharmony_ci std::vector<float> buffers; 606c5e268c6Sopenharmony_ci data.ReadFloatVector(&buffers); 607c5e268c6Sopenharmony_ci entry.data.f = new(std::nothrow) float[entry.count]; 608c5e268c6Sopenharmony_ci if (entry.data.f != nullptr) { 609c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count && i < buffers.size(); i++) { 610c5e268c6Sopenharmony_ci entry.data.f[i] = buffers.at(i); 611c5e268c6Sopenharmony_ci } 612c5e268c6Sopenharmony_ci } 613c5e268c6Sopenharmony_ci} 614c5e268c6Sopenharmony_ci 615c5e268c6Sopenharmony_cistatic void ReadMetadataInt64(camera_metadata_item_t &entry, MessageParcel &data) 616c5e268c6Sopenharmony_ci{ 617c5e268c6Sopenharmony_ci std::vector<int64_t> buffers; 618c5e268c6Sopenharmony_ci data.ReadInt64Vector(&buffers); 619c5e268c6Sopenharmony_ci entry.data.i64 = new(std::nothrow) int64_t[entry.count]; 620c5e268c6Sopenharmony_ci if (entry.data.i64 != nullptr) { 621c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count && i < buffers.size(); i++) { 622c5e268c6Sopenharmony_ci entry.data.i64[i] = buffers.at(i); 623c5e268c6Sopenharmony_ci } 624c5e268c6Sopenharmony_ci } 625c5e268c6Sopenharmony_ci} 626c5e268c6Sopenharmony_ci 627c5e268c6Sopenharmony_cistatic void ReadMetadataDouble(camera_metadata_item_t &entry, MessageParcel &data) 628c5e268c6Sopenharmony_ci{ 629c5e268c6Sopenharmony_ci std::vector<double> buffers; 630c5e268c6Sopenharmony_ci data.ReadDoubleVector(&buffers); 631c5e268c6Sopenharmony_ci entry.data.d = new(std::nothrow) double[entry.count]; 632c5e268c6Sopenharmony_ci if (entry.data.d != nullptr) { 633c5e268c6Sopenharmony_ci for (size_t i = 0; i < entry.count && i < buffers.size(); i++) { 634c5e268c6Sopenharmony_ci entry.data.d[i] = buffers.at(i); 635c5e268c6Sopenharmony_ci } 636c5e268c6Sopenharmony_ci } 637c5e268c6Sopenharmony_ci} 638c5e268c6Sopenharmony_ci 639c5e268c6Sopenharmony_cistatic void ReadMetadataRational(camera_metadata_item_t &entry, MessageParcel &data) 640c5e268c6Sopenharmony_ci{ 641c5e268c6Sopenharmony_ci std::vector<int32_t> buffers; 642c5e268c6Sopenharmony_ci data.ReadInt32Vector(&buffers); 643c5e268c6Sopenharmony_ci if (buffers.size() < 1) { 644c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::ReadMetadataRational the buffers size < 1"); 645c5e268c6Sopenharmony_ci entry.data.r = nullptr; 646c5e268c6Sopenharmony_ci return; 647c5e268c6Sopenharmony_ci } 648c5e268c6Sopenharmony_ci entry.data.r = new(std::nothrow) camera_rational_t[entry.count]; 649c5e268c6Sopenharmony_ci if (entry.data.r != nullptr) { 650c5e268c6Sopenharmony_ci for (size_t i = 0, j = 0; 651c5e268c6Sopenharmony_ci i < entry.count && j < static_cast<size_t>(buffers.size() - 1); 652c5e268c6Sopenharmony_ci i++, j += 2) { // 2:Take two elements from the buffer vector container 653c5e268c6Sopenharmony_ci entry.data.r[i].numerator = buffers.at(j); 654c5e268c6Sopenharmony_ci entry.data.r[i].denominator = buffers.at(j + 1); 655c5e268c6Sopenharmony_ci } 656c5e268c6Sopenharmony_ci } 657c5e268c6Sopenharmony_ci} 658c5e268c6Sopenharmony_cibool MetadataUtils::ReadMetadata(camera_metadata_item_t &entry, MessageParcel &data) 659c5e268c6Sopenharmony_ci{ 660c5e268c6Sopenharmony_ci if (entry.count > MAX_SUPPORTED_ITEMS) { 661c5e268c6Sopenharmony_ci entry.count = MAX_SUPPORTED_ITEMS; 662c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::ReadMetadata item.count is more than supported value"); 663c5e268c6Sopenharmony_ci } 664c5e268c6Sopenharmony_ci switch (entry.data_type) { 665c5e268c6Sopenharmony_ci case META_TYPE_BYTE: 666c5e268c6Sopenharmony_ci ReadMetadataUInt8(entry, data); 667c5e268c6Sopenharmony_ci break; 668c5e268c6Sopenharmony_ci case META_TYPE_INT32: 669c5e268c6Sopenharmony_ci ReadMetadataInt32(entry, data); 670c5e268c6Sopenharmony_ci break; 671c5e268c6Sopenharmony_ci case META_TYPE_UINT32: 672c5e268c6Sopenharmony_ci ReadMetadataUInt32(entry, data); 673c5e268c6Sopenharmony_ci break; 674c5e268c6Sopenharmony_ci case META_TYPE_FLOAT: 675c5e268c6Sopenharmony_ci ReadMetadataFloat(entry, data); 676c5e268c6Sopenharmony_ci break; 677c5e268c6Sopenharmony_ci case META_TYPE_INT64: 678c5e268c6Sopenharmony_ci ReadMetadataInt64(entry, data); 679c5e268c6Sopenharmony_ci break; 680c5e268c6Sopenharmony_ci case META_TYPE_DOUBLE: 681c5e268c6Sopenharmony_ci ReadMetadataDouble(entry, data); 682c5e268c6Sopenharmony_ci break; 683c5e268c6Sopenharmony_ci case META_TYPE_RATIONAL: 684c5e268c6Sopenharmony_ci ReadMetadataRational(entry, data); 685c5e268c6Sopenharmony_ci break; 686c5e268c6Sopenharmony_ci } 687c5e268c6Sopenharmony_ci return true; 688c5e268c6Sopenharmony_ci} 689c5e268c6Sopenharmony_ci 690c5e268c6Sopenharmony_civoid MetadataUtils::ItemDataToBuffer(const camera_metadata_item_t &item, void **buffer) 691c5e268c6Sopenharmony_ci{ 692c5e268c6Sopenharmony_ci if (buffer == nullptr) { 693c5e268c6Sopenharmony_ci METADATA_ERR_LOG("MetadataUtils::ItemDataToBuffer buffer is null"); 694c5e268c6Sopenharmony_ci return; 695c5e268c6Sopenharmony_ci } 696c5e268c6Sopenharmony_ci if (item.data_type == META_TYPE_BYTE) { 697c5e268c6Sopenharmony_ci *buffer = reinterpret_cast<void *>(item.data.u8); 698c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_INT32) { 699c5e268c6Sopenharmony_ci *buffer = reinterpret_cast<void *>(item.data.i32); 700c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_FLOAT) { 701c5e268c6Sopenharmony_ci *buffer = reinterpret_cast<void *>(item.data.f); 702c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_UINT32) { 703c5e268c6Sopenharmony_ci *buffer = reinterpret_cast<void *>(item.data.ui32); 704c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_INT64) { 705c5e268c6Sopenharmony_ci *buffer = reinterpret_cast<void *>(item.data.i64); 706c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_DOUBLE) { 707c5e268c6Sopenharmony_ci *buffer = reinterpret_cast<void *>(item.data.d); 708c5e268c6Sopenharmony_ci } else if (item.data_type == META_TYPE_RATIONAL) { 709c5e268c6Sopenharmony_ci *buffer = reinterpret_cast<void *>(item.data.r); 710c5e268c6Sopenharmony_ci } 711c5e268c6Sopenharmony_ci} 712c5e268c6Sopenharmony_ci 713c5e268c6Sopenharmony_civoid MetadataUtils::FreeMetadataBuffer(camera_metadata_item_t &entry) 714c5e268c6Sopenharmony_ci{ 715c5e268c6Sopenharmony_ci if (entry.data_type == META_TYPE_BYTE) { 716c5e268c6Sopenharmony_ci if (entry.data.u8 != nullptr) { 717c5e268c6Sopenharmony_ci delete[] entry.data.u8; 718c5e268c6Sopenharmony_ci } 719c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_INT32) { 720c5e268c6Sopenharmony_ci if (entry.data.i32 != nullptr) { 721c5e268c6Sopenharmony_ci delete[] entry.data.i32; 722c5e268c6Sopenharmony_ci } 723c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_FLOAT) { 724c5e268c6Sopenharmony_ci if (entry.data.f != nullptr) { 725c5e268c6Sopenharmony_ci delete[] entry.data.f; 726c5e268c6Sopenharmony_ci } 727c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_INT64) { 728c5e268c6Sopenharmony_ci if (entry.data.i64 != nullptr) { 729c5e268c6Sopenharmony_ci delete[] entry.data.i64; 730c5e268c6Sopenharmony_ci } 731c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_UINT32) { 732c5e268c6Sopenharmony_ci if (entry.data.ui32 != nullptr) { 733c5e268c6Sopenharmony_ci delete[] entry.data.ui32; 734c5e268c6Sopenharmony_ci } 735c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_DOUBLE) { 736c5e268c6Sopenharmony_ci if (entry.data.d != nullptr) { 737c5e268c6Sopenharmony_ci delete[] entry.data.d; 738c5e268c6Sopenharmony_ci } 739c5e268c6Sopenharmony_ci } else if (entry.data_type == META_TYPE_RATIONAL) { 740c5e268c6Sopenharmony_ci if (entry.data.r != nullptr) { 741c5e268c6Sopenharmony_ci delete[] entry.data.r; 742c5e268c6Sopenharmony_ci } 743c5e268c6Sopenharmony_ci } 744c5e268c6Sopenharmony_ci} 745c5e268c6Sopenharmony_ci} // Camera 746