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 69467a7e9d170c9c4fd3c45b881779e8d931a2aa..1072604e385657929f466b908722e64869435993 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 c5bcc1835655b1f5f71c1c55b6d151251707fb2a..c81851a857c317c0aea1974c7018dec6da641b86 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 6e9250719097a6cfe663f501faa819af6b6e473e..e3014281516cdcbbfc75359322285cdf97beef3a 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 c53e4041ed5b5a492282985c7db0752fe29a710a..35ae774d6d77267c7d717682d804fb55c03ef265 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