From f5604731463f7a72bcfcfe90c147ac4a0536f833 Mon Sep 17 00:00:00 2001 From: chen0088 Date: Fri, 8 Aug 2025 18:22:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=B8=E6=9C=BA=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=AD=BB=E4=BA=A1=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chen0088 --- .../constants/distributed_camera_constants.h | 2 + .../dcamera_source_controller.h | 14 ++++++ .../dcamera_source_controller.cpp | 44 ++++++++++++++++++- .../common/distributedcameramgr/BUILD.gn | 1 + 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/common/include/constants/distributed_camera_constants.h b/common/include/constants/distributed_camera_constants.h index 118bfa85..f86c12b3 100644 --- a/common/include/constants/distributed_camera_constants.h +++ b/common/include/constants/distributed_camera_constants.h @@ -145,6 +145,7 @@ const int32_t DCAMERA_QOS_TYPE_MIN_LATENCY = 2000; const int32_t CAMERA_META_DATA_ITEM_CAPACITY = 10; const int32_t CAMERA_META_DATA_DATA_CAPACITY = 100; const int32_t DCAMERA_UID = 3052; +const int32_t CAMERA_SERVICE_ID = 3008; const uint32_t DCAMERA_SHIFT_32 = 32; const uint32_t DCAMERA_SHIFT_24 = 24; @@ -176,6 +177,7 @@ const std::string BEFORE_DECODE = "SourceBeforeDecode.h265"; const std::string CAMERA_HICOLLIE = "CameraHicollie"; const std::string SEPARATE_SINK_VERSION = "2.0"; const std::string START_CAPTURE_SUCC = "operator start capture success"; +const std::string CAMERA_SERVICE_DIED = "camera service died"; } // namespace DistributedHardware } // namespace OHOS #endif // OHOS_DISTRIBUTED_CAMERA_CONSTANTS_H \ No newline at end of file diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h index 773f794e..134d3d6d 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h @@ -25,6 +25,7 @@ #include "icamera_channel.h" #include "iremote_object.h" #include "device_manager.h" +#include "camera_service_proxy.h" #include "v1_1/id_camera_provider.h" @@ -64,11 +65,22 @@ private: bool GetOsAccountInfo(); int32_t CheckOsType(const std::string &networkId, bool &isInvalid); int32_t ParseValueFromCjson(std::string args, std::string key); + int32_t AddCameraServiceDeathRecipient(); class DCameraHdiRecipient : public IRemoteObject::DeathRecipient { public: void OnRemoteDied(const wptr &remote) override; }; sptr cameraHdiRecipient_; + class CameraServiceRecipient : public IRemoteObject::DeathRecipient { + public: + CameraServiceRecipient(std::shared_ptr sourceContrlPtr); + ~CameraServiceRecipient() override = default; + void OnRemoteDied(const wptr &remote) override; + + private: + std::weak_ptr sourceContrlPtr_; + }; + sptr cameraServiceRecipient_; private: std::string devId_; @@ -81,6 +93,8 @@ private: int32_t channelState_; sptr camHdiProvider_; sptr remote_; + sptr cameraServiceProxy_; + std::shared_ptr controller_; bool isInit; const std::string SESSION_FLAG = "control"; diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp index b045950d..abd2c1b5 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp @@ -335,6 +335,8 @@ int32_t DCameraSourceController::OpenChannel(std::shared_ptr& o DHLOGE("OpenChannel not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } + CHECK_AND_RETURN_RET_LOG(AddCameraServiceDeathRecipient() != DCAMERA_OK, DCAMERA_BAD_VALUE, + "AddCameraServiceDeathRecipient failed"); std::string dhId = indexs_.begin()->dhId_; std::string devId = indexs_.begin()->devId_; DHLOGI("DCameraSourceController OpenChannel Start, devId: %{public}s, dhId: %{public}s", @@ -465,6 +467,10 @@ int32_t DCameraSourceController::CloseChannel() DHLOGE("CloseChannel not support operate %{public}zu camera", indexs_.size()); return DCAMERA_BAD_OPERATE; } + if (cameraServiceProxy_ != nullptr && cameraServiceProxy_->AsObject() != nullptr) { + (void)cameraServiceProxy_->AsObject()->RemoveDeathRecipient(cameraServiceRecipient_); + } + cameraServiceRecipient_ = nullptr; DCameraLowLatency::GetInstance().DisableLowLatency(); DCameraSoftbusLatency::GetInstance().StopSoftbusTimeSync(devId_); std::string dhId = indexs_.begin()->dhId_; @@ -516,8 +522,8 @@ int32_t DCameraSourceController::Init(std::vector& indexs) indexs_.assign(indexs.begin(), indexs.end()); std::string dhId = indexs_.begin()->dhId_; std::string devId = indexs_.begin()->devId_; - auto controller = std::shared_ptr(shared_from_this()); - listener_ = std::make_shared(controller); + controller_ = std::shared_ptr(shared_from_this()); + listener_ = std::make_shared(controller_); channel_ = std::make_shared(); DHLOGI("DCameraSourceController Init GetProvider end devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); @@ -688,6 +694,40 @@ void DCameraSourceController::DCameraHdiRecipient::OnRemoteDied(const wptr(new CameraServiceRecipient(controller_)); + auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + CHECK_AND_RETURN_RET_LOG(samgr == nullptr, DCAMERA_BAD_VALUE, "GetSystemAbilityManager failed."); + auto object = samgr->CheckSystemAbility(CAMERA_SERVICE_ID); + CHECK_AND_RETURN_RET_LOG(object == nullptr, DCAMERA_BAD_VALUE, + "CheckSystemAbility %{public}d failed.", CAMERA_SERVICE_ID); + cameraServiceProxy_ = iface_cast(object); + CHECK_AND_RETURN_RET_LOG(cameraServiceProxy_ == nullptr, DCAMERA_BAD_VALUE, "Get ICameraService failed."); + auto remoteObj = cameraServiceProxy_->AsObject(); + CHECK_AND_RETURN_RET_LOG(remoteObj == nullptr, DCAMERA_BAD_VALUE, "Get remote object failed."); + remoteObj->AddDeathRecipient(cameraServiceRecipient_); + return DCAMERA_OK; +} + +DCameraSourceController::CameraServiceRecipient::CameraServiceRecipient( + std::shared_ptr sourceContrlPtr) : sourceContrlPtr_(sourceContrlPtr) +{ + DHLOGI("Ctor CameraServiceRecipient()"); +} + +void DCameraSourceController::CameraServiceRecipient::OnRemoteDied(const wptr &remote) +{ + DHLOGE("CameraService died, Exit the current process."); + std::shared_ptr events = std::make_shared(); + events->eventType_ = DCAMERA_MESSAGE; + events->eventResult_ = DCAMERA_EVENT_DEVICE_ERROR; + events->eventContent_ = CAMERA_SERVICE_DIED; + auto sourceContrl = sourceContrlPtr_.lock(); + CHECK_AND_RETURN_LOG(sourceContrl == nullptr, "sourceContrl is nullptr."); + sourceContrl->DCameraNotify(events); +} + void DCameraSourceController::SetTokenId(uint64_t token) { tokenId_ = token; diff --git a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn index 4260a0ce..c95f7aff 100644 --- a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn +++ b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn @@ -87,6 +87,7 @@ ohos_unittest("DCameraSourceMgrTest") { "access_token:libtokensetproc_shared", "cJSON:cjson", "c_utils:utils", + "camera_framework:camera_framework", "device_manager:devicemanagersdk", "distributed_hardware_fwk:distributedhardwareutils", "drivers_interface_distributed_camera:libdistributed_camera_provider_proxy_1.1", -- Gitee