• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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