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#ifndef CAMERA_METADATA_INFO_H
17#define CAMERA_METADATA_INFO_H
18
19#include <cstdio>
20#include <cstdint>
21#include <string>
22#include "camera_metadata_operator.h"
23
24static constexpr uint32_t MAX_SUPPORTED_TAGS = 1000;
25static constexpr uint32_t MAX_SUPPORTED_ITEMS = (12000 * 2 * 2);
26static constexpr uint32_t MAX_ITEM_CAPACITY = (1000 * 10);
27static constexpr uint32_t MAX_DATA_CAPACITY = (1000 * 10 * 10 * 10);
28
29#define METADATA_PACKET_ALIGNMENT \
30    MaxAlignment(MaxAlignment(DATA_ALIGNMENT, METADATA_ALIGNMENT), ITEM_ALIGNMENT)
31
32namespace OHOS::Camera {
33class CameraMetadata {
34public:
35    CameraMetadata(size_t itemCapacity, size_t dataCapacity);
36    ~CameraMetadata();
37
38    bool addEntry(uint32_t item, const void *data, size_t data_count);
39    bool updateEntry(uint32_t tag, const void *data, size_t data_count);
40    common_metadata_header_t *get();
41    const common_metadata_header_t *get() const;
42    bool isValid() const;
43
44private:
45    common_metadata_header_t *metadata_;
46
47    bool resize_add_metadata(uint32_t item, const void *data, size_t data_count);
48    void replace_metadata(common_metadata_header_t *newMetadata);
49    static uint32_t AlignTo(uint32_t val, uint32_t alignment);
50    static uint32_t MaxAlignment(uint32_t dataAlignment, uint32_t metadataAlignment);
51    static size_t CalculateCameraMetadataMemoryRequired(uint32_t itemCount, uint32_t dataCount);
52    static int UpdateameraMetadataItemSize(camera_metadata_item_entry_t *item, uint32_t dataCount,
53        common_metadata_header_t *dst, const void *data);
54    static int AddCameraMetadataItemVerify(common_metadata_header_t *dst,
55        uint32_t item, const void *data, size_t dataCount, uint32_t *dataType);
56    static int moveMetadataMemery(common_metadata_header_t *dst,
57        camera_metadata_item_entry_t *itemToDelete, size_t dataBytes);
58    static int copyMetadataMemory(common_metadata_header_t *dst, camera_metadata_item_entry_t *item,
59        size_t dataPayloadSize, const void *data);
60
61public:
62    // Allocate a new camera metadata buffer and return the metadata header
63    static common_metadata_header_t *AllocateCameraMetadataBuffer(uint32_t item_capacity, uint32_t data_capacity);
64
65    // Is camera metadata item exist
66    static bool IsCameraMetadataItemExist(const common_metadata_header_t *src, uint32_t item);
67
68    // Find camera metadata item and fill the found item
69    static int FindCameraMetadataItem(const common_metadata_header_t *src, uint32_t item,
70        camera_metadata_item_t *metadataItem);
71
72    // Find camera metadata item index if the item exists
73    static int FindCameraMetadataItemIndex(const common_metadata_header_t *src, uint32_t item, uint32_t *index,
74        bool isPrintLog = false);
75
76    // Get camera metadata item name
77    static const char *GetCameraMetadataItemName(uint32_t item);
78
79    // Update camera metadata item and fill the updated item
80    static int UpdateCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data,
81        uint32_t dataCount, camera_metadata_item_t *updatedItem);
82
83    // Update camera metadata item by index and fill the updated item
84    static int UpdateCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index, const void *data,
85        uint32_t dataCount, camera_metadata_item_t *updated_item);
86
87    // Add camera metadata item
88    static int AddCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, size_t dataCount);
89
90    // Delete camera metadata item
91    static int DeleteCameraMetadataItem(common_metadata_header_t *dst, uint32_t item);
92
93    // Delete camera metadata item by index
94    static int DeleteCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index);
95
96    // Free camera metadata buffer
97    static void FreeCameraMetadataBuffer(common_metadata_header_t *dst);
98
99    static std::string MetadataItemDump(const common_metadata_header_t *metadataHeader, uint32_t item);
100
101    static std::string FormatCameraMetadataToString(const common_metadata_header_t *metadataHeader);
102
103    // Internal use
104    static camera_metadata_item_entry_t *GetMetadataItems(const common_metadata_header_t *metadataHeader);
105    static uint8_t *GetMetadataData(const common_metadata_header_t *metadataHeader);
106    static int GetCameraMetadataItem(const common_metadata_header_t *src, uint32_t index, camera_metadata_item_t *item);
107    static uint32_t GetCameraMetadataItemCount(const common_metadata_header_t *metadata_header);
108    static uint32_t GetCameraMetadataItemCapacity(const common_metadata_header_t *metadata_header);
109    static uint32_t GetCameraMetadataDataSize(const common_metadata_header_t *metadata_header);
110    static int32_t CopyCameraMetadataItems(common_metadata_header_t *newMetadata,
111        const common_metadata_header_t *oldMetadata);
112    static int32_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count);
113    static int32_t GetCameraMetadataItemType(uint32_t item, uint32_t *data_type);
114    static common_metadata_header_t *FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired,
115        uint32_t itemCapacity, uint32_t dataCapacity);
116    static int32_t GetMetadataSection(uint32_t itemSection, uint32_t *section);
117    static int MetadataExpandItemMem(common_metadata_header_t *dst, camera_metadata_item_entry_t *item,
118        size_t oldItemSize);
119    static int32_t GetAllVendorTags(std::vector<vendorTag_t>& tagVec);
120};
121} // namespace Camera
122#endif /* CAMERA_METADATA_INFO_H */
123