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_hisysevent.h"
21 #include "dscreen_log.h"
22 #include "dscreen_util.h"
23 #include "screen_client.h"
24 #include "screen_client_common.h"
25 #include "screen_sink_trans.h"
26
27 namespace OHOS {
28 namespace DistributedHardware {
ScreenRegion(const std::string & remoteDevId,uint64_t screenId,uint64_t displayId)29 ScreenRegion::ScreenRegion(const std::string &remoteDevId, uint64_t screenId, uint64_t displayId)
30 {
31 DHLOGD("ScreenRegion construct");
32 remoteDevId_ = remoteDevId;
33 screenId_ = screenId;
34 displayId_ = displayId;
35 windowId_ = INVALID_WINDOW_ID;
36 }
37
~ScreenRegion()38 ScreenRegion::~ScreenRegion()
39 {
40 DHLOGD("ScreenRegion deConstruct");
41 if (sinkTrans_ != nullptr) {
42 sinkTrans_->Release();
43 }
44 }
45
OnTransError(int32_t err,const std::string & content)46 void ScreenRegion::OnTransError(int32_t err, const std::string &content)
47 {
48 DHLOGE("OnTransError, err: %d", err);
49 Stop();
50 }
51
SetVideoParam(std::shared_ptr<VideoParam> & videoParam)52 void ScreenRegion::SetVideoParam(std::shared_ptr<VideoParam> &videoParam)
53 {
54 videoParam_ = videoParam;
55 }
56
SetMapRelation(std::shared_ptr<DScreenMapRelation> & mapRelation)57 void ScreenRegion::SetMapRelation(std::shared_ptr<DScreenMapRelation> &mapRelation)
58 {
59 mapRelation_ = mapRelation;
60 }
61
GetScreenId()62 uint64_t ScreenRegion::GetScreenId()
63 {
64 return screenId_;
65 }
66
GetDisplayId()67 uint64_t ScreenRegion::GetDisplayId()
68 {
69 return displayId_;
70 }
71
GetRemoteDevId()72 std::string ScreenRegion::GetRemoteDevId()
73 {
74 return remoteDevId_;
75 }
76
GetVideoParam()77 std::shared_ptr<VideoParam> ScreenRegion::GetVideoParam()
78 {
79 return videoParam_;
80 }
81
GetWindowId()82 int32_t ScreenRegion::GetWindowId()
83 {
84 return windowId_;
85 }
86
GetWindowProperty()87 std::shared_ptr<WindowProperty> ScreenRegion::GetWindowProperty()
88 {
89 return windowProperty_;
90 }
91
SetUpWindow()92 int32_t ScreenRegion::SetUpWindow()
93 {
94 DHLOGI("ScreenRegion::SetUpWindow");
95 std::shared_ptr<WindowProperty> windowProperty = std::make_shared<WindowProperty>();
96 windowProperty->displayId = displayId_;
97 if (mapRelation_ == nullptr) {
98 DHLOGE("ScreenRegion::SetUp mapRelation is nullptr.");
99 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
100 }
101 ScreenRect screenRect = mapRelation_->GetScreenRect();
102 windowProperty->startX = screenRect.startX;
103 windowProperty->startY = screenRect.startY;
104 windowProperty->width = screenRect.width;
105 windowProperty->height = screenRect.height;
106 windowProperty_ = windowProperty;
107
108 windowId_ = ScreenClient::GetInstance().AddWindow(windowProperty);
109 if (windowId_ < 0) {
110 DHLOGE("AddWindow failed.");
111 ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED, "AddWindow failed.");
112 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
113 }
114 int32_t ret = ScreenClient::GetInstance().ShowWindow(windowId_);
115 if (ret != DH_SUCCESS) {
116 DHLOGE("show window failed.");
117 ReportOptFail(DSCREEN_OPT_FAIL, ret, "show window failed.");
118 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
119 }
120
121 sptr<Surface> surface = ScreenClient::GetInstance().GetSurface(windowId_);
122 if (surface == nullptr) {
123 DHLOGE("get window surface failed.");
124 ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED, "get window surface failed.");
125 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
126 }
127 surface_ = surface;
128
129 return DH_SUCCESS;
130 }
131
132
SetUp()133 int32_t ScreenRegion::SetUp()
134 {
135 DHLOGI("ScreenRegion::SetUp, remoteDevId: %s", GetAnonyString(remoteDevId_).c_str());
136 int32_t ret = SetUpWindow();
137 if (ret != DH_SUCCESS) {
138 DHLOGE("SetUpWindow failed.");
139 return ret;
140 }
141
142 if (sinkTrans_ == nullptr) {
143 sinkTrans_ = std::make_shared<ScreenSinkTrans>();
144 }
145
146 sinkTrans_->RegisterStateCallback(shared_from_this());
147 sinkTrans_->SetImageSurface(surface_);
148 ret = sinkTrans_->SetUp(*videoParam_, *videoParam_, remoteDevId_);
149 if (ret != DH_SUCCESS) {
150 DHLOGE("sinkTrans setup failed.");
151 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
152 }
153
154 return DH_SUCCESS;
155 }
156
Start()157 int32_t ScreenRegion::Start()
158 {
159 DHLOGI("ScreenRegion::Start remoteDevId: %s", GetAnonyString(remoteDevId_).c_str());
160 if (sinkTrans_ == nullptr) {
161 DHLOGE("sink trans not init.");
162 return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT;
163 }
164
165 int32_t ret = sinkTrans_->Start();
166 if (ret != DH_SUCCESS) {
167 DHLOGE("sink trans start failed.");
168 return ret;
169 }
170 isRunning = true;
171 return DH_SUCCESS;
172 }
173
Stop()174 int32_t ScreenRegion::Stop()
175 {
176 DHLOGI("ScreenRegion::Stop remoteDevId: %s", GetAnonyString(remoteDevId_).c_str());
177 if (!isRunning) {
178 DHLOGI("ScreenRegion not running, no need stop");
179 return DH_SUCCESS;
180 }
181
182 if (sinkTrans_ == nullptr) {
183 DHLOGE("sink trans not init.");
184 return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT;
185 }
186
187 int32_t ret = sinkTrans_->Stop();
188 if (ret != DH_SUCCESS) {
189 DHLOGE("sink trans stop failed.");
190 return ret;
191 }
192
193 ret = sinkTrans_->Release();
194 if (ret != DH_SUCCESS) {
195 DHLOGE("sink trans release failed.");
196 return ret;
197 }
198
199 ret = ScreenClient::GetInstance().RemoveWindow(windowId_);
200 if (ret != DH_SUCCESS) {
201 DHLOGE("remove window failed.");
202 return ret;
203 }
204
205 isRunning = false;
206 return DH_SUCCESS;
207 }
208 } // namespace DistributedHardware
209 } // namespace OHOS