diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h b/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h index 853f8fcd3dac585ea5bacef37332166a7e98c5a9..01e3aaf4f4d7f2e1ee87c9ce3cd053e60f5b9863 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregionmgr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -57,6 +57,7 @@ private: std::string localDevId_; IAVEngineProvider *providerPtr_ = nullptr; + void* pHandler_ = nullptr; }; } // namespace V2_0 } // namespace DistributedHardware diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp index b81e56461bfb83ed04ce06dbc5be6981d2c19247..3902d1b89b708d5081da08d1203a76118da00e7d 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp @@ -156,16 +156,16 @@ void ScreenRegionManager::GetScreenDumpInfo(std::string &result) int32_t ScreenRegionManager::LoadAVReceiverEngineProvider() { DHLOGI("LoadAVReceiverEngineProvider enter"); - void *pHandler = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); - if (pHandler == nullptr) { + pHandler_ = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); + if (pHandler_ == nullptr) { DHLOGE("so: %{public}s load failed, failed reason : %{public}s", RECEIVER_SO_NAME.c_str(), dlerror()); return ERR_DH_AV_TRANS_NULL_VALUE; } - AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pHandler, GET_PROVIDER_FUNC.c_str()); + AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pHandler_, GET_PROVIDER_FUNC.c_str()); if (getEngineFactoryFunc == nullptr) { DHLOGE("av transport engine factory function handler is null, failed reason : %{public}s", dlerror()); - dlclose(pHandler); - pHandler = nullptr; + dlclose(pHandler_); + pHandler_ = nullptr; return ERR_DH_AV_TRANS_NULL_VALUE; } providerPtr_ = getEngineFactoryFunc(OWNER_NAME_D_SCREEN); @@ -175,10 +175,13 @@ int32_t ScreenRegionManager::LoadAVReceiverEngineProvider() int32_t ScreenRegionManager::UnloadAVReceiverEngineProvider() { DHLOGI("UnloadAVReceiverEngineProvider enter"); - void *pHandler = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); - if (pHandler != nullptr) { - dlclose(pHandler); - pHandler = nullptr; + if (providerPtr_ != nullptr) { + delete providerPtr_; + providerPtr_ = nullptr; + } + if (pHandler_ != nullptr) { + dlclose(pHandler_); + pHandler_ = nullptr; } return DH_SUCCESS; } diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h index ff5ea2544fe5f98cc0263ca2f2a26b8ad2bf7e00..eab5b6ccb14557e7074187bde1952251c972e79b 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h @@ -81,6 +81,7 @@ private: std::map> dScreens_; IAVEngineProvider *providerPtr_ = nullptr; + void* pHandler_ = nullptr; sptr dScreenGroupListener_ = nullptr; std::shared_ptr dScreenCallback_ = nullptr; sptr dScreenSourceCallbackProxy_ = nullptr; diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp index 91bd7ee21c3b062954f8d62f6e06621932eb33e9..642dda1d2065d8179893ab8de314179a47c391d4 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp @@ -397,16 +397,16 @@ void DScreenManager::PublishMessage(const DHTopic topic, const std::shared_ptrInitSource(params, callback); sourceServicePtr->RegisterDistributedHardware(devId, dhId, param, reqId); sourceServicePtr->DScreenNotify(devId, eventCode, eventContent); + sourceServicePtr->UnregisterDistributedHardware(devId, dhId, reqId); + sourceServicePtr->ReleaseSource(); } } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h b/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h index 6583fe0041dfcb1d4b923eb8825b1aa2f628910f..a76d96a6673084b96068c2608cd69c5061fa5866 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h +++ b/services/screentransport/screensourceprocessor/encoder/include/idscreen_dbg_itf.h @@ -24,11 +24,15 @@ const std::string GET_DBG_ITF_FUNC = "GetDBGItf"; const std::string GET_IMAGE_DIRTY_FUNC = "GetImageSetDirty"; class IDScreenDBGItf { public: + virtual ~IDScreenDBGItf() = default; + virtual int32_t Init() = 0; virtual int32_t Release() = 0; }; class IImageSetDirty { public: + virtual ~IImageSetDirty() = default; + virtual void SetDamage(std::vector> dirtyVecs) = 0; virtual std::vector> GetDamage() = 0; }; diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 9e697a3cc8b8c74e59dd5b14749bd58aa9dac0d2..a2d74ab6896f4ec21a6dc8c6951c840f7fcc695a 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -249,8 +249,16 @@ int32_t ImageSourceEncoder::ReleaseEncoder() DHLOGE("%{public}s: Release encoder failed.", DSCREEN_LOG_TAG); return ERR_DH_SCREEN_CODEC_RELEASE_FAILED; } - if (pHandler_ != nullptr) { + if (dscreenDbgItfPtr_ != nullptr) { dscreenDbgItfPtr_->Release(); + delete dscreenDbgItfPtr_; + dscreenDbgItfPtr_ = nullptr; + } + if (imageSetDirtyPtr_ != nullptr) { + delete imageSetDirtyPtr_; + imageSetDirtyPtr_ = nullptr; + } + if (pHandler_ != nullptr) { dlclose(pHandler_); } encodeVideoCallback_ = nullptr;