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