1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "screenregion.h"
17
18 #include "dscreen_constants.h"
19 #include "dscreen_errcode.h"
20 #include "dscreen_log.h"
21 #include "dscreen_util.h"
22 #include "screen_client.h"
23 #include "screen_client_common.h"
24 #include "screen_sink_trans.h"
25
26 namespace OHOS {
27 namespace DistributedHardware {
ScreenRegion(const std::string & remoteDevId,uint64_t screenId,uint64_t displayId)28 ScreenRegion::ScreenRegion(const std::string &remoteDevId, uint64_t screenId, uint64_t displayId)
29 {
30 DHLOGD("ScreenRegion construct");
31 remoteDevId_ = remoteDevId;
32 screenId_ = screenId;
33 displayId_ = displayId;
34 windowId_ = INVALID_WINDOW_ID;
35 }
36
~ScreenRegion()37 ScreenRegion::~ScreenRegion()
38 {
39 DHLOGD("ScreenRegion deConstruct");
40 if (sinkTrans_ != nullptr) {
41 sinkTrans_->Release();
42 }
43 }
44
OnTransError(int32_t err,const std::string & content)45 void ScreenRegion::OnTransError(int32_t err, const std::string &content)
46 {
47 DHLOGE("OnTransError, err: %d", err);
48 Stop();
49 }
50
SetVideoParam(std::shared_ptr<VideoParam> & videoParam)51 void ScreenRegion::SetVideoParam(std::shared_ptr<VideoParam> &videoParam)
52 {
53 videoParam_ = videoParam;
54 }
55
SetMapRelation(std::shared_ptr<DScreenMapRelation> & mapRelation)56 void ScreenRegion::SetMapRelation(std::shared_ptr<DScreenMapRelation> &mapRelation)
57 {
58 mapRelation_ = mapRelation;
59 }
60
GetScreenId()61 uint64_t ScreenRegion::GetScreenId()
62 {
63 return screenId_;
64 }
65
GetDisplayId()66 uint64_t ScreenRegion::GetDisplayId()
67 {
68 return displayId_;
69 }
70
GetRemoteDevId()71 std::string ScreenRegion::GetRemoteDevId()
72 {
73 return remoteDevId_;
74 }
75
SetUp()76 int32_t ScreenRegion::SetUp()
77 {
78 DHLOGI("ScreenRegion::SetUp, remoteDevId: %s", GetAnonyString(remoteDevId_).c_str());
79
80 std::shared_ptr<WindowProperty> windowProperty = std::make_shared<WindowProperty>();
81 windowProperty->displayId = displayId_;
82
83 ScreenRect screenRect = mapRelation_->GetScreenRect();
84 windowProperty->startX = screenRect.startX;
85 windowProperty->startY = screenRect.startY;
86 windowProperty->width = screenRect.width;
87 windowProperty->height = screenRect.height;
88
89 windowId_ = ScreenClient::GetInstance().AddWindow(windowProperty);
90 if (windowId_ < 0) {
91 DHLOGE("AddWindow failed.");
92 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
93 }
94 int32_t ret = ScreenClient::GetInstance().ShowWindow(windowId_);
95 if (ret != DH_SUCCESS) {
96 DHLOGE("show window failed.");
97 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
98 }
99
100 sptr<Surface> surface = ScreenClient::GetInstance().GetSurface(windowId_);
101 if (!surface) {
102 DHLOGE("get window surface failed.");
103 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
104 }
105
106 surface_ = surface;
107
108 if (!sinkTrans_) {
109 sinkTrans_ = std::make_shared<ScreenSinkTrans>();
110 }
111
112 sinkTrans_->RegisterStateCallback(shared_from_this());
113 sinkTrans_->SetImageSurface(surface_);
114 ret = sinkTrans_->SetUp(*videoParam_, *videoParam_, remoteDevId_);
115 if (ret != DH_SUCCESS) {
116 DHLOGE("sinkTrans setup failed.");
117 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
118 }
119
120 return DH_SUCCESS;
121 }
122
Start()123 int32_t ScreenRegion::Start()
124 {
125 DHLOGI("ScreenRegion::Start remoteDevId: %s", GetAnonyString(remoteDevId_).c_str());
126 if (!sinkTrans_) {
127 DHLOGE("sink trans not init.");
128 return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT;
129 }
130
131 int32_t ret = sinkTrans_->Start();
132 if (ret != DH_SUCCESS) {
133 DHLOGE("sink trans start failed.");
134 return ret;
135 }
136 isRunning = true;
137 return DH_SUCCESS;
138 }
139
Stop()140 int32_t ScreenRegion::Stop()
141 {
142 DHLOGI("ScreenRegion::Stop remoteDevId: %s", GetAnonyString(remoteDevId_).c_str());
143 if (!isRunning) {
144 DHLOGI("ScreenRegion not running, no need stop");
145 return DH_SUCCESS;
146 }
147
148 if (!sinkTrans_) {
149 DHLOGE("sink trans not init.");
150 return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT;
151 }
152
153 int32_t ret = sinkTrans_->Stop();
154 if (ret != DH_SUCCESS) {
155 DHLOGE("sink trans stop failed.");
156 return ret;
157 }
158
159 ret = sinkTrans_->Release();
160 if (ret != DH_SUCCESS) {
161 DHLOGE("sink trans release failed.");
162 return ret;
163 }
164
165 ret = ScreenClient::GetInstance().RemoveWindow(windowId_);
166 if (ret != DH_SUCCESS) {
167 DHLOGE("remove window failed.");
168 return ret;
169 }
170
171 isRunning = false;
172 return DH_SUCCESS;
173 }
174 } // namespace DistributedHardware
175 } // namespace OHOS