1 /*
2 * Copyright (c) 2022-2024 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 "1.0/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 {
29 namespace V1_0 {
ScreenRegion(const std::string & remoteDevId,uint64_t screenId,uint64_t displayId)30 ScreenRegion::ScreenRegion(const std::string &remoteDevId, uint64_t screenId, uint64_t displayId)
31 {
32 DHLOGD("ScreenRegion construct");
33 remoteDevId_ = remoteDevId;
34 screenId_ = screenId;
35 displayId_ = displayId;
36 windowId_ = INVALID_WINDOW_ID;
37 }
38
~ScreenRegion()39 ScreenRegion::~ScreenRegion()
40 {
41 DHLOGD("ScreenRegion deConstruct");
42 if (sinkTrans_ != nullptr) {
43 sinkTrans_->Release();
44 }
45 }
46
OnTransError(int32_t err,const std::string & content)47 void ScreenRegion::OnTransError(int32_t err, const std::string &content)
48 {
49 DHLOGW("OnTransError, err: %{public}" PRId32, err);
50 Stop();
51 }
52
SetVideoParam(std::shared_ptr<VideoParam> & videoParam)53 void ScreenRegion::SetVideoParam(std::shared_ptr<VideoParam> &videoParam)
54 {
55 videoParam_ = videoParam;
56 }
57
SetMapRelation(std::shared_ptr<DScreenMapRelation> & mapRelation)58 void ScreenRegion::SetMapRelation(std::shared_ptr<DScreenMapRelation> &mapRelation)
59 {
60 mapRelation_ = mapRelation;
61 }
62
GetScreenId()63 uint64_t ScreenRegion::GetScreenId()
64 {
65 return screenId_;
66 }
67
GetDisplayId()68 uint64_t ScreenRegion::GetDisplayId()
69 {
70 return displayId_;
71 }
72
GetRemoteDevId()73 std::string ScreenRegion::GetRemoteDevId()
74 {
75 return remoteDevId_;
76 }
77
GetVideoParam()78 std::shared_ptr<VideoParam> ScreenRegion::GetVideoParam()
79 {
80 return videoParam_;
81 }
82
GetWindowId()83 int32_t ScreenRegion::GetWindowId()
84 {
85 return windowId_;
86 }
87
GetWindowProperty()88 std::shared_ptr<WindowProperty> ScreenRegion::GetWindowProperty()
89 {
90 return windowProperty_;
91 }
92
SetUpWindow()93 int32_t ScreenRegion::SetUpWindow()
94 {
95 DHLOGI("ScreenRegion::SetUpWindow");
96 std::shared_ptr<WindowProperty> windowProperty = std::make_shared<WindowProperty>();
97 windowProperty->displayId = displayId_;
98 if (mapRelation_ == nullptr) {
99 DHLOGE("ScreenRegion::SetUp mapRelation is nullptr.");
100 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
101 }
102 ScreenRect screenRect = mapRelation_->GetScreenRect();
103 windowProperty->startX = screenRect.startX;
104 windowProperty->startY = screenRect.startY;
105 windowProperty->width = screenRect.width;
106 windowProperty->height = screenRect.height;
107 windowProperty_ = windowProperty;
108
109 windowId_ = ScreenClient::GetInstance().AddWindow(windowProperty);
110 if (windowId_ < 0) {
111 DHLOGE("AddWindow failed.");
112 ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED, "AddWindow failed.");
113 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
114 }
115 int32_t ret = ScreenClient::GetInstance().ShowWindow(windowId_);
116 if (ret != DH_SUCCESS) {
117 DHLOGE("show window failed.");
118 ReportOptFail(DSCREEN_OPT_FAIL, ret, "show window failed.");
119 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
120 }
121
122 sptr<Surface> surface = ScreenClient::GetInstance().GetSurface(windowId_);
123 if (surface == nullptr) {
124 DHLOGE("get window surface failed.");
125 ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED, "get window surface failed.");
126 return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
127 }
128 surface_ = surface;
129
130 return DH_SUCCESS;
131 }
132
SetUp(const std::string & version)133 int32_t ScreenRegion::SetUp(const std::string &version)
134 {
135 DHLOGI("ScreenRegion::SetUp, remoteDevId: %{public}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 sinkTrans_->SetScreenVersion(version);
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: %{public}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: %{public}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 (void)sinkTrans_->Stop();
184 (void)sinkTrans_->Release();
185 } else {
186 DHLOGE("sink trans not init.");
187 (void)ScreenClient::GetInstance().RemoveWindow(windowId_);
188 return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT;
189 }
190
191 int32_t ret = ScreenClient::GetInstance().RemoveWindow(windowId_);
192 if (ret != DH_SUCCESS) {
193 DHLOGE("remove window failed.");
194 return ret;
195 }
196
197 isRunning = false;
198 return DH_SUCCESS;
199 }
200 } // namespace V1_0
201 } // namespace DistributedHardware
202 } // namespace OHOS