From d9b5a913fd73a17604e36b99cb00b7bd5d6ccd3a Mon Sep 17 00:00:00 2001 From: yangli Date: Sat, 1 Jul 2023 23:58:25 +0800 Subject: [PATCH 1/9] 7.1 Signed-off-by: yangli --- common/include/dscreen_constants.h | 12 ++-- common/include/dscreen_errcode.h | 1 + .../2.0/src/av_receiver_engine_adapter.cpp | 10 +++- .../screenregionmgr/2.0/src/screenregion.cpp | 47 +++++++++------ .../2.0/src/screenregionmgr.cpp | 11 ++-- .../dscreenmgr/2.0/include/dscreen.h | 5 ++ .../2.0/src/av_sender_engine_adapter.cpp | 7 ++- .../dscreenmgr/2.0/src/dscreen.cpp | 59 +++++++++++++++---- 8 files changed, 107 insertions(+), 45 deletions(-) diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index 12a128c9..86df9d29 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -63,14 +63,15 @@ enum DataType : uint8_t { }; enum DScreenMsgType : uint32_t { - SETUP_SIGNAL = 0, + START_MIRROR = 0, + START_MIRROR_SUCCESS = 1; + START_MIRROR_FAIL = 2; + STOP_MIRROR = 3; }; enum DScreenEventType : uint32_t { - REMOTE_MSG_RECEIVED = 0, - SENDER_ENGINE_ERROR, - RECEIVER_ENGINE_ERROR, - TRANS_CHANNEL_CLOSED, + ENGINE_ERROR = 0, + TRANS_CHANNEL_CLOSED = 1, }; /* Screen package name */ @@ -207,6 +208,7 @@ constexpr size_t DATA_BUFFER_MAX_SIZE = 10 * 1024 * 1024; constexpr uint8_t TASK_WAIT_SECONDS = 1; constexpr int32_t JPEG_QUALITY = 80; constexpr uint32_t BIT_RATE = 12000000; +constexpr int32_t WAIT_TIMEOUT_MS = 5000; } // namespace DistributedHardware } // namespace OHOS #endif \ No newline at end of file diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index 2b92e14c..c51528f8 100644 --- a/common/include/dscreen_errcode.h +++ b/common/include/dscreen_errcode.h @@ -122,6 +122,7 @@ enum DScreenErrorCode { ERR_DH_AV_TRANS_STOP_FAILED = -58008, ERR_DH_AV_TRANS_FEED_DATA_FAILED = -58009, ERR_DH_AV_TRANS_SEND_MSG_FAILED = -58010, + ERR_DH_AV_TRANS_SINK_START_FAILED = -58011, }; } // namespace DistributedHardware } // namespace OHOS 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 5f01af00..f53aa632 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 @@ -127,15 +127,19 @@ int32_t AVTransReceiverAdapter::RegisterAdapterCallback(const std::shared_ptrOnEngineEvent(DScreenEventType::RECEIVER_ENGINE_ERROR, event.content); - } + adapterCallback_->OnEngineEvent(DScreenEventType::ENGINE_ERROR, event.content); break; default: DHLOGE("Invalid event type."); diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp index f5359ea0..78839928 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp @@ -68,20 +68,23 @@ int32_t ScreenRegion::Release() DHLOGI("ScreenRegion not running, no need release"); return DH_SUCCESS; } + ScreenClient::GetInstance().RemoveWindow(windowId_); + if (receiverAdapter_ == nullptr) { DHLOGE("av transport receiver adapter is nullptr."); return ERR_DH_AV_TRANS_NULL_VALUE; } + int32_t ret = receiverAdapter_->Stop(); if (ret != DH_SUCCESS) { DHLOGE("sink trans stop failed."); - return ret; } - ret = ScreenClient::GetInstance().RemoveWindow(windowId_); + + ret = receiverAdapter_->Release(); if (ret != DH_SUCCESS) { - DHLOGE("remove window failed."); - return ret; + DHLOGE("release av receiver adapter failed."); } + isRunning = false; return DH_SUCCESS; } @@ -111,21 +114,17 @@ int32_t ScreenRegion::StartReceiverEngine(const std::string &content) int32_t ScreenRegion::StopReceiverEngine() { DHLOGI("StopReceiverEngine, remoteDevId: %s, screenId: %u", GetAnonyString(remoteDevId_).c_str(), screenId_); + + int32_t ret = ScreenClient::GetInstance().RemoveWindow(windowId_); + if (ret != DH_SUCCESS) { + DHLOGE("remove window failed."); + } + if (receiverAdapter_ == nullptr) { DHLOGE("av transport receiver adapter is null."); return ERR_DH_AV_TRANS_NULL_VALUE; } - int32_t ret = receiverAdapter_->Stop(); - if (ret != DH_SUCCESS) { - DHLOGE("stop av receiver adapter failed."); - return ERR_DH_AV_TRANS_STOP_FAILED; - } - ret = receiverAdapter_->Release(); - if (ret != DH_SUCCESS) { - DHLOGE("release av receiver adapter failed."); - return ERR_DH_AV_TRANS_STOP_FAILED; - } - return DH_SUCCESS; + return receiverAdapter_->Stop(); } int32_t ScreenRegion::SetUp(const std::string &content) @@ -243,8 +242,10 @@ void ScreenRegion::PublishMessage(const DHTopic topic, const uint64_t &screenId, void ScreenRegion::OnEngineEvent(DScreenEventType event, const std::string &content) { - (void)event; (void)content; + if (event == DScreenEventType::ENGINE_ERROR) { + StopReceiverEngine(); + } } void ScreenRegion::OnEngineMessage(const std::shared_ptr &message) @@ -254,8 +255,18 @@ void ScreenRegion::OnEngineMessage(const std::shared_ptr &messag DHLOGE("received engine message is null."); return; } - if (message->type_ == DScreenMsgType::SETUP_SIGNAL) { - StartReceiverEngine(message->content_); + DHLOGI("On source device engine message type =%d.", message->type_); + if (message->type_ == DScreenMsgType::START_MIRROR) { + int32_t ret = StartReceiverEngine(message->content_); + DScreenMsgType msgType = (ret == DH_SUCCESS) ? DScreenMsgType::START_MIRROR_SUCCESS : + DScreenMsgType::START_MIRROR_FAIL; + + json paramJson; + paramJson[KEY_DEV_ID] = remoteDevId_; + auto avMessage = std::make_shared(msgType, paramJson.dump(), remoteDevId_); + receiverAdapter_->SendMessageToRemote(avMessage); + } else if (message->type_ == DScreenMsgType::STOP_MIRROR) { + StopReceiverEngine(); } } diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp index 05d755d1..b8a209f5 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp @@ -105,14 +105,13 @@ int32_t ScreenRegionManager::CreateDScreenRegion(const std::string &peerDevId) int32_t ScreenRegionManager::DestoryDScreenRegion(const std::string &peerDevId) { DHLOGI("DestoryDScreenRegion for peerDevId: %s", GetAnonyString(peerDevId).c_str()); - for (auto iter = screenRegions_.begin(); iter != screenRegions_.end();) { - if ((*iter)->GetRemoteDevId() == peerDevId) { - (*iter)->Release(); - iter = screenRegions_.erase(iter); - } else { - iter++; + std::lock_guard lock(screenRegionsMtx_); + for (const auto ®in : screenRegions_) { + if (region != nullptr) { + region->Release(); } } + screenRegions_.clear(); return DH_SUCCESS; } diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h index dc6cb63b..a30694ea 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h @@ -112,6 +112,7 @@ private: void ChooseParameter(std::string &codecType, std::string &pixelFormat); bool CheckJsonData(json &attrJson); void SetState(DScreenState state); + int32_t WaitForSinkStarted(); std::string devId_; std::string dhId_; @@ -130,6 +131,10 @@ private: bool taskThreadRunning_; std::shared_ptr senderAdapter_; OHOS::sptr syncFence_ = SyncFence::INVALID_FENCE; + + std::mutex waitSinkMtx_; + std::condition_variable waitSinkConVac_; + std::atomic sinkStartSuccess_ {false}; }; } // namespace V2_0 } // namespace DistributedHardware diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/av_sender_engine_adapter.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/av_sender_engine_adapter.cpp index 9464606a..57962692 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/av_sender_engine_adapter.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/av_sender_engine_adapter.cpp @@ -21,8 +21,6 @@ namespace OHOS { namespace DistributedHardware { -constexpr int32_t WAIT_TIMEOUT_MS = 5000; - int32_t AVTransSenderAdapter::Initialize(IAVEngineProvider *providerPtr, const std::string &peerDevId) { DHLOGI("Initialize enter"); @@ -54,6 +52,8 @@ int32_t AVTransSenderAdapter::Release() } initialized_ = false; senderEngine_ = nullptr; + chnCreateSuccess_ = false; + transStartSuccess_ = false; return DH_SUCCESS; } @@ -95,6 +95,7 @@ int32_t AVTransSenderAdapter::Stop() return ERR_DH_AV_TRANS_STOP_FAILED; } DHLOGI("Stop Success"); + transStartSuccess_ = false; return DH_SUCCESS; } @@ -242,7 +243,7 @@ int32_t AVTransSenderAdapter::OnSenderEvent(const AVTransEvent& event) case EventType::EVENT_ENGINE_ERROR: case EventType::EVENT_REMOTE_ERROR: if (adapterCallback_ != nullptr) { - adapterCallback_->OnEngineEvent(DScreenEventType::RECEIVER_ENGINE_ERROR, event.content); + adapterCallback_->OnEngineEvent(DScreenEventType::ENGINE_ERROR, event.content); } break; default: diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index 0619f733..c641dc82 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -204,17 +204,14 @@ void DScreen::HandleDisconnect() return; } SetState(DISCONNECTING); - int32_t ret = RemoveSurface(); - if (ret != DH_SUCCESS) { - DHLOGE("remove image surface failed."); - } - ret = StopSenderEngine(); + int32_t ret = StopSenderEngine(); if (ret != DH_SUCCESS) { SetState(CONNECTED); DHLOGE("dScreen Stop failed."); return; } SetState(ENABLED); + RemoveSurface(); ReportScreenMirrorEvent(DSCREEN_PROJECT_END, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), "dscreen disconnect success"); } @@ -359,6 +356,14 @@ int32_t DScreen::StopSenderEngine() DHLOGE("av transport sender adapter is null."); return ERR_DH_AV_TRANS_NULL_VALUE; } + + json paramJson; + paramJson[KEY_DEV_ID] = devId_; + paramJson[KEY_DH_ID] - dhId_; + + auto avMessage = std:: make_shared(DScreenMsgType::STOP_MIRROR, paramJson.dump(), devId_); + senderAdapter_->SenderMessageToRemote(avMessage); + int32_t ret = senderAdapter_->Stop(); if (ret != DH_SUCCESS) { DHLOGE("stop av sender adapter failed."); @@ -419,24 +424,45 @@ int32_t DScreen::SetUp() videoParam_->SetVideoHeight(displayRect.height); json paramJson; - paramJson[KEY_DEV_ID] = devId_; paramJson[KEY_DH_ID] = dhId_; paramJson[KEY_SCREEN_ID] = screenId_; paramJson[KEY_VIDEO_PARAM] = *videoParam_; paramJson[KEY_MAPRELATION] = *mapRelation; - auto avMessage = std::make_shared(DScreenMsgType::SETUP_SIGNAL, paramJson.dump(), devId_); + auto avMessage = std::make_shared(DScreenMsgType::START_MIRROR, paramJson.dump(), devId_); int32_t ret = senderAdapter_->SendMessageToRemote(avMessage); if (ret != DH_SUCCESS) { - DHLOGE("set message to remote engine failed."); + DHLOGE("send message to remote engine failed."); + return ret; + } + + ret = WaitForSinkStarted(); + if (ret != DH_SUCCESS) { + DHLOGE("send message to start remote device engine failed."); return ret; } + std::string codecType; std::string pixelFormat; ChooseParameter(codecType, pixelFormat); return senderAdapter_->SetParameter(AVTransTag::ENGINE_READY, OWNER_NAME_D_SCREEN); } +int32_t DScreen::WaitForSinkStarted() +{ + std::unique_lock lock(waitSinkMtx_); + auto status = waitSinkCondVar_.wait_for(lock, std::chrono::milliseconds(WAIT_TIMEOUT_MS)); + if (status = std::cv_status::timeout) { + DHLOGE("wait for sink device engine start timeout"); + return ERR_DH_AV_TRANS_TIMEOUT; + } + if (!sinkStartSuccess_.load()) { + DHLOGE("start sink device engine failed"); + return ERR_DH_AV_TRANS_SINK_START_FAILED; + } + return DH_SUCCESS; +} + int32_t DScreen::NegotiateCodecType(const std::string &remoteCodecInfoStr) { json remoteCodecArray = json::parse(remoteCodecInfoStr, nullptr, false); @@ -529,13 +555,26 @@ bool DScreen::CheckJsonData(json &attrJson) void DScreen::OnEngineEvent(DScreenEventType event, const std::string &content) { - (void)event; (void)content; + if (event == DScreenEventType::ENGINE_ERROR) { + StopSenderEngine(); + } else if (event == DScreenEventType:: TRANS_CHANNEL_CLOSED) { + HandleDisconnect(); + } } void DScreen::OnEngineMessage(const std::shared_ptr &message) { - (void)message; + if (message == nullptr) { + DHLOGE("receiver engine message is null."); + return; + } + DHLOGI("On sink device engine message received, message type =%d.", message->type_); + if ((message->type_ == DScreenMsgType::START_MIRROR_SUCCESS) || + (message->type_ == DScreenMsgType::START_MIRROR_FAIL)) { + sinkStartSuccess_ = (message->type_ == DScreenMsgType::START_MIRROR_SUCCESS); + waitSinkCondVar_.notify_one(); + } } std::shared_ptr DScreen::GetVideoParam() -- Gitee From 219de42f27fc1c14b2e7ff815490086f3e944b8d Mon Sep 17 00:00:00 2001 From: yangli Date: Sun, 2 Jul 2023 10:56:43 +0800 Subject: [PATCH 2/9] 7.2 Signed-off-by: yangli --- common/include/dscreen_constants.h | 6 +++--- .../sourceservice/dscreenmgr/2.0/src/dscreen.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index 86df9d29..d779d5d4 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -64,9 +64,9 @@ enum DataType : uint8_t { enum DScreenMsgType : uint32_t { START_MIRROR = 0, - START_MIRROR_SUCCESS = 1; - START_MIRROR_FAIL = 2; - STOP_MIRROR = 3; + START_MIRROR_SUCCESS = 1, + START_MIRROR_FAIL = 2, + STOP_MIRROR = 3, }; enum DScreenEventType : uint32_t { diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index c641dc82..1ece3e0c 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -361,7 +361,7 @@ int32_t DScreen::StopSenderEngine() paramJson[KEY_DEV_ID] = devId_; paramJson[KEY_DH_ID] - dhId_; - auto avMessage = std:: make_shared(DScreenMsgType::STOP_MIRROR, paramJson.dump(), devId_); + auto avMessage = std::make_shared(DScreenMsgType::STOP_MIRROR, paramJson.dump(), devId_); senderAdapter_->SenderMessageToRemote(avMessage); int32_t ret = senderAdapter_->Stop(); @@ -558,7 +558,7 @@ void DScreen::OnEngineEvent(DScreenEventType event, const std::string &content) (void)content; if (event == DScreenEventType::ENGINE_ERROR) { StopSenderEngine(); - } else if (event == DScreenEventType:: TRANS_CHANNEL_CLOSED) { + } else if (event == DScreenEventType :: TRANS_CHANNEL_CLOSED) { HandleDisconnect(); } } -- Gitee From 6531ea8152afde92b76716cdf1fd8ebe5106d239 Mon Sep 17 00:00:00 2001 From: yangli Date: Sun, 2 Jul 2023 11:10:00 +0800 Subject: [PATCH 3/9] 7.2 Signed-off-by: yangli --- .../sinkservice/screenregionmgr/2.0/src/screenregion.cpp | 7 +------ .../screenregionmgr/2.0/src/screenregionmgr.cpp | 2 +- .../sourceservice/dscreenmgr/2.0/include/dscreen.h | 2 +- .../sourceservice/dscreenmgr/2.0/src/dscreen.cpp | 8 ++++---- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp index 78839928..b43a1ba6 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp @@ -138,7 +138,6 @@ int32_t ScreenRegion::SetUp(const std::string &content) return ERR_DH_SCREEN_INPUT_PARAM_INVALID; } screenId_ = contentJson[KEY_SCREEN_ID].get(); - remoteDevId_ = contentJson[KEY_DEV_ID].get(); displayId_ = Rosen::DisplayManager::GetInstance().GetDefaultDisplayId(); videoParam_ = std::make_shared(contentJson[KEY_VIDEO_PARAM].get()); mapRelation_ = std::make_shared(contentJson[KEY_MAPRELATION].get()); @@ -250,12 +249,11 @@ void ScreenRegion::OnEngineEvent(DScreenEventType event, const std::string &cont void ScreenRegion::OnEngineMessage(const std::shared_ptr &message) { - DHLOGI("OnEngineMessage enter"); if (message == nullptr) { DHLOGE("received engine message is null."); return; } - DHLOGI("On source device engine message type =%d.", message->type_); + DHLOGI("On source device engine message receiver, message type =%d.", message->type_); if (message->type_ == DScreenMsgType::START_MIRROR) { int32_t ret = StartReceiverEngine(message->content_); DScreenMsgType msgType = (ret == DH_SUCCESS) ? DScreenMsgType::START_MIRROR_SUCCESS : @@ -378,9 +376,6 @@ bool ScreenRegion::CheckContentJson(json &contentJson) if (!IsUInt64(contentJson, KEY_SCREEN_ID)) { return false; } - if (!IsString(contentJson, KEY_DEV_ID)) { - return false; - } return true; } } // namespace V1_0 diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp index b8a209f5..b501f1f3 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregionmgr.cpp @@ -106,7 +106,7 @@ int32_t ScreenRegionManager::DestoryDScreenRegion(const std::string &peerDevId) { DHLOGI("DestoryDScreenRegion for peerDevId: %s", GetAnonyString(peerDevId).c_str()); std::lock_guard lock(screenRegionsMtx_); - for (const auto ®in : screenRegions_) { + for (const auto ®ion : screenRegions_) { if (region != nullptr) { region->Release(); } diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h index a30694ea..b011114e 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h @@ -133,7 +133,7 @@ private: OHOS::sptr syncFence_ = SyncFence::INVALID_FENCE; std::mutex waitSinkMtx_; - std::condition_variable waitSinkConVac_; + std::condition_variable waitSinkCondVar_; std::atomic sinkStartSuccess_ {false}; }; } // namespace V2_0 diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index 1ece3e0c..a8ca2e76 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -359,10 +359,10 @@ int32_t DScreen::StopSenderEngine() json paramJson; paramJson[KEY_DEV_ID] = devId_; - paramJson[KEY_DH_ID] - dhId_; + paramJson[KEY_DH_ID] = dhId_; auto avMessage = std::make_shared(DScreenMsgType::STOP_MIRROR, paramJson.dump(), devId_); - senderAdapter_->SenderMessageToRemote(avMessage); + senderAdapter_->SendMessageToRemote(avMessage); int32_t ret = senderAdapter_->Stop(); if (ret != DH_SUCCESS) { @@ -452,7 +452,7 @@ int32_t DScreen::WaitForSinkStarted() { std::unique_lock lock(waitSinkMtx_); auto status = waitSinkCondVar_.wait_for(lock, std::chrono::milliseconds(WAIT_TIMEOUT_MS)); - if (status = std::cv_status::timeout) { + if (status == std::cv_status::timeout) { DHLOGE("wait for sink device engine start timeout"); return ERR_DH_AV_TRANS_TIMEOUT; } @@ -566,7 +566,7 @@ void DScreen::OnEngineEvent(DScreenEventType event, const std::string &content) void DScreen::OnEngineMessage(const std::shared_ptr &message) { if (message == nullptr) { - DHLOGE("receiver engine message is null."); + DHLOGE("received engine message is null."); return; } DHLOGI("On sink device engine message received, message type =%d.", message->type_); -- Gitee From 71c8d1d0bc7698db612a40417a8e1e9446e6140e Mon Sep 17 00:00:00 2001 From: yangli Date: Sun, 2 Jul 2023 11:22:11 +0800 Subject: [PATCH 4/9] 7.2 Signed-off-by: yangli --- .../2.0/src/av_receiver_engine_adapter.cpp | 2 +- .../screenregionmgr/2.0/src/screenregion.cpp | 2 +- .../sourceservice/dscreenmgr/2.0/src/dscreen.cpp | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) 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 f53aa632..77ca9e88 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 @@ -130,7 +130,7 @@ int32_t AVTransReceiverAdapter::OnReceiverEvent(const AVTransEvent& event) if (adapterCallback_ == nullptr) { DHLOGE("adapter callback is null."); - return ERR_DH_AV _TRANS_NULL_VALUE; + return ERR_DH_AV_TRANS_NULL_VALUE; } switch (event.type) { diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp index b43a1ba6..1c8ab66a 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp @@ -253,7 +253,7 @@ void ScreenRegion::OnEngineMessage(const std::shared_ptr &messag DHLOGE("received engine message is null."); return; } - DHLOGI("On source device engine message receiver, message type =%d.", message->type_); + DHLOGI("On source device engine message received, message type =%d.", message->type_); if (message->type_ == DScreenMsgType::START_MIRROR) { int32_t ret = StartReceiverEngine(message->content_); DScreenMsgType msgType = (ret == DH_SUCCESS) ? DScreenMsgType::START_MIRROR_SUCCESS : diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index a8ca2e76..0557be03 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -558,7 +558,7 @@ void DScreen::OnEngineEvent(DScreenEventType event, const std::string &content) (void)content; if (event == DScreenEventType::ENGINE_ERROR) { StopSenderEngine(); - } else if (event == DScreenEventType :: TRANS_CHANNEL_CLOSED) { + } else if (event == DScreenEventType::TRANS_CHANNEL_CLOSED) { HandleDisconnect(); } } @@ -570,11 +570,11 @@ void DScreen::OnEngineMessage(const std::shared_ptr &message) return; } DHLOGI("On sink device engine message received, message type =%d.", message->type_); - if ((message->type_ == DScreenMsgType::START_MIRROR_SUCCESS) || + if ((message->type_ == DScreenMsgType::START_MIRROR_SUCCESS) || (message->type_ == DScreenMsgType::START_MIRROR_FAIL)) { - sinkStartSuccess_ = (message->type_ == DScreenMsgType::START_MIRROR_SUCCESS); - waitSinkCondVar_.notify_one(); - } + sinkStartSuccess_ = (message->type_ == DScreenMsgType::START_MIRROR_SUCCESS); + waitSinkCondVar_.notify_one(); + } } std::shared_ptr DScreen::GetVideoParam() -- Gitee From 06cdc03a92dc9ca1c8e5d5a041056190d78f86b9 Mon Sep 17 00:00:00 2001 From: yangli Date: Sun, 2 Jul 2023 11:25:11 +0800 Subject: [PATCH 5/9] 7.2 Signed-off-by: yangli --- .../sinkservice/screenregionmgr/2.0/src/screenregion.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp index 1c8ab66a..61b49199 100644 --- a/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/2.0/src/screenregion.cpp @@ -253,6 +253,7 @@ void ScreenRegion::OnEngineMessage(const std::shared_ptr &messag DHLOGE("received engine message is null."); return; } + DHLOGI("On source device engine message received, message type =%d.", message->type_); if (message->type_ == DScreenMsgType::START_MIRROR) { int32_t ret = StartReceiverEngine(message->content_); -- Gitee From be79a2ec548c897662b32758ec5589db01fabbf9 Mon Sep 17 00:00:00 2001 From: yangli Date: Sun, 2 Jul 2023 16:38:42 +0800 Subject: [PATCH 6/9] 7.2 Signed-off-by: yangli --- common/include/dscreen_constants.h | 2 - screenhandler/src/dscreen_handler.cpp | 4 ++ .../dscreenmgr/2.0/include/dscreen.h | 10 ++- .../dscreenmgr/2.0/src/dscreen.cpp | 71 ++++++++++++------- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index d779d5d4..aff79392 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -161,8 +161,6 @@ const std::string KEY_VIDEO_HEIGHT = "videoHeight"; const std::string KEY_COLOR_FORMAT = "colorFormat"; const std::string KEY_FPS = "fps"; const std::string KEY_CODECTYPE = "codecType"; -const std::string KEY_HISTREAMER_VIDEO_ENCODER = "histmVidEnc"; -const std::string KEY_HISTREAMER_VIDEO_DECODER = "histmVidDec"; const std::string SCREEN_CLIENT_WINDOW = "screenClientWindow"; const std::string KEY_DEV_ID = "devId"; const std::string KEY_DH_ID = "dhId"; diff --git a/screenhandler/src/dscreen_handler.cpp b/screenhandler/src/dscreen_handler.cpp index 349f7221..7432ff80 100644 --- a/screenhandler/src/dscreen_handler.cpp +++ b/screenhandler/src/dscreen_handler.cpp @@ -30,6 +30,10 @@ using json = nlohmann::json; namespace OHOS { namespace DistributedHardware { +namespace { +const std::string KEY_HISTREAMER_VIDEO_ENCODER = "histmVidEnc"; +const std::string KEY_HISTREAMER_VIDEO_DECODER = "histmVidDec"; +} IMPLEMENT_SINGLE_INSTANCE(DScreenHandler); DScreenHandler::DScreenHandler() diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h index b011114e..6c4773da 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/include/dscreen.h @@ -105,7 +105,15 @@ private: void HandleDisconnect(); int32_t StartSenderEngine(); int32_t StopSenderEngine(); - int32_t NegotiateCodecType(const std::string &remoteCodecInfoStr); + + /* + * Negotiate the codec format between local to remote device, + * for DScreen, local encoder screen, remote decoder it. + * rmtDecoderStr: remote Decoder description in JSON format + */ + int32_t NegotiateCodecType(const std::string &rmtDecoderStr); + int32_t ChooseCodecType(const std::vector &localVideoEncoders, + const std::vector &rmtVideoDecoders); int32_t ConfigSurface(); int32_t RemoveSurface(); int32_t SetUp(); diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index 0557be03..8398fede 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -122,7 +122,7 @@ void DScreen::HandleEnable(const std::string ¶m, const std::string &taskId) if (videoParam_ == nullptr) { videoParam_ = std::make_shared(); } - int32_t ret = NegotiateCodecType(attrJson[KEY_CODECTYPE]); + int32_t ret = NegotiateCodecType(attrJson[KEY_HISTREAMER_VIDEO_DECODER]); if (ret != DH_SUCCESS) { DHLOGE("HandleEnable, negotiate codec type failed."); dscreenCallback_->OnRegResult(shared_from_this(), taskId, ERR_DH_SCREEN_SA_ENABLE_FAILED, @@ -463,36 +463,56 @@ int32_t DScreen::WaitForSinkStarted() return DH_SUCCESS; } -int32_t DScreen::NegotiateCodecType(const std::string &remoteCodecInfoStr) +int32_t DScreen::NegotiateCodecType(const std::string &rmtDecoderStr) { - json remoteCodecArray = json::parse(remoteCodecInfoStr, nullptr, false); - if (remoteCodecArray.is_discarded() || !remoteCodecArray.is_array()) { - DHLOGE("remoteCodecInfoStrjson is invalid."); + DHLOGI("Start NegotiateCodecType, remote decoder: %s", rmtDecoderStr.c_str()); + json rmtDecoderJson = json::parse(rmtDecoderStr, nullptr, false); + if (rmtDecoderJson.is_discarded()) { + DHLOGE("remote Decoder Json is invalid."); return ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL; } - std::vector localCodecArray; - std::shared_ptr codecList = Media::AVCodecListFactory::CreateAVCodecList(); - if (codecList == nullptr) { - DHLOGE("codecList is nullptr."); + std::vector rmtVideoDecoders; + FromJson(VIDEO_DECODERS, rmtDecoderJson, rmtVideoDecoders); + + std::shared_ptr dhFwkKit = DScreenFwkKit::GetInstance().GetDHFwkKit(); + if (dhFwkKit == nullptr) { + DHLOGE("Get DhFwkKit return null"); return ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL; } - std::vector> caps = codecList->GetVideoEncoderCaps(); - for (const auto &cap : caps) { - if (cap == nullptr) { - continue; - } - std::shared_ptr codecInfo = cap->GetCodecInfo(); - if (codecInfo == nullptr) { - continue; - } - localCodecArray.push_back(codecInfo->GetName()); + std::string localVideoEncodersJsonStr = + dhFwkKit->QueryLocalSysSpec(QueryLocalSysSpecType::HISTREAMER_VIDEO_ENCODER); + if (localVideoEncodersJsonStr.empty()) { + DHLOGE("Query local Codec info failed"); + return ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL; + } + DHLOGI("DScreen Negotiate QueryVideoEncoderAbility info: %s", localVideoEncodersJsonStr.c_str()); + + json localVideoEncodersJson = json::parse(localVideoEncodersJsonStr, nullptr, false); + if (localVideoEncodersJson.is_discarded()) { + DHLOGE("localVideoEncodersJson is invalid."); + return ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL; } + + std::vector localVideoEncoders; + FromJson(VIDEO_ENCODERS, localVideoEncodersJson, localVideoEncoders); + + return ChooseCodecType(localVideoEncoders, rmtVideoDecoders); +} + +int32_t DScreen::ChooseCodecType(const std::vector &localVideoEncoders, + const std::vector &rmtVideoDecoders) +{ std::vector codecTypeCandidates; - for (const auto &remoteCodecType : remoteCodecArray) { - if (std::find(localCodecArray.begin(), localCodecArray.end(), - remoteCodecType) != localCodecArray.end()) { - codecTypeCandidates.push_back(remoteCodecType); + for (const auto &rmtDec : rmtVideoDecoders) { + for (const auto &locEnc : localVideoEncoders) { + std::pair comb = {locEnc.name, rmtDec.name}; + if (CODECS_MAP.find(comb) != CODECS_MAP.end()) { + std::string codec = CODECS_MAP.at(comb); + DHLOGI("Find match comb, local encoder: %s, remote decoder: %s, codec: %s", + locEnc.name.c_str(), rmtDec.name.c_str(), codec.c_str()); + codecTypeCandidates.push_back(codec); + } } } if (std::find(codecTypeCandidates.begin(), codecTypeCandidates.end(), @@ -503,10 +523,6 @@ int32_t DScreen::NegotiateCodecType(const std::string &remoteCodecInfoStr) CODEC_NAME_H264) != codecTypeCandidates.end()) { videoParam_->SetCodecType(VIDEO_CODEC_TYPE_VIDEO_H264); videoParam_->SetVideoFormat(VIDEO_DATA_FORMAT_NV12); - } else if (std::find(codecTypeCandidates.begin(), codecTypeCandidates.end(), - CODEC_NAME_MPEG4) != codecTypeCandidates.end()) { - videoParam_->SetCodecType(VIDEO_CODEC_TYPE_VIDEO_MPEG4); - videoParam_->SetVideoFormat(VIDEO_DATA_FORMAT_RGBA8888); } else { DHLOGI("codec type not support."); return ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL; @@ -514,6 +530,7 @@ int32_t DScreen::NegotiateCodecType(const std::string &remoteCodecInfoStr) return DH_SUCCESS; } + void DScreen::TaskThreadLoop() { DHLOGI("DScreen taskThread start. devId: %s, dhId: %s", GetAnonyString(devId_).c_str(), -- Gitee From aac1caba31cd11d276b1f211020175e9109b1ba5 Mon Sep 17 00:00:00 2001 From: yangli Date: Mon, 3 Jul 2023 11:10:23 +0800 Subject: [PATCH 7/9] 7.3 Signed-off-by: yangli --- .../screenregionmgr/2.0/src/av_receiver_engine_adapter.cpp | 3 +++ 1 file changed, 3 insertions(+) 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 77ca9e88..cecbbd30 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 @@ -137,6 +137,9 @@ int32_t AVTransReceiverAdapter::OnReceiverEvent(const AVTransEvent& event) case EventType::EVENT_START_SUCCESS: DHLOGI("av transport recevier engine start success."); break; + case EventType::EVENT_CHANNEL_CLOSED; + adapterCallback_->OnEngineEvent(DScreenEventType::TRANS_CHANNEL_CLOSED, event.peerDevId); + break; case EventType::EVENT_ENGINE_ERROR: case EventType::EVENT_REMOTE_ERROR: adapterCallback_->OnEngineEvent(DScreenEventType::ENGINE_ERROR, event.content); -- Gitee From 24d4da2d2bc18d088c22478343c1df391b8b107c Mon Sep 17 00:00:00 2001 From: yangli Date: Mon, 3 Jul 2023 11:34:04 +0800 Subject: [PATCH 8/9] 7.3 Signed-off-by: yangli --- .../screenregionmgr/2.0/src/av_receiver_engine_adapter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cecbbd30..ee759a0d 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 @@ -137,7 +137,7 @@ int32_t AVTransReceiverAdapter::OnReceiverEvent(const AVTransEvent& event) case EventType::EVENT_START_SUCCESS: DHLOGI("av transport recevier engine start success."); break; - case EventType::EVENT_CHANNEL_CLOSED; + case EventType::EVENT_CHANNEL_CLOSED: adapterCallback_->OnEngineEvent(DScreenEventType::TRANS_CHANNEL_CLOSED, event.peerDevId); break; case EventType::EVENT_ENGINE_ERROR: -- Gitee From 67a0f9b6f426fa4fc28eca76b8ca630259edc611 Mon Sep 17 00:00:00 2001 From: yangli Date: Mon, 3 Jul 2023 14:03:05 +0800 Subject: [PATCH 9/9] 7.3 Signed-off-by: yangli --- .../screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp index 372693de..22a201b2 100644 --- a/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/2.0/src/dscreen.cpp @@ -599,7 +599,7 @@ void DScreen::OnEngineMessage(const std::shared_ptr &message) return; } DHLOGI("On sink device engine message received, message type =%d.", message->type_); - if ((message->type_ == DScreenMsgType::START_MIRROR_SUCCESS) || + if ((message->type_ == DScreenMsgType::START_MIRROR_SUCCESS) || (message->type_ == DScreenMsgType::START_MIRROR_FAIL)) { sinkStartSuccess_ = (message->type_ == DScreenMsgType::START_MIRROR_SUCCESS); waitSinkCondVar_.notify_one(); -- Gitee