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