From df9464058611498e5dee941f179992807d419886 Mon Sep 17 00:00:00 2001 From: zhuxu Date: Wed, 25 May 2022 16:05:27 +0800 Subject: [PATCH 1/2] fix distributed camera bug Signed-off-by: zhuxu --- .../dcameradata/dcamera_source_data_process.h | 2 + .../dcamera_stream_data_process_producer.h | 2 +- .../dcamera_source_data_process.cpp | 2 + .../dcamera_stream_data_process.cpp | 66 ++++++++++--------- .../dcamera_stream_data_process_producer.cpp | 8 +-- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_data_process.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_data_process.h index d5c53cff..e4668866 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_data_process.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_data_process.h @@ -16,6 +16,7 @@ #ifndef OHOS_DCAMERA_SOURCE_DATRA_PROCESS_H #define OHOS_DCAMERA_SOURCE_DATRA_PROCESS_H +#include #include #include @@ -40,6 +41,7 @@ public: void GetAllStreamIds(std::vector& streamIds) override; private: + std::mutex streamMutex_; std::vector> streamProcess_; std::set streamIds_; std::string devId_; diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.h index 116638d4..a2dbc0b1 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.h @@ -55,7 +55,7 @@ private: std::thread producerThread_; std::condition_variable producerCon_; - std::mutex producerMutex_; + std::mutex bufferMutex_; std::queue> buffers_; DCameraProducerState state_; uint32_t interval_; diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_data_process.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_data_process.cpp index 04d483d1..22397dd8 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_data_process.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_data_process.cpp @@ -48,6 +48,7 @@ int32_t DCameraSourceDataProcess::FeedStream(std::vectorSize()); + std::lock_guard autoLock(streamMutex_); for (auto iter = streamProcess_.begin(); iter != streamProcess_.end(); iter++) { (*iter)->FeedStream(buffer); } @@ -102,6 +103,7 @@ int32_t DCameraSourceDataProcess::ReleaseStreams(std::vector& streamIds { DHLOGI("DCameraSourceDataProcess ReleaseStreams devId %s dhId %s streamType: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_); + std::lock_guard autoLock(streamMutex_); std::set streamIdSet(streamIds.begin(), streamIds.end()); auto iter = streamProcess_.begin(); while (iter != streamProcess_.end()) { diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp index ace5b3ec..5175b85c 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp @@ -101,27 +101,29 @@ void DCameraStreamDataProcess::StartCapture(std::shared_ptr srcConfig->width_, srcConfig->height_, srcConfig->format_, srcConfig->dataspace_, srcConfig->type_, srcConfig->encodeType_); } - std::lock_guard autoLock(producerMutex_); srcConfig_ = srcConfig; if (streamType_ == CONTINUOUS_FRAME) { CreatePipeline(); } - for (auto iter = streamIds_.begin(); iter != streamIds_.end(); iter++) { - uint32_t streamId = *iter; - if (streamIds.find(streamId) == streamIds.end()) { - continue; - } + { + std::lock_guard autoLock(producerMutex_); + for (auto iter = streamIds_.begin(); iter != streamIds_.end(); iter++) { + uint32_t streamId = *iter; + if (streamIds.find(streamId) == streamIds.end()) { + continue; + } - DHLOGI("DCameraStreamDataProcess StartCapture findProducer devId %s dhId %s streamType: %d streamId: %d", - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); - auto producerIter = producers_.find(streamId); - if (producerIter != producers_.end()) { - continue; + DHLOGI("DCameraStreamDataProcess StartCapture findProducer devId %s dhId %s streamType: %d streamId: %d", + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); + auto producerIter = producers_.find(streamId); + if (producerIter != producers_.end()) { + continue; + } + DHLOGI("DCameraStreamDataProcess StartCapture CreateProducer devId %s dhId %s streamType: %d streamId: %d", + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); + producers_[streamId] = std::make_shared(devId_, dhId_, streamId, streamType_); + producers_[streamId]->Start(); } - DHLOGI("DCameraStreamDataProcess StartCapture CreateProducer devId %s dhId %s streamType: %d streamId: %d", - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); - producers_[streamId] = std::make_shared(devId_, dhId_, streamId, streamType_); - producers_[streamId]->Start(); } } @@ -131,25 +133,27 @@ void DCameraStreamDataProcess::StopCapture(std::set& streamIds) DHLOGI("DCameraStreamDataProcess StopCapture devId %s dhId %s streamType: %d streamId: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, *iter); } - std::lock_guard autoLock(producerMutex_); - for (auto iter = streamIds_.begin(); iter != streamIds_.end(); iter++) { - uint32_t streamId = *iter; - if (streamIds.find(streamId) == streamIds.end()) { - continue; - } + { + std::lock_guard autoLock(producerMutex_); + for (auto iter = streamIds_.begin(); iter != streamIds_.end(); iter++) { + uint32_t streamId = *iter; + if (streamIds.find(streamId) == streamIds.end()) { + continue; + } - DHLOGI("DCameraStreamDataProcess StopCapture findProducer devId %s dhId %s streamType: %d streamId: %d", - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); - auto producerIter = producers_.find(streamId); - if (producerIter == producers_.end()) { - DHLOGE("DCameraStreamDataProcess StopCapture no producer, devId %s dhId %s streamType: %d streamId: %d", + DHLOGI("DCameraStreamDataProcess StopCapture findProducer devId %s dhId %s streamType: %d streamId: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); - continue; + auto producerIter = producers_.find(streamId); + if (producerIter == producers_.end()) { + DHLOGE("DCameraStreamDataProcess StopCapture no producer, devId %s dhId %s streamType: %d streamId: %d", + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); + continue; + } + DHLOGI("DCameraStreamDataProcess StopCapture stop producer, devId %s dhId %s streamType: %d streamId: %d", + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); + producerIter->second->Stop(); + producerIter = producers_.erase(producerIter); } - DHLOGI("DCameraStreamDataProcess StopCapture stop producer, devId %s dhId %s streamType: %d streamId: %d", - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); - producerIter->second->Stop(); - producerIter = producers_.erase(producerIter); } if (streamType_ == CONTINUOUS_FRAME && producers_.empty()) { DestroyPipeline(); diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.cpp index bd611bc8..18253e85 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process_producer.cpp @@ -75,7 +75,7 @@ void DCameraStreamDataProcessProducer::FeedStream(const std::shared_ptrSize()); - std::unique_lock lock(producerMutex_); + std::unique_lock lock(bufferMutex_); if (buffers_.size() >= DCAMERA_PRODUCER_MAX_BUFFER_SIZE) { DHLOGD("DCameraStreamDataProcessProducer FeedStream OverSize devId %s dhId %s streamType: %d streamSize: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, buffer->Size()); @@ -98,7 +98,7 @@ void DCameraStreamDataProcessProducer::LooperContinue() while (state_ == DCAMERA_PRODUCER_STATE_START) { std::shared_ptr buffer = nullptr; { - std::unique_lock lock(producerMutex_); + std::unique_lock lock(bufferMutex_); producerCon_.wait_for(lock, std::chrono::milliseconds(interval_), [this] { return (this->state_ == DCAMERA_PRODUCER_STATE_STOP); }); @@ -141,7 +141,7 @@ void DCameraStreamDataProcessProducer::LooperSnapShot() while (state_ == DCAMERA_PRODUCER_STATE_START) { std::shared_ptr buffer = nullptr; { - std::unique_lock lock(producerMutex_); + std::unique_lock lock(bufferMutex_); producerCon_.wait(lock, [this] { return (!buffers_.empty() || state_ == DCAMERA_PRODUCER_STATE_STOP); }); @@ -167,7 +167,7 @@ void DCameraStreamDataProcessProducer::LooperSnapShot() continue; } { - std::unique_lock lock(producerMutex_); + std::unique_lock lock(bufferMutex_); buffers_.pop(); } } -- Gitee From fd6262658b6e2ec0ce83738bf47638cb80efb085 Mon Sep 17 00:00:00 2001 From: zhuxu Date: Wed, 25 May 2022 16:15:45 +0800 Subject: [PATCH 2/2] fix distributed camera bug Signed-off-by: zhuxu --- .../dcameradata/dcamera_stream_data_process.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp index 5175b85c..70fb4d65 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_stream_data_process.cpp @@ -121,7 +121,8 @@ void DCameraStreamDataProcess::StartCapture(std::shared_ptr } DHLOGI("DCameraStreamDataProcess StartCapture CreateProducer devId %s dhId %s streamType: %d streamId: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId); - producers_[streamId] = std::make_shared(devId_, dhId_, streamId, streamType_); + producers_[streamId] = + std::make_shared(devId_, dhId_, streamId, streamType_); producers_[streamId]->Start(); } } -- Gitee