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