• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 "avcontroller_item.h"
17 #include "ipc_skeleton.h"
18 #include "avsession_errors.h"
19 #include "avsession_log.h"
20 #include "avsession_pixel_map_adapter.h"
21 #include "avsession_trace.h"
22 #include "command_send_limit.h"
23 #include "avsession_utils.h"
24 #include "permission_checker.h"
25 #include "avsession_sysevent.h"
26 #include "want_params.h"
27 #include "string_wrapper.h"
28 
29 #if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) and !defined(IOS_PLATFORM)
30 #include <malloc.h>
31 #endif
32 
33 namespace OHOS::AVSession {
AVControllerItem(pid_t pid,const sptr<AVSessionItem> & session,int32_t userId)34 AVControllerItem::AVControllerItem(pid_t pid, const sptr<AVSessionItem>& session, int32_t userId)
35     : pid_(pid), session_(session), userId_(userId)
36 {
37     std::lock_guard sessionLockGuard(sessionMutex_);
38     if (session_ != nullptr) {
39         sessionId_ = session_->GetSessionId();
40     }
41 }
42 
~AVControllerItem()43 AVControllerItem::~AVControllerItem()
44 {
45 }
46 
GetUserId() const47 int32_t AVControllerItem::GetUserId() const
48 {
49     return userId_;
50 }
51 
RegisterCallbackInner(const sptr<IRemoteObject> & callback)52 int32_t AVControllerItem::RegisterCallbackInner(const sptr<IRemoteObject>& callback)
53 {
54     std::lock_guard lockGuard(callbackMutex_);
55     SLOGD("do register callback for controller %{public}d", static_cast<int>(pid_));
56     callback_ = iface_cast<AVControllerCallbackProxy>(callback);
57     CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "RegisterCallbackInner callback_ is nullptr");
58     return AVSESSION_SUCCESS;
59 }
60 
RegisterAVControllerCallback(const std::shared_ptr<AVControllerCallback> & callback)61 int32_t AVControllerItem::RegisterAVControllerCallback(const std::shared_ptr<AVControllerCallback> &callback)
62 {
63     std::lock_guard lockGuard(callbackMutex_);
64     innerCallback_ = callback;
65     CHECK_AND_RETURN_RET_LOG(innerCallback_ != nullptr, AVSESSION_ERROR, "RegisterCallbackInner callback_ is nullptr");
66     return AVSESSION_SUCCESS;
67 }
68 
UnregisterAVControllerCallback()69 int32_t AVControllerItem::UnregisterAVControllerCallback()
70 {
71     std::lock_guard lockGuard(callbackMutex_);
72     SLOGI("UnregisterAVControllerCallback pid %{public}d", static_cast<int>(pid_));
73     innerCallback_ = nullptr;
74     return AVSESSION_SUCCESS;
75 }
76 
RegisterMigrateAVSessionProxyCallback(const std::function<int32_t (const std::string &,AAFwk::WantParams &)> & callback)77 int32_t AVControllerItem::RegisterMigrateAVSessionProxyCallback(
78     const std::function<int32_t(const std::string&, AAFwk::WantParams&)>& callback)
79 {
80     migrateProxyCallback_ = callback;
81     CHECK_AND_RETURN_RET_LOG(migrateProxyCallback_ != nullptr, AVSESSION_ERROR,
82         "RegisterMigrateAVSessionProxyCallback migrateProxyCallback_ is nullptr");
83     return AVSESSION_SUCCESS;
84 }
85 
GetAVCallMetaData(AVCallMetaData & avCallMetaData)86 int32_t AVControllerItem::GetAVCallMetaData(AVCallMetaData& avCallMetaData)
87 {
88     std::lock_guard lockGuard(sessionMutex_);
89     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
90     avCallMetaData = session_->GetAVCallMetaData();
91     return AVSESSION_SUCCESS;
92 }
93 
GetAVCallState(AVCallState & avCallState)94 int32_t AVControllerItem::GetAVCallState(AVCallState& avCallState)
95 {
96     std::lock_guard lockGuard(sessionMutex_);
97     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
98     avCallState = session_->GetAVCallState();
99     return AVSESSION_SUCCESS;
100 }
101 
102 // LCOV_EXCL_START
GetAVPlaybackState(AVPlaybackState & state)103 int32_t AVControllerItem::GetAVPlaybackState(AVPlaybackState& state)
104 {
105     std::lock_guard lockGuard(sessionMutex_);
106     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
107     state = session_->GetPlaybackState();
108     return AVSESSION_SUCCESS;
109 }
110 // LCOV_EXCL_STOP
111 
ReadImgForMetaData(AVMetaData & data)112 int32_t AVControllerItem::ReadImgForMetaData(AVMetaData& data)
113 {
114     if (!data.GetMetaMask().test(AVMetaData::META_KEY_MEDIA_IMAGE)) {
115         SLOGI("curNoImgFor:%{public}s", data.GetTitle().c_str());
116         return AVSESSION_SUCCESS;
117     }
118     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "SetImgForMetaData session not exist");
119     std::shared_ptr<AVSessionPixelMap> innerPixelMap = data.GetMediaImage();
120     session_->ReadMetaDataImg(innerPixelMap);
121 
122     std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = data.GetAVQueueImage();
123     session_->ReadMetaDataAVQueueImg(avQueuePixelMap);
124     return AVSESSION_SUCCESS;
125 }
126 
GetAVMetaData(AVMetaData & data)127 int32_t AVControllerItem::GetAVMetaData(AVMetaData& data)
128 {
129     std::lock_guard lockGuard(sessionMutex_);
130     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
131     data = session_->GetMetaDataWithoutImg();
132     int32_t ret = ReadImgForMetaData(data);
133     CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "ReadImgForMetaData with ret:%{public}d", ret);
134     if (data.GetMediaImage() != nullptr && !data.GetMediaImageUri().empty()) {
135         SLOGD("isFromSession %{public}d in metaGet", isFromSession_);
136         if (isFromSession_) {
137             data.GetMediaImage()->Clear();
138         } else {
139             return ERR_INVALID_PARAM;
140         }
141     }
142     return AVSESSION_SUCCESS;
143 }
144 
DoMetadataImgClean(AVMetaData & data)145 void AVControllerItem::DoMetadataImgClean(AVMetaData& data)
146 {
147     std::lock_guard metaMaskLockGuard(metaMaskMutex_);
148     SLOGD("still clear media img in DoMetadataImgClean");
149     std::shared_ptr<AVSessionPixelMap> innerQueuePixelMap = data.GetAVQueueImage();
150     AVSessionPixelMapAdapter::CleanAVSessionPixelMap(innerQueuePixelMap);
151     std::shared_ptr<AVSessionPixelMap> innerMediaPixelMap = data.GetMediaImage();
152     AVSessionPixelMapAdapter::CleanAVSessionPixelMap(innerMediaPixelMap);
153 }
154 
155 // LCOV_EXCL_START
GetAVQueueItems(std::vector<AVQueueItem> & items)156 int32_t AVControllerItem::GetAVQueueItems(std::vector<AVQueueItem>& items)
157 {
158     std::lock_guard lockGuard(sessionMutex_);
159     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
160     items = session_->GetQueueItems();
161     return AVSESSION_SUCCESS;
162 }
163 
GetAVQueueTitle(std::string & title)164 int32_t AVControllerItem::GetAVQueueTitle(std::string& title)
165 {
166     std::lock_guard lockGuard(sessionMutex_);
167     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
168     title = session_->GetQueueTitle();
169     return AVSESSION_SUCCESS;
170 }
171 
SkipToQueueItem(int32_t & itemId)172 int32_t AVControllerItem::SkipToQueueItem(int32_t& itemId)
173 {
174     std::lock_guard lockGuard(sessionMutex_);
175     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
176     session_->HandleSkipToQueueItem(itemId);
177     return AVSESSION_SUCCESS;
178 }
179 
GetExtras(AAFwk::WantParams & extras)180 int32_t AVControllerItem::GetExtras(AAFwk::WantParams& extras)
181 {
182     std::lock_guard lockGuard(sessionMutex_);
183     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
184     CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
185         ERR_COMMAND_SEND_EXCEED_MAX, "command send number exceed max");
186     extras = session_->GetExtras();
187     return AVSESSION_SUCCESS;
188 }
189 
GetExtrasWithEvent(const std::string & extraEvent,AAFwk::WantParams & extras)190 int32_t AVControllerItem::GetExtrasWithEvent(const std::string& extraEvent, AAFwk::WantParams& extras)
191 {
192     if (migrateProxyCallback_ != nullptr) {
193         int32_t ret = migrateProxyCallback_(extraEvent, extras);
194         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "extraEvent not support");
195     } else {
196         SLOGI("migrateProxyCallback_ function is nullptr");
197     }
198 
199     std::lock_guard lockGuard(sessionMutex_);
200     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
201 
202     return AVSESSION_SUCCESS;
203 }
204 
SendAVKeyEvent(const MMI::KeyEvent & keyEvent)205 int32_t AVControllerItem::SendAVKeyEvent(const MMI::KeyEvent& keyEvent)
206 {
207     std::lock_guard lockGuard(sessionMutex_);
208     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
209     session_->HandleMediaKeyEvent(keyEvent);
210     return AVSESSION_SUCCESS;
211 }
212 
GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent & ability)213 int32_t AVControllerItem::GetLaunchAbility(AbilityRuntime::WantAgent::WantAgent& ability)
214 {
215     std::lock_guard lockGuard(sessionMutex_);
216     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
217     ability = session_->GetLaunchAbility();
218     return AVSESSION_SUCCESS;
219 }
220 
GetValidCommands(std::vector<int32_t> & cmds)221 int32_t AVControllerItem::GetValidCommands(std::vector<int32_t>& cmds)
222 {
223     std::lock_guard lockGuard(sessionMutex_);
224     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
225     cmds = session_->GetSupportCommand();
226     return AVSESSION_SUCCESS;
227 }
228 // LCOV_EXCL_STOP
229 
IsSessionActive(bool & isActive)230 int32_t AVControllerItem::IsSessionActive(bool& isActive)
231 {
232     std::lock_guard lockGuard(sessionMutex_);
233     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
234     isActive = session_->IsActive();
235     return AVSESSION_SUCCESS;
236 }
237 
238 // LCOV_EXCL_START
SendControlCommand(const AVControlCommand & cmd)239 int32_t AVControllerItem::SendControlCommand(const AVControlCommand& cmd)
240 {
241     std::lock_guard lockGuard(sessionMutex_);
242     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "session not exist");
243     std::vector<int32_t> cmds = session_->GetSupportCommand();
244     if (std::find(cmds.begin(), cmds.end(), cmd.GetCommand()) == cmds.end()) {
245         SLOGE("The command that needs to be sent is not supported.");
246         return ERR_COMMAND_NOT_SUPPORT;
247     }
248     CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
249         ERR_COMMAND_SEND_EXCEED_MAX, "command send number exceed max");
250     session_->ExecuteControllerCommand(cmd);
251     return AVSESSION_SUCCESS;
252 }
253 // LCOV_EXCL_STOP
254 
SendCommonCommand(const std::string & commonCommand,const AAFwk::WantParams & commandArgs)255 int32_t AVControllerItem::SendCommonCommand(const std::string& commonCommand, const AAFwk::WantParams& commandArgs)
256 {
257     if (migrateProxyCallback_ != nullptr) {
258         int32_t ret = migrateProxyCallback_(commonCommand, const_cast<AAFwk::WantParams&>(commandArgs));
259         CHECK_AND_RETURN_RET_LOG(ret == AVSESSION_SUCCESS, ret, "extraEvent not support");
260     } else {
261         SLOGI("migrateProxyCallback_ function is nullptr");
262     }
263 
264     std::lock_guard lockGuard(sessionMutex_);
265     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "Session not exist");
266     CHECK_AND_RETURN_RET_LOG(CommandSendLimit::GetInstance().IsCommandSendEnable(OHOS::IPCSkeleton::GetCallingPid()),
267         ERR_COMMAND_SEND_EXCEED_MAX, "common command send number exceed max");
268     session_->ExecueCommonCommand(commonCommand, commandArgs);
269     return AVSESSION_SUCCESS;
270 }
271 
SendCustomData(const AAFwk::WantParams & data)272 int32_t AVControllerItem::SendCustomData(const AAFwk::WantParams& data)
273 {
274     std::lock_guard lockGuard(sessionMutex_);
275     CHECK_AND_RETURN_RET_LOG(data.HasParam("customData"), AVSESSION_ERROR, "Params don't have customData");
276     auto value = data.GetParam("customData");
277     AAFwk::IString* stringValue = AAFwk::IString::Query(value);
278     CHECK_AND_RETURN_RET_LOG(stringValue != nullptr, AVSESSION_ERROR, "customData is an invalid string");
279     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, ERR_SESSION_NOT_EXIST, "Session not exist");
280     session_->ExecuteCustomData(data);
281     return AVSESSION_SUCCESS;
282 }
283 
284 // LCOV_EXCL_START
SetAVCallMetaFilter(const AVCallMetaData::AVCallMetaMaskType & filter)285 int32_t AVControllerItem::SetAVCallMetaFilter(const AVCallMetaData::AVCallMetaMaskType& filter)
286 {
287     std::lock_guard lockGuard(avCallMetaMaskMutex_);
288     avCallMetaMask_ = filter;
289     return AVSESSION_SUCCESS;
290 }
291 
SetAVCallStateFilter(const AVCallState::AVCallStateMaskType & filter)292 int32_t AVControllerItem::SetAVCallStateFilter(const AVCallState::AVCallStateMaskType& filter)
293 {
294     std::lock_guard lockGuard(avCallStateMaskMutex_);
295     avCallStateMask_ = filter;
296     return AVSESSION_SUCCESS;
297 }
298 
SetMetaFilter(const AVMetaData::MetaMaskType & filter)299 int32_t AVControllerItem::SetMetaFilter(const AVMetaData::MetaMaskType& filter)
300 {
301     std::lock_guard lockGuard(metaMaskMutex_);
302     metaMask_ = filter;
303     return AVSESSION_SUCCESS;
304 }
305 
SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType & filter)306 int32_t AVControllerItem::SetPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType& filter)
307 {
308     std::lock_guard lockGuard(playbackMaskMutex_);
309     playbackMask_ = filter;
310     return AVSESSION_SUCCESS;
311 }
312 // LCOV_EXCL_STOP
313 
Destroy()314 int32_t AVControllerItem::Destroy()
315 {
316     if (sessionId_ == "DEFAULT") {
317         SLOGE("controller create inside can not be destroy from outside");
318         return AVSESSION_SUCCESS;
319     }
320     SLOGI("controller destroyed for pid %{public}d", static_cast<int>(pid_));
321     {
322         std::lock_guard callbackLockGuard(callbackMutex_);
323         callback_ = nullptr;
324         innerCallback_ = nullptr;
325     }
326 
327     {
328         std::lock_guard serviceCallbacklockGuard(serviceCallbackMutex_);
329         if (serviceCallback_) {
330             serviceCallback_(*this);
331         }
332     }
333 
334     {
335         std::lock_guard sessionLockGuard(sessionMutex_);
336         if (session_ != nullptr) {
337             session_->HandleControllerRelease(pid_);
338             session_ = nullptr;
339             sessionId_.clear();
340         }
341     }
342 
343     return AVSESSION_SUCCESS;
344 }
345 
DestroyWithoutReply()346 int32_t AVControllerItem::DestroyWithoutReply()
347 {
348     SLOGI("do controller DestroyWithoutReply for pid %{public}d", static_cast<int>(pid_));
349     {
350         std::lock_guard callbackLockGuard(callbackMutex_);
351         innerCallback_ = nullptr;
352         callback_ = nullptr;
353     }
354     {
355         std::lock_guard sessionLockGuard(sessionMutex_);
356         if (session_ != nullptr) {
357             session_->HandleControllerRelease(pid_);
358             sessionId_.clear();
359             session_ = nullptr;
360         }
361     }
362     return AVSESSION_SUCCESS;
363 }
364 
365 // LCOV_EXCL_START
GetSessionId()366 std::string AVControllerItem::GetSessionId()
367 {
368     std::lock_guard sessionLockGuard(sessionMutex_);
369     return sessionId_;
370 }
371 // LCOV_EXCL_STOP
372 
GetElementOfSession()373 AppExecFwk::ElementName AVControllerItem::GetElementOfSession()
374 {
375     std::lock_guard sessionLockGuard(sessionMutex_);
376     AppExecFwk::ElementName elementOfSession;
377     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, elementOfSession, "session not exist");
378     elementOfSession.SetBundleName(session_->GetBundleName());
379     elementOfSession.SetAbilityName(session_->GetAbilityName());
380     return elementOfSession;
381 }
382 
HandleSessionDestroy()383 void AVControllerItem::HandleSessionDestroy()
384 {
385     {
386         std::lock_guard callbackLockGuard(callbackMutex_);
387         if (callback_ != nullptr) {
388             callback_->OnSessionDestroy();
389         }
390         if (innerCallback_ != nullptr) {
391             innerCallback_->OnSessionDestroy();
392         }
393     }
394     std::lock_guard sessionLockGuard(sessionMutex_);
395     session_ = nullptr;
396     sessionId_.clear();
397 }
398 
399 // LCOV_EXCL_START
HandleAVCallStateChange(const AVCallState & avCallState)400 void AVControllerItem::HandleAVCallStateChange(const AVCallState& avCallState)
401 {
402     std::lock_guard callbackLockGuard(callbackMutex_);
403     AVCallState stateOut;
404     std::lock_guard avCallStateLockGuard(avCallStateMaskMutex_);
405     if (avCallState.CopyToByMask(avCallStateMask_, stateOut)) {
406         SLOGI("update avcall state");
407         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnAVCallStateChange");
408         if (callback_ != nullptr) {
409             callback_->OnAVCallStateChange(stateOut);
410         }
411         if (innerCallback_ != nullptr) {
412             innerCallback_->OnAVCallStateChange(stateOut);
413         }
414     }
415 }
416 
HandleAVCallMetaDataChange(const AVCallMetaData & avCallMetaData)417 void AVControllerItem::HandleAVCallMetaDataChange(const AVCallMetaData& avCallMetaData)
418 {
419     std::lock_guard callbackLockGuard(callbackMutex_);
420     AVCallMetaData metaOut;
421     std::lock_guard avCallMetaDataMaskLockGuard(avCallMetaMaskMutex_);
422     if (avCallMetaData.CopyToByMask(avCallMetaMask_, metaOut)) {
423         if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_MEDIA_IMAGE)) {
424             std::shared_ptr<AVSessionPixelMap> innerPixelMap = nullptr;
425             if (metaOut.GetMediaImage() != nullptr && session_ != nullptr) {
426                 innerPixelMap = metaOut.GetMediaImage();
427                 session_->ReadMetaDataImg(innerPixelMap);
428             }
429             metaOut.SetMediaImage(innerPixelMap);
430         }
431 
432         if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_NAME)) {
433             metaOut.SetName(avCallMetaData.GetName());
434         }
435 
436         if (avCallMetaMask_.test(AVCallMetaData::AVCALL_META_KEY_PHONE_NUMBER)) {
437             metaOut.SetPhoneNumber(avCallMetaData.GetPhoneNumber());
438         }
439         SLOGI("update avcall meta data");
440     }
441 
442     if (callback_ != nullptr) {
443         callback_->OnAVCallMetaDataChange(metaOut);
444     }
445     if (innerCallback_ != nullptr) {
446         innerCallback_->OnAVCallMetaDataChange(metaOut);
447     }
448     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnAVCallMetaDataChange");
449 }
450 
HandlePlaybackStateChange(const AVPlaybackState & state)451 void AVControllerItem::HandlePlaybackStateChange(const AVPlaybackState& state)
452 {
453     std::lock_guard callbackLockGuard(callbackMutex_);
454     AVPlaybackState stateOut;
455     std::lock_guard playbackLockGuard(playbackMaskMutex_);
456     if (state.CopyToByMask(playbackMask_, stateOut)) {
457         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnPlaybackStateChange");
458         if (callback_ != nullptr) {
459             callback_->OnPlaybackStateChange(stateOut);
460         }
461         if (innerCallback_ != nullptr) {
462             innerCallback_->OnPlaybackStateChange(stateOut);
463         }
464     }
465 }
466 
HandleMetaDataChange(const AVMetaData & data)467 void AVControllerItem::HandleMetaDataChange(const AVMetaData& data)
468 {
469     std::lock_guard callbackLockGuard(callbackMutex_);
470     AVMetaData metaOut;
471     std::lock_guard metaMaskLockGuard(metaMaskMutex_);
472     if (data.CopyToByMask(metaMask_, metaOut)) {
473         if ((metaMask_.test(AVMetaData::META_KEY_MEDIA_IMAGE)) && (metaOut.GetMediaImage() != nullptr)) {
474             CHECK_AND_RETURN_LOG(session_ != nullptr, "Session not exist");
475             std::shared_ptr<AVSessionPixelMap> innerPixelMap = metaOut.GetMediaImage();
476             session_->ReadMetaDataImg(innerPixelMap);
477             metaOut.SetMediaImage(innerPixelMap);
478         }
479         if ((metaMask_.test(AVMetaData::META_KEY_AVQUEUE_IMAGE)) && (metaOut.GetAVQueueImage() != nullptr)) {
480             CHECK_AND_RETURN_LOG(session_ != nullptr, "Session not exist");
481             std::shared_ptr<AVSessionPixelMap> avQueuePixelMap = metaOut.GetAVQueueImage();
482             session_->ReadMetaDataAVQueueImg(avQueuePixelMap);
483             metaOut.SetAVQueueImage(avQueuePixelMap);
484         }
485         if (!metaMask_.test(AVMetaData::META_KEY_ASSET_ID)) {
486             metaOut.SetAssetId(data.GetAssetId());
487         }
488         SLOGI("update metaData pid %{public}d, title %{public}s", static_cast<int>(pid_), metaOut.GetTitle().c_str());
489         AVSESSION_TRACE_SYNC_START("AVControllerItem::OnMetaDataChange");
490         if (metaOut.GetMediaImage() != nullptr && !metaOut.GetMediaImageUri().empty()) {
491             SLOGI("isFromSession %{public}d in metaChange", isFromSession_);
492             if (isFromSession_) {
493                 metaOut.GetMediaImage()->Clear();
494             } else {
495                 metaOut.SetMediaImageUri("");
496             }
497         }
498         if (callback_ != nullptr) {
499             callback_->OnMetaDataChange(metaOut);
500         }
501         if (innerCallback_ != nullptr) {
502             innerCallback_->OnMetaDataChange(metaOut);
503         }
504     }
505     std::shared_ptr<AVSessionPixelMap> innerQueuePixelMap = metaOut.GetAVQueueImage();
506     if (innerQueuePixelMap != nullptr) {
507         innerQueuePixelMap->Clear();
508     }
509     std::shared_ptr<AVSessionPixelMap> innerMediaPixelMap = metaOut.GetMediaImage();
510     if (innerMediaPixelMap != nullptr) {
511         innerMediaPixelMap->Clear();
512     }
513 }
514 
HandleOutputDeviceChange(const int32_t connectionState,const OutputDeviceInfo & outputDeviceInfo)515 void AVControllerItem::HandleOutputDeviceChange(const int32_t connectionState, const OutputDeviceInfo& outputDeviceInfo)
516 {
517     std::lock_guard lockGuard(callbackMutex_);
518     if (callback_ != nullptr) {
519         callback_->OnOutputDeviceChange(connectionState, outputDeviceInfo);
520     }
521 }
522 // LCOV_EXCL_STOP
523 
HandleActiveStateChange(bool isActive)524 void AVControllerItem::HandleActiveStateChange(bool isActive)
525 {
526     std::lock_guard lockGuard(callbackMutex_);
527     if (callback_ != nullptr) {
528         callback_->OnActiveStateChange(isActive);
529     }
530 }
531 
532 // LCOV_EXCL_START
HandleValidCommandChange(const std::vector<int32_t> & cmds)533 void AVControllerItem::HandleValidCommandChange(const std::vector<int32_t>& cmds)
534 {
535     std::lock_guard lockGuard(callbackMutex_);
536     SLOGD("do OnValidCommandChange with pid %{public}d cmd list size %{public}d",
537         static_cast<int>(pid_), static_cast<int>(cmds.size()));
538     if (callback_ != nullptr) {
539         callback_->OnValidCommandChange(cmds);
540     }
541     if (innerCallback_ != nullptr) {
542         innerCallback_->OnValidCommandChange(cmds);
543     }
544 }
545 // LCOV_EXCL_STOP
546 
HandleSetSessionEvent(const std::string & event,const AAFwk::WantParams & args)547 void AVControllerItem::HandleSetSessionEvent(const std::string& event, const AAFwk::WantParams& args)
548 {
549     std::lock_guard lockGuard(callbackMutex_);
550     if (callback_ != nullptr) {
551         callback_->OnSessionEventChange(event, args);
552     }
553 }
554 
555 // LCOV_EXCL_START
HandleQueueItemsChange(const std::vector<AVQueueItem> & items)556 void AVControllerItem::HandleQueueItemsChange(const std::vector<AVQueueItem>& items)
557 {
558     std::lock_guard lockGuard(callbackMutex_);
559     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueItemsChange");
560     if (callback_ != nullptr) {
561         callback_->OnQueueItemsChange(items);
562     }
563 }
564 
HandleQueueTitleChange(const std::string & title)565 void AVControllerItem::HandleQueueTitleChange(const std::string& title)
566 {
567     std::lock_guard lockGuard(callbackMutex_);
568     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnQueueTitleChange");
569     if (callback_ != nullptr) {
570         callback_->OnQueueTitleChange(title);
571     }
572 }
573 
HandleExtrasChange(const AAFwk::WantParams & extras)574 void AVControllerItem::HandleExtrasChange(const AAFwk::WantParams& extras)
575 {
576     std::lock_guard lockGuard(callbackMutex_);
577     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnSetExtras");
578     if (callback_ != nullptr) {
579         callback_->OnExtrasChange(extras);
580     }
581 }
582 // LCOV_EXCL_STOP
583 
HandleCustomData(const AAFwk::WantParams & data)584 void AVControllerItem::HandleCustomData(const AAFwk::WantParams& data)
585 {
586     std::lock_guard lockGuard(callbackMutex_);
587     AVSESSION_TRACE_SYNC_START("AVControllerItem::OnCustomData");
588     if (callback_ != nullptr) {
589         callback_->OnCustomData(data);
590     }
591 }
592 
GetPid() const593 pid_t AVControllerItem::GetPid() const
594 {
595     return pid_;
596 }
597 
HasSession(const std::string & sessionId)598 bool AVControllerItem::HasSession(const std::string& sessionId)
599 {
600     std::lock_guard sessionLockGuard(sessionMutex_);
601     return sessionId_ == sessionId;
602 }
603 
SetServiceCallbackForRelease(const std::function<void (AVControllerItem &)> & callback)604 void AVControllerItem::SetServiceCallbackForRelease(const std::function<void(AVControllerItem&)>& callback)
605 {
606     std::lock_guard lockGuard(serviceCallbackMutex_);
607     serviceCallback_ = callback;
608 }
609 
GetSessionType()610 std::string AVControllerItem::GetSessionType()
611 {
612     std::lock_guard lockGuard(sessionMutex_);
613     CHECK_AND_RETURN_RET_LOG(session_ != nullptr, "SESSION_NULL", "session not exist");
614     std::string sessionTypeStr = session_->GetSessionType();
615     return sessionTypeStr;
616 }
617 } // namespace OHOS::AVSession
618