diff --git a/common/include/constants/distributed_camera_errno.h b/common/include/constants/distributed_camera_errno.h index 1e2929eee22efd50cdacf657f375b1561d818406..d576c831a8e5e942a3cc1420f5be4f4c5ad8bd28 100644 --- a/common/include/constants/distributed_camera_errno.h +++ b/common/include/constants/distributed_camera_errno.h @@ -35,6 +35,7 @@ namespace DistributedHardware { DCAMERA_UNREGIST_HAL_FAILED = -13, DCAMERA_ALLOC_ERROR = -14, DCAMERA_DEVICE_BUSY = -15, + DCAMERA_NULL_POINTER = -16, }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/sourceservice/BUILD.gn b/services/cameraservice/sourceservice/BUILD.gn index 5ecc69efd22cf19b62193621239fb74d1c2afe73..528dac91865186d12e5a3e2f35a2fb6f9e9146fc 100644 --- a/services/cameraservice/sourceservice/BUILD.gn +++ b/services/cameraservice/sourceservice/BUILD.gn @@ -107,6 +107,7 @@ ohos_shared_library("distributed_camera_source") { external_deps = [ "c_utils:utils", + "drivers_interface_display:libdisplay_buffer_proxy_1.0", "drivers_interface_distributed_camera:libdistributed_camera_provider_proxy_1.0", "eventhandler:libeventhandler", "graphic_2d:surface", 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 f133fcfdb8533c67ef46eadbe56e139d47c6b8b1..4b9aba4fc357069c5c6a8812a4cc4f590d200eeb 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 @@ -26,10 +26,12 @@ #include "event_handler.h" #include "v1_0/id_camera_provider.h" #include "dcamera_feeding_smoother.h" +#include "v1_0/imapper.h" namespace OHOS { namespace DistributedHardware { using namespace OHOS::HDI::DistributedCamera::V1_0; +using namespace OHOS::HDI::Display::Buffer::V1_0; class DCameraStreamDataProcessProducer : public IFeedableDataProducer, public std::enable_shared_from_this { public: @@ -49,6 +51,7 @@ private: void StartEvent(); void LooperSnapShot(); int32_t FeedStreamToDriver(const DHBase& dhBase, const std::shared_ptr& buffer); + int32_t FeedStreamToDriverInner(const DHBase& dhBase, const std::shared_ptr& buffer); int32_t CheckSharedMemory(const DCameraBuffer& sharedMemory, const std::shared_ptr& buffer); const uint32_t DCAMERA_PRODUCER_MAX_BUFFER_SIZE = 30; @@ -74,6 +77,7 @@ private: sptr camHdiProvider_; std::unique_ptr smoother_ = nullptr; std::shared_ptr smootherListener_ = nullptr; + sptr bufferSrvImpl_; }; } // namespace DistributedHardware } // namespace OHOS 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 e7a3c7c6bbc893503ba98688c15a25e88b0cbb47..70911c244c26955074e4cf2e2382699b1d032f8d 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 @@ -26,6 +26,7 @@ #include "distributed_hardware_log.h" #include #include "dcamera_frame_info.h" +#include "hdf_base.h" namespace OHOS { namespace DistributedHardware { @@ -55,7 +56,11 @@ void DCameraStreamDataProcessProducer::Start() GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamType_, streamId_); camHdiProvider_ = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE); if (camHdiProvider_ == nullptr) { - DHLOGE("camHdiProvider_ is null."); + DHLOGE("CamHdiProvider is nullptr."); + } + bufferSrvImpl_ = IMapper::Get(true); + if (bufferSrvImpl_ == nullptr) { + DHLOGE("BufferSrvImpl is nullptr."); } state_ = DCAMERA_PRODUCER_STATE_START; if (streamType_ == CONTINUOUS_FRAME) { @@ -93,6 +98,7 @@ void DCameraStreamDataProcessProducer::Stop() producerThread_.join(); } camHdiProvider_ = nullptr; + bufferSrvImpl_ = 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_); } @@ -186,9 +192,45 @@ int32_t DCameraStreamDataProcessProducer::FeedStreamToDriver(const DHBase& dhBas DHLOGD("LooperFeed devId %s dhId %s streamSize: %d streamType: %d, streamId: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), buffer->Size(), streamType_, streamId_); if (camHdiProvider_ == nullptr) { - DHLOGI("camHdiProvider is nullptr"); - return DCAMERA_BAD_VALUE; + DHLOGE("CamHdiProvider is nullptr."); + return DCAMERA_NULL_POINTER; + } + if (bufferSrvImpl_ == nullptr) { + DHLOGE("BufferSrvImpl is nullptr."); + return DCAMERA_NULL_POINTER; + } + int32_t ret = FeedStreamToDriverInner(dhBase, buffer); + if (ret != DCAMERA_OK) { + DHLOGE("Share Memory opt error, ret = %d.", ret); + return ret; + } + DHLOGD("LooperFeed end devId %s dhId %s streamSize: %d streamType: %d, streamId: %d", + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), buffer->Size(), streamType_, streamId_); + return DCAMERA_OK; +} + +int32_t DCameraStreamDataProcessProducer::CheckSharedMemory(const DCameraBuffer& sharedMemory, + const std::shared_ptr& buffer) +{ + if (sharedMemory.bufferHandle_ == nullptr || sharedMemory.bufferHandle_->GetBufferHandle() == nullptr) { + DHLOGE("bufferHandle read failed devId: %s dhId: %s", GetAnonyString(devId_).c_str(), + GetAnonyString(dhId_).c_str()); + return DCAMERA_MEMORY_OPT_ERROR; + } + + if (buffer->Size() > sharedMemory.size_) { + DHLOGE("sharedMemory devId: %s dhId: %s streamId: %d bufSize: %d, addressSize: %d", + GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamId_, buffer->Size(), + sharedMemory.size_); + return DCAMERA_MEMORY_OPT_ERROR; } + + return DCAMERA_OK; +} + +int32_t DCameraStreamDataProcessProducer::FeedStreamToDriverInner(const DHBase& dhBase, + const std::shared_ptr& buffer) +{ DCameraBuffer sharedMemory; int32_t ret = camHdiProvider_->AcquireBuffer(dhBase, streamId_, sharedMemory); if (ret != SUCCESS) { @@ -204,10 +246,9 @@ int32_t DCameraStreamDataProcessProducer::FeedStreamToDriver(const DHBase& dhBas GetAnonyString(dhId_).c_str()); break; } - sharedMemory.bufferHandle_->GetBufferHandle()->virAddr = - DCameraMemoryMap(sharedMemory.bufferHandle_->GetBufferHandle()); - if (sharedMemory.bufferHandle_->GetBufferHandle()->virAddr == nullptr) { - DHLOGE("mmap failed devId: %s dhId: %s", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); + ret = bufferSrvImpl_->Mmap(sharedMemory.bufferHandle_); + if (ret != HDF_SUCCESS) { + DHLOGE("Mmap failed, ret: %d.", ret); break; } ret = memcpy_s(sharedMemory.bufferHandle_->GetBufferHandle()->virAddr, sharedMemory.size_, buffer->Data(), @@ -222,35 +263,17 @@ int32_t DCameraStreamDataProcessProducer::FeedStreamToDriver(const DHBase& dhBas } while (0); ret = camHdiProvider_->ShutterBuffer(dhBase, streamId_, sharedMemory); - if (sharedMemory.bufferHandle_ != nullptr) { - DCameraMemoryUnmap(sharedMemory.bufferHandle_->GetBufferHandle()); - } if (ret != SUCCESS) { DHLOGE("ShutterBuffer devId: %s dhId: %s streamId: %d ret: %d", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamId_, ret); + bufferSrvImpl_->Unmap(sharedMemory.bufferHandle_); return DCAMERA_BAD_OPERATE; } - DHLOGD("LooperFeed end devId %s dhId %s streamSize: %d streamType: %d, streamId: %d", - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), buffer->Size(), streamType_, streamId_); - return ret; -} - -int32_t DCameraStreamDataProcessProducer::CheckSharedMemory(const DCameraBuffer& sharedMemory, - const std::shared_ptr& buffer) -{ - if (sharedMemory.bufferHandle_ == nullptr || sharedMemory.bufferHandle_->GetBufferHandle() == nullptr) { - DHLOGE("bufferHandle read failed devId: %s dhId: %s", GetAnonyString(devId_).c_str(), - GetAnonyString(dhId_).c_str()); - return DCAMERA_MEMORY_OPT_ERROR; - } - - if (buffer->Size() > sharedMemory.size_) { - DHLOGE("sharedMemory devId: %s dhId: %s streamId: %d bufSize: %d, addressSize: %d", - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), streamId_, buffer->Size(), - sharedMemory.size_); + ret = bufferSrvImpl_->Unmap(sharedMemory.bufferHandle_); + if (ret != HDF_SUCCESS) { + DHLOGE("Unmap failed, ret: %d.", ret); return DCAMERA_MEMORY_OPT_ERROR; } - return DCAMERA_OK; } diff --git a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn index 36b0c3181e48bf91b3a06c3b236be9d45d6ba076..d3788c18d1214e3a515b73aacf2c5a84142f428e 100644 --- a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn +++ b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/BUILD.gn @@ -89,6 +89,7 @@ ohos_unittest("DCameraSourceMgrTest") { "access_token:libnativetoken", "access_token:libtoken_setproc", "c_utils:utils", + "drivers_interface_display:libdisplay_buffer_proxy_1.0", "drivers_interface_distributed_camera:libdistributed_camera_provider_proxy_1.0", "dsoftbus:softbus_client", "eventhandler:libeventhandler",