diff --git a/distributed_camera/hdi_service/include/dstream_operator/dstream_operator.h b/distributed_camera/hdi_service/include/dstream_operator/dstream_operator.h index fee4a6187ababfc14da83b5594a7b8c015bc35ec..b70acd041a558c59cc25bffe7404e31c233a9ffd 100644 --- a/distributed_camera/hdi_service/include/dstream_operator/dstream_operator.h +++ b/distributed_camera/hdi_service/include/dstream_operator/dstream_operator.h @@ -125,6 +125,8 @@ private: bool IsCaptureInfoInvalid(const CaptureInfo &info); int32_t DoCapture(int32_t captureId, const CaptureInfo &info, bool isStreaming); + void InsertNotifyCaptureMap(int32_t captureId); + void EraseNotifyCaptureMap(int32_t captureId); private: constexpr static uint32_t JSON_ARRAY_MAX_SIZE = 1000; @@ -152,6 +154,7 @@ private: std::mutex isCapturingLock_; OperationMode currentOperMode_ = OperationMode::NORMAL; std::shared_ptr latestStreamSetting_; + std::map notifyCaptureStartedMap_; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/distributed_camera/hdi_service/src/dstream_operator/dstream_operator.cpp b/distributed_camera/hdi_service/src/dstream_operator/dstream_operator.cpp index 1976d4923379f6899d22cc350a529a66d5da0a59..1b2810d1b5015e3b72737a7950aaed333930eef7 100644 --- a/distributed_camera/hdi_service/src/dstream_operator/dstream_operator.cpp +++ b/distributed_camera/hdi_service/src/dstream_operator/dstream_operator.cpp @@ -354,6 +354,7 @@ int32_t DStreamOperator::Capture(int32_t captureId, const CaptureInfo &info, boo int32_t DStreamOperator::DoCapture(int32_t captureId, const CaptureInfo &info, bool isStreaming) { for (const auto &id : info.streamIds_) { + InsertNotifyCaptureMap(id); auto stream = FindHalStreamById(id); if (stream == nullptr) { DHLOGE("Invalid stream id %d", id); @@ -437,6 +438,7 @@ int32_t DStreamOperator::CancelCapture(int32_t captureId) tmp.streamId_ = id; info.push_back(tmp); EraseStreamCaptureBufferNum(std::make_pair(captureId, id)); + EraseNotifyCaptureMap(id); } if (dcStreamOperatorCallback_) { dcStreamOperatorCallback_->OnCaptureEnded(captureId, info); @@ -676,10 +678,14 @@ DCamRetCode DStreamOperator::ShutterBuffer(int streamId, const DCameraBuffer &bu return DCamRetCode::INVALID_ARGUMENT; } - if (buffer.index_ == 0 && dcStreamOperatorCallback_ != nullptr) { - vector tmpStreamIds; - tmpStreamIds.push_back(streamId); - dcStreamOperatorCallback_->OnCaptureStarted(captureId, tmpStreamIds); + auto iter = notifyCaptureStartedMap_.find(streamId); + if (iter != notifyCaptureStartedMap_.end()) { + if (!iter->second && dcStreamOperatorCallback_ != nullptr) { + vector tmpStreamIds; + tmpStreamIds.push_back(streamId); + dcStreamOperatorCallback_->OnCaptureStarted(captureId, tmpStreamIds); + iter->second = true; + } } auto stream = FindHalStreamById(streamId); @@ -766,6 +772,7 @@ void DStreamOperator::Release() enableShutterCbkMap_.clear(); acceptedBufferNum_.clear(); cachedDCaptureInfoList_.clear(); + notifyCaptureStartedMap_.clear(); dcStreamOperatorCallback_ = nullptr; } @@ -1200,5 +1207,17 @@ void DStreamOperator::EraseStreamCaptureBufferNum(const pair& streamPa std::lock_guard autoLock(streamAttrLock_); acceptedBufferNum_.erase(streamPair); } + +void DStreamOperator::InsertNotifyCaptureMap(int32_t streamId) +{ + std::lock_guard autoLock(streamAttrLock_); + notifyCaptureStartedMap_.emplace(streamId, false); +} + +void DStreamOperator::EraseNotifyCaptureMap(int32_t streamId) +{ + std::lock_guard autoLock(streamAttrLock_); + notifyCaptureStartedMap_.erase(streamId); +} } // namespace DistributedHardware } // namespace OHOS