1 /*
2 * Copyright (c) 2023-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 #define HST_LOG_TAG "HiPlayer"
17
18 #include "hiplayer_impl.h"
19
20 #include <chrono>
21
22 #include "audio_info.h"
23 #include "common/log.h"
24 #include "common/media_source.h"
25 #include "directory_ex.h"
26 #include "filter/filter_factory.h"
27 #include "media_errors.h"
28 #include "osal/task/jobutils.h"
29 #include "osal/task/pipeline_threadpool.h"
30 #include "osal/task/task.h"
31 #include "osal/utils/dump_buffer.h"
32 #include "plugin/plugin_time.h"
33 #include "media_dfx.h"
34 #include "media_utils.h"
35 #include "meta_utils.h"
36 #include "meta/media_types.h"
37 #include "param_wrapper.h"
38
39 namespace {
40 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_HIPLAYER, "HiPlayer" };
41 const float MAX_MEDIA_VOLUME = 1.0f; // standard interface volume is between 0 to 1.
42 const int32_t AUDIO_SINK_MAX_LATENCY = 400; // audio sink write latency ms
43 const int32_t FRAME_RATE_UNIT_MULTIPLE = 100; // the unit of frame rate is frames per 100s
44 const int32_t PLAYING_SEEK_WAIT_TIME = 200; // wait up to 200 ms for new frame after seek in playing.
45 const int64_t PLAY_RANGE_DEFAULT_VALUE = -1; // play range default value.
46 const int64_t SAMPLE_AMPLITUDE_INTERVAL = 100;
47 const int64_t REPORT_PROGRESS_INTERVAL = 100; // progress interval is 100ms
48 const double FRAME_RATE_DEFAULT = -1.0;
49 const double FRAME_RATE_FOR_SEEK_PERFORMANCE = 2000.0;
50 constexpr int32_t BUFFERING_LOG_FREQUENCY = 5;
51 constexpr int32_t NOTIFY_BUFFERING_END_PARAM = 0;
52 }
53
54 namespace OHOS {
55 namespace Media {
56 using namespace Pipeline;
57 using namespace OHOS::Media::Plugins;
58 class PlayerEventReceiver : public EventReceiver {
59 public:
PlayerEventReceiver(HiPlayerImpl* hiPlayerImpl, std::string playerId)60 explicit PlayerEventReceiver(HiPlayerImpl* hiPlayerImpl, std::string playerId)
61 {
62 MEDIA_LOG_I_SHORT("PlayerEventReceiver ctor called.");
63 hiPlayerImpl_ = hiPlayerImpl;
64 task_ = std::make_unique<Task>("PlayerEventReceiver", playerId, TaskType::GLOBAL,
65 OHOS::Media::TaskPriority::HIGH, false);
66 }
67
OnEvent(const Event &event)68 void OnEvent(const Event &event)
69 {
70 MEDIA_LOG_D_SHORT("PlayerEventReceiver OnEvent.");
71 task_->SubmitJobOnce([this, event] { hiPlayerImpl_->OnEvent(event); });
72 }
73
74 private:
75 HiPlayerImpl* hiPlayerImpl_;
76 std::unique_ptr<Task> task_;
77 };
78
79 class PlayerFilterCallback : public FilterCallback {
80 public:
PlayerFilterCallback(HiPlayerImpl* hiPlayerImpl)81 explicit PlayerFilterCallback(HiPlayerImpl* hiPlayerImpl)
82 {
83 MEDIA_LOG_I_SHORT("PlayerFilterCallback ctor called.");
84 hiPlayerImpl_ = hiPlayerImpl;
85 }
86
OnCallback(const std::shared_ptr<Filter>& filter, FilterCallBackCommand cmd, StreamType outType)87 Status OnCallback(const std::shared_ptr<Filter>& filter, FilterCallBackCommand cmd, StreamType outType)
88 {
89 MEDIA_LOG_D_SHORT("PlayerFilterCallback OnCallback.");
90 return hiPlayerImpl_->OnCallback(filter, cmd, outType);
91 }
92
93 private:
94 HiPlayerImpl* hiPlayerImpl_;
95 };
96
HiPlayerImpl(int32_t appUid, int32_t appPid, uint32_t appTokenId, uint64_t appFullTokenId)97 HiPlayerImpl::HiPlayerImpl(int32_t appUid, int32_t appPid, uint32_t appTokenId, uint64_t appFullTokenId)
98 : appUid_(appUid), appPid_(appPid), appTokenId_(appTokenId), appFullTokenId_(appFullTokenId)
99 {
100 MEDIA_LOG_D_SHORT("hiPlayerImpl ctor appUid " PUBLIC_LOG_D32 " appPid " PUBLIC_LOG_D32
101 " appTokenId %{private}" PRIu32 " appFullTokenId %{private}" PRIu64,
102 appUid_, appPid_, appTokenId_, appFullTokenId_);
103 playerId_ = std::string("HiPlayer_") + std::to_string(OHOS::Media::Pipeline::Pipeline::GetNextPipelineId());
104 pipeline_ = std::make_shared<OHOS::Media::Pipeline::Pipeline>();
105 syncManager_ = std::make_shared<MediaSyncManager>();
106 callbackLooper_.SetPlayEngine(this, playerId_);
107 bundleName_ = GetClientBundleName(appUid, false);
108 dfxAgent_ = std::make_shared<DfxAgent>(playerId_, bundleName_);
109 }
110
~HiPlayerImpl()111 HiPlayerImpl::~HiPlayerImpl()
112 {
113 MEDIA_LOG_D_SHORT("~HiPlayerImpl dtor called");
114 if (demuxer_) {
115 pipeline_->RemoveHeadFilter(demuxer_);
116 }
117 if (dfxAgent_ != nullptr) {
118 dfxAgent_.reset();
119 }
120 PipeLineThreadPool::GetInstance().DestroyThread(playerId_);
121 }
122
ReleaseInner()123 void HiPlayerImpl::ReleaseInner()
124 {
125 pipeline_->Stop();
126 audioSink_.reset();
127 #ifdef SUPPORT_VIDEO
128 if (videoDecoder_) {
129 videoDecoder_.reset();
130 }
131 #endif
132 if (subtitleSink_) {
133 subtitleSink_.reset();
134 }
135 syncManager_.reset();
136 if (demuxer_) {
137 pipeline_->RemoveHeadFilter(demuxer_);
138 }
139 }
140
Init()141 Status HiPlayerImpl::Init()
142 {
143 MediaTrace trace("HiPlayerImpl::Init");
144 MEDIA_LOG_I_SHORT("Init start");
145 std::shared_ptr<EventReceiver> playerEventReceiver = std::make_shared<PlayerEventReceiver>(this, playerId_);
146 playerEventReceiver_ = playerEventReceiver;
147 if (syncManager_ != nullptr) {
148 syncManager_->SetEventReceiver(playerEventReceiver_);
149 }
150 std::shared_ptr<FilterCallback> playerFilterCallback = std::make_shared<PlayerFilterCallback>(this);
151 playerFilterCallback_ = playerFilterCallback;
152 MEDIA_LOG_D_SHORT("pipeline init");
153 pipeline_->Init(playerEventReceiver, playerFilterCallback, playerId_);
154 MEDIA_LOG_D_SHORT("pipeline Init out");
155 for (std::pair<std::string, bool>& item: completeState_) {
156 item.second = false;
157 }
158 GetDumpFlag();
159 return Status::OK;
160 }
161
GetDumpFlag()162 void HiPlayerImpl::GetDumpFlag()
163 {
164 const std::string dumpTag = "sys.media.player.dump.enable";
165 std::string dumpEnable;
166 int32_t dumpRes = OHOS::system::GetStringParameter(dumpTag, dumpEnable, "false");
167 isDump_ = (dumpEnable == "true");
168 MEDIA_LOG_D_SHORT("get dump flag, dumpRes: %{public}d, isDump_: %{public}d", dumpRes, isDump_);
169 }
170
SetDefaultAudioRenderInfo(const std::vector<std::shared_ptr<Meta>> &trackInfos)171 void HiPlayerImpl::SetDefaultAudioRenderInfo(const std::vector<std::shared_ptr<Meta>> &trackInfos)
172 {
173 MEDIA_LOG_D_SHORT("SetDefaultAudioRenderInfo");
174 bool hasVideoTrack = false;
175 for (size_t index = 0; index < trackInfos.size(); index++) {
176 std::shared_ptr<Meta> meta = trackInfos[index];
177 if (meta == nullptr) {
178 continue;
179 }
180 std::string trackMime;
181 if (!meta->GetData(Tag::MIME_TYPE, trackMime)) {
182 continue;
183 }
184 if (isSetVideoSurface_ && trackMime.find("video/") == 0) {
185 hasVideoTrack = true;
186 }
187 }
188 Plugins::AudioRenderInfo audioRenderInfo;
189 if (hasVideoTrack) {
190 audioRenderInfo = {AudioStandard::CONTENT_TYPE_MOVIE, AudioStandard::STREAM_USAGE_MOVIE, 0};
191 } else {
192 audioRenderInfo = {AudioStandard::CONTENT_TYPE_MUSIC, AudioStandard::STREAM_USAGE_MUSIC, 0};
193 }
194 if (audioRenderInfo_ == nullptr) {
195 audioRenderInfo_ = std::make_shared<Meta>();
196 audioRenderInfo_->SetData(Tag::AUDIO_RENDER_INFO, audioRenderInfo);
197 }
198 }
199
GetRealPath(const std::string &url, std::string &realUrlPath) const200 int32_t HiPlayerImpl::GetRealPath(const std::string &url, std::string &realUrlPath) const
201 {
202 std::string fileHead = "file://";
203 std::string tempUrlPath;
204
205 if (url.find(fileHead) == 0 && url.size() > fileHead.size()) {
206 tempUrlPath = url.substr(fileHead.size());
207 } else {
208 tempUrlPath = url;
209 }
210 if (tempUrlPath.find("..") != std::string::npos) {
211 return MSERR_FILE_ACCESS_FAILED;
212 }
213 bool ret = PathToRealPath(tempUrlPath, realUrlPath);
214 if (!ret) {
215 return MSERR_OPEN_FILE_FAILED;
216 }
217 if (access(realUrlPath.c_str(), R_OK) != 0) {
218 return MSERR_FILE_ACCESS_FAILED;
219 }
220 return MSERR_OK;
221 }
222
IsFileUrl(const std::string &url) const223 bool HiPlayerImpl::IsFileUrl(const std::string &url) const
224 {
225 return url.find("://") == std::string::npos || url.find("file://") == 0;
226 }
227
IsValidPlayRange(int64_t start, int64_t end) const228 bool HiPlayerImpl::IsValidPlayRange(int64_t start, int64_t end) const
229 {
230 if (start < PLAY_RANGE_DEFAULT_VALUE || end < PLAY_RANGE_DEFAULT_VALUE || end == 0) {
231 return false;
232 }
233 if (pipelineStates_ == PlayerStates::PLAYER_INITIALIZED) {
234 return true;
235 }
236 if ((end == PLAY_RANGE_DEFAULT_VALUE) && (start < durationMs_.load())) {
237 return true;
238 }
239 if (start >= end || start >= durationMs_.load() || end > durationMs_.load()) {
240 return false;
241 }
242 return true;
243 }
244
IsInValidSeekTime(int32_t seekPos)245 bool HiPlayerImpl::IsInValidSeekTime(int32_t seekPos)
246 {
247 if (endTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE) {
248 return false;
249 }
250 int64_t seekTime = static_cast<int64_t>(seekPos);
251 if (startTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE) {
252 if (seekTime > endTimeWithMode_) {
253 endTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
254 pipeline_->SetPlayRange(startTimeWithMode_, endTimeWithMode_);
255 }
256 return false;
257 }
258 return seekTime < startTimeWithMode_ || seekTime > endTimeWithMode_;
259 }
260
GetPlayStartTime()261 int64_t HiPlayerImpl::GetPlayStartTime()
262 {
263 if (playRangeStartTime_ > PLAY_RANGE_DEFAULT_VALUE) {
264 return playRangeStartTime_;
265 }
266 int64_t rePlayStartTime = 0;
267 if (startTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE && endTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE) {
268 rePlayStartTime = startTimeWithMode_;
269 }
270 return rePlayStartTime;
271 }
272
SetInstancdId(uint64_t instanceId)273 void HiPlayerImpl::SetInstancdId(uint64_t instanceId)
274 {
275 instanceId_ = instanceId;
276 if (dfxAgent_ != nullptr) {
277 dfxAgent_->SetInstanceId(std::to_string(instanceId_));
278 }
279 MEDIA_LOG_D_SHORT("HiPlayerImpl:: Set InstancdId %{public}d", instanceId);
280 }
281
SetSource(const std::string& uri)282 int32_t HiPlayerImpl::SetSource(const std::string& uri)
283 {
284 MediaTrace trace("HiPlayerImpl::SetSource uri");
285 MEDIA_LOG_D_SHORT("HiPlayerImpl SetSource uri");
286 CreateMediaInfo(CallType::AVPLAYER, appUid_, instanceId_);
287 playStatisticalInfo_.sourceUrl = "private";
288 playStatisticalInfo_.sourceType = static_cast<int32_t>(SourceType::SOURCE_TYPE_URI);
289 url_ = uri;
290 PlayerDfxSourceType sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_UNKNOWN;
291 if (IsFileUrl(uri)) {
292 std::string realUriPath;
293 int32_t result = GetRealPath(uri, realUriPath);
294 if (result != MSERR_OK) {
295 CollectionErrorInfo(result, "SetSource error: GetRealPath error");
296 return result;
297 }
298 url_ = "file://" + realUriPath;
299 sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_URL_FILE;
300 }
301 if (url_.find("http") == 0 || url_.find("https") == 0) {
302 isNetWorkPlay_ = true;
303 sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_URL_NETWORK;
304 }
305 if (url_.find("fd://") == 0) {
306 sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_URL_FD;
307 }
308 if (dfxAgent_ != nullptr) {
309 dfxAgent_->SetSourceType(sourceType);
310 }
311 hasExtSub_ = false;
312 pipelineStates_ = PlayerStates::PLAYER_INITIALIZED;
313 int ret = TransStatus(Status::OK);
314 playStatisticalInfo_.errCode = ret;
315 return ret;
316 }
317
SetMediaSource(const std::shared_ptr<AVMediaSource> &mediaSource, AVPlayStrategy strategy)318 int32_t HiPlayerImpl::SetMediaSource(const std::shared_ptr<AVMediaSource> &mediaSource, AVPlayStrategy strategy)
319 {
320 MediaTrace trace("HiPlayerImpl::SetMediaSource.");
321 MEDIA_LOG_I_SHORT("SetMediaSource entered media source stream");
322 if (mediaSource == nullptr) {
323 CollectionErrorInfo(MSERR_INVALID_VAL, "mediaSource is nullptr");
324 return MSERR_INVALID_VAL;
325 }
326 header_ = mediaSource->header;
327 url_ = mediaSource->url;
328 preferedWidth_ = strategy.preferredWidth;
329 preferedHeight_ = strategy.preferredHeight;
330 bufferDuration_ = strategy.preferredBufferDuration;
331 preferHDR_ = strategy.preferredHdr;
332 audioLanguage_ = strategy.preferredAudioLanguage;
333 subtitleLanguage_ = strategy.preferredSubtitleLanguage;
334 mimeType_ = mediaSource->GetMimeType();
335 PlayerDfxSourceType sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_MEDIASOURCE_LOCAL;
336 if (mimeType_ != AVMimeTypes::APPLICATION_M3U8 && IsFileUrl(url_)) {
337 std::string realUriPath;
338 int32_t result = GetRealPath(url_, realUriPath);
339 if (result != MSERR_OK) {
340 CollectionErrorInfo(result, "SetSource error: GetRealPath error");
341 return result;
342 }
343 url_ = "file://" + realUriPath;
344 }
345 if (url_.find("http") == 0 || url_.find("https") == 0) {
346 isNetWorkPlay_ = true;
347 sourceType = PlayerDfxSourceType::DFX_SOURCE_TYPE_MEDIASOURCE_NETWORK;
348 }
349 if (dfxAgent_ != nullptr) {
350 dfxAgent_->SetSourceType(sourceType);
351 }
352
353 pipelineStates_ = PlayerStates::PLAYER_INITIALIZED;
354 int ret = TransStatus(Status::OK);
355 playStatisticalInfo_.errCode = ret;
356 return ret;
357 }
358
SetSource(const std::shared_ptr<IMediaDataSource>& dataSrc)359 int32_t HiPlayerImpl::SetSource(const std::shared_ptr<IMediaDataSource>& dataSrc)
360 {
361 MediaTrace trace("HiPlayerImpl::SetSource dataSrc");
362 MEDIA_LOG_I_SHORT("SetSource in source stream");
363 if (dataSrc == nullptr) {
364 MEDIA_LOG_E_SHORT("SetSource error: dataSrc is null");
365 }
366 if (dfxAgent_ != nullptr) {
367 dfxAgent_->SetSourceType(PlayerDfxSourceType::DFX_SOURCE_TYPE_DATASRC);
368 }
369 playStatisticalInfo_.sourceType = static_cast<int32_t>(SourceType::SOURCE_TYPE_STREAM);
370 dataSrc_ = dataSrc;
371 hasExtSub_ = false;
372 pipelineStates_ = PlayerStates::PLAYER_INITIALIZED;
373 int ret = TransStatus(Status::OK);
374 playStatisticalInfo_.errCode = ret;
375 return ret;
376 }
377
AddSubSource(const std::string &url)378 int32_t HiPlayerImpl::AddSubSource(const std::string &url)
379 {
380 MediaTrace trace("HiPlayerImpl::AddSubSource uri");
381 subUrl_ = url;
382 if (IsFileUrl(url)) {
383 std::string realUriPath;
384 int32_t result = GetRealPath(url, realUriPath);
385 if (result != MSERR_OK) {
386 MEDIA_LOG_E_SHORT("AddSubSource error: GetRealPath error");
387 return result;
388 }
389 subUrl_ = "file://" + realUriPath;
390 }
391
392 hasExtSub_ = true;
393 return TransStatus(Status::OK);
394 }
395
ResetIfSourceExisted()396 void HiPlayerImpl::ResetIfSourceExisted()
397 {
398 FALSE_RETURN(demuxer_ != nullptr);
399 MEDIA_LOG_I_SHORT("Source is existed, reset the relatived objects");
400 ReleaseInner();
401 if (pipeline_ != nullptr) {
402 pipeline_.reset();
403 }
404 if (audioDecoder_ != nullptr) {
405 audioDecoder_.reset();
406 }
407
408 pipeline_ = std::make_shared<OHOS::Media::Pipeline::Pipeline>();
409 syncManager_ = std::make_shared<MediaSyncManager>();
410 if (syncManager_ != nullptr) {
411 syncManager_->SetEventReceiver(playerEventReceiver_);
412 }
413 MEDIA_LOG_I_SHORT("Reset the relatived objects end");
414 }
415
Prepare()416 int32_t HiPlayerImpl::Prepare()
417 {
418 return TransStatus(Status::OK);
419 }
420
SetPlayRange(int64_t start, int64_t end)421 int32_t HiPlayerImpl::SetPlayRange(int64_t start, int64_t end)
422 {
423 if (!IsValidPlayRange(start, end)) {
424 MEDIA_LOG_E_SHORT("SetPlayRange failed! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
425 start, end);
426 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
427 return TransStatus(Status::ERROR_INVALID_OPERATION);
428 }
429 playRangeStartTime_ = start;
430 playRangeEndTime_ = end;
431
432 if (pipeline_ != nullptr) {
433 pipeline_->SetPlayRange(playRangeStartTime_, playRangeEndTime_);
434 }
435
436 MEDIA_LOG_I_SHORT("SetPlayRange success! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
437 playRangeStartTime_, playRangeEndTime_);
438 return TransStatus(Status::OK);
439 }
440
SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)441 int32_t HiPlayerImpl::SetPlayRangeWithMode(int64_t start, int64_t end, PlayerSeekMode mode)
442 {
443 Status rtv = Status::OK;
444 if (!IsValidPlayRange(start, end)) {
445 MEDIA_LOG_E_SHORT("SetPlayRangeWithMode failed! start: " PUBLIC_LOG_D64 ", end: "
446 PUBLIC_LOG_D64, start, end);
447 rtv = Status::ERROR_INVALID_PARAMETER;
448 OnEvent({"engine", EventType::EVENT_ERROR, TransStatus(rtv)});
449 return TransStatus(rtv);
450 }
451 startTimeWithMode_ = start;
452 endTimeWithMode_ = end;
453 playRangeSeekMode_ = mode;
454 isSetPlayRange_ = true;
455 if (pipelineStates_ == PlayerStates::PLAYER_INITIALIZED ||
456 pipelineStates_ == PlayerStates::PLAYER_STOPPED) {
457 MEDIA_LOG_I_SHORT("current state is initialized/stopped SetPlayRangeWithMode start: "
458 PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64, startTimeWithMode_, endTimeWithMode_);
459 return TransStatus(rtv);
460 }
461 if (pipeline_ != nullptr && demuxer_ != nullptr) {
462 pipeline_->SetPlayRange(startTimeWithMode_, endTimeWithMode_);
463 int64_t seekTimeMs = 0;
464 if (startTimeWithMode_ > PLAY_RANGE_DEFAULT_VALUE) {
465 seekTimeMs = startTimeWithMode_;
466 }
467 MEDIA_LOG_I_SHORT("seek to start time: " PUBLIC_LOG_D64, seekTimeMs);
468 pipeline_->Flush();
469 rtv = doSeek(seekTimeMs, playRangeSeekMode_);
470 if (rtv != Status::OK) {
471 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
472 MEDIA_LOG_E_SHORT("seek failed to start time: " PUBLIC_LOG_D64, seekTimeMs);
473 return TransStatus(rtv);
474 }
475 if (demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
476 rtv = pipeline_->Preroll(true);
477 }
478 if (pipelineStates_ == PlayerStates::PLAYER_PLAYBACK_COMPLETE) {
479 isDoCompletedSeek_ = true;
480 OnStateChanged(PlayerStateId::PAUSE);
481 }
482 Format format;
483 callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, static_cast<int32_t>(seekTimeMs), format);
484 }
485 MEDIA_LOG_I_SHORT("SetPlayRangeWithMode start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
486 startTimeWithMode_, endTimeWithMode_);
487 return TransStatus(rtv);
488 }
489
GetPlayRangeStartTime()490 int64_t HiPlayerImpl::GetPlayRangeStartTime()
491 {
492 return startTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE ? startTimeWithMode_ : playRangeStartTime_;
493 }
494
GetPlayRangeEndTime()495 int64_t HiPlayerImpl::GetPlayRangeEndTime()
496 {
497 return endTimeWithMode_ != PLAY_RANGE_DEFAULT_VALUE ? endTimeWithMode_ : playRangeEndTime_;
498 }
499
GetPlayRangeSeekMode()500 int32_t HiPlayerImpl::GetPlayRangeSeekMode()
501 {
502 return playRangeSeekMode_;
503 }
504
SetRenderFirstFrame(bool display)505 int32_t HiPlayerImpl::SetRenderFirstFrame(bool display)
506 {
507 MEDIA_LOG_I_SHORT("SetRenderFirstFrame in, display: " PUBLIC_LOG_D32, display);
508 renderFirstFrame_ = display;
509 return TransStatus(Status::OK);
510 }
511
PrepareAsync()512 int32_t HiPlayerImpl::PrepareAsync()
513 {
514 MediaTrace trace("HiPlayerImpl::PrepareAsync");
515 MEDIA_LOG_D_SHORT("HiPlayerImpl PrepareAsync");
516 if (!(pipelineStates_ == PlayerStates::PLAYER_INITIALIZED || pipelineStates_ == PlayerStates::PLAYER_STOPPED)) {
517 CollectionErrorInfo(MSERR_INVALID_OPERATION, "PrepareAsync pipelineStates not initialized or stopped");
518 return MSERR_INVALID_OPERATION;
519 }
520 auto ret = Init();
521 if (ret != Status::OK || isInterruptNeeded_.load()) {
522 auto errCode = TransStatus(Status::ERROR_UNSUPPORTED_FORMAT);
523 CollectionErrorInfo(errCode, "PrepareAsync error: init error");
524 return errCode;
525 }
526 DoSetMediaSource(ret);
527 if (ret != Status::OK && !isInterruptNeeded_.load()) {
528 auto errCode = TransStatus(Status::ERROR_UNSUPPORTED_FORMAT);
529 CollectionErrorInfo(errCode, "PrepareAsync error: DoSetSource error");
530 OnEvent({"engine", EventType::EVENT_ERROR, MSERR_UNSUPPORT_CONTAINER_TYPE});
531 return errCode;
532 }
533 FALSE_RETURN_V(!BreakIfInterruptted(), TransStatus(Status::OK));
534 NotifyBufferingUpdate(PlayerKeys::PLAYER_BUFFERING_START, 0);
535 MEDIA_LOG_I_SHORT("PrepareAsync pipeline state " PUBLIC_LOG_S, StringnessPlayerState(pipelineStates_).c_str());
536 OnStateChanged(PlayerStateId::PREPARING);
537 ret = pipeline_->Prepare();
538 if (ret != Status::OK) {
539 MEDIA_LOG_E_SHORT("PrepareAsync failed with error " PUBLIC_LOG_D32, ret);
540 auto errCode = TransStatus(ret);
541 CollectionErrorInfo(errCode, "pipeline PrepareAsync failed");
542 return errCode;
543 }
544 InitDuration();
545 ret = DoSetPlayRange();
546 FALSE_RETURN_V_MSG_E(ret == Status::OK, TransStatus(ret), "DoSetPlayRange failed");
547 if (demuxer_ != nullptr && demuxer_->IsRenderNextVideoFrameSupported()
548 && IsAppEnableRenderFirstFrame(appUid_)) {
549 ret = pipeline_->Preroll(renderFirstFrame_);
550 auto code = TransStatus(ret);
551 if (ret != Status::OK) {
552 CollectionErrorInfo(code, "PrepareFrame failed.");
553 return code;
554 }
555 }
556 UpdatePlayerStateAndNotify();
557 MEDIA_LOG_D_SHORT("PrepareAsync End");
558 return TransStatus(ret);
559 }
560
CollectionErrorInfo(int32_t errCode, const std::string& errMsg)561 void HiPlayerImpl::CollectionErrorInfo(int32_t errCode, const std::string& errMsg)
562 {
563 MEDIA_LOG_E_SHORT("Error: " PUBLIC_LOG_S, errMsg.c_str());
564 playStatisticalInfo_.errCode = errCode;
565 playStatisticalInfo_.errMsg = errMsg;
566 }
567
DoSetMediaSource(Status& ret)568 void HiPlayerImpl::DoSetMediaSource(Status& ret)
569 {
570 if (dataSrc_ != nullptr) {
571 ret = DoSetSource(std::make_shared<MediaSource>(dataSrc_));
572 } else {
573 if (!header_.empty()) {
574 MEDIA_LOG_I_SHORT("DoSetSource header");
575 ret = DoSetSource(std::make_shared<MediaSource>(url_, header_));
576 } else {
577 MEDIA_LOG_I_SHORT("DoSetSource url");
578 ret = DoSetSource(std::make_shared<MediaSource>(url_));
579 }
580 }
581 }
582
DoSetPlayRange()583 Status HiPlayerImpl::DoSetPlayRange()
584 {
585 Status ret = Status::OK;
586 int64_t rangeStartTime = GetPlayRangeStartTime();
587 int64_t rangeEndTime = GetPlayRangeEndTime();
588 if (!IsValidPlayRange(rangeStartTime, rangeEndTime)) {
589 MEDIA_LOG_E_SHORT("DoSetPlayRange failed! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
590 rangeStartTime, rangeEndTime);
591 ret = Status::ERROR_INVALID_PARAMETER;
592 OnEvent({"engine", EventType::EVENT_ERROR, TransStatus(ret)});
593 return ret;
594 }
595 if ((pipeline_ != nullptr) && (rangeEndTime > PLAY_RANGE_DEFAULT_VALUE)) {
596 pipeline_->SetPlayRange(rangeStartTime, rangeEndTime);
597 }
598 if ((pipeline_ != nullptr) && (rangeStartTime > PLAY_RANGE_DEFAULT_VALUE)) {
599 MEDIA_LOG_I_SHORT("seek to start time: " PUBLIC_LOG_D64, rangeStartTime);
600 pipeline_ -> Flush();
601 ret = doSeek(rangeStartTime, playRangeSeekMode_);
602 if (ret != Status::OK) {
603 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
604 MEDIA_LOG_E_SHORT("seek failed to start time: " PUBLIC_LOG_D64, rangeStartTime);
605 return ret;
606 }
607 Format format;
608 callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, static_cast<int32_t>(rangeStartTime), format);
609 }
610 return ret;
611 }
612
UpdatePlayerStateAndNotify()613 void HiPlayerImpl::UpdatePlayerStateAndNotify()
614 {
615 NotifyBufferingUpdate(PlayerKeys::PLAYER_BUFFERING_END, 0);
616 if (durationMs_ <= 0) {
617 HandleIsLiveStreamEvent(true);
618 }
619 NotifyDurationUpdate(PlayerKeys::PLAYER_CACHED_DURATION, durationMs_.load());
620 InitVideoWidthAndHeight();
621 NotifyResolutionChange();
622 NotifyPositionUpdate();
623 DoInitializeForHttp();
624 UpdateMediaFirstPts();
625 OnStateChanged(PlayerStateId::READY);
626 }
627
UpdateMediaFirstPts()628 void HiPlayerImpl::UpdateMediaFirstPts()
629 {
630 FALSE_RETURN(syncManager_ != nullptr);
631 std::string mime;
632 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
633 int64_t startTime = 0;
634 for (const auto& trackInfo : metaInfo) {
635 if (trackInfo == nullptr || !(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
636 MEDIA_LOG_W("TrackInfo is null or get mime fail");
637 continue;
638 }
639 if (!(mime.find("audio/") == 0 || mime.find("video/") == 0)) {
640 MEDIA_LOG_W("Not audio or video track");
641 continue;
642 }
643 if (trackInfo->GetData(Tag::MEDIA_START_TIME, startTime)) {
644 syncManager_->SetMediaStartPts(startTime);
645 }
646 }
647 startTime = syncManager_->GetMediaStartPts();
648 if (startTime != HST_TIME_NONE) {
649 mediaStartPts_ = startTime;
650 }
651 }
652
BreakIfInterruptted()653 bool HiPlayerImpl::BreakIfInterruptted()
654 {
655 if (isInterruptNeeded_.load()) {
656 OnStateChanged(PlayerStateId::READY);
657 return true;
658 }
659 return false;
660 }
661
SetInterruptState(bool isInterruptNeeded)662 void HiPlayerImpl::SetInterruptState(bool isInterruptNeeded)
663 {
664 MEDIA_LOG_I("SetInterrupt");
665 isInterruptNeeded_ = isInterruptNeeded;
666 if (demuxer_ != nullptr) {
667 demuxer_->SetInterruptState(isInterruptNeeded);
668 }
669 if (seekAgent_ != nullptr) {
670 seekAgent_->SetInterruptState(isInterruptNeeded);
671 }
672 if (videoDecoder_ != nullptr) {
673 videoDecoder_->SetInterruptState(isInterruptNeeded);
674 }
675 }
676
SelectBitRate(uint32_t bitRate)677 int32_t HiPlayerImpl::SelectBitRate(uint32_t bitRate)
678 {
679 MEDIA_LOG_D_SHORT("HiPlayerImpl:: Select BitRate %{public}d", bitRate);
680 FALSE_RETURN_V_MSG_E(demuxer_ != nullptr,
681 MSERR_INVALID_OPERATION, "SelectBitRate failed, demuxer_ is null");
682 Status ret = demuxer_->SelectBitRate(bitRate);
683 if (ret == Status::OK) {
684 Format bitRateFormat;
685 callbackLooper_.OnInfo(INFO_TYPE_BITRATEDONE, bitRate, bitRateFormat);
686 MEDIA_LOG_I_SHORT("SelectBitRate success");
687 return MSERR_OK;
688 }
689 MEDIA_LOG_I_SHORT("SelectBitRate failed");
690 return MSERR_INVALID_OPERATION;
691 }
692
StopBufferring(bool flag)693 int32_t HiPlayerImpl::StopBufferring(bool flag)
694 {
695 MEDIA_LOG_D_SHORT("HiPlayerImpl:: StopBufferring %{public}d", flag);
696 FALSE_RETURN_V_MSG_E(demuxer_ != nullptr,
697 MSERR_INVALID_OPERATION, "StopBufferring failed, demuxer_ is null");
698 Status ret = demuxer_->StopBufferring(flag);
699 if (ret == Status::OK) {
700 MEDIA_LOG_I_SHORT("StopBufferring success");
701 return MSERR_OK;
702 }
703 MEDIA_LOG_I_SHORT("StopBufferring failed");
704 return MSERR_INVALID_OPERATION;
705 }
706
DoInitializeForHttp()707 void HiPlayerImpl::DoInitializeForHttp()
708 {
709 if (!isNetWorkPlay_) {
710 MEDIA_LOG_E_SHORT("DoInitializeForHttp failed, not network play");
711 return;
712 }
713 std::vector<uint32_t> vBitRates;
714 MEDIA_LOG_D_SHORT("DoInitializeForHttp");
715 auto ret = demuxer_->GetBitRates(vBitRates);
716 if (ret == Status::OK && vBitRates.size() > 0) {
717 int mSize = static_cast<int>(vBitRates.size());
718 const int size = mSize;
719 uint32_t* bitrates = vBitRates.data();
720 Format bitRateFormat;
721 (void)bitRateFormat.PutBuffer(std::string(PlayerKeys::PLAYER_AVAILABLE_BITRATES),
722 static_cast<uint8_t *>(static_cast<void *>(bitrates)), size * sizeof(uint32_t));
723 callbackLooper_.OnInfo(INFO_TYPE_BITRATE_COLLECT, 0, bitRateFormat);
724 MEDIA_LOG_I_SHORT("OnInfo INFO_TYPE_BITRATE_COLLEC");
725 } else {
726 MEDIA_LOG_D_SHORT("GetBitRates failed, ret %{public}d", ret);
727 }
728 }
729
Play()730 int32_t HiPlayerImpl::Play()
731 {
732 MediaTrace trace("HiPlayerImpl::Play");
733 MEDIA_LOG_I_SHORT("Play entered.");
734 startTime_ = GetCurrentMillisecond();
735 playStartTime_ = GetCurrentMillisecond();
736 int32_t ret = MSERR_INVALID_VAL;
737 if (!IsValidPlayRange(playRangeStartTime_, playRangeEndTime_)) {
738 MEDIA_LOG_E_SHORT("SetPlayRange failed! start: " PUBLIC_LOG_D64 ", end: " PUBLIC_LOG_D64,
739 playRangeStartTime_, playRangeEndTime_);
740 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
741 return TransStatus(Status::ERROR_INVALID_OPERATION);
742 }
743 if (pipelineStates_ == PlayerStates::PLAYER_PLAYBACK_COMPLETE || pipelineStates_ == PlayerStates::PLAYER_STOPPED) {
744 isStreaming_ = true;
745 ret = ((GetPlayRangeStartTime() > PLAY_RANGE_DEFAULT_VALUE) ?
746 TransStatus(Seek(GetPlayStartTime(), playRangeSeekMode_, false)) :
747 TransStatus(Seek(0, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false)));
748 callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
749 callbackLooper_.startCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
750 } else if (pipelineStates_ == PlayerStates::PLAYER_PAUSED) {
751 if (playRangeStartTime_ > PLAY_RANGE_DEFAULT_VALUE) {
752 ret = TransStatus(Seek(playRangeStartTime_, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false));
753 }
754 callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
755 callbackLooper_.startCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
756 ret = TransStatus(Resume());
757 } else {
758 if (playRangeStartTime_ > PLAY_RANGE_DEFAULT_VALUE) {
759 ret = TransStatus(Seek(playRangeStartTime_, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false));
760 }
761 callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
762 callbackLooper_.startCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
763 syncManager_->Resume();
764 ret = TransStatus(pipeline_->Start());
765 if (ret != MSERR_OK) {
766 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
767 }
768 }
769 if (ret == MSERR_OK) {
770 if (!isInitialPlay_) {
771 OnStateChanged(PlayerStateId::PLAYING);
772 } else {
773 MEDIA_LOG_D_SHORT("InitialPlay, pending to change state of playing");
774 }
775 } else {
776 CollectionErrorInfo(ret, "Play failed");
777 }
778 return ret;
779 }
780
Pause(bool isSystemOperation)781 int32_t HiPlayerImpl::Pause(bool isSystemOperation)
782 {
783 MediaTrace trace("HiPlayerImpl::Pause");
784 MEDIA_LOG_I_SHORT("Pause in");
785 FALSE_RETURN_V_MSG_E(pipelineStates_ != PlayerStates::PLAYER_PLAYBACK_COMPLETE,
786 TransStatus(Status::OK), "completed not allow pause");
787 Status ret = Status::OK;
788 ret = pipeline_->Pause();
789 syncManager_->Pause();
790 if (ret != Status::OK) {
791 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
792 }
793 callbackLooper_.StopReportMediaProgress();
794 callbackLooper_.StopCollectMaxAmplitude();
795 callbackLooper_.ManualReportMediaProgressOnce();
796 OnStateChanged(PlayerStateId::PAUSE, isSystemOperation);
797 if (startTime_ != -1) {
798 playTotalDuration_ += GetCurrentMillisecond() - startTime_;
799 }
800 startTime_ = -1;
801 return TransStatus(ret);
802 }
803
PauseDemuxer()804 int32_t HiPlayerImpl::PauseDemuxer()
805 {
806 MediaTrace trace("HiPlayerImpl::PauseDemuxer");
807 MEDIA_LOG_I("PauseDemuxer in");
808 callbackLooper_.StopReportMediaProgress();
809 callbackLooper_.StopCollectMaxAmplitude();
810 Status ret = demuxer_->PauseDemuxerReadLoop();
811 return TransStatus(ret);
812 }
813
ResumeDemuxer()814 int32_t HiPlayerImpl::ResumeDemuxer()
815 {
816 MediaTrace trace("HiPlayerImpl::ResumeDemuxer");
817 MEDIA_LOG_I("ResumeDemuxer in");
818 FALSE_RETURN_V_MSG_E(pipelineStates_ != PlayerStates::PLAYER_STATE_ERROR,
819 TransStatus(Status::OK), "PLAYER_STATE_ERROR not allow ResumeDemuxer");
820 callbackLooper_.StartReportMediaProgress(REPORT_PROGRESS_INTERVAL);
821 callbackLooper_.startCollectMaxAmplitude(SAMPLE_AMPLITUDE_INTERVAL);
822 Status ret = demuxer_->ResumeDemuxerReadLoop();
823 return TransStatus(ret);
824 }
825
GetCurrentMillisecond()826 int64_t HiPlayerImpl::GetCurrentMillisecond()
827 {
828 std::chrono::system_clock::duration duration = std::chrono::system_clock::now().time_since_epoch();
829 int64_t time = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
830 return time;
831 }
832
Stop()833 int32_t HiPlayerImpl::Stop()
834 {
835 MediaTrace trace("HiPlayerImpl::Stop");
836 MEDIA_LOG_I_SHORT("Stop entered.");
837
838 // triger drm waiting condition
839 if (isDrmProtected_) {
840 std::unique_lock<std::mutex> drmLock(drmMutex_);
841 stopWaitingDrmConfig_ = true;
842 drmConfigCond_.notify_all();
843 }
844 AutoLock lock(handleCompleteMutex_);
845 UpdatePlayStatistics();
846 callbackLooper_.StopReportMediaProgress();
847 callbackLooper_.StopCollectMaxAmplitude();
848 // close demuxer first to avoid concurrent problem
849 auto ret = Status::ERROR_UNKNOWN;
850 if (pipeline_ != nullptr) {
851 ret = pipeline_->Stop();
852 }
853 syncManager_->Stop();
854 if (audioDecoder_ != nullptr) {
855 audioDecoder_->Flush();
856 }
857 #ifdef SUPPORT_VIDEO
858 if (videoDecoder_) {
859 videoDecoder_->Stop();
860 videoDecoder_->Flush();
861 }
862 #endif
863 if (audioSink_ != nullptr) {
864 audioSink_->Flush();
865 }
866 if (subtitleSink_ != nullptr) {
867 subtitleSink_->Flush();
868 }
869 for (std::pair<std::string, bool>& item: completeState_) {
870 item.second = false;
871 }
872
873 ResetPlayRangeParameter();
874 AppendPlayerMediaInfo();
875 OnStateChanged(PlayerStateId::STOPPED);
876 ReportMediaInfo(instanceId_);
877 return TransStatus(ret);
878 }
879
ResetPlayRangeParameter()880 void HiPlayerImpl::ResetPlayRangeParameter()
881 {
882 playRangeStartTime_ = PLAY_RANGE_DEFAULT_VALUE;
883 playRangeEndTime_ = PLAY_RANGE_DEFAULT_VALUE;
884 startTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
885 endTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
886 isSetPlayRange_ = false;
887 playRangeSeekMode_ = PlayerSeekMode::SEEK_PREVIOUS_SYNC;
888 }
889
UpdatePlayStatistics()890 void HiPlayerImpl::UpdatePlayStatistics()
891 {
892 MEDIA_LOG_D_SHORT("HiPlayerImpl UpdatePlayStatistics");
893 playStatisticalInfo_.isDrmProtected = isDrmProtected_;
894 if (demuxer_ != nullptr) {
895 DownloadInfo downLoadInfo;
896 auto ret = demuxer_->GetDownloadInfo(downLoadInfo);
897 if (ret == Status::OK) {
898 MEDIA_LOG_D_SHORT("GetDownloadInfo success");
899 playStatisticalInfo_.avgDownloadRate = downLoadInfo.avgDownloadRate;
900 playStatisticalInfo_.avgDownloadSpeed = downLoadInfo.avgDownloadSpeed;
901 playStatisticalInfo_.totalDownLoadBits = downLoadInfo.totalDownLoadBits;
902 playStatisticalInfo_.isTimeOut = downLoadInfo.isTimeOut;
903 } else {
904 MEDIA_LOG_E_SHORT("GetDownloadInfo failed with error " PUBLIC_LOG_D32, ret);
905 }
906 } else {
907 MEDIA_LOG_E_SHORT("GetDownloadInfo failed demuxer is null");
908 }
909 if (videoDecoder_ != nullptr) {
910 auto ret = videoDecoder_->GetLagInfo(playStatisticalInfo_.lagTimes, playStatisticalInfo_.maxLagDuration,
911 playStatisticalInfo_.avgLagDuration);
912 if (ret != Status::OK) {
913 MEDIA_LOG_E_SHORT("GetLagInfo failed with error " PUBLIC_LOG_D32, ret);
914 }
915 } else {
916 MEDIA_LOG_E_SHORT("GetLagInfo failed videoDecoder is null error");
917 }
918 }
919
AppendPlayerMediaInfo()920 void HiPlayerImpl::AppendPlayerMediaInfo()
921 {
922 MEDIA_LOG_D_SHORT("AppendPlayerMediaInfo entered.");
923 if (startTime_ != -1) {
924 playTotalDuration_ += GetCurrentMillisecond() - startTime_;
925 }
926 startTime_ = -1;
927 playStatisticalInfo_.playDuration = static_cast<int32_t>(playTotalDuration_);
928 playStatisticalInfo_.maxSeekLatency = static_cast<int32_t>(maxSeekLatency_);
929 playStatisticalInfo_.maxAccurateSeekLatency = static_cast<int32_t>(maxAccurateSeekLatency_);
930 playStatisticalInfo_.maxSurfaceSwapLatency = static_cast<int32_t>(maxSurfaceSwapLatency_);
931 std::shared_ptr<Meta> meta = std::make_shared<Meta>();
932 playStatisticalInfo_.containerMime = playStatisticalInfo_.videoMime + " : " + playStatisticalInfo_.audioMime;
933 meta->SetData(Tag::AV_PLAYER_ERR_CODE, playStatisticalInfo_.errCode);
934 meta->SetData(Tag::AV_PLAYER_ERR_MSG, playStatisticalInfo_.errMsg);
935 meta->SetData(Tag::AV_PLAYER_PLAY_DURATION, playStatisticalInfo_.playDuration);
936 meta->SetData(Tag::AV_PLAYER_SOURCE_TYPE, playStatisticalInfo_.sourceType);
937 meta->SetData(Tag::MEDIA_FILE_URI, playStatisticalInfo_.sourceUrl);
938 meta->SetData(Tag::AV_PLAYER_AVG_DOWNLOAD_RATE, playStatisticalInfo_.avgDownloadRate);
939 meta->SetData(Tag::AV_PLAYER_AVG_DOWNLOAD_SPEED, playStatisticalInfo_.avgDownloadSpeed);
940 meta->SetData(Tag::AV_PLAYER_DOWNLOAD_TOTAL_BITS, playStatisticalInfo_.totalDownLoadBits);
941 meta->SetData(Tag::AV_PLAYER_DOWNLOAD_TIME_OUT, playStatisticalInfo_.isTimeOut);
942 meta->SetData(Tag::AV_PLAYER_CONTAINER_MIME, playStatisticalInfo_.containerMime);
943 meta->SetData(Tag::AV_PLAYER_VIDEO_MIME, playStatisticalInfo_.videoMime);
944 meta->SetData(Tag::AV_PLAYER_VIDEO_RESOLUTION, playStatisticalInfo_.videoResolution);
945 meta->SetData(Tag::AV_PLAYER_VIDEO_BITRATE, playStatisticalInfo_.videoBitrate);
946 meta->SetData(Tag::AV_PLAYER_VIDEO_FRAMERATE, playStatisticalInfo_.videoFrameRate);
947 meta->SetData(Tag::AV_PLAYER_HDR_TYPE, playStatisticalInfo_.hdrType);
948 meta->SetData(Tag::AV_PLAYER_AUDIO_MIME, playStatisticalInfo_.audioMime);
949 meta->SetData(Tag::AUDIO_SAMPLE_RATE, playStatisticalInfo_.audioSampleRate);
950 meta->SetData(Tag::AUDIO_CHANNEL_COUNT, playStatisticalInfo_.audioChannelCount);
951 meta->SetData(Tag::AV_PLAYER_AUDIO_BITRATE, playStatisticalInfo_.audioBitrate);
952 meta->SetData(Tag::AV_PLAYER_IS_DRM_PROTECTED, playStatisticalInfo_.isDrmProtected);
953 meta->SetData(Tag::AV_PLAYER_START_LATENCY, playStatisticalInfo_.startLatency);
954 meta->SetData(Tag::AV_PLAYER_MAX_SEEK_LATENCY, playStatisticalInfo_.maxSeekLatency);
955 meta->SetData(Tag::AV_PLAYER_MAX_ACCURATE_SEEK_LATENCY, playStatisticalInfo_.maxAccurateSeekLatency);
956 meta->SetData(Tag::AV_PLAYER_LAG_TIMES, playStatisticalInfo_.lagTimes);
957 meta->SetData(Tag::AV_PLAYER_MAX_LAG_DURATION, playStatisticalInfo_.maxLagDuration);
958 meta->SetData(Tag::AV_PLAYER_AVG_LAG_DURATION, playStatisticalInfo_.avgLagDuration);
959 meta->SetData(Tag::AV_PLAYER_MAX_SURFACESWAP_LATENCY, playStatisticalInfo_.maxSurfaceSwapLatency);
960 AppendMediaInfo(meta, instanceId_);
961 }
962
Reset()963 int32_t HiPlayerImpl::Reset()
964 {
965 MediaTrace trace("HiPlayerImpl::Reset");
966 MEDIA_LOG_I_SHORT("Reset entered.");
967 if (pipelineStates_ == PlayerStates::PLAYER_STOPPED) {
968 return TransStatus(Status::OK);
969 }
970 singleLoop_ = false;
971 auto ret = Stop();
972 if (syncManager_ != nullptr) {
973 syncManager_->ResetMediaStartPts();
974 syncManager_->Reset();
975 }
976 if (dfxAgent_ != nullptr) {
977 dfxAgent_->SetSourceType(PlayerDfxSourceType::DFX_SOURCE_TYPE_UNKNOWN);
978 dfxAgent_->ResetAgent();
979 }
980 OnStateChanged(PlayerStateId::STOPPED);
981 return ret;
982 }
983
SeekToCurrentTime(int32_t mSeconds, PlayerSeekMode mode)984 int32_t HiPlayerImpl::SeekToCurrentTime(int32_t mSeconds, PlayerSeekMode mode)
985 {
986 MEDIA_LOG_I_SHORT("SeekToCurrentTime in. mSeconds : " PUBLIC_LOG_D32 ", seekMode : " PUBLIC_LOG_D32,
987 mSeconds, static_cast<int32_t>(mode));
988 return Seek(mSeconds, mode);
989 }
990
Seek(int64_t mSeconds, PlayerSeekMode mode, bool notifySeekDone)991 Status HiPlayerImpl::Seek(int64_t mSeconds, PlayerSeekMode mode, bool notifySeekDone)
992 {
993 MediaTrace trace("HiPlayerImpl::Seek");
994 MEDIA_LOG_I_SHORT("Seek ms " PUBLIC_LOG_D64 " mode " PUBLIC_LOG_D32, mSeconds, static_cast<int32_t>(mode));
995 if (IsSeekInSitu(mSeconds)) {
996 MEDIA_LOG_I_SHORT("Return and already at curPosMs: " PUBLIC_LOG_D64, mSeconds);
997 NotifySeek(Status::OK, notifySeekDone, mSeconds);
998 return Status::OK;
999 }
1000 int64_t seekStartTime = GetCurrentMillisecond();
1001 if (audioSink_ != nullptr) {
1002 audioSink_->SetIsTransitent(true);
1003 }
1004 FALSE_RETURN_V_MSG_E(durationMs_.load() > 0, Status::ERROR_INVALID_PARAMETER,
1005 "Seek, invalid operation, source is unseekable or invalid");
1006 isSeek_ = true;
1007 int64_t seekPos = std::max(static_cast<int64_t>(0), std::min(mSeconds, static_cast<int64_t>(durationMs_.load())));
1008 auto rtv = seekPos >= 0 ? Status::OK : Status::ERROR_INVALID_PARAMETER;
1009 if (rtv == Status::OK) {
1010 rtv = HandleSeek(seekPos, mode);
1011 }
1012 NotifySeek(rtv, notifySeekDone, seekPos);
1013 if (audioSink_ != nullptr) {
1014 audioSink_->SetIsTransitent(false);
1015 }
1016 isSeek_ = false;
1017 UpdateMaxSeekLatency(mode, seekStartTime);
1018 return rtv;
1019 }
1020
HandleSeek(int64_t seekPos, PlayerSeekMode mode)1021 Status HiPlayerImpl::HandleSeek(int64_t seekPos, PlayerSeekMode mode)
1022 {
1023 switch (pipelineStates_) {
1024 case PlayerStates::PLAYER_STARTED: {
1025 return doStartedSeek(seekPos, mode);
1026 }
1027 case PlayerStates::PLAYER_PAUSED: {
1028 return doPausedSeek(seekPos, mode);
1029 }
1030 case PlayerStates::PLAYER_PLAYBACK_COMPLETE: {
1031 return doCompletedSeek(seekPos, mode);
1032 }
1033 case PlayerStates::PLAYER_PREPARED: {
1034 return doPreparedSeek(seekPos, mode);
1035 }
1036 default:
1037 MEDIA_LOG_I_SHORT("Seek in error pipelineStates: " PUBLIC_LOG_D32,
1038 static_cast<int32_t>(pipelineStates_));
1039 return Status::ERROR_WRONG_STATE;
1040 }
1041 }
1042
IsSeekInSitu(int64_t mSeconds)1043 bool HiPlayerImpl::IsSeekInSitu(int64_t mSeconds)
1044 {
1045 int32_t curPosMs = 0;
1046 GetCurrentTime(curPosMs);
1047 int64_t currentMs = static_cast<int64_t>(curPosMs);
1048 if (pipelineStates_ == PlayerStates::PLAYER_PREPARED || pipelineStates_ == PlayerStates::PLAYER_PAUSED) {
1049 return mSeconds == currentMs;
1050 }
1051 return false;
1052 }
1053
UpdateMaxSeekLatency(PlayerSeekMode mode, int64_t seekStartTime)1054 void HiPlayerImpl::UpdateMaxSeekLatency(PlayerSeekMode mode, int64_t seekStartTime)
1055 {
1056 int64_t seekDiffTime = GetCurrentMillisecond() - seekStartTime;
1057 if (mode == PlayerSeekMode::SEEK_CLOSEST) {
1058 maxAccurateSeekLatency_ = (maxAccurateSeekLatency_ > seekDiffTime) ? maxAccurateSeekLatency_ : seekDiffTime;
1059 } else {
1060 maxSeekLatency_ = (maxSeekLatency_ > seekDiffTime) ? maxSeekLatency_ : seekDiffTime;
1061 }
1062 }
1063
NotifySeek(Status rtv, bool flag, int64_t seekPos)1064 void HiPlayerImpl::NotifySeek(Status rtv, bool flag, int64_t seekPos)
1065 {
1066 if (rtv != Status::OK) {
1067 MEDIA_LOG_E_SHORT("Seek done, seek error");
1068 // change player state to PLAYER_STATE_ERROR when seek error.
1069 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
1070 Format format;
1071 callbackLooper_.OnInfo(INFO_TYPE_SEEKDONE, -1, format);
1072 } else if (flag) {
1073 // only notify seekDone for external call.
1074 NotifySeekDone(seekPos);
1075 }
1076 }
1077
Seek(int32_t mSeconds, PlayerSeekMode mode)1078 int32_t HiPlayerImpl::Seek(int32_t mSeconds, PlayerSeekMode mode)
1079 {
1080 MediaTrace trace("HiPlayerImpl::Seek.");
1081 if (IsInValidSeekTime(mSeconds)) {
1082 MEDIA_LOG_E_SHORT("Current seek time is not at playRange");
1083 auto errCode = TransStatus(Status::ERROR_INVALID_PARAMETER);
1084 OnEvent({"engine", EventType::EVENT_ERROR, errCode});
1085 return errCode;
1086 }
1087 MEDIA_LOG_I_SHORT("Seek.");
1088 return TransStatus(Seek(mSeconds, mode, true));
1089 }
1090
doPreparedSeek(int64_t seekPos, PlayerSeekMode mode)1091 Status HiPlayerImpl::doPreparedSeek(int64_t seekPos, PlayerSeekMode mode)
1092 {
1093 MEDIA_LOG_I_SHORT("doPreparedSeek.");
1094 pipeline_ -> Flush();
1095 auto rtv = doSeek(seekPos, mode);
1096 if ((rtv == Status::OK) && demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
1097 rtv = pipeline_->Preroll(true);
1098 }
1099 return rtv;
1100 }
1101
doStartedSeek(int64_t seekPos, PlayerSeekMode mode)1102 Status HiPlayerImpl::doStartedSeek(int64_t seekPos, PlayerSeekMode mode)
1103 {
1104 MEDIA_LOG_I_SHORT("doStartedSeek");
1105 pipeline_ -> Pause();
1106 pipeline_ -> Flush();
1107 auto rtv = doSeek(seekPos, mode);
1108 pipeline_ -> Resume();
1109 inEosSeek_ = false;
1110 return rtv;
1111 }
1112
doPausedSeek(int64_t seekPos, PlayerSeekMode mode)1113 Status HiPlayerImpl::doPausedSeek(int64_t seekPos, PlayerSeekMode mode)
1114 {
1115 MEDIA_LOG_I_SHORT("doPausedSeek.");
1116 pipeline_ -> Pause();
1117 pipeline_ -> Flush();
1118 auto rtv = doSeek(seekPos, mode);
1119 inEosSeek_ = false;
1120 if ((rtv == Status::OK) && demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
1121 rtv = pipeline_->Preroll(true);
1122 }
1123 return rtv;
1124 }
1125
doCompletedSeek(int64_t seekPos, PlayerSeekMode mode)1126 Status HiPlayerImpl::doCompletedSeek(int64_t seekPos, PlayerSeekMode mode)
1127 {
1128 MEDIA_LOG_D_SHORT("doCompletedSeek");
1129 pipeline_ -> Flush();
1130 auto rtv = doSeek(seekPos, mode);
1131 if (isStreaming_) {
1132 MEDIA_LOG_D_SHORT("doCompletedSeek isStreaming_ is true");
1133 pipeline_->Resume();
1134 syncManager_->Resume();
1135 } else {
1136 if ((rtv == Status::OK) && demuxer_->IsRenderNextVideoFrameSupported() && !demuxer_->IsVideoEos()) {
1137 rtv = pipeline_->Preroll(true);
1138 }
1139 isDoCompletedSeek_ = true;
1140 callbackLooper_.StopReportMediaProgress();
1141 callbackLooper_.StopCollectMaxAmplitude();
1142 callbackLooper_.ManualReportMediaProgressOnce();
1143 OnStateChanged(PlayerStateId::PAUSE);
1144 }
1145 return rtv;
1146 }
1147
NeedSeekClosest()1148 bool HiPlayerImpl::NeedSeekClosest()
1149 {
1150 MEDIA_LOG_D("NeedSeekClosest begin");
1151 std::vector<Format> trackInfo;
1152 GetAudioTrackInfo(trackInfo);
1153 if (trackInfo.size() == 0) {
1154 MEDIA_LOG_D("NeedSeekClosest end true");
1155 return true;
1156 }
1157 for (size_t i = 0; i < trackInfo.size(); i++) {
1158 int32_t trackIndex = -1;
1159 trackInfo[i].GetIntValue("track_index", trackIndex);
1160 if (trackIndex != currentAudioTrackId_) {
1161 continue;
1162 }
1163 std::string mime = "";
1164 trackInfo[i].GetStringValue("codec_mime", mime);
1165 if (mime == "audio/x-ape") {
1166 MEDIA_LOG_D("NeedSeekClosest end false");
1167 return false;
1168 }
1169 }
1170 MEDIA_LOG_D("NeedSeekClosest end true");
1171 return true;
1172 }
1173
doSeek(int64_t seekPos, PlayerSeekMode mode)1174 Status HiPlayerImpl::doSeek(int64_t seekPos, PlayerSeekMode mode)
1175 {
1176 MEDIA_LOG_D_SHORT("HiPlayerImpl::doSeek");
1177 int64_t seekTimeUs = 0;
1178 FALSE_RETURN_V_MSG_E(Plugins::Us2HstTime(seekPos, seekTimeUs),
1179 Status::ERROR_INVALID_PARAMETER, "Invalid seekPos: %{public}" PRId64, seekPos);
1180 if (mode == PlayerSeekMode::SEEK_CLOSEST && NeedSeekClosest()) {
1181 return HandleSeekClosest(seekPos, seekTimeUs);
1182 }
1183 if (mode == PlayerSeekMode::SEEK_CLOSEST) { // reset mode
1184 mode = PlayerSeekMode::SEEK_NEXT_SYNC;
1185 if (audioSink_) {
1186 audioSink_->SetSeekTime(seekTimeUs);
1187 }
1188 }
1189 if (videoDecoder_ != nullptr) {
1190 videoDecoder_->ResetSeekInfo();
1191 }
1192 int64_t realSeekTime = seekPos;
1193 auto seekMode = Transform2SeekMode(mode);
1194 auto rtv = demuxer_->SeekTo(seekPos, seekMode, realSeekTime);
1195 // if it has no next key frames, seek previous.
1196 if (rtv != Status::OK && mode == PlayerSeekMode::SEEK_NEXT_SYNC) {
1197 seekMode = Transform2SeekMode(PlayerSeekMode::SEEK_PREVIOUS_SYNC);
1198 rtv = demuxer_->SeekTo(seekPos, seekMode, realSeekTime);
1199 }
1200 if (rtv == Status::OK) {
1201 syncManager_->Seek(seekTimeUs);
1202 if (subtitleSink_ != nullptr) {
1203 subtitleSink_->NotifySeek();
1204 }
1205 }
1206 return rtv;
1207 }
1208
HandleSeekClosest(int64_t seekPos, int64_t seekTimeUs)1209 Status HiPlayerImpl::HandleSeekClosest(int64_t seekPos, int64_t seekTimeUs)
1210 {
1211 MEDIA_LOG_I_SHORT("doSeek SEEK_CLOSEST");
1212 isSeekClosest_.store(true);
1213 if (videoDecoder_ != nullptr) {
1214 videoDecoder_->SetSeekTime(seekTimeUs + mediaStartPts_);
1215 }
1216 seekAgent_ = std::make_shared<SeekAgent>(demuxer_, mediaStartPts_);
1217 SetFrameRateForSeekPerformance(FRAME_RATE_FOR_SEEK_PERFORMANCE);
1218 bool timeout = false;
1219 auto res = seekAgent_->Seek(seekPos, timeout);
1220 SetFrameRateForSeekPerformance(FRAME_RATE_DEFAULT);
1221 MEDIA_LOG_I_SHORT("seekAgent_ Seek end");
1222 if (res != Status::OK) {
1223 MEDIA_LOG_E_SHORT("Seek closest failed");
1224 } else {
1225 syncManager_->Seek(seekTimeUs, true);
1226 if (timeout && videoDecoder_ != nullptr) {
1227 videoDecoder_->ResetSeekInfo();
1228 }
1229 }
1230 if (subtitleSink_ != nullptr) {
1231 subtitleSink_->NotifySeek();
1232 }
1233 seekAgent_.reset();
1234 return res;
1235 }
1236
SetVolume(float leftVolume, float rightVolume)1237 int32_t HiPlayerImpl::SetVolume(float leftVolume, float rightVolume)
1238 {
1239 MEDIA_LOG_D("SetVolume in");
1240 FALSE_RETURN_V_MSG_E(!(leftVolume < 0 || leftVolume > MAX_MEDIA_VOLUME
1241 || rightVolume < 0 || rightVolume > MAX_MEDIA_VOLUME),
1242 (int32_t)Status::ERROR_INVALID_PARAMETER, "volume not valid, should be in range [0,100]");
1243 float volume = 0.0f;
1244 if (leftVolume < 1e-6 && rightVolume >= 1e-6) { // 1e-6
1245 volume = rightVolume;
1246 } else if (rightVolume < 1e-6 && leftVolume >= 1e-6) { // 1e-6
1247 volume = leftVolume;
1248 } else {
1249 volume = (leftVolume + rightVolume) / 2; // 2
1250 }
1251 volume /= MAX_MEDIA_VOLUME; // normalize to 0~1
1252 FALSE_RETURN_V_MSG_E(audioSink_ != nullptr, (int32_t)TransStatus(Status::ERROR_INVALID_OPERATION),
1253 "Set volume failed, audio sink is nullptr");
1254 MEDIA_LOG_D_SHORT("Sink SetVolume");
1255 Status ret = audioSink_->SetVolume(volume);
1256 if (ret != Status::OK) {
1257 MEDIA_LOG_E_SHORT("SetVolume failed with error " PUBLIC_LOG_D32, static_cast<int>(ret));
1258 }
1259 return TransStatus(ret);
1260 }
1261
SetVideoSurface(sptr<Surface> surface)1262 int32_t HiPlayerImpl::SetVideoSurface(sptr<Surface> surface)
1263 {
1264 MEDIA_LOG_D_SHORT("SetVideoSurface in");
1265 #ifdef SUPPORT_VIDEO
1266 int64_t startSetSurfaceTime = GetCurrentMillisecond();
1267 FALSE_RETURN_V_MSG_E(surface != nullptr, (int32_t)(Status::ERROR_INVALID_PARAMETER),
1268 "Set video surface failed, surface == nullptr");
1269 surface_ = surface;
1270 isSetVideoSurface_ = true;
1271 if (videoDecoder_ != nullptr &&
1272 pipelineStates_ != PlayerStates::PLAYER_STOPPED &&
1273 pipelineStates_ != PlayerStates::PLAYER_STATE_ERROR) {
1274 return TransStatus(videoDecoder_->SetVideoSurface(surface));
1275 }
1276 int64_t endSetSurfaceTime = GetCurrentMillisecond();
1277 int64_t diffTime = endSetSurfaceTime - startSetSurfaceTime;
1278 maxSurfaceSwapLatency_ = maxSurfaceSwapLatency_ > diffTime ? maxSurfaceSwapLatency_ : diffTime;
1279 #endif
1280 return TransStatus(Status::OK);
1281 }
1282
SetDecryptConfig(const sptr<OHOS::DrmStandard::IMediaKeySessionService> &keySessionProxy, bool svp)1283 int32_t HiPlayerImpl::SetDecryptConfig(const sptr<OHOS::DrmStandard::IMediaKeySessionService> &keySessionProxy,
1284 bool svp)
1285 {
1286 MEDIA_LOG_I_SHORT("SetDecryptConfig in");
1287 #ifdef SUPPORT_AVPLAYER_DRM
1288 FALSE_RETURN_V_MSG_E(keySessionProxy != nullptr, (int32_t)(Status::ERROR_INVALID_PARAMETER),
1289 "SetDecryptConfig failed, keySessionProxy == nullptr");
1290 keySessionServiceProxy_ = keySessionProxy;
1291 if (svp) {
1292 svpMode_ = HiplayerSvpMode::SVP_TRUE;
1293 } else {
1294 svpMode_ = HiplayerSvpMode::SVP_FALSE;
1295 }
1296
1297 std::unique_lock<std::mutex> drmLock(drmMutex_);
1298 MEDIA_LOG_I_SHORT("For Drmcond SetDecryptConfig will trig drmPreparedCond");
1299 isDrmPrepared_ = true;
1300 drmConfigCond_.notify_all();
1301 #endif
1302 return TransStatus(Status::OK);
1303 }
1304
SetLooping(bool loop)1305 int32_t HiPlayerImpl::SetLooping(bool loop)
1306 {
1307 MEDIA_LOG_I_SHORT("SetLooping in, loop: " PUBLIC_LOG_D32, loop);
1308 singleLoop_ = loop;
1309 return TransStatus(Status::OK);
1310 }
1311
SetParameter(const Format& params)1312 int32_t HiPlayerImpl::SetParameter(const Format& params)
1313 {
1314 MediaTrace trace("HiPlayerImpl::SetParameter");
1315 #ifdef SUPPORT_VIDEO
1316 if (params.ContainKey(PlayerKeys::VIDEO_SCALE_TYPE)) {
1317 int32_t videoScaleType = 0;
1318 params.GetIntValue(PlayerKeys::VIDEO_SCALE_TYPE, videoScaleType);
1319 return SetVideoScaleType(VideoScaleType(videoScaleType));
1320 }
1321 #endif
1322 if (params.ContainKey(PlayerKeys::CONTENT_TYPE) && params.ContainKey(PlayerKeys::STREAM_USAGE)) {
1323 int32_t contentType;
1324 int32_t streamUsage;
1325 int32_t rendererFlag;
1326 params.GetIntValue(PlayerKeys::CONTENT_TYPE, contentType);
1327 params.GetIntValue(PlayerKeys::STREAM_USAGE, streamUsage);
1328 params.GetIntValue(PlayerKeys::RENDERER_FLAG, rendererFlag);
1329 return SetAudioRendererInfo(contentType, streamUsage, rendererFlag);
1330 }
1331 if (params.ContainKey(PlayerKeys::AUDIO_INTERRUPT_MODE)) {
1332 int32_t interruptMode = 0;
1333 params.GetIntValue(PlayerKeys::AUDIO_INTERRUPT_MODE, interruptMode);
1334 return SetAudioInterruptMode(interruptMode);
1335 }
1336 return TransStatus(Status::OK);
1337 }
1338
SetObs(const std::weak_ptr<IPlayerEngineObs>& obs)1339 int32_t HiPlayerImpl::SetObs(const std::weak_ptr<IPlayerEngineObs>& obs)
1340 {
1341 MEDIA_LOG_D_SHORT("SetObs");
1342 callbackLooper_.StartWithPlayerEngineObs(obs);
1343 return TransStatus(Status::OK);
1344 }
1345
GetCurrentTime(int32_t& currentPositionMs)1346 int32_t HiPlayerImpl::GetCurrentTime(int32_t& currentPositionMs)
1347 {
1348 if (!isSetPlayRange_ && (curState_ == PlayerStateId::EOS || inEosSeek_)) {
1349 currentPositionMs = durationMs_.load();
1350 return TransStatus(Status::OK);
1351 }
1352 if (isSeek_.load()) {
1353 return TransStatus(Status::ERROR_UNKNOWN);
1354 }
1355 FALSE_RETURN_V(syncManager_ != nullptr, TransStatus(Status::ERROR_NULL_POINTER));
1356 currentPositionMs = Plugins::HstTime2Us32(syncManager_->GetMediaTimeNow());
1357 if (currentPositionMs < 0) {
1358 currentPositionMs = 0;
1359 }
1360 if (durationMs_.load() > 0 && currentPositionMs > durationMs_.load()) {
1361 currentPositionMs = durationMs_.load();
1362 }
1363 return TransStatus(Status::OK);
1364 }
1365
GetLiveStreamCurrentTime(int32_t& currentPositionMs)1366 int32_t HiPlayerImpl::GetLiveStreamCurrentTime(int32_t& currentPositionMs)
1367 {
1368 FALSE_RETURN_V(syncManager_ != nullptr, TransStatus(Status::ERROR_NULL_POINTER));
1369 currentPositionMs = Plugins::HstTime2Us32(syncManager_->GetMediaTimeNow());
1370 MEDIA_LOG_D("GetLiveStreamCurrentTime currentPositionMs: " PUBLIC_LOG_D32, currentPositionMs);
1371 return TransStatus(Status::OK);
1372 }
1373
GetDuration(int32_t& durationMs)1374 int32_t HiPlayerImpl::GetDuration(int32_t& durationMs)
1375 {
1376 durationMs = durationMs_.load();
1377 MEDIA_LOG_D_SHORT("GetDuration " PUBLIC_LOG_D32, durationMs);
1378 return TransStatus(Status::OK);
1379 }
1380
InitDuration()1381 int32_t HiPlayerImpl::InitDuration()
1382 {
1383 FALSE_RETURN_V_MSG_E(demuxer_ != nullptr,
1384 TransStatus(Status::ERROR_WRONG_STATE), "Get media duration failed, demuxer is not ready");
1385 int64_t duration = 0;
1386 bool found = false;
1387 if (demuxer_->GetDuration(duration)) {
1388 found = true;
1389 } else {
1390 MEDIA_LOG_W_SHORT("Get media duration failed");
1391 }
1392 if (found && duration > 0 && duration != durationMs_.load()) {
1393 durationMs_ = Plugins::HstTime2Us(duration);
1394 }
1395 durationMs_ = std::max(durationMs_.load(), 0);
1396 MEDIA_LOG_D_SHORT("duration: " PUBLIC_LOG_D32, durationMs_.load());
1397 return TransStatus(Status::OK);
1398 }
1399
SetBundleName(std::string bundleName)1400 void HiPlayerImpl::SetBundleName(std::string bundleName)
1401 {
1402 if (!bundleName.empty()) {
1403 MEDIA_LOG_I_SHORT("SetBundleName bundleName: " PUBLIC_LOG_S, bundleName.c_str());
1404 demuxer_->SetBundleName(bundleName);
1405 } else {
1406 MEDIA_LOG_I_SHORT("SetBundleName failed");
1407 }
1408 }
1409
InitVideoWidthAndHeight()1410 int32_t HiPlayerImpl::InitVideoWidthAndHeight()
1411 {
1412 #ifdef SUPPORT_VIDEO
1413 std::vector<Format> videoTrackInfo;
1414 GetVideoTrackInfo(videoTrackInfo);
1415 if (videoTrackInfo.size() == 0) {
1416 MEDIA_LOG_E_SHORT("InitVideoWidthAndHeight failed, as videoTrackInfo is empty!");
1417 return TransStatus(Status::ERROR_INVALID_OPERATION);
1418 }
1419 for (auto& videoTrack : videoTrackInfo) {
1420 int32_t height;
1421 videoTrack.GetIntValue("height", height);
1422 int32_t width;
1423 videoTrack.GetIntValue("width", width);
1424 if (height <= 0 && width <= 0) {
1425 continue;
1426 }
1427 int32_t rotation = 0;
1428 needSwapWH_ = videoTrack.GetIntValue(Tag::VIDEO_ROTATION, rotation)
1429 && (rotation == rotation90 || rotation == rotation270);
1430 MEDIA_LOG_D_SHORT("rotation %{public}d", rotation);
1431 videoWidth_ = !needSwapWH_.load() ? width : height;
1432 videoHeight_ = !needSwapWH_.load() ? height : width;
1433 MEDIA_LOG_D_SHORT("InitVideo width %{public}d, height %{public}d",
1434 videoWidth_.load(), videoHeight_.load());
1435 break;
1436 }
1437 #endif
1438 return TransStatus(Status::OK);
1439 }
1440
InitAudioDefaultTrackIndex()1441 Status HiPlayerImpl::InitAudioDefaultTrackIndex()
1442 {
1443 if (!demuxer_) {
1444 return Status::ERROR_UNKNOWN;
1445 }
1446 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1447 std::string mime;
1448 for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1449 auto trackInfo = metaInfo[trackIndex];
1450 if (!(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
1451 MEDIA_LOG_W_SHORT("Get MIME fail");
1452 continue;
1453 }
1454 if (IsAudioMime(mime)) {
1455 defaultAudioTrackId_ = static_cast<int32_t>(trackIndex);
1456 break;
1457 }
1458 }
1459 currentAudioTrackId_ = defaultAudioTrackId_;
1460 return Status::OK;
1461 }
1462
InitVideoDefaultTrackIndex()1463 Status HiPlayerImpl::InitVideoDefaultTrackIndex()
1464 {
1465 if (!demuxer_) {
1466 return Status::ERROR_UNKNOWN;
1467 }
1468 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1469 std::string mime;
1470 for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1471 auto trackInfo = metaInfo[trackIndex];
1472 if (!(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
1473 MEDIA_LOG_W("Get MIME fail");
1474 continue;
1475 }
1476 if (IsVideoMime(mime)) {
1477 defaultVideoTrackId_ = static_cast<int32_t>(trackIndex);
1478 break;
1479 }
1480 }
1481 currentVideoTrackId_ = defaultVideoTrackId_;
1482 return Status::OK;
1483 }
1484
InitSubtitleDefaultTrackIndex()1485 Status HiPlayerImpl::InitSubtitleDefaultTrackIndex()
1486 {
1487 if (!demuxer_) {
1488 return Status::ERROR_UNKNOWN;
1489 }
1490 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1491 std::string mime;
1492 for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1493 auto trackInfo = metaInfo[trackIndex];
1494 if (!(trackInfo->GetData(Tag::MIME_TYPE, mime))) {
1495 MEDIA_LOG_W("Get MIME fail");
1496 continue;
1497 }
1498 if (IsSubtitleMime(mime)) {
1499 defaultSubtitleTrackId_ = static_cast<int32_t>(trackIndex);
1500 break;
1501 }
1502 }
1503 currentSubtitleTrackId_ = defaultSubtitleTrackId_;
1504 return Status::OK;
1505 }
1506
SetAudioEffectMode(int32_t effectMode)1507 int32_t HiPlayerImpl::SetAudioEffectMode(int32_t effectMode)
1508 {
1509 MEDIA_LOG_I_SHORT("SetAudioEffectMode in");
1510 Status res = Status::OK;
1511 if (audioSink_ != nullptr) {
1512 res = audioSink_->SetAudioEffectMode(effectMode);
1513 }
1514 if (res != Status::OK) {
1515 MEDIA_LOG_E_SHORT("audioSink set AudioEffectMode error");
1516 return MSERR_UNKNOWN;
1517 }
1518 return MSERR_OK;
1519 }
1520
GetAudioEffectMode(int32_t &effectMode)1521 int32_t HiPlayerImpl::GetAudioEffectMode(int32_t &effectMode)
1522 {
1523 MEDIA_LOG_I_SHORT("GetAudioEffectMode in");
1524 Status res = Status::OK;
1525 if (audioSink_ != nullptr) {
1526 res = audioSink_->GetAudioEffectMode(effectMode);
1527 }
1528 FALSE_RETURN_V_MSG_E(res == Status::OK,
1529 MSERR_UNKNOWN, "audioSink get AudioEffectMode error");
1530 return MSERR_OK;
1531 }
1532
GetMaxAmplitude()1533 float HiPlayerImpl::GetMaxAmplitude()
1534 {
1535 float maxAmplitude = 0.0f;
1536 if (audioSink_ != nullptr) {
1537 maxAmplitude = audioSink_->GetMaxAmplitude();
1538 }
1539 return maxAmplitude;
1540 }
1541
SetPlaybackSpeed(PlaybackRateMode mode)1542 int32_t HiPlayerImpl::SetPlaybackSpeed(PlaybackRateMode mode)
1543 {
1544 MEDIA_LOG_I_SHORT("SetPlaybackSpeed %{public}d", mode);
1545 Status res = Status::OK;
1546 float speed = TransformPlayRate2Float(mode);
1547 if (audioSink_ != nullptr) {
1548 res = audioSink_->SetSpeed(speed);
1549 }
1550 if (subtitleSink_ != nullptr) {
1551 res = subtitleSink_->SetSpeed(speed);
1552 }
1553 if (res != Status::OK) {
1554 MEDIA_LOG_E_SHORT("SetPlaybackSpeed audioSink set speed error");
1555 return MSERR_UNKNOWN;
1556 }
1557 if (syncManager_ != nullptr) {
1558 res = syncManager_->SetPlaybackRate(speed);
1559 }
1560 if (res != Status::OK) {
1561 MEDIA_LOG_E_SHORT("SetPlaybackSpeed syncManager set audio speed error");
1562 return MSERR_UNKNOWN;
1563 }
1564 if (demuxer_ != nullptr) {
1565 demuxer_->SetSpeed(speed);
1566 }
1567 playbackRateMode_ = mode;
1568 Format format;
1569 callbackLooper_.OnInfo(INFO_TYPE_SPEEDDONE, mode, format);
1570 MEDIA_LOG_I_SHORT("SetPlaybackSpeed end");
1571 return MSERR_OK;
1572 }
1573
GetPlaybackSpeed(PlaybackRateMode& mode)1574 int32_t HiPlayerImpl::GetPlaybackSpeed(PlaybackRateMode& mode)
1575 {
1576 MEDIA_LOG_I_SHORT("GetPlaybackSpeed in");
1577 mode = playbackRateMode_.load();
1578 MEDIA_LOG_I_SHORT("GetPlaybackSpeed end, mode is " PUBLIC_LOG_D32, mode);
1579 return MSERR_OK;
1580 }
1581
IsVideoMime(const std::string& mime)1582 bool HiPlayerImpl::IsVideoMime(const std::string& mime)
1583 {
1584 return mime.find("video/") == 0;
1585 }
1586
IsAudioMime(const std::string& mime)1587 bool HiPlayerImpl::IsAudioMime(const std::string& mime)
1588 {
1589 return mime.find("audio/") == 0;
1590 }
1591
IsSubtitleMime(const std::string& mime)1592 bool HiPlayerImpl::IsSubtitleMime(const std::string& mime)
1593 {
1594 if (mime == "application/x-subrip" || mime == "text/vtt") {
1595 return true;
1596 }
1597 return false;
1598 }
1599
GetCurrentTrack(int32_t trackType, int32_t &index)1600 int32_t HiPlayerImpl::GetCurrentTrack(int32_t trackType, int32_t &index)
1601 {
1602 FALSE_RETURN_V_MSG_W(trackType >= OHOS::Media::MediaType::MEDIA_TYPE_AUD &&
1603 trackType <= OHOS::Media::MediaType::MEDIA_TYPE_SUBTITLE,
1604 MSERR_INVALID_VAL, "Invalid trackType %{public}d", trackType);
1605 if (trackType == OHOS::Media::MediaType::MEDIA_TYPE_AUD) {
1606 if (currentAudioTrackId_ < 0) {
1607 if (Status::OK != InitAudioDefaultTrackIndex()) {
1608 return MSERR_UNKNOWN;
1609 }
1610 }
1611 index = currentAudioTrackId_;
1612 } else if (trackType == OHOS::Media::MediaType::MEDIA_TYPE_VID) {
1613 if (currentVideoTrackId_ < 0) {
1614 if (Status::OK != InitVideoDefaultTrackIndex()) {
1615 return MSERR_UNKNOWN;
1616 }
1617 }
1618 index = currentVideoTrackId_;
1619 } else if (trackType == OHOS::Media::MediaType::MEDIA_TYPE_SUBTITLE) {
1620 if (currentSubtitleTrackId_ < 0) {
1621 if (Status::OK != InitSubtitleDefaultTrackIndex()) {
1622 return MSERR_UNKNOWN;
1623 }
1624 }
1625 index = currentSubtitleTrackId_;
1626 } else {
1627 (void)index;
1628 }
1629
1630 return MSERR_OK;
1631 }
1632
InnerSelectTrack(std::string mime, int32_t trackId, PlayerSwitchMode mode)1633 int32_t HiPlayerImpl::InnerSelectTrack(std::string mime, int32_t trackId, PlayerSwitchMode mode)
1634 {
1635 if (Status::OK != demuxer_->SelectTrack(trackId)) {
1636 MEDIA_LOG_E_SHORT("SelectTrack error. trackId is " PUBLIC_LOG_D32, trackId);
1637 return MSERR_UNKNOWN;
1638 }
1639 if (IsAudioMime(mime)) {
1640 currentAudioTrackId_ = trackId;
1641 } else if (IsSubtitleMime(mime)) {
1642 currentSubtitleTrackId_ = trackId;
1643 } else if (IsVideoMime(mime)) {
1644 currentVideoTrackId_ = trackId;
1645 int32_t curPosMs = 0;
1646 GetCurrentTime(curPosMs);
1647 if (mode == PlayerSwitchMode::SWITCH_SEGMENT) {
1648 MEDIA_LOG_I("SelectTrack seek begin SWITCH_SEGMENT " PUBLIC_LOG_D32, trackId);
1649 return TransStatus(Seek(curPosMs, PlayerSeekMode::SEEK_PREVIOUS_SYNC, false));
1650 } else if (mode == PlayerSwitchMode::SWITCH_CLOSEST) {
1651 MEDIA_LOG_I("SelectTrack seek begin SWITCH_CLOSEST " PUBLIC_LOG_D32, trackId);
1652 return TransStatus(Seek(curPosMs, PlayerSeekMode::SEEK_CLOSEST, false));
1653 }
1654 }
1655 return MSERR_OK;
1656 }
1657
SelectTrack(int32_t trackId, PlayerSwitchMode mode)1658 int32_t HiPlayerImpl::SelectTrack(int32_t trackId, PlayerSwitchMode mode)
1659 {
1660 MEDIA_LOG_I_SHORT("SelectTrack begin trackId is " PUBLIC_LOG_D32, trackId);
1661 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1662 std::string mime;
1663 FALSE_RETURN_V_MSG_W(trackId >= 0 && trackId < static_cast<int32_t>(metaInfo.size()),
1664 MSERR_INVALID_VAL, "SelectTrack trackId invalid");
1665 if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
1666 MEDIA_LOG_E_SHORT("SelectTrack trackId " PUBLIC_LOG_D32 "get mime error", trackId);
1667 return MSERR_INVALID_VAL;
1668 }
1669 if (IsAudioMime(mime)) {
1670 FALSE_RETURN_V_MSG_W(trackId != currentAudioTrackId_, MSERR_INVALID_VAL, "SelectTrack trackId invalid");
1671 if (currentAudioTrackId_ < 0) {
1672 if (Status::OK != InitAudioDefaultTrackIndex()) {
1673 MEDIA_LOG_W("Init audio default track index fail");
1674 }
1675 }
1676 } else if (IsVideoMime(mime)) {
1677 FALSE_RETURN_V_MSG_W(trackId != currentVideoTrackId_, MSERR_INVALID_VAL, "SelectTrack trackId invalid");
1678 if (currentVideoTrackId_ < 0) {
1679 if (Status::OK != InitVideoDefaultTrackIndex()) {
1680 MEDIA_LOG_W("Init video default track index fail");
1681 }
1682 }
1683 } else if (IsSubtitleMime(mime)) {
1684 FALSE_RETURN_V_MSG_W(trackId != currentSubtitleTrackId_, MSERR_INVALID_VAL, "SelectTrack trackId invalid");
1685 if (currentSubtitleTrackId_ < 0) {
1686 if (Status::OK != InitSubtitleDefaultTrackIndex()) {
1687 MEDIA_LOG_W("Init video default track index fail");
1688 }
1689 }
1690 } else {
1691 MEDIA_LOG_E("SelectTrack invalid mimeType. trackId is " PUBLIC_LOG_D32, trackId);
1692 return MSERR_UNKNOWN;
1693 }
1694 return InnerSelectTrack(mime, trackId, mode);
1695 }
1696
DeselectTrack(int32_t trackId)1697 int32_t HiPlayerImpl::DeselectTrack(int32_t trackId)
1698 {
1699 MEDIA_LOG_I("DeselectTrack trackId is " PUBLIC_LOG_D32, trackId);
1700 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1701 FALSE_RETURN_V_MSG_W(trackId >= 0 && trackId < static_cast<int32_t>(metaInfo.size()),
1702 MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
1703 std::string mime;
1704 if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
1705 MEDIA_LOG_E("DeselectTrack trackId " PUBLIC_LOG_D32 "get mime error", trackId);
1706 return MSERR_INVALID_VAL;
1707 }
1708 if (IsAudioMime(mime)) {
1709 FALSE_RETURN_V_MSG_W(trackId == currentAudioTrackId_ && currentAudioTrackId_ >= 0,
1710 MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
1711 return SelectTrack(defaultAudioTrackId_, PlayerSwitchMode::SWITCH_SMOOTH);
1712 } else if (IsVideoMime(mime)) {
1713 FALSE_RETURN_V_MSG_W(trackId == currentVideoTrackId_ && currentVideoTrackId_ >= 0,
1714 MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
1715 return SelectTrack(defaultVideoTrackId_, PlayerSwitchMode::SWITCH_SMOOTH);
1716 } else if (IsSubtitleMime(mime)) {
1717 FALSE_RETURN_V_MSG_W(trackId == currentSubtitleTrackId_ && currentSubtitleTrackId_ >= 0,
1718 MSERR_INVALID_VAL, "DeselectTrack trackId invalid");
1719 if (needUpdateSubtitle_.load()) {
1720 needUpdateSubtitle_.store(false);
1721 } else {
1722 needUpdateSubtitle_.store(true);
1723 }
1724 } else {}
1725 return MSERR_OK;
1726 }
1727
GetVideoTrackInfo(std::vector<Format>& videoTrack)1728 int32_t HiPlayerImpl::GetVideoTrackInfo(std::vector<Format>& videoTrack)
1729 {
1730 MEDIA_LOG_D("GetVideoTrackInfo in");
1731 FALSE_RETURN_V(demuxer_ != nullptr, MSERR_INVALID_STATE);
1732 std::string mime;
1733 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1734 for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1735 auto trackInfo = metaInfo[trackIndex];
1736 if (!(trackInfo->GetData(Tag::MIME_TYPE, mime)) || mime.find("invalid") == 0) {
1737 MEDIA_LOG_W_SHORT("Get MIME fail");
1738 continue;
1739 }
1740 if (IsVideoMime(mime)) {
1741 Format videoTrackInfo {};
1742 playStatisticalInfo_.videoMime = mime;
1743 videoTrackInfo.PutStringValue("codec_mime", mime);
1744 videoTrackInfo.PutIntValue("track_type", static_cast<int32_t>(OHOS::Media::Plugins::MediaType::VIDEO));
1745 videoTrackInfo.PutIntValue("track_index", trackIndex);
1746 int64_t bitRate;
1747 trackInfo->GetData(Tag::MEDIA_BITRATE, bitRate);
1748 playStatisticalInfo_.videoBitrate = static_cast<int32_t>(bitRate);
1749 videoTrackInfo.PutLongValue("bitrate", bitRate);
1750 double frameRate;
1751 trackInfo->GetData(Tag::VIDEO_FRAME_RATE, frameRate);
1752 playStatisticalInfo_.videoFrameRate = static_cast<float>(frameRate);
1753 videoTrackInfo.PutDoubleValue("frame_rate", frameRate * FRAME_RATE_UNIT_MULTIPLE);
1754 int32_t height = GetSarVideoHeight(trackInfo);
1755 videoTrackInfo.PutIntValue("height", height);
1756 int32_t width = GetSarVideoWidth(trackInfo);
1757 playStatisticalInfo_.videoResolution = std::to_string(width) + "x" + std::to_string(height);
1758 videoTrackInfo.PutIntValue("width", width);
1759 Plugins::VideoRotation rotation;
1760 trackInfo->Get<Tag::VIDEO_ROTATION>(rotation);
1761 videoTrackInfo.PutIntValue(Tag::VIDEO_ROTATION, rotation);
1762 videoTrackInfo.PutStringValue("track_name", "video");
1763 bool isHdr = false;
1764 trackInfo->GetData(Tag::VIDEO_IS_HDR_VIVID, isHdr);
1765 if (isHdr) {
1766 playStatisticalInfo_.hdrType = static_cast<int8_t>(VideoHdrType::VIDEO_HDR_TYPE_VIVID);
1767 videoTrackInfo.PutIntValue("hdr_type", 1);
1768 } else {
1769 playStatisticalInfo_.hdrType = static_cast<int8_t>(VideoHdrType::VIDEO_HDR_TYPE_NONE);
1770 videoTrackInfo.PutIntValue("hdr_type", 0);
1771 }
1772 videoTrack.emplace_back(std::move(videoTrackInfo));
1773 }
1774 }
1775 return TransStatus(Status::OK);
1776 }
1777
GetSarVideoWidth(std::shared_ptr<Meta> trackInfo)1778 int32_t HiPlayerImpl::GetSarVideoWidth(std::shared_ptr<Meta> trackInfo)
1779 {
1780 int32_t width;
1781 trackInfo->GetData(Tag::VIDEO_WIDTH, width);
1782 double videoSar;
1783 bool ret = trackInfo->GetData(Tag::VIDEO_SAR, videoSar);
1784 if (ret && videoSar < 1) {
1785 width = static_cast<int32_t>(width * videoSar);
1786 }
1787 return width;
1788 }
1789
GetSarVideoHeight(std::shared_ptr<Meta> trackInfo)1790 int32_t HiPlayerImpl::GetSarVideoHeight(std::shared_ptr<Meta> trackInfo)
1791 {
1792 int32_t height;
1793 trackInfo->GetData(Tag::VIDEO_HEIGHT, height);
1794 double videoSar;
1795 bool ret = trackInfo->GetData(Tag::VIDEO_SAR, videoSar);
1796 if (ret && videoSar > 1) {
1797 height = static_cast<int32_t>(height / videoSar);
1798 }
1799 return height;
1800 }
1801
GetPlaybackInfo(Format& playbackInfo)1802 int32_t HiPlayerImpl::GetPlaybackInfo(Format& playbackInfo)
1803 {
1804 MEDIA_LOG_D("GetPlaybackInfo in");
1805
1806 PlaybackInfo playbackInfoTmp;
1807 auto ret = demuxer_->GetPlaybackInfo(playbackInfoTmp);
1808 if (ret == Status::OK) {
1809 playbackInfo.PutStringValue("server_ip_address", playbackInfoTmp.serverIpAddress);
1810 playbackInfo.PutLongValue("average_download_rate", playbackInfoTmp.averageDownloadRate);
1811 playbackInfo.PutLongValue("download_rate", playbackInfoTmp.downloadRate);
1812 playbackInfo.PutIntValue("is_downloading", playbackInfoTmp.isDownloading);
1813 playbackInfo.PutLongValue("buffer_duration", playbackInfoTmp.bufferDuration);
1814 }
1815 return TransStatus(Status::OK);
1816 }
1817
GetAudioTrackInfo(std::vector<Format>& audioTrack)1818 int32_t HiPlayerImpl::GetAudioTrackInfo(std::vector<Format>& audioTrack)
1819 {
1820 MEDIA_LOG_I_SHORT("GetAudioTrackInfo in");
1821 std::string mime;
1822 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1823 for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1824 auto trackInfo = metaInfo[trackIndex];
1825 if (!(trackInfo->GetData(Tag::MIME_TYPE, mime)) || mime.find("invalid") == 0) {
1826 MEDIA_LOG_W_SHORT("Get MIME fail");
1827 continue;
1828 }
1829 if (IsAudioMime(mime)) {
1830 playStatisticalInfo_.audioMime = mime;
1831 Format audioTrackInfo {};
1832 audioTrackInfo.PutStringValue("codec_mime", mime);
1833 audioTrackInfo.PutIntValue("track_type", static_cast<int32_t>(OHOS::Media::Plugins::MediaType::AUDIO));
1834 audioTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackIndex));
1835 int64_t bitRate = 0;
1836 trackInfo->GetData(Tag::MEDIA_BITRATE, bitRate);
1837 playStatisticalInfo_.audioBitrate = static_cast<int32_t>(bitRate);
1838 audioTrackInfo.PutLongValue("bitrate", bitRate);
1839 int32_t audioChannels = 0;
1840 trackInfo->GetData(Tag::AUDIO_CHANNEL_COUNT, audioChannels);
1841 playStatisticalInfo_.audioChannelCount = audioChannels;
1842 audioTrackInfo.PutIntValue("channel_count", audioChannels);
1843 int32_t audioSampleRate = 0;
1844 trackInfo->GetData(Tag::AUDIO_SAMPLE_RATE, audioSampleRate);
1845 playStatisticalInfo_.audioSampleRate = audioSampleRate;
1846 audioTrackInfo.PutIntValue("sample_rate", audioSampleRate);
1847 int32_t sampleDepth = 0;
1848 bool isHasData = trackInfo->GetData(Tag::AUDIO_BITS_PER_CODED_SAMPLE, sampleDepth);
1849 if (!isHasData || sampleDepth <= 0) {
1850 trackInfo->GetData(Tag::AUDIO_BITS_PER_RAW_SAMPLE, sampleDepth);
1851 }
1852 audioTrackInfo.PutIntValue("sample_depth", sampleDepth);
1853 std::string lang;
1854 trackInfo->GetData(Tag::MEDIA_LANGUAGE, lang);
1855 audioTrackInfo.PutStringValue("language", lang);
1856 audioTrackInfo.PutStringValue("track_name", "audio");
1857 audioTrack.emplace_back(std::move(audioTrackInfo));
1858 }
1859 }
1860 return TransStatus(Status::OK);
1861 }
1862
GetSubtitleTrackInfo(std::vector<Format>& subtitleTrack)1863 int32_t HiPlayerImpl::GetSubtitleTrackInfo(std::vector<Format>& subtitleTrack)
1864 {
1865 MEDIA_LOG_I("GetSubtitleTrackInfo in");
1866 std::string mime;
1867 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
1868 for (size_t trackIndex = 0; trackIndex < metaInfo.size(); trackIndex++) {
1869 auto trackInfo = metaInfo[trackIndex];
1870 if (!(trackInfo->GetData(Tag::MIME_TYPE, mime)) || mime.find("invalid") == 0) {
1871 MEDIA_LOG_W("Get MIME fail");
1872 continue;
1873 }
1874 if (IsSubtitleMime(mime)) {
1875 playStatisticalInfo_.subtitleMime = mime;
1876 Format subtitleTrackInfo {};
1877 subtitleTrackInfo.PutStringValue("codec_mime", mime);
1878 subtitleTrackInfo.PutIntValue("track_type",
1879 static_cast<int32_t>(OHOS::Media::Plugins::MediaType::SUBTITLE));
1880 subtitleTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackIndex));
1881
1882 std::string lang;
1883 trackInfo->GetData(Tag::MEDIA_LANGUAGE, lang);
1884 subtitleTrackInfo.PutStringValue("language", lang);
1885 subtitleTrackInfo.PutStringValue("track_name", "subtitle");
1886
1887 subtitleTrack.emplace_back(std::move(subtitleTrackInfo));
1888 }
1889 }
1890 return TransStatus(Status::OK);
1891 }
1892
GetVideoWidth()1893 int32_t HiPlayerImpl::GetVideoWidth()
1894 {
1895 #ifdef SUPPORT_VIDEO
1896 MEDIA_LOG_D_SHORT("GetVideoWidth in. video width: " PUBLIC_LOG_D32, videoWidth_.load());
1897 #endif
1898 return videoWidth_.load();
1899 }
1900
GetVideoHeight()1901 int32_t HiPlayerImpl::GetVideoHeight()
1902 {
1903 #ifdef SUPPORT_VIDEO
1904 MEDIA_LOG_D_SHORT("GetVideoHeight in. video height: " PUBLIC_LOG_D32, videoHeight_.load());
1905 #endif
1906 return videoHeight_.load();
1907 }
1908
SetVideoScaleType(OHOS::Media::VideoScaleType videoScaleType)1909 int32_t HiPlayerImpl::SetVideoScaleType(OHOS::Media::VideoScaleType videoScaleType)
1910 {
1911 MEDIA_LOG_D_SHORT("SetVideoScaleType " PUBLIC_LOG_D32, videoScaleType);
1912 #ifdef SUPPORT_VIDEO
1913 auto meta = std::make_shared<Meta>();
1914 meta->Set<Tag::VIDEO_SCALE_TYPE>(static_cast<int32_t>(videoScaleType));
1915 if (videoDecoder_) {
1916 videoDecoder_->SetParameter(meta);
1917 }
1918 return TransStatus(Status::OK);
1919 #else
1920 return TransStatus(Status::OK);
1921 #endif
1922 }
1923
SetFrameRateForSeekPerformance(double frameRate)1924 int32_t HiPlayerImpl::SetFrameRateForSeekPerformance(double frameRate)
1925 {
1926 MEDIA_LOG_I_SHORT("SetFrameRateForSeekPerformance, frameRate: %{public}f", frameRate);
1927 #ifdef SUPPORT_VIDEO
1928 auto meta = std::make_shared<Meta>();
1929 meta->Set<Tag::VIDEO_FRAME_RATE>(frameRate);
1930 if (videoDecoder_) {
1931 videoDecoder_->SetParameter(meta);
1932 }
1933 return TransStatus(Status::OK);
1934 #else
1935 return TransStatus(Status::OK);
1936 #endif
1937 }
1938
SetAudioRendererInfo(const int32_t contentType, const int32_t streamUsage, const int32_t rendererFlag)1939 int32_t HiPlayerImpl::SetAudioRendererInfo(const int32_t contentType, const int32_t streamUsage,
1940 const int32_t rendererFlag)
1941 {
1942 MEDIA_LOG_I_SHORT("SetAudioRendererInfo in, coutentType: " PUBLIC_LOG_D32 ", streamUsage: " PUBLIC_LOG_D32
1943 ", rendererFlag: " PUBLIC_LOG_D32, contentType, streamUsage, rendererFlag);
1944 Plugins::AudioRenderInfo audioRenderInfo {contentType, streamUsage, rendererFlag};
1945 if (audioRenderInfo_ == nullptr) {
1946 audioRenderInfo_ = std::make_shared<Meta>();
1947 }
1948 audioRenderInfo_->SetData(Tag::AUDIO_RENDER_SET_FLAG, true);
1949 audioRenderInfo_->SetData(Tag::AUDIO_RENDER_INFO, audioRenderInfo);
1950 if (audioSink_ != nullptr) {
1951 audioSink_->SetParameter(audioRenderInfo_);
1952 }
1953 return TransStatus(Status::OK);
1954 }
1955
SetAudioInterruptMode(const int32_t interruptMode)1956 int32_t HiPlayerImpl::SetAudioInterruptMode(const int32_t interruptMode)
1957 {
1958 MEDIA_LOG_I_SHORT("SetAudioInterruptMode in");
1959 audioInterruptMode_ = std::make_shared<Meta>();
1960 audioInterruptMode_->SetData(Tag::AUDIO_INTERRUPT_MODE, interruptMode);
1961 if (audioSink_ != nullptr) {
1962 audioSink_->SetParameter(audioInterruptMode_);
1963 }
1964 return TransStatus(Status::OK);
1965 }
1966
OnEvent(const Event &event)1967 void HiPlayerImpl::OnEvent(const Event &event)
1968 {
1969 MEDIA_LOG_D("OnEvent %{public}d", event.type);
1970 switch (event.type) {
1971 case EventType::EVENT_IS_LIVE_STREAM: {
1972 HandleIsLiveStreamEvent(AnyCast<bool>(event.param));
1973 break;
1974 }
1975 case EventType::EVENT_ERROR: {
1976 OnStateChanged(PlayerStateId::ERROR);
1977 HandleErrorEvent(AnyCast<int32_t>(event.param));
1978 break;
1979 }
1980 case EventType::EVENT_READY: {
1981 OnStateChanged(PlayerStateId::READY);
1982 break;
1983 }
1984 case EventType::EVENT_COMPLETE: {
1985 HandleCompleteEvent(event);
1986 break;
1987 }
1988 case EventType::EVENT_AUDIO_INTERRUPT: {
1989 NotifyAudioInterrupt(event);
1990 break;
1991 }
1992 case EventType::EVENT_AUDIO_FIRST_FRAME: {
1993 NotifyAudioFirstFrame(event);
1994 HandleInitialPlayingStateChange(event.type);
1995 break;
1996 }
1997 case EventType::EVENT_DRM_INFO_UPDATED: {
1998 HandleDrmInfoUpdatedEvent(event);
1999 break;
2000 }
2001 case EventType::EVENT_VIDEO_RENDERING_START: {
2002 MEDIA_LOG_D_SHORT("video first frame reneder received");
2003 Format format;
2004 callbackLooper_.OnInfo(INFO_TYPE_MESSAGE, PlayerMessageType::PLAYER_INFO_VIDEO_RENDERING_START, format);
2005 HandleInitialPlayingStateChange(event.type);
2006 break;
2007 }
2008 case EventType::EVENT_RESOLUTION_CHANGE: {
2009 MEDIA_LOG_D_SHORT("resolution change event received");
2010 HandleResolutionChangeEvent(event);
2011 break;
2012 }
2013 default:
2014 break;
2015 }
2016 OnEventSub(event);
2017 }
2018
OnEventSub(const Event &event)2019 void HiPlayerImpl::OnEventSub(const Event &event)
2020 {
2021 switch (event.type) {
2022 case EventType::EVENT_AUDIO_DEVICE_CHANGE : {
2023 NotifyAudioDeviceChange(event);
2024 break;
2025 }
2026 case EventType::EVENT_AUDIO_SERVICE_DIED : {
2027 NotifyAudioServiceDied();
2028 break;
2029 }
2030 case EventType::BUFFERING_END : {
2031 if (!isBufferingStartNotified_.load() || isSeekClosest_.load()) {
2032 MEDIA_LOGI_LIMIT(BUFFERING_LOG_FREQUENCY, "BUFFERING_END BLOCKED");
2033 break;
2034 }
2035 MEDIA_LOG_I_SHORT("BUFFERING_END PLAYING");
2036 NotifyBufferingEnd(AnyCast<int32_t>(event.param));
2037 break;
2038 }
2039 case EventType::BUFFERING_START : {
2040 if (isBufferingStartNotified_.load()) {
2041 MEDIA_LOGI_LIMIT(BUFFERING_LOG_FREQUENCY, "BUFFERING_START BLOCKED");
2042 break;
2043 }
2044 MEDIA_LOG_I_SHORT("BUFFERING_START PAUSE");
2045 NotifyBufferingStart(AnyCast<int32_t>(event.param));
2046 break;
2047 }
2048 case EventType::EVENT_SOURCE_BITRATE_START: {
2049 HandleBitrateStartEvent(event);
2050 break;
2051 }
2052 case EventType::EVENT_SUBTITLE_TEXT_UPDATE: {
2053 NotifySubtitleUpdate(event);
2054 break;
2055 }
2056 case EventType::EVENT_CACHED_DURATION: {
2057 NotifyCachedDuration(AnyCast<int32_t>(event.param));
2058 break;
2059 }
2060 case EventType::EVENT_BUFFER_PROGRESS: {
2061 NotifyBufferingUpdate(PlayerKeys::PLAYER_BUFFERING_PERCENT, AnyCast<int32_t>(event.param));
2062 break;
2063 }
2064 default:
2065 break;
2066 }
2067 OnEventSubTrackChange(event);
2068 OnDfxEvent(event);
2069 }
2070
OnEventSubTrackChange(const Event &event)2071 void HiPlayerImpl::OnEventSubTrackChange(const Event &event)
2072 {
2073 switch (event.type) {
2074 case EventType::EVENT_AUDIO_TRACK_CHANGE: {
2075 HandleAudioTrackChangeEvent(event);
2076 break;
2077 }
2078 case EventType::EVENT_VIDEO_TRACK_CHANGE: {
2079 HandleVideoTrackChangeEvent(event);
2080 break;
2081 }
2082 case EventType::EVENT_SUBTITLE_TRACK_CHANGE: {
2083 HandleSubtitleTrackChangeEvent(event);
2084 break;
2085 }
2086 default:
2087 break;
2088 }
2089 }
2090
OnDfxEvent(const Event &event)2091 void HiPlayerImpl::OnDfxEvent(const Event &event)
2092 {
2093 FALSE_RETURN(dfxAgent_ != nullptr);
2094 switch (event.type) {
2095 case EventType::EVENT_VIDEO_LAG: {
2096 dfxAgent_->OnVideoLagEvent(AnyCast<int64_t>(event.param));
2097 break;
2098 }
2099 case EventType::EVENT_AUDIO_LAG: {
2100 dfxAgent_->OnAudioLagEvent(AnyCast<int64_t>(event.param));
2101 break;
2102 }
2103 case EventType::EVENT_STREAM_LAG: {
2104 dfxAgent_->OnStreamLagEvent(AnyCast<int64_t>(event.param));
2105 break;
2106 }
2107 default:
2108 break;
2109 }
2110 }
2111
HandleInitialPlayingStateChange(const EventType& eventType)2112 void HiPlayerImpl::HandleInitialPlayingStateChange(const EventType& eventType)
2113 {
2114 MEDIA_LOG_I_SHORT("HandleInitialPlayingStateChange");
2115 if (!isInitialPlay_) {
2116 return;
2117 }
2118 for (std::pair<EventType, bool>& item : initialAVStates_) {
2119 if (item.first == eventType) {
2120 item.second = true;
2121 }
2122 }
2123 for (auto item : initialAVStates_) {
2124 if (item.second == false) {
2125 return;
2126 }
2127 }
2128
2129 MEDIA_LOG_D_SHORT("av first frame reneder all received");
2130
2131 isInitialPlay_ = false;
2132 OnStateChanged(PlayerStateId::PLAYING);
2133
2134 int64_t nowTimeMs = GetCurrentMillisecond();
2135 playStatisticalInfo_.startLatency = static_cast<int32_t>(nowTimeMs - playStartTime_);
2136 }
2137
DoSetPlayStrategy(const std::shared_ptr<MediaSource> source)2138 void HiPlayerImpl::DoSetPlayStrategy(const std::shared_ptr<MediaSource> source)
2139 {
2140 std::shared_ptr<PlayStrategy> playStrategy = std::make_shared<PlayStrategy>();
2141 playStrategy->width = preferedWidth_;
2142 playStrategy->height = preferedHeight_;
2143 playStrategy->duration = bufferDuration_;
2144 playStrategy->preferHDR = preferHDR_;
2145 playStrategy->audioLanguage = audioLanguage_;
2146 playStrategy->subtitleLanguage = subtitleLanguage_;
2147 if (source) {
2148 source->SetPlayStrategy(playStrategy);
2149 source->SetAppUid(appUid_);
2150 }
2151 }
2152
DoSetSource(const std::shared_ptr<MediaSource> source)2153 Status HiPlayerImpl::DoSetSource(const std::shared_ptr<MediaSource> source)
2154 {
2155 MediaTrace trace("HiPlayerImpl::DoSetSource");
2156 ResetIfSourceExisted();
2157 demuxer_ = FilterFactory::Instance().CreateFilter<DemuxerFilter>("builtin.player.demuxer",
2158 FilterType::FILTERTYPE_DEMUXER);
2159 if (demuxer_ == nullptr) {
2160 return Status::ERROR_NULL_POINTER;
2161 }
2162 pipeline_->AddHeadFilters({demuxer_});
2163 demuxer_->Init(playerEventReceiver_, playerFilterCallback_);
2164 if (dfxAgent_ != nullptr) {
2165 dfxAgent_->SetDemuxer(demuxer_);
2166 }
2167 DoSetPlayStrategy(source);
2168 if (!mimeType_.empty()) {
2169 source->SetMimeType(mimeType_);
2170 }
2171 if (surface_ == nullptr) {
2172 demuxer_->DisableMediaTrack(OHOS::Media::Plugins::MediaType::VIDEO);
2173 }
2174 auto ret = demuxer_->SetDataSource(source);
2175 if (demuxer_ != nullptr) {
2176 demuxer_->SetCallerInfo(instanceId_, bundleName_);
2177 demuxer_->SetDumpFlag(isDump_);
2178 }
2179 if (ret == Status::OK && !MetaUtils::CheckFileType(demuxer_->GetGlobalMetaInfo())) {
2180 MEDIA_LOG_W_SHORT("0x%{public}06 " PRIXPTR "SetSource unsupport", FAKE_POINTER(this));
2181 ret = Status::ERROR_INVALID_DATA;
2182 }
2183 if (ret != Status::OK) {
2184 return ret;
2185 }
2186 std::unique_lock<std::mutex> lock(drmMutex_);
2187 isDrmProtected_ = demuxer_->IsDrmProtected();
2188 MEDIA_LOG_I_SHORT("Is the source drm-protected : %{public}d", isDrmProtected_);
2189 lock.unlock();
2190 if (hasExtSub_) {
2191 demuxer_->SetSubtitleSource(std::make_shared<MediaSource>(subUrl_));
2192 }
2193 SetBundleName(bundleName_);
2194 demuxer_->OptimizeDecodeSlow(IsEnableOptimizeDecode());
2195 return ret;
2196 }
2197
Resume()2198 Status HiPlayerImpl::Resume()
2199 {
2200 MediaTrace trace("HiPlayerImpl::Resume");
2201 MEDIA_LOG_I_SHORT("Resume entered.");
2202 Status ret = Status::OK;
2203 syncManager_->Resume();
2204 ret = pipeline_->Resume();
2205 if (audioSink_ != nullptr) {
2206 audioSink_->Resume();
2207 }
2208 if (subtitleSink_ != nullptr) {
2209 subtitleSink_->Resume();
2210 }
2211 if (ret != Status::OK) {
2212 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
2213 }
2214 startTime_ = GetCurrentMillisecond();
2215 return ret;
2216 }
2217
HandleIsLiveStreamEvent(bool isLiveStream)2218 void HiPlayerImpl::HandleIsLiveStreamEvent(bool isLiveStream)
2219 {
2220 Format format;
2221 callbackLooper_.OnInfo(INFO_TYPE_IS_LIVE_STREAM, isLiveStream, format);
2222 }
2223
HandleErrorEvent(int32_t errorCode)2224 void HiPlayerImpl::HandleErrorEvent(int32_t errorCode)
2225 {
2226 callbackLooper_.OnError(PLAYER_ERROR, errorCode);
2227 }
2228
NotifyBufferingStart(int32_t param)2229 void HiPlayerImpl::NotifyBufferingStart(int32_t param)
2230 {
2231 Format format;
2232 isBufferingStartNotified_.store(true);
2233 callbackLooper_.StopReportMediaProgress();
2234 callbackLooper_.ManualReportMediaProgressOnce();
2235 (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_BUFFERING_START), 1);
2236 callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, param, format);
2237 }
2238
NotifyBufferingEnd(int32_t param)2239 void HiPlayerImpl::NotifyBufferingEnd(int32_t param)
2240 {
2241 MEDIA_LOG_I_SHORT("NotifyBufferingEnd");
2242 Format format;
2243 isBufferingStartNotified_.store(false);
2244 (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_BUFFERING_END), 1);
2245 callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, param, format);
2246 }
2247
NotifyCachedDuration(int32_t param)2248 void HiPlayerImpl::NotifyCachedDuration(int32_t param)
2249 {
2250 MEDIA_LOG_D("NotifyCachedDuration");
2251 Format format;
2252 (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_CACHED_DURATION), param);
2253 callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, param, format);
2254 }
2255
HandleEosFlagState(const Event& event)2256 void HiPlayerImpl::HandleEosFlagState(const Event& event)
2257 {
2258 for (std::pair<std::string, bool>& item: completeState_) {
2259 if (item.first == event.srcFilter) {
2260 MEDIA_LOG_I_SHORT("one eos event received " PUBLIC_LOG_S, item.first.c_str());
2261 item.second = true;
2262 }
2263 }
2264 }
2265
HandleCompleteEvent(const Event& event)2266 void HiPlayerImpl::HandleCompleteEvent(const Event& event)
2267 {
2268 MEDIA_LOG_D_SHORT("HandleCompleteEvent");
2269 AutoLock lock(handleCompleteMutex_);
2270 if (curState_ == PlayerStateId::STOPPED) {
2271 MEDIA_LOG_I("The Complete Task don't run, current status is Stopped.");
2272 return;
2273 }
2274 HandleEosFlagState(event);
2275 for (auto item : completeState_) {
2276 if (item.second == false) {
2277 MEDIA_LOG_I_SHORT("expect receive eos event " PUBLIC_LOG_S, item.first.c_str());
2278 return;
2279 }
2280 }
2281 MEDIA_LOG_I_SHORT("OnComplete looping: " PUBLIC_LOG_D32 ".", singleLoop_.load());
2282 isStreaming_ = false;
2283 Format format;
2284 int32_t curPosMs = 0;
2285 GetCurrentTime(curPosMs);
2286 if ((GetPlayRangeEndTime() == PLAY_RANGE_DEFAULT_VALUE) &&
2287 (durationMs_.load() > curPosMs && abs(durationMs_.load() - curPosMs) < AUDIO_SINK_MAX_LATENCY)) {
2288 MEDIA_LOG_I_SHORT("OnComplete durationMs - curPosMs: " PUBLIC_LOG_D32, durationMs_.load() - curPosMs);
2289 }
2290 if (!singleLoop_.load()) {
2291 callbackLooper_.StopReportMediaProgress();
2292 callbackLooper_.StopCollectMaxAmplitude();
2293 } else {
2294 inEosSeek_ = true;
2295 }
2296 pipeline_->Pause();
2297 callbackLooper_.DoReportCompletedTime();
2298 if (isSetPlayRange_ && (startTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE ||
2299 endTimeWithMode_ == PLAY_RANGE_DEFAULT_VALUE)) {
2300 startTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
2301 endTimeWithMode_ = PLAY_RANGE_DEFAULT_VALUE;
2302 pipeline_->SetPlayRange(startTimeWithMode_, endTimeWithMode_);
2303 }
2304 callbackLooper_.ReportRemainedMaxAmplitude();
2305 if (!singleLoop_.load()) {
2306 OnStateChanged(PlayerStateId::EOS);
2307 }
2308 if (startTime_ != -1) {
2309 playTotalDuration_ += GetCurrentMillisecond() - startTime_;
2310 }
2311 startTime_ = -1;
2312 callbackLooper_.OnInfo(INFO_TYPE_EOS, static_cast<int32_t>(singleLoop_.load()), format);
2313 for (std::pair<std::string, bool>& item: completeState_) {
2314 item.second = false;
2315 }
2316 }
2317
HandleDrmInfoUpdatedEvent(const Event& event)2318 void HiPlayerImpl::HandleDrmInfoUpdatedEvent(const Event& event)
2319 {
2320 MEDIA_LOG_I_SHORT("HandleDrmInfoUpdatedEvent");
2321
2322 std::multimap<std::string, std::vector<uint8_t>> drmInfo =
2323 AnyCast<std::multimap<std::string, std::vector<uint8_t>>>(event.param);
2324 uint32_t infoCount = drmInfo.size();
2325 if (infoCount > DrmConstant::DRM_MAX_DRM_INFO_COUNT || infoCount == 0) {
2326 MEDIA_LOG_E_SHORT("HandleDrmInfoUpdatedEvent info count is invalid");
2327 return;
2328 }
2329 DrmInfoItem *drmInfoArray = new DrmInfoItem[infoCount];
2330 if (drmInfoArray == nullptr) {
2331 MEDIA_LOG_E_SHORT("HandleDrmInfoUpdatedEvent new drm info failed");
2332 return;
2333 }
2334 int32_t i = 0;
2335 for (auto item : drmInfo) {
2336 uint32_t step = 2;
2337 for (uint32_t j = 0; j < item.first.size(); j += step) {
2338 std::string byteString = item.first.substr(j, step);
2339 unsigned char byte = (unsigned char)strtol(byteString.c_str(), NULL, 16);
2340 drmInfoArray[i].uuid[j / step] = byte;
2341 }
2342
2343 errno_t ret = memcpy_s(drmInfoArray[i].pssh, sizeof(drmInfoArray[i].pssh),
2344 item.second.data(), item.second.size());
2345 if (ret != EOK) {
2346 MEDIA_LOG_E_SHORT("HandleDrmInfoUpdatedEvent memcpy drm info pssh failed");
2347 delete []drmInfoArray;
2348 return;
2349 }
2350 drmInfoArray[i].psshLen = item.second.size();
2351 i++;
2352 }
2353
2354 // report event
2355 Format format;
2356 size_t drmInfoSize = static_cast<size_t>(infoCount) * sizeof(DrmInfoItem);
2357 (void) format.PutBuffer(PlayerKeys::PLAYER_DRM_INFO_ADDR,
2358 reinterpret_cast<const uint8_t *>(drmInfoArray), drmInfoSize);
2359 (void) format.PutIntValue(PlayerKeys::PLAYER_DRM_INFO_COUNT, static_cast<int32_t>(infoCount));
2360 callbackLooper_.OnInfo(INFO_TYPE_DRM_INFO_UPDATED, static_cast<int32_t>(singleLoop_.load()), format);
2361
2362 delete []drmInfoArray;
2363 }
2364
HandleResolutionChangeEvent(const Event& event)2365 void HiPlayerImpl::HandleResolutionChangeEvent(const Event& event)
2366 {
2367 #ifdef SUPPORT_VIDEO
2368 // update new video size
2369 std::pair<int32_t, int32_t> videoSize = AnyCast<std::pair<int32_t, int32_t>>(event.param);
2370 int32_t width = videoSize.first;
2371 int32_t height = videoSize.second;
2372 videoWidth_ = !needSwapWH_.load() ? width : height;
2373 videoHeight_ = !needSwapWH_.load() ? height : width;
2374 MEDIA_LOG_I_SHORT("HandleResolutionChangeEvent, width = %{public}d, height = %{public}d",
2375 videoWidth_.load(), videoHeight_.load());
2376 // notify size change
2377 NotifyResolutionChange();
2378 #endif
2379 }
2380
HandleBitrateStartEvent(const Event& event)2381 void HiPlayerImpl::HandleBitrateStartEvent(const Event& event)
2382 {
2383 #ifdef SUPPORT_VIDEO
2384 uint32_t bitrate = AnyCast<uint32_t>(event.param);
2385 MEDIA_LOG_I_SHORT("HandleBitrateStartEvent in, bitrate is " PUBLIC_LOG_U32, bitrate);
2386 FALSE_RETURN(videoDecoder_ != nullptr);
2387 videoDecoder_->SetBitrateStart();
2388 #endif
2389 }
2390
NotifySubtitleUpdate(const Event& event)2391 void HiPlayerImpl::NotifySubtitleUpdate(const Event& event)
2392 {
2393 Format format = AnyCast<Format>(event.param);
2394 if (needUpdateSubtitle_.load()) {
2395 callbackLooper_.OnInfo(INFO_TYPE_SUBTITLE_UPDATE_INFO, 0, format);
2396 }
2397 }
2398
UpdateStateNoLock(PlayerStates newState, bool notifyUpward, bool isSystemOperation)2399 void HiPlayerImpl::UpdateStateNoLock(PlayerStates newState, bool notifyUpward, bool isSystemOperation)
2400 {
2401 if (pipelineStates_ == newState) {
2402 return;
2403 }
2404 pipelineStates_ = newState;
2405 if (pipelineStates_ == PlayerStates::PLAYER_IDLE || pipelineStates_ == PlayerStates::PLAYER_PREPARING) {
2406 MEDIA_LOG_D_SHORT("do not report idle and preparing since av player doesn't need report idle and preparing");
2407 return;
2408 }
2409 if (notifyUpward) {
2410 if (callbackLooper_.IsStarted()) {
2411 Format format;
2412 if (isSystemOperation) {
2413 format.PutIntValue(PlayerKeys::PLAYER_STATE_CHANGED_REASON, StateChangeReason::BACKGROUND);
2414 }
2415 while (!pendingStates_.empty()) {
2416 auto pendingState = pendingStates_.front();
2417 pendingStates_.pop();
2418 MEDIA_LOG_I_SHORT("sending pending state change: " PUBLIC_LOG_S,
2419 StringnessPlayerState(pendingState).c_str());
2420 callbackLooper_.OnInfo(INFO_TYPE_STATE_CHANGE, pendingState, format);
2421 }
2422 MEDIA_LOG_I_SHORT("sending newest state change: " PUBLIC_LOG_S,
2423 StringnessPlayerState(pipelineStates_.load()).c_str());
2424 callbackLooper_.OnInfo(INFO_TYPE_STATE_CHANGE, pipelineStates_, format);
2425 } else {
2426 pendingStates_.push(newState);
2427 }
2428 }
2429 }
2430
NotifyBufferingUpdate(const std::string_view& type, int32_t param)2431 void HiPlayerImpl::NotifyBufferingUpdate(const std::string_view& type, int32_t param)
2432 {
2433 Format format;
2434 format.PutIntValue(std::string(type), param);
2435 MEDIA_LOG_D_SHORT("NotifyBufferingUpdate param " PUBLIC_LOG_D32, param);
2436 callbackLooper_.OnInfo(INFO_TYPE_BUFFERING_UPDATE, durationMs_.load(), format);
2437 }
2438
NotifyDurationUpdate(const std::string_view& type, int32_t param)2439 void HiPlayerImpl::NotifyDurationUpdate(const std::string_view& type, int32_t param)
2440 {
2441 Format format;
2442 format.PutIntValue(std::string(type), param);
2443 MEDIA_LOG_I_SHORT("NotifyDurationUpdate " PUBLIC_LOG_D64, durationMs_.load());
2444 callbackLooper_.OnInfo(INFO_TYPE_DURATION_UPDATE, durationMs_.load(), format);
2445 }
2446
NotifySeekDone(int32_t seekPos)2447 void HiPlayerImpl::NotifySeekDone(int32_t seekPos)
2448 {
2449 MediaTrace trace(std::string("HiPlayerImpl::NotifySeekDone, seekPos: ") + to_string(seekPos));
2450 Format format;
2451 // Report position firstly to make sure that client can get real position when seek done in playing state.
2452 if (curState_ == PlayerStateId::PLAYING) {
2453 std::unique_lock<std::mutex> lock(seekMutex_);
2454 syncManager_->seekCond_.wait_for(
2455 lock,
2456 std::chrono::milliseconds(PLAYING_SEEK_WAIT_TIME),
2457 [this]() {
2458 return !syncManager_->InSeeking();
2459 });
2460 }
2461 auto startTime = std::chrono::steady_clock::now();
2462 demuxer_->WaitForBufferingEnd();
2463 auto endTime = std::chrono::steady_clock::now();
2464 auto waitTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
2465 MEDIA_LOG_D_SHORT("NotifySeekDone WaitForBufferingEnd: %{public}d ms", int(waitTime));
2466 if (isSeekClosest_.load()) {
2467 isSeekClosest_.store(false);
2468 if (isBufferingStartNotified_.load()) {
2469 MEDIA_LOG_I_SHORT("SEEK_CLOSEST BUFFERING_END PLAYING");
2470 NotifyBufferingEnd(NOTIFY_BUFFERING_END_PARAM);
2471 }
2472 }
2473
2474 MEDIA_LOG_D_SHORT("NotifySeekDone seekPos: %{public}d", seekPos);
2475 callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, seekPos, format);
2476 callbackLooper_.OnInfo(INFO_TYPE_SEEKDONE, seekPos, format);
2477 }
2478
NotifyAudioInterrupt(const Event& event)2479 void HiPlayerImpl::NotifyAudioInterrupt(const Event& event)
2480 {
2481 MEDIA_LOG_I_SHORT("NotifyAudioInterrupt");
2482 Format format;
2483 auto interruptEvent = AnyCast<AudioStandard::InterruptEvent>(event.param);
2484 int32_t hintType = interruptEvent.hintType;
2485 int32_t forceType = interruptEvent.forceType;
2486 int32_t eventType = interruptEvent.eventType;
2487 if (forceType == OHOS::AudioStandard::INTERRUPT_FORCE) {
2488 if (hintType == OHOS::AudioStandard::INTERRUPT_HINT_PAUSE
2489 || hintType == OHOS::AudioStandard::INTERRUPT_HINT_STOP) {
2490 Status ret = Status::OK;
2491 ret = pipeline_->Pause();
2492 syncManager_->Pause();
2493 if (audioSink_ != nullptr) {
2494 audioSink_->Pause();
2495 }
2496 if (ret != Status::OK) {
2497 UpdateStateNoLock(PlayerStates::PLAYER_STATE_ERROR);
2498 }
2499 callbackLooper_.StopReportMediaProgress();
2500 callbackLooper_.StopCollectMaxAmplitude();
2501 }
2502 }
2503 (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_TYPE, eventType);
2504 (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_FORCE, forceType);
2505 (void)format.PutIntValue(PlayerKeys::AUDIO_INTERRUPT_HINT, hintType);
2506 callbackLooper_.OnInfo(INFO_TYPE_INTERRUPT_EVENT, hintType, format);
2507 if (forceType == OHOS::AudioStandard::INTERRUPT_FORCE) {
2508 if (hintType == OHOS::AudioStandard::INTERRUPT_HINT_PAUSE
2509 || hintType == OHOS::AudioStandard::INTERRUPT_HINT_STOP) {
2510 callbackLooper_.OnSystemOperation(OPERATION_TYPE_PAUSE, OPERATION_REASON_AUDIO_INTERRUPT);
2511 }
2512 }
2513 }
2514
NotifyAudioDeviceChange(const Event& event)2515 void HiPlayerImpl::NotifyAudioDeviceChange(const Event& event)
2516 {
2517 MEDIA_LOG_I_SHORT("NotifyAudioDeviceChange");
2518 auto [deviceInfo, reason] = AnyCast<std::pair<AudioStandard::DeviceInfo,
2519 AudioStandard::AudioStreamDeviceChangeReason>>(event.param);
2520 Format format;
2521 Parcel parcel;
2522 deviceInfo.Marshalling(parcel);
2523 auto parcelSize = parcel.GetReadableBytes();
2524 (void)format.PutBuffer(PlayerKeys::AUDIO_DEVICE_CHANGE,
2525 parcel.ReadBuffer(parcelSize), parcelSize);
2526 format.PutIntValue(PlayerKeys::AUDIO_DEVICE_CHANGE_REASON, static_cast<int32_t>(reason));
2527 callbackLooper_.OnInfo(INFO_TYPE_AUDIO_DEVICE_CHANGE, static_cast<int32_t>(reason), format);
2528 }
2529
NotifyAudioServiceDied()2530 void HiPlayerImpl::NotifyAudioServiceDied()
2531 {
2532 Format format;
2533 callbackLooper_.OnInfo(INFO_TYPE_ERROR_MSG, MSERR_EXT_API9_IO, format);
2534 }
2535
NotifyAudioFirstFrame(const Event& event)2536 void HiPlayerImpl::NotifyAudioFirstFrame(const Event& event)
2537 {
2538 uint64_t latency = AnyCast<uint64_t>(event.param);
2539 MEDIA_LOG_I_SHORT("Audio first frame event in latency " PUBLIC_LOG_U64, latency);
2540 Format format;
2541 (void)format.PutLongValue(PlayerKeys::AUDIO_FIRST_FRAME, latency);
2542 callbackLooper_.OnInfo(INFO_TYPE_AUDIO_FIRST_FRAME, 0, format);
2543 }
2544
NotifyResolutionChange()2545 void HiPlayerImpl::NotifyResolutionChange()
2546 {
2547 #ifdef SUPPORT_VIDEO
2548 Format format;
2549 int32_t width = videoWidth_.load();
2550 int32_t height = videoHeight_.load();
2551 (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_WIDTH), width);
2552 (void)format.PutIntValue(std::string(PlayerKeys::PLAYER_HEIGHT), height);
2553 MEDIA_LOG_I_SHORT("video size change, width %{public}d, height %{public}d", width, height);
2554 callbackLooper_.OnInfo(INFO_TYPE_RESOLUTION_CHANGE, 0, format);
2555 #endif
2556 }
2557
NotifyPositionUpdate()2558 void HiPlayerImpl::NotifyPositionUpdate()
2559 {
2560 int32_t currentPosMs = 0;
2561 GetCurrentTime(currentPosMs);
2562 MEDIA_LOG_D_SHORT("NotifyPositionUpdate currentPosMs: %{public}d", currentPosMs);
2563 Format format;
2564 callbackLooper_.OnInfo(INFO_TYPE_POSITION_UPDATE, currentPosMs, format);
2565 }
2566
NotifyUpdateTrackInfo()2567 void HiPlayerImpl::NotifyUpdateTrackInfo()
2568 {
2569 std::vector<Format> trackInfo;
2570 GetVideoTrackInfo(trackInfo);
2571 GetAudioTrackInfo(trackInfo);
2572 GetSubtitleTrackInfo(trackInfo);
2573
2574 Format body;
2575 body.PutFormatVector(std::string(PlayerKeys::PLAYER_TRACK_INFO), trackInfo);
2576 MEDIA_LOG_I("NotifyUpdateTrackInfo");
2577
2578 callbackLooper_.OnInfo(INFO_TYPE_TRACK_INFO_UPDATE, 0, body);
2579 }
2580
HandleAudioTrackChangeEvent(const Event& event)2581 void HiPlayerImpl::HandleAudioTrackChangeEvent(const Event& event)
2582 {
2583 int32_t trackId = AnyCast<int32_t>(event.param);
2584 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2585 std::string mime;
2586 FALSE_RETURN_MSG(trackId >= 0 && trackId < metaInfo.size(), "HandleAudioTrackChangeEvent trackId invalid");
2587 if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
2588 MEDIA_LOG_E("HandleAudioTrackChangeEvent trackId " PUBLIC_LOG_D32 "get mime error", trackId);
2589 return;
2590 }
2591 if (IsAudioMime(mime)) {
2592 if (Status::OK != audioDecoder_->ChangePlugin(metaInfo[trackId])) {
2593 MEDIA_LOG_E("HandleAudioTrackChangeEvent audioDecoder change plugin error");
2594 return;
2595 }
2596 if (Status::OK != audioSink_->ChangeTrack(metaInfo[trackId])) {
2597 MEDIA_LOG_E("HandleAudioTrackChangeEvent audioSink change track error");
2598 return;
2599 }
2600 if (Status::OK != demuxer_->StartTask(trackId)) {
2601 MEDIA_LOG_E("HandleAudioTrackChangeEvent StartTask error. trackId is " PUBLIC_LOG_D32, trackId);
2602 return;
2603 }
2604 Format audioTrackInfo {};
2605 audioTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackId));
2606 audioTrackInfo.PutIntValue("track_is_select", 1);
2607 callbackLooper_.OnInfo(INFO_TYPE_TRACKCHANGE, 0, audioTrackInfo);
2608 currentAudioTrackId_ = trackId;
2609
2610 NotifyUpdateTrackInfo();
2611 }
2612 return;
2613 }
2614
HandleVideoTrackChangeEvent(const Event& event)2615 void HiPlayerImpl::HandleVideoTrackChangeEvent(const Event& event)
2616 {
2617 #ifdef SUPPORT_VIDEO
2618 int32_t trackId = AnyCast<int32_t>(event.param);
2619 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2620 std::string mime;
2621 FALSE_RETURN_MSG(trackId >= 0 && trackId < metaInfo.size(), "HandleVideoTrackChangeEvent trackId invalid");
2622 if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
2623 MEDIA_LOG_E("HandleVideoTrackChangeEvent trackId " PUBLIC_LOG_D32 "get mime error", trackId);
2624 return;
2625 }
2626 if (IsVideoMime(mime)) {
2627 if (Status::OK != demuxer_->StartTask(trackId)) {
2628 MEDIA_LOG_E("HandleVideoTrackChangeEvent StartTask error. trackId is " PUBLIC_LOG_D32, trackId);
2629 return;
2630 }
2631 Format videoTrackInfo {};
2632 videoTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackId));
2633 videoTrackInfo.PutIntValue("track_is_select", 1);
2634 callbackLooper_.OnInfo(INFO_TYPE_TRACKCHANGE, 0, videoTrackInfo);
2635 currentVideoTrackId_ = trackId;
2636 }
2637 #endif
2638 return;
2639 }
2640
HandleSubtitleTrackChangeEvent(const Event& event)2641 void HiPlayerImpl::HandleSubtitleTrackChangeEvent(const Event& event)
2642 {
2643 int32_t trackId = AnyCast<int32_t>(event.param);
2644 std::vector<std::shared_ptr<Meta>> metaInfo = demuxer_->GetStreamMetaInfo();
2645 std::string mime;
2646 FALSE_RETURN_MSG(trackId >= 0 && trackId < metaInfo.size(), "HandleSubtitleTrackChangeEvent trackId invalid");
2647 if (!(metaInfo[trackId]->GetData(Tag::MIME_TYPE, mime))) {
2648 MEDIA_LOG_E("HandleSubtitleTrackChangeEvent trackId " PUBLIC_LOG_D32 "get mime error", trackId);
2649 return;
2650 }
2651 if (IsSubtitleMime(mime)) {
2652 if (Status::OK != subtitleSink_->DoFlush()) {
2653 MEDIA_LOG_E("HandleSubtitleTrackChangeEvent DoFlush error");
2654 return;
2655 }
2656 if (Status::OK != demuxer_->StartTask(trackId)) {
2657 MEDIA_LOG_E("HandleSubtitleTrackChangeEvent StartTask error. trackId is " PUBLIC_LOG_D32, trackId);
2658 return;
2659 }
2660 Format subtitleTrackInfo {};
2661 subtitleTrackInfo.PutIntValue("track_index", static_cast<int32_t>(trackId));
2662 subtitleTrackInfo.PutIntValue("track_is_select", 1);
2663 callbackLooper_.OnInfo(INFO_TYPE_TRACKCHANGE, 0, subtitleTrackInfo);
2664 currentSubtitleTrackId_ = trackId;
2665 needUpdateSubtitle_.store(true);
2666 }
2667 return;
2668 }
2669
OnStateChanged(PlayerStateId state, bool isSystemOperation)2670 void __attribute__((no_sanitize("cfi"))) HiPlayerImpl::OnStateChanged(PlayerStateId state, bool isSystemOperation)
2671 {
2672 {
2673 AutoLock lockEos(stateChangeMutex_);
2674 if (isDoCompletedSeek_.load()) {
2675 isDoCompletedSeek_ = false;
2676 } else if ((curState_ == PlayerStateId::EOS) && (state == PlayerStateId::PAUSE)) {
2677 MEDIA_LOG_E_SHORT("already at completed and not allow pause");
2678 return;
2679 }
2680 curState_ = state;
2681 }
2682 MEDIA_LOG_D_SHORT("OnStateChanged " PUBLIC_LOG_D32 " > " PUBLIC_LOG_D32, pipelineStates_.load(),
2683 TransStateId2PlayerState(state));
2684 UpdateStateNoLock(TransStateId2PlayerState(state), true, isSystemOperation);
2685 {
2686 AutoLock lock(stateMutex_);
2687 cond_.NotifyOne();
2688 }
2689 }
2690
OnCallback(std::shared_ptr<Filter> filter, const FilterCallBackCommand cmd, StreamType outType)2691 Status HiPlayerImpl::OnCallback(std::shared_ptr<Filter> filter, const FilterCallBackCommand cmd, StreamType outType)
2692 {
2693 MEDIA_LOG_D_SHORT("HiPlayerImpl::OnCallback filter, outType: %{public}d", outType);
2694 if (cmd == FilterCallBackCommand::NEXT_FILTER_NEEDED) {
2695 switch (outType) {
2696 case StreamType::STREAMTYPE_SUBTITLE:
2697 return LinkSubtitleSinkFilter(filter, outType);
2698 case StreamType::STREAMTYPE_RAW_AUDIO:
2699 return LinkAudioSinkFilter(filter, outType);
2700 case StreamType::STREAMTYPE_ENCODED_AUDIO:
2701 return LinkAudioDecoderFilter(filter, outType);
2702 #ifdef SUPPORT_VIDEO
2703 case StreamType::STREAMTYPE_RAW_VIDEO:
2704 break;
2705 case StreamType::STREAMTYPE_ENCODED_VIDEO:
2706 return LinkVideoDecoderFilter(filter, outType);
2707 #endif
2708 default:
2709 break;
2710 }
2711 }
2712 return Status::OK;
2713 }
2714
OnDumpInfo(int32_t fd)2715 void HiPlayerImpl::OnDumpInfo(int32_t fd)
2716 {
2717 MEDIA_LOG_D_SHORT("HiPlayerImpl::OnDumpInfo called.");
2718 if (audioDecoder_ != nullptr) {
2719 audioDecoder_->OnDumpInfo(fd);
2720 }
2721 if (demuxer_ != nullptr) {
2722 demuxer_->OnDumpInfo(fd);
2723 }
2724 #ifdef SUPPORT_VIDEO
2725 if (videoDecoder_ != nullptr) {
2726 videoDecoder_->OnDumpInfo(fd);
2727 }
2728 #endif
2729 }
2730
LinkAudioDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)2731 Status HiPlayerImpl::LinkAudioDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
2732 {
2733 MediaTrace trace("HiPlayerImpl::LinkAudioDecoderFilter");
2734 MEDIA_LOG_I_SHORT("HiPlayerImpl::LinkAudioDecoderFilter");
2735 FALSE_RETURN_V(audioDecoder_ == nullptr, Status::OK);
2736 audioDecoder_ = FilterFactory::Instance().CreateFilter<AudioDecoderFilter>("player.audiodecoder",
2737 FilterType::FILTERTYPE_ADEC);
2738 FALSE_RETURN_V(audioDecoder_ != nullptr, Status::ERROR_NULL_POINTER);
2739 audioDecoder_->Init(playerEventReceiver_, playerFilterCallback_);
2740
2741 audioDecoder_->SetCallerInfo(instanceId_, bundleName_);
2742 audioDecoder_->SetDumpFlag(isDump_);
2743 // set decrypt config for drm audios
2744 if (isDrmProtected_) {
2745 MEDIA_LOG_D_SHORT("HiPlayerImpl::LinkAudioDecoderFilter will SetDecryptConfig");
2746 std::unique_lock<std::mutex> lock(drmMutex_);
2747 static constexpr int32_t timeout = 5;
2748 bool notTimeout = drmConfigCond_.wait_for(lock, std::chrono::seconds(timeout), [this]() {
2749 return this->isDrmPrepared_ || this->stopWaitingDrmConfig_;
2750 });
2751 if (notTimeout && isDrmPrepared_) {
2752 MEDIA_LOG_I_SHORT("LinkAudioDecoderFilter will SetDecryptConfig");
2753 bool svpFlag = svpMode_ == HiplayerSvpMode::SVP_TRUE ? true : false;
2754 audioDecoder_->SetDecryptionConfig(keySessionServiceProxy_, svpFlag);
2755 } else {
2756 MEDIA_LOG_E_SHORT("HiPlayerImpl Drmcond wait timeout or has been stopped!");
2757 return Status::ERROR_INVALID_OPERATION;
2758 }
2759 } else {
2760 MEDIA_LOG_D_SHORT("HiPlayerImpl::LinkAudioDecoderFilter, and it's not drm-protected.");
2761 }
2762 return pipeline_->LinkFilters(preFilter, {audioDecoder_}, type);
2763 }
2764
LinkAudioSinkFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)2765 Status HiPlayerImpl::LinkAudioSinkFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
2766 {
2767 MediaTrace trace("HiPlayerImpl::LinkAudioSinkFilter");
2768 MEDIA_LOG_I_SHORT("HiPlayerImpl::LinkAudioSinkFilter");
2769 FALSE_RETURN_V(audioSink_ == nullptr, Status::OK);
2770 audioSink_ = FilterFactory::Instance().CreateFilter<AudioSinkFilter>("player.audiosink",
2771 FilterType::FILTERTYPE_ASINK);
2772 FALSE_RETURN_V(audioSink_ != nullptr, Status::ERROR_NULL_POINTER);
2773 audioSink_->Init(playerEventReceiver_, playerFilterCallback_);
2774 audioSink_->SetMaxAmplitudeCbStatus(maxAmplitudeCbStatus_);
2775 if (demuxer_ != nullptr && audioRenderInfo_ == nullptr) {
2776 std::vector<std::shared_ptr<Meta>> trackInfos = demuxer_->GetStreamMetaInfo();
2777 SetDefaultAudioRenderInfo(trackInfos);
2778 }
2779 if (audioRenderInfo_ != nullptr) {
2780 audioSink_->SetParameter(audioRenderInfo_);
2781 }
2782 if (audioInterruptMode_ != nullptr) {
2783 audioSink_->SetParameter(audioInterruptMode_);
2784 }
2785 std::shared_ptr<Meta> globalMeta = std::make_shared<Meta>();
2786 if (demuxer_ != nullptr) {
2787 globalMeta = demuxer_->GetGlobalMetaInfo();
2788 }
2789 if (globalMeta != nullptr) {
2790 globalMeta->SetData(Tag::APP_PID, appPid_);
2791 globalMeta->SetData(Tag::APP_UID, appUid_);
2792 if (audioRenderInfo_ != nullptr) {
2793 for (MapIt iter = audioRenderInfo_->begin(); iter != audioRenderInfo_->end(); iter++) {
2794 globalMeta->SetData(iter->first, iter->second);
2795 }
2796 }
2797 if (audioInterruptMode_ != nullptr) {
2798 for (MapIt iter = audioInterruptMode_->begin(); iter != audioInterruptMode_->end(); iter++) {
2799 globalMeta->SetData(iter->first, iter->second);
2800 }
2801 }
2802 audioSink_->SetParameter(globalMeta);
2803 }
2804 audioSink_->SetSyncCenter(syncManager_);
2805 completeState_.emplace_back(std::make_pair("AudioSink", false));
2806 initialAVStates_.emplace_back(std::make_pair(EventType::EVENT_AUDIO_FIRST_FRAME, false));
2807 auto res = pipeline_->LinkFilters(preFilter, {audioSink_}, type);
2808 if (mutedMediaType_ == OHOS::Media::MediaType::MEDIA_TYPE_AUD) {
2809 audioSink_->SetMuted(true);
2810 }
2811 return res;
2812 }
2813
2814 #ifdef SUPPORT_VIDEO
LinkVideoDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)2815 Status HiPlayerImpl::LinkVideoDecoderFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
2816 {
2817 MediaTrace trace("HiPlayerImpl::LinkVideoDecoderFilter");
2818 MEDIA_LOG_I_SHORT("LinkVideoDecoderFilter");
2819 if (videoDecoder_ == nullptr) {
2820 videoDecoder_ = FilterFactory::Instance().CreateFilter<DecoderSurfaceFilter>("player.videodecoder",
2821 FilterType::FILTERTYPE_VDEC);
2822 FALSE_RETURN_V(videoDecoder_ != nullptr, Status::ERROR_NULL_POINTER);
2823 videoDecoder_->Init(playerEventReceiver_, playerFilterCallback_);
2824 videoDecoder_->SetSyncCenter(syncManager_);
2825 videoDecoder_->SetCallingInfo(appUid_, appPid_, bundleName_, instanceId_);
2826 if (surface_ != nullptr) {
2827 videoDecoder_->SetVideoSurface(surface_);
2828 }
2829
2830 // set decrypt config for drm videos
2831 if (isDrmProtected_) {
2832 std::unique_lock<std::mutex> lock(drmMutex_);
2833 static constexpr int32_t timeout = 5;
2834 bool notTimeout = drmConfigCond_.wait_for(lock, std::chrono::seconds(timeout), [this]() {
2835 return this->isDrmPrepared_ || this->stopWaitingDrmConfig_;
2836 });
2837 if (notTimeout && isDrmPrepared_) {
2838 MEDIA_LOG_I_SHORT("LinkVideoDecoderFilter will SetDecryptConfig");
2839 bool svpFlag = svpMode_ == HiplayerSvpMode::SVP_TRUE ? true : false;
2840 videoDecoder_->SetDecryptConfig(keySessionServiceProxy_, svpFlag);
2841 } else {
2842 MEDIA_LOG_E_SHORT("HiPlayerImpl Drmcond wait timeout or has been stopped!");
2843 return Status::ERROR_INVALID_OPERATION;
2844 }
2845 } else {
2846 MEDIA_LOG_D_SHORT("HiPlayerImpl::LinkVideoDecoderFilter, and it's not drm-protected.");
2847 }
2848 }
2849 completeState_.emplace_back(std::make_pair("VideoSink", false));
2850 initialAVStates_.emplace_back(std::make_pair(EventType::EVENT_VIDEO_RENDERING_START, false));
2851 return pipeline_->LinkFilters(preFilter, {videoDecoder_}, type);
2852 }
2853 #endif
2854
LinkSubtitleSinkFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)2855 Status HiPlayerImpl::LinkSubtitleSinkFilter(const std::shared_ptr<Filter>& preFilter, StreamType type)
2856 {
2857 MediaTrace trace("HiPlayerImpl::LinkSubtitleSinkFilter");
2858 FALSE_RETURN_V(subtitleSink_ == nullptr, Status::OK);
2859 subtitleSink_ = FilterFactory::Instance().CreateFilter<SubtitleSinkFilter>("player.subtitlesink",
2860 FilterType::FILTERTYPE_SSINK);
2861 FALSE_RETURN_V(subtitleSink_ != nullptr, Status::ERROR_NULL_POINTER);
2862 subtitleSink_->Init(playerEventReceiver_, playerFilterCallback_);
2863 std::shared_ptr<Meta> globalMeta = std::make_shared<Meta>();
2864 if (demuxer_ != nullptr) {
2865 globalMeta = demuxer_->GetGlobalMetaInfo();
2866 }
2867 if (globalMeta != nullptr) {
2868 subtitleSink_->SetParameter(globalMeta);
2869 }
2870 subtitleSink_->SetSyncCenter(syncManager_);
2871 return pipeline_->LinkFilters(preFilter, {subtitleSink_}, type);
2872 }
2873
SeekContinous(int32_t mSeconds, int64_t seekContinousBatchNo)2874 int32_t HiPlayerImpl::SeekContinous(int32_t mSeconds, int64_t seekContinousBatchNo)
2875 {
2876 std::lock_guard<std::mutex> lock(seekContinousMutex_);
2877 FALSE_RETURN_V(demuxer_ && videoDecoder_, TransStatus(Status::OK));
2878 FALSE_RETURN_V(!isNetWorkPlay_, TransStatus(Status::OK));
2879 FALSE_RETURN_V(seekContinousBatchNo_.load() <= seekContinousBatchNo, TransStatus(Status::OK));
2880 lastSeekContinousPos_ = mSeconds;
2881 if (seekContinousBatchNo_.load() == seekContinousBatchNo) {
2882 FALSE_RETURN_V(draggingPlayerAgent_ != nullptr, TransStatus(Status::OK));
2883 draggingPlayerAgent_->UpdateSeekPos(mSeconds);
2884 MEDIA_LOG_I_SHORT("HiPlayerImpl::SeekContinous in " PUBLIC_LOG_D32, mSeconds);
2885 return TransStatus(Status::OK);
2886 }
2887 seekContinousBatchNo_.store(seekContinousBatchNo);
2888 auto res = StartSeekContinous();
2889 FALSE_RETURN_V_MSG_E(res == Status::OK && draggingPlayerAgent_ != nullptr, TransStatus(res),
2890 "StartSeekContinous failed");
2891 draggingPlayerAgent_->UpdateSeekPos(mSeconds);
2892 MEDIA_LOG_I_SHORT("HiPlayerImpl::SeekContinous start " PUBLIC_LOG_D32, mSeconds);
2893 return TransStatus(Status::OK);
2894 }
2895
StartSeekContinous()2896 Status HiPlayerImpl::StartSeekContinous()
2897 {
2898 FALSE_RETURN_V(!draggingPlayerAgent_, Status::OK);
2899 FALSE_RETURN_V(demuxer_ && videoDecoder_, Status::OK);
2900 draggingPlayerAgent_ = DraggingPlayerAgent::Create();
2901 FALSE_RETURN_V_MSG_E(draggingPlayerAgent_ != nullptr, Status::ERROR_INVALID_OPERATION, "failed to create agent");
2902 Status res = draggingPlayerAgent_->Init(demuxer_, videoDecoder_, playerId_);
2903 if (res != Status::OK) {
2904 draggingPlayerAgent_ = nullptr;
2905 return res;
2906 }
2907 bool isVideoEOS = false;
2908 for (std::pair<std::string, bool>& item: completeState_) {
2909 if (item.first == "VideoSink" && item.second) {
2910 isVideoEOS = true;
2911 break;
2912 }
2913 }
2914 if (pipelineStates_ == PlayerStates::PLAYER_PLAYBACK_COMPLETE || isVideoEOS) {
2915 videoDecoder_->Flush();
2916 }
2917 // Drive the head node to start the video channel.
2918 demuxer_->ResumeDragging();
2919 SetFrameRateForSeekPerformance(FRAME_RATE_FOR_SEEK_PERFORMANCE);
2920 return res;
2921 }
2922
ExitSeekContinous(bool align, int64_t seekContinousBatchNo)2923 int32_t HiPlayerImpl::ExitSeekContinous(bool align, int64_t seekContinousBatchNo)
2924 {
2925 std::lock_guard<std::mutex> lock(seekContinousMutex_);
2926 FALSE_RETURN_V(demuxer_ && videoDecoder_, TransStatus(Status::OK));
2927 FALSE_RETURN_V(!isNetWorkPlay_, TransStatus(Status::OK));
2928 seekContinousBatchNo_.store(seekContinousBatchNo);
2929 if (draggingPlayerAgent_ != nullptr) {
2930 draggingPlayerAgent_->Release();
2931 draggingPlayerAgent_ = nullptr;
2932 }
2933 demuxer_->PauseDragging();
2934 if (align) {
2935 Seek(lastSeekContinousPos_, PlayerSeekMode::SEEK_CLOSEST, false);
2936 }
2937 return TransStatus(Status::OK);
2938 }
2939
SetMediaMuted(OHOS::Media::MediaType mediaType, bool isMuted)2940 int32_t HiPlayerImpl::SetMediaMuted(OHOS::Media::MediaType mediaType, bool isMuted)
2941 {
2942 MEDIA_LOG_D("SetMediaMuted %{public}d", static_cast<int32_t>(mediaType));
2943 FALSE_RETURN_V(mediaType == OHOS::Media::MediaType::MEDIA_TYPE_AUD, MSERR_INVALID_VAL);
2944 FALSE_RETURN_V(audioSink_ != nullptr, MSERR_NO_MEMORY);
2945 auto res = audioSink_->SetMuted(isMuted);
2946 return res == Status::OK ? MSERR_OK : MSERR_INVALID_OPERATION;
2947 }
2948
SetPlaybackStrategy(AVPlayStrategy playbackStrategy)2949 int32_t HiPlayerImpl::SetPlaybackStrategy(AVPlayStrategy playbackStrategy)
2950 {
2951 mutedMediaType_ = playbackStrategy.mutedMediaType;
2952 preferedWidth_ = playbackStrategy.preferredWidth;
2953 preferedHeight_ = playbackStrategy.preferredHeight;
2954 bufferDuration_ = playbackStrategy.preferredBufferDuration;
2955 preferHDR_ = playbackStrategy.preferredHdr;
2956 return MSERR_OK;
2957 }
2958
SetMaxAmplitudeCbStatus(bool status)2959 int32_t HiPlayerImpl::SetMaxAmplitudeCbStatus(bool status)
2960 {
2961 maxAmplitudeCbStatus_ = status;
2962 if (audioSink_ != nullptr) {
2963 return audioSink_->SetMaxAmplitudeCbStatus(maxAmplitudeCbStatus_);
2964 }
2965 return MSERR_OK;
2966 }
2967 } // namespace Media
2968 } // namespace OHOS
2969