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> ¶ms, 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