• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &currentIndex);
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