fix distributed camera bug

Signed-off-by: zhuxu <zhuxu29@huawei.com>
This commit is contained in:
zhuxu
2022-03-28 20:55:07 +08:00
parent 47480c7402
commit 7746d3cff9
3 changed files with 50 additions and 26 deletions
@@ -66,6 +66,7 @@ private:
bool isInit_;
int32_t sessionState_;
std::mutex autoLock_;
std::mutex captureLock_;
std::mutex channelLock_;
std::string dhId_;
@@ -15,6 +15,8 @@
#include "dcamera_sink_controller.h"
#include <thread>
#include "anonymous_string.h"
#include "dcamera_channel_sink_impl.h"
#include "dcamera_client.h"
@@ -71,8 +73,8 @@ int32_t DCameraSinkController::StartCapture(std::vector<std::shared_ptr<DCameraC
int32_t DCameraSinkController::StopCapture()
{
std::lock_guard<std::mutex> autoLock(captureLock_);
DHLOGI("DCameraSinkController::StopCapture dhId: %s", GetAnonyString(dhId_).c_str());
std::lock_guard<std::mutex> 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<DCameraOpenInfo>& ope
int32_t DCameraSinkController::CloseChannel()
{
std::lock_guard<std::mutex> autoLock(channelLock_);
DHLOGI("DCameraSinkController::CloseChannel dhId: %s", GetAnonyString(dhId_).c_str());
std::lock_guard<std::mutex> autoLock(channelLock_);
DCameraSinkServiceIpc::GetInstance().DeleteSourceRemoteDhms(srcDevId_);
srcDevId_.clear();
int32_t ret = channel_->ReleaseSession();
@@ -259,8 +261,19 @@ int32_t DCameraSinkController::Init(std::vector<DCameraIndex>& indexs)
int32_t DCameraSinkController::UnInit()
{
DHLOGI("DCameraSinkController::UnInit dhId: %s", GetAnonyString(dhId_).c_str());
std::lock_guard<std::mutex> 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<std::mutex> 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<std::shared_ptr<DCamer
int32_t DCameraSinkController::StartCaptureInner(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
{
std::lock_guard<std::mutex> autoLock(captureLock_);
DHLOGI("DCameraSinkController::StartCaptureInner dhId: %s", GetAnonyString(dhId_).c_str());
std::lock_guard<std::mutex> autoLock(captureLock_);
int32_t ret = output_->StartCapture(captureInfos);
if (ret != DCAMERA_OK) {
DHLOGE("DCameraSinkController::StartCaptureInner output start capture failed, dhId: %s, ret: %d",
@@ -152,20 +152,25 @@ int32_t DCameraSinkOutput::StartCapture(std::vector<std::shared_ptr<DCameraCaptu
int32_t DCameraSinkOutput::StopCapture()
{
DHLOGI("DCameraSinkOutput::StopCapture dhId: %s", GetAnonyString(dhId_).c_str());
int32_t ret = dataProcesses_[CONTINUOUS_FRAME]->StopCapture();
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;
}