1 /*
2 * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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 "screen_capture_session.h"
17 #include "common/common.h"
18 #include "common/common_macro.h"
19 #include "common/reflect_registration.h"
20 #include "common/sharing_log.h"
21 #include "extend/magic_enum/magic_enum.hpp"
22 #include "screen_capture_def.h"
23
24 namespace OHOS {
25 namespace Sharing {
ScreenCaptureSession()26 ScreenCaptureSession::ScreenCaptureSession()
27 {
28 SHARING_LOGD("id: %{public}u.", GetId());
29 }
30
~ScreenCaptureSession()31 ScreenCaptureSession::~ScreenCaptureSession()
32 {
33 SHARING_LOGD("id: %{public}u.", GetId());
34 }
35
HandleEvent(SharingEvent & event)36 int32_t ScreenCaptureSession::HandleEvent(SharingEvent &event)
37 {
38 SHARING_LOGD("trace.");
39 RETURN_INVALID_IF_NULL(event.eventMsg);
40
41 SHARING_LOGI("eventType: %{public}s, capture sessionId: %{public}u.",
42 std::string(magic_enum::enum_name(event.eventMsg->type)).c_str(), GetId());
43 switch (event.eventMsg->type) {
44 case EventType::EVENT_SESSION_INIT:
45 HandleSessionInit(event);
46 break;
47 case EventType::EVENT_AGENT_STATE_PROSUMER_INIT:
48 HandleProsumerInitState(event);
49 break;
50 default:
51 SHARING_LOGI("none process case.");
52 break;
53 }
54
55 return 0;
56 }
57
HandleSessionInit(SharingEvent & event)58 void ScreenCaptureSession::HandleSessionInit(SharingEvent &event)
59 {
60 SHARING_LOGD("trace.");
61 RETURN_IF_NULL(event.eventMsg);
62
63 auto inputMsg = ConvertEventMsg<ScreenCaptureSessionEventMsg>(event);
64 if (inputMsg) {
65 captureType_ = inputMsg->mediaType;
66 videoFormat_ = inputMsg->videoFormat;
67 audioFormat_ = inputMsg->audioFormat;
68 screenId_ = inputMsg->screenId;
69 SHARING_LOGI("videoFormat_: %{public}d, type: %{public}d, screenId: %{public}" SCNu64 ".", videoFormat_,
70 captureType_, screenId_);
71 } else {
72 SHARING_LOGE("unknow event msg.");
73 }
74 }
75
HandleProsumerInitState(SharingEvent & event)76 void ScreenCaptureSession::HandleProsumerInitState(SharingEvent &event)
77 {
78 SHARING_LOGD("trace.");
79 RETURN_IF_NULL(event.eventMsg);
80
81 auto inputMsg = ConvertEventMsg<ScreenCaptureSessionEventMsg>(event);
82 auto statusMsg = std::make_shared<SessionStatusMsg>();
83 statusMsg->msg = std::make_shared<EventMsg>();
84 statusMsg->status = STATE_SESSION_ERROR;
85 statusMsg->msg->errorCode = ERR_SESSION_START;
86
87 if (inputMsg) {
88 statusMsg->msg->requestId = inputMsg->requestId;
89
90 if (inputMsg->errorCode == ERR_OK) {
91 statusMsg->status = STATE_SESSION_STARTED;
92 statusMsg->msg->errorCode = ERR_OK;
93 } else {
94 SHARING_LOGE("consumer inited failed, id: %{public}u.", inputMsg->prosumerId);
95 }
96 } else {
97 SHARING_LOGE("consumer inited failed: unknow msg.");
98 return;
99 }
100
101 NotifyAgentSessionStatus(statusMsg);
102 }
103
UpdateOperation(SessionStatusMsg::Ptr & statusMsg)104 void ScreenCaptureSession::UpdateOperation(SessionStatusMsg::Ptr &statusMsg)
105 {
106 SHARING_LOGD("trace.");
107 RETURN_IF_NULL(statusMsg);
108 RETURN_IF_NULL(statusMsg->msg);
109
110 status_ = static_cast<SessionRunningStatus>(statusMsg->status);
111 SHARING_LOGI("status: %{public}s.", std::string(magic_enum::enum_name(status_)).c_str());
112 switch (status_) {
113 case SESSION_START:
114 statusMsg->status = NOTIFY_PROSUMER_CREATE;
115 break;
116 case SESSION_STOP:
117 statusMsg->status = STATE_SESSION_STOPED;
118 break;
119 case SESSION_PAUSE:
120 statusMsg->status = STATE_SESSION_PAUSED;
121 break;
122 case SESSION_RESUME:
123 statusMsg->status = STATE_SESSION_RESUMED;
124 break;
125 case SESSION_DESTROY:
126 statusMsg->status = STATE_SESSION_DESTROYED;
127 break;
128 default:
129 SHARING_LOGI("none process case.");
130 break;
131 }
132
133 NotifyAgentSessionStatus(statusMsg);
134 }
135
NotifyProsumerInit(SessionStatusMsg::Ptr & statusMsg)136 void ScreenCaptureSession::NotifyProsumerInit(SessionStatusMsg::Ptr &statusMsg)
137 {
138 SHARING_LOGD("trace.");
139 auto eventMsg = std::make_shared<ScreenCaptureConsumerEventMsg>();
140 eventMsg->type = EventType::EVENT_SCREEN_CAPTURE_INIT;
141 eventMsg->toMgr = ModuleType::MODULE_MEDIACHANNEL;
142 eventMsg->screenId = screenId_;
143 switch (captureType_) {
144 case MEDIA_TYPE_AV:
145 Common::SetVideoTrack(eventMsg->videoTrack, videoFormat_);
146 Common::SetAudioTrack(eventMsg->audioTrack, audioFormat_);
147 break;
148 case MEDIA_TYPE_VIDEO:
149 Common::SetVideoTrack(eventMsg->videoTrack, videoFormat_);
150 break;
151 case MEDIA_TYPE_AUDIO:
152 Common::SetAudioTrack(eventMsg->audioTrack, audioFormat_);
153 break;
154 default:
155 SHARING_LOGI("none process case.");
156 break;
157 }
158 SHARING_LOGI("afer SetVideoTrack, vtype:%{public}d, vFormat:%{public}d, vcodecId:%{public}d.", captureType_,
159 videoFormat_, eventMsg->videoTrack.codecId);
160 statusMsg->msg = std::move(eventMsg);
161 statusMsg->status = NOTIFY_SESSION_PRIVATE_EVENT;
162
163 NotifyAgentSessionStatus(statusMsg);
164 }
165
UpdateMediaStatus(SessionStatusMsg::Ptr & statusMsg)166 void ScreenCaptureSession::UpdateMediaStatus(SessionStatusMsg::Ptr &statusMsg)
167 {
168 SHARING_LOGD("trace.");
169 RETURN_IF_NULL(statusMsg);
170 RETURN_IF_NULL(statusMsg->msg);
171
172 SHARING_LOGI("update media notify status: %{public}s.",
173 std::string(magic_enum::enum_name(static_cast<MediaNotifyStatus>(statusMsg->status))).c_str());
174 switch (statusMsg->status) {
175 case STATE_PROSUMER_CREATE_SUCCESS:
176 NotifyProsumerInit(statusMsg);
177 break;
178 case STATE_PROSUMER_START_SUCCESS:
179 break;
180 case STATE_PROSUMER_STOP_SUCCESS:
181 break;
182 case STATE_PROSUMER_DESTROY_SUCCESS:
183 break;
184 default:
185 SHARING_LOGI("none process case.");
186 break;
187 }
188 }
189
NotifyAgentSessionStatus(SessionStatusMsg::Ptr & statusMsg)190 void ScreenCaptureSession::NotifyAgentSessionStatus(SessionStatusMsg::Ptr &statusMsg)
191 {
192 SHARING_LOGD("trace.");
193 RETURN_IF_NULL(statusMsg);
194
195 if (statusMsg->status == NOTIFY_PROSUMER_CREATE) {
196 statusMsg->className = "ScreenCaptureConsumer";
197 }
198
199 Notify(statusMsg);
200 }
201
202 REGISTER_CLASS_REFLECTOR(ScreenCaptureSession);
203 } // namespace Sharing
204 } // namespace OHOS
205