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