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