diff --git a/bundle.json b/bundle.json index d3216ec3f8ab37c8ceaf0ab5b2865d7448b4a6d2..06fa4e643d3a9ff79268794468cb87d03d211a1a 100644 --- a/bundle.json +++ b/bundle.json @@ -39,6 +39,7 @@ "graphic_2d", "samgr", "safwk", + "hicollie", "hitrace", "c_utils", "player_framework", diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index b684ff584308e728243ea229a7823cc813a6728c..6f8e1f38559df2621b961607d0e22db494149650 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -93,7 +93,7 @@ const std::string JPEG_SESSION_NAME = "ohos.dhardware.dscreen.jpeg"; /* Screen dump data file path name */ const std::string DUMP_FILE_PATH = "/data/data/dscreen"; -/*YUV*/ +/* YUV */ constexpr int32_t YR_PARAM = 66; constexpr int32_t YG_PARAM = 129; constexpr int32_t YB_PARAM = 25; @@ -225,6 +225,8 @@ constexpr int32_t JPEG_QUALITY = 80; constexpr uint32_t BIT_RATE = 12000000; constexpr int32_t WAIT_TIMEOUT_MS = 5000; constexpr uint32_t SYSTEM_PARAM_VALUE_SIZE = 50; +constexpr uint64_t WATCHDOG_INTERVAL_TIME_MS = 20 * 1000; +constexpr uint64_t WATCHDOG_DELAY_TIME_MS = 5 * 1000; } // namespace DistributedHardware } // namespace OHOS #endif \ No newline at end of file diff --git a/services/common/utils/src/dscreen_hidumper.cpp b/services/common/utils/src/dscreen_hidumper.cpp index 1be776b189312861e6d602a48bdb8bbe6910e238..12837c190d5e257192bdd6e661c6dc08898e67b7 100644 --- a/services/common/utils/src/dscreen_hidumper.cpp +++ b/services/common/utils/src/dscreen_hidumper.cpp @@ -243,7 +243,7 @@ void DscreenHidumper::SaveFile(std::string file, const VideoData &video) } if ((static_cast(fileSize) + video.size) < DUMP_FILE_MAX_SIZE) { SetFileFlagFalse(); - ofs.write((const char *)(video.data), video.size); + ofs.write(reinterpret_cast(video.data), video.size); } else { SetFileFlagTrue(); } diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter.cpp index d5d48f4ffc2a24ad9aac5b01430450f5461e0ba7..97747b3e2565f1b4c0adb3c62b69a129aef69a9b 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter.cpp @@ -174,18 +174,22 @@ int32_t AVTransReceiverAdapter::OnDataAvailable(const std::shared_ptrOnEngineDataDone(buffer); + } + if (receiverEngine_ == nullptr) { + DHLOGE("av transport receiver engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } #ifdef DUMP_DSCREENREGION_FILE - if (DscreenHidumper::GetInstance().GetFlagStatus()) { - receiverEngine_->StartDumpMediaData(); - } else { - receiverEngine_->StopDumpMediaData(); - } - if (DscreenHidumper::GetInstance().GetTransReDumpFlag()) { - receiverEngine_->ReStartDumpMediaData(); - DscreenHidumper::GetInstance().SetTransReDumpFlagFalse(); - } -#endif + if (DscreenHidumper::GetInstance().GetFlagStatus()) { + receiverEngine_->StartDumpMediaData(); + } else { + receiverEngine_->StopDumpMediaData(); + } + if (DscreenHidumper::GetInstance().GetTransReDumpFlag()) { + receiverEngine_->ReStartDumpMediaData(); + DscreenHidumper::GetInstance().SetTransReDumpFlagFalse(); } +#endif return DH_AVT_SUCCESS; } } // namespace DistributedHardware diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index c34fa2d6e045be2ae5ba0486c08868f03518d0d6..c2d9bf9d286a2c761345d0f66cabdc009b2bb5ac 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -86,6 +86,7 @@ ohos_shared_library("distributed_screen_source") { "distributed_hardware_fwk:libdhfwk_sdk", "graphic_2d:libcomposer", "graphic_2d:surface", + "hicollie:libhicollie", "hisysevent:libhisysevent", "ipc:ipc_core", "player_framework:media_client", diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h index f450c6d0c4b4b9b73c18a183e48dd712a3f766f9..b1d65692a14440cbc8f16fed43d4380e3ac4d933 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h @@ -143,6 +143,7 @@ private: std::mutex taskQueueMtx_; std::queue> taskQueue_; bool taskThreadRunning_; + bool watchdogFlag_; std::shared_ptr senderAdapter_; OHOS::sptr syncFence_ = SyncFence::INVALID_FENCE; diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index b760bb47e172dd1b8ff55ea7cc6eee669d1520f2..859372381f69af6f5b4818caea7b54ac16c8a9ee 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -29,6 +29,7 @@ #include "dscreen_log.h" #include "dscreen_hidumper.h" #include "dscreen_util.h" +#include "xcollie/watchdog.h" #include "common/include/screen_manager_adapter.h" namespace OHOS { @@ -52,7 +53,18 @@ DScreen::DScreen(const std::string &devId, const std::string &dhId, dscreenCallback_ = dscreenCallback; SetState(DISABLED); taskThreadRunning_ = true; + watchdogFlag_ = false; taskQueueThread_ = std::thread(&DScreen::TaskThreadLoop, this); + auto taskFunc = [this]() { + if (watchdogFlag_) { + watchdogFlag_ = false; + } else { + DHLOGE("Watchdog : Dscreen TaskThreadLoop dead."); + _Exit(0); + } + }; + OHOS::HiviewDFX::Watchdog::GetInstance().RunPeriodicalTask("dscreenwatchdog", taskFunc, WATCHDOG_INTERVAL_TIME_MS, + WATCHDOG_DELAY_TIME_MS); } DScreen::~DScreen() @@ -559,6 +571,7 @@ void DScreen::TaskThreadLoop() DHLOGI("DScreen taskThread start. devId: %s, dhId: %s", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); while (taskThreadRunning_) { + watchdogFlag_ = true; std::shared_ptr task; { std::unique_lock lock(taskQueueMtx_); diff --git a/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter_test.cpp b/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter_test.cpp index 38307e1197b14003e2e9f6449f010563ebbd9407..d1bd7fdb34bc43387812a03396473207f80ada8a 100644 --- a/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter_test.cpp +++ b/services/screenservice/test/unittest/sinkservice/screenregionmgr/2.0/src/av_receiver_engine_adapter_test.cpp @@ -150,11 +150,13 @@ HWTEST_F(AVReceiverEngineAdapterTest, OnReceiverEvent_001, TestSize.Level1) std::shared_ptr message = nullptr; EXPECT_EQ(DH_SUCCESS, receiverAdapter_->OnMessageReceived(message)); std::shared_ptr buffer = nullptr; - EXPECT_EQ(DH_SUCCESS, receiverAdapter_->OnDataAvailable(buffer)); + EXPECT_EQ(ERR_DH_AV_TRANS_NULL_VALUE, receiverAdapter_->OnDataAvailable(buffer)); receiverAdapter_->adapterCallback_ = std::make_shared(); + receiverAdapter_->receiverEngine_ = std::make_shared(); EXPECT_EQ(DH_SUCCESS, receiverAdapter_->OnReceiverEvent(event)); EXPECT_EQ(DH_SUCCESS, receiverAdapter_->OnMessageReceived(message)); EXPECT_EQ(DH_SUCCESS, receiverAdapter_->OnDataAvailable(buffer)); + EXPECT_EQ(DH_SUCCESS, receiverAdapter_->Release()); } } // namespace DistributedHardware } // namespace OHOS