• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_ERROR_RETURN_RET(itc == cacheTagDataMap_.end(), {});
82     auto& dataMap = itc->second;
83     auto itd = dataMap.find(specId);
84     CHECK_ERROR_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_ERROR_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_ERROR_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_ERROR_RETURN(session == nullptr);
125     // LCOV_EXCL_START
126     auto metadata = session->GetMetadata();
127     CHECK_ERROR_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