• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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