From 7ac67a2f71538bc108e306434d0061125cd73b9a Mon Sep 17 00:00:00 2001 From: w30076694 Date: Wed, 10 Sep 2025 18:10:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=9B=B8=E6=9C=BA=E6=96=B0?= =?UTF-8?q?=E5=A2=9EdisplayMode=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: w30076694 --- .../camera_service/include/hcamera_device.h | 5 ++ .../camera_service/src/hcamera_device.cpp | 80 ++++++++++++++++--- 2 files changed, 75 insertions(+), 10 deletions(-) diff --git a/services/camera_service/include/hcamera_device.h b/services/camera_service/include/hcamera_device.h index adbacaeff..2e7b5e372 100644 --- a/services/camera_service/include/hcamera_device.h +++ b/services/camera_service/include/hcamera_device.h @@ -199,7 +199,9 @@ public: private: class FoldScreenListener; + class DisplayModeListener; sptr listener_; + sptr displayModeListener_; static const std::vector> reportTagInfos_; std::mutex opMutex_; // Lock the operations updateSettings_, streamOperator_, and hdiCameraDevice_. @@ -254,6 +256,8 @@ private: void ReportMetadataDebugLog(const std::shared_ptr& settings); void RegisterFoldStatusListener(); void UnregisterFoldStatusListener(); + void RegisterDisplayModeListener(); + void UnregisterDisplayModeListener(); void CheckOnResultData(std::shared_ptr cameraResult); bool CanOpenCamera(); void ResetZoomTimer(); @@ -301,6 +305,7 @@ private: std::mutex sensorLock_; std::mutex cameraCloseListenerMutex_; std::mutex foldStateListenerMutex_; + std::mutex displayModeListenerMutex_; std::vector> cameraCloseListenerVec_; std::mutex cameraRotateStrategyInfosLock_; std::vector cameraRotateStrategyInfos_; diff --git a/services/camera_service/src/hcamera_device.cpp b/services/camera_service/src/hcamera_device.cpp index c9a40bec4..729f1e1ec 100644 --- a/services/camera_service/src/hcamera_device.cpp +++ b/services/camera_service/src/hcamera_device.cpp @@ -128,7 +128,6 @@ public: FoldStatusRosen currentFoldStatus = foldStatus; CHECK_RETURN_ELOG((cameraHostManager_ == nullptr || mLastFoldStatus == currentFoldStatus || cameraDevice_ == nullptr), "no need set fold status"); - cameraDevice_->UpdateCameraRotateAngle(); mLastFoldStatus = currentFoldStatus; MEDIA_INFO_LOG("OnFoldStatusChanged, foldStatus: %{public}d", foldStatus); cameraHostManager_->NotifyDeviceStateChangeInfo(DeviceType::FOLD_TYPE, (int)currentFoldStatus); @@ -140,6 +139,35 @@ private: FoldStatusRosen mLastFoldStatus = FoldStatusRosen::UNKNOWN; }; +class HCameraDevice::DisplayModeListener : public OHOS::Rosen::DisplayManagerLite::IDisplayModeListener { +public: + explicit DisplayModeListener(sptr cameraDevice, sptr &cameraHostManager, + const std::string cameraId) + : cameraDevice_(cameraDevice), cameraHostManager_(cameraHostManager), cameraId_(cameraId) + { + MEDIA_DEBUG_LOG("DisplayModeListener enter, cameraID: %{public}s", cameraId_.c_str()); + } + + virtual ~DisplayModeListener() = default; + using DisplayModeRosen = OHOS::Rosen::FoldDisplayMode; + // LCOV_EXCL_START + void OnDisplayModeChanged(DisplayModeRosen displayMode) override + { + DisplayModeRosen curDisplayMode = displayMode; + CHECK_RETURN_ELOG((cameraHostManager_ == nullptr || mLastDisplayMode == curDisplayMode || + cameraDevice_ == nullptr), "no need set display status"); + cameraDevice_->UpdateCameraRotateAngle(); + mLastDisplayMode = curDisplayMode; + MEDIA_INFO_LOG("OnDisplayModeChanged, displayMode: %{public}d", displayMode); + } + // LCOV_EXCL_STOP +private: + sptr cameraDevice_; + sptr cameraHostManager_; + std::string cameraId_; + DisplayModeRosen mLastDisplayMode = DisplayModeRosen::UNKNOWN; +}; + HCameraDevice::HCameraDevice( sptr& cameraHostManager, std::string cameraID, const uint32_t callingTokenId) : cachedSettings_( @@ -797,7 +825,9 @@ void HCameraDevice::HandleFoldableDevice() { bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable(); MEDIA_DEBUG_LOG("HCameraDevice::OpenDevice isFoldable is %d", isFoldable); - CHECK_EXECUTE(isFoldable, RegisterFoldStatusListener()); + CHECK_RETURN(!isFoldable); + RegisterFoldStatusListener(); + RegisterDisplayModeListener(); } void HCameraDevice::ReleaseSessionBeforeCloseDevice() @@ -818,7 +848,10 @@ int32_t HCameraDevice::CloseDevice() CAMERA_SYNC_TRACE; ReleaseSessionBeforeCloseDevice(); bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable(); - CHECK_EXECUTE(isFoldable, UnregisterFoldStatusListener()); + if (isFoldable) { + UnregisterFoldStatusListener(); + UnregisterDisplayModeListener(); + } { std::lock_guard lock(opMutex_); CHECK_RETURN_RET_ELOG(!isOpenedCameraDevice_.load(), CAMERA_OK, @@ -1079,25 +1112,27 @@ bool HCameraDevice::IsPhysicalCameraOrientationVariable() void HCameraDevice::UpdateCameraRotateAngle() { bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable(); - int32_t displayMode = static_cast(OHOS::Rosen::DisplayManager::GetInstance().GetFoldDisplayMode()); - CHECK_RETURN(!isFoldable || deviceAbility_ == nullptr || displayMode == lastDisplayMode_); - lastDisplayMode_ = displayMode; + int32_t curDisplayMode = static_cast(OHOS::Rosen::DisplayManager::GetInstance().GetFoldDisplayMode()); + MEDIA_INFO_LOG("HCameraDevice::UpdateCameraRotateAngle lastDisplayMode: %{public}d, curDisplayMode: %{public}d", + lastDisplayMode_, curDisplayMode); + CHECK_RETURN(!isFoldable || deviceAbility_ == nullptr || lastDisplayMode_ == curDisplayMode); + lastDisplayMode_ = curDisplayMode; if (system::GetParameter("const.system.sensor_correction_enable", "0") != "1" || !IsPhysicalCameraOrientationVariable()) { MEDIA_DEBUG_LOG("HCameraDevice::UpdateCameraRotateAngle variable orientation is closed"); std::vector emptyVec; UpdateCameraRotateAngleAndZoom(emptyVec, - displayMode == static_cast(OHOS::Rosen::FoldDisplayMode::GLOBAL_FULL)); + curDisplayMode == static_cast(OHOS::Rosen::FoldDisplayMode::GLOBAL_FULL)); return; } int cameraOrientation = GetOriginalCameraOrientation(); CHECK_RETURN(cameraOrientation == -1); int32_t truthCameraOrientation = -1; int32_t ret = GetCorrectedCameraOrientation(!usePhysicalCameraOrientation_, deviceAbility_, - truthCameraOrientation, displayMode); + truthCameraOrientation, curDisplayMode); CHECK_RETURN(ret != CAM_META_SUCCESS || truthCameraOrientation == -1); int32_t rotateDegree = (truthCameraOrientation - cameraOrientation + BASE_DEGREE) % BASE_DEGREE; - MEDIA_DEBUG_LOG("HCameraDevice::UpdateCameraRotateAngle cameraOrientation: %{public}d, truthCameraOrientation: " + MEDIA_INFO_LOG("HCameraDevice::UpdateCameraRotateAngle cameraOrientation: %{public}d, truthCameraOrientation: " "%{public}d, rotateDegree: %{public}d.", cameraOrientation, truthCameraOrientation, rotateDegree); std::shared_ptr settings = std::make_shared(1, 1); CHECK_EXECUTE(rotateDegree >= 0, settings->addEntry(OHOS_CONTROL_ROTATE_ANGLE, &rotateDegree, 1)); @@ -1383,6 +1418,28 @@ void HCameraDevice::UnregisterFoldStatusListener() listener_ = nullptr; } +void HCameraDevice::RegisterDisplayModeListener() +{ + std::lock_guard lock(displayModeListenerMutex_); + displayModeListener_ = new DisplayModeListener(this, cameraHostManager_, cameraID_); + auto ret = OHOS::Rosen::DisplayManagerLite::GetInstance().RegisterDisplayModeListener(displayModeListener_); + if (ret != OHOS::Rosen::DMError::DM_OK) { + MEDIA_DEBUG_LOG("HCameraDevice::RegisterDisplayModeListener failed"); + listener_ = nullptr; + } else { + MEDIA_DEBUG_LOG("HCameraDevice::RegisterDisplayModeListener success"); + } +} + +void HCameraDevice::UnregisterDisplayModeListener() +{ + std::lock_guard lock(displayModeListenerMutex_); + CHECK_RETURN_ELOG(displayModeListener_ == nullptr, "HCameraDevice::UnregisterDisplayModeListener listener is null"); + auto ret = OHOS::Rosen::DisplayManagerLite::GetInstance().UnregisterDisplayModeListener(displayModeListener_); + CHECK_PRINT_DLOG(ret != OHOS::Rosen::DMError::DM_OK, "HCameraDevice::UnregisterDisplayModeListener failed"); + displayModeListener_ = nullptr; +} + int32_t HCameraDevice::EnableResult(const std::vector &results) { CHECK_RETURN_RET_ELOG(results.empty(), CAMERA_INVALID_ARG, "HCameraDevice::EnableResult results is empty"); @@ -1780,7 +1837,10 @@ void HCameraDevice::RemoveResourceWhenHostDied() MEDIA_DEBUG_LOG("HCameraDevice::RemoveResourceWhenHostDied start"); CAMERA_SYNC_TRACE; bool isFoldable = OHOS::Rosen::DisplayManager::GetInstance().IsFoldable(); - CHECK_EXECUTE(isFoldable, UnregisterFoldStatusListener()); + if (isFoldable) { + UnregisterFoldStatusListener(); + UnregisterDisplayModeListener(); + } HCameraDeviceManager::GetInstance()->RemoveDevice(cameraID_); if (cameraHostManager_) { cameraHostManager_->RemoveCameraDevice(cameraID_); -- Gitee