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 3b4ce3fb2e204bbf4544b2c4360123cf220511dc..4259013f1ac47e92d20248d899336cbd9aa4fefd 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 699c28dcf2cede2f8966b1e901e3174861e40e9d..dcc15e837912f37e763a2de73e0528a6941dc70e 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 16f359e82550c22275837e9e5b509041386982a0..6bcc2a76b5e96732c8132efb1c33900c9e9904bd 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 a5266bd65a6897c08b48593f2b1b05e9551f69fe..7b38131f8d245a38fd86e1d6efcf52193e4b2c19 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 12a77d20fab8609974ecedbf1453c4080271fedc..b888d4d0e770f442a451a512b4e9c6b0ead552d2 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 f13845deeca36f7016cd57e86d4629f27c290adf..807e4d8eb8c8741e6bf128065cad9945adfc7e45 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 30db67d1aa3bf89024983268bdd6d39169d0777c..4d178251596edc2b718fb45aca9086a445091211 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 98a5cc56a4ab04600a5d23aab0593267bf25a4e0..737930b03cea2783d9990811dd200da61a16cb15 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 ecc307a877c927c2dde2ede870bf30c0d9438a7f..adbacaeff307daff509a4abcf3a078f3d3abf26f 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 70038fc05d521c9d9fcd6f539051362edbcea51a..0b2e70516243854b8f525c14e06dcf75d4bc9e13 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 8dcf96194a476a5ff24388a613671d36dde2fe95..c9a40bec4550f6bd650a81168c6949c548083b76 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 a16d45cd4189ef05ed56674b3b4afc8b11129095..d2f2f4c7e21e7fdf53816c0a07dc290805fee825 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 641ec5ee1e301ab7496a3c96b1dde8cfc4de8e0f..8c9b47d9172a16ec2452b2b598b90fb0479ceb63 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;