From faf383159f68e9d36e51c41c56c799e921ff07fa Mon Sep 17 00:00:00 2001 From: w30076694 Date: Thu, 4 Sep 2025 17:42:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=9B=B8=E6=9C=BA=E8=B1=81?= =?UTF-8?q?=E5=85=8D=E5=90=8D=E5=8D=95=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: w30076694 --- .../src/camera_napi_object_types.cpp | 2 +- .../camera/base/src/input/camera_device.cpp | 22 ++++++++++++++++-- .../camera/base/src/input/camera_input.cpp | 8 +++++++ .../camera/base/src/output/preview_output.cpp | 11 +++++---- .../src/hcamera_device_unittest.cpp | 23 +++++++++++++++++++ .../src/camera_framework_input_unittest.cpp | 1 + .../camera/include/input/camera_device.h | 2 ++ .../idls/ICameraDeviceService.idl | 1 + .../camera_service/include/hcamera_device.h | 1 + services/camera_service/include/parser.h | 1 + .../camera_service/src/hcamera_device.cpp | 11 +++++++++ .../camera_rotate_param_manager.cpp | 19 +++++++++++++-- .../camera_device_service_stub_fuzzer.h | 4 ++++ 13 files changed, 97 insertions(+), 9 deletions(-) diff --git a/frameworks/js/camera_napi/src/camera_napi_object_types.cpp b/frameworks/js/camera_napi/src/camera_napi_object_types.cpp index 3b4ce3fb2..4259013f1 100644 --- a/frameworks/js/camera_napi/src/camera_napi_object_types.cpp +++ b/frameworks/js/camera_napi/src/camera_napi_object_types.cpp @@ -87,7 +87,7 @@ CameraNapiObject& CameraNapiObjCameraDevice::GetCameraNapiObject() auto connectionType = Hold(cameraDevice_.GetConnectionType()); auto hostDeviceName = Hold(cameraDevice_.GetHostName()); auto hostDeviceType = Hold(cameraDevice_.GetDeviceType()); - auto cameraOrientation = Hold(cameraDevice_.GetCameraOrientation()); + auto cameraOrientation = Hold(cameraDevice_.GetStaticCameraOrientation()); auto isRetractable = Hold(cameraDevice_.GetisRetractable()); auto lensEquivalentFocalLength = Hold>(cameraDevice_.GetLensEquivalentFocalLength()); return *Hold(CameraNapiObject::CameraNapiObjFieldMap { diff --git a/frameworks/native/camera/base/src/input/camera_device.cpp b/frameworks/native/camera/base/src/input/camera_device.cpp index 699c28dcf..dcc15e837 100644 --- a/frameworks/native/camera/base/src/input/camera_device.cpp +++ b/frameworks/native/camera/base/src/input/camera_device.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "camera_metadata_info.h" #include "camera_log.h" #include "camera_util.h" @@ -191,6 +192,10 @@ void CameraDevice::init(common_metadata_header_t* metadata) isPrelaunch_ = (cameraDeviceRet == CAM_META_SUCCESS && item.data.u8[0] == 1); InitLensEquivalentFocalLength(metadata); + + cameraDeviceRet = Camera::FindCameraMetadataItem(metadata, OHOS_ABILITY_SENSOR_ORIENTATION_VARIABLE, &item); + CHECK_EXECUTE(cameraDeviceRet == CAM_META_SUCCESS, isVariable_ = item.count > 0 && item.data.u8[0]); + InitFoldStateSensorOrientationMap(metadata); MEDIA_INFO_LOG("camera position: %{public}d, camera type: %{public}d, camera connection type: %{public}d, " @@ -230,6 +235,7 @@ void CameraDevice::InitFoldStateSensorOrientationMap(common_metadata_header_t* m MEDIA_INFO_LOG("CameraDevice::InitFoldStateSensorOrientationMap foldStatus: %{public}d, " "orientation:%{public}d", innerFoldState, innerOrientation); } + CHECK_EXECUTE(foldStateSensorOrientationMap_.empty(), isVariable_ = false); } std::string CameraDevice::GetID() @@ -346,7 +352,7 @@ std::string CameraDevice::GetNetWorkId() uint32_t CameraDevice::GetCameraOrientation() { uint32_t cameraOrientation = cameraOrientation_; - if (GetUsePhysicalCameraOrientation()) { + if (GetUsePhysicalCameraOrientation() || isNeedDynamicMeta_ != 0) { uint32_t curFoldStatus; OHOS::Rosen::FoldDisplayMode displayMode = OHOS::Rosen::DisplayManager::GetInstance().GetFoldDisplayMode(); if (displayMode == OHOS::Rosen::FoldDisplayMode::GLOBAL_FULL) { @@ -368,7 +374,19 @@ uint32_t CameraDevice::GetCameraOrientation() uint32_t CameraDevice::GetStaticCameraOrientation() { - return cameraOrientation_; + uint32_t cameraOrientation = cameraOrientation_; + CHECK_RETURN_RET_ILOG(system::GetParameter("const.system.sensor_correction_enable", "0") != "1" || !isVariable_, + cameraOrientation, "CameraDevice::GetStaticCameraOrientation variable orientation is closed"); + sptr deviceObj = nullptr; + int32_t retCode = CameraManager::GetInstance()->CreateCameraDevice(GetID(), &deviceObj); + CHECK_RETURN_RET_ELOG(retCode != CameraErrorCode::SUCCESS, cameraOrientation, + "CameraDevice::GetStaticCameraOrientation CreateCameraDevice Failed"); + int32_t isNeedDynamicMeta = 0; + deviceObj->GetIsNeedDynamicMeta(isNeedDynamicMeta); + isNeedDynamicMeta_ = isNeedDynamicMeta; + CHECK_EXECUTE(isNeedDynamicMeta_ != 0, cameraOrientation = GetCameraOrientation()); + MEDIA_DEBUG_LOG("CameraDevice::GetStaticCameraOrientation cameraOrientation: %{public}d", cameraOrientation); + return cameraOrientation; } bool CameraDevice::GetisRetractable() diff --git a/frameworks/native/camera/base/src/input/camera_input.cpp b/frameworks/native/camera/base/src/input/camera_input.cpp index 16f359e82..6bcc2a76b 100644 --- a/frameworks/native/camera/base/src/input/camera_input.cpp +++ b/frameworks/native/camera/base/src/input/camera_input.cpp @@ -163,6 +163,14 @@ void CameraInput::InitCameraInput() MEDIA_INFO_LOG("CameraInput::InitCameraInput foldStatus: %{public}d, orientation:%{public}d", innerFoldState, innerOrientation); } + + int32_t isNeedDynamicMeta = 0; + CHECK_EXECUTE(isVariable_ && !foldStateSensorOrientationMap_.empty(), + deviceObj->GetIsNeedDynamicMeta(isNeedDynamicMeta)); + CHECK_RETURN_ELOG(isNeedDynamicMeta == 0, "CameraInput::InitCameraInput do not need dynamic orientation"); + SetUsePhysicalCameraOrientation(true); + MEDIA_INFO_LOG("CameraInput::InitCameraInput need dynamic orientation"); + CameraCountingTimer::GetInstance().IncreaseUserCount(); } diff --git a/frameworks/native/camera/base/src/output/preview_output.cpp b/frameworks/native/camera/base/src/output/preview_output.cpp index a5266bd65..7b38131f8 100644 --- a/frameworks/native/camera/base/src/output/preview_output.cpp +++ b/frameworks/native/camera/base/src/output/preview_output.cpp @@ -748,8 +748,9 @@ int32_t PreviewOutput::canSetFrameRateRange(int32_t minFrameRate, int32_t maxFra int32_t PreviewOutput::GetPreviewRotation(int32_t imageRotation) { - MEDIA_INFO_LOG("PreviewOutput GetPreviewRotation is called"); - CHECK_RETURN_RET_ELOG(imageRotation % ROTATION_90_DEGREES != 0, INVALID_ARGUMENT, + MEDIA_INFO_LOG("PreviewOutput GetPreviewRotation is called, imageRotation: %{public}d", imageRotation); + CHECK_RETURN_RET_ELOG(imageRotation < ROTATION_0 || imageRotation > CAPTURE_ROTATION_BASE || + imageRotation % ROTATION_90_DEGREES != 0, INVALID_ARGUMENT, "PreviewOutput GetPreviewRotation error!, invalid argument"); int32_t sensorOrientation = 0; ImageRotation result = ImageRotation::ROTATION_0; @@ -792,8 +793,10 @@ int32_t PreviewOutput::JudegRotationFunc(int32_t imageRotation) int32_t PreviewOutput::SetPreviewRotation(int32_t imageRotation, bool isDisplayLocked) { - MEDIA_INFO_LOG("PreviewOutput SetPreviewRotation is called"); - CHECK_RETURN_RET_ELOG(imageRotation % ROTATION_90_DEGREES != 0, INVALID_ARGUMENT, + MEDIA_INFO_LOG("PreviewOutput SetPreviewRotation is called, imageRotation:%{public}d, isDisplayLocked:%{public}d", + imageRotation, isDisplayLocked); + CHECK_RETURN_RET_ELOG(imageRotation < ROTATION_0 || imageRotation > CAPTURE_ROTATION_BASE || + imageRotation % ROTATION_90_DEGREES != 0, INVALID_ARGUMENT, "PreviewOutput SetPreviewRotation error!, invalid argument"); int32_t sensorOrientation = 0; ImageRotation result = ROTATION_0; diff --git a/frameworks/native/camera/test/unittest/camera_service/hdi_camera_test/src/hcamera_device_unittest.cpp b/frameworks/native/camera/test/unittest/camera_service/hdi_camera_test/src/hcamera_device_unittest.cpp index 12a77d20f..b888d4d0e 100644 --- a/frameworks/native/camera/test/unittest/camera_service/hdi_camera_test/src/hcamera_device_unittest.cpp +++ b/frameworks/native/camera/test/unittest/camera_service/hdi_camera_test/src/hcamera_device_unittest.cpp @@ -1011,5 +1011,28 @@ HWTEST_F(HCameraDeviceUnit, hcamera_device_unittest_037, TestSize.Level0) SetCameraDebugValue(false); EXPECT_EQ(result, CAMERA_INVALID_STATE); } + +/* + * Feature: Framework + * Function: Test GetIsNeedDynamicMeta. + * SubFunction: NA + * FunctionPoints: NA + * EnvConditions: NA + * CaseDescription: Test GetIsNeedDynamicMeta. + */ +HWTEST_F(HCameraDeviceUnit, hcamera_device_unittest_038, TestSize.Level0) +{ + std::vector> cameras = cameraManager_->GetSupportedCameras(); + ASSERT_NE(cameras.size(), 0); + std::string cameraId = cameras[0]->GetID(); + uint32_t callerToken = IPCSkeleton::GetCallingTokenID(); + sptr camDevice = new (std::nothrow) HCameraDevice(cameraHostManager_, cameraId, callerToken); + ASSERT_NE(camDevice, nullptr); + + int32_t isNeedDynamicMeta = 0; + int32_t ret = camDevice->GetIsNeedDynamicMeta(isNeedDynamicMeta); + EXPECT_EQ(ret, CAMERA_OK); + EXPECT_EQ(isNeedDynamicMeta, 0); +} } } \ No newline at end of file diff --git a/frameworks/native/camera/test/unittest/framework_native/input/src/camera_framework_input_unittest.cpp b/frameworks/native/camera/test/unittest/framework_native/input/src/camera_framework_input_unittest.cpp index f13845dee..807e4d8eb 100644 --- a/frameworks/native/camera/test/unittest/framework_native/input/src/camera_framework_input_unittest.cpp +++ b/frameworks/native/camera/test/unittest/framework_native/input/src/camera_framework_input_unittest.cpp @@ -726,6 +726,7 @@ HWTEST_F(CameraFrameworkInputUnit, camera_framework_input_unittest_021, TestSize uint32_t tempCameraOrientation = cameras[0]->cameraOrientation_; cameras[0]->cameraOrientation_ = 1; + cameras[0]->isNeedDynamicMeta_ = 0; EXPECT_EQ(cameras[0]->GetStaticCameraOrientation(), 1); cameras[0]->cameraOrientation_ = tempCameraOrientation; diff --git a/interfaces/inner_api/native/camera/include/input/camera_device.h b/interfaces/inner_api/native/camera/include/input/camera_device.h index 30db67d1a..4d1782515 100644 --- a/interfaces/inner_api/native/camera/include/input/camera_device.h +++ b/interfaces/inner_api/native/camera/include/input/camera_device.h @@ -395,6 +395,8 @@ private: bool isFindModuleTypeTag(uint32_t &tagId); bool isConcurrentDevice_ = false; bool usePhysicalCameraOrientation_ = false; + bool isVariable_ = false; + int32_t isNeedDynamicMeta_ = 0; }; } // namespace CameraStandard } // namespace OHOS diff --git a/services/camera_service/idls/ICameraDeviceService.idl b/services/camera_service/idls/ICameraDeviceService.idl index 98a5cc56a..737930b03 100644 --- a/services/camera_service/idls/ICameraDeviceService.idl +++ b/services/camera_service/idls/ICameraDeviceService.idl @@ -35,4 +35,5 @@ interface ICameraDeviceService { [ipccode 13] void SetDeviceRetryTime(); [ipccode 14] void OpenSecureCamera([out] unsigned long secureSeqId); [ipccode 15] void SetUsePhysicalCameraOrientation([in] boolean isUsed); + [ipccode 16] void GetIsNeedDynamicMeta([out] int isNeedDynamicMeta); } \ No newline at end of file diff --git a/services/camera_service/include/hcamera_device.h b/services/camera_service/include/hcamera_device.h index ecc307a87..adbacaeff 100644 --- a/services/camera_service/include/hcamera_device.h +++ b/services/camera_service/include/hcamera_device.h @@ -193,6 +193,7 @@ public: void UpdateCameraRotateAngle(); void SetCameraRotateStrategyInfos(std::vector infos); bool GetSigleStrategyInfo(CameraRotateStrategyInfo &strategyInfo); + int32_t GetIsNeedDynamicMeta(int32_t &isNeedDynamicMeta) override; int32_t SetUsePhysicalCameraOrientation(bool isUsed) override; bool GetUsePhysicalCameraOrientation(); diff --git a/services/camera_service/include/parser.h b/services/camera_service/include/parser.h index 70038fc05..0b2e70516 100644 --- a/services/camera_service/include/parser.h +++ b/services/camera_service/include/parser.h @@ -23,6 +23,7 @@ struct CameraRotateStrategyInfo { float wideValue; int32_t rotateDegree; int16_t fps; + int32_t isNeedDynamicMeta; }; class Parser { public: diff --git a/services/camera_service/src/hcamera_device.cpp b/services/camera_service/src/hcamera_device.cpp index 8dcf96194..c9a40bec4 100644 --- a/services/camera_service/src/hcamera_device.cpp +++ b/services/camera_service/src/hcamera_device.cpp @@ -1114,6 +1114,7 @@ bool HCameraDevice::GetSigleStrategyInfo(CameraRotateStrategyInfo &strategyInfo) } CHECK_EXECUTE(bundleName_ == "", { int uid = IPCSkeleton::GetCallingUid(); bundleName_ = GetClientBundle(uid);}); + MEDIA_DEBUG_LOG("HCameraDevice::GetSigleStrategyInfo bundleName: %{public}s", bundleName_.c_str()); std::string bundleName = bundleName_; auto it = std::find_if(infos.begin(), infos.end(), [&bundleName](const auto &info) { return info.bundleName == bundleName; @@ -1123,6 +1124,16 @@ bool HCameraDevice::GetSigleStrategyInfo(CameraRotateStrategyInfo &strategyInfo) return true; } +int32_t HCameraDevice::GetIsNeedDynamicMeta(int32_t &isNeedDynamicMeta) +{ + isNeedDynamicMeta = 0; + CameraRotateStrategyInfo strategyInfo; + CHECK_RETURN_RET_ELOG(!GetSigleStrategyInfo(strategyInfo), CAMERA_OK, "HCameraDevice::GetIsNeedDynamicMeta failed"); + isNeedDynamicMeta = strategyInfo.isNeedDynamicMeta; + MEDIA_INFO_LOG("HCameraDevice::GetIsNeedDynamicMeta isNeedDynamicMeta: %{public}d", isNeedDynamicMeta); + return CAMERA_OK; +} + void HCameraDevice::SetCameraRotateStrategyInfos(std::vector infos) { std::lock_guard lock(cameraRotateStrategyInfosLock_); diff --git a/services/camera_service/src/param_update/camera_rotate_param_manager.cpp b/services/camera_service/src/param_update/camera_rotate_param_manager.cpp index a16d45cd4..d2f2f4c7e 100644 --- a/services/camera_service/src/param_update/camera_rotate_param_manager.cpp +++ b/services/camera_service/src/param_update/camera_rotate_param_manager.cpp @@ -45,6 +45,7 @@ const char* XML_CAMERA_BUDLE_NAME = "bundleName"; const char* XML_CAMERA_WIDE_VALUE = "wideValue"; const char* XML_CAMERA_ROTATE_DEGREE = "rotateDegree"; const char* XML_CAMERA_FPS = "fps"; +const char* XML_CAMERA_IS_DYNAMIC = "isNeedDynamicMeta"; } // LCOV_EXCL_START CameraRoateParamManager& CameraRoateParamManager::GetInstance() @@ -242,10 +243,24 @@ void CameraRoateParamManager::ParserStrategyInfo(std::shared_ptr fps = static_cast(result); } info.fps = fps; + + int32_t isNeedDynamicMeta = 0; + curNode->GetProp(XML_CAMERA_IS_DYNAMIC, pValue); + endPtr = nullptr; + result = strtol(pValue.c_str(), &endPtr, DECIMAL); + + if (*endPtr != '\0' || pValue.empty()) { + MEDIA_ERR_LOG("The isNeedDynamicMeta parameter is invalid."); + isNeedDynamicMeta = 0; + } else { + isNeedDynamicMeta = static_cast(result); + } + info.isNeedDynamicMeta = isNeedDynamicMeta; + cameraRotateStrategyInfos_.push_back(info); MEDIA_INFO_LOG("ParserStrategyInfo: bundleName:%{public}s, wideValue:%{public}f, " - "rotateDegree:%{public}d, fps:%{public}d", - info.bundleName.c_str(), info.wideValue, info.rotateDegree, info.fps); + "rotateDegree:%{public}d, fps:%{public}d, isNeedDynamicMeta:%{public}d", + info.bundleName.c_str(), info.wideValue, info.rotateDegree, info.fps, info.isNeedDynamicMeta); } } diff --git a/test/fuzztest/cameradeviceservicestub_fuzzer/camera_device_service_stub_fuzzer.h b/test/fuzztest/cameradeviceservicestub_fuzzer/camera_device_service_stub_fuzzer.h index 641ec5ee1..8c9b47d91 100644 --- a/test/fuzztest/cameradeviceservicestub_fuzzer/camera_device_service_stub_fuzzer.h +++ b/test/fuzztest/cameradeviceservicestub_fuzzer/camera_device_service_stub_fuzzer.h @@ -31,6 +31,10 @@ public: { return 0; } + int32_t GetIsNeedDynamicMeta(int32_t& isNeedDynamicMeta) override + { + return 0; + } int32_t Open(int32_t concurrentType) override { return 0; -- Gitee