• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "avcast_controller_item.h"
17 #include "avsession_radar.h"
18 #include "avsession_errors.h"
19 #include "avsession_log.h"
20 #include "avsession_trace.h"
21 #include "av_router.h"
22 #include "avsession_sysevent.h"
23 #include "avmedia_description.h"
24 #include "bundle_status_adapter.h"
25 #include "avsession_event_handler.h"
26 #include "avsession_utils.h"
27 #include "cast_engine_common.h"
28 #include "cast_shared_memory_base.h"
29 #include "securec.h"
30 
31 #include <string>
32 
33 namespace OHOS::AVSession {
AVCastControllerItem()34 AVCastControllerItem::AVCastControllerItem()
35 {
36 }
37 
~AVCastControllerItem()38 AVCastControllerItem::~AVCastControllerItem()
39 {
40 }
41 
Init(std::shared_ptr<IAVCastControllerProxy> castControllerProxy,const std::function<void (int32_t,std::vector<int32_t> &)> & validCommandsChangecallback,const std::function<void ()> & preparecallback)42 void AVCastControllerItem::Init(std::shared_ptr<IAVCastControllerProxy> castControllerProxy,
43     const std::function<void(int32_t, std::vector<int32_t>&)>& validCommandsChangecallback,
44     const std::function<void()>& preparecallback)
45 {
46     std::lock_guard lockGuard(castControllerLock_);
47     castControllerProxy_ = castControllerProxy;
48     if (castControllerProxy_ != nullptr) {
49         castControllerProxy_->RegisterControllerListener(shared_from_this());
50     }
51     validCommandsChangecallback_ = validCommandsChangecallback;
52     preparecallback_ = preparecallback;
53     {
54         std::lock_guard<std::mutex> lock(callbackToSessionLock_);
55         isSessionCallbackAvailable_ = true;
56     }
57 }
58 
IsStopState(int32_t playbackState)59 bool AVCastControllerItem::IsStopState(int32_t playbackState)
60 {
61     return playbackState == AVPlaybackState::PLAYBACK_STATE_PAUSE ||
62         playbackState == AVPlaybackState::PLAYBACK_STATE_STOP ||
63         playbackState == AVPlaybackState::PLAYBACK_STATE_RELEASED ||
64         playbackState == AVPlaybackState::PLAYBACK_STATE_ERROR;
65 }
66 
CheckIfCancelCastCapsule()67 void AVCastControllerItem::CheckIfCancelCastCapsule()
68 {
69     if (IsStopState(currentState_)) {
70         isPlayingState_ = false;
71         CHECK_AND_RETURN_LOG(castControllerProxy_ != nullptr, "CheckIfCancelCast castcontrollerproxy is nullptr");
72         AVSessionEventHandler::GetInstance().AVSessionRemoveTask("CancelCastCapsule");
73         AVSessionEventHandler::GetInstance().AVSessionPostTask(
74             [this]() {
75                 CHECK_AND_RETURN_LOG(castControllerProxy_ != nullptr, "delCastCapsule castcontrollerproxy is nullptr");
76                 if (sessionCallbackForCastNtf_ && !isPlayingState_) {
77                     SLOGI("MediaCapsule delCastCapsule isPlayingState_ %{public}d", isPlayingState_);
78                     sessionCallbackForCastNtf_(sessionId_, false, false);
79                 }
80             }, "CancelCastCapsule", cancelTimeout);
81     }
82 }
83 
OnCastPlaybackStateChange(const AVPlaybackState & state)84 void AVCastControllerItem::OnCastPlaybackStateChange(const AVPlaybackState& state)
85 {
86     SLOGI("State:%{public}d", state.GetState());
87     if (state.GetState() != currentState_) {
88         currentState_ = state.GetState();
89         if (state.GetState() == AVPlaybackState::PLAYBACK_STATE_PLAY) {
90             AVSessionRadarInfo info("AVCastControllerItem::OnCastPlaybackStateChange");
91             AVSessionRadar::GetInstance().PlayerStarted(info);
92             // play state try notify notification
93             isPlayingState_ = true;
94             if ((castControllerProxy_ != nullptr) && sessionCallbackForCastNtf_) {
95                 SLOGI("MediaCapsule addCastCapsule by play");
96                 sessionCallbackForCastNtf_(sessionId_, true, false);
97             }
98         } else {
99             CheckIfCancelCastCapsule();
100             AVSessionRadarInfo info("AVCastControllerItem::OnCastPlaybackStateChange");
101             AVSessionRadar::GetInstance().ControlCommandRespond(info);
102         }
103     }
104     AVPlaybackState stateOut;
105     std::lock_guard lockGuard(castControllerCallbackLock_);
106     if (state.CopyToByMask(castPlaybackMask_, stateOut)) {
107         SLOGD("update cast playback state");
108         AVSESSION_TRACE_SYNC_START("AVCastControllerItem::OnCastPlaybackStateChange");
109         if (callback_ != nullptr) {
110             callback_->OnCastPlaybackStateChange(stateOut);
111         }
112     }
113 }
114 
OnMediaItemChange(const AVQueueItem & avQueueItem)115 void AVCastControllerItem::OnMediaItemChange(const AVQueueItem& avQueueItem)
116 {
117     SLOGI("Enter OnMediaItemChange in AVCastControllerItem.");
118     std::lock_guard lockGuard(castControllerCallbackLock_);
119     if (callback_ != nullptr) {
120         callback_->OnMediaItemChange(avQueueItem);
121     }
122 }
123 
OnPlayNext()124 void AVCastControllerItem::OnPlayNext()
125 {
126     SLOGI("Enter OnPlayNext in AVCastControllerItem.");
127     AVSessionRadarInfo info("AVCastControllerItem::OnPlayNext");
128     AVSessionRadar::GetInstance().ControlCommandRespond(info);
129     std::lock_guard lockGuard(castControllerCallbackLock_);
130     if (callback_ != nullptr) {
131         callback_->OnPlayNext();
132     }
133 }
134 
OnPlayPrevious()135 void AVCastControllerItem::OnPlayPrevious()
136 {
137     SLOGI("Enter OnPlayPrevious in AVCastControllerItem.");
138     AVSessionRadarInfo info("AVCastControllerItem::OnPlayPrevious");
139     AVSessionRadar::GetInstance().ControlCommandRespond(info);
140     std::lock_guard lockGuard(castControllerCallbackLock_);
141     if (callback_ != nullptr) {
142         callback_->OnPlayPrevious();
143     }
144 }
145 
OnSeekDone(const int32_t seekNumber)146 void AVCastControllerItem::OnSeekDone(const int32_t seekNumber)
147 {
148     SLOGI("Enter OnSeekDone in AVCastControllerItem.");
149     AVSessionRadarInfo info("AVCastControllerItem::OnSeekDone");
150     AVSessionRadar::GetInstance().ControlCommandRespond(info);
151     std::lock_guard lockGuard(castControllerCallbackLock_);
152     if (callback_ != nullptr) {
153         callback_->OnSeekDone(seekNumber);
154     }
155 }
156 
OnVideoSizeChange(const int32_t width,const int32_t height)157 void AVCastControllerItem::OnVideoSizeChange(const int32_t width, const int32_t height)
158 {
159     SLOGI("Enter OnVideoSizeChange in AVCastControllerItem.");
160     std::lock_guard lockGuard(castControllerCallbackLock_);
161     if (callback_ != nullptr) {
162         callback_->OnVideoSizeChange(width, height);
163     }
164 }
165 
OnPlayerError(const int32_t errorCode,const std::string & errorMsg)166 void AVCastControllerItem::OnPlayerError(const int32_t errorCode, const std::string& errorMsg)
167 {
168     SLOGI("OnPlayerError error:%{public}d", errorCode);
169     AVSessionRadarInfo info("AVCastControllerItem::OnPlayerError");
170     info.errorCode_ = errorCode;
171     AVSessionRadar::GetInstance().ControlCommandError(info);
172     std::lock_guard lockGuard(castControllerCallbackLock_);
173     if (callback_ != nullptr) {
174         callback_->OnPlayerError(errorCode, errorMsg);
175     }
176 }
177 
OnEndOfStream(const int32_t isLooping)178 void AVCastControllerItem::OnEndOfStream(const int32_t isLooping)
179 {
180     SLOGI("Enter OnEndOfStream in AVCastControllerItem.");
181     std::lock_guard lockGuard(castControllerCallbackLock_);
182     if (callback_ != nullptr) {
183         callback_->OnEndOfStream(isLooping);
184     }
185 }
186 
OnPlayRequest(const AVQueueItem & avQueueItem)187 void AVCastControllerItem::OnPlayRequest(const AVQueueItem& avQueueItem)
188 {
189     SLOGI("Enter OnPlayRequest in AVCastControllerItem.");
190     AVSessionRadarInfo info("AVCastControllerItem::OnPlayRequest");
191     AVSessionRadar::GetInstance().ControlCommandRespond(info);
192     std::lock_guard lockGuard(castControllerCallbackLock_);
193     if (callback_ != nullptr) {
194         callback_->OnPlayRequest(avQueueItem);
195     }
196 }
197 
OnKeyRequest(const std::string & assetId,const std::vector<uint8_t> & keyRequestData)198 void AVCastControllerItem::OnKeyRequest(const std::string &assetId, const std::vector<uint8_t> &keyRequestData)
199 {
200     SLOGI("Enter OnKeyRequest in AVCastControllerItem.");
201     std::lock_guard lockGuard(castControllerCallbackLock_);
202     if (callback_ != nullptr) {
203         callback_->OnKeyRequest(assetId, keyRequestData);
204     }
205 }
206 
OnValidCommandChange(const std::vector<int32_t> & cmds)207 void AVCastControllerItem::OnValidCommandChange(const std::vector<int32_t>& cmds)
208 {
209     HandleCastValidCommandChange(cmds);
210 }
211 
onDataSrcRead(std::shared_ptr<AVSharedMemory> mem,uint32_t length,int64_t pos)212 int32_t AVCastControllerItem::onDataSrcRead(std::shared_ptr<AVSharedMemory> mem, uint32_t length, int64_t pos)
213 {
214     if (callback_ != nullptr) {
215         return callback_->onDataSrcRead(mem, length, pos);
216     }
217     return 0;
218 }
219 
SendControlCommand(const AVCastControlCommand & cmd)220 int32_t AVCastControllerItem::SendControlCommand(const AVCastControlCommand& cmd)
221 {
222     SLOGI("Call SendControlCommand of cast controller proxy");
223     std::lock_guard lockGuard(castControllerLock_);
224     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
225     AVSessionRadarInfo info("AVCastControllerItem::SendControlCommand");
226     AVSessionRadar::GetInstance().SendControlCommandBegin(info);
227     castControllerProxy_->SendControlCommand(cmd);
228     AVSessionRadar::GetInstance().SendControlCommandEnd(info);
229     std::string apiParamString = "cmd: " + std::to_string(cmd.GetCommand());
230     HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
231         "API_NAME", "SendControlCommand",
232         "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
233         "API_PARAM", apiParamString,
234         "ERROR_CODE", AVSESSION_SUCCESS,
235         "ERROR_MSG", "SUCCESS");
236     return AVSESSION_SUCCESS;
237 }
238 
Start(const AVQueueItem & avQueueItem)239 int32_t AVCastControllerItem::Start(const AVQueueItem& avQueueItem)
240 {
241     std::lock_guard lockGuard(castControllerLock_);
242     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
243     AVSessionRadarInfo info("AVCastControllerItem::Start");
244     SetQueueItemDataSrc(avQueueItem);
245     int32_t ret = castControllerProxy_->Start(avQueueItem);
246     std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "start failed";
247     std::string mediaIcon = "false";
248     std::string apiParamString = "";
249     std::string startPosition = "";
250     std::string duration = "";
251     std::string mediauri = "";
252     if (avQueueItem.GetDescription() != nullptr) {
253         startPosition = std::to_string(avQueueItem.GetDescription()->GetStartPosition());
254         duration =  std::to_string(avQueueItem.GetDescription()->GetDuration());
255         if (avQueueItem.GetDescription()->GetIcon() != nullptr ||
256             !(avQueueItem.GetDescription()->GetIconUri().empty())) {
257             mediaIcon = "true";
258         }
259         mediauri = avQueueItem.GetDescription()->GetMediaUri().empty() ? "false" : "true";
260         apiParamString = "mediauri: " + mediauri + "," + "iconImage: " + mediaIcon + ","
261                                         + "mediaId: " + avQueueItem.GetDescription()->GetMediaId() + ","
262                                         + "title: " + avQueueItem.GetDescription()->GetTitle() + ","
263                                         + "subtitle: " + avQueueItem.GetDescription()->GetSubtitle() + ","
264                                         + "mediaType: " + avQueueItem.GetDescription()->GetMediaType() + ","
265                                         + "startPosition: " + startPosition + ","
266                                         + "duration: " + duration;
267     }
268     HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
269         "API_NAME", "Start",
270         "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
271         "API_PARAM", apiParamString,
272         "ERROR_CODE", ret,
273         "ERROR_MSG", errMsg);
274     if (ret != AVSESSION_SUCCESS) {
275         info.errorCode_ = AVSessionRadar::GetRadarErrorCode(ret);
276         AVSessionRadar::GetInstance().StartPlayFailed(info);
277     } else {
278         AVSessionRadar::GetInstance().StartPlayBegin(info);
279     }
280     return AVSESSION_SUCCESS;
281 }
282 
ReportPrepare(int32_t preRet,const AVQueueItem & avQueueItem)283 void AVCastControllerItem::ReportPrepare(int32_t preRet, const AVQueueItem& avQueueItem)
284 {
285     std::string errMsg = (preRet == AVSESSION_SUCCESS) ? "SUCCESS" : "prepare failed";
286     std::string mediaIcon = "false";
287     std::string apiParamString = "";
288     std::string startPosition = "";
289     std::string duration = "";
290     std::string mediauri = "";
291     if (avQueueItem.GetDescription() != nullptr) {
292         startPosition = std::to_string(avQueueItem.GetDescription()->GetStartPosition());
293         duration =  std::to_string(avQueueItem.GetDescription()->GetDuration());
294         if (avQueueItem.GetDescription()->GetIcon() != nullptr ||
295             !(avQueueItem.GetDescription()->GetIconUri().empty())) {
296             mediaIcon = "true";
297         }
298         mediauri = avQueueItem.GetDescription()->GetMediaUri().empty() ? "false" : "true";
299         apiParamString = "mediauri: " + mediauri + "," + "iconImage: " + mediaIcon + ","
300                                         + "mediaId: " + avQueueItem.GetDescription()->GetMediaId() + ","
301                                         + "title: " + avQueueItem.GetDescription()->GetTitle() + ","
302                                         + "subtitle: " + avQueueItem.GetDescription()->GetSubtitle() + ","
303                                         + "mediaType: " + avQueueItem.GetDescription()->GetMediaType() + ","
304                                         + "startPosition: " + startPosition + ","
305                                         + "duration: " + duration;
306     }
307     HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
308         "API_NAME", "Prepare",
309         "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
310         "API_PARAM", apiParamString,
311         "ERROR_CODE", preRet,
312         "ERROR_MSG", errMsg);
313 }
314 
Prepare(const AVQueueItem & avQueueItem)315 int32_t AVCastControllerItem::Prepare(const AVQueueItem& avQueueItem)
316 {
317     SLOGI("Call prepare of cast controller proxy");
318     std::lock_guard lockGuard(castControllerLock_);
319     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
320     SetQueueItemDataSrc(avQueueItem);
321     auto ret = castControllerProxy_->Prepare(avQueueItem);
322     if (avQueueItem.GetDescription() != nullptr && (avQueueItem.GetDescription()->GetIcon() != nullptr &&
323         avQueueItem.GetDescription()->GetIconUri() == "URI_CACHE")) {
324         SLOGI("MediaCapsule prepare icon, isPlayingState_ %{public}d", isPlayingState_);
325         std::string fileDir = AVSessionUtils::GetCachePathName(userId_);
326         AVSessionUtils::WriteImageToFile(avQueueItem.GetDescription()->GetIcon(),
327             fileDir, sessionId_ + AVSessionUtils::GetFileSuffix());
328         if (sessionCallbackForCastNtf_ && isPlayingState_) {
329             sessionCallbackForCastNtf_(sessionId_, true, true);
330         }
331         return AVSESSION_SUCCESS;
332     }
333     ReportPrepare(ret, avQueueItem);
334     preparecallback_();
335     return AVSESSION_SUCCESS;
336 }
337 
SetQueueItemDataSrc(const AVQueueItem & avQueueItem)338 void AVCastControllerItem::SetQueueItemDataSrc(const AVQueueItem& avQueueItem)
339 {
340     if (avQueueItem.GetDescription() != nullptr && avQueueItem.GetDescription()->GetDataSrc().hasCallback) {
341         AVDataSrcDescriptor dataSrc = avQueueItem.GetDescription()->GetDataSrc();
342         AVDataSrcDescriptor dataSrcNew;
343         dataSrcNew.hasCallback = dataSrc.hasCallback;
344         dataSrcNew.fileSize = dataSrc.fileSize;
345         dataSrcNew.callback_ =
346             [this](void* ptr, uint32_t length, int64_t pos) -> int32_t {
347                 CastEngine::CastSharedMemoryBase* memPtr = static_cast<CastEngine::CastSharedMemoryBase*>(ptr);
348                 SLOGE("called dataSrc callback mem size %{public}d", memPtr->GetSize());
349                 std::shared_ptr<AVSharedMemory> mem = AVSharedMemoryBase::CreateFromLocal(memPtr->GetSize(),
350                     memPtr->GetFlags(), memPtr->GetName());
351                 int32_t readSize = onDataSrcRead(mem, length, pos);
352                 errno_t rc = memcpy_s(memPtr->GetBase(), static_cast<size_t>(mem->GetSize()), mem->GetBase(),
353                     static_cast<size_t>(readSize));
354                 if (rc != EOK) {
355                     SLOGE("ReadAt error");
356                 }
357                 return readSize;
358             };
359         avQueueItem.GetDescription()->SetDataSrc(dataSrcNew);
360     }
361 }
362 
GetDuration(int32_t & duration)363 int32_t AVCastControllerItem::GetDuration(int32_t& duration)
364 {
365     std::lock_guard lockGuard(castControllerLock_);
366     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
367     return castControllerProxy_->GetDuration(duration);
368 }
369 
GetCastAVPlaybackState(AVPlaybackState & avPlaybackState)370 int32_t AVCastControllerItem::GetCastAVPlaybackState(AVPlaybackState& avPlaybackState)
371 {
372     std::lock_guard lockGuard(castControllerLock_);
373     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
374     auto ret = castControllerProxy_->GetCastAVPlaybackState(avPlaybackState);
375     std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "GetCastAVPlaybackState failed";
376     int64_t avElapsedTime = avPlaybackState.GetPosition().elapsedTime_;
377     int64_t avUpdateTime = avPlaybackState.GetPosition().updateTime_;
378     std::string isFavor = avPlaybackState.GetFavorite() ? "true" : "false";
379     std::string apiParamString = "state: " + std::to_string(avPlaybackState.GetState()) + ", "
380                                     + "elapsedTime: " + std::to_string(avElapsedTime) + ", "
381                                     + "updateTime: " + std::to_string(avUpdateTime) + ", "
382                                     + "loopMode: " + std::to_string(avPlaybackState.GetLoopMode()) + ", "
383                                     + "isFavorite: " + isFavor;
384     HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
385         "API_NAME", "GetCastAVPlaybackState",
386         "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
387         "API_PARAM", apiParamString,
388         "ERROR_CODE", ret,
389         "ERROR_MSG", errMsg);
390     return ret;
391 }
392 
GetSupportedDecoders(std::vector<std::string> & decoderTypes)393 int32_t AVCastControllerItem::GetSupportedDecoders(std::vector<std::string>& decoderTypes)
394 {
395     std::lock_guard lockGuard(castControllerLock_);
396     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
397         "cast controller proxy is nullptr");
398     CHECK_AND_RETURN_RET_LOG(castControllerProxy_->GetSupportedDecoders(decoderTypes) == AVSESSION_SUCCESS,
399         AVSESSION_ERROR, "GetSupportedDecoders fail");
400     return AVSESSION_SUCCESS;
401 }
402 
GetRecommendedResolutionLevel(std::string & decoderType,ResolutionLevel & resolutionLevel)403 int32_t AVCastControllerItem::GetRecommendedResolutionLevel(std::string& decoderType, ResolutionLevel& resolutionLevel)
404 {
405     std::lock_guard lockGuard(castControllerLock_);
406     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
407         "cast controller proxy is nullptr");
408     CHECK_AND_RETURN_RET_LOG(castControllerProxy_->GetRecommendedResolutionLevel(decoderType, resolutionLevel) ==
409         AVSESSION_SUCCESS, AVSESSION_ERROR, "GetRecommendedResolutionLevel fail");
410     return AVSESSION_SUCCESS;
411 }
412 
GetSupportedHdrCapabilities(std::vector<HDRFormat> & hdrFormats)413 int32_t AVCastControllerItem::GetSupportedHdrCapabilities(std::vector<HDRFormat>& hdrFormats)
414 {
415     std::lock_guard lockGuard(castControllerLock_);
416     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
417         "cast controller proxy is nullptr");
418     CHECK_AND_RETURN_RET_LOG(castControllerProxy_->GetSupportedHdrCapabilities(hdrFormats) == AVSESSION_SUCCESS,
419         AVSESSION_ERROR, "GetSupportedHdrCapabilities fail");
420     return AVSESSION_SUCCESS;
421 }
422 
GetSupportedPlaySpeeds(std::vector<float> & playSpeeds)423 int32_t AVCastControllerItem::GetSupportedPlaySpeeds(std::vector<float>& playSpeeds)
424 {
425     std::lock_guard lockGuard(castControllerLock_);
426     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
427     CHECK_AND_RETURN_RET_LOG(castControllerProxy_->GetSupportedPlaySpeeds(playSpeeds) == AVSESSION_SUCCESS,
428         AVSESSION_ERROR, "GetSupportedPlaySpeeds fail");
429     return AVSESSION_SUCCESS;
430 }
431 
GetCurrentItem(AVQueueItem & currentItem)432 int32_t AVCastControllerItem::GetCurrentItem(AVQueueItem& currentItem)
433 {
434     std::lock_guard lockGuard(castControllerLock_);
435     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
436         "cast controller proxy is nullptr");
437     currentItem =  castControllerProxy_->GetCurrentItem();
438     return AVSESSION_SUCCESS;
439 }
440 
GetValidCommands(std::vector<int32_t> & cmds)441 int32_t AVCastControllerItem::GetValidCommands(std::vector<int32_t>& cmds)
442 {
443     if (sessionTag_ == "RemoteCast") {
444         std::lock_guard lockGuard(castControllerLock_);
445         CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
446             "cast controller proxy is nullptr");
447         castControllerProxy_->GetValidAbility(cmds);
448         SLOGI("get available commands from cast with size %{public}zd", cmds.size());
449         return AVSESSION_SUCCESS;
450     }
451     {
452         std::lock_guard<std::mutex> lock(callbackToSessionLock_);
453         CHECK_AND_RETURN_RET_LOG(isSessionCallbackAvailable_, AVSESSION_ERROR, "sessionCallback not available");
454     }
455     validCommandsChangecallback_(AVCastControlCommand::CAST_CONTROL_CMD_MAX, cmds);
456     SLOGI("get available command with size %{public}zd", cmds.size());
457     return AVSESSION_SUCCESS;
458 }
459 
SetDisplaySurface(std::string & surfaceId)460 int32_t AVCastControllerItem::SetDisplaySurface(std::string& surfaceId)
461 {
462     std::lock_guard lockGuard(castControllerLock_);
463     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
464     return castControllerProxy_->SetDisplaySurface(surfaceId);
465 }
466 
SetCastPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType & filter)467 int32_t AVCastControllerItem::SetCastPlaybackFilter(const AVPlaybackState::PlaybackStateMaskType& filter)
468 {
469     castPlaybackMask_ = filter;
470     return AVSESSION_SUCCESS;
471 }
472 
ProcessMediaKeyResponse(const std::string & assetId,const std::vector<uint8_t> & response)473 int32_t AVCastControllerItem::ProcessMediaKeyResponse(const std::string &assetId, const std::vector<uint8_t> &response)
474 {
475     std::lock_guard lockGuard(castControllerLock_);
476     CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
477     auto ret =  castControllerProxy_->ProcessMediaKeyResponse(assetId, response);
478     std::string apiParamString = "assetId: " + assetId;
479     std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "ProcessMediaKeyResponse failed";
480     HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
481         "API_NAME", "ProcessMediaKeyResponse",
482         "BUNDLE_NAME",  BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
483         "API_PARAM", apiParamString,
484         "ERROR_CODE", ret,
485         "ERROR_MSG", errMsg);
486     return ret;
487 }
488 
AddAvailableCommand(const int32_t cmd)489 int32_t AVCastControllerItem::AddAvailableCommand(const int32_t cmd)
490 {
491     SLOGI("add available command %{public}d with isSessionCallbackAvailable check %{public}d",
492         cmd, static_cast<int>(isSessionCallbackAvailable_));
493     std::vector<int32_t> cmds(AVCastControlCommand::CAST_CONTROL_CMD_MAX);
494     {
495         std::lock_guard<std::mutex> lock(callbackToSessionLock_);
496         CHECK_AND_RETURN_RET_LOG(isSessionCallbackAvailable_, AVSESSION_ERROR, "sessionCallback not available");
497     }
498     validCommandsChangecallback_(cmd, cmds);
499     SLOGI("add available command with size %{public}d", static_cast<int32_t>(cmds.size()));
500     if (cmds.empty()) {
501         SLOGI("check is sink session with empty, not set");
502     } else {
503         std::lock_guard lockGuard(castControllerLock_);
504         CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
505             "cast controller proxy is nullptr");
506         auto ret = castControllerProxy_->SetValidAbility(cmds);
507         std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "onCastEvent failed";
508         std::string apiParamString = "cmd: " + std::to_string(cmd);
509         HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
510             "API_NAME", "onCastEvent",
511             "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
512             "API_PARAM", apiParamString,
513             "ERROR_CODE", ret,
514             "ERROR_MSG", errMsg);
515     }
516     return AVSESSION_SUCCESS;
517 }
518 
RemoveAvailableCommand(const int32_t cmd)519 int32_t AVCastControllerItem::RemoveAvailableCommand(const int32_t cmd)
520 {
521     SLOGI("remove available command %{public}d", cmd);
522     std::vector<int32_t> cmds(AVCastControlCommand::CAST_CONTROL_CMD_MAX);
523     {
524         std::lock_guard<std::mutex> lock(callbackToSessionLock_);
525         CHECK_AND_RETURN_RET_LOG(isSessionCallbackAvailable_, AVSESSION_ERROR, "sessionCallback not available");
526     }
527     validCommandsChangecallback_(cmd + removeCmdStep_, cmds);
528     SLOGI("remove available command with size %{public}d", static_cast<int32_t>(cmds.size()));
529     if (cmds.empty()) {
530         SLOGI("check is sink session with empty, not set");
531     } else {
532         std::lock_guard lockGuard(castControllerLock_);
533         CHECK_AND_RETURN_RET_LOG(castControllerProxy_ != nullptr, AVSESSION_ERROR,
534             "cast controller proxy is nullptr");
535         auto ret = castControllerProxy_->SetValidAbility(cmds);
536         std::string errMsg = (ret == AVSESSION_SUCCESS) ? "SUCCESS" : "offCastEvent failed";
537         std::string apiParamString = "cmd: " + std::to_string(cmd);
538         HISYSEVENT_BEHAVIOR("SESSION_API_BEHAVIOR",
539             "API_NAME", "offCastEvent",
540             "BUNDLE_NAME", BundleStatusAdapter::GetInstance().GetBundleNameFromUid(GetCallingUid()),
541             "API_PARAM", apiParamString,
542             "ERROR_CODE", ret,
543             "ERROR_MSG", errMsg);
544     }
545     return AVSESSION_SUCCESS;
546 }
547 
HandleCastValidCommandChange(const std::vector<int32_t> & cmds)548 int32_t AVCastControllerItem::HandleCastValidCommandChange(const std::vector<int32_t>& cmds)
549 {
550     SLOGI("HandleCastValidCommandChange cmd size:%{public}zd", cmds.size());
551     CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "callback_ is nullptr");
552     std::lock_guard lockGuard(castControllerCallbackLock_);
553     callback_->OnCastValidCommandChanged(cmds);
554     return AVSESSION_SUCCESS;
555 }
556 
SetSessionTag(const std::string & tag)557 void AVCastControllerItem::SetSessionTag(const std::string& tag)
558 {
559     sessionTag_ = tag;
560 }
561 
SetSessionId(const std::string sessionId)562 void AVCastControllerItem::SetSessionId(const std::string sessionId)
563 {
564     sessionId_ = sessionId;
565 }
566 
SetUserId(const int32_t userId)567 void AVCastControllerItem::SetUserId(const int32_t userId)
568 {
569     userId_ = userId;
570 }
571 
SetSessionCallbackForCastCap(const std::function<void (std::string,bool,bool)> & callback)572 void AVCastControllerItem::SetSessionCallbackForCastCap(const std::function<void(std::string, bool, bool)>& callback)
573 {
574     sessionCallbackForCastNtf_ = callback;
575 }
576 
RegisterControllerListener(std::shared_ptr<IAVCastControllerProxy> castControllerProxy)577 bool AVCastControllerItem::RegisterControllerListener(std::shared_ptr<IAVCastControllerProxy> castControllerProxy)
578 {
579     SLOGI("Call RegisterControllerListener of cast controller proxy");
580     CHECK_AND_RETURN_RET_LOG(castControllerProxy != nullptr, AVSESSION_ERROR, "cast controller proxy is nullptr");
581     return castControllerProxy->RegisterControllerListener(shared_from_this());
582 }
583 
RegisterCallbackInner(const sptr<IRemoteObject> & callback)584 int32_t AVCastControllerItem::RegisterCallbackInner(const sptr<IRemoteObject>& callback)
585 {
586     SLOGI("call RegisterCallbackInner of cast controller proxy");
587     std::lock_guard lockGuard(castControllerCallbackLock_);
588     callback_ = iface_cast<AVCastControllerCallbackProxy>(callback);
589     CHECK_AND_RETURN_RET_LOG(callback_ != nullptr, AVSESSION_ERROR, "callback_ is nullptr");
590     return AVSESSION_SUCCESS;
591 }
592 
Destroy()593 int32_t AVCastControllerItem::Destroy()
594 {
595     SLOGI("Start cast controller destroy process with sessionCallback available set");
596     {
597         std::lock_guard lockGuard(castControllerLock_);
598         if (castControllerProxy_) {
599             castControllerProxy_->UnRegisterControllerListener(shared_from_this());
600             castControllerProxy_ = nullptr;
601         }
602     }
603     {
604         std::lock_guard lockGuard(castControllerCallbackLock_);
605         if (callback_) {
606             callback_ = nullptr;
607         }
608     }
609     {
610         std::lock_guard<std::mutex> lock(callbackToSessionLock_);
611         isSessionCallbackAvailable_ = false;
612     }
613     return AVSESSION_SUCCESS;
614 }
615 } // namespace OHOS::AVSession
616