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