• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2023 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 "sketch_wrapper.h"
17 
18 #include <cstdint>
19 #include <mutex>
20 
21 #include "abilities/sketch_ability.h"
22 #include "camera_device_ability_items.h"
23 #include "camera_log.h"
24 #include "camera_util.h"
25 #include "capture_scene_const.h"
26 #include "istream_repeat_callback.h"
27 
28 namespace OHOS {
29 namespace CameraStandard {
30 constexpr uint32_t INVALID_MODE = 0xffffffff;
31 constexpr float INVALID_MODE_FLOAT = -1.0f;
32 constexpr float INVALID_ZOOM_RATIO = -1.0f;
33 constexpr float SKETCH_DIV = 100.0f;
34 std::mutex SketchWrapper::g_sketchReferenceFovRatioMutex_;
35 std::map<SceneFeaturesMode, std::vector<SketchReferenceFovRange>> SketchWrapper::g_sketchReferenceFovRatioMap_;
36 std::mutex SketchWrapper::g_sketchEnableRatioMutex_;
37 std::map<SceneFeaturesMode, float> SketchWrapper::g_sketchEnableRatioMap_;
38 
SketchWrapper(wptr<IStreamCommon> hostStream,const Size size)39 SketchWrapper::SketchWrapper(wptr<IStreamCommon> hostStream, const Size size)
40     : hostStream_(hostStream), sketchSize_(size)
41 {}
42 
Init(std::shared_ptr<OHOS::Camera::CameraMetadata> & deviceMetadata,const SceneFeaturesMode & sceneFeaturesMode)43 int32_t SketchWrapper::Init(
44     std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceMetadata, const SceneFeaturesMode& sceneFeaturesMode)
45 {
46     sptr<IStreamCommon> hostStream = hostStream_.promote();
47     CHECK_ERROR_RETURN_RET(hostStream == nullptr, CAMERA_INVALID_STATE);
48     UpdateSketchStaticInfo(deviceMetadata);
49     sketchEnableRatio_ = GetSketchEnableRatio(sceneFeaturesMode);
50         SceneFeaturesMode dumpSceneFeaturesMode = sceneFeaturesMode;
51         MEDIA_DEBUG_LOG("SketchWrapper::Init sceneFeaturesMode:%{public}s, sketchEnableRatio_:%{public}f",
52             dumpSceneFeaturesMode.Dump().c_str(), sketchEnableRatio_);
53         IStreamRepeat* repeatStream = static_cast<IStreamRepeat*>(hostStream.GetRefPtr());
54         return repeatStream->ForkSketchStreamRepeat(
55             sketchSize_.width, sketchSize_.height, sketchStream_, sketchEnableRatio_);
56 }
57 
AttachSketchSurface(sptr<Surface> sketchSurface)58 int32_t SketchWrapper::AttachSketchSurface(sptr<Surface> sketchSurface)
59 {
60     CHECK_ERROR_RETURN_RET(sketchStream_ == nullptr, CAMERA_INVALID_STATE);
61     CHECK_ERROR_RETURN_RET(sketchSurface == nullptr, CAMERA_INVALID_ARG);
62     return sketchStream_->AddDeferredSurface(sketchSurface->GetProducer());
63 }
64 
UpdateSketchRatio(float sketchRatio)65 int32_t SketchWrapper::UpdateSketchRatio(float sketchRatio)
66 {
67     // SketchRatio value could be negative value
68     MEDIA_DEBUG_LOG("Enter Into SketchWrapper::UpdateSketchRatio");
69     CHECK_ERROR_RETURN_RET(sketchStream_ == nullptr, CAMERA_INVALID_STATE);
70     sptr<IStreamCommon> hostStream = hostStream_.promote();
71     CHECK_ERROR_RETURN_RET_LOG(hostStream == nullptr, CAMERA_INVALID_STATE,
72         "SketchWrapper::UpdateSketchRatio hostStream is null");
73     IStreamRepeat* repeatStream = static_cast<IStreamRepeat*>(hostStream.GetRefPtr());
74     int32_t ret = repeatStream->UpdateSketchRatio(sketchRatio);
75     if (ret == CAMERA_OK) {
76         sketchEnableRatio_ = sketchRatio;
77     }
78     AutoStream();
79     return ret;
80 }
81 
Destroy()82 int32_t SketchWrapper::Destroy()
83 {
84     if (sketchStream_ != nullptr) {
85         sketchStream_->Stop();
86         sketchStream_->Release();
87         sketchStream_ = nullptr;
88     }
89     sptr<IStreamCommon> hostStream = hostStream_.promote();
90     CHECK_ERROR_RETURN_RET(hostStream == nullptr, CAMERA_INVALID_STATE);
91     IStreamRepeat* repeatStream = static_cast<IStreamRepeat*>(hostStream.GetRefPtr());
92     return repeatStream->RemoveSketchStreamRepeat();
93 }
94 
~SketchWrapper()95 SketchWrapper::~SketchWrapper()
96 {
97     Destroy();
98 }
99 
StartSketchStream()100 int32_t SketchWrapper::StartSketchStream()
101 {
102     if (sketchStream_ != nullptr) {
103         MEDIA_DEBUG_LOG("Enter Into SketchWrapper::SketchWrapper::StartSketchStream");
104         int retCode = sketchStream_->Start();
105         return retCode;
106     }
107     return CAMERA_UNKNOWN_ERROR;
108 }
109 
StopSketchStream()110 int32_t SketchWrapper::StopSketchStream()
111 {
112     if (sketchStream_ != nullptr) {
113         MEDIA_DEBUG_LOG("Enter Into SketchWrapper::SketchWrapper::StopSketchStream");
114         int retCode = sketchStream_->Stop();
115         return retCode;
116     }
117     return CAMERA_UNKNOWN_ERROR;
118 }
119 
SetPreviewOutputCallbackManager(wptr<PreviewOutputListenerManager> previewOutputCallbackManager)120 void SketchWrapper::SetPreviewOutputCallbackManager(wptr<PreviewOutputListenerManager> previewOutputCallbackManager)
121 {
122     previewOutputCallbackManager_ = previewOutputCallbackManager;
123 }
124 
OnSketchStatusChanged(const SceneFeaturesMode & sceneFeaturesMode)125 void SketchWrapper::OnSketchStatusChanged(const SceneFeaturesMode& sceneFeaturesMode)
126 {
127     auto manager = previewOutputCallbackManager_.promote();
128     CHECK_ERROR_RETURN(manager == nullptr);
129     float sketchReferenceRatio = GetSketchReferenceFovRatio(sceneFeaturesMode, currentZoomRatio_);
130     std::lock_guard<std::mutex> lock(sketchStatusChangeMutex_);
131     if (currentSketchStatusData_.sketchRatio != sketchReferenceRatio) {
132         SketchStatusData statusData;
133         statusData.status = currentSketchStatusData_.status;
134         statusData.sketchRatio = sketchReferenceRatio;
135         MEDIA_DEBUG_LOG("SketchWrapper::OnSketchStatusDataChanged-:%{public}d->%{public}d,%{public}f->%{public}f",
136             currentSketchStatusData_.status, statusData.status, currentSketchStatusData_.sketchRatio,
137             statusData.sketchRatio);
138         currentSketchStatusData_ = statusData;
139         manager->TriggerListener([&](PreviewStateCallback* previewStateCallback) {
140             previewStateCallback->OnSketchStatusDataChanged(currentSketchStatusData_);
141         });
142     }
143 }
144 
OnSketchStatusChanged(SketchStatus sketchStatus,const SceneFeaturesMode & sceneFeaturesMode)145 void SketchWrapper::OnSketchStatusChanged(SketchStatus sketchStatus, const SceneFeaturesMode& sceneFeaturesMode)
146 {
147     auto manager = previewOutputCallbackManager_.promote();
148     CHECK_ERROR_RETURN(manager == nullptr);
149     float sketchReferenceRatio = GetSketchReferenceFovRatio(sceneFeaturesMode, currentZoomRatio_);
150     std::lock_guard<std::mutex> lock(sketchStatusChangeMutex_);
151     if (currentSketchStatusData_.status != sketchStatus ||
152         currentSketchStatusData_.sketchRatio != sketchReferenceRatio) {
153         SketchStatusData statusData;
154         statusData.status = sketchStatus;
155         statusData.sketchRatio = sketchReferenceRatio;
156         MEDIA_DEBUG_LOG("SketchWrapper::OnSketchStatusDataChanged:%{public}d->%{public}d,%{public}f->%{public}f",
157             currentSketchStatusData_.status, statusData.status, currentSketchStatusData_.sketchRatio,
158             statusData.sketchRatio);
159         currentSketchStatusData_ = statusData;
160         manager->TriggerListener([&](PreviewStateCallback* previewStateCallback) {
161             previewStateCallback->OnSketchStatusDataChanged(currentSketchStatusData_);
162         });
163     }
164 }
165 
UpdateSketchStaticInfo(std::shared_ptr<Camera::CameraMetadata> deviceMetadata)166 void SketchWrapper::UpdateSketchStaticInfo(std::shared_ptr<Camera::CameraMetadata> deviceMetadata)
167 {
168     {
169         std::lock_guard<std::mutex> lock(g_sketchEnableRatioMutex_);
170         g_sketchEnableRatioMap_.clear();
171     }
172     {
173         std::lock_guard<std::mutex> lock(g_sketchReferenceFovRatioMutex_);
174         g_sketchReferenceFovRatioMap_.clear();
175     }
176     UpdateSketchEnableRatio(deviceMetadata);
177     UpdateSketchReferenceFovRatio(deviceMetadata);
178     UpdateSketchConfigFromMoonCaptureBoostConfig(deviceMetadata);
179 }
180 
GetSceneFeaturesModeFromModeData(float modeFloatData)181 SceneFeaturesMode SketchWrapper::GetSceneFeaturesModeFromModeData(float modeFloatData)
182 {
183     SceneFeaturesMode currentSceneFeaturesMode {};
184     auto sceneMode = static_cast<SceneMode>(round(modeFloatData));
185     currentSceneFeaturesMode.SetSceneMode(sceneMode);
186     return currentSceneFeaturesMode;
187 }
188 
UpdateSketchEnableRatio(std::shared_ptr<Camera::CameraMetadata> & deviceMetadata)189 void SketchWrapper::UpdateSketchEnableRatio(std::shared_ptr<Camera::CameraMetadata>& deviceMetadata)
190 {
191     CHECK_ERROR_RETURN_LOG(deviceMetadata == nullptr, "SketchWrapper::UpdateSketchEnableRatio deviceMetadata is null");
192     camera_metadata_item_t item;
193     int ret = OHOS::Camera::FindCameraMetadataItem(deviceMetadata->get(), OHOS_ABILITY_SKETCH_ENABLE_RATIO, &item);
194     CHECK_ERROR_RETURN_LOG(ret != CAM_META_SUCCESS,
195         "SketchWrapper::UpdateSketchEnableRatio get sketch enable ratio failed");
196     CHECK_ERROR_RETURN_LOG(item.count <= 0, "SketchWrapper::UpdateSketchEnableRatio sketch enable ratio count <= 0");
197 
198     constexpr int32_t dataGroupSize = 2; // 2 data as a group: key,value
199     constexpr int32_t valueOffset = 1;   // 1 is value offset
200     uint32_t groupCount = item.count / dataGroupSize;
201     float* dataEntry = item.data.f;
202     for (uint32_t i = 0; i < groupCount; i++) {
203         float key = dataEntry[i * dataGroupSize];
204         float value = dataEntry[i * dataGroupSize + valueOffset];
205         MEDIA_DEBUG_LOG("SketchWrapper::UpdateSketchEnableRatio get sketch enable ratio "
206                         "%{public}f:%{public}f",
207             key, value);
208         auto sceneFeaturesMode = GetSceneFeaturesModeFromModeData(key);
209         InsertSketchEnableRatioMapValue(sceneFeaturesMode, value);
210     }
211 }
212 
InsertSketchReferenceFovRatioMapValue(SceneFeaturesMode & sceneFeaturesMode,SketchReferenceFovRange & sketchReferenceFovRange)213 void SketchWrapper::InsertSketchReferenceFovRatioMapValue(
214     SceneFeaturesMode& sceneFeaturesMode, SketchReferenceFovRange& sketchReferenceFovRange)
215 {
216     std::lock_guard<std::mutex> lock(g_sketchReferenceFovRatioMutex_);
217     auto it = g_sketchReferenceFovRatioMap_.find(sceneFeaturesMode);
218     std::vector<SketchReferenceFovRange> rangeFov;
219     if (it != g_sketchReferenceFovRatioMap_.end()) {
220         rangeFov = std::move(it->second);
221     }
222     rangeFov.emplace_back(sketchReferenceFovRange);
223     if (sceneFeaturesMode.GetSceneMode() == CAPTURE && sceneFeaturesMode.GetFeatures().empty()) {
224         g_sketchReferenceFovRatioMap_[{ CAPTURE, { FEATURE_TRIPOD_DETECTION } }] = rangeFov;
225     }
226     g_sketchReferenceFovRatioMap_[sceneFeaturesMode] = rangeFov;
227     if (sceneFeaturesMode.GetSceneMode() == CAPTURE_MACRO) {
228         g_sketchReferenceFovRatioMap_[{ CAPTURE, { FEATURE_MACRO } }] = rangeFov;
229         g_sketchReferenceFovRatioMap_[{ CAPTURE_MACRO, { FEATURE_MACRO } }] = rangeFov;
230     } else if (sceneFeaturesMode.GetSceneMode() == VIDEO_MACRO) {
231         g_sketchReferenceFovRatioMap_[{ VIDEO, { FEATURE_MACRO } }] = rangeFov;
232         g_sketchReferenceFovRatioMap_[{ VIDEO_MACRO, { FEATURE_MACRO } }] = rangeFov;
233     }
234 }
235 
InsertSketchEnableRatioMapValue(SceneFeaturesMode & sceneFeaturesMode,float ratioValue)236 void SketchWrapper::InsertSketchEnableRatioMapValue(SceneFeaturesMode& sceneFeaturesMode, float ratioValue)
237 {
238     MEDIA_DEBUG_LOG("SketchWrapper::InsertSketchEnableRatioMapValue %{public}s : %{public}f",
239         sceneFeaturesMode.Dump().c_str(), ratioValue);
240     std::lock_guard<std::mutex> lock(g_sketchEnableRatioMutex_);
241     if (sceneFeaturesMode.GetSceneMode() == CAPTURE && sceneFeaturesMode.GetFeatures().empty()) {
242         g_sketchEnableRatioMap_[{ CAPTURE, { FEATURE_TRIPOD_DETECTION } }] = ratioValue;
243     }
244     g_sketchEnableRatioMap_[sceneFeaturesMode] = ratioValue;
245     if (sceneFeaturesMode.GetSceneMode() == CAPTURE_MACRO) {
246         g_sketchEnableRatioMap_[{ CAPTURE, { FEATURE_MACRO } }] = ratioValue;
247         g_sketchEnableRatioMap_[{ CAPTURE_MACRO, { FEATURE_MACRO } }] = ratioValue;
248     } else if (sceneFeaturesMode.GetSceneMode() == VIDEO_MACRO) {
249         g_sketchEnableRatioMap_[{ VIDEO, { FEATURE_MACRO } }] = ratioValue;
250         g_sketchEnableRatioMap_[{ VIDEO_MACRO, { FEATURE_MACRO } }] = ratioValue;
251     }
252 }
253 
UpdateSketchReferenceFovRatio(std::shared_ptr<Camera::CameraMetadata> & deviceMetadata)254 void SketchWrapper::UpdateSketchReferenceFovRatio(std::shared_ptr<Camera::CameraMetadata>& deviceMetadata)
255 {
256     CHECK_ERROR_RETURN_LOG(deviceMetadata == nullptr,
257         "SketchWrapper::UpdateSketchReferenceFovRatio deviceMetadata is null");
258     camera_metadata_item_t item;
259     int ret =
260         OHOS::Camera::FindCameraMetadataItem(deviceMetadata->get(), OHOS_ABILITY_SKETCH_REFERENCE_FOV_RATIO, &item);
261     CHECK_ERROR_RETURN_LOG(ret != CAM_META_SUCCESS || item.count <= 0,
262         "SketchWrapper::UpdateSketchReferenceFovRatio get sketch reference fov ratio failed");
263     UpdateSketchReferenceFovRatio(item);
264 }
265 
UpdateSketchReferenceFovRatio(camera_metadata_item_t & metadataItem)266 void SketchWrapper::UpdateSketchReferenceFovRatio(camera_metadata_item_t& metadataItem)
267 {
268     uint32_t dataCount = metadataItem.count;
269     float currentMode = INVALID_MODE_FLOAT;
270     float currentMinRatio = INVALID_ZOOM_RATIO;
271     float currentMaxRatio = INVALID_ZOOM_RATIO;
272     SceneFeaturesMode currentSceneFeaturesMode;
273     for (uint32_t i = 0; i < dataCount; i++) {
274         if (currentMode == INVALID_MODE_FLOAT) {
275             currentMode = metadataItem.data.f[i];
276             currentSceneFeaturesMode = GetSceneFeaturesModeFromModeData(metadataItem.data.f[i]);
277             continue;
278         }
279         if (currentMinRatio == INVALID_ZOOM_RATIO) {
280             currentMinRatio = metadataItem.data.f[i];
281             continue;
282         }
283         if (currentMaxRatio == INVALID_ZOOM_RATIO) {
284             currentMaxRatio = metadataItem.data.f[i];
285             continue;
286         }
287         SketchReferenceFovRange fovRange;
288         fovRange.zoomMin = metadataItem.data.f[i];
289         fovRange.zoomMax = metadataItem.data.f[i + 1];        // Offset 1 data
290         fovRange.referenceValue = metadataItem.data.f[i + 2]; // Offset 2 data
291         i = i + 2;                                            // Offset 2 data
292         InsertSketchReferenceFovRatioMapValue(currentSceneFeaturesMode, fovRange);
293         MEDIA_DEBUG_LOG("SketchWrapper::UpdateSketchReferenceFovRatio get sketch reference fov ratio:mode->%{public}f "
294                         "%{public}f-%{public}f value->%{public}f",
295             currentMode, fovRange.zoomMin, fovRange.zoomMax, fovRange.referenceValue);
296         if (fovRange.zoomMax - currentMaxRatio >= -std::numeric_limits<float>::epsilon()) {
297             currentMode = INVALID_MODE_FLOAT;
298             currentMinRatio = INVALID_ZOOM_RATIO;
299             currentMaxRatio = INVALID_ZOOM_RATIO;
300         }
301     }
302 }
303 
GetMoonCaptureBoostAbilityItem(std::shared_ptr<Camera::CameraMetadata> & deviceMetadata,camera_metadata_item_t & metadataItem)304 bool SketchWrapper::GetMoonCaptureBoostAbilityItem(
305     std::shared_ptr<Camera::CameraMetadata>& deviceMetadata, camera_metadata_item_t& metadataItem)
306 {
307     CHECK_ERROR_RETURN_RET_LOG(deviceMetadata == nullptr, false,
308         "SketchWrapper::GetMoonCaptureBoostAbilityItem deviceMetadata is null");
309     int ret =
310         OHOS::Camera::FindCameraMetadataItem(deviceMetadata->get(), OHOS_ABILITY_MOON_CAPTURE_BOOST, &metadataItem);
311     CHECK_ERROR_RETURN_RET_LOG(ret != CAM_META_SUCCESS || metadataItem.count <= 0, false,
312         "SketchWrapper::GetMoonCaptureBoostAbilityItem get OHOS_ABILITY_MOON_CAPTURE_BOOST failed");
313     return true;
314 }
315 
UpdateSketchConfigFromMoonCaptureBoostConfig(std::shared_ptr<Camera::CameraMetadata> & deviceMetadata)316 void SketchWrapper::UpdateSketchConfigFromMoonCaptureBoostConfig(
317     std::shared_ptr<Camera::CameraMetadata>& deviceMetadata)
318 {
319     camera_metadata_item_t item;
320     CHECK_ERROR_RETURN_LOG(!GetMoonCaptureBoostAbilityItem(deviceMetadata, item),
321         "SketchWrapper::UpdateSketchConfigFromMoonCaptureBoostConfig get GetMoonCaptureBoostAbilityItem failed");
322     uint32_t currentMode = INVALID_MODE;
323     float currentMinRatio = INVALID_ZOOM_RATIO;
324     float currentMaxRatio = INVALID_ZOOM_RATIO;
325     SceneFeaturesMode currentSceneFeaturesMode;
326     for (uint32_t i = 0; i < item.count; i++) {
327         if (currentMode == INVALID_MODE) {
328             currentMode = static_cast<SceneMode>(item.data.ui32[i]);
329             currentSceneFeaturesMode =
330                 SceneFeaturesMode(static_cast<SceneMode>(currentMode), { FEATURE_MOON_CAPTURE_BOOST });
331             continue;
332         }
333         if (currentMinRatio == INVALID_ZOOM_RATIO) {
334             currentMinRatio = static_cast<float>(item.data.ui32[i]) / SKETCH_DIV;
335             continue;
336         }
337         if (currentMaxRatio == INVALID_ZOOM_RATIO) {
338             currentMaxRatio = static_cast<float>(item.data.ui32[i]) / SKETCH_DIV;
339             continue;
340         }
341         SketchReferenceFovRange fovRange;
342         fovRange.zoomMin = static_cast<float>(item.data.ui32[i]) / SKETCH_DIV;
343         fovRange.zoomMax = static_cast<float>(item.data.ui32[i + 1]) / SKETCH_DIV;        // Offset 1 data
344         fovRange.referenceValue = static_cast<float>(item.data.ui32[i + 2]) / SKETCH_DIV; // Offset 2 data
345         i = i + 2;                                                                        // Offset 2 data
346         InsertSketchReferenceFovRatioMapValue(currentSceneFeaturesMode, fovRange);
347         MEDIA_DEBUG_LOG("SketchWrapper::UpdateSketchConfigFromMoonCaptureBoostConfig get sketch reference fov "
348                         "ratio:mode->%{public}d %{public}f-%{public}f value->%{public}f",
349             currentMode, fovRange.zoomMin, fovRange.zoomMax, fovRange.referenceValue);
350         if (fovRange.zoomMax - currentMaxRatio >= -std::numeric_limits<float>::epsilon()) {
351             InsertSketchEnableRatioMapValue(currentSceneFeaturesMode, currentMinRatio);
352             currentMode = INVALID_MODE;
353             currentMinRatio = INVALID_ZOOM_RATIO;
354             currentMaxRatio = INVALID_ZOOM_RATIO;
355         }
356     }
357 }
358 
GetSketchReferenceFovRatio(const SceneFeaturesMode & sceneFeaturesMode,float zoomRatio)359 float SketchWrapper::GetSketchReferenceFovRatio(const SceneFeaturesMode& sceneFeaturesMode, float zoomRatio)
360 {
361     float currentZoomRatio = zoomRatio;
362     SceneFeaturesMode filteredFeaturesMode = sceneFeaturesMode;
363     for (int32_t i = SceneFeature::FEATURE_ENUM_MIN; i < SceneFeature::FEATURE_ENUM_MAX; i++) {
364         if (i == SceneFeature::FEATURE_MACRO || i == SceneFeature::FEATURE_MOON_CAPTURE_BOOST) {
365             continue;
366         }
367         filteredFeaturesMode.SwitchFeature(static_cast<SceneFeature>(i), false);
368     }
369     std::lock_guard<std::mutex> lock(g_sketchReferenceFovRatioMutex_);
370     auto it = g_sketchReferenceFovRatioMap_.find(filteredFeaturesMode);
371     if (it != g_sketchReferenceFovRatioMap_.end()) {
372         // only 1 element, just return result;
373         CHECK_ERROR_RETURN_RET(it->second.size() == 1, it->second[0].referenceValue);
374         // If zoom ratio out of range, try return min or max range value.
375         const auto& minRange = it->second.front();
376         CHECK_ERROR_RETURN_RET(currentZoomRatio - minRange.zoomMin <= std::numeric_limits<float>::epsilon(),
377             minRange.referenceValue);
378         const auto& maxRange = it->second.back();
379         CHECK_ERROR_RETURN_RET(currentZoomRatio - maxRange.zoomMax >= -std::numeric_limits<float>::epsilon(),
380             maxRange.referenceValue);
381         auto itRange = std::find_if(it->second.begin(), it->second.end(), [currentZoomRatio](const auto& range) {
382             return currentZoomRatio - range.zoomMin >= -std::numeric_limits<float>::epsilon() &&
383                    currentZoomRatio - range.zoomMax < -std::numeric_limits<float>::epsilon();
384         });
385         CHECK_ERROR_RETURN_RET(itRange != it->second.end(), itRange->referenceValue);
386     }
387     return INVALID_ZOOM_RATIO;
388 }
389 
GetSketchEnableRatio(const SceneFeaturesMode & sceneFeaturesMode)390 float SketchWrapper::GetSketchEnableRatio(const SceneFeaturesMode& sceneFeaturesMode)
391 {
392     SceneFeaturesMode filteredFeaturesMode = sceneFeaturesMode;
393     for (int32_t i = SceneFeature::FEATURE_ENUM_MIN; i < SceneFeature::FEATURE_ENUM_MAX; i++) {
394         if (i == SceneFeature::FEATURE_MACRO || i == SceneFeature::FEATURE_MOON_CAPTURE_BOOST) {
395             continue;
396         }
397         filteredFeaturesMode.SwitchFeature(static_cast<SceneFeature>(i), false);
398     }
399     std::lock_guard<std::mutex> lock(g_sketchEnableRatioMutex_);
400     auto it = g_sketchEnableRatioMap_.find(filteredFeaturesMode);
401     CHECK_ERROR_RETURN_RET(it != g_sketchEnableRatioMap_.end(), it->second);
402     return INVALID_ZOOM_RATIO;
403 }
404 
UpdateZoomRatio(float zoomRatio)405 void SketchWrapper::UpdateZoomRatio(float zoomRatio)
406 {
407     currentZoomRatio_ = zoomRatio;
408     AutoStream();
409 }
410 
AutoStream()411 void SketchWrapper::AutoStream()
412 {
413     if (currentZoomRatio_ > 0 && sketchEnableRatio_ > 0 &&
414         currentZoomRatio_ - sketchEnableRatio_ >= -std::numeric_limits<float>::epsilon()) {
415         StartSketchStream();
416     } else {
417         StopSketchStream();
418     }
419 }
420 
OnMetadataDispatch(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)421 int32_t SketchWrapper::OnMetadataDispatch(const SceneFeaturesMode& sceneFeaturesMode,
422     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
423 {
424     if (tag == OHOS_CONTROL_ZOOM_RATIO) {
425         MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataDispatch get tag:OHOS_CONTROL_ZOOM_RATIO");
426         return OnMetadataChangedZoomRatio(sceneFeaturesMode, tag, metadataItem);
427     } else if (tag == OHOS_CONTROL_SMOOTH_ZOOM_RATIOS) {
428         MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataDispatch get tag:OHOS_CONTROL_SMOOTH_ZOOM_RATIOS");
429         return OnMetadataChangedZoomRatio(sceneFeaturesMode, tag, metadataItem);
430     } else if (tag == OHOS_CONTROL_CAMERA_MACRO) {
431         return OnMetadataChangedMacro(sceneFeaturesMode, tag, metadataItem);
432     } else if (tag == OHOS_CONTROL_MOON_CAPTURE_BOOST) {
433         return OnMetadataChangedMoonCaptureBoost(sceneFeaturesMode, tag, metadataItem);
434     } else {
435         MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataDispatch get unhandled tag:%{public}d", static_cast<int32_t>(tag));
436     }
437     return CAM_META_SUCCESS;
438 }
439 
OnMetadataChangedZoomRatio(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)440 int32_t SketchWrapper::OnMetadataChangedZoomRatio(const SceneFeaturesMode& sceneFeaturesMode,
441     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
442 {
443     float tagRatio = *metadataItem.data.f;
444     MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataChangedZoomRatio OHOS_CONTROL_ZOOM_RATIO >>> tagRatio:%{public}f -- "
445                     "sketchRatio:%{public}f",
446         tagRatio, sketchEnableRatio_);
447     UpdateZoomRatio(tagRatio);
448     OnSketchStatusChanged(sceneFeaturesMode);
449     return CAM_META_SUCCESS;
450 }
451 
OnMetadataChangedMacro(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)452 int32_t SketchWrapper::OnMetadataChangedMacro(const SceneFeaturesMode& sceneFeaturesMode,
453     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
454 {
455     float sketchRatio = GetSketchEnableRatio(sceneFeaturesMode);
456     float currentZoomRatio = currentZoomRatio_;
457     MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataChangedMacro OHOS_CONTROL_ZOOM_RATIO >>> currentZoomRatio:%{public}f -- "
458                     "sketchRatio:%{public}f",
459         currentZoomRatio, sketchRatio);
460     UpdateSketchRatio(sketchRatio);
461     OnSketchStatusChanged(sceneFeaturesMode);
462     return CAM_META_SUCCESS;
463 }
464 
OnMetadataChangedMoonCaptureBoost(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)465 int32_t SketchWrapper::OnMetadataChangedMoonCaptureBoost(const SceneFeaturesMode& sceneFeaturesMode,
466     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
467 {
468     float sketchRatio = GetSketchEnableRatio(sceneFeaturesMode);
469     float currentZoomRatio = currentZoomRatio_;
470     MEDIA_DEBUG_LOG(
471         "SketchWrapper::OnMetadataChangedMoonCaptureBoost OHOS_CONTROL_ZOOM_RATIO >>> currentZoomRatio:%{public}f -- "
472         "sketchRatio:%{public}f",
473         currentZoomRatio, sketchRatio);
474     UpdateSketchRatio(sketchRatio);
475     OnSketchStatusChanged(sceneFeaturesMode);
476     return CAM_META_SUCCESS;
477 }
478 } // namespace CameraStandard
479 } // namespace OHOS