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 8910cb64331b1fce39b449c86d7611026d916b7e..65cfd2b644310c315b68c759311b4f1ac9f5299b 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 f0db730c5ac9231147764d7fb39df58f4a1af5b8..b8e2e57924dd4d53c2392122c889a73789f15474 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 cb928f6c1b46563382a21f2edafea576a87cd185..ff5ea2544fe5f98cc0263ca2f2a26b8ad2bf7e00 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 f97a3afa33cfdf7aadc4418d99a0f0435f2e89b4..b064c1103cf2912e7b24fcebe2a6d39b94705c27 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 260de368a5a59be2e5c199ffcf27c16478361178..18a0e5b89357fca3ee5f706bae7f14a2f66cbf27 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