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 #ifndef OHOS_CAMERA_SKETCH_WRAPPER_H
17 #define OHOS_CAMERA_SKETCH_WRAPPER_H
18 
19 #include <cstdint>
20 #include <memory>
21 #include <mutex>
22 
23 #include "abilities/sketch_ability.h"
24 #include "capture_scene_const.h"
25 #include "image_receiver.h"
26 #include "preview_output.h"
27 #include "refbase.h"
28 
29 namespace OHOS {
30 namespace CameraStandard {
31 class SketchWrapper {
32 public:
33     static float GetSketchReferenceFovRatio(const SceneFeaturesMode& sceneFeaturesMode, float zoomRatio);
34     static float GetSketchEnableRatio(const SceneFeaturesMode& sceneFeaturesMode);
35     static void UpdateSketchStaticInfo(std::shared_ptr<OHOS::Camera::CameraMetadata> deviceMetadata);
36 
37     explicit SketchWrapper(sptr<IStreamCommon> hostStream, const Size size);
38     virtual ~SketchWrapper();
39     int32_t Init(
40         std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceMetadata, const SceneFeaturesMode& sceneFeaturesMode);
41     int32_t AttachSketchSurface(sptr<Surface> sketchSurface);
42     int32_t StartSketchStream();
43     int32_t StopSketchStream();
44     int32_t Destroy();
45 
46     void OnSketchStatusChanged(SketchStatus sketchStatus, const SceneFeaturesMode& sceneFeaturesMode);
47     void SetPreviewStateCallback(std::shared_ptr<PreviewStateCallback> callback);
48     int32_t UpdateSketchRatio(float sketchRatio);
49     void UpdateZoomRatio(float zoomRatio);
50 
51     int32_t OnMetadataDispatch(const SceneFeaturesMode& sceneFeaturesMode, const camera_device_metadata_tag_t tag,
52         const camera_metadata_item_t& metadataItem);
53 
54 private:
55     // Cache device info
56     static std::mutex g_sketchReferenceFovRatioMutex_;
57     static std::map<SceneFeaturesMode, std::vector<SketchReferenceFovRange>> g_sketchReferenceFovRatioMap_;
58     static std::mutex g_sketchEnableRatioMutex_;
59     static std::map<SceneFeaturesMode, float> g_sketchEnableRatioMap_;
60 
61     wptr<IStreamCommon> hostStream_;
62     Size sketchSize_;
63     sptr<Surface> sketchSurface_ = nullptr;
64     sptr<IStreamRepeat> sketchStream_;
65     std::mutex sketchStatusChangeMutex_;
66 
67     std::weak_ptr<PreviewStateCallback> previewStateCallback_;
68 
69     volatile float sketchEnableRatio_ = -1.0f;
70     volatile float currentZoomRatio_ = 1.0f;
71     SketchStatusData currentSketchStatusData_ = { .status = SketchStatus::STOPED, .sketchRatio = -1.0f };
72 
73     static SceneFeaturesMode GetSceneFeaturesModeFromModeData(float floatModeData);
74     static void InsertSketchReferenceFovRatioMapValue(
75         SceneFeaturesMode& sceneFeaturesMode, SketchReferenceFovRange& sketchReferenceFovRange);
76     static void InsertSketchEnableRatioMapValue(SceneFeaturesMode& sceneFeaturesMode, float ratioValue);
77     static void UpdateSketchEnableRatio(std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceMetadata);
78     static void UpdateSketchReferenceFovRatio(std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceMetadata);
79     static void UpdateSketchReferenceFovRatio(camera_metadata_item_t& metadataItem);
80     static bool GetMoonCaptureBoostAbilityItem(
81         std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceMetadata, camera_metadata_item_t& metadataItem);
82     static void UpdateSketchConfigFromMoonCaptureBoostConfig(
83         std::shared_ptr<OHOS::Camera::CameraMetadata>& deviceMetadata);
84     void OnSketchStatusChanged(const SceneFeaturesMode& sceneFeaturesMode);
85     int32_t OnMetadataChangedZoomRatio(const SceneFeaturesMode& sceneFeaturesMode,
86         const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem);
87     int32_t OnMetadataChangedMacro(const SceneFeaturesMode& sceneFeaturesMode, const camera_device_metadata_tag_t tag,
88         const camera_metadata_item_t& metadataItem);
89     int32_t OnMetadataChangedMoonCaptureBoost(const SceneFeaturesMode& sceneFeaturesMode,
90         const camera_device_metadata_tag_t tag, const camera_metadata_item_t& metadataItem);
91 
92     void AutoStream();
93 };
94 } // namespace CameraStandard
95 } // namespace OHOS
96 #endif // OHOS_CAMERA_SKETCH_WRAPPER_H