diff --git a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h index 1de1b4f2881eaac6026cef1cc97842cc165ee112..6b759e6f80a0ba39828e37622052d99d18ca3fce 100644 --- a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h +++ b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h @@ -66,6 +66,7 @@ private: bool isInit_; int32_t sessionState_; + std::mutex autoLock_; std::mutex captureLock_; std::mutex channelLock_; std::string dhId_; diff --git a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp index 40e3388a8f41f30fe54fc856cbc839877ed7a134..ee990d6e5c44b4078ced89314de47b1115cf688e 100644 --- a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp +++ b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp @@ -15,6 +15,8 @@ #include "dcamera_sink_controller.h" +#include + #include "anonymous_string.h" #include "dcamera_channel_sink_impl.h" #include "dcamera_client.h" @@ -71,8 +73,8 @@ int32_t DCameraSinkController::StartCapture(std::vector autoLock(captureLock_); DHLOGI("DCameraSinkController::StopCapture dhId: %s", GetAnonyString(dhId_).c_str()); + std::lock_guard autoLock(captureLock_); int32_t ret = operator_->StopCapture(); if (ret != DCAMERA_OK) { DHLOGE("DCameraSinkController::StopCapture client stop capture failed, dhId: %s, ret: %d", @@ -201,8 +203,8 @@ int32_t DCameraSinkController::OpenChannel(std::shared_ptr& ope int32_t DCameraSinkController::CloseChannel() { - std::lock_guard autoLock(channelLock_); DHLOGI("DCameraSinkController::CloseChannel dhId: %s", GetAnonyString(dhId_).c_str()); + std::lock_guard autoLock(channelLock_); DCameraSinkServiceIpc::GetInstance().DeleteSourceRemoteDhms(srcDevId_); srcDevId_.clear(); int32_t ret = channel_->ReleaseSession(); @@ -259,8 +261,19 @@ int32_t DCameraSinkController::Init(std::vector& indexs) int32_t DCameraSinkController::UnInit() { DHLOGI("DCameraSinkController::UnInit dhId: %s", GetAnonyString(dhId_).c_str()); + std::lock_guard autoLock(autoLock_); + int32_t ret = StopCapture(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController::UnInit %s stop capture failed, ret: %d", GetAnonyString(dhId_).c_str(), ret); + } + + ret = CloseChannel(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController::UnInit %s close channel failed, ret: %d", GetAnonyString(dhId_).c_str(), ret); + } + if (output_ != nullptr) { - int32_t ret = output_->UnInit(); + ret = output_->UnInit(); if (ret != DCAMERA_OK) { DHLOGE("DCameraSinkController release output failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret); @@ -268,7 +281,7 @@ int32_t DCameraSinkController::UnInit() } if (operator_ != nullptr) { - int32_t ret = operator_->UnInit(); + ret = operator_->UnInit(); if (ret != DCAMERA_OK) { DHLOGE("DCameraSinkController release operator failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret); @@ -319,16 +332,21 @@ void DCameraSinkController::OnSessionState(int32_t state) } case DCAMERA_CHANNEL_STATE_DISCONNECTED: { DHLOGI("DCameraSinkController::OnSessionState channel is disconnected"); - int32_t ret = StopCapture(); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSinkController::OnSessionState session state: %d, %s stop capture failed, ret: %d", - sessionState_, GetAnonyString(dhId_).c_str(), ret); - } - ret = CloseChannel(); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSinkController::OnSessionState session state: %d, %s close channel failed, ret: %d", - sessionState_, GetAnonyString(dhId_).c_str(), ret); - } + std::thread([this]() { + DHLOGI("DCameraSinkController::OnSessionState %s new thread session state: %d", + GetAnonyString(dhId_).c_str(), sessionState_); + std::lock_guard autoLock(autoLock_); + int32_t ret = StopCapture(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController::OnSessionState session state: %d, %s stop capture failed, ret: %d", + sessionState_, GetAnonyString(dhId_).c_str(), ret); + } + ret = CloseChannel(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController::OnSessionState session state: %d, %s close channel failed, ret: %d", + sessionState_, GetAnonyString(dhId_).c_str(), ret); + } + }).detach(); break; } default: { @@ -363,8 +381,8 @@ void DCameraSinkController::PostAuthorization(std::vector>& captureInfos) { - std::lock_guard autoLock(captureLock_); DHLOGI("DCameraSinkController::StartCaptureInner dhId: %s", GetAnonyString(dhId_).c_str()); + std::lock_guard autoLock(captureLock_); int32_t ret = output_->StartCapture(captureInfos); if (ret != DCAMERA_OK) { DHLOGE("DCameraSinkController::StartCaptureInner output start capture failed, dhId: %s, ret: %d", diff --git a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_output.cpp b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_output.cpp index 7397bb8d54e7b8f528a7421ea7af1293c9d382a4..626679167634149bcdc2bab75fc26c41085ffd9f 100644 --- a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_output.cpp +++ b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_output.cpp @@ -152,20 +152,25 @@ int32_t DCameraSinkOutput::StartCapture(std::vectorStopCapture(); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSinkOutput::StopCapture continuous data process stop capture failed, dhId: %s, ret: %d", - GetAnonyString(dhId_).c_str(), ret); - return ret; + auto iterCon = dataProcesses_.find(CONTINUOUS_FRAME); + if (iterCon != dataProcesses_.end()) { + DHLOGI("DCameraSinkOutput::StopCapture %s continuous frame stop capture", GetAnonyString(dhId_).c_str()); + int32_t ret = iterCon->second->StopCapture(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkOutput::StopCapture continuous data process stop capture failed, dhId: %s, ret: %d", + GetAnonyString(dhId_).c_str(), ret); + } } - ret = dataProcesses_[SNAPSHOT_FRAME]->StopCapture(); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSinkOutput::StopCapture snapshot data process stop capture failed, dhId: %s, ret: %d", - GetAnonyString(dhId_).c_str(), ret); - return ret; + auto iterSnap = dataProcesses_.find(SNAPSHOT_FRAME); + if (iterSnap != dataProcesses_.end()) { + DHLOGI("DCameraSinkOutput::StopCapture %s snapshot frame stop capture", GetAnonyString(dhId_).c_str()); + int32_t ret = iterSnap->second->StopCapture(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkOutput::StopCapture snapshot data process stop capture failed, dhId: %s, ret: %d", + GetAnonyString(dhId_).c_str(), ret); + } } - DHLOGI("DCameraSinkOutput::StopCapture %s success", GetAnonyString(dhId_).c_str()); return DCAMERA_OK; } diff --git a/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp b/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp index 4eff7096879ad4fec58e95a3a95d9cb049a19746..0913e392a95c6f0413c2bfaccd84dbed4dc0928b 100644 --- a/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp +++ b/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp @@ -52,7 +52,7 @@ int32_t DCameraServiceStateListener::OnRegisterNotify(const std::string& devId, DHLOGE("DCameraServiceStateListener OnRegisterNotify OnNotifyRegResult failed: %d", ret); } if (status != DCAMERA_OK) { - std::thread([this, &devId, &dhId]() { + std::thread([this, devId, dhId]() { DHLOGI("DCameraServiceStateListener OnRegisterNotify thread delete devId: %s dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); DCameraIndex camIndex(devId, dhId); @@ -78,7 +78,7 @@ int32_t DCameraServiceStateListener::OnUnregisterNotify(const std::string& devId } if (status == DCAMERA_OK) { - std::thread([this, &devId, &dhId]() { + std::thread([this, devId, dhId]() { DHLOGI("DCameraServiceStateListener OnUnregisterNotify thread delete devId: %s dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); DCameraIndex camIndex(devId, dhId);