1 /*
2 * Copyright (c) 2024-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 "ability/camera_ability_builder.h"
17 #include "camera_log.h"
18
19 namespace OHOS {
20 namespace CameraStandard {
21
GetAbility(int32_t modeName,common_metadata_header_t * metadata,const std::set<int32_t> & specIds,sptr<CaptureSession> session,bool isForApp)22 std::vector<sptr<CameraAbility>> CameraAbilityBuilder::GetAbility(int32_t modeName, common_metadata_header_t* metadata,
23 const std::set<int32_t>& specIds, sptr<CaptureSession> session, bool isForApp)
24 {
25 AvailableConfig availableConfig;
26 CameraAbilityParseUtil::GetAvailableConfiguration(modeName, metadata, availableConfig);
27 std::vector<sptr<CameraAbility>> abilities;
28 MEDIA_INFO_LOG("enter CameraAbilityBuilder::GetAbility");
29 for (const auto& configInfo : availableConfig.configInfos) {
30 if (specIds.find(configInfo.specId) == specIds.end()) {
31 continue;
32 }
33 sptr<CameraAbility> ability = new CameraAbility();
34 if (ability == nullptr) {
35 MEDIA_ERR_LOG("alloc CameraAbility error");
36 continue;
37 }
38 for (const auto& tagId : configInfo.tagIds) {
39 SetModeSpecTagField(ability, modeName, metadata, tagId, configInfo.specId);
40 }
41 CHECK_EXECUTE(isForApp, SetOtherTag(ability, modeName, session));
42 ability->DumpCameraAbilityInfo();
43 abilities.push_back(ability);
44 }
45 return abilities;
46 }
47
GetConflictAbility(int32_t modeName,common_metadata_header_t * metadata)48 std::vector<sptr<CameraAbility>> CameraAbilityBuilder::GetConflictAbility(
49 int32_t modeName, common_metadata_header_t* metadata)
50 {
51 ConflictConfig conflictConfig;
52 CameraAbilityParseUtil::GetConflictConfiguration(modeName, metadata, conflictConfig);
53 std::vector<sptr<CameraAbility>> conflictAbilities;
54 MEDIA_INFO_LOG("enter CameraAbilityBuilder::GetConflictAbility");
55 for (const auto& configInfo : conflictConfig.configInfos) {
56 sptr<CameraAbility> conflictAbility = new CameraAbility();
57 if (conflictAbility == nullptr) {
58 MEDIA_ERR_LOG("alloc CameraAbility error");
59 continue;
60 }
61 for (const auto& tagInfo : configInfo.tagInfos) {
62 SetModeSpecTagField(conflictAbility, modeName, metadata, tagInfo.first, tagInfo.second);
63 }
64 conflictAbility->DumpCameraAbilityInfo();
65 conflictAbilities.push_back(conflictAbility);
66 }
67 return conflictAbilities;
68 }
69
GetData(int32_t modeName,common_metadata_header_t * metadata,uint32_t tagId,int32_t specId)70 std::vector<int32_t> CameraAbilityBuilder::GetData(
71 int32_t modeName, common_metadata_header_t* metadata, uint32_t tagId, int32_t specId)
72 {
73 if (cachedTagSet_.find(tagId) == cachedTagSet_.end()) {
74 std::map<int32_t, std::vector<int32_t>> tagDataMap;
75 CameraAbilityParseUtil::GetAbilityInfo(modeName, metadata, tagId, tagDataMap);
76 cacheTagDataMap_[tagId] = tagDataMap;
77 cachedTagSet_.insert(tagId);
78 }
79
80 auto itc = cacheTagDataMap_.find(tagId);
81 CHECK_RETURN_RET(itc == cacheTagDataMap_.end(), {});
82 auto& dataMap = itc->second;
83 auto itd = dataMap.find(specId);
84 CHECK_RETURN_RET(itd == dataMap.end(), {});
85 return itd->second;
86 }
87
GetValidZoomRatioRange(const std::vector<int32_t> & data)88 std::vector<float> CameraAbilityBuilder::GetValidZoomRatioRange(const std::vector<int32_t>& data)
89 {
90 constexpr float factor = 100.0;
91 size_t validSize = 2;
92 CHECK_RETURN_RET(data.size() != validSize, {});
93 float minZoom = data[0] / factor;
94 float maxZoom = data[1] / factor;
95 return { minZoom, maxZoom };
96 }
97
IsSupportMacro(const std::vector<int32_t> & data)98 bool CameraAbilityBuilder::IsSupportMacro(const std::vector<int32_t>& data)
99 {
100 CHECK_RETURN_RET(data.size() != 1, false);
101 return static_cast<camera_macro_supported_type_t>(data[0]) == OHOS_CAMERA_MACRO_SUPPORTED;
102 }
103
SetModeSpecTagField(sptr<CameraAbility> ability,int32_t modeName,common_metadata_header_t * metadata,uint32_t tagId,int32_t specId)104 void CameraAbilityBuilder::SetModeSpecTagField(
105 sptr<CameraAbility> ability, int32_t modeName, common_metadata_header_t* metadata, uint32_t tagId, int32_t specId)
106 {
107 std::vector<int32_t> data = GetData(modeName, metadata, tagId, specId);
108 switch (tagId) {
109 case OHOS_ABILITY_SCENE_ZOOM_CAP: {
110 ability->zoomRatioRange_ = GetValidZoomRatioRange(data);
111 break;
112 }
113 case OHOS_ABILITY_SCENE_MACRO_CAP: {
114 ability->isMacroSupported_ = IsSupportMacro(data);
115 break;
116 }
117 default:
118 break;
119 }
120 }
121
SetOtherTag(sptr<CameraAbility> ability,int32_t modeName,sptr<CaptureSession> session)122 void CameraAbilityBuilder::SetOtherTag(sptr<CameraAbility> ability, int32_t modeName, sptr<CaptureSession> session)
123 {
124 CHECK_RETURN(session == nullptr);
125 // LCOV_EXCL_START
126 auto metadata = session->GetMetadata();
127 CHECK_RETURN(metadata == nullptr);
128 camera_metadata_item_t item;
129 CHECK_EXECUTE(Camera::FindCameraMetadataItem(metadata->get(), OHOS_ABILITY_FLASH_MODES, &item) == CAM_META_SUCCESS,
130 g_transformValidData(item, g_metaFlashModeMap_, ability->supportedFlashModes_));
131 ability->isLcdFlashSupported_ = session->IsLcdFlashSupported();
132 ability->supportedExposureModes_ = session->GetSupportedExposureModes();
133 ability->supportedFocusModes_ = session->GetSupportedFocusModes();
134 session->GetSupportedFocusRangeTypes(ability->supportedFocusRangeTypes_);
135 session->GetSupportedFocusDrivenTypes(ability->supportedFocusDrivenTypes_);
136 ability->exposureBiasRange_ = session->GetExposureBiasRange();
137 ability->supportedBeautyTypes_ = session->GetSupportedBeautyTypes();
138 for (auto it : g_fwkBeautyTypeMap_) {
139 ability->supportedBeautyRangeMap_[it.first] = session->GetSupportedBeautyRange(it.first);
140 }
141 ability->supportedColorEffects_ = session->GetSupportedColorEffects();
142 ability->supportedColorSpaces_ = session->GetSupportedColorSpaces();
143
144 SceneFeature feature = SceneFeature::FEATURE_MOON_CAPTURE_BOOST;
145 while (feature < SceneFeature::FEATURE_ENUM_MAX) {
146 CHECK_EXECUTE(session->IsFeatureSupported(feature), ability->supportedSceneFeature_.emplace_back(feature));
147 feature = static_cast<SceneFeature>(static_cast<int32_t>(feature) + 1);
148 }
149
150 switch (modeName) {
151 case SceneMode::CAPTURE: {
152 break;
153 }
154 case SceneMode::VIDEO: {
155 ability->supportedVideoStabilizationMode_ = session->GetSupportedStabilizationMode();
156 break;
157 }
158 case SceneMode::PORTRAIT: {
159 ability->supportedPortraitEffects_ = session->GetSupportedPortraitEffects();
160 session->GetSupportedVirtualApertures(ability->supportedVirtualApertures_);
161 session->GetSupportedPhysicalApertures(ability->supportedPhysicalApertures_);
162 break;
163 }
164 default:
165 break;
166 }
167 // LCOV_EXCL_STOP
168 }
169 } // namespace CameraStandard
170 } // namespace OHOS
171