• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 MC_CAMERA_TRACKING_CONTROLLER_H
17 #define MC_CAMERA_TRACKING_CONTROLLER_H
18 #include <map>
19 #include "mechbody_controller_ipc_interface_code.h"
20 #include "mechbody_controller_log.h"
21 #include "mechbody_controller_types.h"
22 #include "mc_motion_manager.h"
23 #include "camera_manager.h"
24 #include "mech_session.h"
25 #include "istream_metadata.h"
26 #include "sensor_agent.h"
27 #include "sensor_agent_type.h"
28 
29 namespace OHOS {
30 namespace MechBodyController {
31 
32 enum class TrackingObjectType : uint8_t {
33     MSG_OBJ_OTHER = 0,
34     MSG_OBJ_HEAD = 1,
35     MSG_OBJ_FACE = 2,
36     MSG_OBJ_BODY = 3,
37 };
38 
39 enum class CameraVideoStabilizationMode : int32_t {
40     OHOS_CAMERA_VIDEO_STABILIZATION_OFF = 0,
41     OHOS_CAMERA_VIDEO_STABILIZATION_LOW = 1,
42     OHOS_CAMERA_VIDEO_STABILIZATION_MIDDLE = 2,
43     OHOS_CAMERA_VIDEO_STABILIZATION_HIGH = 3,
44     OHOS_CAMERA_VIDEO_STABILIZATION_AUTO = 4,
45 };
46 
47 struct AppSetting {
48     bool isTrackingEnabled = true;
49     CameraTrackingLayout cameraTrackingLayout = CameraTrackingLayout::DEFAULT;
50 };
51 
52 struct CameraInfo {
53     int32_t targetId;
54     uint32_t tokenId = 0;
55     float sensorWidth = 36.0f; // All devices have sensor width equivalent to 36mm
56     float sensorHeight = 24.0f; // All devices have sensor height equivalent to 24mm
57     uint8_t fovV = 0;
58     uint8_t fovH = 0;
59     int32_t width = 0;
60     int32_t height = 0;
61     float zoomFactor = 0;
62     int32_t equivalentFocus = 24;
63     bool isRecording = false;
64     bool currentTrackingEnable = true;
65     CameraTrackingLayout currentCameraTrackingLayout = CameraTrackingLayout::DEFAULT;
66     CameraType cameraType = CameraType::BACK;
67     int32_t focusMode = 1;
68     int32_t sessionMode;
69     int32_t videoStabilizationMode =
70         static_cast<int32_t>(CameraVideoStabilizationMode::OHOS_CAMERA_VIDEO_STABILIZATION_OFF);
71     bool isCameraOn = false;
toStringCameraInfo72     std::string toString() const
73     {
74         return "targetId: " + std::to_string(targetId) +
75                ", tokenId: " + std::to_string(tokenId) +
76                ", sensorWidth: " + std::to_string(sensorWidth) +
77                ", sensorHeight: " + std::to_string(sensorHeight) +
78                ", fovV: " + std::to_string(fovV) +
79                ", fovH: " + std::to_string(fovH) +
80                ", width: " + std::to_string(width) +
81                ", height: " + std::to_string(height) +
82                ", zoomFactor: " + std::to_string(zoomFactor) +
83                ", equivalentFocus: " + std::to_string(equivalentFocus) +
84                ", isRecording: " + std::to_string(isRecording) +
85                ", currentTrackingEnable: " + std::to_string(currentTrackingEnable) +
86                ", currentCameraTrackingLayout: " + std::to_string(static_cast<int>(currentCameraTrackingLayout)) +
87                ", cameraType: " + std::to_string(static_cast<int>(cameraType)) +
88                ", focusMode: " + std::to_string(focusMode) +
89                ", sessionMode: " + std::to_string(sessionMode) +
90                ", videoStabilizationMode: " + std::to_string(videoStabilizationMode) +
91                ", isCameraOn: " + std::to_string(isCameraOn);
92     }
93 };
94 
95 
96 class MechSessionCallbackImpl : public CameraStandard::MechSessionCallback {
97 public:
98     ~MechSessionCallbackImpl() override = default;
99 
100     void OnFocusTrackingInfo(CameraStandard::FocusTrackingMetaInfo info) override;
101     void OnCaptureSessionConfiged(CameraStandard::CaptureSessionInfo captureSessionInfo) override;
102     void OnZoomInfoChange(int sessionid, CameraStandard::ZoomInfo zoomInfo) override;
103     void OnSessionStatusChange(int sessionid, bool status) override;
104 };
105 
106 class McCameraTrackingController {
107 public:
108     static McCameraTrackingController& GetInstance();
109 private:
110     McCameraTrackingController(const McCameraTrackingController&) = delete;
111     McCameraTrackingController& operator= (const McCameraTrackingController&) = delete;
112     McCameraTrackingController(McCameraTrackingController&&) = delete;
113     McCameraTrackingController& operator= (McCameraTrackingController&&) = delete;
114 
115 public:
116     McCameraTrackingController();
117     ~McCameraTrackingController();
118     void Init();
119     void UnInit();
120     int32_t OnCaptureSessionConfiged(const CameraStandard::CaptureSessionInfo& captureSessionInfo);
121     int32_t OnZoomInfoChange(int32_t sessionid, const CameraStandard::ZoomInfo& zoomInfo);
122     int32_t OnSessionStatusChange(int32_t sessionid, bool status);
123     int32_t OnFocusTracking(CameraStandard::FocusTrackingMetaInfo &info);
124     int32_t SetTrackingEnabled(const uint32_t &tokenId, bool &isEnabled);
125     int32_t GetTrackingEnabled(const uint32_t &tokenId, bool &isEnabled);
126     int32_t RegisterTrackingEventCallback(const uint32_t &tokenId, sptr<IRemoteObject> callback);
127     int32_t UnRegisterTrackingEventCallback(const uint32_t &tokenId);
128     int32_t OnTrackingEvent(const int32_t &mechId, const TrackingEvent &event);
129     int32_t SetTrackingLayout(CameraTrackingLayout &cameraTrackingLayout);
130     int32_t SetTrackingLayout(const uint32_t &tokenId, CameraTrackingLayout &cameraTrackingLayout);
131     int32_t GetTrackingLayout(const uint32_t &tokenId, CameraTrackingLayout &cameraTrackingLayout);
132     std::shared_ptr<CameraInfo> GetCurrentCameraInfo() const;
133 
134 private:
135     int32_t ComputeFov();
136     bool IsCurrentFocus();
137     int32_t UpdateMotionManagers();
138     std::shared_ptr<TrackingFrameParams> BuildTrackingParams(CameraStandard::FocusTrackingMetaInfo &info);
139     int32_t GetTrackingTarget(CameraStandard::Rect &trackingRegion,
140         std::vector<sptr<CameraStandard::MetadataObject>> &detectedObjects, int32_t trackingObjectId,
141         sptr<CameraStandard::MetadataObject> &targetObject);
142     int32_t UpdateMotionsWithTrackingData(
143         const std::shared_ptr<TrackingFrameParams> &params, int32_t trackingObjectId);
144     bool FilterDetectedObject(sptr<CameraStandard::MetadataObject> &detectedObject);
145     void UpdateROI(std::shared_ptr<TrackingFrameParams> &trackingFrameParams, CameraStandard::Rect &rect);
146     static void SensorCallback(SensorEvent* event);
147     static MobileRotation CalculateSensorRotation(GravityData* gravityData);
148     void ConvertObjectType(CameraStandard::MetadataObjectType &cameraObjectType, uint8_t &mechObjectType);
149     void RegisterTrackingListener();
150     void UnRegisterTrackingListener();
151     void RegisterSensorListener();
152     void UnRegisterSensorListener();
153     float ParseLayout(CameraTrackingLayout &cameraTrackingLayout);
154     float ParseReverseLayout(CameraTrackingLayout &cameraTrackingLayout);
155 
156 public:
157     std::mutex trackingEventCallbackMutex_;
158     std::map<uint32_t, sptr<IRemoteObject>> trackingEventCallback_;
159 
160 private:
161     std::mutex cameraTrackingControllerInitMutex_;
162     std::mutex appSettingsMutex_;
163     std::map<uint32_t, std::shared_ptr<AppSetting>> appSettings;
164 
165     SensorUser user = { "", nullptr, nullptr };
166     MobileRotation sensorRotation_ = MobileRotation::UP;
167     sptr<CameraStandard::MechSession> pMechSession;
168     std::shared_ptr<CameraInfo> currentCameraInfo_ = std::make_shared<CameraInfo>();
169 
170     std::shared_ptr<TrackingFrameParams> lastTrackingFrame_ = std::make_shared<TrackingFrameParams>();
171 
172     std::shared_ptr<OHOS::AppExecFwk::EventHandler> eventHandler_ = nullptr;
173 };
174 } // namespace MechBodyController
175 } // namespace OHOS
176 #endif // MC_CAMERA_TRACKING_CONTROLLER_H