1 /*
2 * Copyright (c) 2023-2024 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 "camera_fwk_metadata_utils.h"
17
18 #include <cstdint>
19
20 #include "camera_log.h"
21 #include "camera_metadata_operator.h"
22
23 namespace OHOS {
24 namespace CameraStandard {
25 namespace CameraFwkMetadataUtils {
26 namespace {
27
28 constexpr uint32_t ITEM_CAPACITY = 20;
29 constexpr uint32_t DATA_CAPACITY = 200;
30
31 std::vector<uint32_t> reportMetadataTag {
32 OHOS_CONTROL_FLASH_MODE,
33 OHOS_CONTROL_FLASH_STATE,
34 OHOS_CONTROL_FOCUS_MODE,
35 OHOS_CONTROL_FOCUS_STATE,
36 OHOS_STATISTICS_FACE_RECTANGLES,
37 OHOS_CAMERA_MACRO_STATUS
38 };
39
ForEach(uint32_t iteratorCount,std::function<void (uint32_t)> fun)40 void ForEach(uint32_t iteratorCount, std::function<void(uint32_t)> fun)
41 {
42 for (uint32_t index = 0; index < iteratorCount; index++) {
43 fun(index);
44 }
45 }
46 } // namespace
MergeMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata,std::shared_ptr<OHOS::Camera::CameraMetadata> dstMetadata)47 bool MergeMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata,
48 std::shared_ptr<OHOS::Camera::CameraMetadata> dstMetadata)
49 {
50 CHECK_ERROR_RETURN_RET(srcMetadata == nullptr || dstMetadata == nullptr, false);
51 auto srcHeader = srcMetadata->get();
52 CHECK_ERROR_RETURN_RET(srcHeader == nullptr, false);
53 auto dstHeader = dstMetadata->get();
54 CHECK_ERROR_RETURN_RET(dstHeader == nullptr, false);
55 auto srcItemCount = srcHeader->item_count;
56 camera_metadata_item_t srcItem;
57 for (uint32_t index = 0; index < srcItemCount; index++) {
58 int ret = OHOS::Camera::GetCameraMetadataItem(srcHeader, index, &srcItem);
59 CHECK_ERROR_RETURN_RET_LOG(ret != CAM_META_SUCCESS, false,
60 "Failed to get metadata item at index: %{public}d", index);
61 bool status = false;
62 uint32_t currentIndex;
63 ret = OHOS::Camera::FindCameraMetadataItemIndex(dstHeader, srcItem.item, ¤tIndex);
64 if (ret == CAM_META_ITEM_NOT_FOUND) {
65 status = dstMetadata->addEntry(srcItem.item, srcItem.data.u8, srcItem.count);
66 } else if (ret == CAM_META_SUCCESS) {
67 status = dstMetadata->updateEntry(srcItem.item, srcItem.data.u8, srcItem.count);
68 }
69 CHECK_ERROR_RETURN_RET_LOG(!status, false, "Failed to update metadata item: %{public}d", srcItem.item);
70 }
71 return true;
72 }
73
CopyMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata)74 std::shared_ptr<OHOS::Camera::CameraMetadata> CopyMetadata(
75 const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata)
76 {
77 CHECK_ERROR_RETURN_RET_LOG(srcMetadata == nullptr, nullptr, "CopyMetadata fail, src is null");
78 auto metadataHeader = srcMetadata->get();
79 auto newMetadata =
80 std::make_shared<OHOS::Camera::CameraMetadata>(metadataHeader->item_capacity, metadataHeader->data_capacity);
81 MergeMetadata(srcMetadata, newMetadata);
82 return newMetadata;
83 }
84
UpdateMetadataTag(const camera_metadata_item_t & srcItem,std::shared_ptr<OHOS::Camera::CameraMetadata> dstMetadata)85 bool UpdateMetadataTag(const camera_metadata_item_t& srcItem, std::shared_ptr<OHOS::Camera::CameraMetadata> dstMetadata)
86 {
87 CHECK_ERROR_RETURN_RET_LOG(dstMetadata == nullptr, false, "UpdateMetadataTag fail, dstMetadata is null");
88 uint32_t itemIndex;
89 int32_t result = OHOS::Camera::FindCameraMetadataItemIndex(dstMetadata->get(), srcItem.item, &itemIndex);
90 bool status = false;
91 if (result == CAM_META_ITEM_NOT_FOUND) {
92 status = dstMetadata->addEntry(srcItem.item, srcItem.data.u8, srcItem.count);
93 } else if (result == CAM_META_SUCCESS) {
94 status = dstMetadata->updateEntry(srcItem.item, srcItem.data.u8, srcItem.count);
95 }
96 CHECK_ERROR_RETURN_RET_LOG(!status, false, "UpdateMetadataTag fail, err is %{public}d", result);
97 return true;
98 }
99
DumpMetadataInfo(const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata)100 void DumpMetadataInfo(const std::shared_ptr<OHOS::Camera::CameraMetadata> srcMetadata)
101 {
102 CHECK_ERROR_RETURN_LOG(srcMetadata == nullptr, "DumpMetadataInfo srcMetadata is null");
103 auto metadataHeader = srcMetadata->get();
104 uint32_t version = metadataHeader->version;
105 uint32_t itemCount = metadataHeader->item_count;
106 uint32_t dataCount = metadataHeader->data_count;
107 uint32_t size = metadataHeader->size;
108 MEDIA_DEBUG_LOG("DumpMetadataInfo srcMetadata \
109 version:%{public}d, itemCount:%{public}d, dataCount:%{public}d, size:%{public}d",
110 version, itemCount, dataCount, size);
111
112 for (uint32_t i = 0; i < itemCount; i++) {
113 camera_metadata_item_t item;
114 Camera::GetCameraMetadataItem(metadataHeader, i, &item);
115 DumpMetadataItemInfo(item);
116 }
117 }
118
DumpMetadataItemInfo(const camera_metadata_item_t & metadataItem)119 void DumpMetadataItemInfo(const camera_metadata_item_t& metadataItem)
120 {
121 uint32_t dataType = metadataItem.data_type;
122 uint32_t dataCount = metadataItem.count;
123 const char* tagName = Camera::GetCameraMetadataItemName(metadataItem.item);
124 MEDIA_DEBUG_LOG("DumpMetadataItemInfo \
125 tag:%{public}d->%{public}s, dataType:%{public}d, dataCount:%{public}d",
126 metadataItem.item, tagName, dataType, dataCount);
127 if (dataType == META_TYPE_BYTE) {
128 ForEach(dataCount, [&metadataItem, &tagName](uint32_t index) {
129 MEDIA_DEBUG_LOG("DumpMetadataItemInfo:%{public}d->%{public}s, dataIndex:%{public}d, value:%{public}d",
130 metadataItem.item, tagName, index, metadataItem.data.u8[index]);
131 });
132 } else if (dataType == META_TYPE_INT32) {
133 ForEach(dataCount, [&metadataItem, &tagName](uint32_t index) {
134 MEDIA_DEBUG_LOG("DumpMetadataItemInfo:%{public}d->%{public}s, dataIndex:%{public}d, value:%{public}d",
135 metadataItem.item, tagName, index, metadataItem.data.i32[index]);
136 });
137 } else if (dataType == META_TYPE_UINT32) {
138 ForEach(dataCount, [&metadataItem, &tagName](uint32_t index) {
139 MEDIA_DEBUG_LOG("DumpMetadataItemInfo:%{public}d->%{public}s, dataIndex:%{public}d, value:%{public}d",
140 metadataItem.item, tagName, index, metadataItem.data.ui32[index]);
141 });
142 } else if (dataType == META_TYPE_FLOAT) {
143 ForEach(dataCount, [&metadataItem, &tagName](uint32_t index) {
144 MEDIA_DEBUG_LOG("DumpMetadataItemInfo:%{public}d->%{public}s, dataIndex:%{public}d, value:%{public}f",
145 metadataItem.item, tagName, index, metadataItem.data.f[index]);
146 });
147 } else if (dataType == META_TYPE_INT64) {
148 ForEach(dataCount, [&metadataItem, &tagName](uint32_t index) {
149 MEDIA_DEBUG_LOG("DumpMetadataItemInfo:%{public}d->%{public}s, dataIndex:%{public}d, value:%{public}lld",
150 metadataItem.item, tagName, index, static_cast<long long>(metadataItem.data.i64[index]));
151 });
152 } else if (dataType == META_TYPE_DOUBLE) {
153 ForEach(dataCount, [&metadataItem, &tagName](uint32_t index) {
154 MEDIA_DEBUG_LOG("DumpMetadataItemInfo:%{public}d->%{public}s, dataIndex:%{public}d, value:%{public}lf",
155 metadataItem.item, tagName, index, metadataItem.data.d[index]);
156 });
157 } else if (dataType == META_TYPE_RATIONAL) {
158 ForEach(dataCount, [&metadataItem, &tagName](uint32_t index) {
159 MEDIA_DEBUG_LOG("DumpMetadataItemInfo:%{public}d->%{public}s, dataIndex:%{public}d, numerator:%{public}d, "
160 "denominator:%{public}d",
161 metadataItem.item, tagName, index, metadataItem.data.r[index].numerator,
162 metadataItem.data.r[index].denominator);
163 });
164 } else {
165 MEDIA_WARNING_LOG("DumpMetadataItemInfo get unknown dataType:%{public}d", dataType);
166 }
167 }
168
RecreateMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> metadata)169 std::shared_ptr<OHOS::Camera::CameraMetadata> RecreateMetadata(
170 const std::shared_ptr<OHOS::Camera::CameraMetadata> metadata)
171 {
172 common_metadata_header_t* header = metadata->get();
173 std::shared_ptr<OHOS::Camera::CameraMetadata> newMetadata =
174 std::make_shared<OHOS::Camera::CameraMetadata>(ITEM_CAPACITY, DATA_CAPACITY);
175
176 for (uint32_t metadataTag : reportMetadataTag) {
177 camera_metadata_item_t item;
178 int ret = Camera::FindCameraMetadataItem(header, metadataTag, &item);
179 if (ret == 0 && item.count != 0) {
180 newMetadata->addEntry(item.item, item.data.u8, item.count);
181 }
182 }
183 return newMetadata;
184 }
185
LogFormatCameraMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> metadata)186 void LogFormatCameraMetadata(const std::shared_ptr<OHOS::Camera::CameraMetadata> metadata)
187 {
188 CHECK_ERROR_RETURN_LOG(metadata == nullptr, "LogFormatCameraMetadata: Metadata pointer is null");
189 auto header = metadata->get();
190 CHECK_ERROR_RETURN_LOG(header == nullptr, "LogFormatCameraMetadata: Metadata header is null");
191
192 std::string metaStr = OHOS::Camera::FormatCameraMetadataToString(header);
193 MEDIA_DEBUG_LOG("LogFormatCameraMetadata: metaStr %{public}s", metaStr.c_str());
194 }
195 } // namespace CameraFwkMetadataUtils
196 } // namespace CameraStandard
197 } // namespace OHOS