• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "metadata_utils.h"
17 #include <securec.h>
18 #include "metadata_log.h"
19 
20 static constexpr uint32_t MAX_SUPPORTED_TAGS = 1000;
21 static constexpr uint32_t MAX_SUPPORTED_ITEMS = 2000;
22 static constexpr uint32_t MAX_ITEM_CAPACITY = (1000 * 10);
23 static constexpr uint32_t MAX_DATA_CAPACITY = (1000 * 10 * 10);
24 
25 namespace OHOS::Camera {
WriteMetadataDataToVec(const camera_metadata_item_t & entry,std::vector<uint8_t> & cameraAbility)26 void MetadataUtils::WriteMetadataDataToVec(const camera_metadata_item_t &entry, std::vector<uint8_t>& cameraAbility)
27 {
28     if (entry.data_type == META_TYPE_BYTE) {
29         for (size_t i = 0; i < entry.count; i++) {
30             WriteData<int8_t>(*(entry.data.u8 + i), cameraAbility);
31         }
32     } else if (entry.data_type == META_TYPE_INT32) {
33         for (size_t i = 0; i < entry.count; i++) {
34             WriteData<int32_t>(*(entry.data.i32 + i), cameraAbility);
35         }
36     } else if (entry.data_type == META_TYPE_FLOAT) {
37         for (size_t i = 0; i < entry.count; i++) {
38             WriteData<float>(*(entry.data.f + i), cameraAbility);
39         }
40     } else if (entry.data_type == META_TYPE_INT64) {
41         for (size_t i = 0; i < entry.count; i++) {
42             WriteData<int64_t>(*(entry.data.i64 + i), cameraAbility);
43         }
44     } else if (entry.data_type == META_TYPE_DOUBLE) {
45         for (size_t i = 0; i < entry.count; i++) {
46             WriteData<double>(*(entry.data.d + i), cameraAbility);
47         }
48     } else if (entry.data_type == META_TYPE_RATIONAL) {
49         for (size_t i = 0; i < entry.count; i++) {
50             WriteData<int32_t>((*(entry.data.r + i)).numerator, cameraAbility);
51             WriteData<int32_t>((*(entry.data.r + i)).denominator, cameraAbility);
52         }
53     }
54 }
55 
ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> & metadata,std::vector<uint8_t> & cameraAbility)56 bool MetadataUtils::ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> &metadata,
57     std::vector<uint8_t>& cameraAbility)
58 {
59     if (metadata == nullptr) {
60         METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: metadata is null!");
61         return false;
62     }
63 
64     common_metadata_header_t *meta = metadata->get();
65     if (meta == nullptr) {
66         WriteData<uint32_t>(0, cameraAbility);
67         METADATA_WARNING_LOG("MetadataUtils::ConvertMetadataToVec: tagCount is 0!");
68         return true;
69     }
70 
71     uint32_t tagCount = GetCameraMetadataItemCount(meta);
72     if (tagCount > MAX_SUPPORTED_TAGS) {
73         METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: tagCount out of range: %u", tagCount);
74         return false;
75     }
76 
77     uint32_t itemCapacity = GetCameraMetadataItemCapacity(meta);
78     if (itemCapacity > MAX_ITEM_CAPACITY) {
79         METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: itemCapacity out of range: %u", itemCapacity);
80         return false;
81     }
82 
83     uint32_t dataCapacity = GetCameraMetadataDataSize(meta);
84     if (dataCapacity > MAX_DATA_CAPACITY) {
85         METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: dataCapacity out of range: %u", dataCapacity);
86         return false;
87     }
88 
89     WriteData<uint32_t>(tagCount, cameraAbility);
90     WriteData<uint32_t>(itemCapacity, cameraAbility);
91     WriteData<uint32_t>(dataCapacity, cameraAbility);
92     for (uint32_t i = 0; i < tagCount; i++) {
93         camera_metadata_item_t item;
94         int ret = GetCameraMetadataItem(meta, i, &item);
95         if (ret != CAM_META_SUCCESS) {
96             METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: get meta item failed!");
97             return false;
98         }
99 
100         if (item.count > MAX_SUPPORTED_ITEMS) {
101             METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: item.count out of range:%u", item.count);
102             return false;
103         }
104         WriteData<uint32_t>(item.index, cameraAbility);
105         WriteData<uint32_t>(item.item, cameraAbility);
106         WriteData<uint32_t>(item.data_type, cameraAbility);
107         WriteData<uint32_t>(item.count, cameraAbility);
108 
109         WriteMetadataDataToVec(item, cameraAbility);
110     }
111     return true;
112 }
113 
EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> & metadata,MessageParcel & data)114 bool MetadataUtils::EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> &metadata,
115                                          MessageParcel &data)
116 {
117     if (metadata == nullptr) {
118         return false;
119     }
120 
121     bool bRet = true;
122     uint32_t tagCount = 0;
123     common_metadata_header_t *meta = metadata->get();
124     if (meta != nullptr) {
125         tagCount = GetCameraMetadataItemCount(meta);
126         bRet = bRet && data.WriteUint32(tagCount);
127         bRet = bRet && data.WriteUint32(GetCameraMetadataItemCapacity(meta));
128         bRet = bRet && data.WriteUint32(GetCameraMetadataDataSize(meta));
129         for (uint32_t i = 0; i < tagCount; i++) {
130             camera_metadata_item_t item;
131             int ret = GetCameraMetadataItem(meta, i, &item);
132             if (ret != CAM_META_SUCCESS) {
133                 return false;
134             }
135 
136             bRet = bRet && data.WriteUint32(item.index);
137             bRet = bRet && data.WriteUint32(item.item);
138             bRet = bRet && data.WriteUint32(item.data_type);
139             bRet = bRet && data.WriteUint32(item.count);
140             bRet = bRet && MetadataUtils::WriteMetadata(item, data);
141         }
142     } else {
143         bRet = data.WriteUint32(tagCount);
144     }
145     return bRet;
146 }
147 
ReadMetadataDataFromVec(int32_t & index,camera_metadata_item_t & entry,const std::vector<uint8_t> & cameraAbility)148 void MetadataUtils::ReadMetadataDataFromVec(int32_t &index, camera_metadata_item_t &entry,
149     const std::vector<uint8_t>& cameraAbility)
150 {
151     if (entry.data_type == META_TYPE_BYTE) {
152         entry.data.u8 = new(std::nothrow) uint8_t[entry.count];
153         if (entry.data.u8 != nullptr) {
154             for (size_t i = 0; i < entry.count; i++) {
155                 ReadData<uint8_t>(entry.data.u8[i], index, cameraAbility);
156             }
157         }
158     } else if (entry.data_type == META_TYPE_INT32) {
159         entry.data.i32 = new(std::nothrow) int32_t[entry.count];
160         if (entry.data.i32 != nullptr) {
161             for (size_t i = 0; i < entry.count; i++) {
162                 ReadData<int32_t>(entry.data.i32[i], index, cameraAbility);
163             }
164         }
165     } else if (entry.data_type == META_TYPE_FLOAT) {
166         entry.data.f = new(std::nothrow) float[entry.count];
167         if (entry.data.f != nullptr) {
168             for (size_t i = 0; i < entry.count; i++) {
169                 ReadData<float>(entry.data.f[i], index, cameraAbility);
170             }
171         }
172     } else if (entry.data_type == META_TYPE_INT64) {
173         entry.data.i64 = new(std::nothrow) int64_t[entry.count];
174         if (entry.data.i64 != nullptr) {
175             for (size_t i = 0; i < entry.count; i++) {
176                 ReadData<int64_t>(entry.data.i64[i], index, cameraAbility);
177             }
178         }
179     } else if (entry.data_type == META_TYPE_DOUBLE) {
180         entry.data.d = new(std::nothrow) double[entry.count];
181         if (entry.data.d != nullptr) {
182             for (size_t i = 0; i < entry.count; i++) {
183                 ReadData<double>(entry.data.d[i], index, cameraAbility);
184             }
185         }
186     } else if (entry.data_type == META_TYPE_RATIONAL) {
187         entry.data.r = new(std::nothrow) camera_rational_t[entry.count];
188         if (entry.data.r != nullptr) {
189             for (size_t i = 0; i < entry.count; i++) {
190                 ReadData<int32_t>(entry.data.r[i].numerator, index, cameraAbility);
191                 ReadData<int32_t>(entry.data.r[i].denominator, index, cameraAbility);
192             }
193         }
194     }
195 }
196 
ConvertVecToMetadata(const std::vector<uint8_t> & cameraAbility,std::shared_ptr<CameraMetadata> & metadata)197 void MetadataUtils::ConvertVecToMetadata(const std::vector<uint8_t>& cameraAbility,
198     std::shared_ptr<CameraMetadata> &metadata)
199 {
200     int32_t index = 0;
201     uint32_t tagCount = 0;
202     uint32_t itemCapacity = 0;
203     uint32_t dataCapacity = 0;
204 
205     ReadData<uint32_t>(tagCount, index, cameraAbility);
206     if (tagCount > MAX_SUPPORTED_TAGS) {
207         METADATA_ERR_LOG("MetadataUtils::ConvertVecToMetadata: tagCount out of range: %u", tagCount);
208         return;
209     }
210     ReadData<uint32_t>(itemCapacity, index, cameraAbility);
211     if (itemCapacity > MAX_ITEM_CAPACITY) {
212         METADATA_ERR_LOG("MetadataUtils::ConvertVecToMetadata: itemCapacity out of range: %u", itemCapacity);
213         return;
214     }
215     ReadData<uint32_t>(dataCapacity, index, cameraAbility);
216     if (dataCapacity > MAX_DATA_CAPACITY) {
217         METADATA_ERR_LOG("MetadataUtils::ConvertVecToMetadata: dataCapacity out of range: %u", dataCapacity);
218         return;
219     }
220 
221     std::vector<camera_metadata_item_t> items;
222     for (uint32_t i = 0; i < tagCount; i++) {
223         camera_metadata_item_t item;
224         ReadData<uint32_t>(item.index, index, cameraAbility);
225         ReadData<uint32_t>(item.item, index, cameraAbility);
226         ReadData<uint32_t>(item.data_type, index, cameraAbility);
227         ReadData<uint32_t>(item.count, index, cameraAbility);
228         if (item.count > MAX_SUPPORTED_ITEMS) {
229             METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata item.count out of range:%u", item.count);
230             return;
231         }
232         ReadMetadataDataFromVec(index, item, cameraAbility);
233         items.push_back(item);
234     }
235 
236     metadata = std::make_shared<CameraMetadata>(itemCapacity, dataCapacity);
237     common_metadata_header_t *meta = metadata->get();
238     for (auto &item_ : items) {
239         void *buffer = nullptr;
240         MetadataUtils::ItemDataToBuffer(item_, &buffer);
241         (void)AddCameraMetadataItem(meta, item_.item, buffer, item_.count);
242         FreeMetadataBuffer(item_);
243     }
244 }
245 
DecodeCameraMetadata(MessageParcel & data,std::shared_ptr<CameraMetadata> & metadata)246 void MetadataUtils::DecodeCameraMetadata(MessageParcel &data, std::shared_ptr<CameraMetadata> &metadata)
247 {
248     uint32_t tagCount = data.ReadUint32();
249     uint32_t itemCapacity = data.ReadUint32();
250     uint32_t dataCapacity = data.ReadUint32();
251 
252     if (tagCount > MAX_SUPPORTED_TAGS) {
253         tagCount = MAX_SUPPORTED_TAGS;
254         METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata tagCount is more than supported value");
255     }
256 
257     if (itemCapacity > MAX_ITEM_CAPACITY) {
258         itemCapacity = MAX_ITEM_CAPACITY;
259         METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata itemCapacity is more than supported value");
260     }
261 
262     if (dataCapacity > MAX_DATA_CAPACITY) {
263         dataCapacity = MAX_DATA_CAPACITY;
264         METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata dataCapacity is more than supported value");
265     }
266 
267     std::vector<camera_metadata_item_t> items;
268     for (uint32_t i = 0; i < tagCount; i++) {
269         camera_metadata_item_t item;
270         item.index = data.ReadUint32();
271         item.item = data.ReadUint32();
272         item.data_type = data.ReadUint32();
273         item.count = data.ReadUint32();
274         if (item.count > MAX_SUPPORTED_ITEMS) {
275             item.count = MAX_SUPPORTED_ITEMS;
276             METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata item.count is more than supported value");
277         }
278         MetadataUtils::ReadMetadata(item, data);
279         items.push_back(item);
280     }
281 
282     metadata = std::make_shared<CameraMetadata>(itemCapacity, dataCapacity);
283     common_metadata_header_t *meta = metadata->get();
284     for (auto &item_ : items) {
285         void *buffer = nullptr;
286         MetadataUtils::ItemDataToBuffer(item_, &buffer);
287         (void)AddCameraMetadataItem(meta, item_.item, buffer, item_.count);
288         FreeMetadataBuffer(item_);
289     }
290 }
291 
WriteMetadata(const camera_metadata_item_t & item,MessageParcel & data)292 bool MetadataUtils::WriteMetadata(const camera_metadata_item_t &item, MessageParcel &data)
293 {
294     bool bRet = false;
295     size_t i;
296     if (item.data_type == META_TYPE_BYTE) {
297         std::vector<uint8_t> byteBuffers;
298         for (i = 0; i < item.count; i++) {
299             byteBuffers.push_back(*(item.data.u8 + i));
300         }
301         bRet = data.WriteUInt8Vector(byteBuffers);
302     } else if (item.data_type == META_TYPE_INT32) {
303         std::vector<int32_t> int32Buffers;
304         for (i = 0; i < item.count; i++) {
305             int32Buffers.push_back(*(item.data.i32 + i));
306         }
307         bRet = data.WriteInt32Vector(int32Buffers);
308     } else if (item.data_type == META_TYPE_FLOAT) {
309         std::vector<float> floatBuffers;
310         for (i = 0; i < item.count; i++) {
311             floatBuffers.push_back(*(item.data.f + i));
312         }
313         bRet = data.WriteFloatVector(floatBuffers);
314     } else if (item.data_type == META_TYPE_UINT32) {
315         std::vector<uint32_t> uInt32Buffers;
316         for (i = 0; i < item.count; i++) {
317             uInt32Buffers.push_back(*(item.data.ui32 + i));
318         }
319         bRet = data.WriteUInt32Vector(uInt32Buffers);
320     } else if (item.data_type == META_TYPE_INT64) {
321         std::vector<int64_t> int64Buffers;
322         for (i = 0; i < item.count; i++) {
323             int64Buffers.push_back(*(item.data.i64 + i));
324         }
325         bRet = data.WriteInt64Vector(int64Buffers);
326     } else if (item.data_type == META_TYPE_DOUBLE) {
327         std::vector<double> doubleBuffers;
328         for (i = 0; i < item.count; i++) {
329             doubleBuffers.push_back(*(item.data.d + i));
330         }
331         bRet = data.WriteDoubleVector(doubleBuffers);
332     } else if (item.data_type == META_TYPE_RATIONAL) {
333         std::vector<int32_t> rationalBuffers;
334         for (i = 0; i < item.count; i++) {
335             rationalBuffers.push_back((*(item.data.r + i)).numerator);
336             rationalBuffers.push_back((*(item.data.r + i)).denominator);
337         }
338         bRet = data.WriteInt32Vector(rationalBuffers);
339     }
340 
341     return bRet;
342 }
343 
EncodeToString(std::shared_ptr<CameraMetadata> metadata)344 std::string MetadataUtils::EncodeToString(std::shared_ptr<CameraMetadata> metadata)
345 {
346     int32_t ret;
347     const int32_t headerLength = sizeof(common_metadata_header_t);
348     const int32_t itemLen = sizeof(camera_metadata_item_entry_t);
349     const int32_t itemFixedLen = static_cast<int32_t>(offsetof(camera_metadata_item_entry_t, data));
350 
351     if (metadata == nullptr || metadata->get() == nullptr) {
352         METADATA_ERR_LOG("MetadataUtils::EncodeToString Metadata is invalid");
353         return {};
354     }
355 
356     common_metadata_header_t *meta = metadata->get();
357     int32_t encodeDataLen = headerLength + (itemLen * meta->item_count) + meta->data_count;
358     std::string s(encodeDataLen, '\0');
359     char *encodeData = &s[0];
360     ret = memcpy_s(encodeData, encodeDataLen, meta, headerLength);
361     if (ret != EOK) {
362         METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for metadata header");
363         return {};
364     }
365     encodeData += headerLength;
366     encodeDataLen -= headerLength;
367     camera_metadata_item_entry_t *item = GetMetadataItems(meta);
368     for (uint32_t index = 0; index < meta->item_count; index++, item++) {
369         ret = memcpy_s(encodeData, encodeDataLen, item, itemFixedLen);
370         if (ret != EOK) {
371             METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for item fixed fields");
372             return {};
373         }
374         encodeData += itemFixedLen;
375         encodeDataLen -= itemFixedLen;
376         int32_t dataLen = itemLen - itemFixedLen;
377         ret = memcpy_s(encodeData, encodeDataLen,  &(item->data), dataLen);
378         if (ret != EOK) {
379             METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for item data field");
380             return {};
381         }
382         encodeData += dataLen;
383         encodeDataLen -= dataLen;
384     }
385 
386     if (meta->data_count != 0) {
387         ret = memcpy_s(encodeData, encodeDataLen, GetMetadataData(meta), meta->data_count);
388         if (ret != EOK) {
389             METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for data");
390             return {};
391         }
392         encodeData += meta->data_count;
393     }
394     METADATA_DEBUG_LOG("MetadataUtils::EncodeToString Calculated length: %{public}d, encoded length: %{public}d",
395                        s.capacity(), (encodeData - &s[0]));
396 
397     return s;
398 }
399 
DecodeFromString(std::string setting)400 std::shared_ptr<CameraMetadata> MetadataUtils::DecodeFromString(std::string setting)
401 {
402     uint32_t ret;
403     uint32_t totalLen = setting.capacity();
404     const uint32_t headerLength = sizeof(common_metadata_header_t);
405     const uint32_t itemLen = sizeof(camera_metadata_item_entry_t);
406     const uint32_t itemFixedLen = offsetof(camera_metadata_item_entry_t, data);
407 
408     if (totalLen < headerLength) {
409         METADATA_ERR_LOG("MetadataUtils::DecodeFromString Length is less than metadata header length");
410         return {};
411     }
412 
413     char *decodeData = &setting[0];
414     common_metadata_header_t header;
415     ret = memcpy_s(&header, headerLength, decodeData, headerLength);
416     if (ret != EOK) {
417         METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for metadata header");
418         return {};
419     }
420     std::shared_ptr<CameraMetadata> metadata
421         = std::make_shared<CameraMetadata>(header.item_capacity, header.data_capacity);
422     common_metadata_header_t *meta = metadata->get();
423     if (!meta) {
424         METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to get metadata header");
425         return {};
426     }
427     ret = memcpy_s(meta, headerLength, &header, headerLength);
428     if (ret != EOK) {
429         METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for metadata header");
430         return {};
431     }
432     decodeData += headerLength;
433     camera_metadata_item_entry_t *item = GetMetadataItems(meta);
434     for (uint32_t index = 0; index < meta->item_count; index++, item++) {
435         if (totalLen < ((decodeData - &setting[0]) + itemLen)) {
436             METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed at item index: %{public}d", index);
437             return {};
438         }
439         ret = memcpy_s(item, itemFixedLen, decodeData, itemFixedLen);
440         if (ret != EOK) {
441             METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for item fixed fields");
442             return {};
443         }
444         decodeData += itemFixedLen;
445         uint32_t dataLen = itemLen - itemFixedLen;
446         ret = memcpy_s(&(item->data), dataLen,  decodeData, dataLen);
447         if (ret != EOK) {
448             METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for item data field");
449             return {};
450         }
451         decodeData += dataLen;
452     }
453 
454     if (meta->data_count != 0) {
455         if (totalLen < static_cast<uint32_t>(((decodeData - &setting[0]) + meta->data_count))) {
456             METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed at data copy");
457             return {};
458         }
459         ret = memcpy_s(GetMetadataData(meta), meta->data_count, decodeData, meta->data_count);
460         if (ret != EOK) {
461             METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for data");
462             return {};
463         }
464         decodeData += meta->data_count;
465     }
466 
467     METADATA_DEBUG_LOG("MetadataUtils::DecodeFromString String length: %{public}d, Decoded length: %{public}d",
468                        setting.capacity(), (decodeData - &setting[0]));
469     return metadata;
470 }
471 
ReadMetadata(camera_metadata_item_t & item,MessageParcel & data)472 bool MetadataUtils::ReadMetadata(camera_metadata_item_t &item, MessageParcel &data)
473 {
474     size_t i, j;
475     if (item.data_type == META_TYPE_BYTE) {
476         std::vector<uint8_t> byteBuffers;
477         data.ReadUInt8Vector(&byteBuffers);
478         item.data.u8 = new(std::nothrow) uint8_t[item.count];
479         if (item.data.u8 != nullptr) {
480             for (i = 0; i < item.count && i < byteBuffers.size(); i++) {
481                 item.data.u8[i] = byteBuffers.at(i);
482             }
483         }
484     } else if (item.data_type == META_TYPE_INT32) {
485         std::vector<int32_t> int32Buffers;
486         data.ReadInt32Vector(&int32Buffers);
487         item.data.i32 = new(std::nothrow) int32_t[item.count];
488         if (item.data.i32 != nullptr) {
489             for (i = 0; i < item.count && i < int32Buffers.size(); i++) {
490                 item.data.i32[i] = int32Buffers.at(i);
491             }
492         }
493     } else if (item.data_type == META_TYPE_FLOAT) {
494         std::vector<float> floatBuffers;
495         data.ReadFloatVector(&floatBuffers);
496         item.data.f = new(std::nothrow) float[item.count];
497         if (item.data.f != nullptr) {
498             for (i = 0; i < item.count && i < floatBuffers.size(); i++) {
499                 item.data.f[i] = floatBuffers.at(i);
500             }
501         }
502     } else if (item.data_type == META_TYPE_UINT32) {
503         std::vector<uint32_t> uInt32Buffers;
504         data.ReadUInt32Vector(&uInt32Buffers);
505         item.data.ui32 = new(std::nothrow) uint32_t[item.count];
506         if (item.data.ui32 != nullptr) {
507             for (i = 0; i < item.count && i < uInt32Buffers.size(); i++) {
508                 item.data.ui32[i] = uInt32Buffers.at(i);
509             }
510         }
511     } else if (item.data_type == META_TYPE_INT64) {
512         std::vector<int64_t> int64uBffers;
513         data.ReadInt64Vector(&int64uBffers);
514         item.data.i64 = new(std::nothrow) int64_t[item.count];
515         if (item.data.i64 != nullptr) {
516             for (i = 0; i < item.count && i < int64uBffers.size(); i++) {
517                 item.data.i64[i] = int64uBffers.at(i);
518             }
519         }
520     } else if (item.data_type == META_TYPE_DOUBLE) {
521         std::vector<double> doubleBuffers;
522         data.ReadDoubleVector(&doubleBuffers);
523         item.data.d = new(std::nothrow) double[item.count];
524         if (item.data.d != nullptr) {
525             for (i = 0; i < item.count && i < doubleBuffers.size(); i++) {
526                 item.data.d[i] = doubleBuffers.at(i);
527             }
528         }
529     } else if (item.data_type == META_TYPE_RATIONAL) {
530         std::vector<int32_t> rationalBuffers;
531         data.ReadInt32Vector(&rationalBuffers);
532         item.data.r = new(std::nothrow) camera_rational_t[item.count];
533         if (item.data.r != nullptr) {
534             for (i = 0, j = 0;
535                     i < item.count && j < static_cast<size_t>(rationalBuffers.size() - 1);
536                     i++, j += INDEX_COUNTER) {
537                 item.data.r[i].numerator = rationalBuffers.at(j);
538                 item.data.r[i].denominator = rationalBuffers.at(j + 1);
539             }
540         }
541     }
542     return true;
543 }
544 
ItemDataToBuffer(const camera_metadata_item_t & item,void ** buffer)545 void MetadataUtils::ItemDataToBuffer(const camera_metadata_item_t &item, void **buffer)
546 {
547     if (buffer == nullptr) {
548         METADATA_ERR_LOG("MetadataUtils::ItemDataToBuffer buffer is null");
549         return;
550     }
551     if (item.data_type == META_TYPE_BYTE) {
552         *buffer = reinterpret_cast<void *>(item.data.u8);
553     } else if (item.data_type == META_TYPE_INT32) {
554         *buffer = reinterpret_cast<void *>(item.data.i32);
555     } else if (item.data_type == META_TYPE_FLOAT) {
556         *buffer = reinterpret_cast<void *>(item.data.f);
557     } else if (item.data_type == META_TYPE_UINT32) {
558         *buffer = reinterpret_cast<void *>(item.data.ui32);
559     } else if (item.data_type == META_TYPE_INT64) {
560         *buffer = reinterpret_cast<void *>(item.data.i64);
561     } else if (item.data_type == META_TYPE_DOUBLE) {
562         *buffer = reinterpret_cast<void *>(item.data.d);
563     } else if (item.data_type == META_TYPE_RATIONAL) {
564         *buffer = reinterpret_cast<void *>(item.data.r);
565     }
566 }
567 
FreeMetadataBuffer(camera_metadata_item_t & entry)568 void MetadataUtils::FreeMetadataBuffer(camera_metadata_item_t &entry)
569 {
570     if (entry.data_type == META_TYPE_BYTE) {
571         if (entry.data.u8 != nullptr) {
572             delete[] entry.data.u8;
573         }
574     } else if (entry.data_type == META_TYPE_INT32) {
575         if (entry.data.i32 != nullptr) {
576             delete[] entry.data.i32;
577         }
578     } else if (entry.data_type == META_TYPE_FLOAT) {
579         if (entry.data.f != nullptr) {
580             delete[] entry.data.f;
581         }
582     } else if (entry.data_type == META_TYPE_INT64) {
583         if (entry.data.i64 != nullptr) {
584             delete[] entry.data.i64;
585         }
586     } else if (entry.data_type == META_TYPE_UINT32) {
587         if (entry.data.ui32 != nullptr) {
588             delete[] entry.data.ui32;
589         }
590     } else if (entry.data_type == META_TYPE_DOUBLE) {
591         if (entry.data.d != nullptr) {
592             delete[] entry.data.d;
593         }
594     } else if (entry.data_type == META_TYPE_RATIONAL) {
595         if (entry.data.r != nullptr) {
596             delete[] entry.data.r;
597         }
598     }
599 }
600 } // Camera
601