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