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