From 1e6b3c19b15ec83b16776e19feaf0833b58ff552 Mon Sep 17 00:00:00 2001 From: liutingtao <14856758+liutingtao@user.noreply.gitee.com> Date: Wed, 10 Sep 2025 10:52:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E7=9B=B8=E6=9C=BA=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: If3ed98f9c3198a6dca657e50d2e77f256fec56e8 Signed-off-by: liutingtao <154799741@qq.com> --- .../include/metadata_controller.h | 6 ++ .../src/metadata_controller.cpp | 30 +++++++++ .../v4l2/include/camera_host/hcs_deal.h | 4 ++ .../v4l2/src/camera_host/hcs_deal.cpp | 63 +++++++++++++++++++ 4 files changed, 103 insertions(+) diff --git a/camera/vdi_base/common/metadata_manager/include/metadata_controller.h b/camera/vdi_base/common/metadata_manager/include/metadata_controller.h index 69467a7e9d..1072604e38 100644 --- a/camera/vdi_base/common/metadata_manager/include/metadata_controller.h +++ b/camera/vdi_base/common/metadata_manager/include/metadata_controller.h @@ -45,6 +45,9 @@ public: void Start(); void Stop(); bool IsMute(); +#ifdef V4L2_EMULATOR + int32_t GetRotateAngle(); +#endif private: MetadataController(); @@ -87,6 +90,9 @@ private: std::thread *notifyChangedMetadata_ = nullptr; bool isInit_ = false; bool isMute_ = false; +#ifdef V4L2_EMULATOR + int32_t rotateAngle_ = 0; +#endif }; } // namespace Camera } // namespace OHOS diff --git a/camera/vdi_base/common/metadata_manager/src/metadata_controller.cpp b/camera/vdi_base/common/metadata_manager/src/metadata_controller.cpp index c5bcc18356..c81851a857 100644 --- a/camera/vdi_base/common/metadata_manager/src/metadata_controller.cpp +++ b/camera/vdi_base/common/metadata_manager/src/metadata_controller.cpp @@ -36,6 +36,9 @@ const std::vector DATA_BASE = { OHOS_CONTROL_VIDEO_STABILIZATION_MODE, OHOS_CONTROL_FOCUS_STATE, OHOS_CONTROL_EXPOSURE_STATE, +#ifdef V4L2_EMULATOR + OHOS_CONTROL_ROTATE_ANGLE, +#endif }; MetadataController::MetadataController() {} @@ -179,10 +182,37 @@ bool MetadataController::IsMute() return isMute_; } +#ifdef V4L2_EMULATOR +static int32_t UpdateRotateAngle(const std::shared_ptr& metadata, int32_t oldAngle) +{ + int32_t newAngle = oldAngle; + common_metadata_header_t *data = metadata->get(); + camera_metadata_item_t entry; + int ret = FindCameraMetadataItem(data, OHOS_CONTROL_ROTATE_ANGLE, &entry); + if (ret == 0) { + if (entry.count == 1) { + newAngle = *entry.data.i32; + CAMERA_LOGI("update rotate angle, %{public}d -> %{public}d", oldAngle, newAngle); + } else { + CAMERA_LOGE("OHOS_CONTROL_ROTATE_ANGLE tag, size error %{public}d", entry.count); + } + } + return newAngle; +} + +int32_t MetadataController::GetRotateAngle() +{ + return rotateAngle_; +} +#endif + bool MetadataController::UpdateSettingsConfig(const std::shared_ptr &meta) { bool result = false; isMute_ = UpdateMuteMode(meta, isMute_); +#ifdef V4L2_EMULATOR + rotateAngle_ = UpdateRotateAngle(meta, rotateAngle_); +#endif int32_t streamId = GetStreamId(meta); if (streamId < 0) { CAMERA_LOGE("streamId is invalid %{public}d", streamId); diff --git a/camera/vdi_base/v4l2/include/camera_host/hcs_deal.h b/camera/vdi_base/v4l2/include/camera_host/hcs_deal.h index 6e92507190..e301428151 100644 --- a/camera/vdi_base/v4l2/include/camera_host/hcs_deal.h +++ b/camera/vdi_base/v4l2/include/camera_host/hcs_deal.h @@ -112,6 +112,10 @@ private: const struct DeviceResourceNode &metadataNode, std::shared_ptr &metadata); RetCode DealCameraFoldScreenType( const struct DeviceResourceNode &metadataNode, std::shared_ptr &metadata); + RetCode DealSensorOrientationVariable( + const struct DeviceResourceNode &metadataNode, std::shared_ptr &metadata); + RetCode DealFoldStateSensorOrientationMap( + const struct DeviceResourceNode &metadataNode, std::shared_ptr &metadata); #endif private: diff --git a/camera/vdi_base/v4l2/src/camera_host/hcs_deal.cpp b/camera/vdi_base/v4l2/src/camera_host/hcs_deal.cpp index c53e4041ed..35ae774d6d 100644 --- a/camera/vdi_base/v4l2/src/camera_host/hcs_deal.cpp +++ b/camera/vdi_base/v4l2/src/camera_host/hcs_deal.cpp @@ -187,6 +187,8 @@ RetCode HcsDeal::DealMetadata(const std::string &cameraId, const struct DeviceRe #ifdef V4L2_EMULATOR DealCameraFoldStatus(node, metadata); DealCameraFoldScreenType(node, metadata); + DealSensorOrientationVariable(node, metadata); + DealFoldStateSensorOrientationMap(node, metadata); #endif cameraMetadataMap_.insert(std::make_pair(cameraId, metadata)); return RC_OK; @@ -1050,5 +1052,66 @@ RetCode HcsDeal::DealCameraFoldScreenType( CAMERA_LOGI("cameraFoldScreenType add success"); return RC_OK; } + +RetCode HcsDeal::DealSensorOrientationVariable( + const struct DeviceResourceNode &metadataNode, std::shared_ptr &metadata) +{ + const char *nodeValue = nullptr; + int32_t sensorOrientationVariable; + + int32_t rc = pDevResIns->GetString(&metadataNode, "sensorOrientationVariable", &nodeValue, nullptr); + if (rc != 0 || (nodeValue == nullptr)) { + CAMERA_LOGE("get sensorOrientationVariable failed"); + return RC_ERROR; + } + + sensorOrientationVariable = (int32_t)strtol(nodeValue, NULL, STRTOL_BASE); + CAMERA_LOGI("sensorOrientationVariable = %{public}d", sensorOrientationVariable); + + constexpr uint32_t DATA_COUNT = 1; + bool ret = metadata->addEntry(OHOS_ABILITY_SENSOR_ORIENTATION_VARIABLE, + static_cast(&sensorOrientationVariable), DATA_COUNT); + if (!ret) { + CAMERA_LOGE("sensorOrientationVariable add failed"); + return RC_ERROR; + } + CAMERA_LOGI("sensorOrientationVariable add success"); + return RC_OK; +} + +RetCode HcsDeal::DealFoldStateSensorOrientationMap( + const struct DeviceResourceNode &metadataNode, std::shared_ptr &metadata) +{ + int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "foldStateSensorOrientationMap"); + CAMERA_LOGD("elemNum = %{public}d", elemNum); + if (elemNum <= 0) { + CAMERA_LOGD("elemNum <= 0"); + return RC_ERROR; + } + + int hcbRet; + uint32_t nodeValue; + std::vector foldStateSensorOrientationMapInt32s; + + for (int i = 0; i < elemNum; i++) { + hcbRet = pDevResIns->GetUint32ArrayElem(&metadataNode, "foldStateSensorOrientationMap", i, &nodeValue, -1); + if (hcbRet != 0 && nodeValue != UINT32_MAX) { + CAMERA_LOGE("get foldStateSensorOrientationMap failed"); + continue; + } + foldStateSensorOrientationMapInt32s.push_back(static_cast(nodeValue)); + CAMERA_LOGD("nodeValue = %{public}u", nodeValue); + } + + bool ret = metadata->addEntry(OHOS_FOLD_STATE_SENSOR_ORIENTATION_MAP, + foldStateSensorOrientationMapInt32s.data(), foldStateSensorOrientationMapInt32s.size()); + if (!ret) { + CAMERA_LOGD("foldStateSensorOrientationMap add failed"); + return RC_ERROR; + } + CAMERA_LOGI("foldStateSensorOrientationMap add success"); + return RC_OK; +} + #endif } // namespace OHOS::Camera -- Gitee