当前仓库属于关闭状态,部分功能使用受限,详情请查阅 仓库状态说明
5 Star 2 Fork 4

OpenHarmony/distributed_screen
关闭

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
dscreen_handler.cpp 5.18 KB
一键复制 编辑 原始数据 按行查看 历史
dl 提交于 2022-04-06 17:36 +08:00 . add add unregister plugin listener
/*
* Copyright (c) 2022 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "dscreen_handler.h"
#include "avcodec_info.h"
#include "avcodec_list.h"
#include "nlohmann/json.hpp"
#include "screen.h"
#include "dscreen_constants.h"
#include "dscreen_errcode.h"
#include "dscreen_log.h"
#include "dscreen_util.h"
using json = nlohmann::json;
namespace OHOS {
namespace DistributedHardware {
IMPLEMENT_SINGLE_INSTANCE(DScreenHandler);
DScreenHandler::DScreenHandler()
{
DHLOGI("DScreenHandler constructor.");
}
DScreenHandler::~DScreenHandler()
{
DHLOGI("~DScreenHandler");
Rosen::ScreenManager::GetInstance().UnregisterScreenListener(screenListener_);
}
int32_t DScreenHandler::Initialize()
{
DHLOGI("DScreenHandler Initialize");
if (!screenListener_) {
screenListener_ = new ScreenListener();
}
bool ret = Rosen::ScreenManager::GetInstance().RegisterScreenListener(screenListener_);
if (!ret) {
DHLOGE("register screen listener failed.");
}
return DH_SUCCESS;
}
void ScreenListener::OnConnect(uint64_t screenId)
{
DHLOGI("on screen connect");
if (screenId != SCREEN_ID_DEFAULT) {
return;
}
sptr<Rosen::Screen> screen = Rosen::ScreenManager::GetInstance().GetScreenById(screenId);
if (screen == nullptr) {
DHLOGE("screen not found, screenId: %ulld", screenId);
return;
}
std::string dhId = DSCREEN_PREFIX + SEPERATOR + std::to_string(screenId);
uint32_t screenWidth = screen->GetWidth();
uint32_t screenHeight = screen->GetHeight();
json attrJson;
attrJson[KEY_VERSION] = DSCREEN_VERSION;
attrJson[KEY_SCREEN_WIDTH] = screenWidth;
attrJson[KEY_SCREEN_HEIGHT] = screenHeight;
attrJson[KEY_CODECTYPE] = DScreenHandler::GetInstance().QueryCodecInfo();
DScreenHandler::GetInstance().PluginHardware(dhId, attrJson.dump());
}
void ScreenListener::OnDisconnect(uint64_t screenId)
{
DHLOGI("on screen disconnect");
std::string dhId = DSCREEN_PREFIX + SEPERATOR + std::to_string(screenId);
DScreenHandler::GetInstance().UnPluginHardware(dhId);
}
void DScreenHandler::PluginHardware(const std::string &dhId, const std::string &attr)
{
if (listener_ != nullptr) {
listener_->PluginHardware(dhId, attr);
}
}
void DScreenHandler::UnPluginHardware(const std::string &dhId)
{
if (listener_ != nullptr) {
listener_->UnPluginHardware(dhId);
}
}
std::vector<DHItem> DScreenHandler::Query()
{
DHLOGI("DScreenHandler query hardware info");
std::vector<DHItem> dhItemVec;
std::vector<sptr<Rosen::Screen>> screens = Rosen::ScreenManager::GetInstance().GetAllScreens();
sptr<Rosen::Screen> screen = screens[SCREEN_ID_DEFAULT];
std::string dhId = SCREEN_PREFIX + SEPERATOR + std::to_string(screen->GetId());
uint32_t screenWidth = screen->GetWidth();
uint32_t screenHeight = screen->GetHeight();
json attrJson;
attrJson[KEY_VERSION] = DSCREEN_VERSION;
attrJson[KEY_SCREEN_WIDTH] = screenWidth;
attrJson[KEY_SCREEN_HEIGHT] = screenHeight;
attrJson[KEY_CODECTYPE] = QueryCodecInfo();
DHItem dhItem;
dhItem.dhId = dhId;
dhItem.attrs = attrJson.dump();
dhItemVec.push_back(dhItem);
DHLOGD("query result: dhId: %s, attrs: %s", GetAnonyString(dhId).c_str(), attrJson.dump().c_str());
return dhItemVec;
}
std::map<std::string, std::string> DScreenHandler::QueryExtraInfo()
{
DHLOGD("DScreenHandler queryExtraInfo");
std::map<std::string, std::string> extraInfo;
return extraInfo;
}
bool DScreenHandler::IsSupportPlugin()
{
DHLOGD("DScreenHandler IsSupportPlugin");
return true;
}
void DScreenHandler::RegisterPluginListener(std::shared_ptr<PluginListener> listener)
{
DHLOGD("DScreenHandler register plugin listener");
listener_ = listener;
}
void DScreenHandler::UnRegisterPluginListener()
{
DHLOGI("DScreenHandler unRegister plugin listener");
listener_ = nullptr;
}
std::string DScreenHandler::QueryCodecInfo()
{
DHLOGD("DScreenHandler QueryCodecInfo");
if (!codecInfoStr_.empty()) {
return codecInfoStr_;
}
// query codec info
std::shared_ptr<Media::AVCodecList> codecList = Media::AVCodecListFactory::CreateAVCodecList();
std::vector<std::shared_ptr<Media::VideoCaps>> caps = codecList->GetVideoEncoderCaps();
json codecTypeArray = json::array();
for (const auto &cap : caps) {
std::shared_ptr<Media::AVCodecInfo> codecInfo = cap->GetCodecInfo();
codecTypeArray.push_back(codecInfo->GetName());
}
codecInfoStr_ = codecTypeArray.dump();
return codecInfoStr_;
}
IHardwareHandler* GetHardwareHandler()
{
return &DScreenHandler::GetInstance();
}
} // namespace DistributedHardware
} // namespace OHOS
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/openharmony/distributed_screen.git
git@gitee.com:openharmony/distributed_screen.git
openharmony
distributed_screen
distributed_screen
master

搜索帮助