• 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 "image_format.h"
27 #include "image_source.h"
28 #include "image_type.h"
29 #include "istream_repeat_callback.h"
30 #include "surface_type.h"
31 
32 namespace OHOS {
33 namespace CameraStandard {
34 constexpr uint32_t INVALID_MODE = 0xffffffff;
35 constexpr float INVALID_MODE_FLOAT = -1.0f;
36 constexpr float INVALID_ZOOM_RATIO = -1.0f;
37 constexpr float SKETCH_DIV = 100.0f;
38 std::mutex SketchWrapper::g_sketchReferenceFovRatioMutex_;
39 std::map<SceneFeaturesMode, std::vector<SketchReferenceFovRange>> SketchWrapper::g_sketchReferenceFovRatioMap_;
40 std::mutex SketchWrapper::g_sketchEnableRatioMutex_;
41 std::map<SceneFeaturesMode, float> SketchWrapper::g_sketchEnableRatioMap_;
42 
SketchWrapper(sptr<IStreamCommon> hostStream,const Size size)43 SketchWrapper::SketchWrapper(sptr<IStreamCommon> hostStream, const Size size)
44     : hostStream_(hostStream), sketchSize_(size)
45 {}
46 
Init(std::shared_ptr<OHOS::Camera::CameraMetadata> & deviceMetadata,const SceneFeaturesMode & sceneFeaturesMode)47 int32_t SketchWrapper::Init(
48     std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceMetadata, const SceneFeaturesMode& sceneFeaturesMode)
49 {
50     sptr<IStreamCommon> hostStream = hostStream_.promote();
51     CHECK_ERROR_RETURN_RET(hostStream == nullptr, CAMERA_INVALID_STATE);
52     UpdateSketchStaticInfo(deviceMetadata);
53     sketchEnableRatio_ = GetSketchEnableRatio(sceneFeaturesMode);
54         SceneFeaturesMode dumpSceneFeaturesMode = sceneFeaturesMode;
55         MEDIA_DEBUG_LOG("SketchWrapper::Init sceneFeaturesMode:%{public}s, sketchEnableRatio_:%{public}f",
56             dumpSceneFeaturesMode.Dump().c_str(), sketchEnableRatio_);
57         IStreamRepeat* repeatStream = static_cast<IStreamRepeat*>(hostStream.GetRefPtr());
58         return repeatStream->ForkSketchStreamRepeat(
59             sketchSize_.width, sketchSize_.height, sketchStream_, sketchEnableRatio_);
60 }
61 
AttachSketchSurface(sptr<Surface> sketchSurface)62 int32_t SketchWrapper::AttachSketchSurface(sptr<Surface> sketchSurface)
63 {
64     CHECK_ERROR_RETURN_RET(sketchStream_ == nullptr, CAMERA_INVALID_STATE);
65     CHECK_ERROR_RETURN_RET(sketchSurface == nullptr, CAMERA_INVALID_ARG);
66     return sketchStream_->AddDeferredSurface(sketchSurface->GetProducer());
67 }
68 
UpdateSketchRatio(float sketchRatio)69 int32_t SketchWrapper::UpdateSketchRatio(float sketchRatio)
70 {
71     // SketchRatio value could be negative value
72     MEDIA_DEBUG_LOG("Enter Into SketchWrapper::UpdateSketchRatio");
73     CHECK_ERROR_RETURN_RET(sketchStream_ == nullptr, CAMERA_INVALID_STATE);
74     sptr<IStreamCommon> hostStream = hostStream_.promote();
75     CHECK_ERROR_RETURN_RET_LOG(hostStream == nullptr, CAMERA_INVALID_STATE,
76         "SketchWrapper::UpdateSketchRatio hostStream is null");
77     IStreamRepeat* repeatStream = static_cast<IStreamRepeat*>(hostStream.GetRefPtr());
78     int32_t ret = repeatStream->UpdateSketchRatio(sketchRatio);
79     if (ret == CAMERA_OK) {
80         sketchEnableRatio_ = sketchRatio;
81     }
82     AutoStream();
83     return ret;
84 }
85 
Destroy()86 int32_t SketchWrapper::Destroy()
87 {
88     if (sketchStream_ != nullptr) {
89         sketchStream_->Stop();
90         sketchStream_->Release();
91         sketchStream_ = nullptr;
92     }
93     sptr<IStreamCommon> hostStream = hostStream_.promote();
94     CHECK_ERROR_RETURN_RET(hostStream == nullptr, CAMERA_INVALID_STATE);
95     IStreamRepeat* repeatStream = static_cast<IStreamRepeat*>(hostStream.GetRefPtr());
96     return repeatStream->RemoveSketchStreamRepeat();
97 }
98 
~SketchWrapper()99 SketchWrapper::~SketchWrapper()
100 {
101     Destroy();
102 }
103 
StartSketchStream()104 int32_t SketchWrapper::StartSketchStream()
105 {
106     if (sketchStream_ != nullptr) {
107         MEDIA_DEBUG_LOG("Enter Into SketchWrapper::SketchWrapper::StartSketchStream");
108         int retCode = sketchStream_->Start();
109         return retCode;
110     }
111     return CAMERA_UNKNOWN_ERROR;
112 }
113 
StopSketchStream()114 int32_t SketchWrapper::StopSketchStream()
115 {
116     if (sketchStream_ != nullptr) {
117         MEDIA_DEBUG_LOG("Enter Into SketchWrapper::SketchWrapper::StopSketchStream");
118         int retCode = sketchStream_->Stop();
119         return retCode;
120     }
121     return CAMERA_UNKNOWN_ERROR;
122 }
123 
SetPreviewStateCallback(std::shared_ptr<PreviewStateCallback> callback)124 void SketchWrapper::SetPreviewStateCallback(std::shared_ptr<PreviewStateCallback> callback)
125 {
126     previewStateCallback_ = callback;
127 }
128 
OnSketchStatusChanged(const SceneFeaturesMode & sceneFeaturesMode)129 void SketchWrapper::OnSketchStatusChanged(const SceneFeaturesMode& sceneFeaturesMode)
130 {
131     auto callback = previewStateCallback_.lock();
132     CHECK_ERROR_RETURN(callback == nullptr);
133     float sketchReferenceRatio = GetSketchReferenceFovRatio(sceneFeaturesMode, currentZoomRatio_);
134     std::lock_guard<std::mutex> lock(sketchStatusChangeMutex_);
135     if (currentSketchStatusData_.sketchRatio != sketchReferenceRatio) {
136         SketchStatusData statusData;
137         statusData.status = currentSketchStatusData_.status;
138         statusData.sketchRatio = sketchReferenceRatio;
139         MEDIA_DEBUG_LOG("SketchWrapper::OnSketchStatusDataChanged-:%{public}d->%{public}d,%{public}f->%{public}f",
140             currentSketchStatusData_.status, statusData.status, currentSketchStatusData_.sketchRatio,
141             statusData.sketchRatio);
142         currentSketchStatusData_ = statusData;
143         callback->OnSketchStatusDataChanged(currentSketchStatusData_);
144     }
145 }
146 
OnSketchStatusChanged(SketchStatus sketchStatus,const SceneFeaturesMode & sceneFeaturesMode)147 void SketchWrapper::OnSketchStatusChanged(SketchStatus sketchStatus, const SceneFeaturesMode& sceneFeaturesMode)
148 {
149     auto callback = previewStateCallback_.lock();
150     CHECK_ERROR_RETURN(callback == nullptr);
151     float sketchReferenceRatio = GetSketchReferenceFovRatio(sceneFeaturesMode, currentZoomRatio_);
152     std::lock_guard<std::mutex> lock(sketchStatusChangeMutex_);
153     if (currentSketchStatusData_.status != sketchStatus ||
154         currentSketchStatusData_.sketchRatio != sketchReferenceRatio) {
155         SketchStatusData statusData;
156         statusData.status = sketchStatus;
157         statusData.sketchRatio = sketchReferenceRatio;
158         MEDIA_DEBUG_LOG("SketchWrapper::OnSketchStatusDataChanged:%{public}d->%{public}d,%{public}f->%{public}f",
159             currentSketchStatusData_.status, statusData.status, currentSketchStatusData_.sketchRatio,
160             statusData.sketchRatio);
161         currentSketchStatusData_ = statusData;
162         callback->OnSketchStatusDataChanged(currentSketchStatusData_);
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     if (!GetMoonCaptureBoostAbilityItem(deviceMetadata, item)) {
321         MEDIA_ERR_LOG(
322             "SketchWrapper::UpdateSketchConfigFromMoonCaptureBoostConfig get GetMoonCaptureBoostAbilityItem failed");
323         return;
324     }
325     uint32_t currentMode = INVALID_MODE;
326     float currentMinRatio = INVALID_ZOOM_RATIO;
327     float currentMaxRatio = INVALID_ZOOM_RATIO;
328     SceneFeaturesMode currentSceneFeaturesMode;
329     for (uint32_t i = 0; i < item.count; i++) {
330         if (currentMode == INVALID_MODE) {
331             currentMode = static_cast<SceneMode>(item.data.ui32[i]);
332             currentSceneFeaturesMode =
333                 SceneFeaturesMode(static_cast<SceneMode>(currentMode), { FEATURE_MOON_CAPTURE_BOOST });
334             continue;
335         }
336         if (currentMinRatio == INVALID_ZOOM_RATIO) {
337             currentMinRatio = static_cast<float>(item.data.ui32[i]) / SKETCH_DIV;
338             continue;
339         }
340         if (currentMaxRatio == INVALID_ZOOM_RATIO) {
341             currentMaxRatio = static_cast<float>(item.data.ui32[i]) / SKETCH_DIV;
342             continue;
343         }
344         SketchReferenceFovRange fovRange;
345         fovRange.zoomMin = static_cast<float>(item.data.ui32[i]) / SKETCH_DIV;
346         fovRange.zoomMax = static_cast<float>(item.data.ui32[i + 1]) / SKETCH_DIV;        // Offset 1 data
347         fovRange.referenceValue = static_cast<float>(item.data.ui32[i + 2]) / SKETCH_DIV; // Offset 2 data
348         i = i + 2;                                                                        // Offset 2 data
349         InsertSketchReferenceFovRatioMapValue(currentSceneFeaturesMode, fovRange);
350         MEDIA_DEBUG_LOG("SketchWrapper::UpdateSketchConfigFromMoonCaptureBoostConfig get sketch reference fov "
351                         "ratio:mode->%{public}d %{public}f-%{public}f value->%{public}f",
352             currentMode, fovRange.zoomMin, fovRange.zoomMax, fovRange.referenceValue);
353         if (fovRange.zoomMax - currentMaxRatio >= -std::numeric_limits<float>::epsilon()) {
354             InsertSketchEnableRatioMapValue(currentSceneFeaturesMode, currentMinRatio);
355             currentMode = INVALID_MODE;
356             currentMinRatio = INVALID_ZOOM_RATIO;
357             currentMaxRatio = INVALID_ZOOM_RATIO;
358         }
359     }
360 }
361 
GetSketchReferenceFovRatio(const SceneFeaturesMode & sceneFeaturesMode,float zoomRatio)362 float SketchWrapper::GetSketchReferenceFovRatio(const SceneFeaturesMode& sceneFeaturesMode, float zoomRatio)
363 {
364     float currentZoomRatio = zoomRatio;
365     std::lock_guard<std::mutex> lock(g_sketchReferenceFovRatioMutex_);
366     auto it = g_sketchReferenceFovRatioMap_.find(sceneFeaturesMode);
367     if (it != g_sketchReferenceFovRatioMap_.end()) {
368         if (it->second.size() == 1) { // only 1 element, just return result;
369             return it->second[0].referenceValue;
370         }
371         // If zoom ratio out of range, try return min or max range value.
372         const auto& minRange = it->second.front();
373         if (currentZoomRatio - minRange.zoomMin <= std::numeric_limits<float>::epsilon()) {
374             return minRange.referenceValue;
375         }
376         const auto& maxRange = it->second.back();
377         if (currentZoomRatio - maxRange.zoomMax >= -std::numeric_limits<float>::epsilon()) {
378             return maxRange.referenceValue;
379         }
380         auto itRange = std::find_if(it->second.begin(), it->second.end(), [currentZoomRatio](const auto& range) {
381             return currentZoomRatio - range.zoomMin >= -std::numeric_limits<float>::epsilon() &&
382                    currentZoomRatio - range.zoomMax < -std::numeric_limits<float>::epsilon();
383         });
384         if (itRange != it->second.end()) {
385             return itRange->referenceValue;
386         }
387     }
388     return INVALID_ZOOM_RATIO;
389 }
390 
GetSketchEnableRatio(const SceneFeaturesMode & sceneFeaturesMode)391 float SketchWrapper::GetSketchEnableRatio(const SceneFeaturesMode& sceneFeaturesMode)
392 {
393     std::lock_guard<std::mutex> lock(g_sketchEnableRatioMutex_);
394     auto it = g_sketchEnableRatioMap_.find(sceneFeaturesMode);
395     if (it != g_sketchEnableRatioMap_.end()) {
396         return it->second;
397     }
398     return INVALID_ZOOM_RATIO;
399 }
400 
UpdateZoomRatio(float zoomRatio)401 void SketchWrapper::UpdateZoomRatio(float zoomRatio)
402 {
403     currentZoomRatio_ = zoomRatio;
404     AutoStream();
405 }
406 
AutoStream()407 void SketchWrapper::AutoStream()
408 {
409     if (currentZoomRatio_ > 0 && sketchEnableRatio_ > 0 &&
410         currentZoomRatio_ - sketchEnableRatio_ >= -std::numeric_limits<float>::epsilon()) {
411         StartSketchStream();
412     } else {
413         StopSketchStream();
414     }
415 }
416 
OnMetadataDispatch(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)417 int32_t SketchWrapper::OnMetadataDispatch(const SceneFeaturesMode& sceneFeaturesMode,
418     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
419 {
420     SceneFeaturesMode filteredFeaturesMode = sceneFeaturesMode;
421     for (int32_t i = SceneFeature::FEATURE_ENUM_MIN; i < SceneFeature::FEATURE_ENUM_MAX; i++) {
422         if (i == SceneFeature::FEATURE_MACRO || i == SceneFeature::FEATURE_MOON_CAPTURE_BOOST) {
423             continue;
424         }
425         filteredFeaturesMode.SwitchFeature(static_cast<SceneFeature>(i), false);
426     }
427 
428     if (tag == OHOS_CONTROL_ZOOM_RATIO) {
429         MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataDispatch get tag:OHOS_CONTROL_ZOOM_RATIO");
430         return OnMetadataChangedZoomRatio(filteredFeaturesMode, tag, metadataItem);
431     } else if (tag == OHOS_CONTROL_SMOOTH_ZOOM_RATIOS) {
432         MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataDispatch get tag:OHOS_CONTROL_SMOOTH_ZOOM_RATIOS");
433         return OnMetadataChangedZoomRatio(filteredFeaturesMode, tag, metadataItem);
434     } else if (tag == OHOS_CONTROL_CAMERA_MACRO) {
435         return OnMetadataChangedMacro(filteredFeaturesMode, tag, metadataItem);
436     } else if (tag == OHOS_CONTROL_MOON_CAPTURE_BOOST) {
437         return OnMetadataChangedMoonCaptureBoost(filteredFeaturesMode, tag, metadataItem);
438     } else {
439         MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataDispatch get unhandled tag:%{public}d", static_cast<int32_t>(tag));
440     }
441     return CAM_META_SUCCESS;
442 }
443 
OnMetadataChangedZoomRatio(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)444 int32_t SketchWrapper::OnMetadataChangedZoomRatio(const SceneFeaturesMode& sceneFeaturesMode,
445     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
446 {
447     float tagRatio = *metadataItem.data.f;
448     MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataChangedZoomRatio OHOS_CONTROL_ZOOM_RATIO >>> tagRatio:%{public}f -- "
449                     "sketchRatio:%{public}f",
450         tagRatio, sketchEnableRatio_);
451     UpdateZoomRatio(tagRatio);
452     OnSketchStatusChanged(sceneFeaturesMode);
453     return CAM_META_SUCCESS;
454 }
455 
OnMetadataChangedMacro(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)456 int32_t SketchWrapper::OnMetadataChangedMacro(const SceneFeaturesMode& sceneFeaturesMode,
457     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
458 {
459     float sketchRatio = GetSketchEnableRatio(sceneFeaturesMode);
460     float currentZoomRatio = currentZoomRatio_;
461     MEDIA_DEBUG_LOG("SketchWrapper::OnMetadataChangedMacro OHOS_CONTROL_ZOOM_RATIO >>> currentZoomRatio:%{public}f -- "
462                     "sketchRatio:%{public}f",
463         currentZoomRatio, sketchRatio);
464     UpdateSketchRatio(sketchRatio);
465     OnSketchStatusChanged(sceneFeaturesMode);
466     return CAM_META_SUCCESS;
467 }
468 
OnMetadataChangedMoonCaptureBoost(const SceneFeaturesMode & sceneFeaturesMode,const camera_device_metadata_tag_t tag,const camera_metadata_item_t & metadataItem)469 int32_t SketchWrapper::OnMetadataChangedMoonCaptureBoost(const SceneFeaturesMode& sceneFeaturesMode,
470     const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem)
471 {
472     float sketchRatio = GetSketchEnableRatio(sceneFeaturesMode);
473     float currentZoomRatio = currentZoomRatio_;
474     MEDIA_DEBUG_LOG(
475         "SketchWrapper::OnMetadataChangedMoonCaptureBoost OHOS_CONTROL_ZOOM_RATIO >>> currentZoomRatio:%{public}f -- "
476         "sketchRatio:%{public}f",
477         currentZoomRatio, sketchRatio);
478     UpdateSketchRatio(sketchRatio);
479     OnSketchStatusChanged(sceneFeaturesMode);
480     return CAM_META_SUCCESS;
481 }
482 } // namespace CameraStandard
483 } // namespace OHOS