From 55cf7161aaaeaaed31102bb36451ef7dde03af03 Mon Sep 17 00:00:00 2001 From: pwx1285814 Date: Wed, 7 Aug 2024 20:26:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B8=85=E7=90=86=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: pwx1285814 Change-Id: I48032e03bb3f2751824e26b9fe2bd3410571c294 Signed-off-by: pwx1285814 --- .../screen_sink/src/dscreen_sink_handler.cpp | 8 +- .../src/dscreen_source_handler.cpp | 6 + .../src/dscreen_sink_handler_test.cpp | 15 ++ .../src/dscreen_source_handler_test.cpp | 15 ++ .../common/databuffer/src/data_buffer.cpp | 4 +- .../2.0/include/screenregion.h | 4 +- .../screenregionmgr/2.0/src/screenregion.cpp | 125 +++++++++++---- .../2.0/src/screenregionmgr.cpp | 10 +- .../dscreenmgr/2.0/src/dscreen_manager.cpp | 10 +- .../2.0/src/screenregion_test.cpp | 143 +++++++++++++++++- .../2.0/src/screenregionmgr_test.cpp | 13 +- .../encoder/src/image_source_encoder.cpp | 6 +- .../src/image_sink_decoder_test.cpp | 31 ++++ .../unittest/src/softbus_adapter_test.cpp | 4 + 14 files changed, 332 insertions(+), 62 deletions(-) diff --git a/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp b/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp index 9c09b2a3..dcdd9240 100644 --- a/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp +++ b/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp @@ -102,6 +102,12 @@ void DScreenSinkHandler::FinishStartSA(const std::string ¶ms, const sptr lock(proxyMutex_); + if (remoteObject == nullptr) { + DHLOGE("remoteObject is nullptr."); + ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_SINKPROXY_NOT_INIT, DISTRIBUTED_HARDWARE_SCREEN_SINK_SA_ID, + "remoteObject is nullptr."); + return; + } if (sinkSvrRecipient_ == nullptr) { DHLOGE("sinkSvrRecipient is nullptr."); ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_SINKPROXY_NOT_INIT, DISTRIBUTED_HARDWARE_SCREEN_SINK_SA_ID, @@ -220,4 +226,4 @@ IDistributedHardwareSink *GetSinkHardwareHandler() return &DScreenSinkHandler::GetInstance(); } } // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp index 8468baed..8d6c7221 100644 --- a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp +++ b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp @@ -97,6 +97,12 @@ void DScreenSourceHandler::FinishStartSA(const std::string ¶ms, const sptr lock(proxyMutex_); + if (remoteObject == nullptr) { + DHLOGE("remoteObject is nullptr."); + ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_SOURCEPROXY_NOT_INIT, DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID, + "remoteObject is nullptr."); + return; + } if (sourceSvrRecipient_ == nullptr) { DHLOGE("sourceSvrRecipient is nullptr."); ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_SOURCEPROXY_NOT_INIT, DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID, diff --git a/interfaces/innerkits/native_cpp/test/unittest/screensinktest/src/dscreen_sink_handler_test.cpp b/interfaces/innerkits/native_cpp/test/unittest/screensinktest/src/dscreen_sink_handler_test.cpp index 6cfc342b..d2bc2f2a 100644 --- a/interfaces/innerkits/native_cpp/test/unittest/screensinktest/src/dscreen_sink_handler_test.cpp +++ b/interfaces/innerkits/native_cpp/test/unittest/screensinktest/src/dscreen_sink_handler_test.cpp @@ -64,6 +64,21 @@ HWTEST_F(DScreenSinkHandlerTest, InitSink_002, TestSize.Level1) EXPECT_EQ(DH_SUCCESS, ret); } +/** + * @tc.name: FinishStartSA_001 + * @tc.desc: Verify the FinishStartSA function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(DScreenSinkHandlerTest, FinishStartSA_001, TestSize.Level1) +{ + const std::string param = ""; + sptr remoteObject = nullptr; + DScreenSinkHandler::GetInstance().dScreenSinkProxy_ = nullptr; + DScreenSinkHandler::GetInstance().FinishStartSA(param, remoteObject); + EXPECT_EQ(DScreenSinkHandler::GetInstance().dScreenSinkProxy_, nullptr); +} + /** * @tc.name: LocalHardware_001 * @tc.desc: Verify the SubscribeLocalHardware function. diff --git a/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp b/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp index df780acf..ed8856f2 100644 --- a/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp +++ b/interfaces/innerkits/native_cpp/test/unittest/screensourcetest/src/dscreen_source_handler_test.cpp @@ -68,6 +68,21 @@ HWTEST_F(DScreenSourceHandlerTest, InitSource_002, TestSize.Level1) } +/** + * @tc.name: FinishStartSA_001 + * @tc.desc: Verify the FinishStartSA function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(DScreenSourceHandlerTest, FinishStartSA_001, TestSize.Level1) +{ + const std::string param = ""; + sptr remoteObject = nullptr; + DScreenSourceHandler::GetInstance().dScreenSourceProxy_ = nullptr; + DScreenSourceHandler::GetInstance().FinishStartSA(param, remoteObject); + EXPECT_EQ(DScreenSourceHandler::GetInstance().dScreenSourceProxy_, nullptr); +} + /** * @tc.name: RegisterDistributedHardware_001 * @tc.desc: Verify the RegisterDistributedHardware function. diff --git a/services/common/databuffer/src/data_buffer.cpp b/services/common/databuffer/src/data_buffer.cpp index 36a5ea41..0a48e140 100644 --- a/services/common/databuffer/src/data_buffer.cpp +++ b/services/common/databuffer/src/data_buffer.cpp @@ -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 @@ -132,4 +132,4 @@ int32_t DataBuffer::GetData(int32_t offset, int32_t datasize, uint8_t* &output) return DH_SUCCESS; } } // namespace DistributedHardware -} // namespcae OHOS \ No newline at end of file +} // namespace OHOS \ No newline at end of file diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregion.h b/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregion.h index e21fcded..e06470bc 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregion.h +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/include/screenregion.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 @@ -56,6 +56,8 @@ private: int32_t StopReceiverEngine(); int32_t SetUp(const std::string &content); int32_t ConfigWindow(); + int32_t SetReceiverAdapterParameters(); + int32_t SetAlignedHeight(); bool CheckContentJson(json &contentJson); void PublishMessage(const DHTopic topic, const uint64_t &screenId, const std::string &remoteDevId, const int32_t &windowId, std::shared_ptr windowProperty); diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp index 67054c74..19603a27 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp @@ -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 @@ -151,35 +151,19 @@ int32_t ScreenRegion::SetUp(const std::string &content) DHLOGE("config dscreen region window failed."); return ret; } - std::string codecType; - if (videoParam_->GetCodecType() == VIDEO_CODEC_TYPE_VIDEO_H265) { - codecType = MIME_VIDEO_H265; - } else if (videoParam_->GetCodecType() == VIDEO_CODEC_TYPE_VIDEO_H264) { - codecType = MIME_VIDEO_H264; - } else { - codecType = MIME_VIDEO_RAW; - } - std::string pixelFormat; - if (videoParam_->GetVideoFormat() == VIDEO_DATA_FORMAT_YUVI420) { - pixelFormat = VIDEO_FORMAT_YUVI420; - } else if (videoParam_->GetVideoFormat() == VIDEO_DATA_FORMAT_NV12) { - pixelFormat = VIDEO_FORMAT_NV12; - } else if (videoParam_->GetVideoFormat() == VIDEO_DATA_FORMAT_NV21) { - pixelFormat = VIDEO_FORMAT_NV21; - } else { - pixelFormat = VIDEO_FORMAT_RGBA8888; + + ret = SetReceiverAdapterParameters(); + if (ret != DH_SUCCESS) { + DHLOGE("Failed to set receiver adapter parameters, error code: %{public}d", ret); + return ret; } - receiverAdapter_->SetParameter(AVTransTag::VIDEO_CODEC_TYPE, codecType); - receiverAdapter_->SetParameter(AVTransTag::VIDEO_PIXEL_FORMAT, pixelFormat); - receiverAdapter_->SetParameter(AVTransTag::VIDEO_WIDTH, std::to_string(videoParam_->GetVideoWidth())); - receiverAdapter_->SetParameter(AVTransTag::VIDEO_HEIGHT, std::to_string(videoParam_->GetVideoHeight())); - receiverAdapter_->SetParameter(AVTransTag::VIDEO_FRAME_RATE, std::to_string(videoParam_->GetFps())); - receiverAdapter_->SetParameter(AVTransTag::ENGINE_READY, OWNER_NAME_D_SCREEN); - alignedHeight_ = videoParam_->GetVideoHeight(); - if (alignedHeight_ % ALIGNEDBITS != 0) { - alignedHeight_ = ((alignedHeight_ / ALIGNEDBITS) +1) * ALIGNEDBITS; + ret = SetAlignedHeight(); + if (ret != DH_SUCCESS) { + DHLOGE("Failed to set aligned height, error code: %{public}d", ret); + return ret; } + return DH_SUCCESS; } @@ -222,6 +206,61 @@ int32_t ScreenRegion::ConfigWindow() return DH_SUCCESS; } +int32_t ScreenRegion::SetReceiverAdapterParameters() +{ + if (videoParam_ == nullptr) { + DHLOGE("videoParam is nullptr."); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + + if (receiverAdapter_ == nullptr) { + DHLOGE("receiverAdapter is nullptr."); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + + std::string codecType; + if (videoParam_->GetCodecType() == VIDEO_CODEC_TYPE_VIDEO_H265) { + codecType = MIME_VIDEO_H265; + } else if (videoParam_->GetCodecType() == VIDEO_CODEC_TYPE_VIDEO_H264) { + codecType = MIME_VIDEO_H264; + } else { + codecType = MIME_VIDEO_RAW; + } + std::string pixelFormat; + if (videoParam_->GetVideoFormat() == VIDEO_DATA_FORMAT_YUVI420) { + pixelFormat = VIDEO_FORMAT_YUVI420; + } else if (videoParam_->GetVideoFormat() == VIDEO_DATA_FORMAT_NV12) { + pixelFormat = VIDEO_FORMAT_NV12; + } else if (videoParam_->GetVideoFormat() == VIDEO_DATA_FORMAT_NV21) { + pixelFormat = VIDEO_FORMAT_NV21; + } else { + pixelFormat = VIDEO_FORMAT_RGBA8888; + } + receiverAdapter_->SetParameter(AVTransTag::VIDEO_CODEC_TYPE, codecType); + receiverAdapter_->SetParameter(AVTransTag::VIDEO_PIXEL_FORMAT, pixelFormat); + receiverAdapter_->SetParameter(AVTransTag::VIDEO_WIDTH, std::to_string(videoParam_->GetVideoWidth())); + receiverAdapter_->SetParameter(AVTransTag::VIDEO_HEIGHT, std::to_string(videoParam_->GetVideoHeight())); + receiverAdapter_->SetParameter(AVTransTag::VIDEO_FRAME_RATE, std::to_string(videoParam_->GetFps())); + receiverAdapter_->SetParameter(AVTransTag::ENGINE_READY, OWNER_NAME_D_SCREEN); + + return DH_SUCCESS; +} + +int32_t ScreenRegion::SetAlignedHeight() +{ + if (videoParam_ == nullptr) { + DHLOGE("video parameter is nullptr."); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + + alignedHeight_ = videoParam_->GetVideoHeight(); + if (alignedHeight_ % ALIGNEDBITS != 0) { + alignedHeight_ = ((alignedHeight_ / ALIGNEDBITS) + 1) * ALIGNEDBITS; + } + + return DH_SUCCESS; +} + void ScreenRegion::PublishMessage(const DHTopic topic, const uint64_t &screenId, const std::string &remoteDevId, const int32_t &windowId, std::shared_ptr windowProperty) { @@ -230,6 +269,12 @@ void ScreenRegion::PublishMessage(const DHTopic topic, const uint64_t &screenId, DHLOGE("GetDHFwkKit fail."); return; } + + if (windowProperty == nullptr) { + DHLOGE("windowProperty is nullptr."); + return; + } + json messageJosn; std::string message; messageJosn[SOURCE_WIN_ID] = screenId; @@ -268,6 +313,12 @@ void ScreenRegion::OnEngineMessage(const std::shared_ptr &messag json paramJson; paramJson[KEY_DEV_ID] = remoteDevId_; auto avMessage = std::make_shared(msgType, paramJson.dump(), remoteDevId_); + + if (receiverAdapter_ == nullptr) { + DHLOGE("av transport receiver adapter is nullptr."); + return; + } + receiverAdapter_->SendMessageToRemote(avMessage); } else if (message->type_ == DScreenMsgType::STOP_MIRROR) { StopReceiverEngine(); @@ -276,7 +327,21 @@ void ScreenRegion::OnEngineMessage(const std::shared_ptr &messag void ScreenRegion::GetWSBuffer(sptr &wsBuffer, const std::shared_ptr &buffer) { + if ((wsBuffer == nullptr) || (buffer == nullptr)) { + DHLOGE("wsBuffer or buffer is nullptr."); + return; + } + + if ((videoParam_ == nullptr) || (windowSurface_ == nullptr)) { + DHLOGE("videoParam or windowSurface is nullptr."); + return; + } + auto bufferData = buffer->GetBufferData(0); + if (bufferData == nullptr) { + DHLOGE("bufferData is null."); + return; + } auto bufferAddr = bufferData->GetAddress(); auto wsBufAddr = static_cast(wsBuffer->GetVirAddr()); uint32_t wsBufSize = wsBuffer->GetSize(); @@ -321,8 +386,8 @@ void ScreenRegion::OnEngineDataDone(const std::shared_ptr &buffer DHLOGE("received video buffer data is nullptr."); return; } - if (windowSurface_ == nullptr) { - DHLOGE("window surface is nullptr."); + if ((windowSurface_ == nullptr) || (videoParam_ == nullptr)) { + DHLOGE("windowSurface or videoParam is nullptr."); return; } sptr wsBuffer = nullptr; @@ -397,4 +462,4 @@ bool ScreenRegion::CheckContentJson(json &contentJson) } } // namespace V1_0 } // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp index 93da68f3..b81e5646 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp @@ -156,10 +156,6 @@ void ScreenRegionManager::GetScreenDumpInfo(std::string &result) int32_t ScreenRegionManager::LoadAVReceiverEngineProvider() { DHLOGI("LoadAVReceiverEngineProvider enter"); - if ((RECEIVER_SO_NAME.length() == 0) || (RECEIVER_SO_NAME.length() > PATH_MAX)) { - DHLOGE("File canonicalization failed, so name: %{public}s.", RECEIVER_SO_NAME.c_str()); - return ERR_DH_AV_TRANS_LOAD_ERROR; - } void *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()); @@ -179,10 +175,6 @@ int32_t ScreenRegionManager::LoadAVReceiverEngineProvider() int32_t ScreenRegionManager::UnloadAVReceiverEngineProvider() { DHLOGI("UnloadAVReceiverEngineProvider enter"); - if ((RECEIVER_SO_NAME.length() == 0) || (RECEIVER_SO_NAME.length() > PATH_MAX)) { - DHLOGE("File canonicalization failed, so name: %{public}s.", RECEIVER_SO_NAME.c_str()); - return ERR_DH_AV_TRANS_LOAD_ERROR; - } void *pHandler = dlopen(RECEIVER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); if (pHandler != nullptr) { dlclose(pHandler); @@ -205,4 +197,4 @@ int32_t EngineProviderListener::OnProviderEvent(const AVTransEvent& event) } } // namespace V2_0 } // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file +} // namespace OHOS 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 2ccb802a..91bd7ee2 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp @@ -397,10 +397,6 @@ void DScreenManager::PublishMessage(const DHTopic topic, const std::shared_ptr PATH_MAX)) { - DHLOGE("File canonicalization failed, so name: %{public}s.", SENDER_SO_NAME.c_str()); - return ERR_DH_AV_TRANS_LOAD_ERROR; - } void *pHandler = dlopen(SENDER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); if (pHandler == nullptr) { DHLOGE("so: %{public}s load failed, failed reason : %{public}s", SENDER_SO_NAME.c_str(), dlerror()); @@ -420,10 +416,6 @@ int32_t DScreenManager::LoadAVSenderEngineProvider() int32_t DScreenManager::UnloadAVSenderEngineProvider() { DHLOGI("UnloadAVSenderEngineProvider enter"); - if ((SENDER_SO_NAME.length() == 0) || (SENDER_SO_NAME.length() > PATH_MAX)) { - DHLOGE("File canonicalization failed, so name: %{public}s.", SENDER_SO_NAME.c_str()); - return ERR_DH_AV_TRANS_LOAD_ERROR; - } void *pHandler = dlopen(SENDER_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE); if (pHandler != nullptr) { dlclose(pHandler); @@ -433,4 +425,4 @@ int32_t DScreenManager::UnloadAVSenderEngineProvider() } } // namespace V2_0 } // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregion_test.cpp b/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregion_test.cpp index b63b7f1c..e17ecea0 100644 --- a/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregion_test.cpp +++ b/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregion_test.cpp @@ -16,6 +16,7 @@ #include "2.0/include/screenregion_test.h" #include "dscreen_constants.h" #include "engine_test_utils.h" +#include "iconsumer_surface.h" #include "screen_client.h" using namespace testing; @@ -34,7 +35,12 @@ void ScreenRegionTestV2::SetUp(void) screenRegion_ = std::make_shared(remoteDevId); } -void ScreenRegionTestV2::TearDown(void) {} +void ScreenRegionTestV2::TearDown(void) +{ + if (screenRegion_ != nullptr) { + screenRegion_ = nullptr; + } +} /** * @tc.name: OnEngineEvent_001 @@ -48,6 +54,8 @@ HWTEST_F(ScreenRegionTestV2, OnEngineEvent_001, TestSize.Level1) const std::string content = "OnEngineEvent_001"; screenRegion_->receiverAdapter_ = nullptr; screenRegion_->OnEngineEvent(event, content); + event = DScreenEventType::TRANS_CHANNEL_CLOSED; + screenRegion_->OnEngineEvent(event, content); EXPECT_EQ(ERR_DH_AV_TRANS_NULL_VALUE, screenRegion_->StopReceiverEngine()); } @@ -299,14 +307,36 @@ HWTEST_F(ScreenRegionTestV2, StopReceiverEngine_002, TestSize.Level1) /** * @tc.name: SetUp_001 - * @tc.desc: Verify the SetUp function failed. + * @tc.desc: Verify the SetUp function. * @tc.type: FUNC * @tc.require: Issue Number */ HWTEST_F(ScreenRegionTestV2, SetUp_001, TestSize.Level1) { - const std::string content = "SetUp_001"; + std::string content = "invalidJsonString"; + EXPECT_EQ(ERR_DH_SCREEN_INPUT_PARAM_INVALID, screenRegion_->SetUp(content)); + + json contentJson; + content = contentJson.dump(); + EXPECT_EQ(ERR_DH_SCREEN_INPUT_PARAM_INVALID, screenRegion_->SetUp(content)); + + contentJson[KEY_SCREEN_ID] = 12345; + content = contentJson.dump(); EXPECT_EQ(ERR_DH_SCREEN_INPUT_PARAM_INVALID, screenRegion_->SetUp(content)); + + VideoParam param; + contentJson[KEY_VIDEO_PARAM] = param; + content = contentJson.dump(); + EXPECT_EQ(ERR_DH_SCREEN_INPUT_PARAM_INVALID, screenRegion_->SetUp(content)); + + DScreenMapRelation dScreenMapRelation; + contentJson[KEY_MAPRELATION] = dScreenMapRelation; + content = contentJson.dump(); + screenRegion_->receiverAdapter_ = nullptr; + EXPECT_EQ(ERR_DH_AV_TRANS_NULL_VALUE, screenRegion_->SetUp(content)); + + screenRegion_->receiverAdapter_ = std::make_shared(); + EXPECT_EQ(DH_SUCCESS, screenRegion_->SetUp(content)); } /** @@ -335,6 +365,113 @@ HWTEST_F(ScreenRegionTestV2, ConfigWindow_002, TestSize.Level1) EXPECT_EQ(DH_SUCCESS, screenRegion_->ConfigWindow()); } +/** + * @tc.name: SetReceiverAdapterParameters_001 + * @tc.desc: Verify the SetReceiverAdapterParameters function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(ScreenRegionTestV2, SetReceiverAdapterParameters_001, TestSize.Level1) +{ + screenRegion_->videoParam_ = nullptr; + int32_t ret = screenRegion_->SetReceiverAdapterParameters(); + EXPECT_EQ(ret, ERR_DH_AV_TRANS_NULL_VALUE); + + screenRegion_->videoParam_ = std::make_shared(); + screenRegion_->receiverAdapter_ = nullptr; + ret = screenRegion_->SetReceiverAdapterParameters(); + EXPECT_EQ(ret, ERR_DH_AV_TRANS_NULL_VALUE); + + uint8_t codecType = VIDEO_CODEC_TYPE_VIDEO_H265; + uint8_t videoFormat = VIDEO_DATA_FORMAT_YUVI420; + screenRegion_->receiverAdapter_ = std::make_shared(); + screenRegion_->videoParam_->SetCodecType(codecType); + screenRegion_->videoParam_->SetVideoFormat(videoFormat); + ret = screenRegion_->SetReceiverAdapterParameters(); + EXPECT_EQ(ret, DH_SUCCESS); + + codecType = VIDEO_CODEC_TYPE_VIDEO_MPEG4; + videoFormat = VIDEO_DATA_FORMAT_RGBA8888; + screenRegion_->videoParam_->SetCodecType(codecType); + screenRegion_->videoParam_->SetVideoFormat(videoFormat); + ret = screenRegion_->SetReceiverAdapterParameters(); + EXPECT_EQ(ret, DH_SUCCESS); + + videoFormat = VIDEO_DATA_FORMAT_NV21; + screenRegion_->videoParam_->SetCodecType(codecType); + screenRegion_->videoParam_->SetVideoFormat(videoFormat); + ret = screenRegion_->SetReceiverAdapterParameters(); + EXPECT_EQ(ret, DH_SUCCESS); +} + +/** + * @tc.name: SetAlignedHeight_001 + * @tc.desc: Verify the SetAlignedHeight function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(ScreenRegionTestV2, SetAlignedHeight_001, TestSize.Level1) +{ + sptr wsBuffer = nullptr; + std::shared_ptr buffer = nullptr; + screenRegion_->GetWSBuffer(wsBuffer, buffer); + + wsBuffer = SurfaceBuffer::Create(); + screenRegion_->GetWSBuffer(wsBuffer, buffer); + + buffer = std::make_shared(); + screenRegion_->videoParam_ = nullptr; + screenRegion_->windowSurface_ = nullptr; + screenRegion_->GetWSBuffer(wsBuffer, buffer); + + int32_t ret = screenRegion_->SetAlignedHeight(); + EXPECT_EQ(ret, ERR_DH_AV_TRANS_NULL_VALUE); + + uint32_t height = 31; + screenRegion_->videoParam_ = std::make_shared(); + screenRegion_->videoParam_->SetVideoHeight(height); + screenRegion_->GetWSBuffer(wsBuffer, buffer); + ret = screenRegion_->SetAlignedHeight(); + EXPECT_EQ(ret, DH_SUCCESS); + EXPECT_EQ(screenRegion_->alignedHeight_, 32); + + height = 32; + screenRegion_->videoParam_->SetVideoHeight(height); + ret = screenRegion_->SetAlignedHeight(); + EXPECT_EQ(ret, DH_SUCCESS); + EXPECT_EQ(screenRegion_->alignedHeight_, 32); +} +/** + * @tc.name: OnEngineDataDone_001 + * @tc.desc: Verify the OnEngineDataDone function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(ScreenRegionTestV2, OnEngineDataDone_001, TestSize.Level1) +{ + std::shared_ptr buffer = nullptr; + size_t frameNumber = screenRegion_->frameNumber_; + screenRegion_->OnEngineDataDone(buffer); + EXPECT_TRUE(screenRegion_->frameNumber_ > frameNumber); + + buffer = std::make_shared(); + screenRegion_->videoParam_ = nullptr; + screenRegion_->windowSurface_ = nullptr; + frameNumber = screenRegion_->frameNumber_; + screenRegion_->OnEngineDataDone(buffer); + EXPECT_TRUE(screenRegion_->frameNumber_ > frameNumber); + + screenRegion_->windowSurface_ = IConsumerSurface::Create(); + frameNumber = screenRegion_->frameNumber_; + screenRegion_->OnEngineDataDone(buffer); + EXPECT_TRUE(screenRegion_->frameNumber_ > frameNumber); + + screenRegion_->videoParam_ = std::make_shared(); + frameNumber = screenRegion_->frameNumber_; + screenRegion_->OnEngineDataDone(buffer); + EXPECT_TRUE(screenRegion_->frameNumber_ > frameNumber); +} + /** * @tc.name: CheckContentJson_001 * @tc.desc: Verify the CheckContentJson function failed. diff --git a/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregionmgr_test.cpp b/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregionmgr_test.cpp index f1823306..31943764 100644 --- a/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregionmgr_test.cpp +++ b/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/screenregionmgr_test.cpp @@ -97,17 +97,26 @@ HWTEST_F(ScreenRegionManagerTestV2, GetScreenDumpInfo_002, TestSize.Level1) } /** - * @tc.name: OnProviderEvent_002 + * @tc.name: OnProviderEvent_001 * @tc.desc: Verify the OnProviderEvent function failed. * @tc.type: FUNC * @tc.require: Issue Number */ -HWTEST_F(ScreenRegionManagerTestV2, OnProviderEvent_002, TestSize.Level1) +HWTEST_F(ScreenRegionManagerTestV2, OnProviderEvent_001, TestSize.Level1) { AVTransEvent event; EngineProviderListener engineProviderListener; + event.type = EventType::EVENT_CHANNEL_OPENED; int32_t ret = engineProviderListener.OnProviderEvent(event); EXPECT_EQ(DH_SUCCESS, ret); + + event.type = EventType::EVENT_CHANNEL_CLOSED; + ret = engineProviderListener.OnProviderEvent(event); + EXPECT_EQ(DH_SUCCESS, ret); + + event.type = EventType::EVENT_ENGINE_ERROR; + ret = engineProviderListener.OnProviderEvent(event); + EXPECT_EQ(DH_SUCCESS, ret); } } // namespace V2_0 } // namespace DistributedHardware diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index c2b3b08f..07ee23fa 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -43,10 +43,6 @@ void ConsumerBufferListener::OnBufferAvailable() void ImageSourceEncoder::InitDscreenDBG() { - if ((DBG_SO_NAME.length() == 0) || (DBG_SO_NAME.length() > PATH_MAX)) { - DHLOGE("File canonicalization failed, so name: %{public}s.", DBG_SO_NAME.c_str()); - return; - } pHandler_ = dlopen(DBG_SO_NAME.c_str(), RTLD_LAZY | RTLD_NODELETE | RTLD_GLOBAL); if (pHandler_ == nullptr) { DHLOGE("so: %{public}s load failed, fail reason: %{public}s.", DBG_SO_NAME.c_str(), dlerror()); @@ -442,4 +438,4 @@ void ImageSourceEncoder::OnOutputFormatChanged(const Media::Format &format) (void) format; } } // namespace DistributedHardware -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp b/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp index 6f9a503f..d3a6aa0b 100644 --- a/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp +++ b/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp @@ -286,6 +286,37 @@ HWTEST_F(ImageSinkDecoderTest, set_output_surface_test_001, TestSize.Level1) EXPECT_EQ(ERR_DH_SCREEN_TRANS_NULL_VALUE, imageDecoder_->SetOutputSurface(pSurface)); } +/** + * @tc.name: set_output_surface_test_002 + * @tc.desc: Verify the SetOutputSurface function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(ImageSinkDecoderTest, set_output_surface_test_002, TestSize.Level1) +{ + MediaAVCodec::AVCodecErrorType errorType = MediaAVCodec::AVCODEC_ERROR_EXTEND_START; + imageDecoder_->OnError(errorType, DH_SUCCESS); + sptr surface = IConsumerSurface::Create("test"); + sptr bp = surface->GetProducer(); + sptr pSurface = nullptr; + EXPECT_EQ(ERR_DH_SCREEN_TRANS_NULL_VALUE, imageDecoder_->SetOutputSurface(pSurface)); + + pSurface = Surface::CreateSurfaceAsProducer(bp); + imageDecoder_->consumerSurface_ = nullptr; + EXPECT_NE(ERR_DH_SCREEN_TRANS_NULL_VALUE, imageDecoder_->SetOutputSurface(pSurface)); + + imageDecoder_->consumerSurface_ = IConsumerSurface::Create(); + imageDecoder_->producerSurface_ = nullptr; + EXPECT_NE(ERR_DH_SCREEN_TRANS_NULL_VALUE, imageDecoder_->SetOutputSurface(pSurface)); + + imageDecoder_->producerSurface_ = IConsumerSurface::Create(); + imageDecoder_->configParam_.SetPartialRefreshFlag(false); + EXPECT_NE(ERR_DH_SCREEN_TRANS_NULL_VALUE, imageDecoder_->SetOutputSurface(pSurface)); + + imageDecoder_->configParam_.SetPartialRefreshFlag(true); + EXPECT_NE(ERR_DH_SCREEN_TRANS_NULL_VALUE, imageDecoder_->SetOutputSurface(pSurface)); +} + /** * @tc.name: InputScreenData_test_001 * @tc.desc: Verify the InputScreenData function. diff --git a/services/softbusadapter/test/unittest/src/softbus_adapter_test.cpp b/services/softbusadapter/test/unittest/src/softbus_adapter_test.cpp index f299396b..d7be3eec 100644 --- a/services/softbusadapter/test/unittest/src/softbus_adapter_test.cpp +++ b/services/softbusadapter/test/unittest/src/softbus_adapter_test.cpp @@ -106,6 +106,10 @@ HWTEST_F(SoftbusAdapterTest, CreateSoftbusSessionServer_001, TestSize.Level1) streamData = &sData; softbusAdapter.OnBytesReceived(sessionId, data, dataLen); softbusAdapter.OnStreamReceived(sessionId, streamData, ext, frameInfo); + dataLen = DSCREEN_MAX_RECV_DATA_LEN + 1; + sData.bufLen = DSCREEN_MAX_RECV_DATA_LEN + 1; + softbusAdapter.OnBytesReceived(sessionId, data, dataLen); + softbusAdapter.OnStreamReceived(sessionId, streamData, ext, frameInfo); dataLen = 100; sData.bufLen = 100; softbusAdapter.OnBytesReceived(sessionId, data, dataLen); -- Gitee From 5802f41f2157bf02568ad41e37a21113300f017f Mon Sep 17 00:00:00 2001 From: pwx1285814 Date: Thu, 8 Aug 2024 17:31:56 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=8D=E5=A4=8D?= =?UTF-8?q?=E6=8A=95=E5=B1=8F=E5=81=B6=E7=8E=B0=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: pwx1285814 Change-Id: I42bc2457e57ec3eb3d351a9ff1976f82eb29aa31 Signed-off-by: pwx1285814 --- .../screenregionmgr/1.0/src/screenregion.cpp | 22 ++---- .../screenregionmgr/2.0/src/screenregion.cpp | 2 +- .../dscreenmgr/1.0/src/dscreen.cpp | 6 +- .../dscreenmgr/2.0/src/dscreen.cpp | 6 +- .../1.0/src/screenregion_test.cpp | 2 +- .../decoder/src/image_sink_decoder.cpp | 8 ++- .../screensinktrans/src/screen_sink_trans.cpp | 72 ++++++++++--------- .../src/screen_source_trans.cpp | 8 ++- .../src/image_sink_decoder_test.cpp | 12 ++-- .../src/screen_sink_trans_test.cpp | 4 +- 10 files changed, 77 insertions(+), 65 deletions(-) diff --git a/services/screenservice/sinkservice/screenregionmgr/1.0/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/1.0/src/screenregion.cpp index 3624f722..d6fe6b31 100644 --- a/services/screenservice/sinkservice/screenregionmgr/1.0/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/1.0/src/screenregion.cpp @@ -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 @@ -179,24 +179,16 @@ int32_t ScreenRegion::Stop() return DH_SUCCESS; } - if (sinkTrans_ == nullptr) { + if (sinkTrans_ != nullptr) { + (void)sinkTrans_->Stop(); + (void)sinkTrans_->Release(); + } else { DHLOGE("sink trans not init."); + (void)ScreenClient::GetInstance().RemoveWindow(windowId_); return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT; } - int32_t ret = sinkTrans_->Stop(); - if (ret != DH_SUCCESS) { - DHLOGE("sink trans stop failed."); - return ret; - } - - ret = sinkTrans_->Release(); - if (ret != DH_SUCCESS) { - DHLOGE("sink trans release failed."); - return ret; - } - - ret = ScreenClient::GetInstance().RemoveWindow(windowId_); + int32_t ret = ScreenClient::GetInstance().RemoveWindow(windowId_); if (ret != DH_SUCCESS) { DHLOGE("remove window failed."); return ret; diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp index 19603a27..78269dce 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp @@ -313,7 +313,7 @@ void ScreenRegion::OnEngineMessage(const std::shared_ptr &messag json paramJson; paramJson[KEY_DEV_ID] = remoteDevId_; auto avMessage = std::make_shared(msgType, paramJson.dump(), remoteDevId_); - + if (receiverAdapter_ == nullptr) { DHLOGE("av transport receiver adapter is nullptr."); return; diff --git a/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen.cpp index 8e862c44..5c4951f7 100644 --- a/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen.cpp @@ -156,8 +156,12 @@ void DScreen::TaskThreadLoop() std::shared_ptr task; { std::unique_lock lock(taskQueueMtx_); - taskQueueCond_.wait_for(lock, std::chrono::seconds(TASK_WAIT_SECONDS), + auto status = taskQueueCond_.wait_for(lock, std::chrono::seconds(TASK_WAIT_SECONDS), [this]() { return !taskQueue_.empty(); }); + if (!status) { + DHLOGD("Task queue wait timeout after %{public}d seconds.", TASK_WAIT_SECONDS); + continue; + } if (taskQueue_.empty()) { continue; } diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index e68a659d..458a8dcd 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -599,8 +599,12 @@ void DScreen::TaskThreadLoop() std::shared_ptr task; { std::unique_lock lock(taskQueueMtx_); - taskQueueCond_.wait_for(lock, std::chrono::seconds(TASK_WAIT_SECONDS), + auto status = taskQueueCond_.wait_for(lock, std::chrono::seconds(TASK_WAIT_SECONDS), [this]() { return !taskQueue_.empty(); }); + if (!status) { + DHLOGD("Task queue wait timeout after %{public}d seconds.", TASK_WAIT_SECONDS); + continue; + } if (taskQueue_.empty()) { continue; } diff --git a/services/screenservice/test/unittest/sinkservice/screenregionmgr/1.0/src/screenregion_test.cpp b/services/screenservice/test/unittest/sinkservice/screenregionmgr/1.0/src/screenregion_test.cpp index 29a01970..1d22cc31 100644 --- a/services/screenservice/test/unittest/sinkservice/screenregionmgr/1.0/src/screenregion_test.cpp +++ b/services/screenservice/test/unittest/sinkservice/screenregionmgr/1.0/src/screenregion_test.cpp @@ -266,7 +266,7 @@ HWTEST_F(ScreenRegionTestV1, Stop_003, TestSize.Level1) screenRegion_->sinkTrans_ = std::make_shared(); int32_t ret = screenRegion_->Stop(); - EXPECT_EQ(ERR_DH_SCREEN_TRANS_NULL_VALUE, ret); + EXPECT_NE(ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT, ret); } } // namespace V1_0 } // namespace DistributedHardware diff --git a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp index 88213a5e..25015aa9 100644 --- a/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp +++ b/services/screentransport/screensinkprocessor/decoder/src/image_sink_decoder.cpp @@ -479,11 +479,15 @@ void ImageSinkDecoder::DecodeScreenData() int32_t bufferIndex = 0; { std::unique_lock lock(dataMutex_); - decodeCond_.wait_for(lock, std::chrono::milliseconds(DECODE_WAIT_MILLISECONDS), [this]() { + auto status = decodeCond_.wait_for(lock, std::chrono::milliseconds(DECODE_WAIT_MILLISECONDS), [this]() { return (!videoDataQueue_.empty() && !availableInputIndexsQueue_.empty() && !availableInputBufferQueue_.empty()); }); - + if (!status) { + DHLOGD("%{public}s: Data queue wait timeout after %{public}d ms.", DSCREEN_LOG_TAG, + DECODE_WAIT_MILLISECONDS); + continue; + } if (videoDataQueue_.empty() || availableInputIndexsQueue_.empty() || availableInputBufferQueue_.empty()) { DHLOGD("%{public}s: Index queue or data queue or buffer queue is empty.", DSCREEN_LOG_TAG); continue; diff --git a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp index e2595738..9f53f9ef 100644 --- a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp +++ b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp @@ -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 @@ -48,24 +48,29 @@ int32_t ScreenSinkTrans::SetUp(const VideoParam &localParam, const VideoParam &r int32_t ScreenSinkTrans::Release() { DHLOGI("%{public}s: Release.", DSCREEN_LOG_TAG); - if (imageProcessor_ == nullptr || screenChannel_ == nullptr) { - DHLOGE("%{public}s: Processor or channel is null, Setup first.", DSCREEN_LOG_TAG); - return ERR_DH_SCREEN_TRANS_NULL_VALUE; - } - int32_t ret = imageProcessor_->ReleaseImageProcessor(); - if (ret != DH_SUCCESS) { - DHLOGD("%{public}s: Release image processor failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); + int32_t ret = 0; + if (imageProcessor_ != nullptr) { + ret = imageProcessor_->ReleaseImageProcessor(); + if (ret != DH_SUCCESS) { + DHLOGW("%{public}s: Release image processor failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); + } + imageProcessor_ = nullptr; + } else { + DHLOGI("%{public}s: Processor is null, Setup first.", DSCREEN_LOG_TAG); } - imageProcessor_ = nullptr; - StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_SINK_RELEASE_SESSION_START); - ret = screenChannel_->ReleaseSession(); - FinishTrace(DSCREEN_HITRACE_LABEL); - if (ret != DH_SUCCESS) { - DHLOGD("%{public}s: Release channel session failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); + if (screenChannel_ != nullptr) { + StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_SINK_RELEASE_SESSION_START); + ret = screenChannel_->ReleaseSession(); + FinishTrace(DSCREEN_HITRACE_LABEL); + if (ret != DH_SUCCESS) { + DHLOGW("%{public}s: Release channel session failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); + } + screenChannel_ = nullptr; + } else { + DHLOGI("%{public}s: Channel is null, Setup first.", DSCREEN_LOG_TAG); } - screenChannel_ = nullptr; DHLOGI("%{public}s: Release success.", DSCREEN_LOG_TAG); return DH_SUCCESS; @@ -92,29 +97,26 @@ int32_t ScreenSinkTrans::Start() int32_t ScreenSinkTrans::Stop() { DHLOGI("%{public}s: Stop.", DSCREEN_LOG_TAG); - if (imageProcessor_ == nullptr || screenChannel_ == nullptr) { - DHLOGE("%{public}s: Processor or channel is null, Setup first.", DSCREEN_LOG_TAG); - return ERR_DH_SCREEN_TRANS_NULL_VALUE; - } - bool stopStatus = true; - int32_t ret = imageProcessor_->StopImageProcessor(); - if (ret != DH_SUCCESS) { - DHLOGD("%{public}s: Stop image processor failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); - stopStatus = false; - } - - StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_SINK_CLOSE_SESSION_START); - ret = screenChannel_->CloseSession(); - FinishTrace(DSCREEN_HITRACE_LABEL); - if (ret != DH_SUCCESS && ret != ERR_DH_SCREEN_TRANS_SESSION_NOT_OPEN) { - DHLOGD("%{public}s: Close Session failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); - stopStatus = false; + int32_t ret = 0; + if (imageProcessor_ != nullptr) { + ret = imageProcessor_->StopImageProcessor(); + if (ret != DH_SUCCESS) { + DHLOGW("%{public}s: Stop image processor failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); + } + } else { + DHLOGI("%{public}s: Processor is null, Setup first.", DSCREEN_LOG_TAG); } - if (!stopStatus) { - DHLOGE("%{public}s: Stop sink trans failed.", DSCREEN_LOG_TAG); - return ERR_DH_SCREEN_TRANS_ERROR; + if (screenChannel_ != nullptr) { + StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_SINK_CLOSE_SESSION_START); + ret = screenChannel_->CloseSession(); + FinishTrace(DSCREEN_HITRACE_LABEL); + if (ret != DH_SUCCESS) { + DHLOGW("%{public}s: Close Session failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret); + } + } else { + DHLOGI("%{public}s: Channel is null, Setup first.", DSCREEN_LOG_TAG); } DHLOGI("%{public}s: Stop success.", DSCREEN_LOG_TAG); diff --git a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp index 5fe9e2a5..60d8e390 100644 --- a/services/screentransport/screensourcetrans/src/screen_source_trans.cpp +++ b/services/screentransport/screensourcetrans/src/screen_source_trans.cpp @@ -415,7 +415,13 @@ void ScreenSourceTrans::FeedChannelData() std::shared_ptr screenData; { std::unique_lock lock(dataQueueMtx_); - dataCond_.wait_for(lock, std::chrono::seconds(DATA_WAIT_SECONDS), [this]() { return !dataQueue_.empty(); }); + auto status = dataCond_.wait_for( + lock, std::chrono::seconds(DATA_WAIT_SECONDS), [this]() { return !dataQueue_.empty(); }); + if (!status) { + DHLOGD("%{public}s: Data queue wait timeout after %{public}d seconds.", DSCREEN_LOG_TAG, + DATA_WAIT_SECONDS); + continue; + } if (dataQueue_.empty()) { DHLOGD("%{public}s:Data queue is empty.", DSCREEN_LOG_TAG); continue; diff --git a/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp b/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp index d3a6aa0b..62dfa99d 100644 --- a/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp +++ b/services/screentransport/test/unittest/screensinkprocessor/src/image_sink_decoder_test.cpp @@ -414,7 +414,7 @@ HWTEST_F(ImageSinkDecoderTest, on_output_format_changed_test_001, TestSize.Level /** * @tc.name: ProcessData_001 - * @tc.desc: Verify the DecodeScreenData function. + * @tc.desc: Verify the ProcessData function. * @tc.type: FUNC * @tc.require: Issue Number */ @@ -427,7 +427,7 @@ HWTEST_F(ImageSinkDecoderTest, ProcessData_001, TestSize.Level1) /** * @tc.name: ProcessData_002 - * @tc.desc: Verify the DecodeScreenData function. + * @tc.desc: Verify the ProcessData function. * @tc.type: FUNC * @tc.require: Issue Number */ @@ -441,7 +441,7 @@ HWTEST_F(ImageSinkDecoderTest, ProcessData_002, TestSize.Level1) /** * @tc.name: ProcessData_003 - * @tc.desc: Verify the DecodeScreenData function. + * @tc.desc: Verify the ProcessData function. * @tc.type: FUNC * @tc.require: Issue Number */ @@ -454,7 +454,7 @@ HWTEST_F(ImageSinkDecoderTest, ProcessData_003, TestSize.Level1) /** * @tc.name: ProcessData_004 - * @tc.desc: Verify the DecodeScreenData function. + * @tc.desc: Verify the ProcessData function. * @tc.type: FUNC * @tc.require: Issue Number */ @@ -469,7 +469,7 @@ HWTEST_F(ImageSinkDecoderTest, ProcessData_004, TestSize.Level1) /** * @tc.name: ProcessData_005 - * @tc.desc: Verify the DecodeScreenData function. + * @tc.desc: Verify the ProcessData function. * @tc.type: FUNC * @tc.require: Issue Number */ @@ -485,7 +485,7 @@ HWTEST_F(ImageSinkDecoderTest, ProcessData_005, TestSize.Level1) /** * @tc.name: ProcessData_006 - * @tc.desc: Verify the DecodeScreenData function. + * @tc.desc: Verify the ProcessData function. * @tc.type: FUNC * @tc.require: Issue Number */ diff --git a/services/screentransport/test/unittest/screensinktrans/src/screen_sink_trans_test.cpp b/services/screentransport/test/unittest/screensinktrans/src/screen_sink_trans_test.cpp index 24185062..51b6a590 100644 --- a/services/screentransport/test/unittest/screensinktrans/src/screen_sink_trans_test.cpp +++ b/services/screentransport/test/unittest/screensinktrans/src/screen_sink_trans_test.cpp @@ -120,7 +120,7 @@ HWTEST_F(ScreenSinkTransTest, release_test_001, TestSize.Level1) HWTEST_F(ScreenSinkTransTest, release_test_002, TestSize.Level1) { trans_->imageProcessor_ = nullptr; - EXPECT_EQ(ERR_DH_SCREEN_TRANS_NULL_VALUE, trans_->Release()); + EXPECT_EQ(DH_SUCCESS, trans_->Release()); } /** @@ -143,7 +143,7 @@ HWTEST_F(ScreenSinkTransTest, start_test_002, TestSize.Level1) */ HWTEST_F(ScreenSinkTransTest, stop_test_002, TestSize.Level1) { - EXPECT_EQ(ERR_DH_SCREEN_TRANS_ERROR, trans_->Stop()); + EXPECT_EQ(DH_SUCCESS, trans_->Stop()); } /** -- Gitee