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