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 "migrate_avsession_server.h"
17
18 #include <chrono>
19 #include <thread>
20
21 #include "audio_device_manager.h"
22 #include "avsession_errors.h"
23 #include "avsession_item.h"
24 #include "avsession_log.h"
25 #include "avsession_service.h"
26 #include "softbus/softbus_session_utils.h"
27 #include "migrate_avsession_constant.h"
28 #include "base64_utils.h"
29 #include "avsession_pixel_map_adapter.h"
30 #include "pixel_map.h"
31 #include "image_packer.h"
32 #include "avsession_event_handler.h"
33
34 namespace OHOS::AVSession {
MigrateAVSessionServer(int32_t migrateMode,std::string deviceId)35 MigrateAVSessionServer::MigrateAVSessionServer(int32_t migrateMode, std::string deviceId)
36 {
37 SLOGI("MigrateAVSessionServer start with mode:%{public}d|deviceId:%{public}s.", migrateMode,
38 SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
39 migrateMode_ = migrateMode;
40 deviceId_ = deviceId;
41 }
42
~MigrateAVSessionServer()43 MigrateAVSessionServer::~MigrateAVSessionServer()
44 {
45 {
46 std::lock_guard lockGuard(migrateControllerLock_);
47 for (auto& pair : playerIdToControllerCallbackMap_) {
48 std::shared_ptr<AVControllerObserver> controllerObserver = pair.second;
49 CHECK_AND_CONTINUE(controllerObserver != nullptr);
50 controllerObserver->Release();
51 }
52 }
53 {
54 std::lock_guard lockGuard(cacheJsonLock_);
55 metaDataCache_.Reset();
56 playbackStateCache_.SetState(0);
57 playbackStateCache_.SetFavorite(0);
58 }
59 SLOGI("MigrateAVSessionServer quit with mode:%{public}d|deviceId:%{public}s.", migrateMode_,
60 SoftbusSessionUtils::AnonymizeDeviceId(deviceId_).c_str());
61 }
62
OnConnectProxy(const std::string & deviceId)63 void MigrateAVSessionServer::OnConnectProxy(const std::string &deviceId)
64 {
65 SLOGI("OnConnectProxy: %{public}d|%{public}s.",
66 migrateMode_, SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
67 if (deviceId_ != deviceId && !deviceId_.empty()) {
68 SLOGI("onConnect but already:%{public}s.", SoftbusSessionUtils::AnonymizeDeviceId(deviceId_).c_str());
69 return;
70 }
71 isSoftbusConnecting_ = true;
72 deviceId_ = deviceId;
73 if (migrateMode_ == MIGRATE_MODE_NEXT) {
74 SLOGI("connect process as next behavior");
75 LocalFrontSessionArrive(lastSessionId_);
76 RegisterAudioCallbackAndTrigger();
77 return;
78 }
79 ObserveControllerChanged(deviceId);
80 SendSpecialKeepaliveData();
81 SendRemoteHistorySessionList(deviceId);
82 SendRemoteControllerList(deviceId);
83 }
84
OnDisconnectProxy(const std::string & deviceId)85 void MigrateAVSessionServer::OnDisconnectProxy(const std::string &deviceId)
86 {
87 SLOGI("OnDisConnectProxy: %{public}d|%{public}s",
88 migrateMode_, SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
89 if (deviceId_ != deviceId && !deviceId_.empty()) {
90 SLOGI("onDisconnect but already:%{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId_).c_str());
91 return;
92 }
93 UnregisterAudioCallback();
94 isSoftbusConnecting_ = false;
95 if (servicePtr_ == nullptr) {
96 SLOGE("do NotifyMigrateStop without servicePtr, return");
97 return;
98 }
99 if (migrateMode_ == MIGRATE_MODE_NEXT) {
100 SLOGI("migrate next should not bother migrate cross");
101 return;
102 }
103 servicePtr_->NotifyMigrateStop(deviceId);
104 }
105
RegisterAudioCallbackAndTrigger()106 void MigrateAVSessionServer::RegisterAudioCallbackAndTrigger()
107 {
108 AudioAdapter::GetInstance().RegisterVolumeKeyEventCallback(volumeKeyEventCallbackFunc_);
109 volumeKeyEventCallbackFunc_(AudioAdapter::GetInstance().GetVolume());
110
111 AudioAdapter::GetInstance().SetAvailableDeviceChangeCallback(availableDeviceChangeCallbackFunc_);
112 availableDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetAvailableDevices());
113
114 AudioAdapter::GetInstance().SetPreferredOutputDeviceChangeCallback(preferredDeviceChangeCallbackFunc_);
115 preferredDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetPreferredOutputDeviceForRendererInfo());
116 }
117
TriggerAudioCallback()118 void MigrateAVSessionServer::TriggerAudioCallback()
119 {
120 CHECK_AND_RETURN_LOG(volumeKeyEventCallbackFunc_ != nullptr, "VolumeKeyEventCallback nullptr");
121 CHECK_AND_RETURN_LOG(availableDeviceChangeCallbackFunc_ != nullptr, "AvailableDeviceChangeCallback nullptr");
122 CHECK_AND_RETURN_LOG(preferredDeviceChangeCallbackFunc_ != nullptr, "PreferredOutputDeviceChangeCallback nullptr");
123 volumeKeyEventCallbackFunc_(AudioAdapter::GetInstance().GetVolume());
124 availableDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetAvailableDevices());
125 preferredDeviceChangeCallbackFunc_(AudioAdapter::GetInstance().GetPreferredOutputDeviceForRendererInfo());
126 }
127
UnregisterAudioCallback()128 void MigrateAVSessionServer::UnregisterAudioCallback()
129 {
130 if (migrateMode_ == MIGRATE_MODE_NEXT) {
131 AudioAdapter::GetInstance().UnregisterVolumeKeyEventCallback();
132 AudioAdapter::GetInstance().UnsetAvailableDeviceChangeCallback();
133 AudioAdapter::GetInstance().UnsetPreferredOutputDeviceChangeCallback();
134 }
135 }
136
GetCharacteristic()137 int32_t MigrateAVSessionServer::GetCharacteristic()
138 {
139 if (migrateMode_ == MIGRATE_MODE_NEXT) {
140 return MSG_HEAD_MODE_FOR_NEXT;
141 }
142 return MSG_HEAD_MODE;
143 }
144
ObserveControllerChanged(const std::string & deviceId)145 void MigrateAVSessionServer::ObserveControllerChanged(const std::string &deviceId)
146 {
147 std::vector<AVSessionDescriptor> descriptors;
148 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
149 if (res != AVSESSION_SUCCESS) {
150 SLOGW("GetAllSessionDescriptors fail");
151 return;
152 }
153
154 for (auto &item : descriptors) {
155 if (item.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
156 item.elementName_.GetBundleName().empty() ||
157 item.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
158 continue;
159 }
160 if (item.isTopSession_) {
161 std::lock_guard lockGuard(topSessionLock_);
162 topSessionId_ = item.sessionId_;
163 }
164 CreateController(item.sessionId_);
165 }
166 }
167
CreateController(const std::string & sessionId)168 void MigrateAVSessionServer::CreateController(const std::string &sessionId)
169 {
170 {
171 std::lock_guard lockGuard(migrateControllerLock_);
172 auto it = playerIdToControllerCallbackMap_.find(sessionId);
173 if (it != playerIdToControllerCallbackMap_.end()) {
174 SLOGW("CreateControlller has registered");
175 return;
176 }
177 }
178 sptr<IRemoteObject> proxyObject;
179 CHECK_AND_RETURN_LOG(servicePtr_ != nullptr, "createController without servicePtr");
180 int32_t ret = servicePtr_->CreateControllerInner(sessionId, proxyObject, migrateMode_);
181 if (ret != AVSESSION_SUCCESS && !(ret == ERR_CONTROLLER_IS_EXIST && proxyObject != nullptr)) {
182 SLOGW("CreateControllerInner fail");
183 return;
184 }
185 sptr<AVControllerItem> controller = iface_cast<AVControllerItem>(proxyObject);
186 if (controller == nullptr) {
187 SLOGW("controller is null");
188 return;
189 }
190 std::shared_ptr<AVControllerObserver> callback = std::make_shared<AVControllerObserver>(sessionId);
191 std::weak_ptr<MigrateAVSessionServer> migrageServerWeak(shared_from_this());
192 callback->Init(migrageServerWeak, migrateMode_);
193 ret = controller->RegisterAVControllerCallback(callback);
194 if (ret != AVSESSION_SUCCESS) {
195 SLOGW("RegisteAVControllerCallback fail");
196 return;
197 }
198 AVMetaData::MetaMaskType metaDataFilter(METADATA_MASK_ALL);
199 AVPlaybackState::PlaybackStateMaskType playFilter(PLAYBACK_MASK_ALL);
200 controller->SetMetaFilter(metaDataFilter);
201 controller->SetPlaybackFilter(playFilter);
202 UpdateCache(sessionId, controller, callback, true);
203 }
204
ClearCacheBySessionId(const std::string & sessionId)205 void MigrateAVSessionServer::ClearCacheBySessionId(const std::string &sessionId)
206 {
207 std::lock_guard lockGuard(migrateControllerLock_);
208 auto it = playerIdToControllerMap_.find(sessionId);
209 if (it != playerIdToControllerMap_.end()) {
210 if (std::count(sortControllerList_.begin(), sortControllerList_.end(), it->second) > 0) {
211 SLOGI("ClearCacheBySessionId in and remove controller in sortList");
212 sortControllerList_.remove(it->second);
213 }
214 playerIdToControllerMap_.erase(it);
215 }
216
217 auto item = playerIdToControllerCallbackMap_.find(sessionId);
218 if (item != playerIdToControllerCallbackMap_.end()) {
219 playerIdToControllerCallbackMap_.erase(item);
220 }
221 }
222
223 // LCOV_EXCL_START
UpdateCache(const std::string & sessionId,sptr<AVControllerItem> avcontroller,std::shared_ptr<AVControllerObserver> callback,bool isAdd)224 void MigrateAVSessionServer::UpdateCache(const std::string &sessionId, sptr<AVControllerItem> avcontroller,
225 std::shared_ptr<AVControllerObserver> callback, bool isAdd)
226 {
227 if (isAdd) {
228 if (avcontroller == nullptr) {
229 return;
230 }
231 std::lock_guard lockGuard(migrateControllerLock_);
232 playerIdToControllerMap_.insert({sessionId, avcontroller});
233 playerIdToControllerCallbackMap_.insert({sessionId, callback});
234 sortControllerList_.push_back(avcontroller);
235 } else {
236 ClearCacheBySessionId(sessionId);
237 }
238 }
239 // LCOV_EXCL_STOP
240
StopObserveControllerChanged(const std::string & deviceId)241 void MigrateAVSessionServer::StopObserveControllerChanged(const std::string &deviceId)
242 {
243 SLOGI("StopObserveControllerChanged with id %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(deviceId).c_str());
244 std::lock_guard lockGuard(migrateControllerLock_);
245 for (auto it = sortControllerList_.begin(); it != sortControllerList_.end(); it++) {
246 (*it)->Destroy();
247 SLOGI("Controller destroy");
248 }
249 deviceId_ = "";
250 playerIdToControllerMap_.clear();
251 sortControllerList_.clear();
252 playerIdToControllerCallbackMap_.clear();
253 }
254
255 // LCOV_EXCL_START
OnBytesReceived(const std::string & deviceId,const std::string & data)256 void MigrateAVSessionServer::OnBytesReceived(const std::string &deviceId, const std::string &data)
257 {
258 SLOGD("OnBytesReceived:%{public}d", static_cast<int>(data.size()));
259 if (data.length() < MSG_HEAD_LENGTH) {
260 SLOGW("OnBytesReceived: invalid data");
261 return;
262 }
263 if (migrateMode_ == MIGRATE_MODE_NEXT) {
264 ProcFromNext(deviceId, data);
265 return;
266 }
267 if (data[1] == SYNC_COMMAND) {
268 ProcControlCommand(data);
269 } else if (data[1] == COLD_START) {
270 StartConfigHistorySession(data);
271 }
272 }
273 // LCOV_EXCL_STOP
274
ProcControlCommand(const std::string & data)275 void MigrateAVSessionServer::ProcControlCommand(const std::string &data)
276 {
277 std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
278 SLOGI("ProcControlCommand: %{public}s", jsonStr.c_str());
279 cJSON* root = nullptr;
280 if (!SoftbusSessionUtils::TransferStrToJson(jsonStr, root)) {
281 SLOGE("json parse fail");
282 return;
283 }
284 if (!cJSON_HasObjectItem(root, PLAYER_ID) || !cJSON_HasObjectItem(root, MEDIA_COMMAND) ||
285 !cJSON_HasObjectItem(root, COMMAND)) {
286 SLOGE("json parse with error member");
287 cJSON_Delete(root);
288 return;
289 }
290 std::string playerId = SoftbusSessionUtils::GetStringFromJson(root, PLAYER_ID);
291 playerId = playerId.empty() ? "ERROR_PLAYER_ID" : playerId;
292 sptr<AVControllerItem> avcontroller{nullptr};
293 auto res = GetControllerById(playerId, avcontroller);
294 if (res != AVSESSION_SUCCESS || avcontroller == nullptr) {
295 SLOGW("GetControllerById fail");
296 cJSON_Delete(root);
297 return;
298 }
299 int mediaCommand = SoftbusSessionUtils::GetIntFromJson(root, MEDIA_COMMAND);
300 std::string command = SoftbusSessionUtils::GetStringFromJson(root, COMMAND);
301 command = command.empty() ? "ERROR_COMMAND" : command;
302 SLOGI("ProcContolCommand mediaCommand: %{public}d", mediaCommand);
303 std::string extras = SoftbusSessionUtils::GetStringFromJson(root, EXTRAS);
304 if (extras.empty()) {
305 extras = "ERROR_EXTRAS";
306 }
307 switch (mediaCommand) {
308 case SYNC_MEDIASESSION_CALLBACK_ON_COMMAND:
309 SendCommandProc(command, avcontroller);
310 break;
311 case SYNC_MEDIASESSION_CALLBACK_ON_MEDIABUTTON_EVENT:
312 MediaButtonEventProc(command, avcontroller);
313 break;
314 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
315 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
316 case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
317 CommandWithExtrasProc(mediaCommand, command, extras, avcontroller);
318 break;
319 default:
320 PlaybackCommandDataProc(mediaCommand, command, avcontroller);
321 break;
322 }
323 cJSON_Delete(root);
324 }
325
StartConfigHistorySession(const std::string & data)326 void MigrateAVSessionServer::StartConfigHistorySession(const std::string &data)
327 {
328 std::string jsonStr = data.substr(MSG_HEAD_LENGTH);
329 SLOGI("StartConfigHistorySession: %{public}s", jsonStr.c_str());
330 cJSON* jsonData = nullptr;
331 if (!SoftbusSessionUtils::TransferStrToJson(jsonStr, jsonData)) {
332 SLOGE("jStartConfigHistorySession: parse json failed");
333 return;
334 }
335
336 if (!cJSON_HasObjectItem(jsonData, PLAYER_ID)) {
337 SLOGE("StartConfigHistorySession: json parse with error member");
338 cJSON_Delete(jsonData);
339 return;
340 }
341 std::string playerId = SoftbusSessionUtils::GetStringFromJson(jsonData, PLAYER_ID);
342 if (playerId.empty()) {
343 playerId = "ERROR_PLAYER_ID";
344 }
345
346 int32_t ret = servicePtr_->StartAVPlayback(playerId, "");
347 SLOGI("StartConfigHistorySession StartAVPlayback %{public}s, ret=%{public}d",
348 SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str(), ret);
349 cJSON_Delete(jsonData);
350 }
351
352 // LCOV_EXCL_START
GetControllerById(const std::string & sessionId,sptr<AVControllerItem> & controller)353 int32_t MigrateAVSessionServer::GetControllerById(const std::string &sessionId, sptr<AVControllerItem> &controller)
354 {
355 if (sessionId.empty()) {
356 SLOGW("empty sessionId");
357 return AVSESSION_ERROR;
358 }
359
360 std::lock_guard lockGuard(migrateControllerLock_);
361 for (auto it = playerIdToControllerMap_.begin(); it != playerIdToControllerMap_.end(); it++) {
362 std::string foundId = it->first;
363 if (it->first == sessionId) {
364 controller = it->second;
365 return AVSESSION_SUCCESS;
366 }
367 }
368 SLOGW("controller not found");
369 return AVSESSION_ERROR;
370 }
371
GetAllControllers(std::vector<sptr<AVControllerItem>> & controller)372 int32_t MigrateAVSessionServer::GetAllControllers(std::vector<sptr<AVControllerItem>> &controller)
373 {
374 std::vector<AVSessionDescriptor> descriptors;
375 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
376 if (res != AVSESSION_SUCCESS) {
377 SLOGW("GetAllSessionDescriptors failed");
378 return AVSESSION_ERROR;
379 }
380 std::lock_guard lockGuard(migrateControllerLock_);
381 for (auto iter = descriptors.begin(); iter != descriptors.end(); iter++) {
382 if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
383 iter->elementName_.GetBundleName().empty() ||
384 iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
385 releaseSessionId_.compare(iter->sessionId_) == 0) {
386 continue;
387 }
388 auto it = playerIdToControllerMap_.find(iter->sessionId_);
389 if (it != playerIdToControllerMap_.end()) {
390 controller.push_back(it->second);
391 }
392 }
393 return AVSESSION_SUCCESS;
394 }
395 // LCOV_EXCL_STOP
396
Init(AVSessionService * ptr)397 void MigrateAVSessionServer::Init(AVSessionService *ptr)
398 {
399 servicePtr_ = ptr;
400 supportCrossMediaPlay_ = false;
401 }
402
ResetSupportCrossMediaPlay(const std::string & extraInfo)403 void MigrateAVSessionServer::ResetSupportCrossMediaPlay(const std::string &extraInfo)
404 {
405 cJSON* jsonData = nullptr;
406 if (!SoftbusSessionUtils::TransferStrToJson(extraInfo, jsonData)) {
407 SLOGE("json parse fail");
408 return;
409 }
410 bool isSupportSingleFrameMediaPlay = SoftbusSessionUtils::GetBoolFromJson(jsonData,
411 IS_SUPPORT_SINGLE_FRAME_MEDIA_PLAY);
412
413 SLOGI("SuperLauncher: isSupportSingleFrameMediaPlay=%{public}d", isSupportSingleFrameMediaPlay);
414 supportCrossMediaPlay_ = isSupportSingleFrameMediaPlay;
415 cJSON_Delete(jsonData);
416 }
417
418 // LCOV_EXCL_START
OnSessionCreate(const AVSessionDescriptor & descriptor)419 void MigrateAVSessionServer::OnSessionCreate(const AVSessionDescriptor &descriptor)
420 {
421 if (migrateMode_ == MIGRATE_MODE_NEXT) {
422 return;
423 }
424 SLOGI("OnSessionCreate");
425 std::string sessionId = descriptor.sessionId_;
426 if (sessionId.empty()) {
427 SLOGW("no valid avsession");
428 return;
429 }
430 if (descriptor.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
431 descriptor.elementName_.GetBundleName().empty() ||
432 descriptor.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
433 SLOGI("not audio avsession or anco audio");
434 return;
435 }
436 std::string identity = IPCSkeleton::ResetCallingIdentity();
437 CreateController(sessionId);
438 IPCSkeleton::SetCallingIdentity(identity);
439 }
440
OnSessionRelease(const AVSessionDescriptor & descriptor)441 void MigrateAVSessionServer::OnSessionRelease(const AVSessionDescriptor &descriptor)
442 {
443 if (migrateMode_ == MIGRATE_MODE_NEXT) {
444 return;
445 }
446 std::string sessionId = descriptor.sessionId_;
447 if (sessionId.empty()) {
448 SLOGW("no valid avsession");
449 return;
450 }
451 SLOGI("OnSessionRelease : %{public}s", SoftbusSessionUtils::AnonymizeDeviceId(sessionId).c_str());
452 ClearCacheBySessionId(sessionId);
453 releaseSessionId_ = sessionId;
454 releaseSessionBundleName_ = descriptor.elementName_.GetBundleName();
455 SendRemoteHistorySessionList(deviceId_);
456 SendRemoteControllerList(deviceId_);
457 releaseSessionId_ = "";
458 releaseSessionBundleName_ = "";
459 }
460
OnTopSessionChange(const AVSessionDescriptor & descriptor)461 void MigrateAVSessionServer::OnTopSessionChange(const AVSessionDescriptor &descriptor)
462 {
463 if (migrateMode_ == MIGRATE_MODE_NEXT) {
464 return;
465 }
466 SLOGI("OnTopSessionChange sessionId_: %{public}s***",
467 descriptor.sessionId_.substr(0, UNMASK_CHAR_NUM).c_str());
468 {
469 std::lock_guard lockGuard(topSessionLock_);
470 if (descriptor.sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
471 descriptor.elementName_.GetBundleName().empty() ||
472 descriptor.elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME) {
473 SLOGI("not audio avsession or anco audio");
474 return;
475 }
476 if (topSessionId_ == descriptor.sessionId_) {
477 return;
478 }
479 lastSessionId_ = topSessionId_;
480 topSessionId_ = descriptor.sessionId_;
481 auto it = playerIdToControllerMap_.find(descriptor.sessionId_);
482 if (it == playerIdToControllerMap_.end()) {
483 CreateController(descriptor.sessionId_);
484 }
485 }
486 SendRemoteHistorySessionList(deviceId_);
487 SendRemoteControllerList(deviceId_);
488 }
489
SortControllers(std::list<sptr<AVControllerItem>> controllers)490 void MigrateAVSessionServer::SortControllers(std::list<sptr<AVControllerItem>> controllers)
491 {
492 SLOGI("SortControllers");
493 std::lock_guard topSessionLockGuard(topSessionLock_);
494 if (topSessionId_.empty()) {
495 SLOGE("SortControllers topSessionId is null");
496 return;
497 }
498 std::lock_guard lockGuard(migrateControllerLock_);
499 for (auto iter = controllers.begin(); iter != controllers.end(); iter++) {
500 if ((*iter)->GetSessionId() == topSessionId_) {
501 controllers.splice(controllers.begin(), controllers, iter);
502 break;
503 }
504 }
505 }
506
SendRemoteControllerList(const std::string & deviceId)507 void MigrateAVSessionServer::SendRemoteControllerList(const std::string &deviceId)
508 {
509 SLOGI("SendRemoteControllerList");
510 std::vector<sptr<AVControllerItem>> avcontroller;
511 auto res = GetAllControllers(avcontroller);
512 SortControllers(sortControllerList_);
513 if (res != AVSESSION_SUCCESS) {
514 SLOGE("SendRemoteControllerList no top session");
515 return;
516 }
517 if (avcontroller.empty()) {
518 SLOGE("SendRemoteControllerList avcontroller is null");
519 ClearRemoteControllerList(deviceId);
520 return;
521 }
522 std::string msg = ConvertControllersToStr(avcontroller);
523
524 if (!deviceId.empty()) {
525 SendByte(deviceId, msg);
526 } else {
527 SendByteToAll(msg);
528 }
529 AVSessionEventHandler::GetInstance().AVSessionPostTask([this]() {
530 DelaySendMetaData();
531 }, "DelaySendMetaData", DELAY_TIME);
532 }
533
SendRemoteHistorySessionList(const std::string & deviceId)534 void MigrateAVSessionServer::SendRemoteHistorySessionList(const std::string &deviceId)
535 {
536 if (!supportCrossMediaPlay_) {
537 SLOGI("SendRemoteHistorySessionList, Remote does not support cross media play");
538 return;
539 }
540
541 std::vector<AVSessionDescriptor> descriptors;
542 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
543 if (res != AVSESSION_SUCCESS) {
544 SLOGW("GetAllSessionDescriptors fail");
545 return;
546 }
547
548 std::vector<AVSessionDescriptor> hisDescriptors;
549 auto hisRes = servicePtr_->GetHistoricalSessionDescriptors(MAX_HISTORY_SESSION_NUMS, hisDescriptors);
550 if (hisRes != AVSESSION_SUCCESS) {
551 SLOGW("GetHistoricalSessionDescriptors fail");
552 return;
553 }
554
555 std::string msg = ConvertHistorySessionListToStr(descriptors, hisDescriptors);
556 if (!deviceId.empty()) {
557 SendByte(deviceId, msg);
558 } else {
559 SendByteToAll(msg);
560 }
561 }
562
ConvertSessionDescriptorsToCJSON(cJSON * jsonArray,int32_t & descriptorNums)563 bool MigrateAVSessionServer::ConvertSessionDescriptorsToCJSON(cJSON* jsonArray, int32_t& descriptorNums)
564 {
565 cJSON* releaseData = SoftbusSessionUtils::GetNewCJSONObject();
566 if (releaseData == nullptr) {
567 SLOGE("get releaseData json with nullptr");
568 return false;
569 }
570
571 std::string supportModule;
572 std::string profile;
573 if (BundleStatusAdapter::GetInstance().IsSupportPlayIntent(releaseSessionBundleName_, supportModule, profile)) {
574 if (!SoftbusSessionUtils::AddStringToJson(releaseData, PLAYER_ID, releaseSessionId_)) {
575 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
576 PLAYER_ID, releaseSessionId_.c_str());
577 cJSON_Delete(releaseData);
578 return false;
579 }
580 if (!SoftbusSessionUtils::AddStringToJson(releaseData, PACKAGE_NAME, releaseSessionBundleName_)) {
581 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
582 PACKAGE_NAME, releaseSessionBundleName_.c_str());
583 cJSON_Delete(releaseData);
584 return false;
585 }
586 if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, descriptorNums, releaseData)) {
587 SLOGE("AddJsonToJsonArray with index:%{public}d fail", descriptorNums);
588 return false;
589 }
590 descriptorNums++;
591 }
592 return true;
593 }
594
ConvertReleaseSessionToCJSON(cJSON * jsonArray,std::vector<AVSessionDescriptor> & sessionDescriptors,int32_t & descriptorNums)595 bool MigrateAVSessionServer::ConvertReleaseSessionToCJSON(cJSON* jsonArray,
596 std::vector<AVSessionDescriptor>& sessionDescriptors, int32_t& descriptorNums)
597 {
598 for (auto iter = sessionDescriptors.begin(); iter != sessionDescriptors.end(); iter++) {
599 if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
600 iter->elementName_.GetBundleName().empty() ||
601 iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
602 releaseSessionId_.compare(iter->sessionId_) == 0) {
603 continue;
604 }
605
606 cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
607 if (jsonData == nullptr) {
608 SLOGE("get jsonData json with nullptr");
609 return false;
610 }
611 if (!SoftbusSessionUtils::AddStringToJson(jsonData, PLAYER_ID, iter->sessionId_)) {
612 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
613 PLAYER_ID, iter->sessionId_.c_str());
614 cJSON_Delete(jsonData);
615 return false;
616 }
617 if (!SoftbusSessionUtils::AddStringToJson(jsonData, PACKAGE_NAME, iter->elementName_.GetBundleName())) {
618 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
619 PACKAGE_NAME, iter->elementName_.GetBundleName().c_str());
620 cJSON_Delete(jsonData);
621 return false;
622 }
623 if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, descriptorNums, jsonData)) {
624 SLOGE("AddJsonToJsonArray with index:%{public}d fail", descriptorNums);
625 return false;
626 }
627 descriptorNums++;
628 }
629 return true;
630 }
631
ConvertHisSessionDescriptorsToCJSON(cJSON * jsonArray,std::vector<AVSessionDescriptor> & hisSessionDescriptors,int32_t & descriptorNums)632 bool MigrateAVSessionServer::ConvertHisSessionDescriptorsToCJSON(cJSON* jsonArray,
633 std::vector<AVSessionDescriptor>& hisSessionDescriptors, int32_t& descriptorNums)
634 {
635 for (auto iter = hisSessionDescriptors.begin(); iter != hisSessionDescriptors.end(); iter++) {
636 if (iter->sessionType_ != AVSession::SESSION_TYPE_AUDIO ||
637 iter->elementName_.GetBundleName().empty() ||
638 iter->elementName_.GetBundleName() == ANCO_AUDIO_BUNDLE_NAME ||
639 releaseSessionId_.compare(iter->sessionId_) == 0) {
640 continue;
641 }
642
643 cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
644 if (jsonData == nullptr) {
645 SLOGE("get jsonData json with nullptr");
646 return false;
647 }
648 if (!SoftbusSessionUtils::AddStringToJson(jsonData, PLAYER_ID, iter->sessionId_)) {
649 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
650 PLAYER_ID, iter->sessionId_.c_str());
651 cJSON_Delete(jsonData);
652 return false;
653 }
654 if (!SoftbusSessionUtils::AddStringToJson(jsonData, PACKAGE_NAME, iter->elementName_.GetBundleName())) {
655 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
656 PACKAGE_NAME, iter->elementName_.GetBundleName().c_str());
657 cJSON_Delete(jsonData);
658 return false;
659 }
660 if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, descriptorNums, jsonData)) {
661 SLOGE("AddJsonToJsonArray with index:%{public}d fail", descriptorNums);
662 return false;
663 }
664 descriptorNums++;
665 }
666 return true;
667 }
668
ConvertHistorySessionListToStr(std::vector<AVSessionDescriptor> sessionDescriptors,std::vector<AVSessionDescriptor> hisSessionDescriptors)669 std::string MigrateAVSessionServer::ConvertHistorySessionListToStr(std::vector<AVSessionDescriptor> sessionDescriptors,
670 std::vector<AVSessionDescriptor> hisSessionDescriptors)
671 {
672 cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
673 CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
674 int32_t descriptorNums = 0;
675 if (!releaseSessionId_.empty()) {
676 if (!ConvertSessionDescriptorsToCJSON(jsonArray, descriptorNums)) {
677 SLOGE("ConvertSessionDescriptorsToCJSON fail");
678 }
679 }
680 if (!ConvertReleaseSessionToCJSON(jsonArray, sessionDescriptors, descriptorNums)) {
681 SLOGE("ConvertReleaseSessionToCJSON fail");
682 }
683 if (!ConvertHisSessionDescriptorsToCJSON(jsonArray, hisSessionDescriptors, descriptorNums)) {
684 SLOGE("ConvertHisSessionDescriptorsToCJSON fail");
685 }
686 cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
687 if (jsonData == nullptr) {
688 SLOGE("get jsonData json with nullptr");
689 cJSON_Delete(jsonArray);
690 return "";
691 }
692 if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, HISTORY_MEDIA_PLAYER_INFO, jsonArray)) {
693 SLOGE("add jsonArray into jsonData fail");
694 cJSON_Delete(jsonData);
695 return "";
696 }
697 std::string jsonStr;
698 SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
699 char header[] = {MSG_HEAD_MODE, GET_HISTORY_MEDIA_INFO, '\0'};
700 std::string msg = std::string(header) + jsonStr;
701 cJSON_Delete(jsonData);
702 return msg;
703 }
704
DelaySendMetaData()705 void MigrateAVSessionServer::DelaySendMetaData()
706 {
707 sptr<AVControllerItem> avcontroller{nullptr};
708 GetControllerById(topSessionId_, avcontroller);
709 if (avcontroller != nullptr) {
710 AVMetaData resultMetaData;
711 resultMetaData.Reset();
712 avcontroller->GetAVMetaData(resultMetaData);
713 AVMetaData metaDataInfo = resultMetaData;
714 std::shared_ptr<AVSessionPixelMap> pixelImage = resultMetaData.GetMediaImage();
715 std::shared_ptr<AVSessionPixelMap> mediaImage = std::make_shared<AVSessionPixelMap>();
716 if (pixelImage != nullptr) {
717 SLOGI("ready to copy image");
718 mediaImage->SetInnerImgBuffer(pixelImage->GetInnerImgBuffer());
719 metaDataInfo.SetMediaImage(mediaImage);
720 }
721 std::string metaDataStr = ConvertMetadataInfoToStr(topSessionId_,
722 SYNC_CONTROLLER_CALLBACK_ON_METADATA_CHANNGED, metaDataInfo);
723 SendByte(deviceId_, metaDataStr);
724 if (mediaImage != nullptr) {
725 mediaImage->Clear();
726 }
727 }
728 }
729
GenerateClearAVSessionMsg()730 std::string MigrateAVSessionServer::GenerateClearAVSessionMsg()
731 {
732 cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
733 CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
734 cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
735 if (jsonData == nullptr) {
736 SLOGE("get jsonData json with nullptr");
737 cJSON_Delete(jsonArray);
738 return "";
739 }
740 if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, MEDIA_CONTROLLER_LIST, jsonArray)) {
741 SLOGE("add jsonArray into jsonData fail");
742 cJSON_Delete(jsonData);
743 return "";
744 }
745 std::string jsonStr;
746 SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
747
748 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER_LIST, '\0'};
749 std::string msg = std::string(header) + jsonStr;
750 cJSON_Delete(jsonData);
751 return msg;
752 }
753
GenerateClearHistorySessionMsg()754 std::string MigrateAVSessionServer::GenerateClearHistorySessionMsg()
755 {
756 SLOGI("GenerateClearHistorySessionMsg");
757 cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
758 CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
759 cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
760 if (jsonData == nullptr) {
761 SLOGE("get jsonData json with nullptr");
762 cJSON_Delete(jsonArray);
763 return "";
764 }
765 if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, HISTORY_MEDIA_PLAYER_INFO, jsonArray)) {
766 SLOGE("add jsonArray into jsonData fail");
767 cJSON_Delete(jsonData);
768 return "";
769 }
770 std::string jsonStr;
771 SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
772
773 char header[] = {MSG_HEAD_MODE, GET_HISTORY_MEDIA_INFO, '\0'};
774 std::string msg = std::string(header) + jsonStr;
775 cJSON_Delete(jsonData);
776 return msg;
777 }
778
ClearRemoteControllerList(const std::string & deviceId)779 void MigrateAVSessionServer::ClearRemoteControllerList(const std::string &deviceId)
780 {
781 std::lock_guard lockGuard(migrateControllerLock_);
782 std::string msg = GenerateClearAVSessionMsg();
783 if (!deviceId.empty()) {
784 SendByte(deviceId, msg);
785 }
786 }
787
ClearRemoteHistorySessionList(const std::string & deviceId)788 void MigrateAVSessionServer::ClearRemoteHistorySessionList(const std::string &deviceId)
789 {
790 if (!supportCrossMediaPlay_) {
791 SLOGI("ClearRemoteHistorySessionList, Remote does not support cross media play");
792 return;
793 }
794 std::lock_guard lockGuard(historySessionLock_);
795 std::string msg = GenerateClearHistorySessionMsg();
796 if (!deviceId.empty()) {
797 SendByte(deviceId, msg);
798 }
799 }
800
ConvertControllersToStr(std::vector<sptr<AVControllerItem>> avcontrollers)801 std::string MigrateAVSessionServer::ConvertControllersToStr(
802 std::vector<sptr<AVControllerItem>> avcontrollers)
803 {
804 SLOGI("ConvertControllersToStr");
805 cJSON* jsonArray = SoftbusSessionUtils::GetNewCJSONArray();
806 CHECK_AND_RETURN_RET_LOG(jsonArray != nullptr, "", "get jsonArray with nullptr");
807 int32_t sessionNums = 0;
808 for (auto& controller : avcontrollers) {
809 if (sessionNums >= MAX_SESSION_NUMS) {
810 break;
811 }
812 if (controller == nullptr) {
813 continue;
814 }
815 std::string playerId = controller->GetSessionId();
816 cJSON* jsonObject = ConvertControllerToJson(controller);
817 CHECK_AND_CONTINUE(jsonObject != nullptr);
818 if (cJSON_IsInvalid(jsonObject) || cJSON_IsNull(jsonObject)) {
819 SLOGE("get jsonObject from ConvertControllerToJson invalid");
820 cJSON_Delete(jsonObject);
821 continue;
822 }
823 if (!SoftbusSessionUtils::AddStringToJson(jsonObject, PLAYER_ID, playerId)) {
824 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
825 PLAYER_ID, SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
826 cJSON_Delete(jsonObject);
827 continue;
828 }
829 if (!SoftbusSessionUtils::AddJsonToJsonArray(jsonArray, sessionNums, jsonObject)) {
830 SLOGE("AddJsonToJsonArray with index:%{public}d fail", sessionNums);
831 continue;
832 }
833 sessionNums++;
834 }
835 if (cJSON_IsInvalid(jsonArray) || cJSON_IsNull(jsonArray)) {
836 SLOGE("get jsonArray aft add object invalid");
837 }
838 cJSON* jsonData = SoftbusSessionUtils::GetNewCJSONObject();
839 if (jsonData == nullptr) {
840 SLOGE("get jsonData json with nullptr");
841 }
842 if (!SoftbusSessionUtils::AddJsonArrayToJson(jsonData, MEDIA_CONTROLLER_LIST, jsonArray)) {
843 SLOGE("add jsonArray into jsonData fail");
844 }
845 std::string jsonStr;
846 SoftbusSessionUtils::TransferJsonToStr(jsonData, jsonStr);
847
848 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER_LIST, '\0'};
849 std::string msg = std::string(header) + jsonStr;
850 cJSON_Delete(jsonData);
851 return msg;
852 }
853 // LCOV_EXCL_STOP
854
ConvertControllerToJson(sptr<AVControllerItem> avcontroller)855 cJSON* MigrateAVSessionServer::ConvertControllerToJson(sptr<AVControllerItem> avcontroller)
856 {
857 SLOGI("ConvertControllerToJson");
858 cJSON* metadata = nullptr;
859 AVMetaData data;
860 data.Reset();
861 avcontroller->GetAVMetaData(data);
862 metadata = ConvertMetadataToJson(data);
863 CHECK_AND_RETURN_RET_LOG(metadata != nullptr, metadata, "get metadata json with null");
864 if (cJSON_IsInvalid(metadata) || cJSON_IsNull(metadata)) {
865 SLOGE("get metadata json with invalid");
866 cJSON_Delete(metadata);
867 return nullptr;
868 }
869
870 AVPlaybackState state;
871 if (AVSESSION_SUCCESS == avcontroller->GetAVPlaybackState(state)) {
872 if (!SoftbusSessionUtils::AddStringToJson(metadata, PLAYBACK_STATE, RebuildPlayState(state))) {
873 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
874 PLAYBACK_STATE, RebuildPlayState(state).c_str());
875 cJSON_Delete(metadata);
876 return nullptr;
877 }
878 }
879 if (!SoftbusSessionUtils::AddStringToJson(metadata, SESSION_INFO,
880 "OAAAAEJOREwBAAAAEwAAAEMAbwBuAHQAcgBvAGwAbABlAHIAVwBoAGkAdABlAEwAaQBzAHQAAAAU\nAAAAAQAAAA==\n")) {
881 SLOGE("AddStringToJson with key:%{public}s fail", SESSION_INFO);
882 cJSON_Delete(metadata);
883 return nullptr;
884 }
885 if (!SoftbusSessionUtils::AddIntToJson(metadata, VOLUME_INFO, VOLUMN_INFO)) {
886 SLOGE("AddStringToJson with key:%{public}s|value:%{public}d fail",
887 VOLUME_INFO, VOLUMN_INFO);
888 cJSON_Delete(metadata);
889 return nullptr;
890 }
891 if (!SoftbusSessionUtils::AddStringToJson(metadata, PACKAGE_NAME, GetBundleName(avcontroller->GetSessionId()))) {
892 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
893 PACKAGE_NAME, GetBundleName(avcontroller->GetSessionId()).c_str());
894 cJSON_Delete(metadata);
895 return nullptr;
896 }
897
898 return metadata;
899 }
900
901 // LCOV_EXCL_START
GetBundleName(std::string sessionId)902 std::string MigrateAVSessionServer::GetBundleName(std::string sessionId)
903 {
904 std::vector<AVSessionDescriptor> descriptors;
905
906 auto res = servicePtr_->GetAllSessionDescriptors(descriptors);
907 if (res != AVSESSION_SUCCESS) {
908 SLOGW("GetAllSessionDescriptors fail");
909 return "";
910 }
911 for (auto iter = descriptors.begin(); iter != descriptors.end(); iter++) {
912 if (iter->sessionId_ == sessionId) {
913 std::string bundleName = iter->elementName_.GetBundleName();
914 std::string abilityName = iter->elementName_.GetAbilityName();
915 SLOGI("bundleName: %{public}s abilityName: %{public}s", bundleName.c_str(), abilityName.c_str());
916 return bundleName;
917 }
918 }
919 SLOGW("GetBundleName fail");
920 return "";
921 }
922
ConvertStateFromSingleToDouble(int32_t state)923 int32_t MigrateAVSessionServer::ConvertStateFromSingleToDouble(int32_t state)
924 {
925 switch (state) {
926 case AVPlaybackState::PLAYBACK_STATE_PLAY:
927 return MEDIA_SESSION_PLAYBACK_STATE_PLAY;
928 case AVPlaybackState::PLAYBACK_STATE_PAUSE:
929 return MEDIA_SESSION_PLAYBACK_STATE_PAUSE;
930 case AVPlaybackState::PLAYBACK_STATE_STOP:
931 return MEDIA_SESSION_PLAYBACK_STATE_STOP;
932 case AVPlaybackState::PLAYBACK_STATE_ERROR:
933 return MEDIA_SESSION_PLAYBACK_STATE_ERROR;
934 default:
935 SLOGW("unknowState: %{public}d", state);
936 break;
937 }
938 return state;
939 }
940
RebuildPlayState(const AVPlaybackState & playbackState)941 std::string MigrateAVSessionServer::RebuildPlayState(const AVPlaybackState &playbackState)
942 {
943 int64_t actions = 1911;
944 Parcel parcel;
945 parcel.WriteInt32(ConvertStateFromSingleToDouble(playbackState.GetState()))
946 && parcel.WriteInt64(playbackState.GetPosition().elapsedTime_)
947 && parcel.WriteFloat(playbackState.GetSpeed())
948 && parcel.WriteInt64(playbackState.GetPosition().updateTime_)
949 && parcel.WriteInt64(playbackState.GetBufferedTime())
950 && parcel.WriteInt64(actions)
951 && parcel.WriteInt32(-1)
952 && parcel.WriteInt64(playbackState.GetActiveItemId())
953 && parcel.WriteInt32(1)
954 && parcel.WriteCString("")
955 && parcel.WriteInt32(-1);
956
957 uint8_t* pointer = reinterpret_cast<uint8_t*>(parcel.GetData());
958 size_t len = parcel.GetDataSize();
959 std::vector<uint8_t> vec(len);
960 for (size_t i = 0; i < len; ++i) {
961 vec[i] = pointer[i];
962 }
963 std::string str = Base64Utils::Base64Encode(vec);
964 return str;
965 }
966
ConvertMetadataToJson(const AVMetaData & metadata)967 cJSON* MigrateAVSessionServer::ConvertMetadataToJson(const AVMetaData &metadata)
968 {
969 return ConvertMetadataToJson(metadata, true);
970 }
971
ConvertMetadataToJson(const AVMetaData & metadata,bool includeImage)972 cJSON* MigrateAVSessionServer::ConvertMetadataToJson(const AVMetaData &metadata, bool includeImage)
973 {
974 cJSON* result = SoftbusSessionUtils::GetNewCJSONObject();
975 CHECK_AND_RETURN_RET_LOG(result != nullptr, result, "get result json with null");
976 if (cJSON_IsInvalid(result) || cJSON_IsNull(result)) {
977 SLOGE("get result json with invalid");
978 cJSON_Delete(result);
979 return nullptr;
980 }
981
982 if (metadata.IsValid()) {
983 SLOGI("ConvertMetadataToJson without img");
984 if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_TITLE, metadata.GetTitle())) {
985 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
986 METADATA_TITLE, metadata.GetTitle().c_str());
987 cJSON_Delete(result);
988 return nullptr;
989 }
990 if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_ARTIST, metadata.GetArtist())) {
991 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
992 METADATA_ARTIST, metadata.GetArtist().c_str());
993 cJSON_Delete(result);
994 return nullptr;
995 }
996 if (includeImage) {
997 std::string mediaImage = "";
998 std::vector<uint8_t> outputData(BUFFER_MAX_SIZE);
999 bool ret = CompressToJPEG(metadata, outputData);
1000 mediaImage = ((ret == true) && (!outputData.empty())) ? Base64Utils::Base64Encode(outputData) : "";
1001 if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_IMAGE, mediaImage)) {
1002 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1003 METADATA_IMAGE, mediaImage.c_str());
1004 cJSON_Delete(result);
1005 return nullptr;
1006 }
1007 }
1008 } else {
1009 if (!SoftbusSessionUtils::AddStringToJson(result, METADATA_TITLE, "") ||
1010 !SoftbusSessionUtils::AddStringToJson(result, METADATA_ARTIST, "") ||
1011 !SoftbusSessionUtils::AddStringToJson(result, METADATA_IMAGE, "")) {
1012 cJSON_Delete(result);
1013 return nullptr;
1014 }
1015 }
1016 return result;
1017 }
1018
CompressToJPEG(const AVMetaData & metadata,std::vector<uint8_t> & outputData)1019 bool MigrateAVSessionServer::CompressToJPEG(const AVMetaData &metadata, std::vector<uint8_t> &outputData)
1020 {
1021 std::shared_ptr<AVSessionPixelMap> innerPixelMap = metadata.GetMediaImage();
1022 std::shared_ptr<Media::PixelMap> pixelMap;
1023 if (innerPixelMap == nullptr) {
1024 return false;
1025 } else {
1026 pixelMap = AVSessionPixelMapAdapter::ConvertFromInner(innerPixelMap);
1027 }
1028
1029 Media::ImagePacker imagePacker;
1030 Media::PackOption option;
1031 option.format = "image/jpeg";
1032 option.quality = DEFAULT_QUALITY;
1033 uint32_t maxSize = outputData.size();
1034 uint32_t ret = imagePacker.StartPacking(outputData.data(), maxSize, option);
1035 if (ret != 0) {
1036 SLOGI("Failed to start packing");
1037 return false;
1038 }
1039 if (pixelMap == nullptr) {
1040 SLOGE("CompressToJPEG with pixel get null");
1041 return false;
1042 }
1043 ret = imagePacker.AddImage(*pixelMap);
1044 if (ret != 0) {
1045 SLOGI("Failed to add image");
1046 return false;
1047 }
1048 int64_t packedSize = 0;
1049 ret = imagePacker.FinalizePacking(packedSize);
1050 if (ret != 0) {
1051 SLOGI("Failed to finalize packing");
1052 return false;
1053 }
1054
1055 outputData.resize(packedSize);
1056 return true;
1057 }
1058
ConvertMetadataInfoToStr(const std::string playerId,int32_t controlCommand,const AVMetaData & metadata)1059 std::string MigrateAVSessionServer::ConvertMetadataInfoToStr(
1060 const std::string playerId, int32_t controlCommand, const AVMetaData &metadata)
1061 {
1062 SLOGI("ConvertMetadataInfoToStr");
1063 cJSON* metaDataJson = ConvertMetadataToJson(metadata);
1064 CHECK_AND_RETURN_RET_LOG(metaDataJson != nullptr, "", "get metaDataJson from ConvertMetadataToJson nullptr");
1065 if (cJSON_IsInvalid(metaDataJson) || cJSON_IsNull(metaDataJson)) {
1066 SLOGE("get metaDataJson from ConvertMetadataToJson invalid");
1067 cJSON_Delete(metaDataJson);
1068 return "";
1069 }
1070 if (!SoftbusSessionUtils::AddStringToJson(metaDataJson, PLAYER_ID, playerId)) {
1071 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1072 PLAYER_ID, SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
1073 cJSON_Delete(metaDataJson);
1074 return "";
1075 }
1076 if (!SoftbusSessionUtils::AddIntToJson(metaDataJson, MEDIA_INFO, controlCommand)) {
1077 SLOGE("AddIntToJson with key:%{public}s|value:%{public}d fail",
1078 MEDIA_INFO, controlCommand);
1079 cJSON_Delete(metaDataJson);
1080 return "";
1081 }
1082
1083 std::string msg;
1084 SoftbusSessionUtils::TransferJsonToStr(metaDataJson, msg);
1085 cJSON_Delete(metaDataJson);
1086 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER, '\0'};
1087 return std::string(header) + msg;
1088 }
1089
SendSpecialKeepaliveData()1090 void MigrateAVSessionServer::SendSpecialKeepaliveData()
1091 {
1092 std::thread([this]() {
1093 std::this_thread::sleep_for(std::chrono::milliseconds(HEART_BEAT_TIME));
1094 if (this->isSoftbusConnecting_) {
1095 char header[] = {MSG_HEAD_MODE, SYNC_HEARTBEAT, '\0'};
1096 std::string data = std::string(header);
1097 SendByteToAll(data);
1098 SendSpecialKeepaliveData();
1099 SLOGI("send special mediamession data to proxy connection");
1100 } else {
1101 SLOGI("send special mediamession data to proxy exit");
1102 }
1103 }).detach();
1104 }
1105
SendCommandProc(const std::string & command,sptr<AVControllerItem> controller)1106 void MigrateAVSessionServer::SendCommandProc(const std::string &command, sptr<AVControllerItem> controller)
1107 {
1108 if (command == EVENT_COMMAND_UNLOCK_LYRIC || command == EVENT_COMMAND_SHOW_LYRIC ||
1109 command == EVENT_COMMAND_HIDE_LYRIC) {
1110 } else {
1111 SLOGW("command is not support: %{public}s", command.c_str());
1112 }
1113 }
1114
MediaButtonEventProc(const std::string & command,sptr<AVControllerItem> controller)1115 void MigrateAVSessionServer::MediaButtonEventProc(const std::string &command, sptr<AVControllerItem> controller)
1116 {
1117 std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
1118 if (keyEvent == nullptr) {
1119 SLOGE("MediaButtonEventProc with key event null");
1120 return;
1121 }
1122 keyEvent->SetKeyCode(atoi(command.c_str()));
1123 controller->SendAVKeyEvent(*keyEvent.get());
1124 }
1125
CommandWithExtrasProc(int mediaCommand,const std::string & extrasCommand,const std::string & extras,sptr<AVControllerItem> controller)1126 void MigrateAVSessionServer::CommandWithExtrasProc(int mediaCommand, const std::string &extrasCommand,
1127 const std::string &extras, sptr<AVControllerItem> controller)
1128 {
1129 SLOGI("CommandWithExtrasProc mediaCommand is: %{public}d", mediaCommand);
1130 switch (mediaCommand) {
1131 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_SEARCH:
1132 break;
1133 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY_FROM_MEDIAID:
1134 break;
1135 case SYNC_MEDIASESSION_CALLBACK_ON_CUSTOMACTION:
1136 break;
1137 default:
1138 SLOGW("mediaCommand is not support: %{public}d", mediaCommand);
1139 break;
1140 }
1141 }
1142
PlaybackCommandDataProc(int mediaCommand,const std::string & command,sptr<AVControllerItem> controller)1143 void MigrateAVSessionServer::PlaybackCommandDataProc(int mediaCommand, const std::string &command,
1144 sptr<AVControllerItem> controller)
1145 {
1146 SLOGI("PlaybackComandDataProc Command is: %{public}d", mediaCommand);
1147 AVControlCommand cmd;
1148 switch (mediaCommand) {
1149 case SYNC_MEDIASESSION_CALLBACK_ON_PLAY:
1150 AVSessionEventHandler::GetInstance().AVSessionPostTask([=]() {
1151 AVControlCommand cmd;
1152 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY);
1153 controller->SendControlCommand(cmd);
1154 }, "DelaySendPlayCom", DELAY_PLAY_COM_TIME);
1155 break;
1156 case SYNC_MEDIASESSION_CALLBACK_ON_PAUSE:
1157 cmd.SetCommand(AVControlCommand::SESSION_CMD_PAUSE);
1158 controller->SendControlCommand(cmd);
1159 break;
1160 case SYNC_MEDIASESSION_CALLBACK_ON_STOP:
1161 cmd.SetCommand(AVControlCommand::SESSION_CMD_STOP);
1162 controller->SendControlCommand(cmd);
1163 break;
1164 case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_PREVIOUS:
1165 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_PREVIOUS);
1166 controller->SendControlCommand(cmd);
1167 break;
1168 case SYNC_MEDIASESSION_CALLBACK_ON_SKIP_TO_NEXT:
1169 cmd.SetCommand(AVControlCommand::SESSION_CMD_PLAY_NEXT);
1170 controller->SendControlCommand(cmd);
1171 break;
1172 case SYNC_MEDIASESSION_CALLBACK_ON_SET_RATING:
1173 break;
1174 case SYNC_CONTROLLER_CALLBACK_ON_AUDIOINFO_CHANGED:
1175 break;
1176 default:
1177 SLOGI("mediaCommand is not support: %{public}s", command.c_str());
1178 break;
1179 }
1180 }
1181
OnHistoricalRecordChange()1182 void MigrateAVSessionServer::OnHistoricalRecordChange()
1183 {
1184 SendRemoteHistorySessionList(deviceId_);
1185 }
1186
OnMetaDataChange(const std::string & playerId,const AVMetaData & data)1187 void MigrateAVSessionServer::OnMetaDataChange(const std::string & playerId, const AVMetaData &data)
1188 {
1189 SLOGI("MigrateAVSessionServer OnMetaDataChange: %{public}s",
1190 SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
1191 AVSessionEventHandler::GetInstance().AVSessionPostTask([this]() {
1192 DelaySendMetaData();
1193 }, "DelaySendMetaData", DELAY_METADATA_TIME);
1194 }
1195 // LCOV_EXCL_STOP
1196
OnPlaybackStateChanged(const std::string & playerId,const AVPlaybackState & state)1197 void MigrateAVSessionServer::OnPlaybackStateChanged(const std::string &playerId, const AVPlaybackState &state)
1198 {
1199 cJSON* value = SoftbusSessionUtils::GetNewCJSONObject();
1200 CHECK_AND_RETURN_LOG(value != nullptr, "get value nullptr");
1201 if (cJSON_IsInvalid(value) || cJSON_IsNull(value)) {
1202 SLOGE("get value invalid");
1203 cJSON_Delete(value);
1204 return;
1205 }
1206 if (!SoftbusSessionUtils::AddStringToJson(value, PLAYER_ID, playerId)) {
1207 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1208 PLAYER_ID, SoftbusSessionUtils::AnonymizeDeviceId(playerId).c_str());
1209 cJSON_Delete(value);
1210 return;
1211 }
1212 if (!SoftbusSessionUtils::AddIntToJson(value, MEDIA_INFO,
1213 SYNC_CONTROLLER_CALLBACK_ON_PLAYBACKSTATE_CHANGED)) {
1214 SLOGE("AddIntToJson with key:%{public}s|value:%{public}d fail",
1215 MEDIA_INFO, SYNC_CONTROLLER_CALLBACK_ON_PLAYBACKSTATE_CHANGED);
1216 cJSON_Delete(value);
1217 return;
1218 }
1219 if (!SoftbusSessionUtils::AddStringToJson(value, CALLBACK_INFO, RebuildPlayState(state))) {
1220 SLOGE("AddStringToJson with key:%{public}s|value:%{public}s fail",
1221 CALLBACK_INFO, RebuildPlayState(state).c_str());
1222 cJSON_Delete(value);
1223 return;
1224 }
1225
1226 char header[] = {MSG_HEAD_MODE, SYNC_CONTROLLER, '\0'};
1227 std::string msg;
1228 SoftbusSessionUtils::TransferJsonToStr(value, msg);
1229 cJSON_Delete(value);
1230 std::string result = std::string(header) + msg;
1231 SendByte(deviceId_, result);
1232 }
1233
1234 // LCOV_EXCL_START
OnSessionDestroy()1235 void AVControllerObserver::OnSessionDestroy()
1236 {
1237 SLOGI("OnSessionDestroy");
1238 }
1239
OnPlaybackStateChange(const AVPlaybackState & state)1240 void AVControllerObserver::OnPlaybackStateChange(const AVPlaybackState &state)
1241 {
1242 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
1243 if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
1244 server->HandleFocusPlaybackStateChange(playerId_, state);
1245 return;
1246 }
1247 if (server != nullptr && state.GetState() != AVPlaybackState::PLAYBACK_STATE_INITIAL) {
1248 server->OnPlaybackStateChanged(playerId_, state);
1249 }
1250 }
1251
OnMetaDataChange(const AVMetaData & data)1252 void AVControllerObserver::OnMetaDataChange(const AVMetaData &data)
1253 {
1254 SLOGI("OnMetaDataChange check migrateMode:%{public}d", migrateMode_);
1255 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
1256 if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
1257 server->HandleFocusMetaDataChange(playerId_, data);
1258 return;
1259 }
1260 if (server != nullptr) {
1261 server->OnMetaDataChange(playerId_, data);
1262 }
1263 }
1264
OnValidCommandChange(const std::vector<int32_t> & cmds)1265 void AVControllerObserver::OnValidCommandChange(const std::vector<int32_t> &cmds)
1266 {
1267 std::shared_ptr<MigrateAVSessionServer> server = migrateServer_.lock();
1268 if (server != nullptr && migrateMode_ == MIGRATE_MODE_NEXT) {
1269 server->HandleFocusValidCommandChange(playerId_, cmds);
1270 return;
1271 }
1272 }
1273
Init(std::weak_ptr<MigrateAVSessionServer> migrateServer,int32_t migrateMode)1274 void AVControllerObserver::Init(std::weak_ptr<MigrateAVSessionServer> migrateServer, int32_t migrateMode)
1275 {
1276 migrateServer_ = migrateServer;
1277 migrateMode_ = migrateMode;
1278 }
1279
Release()1280 void AVControllerObserver::Release()
1281 {
1282 migrateServer_.reset();
1283 migrateMode_ = 0;
1284 }
1285 // LCOV_EXCL_STOP
1286 } // namespace OHOS::AVSession