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