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