From 5034c2e60ef53f016bbbdd33bae86caeff81a2b9 Mon Sep 17 00:00:00 2001 From: Clone_Zhang Date: Sat, 19 Aug 2023 17:35:44 +0800 Subject: [PATCH] fix: modify nativebuffer opt to hdi Signed-off-by: Clone_Zhang --- .../constants/distributed_camera_errno.h | 1 + services/cameraservice/sourceservice/BUILD.gn | 1 + .../dcamera_stream_data_process_producer.h | 4 + .../dcamera_stream_data_process_producer.cpp | 81 ++++++++++++------- .../common/distributedcameramgr/BUILD.gn | 1 + 5 files changed, 59 insertions(+), 29 deletions(-) diff --git a/common/include/constants/distributed_camera_errno.h b/common/include/constants/distributed_camera_errno.h index 1e2929ee..d576c831 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 5ecc69ef..528dac91 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 f133fcfd..4b9aba4f 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 e7a3c7c6..70911c24 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 36b0c318..d3788c18 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", -- Gitee