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 a2dbc0b1cb9f3ca5e63e891a3feb427058e2a804..529d670dc7fade3304c149402e79c31d190ee3ac 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 @@ -42,6 +42,7 @@ public: void UpdateInterval(uint32_t fps); private: + void StartEvent(); void LooperContinue(); void LooperSnapShot(); int32_t FeedStreamToDriver(const std::shared_ptr& dhBase, const std::shared_ptr& buffer); @@ -53,9 +54,12 @@ private: std::string devId_; std::string dhId_; + std::thread eventThread_; std::thread producerThread_; + std::condition_variable eventCon_; std::condition_variable producerCon_; std::mutex bufferMutex_; + std::mutex eventMutex_; std::queue> buffers_; DCameraProducerState state_; uint32_t interval_; 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 18253e85c368c85155490815821d4b40147e0d1f..cf9e50bb42ca049cb60ed071d3bc0c97cc3f3de8 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 @@ -27,7 +27,7 @@ namespace OHOS { namespace DistributedHardware { DCameraStreamDataProcessProducer::DCameraStreamDataProcessProducer(std::string devId, std::string dhId, int32_t streamId, DCStreamType streamType) - : devId_(devId), dhId_(dhId), streamId_(streamId), streamType_(streamType) + : devId_(devId), dhId_(dhId), streamId_(streamId), streamType_(streamType), eventHandler_(nullptr) { DHLOGI("DCameraStreamDataProcessProducer Constructor devId %s dhId %s streamType: %d streamId: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId_); @@ -50,10 +50,12 @@ void DCameraStreamDataProcessProducer::Start() GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId_); state_ = DCAMERA_PRODUCER_STATE_START; if (streamType_ == CONTINUOUS_FRAME) { + eventThread_ = std::thread(&DCameraStreamDataProcessProducer::StartEvent, this); + std::unique_lock lock(eventMutex_); + eventCon_.wait(lock, [this] { + return eventHandler_ != nullptr; + }); producerThread_ = std::thread(&DCameraStreamDataProcessProducer::LooperContinue, this); - std::string threadName = "DCameraProducer_" + std::to_string(streamType_) + "_" + std::to_string(streamId_); - auto runner = AppExecFwk::EventRunner::Create(threadName); - eventHandler_ = std::make_shared(runner); } else { producerThread_ = std::thread(&DCameraStreamDataProcessProducer::LooperSnapShot, this); } @@ -66,7 +68,11 @@ void DCameraStreamDataProcessProducer::Stop() state_ = DCAMERA_PRODUCER_STATE_STOP; producerCon_.notify_one(); producerThread_.join(); - eventHandler_ = nullptr; + if (streamType_ == CONTINUOUS_FRAME) { + eventHandler_->GetEventRunner()->Stop(); + eventThread_.join(); + eventHandler_ = nullptr; + } DHLOGI("DCameraStreamDataProcessProducer Stop end devId: %s dhId: %s streamType: %d streamId: %d state: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId_, state_); } @@ -87,6 +93,14 @@ void DCameraStreamDataProcessProducer::FeedStream(const std::shared_ptr(runner); + eventCon_.notify_one(); + runner->Run(); +} + void DCameraStreamDataProcessProducer::LooperContinue() { DHLOGI("LooperContinue producer devId: %s dhId: %s streamType: %d streamId: %d state: %d",