1 /*
2 * Copyright (C) 2023 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 "ability_connection.h"
17 #include "ability_manager_client.h"
18 #include "screen_capture_server.h"
19 #include "ui_extension_ability_connection.h"
20 #include "extension_manager_client.h"
21 #include "image_source.h"
22 #include "image_type.h"
23 #include "pixel_map.h"
24 #include "media_log.h"
25 #include "media_errors.h"
26 #include "media_utils.h"
27 #include "uri_helper.h"
28 #include "media_dfx.h"
29 #include "scope_guard.h"
30 #include "screen_capture_listener_proxy.h"
31 #include "res_type.h"
32 #include "res_sched_client.h"
33 #include "param_wrapper.h"
34 #include <unistd.h>
35 #include <sys/stat.h>
36 #include "hitrace/tracechain.h"
37 #include "locale_config.h"
38 #include <sync_fence.h>
39 #include "parameter.h"
40 #include <unordered_map>
41
42 using OHOS::Rosen::DMError;
43
44 namespace {
45 const std::string DUMP_PATH = "/data/media/screen_capture.bin";
46 }
47
48 namespace OHOS {
49 namespace Media {
50 namespace {
51 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_SCREENCAPTURE, "ScreenCaptureServer"};
52 static std::map<int32_t, std::weak_ptr<OHOS::Media::ScreenCaptureServer>> serverMap;
53 std::atomic<int32_t> activeSessionId_(-1);
54
55 // As in the ScreenCaptureServer destructor function mutexGlobal_ is required to update serverMap
56 // MAKE SURE THAT when mutexGlobal_ is been holding MUST NOT trigger ScreenCaptureServer destructor to be called
57 std::mutex mutexGlobal_;
58
GetScreenCaptureServerByIdWithLock(int32_t id)59 std::shared_ptr<OHOS::Media::ScreenCaptureServer> GetScreenCaptureServerByIdWithLock(int32_t id)
60 {
61 auto iter = serverMap.find(id);
62 if (iter == serverMap.end()) {
63 return nullptr;
64 }
65 return (iter->second).lock();
66 }
67 }
68
69 static const std::string MP4 = "mp4";
70 static const std::string M4A = "m4a";
71
72 static const std::string USER_CHOICE_ALLOW = "true";
73 static const std::string USER_CHOICE_DENY = "false";
74 static const std::string BUTTON_NAME_MIC = "mic";
75 static const std::string BUTTON_NAME_STOP = "stop";
76 static const std::string ICON_PATH_CAPSULE_STOP = "/etc/screencapture/capsule_stop.svg";
77 static const std::string ICON_PATH_NOTIFICATION = "/etc/screencapture/notification.png";
78 static const std::string ICON_PATH_MIC = "/etc/screencapture/mic.svg";
79 static const std::string ICON_PATH_MIC_OFF = "/etc/screencapture/mic_off.svg";
80 static const std::string ICON_PATH_STOP = "/etc/screencapture/stop.png";
81 static const std::string BACK_GROUND_COLOR = "#E84026";
82 static const std::string SELECT_ABILITY_NAME = "SelectWindowAbility";
83 static const int32_t SVG_HEIGHT = 80;
84 static const int32_t SVG_WIDTH = 80;
85 static const int32_t MDPI = 160;
86 static const int32_t MICROPHONE_OFF = 0;
87 static const int32_t MICROPHONE_STATE_COUNT = 2;
88 #ifdef SUPPORT_SCREEN_CAPTURE_WINDOW_NOTIFICATION
89 static const int32_t NOTIFICATION_MAX_TRY_NUM = 3;
90 #endif
91
92 static const int32_t MAX_SESSION_ID = 256;
93 static const int32_t MAX_SESSION_PER_UID = 8;
94 static const auto NOTIFICATION_SUBSCRIBER = NotificationSubscriber();
95 static constexpr int32_t AUDIO_CHANGE_TIME = 200000; // 200 ms
96
OnConnected()97 void NotificationSubscriber::OnConnected()
98 {
99 MEDIA_LOGI("NotificationSubscriber OnConnected");
100 }
101
OnDisconnected()102 void NotificationSubscriber::OnDisconnected()
103 {
104 MEDIA_LOGI("NotificationSubscriber OnDisconnected");
105 }
106
OnResponse(int32_t notificationId,OHOS::sptr<OHOS::Notification::NotificationButtonOption> buttonOption)107 void NotificationSubscriber::OnResponse(int32_t notificationId,
108 OHOS::sptr<OHOS::Notification::NotificationButtonOption> buttonOption)
109 {
110 MEDIA_LOGI("NotificationSubscriber OnResponse notificationId : %{public}d, ButtonName : %{public}s ",
111 notificationId, (buttonOption->GetButtonName()).c_str());
112
113 // To avoid deadlock: first release mutexGlobal_, then be destructed
114 std::shared_ptr<OHOS::Media::ScreenCaptureServer> server;
115 {
116 std::unique_lock<std::mutex> lock(mutexGlobal_);
117 server = GetScreenCaptureServerByIdWithLock(notificationId);
118 }
119 if (server == nullptr) {
120 MEDIA_LOGW("OnResponse ScreenCaptureServer not exist, notificationId : %{public}d, ButtonName : %{public}s ",
121 notificationId, (buttonOption->GetButtonName()).c_str());
122 return;
123 }
124 if (BUTTON_NAME_STOP.compare(buttonOption->GetButtonName()) == 0) {
125 server->StopScreenCaptureByEvent(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_STOPPED_BY_USER);
126 return;
127 }
128 if (BUTTON_NAME_MIC.compare(buttonOption->GetButtonName()) == 0) {
129 server->UpdateMicrophoneEnabled();
130 return;
131 }
132 }
133
OnDied()134 void NotificationSubscriber::OnDied()
135 {
136 MEDIA_LOGI("NotificationSubscriber OnDied");
137 }
138
PrivateWindowListenerInScreenCapture(std::weak_ptr<ScreenCaptureServer> screenCaptureServer)139 PrivateWindowListenerInScreenCapture::PrivateWindowListenerInScreenCapture(
140 std::weak_ptr<ScreenCaptureServer> screenCaptureServer)
141 {
142 MEDIA_LOGD("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
143 screenCaptureServer_ = screenCaptureServer;
144 }
145
OnPrivateWindow(bool hasPrivate)146 void PrivateWindowListenerInScreenCapture::OnPrivateWindow(bool hasPrivate)
147 {
148 MEDIA_LOGI("PrivateWindowListenerInScreenCapture hasPrivateWindow: %{public}u", hasPrivate);
149 auto scrServer = screenCaptureServer_.lock();
150 if (scrServer) {
151 MEDIA_LOGI("Callback OnDMPrivateWindowChange hasPrivateWindow: %{public}u", hasPrivate);
152 scrServer->OnDMPrivateWindowChange(hasPrivate);
153 }
154 }
155
OnDMPrivateWindowChange(bool hasPrivate)156 void ScreenCaptureServer::OnDMPrivateWindowChange(bool hasPrivate)
157 {
158 MEDIA_LOGI("OnDMPrivateWindowChange hasPrivateWindow: %{public}u", hasPrivate);
159 if (screenCaptureCb_ != nullptr) {
160 screenCaptureCb_->OnStateChange(hasPrivate ?
161 AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_ENTER_PRIVATE_SCENE :
162 AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_EXIT_PRIVATE_SCENE);
163 }
164 }
165
Create()166 std::shared_ptr<IScreenCaptureService> ScreenCaptureServer::Create()
167 {
168 MEDIA_LOGI("ScreenCaptureServer Create start.");
169 std::shared_ptr<ScreenCaptureServer> serverTemp = std::make_shared<ScreenCaptureServer>();
170 CHECK_AND_RETURN_RET_LOG(serverTemp != nullptr, nullptr, "Failed to new ScreenCaptureServer");
171 int32_t countForUid = 0;
172 int32_t newSessionId = 0;
173
174 // To avoid deadlock: first release mutexGlobal_, then be destructed
175 std::shared_ptr<ScreenCaptureServer> server;
176 for (int32_t i = 0; i < MAX_SESSION_ID; i++) {
177 // To avoid deadlock: first release mutexGlobal_, then be destructed
178 {
179 std::unique_lock<std::mutex> lock(mutexGlobal_);
180 server = GetScreenCaptureServerByIdWithLock(newSessionId);
181 }
182 if (server != nullptr) {
183 newSessionId++;
184 countForUid += (server->appInfo_.appUid == serverTemp->appInfo_.appUid) ? 1 : 0;
185 // To avoid deadlock: first release mutexGlobal_, then be destructed
186 // Do this without holding mutexGlobal_ to avoid dead lock when set nullptr trigger server destruct
187 server = nullptr;
188 continue;
189 }
190 if (countForUid >= MAX_SESSION_PER_UID) {
191 MEDIA_LOGE("Create failed, uid(%{public}d) has created too many ScreenCaptureServer instances",
192 serverTemp->appInfo_.appUid);
193 return nullptr;
194 }
195 {
196 std::unique_lock<std::mutex> lock(mutexGlobal_);
197 serverMap.insert(std::make_pair(newSessionId, serverTemp));
198 MEDIA_LOGI("ScreenCaptureServer::Create newSessionId: %{public}d, serverMap size:%{public}zu",
199 newSessionId, serverMap.size());
200 }
201 break;
202 }
203
204 if (newSessionId == MAX_SESSION_ID) {
205 MEDIA_LOGE("Create failed for uid(%{public}d), there are too many ScreenCaptureServer instances",
206 serverTemp->appInfo_.appUid);
207 return nullptr;
208 }
209 serverTemp->SetSessionId(newSessionId);
210 MEDIA_LOGI("ScreenCaptureServer Create end.");
211 return std::static_pointer_cast<OHOS::Media::IScreenCaptureService>(serverTemp);
212 }
213
GetRunningScreenCaptureInstancePid(int32_t & pid)214 int32_t ScreenCaptureServer::GetRunningScreenCaptureInstancePid(int32_t &pid)
215 {
216 MEDIA_LOGI("GetRunningScreenCaptureInstancePid in");
217 std::shared_ptr<ScreenCaptureServer> currentServer;
218 {
219 std::unique_lock<std::mutex> lock(mutexGlobal_);
220 if (activeSessionId_.load() < 0) {
221 return MSERR_UNKNOWN;
222 }
223 currentServer = GetScreenCaptureServerByIdWithLock(activeSessionId_.load());
224 }
225 if (currentServer != nullptr) {
226 MEDIA_LOGI("GetRunningScreenCaptureInstancePid uid(%{public}d) pid(%{public}d)",
227 currentServer->appInfo_.appUid, currentServer->appInfo_.appPid);
228 pid = currentServer->appInfo_.appPid;
229 return MSERR_OK;
230 }
231 return MSERR_UNKNOWN;
232 }
233
GetSpecificServer(int32_t sessionId,std::shared_ptr<ScreenCaptureServer> & server)234 int32_t ScreenCaptureServer::GetSpecificServer(int32_t sessionId, std::shared_ptr<ScreenCaptureServer> &server)
235 {
236 // To avoid deadlock: first release mutexGlobal_, then be destructed
237 {
238 std::lock_guard<std::mutex> lock(mutexGlobal_);
239 server = GetScreenCaptureServerByIdWithLock(sessionId);
240 }
241 if (server == nullptr) {
242 return MSERR_UNKNOWN;
243 }
244 return MSERR_OK;
245 }
246
GetChoiceFromJson(Json::Value & root,const std::string & content,std::string key,std::string & value)247 void ScreenCaptureServer::GetChoiceFromJson(Json::Value &root,
248 const std::string &content, std::string key, std::string &value)
249 {
250 Json::Reader reader;
251 bool parsingSuccessful = reader.parse(content, root);
252 if (!parsingSuccessful || root.type() != Json::objectValue) {
253 MEDIA_LOGE("Error parsing the string");
254 return;
255 }
256 const Json::Value keyJson = root[key];
257 if (!keyJson.isNull()) {
258 value = keyJson.asString();
259 }
260 }
261
PrepareSelectWindow(Json::Value & root,std::shared_ptr<ScreenCaptureServer> & server)262 void ScreenCaptureServer::PrepareSelectWindow(Json::Value &root, std::shared_ptr<ScreenCaptureServer> &server)
263 {
264 if (root.type() != Json::objectValue) {
265 return;
266 }
267 const Json::Value missionIdJson = root["missionId"];
268 if (!missionIdJson.isNull() && missionIdJson.asInt64() >= 0) {
269 uint64_t missionId = missionIdJson.asInt64();
270 MEDIA_LOGI("Report Select MissionId: %{public}" PRIu64, missionId);
271 server->SetMissionId(missionId);
272 }
273 const Json::Value displayIdJson = root["displayId"];
274 if (!displayIdJson.isNull() && displayIdJson.asInt64() >= 0) {
275 uint64_t displayId = displayIdJson.asInt64();
276 MEDIA_LOGI("Report Select DisplayId: %{public}" PRIu64, displayId);
277 server->SetDisplayId(displayId);
278 }
279 }
280
ReportAVScreenCaptureUserChoice(int32_t sessionId,const std::string & content)281 int32_t ScreenCaptureServer::ReportAVScreenCaptureUserChoice(int32_t sessionId, const std::string &content)
282 {
283 MEDIA_LOGI("ReportAVScreenCaptureUserChoice sessionId: %{public}d,"
284 "content: %{public}s", sessionId, content.c_str());
285 // To avoid deadlock: first release mutexGlobal_, then be destructed
286 std::shared_ptr<ScreenCaptureServer> server;
287 int32_t serverRet = GetSpecificServer(sessionId, server);
288 CHECK_AND_RETURN_RET_LOG(serverRet == MSERR_OK, serverRet,
289 "ReportAVScreenCaptureUserChoice failed to get instance, sessionId: %{public}d", sessionId);
290 std::shared_ptr<ScreenCaptureServer> currentServer;
291 Json::Value root;
292 std::string choice = "false";
293 GetChoiceFromJson(root, content, std::string("choice"), choice);
294 if (USER_CHOICE_ALLOW.compare(choice) == 0) {
295 int currentSessionId = -1;
296 {
297 std::lock_guard <std::mutex> lock(mutexGlobal_);
298 currentSessionId = activeSessionId_.load();
299 }
300 if (currentSessionId >= 0) {
301 {
302 std::lock_guard<std::mutex> lock(mutexGlobal_);
303 currentServer = GetScreenCaptureServerByIdWithLock(activeSessionId_.load());
304 }
305 if (currentServer != nullptr && sessionId != activeSessionId_.load()) {
306 MEDIA_LOGW("ReportAVScreenCaptureUserChoice uid(%{public}d) is interrupted by uid(%{public}d)",
307 currentServer->appInfo_.appUid, server->appInfo_.appUid);
308 currentServer->StopScreenCaptureByEvent(
309 AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INTERRUPTED_BY_OTHER);
310 }
311 {
312 std::lock_guard <std::mutex> lock(mutexGlobal_);
313 activeSessionId_.store(SESSION_ID_INVALID);
314 }
315 }
316 PrepareSelectWindow(root, server);
317 int32_t ret = server->OnReceiveUserPrivacyAuthority(true);
318 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret,
319 "ReportAVScreenCaptureUserChoice user choice is true but start failed");
320 MEDIA_LOGI("ReportAVScreenCaptureUserChoice user choice is true and start success");
321 return MSERR_OK;
322 } else if (USER_CHOICE_DENY.compare(choice) == 0) {
323 return server->OnReceiveUserPrivacyAuthority(false);
324 } else {
325 MEDIA_LOGW("ReportAVScreenCaptureUserChoice user choice is not support");
326 }
327 return MSERR_UNKNOWN;
328 }
329
SetDisplayId(uint64_t displayId)330 void ScreenCaptureServer::SetDisplayId(uint64_t displayId)
331 {
332 captureConfig_.videoInfo.videoCapInfo.displayId = displayId;
333 }
334
SetMissionId(uint64_t missionId)335 void ScreenCaptureServer::SetMissionId(uint64_t missionId)
336 {
337 missionIds_.emplace_back(missionId);
338 }
339
SetMetaDataReport()340 void ScreenCaptureServer::SetMetaDataReport()
341 {
342 std::shared_ptr<Media::Meta> meta = std::make_shared<Media::Meta>();
343 meta->SetData(Tag::SCREEN_CAPTURE_ERR_CODE, statisticalEventInfo_.errCode);
344 meta->SetData(Tag::SCREEN_CAPTURE_ERR_MSG, statisticalEventInfo_.errMsg);
345 meta->SetData(Tag::SCREEN_CAPTURE_DURATION, statisticalEventInfo_.captureDuration);
346 meta->SetData(Tag::SCREEN_CAPTURE_AV_TYPE, avType_);
347 meta->SetData(Tag::SCREEN_CAPTURE_DATA_TYPE, dataMode_);
348 meta->SetData(Tag::SCREEN_CAPTURE_USER_AGREE, statisticalEventInfo_.userAgree);
349 meta->SetData(Tag::SCREEN_CAPTURE_REQURE_MIC, statisticalEventInfo_.requireMic);
350 meta->SetData(Tag::SCREEN_CAPTURE_ENABLE_MIC, statisticalEventInfo_.enableMic);
351 meta->SetData(Tag::SCREEN_CAPTURE_VIDEO_RESOLUTION, statisticalEventInfo_.videoResolution);
352 meta->SetData(Tag::SCREEN_CAPTURE_STOP_REASON, statisticalEventInfo_.stopReason);
353 meta->SetData(Tag::SCREEN_CAPTURE_START_LATENCY, statisticalEventInfo_.startLatency);
354 AppendMediaInfo(meta, instanceId_);
355 ReportMediaInfo(instanceId_);
356 }
357
ScreenCaptureServer()358 ScreenCaptureServer::ScreenCaptureServer()
359 {
360 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
361 InitAppInfo();
362 instanceId_ = OHOS::HiviewDFX::HiTraceChain::GetId().GetChainId();
363 CreateMediaInfo(SCREEN_CAPTRUER, IPCSkeleton::GetCallingUid(), instanceId_);
364 }
365
~ScreenCaptureServer()366 ScreenCaptureServer::~ScreenCaptureServer()
367 {
368 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
369 ReleaseInner();
370 CloseFd();
371 }
372
SetSessionId(int32_t sessionId)373 void ScreenCaptureServer::SetSessionId(int32_t sessionId)
374 {
375 sessionId_ = sessionId;
376 }
377
SetCaptureMode(CaptureMode captureMode)378 int32_t ScreenCaptureServer::SetCaptureMode(CaptureMode captureMode)
379 {
380 MediaTrace trace("ScreenCaptureServer::SetCaptureMode");
381 std::lock_guard<std::mutex> lock(mutex_);
382 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
383 "SetCaptureMode failed, capture is not CREATED, state:%{public}d, mode:%{public}d", captureState_, captureMode);
384 MEDIA_LOGI("ScreenCaptureServer::SetCaptureMode start, captureMode:%{public}d", captureMode);
385 int32_t ret = CheckCaptureMode(captureMode);
386 CHECK_AND_RETURN_RET(ret == MSERR_OK, ret);
387 captureConfig_.captureMode = captureMode;
388 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetCaptureMode OK.", FAKE_POINTER(this));
389 return MSERR_OK;
390 }
391
SetDataType(DataType dataType)392 int32_t ScreenCaptureServer::SetDataType(DataType dataType)
393 {
394 MediaTrace trace("ScreenCaptureServer::SetDataType");
395 std::lock_guard<std::mutex> lock(mutex_);
396 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
397 "SetDataType failed, capture is not CREATED, state:%{public}d, dataType:%{public}d", captureState_, dataType);
398 MEDIA_LOGI("ScreenCaptureServer::SetDataType start, dataType:%{public}d", dataType);
399 int32_t ret = CheckDataType(dataType);
400 CHECK_AND_RETURN_RET(ret == MSERR_OK, ret);
401 captureConfig_.dataType = dataType;
402 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetDataType OK.", FAKE_POINTER(this));
403 return MSERR_OK;
404 }
405
SetRecorderInfo(RecorderInfo recorderInfo)406 int32_t ScreenCaptureServer::SetRecorderInfo(RecorderInfo recorderInfo)
407 {
408 std::lock_guard<std::mutex> lock(mutex_);
409 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
410 "SetRecorderInfo failed, capture is not CREATED, state:%{public}d", captureState_);
411 MEDIA_LOGI("ScreenCaptureServer::SetRecorderInfo start");
412 url_ = recorderInfo.url;
413 avType_ = AVScreenCaptureAvType::AV_TYPE;
414
415 if (MP4.compare(recorderInfo.fileFormat) == 0) {
416 fileFormat_ = OutputFormatType::FORMAT_MPEG_4;
417 } else if (M4A.compare(recorderInfo.fileFormat) == 0) {
418 fileFormat_ = OutputFormatType::FORMAT_M4A;
419 } else {
420 MEDIA_LOGE("invalid fileFormat type");
421 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_,
422 SCREEN_CAPTURE_ERR_INVALID_VAL, "invalid fileFormat type");
423 return MSERR_INVALID_VAL;
424 }
425 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetRecorderInfo OK.", FAKE_POINTER(this));
426 return MSERR_OK;
427 }
428
SetOutputFile(int32_t outputFd)429 int32_t ScreenCaptureServer::SetOutputFile(int32_t outputFd)
430 {
431 std::lock_guard<std::mutex> lock(mutex_);
432 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
433 "SetOutputFile failed, capture is not CREATED, state:%{public}d", captureState_);
434 MEDIA_LOGI("ScreenCaptureServer::SetOutputFile start");
435 if (outputFd < 0) {
436 MEDIA_LOGI("invalid outputFd");
437 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_,
438 SCREEN_CAPTURE_ERR_INVALID_VAL, "invalid outputFd");
439 return MSERR_INVALID_VAL;
440 }
441
442 int flags = fcntl(outputFd, F_GETFL);
443 if (flags == -1) {
444 MEDIA_LOGE("Fail to get File Status Flags");
445 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
446 "Fail to get File Status Flags");
447 return MSERR_INVALID_VAL;
448 }
449 if ((static_cast<unsigned int>(flags) & (O_RDWR | O_WRONLY)) == 0) {
450 MEDIA_LOGE("File descriptor is not in read-write mode or write-only mode");
451 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
452 "File descriptor is not in read-write mode or write-only mode");
453 return MSERR_INVALID_VAL;
454 }
455 CloseFd();
456 MEDIA_LOGI("ScreenCaptureServer fd in, fd is %{public}d", outputFd);
457 outputFd_ = dup(outputFd);
458 MEDIA_LOGI("ScreenCaptureServer fd dup, fd is %{public}d", outputFd_);
459 MEDIA_LOGI("ScreenCaptureServer SetOutputFile End");
460 return MSERR_OK;
461 }
462
SetScreenCaptureCallback(const std::shared_ptr<ScreenCaptureCallBack> & callback)463 int32_t ScreenCaptureServer::SetScreenCaptureCallback(const std::shared_ptr<ScreenCaptureCallBack> &callback)
464 {
465 MediaTrace trace("ScreenCaptureServer::SetScreenCaptureCallback");
466 std::lock_guard<std::mutex> lock(mutex_);
467 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
468 "SetScreenCaptureCallback failed, capture is not CREATED, state:%{public}d", captureState_);
469 CHECK_AND_RETURN_RET_LOG(callback != nullptr, MSERR_INVALID_VAL,
470 "SetScreenCaptureCallback failed, callback is nullptr, state:%{public}d", captureState_);
471 MEDIA_LOGI("ScreenCaptureServer::SetScreenCaptureCallback start");
472 screenCaptureCb_ = callback;
473 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetScreenCaptureCallback OK.", FAKE_POINTER(this));
474 return MSERR_OK;
475 }
476
InitAudioEncInfo(AudioEncInfo audioEncInfo)477 int32_t ScreenCaptureServer::InitAudioEncInfo(AudioEncInfo audioEncInfo)
478 {
479 std::lock_guard<std::mutex> lock(mutex_);
480 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
481 "InitAudioEncInfo failed, capture is not CREATED, state:%{public}d", captureState_);
482 MEDIA_LOGI("ScreenCaptureServer::InitAudioEncInfo start");
483 MEDIA_LOGD("audioEncInfo audioBitrate:%{public}d, audioCodecformat:%{public}d", audioEncInfo.audioBitrate,
484 audioEncInfo.audioCodecformat);
485 int32_t ret = CheckAudioEncInfo(audioEncInfo);
486 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "InitAudioEncInfo failed, ret:%{public}d", ret);
487 captureConfig_.audioInfo.audioEncInfo = audioEncInfo;
488 return MSERR_OK;
489 }
490
InitVideoEncInfo(VideoEncInfo videoEncInfo)491 int32_t ScreenCaptureServer::InitVideoEncInfo(VideoEncInfo videoEncInfo)
492 {
493 std::lock_guard<std::mutex> lock(mutex_);
494 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
495 "InitVideoEncInfo failed, capture is not CREATED, state:%{public}d", captureState_);
496 MEDIA_LOGI("ScreenCaptureServer::InitVideoEncInfo start");
497 MEDIA_LOGD("videoEncInfo videoCodec:%{public}d, videoBitrate:%{public}d, videoFrameRate:%{public}d",
498 videoEncInfo.videoCodec, videoEncInfo.videoBitrate, videoEncInfo.videoFrameRate);
499 int32_t ret = CheckVideoEncInfo(videoEncInfo);
500 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "InitVideoEncInfo failed, ret:%{public}d", ret);
501 captureConfig_.videoInfo.videoEncInfo = videoEncInfo;
502 return MSERR_OK;
503 }
504
CheckScreenCapturePermission()505 bool ScreenCaptureServer::CheckScreenCapturePermission()
506 {
507 int result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(appInfo_.appTokenId,
508 "ohos.permission.CAPTURE_SCREEN");
509 if (result == Security::AccessToken::PERMISSION_GRANTED) {
510 MEDIA_LOGI("user have the right to access capture screen!");
511 return true;
512 } else {
513 MEDIA_LOGE("user do not have the right to access capture screen!");
514 return false;
515 }
516 }
517
IsUserPrivacyAuthorityNeeded()518 bool ScreenCaptureServer::IsUserPrivacyAuthorityNeeded()
519 {
520 MediaTrace trace("ScreenCaptureServer::IsUserPrivacyAuthorityNeeded");
521 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " IsUserPrivacyAuthorityNeeded start, appUid:%{public}d",
522 FAKE_POINTER(this), appInfo_.appUid);
523 if (appInfo_.appUid == ROOT_UID) {
524 MEDIA_LOGI("Root user. Privacy Authority Granted automaticly");
525 return false;
526 }
527 return true;
528 }
529
CheckCaptureMode(CaptureMode captureMode)530 int32_t ScreenCaptureServer::CheckCaptureMode(CaptureMode captureMode)
531 {
532 MEDIA_LOGD("CheckCaptureMode start, captureMode:%{public}d", captureMode);
533 if ((captureMode > CAPTURE_SPECIFIED_WINDOW) || (captureMode < CAPTURE_HOME_SCREEN)) {
534 MEDIA_LOGE("invalid captureMode:%{public}d", captureMode);
535 return MSERR_INVALID_VAL;
536 }
537 MEDIA_LOGD("ScreenCaptureServer CheckCaptureMode OK.");
538 return MSERR_OK;
539 }
540
CheckDataType(DataType dataType)541 int32_t ScreenCaptureServer::CheckDataType(DataType dataType)
542 {
543 MEDIA_LOGD("CheckDataType start, dataType:%{public}d", dataType);
544 if ((dataType > DataType::CAPTURE_FILE) || (dataType < DataType::ORIGINAL_STREAM)) {
545 MEDIA_LOGE("invalid dataType:%{public}d", dataType);
546 return MSERR_INVALID_VAL;
547 }
548 if (dataType == DataType::ENCODED_STREAM) {
549 MEDIA_LOGE("not supported dataType:%{public}d", dataType);
550 return MSERR_UNSUPPORT;
551 }
552 MEDIA_LOGD("ScreenCaptureServer CheckDataType OK.");
553 return MSERR_OK;
554 }
555
CheckAudioCapParam(const AudioCaptureInfo & audioCapInfo)556 int32_t ScreenCaptureServer::CheckAudioCapParam(const AudioCaptureInfo &audioCapInfo)
557 {
558 MEDIA_LOGD("CheckAudioCapParam sampleRate:%{public}d, channels:%{public}d, source:%{public}d, state:%{public}d",
559 audioCapInfo.audioSampleRate, audioCapInfo.audioChannels, audioCapInfo.audioSource, audioCapInfo.state);
560 std::vector<AudioSamplingRate> supportedSamplingRates = AudioStandard::AudioCapturer::GetSupportedSamplingRates();
561 bool foundSupportSample = false;
562 for (auto iter = supportedSamplingRates.begin(); iter != supportedSamplingRates.end(); ++iter) {
563 if (static_cast<AudioSamplingRate>(audioCapInfo.audioSampleRate) == *iter) {
564 foundSupportSample = true;
565 }
566 }
567 if (!foundSupportSample) {
568 MEDIA_LOGE("invalid audioSampleRate:%{public}d", audioCapInfo.audioSampleRate);
569 return MSERR_UNSUPPORT;
570 }
571
572 std::vector<AudioChannel> supportedChannelList = AudioStandard::AudioCapturer::GetSupportedChannels();
573 bool foundSupportChannel = false;
574 for (auto iter = supportedChannelList.begin(); iter != supportedChannelList.end(); ++iter) {
575 if (static_cast<AudioChannel>(audioCapInfo.audioChannels) == *iter) {
576 foundSupportChannel = true;
577 }
578 }
579 if (!foundSupportChannel) {
580 MEDIA_LOGE("invalid audioChannels:%{public}d", audioCapInfo.audioChannels);
581 return MSERR_UNSUPPORT;
582 }
583
584 if ((audioCapInfo.audioSource <= SOURCE_INVALID) || (audioCapInfo.audioSource > APP_PLAYBACK)) {
585 MEDIA_LOGE("invalid audioSource:%{public}d", audioCapInfo.audioSource);
586 return MSERR_INVALID_VAL;
587 }
588 MEDIA_LOGD("ScreenCaptureServer CheckAudioCapParam OK.");
589 return MSERR_OK;
590 }
591
CheckVideoCapParam(const VideoCaptureInfo & videoCapInfo)592 int32_t ScreenCaptureServer::CheckVideoCapParam(const VideoCaptureInfo &videoCapInfo)
593 {
594 MEDIA_LOGD("CheckVideoCapParam width:%{public}d, height:%{public}d, source:%{public}d, state:%{public}d",
595 videoCapInfo.videoFrameWidth, videoCapInfo.videoFrameHeight, videoCapInfo.videoSource, videoCapInfo.state);
596 if ((videoCapInfo.videoFrameWidth <= 0) || (videoCapInfo.videoFrameWidth > VIDEO_FRAME_WIDTH_MAX)) {
597 MEDIA_LOGE("videoCapInfo Width is invalid, videoFrameWidth:%{public}d, videoFrameHeight:%{public}d",
598 videoCapInfo.videoFrameWidth, videoCapInfo.videoFrameHeight);
599 return MSERR_INVALID_VAL;
600 }
601 if ((videoCapInfo.videoFrameHeight <= 0) || (videoCapInfo.videoFrameHeight > VIDEO_FRAME_HEIGHT_MAX)) {
602 MEDIA_LOGE("videoCapInfo Height is invalid, videoFrameWidth:%{public}d, videoFrameHeight:%{public}d",
603 videoCapInfo.videoFrameWidth, videoCapInfo.videoFrameHeight);
604 return MSERR_INVALID_VAL;
605 }
606
607 if (videoCapInfo.videoSource != VIDEO_SOURCE_SURFACE_RGBA) {
608 MEDIA_LOGE("videoSource is invalid");
609 return MSERR_INVALID_VAL;
610 }
611 MEDIA_LOGD("ScreenCaptureServer CheckVideoCapParam OK.");
612 return MSERR_OK;
613 }
614
CheckAudioEncParam(const AudioEncInfo & audioEncInfo)615 int32_t ScreenCaptureServer::CheckAudioEncParam(const AudioEncInfo &audioEncInfo)
616 {
617 MEDIA_LOGD("CheckAudioEncParam audioBitrate:%{public}d, audioCodecformat:%{public}d",
618 audioEncInfo.audioBitrate, audioEncInfo.audioCodecformat);
619 if ((audioEncInfo.audioCodecformat >= AudioCodecFormat::AUDIO_CODEC_FORMAT_BUTT) ||
620 (audioEncInfo.audioCodecformat < AudioCodecFormat::AUDIO_DEFAULT)) {
621 MEDIA_LOGE("invalid AudioCodecFormat:%{public}d", audioEncInfo.audioCodecformat);
622 return MSERR_INVALID_VAL;
623 }
624 if (audioEncInfo.audioBitrate < AUDIO_BITRATE_MIN || audioEncInfo.audioBitrate > AUDIO_BITRATE_MAX) {
625 MEDIA_LOGE("invalid audioBitrate:%{public}d", audioEncInfo.audioBitrate);
626 return MSERR_INVALID_VAL;
627 }
628 return MSERR_OK;
629 }
630
CheckVideoEncParam(const VideoEncInfo & videoEncInfo)631 int32_t ScreenCaptureServer::CheckVideoEncParam(const VideoEncInfo &videoEncInfo)
632 {
633 MEDIA_LOGD("CheckVideoEncParam videoCodec:%{public}d, videoBitrate:%{public}d, videoFrameRate:%{public}d",
634 videoEncInfo.videoCodec, videoEncInfo.videoBitrate, videoEncInfo.videoFrameRate);
635 if ((videoEncInfo.videoCodec >= VideoCodecFormat::VIDEO_CODEC_FORMAT_BUTT) ||
636 (videoEncInfo.videoCodec < VideoCodecFormat::VIDEO_DEFAULT)) {
637 MEDIA_LOGE("invalid VideoCodecFormat:%{public}d", videoEncInfo.videoCodec);
638 return MSERR_INVALID_VAL;
639 }
640 if (videoEncInfo.videoBitrate < VIDEO_BITRATE_MIN || videoEncInfo.videoBitrate > VIDEO_BITRATE_MAX) {
641 MEDIA_LOGE("invalid videoBitrate:%{public}d", videoEncInfo.videoBitrate);
642 return MSERR_INVALID_VAL;
643 }
644 if (videoEncInfo.videoFrameRate < VIDEO_FRAME_RATE_MIN || videoEncInfo.videoFrameRate > VIDEO_FRAME_RATE_MAX) {
645 MEDIA_LOGE("invalid videoFrameRate:%{public}d", videoEncInfo.videoFrameRate);
646 return MSERR_INVALID_VAL;
647 }
648 return MSERR_OK;
649 }
650
CheckAudioCapInfo(AudioCaptureInfo & audioCapInfo)651 int32_t ScreenCaptureServer::CheckAudioCapInfo(AudioCaptureInfo &audioCapInfo)
652 {
653 MEDIA_LOGD("ScreenCaptureServer CheckAudioCapInfo start, audioChannels:%{public}d, "
654 "audioSampleRate:%{public}d, audioSource:%{public}d, state:%{public}d.",
655 audioCapInfo.audioChannels, audioCapInfo.audioSampleRate, audioCapInfo.audioSource, audioCapInfo.state);
656 if (audioCapInfo.audioChannels == 0 && audioCapInfo.audioSampleRate == 0) {
657 MEDIA_LOGD("audioCap IGNORED sampleRate:%{public}d, channels:%{public}d, source:%{public}d, state:%{public}d",
658 audioCapInfo.audioSampleRate, audioCapInfo.audioChannels, audioCapInfo.audioSource, audioCapInfo.state);
659 audioCapInfo.state = AVScreenCaptureParamValidationState::VALIDATION_IGNORE;
660 return MSERR_OK;
661 }
662 MEDIA_LOGD("CheckAudioCapParam S sampleRate:%{public}d, channels:%{public}d, source:%{public}d, state:%{public}d",
663 audioCapInfo.audioSampleRate, audioCapInfo.audioChannels, audioCapInfo.audioSource, audioCapInfo.state);
664 int32_t ret = CheckAudioCapParam(audioCapInfo);
665 audioCapInfo.state = ret == MSERR_OK ? AVScreenCaptureParamValidationState::VALIDATION_VALID :
666 AVScreenCaptureParamValidationState::VALIDATION_INVALID;
667 MEDIA_LOGD("CheckAudioCapParam E sampleRate:%{public}d, channels:%{public}d, source:%{public}d, state:%{public}d",
668 audioCapInfo.audioSampleRate, audioCapInfo.audioChannels, audioCapInfo.audioSource, audioCapInfo.state);
669 MEDIA_LOGD("ScreenCaptureServer CheckAudioCapInfo end.");
670 return ret;
671 }
672
CheckVideoCapInfo(VideoCaptureInfo & videoCapInfo)673 int32_t ScreenCaptureServer::CheckVideoCapInfo(VideoCaptureInfo &videoCapInfo)
674 {
675 MEDIA_LOGD("CheckVideoCapInfo start, videoFrameWidth:%{public}d, videoFrameHeight:%{public}d, "
676 "videoSource:%{public}d, state:%{public}d.", videoCapInfo.videoFrameWidth, videoCapInfo.videoFrameHeight,
677 videoCapInfo.videoSource, videoCapInfo.state);
678 if (videoCapInfo.videoFrameWidth == 0 && videoCapInfo.videoFrameHeight == 0) {
679 MEDIA_LOGD("videoCap IGNORED width:%{public}d, height:%{public}d, source:%{public}d, state:%{public}d",
680 videoCapInfo.videoFrameWidth, videoCapInfo.videoFrameHeight, videoCapInfo.videoSource, videoCapInfo.state);
681 videoCapInfo.state = AVScreenCaptureParamValidationState::VALIDATION_IGNORE;
682 return MSERR_OK;
683 }
684 MEDIA_LOGD("CheckVideoCapParam S width:%{public}d, height:%{public}d, source:%{public}d, state:%{public}d",
685 videoCapInfo.videoFrameWidth, videoCapInfo.videoFrameHeight, videoCapInfo.videoSource, videoCapInfo.state);
686 int32_t ret = CheckVideoCapParam(videoCapInfo);
687 videoCapInfo.state = ret == MSERR_OK ? AVScreenCaptureParamValidationState::VALIDATION_VALID :
688 AVScreenCaptureParamValidationState::VALIDATION_INVALID;
689 MEDIA_LOGD("CheckVideoCapParam E width:%{public}d, height:%{public}d, source:%{public}d, state:%{public}d",
690 videoCapInfo.videoFrameWidth, videoCapInfo.videoFrameHeight, videoCapInfo.videoSource, videoCapInfo.state);
691 MEDIA_LOGD("ScreenCaptureServer CheckVideoCapInfo end.");
692 return ret;
693 }
694
CheckAudioEncInfo(AudioEncInfo & audioEncInfo)695 int32_t ScreenCaptureServer::CheckAudioEncInfo(AudioEncInfo &audioEncInfo)
696 {
697 MEDIA_LOGD("ScreenCaptureServer CheckAudioEncInfo start.");
698 int32_t ret = CheckAudioEncParam(audioEncInfo);
699 audioEncInfo.state = ret == MSERR_OK ? AVScreenCaptureParamValidationState::VALIDATION_VALID :
700 AVScreenCaptureParamValidationState::VALIDATION_INVALID;
701 MEDIA_LOGD("ScreenCaptureServer CheckAudioEncInfo end, state: %{public}d.", audioEncInfo.state);
702 return ret;
703 }
704
CheckVideoEncInfo(VideoEncInfo & videoEncInfo)705 int32_t ScreenCaptureServer::CheckVideoEncInfo(VideoEncInfo &videoEncInfo)
706 {
707 MEDIA_LOGD("ScreenCaptureServer CheckVideoEncInfo start.");
708 int32_t ret = CheckVideoEncParam(videoEncInfo);
709 videoEncInfo.state = ret == MSERR_OK ? AVScreenCaptureParamValidationState::VALIDATION_VALID :
710 AVScreenCaptureParamValidationState::VALIDATION_INVALID;
711 MEDIA_LOGD("ScreenCaptureServer CheckVideoEncInfo end, state: %{public}d.", videoEncInfo.state);
712 return ret;
713 }
714
CheckAllParams()715 int32_t ScreenCaptureServer::CheckAllParams()
716 {
717 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " CheckAllParams start, dataType:%{public}d.",
718 FAKE_POINTER(this), captureConfig_.dataType);
719 int32_t ret = CheckDataType(captureConfig_.dataType);
720 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "CheckAllParams CheckDataType failed, ret:%{public}d", ret);
721
722 ret = CheckCaptureMode(captureConfig_.captureMode);
723 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "CheckAllParams CheckCaptureMode failed, ret:%{public}d", ret);
724
725 if (captureConfig_.dataType == DataType::ORIGINAL_STREAM) {
726 if (isSurfaceMode_) {
727 dataMode_ = AVScreenCaptureDataMode::SUFFACE_MODE;
728 } else {
729 dataMode_ = AVScreenCaptureDataMode::BUFFER_MODE;
730 }
731 return CheckCaptureStreamParams();
732 }
733 if (captureConfig_.dataType == DataType::CAPTURE_FILE) {
734 dataMode_ = AVScreenCaptureDataMode::FILE_MODE;
735 return CheckCaptureFileParams();
736 }
737 return MSERR_INVALID_VAL;
738 }
739
CheckCaptureStreamParams()740 int32_t ScreenCaptureServer::CheckCaptureStreamParams()
741 {
742 // For original stream:
743 // 1. Any of innerCapInfo/videoCapInfo should be not invalid and should not be both ignored
744 // 2. micCapInfo should not be invalid
745 // 3. For surface mode, videoCapInfo should be valid
746 CheckAudioCapInfo(captureConfig_.audioInfo.micCapInfo);
747 CheckAudioCapInfo(captureConfig_.audioInfo.innerCapInfo);
748 CheckVideoCapInfo(captureConfig_.videoInfo.videoCapInfo);
749 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " CheckCaptureStreamParams start, isSurfaceMode:%{public}s,"
750 " videoCapInfo.state:%{public}d, innerCapInfo.state:%{public}d.", FAKE_POINTER(this),
751 isSurfaceMode_ ? "true" : "false", captureConfig_.videoInfo.videoCapInfo.state,
752 captureConfig_.audioInfo.innerCapInfo.state);
753 if (isSurfaceMode_) {
754 // surface mode, surface must not nullptr and videoCapInfo must valid.
755 if (surface_ == nullptr ||
756 captureConfig_.videoInfo.videoCapInfo.state != AVScreenCaptureParamValidationState::VALIDATION_VALID) {
757 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
758 "video Cap state fault, videoCapInfo is invalid");
759 return MSERR_INVALID_VAL;
760 }
761 }
762 if (captureConfig_.audioInfo.innerCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_INVALID ||
763 captureConfig_.videoInfo.videoCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_INVALID) {
764 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
765 "audio inner cap or video cap state invalid");
766 return MSERR_INVALID_VAL;
767 }
768 if (captureConfig_.audioInfo.innerCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_IGNORE &&
769 captureConfig_.videoInfo.videoCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_IGNORE) {
770 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
771 "audio inner cap or video cap state ignore");
772 return MSERR_INVALID_VAL;
773 }
774 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " CheckCaptureStreamParams OK.", FAKE_POINTER(this));
775 return MSERR_OK;
776 }
777
CheckCaptureFileParams()778 int32_t ScreenCaptureServer::CheckCaptureFileParams()
779 {
780 // For capture file:
781 // 1. All of innerCapInfo/videoCapInfo/audioEncInfo/videoEncInfo should be be valid
782 // 2. micCapInfo should not be invalid
783 CheckAudioCapInfo(captureConfig_.audioInfo.micCapInfo);
784 CheckAudioCapInfo(captureConfig_.audioInfo.innerCapInfo);
785 CheckAudioEncInfo(captureConfig_.audioInfo.audioEncInfo);
786 CheckVideoCapInfo(captureConfig_.videoInfo.videoCapInfo);
787 if (captureConfig_.videoInfo.videoCapInfo.state != AVScreenCaptureParamValidationState::VALIDATION_IGNORE) {
788 CheckVideoEncInfo(captureConfig_.videoInfo.videoEncInfo);
789 }
790 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " CheckCaptureFileParams start, "
791 "innerCapInfo.state:%{public}d, videoCapInfo.state:%{public}d, audioEncInfo.state:%{public}d, "
792 "videoEncInfo.state:%{public}d, micCapInfo.state:%{public}d.", FAKE_POINTER(this),
793 captureConfig_.audioInfo.innerCapInfo.state, captureConfig_.videoInfo.videoCapInfo.state,
794 captureConfig_.audioInfo.audioEncInfo.state, captureConfig_.videoInfo.videoEncInfo.state,
795 captureConfig_.audioInfo.micCapInfo.state);
796
797 if (captureConfig_.audioInfo.innerCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_INVALID ||
798 captureConfig_.videoInfo.videoCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_INVALID ||
799 captureConfig_.audioInfo.audioEncInfo.state == AVScreenCaptureParamValidationState::VALIDATION_INVALID ||
800 captureConfig_.videoInfo.videoEncInfo.state == AVScreenCaptureParamValidationState::VALIDATION_INVALID) {
801 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
802 "innerCap audioEnc videoCap videoEnc state invalid");
803 return MSERR_INVALID_VAL;
804 }
805 if (captureConfig_.audioInfo.micCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_INVALID) {
806 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
807 "audio mic cap state invalid");
808 return MSERR_INVALID_VAL;
809 }
810 if (captureConfig_.audioInfo.micCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_IGNORE) {
811 return MSERR_OK;
812 }
813 const AudioCaptureInfo &micCapInfo = captureConfig_.audioInfo.micCapInfo;
814 const AudioCaptureInfo &innerCapInfo = captureConfig_.audioInfo.innerCapInfo;
815 if (micCapInfo.audioSampleRate == innerCapInfo.audioSampleRate &&
816 micCapInfo.audioChannels == innerCapInfo.audioChannels) {
817 return MSERR_OK;
818 }
819 MEDIA_LOGE("CheckCaptureFileParams failed, inner and mic param not consistent");
820 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_INVALID_VAL,
821 "CheckCaptureFileParams failed, inner and mic param not consistent");
822 return MSERR_INVALID_VAL;
823 }
824
825 // Should call in ipc thread
InitAppInfo()826 void ScreenCaptureServer::InitAppInfo()
827 {
828 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " InitAppInfo start.", FAKE_POINTER(this));
829 appInfo_.appTokenId = IPCSkeleton::GetCallingTokenID();
830 appInfo_.appFullTokenId = IPCSkeleton::GetCallingFullTokenID();
831 appInfo_.appUid = IPCSkeleton::GetCallingUid();
832 appInfo_.appPid = IPCSkeleton::GetCallingPid();
833 appName_ = GetClientBundleName(appInfo_.appUid);
834 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " InitAppInfo end.", FAKE_POINTER(this));
835 }
836
GetCurrentMillisecond()837 int64_t ScreenCaptureServer::GetCurrentMillisecond()
838 {
839 std::chrono::system_clock::duration duration = std::chrono::system_clock::now().time_since_epoch();
840 int64_t time = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
841 return time;
842 }
843
SetErrorInfo(int32_t errCode,const std::string & errMsg,StopReason stopReason,bool userAgree)844 void ScreenCaptureServer::SetErrorInfo(int32_t errCode, const std::string &errMsg, StopReason stopReason,
845 bool userAgree)
846 {
847 statisticalEventInfo_.errCode = errCode;
848 statisticalEventInfo_.errMsg = errMsg;
849 statisticalEventInfo_.stopReason = stopReason;
850 statisticalEventInfo_.userAgree = userAgree;
851 }
852
RequestUserPrivacyAuthority()853 int32_t ScreenCaptureServer::RequestUserPrivacyAuthority()
854 {
855 MediaTrace trace("ScreenCaptureServer::RequestUserPrivacyAuthority");
856 // If Root is treated as whitelisted, how to guarantee RequestUserPrivacyAuthority function by TDD cases.
857 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " RequestUserPrivacyAuthority start.", FAKE_POINTER(this));
858 if (!IsUserPrivacyAuthorityNeeded()) {
859 MEDIA_LOGI("Privacy Authority Granted. uid:%{public}d", appInfo_.appUid);
860 return MSERR_OK;
861 }
862
863 if (isPrivacyAuthorityEnabled_) {
864 if (GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"]
865 .compare(appName_) != 0) {
866 return StartPrivacyWindow();
867 } else {
868 MEDIA_LOGI("ScreenCaptureServer::RequestUserPrivacyAuthority support screenrecorder");
869 return MSERR_OK;
870 }
871 }
872
873 MEDIA_LOGI("privacy notification window not support, go on to check CAPTURE_SCREEN permission");
874 return CheckScreenCapturePermission() ? MSERR_OK : MSERR_INVALID_OPERATION;
875 }
876
OnReceiveUserPrivacyAuthority(bool isAllowed)877 int32_t ScreenCaptureServer::OnReceiveUserPrivacyAuthority(bool isAllowed)
878 {
879 // Should callback be running in seperate thread?
880 std::lock_guard<std::mutex> lock(mutex_);
881 MEDIA_LOGI("OnReceiveUserPrivacyAuthority start, isAllowed:%{public}d, state:%{public}d", isAllowed, captureState_);
882 if (screenCaptureCb_ == nullptr) {
883 MEDIA_LOGE("OnReceiveUserPrivacyAuthority failed, screenCaptureCb is nullptr, state:%{public}d", captureState_);
884 captureState_ = AVScreenCaptureState::STOPPED;
885 SetErrorInfo(MSERR_UNKNOWN, "OnReceiveUserPrivacyAuthority failed, screenCaptureCb is nullptr",
886 StopReason::RECEIVE_USER_PRIVACY_AUTHORITY_FAILED, IsUserPrivacyAuthorityNeeded());
887 return MSERR_UNKNOWN;
888 }
889
890 if (captureState_ != AVScreenCaptureState::STARTING) {
891 MEDIA_LOGE("OnReceiveUserPrivacyAuthority failed, capture is not STARTING");
892 screenCaptureCb_->OnError(ScreenCaptureErrorType::SCREEN_CAPTURE_ERROR_INTERNAL,
893 AVScreenCaptureErrorCode::SCREEN_CAPTURE_ERR_UNKNOWN);
894 return MSERR_UNKNOWN;
895 }
896 if (!isAllowed) {
897 captureState_ = AVScreenCaptureState::CREATED;
898 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_CANCELED);
899 return MSERR_UNKNOWN;
900 }
901 int32_t ret = OnStartScreenCapture();
902 PostStartScreenCapture(ret == MSERR_OK);
903 return ret;
904 }
905
StartAudioCapture()906 int32_t ScreenCaptureServer::StartAudioCapture()
907 {
908 int32_t ret = MSERR_UNKNOWN;
909 if (isMicrophoneOn_) {
910 ret = StartStreamMicAudioCapture();
911 if (ret != MSERR_OK) {
912 MEDIA_LOGE("StartStreamMicAudioCapture failed");
913 }
914 }
915 ret = StartStreamInnerAudioCapture();
916 if (ret != MSERR_OK) {
917 MEDIA_LOGE("StartStreamInnerAudioCapture failed");
918 micAudioCapture_ = nullptr;
919 return ret;
920 }
921 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartAudioCapture OK.", FAKE_POINTER(this));
922 return MSERR_OK;
923 }
924
StartStreamInnerAudioCapture()925 int32_t ScreenCaptureServer::StartStreamInnerAudioCapture()
926 {
927 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartStreamInnerAudioCapture start, dataType:%{public}d,"
928 " innerCapInfo.state:%{public}d.",
929 FAKE_POINTER(this), captureConfig_.dataType, captureConfig_.audioInfo.innerCapInfo.state);
930 std::shared_ptr<AudioCapturerWrapper> innerCapture;
931 if (captureConfig_.audioInfo.innerCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID) {
932 MediaTrace trace("ScreenCaptureServer::StartAudioCaptureInner");
933 innerCapture = std::make_shared<AudioCapturerWrapper>(captureConfig_.audioInfo.innerCapInfo, screenCaptureCb_,
934 std::string("OS_InnerAudioCapture"), contentFilter_);
935 int32_t ret = innerCapture->Start(appInfo_);
936 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "StartAudioCapture innerCapture failed");
937 }
938 innerAudioCapture_ = innerCapture;
939 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartStreamInnerAudioCapture OK.", FAKE_POINTER(this));
940 return MSERR_OK;
941 }
942
StartStreamMicAudioCapture()943 int32_t ScreenCaptureServer::StartStreamMicAudioCapture()
944 {
945 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartStreamMicAudioCapture start, dataType:%{public}d, "
946 "micCapInfo.state:%{public}d.",
947 FAKE_POINTER(this), captureConfig_.dataType, captureConfig_.audioInfo.micCapInfo.state);
948 std::shared_ptr<AudioCapturerWrapper> micCapture;
949 if (captureConfig_.audioInfo.micCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID) {
950 MediaTrace trace("ScreenCaptureServer::StartAudioCaptureMic");
951 ScreenCaptureContentFilter contentFilterMic;
952 micCapture = std::make_shared<AudioCapturerWrapper>(captureConfig_.audioInfo.micCapInfo, screenCaptureCb_,
953 std::string("OS_MicAudioCapture"), contentFilterMic);
954 int32_t ret = micCapture->Start(appInfo_);
955 if (ret != MSERR_OK) {
956 MEDIA_LOGE("StartStreamMicAudioCapture failed");
957 isMicrophoneOn_ = false;
958 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_MIC_UNAVAILABLE);
959 return ret;
960 }
961 }
962 micAudioCapture_ = micCapture;
963 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartStreamMicAudioCapture OK.", FAKE_POINTER(this));
964 return MSERR_OK;
965 }
966
StartFileInnerAudioCapture()967 int32_t ScreenCaptureServer::StartFileInnerAudioCapture()
968 {
969 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartFileInnerAudioCapture start, dataType:%{public}d, "
970 "innerCapInfo.state:%{public}d.",
971 FAKE_POINTER(this), captureConfig_.dataType, captureConfig_.audioInfo.innerCapInfo.state);
972 std::shared_ptr<AudioCapturerWrapper> innerCapture;
973 if (captureConfig_.audioInfo.innerCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID) {
974 MediaTrace trace("ScreenCaptureServer::StartFileInnerAudioCaptureInner");
975 innerCapture = std::make_shared<AudioCapturerWrapper>(captureConfig_.audioInfo.innerCapInfo, screenCaptureCb_,
976 std::string("OS_InnerAudioCapture"), contentFilter_);
977 int32_t ret = innerCapture->Start(appInfo_);
978 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "StartFileInnerAudioCapture failed");
979 if (isMicrophoneOn_ && audioSource_ && audioSource_->GetSpeakerAliveStatus() &&
980 !audioSource_->GetIsInVoIPCall()) {
981 ret = innerCapture->Pause();
982 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "StartAudioCapture innerCapture Pause failed");
983 }
984 }
985 innerAudioCapture_ = innerCapture;
986 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartFileInnerAudioCapture OK.", FAKE_POINTER(this));
987 return MSERR_OK;
988 }
989
StartFileMicAudioCapture()990 int32_t ScreenCaptureServer::StartFileMicAudioCapture()
991 {
992 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartFileMicAudioCapture start, dataType:%{public}d, "
993 "micCapInfo.state:%{public}d.",
994 FAKE_POINTER(this), captureConfig_.dataType, captureConfig_.audioInfo.micCapInfo.state);
995 std::shared_ptr<AudioCapturerWrapper> micCapture;
996 if (captureConfig_.audioInfo.micCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID) {
997 MediaTrace trace("ScreenCaptureServer::StartFileMicAudioCaptureInner");
998 ScreenCaptureContentFilter contentFilterMic;
999 micCapture = std::make_shared<AudioCapturerWrapper>(captureConfig_.audioInfo.micCapInfo, screenCaptureCb_,
1000 std::string("OS_MicAudioCapture"), contentFilterMic);
1001 if (audioSource_) {
1002 micCapture->SetIsInVoIPCall(audioSource_->GetIsInVoIPCall());
1003 }
1004 int32_t ret = micCapture->Start(appInfo_);
1005 if (ret != MSERR_OK) {
1006 MEDIA_LOGE("StartFileMicAudioCapture micCapture failed");
1007 isMicrophoneOn_ = false;
1008 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_MIC_UNAVAILABLE);
1009 return ret;
1010 }
1011 }
1012 micAudioCapture_ = micCapture;
1013 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartFileMicAudioCapture OK.", FAKE_POINTER(this));
1014 return MSERR_OK;
1015 }
1016
StartScreenCaptureStream()1017 int32_t ScreenCaptureServer::StartScreenCaptureStream()
1018 {
1019 MediaTrace trace("ScreenCaptureServer::StartScreenCaptureStream");
1020 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartScreenCaptureStream start, dataType:%{public}d.",
1021 FAKE_POINTER(this), captureConfig_.dataType);
1022 CHECK_AND_RETURN_RET(captureConfig_.dataType == DataType::ORIGINAL_STREAM, MSERR_INVALID_OPERATION);
1023 int32_t ret = StartAudioCapture();
1024 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "StartAudioCapture failed, ret:%{public}d, dataType:%{public}d",
1025 ret, captureConfig_.dataType);
1026
1027 ret = StartVideoCapture();
1028 if (ret != MSERR_OK) {
1029 StopAudioCapture();
1030 MEDIA_LOGE("StartScreenCaptureStream failed");
1031 return ret;
1032 }
1033 MEDIA_LOGI("StartScreenCaptureStream success");
1034 return ret;
1035 }
1036
StartScreenCaptureFile()1037 int32_t ScreenCaptureServer::StartScreenCaptureFile()
1038 {
1039 CHECK_AND_RETURN_RET(captureConfig_.dataType == DataType::CAPTURE_FILE, MSERR_INVALID_OPERATION);
1040
1041 MEDIA_LOGI("StartScreenCaptureFile S");
1042 int32_t ret = InitRecorder();
1043 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "InitRecorder failed, ret:%{public}d, dataType:%{public}d",
1044 ret, captureConfig_.dataType);
1045
1046 ON_SCOPE_EXIT(0) {
1047 if (recorder_ != nullptr) {
1048 recorder_->Release();
1049 recorder_ = nullptr;
1050 consumer_ = nullptr;
1051 }
1052 };
1053 std::string virtualScreenName = "screen_capture_file";
1054 ret = CreateVirtualScreen(virtualScreenName, consumer_);
1055 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "CreateVirtualScreen failed, ret:%{public}d, dataType:%{public}d",
1056 ret, captureConfig_.dataType);
1057
1058 ON_SCOPE_EXIT(1) {
1059 DestroyVirtualScreen();
1060 };
1061
1062 if (isMicrophoneOn_) {
1063 int32_t retMic = StartFileMicAudioCapture();
1064 if (retMic != MSERR_OK) {
1065 MEDIA_LOGE("StartScreenCaptureFile StartFileMicAudioCapture failed");
1066 }
1067 }
1068 int32_t retInner = StartFileInnerAudioCapture();
1069 CHECK_AND_RETURN_RET_LOG(retInner == MSERR_OK, retInner, "StartFileInnerAudioCapture failed, ret:%{public}d,"
1070 "dataType:%{public}d", retInner, captureConfig_.dataType);
1071 MEDIA_LOGI("StartScreenCaptureFile RecorderServer S");
1072 ret = recorder_->Start();
1073 if (ret != MSERR_OK) {
1074 StopAudioCapture();
1075 MEDIA_LOGE("StartScreenCaptureFile recorder start failed");
1076 }
1077 MEDIA_LOGI("StartScreenCaptureFile RecorderServer E");
1078 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "recorder failed, ret:%{public}d, dataType:%{public}d",
1079 ret, captureConfig_.dataType);
1080 CANCEL_SCOPE_EXIT_GUARD(1);
1081 CANCEL_SCOPE_EXIT_GUARD(0);
1082
1083 MEDIA_LOGI("StartScreenCaptureFile E");
1084 return ret;
1085 }
1086
OnStartScreenCapture()1087 int32_t ScreenCaptureServer::OnStartScreenCapture()
1088 {
1089 MediaTrace trace("ScreenCaptureServer::OnStartScreenCapture");
1090 MEDIA_LOGI("OnStartScreenCapture start, dataType:%{public}d", captureConfig_.dataType);
1091 int32_t ret = MSERR_UNSUPPORT;
1092 if (captureConfig_.dataType == DataType::ORIGINAL_STREAM) {
1093 ret = StartScreenCaptureStream();
1094 } else if (captureConfig_.dataType == DataType::CAPTURE_FILE) {
1095 ret = StartScreenCaptureFile();
1096 }
1097 if (ret == MSERR_OK) {
1098 int64_t endTime = GetCurrentMillisecond();
1099 statisticalEventInfo_.startLatency = static_cast<int32_t>(endTime - startTime_);
1100 MEDIA_LOGI("OnStartScreenCapture start success, dataType:%{public}d", captureConfig_.dataType);
1101 } else {
1102 MEDIA_LOGE("OnStartScreenCapture start failed, dataType:%{public}d", captureConfig_.dataType);
1103 statisticalEventInfo_.startLatency = -1; // latency -1 means invalid
1104 }
1105 return ret;
1106 }
1107
ResSchedReportData(int64_t value,std::unordered_map<std::string,std::string> payload)1108 void ScreenCaptureServer::ResSchedReportData(int64_t value, std::unordered_map<std::string, std::string> payload)
1109 {
1110 payload["uid"] = std::to_string(appInfo_.appUid);
1111 payload["pid"] = std::to_string(appInfo_.appPid);
1112 uint32_t type = ResourceSchedule::ResType::RES_TYPE_REPORT_SCREEN_CAPTURE;
1113 ResourceSchedule::ResSchedClient::GetInstance().ReportData(type, value, payload);
1114 }
1115
RegisterPrivateWindowListener()1116 void ScreenCaptureServer::RegisterPrivateWindowListener()
1117 {
1118 std::weak_ptr<ScreenCaptureServer> screenCaptureServer(shared_from_this());
1119 displayListener_ = new PrivateWindowListenerInScreenCapture(screenCaptureServer);
1120 DisplayManager::GetInstance().RegisterPrivateWindowListener(displayListener_);
1121 }
PostStartScreenCaptureSuccessAction()1122 void ScreenCaptureServer::PostStartScreenCaptureSuccessAction()
1123 {
1124 std::unordered_map<std::string, std::string> payload;
1125 int64_t value = ResourceSchedule::ResType::ScreenCaptureStatus::START_SCREEN_CAPTURE;
1126 ResSchedReportData(value, payload);
1127 captureState_ = AVScreenCaptureState::STARTED;
1128 ScreenCaptureMonitorServer::GetInstance()->CallOnScreenCaptureStarted(appInfo_.appPid);
1129 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_STARTED);
1130 }
1131
PostStartScreenCapture(bool isSuccess)1132 void ScreenCaptureServer::PostStartScreenCapture(bool isSuccess)
1133 {
1134 MediaTrace trace("ScreenCaptureServer::PostStartScreenCapture.");
1135 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " PostStartScreenCapture start, isSuccess:%{public}s, "
1136 "dataType:%{public}d.", FAKE_POINTER(this), isSuccess ? "true" : "false", captureConfig_.dataType);
1137 if (isSuccess) {
1138 MEDIA_LOGI("PostStartScreenCapture handle success");
1139 #ifdef SUPPORT_SCREEN_CAPTURE_WINDOW_NOTIFICATION
1140 if (isPrivacyAuthorityEnabled_ &&
1141 GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"]
1142 .compare(appName_) != 0) {
1143 int32_t tryTimes = TryStartNotification();
1144 if (tryTimes > NOTIFICATION_MAX_TRY_NUM) {
1145 captureState_ = AVScreenCaptureState::STARTED;
1146 screenCaptureCb_->OnError(ScreenCaptureErrorType::SCREEN_CAPTURE_ERROR_INTERNAL,
1147 AVScreenCaptureErrorCode::SCREEN_CAPTURE_ERR_UNKNOWN);
1148 StopScreenCaptureInner(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID);
1149 return;
1150 }
1151 }
1152 #endif
1153 if (!UpdatePrivacyUsingPermissionState(START_VIDEO)) {
1154 MEDIA_LOGE("UpdatePrivacyUsingPermissionState START failed, dataType:%{public}d", captureConfig_.dataType);
1155 captureState_ = AVScreenCaptureState::STARTED;
1156 screenCaptureCb_->OnError(ScreenCaptureErrorType::SCREEN_CAPTURE_ERROR_INTERNAL,
1157 AVScreenCaptureErrorCode::SCREEN_CAPTURE_ERR_UNKNOWN);
1158 StopScreenCaptureInner(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID);
1159 return;
1160 }
1161 PostStartScreenCaptureSuccessAction();
1162 } else {
1163 MEDIA_LOGE("PostStartScreenCapture handle failure");
1164 if (isPrivacyAuthorityEnabled_) {
1165 screenCaptureCb_->OnError(ScreenCaptureErrorType::SCREEN_CAPTURE_ERROR_INTERNAL,
1166 AVScreenCaptureErrorCode::SCREEN_CAPTURE_ERR_UNKNOWN);
1167 }
1168 isPrivacyAuthorityEnabled_ = false;
1169 isSurfaceMode_ = false;
1170 captureState_ = AVScreenCaptureState::STOPPED;
1171 SetErrorInfo(MSERR_UNKNOWN, "PostStartScreenCapture handle failure",
1172 StopReason::POST_START_SCREENCAPTURE_HANDLE_FAILURE, IsUserPrivacyAuthorityNeeded());
1173 return;
1174 }
1175 {
1176 std::lock_guard<std::mutex> lock(mutexGlobal_);
1177 activeSessionId_.store(sessionId_);
1178 }
1179 RegisterPrivateWindowListener();
1180 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " PostStartScreenCapture end.", FAKE_POINTER(this));
1181 }
1182
1183 #ifdef SUPPORT_SCREEN_CAPTURE_WINDOW_NOTIFICATION
TryStartNotification()1184 int32_t ScreenCaptureServer::TryStartNotification()
1185 {
1186 int32_t tryTimes;
1187 for (tryTimes = 1; tryTimes <= NOTIFICATION_MAX_TRY_NUM; tryTimes++) {
1188 int32_t ret = StartNotification();
1189 if (ret == MSERR_OK) {
1190 break;
1191 }
1192 }
1193 return tryTimes;
1194 }
1195 #endif
1196
InitAudioCap(AudioCaptureInfo audioInfo)1197 int32_t ScreenCaptureServer::InitAudioCap(AudioCaptureInfo audioInfo)
1198 {
1199 MediaTrace trace("ScreenCaptureServer::InitAudioCap");
1200 std::lock_guard<std::mutex> lock(mutex_);
1201 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " InitAudioCap start, audioChannels:%{public}d, "
1202 "audioSampleRate:%{public}d, audioSource:%{public}d, state:%{public}d.", FAKE_POINTER(this),
1203 audioInfo.audioChannels, audioInfo.audioSampleRate, audioInfo.audioSource, audioInfo.state);
1204 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
1205 "InitAudioCap failed, capture is not CREATED, state:%{public}d", captureState_);
1206
1207 int ret = CheckAudioCapInfo(audioInfo);
1208 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "InitAudioCap CheckAudioCapInfo failed, audioSource:%{public}d",
1209 audioInfo.audioSource);
1210 if (audioInfo.audioSource == AudioCaptureSourceType::SOURCE_DEFAULT ||
1211 audioInfo.audioSource == AudioCaptureSourceType::MIC) {
1212 captureConfig_.audioInfo.micCapInfo = audioInfo;
1213 statisticalEventInfo_.requireMic = true;
1214 } else if (audioInfo.audioSource == AudioCaptureSourceType::ALL_PLAYBACK ||
1215 audioInfo.audioSource == AudioCaptureSourceType::APP_PLAYBACK) {
1216 captureConfig_.audioInfo.innerCapInfo = audioInfo;
1217 avType_ = (avType_ == AVScreenCaptureAvType::INVALID_TYPE) ? AVScreenCaptureAvType::AUDIO_TYPE :
1218 AVScreenCaptureAvType::AV_TYPE;
1219 }
1220 MEDIA_LOGI("InitAudioCap success sampleRate:%{public}d, channels:%{public}d, source:%{public}d, state:%{public}d",
1221 audioInfo.audioSampleRate, audioInfo.audioChannels, audioInfo.audioSource, audioInfo.state);
1222 return MSERR_OK;
1223 }
1224
InitVideoCap(VideoCaptureInfo videoInfo)1225 int32_t ScreenCaptureServer::InitVideoCap(VideoCaptureInfo videoInfo)
1226 {
1227 MediaTrace trace("ScreenCaptureServer::InitVideoCap");
1228 std::lock_guard<std::mutex> lock(mutex_);
1229 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::CREATED, MSERR_INVALID_OPERATION,
1230 "InitVideoCap failed, capture is not CREATED, state:%{public}d", captureState_);
1231
1232 int ret = CheckVideoCapInfo(videoInfo);
1233 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "InitVideoCap CheckVideoCapInfo failed");
1234 captureConfig_.videoInfo.videoCapInfo = videoInfo;
1235 avType_ = (avType_ == AVScreenCaptureAvType::AUDIO_TYPE) ? AVScreenCaptureAvType::AV_TYPE :
1236 AVScreenCaptureAvType::VIDEO_TYPE;
1237 statisticalEventInfo_.videoResolution = std::to_string(videoInfo.videoFrameWidth) + " * " +
1238 std::to_string(videoInfo.videoFrameHeight);
1239 MEDIA_LOGI("InitVideoCap success width:%{public}d, height:%{public}d, source:%{public}d, state:%{public}d",
1240 videoInfo.videoFrameWidth, videoInfo.videoFrameHeight, videoInfo.videoSource, videoInfo.state);
1241 return MSERR_OK;
1242 }
1243
InitRecorderInfo(std::shared_ptr<IRecorderService> & recorder,AudioCaptureInfo audioInfo)1244 int32_t ScreenCaptureServer::InitRecorderInfo(std::shared_ptr<IRecorderService> &recorder, AudioCaptureInfo audioInfo)
1245 {
1246 int32_t ret = MSERR_OK;
1247 if (captureConfig_.videoInfo.videoCapInfo.state != AVScreenCaptureParamValidationState::VALIDATION_IGNORE) {
1248 ret = recorder_->SetVideoSource(captureConfig_.videoInfo.videoCapInfo.videoSource, videoSourceId_);
1249 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetVideoSource failed");
1250 }
1251 ret = recorder->SetOutputFormat(fileFormat_); // Change to REC_CONFIGURED
1252 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetOutputFormat failed");
1253 ret = recorder->SetAudioEncoder(audioSourceId_, captureConfig_.audioInfo.audioEncInfo.audioCodecformat);
1254 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetAudioEncoder failed");
1255 ret = recorder->SetAudioSampleRate(audioSourceId_, audioInfo.audioSampleRate);
1256 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetAudioSampleRate failed");
1257 ret = recorder->SetAudioChannels(audioSourceId_, audioInfo.audioChannels);
1258 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetAudioChannels failed");
1259 ret = recorder->SetAudioEncodingBitRate(audioSourceId_, captureConfig_.audioInfo.audioEncInfo.audioBitrate);
1260 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetAudioEncodingBitRate failed");
1261 if (captureConfig_.videoInfo.videoCapInfo.state != AVScreenCaptureParamValidationState::VALIDATION_IGNORE) {
1262 ret = recorder->SetVideoEncoder(videoSourceId_, captureConfig_.videoInfo.videoEncInfo.videoCodec);
1263 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetVideoEncoder failed");
1264 ret = recorder->SetVideoSize(videoSourceId_, captureConfig_.videoInfo.videoCapInfo.videoFrameWidth,
1265 captureConfig_.videoInfo.videoCapInfo.videoFrameHeight);
1266 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetVideoSize failed");
1267 ret = recorder->SetVideoFrameRate(videoSourceId_, captureConfig_.videoInfo.videoEncInfo.videoFrameRate);
1268 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetVideoFrameRate failed");
1269 ret = recorder->SetVideoEncodingBitRate(videoSourceId_, captureConfig_.videoInfo.videoEncInfo.videoBitrate);
1270 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetVideoEncodingBitRate failed");
1271 }
1272 return MSERR_OK;
1273 }
1274
InitRecorder()1275 int32_t ScreenCaptureServer::InitRecorder()
1276 {
1277 CHECK_AND_RETURN_RET_LOG(outputFd_ > 0, MSERR_INVALID_OPERATION, "the outputFd is invalid");
1278 MEDIA_LOGI("InitRecorder start");
1279 MediaTrace trace("ScreenCaptureServer::InitRecorder");
1280 recorder_ = Media::RecorderServer::Create();
1281 CHECK_AND_RETURN_RET_LOG(recorder_ != nullptr, MSERR_UNKNOWN, "init Recoder failed");
1282 ON_SCOPE_EXIT(0) {
1283 recorder_->Release();
1284 };
1285 int32_t ret;
1286 AudioCaptureInfo audioInfo;
1287 if (captureConfig_.audioInfo.innerCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID &&
1288 captureConfig_.audioInfo.micCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID) {
1289 MEDIA_LOGI("InitRecorder prepare to SetAudioDataSource");
1290 audioInfo = captureConfig_.audioInfo.innerCapInfo;
1291 audioSource_ = std::make_unique<AudioDataSource>(AVScreenCaptureMixMode::MIX_MODE, this);
1292 captureCallback_ = std::make_shared<ScreenRendererAudioStateChangeCallback>();
1293 audioSource_->SetAppPid(appInfo_.appPid);
1294 audioSource_->SetAppName(appName_);
1295 captureCallback_->SetAppName(appName_);
1296 captureCallback_->SetAudioSource(audioSource_);
1297 audioSource_->RegisterAudioRendererEventListener(appInfo_.appPid, captureCallback_);
1298 ret = recorder_->SetAudioDataSource(audioSource_, audioSourceId_);
1299 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetAudioDataSource failed");
1300 } else if (captureConfig_.audioInfo.innerCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID) {
1301 audioInfo = captureConfig_.audioInfo.innerCapInfo;
1302 MEDIA_LOGI("InitRecorder prepare to SetAudioSource inner");
1303 audioSource_ = std::make_unique<AudioDataSource>(AVScreenCaptureMixMode::INNER_MODE, this);
1304 ret = recorder_->SetAudioDataSource(audioSource_, audioSourceId_);
1305 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetAudioDataSource failed");
1306 } else if (captureConfig_.audioInfo.micCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID) {
1307 audioInfo = captureConfig_.audioInfo.micCapInfo;
1308 MEDIA_LOGI("InitRecorder prepare to SetAudioSource mic");
1309 audioSource_ = std::make_unique<AudioDataSource>(AVScreenCaptureMixMode::MIC_MODE, this);
1310 ret = recorder_->SetAudioDataSource(audioSource_, audioSourceId_);
1311 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetAudioDataSource failed");
1312 } else {
1313 MEDIA_LOGE("InitRecorder not VALIDATION_VALID");
1314 return MSERR_UNKNOWN;
1315 }
1316 MEDIA_LOGI("InitRecorder recorder SetAudioDataSource ret:%{public}d", ret);
1317 ret = InitRecorderInfo(recorder_, audioInfo);
1318 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "InitRecorderInfo failed");
1319 ret = recorder_->SetOutputFile(outputFd_);
1320 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "SetOutputFile failed");
1321 ret = recorder_->Prepare();
1322 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, MSERR_UNKNOWN, "recorder Prepare failed");
1323 if (captureConfig_.videoInfo.videoCapInfo.state != AVScreenCaptureParamValidationState::VALIDATION_IGNORE) {
1324 consumer_ = recorder_->GetSurface(videoSourceId_);
1325 CHECK_AND_RETURN_RET_LOG(consumer_ != nullptr, MSERR_UNKNOWN, "recorder GetSurface failed");
1326 }
1327 CANCEL_SCOPE_EXIT_GUARD(0);
1328 MEDIA_LOGI("InitRecorder success");
1329 return MSERR_OK;
1330 }
1331
UpdatePrivacyUsingPermissionState(VideoPermissionState state)1332 bool ScreenCaptureServer::UpdatePrivacyUsingPermissionState(VideoPermissionState state)
1333 {
1334 MediaTrace trace("ScreenCaptureServer::UpdatePrivacyUsingPermissionState");
1335 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " UpdatePrivacyUsingPermissionState start, "
1336 "state: %{public}d, uid: %{public}d", FAKE_POINTER(this), state, appInfo_.appUid);
1337 if (!IsUserPrivacyAuthorityNeeded()) {
1338 MEDIA_LOGI("Using Permission Ignored. state: %{public}d, uid: %{public}d", state, appInfo_.appUid);
1339 return true;
1340 }
1341
1342 int res = 0;
1343 if (state == START_VIDEO) {
1344 res = PrivacyKit::StartUsingPermission(appInfo_.appTokenId, "ohos.permission.CAPTURE_SCREEN");
1345 if (res != 0) {
1346 MEDIA_LOGE("start using perm error");
1347 return false;
1348 }
1349 res = PrivacyKit::AddPermissionUsedRecord(appInfo_.appTokenId, "ohos.permission.CAPTURE_SCREEN", 1, 0);
1350 if (res != 0) {
1351 MEDIA_LOGE("add screen capture record error: %{public}d", res);
1352 return false;
1353 }
1354 } else if (state == STOP_VIDEO) {
1355 res = PrivacyKit::StopUsingPermission(appInfo_.appTokenId, "ohos.permission.CAPTURE_SCREEN");
1356 if (res != 0) {
1357 MEDIA_LOGE("stop using perm error");
1358 return false;
1359 }
1360 }
1361 return true;
1362 }
1363
SystemRecorderInterruptLatestRecorder()1364 void ScreenCaptureServer::SystemRecorderInterruptLatestRecorder()
1365 {
1366 std::shared_ptr<ScreenCaptureServer> latestServer;
1367 int currentSessionId = -1;
1368 {
1369 std::lock_guard <std::mutex> lock(mutexGlobal_);
1370 currentSessionId = activeSessionId_.load();
1371 }
1372 if (currentSessionId >= 0) {
1373 {
1374 std::lock_guard<std::mutex> lock(mutexGlobal_);
1375 latestServer = GetScreenCaptureServerByIdWithLock(activeSessionId_.load());
1376 }
1377 if (latestServer != nullptr && sessionId_ != activeSessionId_.load()) {
1378 MEDIA_LOGW("SystemRecorderInterruptLatestRecorder uid(%{public}d) is interrupted by uid(%{public}d)",
1379 latestServer->appInfo_.appUid, this->appInfo_.appUid);
1380 latestServer->StopScreenCaptureByEvent(
1381 AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INTERRUPTED_BY_OTHER);
1382 {
1383 std::lock_guard <std::mutex> lock(mutexGlobal_);
1384 activeSessionId_.store(SESSION_ID_INVALID);
1385 }
1386 } else {
1387 MEDIA_LOGE("Interrupt Failed old uid(%{public}d) sid(%{public}d), new uid(%{public}d) sid(%{public}d) ",
1388 latestServer->appInfo_.appUid, currentSessionId, this->appInfo_.appUid, sessionId_);
1389 }
1390 }
1391 }
1392
StartScreenCaptureInner(bool isPrivacyAuthorityEnabled)1393 int32_t ScreenCaptureServer::StartScreenCaptureInner(bool isPrivacyAuthorityEnabled)
1394 {
1395 MEDIA_LOGI("StartScreenCaptureInner S, appUid:%{public}d, appPid:%{public}d, isPrivacyAuthorityEnabled:%{public}d"
1396 ", isSurfaceMode:%{public}d, dataType:%{public}d", appInfo_.appUid, appInfo_.appPid, isPrivacyAuthorityEnabled,
1397 isSurfaceMode_, captureConfig_.dataType);
1398 MediaTrace trace("ScreenCaptureServer::StartScreenCaptureInner");
1399 int32_t ret = RegisterServerCallbacks();
1400 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "RegisterServerCallbacks failed");
1401
1402 ret = CheckAllParams();
1403 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "StartScreenCaptureInner failed, invalid params");
1404
1405 sptr<Rosen::Display> display = Rosen::DisplayManager::GetInstance().GetDefaultDisplaySync();
1406 CHECK_AND_RETURN_RET_LOG(display != nullptr, MSERR_UNKNOWN, "GetDefaultDisplaySync failed");
1407 density_ = display->GetDpi();
1408
1409 appName_ = GetClientBundleName(appInfo_.appUid);
1410
1411 isPrivacyAuthorityEnabled_ = isPrivacyAuthorityEnabled;
1412 captureState_ = AVScreenCaptureState::STARTING;
1413 ret = RequestUserPrivacyAuthority();
1414 if (ret != MSERR_OK) {
1415 captureState_ = AVScreenCaptureState::STOPPED;
1416 SetErrorInfo(ret, "StartScreenCaptureInner RequestUserPrivacyAuthority failed",
1417 StopReason::REQUEST_USER_PRIVACY_AUTHORITY_FAILED, IsUserPrivacyAuthorityNeeded());
1418 MEDIA_LOGE("StartScreenCaptureInner RequestUserPrivacyAuthority failed");
1419 return ret;
1420 }
1421
1422 if (IsUserPrivacyAuthorityNeeded()) {
1423 if (isPrivacyAuthorityEnabled_ &&
1424 GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"]
1425 .compare(appName_) != 0) {
1426 MEDIA_LOGI("Wait for user interactions to ALLOW/DENY capture");
1427 return MSERR_OK;
1428 } else {
1429 // system rec Interrupt at here, 3rd rec interrupt at ReportAVScreenCaptureUserChoice
1430 SystemRecorderInterruptLatestRecorder();
1431 }
1432 MEDIA_LOGI("privacy notification window not support, app has CAPTURE_SCREEN permission and go on");
1433 } else {
1434 MEDIA_LOGI("Privacy Authority granted automatically and go on"); // for root
1435 }
1436
1437 ret = OnStartScreenCapture();
1438 PostStartScreenCapture(ret == MSERR_OK);
1439
1440 MEDIA_LOGI("StartScreenCaptureInner E, appUid:%{public}d, appPid:%{public}d", appInfo_.appUid, appInfo_.appPid);
1441 return ret;
1442 }
1443
IsTelInCallSkipList()1444 bool ScreenCaptureServer::IsTelInCallSkipList()
1445 {
1446 MEDIA_LOGI("ScreenCaptureServer::IsTelInCallSkipList isCalledBySystemApp : %{public}d", isCalledBySystemApp_);
1447 if (isCalledBySystemApp_ &&
1448 GetScreenCaptureSystemParam()["const.multimedia.screencapture.hiviewcarebundlename"]
1449 .compare(appName_) == 0) {
1450 MEDIA_LOGI("ScreenCaptureServer::IsTelInCallSkipList true");
1451 return true;
1452 }
1453 return false;
1454 }
1455
RegisterServerCallbacks()1456 int32_t ScreenCaptureServer::RegisterServerCallbacks()
1457 {
1458 uint64_t tokenId = IPCSkeleton::GetCallingFullTokenID();
1459 isCalledBySystemApp_ = OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(tokenId);
1460 MEDIA_LOGI("ScreenCaptureServer::RegisterServerCallbacks isCalledBySystemApp : %{public}d", isCalledBySystemApp_);
1461 std::weak_ptr<ScreenCaptureServer> wpScreenCaptureServer(shared_from_this());
1462 screenCaptureObserverCb_ = std::make_shared<ScreenCaptureObserverCallBack>(wpScreenCaptureServer);
1463 if (InCallObserver::GetInstance().IsInCall() && !IsTelInCallSkipList()) {
1464 MEDIA_LOGI("ScreenCaptureServer Start InCall Abort");
1465 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_STOPPED_BY_CALL);
1466 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNSUPPORT,
1467 "ScreenCaptureServer Start InCall Abort");
1468 return MSERR_UNSUPPORT;
1469 } else {
1470 MEDIA_LOGI("ScreenCaptureServer Start RegisterScreenCaptureCallBack");
1471 InCallObserver::GetInstance().RegisterInCallObserverCallBack(screenCaptureObserverCb_);
1472 }
1473 AccountObserver::GetInstance().RegisterAccountObserverCallBack(screenCaptureObserverCb_);
1474 return MSERR_OK;
1475 }
1476
StartPrivacyWindow()1477 int32_t ScreenCaptureServer::StartPrivacyWindow()
1478 {
1479 auto bundleName = GetClientBundleName(appInfo_.appUid);
1480 callingLabel_ = GetBundleResourceLabel(bundleName);
1481
1482 std::string comStr = "{\"ability.want.params.uiExtensionType\":\"sys/commonUI\",\"sessionId\":\"";
1483 comStr += std::to_string(sessionId_).c_str();
1484 comStr += "\",\"callerUid\":\"";
1485 comStr += std::to_string(appInfo_.appUid).c_str();
1486 comStr += "\",\"appLabel\":\"";
1487 comStr += callingLabel_.c_str();
1488 comStr += "\"}";
1489
1490 AAFwk::Want want;
1491 ErrCode ret = ERR_INVALID_VALUE;
1492 #ifdef PC_STANDARD
1493 if (captureConfig_.captureMode == CAPTURE_HOME_SCREEN) {
1494 want.SetElementName(GetScreenCaptureSystemParam()["const.multimedia.screencapture.dialogconnectionbundlename"],
1495 GetScreenCaptureSystemParam()["const.multimedia.screencapture.dialogconnectionabilityname"]);
1496 auto connection_ = sptr<UIExtensionAbilityConnection>(new (std::nothrow) UIExtensionAbilityConnection(comStr));
1497 ret = OHOS::AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want, connection_,
1498 nullptr, -1);
1499 MEDIA_LOGI("ConnectServiceExtensionAbility end %{public}d, DeviceType : PC", ret);
1500 } else if (captureConfig_.captureMode != CAPTURE_INVAILD) {
1501 AppExecFwk::ElementName element("",
1502 GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"],
1503 SELECT_ABILITY_NAME); // DeviceID
1504 want.SetElement(element);
1505 want.SetParam("params", comStr);
1506 want.SetParam("appLabel", callingLabel_);
1507 ret = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want);
1508 MEDIA_LOGI("StartAbility end %{public}d, DeviceType : PC", ret);
1509 }
1510 #else
1511 want.SetElementName(GetScreenCaptureSystemParam()["const.multimedia.screencapture.dialogconnectionbundlename"],
1512 GetScreenCaptureSystemParam()["const.multimedia.screencapture.dialogconnectionabilityname"]);
1513 auto connection_ = sptr<UIExtensionAbilityConnection>(new (std::nothrow) UIExtensionAbilityConnection(comStr));
1514 ret = OHOS::AAFwk::ExtensionManagerClient::GetInstance().ConnectServiceExtensionAbility(want, connection_,
1515 nullptr, -1);
1516 MEDIA_LOGI("ConnectServiceExtensionAbility end %{public}d, Device : Phone", ret);
1517 #endif
1518 return ret;
1519 }
1520
StartNotification()1521 int32_t ScreenCaptureServer::StartNotification()
1522 {
1523 int32_t result = NotificationHelper::SubscribeLocalLiveViewNotification(NOTIFICATION_SUBSCRIBER);
1524 MEDIA_LOGD("Screencapture service PublishNotification, result %{public}d", result);
1525 NotificationRequest request;
1526 localLiveViewContent_ = GetLocalLiveViewContent();
1527
1528 std::shared_ptr<NotificationContent> content =
1529 std::make_shared<NotificationContent>(localLiveViewContent_);
1530
1531 request.SetSlotType(NotificationConstant::SlotType::LIVE_VIEW);
1532 notificationId_ = sessionId_;
1533 request.SetNotificationId(notificationId_);
1534 request.SetContent(content);
1535 request.SetCreatorUid(AV_SCREEN_CAPTURE_SESSION_UID);
1536 request.SetOwnerUid(AV_SCREEN_CAPTURE_SESSION_UID);
1537 request.SetUnremovable(true);
1538 request.SetInProgress(true);
1539
1540 std::shared_ptr<PixelMap> pixelMapTotalSpr = GetPixelMap(ICON_PATH_NOTIFICATION);
1541 request.SetLittleIcon(pixelMapTotalSpr);
1542 request.SetBadgeIconStyle(NotificationRequest::BadgeStyle::LITTLE);
1543
1544 result = NotificationHelper::PublishNotification(request);
1545 MEDIA_LOGI("Screencapture service PublishNotification uid %{public}d, result %{public}d",
1546 AV_SCREEN_CAPTURE_SESSION_UID, result);
1547 return result;
1548 }
1549
GetLocalLiveViewContent()1550 std::shared_ptr<NotificationLocalLiveViewContent> ScreenCaptureServer::GetLocalLiveViewContent()
1551 {
1552 std::shared_ptr<NotificationLocalLiveViewContent> localLiveViewContent =
1553 std::make_shared<NotificationLocalLiveViewContent>();
1554 localLiveViewContent->SetType(1);
1555 liveViewText_ = "\"";
1556 liveViewText_ += callingLabel_.c_str();
1557 liveViewText_ += "\"正在使用屏幕";
1558 localLiveViewContent->SetText(liveViewText_);
1559
1560 auto capsule = NotificationCapsule();
1561 capsule.SetBackgroundColor(BACK_GROUND_COLOR);
1562 capsulePxSize_ = capsuleVpSize_ * density_ / MDPI;
1563 std::shared_ptr<PixelMap> pixelMapCapSpr = GetPixelMapSvg(ICON_PATH_CAPSULE_STOP, capsulePxSize_, capsulePxSize_);
1564 capsule.SetIcon(pixelMapCapSpr);
1565
1566 localLiveViewContent->SetCapsule(capsule);
1567 localLiveViewContent->addFlag(NotificationLocalLiveViewContent::LiveViewContentInner::CAPSULE);
1568
1569 auto countTime = NotificationTime();
1570 countTime.SetInitialTime(1);
1571 countTime.SetIsCountDown(false);
1572 countTime.SetIsPaused(false);
1573 countTime.SetIsInTitle(true);
1574
1575 localLiveViewContent->SetTime(countTime);
1576 localLiveViewContent->addFlag(NotificationLocalLiveViewContent::LiveViewContentInner::TIME);
1577
1578 auto basicButton = NotificationLocalLiveViewButton();
1579 basicButton.addSingleButtonName(BUTTON_NAME_STOP);
1580 std::shared_ptr<PixelMap> pixelMapStopSpr = GetPixelMap(ICON_PATH_STOP);
1581 basicButton.addSingleButtonIcon(pixelMapStopSpr);
1582
1583 localLiveViewContent->SetButton(basicButton);
1584 localLiveViewContent->addFlag(NotificationLocalLiveViewContent::LiveViewContentInner::BUTTON);
1585 return localLiveViewContent;
1586 }
1587
GetPixelMap(std::string path)1588 std::shared_ptr<PixelMap> ScreenCaptureServer::GetPixelMap(std::string path)
1589 {
1590 uint32_t errorCode = 0;
1591 SourceOptions opts;
1592 opts.formatHint = "image/png";
1593 std::unique_ptr<ImageSource> imageSource =
1594 ImageSource::CreateImageSource(path, opts, errorCode);
1595 DecodeOptions decodeOpts;
1596 std::unique_ptr<PixelMap> pixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
1597 std::shared_ptr<PixelMap> pixelMapSpr = std::move(pixelMap);
1598 return pixelMapSpr;
1599 }
1600
GetPixelMapSvg(std::string path,int32_t width,int32_t height)1601 std::shared_ptr<PixelMap> ScreenCaptureServer::GetPixelMapSvg(std::string path, int32_t width, int32_t height)
1602 {
1603 uint32_t errorCode = 0;
1604 SourceOptions opts;
1605 opts.formatHint = "image/svg+xml";
1606 std::unique_ptr<ImageSource> imageSource =
1607 ImageSource::CreateImageSource(path, opts, errorCode);
1608 DecodeOptions decodeOpts;
1609 decodeOpts.desiredSize.width = width;
1610 decodeOpts.desiredSize.height = height;
1611 std::unique_ptr<PixelMap> pixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
1612 std::shared_ptr<PixelMap> pixelMapSpr = std::move(pixelMap);
1613 return pixelMapSpr;
1614 }
1615
UpdateMicrophoneEnabled()1616 void ScreenCaptureServer::UpdateMicrophoneEnabled()
1617 {
1618 UpdateLiveViewContent();
1619 NotificationRequest request;
1620
1621 std::shared_ptr<NotificationContent> content =
1622 std::make_shared<NotificationContent>(localLiveViewContent_);
1623
1624 request.SetSlotType(NotificationConstant::SlotType::LIVE_VIEW);
1625 request.SetNotificationId(notificationId_);
1626 request.SetContent(content);
1627 request.SetCreatorUid(AV_SCREEN_CAPTURE_SESSION_UID);
1628 request.SetOwnerUid(AV_SCREEN_CAPTURE_SESSION_UID);
1629 request.SetUnremovable(true);
1630 request.SetInProgress(true);
1631
1632 std::shared_ptr<PixelMap> pixelMapTotalSpr = GetPixelMap(ICON_PATH_CAPSULE_STOP);
1633 request.SetLittleIcon(pixelMapTotalSpr);
1634 request.SetBadgeIconStyle(NotificationRequest::BadgeStyle::LITTLE);
1635
1636 int32_t result = NotificationHelper::PublishNotification(request);
1637 MEDIA_LOGI("Screencapture service UpdateMicrophoneEnabled uid %{public}d, result %{public}d",
1638 AV_SCREEN_CAPTURE_SESSION_UID, result);
1639 micCount_.store(micCount_.load() + 1);
1640 }
1641
UpdateLiveViewContent()1642 void ScreenCaptureServer::UpdateLiveViewContent()
1643 {
1644 localLiveViewContent_->SetType(1);
1645 localLiveViewContent_->SetText(liveViewText_);
1646
1647 auto capsule = NotificationCapsule();
1648 capsule.SetBackgroundColor(BACK_GROUND_COLOR);
1649 std::shared_ptr<PixelMap> pixelMapCapSpr = GetPixelMap(ICON_PATH_CAPSULE_STOP);
1650 capsule.SetIcon(pixelMapCapSpr);
1651
1652 localLiveViewContent_->SetCapsule(capsule);
1653 localLiveViewContent_->addFlag(NotificationLocalLiveViewContent::LiveViewContentInner::CAPSULE);
1654
1655 auto countTime = NotificationTime();
1656 countTime.SetIsCountDown(false);
1657 countTime.SetIsPaused(false);
1658 countTime.SetIsInTitle(true);
1659
1660 localLiveViewContent_->SetTime(countTime);
1661 localLiveViewContent_->addFlag(NotificationLocalLiveViewContent::LiveViewContentInner::TIME);
1662
1663 auto basicButton = NotificationLocalLiveViewButton();
1664 basicButton.addSingleButtonName(BUTTON_NAME_MIC);
1665 if (micCount_.load() % MICROPHONE_STATE_COUNT == MICROPHONE_OFF) {
1666 std::shared_ptr<PixelMap> pixelMapSpr = GetPixelMapSvg(ICON_PATH_MIC_OFF, SVG_HEIGHT, SVG_WIDTH);
1667 basicButton.addSingleButtonIcon(pixelMapSpr);
1668 } else {
1669 std::shared_ptr<PixelMap> pixelMapSpr = GetPixelMapSvg(ICON_PATH_MIC, SVG_HEIGHT, SVG_WIDTH);
1670 basicButton.addSingleButtonIcon(pixelMapSpr);
1671 }
1672
1673 basicButton.addSingleButtonName(BUTTON_NAME_STOP);
1674 std::shared_ptr<PixelMap> pixelMapStopSpr = GetPixelMap(ICON_PATH_STOP);
1675 basicButton.addSingleButtonIcon(pixelMapStopSpr);
1676
1677 localLiveViewContent_->SetButton(basicButton);
1678 localLiveViewContent_->addFlag(NotificationLocalLiveViewContent::LiveViewContentInner::BUTTON);
1679 }
1680
GetDumpFlag()1681 void ScreenCaptureServer::GetDumpFlag()
1682 {
1683 const std::string dumpTag = "sys.media.screenCapture.dump.enable";
1684 std::string dumpEnable;
1685 int32_t dumpRes = OHOS::system::GetStringParameter(dumpTag, dumpEnable, "false");
1686 isDump_ = (dumpEnable == "true");
1687 MEDIA_LOGI("get dump flag, dumpRes: %{public}d, isDump_: %{public}d", dumpRes, isDump_);
1688 }
1689
StartScreenCapture(bool isPrivacyAuthorityEnabled)1690 int32_t ScreenCaptureServer::StartScreenCapture(bool isPrivacyAuthorityEnabled)
1691 {
1692 MediaTrace trace("ScreenCaptureServer::StartScreenCapture");
1693 std::lock_guard<std::mutex> lock(mutex_);
1694 startTime_ = GetCurrentMillisecond();
1695 statisticalEventInfo_.enableMic = isMicrophoneOn_;
1696 GetDumpFlag();
1697 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartScreenCapture start, "
1698 "isPrivacyAuthorityEnabled:%{public}s, captureState:%{public}d.",
1699 FAKE_POINTER(this), isPrivacyAuthorityEnabled ? "true" : "false", captureState_);
1700 CHECK_AND_RETURN_RET_LOG(
1701 captureState_ == AVScreenCaptureState::CREATED || captureState_ == AVScreenCaptureState::STOPPED,
1702 MSERR_INVALID_OPERATION, "StartScreenCapture failed, not in CREATED or STOPPED, state:%{public}d",
1703 captureState_);
1704 MEDIA_LOGI("StartScreenCapture isPrivacyAuthorityEnabled:%{public}d", isPrivacyAuthorityEnabled);
1705 isSurfaceMode_ = false;
1706 return StartScreenCaptureInner(isPrivacyAuthorityEnabled);
1707 }
1708
StartScreenCaptureWithSurface(sptr<Surface> surface,bool isPrivacyAuthorityEnabled)1709 int32_t ScreenCaptureServer::StartScreenCaptureWithSurface(sptr<Surface> surface, bool isPrivacyAuthorityEnabled)
1710 {
1711 std::lock_guard<std::mutex> lock(mutex_);
1712 CHECK_AND_RETURN_RET_LOG(
1713 captureState_ == AVScreenCaptureState::CREATED || captureState_ == AVScreenCaptureState::STOPPED,
1714 MSERR_INVALID_OPERATION, "StartScreenCaptureWithSurface failed, not in CREATED or STOPPED, state:%{public}d",
1715 captureState_);
1716 MEDIA_LOGI("StartScreenCaptureWithSurface isPrivacyAuthorityEnabled:%{public}d", isPrivacyAuthorityEnabled);
1717 if (surface == nullptr) {
1718 MEDIA_LOGE("surface is nullptr");
1719 return MSERR_INVALID_OPERATION;
1720 }
1721 surface_ = surface;
1722 isSurfaceMode_ = true;
1723 dataMode_ = AVScreenCaptureDataMode::SUFFACE_MODE;
1724 return StartScreenCaptureInner(isPrivacyAuthorityEnabled);
1725 }
1726
StartVideoCapture()1727 int32_t ScreenCaptureServer::StartVideoCapture()
1728 {
1729 MediaTrace trace("ScreenCaptureServer::StartVideoCapture");
1730 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartVideoCapture start, state:%{public}d, "
1731 "dataType:%{public}d, isSurfaceMode:%{public}s.", FAKE_POINTER(this),
1732 captureConfig_.videoInfo.videoCapInfo.state, captureConfig_.dataType, isSurfaceMode_ ? "true" : "false");
1733 if (captureConfig_.videoInfo.videoCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_IGNORE) {
1734 MEDIA_LOGI("StartVideoCapture is ignored");
1735 return MSERR_OK;
1736 }
1737 CHECK_AND_RETURN_RET_LOG(
1738 captureConfig_.videoInfo.videoCapInfo.state == AVScreenCaptureParamValidationState::VALIDATION_VALID,
1739 MSERR_INVALID_VAL, "StartVideoCapture failed, invalid param, dataType:%{public}d", captureConfig_.dataType);
1740
1741 int32_t ret = StartHomeVideoCapture();
1742 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret,
1743 "StartHomeVideoCapture failed, isSurfaceMode:%{public}d, dataType:%{public}d",
1744 isSurfaceMode_, captureConfig_.dataType);
1745 MEDIA_LOGI("StartVideoCapture end.");
1746 return MSERR_OK;
1747 }
1748
StartHomeVideoCapture()1749 int32_t ScreenCaptureServer::StartHomeVideoCapture()
1750 {
1751 MediaTrace trace("ScreenCaptureServer::StartHomeVideoCapture");
1752 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartHomeVideoCapture start, isSurfaceMode:%{public}s.",
1753 FAKE_POINTER(this), isSurfaceMode_ ? "true" : "false");
1754 std::string virtualScreenName = "screen_capture";
1755 if (isSurfaceMode_) {
1756 int32_t ret = CreateVirtualScreen(virtualScreenName, surface_);
1757 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "create virtual screen with input surface failed");
1758 return MSERR_OK;
1759 }
1760
1761 ON_SCOPE_EXIT(0) {
1762 DestroyVirtualScreen();
1763 if (consumer_ != nullptr && surfaceCb_ != nullptr) {
1764 consumer_->UnregisterConsumerListener();
1765 }
1766 consumer_ = nullptr;
1767 surfaceCb_ = nullptr;
1768 };
1769 consumer_ = OHOS::Surface::CreateSurfaceAsConsumer();
1770 CHECK_AND_RETURN_RET_LOG(consumer_ != nullptr, MSERR_UNKNOWN, "CreateSurfaceAsConsumer failed");
1771 MEDIA_LOGI("ScreenCaptureServer consumer_ BUFFER_USAGE_CPU_READ BUFFER_USAGE_MEM_MMZ_CACHE S");
1772 consumer_->SetDefaultUsage(BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_MMZ_CACHE);
1773 MEDIA_LOGI("ScreenCaptureServer consumer_ BUFFER_USAGE_CPU_READ BUFFER_USAGE_MEM_MMZ_CACHE E");
1774 auto producer = consumer_->GetProducer();
1775 CHECK_AND_RETURN_RET_LOG(producer != nullptr, MSERR_UNKNOWN, "GetProducer failed");
1776 auto producerSurface = OHOS::Surface::CreateSurfaceAsProducer(producer);
1777 CHECK_AND_RETURN_RET_LOG(producerSurface != nullptr, MSERR_UNKNOWN, "CreateSurfaceAsProducer failed");
1778 surfaceCb_ = OHOS::sptr<ScreenCapBufferConsumerListener>::MakeSptr(consumer_, screenCaptureCb_);
1779 CHECK_AND_RETURN_RET_LOG(surfaceCb_ != nullptr, MSERR_UNKNOWN, "MakeSptr surfaceCb_ failed");
1780 consumer_->RegisterConsumerListener(surfaceCb_);
1781 int32_t ret = CreateVirtualScreen(virtualScreenName, producerSurface);
1782 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "create virtual screen without input surface failed");
1783 CANCEL_SCOPE_EXIT_GUARD(0);
1784 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StartHomeVideoCapture OK.", FAKE_POINTER(this));
1785 return MSERR_OK;
1786 }
1787
CreateVirtualScreen(const std::string & name,sptr<OHOS::Surface> consumer)1788 int32_t ScreenCaptureServer::CreateVirtualScreen(const std::string &name, sptr<OHOS::Surface> consumer)
1789 {
1790 MediaTrace trace("ScreenCaptureServer::CreateVirtualScreen");
1791 MEDIA_LOGI("CreateVirtualScreen Start");
1792 isConsumerStart_ = false;
1793 VirtualScreenOption virScrOption = InitVirtualScreenOption(name, consumer);
1794 sptr<Rosen::Display> display = Rosen::DisplayManager::GetInstance().GetDefaultDisplaySync();
1795 if (display != nullptr) {
1796 MEDIA_LOGI("get displayInfo width:%{public}d,height:%{public}d,density:%{public}d", display->GetWidth(),
1797 display->GetHeight(), display->GetDpi());
1798 virScrOption.density_ = display->GetDpi();
1799 }
1800 if (missionIds_.size() > 0 && captureConfig_.captureMode == CAPTURE_SPECIFIED_WINDOW) {
1801 virScrOption.missionIds_ = missionIds_;
1802 } else if (captureConfig_.videoInfo.videoCapInfo.taskIDs.size() > 0 &&
1803 captureConfig_.captureMode == CAPTURE_SPECIFIED_WINDOW) {
1804 GetMissionIds(missionIds_);
1805 virScrOption.missionIds_ = missionIds_;
1806 }
1807 screenId_ = ScreenManager::GetInstance().CreateVirtualScreen(virScrOption);
1808 CHECK_AND_RETURN_RET_LOG(screenId_ >= 0, MSERR_UNKNOWN, "CreateVirtualScreen failed, invalid screenId");
1809 MEDIA_LOGI("CreateVirtualScreen success");
1810 return PrepareVirtualScreenMirror();
1811 }
1812
PrepareVirtualScreenMirror()1813 int32_t ScreenCaptureServer::PrepareVirtualScreenMirror()
1814 {
1815 for (size_t i = 0; i < contentFilter_.windowIDsVec.size(); i++) {
1816 MEDIA_LOGI("After CreateVirtualScreen windowIDsVec value :%{public}" PRIu64, contentFilter_.windowIDsVec[i]);
1817 }
1818 if (GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"]
1819 .compare(appName_) == 0) {
1820 SetScreenScaleMode();
1821 }
1822 Rosen::DisplayManager::GetInstance().SetVirtualScreenBlackList(screenId_, contentFilter_.windowIDsVec);
1823 auto screen = ScreenManager::GetInstance().GetScreenById(screenId_);
1824 if (screen == nullptr) {
1825 MEDIA_LOGE("GetScreenById failed");
1826 DestroyVirtualScreen();
1827 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNKNOWN,
1828 "GetScreenById failed");
1829 return MSERR_UNKNOWN;
1830 }
1831 if (canvasRotation_) {
1832 SetCanvasRotationInner();
1833 }
1834 SkipPrivacyModeInner();
1835 int32_t ret = MakeVirtualScreenMirror();
1836 if (ret != MSERR_OK) {
1837 MEDIA_LOGE("MakeVirtualScreenMirror failed");
1838 DestroyVirtualScreen();
1839 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNKNOWN,
1840 "MakeVirtualScreenMirror failed");
1841 return MSERR_UNKNOWN;
1842 }
1843 isConsumerStart_ = true;
1844 return MSERR_OK;
1845 }
1846
MakeVirtualScreenMirror()1847 int32_t ScreenCaptureServer::MakeVirtualScreenMirror()
1848 {
1849 MediaTrace trace("ScreenCaptureServer::MakeVirtualScreenMirror");
1850 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " MakeVirtualScreenMirror start.", FAKE_POINTER(this));
1851 CHECK_AND_RETURN_RET_LOG(screenId_ >= 0 && screenId_ != SCREEN_ID_INVALID, MSERR_UNKNOWN,
1852 "MakeVirtualScreenMirror failed, invalid screenId");
1853 std::vector<sptr<Screen>> screens;
1854 DMError ret = ScreenManager::GetInstance().GetAllScreens(screens);
1855 CHECK_AND_RETURN_RET_LOG(screens.size() > 0, MSERR_UNKNOWN,
1856 "MakeVirtualScreenMirror failed to GetAllScreens, ret:%{public}d", ret);
1857 std::vector<ScreenId> mirrorIds;
1858 mirrorIds.push_back(screenId_);
1859 sptr<Rosen::Display> defaultDisplay = Rosen::DisplayManager::GetInstance().GetDefaultDisplaySync();
1860 CHECK_AND_RETURN_RET_LOG(defaultDisplay != nullptr, MSERR_UNKNOWN, "make mirror GetDefaultDisplaySync failed");
1861 ScreenId mirrorGroup = defaultDisplay->GetScreenId();
1862
1863 if (captureConfig_.captureMode != CAPTURE_SPECIFIED_SCREEN) {
1864 MEDIA_LOGI("MakeVirtualScreenMirror DefaultDisplay, screenId:%{public}" PRIu64, defaultDisplay->GetScreenId());
1865 ret = ScreenManager::GetInstance().MakeMirror(defaultDisplay->GetScreenId(), mirrorIds, mirrorGroup);
1866 CHECK_AND_RETURN_RET_LOG(ret == DMError::DM_OK, MSERR_UNKNOWN,
1867 "MakeVirtualScreenMirror failed to MakeMirror, captureMode:%{public}d, ret:%{public}d",
1868 captureConfig_.captureMode, ret);
1869 MEDIA_LOGI("MakeVirtualScreenMirror main screen success, screenId:%{public}" PRIu64, screens[0]->GetId());
1870 return MSERR_OK;
1871 }
1872 for (uint32_t i = 0; i < screens.size() ; i++) {
1873 if (screens[i]->GetId() == captureConfig_.videoInfo.videoCapInfo.displayId) {
1874 ret = ScreenManager::GetInstance().MakeMirror(screens[i]->GetId(), mirrorIds, mirrorGroup);
1875 CHECK_AND_RETURN_RET_LOG(ret == DMError::DM_OK, MSERR_UNKNOWN,
1876 "MakeVirtualScreenMirror failed to MakeMirror for CAPTURE_SPECIFIED_SCREEN, ret:%{public}d", ret);
1877 MEDIA_LOGI("MakeVirtualScreenMirror extand screen success, screenId:%{public}" PRIu64,
1878 captureConfig_.videoInfo.videoCapInfo.displayId);
1879 return MSERR_OK;
1880 }
1881 }
1882 MEDIA_LOGE("MakeVirtualScreenMirror failed to find screenId:%{public}" PRIu64,
1883 captureConfig_.videoInfo.videoCapInfo.displayId);
1884 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNKNOWN,
1885 "MakeVirtualScreenMirror failed to find screenId");
1886 return MSERR_UNKNOWN;
1887 }
1888
DestroyVirtualScreen()1889 void ScreenCaptureServer::DestroyVirtualScreen()
1890 {
1891 MediaTrace trace("ScreenCaptureServer::DestroyVirtualScreen");
1892 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " DestroyVirtualScreen start.", FAKE_POINTER(this));
1893 if (screenId_ >=0 && screenId_ != SCREEN_ID_INVALID) {
1894 if (isConsumerStart_) {
1895 std::vector<ScreenId> screenIds;
1896 screenIds.push_back(screenId_);
1897 ScreenManager::GetInstance().StopMirror(screenIds);
1898 }
1899 ScreenManager::GetInstance().DestroyVirtualScreen(screenId_);
1900 screenId_ = SCREEN_ID_INVALID;
1901 isConsumerStart_ = false;
1902 }
1903 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " DestroyVirtualScreen end.", FAKE_POINTER(this));
1904 }
1905
CloseFd()1906 void ScreenCaptureServer::CloseFd()
1907 {
1908 MediaTrace trace("ScreenCaptureServer::CloseFd");
1909 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " CloseFd, fd is %{public}d", FAKE_POINTER(this),
1910 outputFd_);
1911 if (outputFd_ >= 0) {
1912 (void)::close(outputFd_);
1913 outputFd_ = -1;
1914 }
1915 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " CloseFd end.", FAKE_POINTER(this));
1916 }
1917
InitVirtualScreenOption(const std::string & name,sptr<OHOS::Surface> consumer)1918 VirtualScreenOption ScreenCaptureServer::InitVirtualScreenOption(const std::string &name, sptr<OHOS::Surface> consumer)
1919 {
1920 MediaTrace trace("ScreenCaptureServer::InitVirtualScreenOption");
1921 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " InitVirtualScreenOption start, naem:%{public}s.",
1922 FAKE_POINTER(this), name.c_str());
1923 VirtualScreenOption virScrOption = {
1924 .name_ = name,
1925 .width_ = captureConfig_.videoInfo.videoCapInfo.videoFrameWidth,
1926 .height_ = captureConfig_.videoInfo.videoCapInfo.videoFrameHeight,
1927 .density_ = 0,
1928 .surface_ = consumer,
1929 .flags_ = 0,
1930 .isForShot_ = true,
1931 .missionIds_ = {},
1932 };
1933 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " InitVirtualScreenOption end.", FAKE_POINTER(this));
1934 return virScrOption;
1935 }
1936
GetMissionIds(std::vector<uint64_t> & missionIds)1937 int32_t ScreenCaptureServer::GetMissionIds(std::vector<uint64_t> &missionIds)
1938 {
1939 int32_t size = static_cast<int32_t>(captureConfig_.videoInfo.videoCapInfo.taskIDs.size());
1940 std::list<int32_t> taskIDListTemp = captureConfig_.videoInfo.videoCapInfo.taskIDs;
1941 for (int32_t i = 0; i < size; i++) {
1942 int32_t taskId = taskIDListTemp.front();
1943 taskIDListTemp.pop_front();
1944 MEDIA_LOGI("ScreenCaptureServer::GetMissionIds taskId : %{public}s", std::to_string(taskId).c_str());
1945 uint64_t uintNum = static_cast<uint64_t>(taskId);
1946 missionIds.push_back(uintNum);
1947 }
1948 return MSERR_OK;
1949 }
1950
AcquireAudioBuffer(std::shared_ptr<AudioBuffer> & audioBuffer,AudioCaptureSourceType type)1951 int32_t ScreenCaptureServer::AcquireAudioBuffer(std::shared_ptr<AudioBuffer> &audioBuffer, AudioCaptureSourceType type)
1952 {
1953 MediaTrace trace("ScreenCaptureServer::AcquireAudioBuffer");
1954 std::unique_lock<std::mutex> lock(mutex_);
1955 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " AcquireAudioBuffer start, state:%{public}d, "
1956 "type:%{public}d.", FAKE_POINTER(this), captureState_, type);
1957 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::STARTED, MSERR_INVALID_OPERATION,
1958 "AcquireAudioBuffer failed, capture is not STARTED, state:%{public}d, type:%{public}d", captureState_, type);
1959
1960 if (((type == AudioCaptureSourceType::MIC) || (type == AudioCaptureSourceType::SOURCE_DEFAULT)) &&
1961 micAudioCapture_ != nullptr && micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
1962 return micAudioCapture_->AcquireAudioBuffer(audioBuffer);
1963 }
1964 if (((type == AudioCaptureSourceType::ALL_PLAYBACK) || (type == AudioCaptureSourceType::APP_PLAYBACK)) &&
1965 innerAudioCapture_ != nullptr && innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
1966 return innerAudioCapture_->AcquireAudioBuffer(audioBuffer);
1967 }
1968 MEDIA_LOGE("AcquireAudioBuffer failed, source type not support, type:%{public}d", type);
1969 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNKNOWN,
1970 "AcquireAudioBuffer failed, source type not support");
1971 return MSERR_UNKNOWN;
1972 }
1973
AcquireAudioBufferMix(std::shared_ptr<AudioBuffer> & innerAudioBuffer,std::shared_ptr<AudioBuffer> & micAudioBuffer,AVScreenCaptureMixMode type)1974 int32_t ScreenCaptureServer::AcquireAudioBufferMix(std::shared_ptr<AudioBuffer> &innerAudioBuffer,
1975 std::shared_ptr<AudioBuffer> &micAudioBuffer, AVScreenCaptureMixMode type)
1976 {
1977 if (captureState_ != AVScreenCaptureState::STARTED) {
1978 return MSERR_INVALID_OPERATION;
1979 }
1980 if (type == AVScreenCaptureMixMode::MIX_MODE && micAudioCapture_ != nullptr &&
1981 micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
1982 if (micAudioCapture_->AcquireAudioBuffer(micAudioBuffer) != MSERR_OK) {
1983 MEDIA_LOGE("micAudioCapture AcquireAudioBuffer failed");
1984 }
1985 }
1986 if (type == AVScreenCaptureMixMode::MIX_MODE && innerAudioCapture_ != nullptr &&
1987 innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
1988 if (innerAudioCapture_->AcquireAudioBuffer(innerAudioBuffer) != MSERR_OK) {
1989 MEDIA_LOGE("innerAudioCapture AcquireAudioBuffer failed");
1990 }
1991 }
1992 if (type == AVScreenCaptureMixMode::MIC_MODE && micAudioCapture_ != nullptr &&
1993 micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
1994 if (micAudioCapture_->AcquireAudioBuffer(micAudioBuffer) != MSERR_OK) {
1995 MEDIA_LOGE("micAudioCapture AcquireAudioBuffer failed");
1996 }
1997 }
1998 if (type == AVScreenCaptureMixMode::INNER_MODE && innerAudioCapture_ != nullptr &&
1999 innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2000 if (innerAudioCapture_->AcquireAudioBuffer(innerAudioBuffer) != MSERR_OK) {
2001 MEDIA_LOGE("innerAudioCapture AcquireAudioBuffer failed");
2002 }
2003 }
2004 return MSERR_OK;
2005 }
2006
ReleaseAudioBuffer(AudioCaptureSourceType type)2007 int32_t ScreenCaptureServer::ReleaseAudioBuffer(AudioCaptureSourceType type)
2008 {
2009 MediaTrace trace("ScreenCaptureServer::ReleaseAudioBuffer");
2010 std::unique_lock<std::mutex> lock(mutex_);
2011 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " ReleaseAudioBuffer start, state:%{public}d, "
2012 "type:%{public}d.", FAKE_POINTER(this), captureState_, type);
2013 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::STARTED, MSERR_INVALID_OPERATION,
2014 "ReleaseAudioBuffer failed, capture is not STARTED, state:%{public}d, type:%{public}d", captureState_, type);
2015
2016 if (((type == AudioCaptureSourceType::MIC) || (type == AudioCaptureSourceType::SOURCE_DEFAULT)) &&
2017 micAudioCapture_ != nullptr && micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2018 return micAudioCapture_->ReleaseAudioBuffer();
2019 }
2020 if (((type == AudioCaptureSourceType::ALL_PLAYBACK) || (type == AudioCaptureSourceType::APP_PLAYBACK)) &&
2021 innerAudioCapture_ != nullptr && innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2022 return innerAudioCapture_->ReleaseAudioBuffer();
2023 }
2024 MEDIA_LOGE("ReleaseAudioBuffer failed, source type not support, type:%{public}d", type);
2025 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNKNOWN,
2026 "ReleaseAudioBuffer failed, source type not support");
2027 return MSERR_UNKNOWN;
2028 }
2029
ReleaseAudioBufferMix(AVScreenCaptureMixMode type)2030 int32_t ScreenCaptureServer::ReleaseAudioBufferMix(AVScreenCaptureMixMode type)
2031 {
2032 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::STARTED, MSERR_INVALID_OPERATION,
2033 "ReleaseAudioBuffer failed, capture is not STARTED, state:%{public}d, type:%{public}d", captureState_, type);
2034 if (type == AVScreenCaptureMixMode::MIX_MODE && micAudioCapture_ != nullptr &&
2035 micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2036 if (micAudioCapture_->ReleaseAudioBuffer() != MSERR_OK) {
2037 MEDIA_LOGE("micAudioCapture ReleaseAudioBuffer failed");
2038 }
2039 }
2040 if (type == AVScreenCaptureMixMode::MIX_MODE && innerAudioCapture_ != nullptr &&
2041 innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2042 if (innerAudioCapture_->ReleaseAudioBuffer() != MSERR_OK) {
2043 MEDIA_LOGE("innerAudioCapture ReleaseAudioBuffer failed");
2044 }
2045 }
2046 if (type == AVScreenCaptureMixMode::MIC_MODE && micAudioCapture_ != nullptr &&
2047 micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2048 if (micAudioCapture_->ReleaseAudioBuffer() != MSERR_OK) {
2049 MEDIA_LOGE("micAudioCapture ReleaseAudioBuffer failed");
2050 }
2051 }
2052 if (type == AVScreenCaptureMixMode::INNER_MODE && innerAudioCapture_ != nullptr &&
2053 innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2054 if (innerAudioCapture_->ReleaseAudioBuffer() != MSERR_OK) {
2055 MEDIA_LOGE("innerAudioCapture ReleaseAudioBuffer failed");
2056 }
2057 }
2058 return MSERR_OK;
2059 }
2060
ReleaseInnerAudioBuffer()2061 int32_t ScreenCaptureServer::ReleaseInnerAudioBuffer()
2062 {
2063 CHECK_AND_RETURN_RET_LOG(innerAudioCapture_, MSERR_UNKNOWN, "innerAudioCapture_ is nullptr");
2064 int32_t ret = innerAudioCapture_->ReleaseAudioBuffer();
2065 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "innerAudioCapture ReleaseAudioBuffer failed");
2066 return ret;
2067 }
2068
ReleaseMicAudioBuffer()2069 int32_t ScreenCaptureServer::ReleaseMicAudioBuffer()
2070 {
2071 CHECK_AND_RETURN_RET_LOG(micAudioCapture_, MSERR_UNKNOWN, "micAudioCapture_ is nullptr");
2072 int32_t ret = micAudioCapture_->ReleaseAudioBuffer();
2073 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "micAudioCapture ReleaseAudioBuffer failed");
2074 return ret;
2075 }
2076
GetInnerAudioCaptureBufferSize(size_t & size)2077 int32_t ScreenCaptureServer::GetInnerAudioCaptureBufferSize(size_t &size)
2078 {
2079 if (innerAudioCapture_ == nullptr) {
2080 MEDIA_LOGE("innerAudioCapture_ is nullptr");
2081 return MSERR_UNKNOWN;
2082 }
2083 int32_t ret = innerAudioCapture_->GetBufferSize(size);
2084 return ret;
2085 }
2086
GetMicAudioCaptureBufferSize(size_t & size)2087 int32_t ScreenCaptureServer::GetMicAudioCaptureBufferSize(size_t &size)
2088 {
2089 if (micAudioCapture_ == nullptr) {
2090 MEDIA_LOGE("micAudioCapture_ is nullptr");
2091 return MSERR_UNKNOWN;
2092 }
2093 int32_t ret = micAudioCapture_->GetBufferSize(size);
2094 return ret;
2095 }
2096
AcquireVideoBuffer(sptr<OHOS::SurfaceBuffer> & surfaceBuffer,int32_t & fence,int64_t & timestamp,OHOS::Rect & damage)2097 int32_t ScreenCaptureServer::AcquireVideoBuffer(sptr<OHOS::SurfaceBuffer> &surfaceBuffer, int32_t &fence,
2098 int64_t ×tamp, OHOS::Rect &damage)
2099 {
2100 MediaTrace trace("ScreenCaptureServer::AcquireVideoBuffer");
2101 std::unique_lock<std::mutex> lock(mutex_);
2102 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " AcquireVideoBuffer start, state:%{public}d, "
2103 "fence:%{public}d, timestamp:%{public}" PRId64, FAKE_POINTER(this), captureState_, fence, timestamp);
2104 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::STARTED, MSERR_INVALID_OPERATION,
2105 "AcquireVideoBuffer failed, capture is not STARTED, state:%{public}d", captureState_);
2106
2107 CHECK_AND_RETURN_RET_LOG(surfaceCb_ != nullptr, MSERR_NO_MEMORY, "AcquireVideoBuffer failed, callback is nullptr");
2108 (static_cast<ScreenCapBufferConsumerListener *>(surfaceCb_.GetRefPtr()))->
2109 AcquireVideoBuffer(surfaceBuffer, fence, timestamp, damage);
2110 if (isDump_ && surfaceBuffer != nullptr) {
2111 void* addr = surfaceBuffer->GetVirAddr();
2112 uint32_t bufferSize = surfaceBuffer->GetSize();
2113 FILE *desFile = fopen(DUMP_PATH.c_str(), "wb+");
2114 if (desFile && addr != nullptr) {
2115 (void)fwrite(addr, 1, bufferSize, desFile);
2116 (void)fclose(desFile);
2117 } else if (desFile) {
2118 (void)fclose(desFile);
2119 }
2120 }
2121 if (surfaceBuffer != nullptr) {
2122 MEDIA_LOGD("getcurrent surfaceBuffer info, size:%{public}u", surfaceBuffer->GetSize());
2123 return MSERR_OK;
2124 }
2125 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNKNOWN,
2126 "AcquireVideoBuffer fault");
2127 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " AcquireVideoBuffer end.", FAKE_POINTER(this));
2128 return MSERR_UNKNOWN;
2129 }
2130
ReleaseVideoBuffer()2131 int32_t ScreenCaptureServer::ReleaseVideoBuffer()
2132 {
2133 MediaTrace trace("ScreenCaptureServer::ReleaseVideoBuffer");
2134 std::unique_lock<std::mutex> lock(mutex_);
2135 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " ReleaseVideoBuffer start, state:%{public}d.",
2136 FAKE_POINTER(this), captureState_);
2137 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::STARTED, MSERR_INVALID_OPERATION,
2138 "ReleaseVideoBuffer failed, capture is not STARTED, state:%{public}d", captureState_);
2139
2140 CHECK_AND_RETURN_RET_LOG(surfaceCb_ != nullptr, MSERR_NO_MEMORY, "ReleaseVideoBuffer failed, callback is nullptr");
2141 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " ReleaseVideoBuffer end.", FAKE_POINTER(this));
2142 return (static_cast<ScreenCapBufferConsumerListener *>(surfaceCb_.GetRefPtr()))->ReleaseVideoBuffer();
2143 }
2144
ExcludeContent(ScreenCaptureContentFilter & contentFilter)2145 int32_t ScreenCaptureServer::ExcludeContent(ScreenCaptureContentFilter &contentFilter)
2146 {
2147 std::unique_lock<std::mutex> lock(mutex_);
2148 CHECK_AND_RETURN_RET_LOG(captureState_ != AVScreenCaptureState::STOPPED, MSERR_INVALID_OPERATION,
2149 "ExcludeContent failed, capture is STOPPED");
2150
2151 MEDIA_LOGI("ScreenCaptureServer::ExcludeContent start");
2152 contentFilter_ = contentFilter;
2153 if (captureState_ == AVScreenCaptureState::STARTED) {
2154 Rosen::DisplayManager::GetInstance().SetVirtualScreenBlackList(screenId_, contentFilter_.windowIDsVec);
2155 }
2156 int32_t ret = MSERR_OK;
2157 if (innerAudioCapture_ != nullptr) {
2158 ret = innerAudioCapture_->UpdateAudioCapturerConfig(contentFilter_);
2159 }
2160
2161 // For the moment, not support:
2162 // For STREAM, should call AudioCapturer interface to make effect when start
2163 // For CAPTURE FILE, should call Recorder interface to make effect when start
2164 if (ret != MSERR_OK) {
2165 MEDIA_LOGE("ScreenCaptureServer::ExcludeContent UpdateAudioCapturerConfig failed");
2166 FaultScreenCaptureEventWrite(appName_, instanceId_, avType_, dataMode_, SCREEN_CAPTURE_ERR_UNSUPPORT,
2167 "ExcludeContent failed, UpdateAudioCapturerConfig failed");
2168 }
2169 return ret;
2170 }
2171
SetMicrophoneEnabled(bool isMicrophone)2172 int32_t ScreenCaptureServer::SetMicrophoneEnabled(bool isMicrophone)
2173 {
2174 MediaTrace trace("ScreenCaptureServer::SetMicrophoneEnabled");
2175 std::lock_guard<std::mutex> lock(mutex_);
2176 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetMicrophoneEnabled isMicrophoneOn_:%{public}d, "
2177 "new isMicrophone:%{public}d", FAKE_POINTER(this), isMicrophoneOn_, isMicrophone);
2178 int32_t ret = MSERR_UNKNOWN;
2179 isMicrophoneOn_ = isMicrophone;
2180 if (isMicrophone) {
2181 statisticalEventInfo_.enableMic = true;
2182 }
2183 if (captureState_ != AVScreenCaptureState::STARTED) {
2184 return MSERR_OK;
2185 }
2186 if (isMicrophone) {
2187 ret = SetMicrophoneOn();
2188 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "SetMicrophoneOn failed");
2189 if (screenCaptureCb_ != nullptr) {
2190 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_MIC_UNMUTED_BY_USER);
2191 }
2192 } else {
2193 ret = SetMicrophoneOff();
2194 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "SetMicrophoneOff failed");
2195 if (screenCaptureCb_ != nullptr) {
2196 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_MIC_MUTED_BY_USER);
2197 }
2198 }
2199 // For CAPTURE FILE, should call Recorder interface to make effect
2200 MEDIA_LOGI("SetMicrophoneEnabled OK.");
2201 return MSERR_OK;
2202 }
2203
SetMicrophoneOn()2204 int32_t ScreenCaptureServer::SetMicrophoneOn()
2205 {
2206 int32_t ret = MSERR_UNKNOWN;
2207 if (!micAudioCapture_) {
2208 if (captureConfig_.dataType == DataType::ORIGINAL_STREAM) {
2209 ret = StartStreamMicAudioCapture();
2210 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "StartStreamMicAudioCapture failed");
2211 } else if (captureConfig_.dataType == DataType::CAPTURE_FILE) {
2212 ret = StartFileMicAudioCapture();
2213 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "StartFileMicAudioCapture failed");
2214 }
2215 } else if (micAudioCapture_->GetAudioCapturerState() == CAPTURER_PAUSED) {
2216 ret = micAudioCapture_->Resume();
2217 if (ret != MSERR_OK) {
2218 MEDIA_LOGE("micAudioCapture Resume failed");
2219 isMicrophoneOn_ = false;
2220 screenCaptureCb_->OnStateChange(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_MIC_UNAVAILABLE);
2221 return ret;
2222 }
2223 } else if (micAudioCapture_->GetAudioCapturerState() != CAPTURER_RECORDING) {
2224 MEDIA_LOGE("AudioCapturerState invalid");
2225 }
2226 usleep(AUDIO_CHANGE_TIME);
2227 if (innerAudioCapture_ && innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING &&
2228 audioSource_ && audioSource_->GetSpeakerAliveStatus() && !audioSource_->GetIsInVoIPCall()) {
2229 ret = innerAudioCapture_->Pause();
2230 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "innerAudioCapture Pause failed");
2231 }
2232 return MSERR_OK;
2233 }
2234
SetMicrophoneOff()2235 int32_t ScreenCaptureServer::SetMicrophoneOff()
2236 {
2237 int32_t ret = MSERR_UNKNOWN;
2238 if (innerAudioCapture_ && innerAudioCapture_->GetAudioCapturerState() == CAPTURER_PAUSED) {
2239 ret = innerAudioCapture_->Resume();
2240 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "innerAudioCapture Resume failed");
2241 }
2242 usleep(AUDIO_CHANGE_TIME);
2243 if (micAudioCapture_ && micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2244 ret = micAudioCapture_->Pause();
2245 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "micAudioCapture Pause failed");
2246 }
2247 return MSERR_OK;
2248 }
2249
OnSpeakerAliveStatusChanged(bool speakerAliveStatus)2250 int32_t ScreenCaptureServer::OnSpeakerAliveStatusChanged(bool speakerAliveStatus)
2251 {
2252 int32_t ret = MSERR_UNKNOWN;
2253 CHECK_AND_RETURN_RET_LOG(innerAudioCapture_, MSERR_UNKNOWN, "innerAudioCapture_ is nullptr");
2254 if (!speakerAliveStatus && innerAudioCapture_->GetAudioCapturerState() == CAPTURER_PAUSED) {
2255 ret = innerAudioCapture_->Resume();
2256 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "innerAudioCapture Resume failed");
2257 } else if (speakerAliveStatus && micAudioCapture_ &&
2258 micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING && audioSource_ &&
2259 !audioSource_->GetIsInVoIPCall() && innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING) {
2260 ret = innerAudioCapture_->Pause();
2261 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "innerAudioCapture Pause failed");
2262 }
2263 return MSERR_OK;
2264 }
2265
ReStartMicForVoIPStatusSwitch()2266 int32_t ScreenCaptureServer::ReStartMicForVoIPStatusSwitch()
2267 {
2268 int32_t ret = MSERR_OK;
2269 StopMicAudioCapture();
2270 if (isMicrophoneOn_) {
2271 ret = StartFileMicAudioCapture();
2272 if (ret != MSERR_OK) {
2273 MEDIA_LOGE("OnVoIPStatusChanged StartFileMicAudioCapture failed, ret: %{public}d", ret);
2274 }
2275 }
2276 return ret;
2277 }
2278
OnVoIPStatusChanged(bool isInVoIPCall)2279 int32_t ScreenCaptureServer::OnVoIPStatusChanged(bool isInVoIPCall)
2280 {
2281 MEDIA_LOGI("OnVoIPStatusChanged, isInVoIPCall:%{public}d", isInVoIPCall);
2282 int32_t ret = MSERR_UNKNOWN;
2283 if (isInVoIPCall) {
2284 CHECK_AND_RETURN_RET_LOG(innerAudioCapture_, MSERR_UNKNOWN, "innerAudioCapture is nullptr");
2285 if (innerAudioCapture_->GetAudioCapturerState() == CAPTURER_PAUSED) {
2286 ret = innerAudioCapture_->Resume();
2287 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "innerAudioCapture Resume failed");
2288 }
2289 usleep(AUDIO_CHANGE_TIME);
2290 ReStartMicForVoIPStatusSwitch();
2291 } else {
2292 ReStartMicForVoIPStatusSwitch();
2293 usleep(AUDIO_CHANGE_TIME);
2294 CHECK_AND_RETURN_RET_LOG(innerAudioCapture_, MSERR_UNKNOWN, "innerAudioCapture is nullptr");
2295 if (innerAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING &&
2296 micAudioCapture_ && micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING &&
2297 audioSource_ && audioSource_->GetSpeakerAliveStatus()) {
2298 ret = innerAudioCapture_->Pause();
2299 CHECK_AND_RETURN_RET_LOG(ret == MSERR_OK, ret, "innerAudioCapture Pause failed");
2300 }
2301 }
2302 return MSERR_OK;
2303 }
2304
GetMicWorkingState()2305 bool ScreenCaptureServer::GetMicWorkingState()
2306 {
2307 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " GetMicWorkingState isMicrophoneOn_:%{public}d",
2308 FAKE_POINTER(this), isMicrophoneOn_);
2309 if (micAudioCapture_ != nullptr) {
2310 return micAudioCapture_->GetAudioCapturerState() == CAPTURER_RECORDING;
2311 }
2312 return false;
2313 }
2314
SetCanvasRotation(bool canvasRotation)2315 int32_t ScreenCaptureServer::SetCanvasRotation(bool canvasRotation)
2316 {
2317 MediaTrace trace("ScreenCaptureServer::SetCanvasRotation");
2318 std::lock_guard<std::mutex> lock(mutex_);
2319 canvasRotation_ = canvasRotation;
2320 MEDIA_LOGI("ScreenCaptureServer::SetCanvasRotation, canvasRotation:%{public}d", canvasRotation);
2321 if (captureState_ != AVScreenCaptureState::STARTED) { // Before Start
2322 return MSERR_OK;
2323 }
2324 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetCanvasRotation end.", FAKE_POINTER(this));
2325 return SetCanvasRotationInner();
2326 }
2327
SetCanvasRotationInner()2328 int32_t ScreenCaptureServer::SetCanvasRotationInner()
2329 {
2330 MediaTrace trace("ScreenCaptureServer::SetCanvasRotationInner");
2331 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetCanvasRotationInner start.", FAKE_POINTER(this));
2332 CHECK_AND_RETURN_RET_LOG(screenId_ != SCREEN_ID_INVALID, MSERR_INVALID_VAL,
2333 "SetCanvasRotation failed virtual screen not init");
2334 auto ret = ScreenManager::GetInstance().SetVirtualMirrorScreenCanvasRotation(screenId_, canvasRotation_);
2335 CHECK_AND_RETURN_RET_LOG(ret == DMError::DM_OK, MSERR_UNSUPPORT,
2336 "SetVirtualMirrorScreenCanvasRotation failed, ret: %{public}d", ret);
2337 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetCanvasRotationInner OK.", FAKE_POINTER(this));
2338 return MSERR_OK;
2339 }
2340
ResizeCanvas(int32_t width,int32_t height)2341 int32_t ScreenCaptureServer::ResizeCanvas(int32_t width, int32_t height)
2342 {
2343 MediaTrace trace("ScreenCaptureServer::ResizeCanvas");
2344 std::lock_guard<std::mutex> lock(mutex_);
2345 MEDIA_LOGI("ScreenCaptureServer::ResizeCanvas start, Width:%{public}d, Height:%{public}d", width, height);
2346 if (captureState_ != AVScreenCaptureState::STARTED) {
2347 MEDIA_LOGE("ResizeCanvas captureState_ invalid, captureState_:%{public}d", captureState_);
2348 return MSERR_INVALID_OPERATION;
2349 }
2350 if ((width <= 0) || (width > VIDEO_FRAME_WIDTH_MAX)) {
2351 MEDIA_LOGE("ResizeCanvas Width is invalid, Width:%{public}d, Height:%{public}d", width, height);
2352 return MSERR_INVALID_VAL;
2353 }
2354 if ((height <= 0) || (height > VIDEO_FRAME_HEIGHT_MAX)) {
2355 MEDIA_LOGE("ResizeCanvas Height is invalid, Width:%{public}d, Height:%{public}d", width, height);
2356 return MSERR_INVALID_VAL;
2357 }
2358 if (captureConfig_.dataType != DataType::ORIGINAL_STREAM) {
2359 MEDIA_LOGE("ResizeCanvas dataType invalid, dataType:%{public}d", captureConfig_.dataType);
2360 return MSERR_INVALID_OPERATION;
2361 }
2362
2363 auto resizeRet = ScreenManager::GetInstance().ResizeVirtualScreen(screenId_, width, height);
2364 MEDIA_LOGI("ScreenCaptureServer::ResizeCanvas, ResizeVirtualScreen end, ret: %{public}d ", resizeRet);
2365 CHECK_AND_RETURN_RET_LOG(resizeRet == DMError::DM_OK, MSERR_UNSUPPORT, "ResizeVirtualScreen failed");
2366
2367 return MSERR_OK;
2368 }
2369
SkipPrivacyMode(std::vector<uint64_t> & windowIDsVec)2370 int32_t ScreenCaptureServer::SkipPrivacyMode(std::vector<uint64_t> &windowIDsVec)
2371 {
2372 MediaTrace trace("ScreenCaptureServer::SkipPrivacyMode");
2373 std::lock_guard<std::mutex> lock(mutex_);
2374 MEDIA_LOGI("ScreenCaptureServer::SkipPrivacyMode, windowIDsVec size:%{public}d",
2375 static_cast<int32_t>(windowIDsVec.size()));
2376 for (size_t i = 0; i < windowIDsVec.size(); i++) {
2377 MEDIA_LOGI("SkipPrivacyMode windowIDsVec value :%{public}" PRIu64, windowIDsVec[i]);
2378 }
2379 skipPrivacyWindowIDsVec_.assign(windowIDsVec.begin(), windowIDsVec.end());
2380 if (captureState_ != AVScreenCaptureState::STARTED) { // Before Start
2381 return MSERR_OK;
2382 }
2383 return SkipPrivacyModeInner();
2384 }
2385
SkipPrivacyModeInner()2386 int32_t ScreenCaptureServer::SkipPrivacyModeInner()
2387 {
2388 MediaTrace trace("ScreenCaptureServer::SkipPrivacyModeInner");
2389 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SkipPrivacyModeInner start.", FAKE_POINTER(this));
2390 CHECK_AND_RETURN_RET_LOG(screenId_ != SCREEN_ID_INVALID, MSERR_INVALID_VAL,
2391 "SkipPrivacyMode failed virtual screen not init");
2392 auto ret = Rosen::DisplayManager::GetInstance().SetVirtualScreenSecurityExemption(screenId_,
2393 appInfo_.appPid, skipPrivacyWindowIDsVec_);
2394 CHECK_AND_RETURN_RET_LOG(ret == DMError::DM_OK, MSERR_UNSUPPORT,
2395 "SkipPrivacyModeInner failed, ret: %{public}d", ret);
2396 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SkipPrivacyModeInner OK.", FAKE_POINTER(this));
2397 return MSERR_OK;
2398 }
2399
SetMaxVideoFrameRate(int32_t frameRate)2400 int32_t ScreenCaptureServer::SetMaxVideoFrameRate(int32_t frameRate)
2401 {
2402 MediaTrace trace("ScreenCaptureServer::SetMaxVideoFrameRate");
2403 std::lock_guard<std::mutex> lock(mutex_);
2404 MEDIA_LOGI("ScreenCaptureServer::SetMaxVideoFrameRate start, frameRate:%{public}d", frameRate);
2405 if (captureState_ != AVScreenCaptureState::STARTED) {
2406 MEDIA_LOGE("SetMaxVideoFrameRate captureState_ invalid, captureState_:%{public}d", captureState_);
2407 return MSERR_INVALID_OPERATION;
2408 }
2409 if (frameRate <= 0) {
2410 MEDIA_LOGE("SetMaxVideoFrameRate frameRate is invalid, frameRate:%{public}d", frameRate);
2411 return MSERR_INVALID_VAL;
2412 }
2413
2414 uint32_t actualRefreshRate = 0;
2415 auto res = ScreenManager::GetInstance().SetVirtualScreenMaxRefreshRate(screenId_,
2416 static_cast<uint32_t>(frameRate), actualRefreshRate);
2417
2418 CHECK_AND_RETURN_RET_LOG(res == DMError::DM_OK, MSERR_UNSUPPORT, "SetMaxVideoFrameRate failed");
2419
2420 MEDIA_LOGI("ScreenCaptureServer::SetMaxVideoFrameRate end, frameRate:%{public}d, actualRefreshRate:%{public}u",
2421 frameRate, actualRefreshRate);
2422 return MSERR_OK;
2423 }
2424
SetScreenScaleMode()2425 int32_t ScreenCaptureServer::SetScreenScaleMode()
2426 {
2427 MediaTrace trace("ScreenCaptureServer::SetScreenScaleMode");
2428 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetScreenScaleMode start.", FAKE_POINTER(this));
2429 CHECK_AND_RETURN_RET_LOG(screenId_ != SCREEN_ID_INVALID, MSERR_INVALID_VAL,
2430 "SetScreenScaleMode failed virtual screen not init");
2431 auto ret = ScreenManager::GetInstance().SetVirtualMirrorScreenScaleMode(
2432 screenId_, OHOS::Rosen::ScreenScaleMode::FILL_MODE);
2433 if (ret != DMError::DM_OK) {
2434 MEDIA_LOGW("SetScreenScaleMode failed, ret: %{public}d", ret);
2435 return static_cast<int32_t>(ret);
2436 }
2437 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " SetScreenScaleMode OK.", FAKE_POINTER(this));
2438 return MSERR_OK;
2439 }
2440
StopAudioCapture()2441 int32_t ScreenCaptureServer::StopAudioCapture()
2442 {
2443 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StopAudioCapture start.", FAKE_POINTER(this));
2444 if (micAudioCapture_ != nullptr) {
2445 MediaTrace trace("ScreenCaptureServer::StopAudioCaptureMic");
2446 micAudioCapture_->Stop();
2447 micAudioCapture_ = nullptr;
2448 }
2449
2450 if (innerAudioCapture_ != nullptr) {
2451 MediaTrace trace("ScreenCaptureServer::StopAudioCaptureInner");
2452 innerAudioCapture_->Stop();
2453 innerAudioCapture_ = nullptr;
2454 }
2455 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StopAudioCapture end.", FAKE_POINTER(this));
2456 return MSERR_OK;
2457 }
2458
StopMicAudioCapture()2459 int32_t ScreenCaptureServer::StopMicAudioCapture()
2460 {
2461 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StopMicAudioCapture start.", FAKE_POINTER(this));
2462 if (micAudioCapture_ != nullptr) {
2463 MediaTrace trace("ScreenCaptureServer::StopAudioCaptureMic");
2464 micAudioCapture_->Stop();
2465 micAudioCapture_ = nullptr;
2466 }
2467 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StopMicAudioCapture end.", FAKE_POINTER(this));
2468 return MSERR_OK;
2469 }
2470
StopVideoCapture()2471 int32_t ScreenCaptureServer::StopVideoCapture()
2472 {
2473 MediaTrace trace("ScreenCaptureServer::StopVideoCapture");
2474 MEDIA_LOGI("StopVideoCapture");
2475 if ((screenId_ < 0) || ((consumer_ == nullptr) && !isSurfaceMode_) || !isConsumerStart_) {
2476 MEDIA_LOGI("StopVideoCapture IGNORED, video capture not start");
2477 surfaceCb_ = nullptr;
2478 return MSERR_OK;
2479 }
2480
2481 DestroyVirtualScreen();
2482 if (consumer_ != nullptr) {
2483 consumer_->UnregisterConsumerListener();
2484 consumer_ = nullptr;
2485 }
2486
2487 if (surfaceCb_ != nullptr) {
2488 (static_cast<ScreenCapBufferConsumerListener *>(surfaceCb_.GetRefPtr()))->Release();
2489 surfaceCb_ = nullptr;
2490 }
2491 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StopVideoCapture end.", FAKE_POINTER(this));
2492 return MSERR_OK;
2493 }
2494
StopScreenCaptureRecorder()2495 int32_t ScreenCaptureServer::StopScreenCaptureRecorder()
2496 {
2497 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances StopScreenCaptureRecorder S", FAKE_POINTER(this));
2498 MediaTrace trace("ScreenCaptureServer::StopScreenCaptureRecorder");
2499 int32_t ret = MSERR_OK;
2500 if (recorder_ != nullptr) {
2501 ret = recorder_->Stop(false);
2502 if (ret != MSERR_OK) {
2503 MEDIA_LOGE("StopScreenCaptureRecorder recorder stop failed, ret:%{public}d", ret);
2504 }
2505 DestroyVirtualScreen();
2506 recorder_->Release();
2507 recorder_ = nullptr;
2508 StopAudioCapture();
2509 }
2510 captureCallback_ = nullptr;
2511 isConsumerStart_ = false;
2512 return ret;
2513 }
2514
StopScreenCaptureByEvent(AVScreenCaptureStateCode stateCode)2515 int32_t ScreenCaptureServer::StopScreenCaptureByEvent(AVScreenCaptureStateCode stateCode)
2516 {
2517 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances StopScreenCaptureByEvent S", FAKE_POINTER(this));
2518 MediaTrace trace("ScreenCaptureServer::StopScreenCaptureByEvent");
2519 std::lock_guard<std::mutex> lock(mutex_);
2520 return StopScreenCaptureInner(stateCode);
2521 }
2522
StopScreenCaptureInner(AVScreenCaptureStateCode stateCode)2523 int32_t ScreenCaptureServer::StopScreenCaptureInner(AVScreenCaptureStateCode stateCode)
2524 {
2525 MediaTrace trace("ScreenCaptureServer::StopScreenCaptureInner");
2526 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StopScreenCaptureInner start, stateCode:%{public}d.",
2527 FAKE_POINTER(this), stateCode);
2528 if (screenCaptureCb_ != nullptr) {
2529 (static_cast<ScreenCaptureListenerCallback *>(screenCaptureCb_.get()))->Stop();
2530 }
2531 if (audioSource_ && audioSource_->GetAppPid() > 0) { // DataType::CAPTURE_FILE
2532 audioSource_->UnregisterAudioRendererEventListener(audioSource_->GetAppPid());
2533 }
2534 DisplayManager::GetInstance().UnregisterPrivateWindowListener(displayListener_);
2535 displayListener_ = nullptr;
2536 if (captureState_ == AVScreenCaptureState::CREATED || captureState_ == AVScreenCaptureState::STARTING) {
2537 captureState_ = AVScreenCaptureState::STOPPED;
2538 ScreenCaptureMonitorServer::GetInstance()->CallOnScreenCaptureFinished(appInfo_.appPid);
2539 if (screenCaptureCb_ != nullptr && stateCode != AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID) {
2540 screenCaptureCb_->OnStateChange(stateCode);
2541 }
2542 isSurfaceMode_ = false;
2543 surface_ = nullptr;
2544 SetErrorInfo(MSERR_OK, "normal stopped", StopReason::NORMAL_STOPPED, IsUserPrivacyAuthorityNeeded());
2545 return MSERR_OK;
2546 }
2547 CHECK_AND_RETURN_RET(captureState_ != AVScreenCaptureState::STOPPED, MSERR_OK);
2548
2549 int32_t ret = MSERR_OK;
2550 if (captureConfig_.dataType == DataType::CAPTURE_FILE) {
2551 ret = StopScreenCaptureRecorder();
2552 } else if (captureConfig_.dataType == DataType::ORIGINAL_STREAM) {
2553 int32_t retAudio = StopAudioCapture();
2554 int32_t retVideo = StopVideoCapture();
2555 ret = (retAudio == MSERR_OK && retVideo == MSERR_OK) ? MSERR_OK : MSERR_STOP_FAILED;
2556 } else {
2557 MEDIA_LOGW("StopScreenCaptureInner unsupport and ignore");
2558 return MSERR_OK;
2559 }
2560 CHECK_AND_RETURN_RET_LOG(captureState_ == AVScreenCaptureState::STARTED, ret, "state:%{public}d", captureState_);
2561 captureState_ = AVScreenCaptureState::STOPPED;
2562 SetErrorInfo(MSERR_OK, "normal stopped", StopReason::NORMAL_STOPPED, IsUserPrivacyAuthorityNeeded());
2563 PostStopScreenCapture(stateCode);
2564 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " StopScreenCaptureInner end.", FAKE_POINTER(this));
2565 return ret;
2566 }
2567
PostStopScreenCapture(AVScreenCaptureStateCode stateCode)2568 void ScreenCaptureServer::PostStopScreenCapture(AVScreenCaptureStateCode stateCode)
2569 {
2570 MediaTrace trace("ScreenCaptureServer::PostStopScreenCapture");
2571 MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " PostStopScreenCapture start, stateCode:%{public}d.",
2572 FAKE_POINTER(this), stateCode);
2573 ScreenCaptureMonitorServer::GetInstance()->CallOnScreenCaptureFinished(appInfo_.appPid);
2574 if (screenCaptureCb_ != nullptr && stateCode != AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID) {
2575 screenCaptureCb_->OnStateChange(stateCode);
2576 }
2577 #ifdef SUPPORT_SCREEN_CAPTURE_WINDOW_NOTIFICATION
2578 if (isPrivacyAuthorityEnabled_ &&
2579 GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"]
2580 .compare(appName_) != 0) {
2581 // Remove real time notification
2582 int32_t ret = NotificationHelper::CancelNotification(notificationId_);
2583 MEDIA_LOGI("StopScreenCaptureInner CancelNotification id:%{public}d, ret:%{public}d ", notificationId_, ret);
2584 micCount_.store(0);
2585 }
2586 #endif
2587 isPrivacyAuthorityEnabled_ = false;
2588
2589 if (!UpdatePrivacyUsingPermissionState(STOP_VIDEO)) {
2590 MEDIA_LOGE("UpdatePrivacyUsingPermissionState STOP failed, dataType:%{public}d", captureConfig_.dataType);
2591 }
2592 std::unordered_map<std::string, std::string> payload;
2593 int64_t value = ResourceSchedule::ResType::ScreenCaptureStatus::STOP_SCREEN_CAPTURE;
2594 ResSchedReportData(value, payload);
2595 {
2596 std::lock_guard<std::mutex> lock(mutexGlobal_);
2597 MEDIA_LOGI("StopScreenCaptureInner sessionId:%{public}d, activeSessionId_:%{public}d", sessionId_,
2598 activeSessionId_.load());
2599 if (sessionId_ == activeSessionId_.load()) {
2600 activeSessionId_.store(SESSION_ID_INVALID);
2601 }
2602 }
2603 }
2604
StopScreenCapture()2605 int32_t ScreenCaptureServer::StopScreenCapture()
2606 {
2607 MediaTrace trace("ScreenCaptureServer::StopScreenCapture");
2608 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances StopScreenCapture S", FAKE_POINTER(this));
2609
2610 std::lock_guard<std::mutex> lock(mutex_);
2611 int32_t ret = StopScreenCaptureInner(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID);
2612 if (statisticalEventInfo_.startLatency == -1) {
2613 statisticalEventInfo_.captureDuration = -1; // latency -1 means invalid
2614 } else {
2615 int64_t endTime = GetCurrentMillisecond();
2616 statisticalEventInfo_.captureDuration = static_cast<int32_t>(endTime - startTime_ -
2617 statisticalEventInfo_.startLatency);
2618 }
2619
2620 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances StopScreenCapture E", FAKE_POINTER(this));
2621 return ret;
2622 }
2623
Release()2624 void ScreenCaptureServer::Release()
2625 {
2626 ReleaseInner();
2627 }
2628
ReleaseInner()2629 void ScreenCaptureServer::ReleaseInner()
2630 {
2631 MediaTrace trace("ScreenCaptureServer::ReleaseInner");
2632 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances ReleaseInner S", FAKE_POINTER(this));
2633 int32_t sessionId;
2634 {
2635 std::lock_guard<std::mutex> lock(mutex_);
2636 StopScreenCaptureInner(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID);
2637 sessionId = sessionId_;
2638 sessionId_ = SESSION_ID_INVALID;
2639 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances ReleaseInner Stop done, sessionId:%{public}d",
2640 FAKE_POINTER(this), sessionId);
2641 }
2642 {
2643 std::lock_guard<std::mutex> lock(mutexGlobal_);
2644 serverMap.erase(sessionId);
2645 }
2646 skipPrivacyWindowIDsVec_.clear();
2647 SetMetaDataReport();
2648 screenCaptureObserverCb_ = nullptr;
2649 MEDIA_LOGI("0x%{public}06" PRIXPTR " Instances ReleaseInner E", FAKE_POINTER(this));
2650 }
2651
ScreenCaptureObserverCallBack(std::weak_ptr<ScreenCaptureServer> screenCaptureServer)2652 ScreenCaptureObserverCallBack::ScreenCaptureObserverCallBack(
2653 std::weak_ptr<ScreenCaptureServer> screenCaptureServer)
2654 {
2655 MEDIA_LOGD("0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
2656 screenCaptureServer_ = screenCaptureServer;
2657 }
2658
StopAndRelease(AVScreenCaptureStateCode state)2659 bool ScreenCaptureObserverCallBack::StopAndRelease(AVScreenCaptureStateCode state)
2660 {
2661 MEDIA_LOGI("ScreenCaptureObserverCallBack::StopAndRelease");
2662 auto scrServer = screenCaptureServer_.lock();
2663 if (scrServer && !scrServer->IsTelInCallSkipList()) {
2664 scrServer->StopScreenCaptureByEvent(state);
2665 scrServer->Release();
2666 }
2667 return true;
2668 }
2669
OnBufferAvailable()2670 void ScreenCapBufferConsumerListener::OnBufferAvailable()
2671 {
2672 MediaTrace trace("ScreenCaptureServer::OnBufferAvailable");
2673 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " OnBufferAvailable start.", FAKE_POINTER(this));
2674 CHECK_AND_RETURN(consumer_ != nullptr);
2675 int64_t timestamp = 0;
2676 OHOS::Rect damage;
2677 OHOS::sptr<OHOS::SurfaceBuffer> buffer = nullptr;
2678 sptr<SyncFence> acquireFence = SyncFence::INVALID_FENCE;
2679 int32_t acquireBufferRet = consumer_->AcquireBuffer(buffer, acquireFence, timestamp, damage);
2680 if (acquireBufferRet != GSERROR_OK) {
2681 MEDIA_LOGE("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " AcquireBuffer Fail Code %{public}d",
2682 FAKE_POINTER(this), acquireBufferRet);
2683 }
2684 int32_t flushFence = -1;
2685 if (acquireFence != nullptr && acquireFence != SyncFence::INVALID_FENCE) {
2686 acquireFence->Wait(1000); // 1000 ms
2687 flushFence = acquireFence->Get();
2688 }
2689 CHECK_AND_RETURN_LOG(buffer != nullptr, "Acquire SurfaceBuffer failed");
2690 if ((buffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE) != 0) {
2691 MEDIA_LOGD("ScreenCaptureServer::OnBufferAvailable cache enable");
2692 buffer->InvalidateCache();
2693 }
2694 void *addr = buffer->GetVirAddr();
2695 if (addr == nullptr) {
2696 MEDIA_LOGE("Acquire SurfaceBuffer address invalid");
2697 int32_t releaseBufferRet = consumer_->ReleaseBuffer(buffer, -1); // -1 not wait
2698 if (releaseBufferRet != GSERROR_OK) {
2699 MEDIA_LOGE("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " ReleaseBuffer Fail Code %{public}d",
2700 FAKE_POINTER(this), releaseBufferRet);
2701 }
2702 return;
2703 }
2704 MEDIA_LOGD("SurfaceBuffer size:%{public}u", buffer->GetSize());
2705 {
2706 std::unique_lock<std::mutex> lock(bufferMutex_);
2707 if (availBuffers_.size() > MAX_BUFFER_SIZE) {
2708 MEDIA_LOGE("consume slow, drop video frame");
2709 int32_t releaseBufferRet = consumer_->ReleaseBuffer(buffer, -1); // -1 not wait
2710 if (releaseBufferRet != GSERROR_OK) {
2711 MEDIA_LOGE("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " consume slow ReleaseBuffer "
2712 "Fail Code %{public}d", FAKE_POINTER(this), releaseBufferRet);
2713 }
2714 return;
2715 }
2716 availBuffers_.push(std::make_unique<SurfaceBufferEntry>(buffer, flushFence, timestamp, damage));
2717 }
2718 bufferCond_.notify_all();
2719 ProcessVideoBufferCallBack();
2720 }
2721
ProcessVideoBufferCallBack()2722 void ScreenCapBufferConsumerListener::ProcessVideoBufferCallBack()
2723 {
2724 std::lock_guard<std::mutex> lock(mutex_);
2725 CHECK_AND_RETURN_LOG(screenCaptureCb_ != nullptr, "no consumer, will drop video frame");
2726 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " OnBufferAvailable end.", FAKE_POINTER(this));
2727 screenCaptureCb_->OnVideoBufferAvailable(true);
2728 }
2729
AcquireVideoBuffer(sptr<OHOS::SurfaceBuffer> & surfaceBuffer,int32_t & fence,int64_t & timestamp,OHOS::Rect & damage)2730 int32_t ScreenCapBufferConsumerListener::AcquireVideoBuffer(sptr<OHOS::SurfaceBuffer> &surfaceBuffer, int32_t &fence,
2731 int64_t ×tamp, OHOS::Rect &damage)
2732 {
2733 MediaTrace trace("ScreenCaptureServer::AcquireVideoBuffer");
2734 using namespace std::chrono_literals;
2735 std::unique_lock<std::mutex> lock(bufferMutex_);
2736 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " AcquireVideoBuffer start, fence:%{public}d, "
2737 "timestamp:%{public}" PRId64, FAKE_POINTER(this), fence, timestamp);
2738 if (!bufferCond_.wait_for(
2739 lock, std::chrono::milliseconds(OPERATION_TIMEOUT_IN_MS), [this] { return !availBuffers_.empty(); })) {
2740 return MSERR_UNKNOWN;
2741 }
2742 surfaceBuffer = availBuffers_.front()->buffer;
2743 fence = availBuffers_.front()->flushFence;
2744 timestamp = availBuffers_.front()->timeStamp;
2745 damage = availBuffers_.front()->damageRect;
2746 MEDIA_LOGD("ScreenCaptureServer: 0x%{public}06" PRIXPTR " AcquireVideoBuffer end.", FAKE_POINTER(this));
2747 return MSERR_OK;
2748 }
2749
~ScreenCapBufferConsumerListener()2750 ScreenCapBufferConsumerListener::~ScreenCapBufferConsumerListener()
2751 {
2752 std::unique_lock<std::mutex> lock(bufferMutex_);
2753 MEDIA_LOGD("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " Destroy.", FAKE_POINTER(this));
2754 ReleaseBuffer();
2755 }
2756
ReleaseBuffer()2757 int32_t ScreenCapBufferConsumerListener::ReleaseBuffer()
2758 {
2759 while (!availBuffers_.empty()) {
2760 if (consumer_ != nullptr) {
2761 int32_t releaseBufferRet = consumer_->ReleaseBuffer(availBuffers_.front()->buffer, -1); // -1 not wait
2762 if (releaseBufferRet != GSERROR_OK) {
2763 MEDIA_LOGE("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " ReleaseBuffer "
2764 "Fail Code %{public}d", FAKE_POINTER(this), releaseBufferRet);
2765 }
2766 }
2767 availBuffers_.pop();
2768 }
2769 return MSERR_OK;
2770 }
2771
ReleaseVideoBuffer()2772 int32_t ScreenCapBufferConsumerListener::ReleaseVideoBuffer()
2773 {
2774 MediaTrace trace("ScreenCaptureServer::ReleaseVideoBuffer");
2775 std::unique_lock<std::mutex> lock(bufferMutex_);
2776 MEDIA_LOGD("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " ReleaseVideoBuffer start.",
2777 FAKE_POINTER(this));
2778 CHECK_AND_RETURN_RET_LOG(!availBuffers_.empty(), MSERR_OK, "buffer queue is empty, no video frame to release");
2779
2780 if (consumer_ != nullptr) {
2781 int32_t releaseBufferRet = consumer_->ReleaseBuffer(availBuffers_.front()->buffer, -1); // -1 not wait
2782 if (releaseBufferRet != GSERROR_OK) {
2783 MEDIA_LOGE("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " ReleaseVideoBuffer "
2784 "Fail Code %{public}d", FAKE_POINTER(this), releaseBufferRet);
2785 }
2786 }
2787 availBuffers_.pop();
2788 MEDIA_LOGD("ScreenCapBufferConsumerListener: 0x%{public}06" PRIXPTR " ReleaseVideoBuffer end.", FAKE_POINTER(this));
2789 return MSERR_OK;
2790 }
2791
Release()2792 int32_t ScreenCapBufferConsumerListener::Release()
2793 {
2794 std::unique_lock<std::mutex> lock(bufferMutex_);
2795 MEDIA_LOGI("ScreenCapBufferConsumerListener Release");
2796 return ReleaseBuffer();
2797 }
2798
SetAudioSource(std::shared_ptr<AudioDataSource> audioSource)2799 void ScreenRendererAudioStateChangeCallback::SetAudioSource(std::shared_ptr<AudioDataSource> audioSource)
2800 {
2801 audioSource_ = audioSource;
2802 }
2803
SetAppName(std::string appName)2804 void ScreenRendererAudioStateChangeCallback::SetAppName(std::string appName)
2805 {
2806 appName_ = appName;
2807 }
2808
OnRendererStateChange(const std::vector<std::unique_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)2809 void ScreenRendererAudioStateChangeCallback::OnRendererStateChange(
2810 const std::vector<std::unique_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
2811 {
2812 MEDIA_LOGD("ScreenRendererAudioStateChangeCallback IN");
2813 CHECK_AND_RETURN(audioSource_ != nullptr);
2814 audioSource_->SpeakerStateUpdate(audioRendererChangeInfos);
2815 std::string region = Global::I18n::LocaleConfig::GetSystemRegion();
2816 if (GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"]
2817 .compare(appName_) == 0 && region == "CN") {
2818 audioSource_->VoIPStateUpdate(audioRendererChangeInfos);
2819 }
2820 }
2821
SpeakerStateUpdate(const std::vector<std::unique_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)2822 void AudioDataSource::SpeakerStateUpdate(
2823 const std::vector<std::unique_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
2824 {
2825 (void)audioRendererChangeInfos;
2826 std::vector<std::unique_ptr<AudioRendererChangeInfo>> allAudioRendererChangeInfos;
2827 AudioStreamManager::GetInstance()->GetCurrentRendererChangeInfos(allAudioRendererChangeInfos);
2828 uint32_t changeInfoSize = allAudioRendererChangeInfos.size();
2829 if (changeInfoSize == 0) {
2830 return;
2831 }
2832 bool speakerAlive = HasSpeakerStream(allAudioRendererChangeInfos);
2833 if (speakerAlive != speakerAliveStatus_) {
2834 speakerAliveStatus_ = speakerAlive;
2835 CHECK_AND_RETURN(screenCaptureServer_ != nullptr);
2836 screenCaptureServer_->OnSpeakerAliveStatusChanged(speakerAlive);
2837 if (speakerAlive) {
2838 MEDIA_LOGI("HEADSET Change to Speaker.");
2839 } else {
2840 MEDIA_LOGI("Speaker Change to HEADSET.");
2841 }
2842 }
2843 }
2844
HasSpeakerStream(const std::vector<std::unique_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)2845 bool AudioDataSource::HasSpeakerStream(
2846 const std::vector<std::unique_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
2847 {
2848 uint32_t changeInfoIndex = 0;
2849 uint32_t headSetCount = 0;
2850 bool hasSpeakerStream = true;
2851 for (const std::unique_ptr<AudioRendererChangeInfo> &changeInfo: audioRendererChangeInfos) {
2852 if (!changeInfo) {
2853 continue;
2854 }
2855 MEDIA_LOGI("ChangeInfo Id: %{public}d, Client pid : %{public}d, State : %{public}d, DeviceType : %{public}d",
2856 changeInfoIndex, changeInfo->clientPid, static_cast<int32_t>(changeInfo->rendererState),
2857 static_cast<int32_t>(changeInfo->outputDeviceInfo.deviceType));
2858 if (changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_WIRED_HEADSET ||
2859 changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_WIRED_HEADPHONES ||
2860 changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_BLUETOOTH_SCO ||
2861 changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_BLUETOOTH_A2DP ||
2862 changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_USB_HEADSET ||
2863 changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_USB_ARM_HEADSET) {
2864 headSetCount++;
2865 }
2866 changeInfoIndex++;
2867 }
2868 if (headSetCount == changeInfoIndex) { // only if all streams in headset
2869 hasSpeakerStream = false;
2870 }
2871 return hasSpeakerStream;
2872 }
2873
VoIPStateUpdate(const std::vector<std::unique_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)2874 void AudioDataSource::VoIPStateUpdate(
2875 const std::vector<std::unique_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
2876 {
2877 std::lock_guard<std::mutex> lock(voipStatusChangeMutex_);
2878 (void)audioRendererChangeInfos;
2879 std::vector<std::unique_ptr<AudioRendererChangeInfo>> allAudioRendererChangeInfos;
2880 AudioStreamManager::GetInstance()->GetCurrentRendererChangeInfos(allAudioRendererChangeInfos);
2881 bool isInVoIPCall = false;
2882 for (const std::unique_ptr<AudioRendererChangeInfo> &changeInfo: allAudioRendererChangeInfos) {
2883 if (!changeInfo) {
2884 continue;
2885 }
2886 MEDIA_LOGI("Client pid : %{public}d, State : %{public}d, DeviceType : %{public}d",
2887 changeInfo->clientPid, static_cast<int32_t>(changeInfo->rendererState),
2888 static_cast<int32_t>(changeInfo->outputDeviceInfo.deviceType));
2889 if (changeInfo->rendererState == RendererState::RENDERER_RUNNING &&
2890 changeInfo->rendererInfo.streamUsage == AudioStandard::StreamUsage::STREAM_USAGE_VOICE_COMMUNICATION) {
2891 isInVoIPCall = true;
2892 break;
2893 }
2894 }
2895 if (isInVoIPCall_.load() == isInVoIPCall) {
2896 return;
2897 }
2898 isInVoIPCall_.store(isInVoIPCall);
2899 CHECK_AND_RETURN(screenCaptureServer_ != nullptr);
2900 screenCaptureServer_->OnVoIPStatusChanged(isInVoIPCall);
2901 }
2902
SetAppPid(int32_t appid)2903 void AudioDataSource::SetAppPid(int32_t appid)
2904 {
2905 appPid_ = appid;
2906 }
2907
GetAppPid()2908 int32_t AudioDataSource::GetAppPid()
2909 {
2910 return appPid_ ;
2911 }
2912
GetIsInVoIPCall()2913 bool AudioDataSource::GetIsInVoIPCall()
2914 {
2915 return isInVoIPCall_.load();
2916 }
2917
GetSpeakerAliveStatus()2918 bool AudioDataSource::GetSpeakerAliveStatus()
2919 {
2920 return speakerAliveStatus_;
2921 }
2922
SetAppName(std::string appName)2923 void AudioDataSource::SetAppName(std::string appName)
2924 {
2925 appName_ = appName;
2926 }
2927
RegisterAudioRendererEventListener(const int32_t clientPid,const std::shared_ptr<AudioRendererStateChangeCallback> & callback)2928 int32_t AudioDataSource::RegisterAudioRendererEventListener(const int32_t clientPid,
2929 const std::shared_ptr<AudioRendererStateChangeCallback> &callback)
2930 {
2931 CHECK_AND_RETURN_RET_LOG(callback != nullptr, MSERR_INVALID_VAL, "audio callback is null");
2932 int32_t ret = AudioStreamManager::GetInstance()->RegisterAudioRendererEventListener(clientPid, callback);
2933 std::vector<std::unique_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
2934 SpeakerStateUpdate(audioRendererChangeInfos);
2935 std::string region = Global::I18n::LocaleConfig::GetSystemRegion();
2936 if (GetScreenCaptureSystemParam()["const.multimedia.screencapture.screenrecorderbundlename"]
2937 .compare(appName_) == 0 && region == "CN") {
2938 VoIPStateUpdate(audioRendererChangeInfos);
2939 }
2940 return ret;
2941 }
2942
UnregisterAudioRendererEventListener(const int32_t clientPid)2943 int32_t AudioDataSource::UnregisterAudioRendererEventListener(const int32_t clientPid)
2944 {
2945 MEDIA_LOGI("client id: %{public}d", clientPid);
2946 return AudioStreamManager::GetInstance()->UnregisterAudioRendererEventListener(clientPid);
2947 }
2948
ReadAt(std::shared_ptr<AVBuffer> buffer,uint32_t length)2949 int32_t AudioDataSource::ReadAt(std::shared_ptr<AVBuffer> buffer, uint32_t length)
2950 {
2951 MEDIA_LOGD("AudioDataSource ReadAt start");
2952 std::shared_ptr<AudioBuffer> innerAudioBuffer = nullptr;
2953 std::shared_ptr<AudioBuffer> micAudioBuffer = nullptr;
2954 int32_t ret = MSERR_OK;
2955 if (screenCaptureServer_ == nullptr) {
2956 return MSERR_UNKNOWN;
2957 }
2958 ret = screenCaptureServer_->AcquireAudioBufferMix(innerAudioBuffer, micAudioBuffer, type_);
2959 if (ret != MSERR_OK) {
2960 return MSERR_INVALID_VAL;
2961 }
2962 MEDIA_LOGD("AcquireAudioBufferMix sucess");
2963 std::shared_ptr<AVMemory> &bufferMem = buffer->memory_;
2964 if (buffer->memory_ == nullptr) {
2965 MEDIA_LOGE("buffer->memory_ is nullptr");
2966 return MSERR_INVALID_VAL;
2967 }
2968 if (type_ == AVScreenCaptureMixMode::MIX_MODE) {
2969 return MixModeBufferWrite(innerAudioBuffer, micAudioBuffer, bufferMem);
2970 } else if (type_ == AVScreenCaptureMixMode::INNER_MODE && innerAudioBuffer != nullptr) {
2971 bufferMem->Write(reinterpret_cast<uint8_t*>(innerAudioBuffer->buffer), innerAudioBuffer->length, 0);
2972 return screenCaptureServer_->ReleaseAudioBufferMix(type_);
2973 } else if (type_ == AVScreenCaptureMixMode::MIC_MODE && micAudioBuffer != nullptr) {
2974 bufferMem->Write(reinterpret_cast<uint8_t*>(micAudioBuffer->buffer), micAudioBuffer->length, 0);
2975 return screenCaptureServer_->ReleaseAudioBufferMix(type_);
2976 }
2977 return MSERR_UNKNOWN;
2978 }
2979
MixModeBufferWrite(std::shared_ptr<AudioBuffer> & innerAudioBuffer,std::shared_ptr<AudioBuffer> & micAudioBuffer,std::shared_ptr<AVMemory> & bufferMem)2980 int32_t AudioDataSource::MixModeBufferWrite(std::shared_ptr<AudioBuffer> &innerAudioBuffer,
2981 std::shared_ptr<AudioBuffer> &micAudioBuffer, std::shared_ptr<AVMemory> &bufferMem)
2982 {
2983 if (innerAudioBuffer && innerAudioBuffer->buffer && micAudioBuffer && micAudioBuffer->buffer) {
2984 char* mixData = new char[innerAudioBuffer->length];
2985 char* srcData[2] = {nullptr};
2986 srcData[0] = reinterpret_cast<char*>(innerAudioBuffer->buffer);
2987 srcData[1] = reinterpret_cast<char*>(micAudioBuffer->buffer);
2988 int channels = 2;
2989 MixAudio(srcData, mixData, channels, innerAudioBuffer->length);
2990 bufferMem->Write(reinterpret_cast<uint8_t*>(mixData), innerAudioBuffer->length, 0);
2991 delete[] mixData;
2992 } else if (innerAudioBuffer && innerAudioBuffer->buffer) {
2993 bufferMem->Write(reinterpret_cast<uint8_t*>(innerAudioBuffer->buffer), innerAudioBuffer->length, 0);
2994 } else if (micAudioBuffer && micAudioBuffer->buffer) {
2995 bufferMem->Write(reinterpret_cast<uint8_t*>(micAudioBuffer->buffer), micAudioBuffer->length, 0);
2996 } else {
2997 MEDIA_LOGE("without buffer write");
2998 return MSERR_UNKNOWN;
2999 }
3000 if (innerAudioBuffer) {
3001 if (screenCaptureServer_->ReleaseInnerAudioBuffer() != MSERR_OK) {
3002 MEDIA_LOGE("ReleaseInnerAudioBuffer failed");
3003 }
3004 }
3005 if (micAudioBuffer) {
3006 if (screenCaptureServer_->ReleaseMicAudioBuffer() != MSERR_OK) {
3007 MEDIA_LOGE("ReleaseMicAudioBuffer failed");
3008 }
3009 }
3010 return MSERR_OK;
3011 }
3012
GetSize(int64_t & size)3013 int32_t AudioDataSource::GetSize(int64_t &size)
3014 {
3015 size_t bufferLen = 0;
3016 int32_t ret = screenCaptureServer_->GetInnerAudioCaptureBufferSize(bufferLen);
3017 MEDIA_LOGD("AudioDataSource::GetSize : %{public}zu", bufferLen);
3018 if (ret == MSERR_OK) {
3019 size = static_cast<int64_t>(bufferLen);
3020 return ret;
3021 }
3022 ret = screenCaptureServer_->GetMicAudioCaptureBufferSize(bufferLen);
3023 MEDIA_LOGD("AudioDataSource::GetSize : %{public}zu", bufferLen);
3024 if (ret == MSERR_OK) {
3025 size = static_cast<int64_t>(bufferLen);
3026 return ret;
3027 }
3028 return ret;
3029 }
3030
MixAudio(char ** srcData,char * mixData,int channels,int bufferSize)3031 void AudioDataSource::MixAudio(char** srcData, char* mixData, int channels, int bufferSize)
3032 {
3033 MEDIA_LOGD("AudioDataSource MixAudio");
3034 int const max = 32767;
3035 int const min = -32768;
3036 double const splitNum = 32;
3037 int const doubleChannels = 2;
3038 double coefficient = 1;
3039 int totalNum = 0;
3040 if (channels == 0) {
3041 return;
3042 }
3043 for (totalNum = 0; totalNum < bufferSize / channels; totalNum++) {
3044 int temp = 0;
3045 for (int channelNum = 0; channelNum < channels; channelNum++) {
3046 temp += *reinterpret_cast<short*>(srcData[channelNum] + totalNum * channels);
3047 }
3048 int32_t output = static_cast<int32_t>(temp * coefficient);
3049 if (output > max) {
3050 coefficient = static_cast<double>(max) / static_cast<double>(output);
3051 output = max;
3052 }
3053 if (output < min) {
3054 coefficient = static_cast<double>(min) / static_cast<double>(output);
3055 output = min;
3056 }
3057 if (coefficient < 1) {
3058 coefficient += (static_cast<double>(1) - coefficient) / splitNum;
3059 }
3060 *reinterpret_cast<short*>(mixData + totalNum * doubleChannels) = static_cast<short>(output);
3061 }
3062 }
3063 } // namespace Media
3064 } // namespace OHOS
3065