From e8b874275bc4dafc8ebf28e7892ff79b62933965 Mon Sep 17 00:00:00 2001 From: pwx1285814 Date: Fri, 7 Jun 2024 13:36:33 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99dScreenCallback=5F=E5=8A=A0=E9=94=81?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E6=9D=A1=E4=BB=B6=E7=AB=9E=E4=BA=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: pwx1285814 Change-Id: I3f4b1c11adf30ad5d433776fcfb795b26685c1c0 --- .../dscreenmgr/1.0/include/dscreen_manager.h | 3 +- .../dscreenmgr/1.0/src/dscreen_manager.cpp | 15 ++-- .../dscreenmgr/2.0/include/dscreen_manager.h | 3 +- .../dscreenmgr/2.0/src/dscreen_manager.cpp | 14 ++-- .../dscreenmgr/2.0/src/dscreen_test.cpp | 79 ++++++++++++++++++- 5 files changed, 101 insertions(+), 13 deletions(-) diff --git a/services/screenservice/sourceservice/dscreenmgr/1.0/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/1.0/include/dscreen_manager.h index 8910cb64..65cfd2b6 100644 --- a/services/screenservice/sourceservice/dscreenmgr/1.0/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/1.0/include/dscreen_manager.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 @@ -71,6 +71,7 @@ private: DScreenManager(); std::mutex dScreenMapMtx_; std::mutex dScreenMapRelationMtx_; + std::mutex dScreenCallbackMtx_; std::map> mapRelations_; std::map> dScreens_; sptr dScreenSourceCallbackProxy_ = nullptr; diff --git a/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen_manager.cpp index f0db730c..b8e2e579 100644 --- a/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/1.0/src/dscreen_manager.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 @@ -75,7 +75,10 @@ int32_t DScreenManager::UnInit() std::lock_guard lock(dScreenMapRelationMtx_); mapRelations_.clear(); } - dScreenCallback_ = nullptr; + { + std::lock_guard lock(dScreenCallbackMtx_); + dScreenCallback_ = nullptr; + } DHLOGI("DScreenManager::UnInit success"); return DH_SUCCESS; } @@ -249,13 +252,15 @@ int32_t DScreenManager::EnableDistributedScreen(const std::string &devId, const return ERR_DH_SCREEN_SA_ENABLE_FAILED; } } - if (dScreenCallback_ == nullptr) { - dScreenCallback_ = std::make_shared(); - } + std::string dScreenIdx = devId + SEPERATOR + dhId; std::lock_guard lock(dScreenMapMtx_); std::shared_ptr dScreen = dScreens_[dScreenIdx]; if (dScreen == nullptr) { + std::lock_guard lock(dScreenCallbackMtx_); + if (dScreenCallback_ == nullptr) { + dScreenCallback_ = std::make_shared(); + } dScreen = std::make_shared(devId, dhId, dScreenCallback_); } 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 cb928f6c..ff5ea254 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen_manager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-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 @@ -77,6 +77,7 @@ private: private: std::string localDevId_; std::mutex dScreenMapMtx_; + std::mutex dScreenCallbackMtx_; std::map> dScreens_; IAVEngineProvider *providerPtr_ = 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 f97a3afa..b064c110 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen_manager.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 @@ -90,7 +90,10 @@ int32_t DScreenManager::Release() dScreens_.clear(); } providerPtr_ = nullptr; - dScreenCallback_ = nullptr; + { + std::lock_guard lock(dScreenCallbackMtx_); + dScreenCallback_ = nullptr; + } DHLOGI("DScreenManager::UnInit success"); return DH_SUCCESS; } @@ -243,13 +246,14 @@ int32_t DScreenManager::EnableDistributedScreen(const std::string &devId, const return ERR_DH_SCREEN_SA_ENABLE_FAILED; } } - if (dScreenCallback_ == nullptr) { - dScreenCallback_ = std::make_shared(); - } std::string dScreenIdx = devId + SEPERATOR + dhId; std::lock_guard lock(dScreenMapMtx_); std::shared_ptr dScreen = dScreens_[dScreenIdx]; if (dScreen == nullptr) { + std::lock_guard lock(dScreenCallbackMtx_); + if (dScreenCallback_ == nullptr) { + dScreenCallback_ = std::make_shared(); + } dScreen = std::make_shared(devId, dhId, dScreenCallback_); } int32_t dScreenState = dScreen->GetState(); diff --git a/services/screenservice/test/unittest/sourceservice/dscreenmgr/2.0/src/dscreen_test.cpp b/services/screenservice/test/unittest/sourceservice/dscreenmgr/2.0/src/dscreen_test.cpp index 260de368..18a0e5b8 100644 --- a/services/screenservice/test/unittest/sourceservice/dscreenmgr/2.0/src/dscreen_test.cpp +++ b/services/screenservice/test/unittest/sourceservice/dscreenmgr/2.0/src/dscreen_test.cpp @@ -112,7 +112,7 @@ HWTEST_F(DScreenTestV2, HandleEnable_001, TestSize.Level1) std::string param = "param"; std::string taskId = "taskId"; dScreen_->HandleEnable(param, taskId); - dScreen_-> dscreenCallback_ = std::make_shared(); + dScreen_->dscreenCallback_ = std::make_shared(); DScreenState state = ENABLING; dScreen_->SetState(state); dScreen_->HandleEnable(param, taskId); @@ -439,6 +439,83 @@ HWTEST_F(DScreenTestV2, OnEngineEvent_001, TestSize.Level1) dScreen_->OnEngineEvent(event, content); EXPECT_EQ(SCREEN_ID_INVALID, dScreen_->screenId_); } + +/** + * @tc.name: ChooseCodecType_001 + * @tc.desc: Verify the ChooseCodecType function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(DScreenTestV2, ChooseCodecType_001, TestSize.Level1) +{ + std::vector localVideoEncoders; + std::vector rmtVideoDecoders; + int32_t ret = dScreen_->ChooseCodecType(localVideoEncoders, rmtVideoDecoders); + EXPECT_EQ(ret, ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL); +} + +/** + * @tc.name: ChooseCodecType_002 + * @tc.desc: Verify the ChooseCodecType function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(DScreenTestV2, ChooseCodecType_002, TestSize.Level1) +{ + std::vector localVideoEncoders; + std::vector rmtVideoDecoders; + VideoEncoder videoEncoder; + videoEncoder.name = "ChooseCodecType_002"; + VideoDecoder videoDecoder; + videoDecoder.name = "ChooseCodecType_002"; + localVideoEncoders.push_back(videoEncoder); + rmtVideoDecoders.push_back(videoDecoder); + dScreen_->videoParam_ = std::make_shared(); + int32_t ret = dScreen_->ChooseCodecType(localVideoEncoders, rmtVideoDecoders); + EXPECT_EQ(ret, ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL); +} + +/** + * @tc.name: ChooseCodecType_003 + * @tc.desc: Verify the ChooseCodecType function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(DScreenTestV2, ChooseCodecType_003, TestSize.Level1) +{ + std::vector localVideoEncoders; + std::vector rmtVideoDecoders; + VideoEncoder videoEncoder; + videoEncoder.name = "HdiCodecAdapter.OMX.rk.video_encoder.hevc"; + VideoDecoder videoDecoder; + videoDecoder.name = "HdiCodecAdapter.OMX.rk.video_decoder.hevc"; + localVideoEncoders.push_back(videoEncoder); + rmtVideoDecoders.push_back(videoDecoder); + dScreen_->videoParam_ = std::make_shared(); + int32_t ret = dScreen_->ChooseCodecType(localVideoEncoders, rmtVideoDecoders); + EXPECT_EQ(ret, DH_SUCCESS); +} + +/** + * @tc.name: ChooseCodecType_004 + * @tc.desc: Verify the ChooseCodecType function. + * @tc.type: FUNC + * @tc.require: Issue Number + */ +HWTEST_F(DScreenTestV2, ChooseCodecType_004, TestSize.Level1) +{ + std::vector localVideoEncoders; + std::vector rmtVideoDecoders; + VideoEncoder videoEncoder; + videoEncoder.name = "HdiCodecAdapter.OMX.rk.video_encoder.avc"; + VideoDecoder videoDecoder; + videoDecoder.name = "HdiCodecAdapter.OMX.rk.video_decoder.avc"; + localVideoEncoders.push_back(videoEncoder); + rmtVideoDecoders.push_back(videoDecoder); + dScreen_->videoParam_ = std::make_shared(); + int32_t ret = dScreen_->ChooseCodecType(localVideoEncoders, rmtVideoDecoders); + EXPECT_EQ(ret, DH_SUCCESS); +} } } } \ No newline at end of file -- Gitee