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